@nodetool-ai/cli-chat 0.0.0-stage → 0.8.9-bootstrap.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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,233 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * nodetool-chat — Entry point.
4
+ *
5
+ * Usage:
6
+ * nodetool-chat # use saved/auto-detected settings
7
+ * nodetool-chat --provider anthropic # override provider
8
+ * nodetool-chat --model claude-opus-4-6 # override model
9
+ * nodetool-chat --agent # start in agent mode
10
+ * nodetool-chat --workspace /path/to/dir # set workspace directory
11
+ */
12
+ import { initTelemetry, shutdownTelemetry } from "@nodetool-ai/runtime";
13
+ import { program } from "commander";
14
+ import { render } from "ink";
15
+ import React from "react";
16
+ import { App } from "./app.js";
17
+ import { enterTerminalScreen } from "./terminal-screen.js";
18
+ import { MouseInput } from "./terminal-mouse.js";
19
+ import { loadSettings } from "./settings.js";
20
+ import { installLocalModelInterfaces } from "@nodetool-ai/cli-execution/local-model-interfaces";
21
+ import { runStdinMode } from "./stdin.js";
22
+ import { parsePermissionMode, PERMISSION_MODE_NAMES } from "./permission-gate.js";
23
+ import { buildConfiguredProviders, DEFAULT_MODELS, KNOWN_PROVIDERS } from "@nodetool-ai/cli-providers";
24
+ import { initDb, migrateSqliteDb } from "@nodetool-ai/models";
25
+ import { initMasterKey } from "@nodetool-ai/security";
26
+ import { getDefaultDbPath, configureLogging } from "@nodetool-ai/config";
27
+ import { buildFullRegistry } from "@nodetool-ai/cli-execution/node-registry";
28
+ import { initializeCliRuntime } from "@nodetool-ai/cli-common/runtime-env";
29
+ import { configureCliPackHost } from "@nodetool-ai/cli-execution/packs/host";
30
+ // Configure logging: in interactive mode, suppress non-error logs to a file
31
+ // so they don't interfere with the Ink TUI. Env vars can still override.
32
+ import { join } from "node:path";
33
+ import { homedir } from "node:os";
34
+ import { mkdirSync, readFileSync } from "node:fs";
35
+ import { z } from "zod";
36
+ import { isString } from "@nodetool-ai/cli-common/predicates";
37
+ if (!process.env["NODETOOL_LOG_LEVEL"]) {
38
+ process.env["NODETOOL_LOG_LEVEL"] = "error";
39
+ }
40
+ if (!process.env["NODETOOL_LOG_FILE"]) {
41
+ const logDir = join(homedir(), ".nodetool");
42
+ mkdirSync(logDir, { recursive: true });
43
+ process.env["NODETOOL_LOG_FILE"] = join(logDir, "chat.log");
44
+ }
45
+ configureLogging();
46
+ // Optional imports fall back to the root `nodetool runtime add` installs into.
47
+ initializeCliRuntime(import.meta.url);
48
+ configureCliPackHost(import.meta.url);
49
+ program
50
+ .name("nodetool-chat")
51
+ .description("NodeTool interactive chat CLI with multi-provider LLM support and agent mode")
52
+ .option("-p, --provider <provider>", `LLM provider (${KNOWN_PROVIDERS.join(", ")})`)
53
+ .option("-m, --model <model>", "Model ID")
54
+ .option("--resume [id]", "Resume a saved session in this workspace (latest when no id is given)")
55
+ .option("-a, --agent [mode]", "[deprecated] No-op — every chat session runs the unified loop")
56
+ .option("--no-agent", "[deprecated] No-op")
57
+ .option("-w, --workspace <path>", "Workspace directory (default: current directory)")
58
+ .option("--tools <tools>", "Comma-separated list of enabled tools")
59
+ .option("-u, --url <url>", "NodeTool server WebSocket URL (e.g. ws://localhost:7777/ws)")
60
+ .option("--no-read-only-search", "Disable the read-only run_search fan-out primitive (on by default)")
61
+ .option("--permission-mode <mode>", `Permission mode (${PERMISSION_MODE_NAMES.join(" | ")}); interactive defaults to default, piped input to auto`)
62
+ .option("--cost-cap <usd>", "Ceiling on provider spend for one turn, shared by every loop it starts; " +
63
+ "0 lifts it (default: NODETOOL_AGENT_TURN_COST_CAP_USD)")
64
+ .option("--timeout <s>", "Wall-clock bound on one turn in seconds; 0 leaves it no time at all " +
65
+ "(default: NODETOOL_AGENT_TURN_DEADLINE_MS)")
66
+ .option("--trace-file <path>", "Append every LLM/agent/workflow span as JSONL to <path> (analyzer-friendly)")
67
+ .option("--trace-stdout [format]", "Stream spans to stdout: 'pretty' (default, human-readable) or 'json' (JSONL)")
68
+ .option("--no-trace-stdout", "Disable stdout span output (overrides NODETOOL_TRACE_STDOUT)")
69
+ .helpOption("-h, --help", "Show help")
70
+ .version(z.object({ version: z.string() }).parse(JSON.parse(readFileSync(new URL("../package.json", import.meta.url), "utf8"))).version)
71
+ .parse();
72
+ const opts = program.opts();
73
+ // Refused before anything starts: a mode nobody recognizes must not fall back
74
+ // to a default the user did not ask for.
75
+ let permissionMode;
76
+ try {
77
+ permissionMode = parsePermissionMode(opts.permissionMode);
78
+ }
79
+ catch (err) {
80
+ process.stderr.write(`${err instanceof Error ? err.message : String(err)}\n`);
81
+ process.exit(1);
82
+ }
83
+ const traceStdout = opts.traceStdout ?? process.env["NODETOOL_TRACE_STDOUT"];
84
+ if (process.stdin.isTTY && traceStdout !== undefined && parseTraceStdout(traceStdout)) {
85
+ process.stderr.write("Fullscreen chat uses stdout for its screen. Use --trace-file <path> and --no-trace-stdout for tracing.\n");
86
+ process.exit(1);
87
+ }
88
+ // Initialize OpenLLMetry before any LLM SDK calls are made. Honors CLI flags
89
+ // and env vars (TRACELOOP_API_KEY, OTEL_EXPORTER_OTLP_ENDPOINT,
90
+ // NODETOOL_TRACE_FILE, NODETOOL_TRACE_STDOUT). Registered run recording is always on.
91
+ await initTelemetry({
92
+ ...(opts.traceFile && { traceFile: opts.traceFile }),
93
+ ...(opts.traceStdout !== undefined && {
94
+ stdout: parseTraceStdout(opts.traceStdout)
95
+ })
96
+ });
97
+ function parseTraceStdout(v) {
98
+ if (v === false)
99
+ return false;
100
+ if (v === true)
101
+ return "pretty";
102
+ if (isString(v)) {
103
+ const lower = v.toLowerCase();
104
+ if (lower === "false" || lower === "0" || lower === "no")
105
+ return false;
106
+ if (lower === "json")
107
+ return "json";
108
+ if (lower === "pretty" || lower === "true" || lower === "1")
109
+ return "pretty";
110
+ }
111
+ throw new Error(`--trace-stdout must be 'pretty' or 'json' (got ${JSON.stringify(v)})`);
112
+ }
113
+ try {
114
+ const dbPath = getDefaultDbPath();
115
+ await migrateSqliteDb(dbPath);
116
+ initDb(dbPath);
117
+ }
118
+ catch {
119
+ // DB unavailable — secret lookups will fall back to env vars
120
+ }
121
+ // Resolve the master encryption key NOW (before Ink takes over the terminal)
122
+ // so any first-time keychain prompt is visible to the user, and so that the
123
+ // first secret lookup during a chat message doesn't race against keychain
124
+ // initialization. Failures are surfaced clearly to stderr — silently falling
125
+ // back to env-only would mask DB-stored secrets and produce confusing
126
+ // "API_KEY is not configured" errors deep in provider construction.
127
+ try {
128
+ await initMasterKey();
129
+ }
130
+ catch (err) {
131
+ const msg = err instanceof Error ? err.message : String(err);
132
+ process.stderr.write(`[chat-cli] Could not unlock the secret store: ${msg}\n` +
133
+ `[chat-cli] Falling back to environment variables for API keys.\n` +
134
+ `[chat-cli] Tip: set SECRETS_MASTER_KEY or grant keychain access to enable DB-stored secrets.\n`);
135
+ }
136
+ // The same persistence a local workflow run gets, for every context this
137
+ // process builds (chat turns build their own on top; a sub-agent's does not).
138
+ await installLocalModelInterfaces();
139
+ // Load persisted settings and merge with CLI flags
140
+ const settings = await loadSettings();
141
+ const provider = opts.provider ?? settings.provider;
142
+ const model = opts.model ??
143
+ (opts.provider
144
+ ? (DEFAULT_MODELS[opts.provider] ?? settings.model)
145
+ : settings.model);
146
+ // `--agent` and the persisted `agentMode` setting are deprecated no-ops —
147
+ // every chat session now runs the unified LLM-with-tools loop, and the
148
+ // agent decides for itself whether to decompose via `run_subtask`. The flag
149
+ // is still accepted for backwards compatibility; a warning is emitted when
150
+ // it is used.
151
+ if (opts.agent !== undefined) {
152
+ // eslint-disable-next-line no-console
153
+ console.error("Warning: --agent is deprecated and has no effect — the unified chat agent always runs.");
154
+ }
155
+ const workspace = opts.workspace ?? process.cwd();
156
+ // `--tools` narrows the belt to the names given. Without it the chat offers the
157
+ // full belt, as a server chat turn does.
158
+ const enabledTools = opts.tools
159
+ ? opts.tools.split(",").map((t) => t.trim())
160
+ : undefined;
161
+ // The full node registry, which also installs the sandbox pack catalog. Only
162
+ // when running locally (no --url): the server has its own.
163
+ const cliRegistry = opts.url
164
+ ? undefined
165
+ : await buildFullRegistry();
166
+ // Build configured providers unconditionally so `find_model` and the
167
+ // media-generation tools (generate_image, generate_speech, etc.) are
168
+ // available to ANY agent loop — multi-task or graph — even without a
169
+ // registry.
170
+ const cliAgentProviders = await buildConfiguredProviders();
171
+ // Stdin mode: activated when stdin is piped (not a TTY)
172
+ if (!process.stdin.isTTY) {
173
+ let exitCode = 1;
174
+ try {
175
+ exitCode = await runStdinMode({
176
+ provider,
177
+ model,
178
+ workspaceDir: workspace,
179
+ wsUrl: opts.url,
180
+ registry: cliRegistry,
181
+ agentProviders: cliAgentProviders,
182
+ enableReadOnlySearch: opts.readOnlySearch !== false,
183
+ ...(permissionMode !== undefined && { permissionMode }),
184
+ ...(opts.costCap !== undefined && { costCap: opts.costCap }),
185
+ ...(opts.timeout !== undefined && { timeout: opts.timeout })
186
+ });
187
+ }
188
+ finally {
189
+ await shutdownTelemetry();
190
+ }
191
+ process.exit(exitCode);
192
+ }
193
+ const restoreScreen = enterTerminalScreen(process.stdout);
194
+ const mouseInput = new MouseInput(process.stdin);
195
+ process.once("exit", restoreScreen);
196
+ const terminate = () => {
197
+ restoreScreen();
198
+ process.exit(143);
199
+ };
200
+ process.once("SIGTERM", terminate);
201
+ try {
202
+ const { waitUntilExit } = render(React.createElement(App, {
203
+ initialProvider: provider,
204
+ initialModel: model,
205
+ enabledTools,
206
+ workspaceDir: workspace,
207
+ wsUrl: opts.url,
208
+ registry: cliRegistry,
209
+ agentProviders: cliAgentProviders,
210
+ permissionMode,
211
+ enableReadOnlySearch: opts.readOnlySearch !== false,
212
+ resume: opts.resume,
213
+ mouseEvents: mouseInput.events,
214
+ ...(opts.costCap !== undefined && { costCap: opts.costCap }),
215
+ ...(opts.timeout !== undefined && { timeout: opts.timeout })
216
+ }), {
217
+ // Ink requires ReadStream, while this forwarding stream supplies its TTY methods.
218
+ // oxlint-disable-next-line anti-slop/no-chained-type-assertions
219
+ stdin: mouseInput,
220
+ exitOnCtrlC: false,
221
+ kittyKeyboard: { mode: "auto" }
222
+ });
223
+ await waitUntilExit();
224
+ }
225
+ finally {
226
+ restoreScreen();
227
+ mouseInput.close();
228
+ process.off("exit", restoreScreen);
229
+ process.off("SIGTERM", terminate);
230
+ await shutdownTelemetry();
231
+ }
232
+ process.exit(0);
233
+ //# sourceMappingURL=chat-entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-entry.js","sourceRoot":"","sources":["../src/chat-entry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Preserve generated media identifiers when a terminal cannot preview their pixels. */
2
+ export declare function attachmentLines(content: unknown): string[];
3
+ //# sourceMappingURL=chat-media.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-media.d.ts","sourceRoot":"","sources":["../src/chat-media.ts"],"names":[],"mappings":"AAiBA,wFAAwF;AACxF,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE,CA+B1D"}
@@ -0,0 +1,46 @@
1
+ import { z } from "zod";
2
+ const reference = z.object({
3
+ asset_id: z.string().nullable().optional(),
4
+ uri: z.string().nullable().optional(),
5
+ url: z.string().optional()
6
+ });
7
+ const block = z.object({
8
+ type: z.enum(["image", "image_url", "video", "audio", "document", "model3d"]),
9
+ image: reference.optional(),
10
+ image_url: z.union([reference, z.string()]).optional(),
11
+ video: reference.optional(),
12
+ audio: reference.optional(),
13
+ document: reference.optional(),
14
+ model3d: reference.optional()
15
+ });
16
+ /** Preserve generated media identifiers when a terminal cannot preview their pixels. */
17
+ export function attachmentLines(content) {
18
+ if (!Array.isArray(content)) {
19
+ return [];
20
+ }
21
+ const lines = [];
22
+ for (const value of content) {
23
+ const parsed = block.safeParse(value);
24
+ if (!parsed.success) {
25
+ continue;
26
+ }
27
+ const item = parsed.data;
28
+ const media = item.image ?? item.video ?? item.audio ?? item.document ?? item.model3d;
29
+ const imageUrl = z.string().safeParse(item.image_url);
30
+ const imageReference = reference.safeParse(item.image_url);
31
+ const locator = media?.asset_id
32
+ ? `asset://${media.asset_id}`
33
+ : (media?.uri ??
34
+ media?.url ??
35
+ (imageUrl.success
36
+ ? imageUrl.data
37
+ : imageReference.success
38
+ ? imageReference.data.url
39
+ : undefined));
40
+ lines.push(locator && !locator.startsWith("data:")
41
+ ? `${item.type}: ${locator}`
42
+ : `${item.type}: inline attachment`);
43
+ }
44
+ return lines;
45
+ }
46
+ //# sourceMappingURL=chat-media.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-media.js","sourceRoot":"","sources":["../src/chat-media.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC;IACzB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC1C,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACrC,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC3B,CAAC,CAAC;AACH,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC;IACrB,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;IAC7E,KAAK,EAAE,SAAS,CAAC,QAAQ,EAAE;IAC3B,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;IACtD,KAAK,EAAE,SAAS,CAAC,QAAQ,EAAE;IAC3B,KAAK,EAAE,SAAS,CAAC,QAAQ,EAAE;IAC3B,QAAQ,EAAE,SAAS,CAAC,QAAQ,EAAE;IAC9B,OAAO,EAAE,SAAS,CAAC,QAAQ,EAAE;CAC9B,CAAC,CAAC;AAEH,wFAAwF;AACxF,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACzB,MAAM,KAAK,GACT,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC;QAC1E,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtD,MAAM,cAAc,GAAG,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC3D,MAAM,OAAO,GAAG,KAAK,EAAE,QAAQ;YAC7B,CAAC,CAAC,WAAW,KAAK,CAAC,QAAQ,EAAE;YAC7B,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG;gBACX,KAAK,EAAE,GAAG;gBACV,CAAC,QAAQ,CAAC,OAAO;oBACf,CAAC,CAAC,QAAQ,CAAC,IAAI;oBACf,CAAC,CAAC,cAAc,CAAC,OAAO;wBACtB,CAAC,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG;wBACzB,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QACtB,KAAK,CAAC,IAAI,CACR,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC;YACrC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE;YAC5B,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,qBAAqB,CACtC,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,20 @@
1
+ export interface ChatPrompt {
2
+ readonly title: string;
3
+ readonly body: string;
4
+ readonly choices: readonly {
5
+ readonly key: string;
6
+ readonly label: string;
7
+ readonly value: string;
8
+ }[];
9
+ }
10
+ /** Serialize requests from parallel tools without leaving promises behind on cancellation. */
11
+ export declare class ChatPrompts {
12
+ private readonly show;
13
+ private readonly pending;
14
+ constructor(show: (prompt: ChatPrompt | null) => void);
15
+ ask(prompt: ChatPrompt, signal: AbortSignal): Promise<string>;
16
+ /** The prompt awaiting an answer, current before React re-renders. */
17
+ get current(): ChatPrompt | null;
18
+ answer(answer: string): void;
19
+ }
20
+ //# sourceMappingURL=chat-prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-prompts.d.ts","sourceRoot":"","sources":["../src/chat-prompts.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,SAAS;QACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;KACxB,EAAE,CAAC;CACL;AAED,8FAA8F;AAC9F,qBAAa,WAAW;IAKV,OAAO,CAAC,QAAQ,CAAC,IAAI;IAJjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAGhB;IACR,YAA6B,IAAI,EAAE,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,KAAK,IAAI,EAAI;IAE1E,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAyB5D;IAED,sEAAsE;IACtE,IAAI,OAAO,IAAI,UAAU,GAAG,IAAI,CAE/B;IAED,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAE3B;CACF"}
@@ -0,0 +1,42 @@
1
+ /** Serialize requests from parallel tools without leaving promises behind on cancellation. */
2
+ export class ChatPrompts {
3
+ show;
4
+ pending = [];
5
+ constructor(show) {
6
+ this.show = show;
7
+ }
8
+ ask(prompt, signal) {
9
+ if (signal.aborted) {
10
+ return Promise.resolve("cancel");
11
+ }
12
+ return new Promise((resolve) => {
13
+ const entry = {
14
+ prompt,
15
+ settle: (answer) => {
16
+ signal.removeEventListener("abort", abort);
17
+ const index = this.pending.indexOf(entry);
18
+ if (index < 0) {
19
+ return;
20
+ }
21
+ this.pending.splice(index, 1);
22
+ this.show(this.pending[0]?.prompt ?? null);
23
+ resolve(answer);
24
+ }
25
+ };
26
+ const abort = () => entry.settle("cancel");
27
+ this.pending.push(entry);
28
+ signal.addEventListener("abort", abort, { once: true });
29
+ if (this.pending.length === 1) {
30
+ this.show(prompt);
31
+ }
32
+ });
33
+ }
34
+ /** The prompt awaiting an answer, current before React re-renders. */
35
+ get current() {
36
+ return this.pending[0]?.prompt ?? null;
37
+ }
38
+ answer(answer) {
39
+ this.pending[0]?.settle(answer);
40
+ }
41
+ }
42
+ //# sourceMappingURL=chat-prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-prompts.js","sourceRoot":"","sources":["../src/chat-prompts.ts"],"names":[],"mappings":"AAUA,8FAA8F;AAC9F,MAAM,OAAO,WAAW;IAKO,IAAI;IAJhB,OAAO,GAGnB,EAAE,CAAC;IACR,YAA6B,IAAyC;oBAAzC,IAAI;IAAwC,CAAC;IAE1E,GAAG,CAAC,MAAkB,EAAE,MAAmB;QACzC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACnB,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QACnC,CAAC;QACD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,KAAK,GAAG;gBACZ,MAAM;gBACN,MAAM,EAAE,CAAC,MAAc,EAAQ,EAAE;oBAC/B,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;oBAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;oBAC1C,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;wBACd,OAAO;oBACT,CAAC;oBACD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;oBAC9B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,IAAI,CAAC,CAAC;oBAC3C,OAAO,CAAC,MAAM,CAAC,CAAC;gBAClB,CAAC;aACF,CAAC;YACF,MAAM,KAAK,GAAG,GAAS,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACjD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzB,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACxD,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC9B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACpB,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,sEAAsE;IACtE,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,IAAI,CAAC;IACzC,CAAC;IAED,MAAM,CAAC,MAAc;QACnB,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;CACF"}
@@ -0,0 +1,25 @@
1
+ import type { Message, ProviderSession } from "@nodetool-ai/runtime";
2
+ import type { ChatMessage } from "./terminal-screen.js";
3
+ export interface ChatSession {
4
+ readonly version: 1;
5
+ readonly id: string;
6
+ readonly threadId: string;
7
+ readonly title: string;
8
+ readonly updatedAt: string;
9
+ readonly workspace: string;
10
+ readonly server?: string;
11
+ readonly provider: string;
12
+ readonly model: string;
13
+ readonly history: Message[];
14
+ readonly messages: ChatMessage[];
15
+ readonly providerSession?: ProviderSession | null;
16
+ }
17
+ export declare function newSessionId(): string;
18
+ export declare class ChatSessionStore {
19
+ private readonly directory;
20
+ constructor(directory?: string);
21
+ save(session: ChatSession): Promise<void>;
22
+ list(workspace: string, server?: string): Promise<ChatSession[]>;
23
+ }
24
+ export declare function exportTranscript(messages: readonly ChatMessage[]): string;
25
+ //# sourceMappingURL=chat-sessions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-sessions.d.ts","sourceRoot":"","sources":["../src/chat-sessions.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAwFxD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACpB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC;IACjC,QAAQ,CAAC,eAAe,CAAC,EAAE,eAAe,GAAG,IAAI,CAAC;CACnD;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,qBAAa,gBAAgB;IAEzB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAD5B,YACmB,SAAS,SAAgD,EACxE;IAEE,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAoB9C;IAEK,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAwCrE;CACF;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,SAAS,WAAW,EAAE,GAAG,MAAM,CASzE"}
@@ -0,0 +1,153 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { mkdir, readFile, readdir, rename, writeFile } from "node:fs/promises";
3
+ import { homedir } from "node:os";
4
+ import { join, resolve } from "node:path";
5
+ import { z } from "zod";
6
+ const media = z.object({
7
+ uri: z.string().optional(),
8
+ data: z.string().optional(),
9
+ mimeType: z.string().optional()
10
+ });
11
+ const historyMessage = z.object({
12
+ role: z.enum(["user", "assistant", "system", "tool"]),
13
+ content: z
14
+ .union([
15
+ z.string(),
16
+ z.array(z.union([
17
+ z.object({ type: z.literal("text"), text: z.string() }).passthrough(),
18
+ z.object({ type: z.literal("image_url"), image: media }),
19
+ z.object({ type: z.literal("audio"), audio: media }),
20
+ z.object({ type: z.literal("video"), video: media }),
21
+ z.object({
22
+ type: z.literal("document"),
23
+ document: media.extend({ title: z.string().optional() }),
24
+ citations: z.boolean().optional(),
25
+ context: z.string().optional()
26
+ })
27
+ ]))
28
+ ])
29
+ .nullable()
30
+ .optional(),
31
+ toolCalls: z
32
+ .array(z.object({
33
+ id: z.string(),
34
+ name: z.string(),
35
+ args: z.record(z.string(), z.unknown())
36
+ }))
37
+ .nullable()
38
+ .optional(),
39
+ toolCallId: z.string().nullable().optional(),
40
+ isError: z.boolean().optional(),
41
+ threadId: z.string().nullable().optional(),
42
+ _rawGeminiParts: z.array(z.unknown()).optional(),
43
+ _anthropicThinkingBlocks: z
44
+ .array(z.union([
45
+ z.object({
46
+ type: z.literal("thinking"),
47
+ thinking: z.string(),
48
+ signature: z.string()
49
+ }),
50
+ z.object({ type: z.literal("redacted_thinking"), data: z.string() })
51
+ ]))
52
+ .optional()
53
+ });
54
+ const sessionSchema = z.object({
55
+ version: z.literal(1),
56
+ id: z.string().regex(/^[a-f0-9]{32}$/),
57
+ threadId: z.string(),
58
+ title: z.string(),
59
+ updatedAt: z.string(),
60
+ workspace: z.string(),
61
+ server: z.string().optional(),
62
+ provider: z.string(),
63
+ model: z.string(),
64
+ history: z.array(historyMessage),
65
+ messages: z.array(z.object({
66
+ id: z.string(),
67
+ role: z.enum(["user", "assistant", "tool", "system"]),
68
+ content: z.string(),
69
+ toolName: z.string().optional(),
70
+ toolArgs: z.record(z.string(), z.unknown()).optional()
71
+ })),
72
+ providerSession: z
73
+ .object({
74
+ providerId: z.string(),
75
+ model: z.string(),
76
+ token: z.string(),
77
+ checkpoint: z.number(),
78
+ systemHash: z.string().optional()
79
+ })
80
+ .nullable()
81
+ .optional()
82
+ });
83
+ export function newSessionId() {
84
+ return randomUUID().replaceAll("-", "");
85
+ }
86
+ export class ChatSessionStore {
87
+ directory;
88
+ constructor(directory = join(homedir(), ".nodetool", "chat-sessions")) {
89
+ this.directory = directory;
90
+ }
91
+ async save(session) {
92
+ // Convert inline media bytes to the base64 form providers already accept.
93
+ const text = JSON.stringify(session, (key, value) => {
94
+ if (key === "rendered") {
95
+ return undefined;
96
+ }
97
+ return value instanceof Uint8Array
98
+ ? Buffer.from(value).toString("base64")
99
+ : value;
100
+ }, 2);
101
+ sessionSchema.parse(JSON.parse(text));
102
+ await mkdir(this.directory, { recursive: true, mode: 0o700 });
103
+ const path = join(this.directory, `${session.id}.json`);
104
+ const temp = `${path}.${randomUUID()}.tmp`;
105
+ await writeFile(temp, text, { mode: 0o600 });
106
+ await rename(temp, path);
107
+ }
108
+ async list(workspace, server) {
109
+ let files;
110
+ try {
111
+ files = await readdir(this.directory);
112
+ }
113
+ catch (error) {
114
+ if (error instanceof Error &&
115
+ "code" in error &&
116
+ error.code === "ENOENT") {
117
+ return [];
118
+ }
119
+ throw error;
120
+ }
121
+ const sessions = [];
122
+ for (const file of files) {
123
+ if (!/^[a-f0-9]{32}\.json$/.test(file)) {
124
+ continue;
125
+ }
126
+ const text = await readFile(join(this.directory, file), "utf8");
127
+ let value;
128
+ try {
129
+ value = JSON.parse(text);
130
+ }
131
+ catch (error) {
132
+ if (error instanceof SyntaxError) {
133
+ // One damaged file must not hide the other saved conversations.
134
+ continue;
135
+ }
136
+ throw error;
137
+ }
138
+ const parsed = sessionSchema.safeParse(value);
139
+ if (parsed.success &&
140
+ resolve(parsed.data.workspace) === resolve(workspace) &&
141
+ parsed.data.server === server) {
142
+ sessions.push(parsed.data);
143
+ }
144
+ }
145
+ return sessions.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));
146
+ }
147
+ }
148
+ export function exportTranscript(messages) {
149
+ return (messages
150
+ .map((message) => `## ${message.role === "tool" ? (message.toolName ?? "Tool") : message.role}\n\n${message.content}`)
151
+ .join("\n\n") + "\n");
152
+ }
153
+ //# sourceMappingURL=chat-sessions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-sessions.js","sourceRoot":"","sources":["../src/chat-sessions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * `nodetool agent` — run one CodeAct turn over the default toolbelt, with full
3
+ * trace output.
4
+ *
5
+ * The loop is the chat's loop: the belt is assembled by `buildCliAgentBelt`
6
+ * and the turn by `createCliCodeActTurn`, both shared with `--stdin` chat, so
7
+ * the provider is offered `execute_code` and the toolbelt lives in the sandbox.
8
+ * `create_plan` and `execute_plan` are on the belt, so an objective that wants
9
+ * a plan gets one and the `planning_update` / `task_update` events stream.
10
+ *
11
+ * Subcommands:
12
+ * nodetool agent run --objective "..." # objective may also come from stdin
13
+ * nodetool agent diagnose <job_id> # aggregate a failed run into a report
14
+ */
15
+ import { Command } from "commander";
16
+ export interface RunOptions {
17
+ objective?: string;
18
+ provider?: string;
19
+ model?: string;
20
+ workspace?: string;
21
+ maxIterations?: string;
22
+ permissionMode?: string;
23
+ /** `--cost-cap <usd>`; `0` lifts the cap. Defaults to the agent settings. */
24
+ costCap?: string;
25
+ /** `--timeout <s>`; `0` leaves the run no time. Defaults to the settings. */
26
+ timeout?: string;
27
+ json?: boolean;
28
+ verbose?: boolean;
29
+ }
30
+ /** Exit code for the process: 0 when the turn finished without an error. */
31
+ export declare function runAgentCommand(opts: RunOptions): Promise<number>;
32
+ export declare function registerAgentCommands(program: Command): void;
33
+ //# sourceMappingURL=agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAKH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8JpC,MAAM,WAAW,UAAU;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6EAA6E;IAC7E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAcD,4EAA4E;AAC5E,wBAAsB,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAwOvE;AAiJD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+D5D"}