@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.
- package/README.md +13 -2
- package/dist/.nodetool-build-stamp +1 -0
- package/dist/ExecutionTree.d.ts +20 -0
- package/dist/ExecutionTree.d.ts.map +1 -0
- package/dist/ExecutionTree.js +100 -0
- package/dist/ExecutionTree.js.map +1 -0
- package/dist/agent-toolbelt.d.ts +15 -0
- package/dist/agent-toolbelt.d.ts.map +1 -0
- package/dist/agent-toolbelt.js +28 -0
- package/dist/agent-toolbelt.js.map +1 -0
- package/dist/app.d.ts +40 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +1070 -0
- package/dist/app.js.map +1 -0
- package/dist/bash-tool.d.ts +13 -0
- package/dist/bash-tool.d.ts.map +1 -0
- package/dist/bash-tool.js +85 -0
- package/dist/bash-tool.js.map +1 -0
- package/dist/chat-codeact.d.ts +93 -0
- package/dist/chat-codeact.d.ts.map +1 -0
- package/dist/chat-codeact.js +179 -0
- package/dist/chat-codeact.js.map +1 -0
- package/dist/chat-context.d.ts +18 -0
- package/dist/chat-context.d.ts.map +1 -0
- package/dist/chat-context.js +32 -0
- package/dist/chat-context.js.map +1 -0
- package/dist/chat-entry.d.ts +13 -0
- package/dist/chat-entry.d.ts.map +1 -0
- package/dist/chat-entry.js +233 -0
- package/dist/chat-entry.js.map +1 -0
- package/dist/chat-media.d.ts +3 -0
- package/dist/chat-media.d.ts.map +1 -0
- package/dist/chat-media.js +46 -0
- package/dist/chat-media.js.map +1 -0
- package/dist/chat-prompts.d.ts +20 -0
- package/dist/chat-prompts.d.ts.map +1 -0
- package/dist/chat-prompts.js +42 -0
- package/dist/chat-prompts.js.map +1 -0
- package/dist/chat-sessions.d.ts +25 -0
- package/dist/chat-sessions.d.ts.map +1 -0
- package/dist/chat-sessions.js +153 -0
- package/dist/chat-sessions.js.map +1 -0
- package/dist/commands/agent.d.ts +33 -0
- package/dist/commands/agent.d.ts.map +1 -0
- package/dist/commands/agent.js +516 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/tools.d.ts +11 -0
- package/dist/commands/tools.d.ts.map +1 -0
- package/dist/commands/tools.js +206 -0
- package/dist/commands/tools.js.map +1 -0
- package/dist/diagnose.d.ts +139 -0
- package/dist/diagnose.d.ts.map +1 -0
- package/dist/diagnose.js +435 -0
- package/dist/diagnose.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +40 -0
- package/dist/index.js.map +1 -0
- package/dist/markdown.d.ts +9 -0
- package/dist/markdown.d.ts.map +1 -0
- package/dist/markdown.js +53 -0
- package/dist/markdown.js.map +1 -0
- package/dist/nodetool.d.ts +3 -0
- package/dist/nodetool.d.ts.map +1 -0
- package/dist/nodetool.js +4 -0
- package/dist/nodetool.js.map +1 -0
- package/dist/permission-gate.d.ts +55 -0
- package/dist/permission-gate.d.ts.map +1 -0
- package/dist/permission-gate.js +118 -0
- package/dist/permission-gate.js.map +1 -0
- package/dist/readline-input.d.ts +23 -0
- package/dist/readline-input.d.ts.map +1 -0
- package/dist/readline-input.js +210 -0
- package/dist/readline-input.js.map +1 -0
- package/dist/settings.d.ts +19 -0
- package/dist/settings.d.ts.map +1 -0
- package/dist/settings.js +146 -0
- package/dist/settings.js.map +1 -0
- package/dist/stdin.d.ts +52 -0
- package/dist/stdin.d.ts.map +1 -0
- package/dist/stdin.js +363 -0
- package/dist/stdin.js.map +1 -0
- package/dist/terminal-clipboard.d.ts +3 -0
- package/dist/terminal-clipboard.d.ts.map +1 -0
- package/dist/terminal-clipboard.js +24 -0
- package/dist/terminal-clipboard.js.map +1 -0
- package/dist/terminal-mouse.d.ts +24 -0
- package/dist/terminal-mouse.d.ts.map +1 -0
- package/dist/terminal-mouse.js +84 -0
- package/dist/terminal-mouse.js.map +1 -0
- package/dist/terminal-screen.d.ts +41 -0
- package/dist/terminal-screen.d.ts.map +1 -0
- package/dist/terminal-screen.js +228 -0
- package/dist/terminal-screen.js.map +1 -0
- package/dist/tool-format.d.ts +54 -0
- package/dist/tool-format.d.ts.map +1 -0
- package/dist/tool-format.js +360 -0
- package/dist/tool-format.js.map +1 -0
- package/dist/useExecutionState.d.ts +44 -0
- package/dist/useExecutionState.d.ts.map +1 -0
- package/dist/useExecutionState.js +285 -0
- package/dist/useExecutionState.js.map +1 -0
- package/dist/websocket-client.d.ts +159 -0
- package/dist/websocket-client.d.ts.map +1 -0
- package/dist/websocket-client.js +677 -0
- package/dist/websocket-client.js.map +1 -0
- 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 @@
|
|
|
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"}
|