@nodetool-ai/runtime 0.8.3 → 0.8.4-a24.1
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/dist/.nodetool-build-stamp +1 -1
- package/dist/canvas-codec.d.ts +3 -0
- package/dist/canvas-codec.d.ts.map +1 -0
- package/dist/canvas-codec.js +12 -0
- package/dist/canvas-codec.js.map +1 -0
- package/dist/context-packer.d.ts +1 -1
- package/dist/context-packer.js +1 -1
- package/dist/context.d.ts +3 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +13 -3
- package/dist/context.js.map +1 -1
- package/dist/host-binaries.d.ts.map +1 -1
- package/dist/host-binaries.js +4 -3
- package/dist/host-binaries.js.map +1 -1
- package/dist/http-client-spans.d.ts +9 -0
- package/dist/http-client-spans.d.ts.map +1 -0
- package/dist/http-client-spans.js +88 -0
- package/dist/http-client-spans.js.map +1 -0
- package/dist/image-codec.d.ts +6 -3
- package/dist/image-codec.d.ts.map +1 -1
- package/dist/image-codec.js +17 -17
- package/dist/image-codec.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/media-ref-bytes.d.ts.map +1 -1
- package/dist/media-ref-bytes.js +31 -6
- package/dist/media-ref-bytes.js.map +1 -1
- package/dist/otlp-json-trace-exporter.d.ts +89 -0
- package/dist/otlp-json-trace-exporter.d.ts.map +1 -0
- package/dist/otlp-json-trace-exporter.js +155 -0
- package/dist/otlp-json-trace-exporter.js.map +1 -0
- package/dist/providers/antigravity-provider.d.ts +113 -0
- package/dist/providers/antigravity-provider.d.ts.map +1 -0
- package/dist/providers/antigravity-provider.js +527 -0
- package/dist/providers/antigravity-provider.js.map +1 -0
- package/dist/providers/azure-openai-provider.d.ts +69 -0
- package/dist/providers/azure-openai-provider.d.ts.map +1 -0
- package/dist/providers/azure-openai-provider.js +233 -0
- package/dist/providers/azure-openai-provider.js.map +1 -0
- package/dist/providers/base-provider.d.ts.map +1 -1
- package/dist/providers/base-provider.js +19 -1
- package/dist/providers/base-provider.js.map +1 -1
- package/dist/providers/bedrock-provider.d.ts +52 -0
- package/dist/providers/bedrock-provider.d.ts.map +1 -0
- package/dist/providers/bedrock-provider.js +648 -0
- package/dist/providers/bedrock-provider.js.map +1 -0
- package/dist/providers/bedrock-transport.d.ts +37 -0
- package/dist/providers/bedrock-transport.d.ts.map +1 -0
- package/dist/providers/bedrock-transport.js +186 -0
- package/dist/providers/bedrock-transport.js.map +1 -0
- package/dist/providers/chatgpt-provider.d.ts.map +1 -1
- package/dist/providers/chatgpt-provider.js +77 -32
- package/dist/providers/chatgpt-provider.js.map +1 -1
- package/dist/providers/claude-agent-provider.d.ts +29 -51
- package/dist/providers/claude-agent-provider.d.ts.map +1 -1
- package/dist/providers/claude-agent-provider.js +144 -202
- package/dist/providers/claude-agent-provider.js.map +1 -1
- package/dist/providers/claude-cli.d.ts +265 -0
- package/dist/providers/claude-cli.d.ts.map +1 -0
- package/dist/providers/claude-cli.js +488 -0
- package/dist/providers/claude-cli.js.map +1 -0
- package/dist/providers/codex-provider.d.ts +9 -2
- package/dist/providers/codex-provider.d.ts.map +1 -1
- package/dist/providers/codex-provider.js +25 -11
- package/dist/providers/codex-provider.js.map +1 -1
- package/dist/providers/core-tools.d.ts +4 -1
- package/dist/providers/core-tools.d.ts.map +1 -1
- package/dist/providers/core-tools.js +5 -3
- package/dist/providers/core-tools.js.map +1 -1
- package/dist/providers/dreamina-pending.d.ts +22 -0
- package/dist/providers/dreamina-pending.d.ts.map +1 -0
- package/dist/providers/dreamina-pending.js +86 -0
- package/dist/providers/dreamina-pending.js.map +1 -0
- package/dist/providers/dreamina-provider.d.ts +5 -0
- package/dist/providers/dreamina-provider.d.ts.map +1 -1
- package/dist/providers/dreamina-provider.js +88 -19
- package/dist/providers/dreamina-provider.js.map +1 -1
- package/dist/providers/extension-tab.d.ts +18 -5
- package/dist/providers/extension-tab.d.ts.map +1 -1
- package/dist/providers/extension-tab.js +71 -15
- package/dist/providers/extension-tab.js.map +1 -1
- package/dist/providers/gemini-provider.d.ts +3 -1
- package/dist/providers/gemini-provider.d.ts.map +1 -1
- package/dist/providers/gemini-provider.js +32 -1
- package/dist/providers/gemini-provider.js.map +1 -1
- package/dist/providers/gemini-web-provider.d.ts +14 -14
- package/dist/providers/gemini-web-provider.d.ts.map +1 -1
- package/dist/providers/gemini-web-provider.js +264 -189
- package/dist/providers/gemini-web-provider.js.map +1 -1
- package/dist/providers/http-transport.d.ts.map +1 -1
- package/dist/providers/http-transport.js +2 -0
- package/dist/providers/http-transport.js.map +1 -1
- package/dist/providers/index.d.ts +8 -0
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +30 -7
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/node-llama-cpp-provider.d.ts.map +1 -1
- package/dist/providers/node-llama-cpp-provider.js +2 -4
- package/dist/providers/node-llama-cpp-provider.js.map +1 -1
- package/dist/providers/openai-provider.d.ts +2 -0
- package/dist/providers/openai-provider.d.ts.map +1 -1
- package/dist/providers/openai-provider.js +19 -6
- package/dist/providers/openai-provider.js.map +1 -1
- package/dist/providers/safe-url.d.ts.map +1 -1
- package/dist/providers/safe-url.js +8 -0
- package/dist/providers/safe-url.js.map +1 -1
- package/dist/providers/vgenv-provider.d.ts +33 -0
- package/dist/providers/vgenv-provider.d.ts.map +1 -0
- package/dist/providers/vgenv-provider.js +261 -0
- package/dist/providers/vgenv-provider.js.map +1 -0
- package/dist/python-graph-resolver.d.ts.map +1 -1
- package/dist/python-graph-resolver.js +12 -2
- package/dist/python-graph-resolver.js.map +1 -1
- package/dist/python-stdio-bridge.d.ts.map +1 -1
- package/dist/python-stdio-bridge.js +33 -10
- package/dist/python-stdio-bridge.js.map +1 -1
- package/dist/run-trace-processor.d.ts +3 -0
- package/dist/run-trace-processor.d.ts.map +1 -1
- package/dist/run-trace-processor.js +56 -40
- package/dist/run-trace-processor.js.map +1 -1
- package/dist/telemetry.d.ts +2 -2
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +33 -34
- package/dist/telemetry.js.map +1 -1
- package/dist/token-counter.d.ts +4 -13
- package/dist/token-counter.d.ts.map +1 -1
- package/dist/token-counter.js +68 -18
- package/dist/token-counter.js.map +1 -1
- package/dist/trace-context-manager.d.ts +12 -0
- package/dist/trace-context-manager.d.ts.map +1 -0
- package/dist/trace-context-manager.js +30 -0
- package/dist/trace-context-manager.js.map +1 -0
- package/dist/trace-exporters.d.ts +1 -1
- package/dist/trace-exporters.d.ts.map +1 -1
- package/dist/trace-exporters.js +4 -5
- package/dist/trace-exporters.js.map +1 -1
- package/dist/trace-semantic-conventions.d.ts +2 -0
- package/dist/trace-semantic-conventions.d.ts.map +1 -0
- package/dist/trace-semantic-conventions.js +2 -0
- package/dist/trace-semantic-conventions.js.map +1 -0
- package/dist/tracing-module.d.ts +3 -0
- package/dist/tracing-module.d.ts.map +1 -0
- package/dist/tracing-module.js +12 -0
- package/dist/tracing-module.js.map +1 -0
- package/package.json +35 -18
|
@@ -0,0 +1,488 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The headless Claude Code CLI as a streaming transport.
|
|
3
|
+
*
|
|
4
|
+
* `claude -p --input-format stream-json --output-format stream-json` reads
|
|
5
|
+
* JSON lines on stdin and writes JSON lines on stdout. Besides user messages
|
|
6
|
+
* and the conversation stream, both sides exchange `control_request` /
|
|
7
|
+
* `control_response` frames:
|
|
8
|
+
*
|
|
9
|
+
* - The host sends one `initialize` request first. It carries the system
|
|
10
|
+
* prompt, the structured-output schema, the skills to enable and the names
|
|
11
|
+
* of the MCP servers the host serves itself.
|
|
12
|
+
* - The CLI sends `mcp_message` requests for those host-served servers. Each
|
|
13
|
+
* wraps one JSON-RPC message (`initialize`, `tools/list`, `tools/call`, a
|
|
14
|
+
* notification). The host answers with the JSON-RPC response. This is how
|
|
15
|
+
* NodeTool's tools run in this process while the CLI drives the loop, with
|
|
16
|
+
* no MCP server listening on a port.
|
|
17
|
+
*
|
|
18
|
+
* This module finds the `claude` executable, turns {@link ClaudeCliOptions}
|
|
19
|
+
* into arguments and the `initialize` request, and runs one session.
|
|
20
|
+
*/
|
|
21
|
+
import { createLogger, importNodeBuiltin } from "@nodetool-ai/config";
|
|
22
|
+
import { isObjectLike, isString } from "@nodetool-ai/protocol";
|
|
23
|
+
const log = createLogger("nodetool.runtime.providers.claude-cli");
|
|
24
|
+
/** The setting and environment variable that pin the CLI executable. */
|
|
25
|
+
export const CLAUDE_CLI_PATH_SETTING = "CLAUDE_CLI_PATH";
|
|
26
|
+
const INSTALL_HINT = "Install Claude Code (https://claude.com/claude-code), run `claude` once in " +
|
|
27
|
+
"a terminal to sign in, or set CLAUDE_CLI_PATH to the executable.";
|
|
28
|
+
/** How much of stderr is kept for an error message. */
|
|
29
|
+
const STDERR_TAIL_CHARS = 8192;
|
|
30
|
+
/** How long a finished session may take to exit before it is stopped. */
|
|
31
|
+
const RESULT_EXIT_GRACE_MS = 10_000;
|
|
32
|
+
// ---------------------------------------------------------------------------
|
|
33
|
+
// Arguments and the initialize request
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
/** The command-line arguments for one session. */
|
|
36
|
+
export function buildCliArgs(options) {
|
|
37
|
+
const args = [
|
|
38
|
+
"-p",
|
|
39
|
+
"--output-format",
|
|
40
|
+
"stream-json",
|
|
41
|
+
"--verbose",
|
|
42
|
+
"--input-format",
|
|
43
|
+
"stream-json"
|
|
44
|
+
];
|
|
45
|
+
if (options.model)
|
|
46
|
+
args.push("--model", options.model);
|
|
47
|
+
if (options.maxTurns)
|
|
48
|
+
args.push("--max-turns", String(options.maxTurns));
|
|
49
|
+
if (options.effort)
|
|
50
|
+
args.push("--effort", options.effort);
|
|
51
|
+
const thinking = options.thinking;
|
|
52
|
+
if (thinking?.type === "enabled") {
|
|
53
|
+
args.push("--max-thinking-tokens", String(thinking.budgetTokens));
|
|
54
|
+
}
|
|
55
|
+
else if (thinking) {
|
|
56
|
+
args.push("--thinking", thinking.type);
|
|
57
|
+
}
|
|
58
|
+
if (options.outputFormat) {
|
|
59
|
+
args.push("--json-schema", JSON.stringify(options.outputFormat.schema));
|
|
60
|
+
}
|
|
61
|
+
// A skill runs through the `Skill` tool, which asks for permission per
|
|
62
|
+
// skill. Allow exactly the enabled ones.
|
|
63
|
+
const allowed = [
|
|
64
|
+
...options.allowedTools,
|
|
65
|
+
...options.skills.map((name) => `Skill(${name})`)
|
|
66
|
+
];
|
|
67
|
+
if (allowed.length > 0)
|
|
68
|
+
args.push("--allowedTools", allowed.join(","));
|
|
69
|
+
if (options.disallowedTools.length > 0) {
|
|
70
|
+
args.push("--disallowedTools", options.disallowedTools.join(","));
|
|
71
|
+
}
|
|
72
|
+
args.push("--tools", options.tools.join(","));
|
|
73
|
+
args.push(`--setting-sources=${options.settingSources.join(",")}`);
|
|
74
|
+
if (options.strictMcpConfig)
|
|
75
|
+
args.push("--strict-mcp-config");
|
|
76
|
+
args.push("--permission-mode", options.permissionMode);
|
|
77
|
+
if (options.allowDangerouslySkipPermissions) {
|
|
78
|
+
args.push("--allow-dangerously-skip-permissions");
|
|
79
|
+
}
|
|
80
|
+
if (options.includePartialMessages)
|
|
81
|
+
args.push("--include-partial-messages");
|
|
82
|
+
for (const plugin of options.plugins ?? []) {
|
|
83
|
+
args.push(plugin.skipMcpDiscovery ? "--plugin-dir-no-mcp" : "--plugin-dir", plugin.path);
|
|
84
|
+
}
|
|
85
|
+
if (options.resume)
|
|
86
|
+
args.push(`--resume=${options.resume}`);
|
|
87
|
+
return args;
|
|
88
|
+
}
|
|
89
|
+
/** The first control request: what argv cannot carry or should not. */
|
|
90
|
+
export function buildInitializeRequest(options) {
|
|
91
|
+
const servers = Object.keys(options.mcpServers ?? {});
|
|
92
|
+
return {
|
|
93
|
+
subtype: "initialize",
|
|
94
|
+
// On stdin rather than argv: a long prompt would exceed the Windows
|
|
95
|
+
// command-line limit.
|
|
96
|
+
systemPrompt: [options.systemPrompt],
|
|
97
|
+
sdkMcpServers: servers.length > 0 ? servers : undefined,
|
|
98
|
+
jsonSchema: options.outputFormat?.schema,
|
|
99
|
+
skills: options.skills
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
/** One user turn as the stream-json input line expects it. */
|
|
103
|
+
export function userMessageLine(prompt) {
|
|
104
|
+
return {
|
|
105
|
+
type: "user",
|
|
106
|
+
session_id: "",
|
|
107
|
+
parent_tool_use_id: null,
|
|
108
|
+
message: {
|
|
109
|
+
role: "user",
|
|
110
|
+
content: isString(prompt) ? [{ type: "text", text: prompt }] : prompt
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
// ---------------------------------------------------------------------------
|
|
115
|
+
// Host-served MCP over the control channel
|
|
116
|
+
// ---------------------------------------------------------------------------
|
|
117
|
+
/** The MCP protocol revision answered when the CLI names none. */
|
|
118
|
+
const MCP_PROTOCOL_VERSION = "2025-06-18";
|
|
119
|
+
/**
|
|
120
|
+
* Answer one JSON-RPC message for a host-served server. Notifications get the
|
|
121
|
+
* empty acknowledgement the control channel expects.
|
|
122
|
+
*/
|
|
123
|
+
export async function handleMcpMessage(server, message) {
|
|
124
|
+
if (message.id === undefined || message.id === null) {
|
|
125
|
+
return { jsonrpc: "2.0", result: {}, id: 0 };
|
|
126
|
+
}
|
|
127
|
+
const id = message.id;
|
|
128
|
+
const reply = (result) => ({ jsonrpc: "2.0", id, result });
|
|
129
|
+
const fail = (code, text) => ({
|
|
130
|
+
jsonrpc: "2.0",
|
|
131
|
+
id,
|
|
132
|
+
error: { code, message: text }
|
|
133
|
+
});
|
|
134
|
+
switch (message.method) {
|
|
135
|
+
case "initialize": {
|
|
136
|
+
const requested = message.params?.protocolVersion;
|
|
137
|
+
return reply({
|
|
138
|
+
protocolVersion: isString(requested) ? requested : MCP_PROTOCOL_VERSION,
|
|
139
|
+
capabilities: { tools: {} },
|
|
140
|
+
serverInfo: { name: server.name, version: server.version }
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
case "ping":
|
|
144
|
+
return reply({});
|
|
145
|
+
case "tools/list":
|
|
146
|
+
return reply({
|
|
147
|
+
tools: server.tools.map((tool) => ({
|
|
148
|
+
name: tool.name,
|
|
149
|
+
description: tool.description,
|
|
150
|
+
inputSchema: tool.inputSchema
|
|
151
|
+
}))
|
|
152
|
+
});
|
|
153
|
+
case "tools/call": {
|
|
154
|
+
const name = message.params?.name;
|
|
155
|
+
const tool = server.tools.find((t) => t.name === name);
|
|
156
|
+
if (!tool)
|
|
157
|
+
return fail(-32602, `Unknown tool: ${String(name)}`);
|
|
158
|
+
const rawArgs = message.params?.arguments;
|
|
159
|
+
const args = isObjectLike(rawArgs) && !Array.isArray(rawArgs)
|
|
160
|
+
? rawArgs
|
|
161
|
+
: {};
|
|
162
|
+
try {
|
|
163
|
+
return reply(await tool.handler(args));
|
|
164
|
+
}
|
|
165
|
+
catch (err) {
|
|
166
|
+
// A tool failure is a result the model reads, not a protocol error.
|
|
167
|
+
return reply({
|
|
168
|
+
content: [
|
|
169
|
+
{ type: "text", text: err instanceof Error ? err.message : String(err) }
|
|
170
|
+
],
|
|
171
|
+
isError: true
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
default:
|
|
176
|
+
return fail(-32601, `Method not found: ${String(message.method)}`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// ---------------------------------------------------------------------------
|
|
180
|
+
// Finding the executable
|
|
181
|
+
// ---------------------------------------------------------------------------
|
|
182
|
+
export class ClaudeCliNotFoundError extends Error {
|
|
183
|
+
constructor(detail) {
|
|
184
|
+
super(`${detail} ${INSTALL_HINT}`);
|
|
185
|
+
this.name = "ClaudeCliNotFoundError";
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Where installers put `claude`, in the order they are tried after PATH. A
|
|
190
|
+
* desktop app started outside a shell often has a PATH without these.
|
|
191
|
+
*/
|
|
192
|
+
export function claudeCliCandidates(lookup) {
|
|
193
|
+
const { platform, homedir, env } = lookup;
|
|
194
|
+
const sep = platform === "win32" ? "\\" : "/";
|
|
195
|
+
const join = (...parts) => parts.join(sep);
|
|
196
|
+
if (platform === "win32") {
|
|
197
|
+
const appData = env["APPDATA"];
|
|
198
|
+
const localAppData = env["LOCALAPPDATA"];
|
|
199
|
+
return [
|
|
200
|
+
join(homedir, ".local", "bin", "claude.exe"),
|
|
201
|
+
...(localAppData
|
|
202
|
+
? [join(localAppData, "Programs", "claude", "claude.exe")]
|
|
203
|
+
: []),
|
|
204
|
+
...(appData ? [join(appData, "npm", "claude.exe")] : []),
|
|
205
|
+
join(homedir, ".bun", "bin", "claude.exe")
|
|
206
|
+
];
|
|
207
|
+
}
|
|
208
|
+
return [
|
|
209
|
+
// The native installer.
|
|
210
|
+
join(homedir, ".local", "bin", "claude"),
|
|
211
|
+
// The older per-user npm install that `claude migrate-installer` made.
|
|
212
|
+
join(homedir, ".claude", "local", "claude"),
|
|
213
|
+
"/opt/homebrew/bin/claude",
|
|
214
|
+
"/usr/local/bin/claude",
|
|
215
|
+
"/usr/bin/claude",
|
|
216
|
+
join(homedir, ".npm-global", "bin", "claude"),
|
|
217
|
+
join(homedir, ".bun", "bin", "claude"),
|
|
218
|
+
join(homedir, ".volta", "bin", "claude")
|
|
219
|
+
];
|
|
220
|
+
}
|
|
221
|
+
/** `claude` on PATH, as each PATH directory would resolve it. */
|
|
222
|
+
export function pathCandidates(lookup) {
|
|
223
|
+
const win = lookup.platform === "win32";
|
|
224
|
+
const pathVar = lookup.env["PATH"] ?? lookup.env["Path"] ?? "";
|
|
225
|
+
const dirs = pathVar.split(win ? ";" : ":").filter(Boolean);
|
|
226
|
+
// Only `.exe` on Windows: an npm `.cmd` shim needs a shell to start, and a
|
|
227
|
+
// shell would re-parse the JSON arguments.
|
|
228
|
+
const names = win ? ["claude.exe"] : ["claude"];
|
|
229
|
+
const sep = win ? "\\" : "/";
|
|
230
|
+
return dirs.flatMap((dir) => names.map((name) => `${dir.replace(/[\\/]+$/, "")}${sep}${name}`));
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* The CLI executable: the configured path when set (it must exist), else the
|
|
234
|
+
* first `claude` on PATH, else the first known install location.
|
|
235
|
+
*/
|
|
236
|
+
export async function resolveClaudeCliPath(configured, lookup) {
|
|
237
|
+
const pinned = configured?.trim();
|
|
238
|
+
if (pinned) {
|
|
239
|
+
if (await lookup.isExecutable(pinned))
|
|
240
|
+
return pinned;
|
|
241
|
+
throw new ClaudeCliNotFoundError(`CLAUDE_CLI_PATH points to ${pinned}, which is not an executable file.`);
|
|
242
|
+
}
|
|
243
|
+
for (const candidate of [
|
|
244
|
+
...pathCandidates(lookup),
|
|
245
|
+
...claudeCliCandidates(lookup)
|
|
246
|
+
]) {
|
|
247
|
+
if (await lookup.isExecutable(candidate))
|
|
248
|
+
return candidate;
|
|
249
|
+
}
|
|
250
|
+
throw new ClaudeCliNotFoundError("The Claude Code CLI (claude) was not found on PATH or in the usual install locations.");
|
|
251
|
+
}
|
|
252
|
+
/** The lookup environment of this process. */
|
|
253
|
+
export async function systemLookupEnv() {
|
|
254
|
+
const [fs, os] = await Promise.all([
|
|
255
|
+
importNodeBuiltin("node:fs/promises"),
|
|
256
|
+
importNodeBuiltin("node:os")
|
|
257
|
+
]);
|
|
258
|
+
if (!fs || !os) {
|
|
259
|
+
throw new ClaudeCliNotFoundError("The Claude Agent provider requires Node.js.");
|
|
260
|
+
}
|
|
261
|
+
const win = process.platform === "win32";
|
|
262
|
+
return {
|
|
263
|
+
platform: process.platform,
|
|
264
|
+
homedir: os.homedir(),
|
|
265
|
+
env: process.env,
|
|
266
|
+
isExecutable: async (file) => {
|
|
267
|
+
try {
|
|
268
|
+
const stat = await fs.stat(file);
|
|
269
|
+
if (!stat.isFile())
|
|
270
|
+
return false;
|
|
271
|
+
if (!win)
|
|
272
|
+
await fs.access(file, fs.constants.X_OK);
|
|
273
|
+
return true;
|
|
274
|
+
}
|
|
275
|
+
catch {
|
|
276
|
+
return false;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
const defaultSpawn = async (command, args, options) => {
|
|
282
|
+
const cp = await importNodeBuiltin("node:child_process");
|
|
283
|
+
if (!cp)
|
|
284
|
+
throw new ClaudeCliNotFoundError("The Claude Agent provider requires Node.js.");
|
|
285
|
+
return cp.spawn(command, args, {
|
|
286
|
+
cwd: options.cwd,
|
|
287
|
+
env: options.env,
|
|
288
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
289
|
+
windowsHide: true
|
|
290
|
+
});
|
|
291
|
+
};
|
|
292
|
+
/** A failed session. Carries the CLI's stderr tail when there is one. */
|
|
293
|
+
export class ClaudeCliError extends Error {
|
|
294
|
+
constructor(message) {
|
|
295
|
+
super(message);
|
|
296
|
+
this.name = "ClaudeCliError";
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
/** Async queue bridging stdout callbacks to the generator. */
|
|
300
|
+
class LineQueue {
|
|
301
|
+
items = [];
|
|
302
|
+
waiters = [];
|
|
303
|
+
ended = false;
|
|
304
|
+
failure = null;
|
|
305
|
+
push(item) {
|
|
306
|
+
this.items.push(item);
|
|
307
|
+
this.wake();
|
|
308
|
+
}
|
|
309
|
+
end() {
|
|
310
|
+
this.ended = true;
|
|
311
|
+
this.wake();
|
|
312
|
+
}
|
|
313
|
+
fail(err) {
|
|
314
|
+
this.failure ??= err;
|
|
315
|
+
this.wake();
|
|
316
|
+
}
|
|
317
|
+
wake() {
|
|
318
|
+
for (const waiter of this.waiters.splice(0))
|
|
319
|
+
waiter();
|
|
320
|
+
}
|
|
321
|
+
async *drain() {
|
|
322
|
+
for (;;) {
|
|
323
|
+
const item = this.items.shift();
|
|
324
|
+
if (item !== undefined) {
|
|
325
|
+
yield item;
|
|
326
|
+
continue;
|
|
327
|
+
}
|
|
328
|
+
if (this.failure)
|
|
329
|
+
throw this.failure;
|
|
330
|
+
if (this.ended)
|
|
331
|
+
return;
|
|
332
|
+
await new Promise((resolve) => this.waiters.push(resolve));
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Start `claude`, send the initialize request and the prompt, answer the
|
|
338
|
+
* CLI's control requests, and yield every conversation message. Stdin is
|
|
339
|
+
* closed after the first `result`, which ends the process. Aborting the
|
|
340
|
+
* options' controller kills it.
|
|
341
|
+
*/
|
|
342
|
+
export async function* runClaudeCli(params) {
|
|
343
|
+
const { options } = params;
|
|
344
|
+
const signal = options.abortController.signal;
|
|
345
|
+
if (signal.aborted)
|
|
346
|
+
return;
|
|
347
|
+
const args = buildCliArgs(options);
|
|
348
|
+
const env = { ...options.env };
|
|
349
|
+
// An inherited NODE_OPTIONS (Electron sets some) breaks an npm-installed CLI.
|
|
350
|
+
delete env["NODE_OPTIONS"];
|
|
351
|
+
log.debug("Spawning Claude CLI", { cliPath: params.cliPath });
|
|
352
|
+
const child = await (params.spawn ?? defaultSpawn)(params.cliPath, args, {
|
|
353
|
+
cwd: options.cwd,
|
|
354
|
+
env
|
|
355
|
+
});
|
|
356
|
+
let stderrTail = "";
|
|
357
|
+
child.stderr.setEncoding?.("utf8");
|
|
358
|
+
child.stderr.on("data", (data) => {
|
|
359
|
+
stderrTail = (stderrTail + String(data)).slice(-STDERR_TAIL_CHARS);
|
|
360
|
+
});
|
|
361
|
+
const withStderr = (message) => {
|
|
362
|
+
const tail = stderrTail.trim();
|
|
363
|
+
return tail ? `${message}. stderr: ${tail}` : message;
|
|
364
|
+
};
|
|
365
|
+
const queue = new LineQueue();
|
|
366
|
+
let sawResult = false;
|
|
367
|
+
let stdinOpen = true;
|
|
368
|
+
const write = (frame) => {
|
|
369
|
+
if (!stdinOpen)
|
|
370
|
+
return;
|
|
371
|
+
child.stdin.write(`${JSON.stringify(frame)}\n`);
|
|
372
|
+
};
|
|
373
|
+
const endInput = () => {
|
|
374
|
+
if (!stdinOpen)
|
|
375
|
+
return;
|
|
376
|
+
stdinOpen = false;
|
|
377
|
+
child.stdin.end();
|
|
378
|
+
};
|
|
379
|
+
child.stdin.on("error", () => {
|
|
380
|
+
// The process may exit before reading stdin. Its exit status reports why.
|
|
381
|
+
stdinOpen = false;
|
|
382
|
+
});
|
|
383
|
+
child.once("error", (err) => {
|
|
384
|
+
queue.fail(err.code === "ENOENT"
|
|
385
|
+
? new ClaudeCliNotFoundError(`The Claude Code CLI was not found at ${params.cliPath}.`)
|
|
386
|
+
: new ClaudeCliError(`Failed to start the Claude Code CLI: ${err.message}`));
|
|
387
|
+
});
|
|
388
|
+
const servers = options.mcpServers ?? {};
|
|
389
|
+
const answerControlRequest = async (frame) => {
|
|
390
|
+
const { request } = frame;
|
|
391
|
+
let response;
|
|
392
|
+
try {
|
|
393
|
+
if (request.subtype !== "mcp_message") {
|
|
394
|
+
throw new Error(`Unsupported control request: ${request.subtype}`);
|
|
395
|
+
}
|
|
396
|
+
const server = servers[request.server_name ?? ""];
|
|
397
|
+
if (!server)
|
|
398
|
+
throw new Error(`Unknown MCP server: ${String(request.server_name)}`);
|
|
399
|
+
response = {
|
|
400
|
+
subtype: "success",
|
|
401
|
+
request_id: frame.request_id,
|
|
402
|
+
response: { mcp_response: await handleMcpMessage(server, request.message ?? {}) }
|
|
403
|
+
};
|
|
404
|
+
}
|
|
405
|
+
catch (err) {
|
|
406
|
+
response = {
|
|
407
|
+
subtype: "error",
|
|
408
|
+
request_id: frame.request_id,
|
|
409
|
+
error: err instanceof Error ? err.message : String(err)
|
|
410
|
+
};
|
|
411
|
+
}
|
|
412
|
+
write({ type: "control_response", response });
|
|
413
|
+
};
|
|
414
|
+
const initRequestId = `init_${crypto.randomUUID()}`;
|
|
415
|
+
const onLine = (line) => {
|
|
416
|
+
const trimmed = line.trim();
|
|
417
|
+
if (!trimmed.startsWith("{"))
|
|
418
|
+
return;
|
|
419
|
+
let frame;
|
|
420
|
+
try {
|
|
421
|
+
frame = JSON.parse(trimmed);
|
|
422
|
+
}
|
|
423
|
+
catch {
|
|
424
|
+
log.debug("Skipping a non-JSON Claude CLI output line");
|
|
425
|
+
return;
|
|
426
|
+
}
|
|
427
|
+
if (!isObjectLike(frame) || !isString(frame.type))
|
|
428
|
+
return;
|
|
429
|
+
const typed = frame;
|
|
430
|
+
if (typed.type === "control_request") {
|
|
431
|
+
void answerControlRequest(typed);
|
|
432
|
+
return;
|
|
433
|
+
}
|
|
434
|
+
if (typed.type === "control_response") {
|
|
435
|
+
const response = typed.response;
|
|
436
|
+
if (response.request_id === initRequestId && response.subtype === "error") {
|
|
437
|
+
queue.fail(new ClaudeCliError(`Claude Code rejected the session: ${response.error ?? "unknown error"}`));
|
|
438
|
+
}
|
|
439
|
+
return;
|
|
440
|
+
}
|
|
441
|
+
if (typed.type === "control_cancel_request" || typed.type === "keep_alive")
|
|
442
|
+
return;
|
|
443
|
+
if (typed.type === "result") {
|
|
444
|
+
sawResult = true;
|
|
445
|
+
// One prompt per session: the first result ends it.
|
|
446
|
+
endInput();
|
|
447
|
+
setTimeout(() => child.kill("SIGTERM"), RESULT_EXIT_GRACE_MS).unref?.();
|
|
448
|
+
}
|
|
449
|
+
queue.push(typed);
|
|
450
|
+
};
|
|
451
|
+
const readline = await importNodeBuiltin("node:readline");
|
|
452
|
+
if (!readline)
|
|
453
|
+
throw new ClaudeCliNotFoundError("The Claude Agent provider requires Node.js.");
|
|
454
|
+
const lines = readline.createInterface({ input: child.stdout, crlfDelay: Infinity });
|
|
455
|
+
lines.on("line", onLine);
|
|
456
|
+
child.once("close", (code, exitSignal) => {
|
|
457
|
+
if (signal.aborted || sawResult) {
|
|
458
|
+
queue.end();
|
|
459
|
+
}
|
|
460
|
+
else if (code !== 0) {
|
|
461
|
+
queue.fail(new ClaudeCliError(withStderr(exitSignal
|
|
462
|
+
? `Claude Code CLI was terminated by ${exitSignal}`
|
|
463
|
+
: `Claude Code CLI exited with code ${code}`)));
|
|
464
|
+
}
|
|
465
|
+
else {
|
|
466
|
+
queue.fail(new ClaudeCliError(withStderr("Claude Code CLI exited without a result")));
|
|
467
|
+
}
|
|
468
|
+
});
|
|
469
|
+
const onAbort = () => {
|
|
470
|
+
endInput();
|
|
471
|
+
child.kill("SIGTERM");
|
|
472
|
+
};
|
|
473
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
474
|
+
write({ type: "control_request", request_id: initRequestId, request: buildInitializeRequest(options) });
|
|
475
|
+
write(userMessageLine(params.prompt));
|
|
476
|
+
try {
|
|
477
|
+
yield* queue.drain();
|
|
478
|
+
}
|
|
479
|
+
finally {
|
|
480
|
+
signal.removeEventListener("abort", onAbort);
|
|
481
|
+
lines.close();
|
|
482
|
+
endInput();
|
|
483
|
+
// A consumer that stopped early leaves the process running its loop.
|
|
484
|
+
if (!sawResult || signal.aborted)
|
|
485
|
+
child.kill("SIGTERM");
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
//# sourceMappingURL=claude-cli.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-cli.js","sourceRoot":"","sources":["../../src/providers/claude-cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,6 +18,12 @@
|
|
|
18
18
|
import { OpenAIProvider } from "./openai-provider.js";
|
|
19
19
|
import type { ImageModel, LanguageModel, Message, ProviderStreamItem, ProviderTool, TextToImageParams } from "./types.js";
|
|
20
20
|
import type { ProviderCapability } from "./base-provider.js";
|
|
21
|
+
/**
|
|
22
|
+
* The models the Codex CLI lists in its picker, mirrored from its bundled
|
|
23
|
+
* `models.json` (entries with `visibility: "list"`). Shown only when the live
|
|
24
|
+
* `/models` listing is unavailable.
|
|
25
|
+
*/
|
|
26
|
+
export declare const CODEX_FALLBACK_MODELS: LanguageModel[];
|
|
21
27
|
/** Remove tokenizer control markers that can arrive in untrusted tool output. */
|
|
22
28
|
export declare function sanitizeCodexControlTokens(text: string): string;
|
|
23
29
|
export declare class CodexProvider extends OpenAIProvider {
|
|
@@ -33,8 +39,9 @@ export declare class CodexProvider extends OpenAIProvider {
|
|
|
33
39
|
/** The OAuth bearer is short-lived — never leak it into a container env. */
|
|
34
40
|
getContainerEnv(): {};
|
|
35
41
|
/**
|
|
36
|
-
* Return the account- and version-specific models served by Codex
|
|
37
|
-
*
|
|
42
|
+
* Return the account- and version-specific models served by Codex, minus
|
|
43
|
+
* the ones Codex itself hides from its picker. Use {@link CODEX_FALLBACK_MODELS}
|
|
44
|
+
* only when the live listing is unavailable or empty.
|
|
38
45
|
*/
|
|
39
46
|
getAvailableLanguageModels(): Promise<LanguageModel[]>;
|
|
40
47
|
hasToolSupport(): Promise<boolean>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex-provider.d.ts","sourceRoot":"","sources":["../../src/providers/codex-provider.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAYH,OAAO,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"codex-provider.d.ts","sourceRoot":"","sources":["../../src/providers/codex-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
import OpenAI from "openai";
|
|
19
19
|
import { createLogger } from "@nodetool-ai/config";
|
|
20
20
|
import { CODEX_BACKEND_BASE_URL, CODEX_DEFAULT_ORIGINATOR, CODEX_CLIENT_VERSION, PROVIDER_IDS, isString } from "@nodetool-ai/protocol";
|
|
21
|
-
import { OpenAIProvider
|
|
21
|
+
import { OpenAIProvider } from "./openai-provider.js";
|
|
22
22
|
import { extractChatGptAccountId } from "./oauth/jwt-claims.js";
|
|
23
23
|
import { isProviderSessionUpdate, isProviderMessageEvent, isProviderStop } from "./types.js";
|
|
24
24
|
const log = createLogger("nodetool.runtime.codex");
|
|
@@ -28,6 +28,21 @@ const log = createLogger("nodetool.runtime.codex");
|
|
|
28
28
|
* Responses built-in `image_generation` tool from a normal chat model.
|
|
29
29
|
*/
|
|
30
30
|
const CODEX_IMAGE_ORCHESTRATOR_MODEL = "gpt-5.5";
|
|
31
|
+
/**
|
|
32
|
+
* The models the Codex CLI lists in its picker, mirrored from its bundled
|
|
33
|
+
* `models.json` (entries with `visibility: "list"`). Shown only when the live
|
|
34
|
+
* `/models` listing is unavailable.
|
|
35
|
+
*/
|
|
36
|
+
export const CODEX_FALLBACK_MODELS = [
|
|
37
|
+
["gpt-6.1-sol", "GPT-6.1-Sol"],
|
|
38
|
+
["gpt-6-sol", "GPT-6-Sol"],
|
|
39
|
+
["gpt-6-luna", "GPT-6-Luna"],
|
|
40
|
+
["gpt-6-astra", "GPT-6-Astra"],
|
|
41
|
+
["gpt-5.6-sol", "GPT-5.6-Sol"],
|
|
42
|
+
["gpt-5.6-terra", "GPT-5.6-Terra"],
|
|
43
|
+
["gpt-5.6-luna", "GPT-5.6-Luna"],
|
|
44
|
+
["gpt-5.5", "GPT-5.5"]
|
|
45
|
+
].map(([id, name]) => ({ id, name, provider: PROVIDER_IDS.CODEX }));
|
|
31
46
|
const CODEX_CONTROL_TOKEN = /<\|(?:endoftext|endofprompt|startoftext)\|>/g;
|
|
32
47
|
/** Remove tokenizer control markers that can arrive in untrusted tool output. */
|
|
33
48
|
export function sanitizeCodexControlTokens(text) {
|
|
@@ -92,33 +107,32 @@ export class CodexProvider extends OpenAIProvider {
|
|
|
92
107
|
return {};
|
|
93
108
|
}
|
|
94
109
|
/**
|
|
95
|
-
* Return the account- and version-specific models served by Codex
|
|
96
|
-
*
|
|
110
|
+
* Return the account- and version-specific models served by Codex, minus
|
|
111
|
+
* the ones Codex itself hides from its picker. Use {@link CODEX_FALLBACK_MODELS}
|
|
112
|
+
* only when the live listing is unavailable or empty.
|
|
97
113
|
*/
|
|
98
114
|
async getAvailableLanguageModels() {
|
|
99
|
-
const fallback = OPENAI_FALLBACK_MODELS.map((model) => ({
|
|
100
|
-
...model,
|
|
101
|
-
provider: PROVIDER_IDS.CODEX
|
|
102
|
-
}));
|
|
103
115
|
try {
|
|
104
116
|
const url = `${CODEX_BACKEND_BASE_URL}/models?client_version=${encodeURIComponent(codexClientVersion())}`;
|
|
105
117
|
const res = await fetch(url, {
|
|
106
118
|
headers: this.buildHeaders("application/json")
|
|
107
119
|
});
|
|
108
120
|
if (!res.ok)
|
|
109
|
-
return
|
|
121
|
+
return CODEX_FALLBACK_MODELS;
|
|
110
122
|
const payload = (await res.json());
|
|
111
123
|
const models = (payload.models ?? [])
|
|
112
|
-
.filter((m) => typeof m.slug === "string" &&
|
|
124
|
+
.filter((m) => typeof m.slug === "string" &&
|
|
125
|
+
m.slug.length > 0 &&
|
|
126
|
+
m.visibility !== "hide")
|
|
113
127
|
.map((m) => ({
|
|
114
128
|
id: m.slug,
|
|
115
129
|
name: m.display_name ?? m.slug,
|
|
116
130
|
provider: PROVIDER_IDS.CODEX
|
|
117
131
|
}));
|
|
118
|
-
return models.length > 0 ? models :
|
|
132
|
+
return models.length > 0 ? models : CODEX_FALLBACK_MODELS;
|
|
119
133
|
}
|
|
120
134
|
catch {
|
|
121
|
-
return
|
|
135
|
+
return CODEX_FALLBACK_MODELS;
|
|
122
136
|
}
|
|
123
137
|
}
|
|
124
138
|
async hasToolSupport() {
|