@paperclipai/adapter-opencode-local 0.3.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 (54) 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 +309 -0
  17. package/dist/server/execute.js.map +1 -0
  18. package/dist/server/index.d.ts +7 -0
  19. package/dist/server/index.d.ts.map +1 -0
  20. package/dist/server/index.js +62 -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 +150 -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/test.d.ts +3 -0
  39. package/dist/server/test.d.ts.map +1 -0
  40. package/dist/server/test.js +300 -0
  41. package/dist/server/test.js.map +1 -0
  42. package/dist/ui/build-config.d.ts +3 -0
  43. package/dist/ui/build-config.d.ts.map +1 -0
  44. package/dist/ui/build-config.js +85 -0
  45. package/dist/ui/build-config.js.map +1 -0
  46. package/dist/ui/index.d.ts +3 -0
  47. package/dist/ui/index.d.ts.map +1 -0
  48. package/dist/ui/index.js +3 -0
  49. package/dist/ui/index.js.map +1 -0
  50. package/dist/ui/parse-stdout.d.ts +3 -0
  51. package/dist/ui/parse-stdout.d.ts.map +1 -0
  52. package/dist/ui/parse-stdout.js +140 -0
  53. package/dist/ui/parse-stdout.js.map +1 -0
  54. package/package.json +45 -0
@@ -0,0 +1,300 @@
1
+ import { asString, asStringArray, parseObject, ensureAbsoluteDirectory, ensureCommandResolvable, ensurePathInEnv, runChildProcess, } from "@paperclipai/adapter-utils/server-utils";
2
+ import { discoverOpenCodeModels, ensureOpenCodeModelConfiguredAndAvailable } from "./models.js";
3
+ import { parseOpenCodeJsonl } from "./parse.js";
4
+ function summarizeStatus(checks) {
5
+ if (checks.some((check) => check.level === "error"))
6
+ return "fail";
7
+ if (checks.some((check) => check.level === "warn"))
8
+ return "warn";
9
+ return "pass";
10
+ }
11
+ function firstNonEmptyLine(text) {
12
+ return (text
13
+ .split(/\r?\n/)
14
+ .map((line) => line.trim())
15
+ .find(Boolean) ?? "");
16
+ }
17
+ function summarizeProbeDetail(stdout, stderr, parsedError) {
18
+ const raw = parsedError?.trim() || firstNonEmptyLine(stderr) || firstNonEmptyLine(stdout);
19
+ if (!raw)
20
+ return null;
21
+ const clean = raw.replace(/\s+/g, " ").trim();
22
+ const max = 240;
23
+ return clean.length > max ? `${clean.slice(0, max - 1)}...` : clean;
24
+ }
25
+ function normalizeEnv(input) {
26
+ if (typeof input !== "object" || input === null || Array.isArray(input))
27
+ return {};
28
+ const env = {};
29
+ for (const [key, value] of Object.entries(input)) {
30
+ if (typeof value === "string")
31
+ env[key] = value;
32
+ }
33
+ return env;
34
+ }
35
+ const OPENCODE_AUTH_REQUIRED_RE = /(?:auth(?:entication)?\s+required|api\s*key|invalid\s*api\s*key|not\s+logged\s+in|opencode\s+auth\s+login|free\s+usage\s+exceeded)/i;
36
+ export async function testEnvironment(ctx) {
37
+ const checks = [];
38
+ const config = parseObject(ctx.config);
39
+ const command = asString(config.command, "opencode");
40
+ const cwd = asString(config.cwd, process.cwd());
41
+ try {
42
+ await ensureAbsoluteDirectory(cwd, { createIfMissing: false });
43
+ checks.push({
44
+ code: "opencode_cwd_valid",
45
+ level: "info",
46
+ message: `Working directory is valid: ${cwd}`,
47
+ });
48
+ }
49
+ catch (err) {
50
+ checks.push({
51
+ code: "opencode_cwd_invalid",
52
+ level: "error",
53
+ message: err instanceof Error ? err.message : "Invalid working directory",
54
+ detail: cwd,
55
+ });
56
+ }
57
+ const envConfig = parseObject(config.env);
58
+ const env = {};
59
+ for (const [key, value] of Object.entries(envConfig)) {
60
+ if (typeof value === "string")
61
+ env[key] = value;
62
+ }
63
+ const openaiKeyOverride = "OPENAI_API_KEY" in envConfig ? asString(envConfig.OPENAI_API_KEY, "") : null;
64
+ if (openaiKeyOverride !== null && openaiKeyOverride.trim() === "") {
65
+ checks.push({
66
+ code: "opencode_openai_api_key_missing",
67
+ level: "warn",
68
+ message: "OPENAI_API_KEY override is empty.",
69
+ hint: "The OPENAI_API_KEY override is empty. Set a valid key or remove the override.",
70
+ });
71
+ }
72
+ const runtimeEnv = normalizeEnv(ensurePathInEnv({ ...process.env, ...env }));
73
+ const cwdInvalid = checks.some((check) => check.code === "opencode_cwd_invalid");
74
+ if (cwdInvalid) {
75
+ checks.push({
76
+ code: "opencode_command_skipped",
77
+ level: "warn",
78
+ message: "Skipped command check because working directory validation failed.",
79
+ detail: command,
80
+ });
81
+ }
82
+ else {
83
+ try {
84
+ await ensureCommandResolvable(command, cwd, runtimeEnv);
85
+ checks.push({
86
+ code: "opencode_command_resolvable",
87
+ level: "info",
88
+ message: `Command is executable: ${command}`,
89
+ });
90
+ }
91
+ catch (err) {
92
+ checks.push({
93
+ code: "opencode_command_unresolvable",
94
+ level: "error",
95
+ message: err instanceof Error ? err.message : "Command is not executable",
96
+ detail: command,
97
+ });
98
+ }
99
+ }
100
+ const canRunProbe = checks.every((check) => check.code !== "opencode_cwd_invalid" && check.code !== "opencode_command_unresolvable");
101
+ let modelValidationPassed = false;
102
+ const configuredModel = asString(config.model, "").trim();
103
+ if (canRunProbe && configuredModel) {
104
+ try {
105
+ const discovered = await discoverOpenCodeModels({ command, cwd, env: runtimeEnv });
106
+ if (discovered.length > 0) {
107
+ checks.push({
108
+ code: "opencode_models_discovered",
109
+ level: "info",
110
+ message: `Discovered ${discovered.length} model(s) from OpenCode providers.`,
111
+ });
112
+ }
113
+ else {
114
+ checks.push({
115
+ code: "opencode_models_empty",
116
+ level: "error",
117
+ message: "OpenCode returned no models.",
118
+ hint: "Run `opencode models` and verify provider authentication.",
119
+ });
120
+ }
121
+ }
122
+ catch (err) {
123
+ const errMsg = err instanceof Error ? err.message : String(err);
124
+ if (/ProviderModelNotFoundError/i.test(errMsg)) {
125
+ checks.push({
126
+ code: "opencode_hello_probe_model_unavailable",
127
+ level: "warn",
128
+ message: "The configured model was not found by the provider.",
129
+ detail: errMsg,
130
+ hint: "Run `opencode models` and choose an available provider/model ID.",
131
+ });
132
+ }
133
+ else {
134
+ checks.push({
135
+ code: "opencode_models_discovery_failed",
136
+ level: "error",
137
+ message: errMsg || "OpenCode model discovery failed.",
138
+ hint: "Run `opencode models` manually to verify provider auth and config.",
139
+ });
140
+ }
141
+ }
142
+ }
143
+ else if (canRunProbe && !configuredModel) {
144
+ try {
145
+ const discovered = await discoverOpenCodeModels({ command, cwd, env: runtimeEnv });
146
+ if (discovered.length > 0) {
147
+ checks.push({
148
+ code: "opencode_models_discovered",
149
+ level: "info",
150
+ message: `Discovered ${discovered.length} model(s) from OpenCode providers.`,
151
+ });
152
+ }
153
+ }
154
+ catch (err) {
155
+ const errMsg = err instanceof Error ? err.message : String(err);
156
+ if (/ProviderModelNotFoundError/i.test(errMsg)) {
157
+ checks.push({
158
+ code: "opencode_hello_probe_model_unavailable",
159
+ level: "warn",
160
+ message: "The configured model was not found by the provider.",
161
+ detail: errMsg,
162
+ hint: "Run `opencode models` and choose an available provider/model ID.",
163
+ });
164
+ }
165
+ else {
166
+ checks.push({
167
+ code: "opencode_models_discovery_failed",
168
+ level: "warn",
169
+ message: errMsg || "OpenCode model discovery failed (best-effort, no model configured).",
170
+ hint: "Run `opencode models` manually to verify provider auth and config.",
171
+ });
172
+ }
173
+ }
174
+ }
175
+ const modelUnavailable = checks.some((check) => check.code === "opencode_hello_probe_model_unavailable");
176
+ if (!configuredModel && !modelUnavailable) {
177
+ // No model configured – skip model requirement if no model-related checks exist
178
+ }
179
+ else if (configuredModel && canRunProbe) {
180
+ try {
181
+ await ensureOpenCodeModelConfiguredAndAvailable({
182
+ model: configuredModel,
183
+ command,
184
+ cwd,
185
+ env: runtimeEnv,
186
+ });
187
+ checks.push({
188
+ code: "opencode_model_configured",
189
+ level: "info",
190
+ message: `Configured model: ${configuredModel}`,
191
+ });
192
+ modelValidationPassed = true;
193
+ }
194
+ catch (err) {
195
+ checks.push({
196
+ code: "opencode_model_invalid",
197
+ level: "error",
198
+ message: err instanceof Error ? err.message : "Configured model is unavailable.",
199
+ hint: "Run `opencode models` and choose a currently available provider/model ID.",
200
+ });
201
+ }
202
+ }
203
+ if (canRunProbe && modelValidationPassed) {
204
+ const extraArgs = (() => {
205
+ const fromExtraArgs = asStringArray(config.extraArgs);
206
+ if (fromExtraArgs.length > 0)
207
+ return fromExtraArgs;
208
+ return asStringArray(config.args);
209
+ })();
210
+ const variant = asString(config.variant, "").trim();
211
+ const probeModel = configuredModel;
212
+ const args = ["run", "--format", "json"];
213
+ args.push("--model", probeModel);
214
+ if (variant)
215
+ args.push("--variant", variant);
216
+ if (extraArgs.length > 0)
217
+ args.push(...extraArgs);
218
+ try {
219
+ const probe = await runChildProcess(`opencode-envtest-${Date.now()}-${Math.random().toString(16).slice(2)}`, command, args, {
220
+ cwd,
221
+ env: runtimeEnv,
222
+ timeoutSec: 60,
223
+ graceSec: 5,
224
+ stdin: "Respond with hello.",
225
+ onLog: async () => { },
226
+ });
227
+ const parsed = parseOpenCodeJsonl(probe.stdout);
228
+ const detail = summarizeProbeDetail(probe.stdout, probe.stderr, parsed.errorMessage);
229
+ const authEvidence = `${parsed.errorMessage ?? ""}\n${probe.stdout}\n${probe.stderr}`.trim();
230
+ if (probe.timedOut) {
231
+ checks.push({
232
+ code: "opencode_hello_probe_timed_out",
233
+ level: "warn",
234
+ message: "OpenCode hello probe timed out.",
235
+ hint: "Retry the probe. If this persists, run OpenCode manually in this working directory.",
236
+ });
237
+ }
238
+ else if ((probe.exitCode ?? 1) === 0 && !parsed.errorMessage) {
239
+ const summary = parsed.summary.trim();
240
+ const hasHello = /\bhello\b/i.test(summary);
241
+ checks.push({
242
+ code: hasHello ? "opencode_hello_probe_passed" : "opencode_hello_probe_unexpected_output",
243
+ level: hasHello ? "info" : "warn",
244
+ message: hasHello
245
+ ? "OpenCode hello probe succeeded."
246
+ : "OpenCode probe ran but did not return `hello` as expected.",
247
+ ...(summary ? { detail: summary.replace(/\s+/g, " ").trim().slice(0, 240) } : {}),
248
+ ...(hasHello
249
+ ? {}
250
+ : {
251
+ hint: "Run `opencode run --format json` manually and prompt `Respond with hello` to inspect output.",
252
+ }),
253
+ });
254
+ }
255
+ else if (/ProviderModelNotFoundError/i.test(authEvidence)) {
256
+ checks.push({
257
+ code: "opencode_hello_probe_model_unavailable",
258
+ level: "warn",
259
+ message: "The configured model was not found by the provider.",
260
+ ...(detail ? { detail } : {}),
261
+ hint: "Run `opencode models` and choose an available provider/model ID.",
262
+ });
263
+ }
264
+ else if (OPENCODE_AUTH_REQUIRED_RE.test(authEvidence)) {
265
+ checks.push({
266
+ code: "opencode_hello_probe_auth_required",
267
+ level: "warn",
268
+ message: "OpenCode is installed, but provider authentication is not ready.",
269
+ ...(detail ? { detail } : {}),
270
+ hint: "Run `opencode auth login` or set provider credentials, then retry the probe.",
271
+ });
272
+ }
273
+ else {
274
+ checks.push({
275
+ code: "opencode_hello_probe_failed",
276
+ level: "error",
277
+ message: "OpenCode hello probe failed.",
278
+ ...(detail ? { detail } : {}),
279
+ hint: "Run `opencode run --format json` manually in this working directory to debug.",
280
+ });
281
+ }
282
+ }
283
+ catch (err) {
284
+ checks.push({
285
+ code: "opencode_hello_probe_failed",
286
+ level: "error",
287
+ message: "OpenCode hello probe failed.",
288
+ detail: err instanceof Error ? err.message : String(err),
289
+ hint: "Run `opencode run --format json` manually in this working directory to debug.",
290
+ });
291
+ }
292
+ }
293
+ return {
294
+ adapterType: ctx.adapterType,
295
+ status: summarizeStatus(checks),
296
+ checks,
297
+ testedAt: new Date().toISOString(),
298
+ };
299
+ }
300
+ //# sourceMappingURL=test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/server/test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CreateConfigValues } from "@paperclipai/adapter-utils";
2
+ export declare function buildOpenCodeLocalConfig(v: CreateConfigValues): Record<string, unknown>;
3
+ //# sourceMappingURL=build-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-config.d.ts","sourceRoot":"","sources":["../../src/ui/build-config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAoDrE,wBAAgB,wBAAwB,CAAC,CAAC,EAAE,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAsBvF"}
@@ -0,0 +1,85 @@
1
+ function parseCommaArgs(value) {
2
+ return value
3
+ .split(",")
4
+ .map((item) => item.trim())
5
+ .filter(Boolean);
6
+ }
7
+ function parseEnvVars(text) {
8
+ const env = {};
9
+ for (const line of text.split(/\r?\n/)) {
10
+ const trimmed = line.trim();
11
+ if (!trimmed || trimmed.startsWith("#"))
12
+ continue;
13
+ const eq = trimmed.indexOf("=");
14
+ if (eq <= 0)
15
+ continue;
16
+ const key = trimmed.slice(0, eq).trim();
17
+ const value = trimmed.slice(eq + 1);
18
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key))
19
+ continue;
20
+ env[key] = value;
21
+ }
22
+ return env;
23
+ }
24
+ function parseEnvBindings(bindings) {
25
+ if (typeof bindings !== "object" || bindings === null || Array.isArray(bindings))
26
+ return {};
27
+ const env = {};
28
+ for (const [key, raw] of Object.entries(bindings)) {
29
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key))
30
+ continue;
31
+ if (typeof raw === "string") {
32
+ env[key] = { type: "plain", value: raw };
33
+ continue;
34
+ }
35
+ if (typeof raw !== "object" || raw === null || Array.isArray(raw))
36
+ continue;
37
+ const rec = raw;
38
+ if (rec.type === "plain" && typeof rec.value === "string") {
39
+ env[key] = { type: "plain", value: rec.value };
40
+ continue;
41
+ }
42
+ if (rec.type === "secret_ref" && typeof rec.secretId === "string") {
43
+ env[key] = {
44
+ type: "secret_ref",
45
+ secretId: rec.secretId,
46
+ ...(typeof rec.version === "number" || rec.version === "latest"
47
+ ? { version: rec.version }
48
+ : {}),
49
+ };
50
+ }
51
+ }
52
+ return env;
53
+ }
54
+ export function buildOpenCodeLocalConfig(v) {
55
+ const ac = {};
56
+ if (v.cwd)
57
+ ac.cwd = v.cwd;
58
+ if (v.instructionsFilePath)
59
+ ac.instructionsFilePath = v.instructionsFilePath;
60
+ if (v.promptTemplate)
61
+ ac.promptTemplate = v.promptTemplate;
62
+ if (v.model)
63
+ ac.model = v.model;
64
+ if (v.thinkingEffort)
65
+ ac.variant = v.thinkingEffort;
66
+ // OpenCode sessions can run until the CLI exits naturally; keep timeout disabled (0)
67
+ // and rely on graceSec for termination handling when a timeout is configured elsewhere.
68
+ ac.timeoutSec = 0;
69
+ ac.graceSec = 20;
70
+ const env = parseEnvBindings(v.envBindings);
71
+ const legacy = parseEnvVars(v.envVars);
72
+ for (const [key, value] of Object.entries(legacy)) {
73
+ if (!Object.prototype.hasOwnProperty.call(env, key)) {
74
+ env[key] = { type: "plain", value };
75
+ }
76
+ }
77
+ if (Object.keys(env).length > 0)
78
+ ac.env = env;
79
+ if (v.command)
80
+ ac.command = v.command;
81
+ if (v.extraArgs)
82
+ ac.extraArgs = parseCommaArgs(v.extraArgs);
83
+ return ac;
84
+ }
85
+ //# sourceMappingURL=build-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-config.js","sourceRoot":"","sources":["../../src/ui/build-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { parseOpenCodeStdoutLine } from "./parse-stdout.js";
2
+ export { buildOpenCodeLocalConfig } from "./build-config.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { parseOpenCodeStdoutLine } from "./parse-stdout.js";
2
+ export { buildOpenCodeLocalConfig } from "./build-config.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/ui/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { TranscriptEntry } from "@paperclipai/adapter-utils";
2
+ export declare function parseOpenCodeStdoutLine(line: string, ts: string): TranscriptEntry[];
3
+ //# sourceMappingURL=parse-stdout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-stdout.d.ts","sourceRoot":"","sources":["../../src/ui/parse-stdout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAqFlE,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,eAAe,EAAE,CAiEnF"}
@@ -0,0 +1,140 @@
1
+ function safeJsonParse(text) {
2
+ try {
3
+ return JSON.parse(text);
4
+ }
5
+ catch {
6
+ return null;
7
+ }
8
+ }
9
+ function asRecord(value) {
10
+ if (typeof value !== "object" || value === null || Array.isArray(value))
11
+ return null;
12
+ return value;
13
+ }
14
+ function asString(value, fallback = "") {
15
+ return typeof value === "string" ? value : fallback;
16
+ }
17
+ function asNumber(value, fallback = 0) {
18
+ return typeof value === "number" && Number.isFinite(value) ? value : fallback;
19
+ }
20
+ function errorText(value) {
21
+ if (typeof value === "string")
22
+ return value;
23
+ const rec = asRecord(value);
24
+ if (!rec)
25
+ return "";
26
+ const data = asRecord(rec.data);
27
+ const msg = asString(rec.message) ||
28
+ asString(data?.message) ||
29
+ asString(rec.name) ||
30
+ "";
31
+ if (msg)
32
+ return msg;
33
+ try {
34
+ return JSON.stringify(rec);
35
+ }
36
+ catch {
37
+ return "";
38
+ }
39
+ }
40
+ function parseToolUse(parsed, ts) {
41
+ const part = asRecord(parsed.part);
42
+ if (!part)
43
+ return [{ kind: "system", ts, text: "tool event" }];
44
+ const toolName = asString(part.tool, "tool");
45
+ const state = asRecord(part.state);
46
+ const input = state?.input ?? {};
47
+ const callEntry = {
48
+ kind: "tool_call",
49
+ ts,
50
+ name: toolName,
51
+ input,
52
+ };
53
+ const status = asString(state?.status);
54
+ if (status !== "completed" && status !== "error")
55
+ return [callEntry];
56
+ const rawOutput = asString(state?.output) ||
57
+ asString(state?.error) ||
58
+ asString(part.title) ||
59
+ `${toolName} ${status}`;
60
+ const metadata = asRecord(state?.metadata);
61
+ const headerParts = [`status: ${status}`];
62
+ if (metadata) {
63
+ for (const [key, value] of Object.entries(metadata)) {
64
+ if (value !== undefined && value !== null)
65
+ headerParts.push(`${key}: ${value}`);
66
+ }
67
+ }
68
+ const content = `${headerParts.join("\n")}\n\n${rawOutput}`.trim();
69
+ return [
70
+ callEntry,
71
+ {
72
+ kind: "tool_result",
73
+ ts,
74
+ toolUseId: asString(part.callID) || asString(part.id, toolName),
75
+ content,
76
+ isError: status === "error",
77
+ },
78
+ ];
79
+ }
80
+ export function parseOpenCodeStdoutLine(line, ts) {
81
+ const parsed = asRecord(safeJsonParse(line));
82
+ if (!parsed) {
83
+ return [{ kind: "stdout", ts, text: line }];
84
+ }
85
+ const type = asString(parsed.type);
86
+ if (type === "text") {
87
+ const part = asRecord(parsed.part);
88
+ const text = asString(part?.text).trim();
89
+ if (!text)
90
+ return [];
91
+ return [{ kind: "assistant", ts, text }];
92
+ }
93
+ if (type === "reasoning") {
94
+ const part = asRecord(parsed.part);
95
+ const text = asString(part?.text).trim();
96
+ if (!text)
97
+ return [];
98
+ return [{ kind: "thinking", ts, text }];
99
+ }
100
+ if (type === "tool_use") {
101
+ return parseToolUse(parsed, ts);
102
+ }
103
+ if (type === "step_start") {
104
+ const sessionId = asString(parsed.sessionID);
105
+ return [
106
+ {
107
+ kind: "system",
108
+ ts,
109
+ text: `step started${sessionId ? ` (${sessionId})` : ""}`,
110
+ },
111
+ ];
112
+ }
113
+ if (type === "step_finish") {
114
+ const part = asRecord(parsed.part);
115
+ const tokens = asRecord(part?.tokens);
116
+ const cache = asRecord(tokens?.cache);
117
+ const reason = asString(part?.reason, "step");
118
+ const output = asNumber(tokens?.output, 0) + asNumber(tokens?.reasoning, 0);
119
+ return [
120
+ {
121
+ kind: "result",
122
+ ts,
123
+ text: reason,
124
+ inputTokens: asNumber(tokens?.input, 0),
125
+ outputTokens: output,
126
+ cachedTokens: asNumber(cache?.read, 0),
127
+ costUsd: asNumber(part?.cost, 0),
128
+ subtype: reason,
129
+ isError: false,
130
+ errors: [],
131
+ },
132
+ ];
133
+ }
134
+ if (type === "error") {
135
+ const text = errorText(parsed.error ?? parsed.message);
136
+ return [{ kind: "stderr", ts, text: text || line }];
137
+ }
138
+ return [{ kind: "stdout", ts, text: line }];
139
+ }
140
+ //# sourceMappingURL=parse-stdout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-stdout.js","sourceRoot":"","sources":["../../src/ui/parse-stdout.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "@paperclipai/adapter-opencode-local",
3
+ "version": "0.3.0-canary.0",
4
+ "type": "module",
5
+ "exports": {
6
+ ".": {
7
+ "types": "./dist/index.d.ts",
8
+ "import": "./dist/index.js"
9
+ },
10
+ "./server": {
11
+ "types": "./dist/server/index.d.ts",
12
+ "import": "./dist/server/index.js"
13
+ },
14
+ "./ui": {
15
+ "types": "./dist/ui/index.d.ts",
16
+ "import": "./dist/ui/index.js"
17
+ },
18
+ "./cli": {
19
+ "types": "./dist/cli/index.d.ts",
20
+ "import": "./dist/cli/index.js"
21
+ }
22
+ },
23
+ "publishConfig": {
24
+ "access": "public"
25
+ },
26
+ "files": [
27
+ "dist",
28
+ "skills"
29
+ ],
30
+ "dependencies": {
31
+ "picocolors": "^1.1.1",
32
+ "@paperclipai/adapter-utils": "0.3.0-canary.0"
33
+ },
34
+ "devDependencies": {
35
+ "@types/node": "^24.6.0",
36
+ "typescript": "^5.7.3"
37
+ },
38
+ "scripts": {
39
+ "build": "tsc",
40
+ "clean": "rm -rf dist",
41
+ "typecheck": "tsc --noEmit"
42
+ },
43
+ "main": "./dist/index.js",
44
+ "types": "./dist/index.d.ts"
45
+ }