@tickernelz/paperclip-pro-adapter-opencode-local 2026.925.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 (78) hide show
  1. package/LICENSE +22 -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 +11 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +113 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/server/execute.d.ts +13 -0
  15. package/dist/server/execute.d.ts.map +1 -0
  16. package/dist/server/execute.js +595 -0
  17. package/dist/server/execute.js.map +1 -0
  18. package/dist/server/execute.remote.test.d.ts +2 -0
  19. package/dist/server/execute.remote.test.d.ts.map +1 -0
  20. package/dist/server/execute.remote.test.js +351 -0
  21. package/dist/server/execute.remote.test.js.map +1 -0
  22. package/dist/server/execute.test.d.ts +2 -0
  23. package/dist/server/execute.test.d.ts.map +1 -0
  24. package/dist/server/execute.test.js +290 -0
  25. package/dist/server/execute.test.js.map +1 -0
  26. package/dist/server/index.d.ts +8 -0
  27. package/dist/server/index.d.ts.map +1 -0
  28. package/dist/server/index.js +63 -0
  29. package/dist/server/index.js.map +1 -0
  30. package/dist/server/models.d.ts +24 -0
  31. package/dist/server/models.d.ts.map +1 -0
  32. package/dist/server/models.js +281 -0
  33. package/dist/server/models.js.map +1 -0
  34. package/dist/server/models.test.d.ts +2 -0
  35. package/dist/server/models.test.d.ts.map +1 -0
  36. package/dist/server/models.test.js +258 -0
  37. package/dist/server/models.test.js.map +1 -0
  38. package/dist/server/parse.d.ts +14 -0
  39. package/dist/server/parse.d.ts.map +1 -0
  40. package/dist/server/parse.js +99 -0
  41. package/dist/server/parse.js.map +1 -0
  42. package/dist/server/parse.test.d.ts +2 -0
  43. package/dist/server/parse.test.d.ts.map +1 -0
  44. package/dist/server/parse.test.js +73 -0
  45. package/dist/server/parse.test.js.map +1 -0
  46. package/dist/server/runtime-config.d.ts +20 -0
  47. package/dist/server/runtime-config.d.ts.map +1 -0
  48. package/dist/server/runtime-config.js +216 -0
  49. package/dist/server/runtime-config.js.map +1 -0
  50. package/dist/server/runtime-config.test.d.ts +2 -0
  51. package/dist/server/runtime-config.test.d.ts.map +1 -0
  52. package/dist/server/runtime-config.test.js +255 -0
  53. package/dist/server/runtime-config.test.js.map +1 -0
  54. package/dist/server/skills.d.ts +8 -0
  55. package/dist/server/skills.d.ts.map +1 -0
  56. package/dist/server/skills.js +73 -0
  57. package/dist/server/skills.js.map +1 -0
  58. package/dist/server/test.d.ts +3 -0
  59. package/dist/server/test.d.ts.map +1 -0
  60. package/dist/server/test.js +416 -0
  61. package/dist/server/test.js.map +1 -0
  62. package/dist/server/test.remote.test.d.ts +2 -0
  63. package/dist/server/test.remote.test.d.ts.map +1 -0
  64. package/dist/server/test.remote.test.js +132 -0
  65. package/dist/server/test.remote.test.js.map +1 -0
  66. package/dist/ui/build-config.d.ts +3 -0
  67. package/dist/ui/build-config.d.ts.map +1 -0
  68. package/dist/ui/build-config.js +32 -0
  69. package/dist/ui/build-config.js.map +1 -0
  70. package/dist/ui/index.d.ts +3 -0
  71. package/dist/ui/index.d.ts.map +1 -0
  72. package/dist/ui/index.js +3 -0
  73. package/dist/ui/index.js.map +1 -0
  74. package/dist/ui/parse-stdout.d.ts +3 -0
  75. package/dist/ui/parse-stdout.d.ts.map +1 -0
  76. package/dist/ui/parse-stdout.js +141 -0
  77. package/dist/ui/parse-stdout.js.map +1 -0
  78. package/package.json +58 -0
@@ -0,0 +1,258 @@
1
+ import { afterEach, describe, expect, it, vi } from "vitest";
2
+ import * as serverUtils from "@tickernelz/paperclip-pro-adapter-utils/server-utils";
3
+ import { discoverOpenCodeModels, ensureOpenCodeModelConfiguredAndAvailable, listOpenCodeModels, requireOpenCodeModelId, resetOpenCodeModelsCacheForTests, } from "./models.js";
4
+ describe("openCode models", () => {
5
+ afterEach(() => {
6
+ delete process.env.PAPERCLIP_OPENCODE_COMMAND;
7
+ delete process.env.OPENCODE_ALLOW_ALL_MODELS;
8
+ resetOpenCodeModelsCacheForTests();
9
+ vi.restoreAllMocks();
10
+ vi.useRealTimers();
11
+ });
12
+ it("returns an empty list when discovery command is unavailable", async () => {
13
+ process.env.PAPERCLIP_OPENCODE_COMMAND =
14
+ "__paperclip_missing_opencode_command__";
15
+ await expect(listOpenCodeModels()).resolves.toEqual([]);
16
+ });
17
+ it("rejects when model is missing", async () => {
18
+ await expect(ensureOpenCodeModelConfiguredAndAvailable({ model: "" })).rejects.toThrow("OpenCode requires `adapterConfig.model`");
19
+ });
20
+ it("accepts a provider/model id without running discovery", () => {
21
+ expect(requireOpenCodeModelId("openai/gpt-5.2-codex")).toBe("openai/gpt-5.2-codex");
22
+ });
23
+ it("rejects malformed provider/model ids before discovery", () => {
24
+ expect(() => requireOpenCodeModelId("gpt-5.2-codex")).toThrow("OpenCode requires `adapterConfig.model`");
25
+ expect(() => requireOpenCodeModelId("openai/")).toThrow("OpenCode requires `adapterConfig.model`");
26
+ });
27
+ it("proceeds with the configured model when discovery cannot run (probe is best-effort, never fatal)", async () => {
28
+ process.env.PAPERCLIP_OPENCODE_COMMAND =
29
+ "__paperclip_missing_opencode_command__";
30
+ await expect(ensureOpenCodeModelConfiguredAndAvailable({
31
+ model: "openai/gpt-5",
32
+ })).resolves.toEqual([{ id: "openai/gpt-5", label: "openai/gpt-5" }]);
33
+ });
34
+ it("skips the availability check when OPENCODE_ALLOW_ALL_MODELS is set in the run env", async () => {
35
+ process.env.PAPERCLIP_OPENCODE_COMMAND =
36
+ "__paperclip_missing_opencode_command__";
37
+ await expect(ensureOpenCodeModelConfiguredAndAvailable({
38
+ model: "anthropic/tensorix/deepseek/deepseek-chat-v3.1",
39
+ env: { OPENCODE_ALLOW_ALL_MODELS: "true" },
40
+ })).resolves.toEqual([
41
+ {
42
+ id: "anthropic/tensorix/deepseek/deepseek-chat-v3.1",
43
+ label: "anthropic/tensorix/deepseek/deepseek-chat-v3.1",
44
+ },
45
+ ]);
46
+ });
47
+ it("honours OPENCODE_ALLOW_ALL_MODELS from the process env", async () => {
48
+ process.env.PAPERCLIP_OPENCODE_COMMAND =
49
+ "__paperclip_missing_opencode_command__";
50
+ process.env.OPENCODE_ALLOW_ALL_MODELS = "1";
51
+ await expect(ensureOpenCodeModelConfiguredAndAvailable({
52
+ model: "anthropic/gateway/some-model",
53
+ })).resolves.toEqual([
54
+ {
55
+ id: "anthropic/gateway/some-model",
56
+ label: "anthropic/gateway/some-model",
57
+ },
58
+ ]);
59
+ });
60
+ it("still enforces provider/model format when OPENCODE_ALLOW_ALL_MODELS is set", async () => {
61
+ await expect(ensureOpenCodeModelConfiguredAndAvailable({
62
+ model: "not-a-valid-id",
63
+ env: { OPENCODE_ALLOW_ALL_MODELS: "true" },
64
+ })).rejects.toThrow("OpenCode requires `adapterConfig.model`");
65
+ });
66
+ it("retries a transient `opencode models` failure with backoff before succeeding", async () => {
67
+ vi.useFakeTimers();
68
+ const spy = vi
69
+ .spyOn(serverUtils, "runChildProcess")
70
+ .mockResolvedValueOnce({
71
+ exitCode: 1,
72
+ signal: null,
73
+ timedOut: false,
74
+ stdout: "",
75
+ stderr: "queued behind another opencode run",
76
+ pid: 1,
77
+ startedAt: new Date().toISOString(),
78
+ })
79
+ .mockResolvedValueOnce({
80
+ exitCode: null,
81
+ signal: null,
82
+ timedOut: true,
83
+ stdout: "",
84
+ stderr: "",
85
+ pid: 1,
86
+ startedAt: new Date().toISOString(),
87
+ })
88
+ .mockResolvedValueOnce({
89
+ exitCode: 0,
90
+ signal: null,
91
+ timedOut: false,
92
+ stdout: "ollama/qwen2.5-coder:7b\n",
93
+ stderr: "",
94
+ pid: 1,
95
+ startedAt: new Date().toISOString(),
96
+ });
97
+ const promise = discoverOpenCodeModels();
98
+ await vi.runAllTimersAsync();
99
+ await expect(promise).resolves.toEqual([
100
+ { id: "ollama/qwen2.5-coder:7b", label: "ollama/qwen2.5-coder:7b" },
101
+ ]);
102
+ expect(spy).toHaveBeenCalledTimes(3);
103
+ });
104
+ it("refreshes a stale non-empty catalog before rejecting the configured model", async () => {
105
+ const spy = vi
106
+ .spyOn(serverUtils, "runChildProcess")
107
+ .mockResolvedValueOnce({
108
+ exitCode: 0,
109
+ signal: null,
110
+ timedOut: false,
111
+ stdout: "openrouter/example/stale-model\n",
112
+ stderr: "",
113
+ pid: 1,
114
+ startedAt: new Date().toISOString(),
115
+ })
116
+ .mockResolvedValueOnce({
117
+ exitCode: 0,
118
+ signal: null,
119
+ timedOut: false,
120
+ stdout: "Models cache refreshed\n",
121
+ stderr: "",
122
+ pid: 1,
123
+ startedAt: new Date().toISOString(),
124
+ })
125
+ .mockResolvedValueOnce({
126
+ exitCode: 0,
127
+ signal: null,
128
+ timedOut: false,
129
+ stdout: "openrouter/example/current-model\nopenrouter/deepseek/deepseek-v4-flash-0731\n",
130
+ stderr: "",
131
+ pid: 1,
132
+ startedAt: new Date().toISOString(),
133
+ });
134
+ await expect(ensureOpenCodeModelConfiguredAndAvailable({
135
+ model: "openrouter/deepseek/deepseek-v4-flash-0731",
136
+ })).resolves.toContainEqual({
137
+ id: "openrouter/deepseek/deepseek-v4-flash-0731",
138
+ label: "openrouter/deepseek/deepseek-v4-flash-0731",
139
+ });
140
+ expect(spy).toHaveBeenCalledTimes(3);
141
+ expect(spy.mock.calls[0]?.[2]).toEqual(["models"]);
142
+ expect(spy.mock.calls[1]?.[2]).toEqual(["models", "--refresh"]);
143
+ expect(spy.mock.calls[2]?.[2]).toEqual(["models"]);
144
+ });
145
+ it("still rejects when a refreshed non-empty catalog omits the configured model", async () => {
146
+ const spy = vi
147
+ .spyOn(serverUtils, "runChildProcess")
148
+ .mockResolvedValueOnce({
149
+ exitCode: 0,
150
+ signal: null,
151
+ timedOut: false,
152
+ stdout: "openrouter/example/stale-model\n",
153
+ stderr: "",
154
+ pid: 1,
155
+ startedAt: new Date().toISOString(),
156
+ })
157
+ .mockResolvedValueOnce({
158
+ exitCode: 0,
159
+ signal: null,
160
+ timedOut: false,
161
+ stdout: "Models cache refreshed\n",
162
+ stderr: "",
163
+ pid: 1,
164
+ startedAt: new Date().toISOString(),
165
+ })
166
+ .mockResolvedValueOnce({
167
+ exitCode: 0,
168
+ signal: null,
169
+ timedOut: false,
170
+ stdout: "openrouter/example/current-model\n",
171
+ stderr: "",
172
+ pid: 1,
173
+ startedAt: new Date().toISOString(),
174
+ });
175
+ await expect(ensureOpenCodeModelConfiguredAndAvailable({
176
+ model: "openrouter/deepseek/deepseek-v4-flash-0731",
177
+ })).rejects.toThrow("Configured OpenCode model is unavailable: openrouter/deepseek/deepseek-v4-flash-0731");
178
+ expect(spy).toHaveBeenCalledTimes(3);
179
+ expect(spy.mock.calls[1]?.[2]).toEqual(["models", "--refresh"]);
180
+ expect(spy.mock.calls[2]?.[2]).toEqual(["models"]);
181
+ });
182
+ it("still rejects from the original catalog when post-refresh enumeration returns no models", async () => {
183
+ const spy = vi
184
+ .spyOn(serverUtils, "runChildProcess")
185
+ .mockResolvedValueOnce({
186
+ exitCode: 0,
187
+ signal: null,
188
+ timedOut: false,
189
+ stdout: "openrouter/example/stale-model\n",
190
+ stderr: "",
191
+ pid: 1,
192
+ startedAt: new Date().toISOString(),
193
+ })
194
+ .mockResolvedValueOnce({
195
+ exitCode: 0,
196
+ signal: null,
197
+ timedOut: false,
198
+ stdout: "Models cache refreshed\n",
199
+ stderr: "",
200
+ pid: 1,
201
+ startedAt: new Date().toISOString(),
202
+ })
203
+ .mockResolvedValueOnce({
204
+ exitCode: 0,
205
+ signal: null,
206
+ timedOut: false,
207
+ stdout: "",
208
+ stderr: "",
209
+ pid: 1,
210
+ startedAt: new Date().toISOString(),
211
+ });
212
+ await expect(ensureOpenCodeModelConfiguredAndAvailable({
213
+ model: "openrouter/deepseek/deepseek-v4-flash-0731",
214
+ })).rejects.toThrow("Available models: openrouter/example/stale-model");
215
+ expect(spy).toHaveBeenCalledTimes(3);
216
+ expect(spy.mock.calls[1]?.[2]).toEqual(["models", "--refresh"]);
217
+ expect(spy.mock.calls[2]?.[2]).toEqual(["models"]);
218
+ });
219
+ it("still rejects from the original catalog when refresh fails", async () => {
220
+ const warning = vi.spyOn(console, "warn").mockImplementation(() => { });
221
+ const spy = vi
222
+ .spyOn(serverUtils, "runChildProcess")
223
+ .mockResolvedValueOnce({
224
+ exitCode: 0,
225
+ signal: null,
226
+ timedOut: false,
227
+ stdout: "openrouter/example/stale-model\n",
228
+ stderr: "",
229
+ pid: 1,
230
+ startedAt: new Date().toISOString(),
231
+ })
232
+ .mockRejectedValueOnce(new Error("refresh unavailable"));
233
+ await expect(ensureOpenCodeModelConfiguredAndAvailable({
234
+ model: "openrouter/deepseek/deepseek-v4-flash-0731",
235
+ })).rejects.toThrow("Available models: openrouter/example/stale-model");
236
+ expect(spy).toHaveBeenCalledTimes(2);
237
+ expect(spy.mock.calls[1]?.[2]).toEqual(["models", "--refresh"]);
238
+ expect(warning).toHaveBeenCalledWith(expect.stringContaining('refresh failed for "openrouter/deepseek/deepseek-v4-flash-0731"'));
239
+ });
240
+ it("surfaces the last error once retries are exhausted", async () => {
241
+ vi.useFakeTimers();
242
+ const spy = vi.spyOn(serverUtils, "runChildProcess").mockResolvedValue({
243
+ exitCode: 1,
244
+ signal: null,
245
+ timedOut: false,
246
+ stdout: "",
247
+ stderr: "queued behind another opencode run",
248
+ pid: 1,
249
+ startedAt: new Date().toISOString(),
250
+ });
251
+ const promise = discoverOpenCodeModels();
252
+ const assertion = expect(promise).rejects.toThrow("`opencode models` failed: queued behind another opencode run");
253
+ await vi.runAllTimersAsync();
254
+ await assertion;
255
+ expect(spy).toHaveBeenCalledTimes(3);
256
+ });
257
+ });
258
+ //# sourceMappingURL=models.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.test.js","sourceRoot":"","sources":["../../src/server/models.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
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
+ toolErrors: string[];
12
+ };
13
+ export declare function isOpenCodeUnknownSessionError(stdout: string, stderr: string): boolean;
14
+ //# 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;;;;;;;;;;;EAmEhD;AAED,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAUrF"}
@@ -0,0 +1,99 @@
1
+ import { asNumber, asString, parseJson, parseObject } from "@tickernelz/paperclip-pro-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 toolErrors = [];
31
+ const usage = {
32
+ inputTokens: 0,
33
+ cachedInputTokens: 0,
34
+ outputTokens: 0,
35
+ };
36
+ let costUsd = 0;
37
+ for (const rawLine of stdout.split(/\r?\n/)) {
38
+ const line = rawLine.trim();
39
+ if (!line)
40
+ continue;
41
+ const event = parseJson(line);
42
+ if (!event)
43
+ continue;
44
+ const currentSessionId = asString(event.sessionID, "").trim();
45
+ if (currentSessionId)
46
+ sessionId = currentSessionId;
47
+ const type = asString(event.type, "");
48
+ if (type === "text") {
49
+ const part = parseObject(event.part);
50
+ const text = asString(part.text, "").trim();
51
+ if (text)
52
+ messages.push(text);
53
+ continue;
54
+ }
55
+ if (type === "step_finish") {
56
+ const part = parseObject(event.part);
57
+ const tokens = parseObject(part.tokens);
58
+ const cache = parseObject(tokens.cache);
59
+ usage.inputTokens += asNumber(tokens.input, 0);
60
+ usage.cachedInputTokens += asNumber(cache.read, 0);
61
+ usage.outputTokens += asNumber(tokens.output, 0) + asNumber(tokens.reasoning, 0);
62
+ costUsd += asNumber(part.cost, 0);
63
+ continue;
64
+ }
65
+ if (type === "tool_use") {
66
+ const part = parseObject(event.part);
67
+ const state = parseObject(part.state);
68
+ if (asString(state.status, "") === "error") {
69
+ const text = asString(state.error, "").trim();
70
+ if (text)
71
+ toolErrors.push(text);
72
+ }
73
+ continue;
74
+ }
75
+ if (type === "error") {
76
+ const text = errorText(event.error ?? event.message).trim();
77
+ if (text)
78
+ errors.push(text);
79
+ continue;
80
+ }
81
+ }
82
+ return {
83
+ sessionId,
84
+ summary: messages.join("\n\n").trim(),
85
+ usage,
86
+ costUsd,
87
+ errorMessage: errors.length > 0 ? errors.join("\n") : null,
88
+ toolErrors,
89
+ };
90
+ }
91
+ export function isOpenCodeUnknownSessionError(stdout, stderr) {
92
+ const haystack = `${stdout}\n${stderr}`
93
+ .split(/\r?\n/)
94
+ .map((line) => line.trim())
95
+ .filter(Boolean)
96
+ .join("\n");
97
+ return /unknown\s+session|session\b.*\bnot\s+found|resource\s+not\s+found:.*[\\/]session[\\/].*\.json|notfounderror|no session/i.test(haystack);
98
+ }
99
+ //# 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,73 @@
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
+ expect(parsed.toolErrors).toEqual([]);
42
+ });
43
+ it("keeps failed tool calls separate from fatal run errors", () => {
44
+ const stdout = [
45
+ JSON.stringify({
46
+ type: "tool_use",
47
+ sessionID: "session_123",
48
+ part: {
49
+ state: {
50
+ status: "error",
51
+ error: "File not found: e2b-adapter-result.txt",
52
+ },
53
+ },
54
+ }),
55
+ JSON.stringify({
56
+ type: "text",
57
+ sessionID: "session_123",
58
+ part: { text: "Recovered and completed the task" },
59
+ }),
60
+ ].join("\n");
61
+ const parsed = parseOpenCodeJsonl(stdout);
62
+ expect(parsed.sessionId).toBe("session_123");
63
+ expect(parsed.summary).toBe("Recovered and completed the task");
64
+ expect(parsed.errorMessage).toBeNull();
65
+ expect(parsed.toolErrors).toEqual(["File not found: e2b-adapter-result.txt"]);
66
+ });
67
+ it("detects unknown session errors", () => {
68
+ expect(isOpenCodeUnknownSessionError("Session not found: s_123", "")).toBe(true);
69
+ expect(isOpenCodeUnknownSessionError("", "unknown session id")).toBe(true);
70
+ expect(isOpenCodeUnknownSessionError("all good", "")).toBe(false);
71
+ });
72
+ });
73
+ //# sourceMappingURL=parse.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.test.js","sourceRoot":"","sources":["../../src/server/parse.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ type PreparedOpenCodeRuntimeConfig = {
2
+ env: Record<string, string>;
3
+ notes: string[];
4
+ cleanup: () => Promise<void>;
5
+ };
6
+ export declare function prepareOpenCodeRuntimeConfig(input: {
7
+ env: Record<string, string>;
8
+ config: Record<string, unknown>;
9
+ targetIsRemote?: boolean;
10
+ }): Promise<PreparedOpenCodeRuntimeConfig>;
11
+ /** Managed credentials must never leave host-only homes in a remote process. */
12
+ export declare function prepareManagedOpenCodeRemoteHomes(input: {
13
+ env: Record<string, string>;
14
+ config: Record<string, unknown>;
15
+ runtimeRootDir: string | null | undefined;
16
+ runId: string;
17
+ configDir?: string;
18
+ }): void;
19
+ export {};
20
+ //# sourceMappingURL=runtime-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-config.d.ts","sourceRoot":"","sources":["../../src/server/runtime-config.ts"],"names":[],"mappings":"AAKA,KAAK,6BAA6B,GAAG;IACnC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B,CAAC;AA+FF,wBAAsB,4BAA4B,CAAC,KAAK,EAAE;IACxD,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,GAAG,OAAO,CAAC,6BAA6B,CAAC,CA+HzC;AAED,gFAAgF;AAChF,wBAAgB,iCAAiC,CAAC,KAAK,EAAE;IACvD,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,cAAc,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IAC1C,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,IAAI,CAWP"}