@airisos/adapter-opencode-local 2026.324.0-canary.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.
Files changed (58) hide show
  1. package/LICENSE +21 -0
  2. package/dist/cli/format-event.d.ts +2 -0
  3. package/dist/cli/format-event.d.ts.map +1 -0
  4. package/dist/cli/format-event.js +115 -0
  5. package/dist/cli/format-event.js.map +1 -0
  6. package/dist/cli/index.d.ts +2 -0
  7. package/dist/cli/index.d.ts.map +1 -0
  8. package/dist/cli/index.js +2 -0
  9. package/dist/cli/index.js.map +1 -0
  10. package/dist/index.d.ts +8 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +39 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/server/execute.d.ts +3 -0
  15. package/dist/server/execute.d.ts.map +1 -0
  16. package/dist/server/execute.js +326 -0
  17. package/dist/server/execute.js.map +1 -0
  18. package/dist/server/index.d.ts +8 -0
  19. package/dist/server/index.d.ts.map +1 -0
  20. package/dist/server/index.js +63 -0
  21. package/dist/server/index.js.map +1 -0
  22. package/dist/server/models.d.ts +20 -0
  23. package/dist/server/models.d.ts.map +1 -0
  24. package/dist/server/models.js +165 -0
  25. package/dist/server/models.js.map +1 -0
  26. package/dist/server/models.test.d.ts +2 -0
  27. package/dist/server/models.test.d.ts.map +1 -0
  28. package/dist/server/models.test.js +22 -0
  29. package/dist/server/models.test.js.map +1 -0
  30. package/dist/server/parse.d.ts +13 -0
  31. package/dist/server/parse.d.ts.map +1 -0
  32. package/dist/server/parse.js +97 -0
  33. package/dist/server/parse.js.map +1 -0
  34. package/dist/server/parse.test.d.ts +2 -0
  35. package/dist/server/parse.test.d.ts.map +1 -0
  36. package/dist/server/parse.test.js +48 -0
  37. package/dist/server/parse.test.js.map +1 -0
  38. package/dist/server/skills.d.ts +8 -0
  39. package/dist/server/skills.d.ts.map +1 -0
  40. package/dist/server/skills.js +73 -0
  41. package/dist/server/skills.js.map +1 -0
  42. package/dist/server/test.d.ts +3 -0
  43. package/dist/server/test.d.ts.map +1 -0
  44. package/dist/server/test.js +300 -0
  45. package/dist/server/test.js.map +1 -0
  46. package/dist/ui/build-config.d.ts +3 -0
  47. package/dist/ui/build-config.d.ts.map +1 -0
  48. package/dist/ui/build-config.js +87 -0
  49. package/dist/ui/build-config.js.map +1 -0
  50. package/dist/ui/index.d.ts +3 -0
  51. package/dist/ui/index.d.ts.map +1 -0
  52. package/dist/ui/index.js +3 -0
  53. package/dist/ui/index.js.map +1 -0
  54. package/dist/ui/parse-stdout.d.ts +3 -0
  55. package/dist/ui/parse-stdout.d.ts.map +1 -0
  56. package/dist/ui/parse-stdout.js +141 -0
  57. package/dist/ui/parse-stdout.js.map +1 -0
  58. package/package.json +55 -0
@@ -0,0 +1,63 @@
1
+ function readNonEmptyString(value) {
2
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
3
+ }
4
+ export const sessionCodec = {
5
+ deserialize(raw) {
6
+ if (typeof raw !== "object" || raw === null || Array.isArray(raw))
7
+ return null;
8
+ const record = raw;
9
+ const sessionId = readNonEmptyString(record.sessionId) ??
10
+ readNonEmptyString(record.session_id) ??
11
+ readNonEmptyString(record.sessionID);
12
+ if (!sessionId)
13
+ return null;
14
+ const cwd = readNonEmptyString(record.cwd) ??
15
+ readNonEmptyString(record.workdir) ??
16
+ readNonEmptyString(record.folder);
17
+ const workspaceId = readNonEmptyString(record.workspaceId) ?? readNonEmptyString(record.workspace_id);
18
+ const repoUrl = readNonEmptyString(record.repoUrl) ?? readNonEmptyString(record.repo_url);
19
+ const repoRef = readNonEmptyString(record.repoRef) ?? readNonEmptyString(record.repo_ref);
20
+ return {
21
+ sessionId,
22
+ ...(cwd ? { cwd } : {}),
23
+ ...(workspaceId ? { workspaceId } : {}),
24
+ ...(repoUrl ? { repoUrl } : {}),
25
+ ...(repoRef ? { repoRef } : {}),
26
+ };
27
+ },
28
+ serialize(params) {
29
+ if (!params)
30
+ return null;
31
+ const sessionId = readNonEmptyString(params.sessionId) ??
32
+ readNonEmptyString(params.session_id) ??
33
+ readNonEmptyString(params.sessionID);
34
+ if (!sessionId)
35
+ return null;
36
+ const cwd = readNonEmptyString(params.cwd) ??
37
+ readNonEmptyString(params.workdir) ??
38
+ readNonEmptyString(params.folder);
39
+ const workspaceId = readNonEmptyString(params.workspaceId) ?? readNonEmptyString(params.workspace_id);
40
+ const repoUrl = readNonEmptyString(params.repoUrl) ?? readNonEmptyString(params.repo_url);
41
+ const repoRef = readNonEmptyString(params.repoRef) ?? readNonEmptyString(params.repo_ref);
42
+ return {
43
+ sessionId,
44
+ ...(cwd ? { cwd } : {}),
45
+ ...(workspaceId ? { workspaceId } : {}),
46
+ ...(repoUrl ? { repoUrl } : {}),
47
+ ...(repoRef ? { repoRef } : {}),
48
+ };
49
+ },
50
+ getDisplayId(params) {
51
+ if (!params)
52
+ return null;
53
+ return (readNonEmptyString(params.sessionId) ??
54
+ readNonEmptyString(params.session_id) ??
55
+ readNonEmptyString(params.sessionID));
56
+ },
57
+ };
58
+ export { execute } from "./execute.js";
59
+ export { listOpenCodeSkills, syncOpenCodeSkills } from "./skills.js";
60
+ export { testEnvironment } from "./test.js";
61
+ export { listOpenCodeModels, discoverOpenCodeModels, ensureOpenCodeModelConfiguredAndAvailable, resetOpenCodeModelsCacheForTests, } from "./models.js";
62
+ export { parseOpenCodeJsonl, isOpenCodeUnknownSessionError } from "./parse.js";
63
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { AdapterModel } from "@airisos/adapter-utils";
2
+ export declare function discoverOpenCodeModels(input?: {
3
+ command?: unknown;
4
+ cwd?: unknown;
5
+ env?: unknown;
6
+ }): Promise<AdapterModel[]>;
7
+ export declare function discoverOpenCodeModelsCached(input?: {
8
+ command?: unknown;
9
+ cwd?: unknown;
10
+ env?: unknown;
11
+ }): Promise<AdapterModel[]>;
12
+ export declare function ensureOpenCodeModelConfiguredAndAvailable(input: {
13
+ model?: unknown;
14
+ command?: unknown;
15
+ cwd?: unknown;
16
+ env?: unknown;
17
+ }): Promise<AdapterModel[]>;
18
+ export declare function listOpenCodeModels(): Promise<AdapterModel[]>;
19
+ export declare function resetOpenCodeModelsCacheForTests(): void;
20
+ //# sourceMappingURL=models.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/server/models.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAoG3D,wBAAsB,sBAAsB,CAAC,KAAK,GAAE;IAClD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;CACV,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAwC/B;AAED,wBAAsB,4BAA4B,CAAC,KAAK,GAAE;IACxD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;CACV,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAa/B;AAED,wBAAsB,yCAAyC,CAAC,KAAK,EAAE;IACrE,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,GAAG,CAAC,EAAE,OAAO,CAAC;CACf,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAwB1B;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAMlE;AAED,wBAAgB,gCAAgC,SAE/C"}
@@ -0,0 +1,165 @@
1
+ import { createHash } from "node:crypto";
2
+ import os from "node:os";
3
+ import { asString, ensurePathInEnv, runChildProcess, } from "@airisos/adapter-utils/server-utils";
4
+ const MODELS_CACHE_TTL_MS = 60_000;
5
+ const MODELS_DISCOVERY_TIMEOUT_MS = 20_000;
6
+ function resolveOpenCodeCommand(input) {
7
+ const envOverride = typeof process.env.PAPERCLIP_OPENCODE_COMMAND === "string" &&
8
+ process.env.PAPERCLIP_OPENCODE_COMMAND.trim().length > 0
9
+ ? process.env.PAPERCLIP_OPENCODE_COMMAND.trim()
10
+ : "opencode";
11
+ return asString(input, envOverride);
12
+ }
13
+ const discoveryCache = new Map();
14
+ const VOLATILE_ENV_KEY_PREFIXES = ["PAPERCLIP_", "npm_", "NPM_"];
15
+ const VOLATILE_ENV_KEY_EXACT = new Set(["PWD", "OLDPWD", "SHLVL", "_", "TERM_SESSION_ID", "HOME"]);
16
+ function dedupeModels(models) {
17
+ const seen = new Set();
18
+ const deduped = [];
19
+ for (const model of models) {
20
+ const id = model.id.trim();
21
+ if (!id || seen.has(id))
22
+ continue;
23
+ seen.add(id);
24
+ deduped.push({ id, label: model.label.trim() || id });
25
+ }
26
+ return deduped;
27
+ }
28
+ function sortModels(models) {
29
+ return [...models].sort((a, b) => a.id.localeCompare(b.id, "en", { numeric: true, sensitivity: "base" }));
30
+ }
31
+ function firstNonEmptyLine(text) {
32
+ return (text
33
+ .split(/\r?\n/)
34
+ .map((line) => line.trim())
35
+ .find(Boolean) ?? "");
36
+ }
37
+ function parseModelsOutput(stdout) {
38
+ const parsed = [];
39
+ for (const raw of stdout.split(/\r?\n/)) {
40
+ const line = raw.trim();
41
+ if (!line)
42
+ continue;
43
+ const firstToken = line.split(/\s+/)[0]?.trim() ?? "";
44
+ if (!firstToken.includes("/"))
45
+ continue;
46
+ const provider = firstToken.slice(0, firstToken.indexOf("/")).trim();
47
+ const model = firstToken.slice(firstToken.indexOf("/") + 1).trim();
48
+ if (!provider || !model)
49
+ continue;
50
+ parsed.push({ id: `${provider}/${model}`, label: `${provider}/${model}` });
51
+ }
52
+ return dedupeModels(parsed);
53
+ }
54
+ function normalizeEnv(input) {
55
+ const envInput = typeof input === "object" && input !== null && !Array.isArray(input)
56
+ ? input
57
+ : {};
58
+ const env = {};
59
+ for (const [key, value] of Object.entries(envInput)) {
60
+ if (typeof value === "string")
61
+ env[key] = value;
62
+ }
63
+ return env;
64
+ }
65
+ function isVolatileEnvKey(key) {
66
+ if (VOLATILE_ENV_KEY_EXACT.has(key))
67
+ return true;
68
+ return VOLATILE_ENV_KEY_PREFIXES.some((prefix) => key.startsWith(prefix));
69
+ }
70
+ function hashValue(value) {
71
+ return createHash("sha256").update(value).digest("hex");
72
+ }
73
+ function discoveryCacheKey(command, cwd, env) {
74
+ const envKey = Object.entries(env)
75
+ .filter(([key]) => !isVolatileEnvKey(key))
76
+ .sort(([a], [b]) => a.localeCompare(b))
77
+ .map(([key, value]) => `${key}=${hashValue(value)}`)
78
+ .join("\n");
79
+ return `${command}\n${cwd}\n${envKey}`;
80
+ }
81
+ function pruneExpiredDiscoveryCache(now) {
82
+ for (const [key, value] of discoveryCache.entries()) {
83
+ if (value.expiresAt <= now)
84
+ discoveryCache.delete(key);
85
+ }
86
+ }
87
+ export async function discoverOpenCodeModels(input = {}) {
88
+ const command = resolveOpenCodeCommand(input.command);
89
+ const cwd = asString(input.cwd, process.cwd());
90
+ const env = normalizeEnv(input.env);
91
+ // Ensure HOME points to the actual running user's home directory.
92
+ // When the server is started via `runuser -u <user>`, HOME may still
93
+ // reflect the parent process (e.g. /root), causing OpenCode to miss
94
+ // provider auth credentials stored under the target user's home.
95
+ let resolvedHome;
96
+ try {
97
+ resolvedHome = os.userInfo().homedir || undefined;
98
+ }
99
+ catch {
100
+ // os.userInfo() throws a SystemError when the current UID has no
101
+ // /etc/passwd entry (e.g. `docker run --user 1234` with a minimal
102
+ // image). Fall back to process.env.HOME.
103
+ }
104
+ const runtimeEnv = normalizeEnv(ensurePathInEnv({ ...process.env, ...env, ...(resolvedHome ? { HOME: resolvedHome } : {}) }));
105
+ const result = await runChildProcess(`opencode-models-${Date.now()}-${Math.random().toString(16).slice(2)}`, command, ["models"], {
106
+ cwd,
107
+ env: runtimeEnv,
108
+ timeoutSec: MODELS_DISCOVERY_TIMEOUT_MS / 1000,
109
+ graceSec: 3,
110
+ onLog: async () => { },
111
+ });
112
+ if (result.timedOut) {
113
+ throw new Error(`\`opencode models\` timed out after ${MODELS_DISCOVERY_TIMEOUT_MS / 1000}s.`);
114
+ }
115
+ if ((result.exitCode ?? 1) !== 0) {
116
+ const detail = firstNonEmptyLine(result.stderr) || firstNonEmptyLine(result.stdout);
117
+ throw new Error(detail ? `\`opencode models\` failed: ${detail}` : "`opencode models` failed.");
118
+ }
119
+ return sortModels(parseModelsOutput(result.stdout));
120
+ }
121
+ export async function discoverOpenCodeModelsCached(input = {}) {
122
+ const command = resolveOpenCodeCommand(input.command);
123
+ const cwd = asString(input.cwd, process.cwd());
124
+ const env = normalizeEnv(input.env);
125
+ const key = discoveryCacheKey(command, cwd, env);
126
+ const now = Date.now();
127
+ pruneExpiredDiscoveryCache(now);
128
+ const cached = discoveryCache.get(key);
129
+ if (cached && cached.expiresAt > now)
130
+ return cached.models;
131
+ const models = await discoverOpenCodeModels({ command, cwd, env });
132
+ discoveryCache.set(key, { expiresAt: now + MODELS_CACHE_TTL_MS, models });
133
+ return models;
134
+ }
135
+ export async function ensureOpenCodeModelConfiguredAndAvailable(input) {
136
+ const model = asString(input.model, "").trim();
137
+ if (!model) {
138
+ throw new Error("OpenCode requires `adapterConfig.model` in provider/model format.");
139
+ }
140
+ const models = await discoverOpenCodeModelsCached({
141
+ command: input.command,
142
+ cwd: input.cwd,
143
+ env: input.env,
144
+ });
145
+ if (models.length === 0) {
146
+ throw new Error("OpenCode returned no models. Run `opencode models` and verify provider auth.");
147
+ }
148
+ if (!models.some((entry) => entry.id === model)) {
149
+ const sample = models.slice(0, 12).map((entry) => entry.id).join(", ");
150
+ throw new Error(`Configured OpenCode model is unavailable: ${model}. Available models: ${sample}${models.length > 12 ? ", ..." : ""}`);
151
+ }
152
+ return models;
153
+ }
154
+ export async function listOpenCodeModels() {
155
+ try {
156
+ return await discoverOpenCodeModelsCached();
157
+ }
158
+ catch {
159
+ return [];
160
+ }
161
+ }
162
+ export function resetOpenCodeModelsCacheForTests() {
163
+ discoveryCache.clear();
164
+ }
165
+ //# sourceMappingURL=models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/server/models.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=models.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.test.d.ts","sourceRoot":"","sources":["../../src/server/models.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,22 @@
1
+ import { afterEach, describe, expect, it } from "vitest";
2
+ import { ensureOpenCodeModelConfiguredAndAvailable, listOpenCodeModels, resetOpenCodeModelsCacheForTests, } from "./models.js";
3
+ describe("openCode models", () => {
4
+ afterEach(() => {
5
+ delete process.env.PAPERCLIP_OPENCODE_COMMAND;
6
+ resetOpenCodeModelsCacheForTests();
7
+ });
8
+ it("returns an empty list when discovery command is unavailable", async () => {
9
+ process.env.PAPERCLIP_OPENCODE_COMMAND = "__paperclip_missing_opencode_command__";
10
+ await expect(listOpenCodeModels()).resolves.toEqual([]);
11
+ });
12
+ it("rejects when model is missing", async () => {
13
+ await expect(ensureOpenCodeModelConfiguredAndAvailable({ model: "" })).rejects.toThrow("OpenCode requires `adapterConfig.model`");
14
+ });
15
+ it("rejects when discovery cannot run for configured model", async () => {
16
+ process.env.PAPERCLIP_OPENCODE_COMMAND = "__paperclip_missing_opencode_command__";
17
+ await expect(ensureOpenCodeModelConfiguredAndAvailable({
18
+ model: "openai/gpt-5",
19
+ })).rejects.toThrow("Failed to start command");
20
+ });
21
+ });
22
+ //# sourceMappingURL=models.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.test.js","sourceRoot":"","sources":["../../src/server/models.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzD,OAAO,EACL,yCAAyC,EACzC,kBAAkB,EAClB,gCAAgC,GACjC,MAAM,aAAa,CAAC;AAErB,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC;QAC9C,gCAAgC,EAAE,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,OAAO,CAAC,GAAG,CAAC,0BAA0B,GAAG,wCAAwC,CAAC;QAClF,MAAM,MAAM,CAAC,kBAAkB,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,MAAM,CACV,yCAAyC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CACzD,CAAC,OAAO,CAAC,OAAO,CAAC,yCAAyC,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,OAAO,CAAC,GAAG,CAAC,0BAA0B,GAAG,wCAAwC,CAAC;QAClF,MAAM,MAAM,CACV,yCAAyC,CAAC;YACxC,KAAK,EAAE,cAAc;SACtB,CAAC,CACH,CAAC,OAAO,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,13 @@
1
+ export declare function parseOpenCodeJsonl(stdout: string): {
2
+ sessionId: string | null;
3
+ summary: string;
4
+ usage: {
5
+ inputTokens: number;
6
+ cachedInputTokens: number;
7
+ outputTokens: number;
8
+ };
9
+ costUsd: number;
10
+ errorMessage: string | null;
11
+ };
12
+ export declare function isOpenCodeUnknownSessionError(stdout: string, stderr: string): boolean;
13
+ //# sourceMappingURL=parse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../src/server/parse.ts"],"names":[],"mappings":"AAqBA,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM;;;;;;;;;;EAiEhD;AAED,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAUrF"}
@@ -0,0 +1,97 @@
1
+ import { asNumber, asString, parseJson, parseObject } from "@airisos/adapter-utils/server-utils";
2
+ function errorText(value) {
3
+ if (typeof value === "string")
4
+ return value;
5
+ const rec = parseObject(value);
6
+ const message = asString(rec.message, "").trim();
7
+ if (message)
8
+ return message;
9
+ const data = parseObject(rec.data);
10
+ const nestedMessage = asString(data.message, "").trim();
11
+ if (nestedMessage)
12
+ return nestedMessage;
13
+ const name = asString(rec.name, "").trim();
14
+ if (name)
15
+ return name;
16
+ const code = asString(rec.code, "").trim();
17
+ if (code)
18
+ return code;
19
+ try {
20
+ return JSON.stringify(rec);
21
+ }
22
+ catch {
23
+ return "";
24
+ }
25
+ }
26
+ export function parseOpenCodeJsonl(stdout) {
27
+ let sessionId = null;
28
+ const messages = [];
29
+ const errors = [];
30
+ const usage = {
31
+ inputTokens: 0,
32
+ cachedInputTokens: 0,
33
+ outputTokens: 0,
34
+ };
35
+ let costUsd = 0;
36
+ for (const rawLine of stdout.split(/\r?\n/)) {
37
+ const line = rawLine.trim();
38
+ if (!line)
39
+ continue;
40
+ const event = parseJson(line);
41
+ if (!event)
42
+ continue;
43
+ const currentSessionId = asString(event.sessionID, "").trim();
44
+ if (currentSessionId)
45
+ sessionId = currentSessionId;
46
+ const type = asString(event.type, "");
47
+ if (type === "text") {
48
+ const part = parseObject(event.part);
49
+ const text = asString(part.text, "").trim();
50
+ if (text)
51
+ messages.push(text);
52
+ continue;
53
+ }
54
+ if (type === "step_finish") {
55
+ const part = parseObject(event.part);
56
+ const tokens = parseObject(part.tokens);
57
+ const cache = parseObject(tokens.cache);
58
+ usage.inputTokens += asNumber(tokens.input, 0);
59
+ usage.cachedInputTokens += asNumber(cache.read, 0);
60
+ usage.outputTokens += asNumber(tokens.output, 0) + asNumber(tokens.reasoning, 0);
61
+ costUsd += asNumber(part.cost, 0);
62
+ continue;
63
+ }
64
+ if (type === "tool_use") {
65
+ const part = parseObject(event.part);
66
+ const state = parseObject(part.state);
67
+ if (asString(state.status, "") === "error") {
68
+ const text = asString(state.error, "").trim();
69
+ if (text)
70
+ errors.push(text);
71
+ }
72
+ continue;
73
+ }
74
+ if (type === "error") {
75
+ const text = errorText(event.error ?? event.message).trim();
76
+ if (text)
77
+ errors.push(text);
78
+ continue;
79
+ }
80
+ }
81
+ return {
82
+ sessionId,
83
+ summary: messages.join("\n\n").trim(),
84
+ usage,
85
+ costUsd,
86
+ errorMessage: errors.length > 0 ? errors.join("\n") : null,
87
+ };
88
+ }
89
+ export function isOpenCodeUnknownSessionError(stdout, stderr) {
90
+ const haystack = `${stdout}\n${stderr}`
91
+ .split(/\r?\n/)
92
+ .map((line) => line.trim())
93
+ .filter(Boolean)
94
+ .join("\n");
95
+ return /unknown\s+session|session\b.*\bnot\s+found|resource\s+not\s+found:.*[\\/]session[\\/].*\.json|notfounderror|no session/i.test(haystack);
96
+ }
97
+ //# sourceMappingURL=parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/server/parse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=parse.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.test.d.ts","sourceRoot":"","sources":["../../src/server/parse.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,48 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { parseOpenCodeJsonl, isOpenCodeUnknownSessionError } from "./parse.js";
3
+ describe("parseOpenCodeJsonl", () => {
4
+ it("parses assistant text, usage, cost, and errors", () => {
5
+ const stdout = [
6
+ JSON.stringify({
7
+ type: "text",
8
+ sessionID: "session_123",
9
+ part: { text: "Hello from OpenCode" },
10
+ }),
11
+ JSON.stringify({
12
+ type: "step_finish",
13
+ sessionID: "session_123",
14
+ part: {
15
+ reason: "done",
16
+ cost: 0.0025,
17
+ tokens: {
18
+ input: 120,
19
+ output: 40,
20
+ reasoning: 10,
21
+ cache: { read: 20, write: 0 },
22
+ },
23
+ },
24
+ }),
25
+ JSON.stringify({
26
+ type: "error",
27
+ sessionID: "session_123",
28
+ error: { message: "model unavailable" },
29
+ }),
30
+ ].join("\n");
31
+ const parsed = parseOpenCodeJsonl(stdout);
32
+ expect(parsed.sessionId).toBe("session_123");
33
+ expect(parsed.summary).toBe("Hello from OpenCode");
34
+ expect(parsed.usage).toEqual({
35
+ inputTokens: 120,
36
+ cachedInputTokens: 20,
37
+ outputTokens: 50,
38
+ });
39
+ expect(parsed.costUsd).toBeCloseTo(0.0025, 6);
40
+ expect(parsed.errorMessage).toContain("model unavailable");
41
+ });
42
+ it("detects unknown session errors", () => {
43
+ expect(isOpenCodeUnknownSessionError("Session not found: s_123", "")).toBe(true);
44
+ expect(isOpenCodeUnknownSessionError("", "unknown session id")).toBe(true);
45
+ expect(isOpenCodeUnknownSessionError("all good", "")).toBe(false);
46
+ });
47
+ });
48
+ //# sourceMappingURL=parse.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.test.js","sourceRoot":"","sources":["../../src/server/parse.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,6BAA6B,EAAE,MAAM,YAAY,CAAC;AAE/E,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,MAAM,MAAM,GAAG;YACb,IAAI,CAAC,SAAS,CAAC;gBACb,IAAI,EAAE,MAAM;gBACZ,SAAS,EAAE,aAAa;gBACxB,IAAI,EAAE,EAAE,IAAI,EAAE,qBAAqB,EAAE;aACtC,CAAC;YACF,IAAI,CAAC,SAAS,CAAC;gBACb,IAAI,EAAE,aAAa;gBACnB,SAAS,EAAE,aAAa;gBACxB,IAAI,EAAE;oBACJ,MAAM,EAAE,MAAM;oBACd,IAAI,EAAE,MAAM;oBACZ,MAAM,EAAE;wBACN,KAAK,EAAE,GAAG;wBACV,MAAM,EAAE,EAAE;wBACV,SAAS,EAAE,EAAE;wBACb,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;qBAC9B;iBACF;aACF,CAAC;YACF,IAAI,CAAC,SAAS,CAAC;gBACb,IAAI,EAAE,OAAO;gBACb,SAAS,EAAE,aAAa;gBACxB,KAAK,EAAE,EAAE,OAAO,EAAE,mBAAmB,EAAE;aACxC,CAAC;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,MAAM,MAAM,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QACnD,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;YAC3B,WAAW,EAAE,GAAG;YAChB,iBAAiB,EAAE,EAAE;YACrB,YAAY,EAAE,EAAE;SACjB,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,CAAC,6BAA6B,CAAC,0BAA0B,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjF,MAAM,CAAC,6BAA6B,CAAC,EAAE,EAAE,oBAAoB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3E,MAAM,CAAC,6BAA6B,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { AdapterSkillContext, AdapterSkillSnapshot } from "@airisos/adapter-utils";
2
+ export declare function listOpenCodeSkills(ctx: AdapterSkillContext): Promise<AdapterSkillSnapshot>;
3
+ export declare function syncOpenCodeSkills(ctx: AdapterSkillContext, desiredSkills: string[]): Promise<AdapterSkillSnapshot>;
4
+ export declare function resolveOpenCodeDesiredSkillNames(config: Record<string, unknown>, availableEntries: Array<{
5
+ key: string;
6
+ required?: boolean;
7
+ }>): string[];
8
+ //# sourceMappingURL=skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/server/skills.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,wBAAwB,CAAC;AA+ChC,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,mBAAmB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAEhG;AAED,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,mBAAmB,EACxB,aAAa,EAAE,MAAM,EAAE,GACtB,OAAO,CAAC,oBAAoB,CAAC,CA0B/B;AAED,wBAAgB,gCAAgC,CAC9C,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,gBAAgB,EAAE,KAAK,CAAC;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,YAG7D"}
@@ -0,0 +1,73 @@
1
+ import fs from "node:fs/promises";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { fileURLToPath } from "node:url";
5
+ import { buildPersistentSkillSnapshot, ensurePaperclipSkillSymlink, readPaperclipRuntimeSkillEntries, readInstalledSkillTargets, resolvePaperclipDesiredSkillNames, } from "@airisos/adapter-utils/server-utils";
6
+ const __moduleDir = path.dirname(fileURLToPath(import.meta.url));
7
+ function asString(value) {
8
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
9
+ }
10
+ function resolveOpenCodeSkillsHome(config) {
11
+ const env = typeof config.env === "object" && config.env !== null && !Array.isArray(config.env)
12
+ ? config.env
13
+ : {};
14
+ const configuredHome = asString(env.HOME);
15
+ const home = configuredHome ? path.resolve(configuredHome) : os.homedir();
16
+ return path.join(home, ".claude", "skills");
17
+ }
18
+ async function buildOpenCodeSkillSnapshot(config) {
19
+ const availableEntries = await readPaperclipRuntimeSkillEntries(config, __moduleDir);
20
+ const desiredSkills = resolvePaperclipDesiredSkillNames(config, availableEntries);
21
+ const skillsHome = resolveOpenCodeSkillsHome(config);
22
+ const installed = await readInstalledSkillTargets(skillsHome);
23
+ return buildPersistentSkillSnapshot({
24
+ adapterType: "opencode_local",
25
+ availableEntries,
26
+ desiredSkills,
27
+ installed,
28
+ skillsHome,
29
+ locationLabel: "~/.claude/skills",
30
+ installedDetail: "Installed in the shared Claude/OpenCode skills home.",
31
+ missingDetail: "Configured but not currently linked into the shared Claude/OpenCode skills home.",
32
+ externalConflictDetail: "Skill name is occupied by an external installation in the shared skills home.",
33
+ externalDetail: "Installed outside Paperclip management in the shared skills home.",
34
+ warnings: [
35
+ "OpenCode currently uses the shared Claude skills home (~/.claude/skills).",
36
+ ],
37
+ });
38
+ }
39
+ export async function listOpenCodeSkills(ctx) {
40
+ return buildOpenCodeSkillSnapshot(ctx.config);
41
+ }
42
+ export async function syncOpenCodeSkills(ctx, desiredSkills) {
43
+ const availableEntries = await readPaperclipRuntimeSkillEntries(ctx.config, __moduleDir);
44
+ const desiredSet = new Set([
45
+ ...desiredSkills,
46
+ ...availableEntries.filter((entry) => entry.required).map((entry) => entry.key),
47
+ ]);
48
+ const skillsHome = resolveOpenCodeSkillsHome(ctx.config);
49
+ await fs.mkdir(skillsHome, { recursive: true });
50
+ const installed = await readInstalledSkillTargets(skillsHome);
51
+ const availableByRuntimeName = new Map(availableEntries.map((entry) => [entry.runtimeName, entry]));
52
+ for (const available of availableEntries) {
53
+ if (!desiredSet.has(available.key))
54
+ continue;
55
+ const target = path.join(skillsHome, available.runtimeName);
56
+ await ensurePaperclipSkillSymlink(available.source, target);
57
+ }
58
+ for (const [name, installedEntry] of installed.entries()) {
59
+ const available = availableByRuntimeName.get(name);
60
+ if (!available)
61
+ continue;
62
+ if (desiredSet.has(available.key))
63
+ continue;
64
+ if (installedEntry.targetPath !== available.source)
65
+ continue;
66
+ await fs.unlink(path.join(skillsHome, name)).catch(() => { });
67
+ }
68
+ return buildOpenCodeSkillSnapshot(ctx.config);
69
+ }
70
+ export function resolveOpenCodeDesiredSkillNames(config, availableEntries) {
71
+ return resolvePaperclipDesiredSkillNames(config, availableEntries);
72
+ }
73
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/server/skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { AdapterEnvironmentTestContext, AdapterEnvironmentTestResult } from "@airisos/adapter-utils";
2
+ export declare function testEnvironment(ctx: AdapterEnvironmentTestContext): Promise<AdapterEnvironmentTestResult>;
3
+ //# sourceMappingURL=test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../src/server/test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,6BAA6B,EAC7B,4BAA4B,EAC7B,MAAM,wBAAwB,CAAC;AAgDhC,wBAAsB,eAAe,CACnC,GAAG,EAAE,6BAA6B,GACjC,OAAO,CAAC,4BAA4B,CAAC,CAwQvC"}