headroom-opencode 0.36.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +107 -0
- package/dist/chunk-UD4AB5X6.js +12935 -0
- package/dist/chunk-UD4AB5X6.js.map +1 -0
- package/dist/entry.opencode-BdYgRYb4.d.ts +11 -0
- package/dist/entry.opencode.d.ts +2 -0
- package/dist/entry.opencode.js +7 -0
- package/dist/entry.opencode.js.map +1 -0
- package/dist/index.d.ts +68 -0
- package/dist/index.js +77 -0
- package/dist/index.js.map +1 -0
- package/hook-shim/handler.js +8 -0
- package/package.json +50 -0
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Plugin } from '@opencode-ai/plugin';
|
|
2
|
+
|
|
3
|
+
interface HeadroomOpenCodePluginOptions {
|
|
4
|
+
proxyUrl?: string;
|
|
5
|
+
project?: string;
|
|
6
|
+
backend?: string;
|
|
7
|
+
debug?: boolean;
|
|
8
|
+
}
|
|
9
|
+
declare const HeadroomPlugin: Plugin;
|
|
10
|
+
|
|
11
|
+
export { type HeadroomOpenCodePluginOptions as H, HeadroomPlugin as a };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { CompressResult } from 'headroom-ai';
|
|
2
|
+
export { H as HeadroomOpenCodePluginOptions, a as HeadroomPlugin, a as default } from './entry.opencode-BdYgRYb4.js';
|
|
3
|
+
import '@opencode-ai/plugin';
|
|
4
|
+
|
|
5
|
+
interface HeadroomModelMapping {
|
|
6
|
+
name: string;
|
|
7
|
+
limit: {
|
|
8
|
+
context: number;
|
|
9
|
+
output: number;
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
interface HeadroomProviderOptions {
|
|
13
|
+
proxyBaseUrl?: string;
|
|
14
|
+
proxyPort?: number;
|
|
15
|
+
defaultModel?: string;
|
|
16
|
+
models?: Record<string, HeadroomModelMapping>;
|
|
17
|
+
}
|
|
18
|
+
declare const DEFAULT_MODELS: Record<string, HeadroomModelMapping>;
|
|
19
|
+
declare const DEFAULT_MODEL = "claude-sonnet-4-6";
|
|
20
|
+
interface HeadroomProvider {
|
|
21
|
+
npm: string;
|
|
22
|
+
name: string;
|
|
23
|
+
options: {
|
|
24
|
+
baseURL: string;
|
|
25
|
+
apiKey?: string;
|
|
26
|
+
};
|
|
27
|
+
models: Record<string, HeadroomModelMapping>;
|
|
28
|
+
}
|
|
29
|
+
declare function createHeadroomProvider(options?: HeadroomProviderOptions): HeadroomProvider;
|
|
30
|
+
declare function buildOpencodeConfigContent(options?: HeadroomProviderOptions): Record<string, unknown>;
|
|
31
|
+
declare function buildOpencodeConfigContentJson(options?: HeadroomProviderOptions): string;
|
|
32
|
+
|
|
33
|
+
declare function setDefaultProxyUrl(url: string): void;
|
|
34
|
+
declare function getDefaultProxyUrl(): string;
|
|
35
|
+
interface RetrieveToolConfig {
|
|
36
|
+
proxyBaseUrl: string;
|
|
37
|
+
}
|
|
38
|
+
declare function createHeadroomRetrieveTool(config: RetrieveToolConfig): {
|
|
39
|
+
name: string;
|
|
40
|
+
description: string;
|
|
41
|
+
parameters: {
|
|
42
|
+
type: "object";
|
|
43
|
+
properties: {
|
|
44
|
+
hash: {
|
|
45
|
+
type: string;
|
|
46
|
+
description: string;
|
|
47
|
+
};
|
|
48
|
+
};
|
|
49
|
+
required: string[];
|
|
50
|
+
};
|
|
51
|
+
execute: (args: {
|
|
52
|
+
hash: string;
|
|
53
|
+
}) => Promise<string>;
|
|
54
|
+
};
|
|
55
|
+
declare function compressWithHeadroom(messages: unknown[], options?: {
|
|
56
|
+
model?: string;
|
|
57
|
+
tokenBudget?: number;
|
|
58
|
+
proxyUrl?: string;
|
|
59
|
+
}): Promise<CompressResult>;
|
|
60
|
+
|
|
61
|
+
interface InstallOptions {
|
|
62
|
+
proxyUrl: string;
|
|
63
|
+
project?: string;
|
|
64
|
+
debug?: boolean;
|
|
65
|
+
}
|
|
66
|
+
declare function installHeadroomTransport(options: InstallOptions): () => void;
|
|
67
|
+
|
|
68
|
+
export { DEFAULT_MODEL, DEFAULT_MODELS, type HeadroomModelMapping, type HeadroomProvider, type HeadroomProviderOptions, type RetrieveToolConfig, buildOpencodeConfigContent, buildOpencodeConfigContentJson, compressWithHeadroom, createHeadroomProvider, createHeadroomRetrieveTool, getDefaultProxyUrl, installHeadroomTransport, setDefaultProxyUrl };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import {
|
|
2
|
+
HeadroomPlugin,
|
|
3
|
+
compressWithHeadroom,
|
|
4
|
+
createHeadroomRetrieveTool,
|
|
5
|
+
getDefaultProxyUrl,
|
|
6
|
+
installHeadroomTransport,
|
|
7
|
+
plugin_default,
|
|
8
|
+
setDefaultProxyUrl
|
|
9
|
+
} from "./chunk-UD4AB5X6.js";
|
|
10
|
+
|
|
11
|
+
// src/provider.ts
|
|
12
|
+
var DEFAULT_MODELS = {
|
|
13
|
+
"claude-sonnet-4-6": {
|
|
14
|
+
name: "Claude Sonnet 4.6",
|
|
15
|
+
limit: { context: 2e5, output: 16384 }
|
|
16
|
+
},
|
|
17
|
+
"claude-opus-4-6": {
|
|
18
|
+
name: "Claude Opus 4.6",
|
|
19
|
+
limit: { context: 2e5, output: 16384 }
|
|
20
|
+
},
|
|
21
|
+
"claude-haiku-4-5-20251001": {
|
|
22
|
+
name: "Claude Haiku 4.5",
|
|
23
|
+
limit: { context: 2e5, output: 8192 }
|
|
24
|
+
},
|
|
25
|
+
"gpt-4o": {
|
|
26
|
+
name: "GPT-4o",
|
|
27
|
+
limit: { context: 128e3, output: 16384 }
|
|
28
|
+
},
|
|
29
|
+
"gpt-4.1": {
|
|
30
|
+
name: "GPT-4.1",
|
|
31
|
+
limit: { context: 1048576, output: 32768 }
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
var DEFAULT_MODEL = "claude-sonnet-4-6";
|
|
35
|
+
function resolveBaseUrl(options) {
|
|
36
|
+
if (options.proxyBaseUrl) return options.proxyBaseUrl.replace(/\/+$/, "");
|
|
37
|
+
const port = options.proxyPort ?? 8787;
|
|
38
|
+
return `http://127.0.0.1:${port}`;
|
|
39
|
+
}
|
|
40
|
+
function createHeadroomProvider(options = {}) {
|
|
41
|
+
const baseUrl = resolveBaseUrl(options);
|
|
42
|
+
const models = options.models ?? DEFAULT_MODELS;
|
|
43
|
+
return {
|
|
44
|
+
npm: "@ai-sdk/openai-compatible",
|
|
45
|
+
name: "Headroom Proxy",
|
|
46
|
+
options: { baseURL: `${baseUrl}/v1` },
|
|
47
|
+
// OpenCode namespaces model ids by provider key, so entries must be bare
|
|
48
|
+
// ids ("claude-sonnet-4-6"), referenced as "headroom/<id>".
|
|
49
|
+
models: { ...models }
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
function buildOpencodeConfigContent(options = {}) {
|
|
53
|
+
const defaultModel = options.defaultModel ?? DEFAULT_MODEL;
|
|
54
|
+
const provider = createHeadroomProvider(options);
|
|
55
|
+
return {
|
|
56
|
+
provider: { headroom: provider },
|
|
57
|
+
model: `headroom/${defaultModel}`
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
function buildOpencodeConfigContentJson(options = {}) {
|
|
61
|
+
return JSON.stringify(buildOpencodeConfigContent(options));
|
|
62
|
+
}
|
|
63
|
+
export {
|
|
64
|
+
DEFAULT_MODEL,
|
|
65
|
+
DEFAULT_MODELS,
|
|
66
|
+
HeadroomPlugin,
|
|
67
|
+
buildOpencodeConfigContent,
|
|
68
|
+
buildOpencodeConfigContentJson,
|
|
69
|
+
compressWithHeadroom,
|
|
70
|
+
createHeadroomProvider,
|
|
71
|
+
createHeadroomRetrieveTool,
|
|
72
|
+
plugin_default as default,
|
|
73
|
+
getDefaultProxyUrl,
|
|
74
|
+
installHeadroomTransport,
|
|
75
|
+
setDefaultProxyUrl
|
|
76
|
+
};
|
|
77
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/provider.ts"],"sourcesContent":["export interface HeadroomModelMapping {\n name: string;\n limit: {\n context: number;\n output: number;\n };\n}\n\nexport interface HeadroomProviderOptions {\n proxyBaseUrl?: string;\n proxyPort?: number;\n defaultModel?: string;\n models?: Record<string, HeadroomModelMapping>;\n}\n\nexport const DEFAULT_MODELS: Record<string, HeadroomModelMapping> = {\n \"claude-sonnet-4-6\": {\n name: \"Claude Sonnet 4.6\",\n limit: { context: 200000, output: 16384 },\n },\n \"claude-opus-4-6\": {\n name: \"Claude Opus 4.6\",\n limit: { context: 200000, output: 16384 },\n },\n \"claude-haiku-4-5-20251001\": {\n name: \"Claude Haiku 4.5\",\n limit: { context: 200000, output: 8192 },\n },\n \"gpt-4o\": {\n name: \"GPT-4o\",\n limit: { context: 128000, output: 16384 },\n },\n \"gpt-4.1\": {\n name: \"GPT-4.1\",\n limit: { context: 1048576, output: 32768 },\n },\n};\n\nexport const DEFAULT_MODEL = \"claude-sonnet-4-6\";\n\nfunction resolveBaseUrl(options: HeadroomProviderOptions): string {\n if (options.proxyBaseUrl) return options.proxyBaseUrl.replace(/\\/+$/, \"\");\n const port = options.proxyPort ?? 8787;\n return `http://127.0.0.1:${port}`;\n}\n\nexport interface HeadroomProvider {\n npm: string;\n name: string;\n options: {\n baseURL: string;\n apiKey?: string;\n };\n models: Record<string, HeadroomModelMapping>;\n}\n\nexport function createHeadroomProvider(\n options: HeadroomProviderOptions = {},\n): HeadroomProvider {\n const baseUrl = resolveBaseUrl(options);\n const models = options.models ?? DEFAULT_MODELS;\n\n return {\n npm: \"@ai-sdk/openai-compatible\",\n name: \"Headroom Proxy\",\n options: { baseURL: `${baseUrl}/v1` },\n // OpenCode namespaces model ids by provider key, so entries must be bare\n // ids (\"claude-sonnet-4-6\"), referenced as \"headroom/<id>\".\n models: { ...models },\n };\n}\n\nexport function buildOpencodeConfigContent(\n options: HeadroomProviderOptions = {},\n): Record<string, unknown> {\n const defaultModel = options.defaultModel ?? DEFAULT_MODEL;\n const provider = createHeadroomProvider(options);\n\n return {\n provider: { headroom: provider },\n model: `headroom/${defaultModel}`,\n };\n}\n\nexport function buildOpencodeConfigContentJson(\n options: HeadroomProviderOptions = {},\n): string {\n return JSON.stringify(buildOpencodeConfigContent(options));\n}\n"],"mappings":";;;;;;;;;;;AAeO,IAAM,iBAAuD;AAAA,EAClE,qBAAqB;AAAA,IACnB,MAAM;AAAA,IACN,OAAO,EAAE,SAAS,KAAQ,QAAQ,MAAM;AAAA,EAC1C;AAAA,EACA,mBAAmB;AAAA,IACjB,MAAM;AAAA,IACN,OAAO,EAAE,SAAS,KAAQ,QAAQ,MAAM;AAAA,EAC1C;AAAA,EACA,6BAA6B;AAAA,IAC3B,MAAM;AAAA,IACN,OAAO,EAAE,SAAS,KAAQ,QAAQ,KAAK;AAAA,EACzC;AAAA,EACA,UAAU;AAAA,IACR,MAAM;AAAA,IACN,OAAO,EAAE,SAAS,OAAQ,QAAQ,MAAM;AAAA,EAC1C;AAAA,EACA,WAAW;AAAA,IACT,MAAM;AAAA,IACN,OAAO,EAAE,SAAS,SAAS,QAAQ,MAAM;AAAA,EAC3C;AACF;AAEO,IAAM,gBAAgB;AAE7B,SAAS,eAAe,SAA0C;AAChE,MAAI,QAAQ,aAAc,QAAO,QAAQ,aAAa,QAAQ,QAAQ,EAAE;AACxE,QAAM,OAAO,QAAQ,aAAa;AAClC,SAAO,oBAAoB,IAAI;AACjC;AAYO,SAAS,uBACd,UAAmC,CAAC,GAClB;AAClB,QAAM,UAAU,eAAe,OAAO;AACtC,QAAM,SAAS,QAAQ,UAAU;AAEjC,SAAO;AAAA,IACL,KAAK;AAAA,IACL,MAAM;AAAA,IACN,SAAS,EAAE,SAAS,GAAG,OAAO,MAAM;AAAA;AAAA;AAAA,IAGpC,QAAQ,EAAE,GAAG,OAAO;AAAA,EACtB;AACF;AAEO,SAAS,2BACd,UAAmC,CAAC,GACX;AACzB,QAAM,eAAe,QAAQ,gBAAgB;AAC7C,QAAM,WAAW,uBAAuB,OAAO;AAE/C,SAAO;AAAA,IACL,UAAU,EAAE,UAAU,SAAS;AAAA,IAC/B,OAAO,YAAY,YAAY;AAAA,EACjC;AACF;AAEO,SAAS,+BACd,UAAmC,CAAC,GAC5B;AACR,SAAO,KAAK,UAAU,2BAA2B,OAAO,CAAC;AAC3D;","names":[]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { installHeadroomTransport } from "../dist/index.js";
|
|
2
|
+
|
|
3
|
+
const proxyUrl = process.env.HEADROOM_OPENCODE_TRANSPORT_PROXY_URL;
|
|
4
|
+
if (!proxyUrl) {
|
|
5
|
+
throw new Error("Headroom OpenCode transport shim loaded without HEADROOM_OPENCODE_TRANSPORT_PROXY_URL");
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
installHeadroomTransport({ proxyUrl });
|
package/package.json
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "headroom-opencode",
|
|
3
|
+
"version": "0.36.0",
|
|
4
|
+
"description": "Headroom proxy integration plugin for OpenCode - routes LLM traffic through the Headroom proxy for token compression",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist",
|
|
10
|
+
"hook-shim",
|
|
11
|
+
"README.md"
|
|
12
|
+
],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsup",
|
|
15
|
+
"build:standalone": "tsup --config tsup.standalone.config.ts",
|
|
16
|
+
"test": "vitest run",
|
|
17
|
+
"test:watch": "vitest",
|
|
18
|
+
"typecheck": "tsc --noEmit"
|
|
19
|
+
},
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"@opencode-ai/plugin": "^1.18.2",
|
|
22
|
+
"headroom-ai": "^0.36.0"
|
|
23
|
+
},
|
|
24
|
+
"peerDependencies": {
|
|
25
|
+
"@ai-sdk/openai-compatible": "*",
|
|
26
|
+
"@ai-sdk/provider": "*",
|
|
27
|
+
"ai": "*"
|
|
28
|
+
},
|
|
29
|
+
"peerDependenciesMeta": {
|
|
30
|
+
"@ai-sdk/openai-compatible": {
|
|
31
|
+
"optional": true
|
|
32
|
+
},
|
|
33
|
+
"@ai-sdk/provider": {
|
|
34
|
+
"optional": true
|
|
35
|
+
},
|
|
36
|
+
"ai": {
|
|
37
|
+
"optional": true
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
"devDependencies": {
|
|
41
|
+
"@types/node": "^26.1.1",
|
|
42
|
+
"tsup": "^8.0.0",
|
|
43
|
+
"typescript": "^5.5.0",
|
|
44
|
+
"vitest": "^4.1.10"
|
|
45
|
+
},
|
|
46
|
+
"overrides": {
|
|
47
|
+
"esbuild": "^0.28.1"
|
|
48
|
+
},
|
|
49
|
+
"license": "Apache-2.0"
|
|
50
|
+
}
|