@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.
- package/LICENSE +21 -0
- package/dist/cli/format-event.d.ts +2 -0
- package/dist/cli/format-event.d.ts.map +1 -0
- package/dist/cli/format-event.js +115 -0
- package/dist/cli/format-event.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/server/execute.d.ts +3 -0
- package/dist/server/execute.d.ts.map +1 -0
- package/dist/server/execute.js +309 -0
- package/dist/server/execute.js.map +1 -0
- package/dist/server/index.d.ts +7 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +62 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/models.d.ts +20 -0
- package/dist/server/models.d.ts.map +1 -0
- package/dist/server/models.js +150 -0
- package/dist/server/models.js.map +1 -0
- package/dist/server/models.test.d.ts +2 -0
- package/dist/server/models.test.d.ts.map +1 -0
- package/dist/server/models.test.js +22 -0
- package/dist/server/models.test.js.map +1 -0
- package/dist/server/parse.d.ts +13 -0
- package/dist/server/parse.d.ts.map +1 -0
- package/dist/server/parse.js +97 -0
- package/dist/server/parse.js.map +1 -0
- package/dist/server/parse.test.d.ts +2 -0
- package/dist/server/parse.test.d.ts.map +1 -0
- package/dist/server/parse.test.js +48 -0
- package/dist/server/parse.test.js.map +1 -0
- package/dist/server/test.d.ts +3 -0
- package/dist/server/test.d.ts.map +1 -0
- package/dist/server/test.js +300 -0
- package/dist/server/test.js.map +1 -0
- package/dist/ui/build-config.d.ts +3 -0
- package/dist/ui/build-config.d.ts.map +1 -0
- package/dist/ui/build-config.js +85 -0
- package/dist/ui/build-config.js.map +1 -0
- package/dist/ui/index.d.ts +3 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +3 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/parse-stdout.d.ts +3 -0
- package/dist/ui/parse-stdout.d.ts.map +1 -0
- package/dist/ui/parse-stdout.js +140 -0
- package/dist/ui/parse-stdout.js.map +1 -0
- package/package.json +45 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Paperclip AI
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-event.d.ts","sourceRoot":"","sources":["../../src/cli/format-event.ts"],"names":[],"mappings":"AAyCA,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CA+E3E"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import pc from "picocolors";
|
|
2
|
+
function safeJsonParse(text) {
|
|
3
|
+
try {
|
|
4
|
+
return JSON.parse(text);
|
|
5
|
+
}
|
|
6
|
+
catch {
|
|
7
|
+
return null;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
function asRecord(value) {
|
|
11
|
+
if (typeof value !== "object" || value === null || Array.isArray(value))
|
|
12
|
+
return null;
|
|
13
|
+
return value;
|
|
14
|
+
}
|
|
15
|
+
function asString(value, fallback = "") {
|
|
16
|
+
return typeof value === "string" ? value : fallback;
|
|
17
|
+
}
|
|
18
|
+
function asNumber(value, fallback = 0) {
|
|
19
|
+
return typeof value === "number" && Number.isFinite(value) ? value : fallback;
|
|
20
|
+
}
|
|
21
|
+
function errorText(value) {
|
|
22
|
+
if (typeof value === "string")
|
|
23
|
+
return value;
|
|
24
|
+
const rec = asRecord(value);
|
|
25
|
+
if (!rec)
|
|
26
|
+
return "";
|
|
27
|
+
const data = asRecord(rec.data);
|
|
28
|
+
const message = asString(rec.message) ||
|
|
29
|
+
asString(data?.message) ||
|
|
30
|
+
asString(rec.name) ||
|
|
31
|
+
"";
|
|
32
|
+
if (message)
|
|
33
|
+
return message;
|
|
34
|
+
try {
|
|
35
|
+
return JSON.stringify(rec);
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return "";
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
export function printOpenCodeStreamEvent(raw, _debug) {
|
|
42
|
+
const line = raw.trim();
|
|
43
|
+
if (!line)
|
|
44
|
+
return;
|
|
45
|
+
const parsed = asRecord(safeJsonParse(line));
|
|
46
|
+
if (!parsed) {
|
|
47
|
+
console.log(line);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const type = asString(parsed.type);
|
|
51
|
+
if (type === "step_start") {
|
|
52
|
+
const sessionId = asString(parsed.sessionID);
|
|
53
|
+
console.log(pc.blue(`step started${sessionId ? ` (session: ${sessionId})` : ""}`));
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
if (type === "text") {
|
|
57
|
+
const part = asRecord(parsed.part);
|
|
58
|
+
const text = asString(part?.text).trim();
|
|
59
|
+
if (text)
|
|
60
|
+
console.log(pc.green(`assistant: ${text}`));
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
if (type === "reasoning") {
|
|
64
|
+
const part = asRecord(parsed.part);
|
|
65
|
+
const text = asString(part?.text).trim();
|
|
66
|
+
if (text)
|
|
67
|
+
console.log(pc.gray(`thinking: ${text}`));
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
if (type === "tool_use") {
|
|
71
|
+
const part = asRecord(parsed.part);
|
|
72
|
+
const tool = asString(part?.tool, "tool");
|
|
73
|
+
const callID = asString(part?.callID);
|
|
74
|
+
const state = asRecord(part?.state);
|
|
75
|
+
const status = asString(state?.status);
|
|
76
|
+
const isError = status === "error";
|
|
77
|
+
const metadata = asRecord(state?.metadata);
|
|
78
|
+
console.log(pc.yellow(`tool_call: ${tool}${callID ? ` (${callID})` : ""}`));
|
|
79
|
+
if (status) {
|
|
80
|
+
const metaParts = [`status=${status}`];
|
|
81
|
+
if (metadata) {
|
|
82
|
+
for (const [key, value] of Object.entries(metadata)) {
|
|
83
|
+
if (value !== undefined && value !== null)
|
|
84
|
+
metaParts.push(`${key}=${value}`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
console.log((isError ? pc.red : pc.gray)(`tool_result ${metaParts.join(" ")}`));
|
|
88
|
+
}
|
|
89
|
+
const output = (asString(state?.output) || asString(state?.error)).trim();
|
|
90
|
+
if (output)
|
|
91
|
+
console.log((isError ? pc.red : pc.gray)(output));
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
if (type === "step_finish") {
|
|
95
|
+
const part = asRecord(parsed.part);
|
|
96
|
+
const tokens = asRecord(part?.tokens);
|
|
97
|
+
const cache = asRecord(tokens?.cache);
|
|
98
|
+
const input = asNumber(tokens?.input, 0);
|
|
99
|
+
const output = asNumber(tokens?.output, 0) + asNumber(tokens?.reasoning, 0);
|
|
100
|
+
const cached = asNumber(cache?.read, 0);
|
|
101
|
+
const cost = asNumber(part?.cost, 0);
|
|
102
|
+
const reason = asString(part?.reason, "step");
|
|
103
|
+
console.log(pc.blue(`step finished: reason=${reason}`));
|
|
104
|
+
console.log(pc.blue(`tokens: in=${input} out=${output} cached=${cached} cost=$${cost.toFixed(6)}`));
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
if (type === "error") {
|
|
108
|
+
const message = errorText(parsed.error ?? parsed.message);
|
|
109
|
+
if (message)
|
|
110
|
+
console.log(pc.red(`error: ${message}`));
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
console.log(line);
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=format-event.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-event.js","sourceRoot":"","sources":["../../src/cli/format-event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,SAAS,aAAa,CAAC,IAAY;IACjC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrF,OAAO,KAAgC,CAAC;AAC1C,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc,EAAE,QAAQ,GAAG,EAAE;IAC7C,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;AACtD,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc,EAAE,QAAQ,GAAG,CAAC;IAC5C,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;AAChF,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,OAAO,GACX,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC;QACrB,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;QACvB,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;QAClB,EAAE,CAAC;IACL,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAC5B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,GAAW,EAAE,MAAe;IACnE,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IACxB,IAAI,CAAC,IAAI;QAAE,OAAO;IAElB,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7C,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClB,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAEnC,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,eAAe,SAAS,CAAC,CAAC,CAAC,cAAc,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACnF,OAAO;IACT,CAAC;IAED,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACpB,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QACzC,IAAI,IAAI;YAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,cAAc,IAAI,EAAE,CAAC,CAAC,CAAC;QACtD,OAAO;IACT,CAAC;IAED,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QACzC,IAAI,IAAI;YAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,CAAC;QACpD,OAAO;IACT,CAAC;IAED,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,MAAM,KAAK,OAAO,CAAC;QACnC,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAE3C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,cAAc,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAE5E,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,SAAS,GAAG,CAAC,UAAU,MAAM,EAAE,CAAC,CAAC;YACvC,IAAI,QAAQ,EAAE,CAAC;gBACb,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACpD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI;wBAAE,SAAS,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC;gBAC/E,CAAC;YACH,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,eAAe,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAClF,CAAC;QAED,MAAM,MAAM,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC1E,IAAI,MAAM;YAAE,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9D,OAAO;IACT,CAAC;IAED,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;QAC5E,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QACrC,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,yBAAyB,MAAM,EAAE,CAAC,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,KAAK,QAAQ,MAAM,WAAW,MAAM,UAAU,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACpG,OAAO;IACT,CAAC;IAED,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC;QAC1D,IAAI,OAAO;YAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,UAAU,OAAO,EAAE,CAAC,CAAC,CAAC;QACtD,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare const type = "opencode_local";
|
|
2
|
+
export declare const label = "OpenCode (local)";
|
|
3
|
+
export declare const models: Array<{
|
|
4
|
+
id: string;
|
|
5
|
+
label: string;
|
|
6
|
+
}>;
|
|
7
|
+
export declare const agentConfigurationDoc = "# opencode_local agent configuration\n\nAdapter: opencode_local\n\nUse when:\n- You want Paperclip to run OpenCode locally as the agent runtime\n- You want provider/model routing in OpenCode format (provider/model)\n- You want OpenCode session resume across heartbeats via --session\n\nDon't use when:\n- You need webhook-style external invocation (use openclaw_gateway or http)\n- You only need one-shot shell commands (use process)\n- OpenCode CLI is not installed on the machine\n\nCore fields:\n- cwd (string, optional): default absolute working directory fallback for the agent process (created if missing when possible)\n- instructionsFilePath (string, optional): absolute path to a markdown instructions file prepended to the run prompt\n- model (string, required): OpenCode model id in provider/model format (for example anthropic/claude-sonnet-4-5)\n- variant (string, optional): provider-specific model variant (for example minimal|low|medium|high|max)\n- promptTemplate (string, optional): run prompt template\n- command (string, optional): defaults to \"opencode\"\n- extraArgs (string[], optional): additional CLI args\n- env (object, optional): KEY=VALUE environment variables\n\nOperational fields:\n- timeoutSec (number, optional): run timeout in seconds\n- graceSec (number, optional): SIGTERM grace period in seconds\n\nNotes:\n- OpenCode supports multiple providers and models. Use `opencode models` to list available options in provider/model format.\n- Paperclip requires an explicit `model` value for `opencode_local` agents.\n- Runs are executed with: opencode run --format json ...\n- Sessions are resumed with --session when stored session cwd matches current cwd.\n";
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,IAAI,mBAAmB,CAAC;AACrC,eAAO,MAAM,KAAK,qBAAqB,CAAC;AAExC,eAAO,MAAM,MAAM,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAM,CAAC;AAE/D,eAAO,MAAM,qBAAqB,kqDAkCjC,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export const type = "opencode_local";
|
|
2
|
+
export const label = "OpenCode (local)";
|
|
3
|
+
export const models = [];
|
|
4
|
+
export const agentConfigurationDoc = `# opencode_local agent configuration
|
|
5
|
+
|
|
6
|
+
Adapter: opencode_local
|
|
7
|
+
|
|
8
|
+
Use when:
|
|
9
|
+
- You want Paperclip to run OpenCode locally as the agent runtime
|
|
10
|
+
- You want provider/model routing in OpenCode format (provider/model)
|
|
11
|
+
- You want OpenCode session resume across heartbeats via --session
|
|
12
|
+
|
|
13
|
+
Don't use when:
|
|
14
|
+
- You need webhook-style external invocation (use openclaw_gateway or http)
|
|
15
|
+
- You only need one-shot shell commands (use process)
|
|
16
|
+
- OpenCode CLI is not installed on the machine
|
|
17
|
+
|
|
18
|
+
Core fields:
|
|
19
|
+
- cwd (string, optional): default absolute working directory fallback for the agent process (created if missing when possible)
|
|
20
|
+
- instructionsFilePath (string, optional): absolute path to a markdown instructions file prepended to the run prompt
|
|
21
|
+
- model (string, required): OpenCode model id in provider/model format (for example anthropic/claude-sonnet-4-5)
|
|
22
|
+
- variant (string, optional): provider-specific model variant (for example minimal|low|medium|high|max)
|
|
23
|
+
- promptTemplate (string, optional): run prompt template
|
|
24
|
+
- command (string, optional): defaults to "opencode"
|
|
25
|
+
- extraArgs (string[], optional): additional CLI args
|
|
26
|
+
- env (object, optional): KEY=VALUE environment variables
|
|
27
|
+
|
|
28
|
+
Operational fields:
|
|
29
|
+
- timeoutSec (number, optional): run timeout in seconds
|
|
30
|
+
- graceSec (number, optional): SIGTERM grace period in seconds
|
|
31
|
+
|
|
32
|
+
Notes:
|
|
33
|
+
- OpenCode supports multiple providers and models. Use \
|
|
34
|
+
\`opencode models\` to list available options in provider/model format.
|
|
35
|
+
- Paperclip requires an explicit \`model\` value for \`opencode_local\` agents.
|
|
36
|
+
- Runs are executed with: opencode run --format json ...
|
|
37
|
+
- Sessions are resumed with --session when stored session cwd matches current cwd.
|
|
38
|
+
`;
|
|
39
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,IAAI,GAAG,gBAAgB,CAAC;AACrC,MAAM,CAAC,MAAM,KAAK,GAAG,kBAAkB,CAAC;AAExC,MAAM,CAAC,MAAM,MAAM,GAAyC,EAAE,CAAC;AAE/D,MAAM,CAAC,MAAM,qBAAqB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkCpC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../src/server/execute.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AAgFlG,wBAAsB,OAAO,CAAC,GAAG,EAAE,uBAAuB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CA6R3F"}
|
|
@@ -0,0 +1,309 @@
|
|
|
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 { asString, asNumber, asStringArray, parseObject, buildPaperclipEnv, redactEnvForLogs, ensureAbsoluteDirectory, ensureCommandResolvable, ensurePathInEnv, renderTemplate, runChildProcess, } from "@paperclipai/adapter-utils/server-utils";
|
|
6
|
+
import { isOpenCodeUnknownSessionError, parseOpenCodeJsonl } from "./parse.js";
|
|
7
|
+
import { ensureOpenCodeModelConfiguredAndAvailable } from "./models.js";
|
|
8
|
+
const __moduleDir = path.dirname(fileURLToPath(import.meta.url));
|
|
9
|
+
const PAPERCLIP_SKILLS_CANDIDATES = [
|
|
10
|
+
path.resolve(__moduleDir, "../../skills"),
|
|
11
|
+
path.resolve(__moduleDir, "../../../../../skills"),
|
|
12
|
+
];
|
|
13
|
+
function firstNonEmptyLine(text) {
|
|
14
|
+
return (text
|
|
15
|
+
.split(/\r?\n/)
|
|
16
|
+
.map((line) => line.trim())
|
|
17
|
+
.find(Boolean) ?? "");
|
|
18
|
+
}
|
|
19
|
+
function parseModelProvider(model) {
|
|
20
|
+
if (!model)
|
|
21
|
+
return null;
|
|
22
|
+
const trimmed = model.trim();
|
|
23
|
+
if (!trimmed.includes("/"))
|
|
24
|
+
return null;
|
|
25
|
+
return trimmed.slice(0, trimmed.indexOf("/")).trim() || null;
|
|
26
|
+
}
|
|
27
|
+
function claudeSkillsHome() {
|
|
28
|
+
return path.join(os.homedir(), ".claude", "skills");
|
|
29
|
+
}
|
|
30
|
+
async function resolvePaperclipSkillsDir() {
|
|
31
|
+
for (const candidate of PAPERCLIP_SKILLS_CANDIDATES) {
|
|
32
|
+
const isDir = await fs.stat(candidate).then((s) => s.isDirectory()).catch(() => false);
|
|
33
|
+
if (isDir)
|
|
34
|
+
return candidate;
|
|
35
|
+
}
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
async function ensureOpenCodeSkillsInjected(onLog) {
|
|
39
|
+
const skillsDir = await resolvePaperclipSkillsDir();
|
|
40
|
+
if (!skillsDir)
|
|
41
|
+
return;
|
|
42
|
+
const skillsHome = claudeSkillsHome();
|
|
43
|
+
await fs.mkdir(skillsHome, { recursive: true });
|
|
44
|
+
const entries = await fs.readdir(skillsDir, { withFileTypes: true });
|
|
45
|
+
for (const entry of entries) {
|
|
46
|
+
if (!entry.isDirectory())
|
|
47
|
+
continue;
|
|
48
|
+
const source = path.join(skillsDir, entry.name);
|
|
49
|
+
const target = path.join(skillsHome, entry.name);
|
|
50
|
+
const existing = await fs.lstat(target).catch(() => null);
|
|
51
|
+
if (existing)
|
|
52
|
+
continue;
|
|
53
|
+
try {
|
|
54
|
+
await fs.symlink(source, target);
|
|
55
|
+
await onLog("stderr", `[paperclip] Injected OpenCode skill "${entry.name}" into ${skillsHome}\n`);
|
|
56
|
+
}
|
|
57
|
+
catch (err) {
|
|
58
|
+
await onLog("stderr", `[paperclip] Failed to inject OpenCode skill "${entry.name}" into ${skillsHome}: ${err instanceof Error ? err.message : String(err)}\n`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
export async function execute(ctx) {
|
|
63
|
+
const { runId, agent, runtime, config, context, onLog, onMeta, authToken } = ctx;
|
|
64
|
+
const promptTemplate = asString(config.promptTemplate, "You are agent {{agent.id}} ({{agent.name}}). Continue your Paperclip work.");
|
|
65
|
+
const command = asString(config.command, "opencode");
|
|
66
|
+
const model = asString(config.model, "").trim();
|
|
67
|
+
const variant = asString(config.variant, "").trim();
|
|
68
|
+
const workspaceContext = parseObject(context.paperclipWorkspace);
|
|
69
|
+
const workspaceCwd = asString(workspaceContext.cwd, "");
|
|
70
|
+
const workspaceSource = asString(workspaceContext.source, "");
|
|
71
|
+
const workspaceId = asString(workspaceContext.workspaceId, "");
|
|
72
|
+
const workspaceRepoUrl = asString(workspaceContext.repoUrl, "");
|
|
73
|
+
const workspaceRepoRef = asString(workspaceContext.repoRef, "");
|
|
74
|
+
const workspaceHints = Array.isArray(context.paperclipWorkspaces)
|
|
75
|
+
? context.paperclipWorkspaces.filter((value) => typeof value === "object" && value !== null)
|
|
76
|
+
: [];
|
|
77
|
+
const configuredCwd = asString(config.cwd, "");
|
|
78
|
+
const useConfiguredInsteadOfAgentHome = workspaceSource === "agent_home" && configuredCwd.length > 0;
|
|
79
|
+
const effectiveWorkspaceCwd = useConfiguredInsteadOfAgentHome ? "" : workspaceCwd;
|
|
80
|
+
const cwd = effectiveWorkspaceCwd || configuredCwd || process.cwd();
|
|
81
|
+
await ensureAbsoluteDirectory(cwd, { createIfMissing: true });
|
|
82
|
+
await ensureOpenCodeSkillsInjected(onLog);
|
|
83
|
+
const envConfig = parseObject(config.env);
|
|
84
|
+
const hasExplicitApiKey = typeof envConfig.PAPERCLIP_API_KEY === "string" && envConfig.PAPERCLIP_API_KEY.trim().length > 0;
|
|
85
|
+
const env = { ...buildPaperclipEnv(agent) };
|
|
86
|
+
env.PAPERCLIP_RUN_ID = runId;
|
|
87
|
+
const wakeTaskId = (typeof context.taskId === "string" && context.taskId.trim().length > 0 && context.taskId.trim()) ||
|
|
88
|
+
(typeof context.issueId === "string" && context.issueId.trim().length > 0 && context.issueId.trim()) ||
|
|
89
|
+
null;
|
|
90
|
+
const wakeReason = typeof context.wakeReason === "string" && context.wakeReason.trim().length > 0
|
|
91
|
+
? context.wakeReason.trim()
|
|
92
|
+
: null;
|
|
93
|
+
const wakeCommentId = (typeof context.wakeCommentId === "string" && context.wakeCommentId.trim().length > 0 && context.wakeCommentId.trim()) ||
|
|
94
|
+
(typeof context.commentId === "string" && context.commentId.trim().length > 0 && context.commentId.trim()) ||
|
|
95
|
+
null;
|
|
96
|
+
const approvalId = typeof context.approvalId === "string" && context.approvalId.trim().length > 0
|
|
97
|
+
? context.approvalId.trim()
|
|
98
|
+
: null;
|
|
99
|
+
const approvalStatus = typeof context.approvalStatus === "string" && context.approvalStatus.trim().length > 0
|
|
100
|
+
? context.approvalStatus.trim()
|
|
101
|
+
: null;
|
|
102
|
+
const linkedIssueIds = Array.isArray(context.issueIds)
|
|
103
|
+
? context.issueIds.filter((value) => typeof value === "string" && value.trim().length > 0)
|
|
104
|
+
: [];
|
|
105
|
+
if (wakeTaskId)
|
|
106
|
+
env.PAPERCLIP_TASK_ID = wakeTaskId;
|
|
107
|
+
if (wakeReason)
|
|
108
|
+
env.PAPERCLIP_WAKE_REASON = wakeReason;
|
|
109
|
+
if (wakeCommentId)
|
|
110
|
+
env.PAPERCLIP_WAKE_COMMENT_ID = wakeCommentId;
|
|
111
|
+
if (approvalId)
|
|
112
|
+
env.PAPERCLIP_APPROVAL_ID = approvalId;
|
|
113
|
+
if (approvalStatus)
|
|
114
|
+
env.PAPERCLIP_APPROVAL_STATUS = approvalStatus;
|
|
115
|
+
if (linkedIssueIds.length > 0)
|
|
116
|
+
env.PAPERCLIP_LINKED_ISSUE_IDS = linkedIssueIds.join(",");
|
|
117
|
+
if (effectiveWorkspaceCwd)
|
|
118
|
+
env.PAPERCLIP_WORKSPACE_CWD = effectiveWorkspaceCwd;
|
|
119
|
+
if (workspaceSource)
|
|
120
|
+
env.PAPERCLIP_WORKSPACE_SOURCE = workspaceSource;
|
|
121
|
+
if (workspaceId)
|
|
122
|
+
env.PAPERCLIP_WORKSPACE_ID = workspaceId;
|
|
123
|
+
if (workspaceRepoUrl)
|
|
124
|
+
env.PAPERCLIP_WORKSPACE_REPO_URL = workspaceRepoUrl;
|
|
125
|
+
if (workspaceRepoRef)
|
|
126
|
+
env.PAPERCLIP_WORKSPACE_REPO_REF = workspaceRepoRef;
|
|
127
|
+
if (workspaceHints.length > 0)
|
|
128
|
+
env.PAPERCLIP_WORKSPACES_JSON = JSON.stringify(workspaceHints);
|
|
129
|
+
for (const [key, value] of Object.entries(envConfig)) {
|
|
130
|
+
if (typeof value === "string")
|
|
131
|
+
env[key] = value;
|
|
132
|
+
}
|
|
133
|
+
if (!hasExplicitApiKey && authToken) {
|
|
134
|
+
env.PAPERCLIP_API_KEY = authToken;
|
|
135
|
+
}
|
|
136
|
+
const runtimeEnv = Object.fromEntries(Object.entries(ensurePathInEnv({ ...process.env, ...env })).filter((entry) => typeof entry[1] === "string"));
|
|
137
|
+
await ensureCommandResolvable(command, cwd, runtimeEnv);
|
|
138
|
+
await ensureOpenCodeModelConfiguredAndAvailable({
|
|
139
|
+
model,
|
|
140
|
+
command,
|
|
141
|
+
cwd,
|
|
142
|
+
env: runtimeEnv,
|
|
143
|
+
});
|
|
144
|
+
const timeoutSec = asNumber(config.timeoutSec, 0);
|
|
145
|
+
const graceSec = asNumber(config.graceSec, 20);
|
|
146
|
+
const extraArgs = (() => {
|
|
147
|
+
const fromExtraArgs = asStringArray(config.extraArgs);
|
|
148
|
+
if (fromExtraArgs.length > 0)
|
|
149
|
+
return fromExtraArgs;
|
|
150
|
+
return asStringArray(config.args);
|
|
151
|
+
})();
|
|
152
|
+
const runtimeSessionParams = parseObject(runtime.sessionParams);
|
|
153
|
+
const runtimeSessionId = asString(runtimeSessionParams.sessionId, runtime.sessionId ?? "");
|
|
154
|
+
const runtimeSessionCwd = asString(runtimeSessionParams.cwd, "");
|
|
155
|
+
const canResumeSession = runtimeSessionId.length > 0 &&
|
|
156
|
+
(runtimeSessionCwd.length === 0 || path.resolve(runtimeSessionCwd) === path.resolve(cwd));
|
|
157
|
+
const sessionId = canResumeSession ? runtimeSessionId : null;
|
|
158
|
+
if (runtimeSessionId && !canResumeSession) {
|
|
159
|
+
await onLog("stderr", `[paperclip] OpenCode session "${runtimeSessionId}" was saved for cwd "${runtimeSessionCwd}" and will not be resumed in "${cwd}".\n`);
|
|
160
|
+
}
|
|
161
|
+
const instructionsFilePath = asString(config.instructionsFilePath, "").trim();
|
|
162
|
+
const resolvedInstructionsFilePath = instructionsFilePath
|
|
163
|
+
? path.resolve(cwd, instructionsFilePath)
|
|
164
|
+
: "";
|
|
165
|
+
const instructionsDir = resolvedInstructionsFilePath ? `${path.dirname(resolvedInstructionsFilePath)}/` : "";
|
|
166
|
+
let instructionsPrefix = "";
|
|
167
|
+
if (resolvedInstructionsFilePath) {
|
|
168
|
+
try {
|
|
169
|
+
const instructionsContents = await fs.readFile(resolvedInstructionsFilePath, "utf8");
|
|
170
|
+
instructionsPrefix =
|
|
171
|
+
`${instructionsContents}\n\n` +
|
|
172
|
+
`The above agent instructions were loaded from ${resolvedInstructionsFilePath}. ` +
|
|
173
|
+
`Resolve any relative file references from ${instructionsDir}.\n\n`;
|
|
174
|
+
await onLog("stderr", `[paperclip] Loaded agent instructions file: ${resolvedInstructionsFilePath}\n`);
|
|
175
|
+
}
|
|
176
|
+
catch (err) {
|
|
177
|
+
const reason = err instanceof Error ? err.message : String(err);
|
|
178
|
+
await onLog("stderr", `[paperclip] Warning: could not read agent instructions file "${resolvedInstructionsFilePath}": ${reason}\n`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
const commandNotes = (() => {
|
|
182
|
+
if (!resolvedInstructionsFilePath)
|
|
183
|
+
return [];
|
|
184
|
+
if (instructionsPrefix.length > 0) {
|
|
185
|
+
return [
|
|
186
|
+
`Loaded agent instructions from ${resolvedInstructionsFilePath}`,
|
|
187
|
+
`Prepended instructions + path directive to stdin prompt (relative references from ${instructionsDir}).`,
|
|
188
|
+
];
|
|
189
|
+
}
|
|
190
|
+
return [
|
|
191
|
+
`Configured instructionsFilePath ${resolvedInstructionsFilePath}, but file could not be read; continuing without injected instructions.`,
|
|
192
|
+
];
|
|
193
|
+
})();
|
|
194
|
+
const renderedPrompt = renderTemplate(promptTemplate, {
|
|
195
|
+
agentId: agent.id,
|
|
196
|
+
companyId: agent.companyId,
|
|
197
|
+
runId,
|
|
198
|
+
company: { id: agent.companyId },
|
|
199
|
+
agent,
|
|
200
|
+
run: { id: runId, source: "on_demand" },
|
|
201
|
+
context,
|
|
202
|
+
});
|
|
203
|
+
const prompt = `${instructionsPrefix}${renderedPrompt}`;
|
|
204
|
+
const buildArgs = (resumeSessionId) => {
|
|
205
|
+
const args = ["run", "--format", "json"];
|
|
206
|
+
if (resumeSessionId)
|
|
207
|
+
args.push("--session", resumeSessionId);
|
|
208
|
+
if (model)
|
|
209
|
+
args.push("--model", model);
|
|
210
|
+
if (variant)
|
|
211
|
+
args.push("--variant", variant);
|
|
212
|
+
if (extraArgs.length > 0)
|
|
213
|
+
args.push(...extraArgs);
|
|
214
|
+
return args;
|
|
215
|
+
};
|
|
216
|
+
const runAttempt = async (resumeSessionId) => {
|
|
217
|
+
const args = buildArgs(resumeSessionId);
|
|
218
|
+
if (onMeta) {
|
|
219
|
+
await onMeta({
|
|
220
|
+
adapterType: "opencode_local",
|
|
221
|
+
command,
|
|
222
|
+
cwd,
|
|
223
|
+
commandNotes,
|
|
224
|
+
commandArgs: [...args, `<stdin prompt ${prompt.length} chars>`],
|
|
225
|
+
env: redactEnvForLogs(env),
|
|
226
|
+
prompt,
|
|
227
|
+
context,
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
const proc = await runChildProcess(runId, command, args, {
|
|
231
|
+
cwd,
|
|
232
|
+
env: runtimeEnv,
|
|
233
|
+
stdin: prompt,
|
|
234
|
+
timeoutSec,
|
|
235
|
+
graceSec,
|
|
236
|
+
onLog,
|
|
237
|
+
});
|
|
238
|
+
return {
|
|
239
|
+
proc,
|
|
240
|
+
rawStderr: proc.stderr,
|
|
241
|
+
parsed: parseOpenCodeJsonl(proc.stdout),
|
|
242
|
+
};
|
|
243
|
+
};
|
|
244
|
+
const toResult = (attempt, clearSessionOnMissingSession = false) => {
|
|
245
|
+
if (attempt.proc.timedOut) {
|
|
246
|
+
return {
|
|
247
|
+
exitCode: attempt.proc.exitCode,
|
|
248
|
+
signal: attempt.proc.signal,
|
|
249
|
+
timedOut: true,
|
|
250
|
+
errorMessage: `Timed out after ${timeoutSec}s`,
|
|
251
|
+
clearSession: clearSessionOnMissingSession,
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
const resolvedSessionId = attempt.parsed.sessionId ??
|
|
255
|
+
(clearSessionOnMissingSession ? null : runtimeSessionId ?? runtime.sessionId ?? null);
|
|
256
|
+
const resolvedSessionParams = resolvedSessionId
|
|
257
|
+
? {
|
|
258
|
+
sessionId: resolvedSessionId,
|
|
259
|
+
cwd,
|
|
260
|
+
...(workspaceId ? { workspaceId } : {}),
|
|
261
|
+
...(workspaceRepoUrl ? { repoUrl: workspaceRepoUrl } : {}),
|
|
262
|
+
...(workspaceRepoRef ? { repoRef: workspaceRepoRef } : {}),
|
|
263
|
+
}
|
|
264
|
+
: null;
|
|
265
|
+
const parsedError = typeof attempt.parsed.errorMessage === "string" ? attempt.parsed.errorMessage.trim() : "";
|
|
266
|
+
const stderrLine = firstNonEmptyLine(attempt.proc.stderr);
|
|
267
|
+
const rawExitCode = attempt.proc.exitCode;
|
|
268
|
+
const synthesizedExitCode = parsedError && (rawExitCode ?? 0) === 0 ? 1 : rawExitCode;
|
|
269
|
+
const fallbackErrorMessage = parsedError ||
|
|
270
|
+
stderrLine ||
|
|
271
|
+
`OpenCode exited with code ${synthesizedExitCode ?? -1}`;
|
|
272
|
+
const modelId = model || null;
|
|
273
|
+
return {
|
|
274
|
+
exitCode: synthesizedExitCode,
|
|
275
|
+
signal: attempt.proc.signal,
|
|
276
|
+
timedOut: false,
|
|
277
|
+
errorMessage: (synthesizedExitCode ?? 0) === 0 ? null : fallbackErrorMessage,
|
|
278
|
+
usage: {
|
|
279
|
+
inputTokens: attempt.parsed.usage.inputTokens,
|
|
280
|
+
outputTokens: attempt.parsed.usage.outputTokens,
|
|
281
|
+
cachedInputTokens: attempt.parsed.usage.cachedInputTokens,
|
|
282
|
+
},
|
|
283
|
+
sessionId: resolvedSessionId,
|
|
284
|
+
sessionParams: resolvedSessionParams,
|
|
285
|
+
sessionDisplayId: resolvedSessionId,
|
|
286
|
+
provider: parseModelProvider(modelId),
|
|
287
|
+
model: modelId,
|
|
288
|
+
billingType: "unknown",
|
|
289
|
+
costUsd: attempt.parsed.costUsd,
|
|
290
|
+
resultJson: {
|
|
291
|
+
stdout: attempt.proc.stdout,
|
|
292
|
+
stderr: attempt.proc.stderr,
|
|
293
|
+
},
|
|
294
|
+
summary: attempt.parsed.summary,
|
|
295
|
+
clearSession: Boolean(clearSessionOnMissingSession && !attempt.parsed.sessionId),
|
|
296
|
+
};
|
|
297
|
+
};
|
|
298
|
+
const initial = await runAttempt(sessionId);
|
|
299
|
+
const initialFailed = !initial.proc.timedOut && ((initial.proc.exitCode ?? 0) !== 0 || Boolean(initial.parsed.errorMessage));
|
|
300
|
+
if (sessionId &&
|
|
301
|
+
initialFailed &&
|
|
302
|
+
isOpenCodeUnknownSessionError(initial.proc.stdout, initial.rawStderr)) {
|
|
303
|
+
await onLog("stderr", `[paperclip] OpenCode session "${sessionId}" is unavailable; retrying with a fresh session.\n`);
|
|
304
|
+
const retry = await runAttempt(null);
|
|
305
|
+
return toResult(retry, true);
|
|
306
|
+
}
|
|
307
|
+
return toResult(initial);
|
|
308
|
+
}
|
|
309
|
+
//# sourceMappingURL=execute.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"execute.js","sourceRoot":"","sources":["../../src/server/execute.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { AdapterSessionCodec } from "@paperclipai/adapter-utils";
|
|
2
|
+
export declare const sessionCodec: AdapterSessionCodec;
|
|
3
|
+
export { execute } from "./execute.js";
|
|
4
|
+
export { testEnvironment } from "./test.js";
|
|
5
|
+
export { listOpenCodeModels, discoverOpenCodeModels, ensureOpenCodeModelConfiguredAndAvailable, resetOpenCodeModelsCacheForTests, } from "./models.js";
|
|
6
|
+
export { parseOpenCodeJsonl, isOpenCodeUnknownSessionError } from "./parse.js";
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAMtE,eAAO,MAAM,YAAY,EAAE,mBAsD1B,CAAC;AAEF,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,yCAAyC,EACzC,gCAAgC,GACjC,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,6BAA6B,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
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 { testEnvironment } from "./test.js";
|
|
60
|
+
export { listOpenCodeModels, discoverOpenCodeModels, ensureOpenCodeModelConfiguredAndAvailable, resetOpenCodeModelsCacheForTests, } from "./models.js";
|
|
61
|
+
export { parseOpenCodeJsonl, isOpenCodeUnknownSessionError } from "./parse.js";
|
|
62
|
+
//# sourceMappingURL=index.js.map
|