Files
Pedro Heyerdahl 0f139f3120 feat(usage): add feature attribution header to API requests
Introduce X-KILOCODE-FEATURE header for tracking request origin
across different entry points (CLI, VSCode extension, autocomplete).

- Add HEADER_FEATURE, DEFAULT_FEATURE, and ENV_FEATURE constants
- Add getFeatureHeader() helper reading from KILOCODE_FEATURE env var
- Include feature header in buildKiloHeaders() when env var is set
- Set feature to "autocomplete" for FIM/completion requests
- Set KILOCODE_FEATURE="vscode-extension" when spawning CLI from VSCode
- Default to "cli" feature in opencode entry point
- Add unit tests for feature header logic
2026-02-18 15:49:22 -03:00

68 lines
2.0 KiB
TypeScript

// kilocode_change - new file
import { describe, it, expect, afterEach } from "bun:test"
import { buildKiloHeaders, getFeatureHeader, getEditorNameHeader } from "@kilocode/kilo-gateway"
import { HEADER_FEATURE, ENV_FEATURE } from "@kilocode/kilo-gateway"
describe("getFeatureHeader", () => {
const original = process.env[ENV_FEATURE]
afterEach(() => {
if (original === undefined) {
delete process.env[ENV_FEATURE]
} else {
process.env[ENV_FEATURE] = original
}
})
it("returns undefined when env var is not set", () => {
delete process.env[ENV_FEATURE]
expect(getFeatureHeader()).toBeUndefined()
})
it("returns the env var value when set", () => {
process.env[ENV_FEATURE] = "cloud-agent"
expect(getFeatureHeader()).toBe("cloud-agent")
})
it("returns undefined for empty string", () => {
process.env[ENV_FEATURE] = ""
expect(getFeatureHeader()).toBeUndefined()
})
})
describe("buildKiloHeaders", () => {
const original = process.env[ENV_FEATURE]
afterEach(() => {
if (original === undefined) {
delete process.env[ENV_FEATURE]
} else {
process.env[ENV_FEATURE] = original
}
})
it("includes feature header when env var is set", () => {
process.env[ENV_FEATURE] = "vscode-extension"
const headers = buildKiloHeaders()
expect(headers[HEADER_FEATURE]).toBe("vscode-extension")
})
it("omits feature header when env var is not set", () => {
delete process.env[ENV_FEATURE]
const headers = buildKiloHeaders()
expect(headers[HEADER_FEATURE]).toBeUndefined()
})
it("always includes editor name header", () => {
delete process.env[ENV_FEATURE]
const headers = buildKiloHeaders()
expect(headers["X-KILOCODE-EDITORNAME"]).toBe(getEditorNameHeader())
})
it("passes through any feature value from env", () => {
process.env[ENV_FEATURE] = "custom-feature"
const headers = buildKiloHeaders()
expect(headers[HEADER_FEATURE]).toBe("custom-feature")
})
})