pi-ca-leash 0.10.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/AGENTS.md +77 -0
- package/ARCHITECTURE.md +290 -0
- package/CHANGELOG.md +158 -0
- package/DEVELOPMENT.md +197 -0
- package/KNOWN_LIMITS.md +80 -0
- package/LICENSE +21 -0
- package/README.md +288 -0
- package/extensions/backend-tool-actions.test.ts +59 -0
- package/extensions/backend-tool-actions.ts +31 -0
- package/extensions/command-drivers.test.ts +37 -0
- package/extensions/command-drivers.ts +126 -0
- package/extensions/command-parity.test.ts +560 -0
- package/extensions/command-visibility.test.ts +21 -0
- package/extensions/command-visibility.ts +10 -0
- package/extensions/index.ts +3218 -0
- package/extensions/llm-tools.test.ts +537 -0
- package/extensions/model-catalog.test.ts +34 -0
- package/extensions/model-catalog.ts +173 -0
- package/extensions/peer-history.test.ts +141 -0
- package/extensions/peer-history.ts +90 -0
- package/extensions/peer-naming.test.ts +25 -0
- package/extensions/peer-naming.ts +129 -0
- package/extensions/peer-relay.test.ts +122 -0
- package/extensions/peer-relay.ts +83 -0
- package/extensions/peer-ux.test.ts +239 -0
- package/extensions/peer-ux.ts +327 -0
- package/extensions/persistence.test.ts +68 -0
- package/extensions/persistence.ts +67 -0
- package/extensions/prompts/extension-log-tool.md +5 -0
- package/extensions/prompts/peer-ask-tool.md +5 -0
- package/extensions/prompts/peer-bridge-system.md +4 -0
- package/extensions/prompts/peer-history-tool.md +3 -0
- package/extensions/prompts/peer-init-user-help.md +11 -0
- package/extensions/prompts/peer-init.md +17 -0
- package/extensions/prompts/peer-interrupt-tool.md +2 -0
- package/extensions/prompts/peer-list-tool.md +3 -0
- package/extensions/prompts/peer-no-babysitting.md +6 -0
- package/extensions/prompts/peer-send-tool.md +5 -0
- package/extensions/prompts/peer-start-tool.md +7 -0
- package/extensions/prompts/peer-stop-tool.md +3 -0
- package/extensions/prompts/runtime-models-tool.md +6 -0
- package/extensions/prompts/subagent-list-tool.md +3 -0
- package/extensions/prompts/subagent-run-tool.md +6 -0
- package/extensions/prompts/subagent-status-tool.md +2 -0
- package/extensions/prompts/team-list-tool.md +2 -0
- package/extensions/prompts/team-message-tool.md +2 -0
- package/extensions/prompts/team-spawn-tool.md +5 -0
- package/extensions/prompts/team-stop-tool.md +2 -0
- package/extensions/prompts/team-task-tool.md +3 -0
- package/extensions/prompts.ts +41 -0
- package/extensions/runtime-driver.test.ts +38 -0
- package/extensions/runtime-driver.ts +33 -0
- package/extensions/runtime-safety.test.ts +21 -0
- package/extensions/runtime-safety.ts +49 -0
- package/extensions/support.test.ts +144 -0
- package/extensions/support.ts +205 -0
- package/extensions/tool-inputs.test.ts +45 -0
- package/extensions/tool-inputs.ts +79 -0
- package/node_modules/@pi-claude-code-agent/intercom-bridge/dist/bridge.d.ts +48 -0
- package/node_modules/@pi-claude-code-agent/intercom-bridge/dist/bridge.js +406 -0
- package/node_modules/@pi-claude-code-agent/intercom-bridge/dist/bridge.js.map +1 -0
- package/node_modules/@pi-claude-code-agent/intercom-bridge/dist/cli.d.ts +2 -0
- package/node_modules/@pi-claude-code-agent/intercom-bridge/dist/cli.js +18 -0
- package/node_modules/@pi-claude-code-agent/intercom-bridge/dist/cli.js.map +1 -0
- package/node_modules/@pi-claude-code-agent/intercom-bridge/dist/index.d.ts +5 -0
- package/node_modules/@pi-claude-code-agent/intercom-bridge/dist/index.js +5 -0
- package/node_modules/@pi-claude-code-agent/intercom-bridge/dist/index.js.map +1 -0
- package/node_modules/@pi-claude-code-agent/intercom-bridge/dist/persistence.d.ts +12 -0
- package/node_modules/@pi-claude-code-agent/intercom-bridge/dist/persistence.js +31 -0
- package/node_modules/@pi-claude-code-agent/intercom-bridge/dist/persistence.js.map +1 -0
- package/node_modules/@pi-claude-code-agent/intercom-bridge/dist/pi-intercom-transport.d.ts +12 -0
- package/node_modules/@pi-claude-code-agent/intercom-bridge/dist/pi-intercom-transport.js +347 -0
- package/node_modules/@pi-claude-code-agent/intercom-bridge/dist/pi-intercom-transport.js.map +1 -0
- package/node_modules/@pi-claude-code-agent/intercom-bridge/dist/types.d.ts +103 -0
- package/node_modules/@pi-claude-code-agent/intercom-bridge/dist/types.js +2 -0
- package/node_modules/@pi-claude-code-agent/intercom-bridge/dist/types.js.map +1 -0
- package/node_modules/@pi-claude-code-agent/intercom-bridge/package.json +32 -0
- package/node_modules/@pi-claude-code-agent/runtime/dist/cli.d.ts +2 -0
- package/node_modules/@pi-claude-code-agent/runtime/dist/cli.js +26 -0
- package/node_modules/@pi-claude-code-agent/runtime/dist/cli.js.map +1 -0
- package/node_modules/@pi-claude-code-agent/runtime/dist/driver-config.d.ts +4 -0
- package/node_modules/@pi-claude-code-agent/runtime/dist/driver-config.js +12 -0
- package/node_modules/@pi-claude-code-agent/runtime/dist/driver-config.js.map +1 -0
- package/node_modules/@pi-claude-code-agent/runtime/dist/drivers/claude-sdk.d.ts +8 -0
- package/node_modules/@pi-claude-code-agent/runtime/dist/drivers/claude-sdk.js +320 -0
- package/node_modules/@pi-claude-code-agent/runtime/dist/drivers/claude-sdk.js.map +1 -0
- package/node_modules/@pi-claude-code-agent/runtime/dist/drivers/codex-cli.d.ts +24 -0
- package/node_modules/@pi-claude-code-agent/runtime/dist/drivers/codex-cli.js +266 -0
- package/node_modules/@pi-claude-code-agent/runtime/dist/drivers/codex-cli.js.map +1 -0
- package/node_modules/@pi-claude-code-agent/runtime/dist/drivers/messages.d.ts +72 -0
- package/node_modules/@pi-claude-code-agent/runtime/dist/drivers/messages.js +2 -0
- package/node_modules/@pi-claude-code-agent/runtime/dist/drivers/messages.js.map +1 -0
- package/node_modules/@pi-claude-code-agent/runtime/dist/index.d.ts +6 -0
- package/node_modules/@pi-claude-code-agent/runtime/dist/index.js +5 -0
- package/node_modules/@pi-claude-code-agent/runtime/dist/index.js.map +1 -0
- package/node_modules/@pi-claude-code-agent/runtime/dist/persistence.d.ts +16 -0
- package/node_modules/@pi-claude-code-agent/runtime/dist/persistence.js +94 -0
- package/node_modules/@pi-claude-code-agent/runtime/dist/persistence.js.map +1 -0
- package/node_modules/@pi-claude-code-agent/runtime/dist/runtime.d.ts +31 -0
- package/node_modules/@pi-claude-code-agent/runtime/dist/runtime.js +409 -0
- package/node_modules/@pi-claude-code-agent/runtime/dist/runtime.js.map +1 -0
- package/node_modules/@pi-claude-code-agent/runtime/dist/types.d.ts +185 -0
- package/node_modules/@pi-claude-code-agent/runtime/dist/types.js +2 -0
- package/node_modules/@pi-claude-code-agent/runtime/dist/types.js.map +1 -0
- package/node_modules/@pi-claude-code-agent/runtime/package.json +32 -0
- package/node_modules/@pi-claude-code-agent/subagents-backend/dist/backend.d.ts +34 -0
- package/node_modules/@pi-claude-code-agent/subagents-backend/dist/backend.js +327 -0
- package/node_modules/@pi-claude-code-agent/subagents-backend/dist/backend.js.map +1 -0
- package/node_modules/@pi-claude-code-agent/subagents-backend/dist/cli.d.ts +2 -0
- package/node_modules/@pi-claude-code-agent/subagents-backend/dist/cli.js +17 -0
- package/node_modules/@pi-claude-code-agent/subagents-backend/dist/cli.js.map +1 -0
- package/node_modules/@pi-claude-code-agent/subagents-backend/dist/index.d.ts +4 -0
- package/node_modules/@pi-claude-code-agent/subagents-backend/dist/index.js +4 -0
- package/node_modules/@pi-claude-code-agent/subagents-backend/dist/index.js.map +1 -0
- package/node_modules/@pi-claude-code-agent/subagents-backend/dist/persistence.d.ts +12 -0
- package/node_modules/@pi-claude-code-agent/subagents-backend/dist/persistence.js +81 -0
- package/node_modules/@pi-claude-code-agent/subagents-backend/dist/persistence.js.map +1 -0
- package/node_modules/@pi-claude-code-agent/subagents-backend/dist/types.d.ts +72 -0
- package/node_modules/@pi-claude-code-agent/subagents-backend/dist/types.js +2 -0
- package/node_modules/@pi-claude-code-agent/subagents-backend/dist/types.js.map +1 -0
- package/node_modules/@pi-claude-code-agent/subagents-backend/package.json +32 -0
- package/node_modules/@pi-claude-code-agent/teams-backend/dist/backend.d.ts +27 -0
- package/node_modules/@pi-claude-code-agent/teams-backend/dist/backend.js +194 -0
- package/node_modules/@pi-claude-code-agent/teams-backend/dist/backend.js.map +1 -0
- package/node_modules/@pi-claude-code-agent/teams-backend/dist/cli.d.ts +2 -0
- package/node_modules/@pi-claude-code-agent/teams-backend/dist/cli.js +21 -0
- package/node_modules/@pi-claude-code-agent/teams-backend/dist/cli.js.map +1 -0
- package/node_modules/@pi-claude-code-agent/teams-backend/dist/index.d.ts +4 -0
- package/node_modules/@pi-claude-code-agent/teams-backend/dist/index.js +4 -0
- package/node_modules/@pi-claude-code-agent/teams-backend/dist/index.js.map +1 -0
- package/node_modules/@pi-claude-code-agent/teams-backend/dist/persistence.d.ts +8 -0
- package/node_modules/@pi-claude-code-agent/teams-backend/dist/persistence.js +66 -0
- package/node_modules/@pi-claude-code-agent/teams-backend/dist/persistence.js.map +1 -0
- package/node_modules/@pi-claude-code-agent/teams-backend/dist/types.d.ts +41 -0
- package/node_modules/@pi-claude-code-agent/teams-backend/dist/types.js +2 -0
- package/node_modules/@pi-claude-code-agent/teams-backend/dist/types.js.map +1 -0
- package/node_modules/@pi-claude-code-agent/teams-backend/package.json +33 -0
- package/package.json +98 -0
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
function parseJsonOrRaw(value) {
|
|
2
|
+
try {
|
|
3
|
+
return JSON.parse(value);
|
|
4
|
+
}
|
|
5
|
+
catch {
|
|
6
|
+
return value;
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
function abortError() {
|
|
10
|
+
return new DOMException("Aborted", "AbortError");
|
|
11
|
+
}
|
|
12
|
+
class MessageStream {
|
|
13
|
+
queue = [];
|
|
14
|
+
waiters = [];
|
|
15
|
+
ended = false;
|
|
16
|
+
push(text) {
|
|
17
|
+
this.queue.push({
|
|
18
|
+
type: "user",
|
|
19
|
+
message: { role: "user", content: text },
|
|
20
|
+
parent_tool_use_id: null,
|
|
21
|
+
session_id: "",
|
|
22
|
+
});
|
|
23
|
+
this.waiters.splice(0).forEach((wake) => wake());
|
|
24
|
+
}
|
|
25
|
+
end() {
|
|
26
|
+
this.ended = true;
|
|
27
|
+
this.waiters.splice(0).forEach((wake) => wake());
|
|
28
|
+
}
|
|
29
|
+
async *[Symbol.asyncIterator]() {
|
|
30
|
+
while (true) {
|
|
31
|
+
while (this.queue.length > 0) {
|
|
32
|
+
yield this.queue.shift();
|
|
33
|
+
}
|
|
34
|
+
if (this.ended) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
await new Promise((resolve) => this.waiters.push(resolve));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function toBlock(block) {
|
|
42
|
+
const item = block;
|
|
43
|
+
return {
|
|
44
|
+
type: String(item.type ?? item.constructor?.name ?? "unknown"),
|
|
45
|
+
text: typeof item.text === "string" ? item.text : undefined,
|
|
46
|
+
name: typeof item.name === "string" ? item.name : undefined,
|
|
47
|
+
id: typeof item.id === "string" ? item.id : undefined,
|
|
48
|
+
input: item.input,
|
|
49
|
+
content: item.content,
|
|
50
|
+
isError: typeof item.is_error === "boolean" ? item.is_error : typeof item.isError === "boolean" ? item.isError : undefined,
|
|
51
|
+
raw: item,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
function toUsage(usage, totalCostUsd, modelUsage) {
|
|
55
|
+
if (!usage || typeof usage !== "object") {
|
|
56
|
+
return typeof totalCostUsd === "number" ? { totalCostUsd } : undefined;
|
|
57
|
+
}
|
|
58
|
+
const value = usage;
|
|
59
|
+
const inputTokens = typeof value.input_tokens === "number" ? value.input_tokens : undefined;
|
|
60
|
+
const outputTokens = typeof value.output_tokens === "number" ? value.output_tokens : undefined;
|
|
61
|
+
const cacheCreationInputTokens = typeof value.cache_creation_input_tokens === "number"
|
|
62
|
+
? value.cache_creation_input_tokens
|
|
63
|
+
: undefined;
|
|
64
|
+
const cacheReadInputTokens = typeof value.cache_read_input_tokens === "number" ? value.cache_read_input_tokens : undefined;
|
|
65
|
+
const reasoningOutputTokens = typeof value.reasoning_output_tokens === "number" ? value.reasoning_output_tokens : undefined;
|
|
66
|
+
const modelUsageValues = modelUsage && typeof modelUsage === "object" ? Object.values(modelUsage) : [];
|
|
67
|
+
const modelContextWindows = modelUsageValues
|
|
68
|
+
.map((entry) => entry && typeof entry === "object" ? entry.contextWindow : undefined)
|
|
69
|
+
.filter((entry) => typeof entry === "number" && Number.isFinite(entry));
|
|
70
|
+
const modelMaxOutputTokens = modelUsageValues
|
|
71
|
+
.map((entry) => entry && typeof entry === "object" ? entry.maxOutputTokens : undefined)
|
|
72
|
+
.filter((entry) => typeof entry === "number" && Number.isFinite(entry));
|
|
73
|
+
const contextWindow = modelContextWindows.length > 0 ? Math.max(...modelContextWindows) : undefined;
|
|
74
|
+
const maxOutputTokens = modelMaxOutputTokens.length > 0 ? Math.max(...modelMaxOutputTokens) : undefined;
|
|
75
|
+
const contextTokens = [inputTokens, cacheCreationInputTokens, cacheReadInputTokens]
|
|
76
|
+
.filter((entry) => typeof entry === "number" && Number.isFinite(entry))
|
|
77
|
+
.reduce((sum, entry) => sum + entry, 0);
|
|
78
|
+
return {
|
|
79
|
+
inputTokens,
|
|
80
|
+
outputTokens,
|
|
81
|
+
cacheCreationInputTokens,
|
|
82
|
+
cacheReadInputTokens,
|
|
83
|
+
reasoningOutputTokens,
|
|
84
|
+
totalCostUsd: typeof totalCostUsd === "number" ? totalCostUsd : undefined,
|
|
85
|
+
contextTokens: contextTokens > 0 ? contextTokens : undefined,
|
|
86
|
+
contextWindow,
|
|
87
|
+
contextPercentage: contextWindow && contextTokens > 0 ? Math.round((contextTokens / contextWindow) * 1000) / 10 : undefined,
|
|
88
|
+
maxOutputTokens,
|
|
89
|
+
raw: usage,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
function parseAssistantMessage(message, raw) {
|
|
93
|
+
const blocks = (Array.isArray(message.content) ? message.content : []).map(toBlock);
|
|
94
|
+
const result = [
|
|
95
|
+
{
|
|
96
|
+
type: "assistant",
|
|
97
|
+
blocks,
|
|
98
|
+
model: typeof message.model === "string" ? message.model : undefined,
|
|
99
|
+
raw,
|
|
100
|
+
},
|
|
101
|
+
];
|
|
102
|
+
for (const block of blocks) {
|
|
103
|
+
if (block.type === "tool_use") {
|
|
104
|
+
result.push({
|
|
105
|
+
type: "tool_use",
|
|
106
|
+
toolName: block.name ?? "unknown",
|
|
107
|
+
toolUseId: block.id,
|
|
108
|
+
input: block.input,
|
|
109
|
+
raw: block.raw,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return result;
|
|
114
|
+
}
|
|
115
|
+
function parseUserMessage(message, raw, toolUseResult) {
|
|
116
|
+
const blocks = (Array.isArray(message.content) ? message.content : []).map(toBlock);
|
|
117
|
+
const toolResultBlock = blocks.find((block) => block.type === "tool_result");
|
|
118
|
+
if (!toolResultBlock) {
|
|
119
|
+
return [];
|
|
120
|
+
}
|
|
121
|
+
const toolResult = toolUseResult && typeof toolUseResult === "object"
|
|
122
|
+
? toolUseResult
|
|
123
|
+
: undefined;
|
|
124
|
+
return [{
|
|
125
|
+
type: "tool_result",
|
|
126
|
+
role: "user",
|
|
127
|
+
blocks,
|
|
128
|
+
toolName: typeof toolResult?.tool_name === "string" ? toolResult.tool_name : toolResultBlock.name ?? "tool",
|
|
129
|
+
toolUseId: typeof toolResultBlock.raw?.tool_use_id === "string"
|
|
130
|
+
? String(toolResultBlock.raw.tool_use_id)
|
|
131
|
+
: undefined,
|
|
132
|
+
output: toolResult ?? toolResultBlock.content,
|
|
133
|
+
isError: toolResultBlock.isError,
|
|
134
|
+
raw,
|
|
135
|
+
}];
|
|
136
|
+
}
|
|
137
|
+
export function parseClaudeSdkMessage(message) {
|
|
138
|
+
if (!message || typeof message !== "object") {
|
|
139
|
+
return [];
|
|
140
|
+
}
|
|
141
|
+
const item = message;
|
|
142
|
+
const type = String(item.type ?? item.constructor?.name ?? "");
|
|
143
|
+
if (type === "system" || type === "SystemMessage") {
|
|
144
|
+
return [{
|
|
145
|
+
type: "system",
|
|
146
|
+
subtype: typeof item.subtype === "string" ? item.subtype : undefined,
|
|
147
|
+
sessionId: typeof item.session_id === "string" ? item.session_id : typeof item.sessionId === "string" ? item.sessionId : undefined,
|
|
148
|
+
cwd: typeof item.cwd === "string" ? item.cwd : undefined,
|
|
149
|
+
model: typeof item.model === "string" ? item.model : undefined,
|
|
150
|
+
metadata: { ...(item.data ?? {}) },
|
|
151
|
+
raw: message,
|
|
152
|
+
}];
|
|
153
|
+
}
|
|
154
|
+
if (type === "assistant" || type === "AssistantMessage") {
|
|
155
|
+
const assistant = item.message ?? item;
|
|
156
|
+
return parseAssistantMessage(assistant, message);
|
|
157
|
+
}
|
|
158
|
+
if (type === "user" || type === "UserMessage") {
|
|
159
|
+
const user = item.message ?? item;
|
|
160
|
+
return parseUserMessage(user, message, item.tool_use_result);
|
|
161
|
+
}
|
|
162
|
+
if (type === "result" || type === "ResultMessage") {
|
|
163
|
+
return [{
|
|
164
|
+
type: "result",
|
|
165
|
+
ok: !Boolean(item.is_error ?? item.isError),
|
|
166
|
+
summary: typeof item.result === "string" ? item.result : JSON.stringify(item.result ?? ""),
|
|
167
|
+
stopReason: typeof item.stop_reason === "string" ? item.stop_reason : undefined,
|
|
168
|
+
usage: toUsage(item.usage, item.total_cost_usd ?? item.totalCostUsd, item.modelUsage),
|
|
169
|
+
raw: message,
|
|
170
|
+
}];
|
|
171
|
+
}
|
|
172
|
+
if (type === "error" || type === "ErrorMessage") {
|
|
173
|
+
return [{
|
|
174
|
+
type: "error",
|
|
175
|
+
message: typeof item.message === "string" ? item.message : JSON.stringify(item),
|
|
176
|
+
code: typeof item.code === "string" ? item.code : undefined,
|
|
177
|
+
raw: message,
|
|
178
|
+
}];
|
|
179
|
+
}
|
|
180
|
+
if (["rate_limit_event", "task_notification", "compact_boundary"].includes(type)) {
|
|
181
|
+
return [{
|
|
182
|
+
type: "stream_event",
|
|
183
|
+
summary: String(item.summary ?? item.subtype ?? type),
|
|
184
|
+
metadata: {
|
|
185
|
+
eventType: type,
|
|
186
|
+
sessionId: item.session_id ?? item.sessionId,
|
|
187
|
+
},
|
|
188
|
+
raw: message,
|
|
189
|
+
}];
|
|
190
|
+
}
|
|
191
|
+
return [];
|
|
192
|
+
}
|
|
193
|
+
export class ClaudeSdkDriver {
|
|
194
|
+
name = "claude-sdk";
|
|
195
|
+
run(input, onEvent) {
|
|
196
|
+
const controller = new AbortController();
|
|
197
|
+
const done = (async () => {
|
|
198
|
+
try {
|
|
199
|
+
let sdk;
|
|
200
|
+
try {
|
|
201
|
+
sdk = await import("@anthropic-ai/claude-agent-sdk");
|
|
202
|
+
}
|
|
203
|
+
catch (error) {
|
|
204
|
+
await onEvent({
|
|
205
|
+
type: "error",
|
|
206
|
+
payload: {
|
|
207
|
+
message: `Claude Agent SDK not found. Install @anthropic-ai/claude-agent-sdk. ${error instanceof Error ? error.message : String(error)}`,
|
|
208
|
+
code: "CLAUDE_SDK_MISSING",
|
|
209
|
+
},
|
|
210
|
+
});
|
|
211
|
+
return { code: 1, signal: null };
|
|
212
|
+
}
|
|
213
|
+
const promptStream = new MessageStream();
|
|
214
|
+
promptStream.push(input.prompt);
|
|
215
|
+
promptStream.end();
|
|
216
|
+
const request = sdk.query({
|
|
217
|
+
prompt: promptStream,
|
|
218
|
+
options: this.buildOptions(input),
|
|
219
|
+
});
|
|
220
|
+
const onAbort = () => {
|
|
221
|
+
void request.close?.();
|
|
222
|
+
void request.interrupt?.();
|
|
223
|
+
};
|
|
224
|
+
controller.signal.addEventListener("abort", onAbort, { once: true });
|
|
225
|
+
try {
|
|
226
|
+
for await (const message of request) {
|
|
227
|
+
if (controller.signal.aborted) {
|
|
228
|
+
throw abortError();
|
|
229
|
+
}
|
|
230
|
+
for (const normalized of parseClaudeSdkMessage(message)) {
|
|
231
|
+
await onEvent({ type: "message", payload: normalized });
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return { code: 0, signal: null };
|
|
235
|
+
}
|
|
236
|
+
finally {
|
|
237
|
+
controller.signal.removeEventListener("abort", onAbort);
|
|
238
|
+
await request.close?.();
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
if (error?.name === "AbortError") {
|
|
243
|
+
return { code: 130, signal: "SIGINT" };
|
|
244
|
+
}
|
|
245
|
+
const message = enrichClaudeSdkErrorMessage(error instanceof Error ? error.message : String(error), input.model);
|
|
246
|
+
await onEvent({
|
|
247
|
+
type: "error",
|
|
248
|
+
payload: {
|
|
249
|
+
message,
|
|
250
|
+
code: "CLAUDE_SDK_ERROR",
|
|
251
|
+
},
|
|
252
|
+
});
|
|
253
|
+
return { code: 1, signal: null };
|
|
254
|
+
}
|
|
255
|
+
})();
|
|
256
|
+
return {
|
|
257
|
+
kill() {
|
|
258
|
+
controller.abort();
|
|
259
|
+
},
|
|
260
|
+
done,
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
buildOptions(input) {
|
|
264
|
+
const result = {
|
|
265
|
+
cwd: input.cwd,
|
|
266
|
+
permissionMode: input.permissionMode ?? "bypassPermissions",
|
|
267
|
+
allowDangerouslySkipPermissions: true,
|
|
268
|
+
settingSources: ["project", "user"],
|
|
269
|
+
};
|
|
270
|
+
if (input.env) {
|
|
271
|
+
result.env = input.env;
|
|
272
|
+
}
|
|
273
|
+
if (process.env.CLAUDE_CODE_EXECUTABLE) {
|
|
274
|
+
result.pathToClaudeCodeExecutable = process.env.CLAUDE_CODE_EXECUTABLE;
|
|
275
|
+
}
|
|
276
|
+
if (input.resumeSessionId) {
|
|
277
|
+
result.resume = input.resumeSessionId;
|
|
278
|
+
}
|
|
279
|
+
if (input.model) {
|
|
280
|
+
result.model = input.model;
|
|
281
|
+
}
|
|
282
|
+
if (input.appendSystemPrompt != null) {
|
|
283
|
+
result.systemPrompt = { type: "preset", preset: "claude_code", append: input.appendSystemPrompt };
|
|
284
|
+
}
|
|
285
|
+
if (input.tools?.length) {
|
|
286
|
+
result.allowedTools = input.tools;
|
|
287
|
+
}
|
|
288
|
+
if (input.additionalDirectories?.length) {
|
|
289
|
+
result.additionalDirectories = input.additionalDirectories;
|
|
290
|
+
}
|
|
291
|
+
if (process.env.CLAUDE_SDK_OUTPUT_FORMAT) {
|
|
292
|
+
result.outputFormat = parseJsonOrRaw(process.env.CLAUDE_SDK_OUTPUT_FORMAT);
|
|
293
|
+
}
|
|
294
|
+
return result;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
function enrichClaudeSdkErrorMessage(message, model) {
|
|
298
|
+
const lower = message.toLowerCase();
|
|
299
|
+
const hints = [];
|
|
300
|
+
if (lower.includes("native binary not found") || lower.includes("claude code") && lower.includes("not found")) {
|
|
301
|
+
hints.push("Install Claude Code or set CLAUDE_CODE_EXECUTABLE to the native binary path.");
|
|
302
|
+
}
|
|
303
|
+
if (lower.includes("bedrock")) {
|
|
304
|
+
hints.push("This model/provider appears to route through Amazon Bedrock; use a fully qualified model id from runtime_models or configure Bedrock credentials.");
|
|
305
|
+
}
|
|
306
|
+
if (lower.includes("api key") || lower.includes("apikey") || lower.includes("unauthorized")) {
|
|
307
|
+
hints.push("Provider credentials are missing or rejected for this runtime/model.");
|
|
308
|
+
}
|
|
309
|
+
if (lower.includes("prompt is too long") || lower.includes("prompt too long") || lower.includes("context length")) {
|
|
310
|
+
hints.push("Split the task into smaller slices or ask the peer to inspect files instead of pasting large context.");
|
|
311
|
+
}
|
|
312
|
+
if (model && /^(opus|sonnet|haiku)$/i.test(model.trim())) {
|
|
313
|
+
hints.push(`"${model}" is a shorthand alias; pass the full Claude model id to the runtime.`);
|
|
314
|
+
}
|
|
315
|
+
if (hints.length === 0) {
|
|
316
|
+
return message;
|
|
317
|
+
}
|
|
318
|
+
return [message, ...[...new Set(hints)].map((hint) => `Hint: ${hint}`)].join("\n");
|
|
319
|
+
}
|
|
320
|
+
//# sourceMappingURL=claude-sdk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-sdk.js","sourceRoot":"","sources":["../../src/drivers/claude-sdk.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { spawn as nodeSpawn } from "node:child_process";
|
|
2
|
+
import type { NormalizedDriverMessage } from "./messages.js";
|
|
3
|
+
import type { DriverEventEnvelope, RuntimeDriver, RuntimeDriverRunHandle, RuntimeDriverRunInput } from "../types.js";
|
|
4
|
+
type SpawnFn = typeof nodeSpawn;
|
|
5
|
+
export interface CodexCliDriverOptions {
|
|
6
|
+
spawn?: SpawnFn;
|
|
7
|
+
executable?: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function buildCodexCliCommand(input: {
|
|
10
|
+
prompt: string;
|
|
11
|
+
cwd: string;
|
|
12
|
+
model?: string;
|
|
13
|
+
appendSystemPrompt?: string;
|
|
14
|
+
resumeSessionId?: string;
|
|
15
|
+
}): string[];
|
|
16
|
+
export declare function parseCodexCliEvent(event: unknown): NormalizedDriverMessage | null;
|
|
17
|
+
export declare class CodexCliDriver implements RuntimeDriver {
|
|
18
|
+
readonly name: "codex-cli";
|
|
19
|
+
private readonly spawnFn;
|
|
20
|
+
private readonly executable;
|
|
21
|
+
constructor(options?: CodexCliDriverOptions);
|
|
22
|
+
run(input: RuntimeDriverRunInput, onEvent: (event: DriverEventEnvelope) => Promise<void> | void): RuntimeDriverRunHandle;
|
|
23
|
+
}
|
|
24
|
+
export {};
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import { spawn as nodeSpawn } from "node:child_process";
|
|
2
|
+
export function buildCodexCliCommand(input) {
|
|
3
|
+
const effectivePrompt = input.appendSystemPrompt
|
|
4
|
+
? `<system>\n${input.appendSystemPrompt}\n</system>\n\n${input.prompt}`
|
|
5
|
+
: input.prompt;
|
|
6
|
+
const args = ["exec"];
|
|
7
|
+
if (input.resumeSessionId) {
|
|
8
|
+
args.push("resume", "--json", "--full-auto");
|
|
9
|
+
if (input.model) {
|
|
10
|
+
args.push("-m", input.model);
|
|
11
|
+
}
|
|
12
|
+
args.push(input.resumeSessionId, effectivePrompt);
|
|
13
|
+
return args;
|
|
14
|
+
}
|
|
15
|
+
args.push("--json", "--full-auto", "-C", input.cwd);
|
|
16
|
+
if (input.model) {
|
|
17
|
+
args.push("-m", input.model);
|
|
18
|
+
}
|
|
19
|
+
args.push(effectivePrompt);
|
|
20
|
+
return args;
|
|
21
|
+
}
|
|
22
|
+
function toUsage(usage) {
|
|
23
|
+
if (!usage || typeof usage !== "object")
|
|
24
|
+
return undefined;
|
|
25
|
+
const u = usage;
|
|
26
|
+
return {
|
|
27
|
+
inputTokens: typeof u.input_tokens === "number" ? u.input_tokens : undefined,
|
|
28
|
+
outputTokens: typeof u.output_tokens === "number" ? u.output_tokens : undefined,
|
|
29
|
+
cacheCreationInputTokens: typeof u.cache_creation_input_tokens === "number" ? u.cache_creation_input_tokens : undefined,
|
|
30
|
+
cacheReadInputTokens: typeof u.cache_read_input_tokens === "number"
|
|
31
|
+
? u.cache_read_input_tokens
|
|
32
|
+
: typeof u.cached_input_tokens === "number"
|
|
33
|
+
? u.cached_input_tokens
|
|
34
|
+
: undefined,
|
|
35
|
+
reasoningOutputTokens: typeof u.reasoning_output_tokens === "number" ? u.reasoning_output_tokens : undefined,
|
|
36
|
+
raw: usage,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
export function parseCodexCliEvent(event) {
|
|
40
|
+
if (!event || typeof event !== "object")
|
|
41
|
+
return null;
|
|
42
|
+
const e = event;
|
|
43
|
+
const type = String(e.type ?? "");
|
|
44
|
+
if (type === "thread.started") {
|
|
45
|
+
const sessionId = typeof e.thread_id === "string"
|
|
46
|
+
? e.thread_id
|
|
47
|
+
: typeof e.session_id === "string"
|
|
48
|
+
? e.session_id
|
|
49
|
+
: undefined;
|
|
50
|
+
return {
|
|
51
|
+
type: "system",
|
|
52
|
+
subtype: "init",
|
|
53
|
+
sessionId,
|
|
54
|
+
model: typeof e.model === "string" ? e.model : typeof e.model_id === "string" ? e.model_id : undefined,
|
|
55
|
+
raw: event,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
if (type === "item.started") {
|
|
59
|
+
const item = e.item;
|
|
60
|
+
if (item?.type === "command_execution") {
|
|
61
|
+
return {
|
|
62
|
+
type: "tool_use",
|
|
63
|
+
toolName: "command_execution",
|
|
64
|
+
toolUseId: typeof item.id === "string" ? item.id : undefined,
|
|
65
|
+
input: { command: item.command, cwd: item.cwd },
|
|
66
|
+
raw: event,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
if (type === "item.completed") {
|
|
72
|
+
const item = e.item;
|
|
73
|
+
if (item?.type === "command_execution") {
|
|
74
|
+
const exitCode = typeof item.exit_code === "number" ? item.exit_code : 0;
|
|
75
|
+
return {
|
|
76
|
+
type: "tool_result",
|
|
77
|
+
toolName: "command_execution",
|
|
78
|
+
toolUseId: typeof item.id === "string" ? item.id : undefined,
|
|
79
|
+
output: { stdout: item.stdout, exit_code: exitCode },
|
|
80
|
+
isError: exitCode !== 0,
|
|
81
|
+
raw: event,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
if (item?.type === "agent_message" || item?.type === "assistant_message") {
|
|
85
|
+
const text = typeof item.text === "string" ? item.text : "";
|
|
86
|
+
return {
|
|
87
|
+
type: "assistant",
|
|
88
|
+
blocks: [{ type: "text", text, raw: item }],
|
|
89
|
+
raw: event,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
if (type === "turn.completed") {
|
|
95
|
+
const summary = typeof e.summary === "string" ? e.summary : "";
|
|
96
|
+
return {
|
|
97
|
+
type: "result",
|
|
98
|
+
ok: true,
|
|
99
|
+
summary,
|
|
100
|
+
usage: toUsage(e.usage),
|
|
101
|
+
raw: event,
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
// error and *.failed events are handled by the driver as error envelopes
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
function isErrorEvent(event) {
|
|
108
|
+
if (!event || typeof event !== "object")
|
|
109
|
+
return false;
|
|
110
|
+
const type = String(event.type ?? "");
|
|
111
|
+
return type === "error" || type.endsWith(".failed");
|
|
112
|
+
}
|
|
113
|
+
function extractError(event) {
|
|
114
|
+
const e = event;
|
|
115
|
+
return {
|
|
116
|
+
message: typeof e.message === "string" ? e.message : JSON.stringify(event),
|
|
117
|
+
code: typeof e.code === "string" ? e.code : undefined,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
const RING_BUFFER_MAX = 50;
|
|
121
|
+
const STDERR_MAX_BYTES = 8 * 1024;
|
|
122
|
+
export class CodexCliDriver {
|
|
123
|
+
name = "codex-cli";
|
|
124
|
+
spawnFn;
|
|
125
|
+
executable;
|
|
126
|
+
constructor(options = {}) {
|
|
127
|
+
this.spawnFn = options.spawn ?? nodeSpawn;
|
|
128
|
+
this.executable =
|
|
129
|
+
options.executable ?? (process.env.CODEX_CLI_EXECUTABLE ?? "codex");
|
|
130
|
+
}
|
|
131
|
+
run(input, onEvent) {
|
|
132
|
+
// Hard-reject unsupported options before spawning
|
|
133
|
+
if (input.tools && input.tools.length > 0) {
|
|
134
|
+
throw new RangeError("codex-cli driver does not support allowedTools");
|
|
135
|
+
}
|
|
136
|
+
if (input.additionalDirectories && input.additionalDirectories.length > 0) {
|
|
137
|
+
throw new RangeError("codex-cli driver does not support additionalDirectories");
|
|
138
|
+
}
|
|
139
|
+
if (input.permissionMode === "plan" || input.permissionMode === "dontAsk") {
|
|
140
|
+
throw new RangeError(`codex-cli driver does not support permissionMode=${input.permissionMode}`);
|
|
141
|
+
}
|
|
142
|
+
// permissionMode acceptEdits/auto/bypassPermissions/default are accepted but not
|
|
143
|
+
// mapped to sandbox flags — --full-auto is always passed in this slice
|
|
144
|
+
const args = buildCodexCliCommand({
|
|
145
|
+
prompt: input.prompt,
|
|
146
|
+
cwd: input.cwd,
|
|
147
|
+
model: input.model,
|
|
148
|
+
appendSystemPrompt: input.appendSystemPrompt,
|
|
149
|
+
resumeSessionId: input.resumeSessionId,
|
|
150
|
+
});
|
|
151
|
+
const env = { ...process.env, ...(input.env ?? {}) };
|
|
152
|
+
let aborted = false;
|
|
153
|
+
const child = this.spawnFn(this.executable, args, {
|
|
154
|
+
env,
|
|
155
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
156
|
+
});
|
|
157
|
+
const ringBuffer = [];
|
|
158
|
+
let stderrTail = "";
|
|
159
|
+
let structuredErrorEmitted = false;
|
|
160
|
+
let stdoutBuffer = "";
|
|
161
|
+
let spawnError;
|
|
162
|
+
// Serial delivery chain — events are fired immediately as lines arrive (live/
|
|
163
|
+
// streaming) but each onEvent call waits for the previous one to complete so
|
|
164
|
+
// ordering is guaranteed. The close handler extends this chain with any final
|
|
165
|
+
// error envelope and then resolves done, ensuring done only settles after every
|
|
166
|
+
// pending onEvent delivery has finished.
|
|
167
|
+
let deliveryChain = Promise.resolve();
|
|
168
|
+
function deliver(envelope) {
|
|
169
|
+
deliveryChain = deliveryChain.then(async () => {
|
|
170
|
+
try {
|
|
171
|
+
await onEvent(envelope);
|
|
172
|
+
}
|
|
173
|
+
catch {
|
|
174
|
+
// swallow handler errors to keep the chain alive
|
|
175
|
+
}
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
function processLine(line) {
|
|
179
|
+
let parsed;
|
|
180
|
+
try {
|
|
181
|
+
parsed = JSON.parse(line);
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
// Malformed line: keep in ring buffer for crash diagnostics
|
|
185
|
+
if (ringBuffer.length >= RING_BUFFER_MAX)
|
|
186
|
+
ringBuffer.shift();
|
|
187
|
+
ringBuffer.push(line);
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
if (isErrorEvent(parsed)) {
|
|
191
|
+
structuredErrorEmitted = true;
|
|
192
|
+
const err = extractError(parsed);
|
|
193
|
+
deliver({ type: "error", payload: { message: err.message, code: err.code, raw: parsed } });
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
const normalized = parseCodexCliEvent(parsed);
|
|
197
|
+
if (normalized) {
|
|
198
|
+
deliver({ type: "message", payload: normalized });
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
child.stdout?.on("data", (chunk) => {
|
|
202
|
+
stdoutBuffer += chunk.toString("utf8");
|
|
203
|
+
const lines = stdoutBuffer.split("\n");
|
|
204
|
+
stdoutBuffer = lines.pop() ?? "";
|
|
205
|
+
for (const raw of lines) {
|
|
206
|
+
const trimmed = raw.trim();
|
|
207
|
+
if (trimmed)
|
|
208
|
+
processLine(trimmed);
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
child.stderr?.on("data", (chunk) => {
|
|
212
|
+
stderrTail += chunk.toString("utf8");
|
|
213
|
+
if (stderrTail.length > STDERR_MAX_BYTES) {
|
|
214
|
+
stderrTail = stderrTail.slice(-STDERR_MAX_BYTES);
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
// Capture spawn failures (e.g. ENOENT — executable not found).
|
|
218
|
+
// The close event always follows, so resolution happens there.
|
|
219
|
+
child.on("error", (err) => {
|
|
220
|
+
spawnError = err;
|
|
221
|
+
});
|
|
222
|
+
const done = new Promise((resolve) => {
|
|
223
|
+
child.on("close", (code, signal) => {
|
|
224
|
+
// Flush any partial JSONL line left in the buffer
|
|
225
|
+
const remainder = stdoutBuffer.trim();
|
|
226
|
+
if (remainder)
|
|
227
|
+
processLine(remainder);
|
|
228
|
+
if (spawnError) {
|
|
229
|
+
// Spawn failure overrides all other error paths
|
|
230
|
+
deliver({
|
|
231
|
+
type: "error",
|
|
232
|
+
payload: { message: enrichCodexSpawnErrorMessage(spawnError.message), code: "SPAWN_ERROR" },
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
else if (!aborted && code !== 0 && !structuredErrorEmitted) {
|
|
236
|
+
// Surface stderr + any malformed stdout context from ring buffer
|
|
237
|
+
const base = stderrTail.trim() || `codex exited with code ${code}`;
|
|
238
|
+
const ringCtx = ringBuffer.length > 0
|
|
239
|
+
? ` | malformed stdout: ${ringBuffer.slice(-5).join(" | ")}`
|
|
240
|
+
: "";
|
|
241
|
+
deliver({ type: "error", payload: { message: base + ringCtx } });
|
|
242
|
+
}
|
|
243
|
+
// Extend the delivery chain with the resolve call so done only
|
|
244
|
+
// settles after every pending onEvent delivery has completed.
|
|
245
|
+
void deliveryChain.then(() => {
|
|
246
|
+
resolve({ code, signal: signal });
|
|
247
|
+
});
|
|
248
|
+
});
|
|
249
|
+
});
|
|
250
|
+
return {
|
|
251
|
+
kill(sig = "SIGINT") {
|
|
252
|
+
aborted = true;
|
|
253
|
+
child.kill(sig);
|
|
254
|
+
},
|
|
255
|
+
done,
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
function enrichCodexSpawnErrorMessage(message) {
|
|
260
|
+
const lower = message.toLowerCase();
|
|
261
|
+
if (!lower.includes("enoent") && !lower.includes("not found")) {
|
|
262
|
+
return message;
|
|
263
|
+
}
|
|
264
|
+
return `${message}\nHint: codex executable could not be spawned. Check PATH or set CODEX_CLI_EXECUTABLE to the Codex CLI binary.`;
|
|
265
|
+
}
|
|
266
|
+
//# sourceMappingURL=codex-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-cli.js","sourceRoot":"","sources":["../../src/drivers/codex-cli.ts"],"names":[],"mappings":"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"}
|