@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.
- 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,516 @@
|
|
|
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 * as fs from "node:fs";
|
|
16
|
+
import * as fsp from "node:fs/promises";
|
|
17
|
+
import * as path from "node:path";
|
|
18
|
+
import chalk from "chalk";
|
|
19
|
+
import { RUN_BUDGET_CONTEXT_KEY } from "@nodetool-ai/runtime";
|
|
20
|
+
import { PERMISSION_GATE_CONTEXT_KEY } from "@nodetool-ai/agents";
|
|
21
|
+
import { processChat } from "@nodetool-ai/chat";
|
|
22
|
+
import { initDb } from "@nodetool-ai/models";
|
|
23
|
+
import { getDefaultDbPath, configureLogging } from "@nodetool-ai/config";
|
|
24
|
+
import { createProvider, buildConfiguredProviders } from "@nodetool-ai/cli-providers";
|
|
25
|
+
import { buildFullRegistry } from "@nodetool-ai/cli-execution/node-registry";
|
|
26
|
+
import { buildCliToolbelt } from "../agent-toolbelt.js";
|
|
27
|
+
import { applySystemPrompt, buildCliAgentBelt, createCliCodeActTurn, loadCliSkillCatalog } from "../chat-codeact.js";
|
|
28
|
+
import { createChatContext } from "../chat-context.js";
|
|
29
|
+
import { budgetStopReason, budgetSummaryLine, createCliRunBudget } from "@nodetool-ai/cli-execution/run-budget";
|
|
30
|
+
import { createCliPermissionGate, parsePermissionMode, PERMISSION_MODE_NAMES } from "../permission-gate.js";
|
|
31
|
+
import { diagnoseRun, renderDiagnosis } from "../diagnose.js";
|
|
32
|
+
import { isRecord, isString } from "@nodetool-ai/cli-common/predicates";
|
|
33
|
+
import { parseNumericOption } from "@nodetool-ai/cli-common/numeric-options";
|
|
34
|
+
const PROVIDER_ALIASES = {
|
|
35
|
+
google: "gemini",
|
|
36
|
+
googleai: "gemini",
|
|
37
|
+
"google-ai": "gemini"
|
|
38
|
+
};
|
|
39
|
+
function normalizeProvider(name) {
|
|
40
|
+
const lower = name.toLowerCase();
|
|
41
|
+
return PROVIDER_ALIASES[lower] ?? lower;
|
|
42
|
+
}
|
|
43
|
+
function expandTilde(p) {
|
|
44
|
+
if (p.startsWith("~/") || p === "~") {
|
|
45
|
+
return path.join(process.env["HOME"] ?? "", p.slice(1));
|
|
46
|
+
}
|
|
47
|
+
return p;
|
|
48
|
+
}
|
|
49
|
+
function shorten(s, n = 200) {
|
|
50
|
+
const oneLine = s.replace(/\s+/g, " ").trim();
|
|
51
|
+
return oneLine.length > n ? oneLine.slice(0, n) + "…" : oneLine;
|
|
52
|
+
}
|
|
53
|
+
function ts() {
|
|
54
|
+
const d = new Date();
|
|
55
|
+
return d.toISOString().slice(11, 23);
|
|
56
|
+
}
|
|
57
|
+
function traceEvent(msg, opts) {
|
|
58
|
+
if (opts.json) {
|
|
59
|
+
process.stderr.write(JSON.stringify(msg) + "\n");
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
const t = chalk.gray(ts());
|
|
63
|
+
switch (msg.type) {
|
|
64
|
+
case "log_update":
|
|
65
|
+
process.stderr.write(`${t} ${chalk.cyan("log")} ${shorten(msg.content ?? "")}\n`);
|
|
66
|
+
break;
|
|
67
|
+
case "planning_update":
|
|
68
|
+
process.stderr.write(`${t} ${chalk.magenta("plan")} [${msg.phase}/${msg.status}] ${shorten(msg.content ?? "")}\n`);
|
|
69
|
+
break;
|
|
70
|
+
case "task_update":
|
|
71
|
+
process.stderr.write(`${t} ${chalk.blue("task")} ${msg.event}${msg.task?.title ? ` — ${shorten(msg.task.title, 80)}` : ""}${msg.step?.id ? ` (step ${msg.step.id.slice(0, 8)})` : ""}\n`);
|
|
72
|
+
break;
|
|
73
|
+
case "tool_call_update": {
|
|
74
|
+
const args = msg.args && Object.keys(msg.args).length
|
|
75
|
+
? shorten(JSON.stringify(msg.args), 160)
|
|
76
|
+
: "";
|
|
77
|
+
process.stderr.write(`${t} ${chalk.yellow("tool→")} ${msg.name}${args ? `(${args})` : "()"}\n`);
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
case "tool_result_update": {
|
|
81
|
+
const preview = shorten(JSON.stringify(msg.result ?? {}), 160);
|
|
82
|
+
process.stderr.write(`${t} ${chalk.yellow("tool←")} ${preview}\n`);
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
case "step_result": {
|
|
86
|
+
const tag = msg.is_task_result
|
|
87
|
+
? chalk.green("result★")
|
|
88
|
+
: chalk.green("step✓ ");
|
|
89
|
+
const preview = isString(msg.result)
|
|
90
|
+
? shorten(msg.result, 200)
|
|
91
|
+
: shorten(JSON.stringify(msg.result ?? null), 200);
|
|
92
|
+
process.stderr.write(`${t} ${tag} ${preview}\n`);
|
|
93
|
+
if (msg.error)
|
|
94
|
+
process.stderr.write(`${t} ${chalk.red("error")} ${msg.error}\n`);
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
case "chunk":
|
|
98
|
+
if (opts.verbose && isString(msg.content)) {
|
|
99
|
+
process.stderr.write(`${t} ${chalk.gray("chunk")} ${shorten(msg.content, 80)}\n`);
|
|
100
|
+
}
|
|
101
|
+
break;
|
|
102
|
+
case "error":
|
|
103
|
+
process.stderr.write(`${t} ${chalk.red("error")} ${msg.message}\n`);
|
|
104
|
+
break;
|
|
105
|
+
default:
|
|
106
|
+
if (opts.verbose) {
|
|
107
|
+
process.stderr.write(`${t} ${chalk.gray(msg.type)}\n`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// ---------------------------------------------------------------------------
|
|
112
|
+
// run subcommand
|
|
113
|
+
// ---------------------------------------------------------------------------
|
|
114
|
+
async function readObjectiveFromStdin() {
|
|
115
|
+
if (process.stdin.isTTY)
|
|
116
|
+
return null;
|
|
117
|
+
const chunks = [];
|
|
118
|
+
for await (const chunk of process.stdin) {
|
|
119
|
+
chunks.push(chunk);
|
|
120
|
+
}
|
|
121
|
+
const text = Buffer.concat(chunks).toString("utf-8").trim();
|
|
122
|
+
return text || null;
|
|
123
|
+
}
|
|
124
|
+
/** The text the run answers with: the last assistant message that carries any. */
|
|
125
|
+
function finalAssistantText(messages) {
|
|
126
|
+
for (let i = messages.length - 1; i >= 0; i--) {
|
|
127
|
+
const message = messages[i];
|
|
128
|
+
if (message.role !== "assistant")
|
|
129
|
+
continue;
|
|
130
|
+
if (isString(message.content) && message.content.trim()) {
|
|
131
|
+
return message.content;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
/** Exit code for the process: 0 when the turn finished without an error. */
|
|
137
|
+
export async function runAgentCommand(opts) {
|
|
138
|
+
// Quiet the runtime's INFO logger so it doesn't interleave the trace.
|
|
139
|
+
// Users who want raw logs can set NODETOOL_LOG_LEVEL=info before running.
|
|
140
|
+
if (!process.env["NODETOOL_LOG_LEVEL"]) {
|
|
141
|
+
process.env["NODETOOL_LOG_LEVEL"] = "error";
|
|
142
|
+
}
|
|
143
|
+
configureLogging();
|
|
144
|
+
// DB for secrets
|
|
145
|
+
try {
|
|
146
|
+
initDb(getDefaultDbPath());
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
/* fallback to env vars */
|
|
150
|
+
}
|
|
151
|
+
if (!opts.provider) {
|
|
152
|
+
throw new Error("No provider specified. Use --provider <id>.");
|
|
153
|
+
}
|
|
154
|
+
const providerId = normalizeProvider(opts.provider);
|
|
155
|
+
const modelId = opts.model;
|
|
156
|
+
if (!modelId) {
|
|
157
|
+
throw new Error("No model specified. Use --model <id>.");
|
|
158
|
+
}
|
|
159
|
+
// `Number("ten")` is NaN, and a NaN round limit runs no rounds at all: the
|
|
160
|
+
// run then failed as if the model had answered nothing.
|
|
161
|
+
const maxIterations = opts.maxIterations === undefined
|
|
162
|
+
? undefined
|
|
163
|
+
: parseNumericOption(opts.maxIterations, "--max-iterations", {
|
|
164
|
+
integer: true,
|
|
165
|
+
min: 1
|
|
166
|
+
});
|
|
167
|
+
const objective = opts.objective ?? (await readObjectiveFromStdin());
|
|
168
|
+
if (!objective) {
|
|
169
|
+
throw new Error('No objective provided. Use --objective "..." or pipe it via stdin.');
|
|
170
|
+
}
|
|
171
|
+
// Configured providers (for find_model + media tool dispatch)
|
|
172
|
+
const configuredProviders = await buildConfiguredProviders();
|
|
173
|
+
const workspaceDir = expandTilde(opts.workspace ?? process.cwd());
|
|
174
|
+
try {
|
|
175
|
+
fs.mkdirSync(workspaceDir, { recursive: true });
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
/* ignore — an existing dir is the common case */
|
|
179
|
+
}
|
|
180
|
+
const provider = await createProvider(providerId);
|
|
181
|
+
const context = await createChatContext({ workspaceDir });
|
|
182
|
+
// Hand the context the instances already configured above, so a tool that
|
|
183
|
+
// dispatches by provider id gets this run's provider rather than resolving a
|
|
184
|
+
// second one of its own.
|
|
185
|
+
for (const [id, configured] of Object.entries(configuredProviders)) {
|
|
186
|
+
context.registerProvider(id, configured);
|
|
187
|
+
}
|
|
188
|
+
const traceOpts = {
|
|
189
|
+
json: !!opts.json,
|
|
190
|
+
verbose: !!opts.verbose
|
|
191
|
+
};
|
|
192
|
+
const emit = (message) => {
|
|
193
|
+
traceEvent(message, traceOpts);
|
|
194
|
+
};
|
|
195
|
+
// The run's gate, built once. `readObjectiveFromStdin` already returned null
|
|
196
|
+
// on a TTY, so the same test says whether anyone is there to answer a
|
|
197
|
+
// prompt: an objective that arrived down a pipe leaves nobody at the
|
|
198
|
+
// keyboard, and the run gates headless with the notice below.
|
|
199
|
+
const gate = createCliPermissionGate({
|
|
200
|
+
hostName: "nodetool agent run",
|
|
201
|
+
mode: parsePermissionMode(opts.permissionMode),
|
|
202
|
+
interactive: process.stdin.isTTY === true,
|
|
203
|
+
// In `--json` the notice and any prompt ride the event stream, so it stays
|
|
204
|
+
// one JSON object per line.
|
|
205
|
+
write: (text) => {
|
|
206
|
+
if (opts.json) {
|
|
207
|
+
emit({
|
|
208
|
+
type: "log_update",
|
|
209
|
+
node_id: "agent",
|
|
210
|
+
node_name: "permissions",
|
|
211
|
+
content: text,
|
|
212
|
+
severity: "info"
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
else {
|
|
216
|
+
process.stderr.write(chalk.gray(`${text}\n`));
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
// Loops this command never constructs — an `AgentNode` reached through
|
|
221
|
+
// `run_node`, a JS script — read the gate off the context rather than
|
|
222
|
+
// building an ungated run of their own (`gateFromContext`, invariant I-1).
|
|
223
|
+
context.set(PERMISSION_GATE_CONTEXT_KEY, gate);
|
|
224
|
+
// The bounds this run shares downward, created once (invariant I-2). The
|
|
225
|
+
// same channel the gate takes: a loop this command never constructs reads
|
|
226
|
+
// the budget off the context instead of opening an allowance of its own.
|
|
227
|
+
const budget = await createCliRunBudget({
|
|
228
|
+
...(opts.costCap !== undefined && { costCap: opts.costCap }),
|
|
229
|
+
...(opts.timeout !== undefined && { timeout: opts.timeout })
|
|
230
|
+
});
|
|
231
|
+
context.set(RUN_BUDGET_CONTEXT_KEY, budget);
|
|
232
|
+
// One belt, every run. A narrowing flag made each invocation its own
|
|
233
|
+
// configuration — the thing YAML configs were removed for — and an agent
|
|
234
|
+
// run that behaves differently from the last one is not reproducible.
|
|
235
|
+
const belt = buildCliAgentBelt({
|
|
236
|
+
baseTools: buildCliToolbelt(configuredProviders, await buildFullRegistry()),
|
|
237
|
+
provider,
|
|
238
|
+
model: modelId,
|
|
239
|
+
forwardMessage: emit,
|
|
240
|
+
gate,
|
|
241
|
+
// An objective is a job, not a conversation: the two plan capabilities are
|
|
242
|
+
// on the belt so the model can decompose one and run the DAG itself.
|
|
243
|
+
planning: true,
|
|
244
|
+
budget
|
|
245
|
+
});
|
|
246
|
+
if (!opts.json) {
|
|
247
|
+
process.stderr.write(chalk.bold(`\n▸ agent\n`) +
|
|
248
|
+
chalk.gray(` provider=${providerId} model=${modelId} tools=${belt.length}\n`) +
|
|
249
|
+
chalk.gray(` objective: ${shorten(objective, 200)}\n\n`));
|
|
250
|
+
}
|
|
251
|
+
const turn = createCliCodeActTurn({
|
|
252
|
+
tools: belt,
|
|
253
|
+
context,
|
|
254
|
+
skillCatalog: await loadCliSkillCatalog(context.userId),
|
|
255
|
+
// Calls the sandbox makes have no provider tool-call id of their own.
|
|
256
|
+
onToolCall: ({ name, args }) => {
|
|
257
|
+
emit({ type: "tool_call_update", name, args });
|
|
258
|
+
}
|
|
259
|
+
});
|
|
260
|
+
const messages = [];
|
|
261
|
+
applySystemPrompt(messages, turn.systemPrompt);
|
|
262
|
+
let errored = false;
|
|
263
|
+
try {
|
|
264
|
+
await processChat({
|
|
265
|
+
userInput: objective,
|
|
266
|
+
messages,
|
|
267
|
+
model: modelId,
|
|
268
|
+
provider,
|
|
269
|
+
context,
|
|
270
|
+
tools: turn.tools,
|
|
271
|
+
turnBudget: budget,
|
|
272
|
+
maxIterations,
|
|
273
|
+
callbacks: {
|
|
274
|
+
onChunk: (content) => {
|
|
275
|
+
emit({ type: "chunk", content, done: false });
|
|
276
|
+
},
|
|
277
|
+
onToolCall: (call) => {
|
|
278
|
+
emit({
|
|
279
|
+
type: "tool_call_update",
|
|
280
|
+
name: call.name,
|
|
281
|
+
args: call.args,
|
|
282
|
+
tool_call_id: call.id
|
|
283
|
+
});
|
|
284
|
+
},
|
|
285
|
+
onToolResult: (call, result) => {
|
|
286
|
+
emit({
|
|
287
|
+
type: "tool_result_update",
|
|
288
|
+
node_id: "agent",
|
|
289
|
+
name: call.name,
|
|
290
|
+
tool_call_id: call.id,
|
|
291
|
+
result: isRecord(result) ? result : { value: result }
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
});
|
|
296
|
+
}
|
|
297
|
+
catch (e) {
|
|
298
|
+
errored = true;
|
|
299
|
+
const message = e instanceof Error ? e.message : String(e);
|
|
300
|
+
emit({ type: "error", message });
|
|
301
|
+
if (!opts.json) {
|
|
302
|
+
process.stderr.write(chalk.red(`\nagent failed: ${message}\n`));
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
const finalText = finalAssistantText(messages);
|
|
306
|
+
if (!opts.json)
|
|
307
|
+
process.stderr.write(chalk.bold("\n— result —\n"));
|
|
308
|
+
if (finalText)
|
|
309
|
+
process.stdout.write(finalText + "\n");
|
|
310
|
+
// What the whole run — this loop plus every sub-agent and node it started —
|
|
311
|
+
// committed against the shared cap.
|
|
312
|
+
const summary = budgetSummaryLine(budget);
|
|
313
|
+
if (opts.json) {
|
|
314
|
+
emit({
|
|
315
|
+
type: "log_update",
|
|
316
|
+
node_id: "agent",
|
|
317
|
+
node_name: "budget",
|
|
318
|
+
content: summary,
|
|
319
|
+
severity: "info"
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
else {
|
|
323
|
+
process.stderr.write(chalk.gray(`\n${summary}\n`));
|
|
324
|
+
}
|
|
325
|
+
// A ceiling ended the run, not the model finishing its answer. Said nowhere,
|
|
326
|
+
// the two are indistinguishable from an empty transcript (invariant I-3), so
|
|
327
|
+
// the reason is reported before anything else about how the run ended.
|
|
328
|
+
const stopReason = budgetStopReason(budget);
|
|
329
|
+
if (!errored && stopReason) {
|
|
330
|
+
emit({ type: "error", message: stopReason });
|
|
331
|
+
if (!opts.json) {
|
|
332
|
+
process.stderr.write(chalk.red(`\nagent stopped: ${stopReason}\n`));
|
|
333
|
+
}
|
|
334
|
+
return 1;
|
|
335
|
+
}
|
|
336
|
+
// A run that ended on a tool call or a contentless assistant turn produced
|
|
337
|
+
// no answer. Writing nothing and exiting 0 is indistinguishable from an
|
|
338
|
+
// empty-but-successful result, so it fails instead (invariant I-3).
|
|
339
|
+
if (!errored && !finalText) {
|
|
340
|
+
const message = "agent produced no answer: the turn ended without a final assistant message";
|
|
341
|
+
emit({ type: "error", message });
|
|
342
|
+
if (!opts.json) {
|
|
343
|
+
process.stderr.write(chalk.red(`\nagent failed: ${message}\n`));
|
|
344
|
+
}
|
|
345
|
+
return 1;
|
|
346
|
+
}
|
|
347
|
+
return errored ? 1 : 0;
|
|
348
|
+
}
|
|
349
|
+
/** Parse a JSONL file into one parsed object per non-blank line. */
|
|
350
|
+
async function readJsonl(file) {
|
|
351
|
+
const text = await fsp.readFile(file, "utf-8");
|
|
352
|
+
const out = [];
|
|
353
|
+
for (const line of text.split("\n")) {
|
|
354
|
+
const trimmed = line.trim();
|
|
355
|
+
if (!trimmed)
|
|
356
|
+
continue;
|
|
357
|
+
try {
|
|
358
|
+
// SAFETY: each caller names the record shape its own bundle file was
|
|
359
|
+
// written with — this reader only splits lines and parses JSON.
|
|
360
|
+
out.push(JSON.parse(trimmed));
|
|
361
|
+
}
|
|
362
|
+
catch {
|
|
363
|
+
// Skip partial/corrupt lines (e.g. a crash mid-write).
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
return out;
|
|
367
|
+
}
|
|
368
|
+
/** First existing path among the candidates, or null. */
|
|
369
|
+
function firstExisting(candidates) {
|
|
370
|
+
for (const p of candidates) {
|
|
371
|
+
try {
|
|
372
|
+
if (fs.statSync(p).isFile())
|
|
373
|
+
return p;
|
|
374
|
+
}
|
|
375
|
+
catch {
|
|
376
|
+
// Not a readable file — try the next candidate.
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
return null;
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* Locate a debug bundle directory for a job id. The `debug` command writes
|
|
383
|
+
* bundles to `nodetool-debug/<id>-<timestamp>/`; we pick the most recent dir
|
|
384
|
+
* whose name starts with the id, relative to cwd.
|
|
385
|
+
*/
|
|
386
|
+
function findDebugBundle(jobId) {
|
|
387
|
+
const root = path.join(process.cwd(), "nodetool-debug");
|
|
388
|
+
let entries;
|
|
389
|
+
try {
|
|
390
|
+
entries = fs.readdirSync(root, { withFileTypes: true });
|
|
391
|
+
}
|
|
392
|
+
catch {
|
|
393
|
+
return null;
|
|
394
|
+
}
|
|
395
|
+
const matches = entries
|
|
396
|
+
.filter((e) => e.isDirectory() && e.name.startsWith(`${jobId}-`))
|
|
397
|
+
.map((e) => path.join(root, e.name))
|
|
398
|
+
.sort();
|
|
399
|
+
return matches.length > 0 ? matches[matches.length - 1] : null;
|
|
400
|
+
}
|
|
401
|
+
/** Fetch a job record over the tRPC API; null when unreachable/not found. */
|
|
402
|
+
async function fetchJob(apiUrl, jobId) {
|
|
403
|
+
try {
|
|
404
|
+
const { createRpcClient } = await import("@nodetool-ai/cli-common/rpc-client");
|
|
405
|
+
const client = createRpcClient(apiUrl);
|
|
406
|
+
const data = await client.query("jobs.get", { id: jobId });
|
|
407
|
+
if (!isRecord(data))
|
|
408
|
+
return null;
|
|
409
|
+
return {
|
|
410
|
+
id: isString(data["id"]) ? data["id"] : jobId,
|
|
411
|
+
status: isString(data["status"]) ? data["status"] : undefined,
|
|
412
|
+
error: isString(data["error"]) ? data["error"] : null,
|
|
413
|
+
workflowId: isString(data["workflow_id"]) ? data["workflow_id"] : null
|
|
414
|
+
};
|
|
415
|
+
}
|
|
416
|
+
catch {
|
|
417
|
+
// Server unreachable or job missing — diagnose degrades on a null job.
|
|
418
|
+
return null;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
async function diagnoseCommand(jobId, opts) {
|
|
422
|
+
const apiUrl = opts.apiUrl ?? process.env["NODETOOL_API_URL"] ?? "http://localhost:7777";
|
|
423
|
+
const inputs = {};
|
|
424
|
+
// Job record (best-effort over the API).
|
|
425
|
+
const job = await fetchJob(apiUrl, jobId);
|
|
426
|
+
if (job)
|
|
427
|
+
inputs.job = job;
|
|
428
|
+
else
|
|
429
|
+
inputs.job = { id: jobId };
|
|
430
|
+
// Messages + trace from a debug bundle (when one exists for this job).
|
|
431
|
+
const bundle = findDebugBundle(jobId);
|
|
432
|
+
if (bundle) {
|
|
433
|
+
const messagesPath = firstExisting([
|
|
434
|
+
path.join(bundle, "server", "messages.jsonl")
|
|
435
|
+
]);
|
|
436
|
+
if (messagesPath) {
|
|
437
|
+
try {
|
|
438
|
+
inputs.messages = await readJsonl(messagesPath);
|
|
439
|
+
}
|
|
440
|
+
catch {
|
|
441
|
+
// Unreadable — leave messages unset so the report flags it missing.
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
// Trace spans: --trace-file > NODETOOL_TRACE_FILE > the bundle's trace.jsonl.
|
|
446
|
+
const tracePath = firstExisting([
|
|
447
|
+
opts.traceFile,
|
|
448
|
+
process.env["NODETOOL_TRACE_FILE"],
|
|
449
|
+
bundle ? path.join(bundle, "server", "trace.jsonl") : undefined
|
|
450
|
+
].filter((p) => p != null));
|
|
451
|
+
if (tracePath) {
|
|
452
|
+
try {
|
|
453
|
+
inputs.spans = await readJsonl(tracePath);
|
|
454
|
+
}
|
|
455
|
+
catch {
|
|
456
|
+
// Unreadable — report flags trace as missing.
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
const report = diagnoseRun(inputs);
|
|
460
|
+
if (opts.json) {
|
|
461
|
+
process.stdout.write(JSON.stringify(report, null, 2) + "\n");
|
|
462
|
+
}
|
|
463
|
+
else {
|
|
464
|
+
process.stdout.write(renderDiagnosis(report) + "\n");
|
|
465
|
+
}
|
|
466
|
+
process.exit(report.ok ? 0 : 1);
|
|
467
|
+
}
|
|
468
|
+
// ---------------------------------------------------------------------------
|
|
469
|
+
// Registration
|
|
470
|
+
// ---------------------------------------------------------------------------
|
|
471
|
+
export function registerAgentCommands(program) {
|
|
472
|
+
const agent = program
|
|
473
|
+
.command("agent")
|
|
474
|
+
.description("Run the agent loop from the command line");
|
|
475
|
+
agent
|
|
476
|
+
.command("run")
|
|
477
|
+
.description("Run an agent over the default toolbelt (objective via --objective or stdin)")
|
|
478
|
+
.option("-o, --objective <text>", "Objective for the agent")
|
|
479
|
+
.option("-p, --provider <id>", "Provider id")
|
|
480
|
+
.option("-m, --model <id>", "Model id")
|
|
481
|
+
.option("-w, --workspace <path>", "Workspace dir (default: cwd)")
|
|
482
|
+
.option("--max-iterations <n>", "Tool-calling rounds in the turn (default 25)")
|
|
483
|
+
.option("--permission-mode <mode>", `Permission mode (${PERMISSION_MODE_NAMES.join(" | ")}); on a TTY the ` +
|
|
484
|
+
"default asks before each write, execute or external call")
|
|
485
|
+
.option("--cost-cap <usd>", "Ceiling on provider spend for the whole run, shared by every loop it " +
|
|
486
|
+
"starts; 0 lifts it (default: NODETOOL_AGENT_TURN_COST_CAP_USD)")
|
|
487
|
+
.option("--timeout <s>", "Wall-clock bound on the run in seconds; 0 leaves it no time at all " +
|
|
488
|
+
"(default: NODETOOL_AGENT_TURN_DEADLINE_MS)")
|
|
489
|
+
.option("--json", "Emit each event as a JSON line on stderr")
|
|
490
|
+
.option("-v, --verbose", "Include chunk/other low-level events in trace")
|
|
491
|
+
.action(async (opts) => {
|
|
492
|
+
try {
|
|
493
|
+
process.exit(await runAgentCommand(opts));
|
|
494
|
+
}
|
|
495
|
+
catch (e) {
|
|
496
|
+
process.stderr.write(chalk.red(`error: ${String(e)}\n`));
|
|
497
|
+
process.exit(1);
|
|
498
|
+
}
|
|
499
|
+
});
|
|
500
|
+
agent
|
|
501
|
+
.command("diagnose <job_id>")
|
|
502
|
+
.description("Aggregate a failed run (failing node/step, error, last LLM call, memory) into one report")
|
|
503
|
+
.option("--json", "Emit the DiagnosisReport as JSON")
|
|
504
|
+
.option("--trace-file <path>", "Trace JSONL to read the last llm.chat span from (else NODETOOL_TRACE_FILE or the debug bundle)")
|
|
505
|
+
.option("--api-url <url>", "API base URL for the job lookup")
|
|
506
|
+
.action(async (jobId, opts) => {
|
|
507
|
+
try {
|
|
508
|
+
await diagnoseCommand(jobId, opts);
|
|
509
|
+
}
|
|
510
|
+
catch (e) {
|
|
511
|
+
process.stderr.write(chalk.red(`error: ${String(e)}\n`));
|
|
512
|
+
process.exit(1);
|
|
513
|
+
}
|
|
514
|
+
});
|
|
515
|
+
}
|
|
516
|
+
//# sourceMappingURL=agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/commands/agent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,GAAG,MAAM,kBAAkB,CAAC;AACxC,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,2BAA2B,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEzE,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AACtF,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EACL,uBAAuB,EACvB,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,WAAW,EACX,eAAe,EAIhB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yCAAyC,CAAC;AAE7E,MAAM,gBAAgB,GAA2B;IAC/C,MAAM,EAAE,QAAQ;IAChB,QAAQ,EAAE,QAAQ;IAClB,WAAW,EAAE,QAAQ;CACtB,CAAC;AAEF,SAAS,iBAAiB,CAAC,IAAY;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IACjC,OAAO,gBAAgB,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC;AAC1C,CAAC;AAED,SAAS,WAAW,CAAC,CAAS;IAC5B,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QACpC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAWD,SAAS,OAAO,CAAC,CAAS,EAAE,CAAC,GAAG,GAAG;IACjC,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9C,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;AAClE,CAAC;AAED,SAAS,EAAE;IACT,MAAM,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;IACrB,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,UAAU,CAAC,GAAsB,EAAE,IAAkB;IAC5D,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;QACjD,OAAO;IACT,CAAC;IACD,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;IAC3B,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,YAAY;YACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,IAAI,CACjE,CAAC;YACF,MAAM;QACR,KAAK,iBAAiB;YACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,IAAI,CACjG,CAAC;YACF,MAAM;QACR,KAAK,aAAa;YAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CACxK,CAAC;YACF,MAAM;QACR,KAAK,kBAAkB,EAAE,CAAC;YACxB,MAAM,IAAI,GACR,GAAG,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM;gBACtC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC;gBACxC,CAAC,CAAC,EAAE,CAAC;YACT,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAC7E,CAAC;YACF,MAAM;QACR,CAAC;QACD,KAAK,oBAAoB,EAAE,CAAC;YAC1B,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;YAC/D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,OAAO,IAAI,CAAC,CAAC;YACtE,MAAM;QACR,CAAC;QACD,KAAK,aAAa,EAAE,CAAC;YACnB,MAAM,GAAG,GAAG,GAAG,CAAC,cAAc;gBAC5B,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC;gBACxB,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC1B,MAAM,OAAO,GACX,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC;gBAClB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC;gBAC1B,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,IAAI,IAAI,CAAC,EAAE,GAAG,CAAC,CAAC;YACvD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,OAAO,IAAI,CAAC,CAAC;YAClD,IAAI,GAAG,CAAC,KAAK;gBACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC;YACvE,MAAM;QACR,CAAC;QACD,KAAK,OAAO;YACV,IAAI,IAAI,CAAC,OAAO,IAAI,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC1C,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAC/D,CAAC;YACJ,CAAC;YACD,MAAM;QACR,KAAK,OAAO;YACV,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC;YACvE,MAAM;QACR;YACE,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzD,CAAC;IACL,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E,KAAK,UAAU,sBAAsB;IACnC,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,KAAe,CAAC,CAAC;IAC/B,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5D,OAAO,IAAI,IAAI,IAAI,CAAC;AACtB,CAAC;AAiBD,kFAAkF;AAClF,SAAS,kBAAkB,CAAC,QAAmB;IAC7C,KAAK,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9C,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW;YAAE,SAAS;QAC3C,IAAI,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YACxD,OAAO,OAAO,CAAC,OAAO,CAAC;QACzB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,4EAA4E;AAC5E,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAgB;IACpD,sEAAsE;IACtE,0EAA0E;IAC1E,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,CAAC;QACvC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,GAAG,OAAO,CAAC;IAC9C,CAAC;IACD,gBAAgB,EAAE,CAAC;IAEnB,iBAAiB;IACjB,IAAI,CAAC;QACH,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,0BAA0B;IAC5B,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IACjE,CAAC;IACD,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC;IAC3B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IAED,2EAA2E;IAC3E,wDAAwD;IACxD,MAAM,aAAa,GACjB,IAAI,CAAC,aAAa,KAAK,SAAS;QAC9B,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,aAAa,EAAE,kBAAkB,EAAE;YACzD,OAAO,EAAE,IAAI;YACb,GAAG,EAAE,CAAC;SACP,CAAC,CAAC;IAET,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,sBAAsB,EAAE,CAAC,CAAC;IACrE,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CACb,oEAAoE,CACrE,CAAC;IACJ,CAAC;IAED,8DAA8D;IAC9D,MAAM,mBAAmB,GAAG,MAAM,wBAAwB,EAAE,CAAC;IAE7D,MAAM,YAAY,GAAG,WAAW,CAAC,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAClE,IAAI,CAAC;QACH,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,iDAAiD;IACnD,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,UAAU,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,MAAM,iBAAiB,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC;IAC1D,0EAA0E;IAC1E,6EAA6E;IAC7E,yBAAyB;IACzB,KAAK,MAAM,CAAC,EAAE,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,EAAE,CAAC;QACnE,OAAO,CAAC,gBAAgB,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;IAC3C,CAAC;IAED,MAAM,SAAS,GAAiB;QAC9B,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI;QACjB,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO;KACxB,CAAC;IACF,MAAM,IAAI,GAAG,CAAC,OAA0B,EAAQ,EAAE;QAChD,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACjC,CAAC,CAAC;IAEF,6EAA6E;IAC7E,sEAAsE;IACtE,qEAAqE;IACrE,8DAA8D;IAC9D,MAAM,IAAI,GAAG,uBAAuB,CAAC;QACnC,QAAQ,EAAE,oBAAoB;QAC9B,IAAI,EAAE,mBAAmB,CAAC,IAAI,CAAC,cAAc,CAAC;QAC9C,WAAW,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,KAAK,IAAI;QACzC,2EAA2E;QAC3E,4BAA4B;QAC5B,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE;YACd,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,IAAI,CAAC;oBACH,IAAI,EAAE,YAAY;oBAClB,OAAO,EAAE,OAAO;oBAChB,SAAS,EAAE,aAAa;oBACxB,OAAO,EAAE,IAAI;oBACb,QAAQ,EAAE,MAAM;iBACjB,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC;YAChD,CAAC;QACH,CAAC;KACF,CAAC,CAAC;IACH,uEAAuE;IACvE,sEAAsE;IACtE,2EAA2E;IAC3E,OAAO,CAAC,GAAG,CAAC,2BAA2B,EAAE,IAAI,CAAC,CAAC;IAE/C,yEAAyE;IACzE,0EAA0E;IAC1E,yEAAyE;IACzE,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC;QACtC,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;QAC5D,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;KAC7D,CAAC,CAAC;IACH,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,MAAM,CAAC,CAAC;IAE5C,qEAAqE;IACrE,yEAAyE;IACzE,sEAAsE;IACtE,MAAM,IAAI,GAAG,iBAAiB,CAAC;QAC7B,SAAS,EAAE,gBAAgB,CAAC,mBAAmB,EAAE,MAAM,iBAAiB,EAAE,CAAC;QAC3E,QAAQ;QACR,KAAK,EAAE,OAAO;QACd,cAAc,EAAE,IAAI;QACpB,IAAI;QACJ,2EAA2E;QAC3E,qEAAqE;QACrE,QAAQ,EAAE,IAAI;QACd,MAAM;KACP,CAAC,CAAC;IAEH,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC;YACvB,KAAK,CAAC,IAAI,CACR,cAAc,UAAU,UAAU,OAAO,UAAU,IAAI,CAAC,MAAM,IAAI,CACnE;YACD,KAAK,CAAC,IAAI,CAAC,gBAAgB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAC5D,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,oBAAoB,CAAC;QAChC,KAAK,EAAE,IAAI;QACX,OAAO;QACP,YAAY,EAAE,MAAM,mBAAmB,CAAC,OAAO,CAAC,MAAM,CAAC;QACvD,sEAAsE;QACtE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE;YAC7B,IAAI,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,CAAC;KACF,CAAC,CAAC;IACH,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,iBAAiB,CAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IAE/C,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,WAAW,CAAC;YAChB,SAAS,EAAE,SAAS;YACpB,QAAQ;YACR,KAAK,EAAE,OAAO;YACd,QAAQ;YACR,OAAO;YACP,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,UAAU,EAAE,MAAM;YAClB,aAAa;YACb,SAAS,EAAE;gBACT,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE;oBACnB,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;gBAChD,CAAC;gBACD,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE;oBACnB,IAAI,CAAC;wBACH,IAAI,EAAE,kBAAkB;wBACxB,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,YAAY,EAAE,IAAI,CAAC,EAAE;qBACtB,CAAC,CAAC;gBACL,CAAC;gBACD,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;oBAC7B,IAAI,CAAC;wBACH,IAAI,EAAE,oBAAoB;wBAC1B,OAAO,EAAE,OAAO;wBAChB,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,YAAY,EAAE,IAAI,CAAC,EAAE;wBACrB,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE;qBACtD,CAAC,CAAC;gBACL,CAAC;aACF;SACF,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,GAAG,IAAI,CAAC;QACf,MAAM,OAAO,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAC3D,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,OAAO,IAAI,CAAC,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAE/C,IAAI,CAAC,IAAI,CAAC,IAAI;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACnE,IAAI,SAAS;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IAEtD,4EAA4E;IAC5E,oCAAoC;IACpC,MAAM,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC1C,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,IAAI,CAAC;YACH,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,OAAO;YAChB,SAAS,EAAE,QAAQ;YACnB,OAAO,EAAE,OAAO;YAChB,QAAQ,EAAE,MAAM;SACjB,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC;IACrD,CAAC;IAED,6EAA6E;IAC7E,6EAA6E;IAC7E,uEAAuE;IACvE,MAAM,UAAU,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC5C,IAAI,CAAC,OAAO,IAAI,UAAU,EAAE,CAAC;QAC3B,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,UAAU,IAAI,CAAC,CAAC,CAAC;QACtE,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,2EAA2E;IAC3E,wEAAwE;IACxE,oEAAoE;IACpE,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC;QAC3B,MAAM,OAAO,GACX,4EAA4E,CAAC;QAC/E,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,OAAO,IAAI,CAAC,CAAC,CAAC;QAClE,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACzB,CAAC;AAYD,oEAAoE;AACpE,KAAK,UAAU,SAAS,CACtB,IAAY;IAEZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAW,EAAE,CAAC;IACvB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,IAAI,CAAC;YACH,qEAAqE;YACrE,gEAAgE;YAChE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAS,CAAC,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,uDAAuD;QACzD,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,yDAAyD;AACzD,SAAS,aAAa,CAAC,UAAoB;IACzC,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE;gBAAE,OAAO,CAAC,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,gDAAgD;QAClD,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,SAAS,eAAe,CAAC,KAAa;IACpC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,gBAAgB,CAAC,CAAC;IACxD,IAAI,OAAoB,CAAC;IACzB,IAAI,CAAC;QACH,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,OAAO,GAAG,OAAO;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;SAChE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;SACnC,IAAI,EAAE,CAAC;IACV,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAClE,CAAC;AAED,6EAA6E;AAC7E,KAAK,UAAU,QAAQ,CACrB,MAAc,EACd,KAAa;IAEb,IAAI,CAAC;QACH,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,oCAAoC,CAAC,CAAC;QAC/E,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QACvC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3D,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QACjC,OAAO;YACL,EAAE,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK;YAC7C,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;YAC7D,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI;YACrD,UAAU,EAAE,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI;SACvE,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,uEAAuE;QACvE,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,KAAa,EACb,IAAqB;IAErB,MAAM,MAAM,GACV,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,uBAAuB,CAAC;IAE5E,MAAM,MAAM,GAAmB,EAAE,CAAC;IAElC,yCAAyC;IACzC,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC1C,IAAI,GAAG;QAAE,MAAM,CAAC,GAAG,GAAG,GAAG,CAAC;;QACrB,MAAM,CAAC,GAAG,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;IAEhC,uEAAuE;IACvE,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACtC,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,YAAY,GAAG,aAAa,CAAC;YACjC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,gBAAgB,CAAC;SAC9C,CAAC,CAAC;QACH,IAAI,YAAY,EAAE,CAAC;YACjB,IAAI,CAAC;gBACH,MAAM,CAAC,QAAQ,GAAG,MAAM,SAAS,CAAC,YAAY,CAAC,CAAC;YAClD,CAAC;YAAC,MAAM,CAAC;gBACP,oEAAoE;YACtE,CAAC;QACH,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,MAAM,SAAS,GAAG,aAAa,CAC7B;QACE,IAAI,CAAC,SAAS;QACd,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;QAClC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS;KAChE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,CACxC,CAAC;IACF,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,CAAC;YACH,MAAM,CAAC,KAAK,GAAG,MAAM,SAAS,CAAgB,SAAS,CAAC,CAAC;QAC3D,CAAC;QAAC,MAAM,CAAC;YACP,8CAA8C;QAChD,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IAEnC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC/D,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAClC,CAAC;AAED,8EAA8E;AAC9E,eAAe;AACf,8EAA8E;AAE9E,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,MAAM,KAAK,GAAG,OAAO;SAClB,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,0CAA0C,CAAC,CAAC;IAE3D,KAAK;SACF,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CACV,6EAA6E,CAC9E;SACA,MAAM,CAAC,wBAAwB,EAAE,yBAAyB,CAAC;SAC3D,MAAM,CAAC,qBAAqB,EAAE,aAAa,CAAC;SAC5C,MAAM,CAAC,kBAAkB,EAAE,UAAU,CAAC;SACtC,MAAM,CAAC,wBAAwB,EAAE,8BAA8B,CAAC;SAChE,MAAM,CACL,sBAAsB,EACtB,8CAA8C,CAC/C;SACA,MAAM,CACL,0BAA0B,EAC1B,oBAAoB,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,kBAAkB;QACrE,0DAA0D,CAC7D;SACA,MAAM,CACL,kBAAkB,EAClB,uEAAuE;QACrE,gEAAgE,CACnE;SACA,MAAM,CACL,eAAe,EACf,qEAAqE;QACnE,4CAA4C,CAC/C;SACA,MAAM,CAAC,QAAQ,EAAE,0CAA0C,CAAC;SAC5D,MAAM,CAAC,eAAe,EAAE,+CAA+C,CAAC;SACxE,MAAM,CAAC,KAAK,EAAE,IAAgB,EAAE,EAAE;QACjC,IAAI,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,KAAK;SACF,OAAO,CAAC,mBAAmB,CAAC;SAC5B,WAAW,CACV,0FAA0F,CAC3F;SACA,MAAM,CAAC,QAAQ,EAAE,kCAAkC,CAAC;SACpD,MAAM,CACL,qBAAqB,EACrB,gGAAgG,CACjG;SACA,MAAM,CAAC,iBAAiB,EAAE,iCAAiC,CAAC;SAC5D,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,IAAqB,EAAE,EAAE;QACrD,IAAI,CAAC;YACH,MAAM,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Direct local access to the same tools and guides as CLI agent sessions. */
|
|
2
|
+
import type { Command } from "commander";
|
|
3
|
+
import type { Tool } from "@nodetool-ai/agents";
|
|
4
|
+
export interface AuthoringTools {
|
|
5
|
+
list(): Promise<Tool[]>;
|
|
6
|
+
call(name: string, args: Record<string, unknown>): Promise<unknown>;
|
|
7
|
+
}
|
|
8
|
+
export declare function parseToolArguments(raw: string): Promise<Record<string, unknown>>;
|
|
9
|
+
export declare const AUTHORING_HELP = "\nAuthoring tools and starting documents:\n nodetool tools list timeline\n nodetool tools info create_timeline\n nodetool skills list\n nodetool skills read storyboard-core\n nodetool skills read motion-graphics\n nodetool skills read nodetool-workflow-builder\n nodetool skills read nodetool-app-builder\n nodetool skills read native-game\n nodetool tools call list_projects\n nodetool tools call create_timeline --args '{\"name\":\"My timeline\"}'\n nodetool tools call <name> --args @arguments.json\n\nTools expose their current input schemas. Read the matching shipped guide\nbefore creating workflows, timelines, motion graphics, mini apps, or games.\n";
|
|
10
|
+
export declare function registerAuthoringCommands(program: Command, load?: () => Promise<AuthoringTools>): void;
|
|
11
|
+
//# sourceMappingURL=tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/commands/tools.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAShD,MAAM,WAAW,cAAc;IAC7B,IAAI,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACxB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACrE;AA6ED,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAUlC;AA0CD,eAAO,MAAM,cAAc,iqBAgB1B,CAAC;AAEF,wBAAgB,yBAAyB,CACvC,OAAO,EAAE,OAAO,EAChB,IAAI,GAAE,MAAM,OAAO,CAAC,cAAc,CAAc,GAC/C,IAAI,CAmGN"}
|