@nodetool-ai/cli-chat 0.0.0-stage → 0.8.9-beta.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.
Files changed (107) hide show
  1. package/README.md +13 -2
  2. package/dist/.nodetool-build-stamp +1 -0
  3. package/dist/ExecutionTree.d.ts +20 -0
  4. package/dist/ExecutionTree.d.ts.map +1 -0
  5. package/dist/ExecutionTree.js +100 -0
  6. package/dist/ExecutionTree.js.map +1 -0
  7. package/dist/agent-toolbelt.d.ts +15 -0
  8. package/dist/agent-toolbelt.d.ts.map +1 -0
  9. package/dist/agent-toolbelt.js +28 -0
  10. package/dist/agent-toolbelt.js.map +1 -0
  11. package/dist/app.d.ts +40 -0
  12. package/dist/app.d.ts.map +1 -0
  13. package/dist/app.js +1070 -0
  14. package/dist/app.js.map +1 -0
  15. package/dist/bash-tool.d.ts +13 -0
  16. package/dist/bash-tool.d.ts.map +1 -0
  17. package/dist/bash-tool.js +85 -0
  18. package/dist/bash-tool.js.map +1 -0
  19. package/dist/chat-codeact.d.ts +93 -0
  20. package/dist/chat-codeact.d.ts.map +1 -0
  21. package/dist/chat-codeact.js +179 -0
  22. package/dist/chat-codeact.js.map +1 -0
  23. package/dist/chat-context.d.ts +18 -0
  24. package/dist/chat-context.d.ts.map +1 -0
  25. package/dist/chat-context.js +32 -0
  26. package/dist/chat-context.js.map +1 -0
  27. package/dist/chat-entry.d.ts +13 -0
  28. package/dist/chat-entry.d.ts.map +1 -0
  29. package/dist/chat-entry.js +233 -0
  30. package/dist/chat-entry.js.map +1 -0
  31. package/dist/chat-media.d.ts +3 -0
  32. package/dist/chat-media.d.ts.map +1 -0
  33. package/dist/chat-media.js +46 -0
  34. package/dist/chat-media.js.map +1 -0
  35. package/dist/chat-prompts.d.ts +20 -0
  36. package/dist/chat-prompts.d.ts.map +1 -0
  37. package/dist/chat-prompts.js +42 -0
  38. package/dist/chat-prompts.js.map +1 -0
  39. package/dist/chat-sessions.d.ts +25 -0
  40. package/dist/chat-sessions.d.ts.map +1 -0
  41. package/dist/chat-sessions.js +153 -0
  42. package/dist/chat-sessions.js.map +1 -0
  43. package/dist/commands/agent.d.ts +33 -0
  44. package/dist/commands/agent.d.ts.map +1 -0
  45. package/dist/commands/agent.js +516 -0
  46. package/dist/commands/agent.js.map +1 -0
  47. package/dist/commands/tools.d.ts +11 -0
  48. package/dist/commands/tools.d.ts.map +1 -0
  49. package/dist/commands/tools.js +206 -0
  50. package/dist/commands/tools.js.map +1 -0
  51. package/dist/diagnose.d.ts +139 -0
  52. package/dist/diagnose.d.ts.map +1 -0
  53. package/dist/diagnose.js +435 -0
  54. package/dist/diagnose.js.map +1 -0
  55. package/dist/index.d.ts +14 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +40 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/markdown.d.ts +9 -0
  60. package/dist/markdown.d.ts.map +1 -0
  61. package/dist/markdown.js +53 -0
  62. package/dist/markdown.js.map +1 -0
  63. package/dist/nodetool.d.ts +3 -0
  64. package/dist/nodetool.d.ts.map +1 -0
  65. package/dist/nodetool.js +4 -0
  66. package/dist/nodetool.js.map +1 -0
  67. package/dist/permission-gate.d.ts +55 -0
  68. package/dist/permission-gate.d.ts.map +1 -0
  69. package/dist/permission-gate.js +118 -0
  70. package/dist/permission-gate.js.map +1 -0
  71. package/dist/readline-input.d.ts +23 -0
  72. package/dist/readline-input.d.ts.map +1 -0
  73. package/dist/readline-input.js +210 -0
  74. package/dist/readline-input.js.map +1 -0
  75. package/dist/settings.d.ts +19 -0
  76. package/dist/settings.d.ts.map +1 -0
  77. package/dist/settings.js +146 -0
  78. package/dist/settings.js.map +1 -0
  79. package/dist/stdin.d.ts +52 -0
  80. package/dist/stdin.d.ts.map +1 -0
  81. package/dist/stdin.js +363 -0
  82. package/dist/stdin.js.map +1 -0
  83. package/dist/terminal-clipboard.d.ts +3 -0
  84. package/dist/terminal-clipboard.d.ts.map +1 -0
  85. package/dist/terminal-clipboard.js +24 -0
  86. package/dist/terminal-clipboard.js.map +1 -0
  87. package/dist/terminal-mouse.d.ts +24 -0
  88. package/dist/terminal-mouse.d.ts.map +1 -0
  89. package/dist/terminal-mouse.js +84 -0
  90. package/dist/terminal-mouse.js.map +1 -0
  91. package/dist/terminal-screen.d.ts +41 -0
  92. package/dist/terminal-screen.d.ts.map +1 -0
  93. package/dist/terminal-screen.js +228 -0
  94. package/dist/terminal-screen.js.map +1 -0
  95. package/dist/tool-format.d.ts +54 -0
  96. package/dist/tool-format.d.ts.map +1 -0
  97. package/dist/tool-format.js +360 -0
  98. package/dist/tool-format.js.map +1 -0
  99. package/dist/useExecutionState.d.ts +44 -0
  100. package/dist/useExecutionState.d.ts.map +1 -0
  101. package/dist/useExecutionState.js +285 -0
  102. package/dist/useExecutionState.js.map +1 -0
  103. package/dist/websocket-client.d.ts +159 -0
  104. package/dist/websocket-client.d.ts.map +1 -0
  105. package/dist/websocket-client.js +677 -0
  106. package/dist/websocket-client.js.map +1 -0
  107. package/package.json +73 -4
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Stdin mode — read chat messages (or agent objectives) from stdin, write responses to stdout.
3
+ *
4
+ * Activated automatically when stdin is not a TTY (i.e. piped input).
5
+ * Each non-empty line is sent as a user message / agent objective.
6
+ * The assistant reply streams to stdout, followed by a newline.
7
+ * Conversation history is preserved across lines within a single session.
8
+ *
9
+ * Supports both direct-provider mode and WebSocket server mode (--url).
10
+ *
11
+ * Slash commands (WebSocket mode only):
12
+ * /run <workflow_id> [json_params] — run a workflow
13
+ * /stop — stop in-progress generation
14
+ * /reconnect <job_id> — reconnect to a running job
15
+ * /cancel <job_id> — cancel a running job
16
+ * /status [job_id] — get job/all-jobs status
17
+ * /new — start a new chat session
18
+ * /compact [instructions] — summarize conversation into retained context
19
+ * /help — show available commands
20
+ */
21
+ import type { BaseProvider } from "@nodetool-ai/runtime";
22
+ import { type PermissionMode } from "@nodetool-ai/agents";
23
+ import type { NodeRegistry } from "@nodetool-ai/node-sdk";
24
+ interface StdinModeOptions {
25
+ provider: string;
26
+ model: string;
27
+ workspaceDir: string;
28
+ wsUrl?: string;
29
+ /** NodeRegistry — currently unused by the unified loop, kept for parity. */
30
+ registry?: NodeRegistry;
31
+ /** Configured BaseProvider instances by id (passed through to subtasks). */
32
+ agentProviders?: Record<string, BaseProvider>;
33
+ /**
34
+ * Expose the read-only `run_search` fan-out primitive alongside
35
+ * `run_subtask`. On by default; set `false` to remove it.
36
+ */
37
+ enableReadOnlySearch?: boolean;
38
+ /** `--permission-mode`. Unset runs `auto`: stdin is the input, not a user. */
39
+ permissionMode?: PermissionMode;
40
+ /** `--cost-cap <usd>`; `0` lifts the cap. Bounds each turn, as chat's does. */
41
+ costCap?: string;
42
+ /** `--timeout <s>`; `0` leaves the turn no time at all. */
43
+ timeout?: string;
44
+ }
45
+ /**
46
+ * Run piped chat until stdin ends. Resolves to the process exit code: 1 when a
47
+ * server turn reported an error, so a script piping into `nodetool chat --url`
48
+ * can tell a failed turn from an answered one.
49
+ */
50
+ export declare function runStdinMode(opts: StdinModeOptions): Promise<number>;
51
+ export {};
52
+ //# sourceMappingURL=stdin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdin.d.ts","sourceRoot":"","sources":["../src/stdin.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAsB,MAAM,sBAAsB,CAAC;AAY7E,OAAO,EAEL,KAAK,cAAc,EACpB,MAAM,qBAAqB,CAAC;AAI7B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAW1D,UAAU,gBAAgB;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4EAA4E;IAC5E,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,4EAA4E;IAC5E,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAC9C;;;OAGG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,8EAA8E;IAC9E,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,+EAA+E;IAC/E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAuJD;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAiO1E"}
package/dist/stdin.js ADDED
@@ -0,0 +1,363 @@
1
+ /**
2
+ * Stdin mode — read chat messages (or agent objectives) from stdin, write responses to stdout.
3
+ *
4
+ * Activated automatically when stdin is not a TTY (i.e. piped input).
5
+ * Each non-empty line is sent as a user message / agent objective.
6
+ * The assistant reply streams to stdout, followed by a newline.
7
+ * Conversation history is preserved across lines within a single session.
8
+ *
9
+ * Supports both direct-provider mode and WebSocket server mode (--url).
10
+ *
11
+ * Slash commands (WebSocket mode only):
12
+ * /run <workflow_id> [json_params] — run a workflow
13
+ * /stop — stop in-progress generation
14
+ * /reconnect <job_id> — reconnect to a running job
15
+ * /cancel <job_id> — cancel a running job
16
+ * /status [job_id] — get job/all-jobs status
17
+ * /new — start a new chat session
18
+ * /compact [instructions] — summarize conversation into retained context
19
+ * /help — show available commands
20
+ */
21
+ import readline from "node:readline";
22
+ import { RUN_BUDGET_CONTEXT_KEY } from "@nodetool-ai/runtime";
23
+ import { processChat } from "@nodetool-ai/chat";
24
+ import { applySystemPrompt, buildCliAgentBelt, createCliCodeActTurn, loadCliSkillCatalog } from "./chat-codeact.js";
25
+ import { createChatContext } from "./chat-context.js";
26
+ import { budgetStopReason, createCliRunBudget } from "@nodetool-ai/cli-execution/run-budget";
27
+ import { isString } from "@nodetool-ai/cli-common/predicates";
28
+ import { PERMISSION_GATE_CONTEXT_KEY } from "@nodetool-ai/agents";
29
+ import { createCliPermissionGate } from "./permission-gate.js";
30
+ import { createProvider } from "@nodetool-ai/cli-providers";
31
+ import { buildCliToolbelt } from "./agent-toolbelt.js";
32
+ import { WebSocketChatClient } from "./websocket-client.js";
33
+ import { isCodeAction, isFormattedTool, toolStatusLabel, formatToolResult, } from "./tool-format.js";
34
+ function parseSlashCommand(line) {
35
+ if (!line.startsWith("/"))
36
+ return null;
37
+ const spaceIdx = line.indexOf(" ");
38
+ if (spaceIdx === -1) {
39
+ return { name: line.slice(1).toLowerCase(), args: "" };
40
+ }
41
+ return {
42
+ name: line.slice(1, spaceIdx).toLowerCase(),
43
+ args: line.slice(spaceIdx + 1).trim()
44
+ };
45
+ }
46
+ async function displayJobEvents(events) {
47
+ for await (const event of events) {
48
+ if (event.type === "job_update") {
49
+ process.stderr.write(`[job] ${event.status}\n`);
50
+ if (event.error) {
51
+ process.stderr.write(`[error] ${event.error}\n`);
52
+ }
53
+ if (event.result) {
54
+ process.stdout.write(JSON.stringify(event.result, null, 2));
55
+ process.stdout.write("\n");
56
+ }
57
+ }
58
+ else if (event.type === "node_update") {
59
+ process.stderr.write(`[node ${event.node_id}] ${event.status}\n`);
60
+ }
61
+ else if (event.type === "output_update") {
62
+ process.stdout.write(JSON.stringify(event.value, null, 2));
63
+ process.stdout.write("\n");
64
+ }
65
+ else if (event.type === "node_progress") {
66
+ const pct = event.total
67
+ ? `${event.progress}/${event.total}`
68
+ : `${event.progress}`;
69
+ process.stderr.write(`[progress ${event.node_id}] ${pct}\n`);
70
+ }
71
+ else if (event.type === "error") {
72
+ process.stderr.write(`Error: ${event.message}\n`);
73
+ break;
74
+ }
75
+ else if (event.type === "done") {
76
+ break;
77
+ }
78
+ }
79
+ }
80
+ async function handleSlashCommand(cmd, wsClient, startNewSession) {
81
+ switch (cmd.name) {
82
+ case "run": {
83
+ // /run <workflow_id> [json_params]
84
+ const parts = cmd.args.split(/\s+/);
85
+ const workflowId = parts[0];
86
+ if (!workflowId) {
87
+ process.stderr.write("Usage: /run <workflow_id> [json_params]\n");
88
+ return;
89
+ }
90
+ let params = {};
91
+ if (parts.length > 1) {
92
+ const jsonStr = parts.slice(1).join(" ");
93
+ try {
94
+ params = JSON.parse(jsonStr);
95
+ }
96
+ catch {
97
+ process.stderr.write(`Invalid JSON params: ${jsonStr}\n`);
98
+ return;
99
+ }
100
+ }
101
+ process.stderr.write(`Running workflow ${workflowId}...\n`);
102
+ await displayJobEvents(wsClient.runJob({ workflowId, params }));
103
+ return;
104
+ }
105
+ case "stop": {
106
+ wsClient.stop();
107
+ process.stderr.write("Stop requested\n");
108
+ return;
109
+ }
110
+ case "reconnect": {
111
+ const jobId = cmd.args.trim();
112
+ if (!jobId) {
113
+ process.stderr.write("Usage: /reconnect <job_id>\n");
114
+ return;
115
+ }
116
+ process.stderr.write(`Reconnecting to job ${jobId}...\n`);
117
+ await displayJobEvents(wsClient.reconnectJob(jobId));
118
+ return;
119
+ }
120
+ case "cancel": {
121
+ const jobId = cmd.args.trim();
122
+ if (!jobId) {
123
+ process.stderr.write("Usage: /cancel <job_id>\n");
124
+ return;
125
+ }
126
+ wsClient.cancelJob(jobId);
127
+ process.stderr.write(`Cancel requested for job ${jobId}\n`);
128
+ return;
129
+ }
130
+ case "status": {
131
+ const jobId = cmd.args.trim() || undefined;
132
+ wsClient.getStatus(jobId);
133
+ process.stderr.write(jobId
134
+ ? `Status requested for job ${jobId}\n`
135
+ : "Status requested for all jobs\n");
136
+ return;
137
+ }
138
+ case "new":
139
+ startNewSession();
140
+ process.stderr.write("New session started\n");
141
+ return;
142
+ case "help":
143
+ process.stdout.write([
144
+ "Available commands:",
145
+ " /run <workflow_id> [json_params] — Run a workflow",
146
+ " /stop — Stop in-progress generation",
147
+ " /reconnect <job_id> — Reconnect to a running job",
148
+ " /cancel <job_id> — Cancel a running job",
149
+ " /status [job_id] — Get job status",
150
+ " /new — Start a new chat session",
151
+ " /compact [instructions] — Summarize conversation into retained context",
152
+ " /help — Show this help",
153
+ "",
154
+ "Any other input is sent as a chat message.",
155
+ ""
156
+ ].join("\n"));
157
+ return;
158
+ default:
159
+ process.stderr.write(`Unknown command: /${cmd.name}. Type /help for available commands.\n`);
160
+ }
161
+ }
162
+ /**
163
+ * Run piped chat until stdin ends. Resolves to the process exit code: 1 when a
164
+ * server turn reported an error, so a script piping into `nodetool chat --url`
165
+ * can tell a failed turn from an answered one.
166
+ */
167
+ export async function runStdinMode(opts) {
168
+ let failed = false;
169
+ const wsClient = opts.wsUrl ? new WebSocketChatClient(opts.wsUrl) : null;
170
+ if (wsClient) {
171
+ await wsClient.connect();
172
+ }
173
+ // Direct mode: create provider once for the session
174
+ const directProvider = wsClient ? null : await createProvider(opts.provider);
175
+ // One gate for the whole session, so an "allow for the rest of this session"
176
+ // answer outlives the line that gave it — the belt below is rebuilt per line.
177
+ // Stdin carries the messages here, so there is nobody to prompt: this is the
178
+ // headless gate, and it says so once. In `--url` mode the server holds the
179
+ // gate for its own belt and this process runs none, so none is built.
180
+ const gate = directProvider
181
+ ? createCliPermissionGate({
182
+ hostName: "nodetool-chat",
183
+ mode: opts.permissionMode,
184
+ interactive: false
185
+ })
186
+ : null;
187
+ // Build the unified-loop toolset for direct mode. `run_subtask` lets the
188
+ // agent decompose work recursively without any flag — the same primitive
189
+ // the websocket server exposes.
190
+ const buildDirectTools = (prov, budget) => {
191
+ if (!prov || !gate)
192
+ return [];
193
+ // The builtin belt. This used to be an `extras` parameter that only the
194
+ // (now removed) `--sandbox` flag ever filled, so a normal CLI run reached
195
+ // the model with nothing on it: no `view_image`, so a headless turn could
196
+ // not look at an image at all, and every `nodetool.media.*` method threw
197
+ // naming a tool the belt did not carry. `createCliCodeActTurn` adds
198
+ // `execute_code` itself and appends `view_image` only if it finds it here,
199
+ // which is why an empty belt silently removed the one channel for pixels.
200
+ return buildCliAgentBelt({
201
+ baseTools: buildCliToolbelt(opts.agentProviders ?? {}, opts.registry),
202
+ provider: prov,
203
+ model: opts.model,
204
+ forwardMessage: (msg) => {
205
+ if (msg.type === "chunk") {
206
+ process.stdout.write(isString(msg.content) ? msg.content : "");
207
+ }
208
+ else if (msg.type === "tool_call_update") {
209
+ process.stderr.write(`[tool] ${msg.name}\n`);
210
+ }
211
+ },
212
+ gate,
213
+ readOnlySearch: opts.enableReadOnlySearch !== false,
214
+ budget
215
+ });
216
+ };
217
+ /**
218
+ * One local turn, in CodeAct: the provider is offered `execute_code`
219
+ * (+ `view_image`) and the toolbelt lives in the sandbox — the same
220
+ * contract a server-side chat session runs on.
221
+ */
222
+ const runCodeActTurn = async (userInput, prov, tools, budget) => {
223
+ const context = await createChatContext({
224
+ workspaceDir: opts.workspaceDir ?? null
225
+ });
226
+ // Loops this file never constructs — a JS script, an `AgentNode` reached
227
+ // through `run_node` — read the gate here instead of building an ungated
228
+ // run of their own (`gateFromContext`).
229
+ if (gate)
230
+ context.set(PERMISSION_GATE_CONTEXT_KEY, gate);
231
+ // The same channel the gate takes: a loop this file never constructs reads
232
+ // the turn's bounds off the context rather than opening its own
233
+ // (invariant I-2).
234
+ context.set(RUN_BUDGET_CONTEXT_KEY, budget);
235
+ const turn = createCliCodeActTurn({
236
+ tools,
237
+ context,
238
+ skillCatalog: await loadCliSkillCatalog(context.userId),
239
+ onToolCall: ({ name }) => {
240
+ process.stderr.write(`[tool] ${name}\n`);
241
+ }
242
+ });
243
+ applySystemPrompt(chatHistory, turn.systemPrompt);
244
+ await processChat({
245
+ userInput,
246
+ messages: chatHistory,
247
+ model: opts.model,
248
+ provider: prov,
249
+ context,
250
+ tools: turn.tools,
251
+ turnBudget: budget,
252
+ callbacks: {
253
+ onChunk: (text) => {
254
+ process.stdout.write(text);
255
+ },
256
+ onToolCall: (tc) => {
257
+ process.stderr.write(isCodeAction(tc.name)
258
+ ? `[tool] Run ${toolStatusLabel(tc.name, tc.args)}\n`
259
+ : `[tool] ${tc.name}\n`);
260
+ },
261
+ onToolResult: (tc, result) => {
262
+ if (!isFormattedTool(tc.name))
263
+ return;
264
+ const preview = formatToolResult(tc.name, tc.args, result);
265
+ process.stderr.write(`[result] ${preview.split("\n")[0]}\n`);
266
+ }
267
+ }
268
+ });
269
+ // A ceiling ended the turn, not the model finishing its answer. Stdout
270
+ // carries the reply, so the reason goes to stderr beside the tool trace.
271
+ const stopReason = budgetStopReason(budget);
272
+ if (stopReason)
273
+ process.stderr.write(`[stopped] ${stopReason}\n`);
274
+ };
275
+ let threadId = crypto.randomUUID();
276
+ let chatHistory = [];
277
+ const startNewSession = () => {
278
+ threadId = crypto.randomUUID();
279
+ chatHistory = [];
280
+ };
281
+ const rl = readline.createInterface({
282
+ input: process.stdin,
283
+ terminal: false
284
+ });
285
+ for await (const line of rl) {
286
+ const trimmed = line.trim();
287
+ if (!trimmed)
288
+ continue;
289
+ // Slash commands — most are WebSocket-only, but /new is local session state.
290
+ const cmd = parseSlashCommand(trimmed);
291
+ if (cmd) {
292
+ if (cmd.name === "new") {
293
+ startNewSession();
294
+ process.stderr.write("New session started\n");
295
+ }
296
+ else if (wsClient) {
297
+ await handleSlashCommand(cmd, wsClient, startNewSession);
298
+ }
299
+ else {
300
+ process.stderr.write("Slash commands require --url (WebSocket mode).\n");
301
+ }
302
+ continue;
303
+ }
304
+ if (wsClient) {
305
+ // --- Regular chat via WebSocket (server handles everything) ---
306
+ for await (const event of wsClient.chat(trimmed, threadId, opts.model, opts.provider, undefined, opts.permissionMode ? { permissionMode: opts.permissionMode } : {})) {
307
+ if (event.type === "chunk") {
308
+ process.stdout.write(event.content);
309
+ }
310
+ else if (event.type === "tool_call") {
311
+ if (isCodeAction(event.name)) {
312
+ process.stderr.write(`[tool] Run ${toolStatusLabel(event.name, event.args)}\n`);
313
+ }
314
+ else {
315
+ const argsStr = Object.keys(event.args).length > 0
316
+ ? JSON.stringify(event.args)
317
+ : "";
318
+ process.stderr.write(`[tool] ${event.name}${argsStr ? `(${argsStr})` : ""}\n`);
319
+ }
320
+ }
321
+ else if (event.type === "tool_result") {
322
+ if (isFormattedTool(event.name)) {
323
+ const preview = formatToolResult(event.name, undefined, event.content);
324
+ process.stderr.write(`[result] ${preview.split("\n")[0]}\n`);
325
+ }
326
+ else {
327
+ const preview = event.content.length > 200
328
+ ? event.content.slice(0, 200) + "..."
329
+ : event.content;
330
+ process.stderr.write(`[result] ${event.name}: ${preview}\n`);
331
+ }
332
+ }
333
+ else if (event.type === "output_update") {
334
+ process.stdout.write(JSON.stringify(event.value, null, 2));
335
+ process.stdout.write("\n");
336
+ }
337
+ else if (event.type === "error") {
338
+ process.stderr.write(`Error: ${event.message}\n`);
339
+ failed = true;
340
+ break;
341
+ }
342
+ else if (event.type === "done") {
343
+ break;
344
+ }
345
+ }
346
+ }
347
+ else {
348
+ // --- Regular chat via direct provider ---
349
+ // One budget per turn, as a server chat turn does: a piped session runs
350
+ // for as long as its input lasts, and one deadline over all of it would
351
+ // stop a later line for time an earlier one spent.
352
+ const budget = await createCliRunBudget({
353
+ ...(opts.costCap !== undefined && { costCap: opts.costCap }),
354
+ ...(opts.timeout !== undefined && { timeout: opts.timeout })
355
+ });
356
+ await runCodeActTurn(trimmed, directProvider, buildDirectTools(directProvider, budget), budget);
357
+ }
358
+ process.stdout.write("\n");
359
+ }
360
+ wsClient?.disconnect();
361
+ return failed ? 1 : 0;
362
+ }
363
+ //# sourceMappingURL=stdin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdin.js","sourceRoot":"","sources":["../src/stdin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Copy locally when a clipboard program is available, then use OSC 52 as fallback. */
2
+ export declare function copyTerminalText(value: string, output: NodeJS.WriteStream, platform?: NodeJS.Platform): Promise<void>;
3
+ //# sourceMappingURL=terminal-clipboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-clipboard.d.ts","sourceRoot":"","sources":["../src/terminal-clipboard.ts"],"names":[],"mappings":"AAEA,uFAAuF;AACvF,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,CAAC,WAAW,EAC1B,QAAQ,kBAAmB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAkBf"}
@@ -0,0 +1,24 @@
1
+ import { spawn } from "node:child_process";
2
+ /** Copy locally when a clipboard program is available, then use OSC 52 as fallback. */
3
+ export async function copyTerminalText(value, output, platform = process.platform) {
4
+ const candidates = platform === "darwin"
5
+ ? [["pbcopy"]]
6
+ : platform === "win32"
7
+ ? [["clip"]]
8
+ : [["wl-copy"], ["xclip", "-selection", "clipboard"], ["xsel", "--clipboard", "--input"]];
9
+ for (const [command, ...args] of candidates) {
10
+ if (!command)
11
+ continue;
12
+ const copied = await new Promise((resolve) => {
13
+ const child = spawn(command, args, { stdio: ["pipe", "ignore", "ignore"] });
14
+ child.on("error", () => resolve(false));
15
+ child.on("close", (code) => resolve(code === 0));
16
+ child.stdin.on("error", () => resolve(false));
17
+ child.stdin.end(value);
18
+ });
19
+ if (copied)
20
+ return;
21
+ }
22
+ output.write(`\u001b]52;c;${Buffer.from(value).toString("base64")}\u0007`);
23
+ }
24
+ //# sourceMappingURL=terminal-clipboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-clipboard.js","sourceRoot":"","sources":["../src/terminal-clipboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,uFAAuF;AACvF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAa,EACb,MAA0B,EAC1B,QAAQ,GAAG,OAAO,CAAC,QAAQ;IAE3B,MAAM,UAAU,GAAG,QAAQ,KAAK,QAAQ;QACtC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACd,CAAC,CAAC,QAAQ,KAAK,OAAO;YACpB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YACZ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,CAAC,CAAC,CAAC;IAC9F,KAAK,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,IAAI,UAAU,EAAE,CAAC;QAC5C,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,MAAM,MAAM,GAAG,MAAM,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,EAAE;YACpD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC5E,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;YACxC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;YACjD,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;YAC9C,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QACH,IAAI,MAAM;YAAE,OAAO;IACrB,CAAC;IACD,MAAM,CAAC,KAAK,CAAC,eAAe,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AAC7E,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { EventEmitter } from "node:events";
2
+ import { PassThrough } from "node:stream";
3
+ export interface MouseEvent {
4
+ readonly action: "down" | "move" | "up" | "wheel";
5
+ readonly x: number;
6
+ readonly y: number;
7
+ readonly direction?: -1 | 1;
8
+ }
9
+ export declare class MouseInput extends PassThrough {
10
+ private readonly source;
11
+ readonly events: EventEmitter<[never]>;
12
+ readonly isTTY: boolean;
13
+ private pending;
14
+ private readonly decoder;
15
+ private flushTimer;
16
+ constructor(source: NodeJS.ReadStream);
17
+ get isRaw(): boolean;
18
+ setRawMode(raw: boolean): this;
19
+ ref(): this;
20
+ unref(): this;
21
+ close(): void;
22
+ private readonly receive;
23
+ }
24
+ //# sourceMappingURL=terminal-mouse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-mouse.d.ts","sourceRoot":"","sources":["../src/terminal-mouse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG1C,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC;IAClD,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;CAC7B;AAKD,qBAAa,UAAW,SAAQ,WAAW;IAO7B,OAAO,CAAC,QAAQ,CAAC,MAAM;IANnC,QAAQ,CAAC,MAAM,wBAAsB;IACrC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,OAAO,CAAC,OAAO,CAAM;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;IACrD,OAAO,CAAC,UAAU,CAA4C;IAE9D,YAA6B,MAAM,EAAE,MAAM,CAAC,UAAU,EAIrD;IAED,IAAI,KAAK,IAAI,OAAO,CAEnB;IAED,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAG7B;IAED,GAAG,IAAI,IAAI,CAGV;IAED,KAAK,IAAI,IAAI,CAGZ;IAED,KAAK,IAAI,IAAI,CAIZ;IAED,OAAO,CAAC,QAAQ,CAAC,OAAO,CAsCtB;CACH"}
@@ -0,0 +1,84 @@
1
+ import { EventEmitter } from "node:events";
2
+ import { PassThrough } from "node:stream";
3
+ import { StringDecoder } from "node:string_decoder";
4
+ const ESC = String.fromCharCode(27);
5
+ const MOUSE_PREFIX = `${ESC}[<`;
6
+ export class MouseInput extends PassThrough {
7
+ source;
8
+ events = new EventEmitter();
9
+ isTTY;
10
+ pending = "";
11
+ decoder = new StringDecoder("utf8");
12
+ flushTimer;
13
+ constructor(source) {
14
+ super();
15
+ this.source = source;
16
+ this.isTTY = Boolean(source.isTTY);
17
+ source.on("data", this.receive);
18
+ }
19
+ get isRaw() {
20
+ return Boolean(this.source.isRaw);
21
+ }
22
+ setRawMode(raw) {
23
+ this.source.setRawMode(raw);
24
+ return this;
25
+ }
26
+ ref() {
27
+ this.source.ref();
28
+ return this;
29
+ }
30
+ unref() {
31
+ this.source.unref();
32
+ return this;
33
+ }
34
+ close() {
35
+ this.source.off("data", this.receive);
36
+ if (this.flushTimer)
37
+ clearTimeout(this.flushTimer);
38
+ this.end();
39
+ }
40
+ receive = (chunk) => {
41
+ this.pending += Buffer.isBuffer(chunk) ? this.decoder.write(chunk) : chunk;
42
+ let keyboard = "";
43
+ while (this.pending) {
44
+ const start = this.pending.indexOf(MOUSE_PREFIX);
45
+ if (start < 0) {
46
+ const possible = [MOUSE_PREFIX, `${ESC}[`, ESC].find((prefix) => this.pending.endsWith(prefix)) ?? "";
47
+ keyboard += this.pending.slice(0, this.pending.length - possible.length);
48
+ this.pending = possible;
49
+ break;
50
+ }
51
+ keyboard += this.pending.slice(0, start);
52
+ this.pending = this.pending.slice(start);
53
+ const match = /^(\d+);(\d+);(\d+)([Mm])/.exec(this.pending.slice(MOUSE_PREFIX.length));
54
+ if (match) {
55
+ this.pending = this.pending.slice(MOUSE_PREFIX.length + match[0].length);
56
+ const code = Number(match[1]);
57
+ const x = Number(match[2]);
58
+ const y = Number(match[3]);
59
+ if (code === 64 || code === 65) {
60
+ this.events.emit("mouse", { action: "wheel", x, y, direction: code === 64 ? -1 : 1 });
61
+ }
62
+ else if ((code & 3) === 0 || match[4] === "m") {
63
+ this.events.emit("mouse", { action: match[4] === "m" ? "up" : (code & 32) ? "move" : "down", x, y });
64
+ }
65
+ continue;
66
+ }
67
+ if (/^[\d;]*$/.test(this.pending.slice(MOUSE_PREFIX.length)))
68
+ break;
69
+ keyboard += this.pending[0];
70
+ this.pending = this.pending.slice(1);
71
+ }
72
+ if (keyboard)
73
+ this.write(keyboard);
74
+ if (this.flushTimer)
75
+ clearTimeout(this.flushTimer);
76
+ if (this.pending) {
77
+ this.flushTimer = setTimeout(() => {
78
+ this.write(this.pending);
79
+ this.pending = "";
80
+ }, 40);
81
+ }
82
+ };
83
+ }
84
+ //# sourceMappingURL=terminal-mouse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-mouse.js","sourceRoot":"","sources":["../src/terminal-mouse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import React from "react";
2
+ import type { EventEmitter } from "node:events";
3
+ export interface ChatMessage {
4
+ readonly id: string;
5
+ readonly role: "user" | "assistant" | "tool" | "system";
6
+ readonly content: string;
7
+ readonly toolName?: string;
8
+ readonly toolArgs?: Record<string, unknown>;
9
+ readonly rendered?: string;
10
+ }
11
+ /** Remove terminal commands from external text before adding our own styling. */
12
+ export declare function terminalText(text: string): string;
13
+ export declare function terminalLines(text: string, width: number): string[];
14
+ export declare function useTerminalSize(): {
15
+ columns: number;
16
+ rows: number;
17
+ };
18
+ /** Restore the caller's screen even when Ink exits through a signal. */
19
+ export declare function enterTerminalScreen(output: NodeJS.WriteStream): () => void;
20
+ export declare function messageLines(message: ChatMessage, width: number, details: boolean): string[];
21
+ interface TranscriptProps {
22
+ readonly messages: readonly ChatMessage[];
23
+ readonly live: string;
24
+ readonly width: number;
25
+ readonly height: number;
26
+ readonly details: boolean;
27
+ readonly resetKey: string;
28
+ readonly startAtTop?: boolean;
29
+ readonly mouseEvents?: EventEmitter;
30
+ readonly screenY?: number;
31
+ readonly screenX?: number;
32
+ }
33
+ interface Position {
34
+ readonly line: number;
35
+ readonly column: number;
36
+ }
37
+ export declare function selectedTranscriptText(lines: readonly string[], from: Position, to: Position): string;
38
+ export declare function transcriptLines(messages: readonly ChatMessage[], width: number, details: boolean): string[];
39
+ export declare function Transcript({ messages, live, width, height, details, resetKey, startAtTop, mouseEvents, screenY, screenX }: TranscriptProps): React.ReactElement;
40
+ export {};
41
+ //# sourceMappingURL=terminal-screen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-screen.d.ts","sourceRoot":"","sources":["../src/terminal-screen.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAE3D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAchD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,GAAG,QAAQ,CAAC;IACxD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,iFAAiF;AACjF,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIjD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAInE;AAED,wBAAgB,eAAe,IAAI;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAenE;AAED,wEAAwE;AACxE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,WAAW,GAAG,MAAM,IAAI,CAa1E;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,WAAW,EACpB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,OAAO,GACf,MAAM,EAAE,CA2CV;AAED,UAAU,eAAe;IACvB,QAAQ,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,CAAC;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,WAAW,CAAC,EAAE,YAAY,CAAC;IACpC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,UAAU,QAAQ;IAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE;AAgBrE,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,GAAG,MAAM,CASrG;AAiBD,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,SAAS,WAAW,EAAE,EAChC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,OAAO,GACf,MAAM,EAAE,CAaV;AAED,wBAAgB,UAAU,CAAC,EACzB,QAAQ,EACR,IAAI,EACJ,KAAK,EACL,MAAM,EACN,OAAO,EACP,QAAQ,EACR,UAAkB,EAClB,WAAW,EACX,OAAW,EACX,OAAW,EACZ,EAAE,eAAe,GAAG,KAAK,CAAC,YAAY,CAkHtC"}