@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
package/dist/diagnose.js
ADDED
|
@@ -0,0 +1,435 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure failure-diagnosis aggregator for `nodetool agent diagnose <job_id>`.
|
|
3
|
+
*
|
|
4
|
+
* When a run fails the cause is scattered across the job record, the structured
|
|
5
|
+
* processing-message stream, and the OpenTelemetry trace. `diagnoseRun` folds
|
|
6
|
+
* those three sources into one `DiagnosisReport` that names the failing
|
|
7
|
+
* node/step, the error, the last `llm.chat`/`llm.stream` span at or before the
|
|
8
|
+
* failure (with tokens, model, and a truncated response), a memory snapshot, and
|
|
9
|
+
* a deterministic "likely fix locus" pointing at where to start.
|
|
10
|
+
*
|
|
11
|
+
* The function is pure and deterministic — it only reads its inputs and never
|
|
12
|
+
* touches the filesystem, env, or clock. The CLI wiring in
|
|
13
|
+
* `commands/agent.ts` gathers the real inputs and calls it. Keep all I/O out of
|
|
14
|
+
* this module so it stays unit-testable under the CLI vitest stub setup, which
|
|
15
|
+
* stubs every `@nodetool-ai/*` runtime package — only `import type` is used.
|
|
16
|
+
*/
|
|
17
|
+
import { isFiniteNumber, isObjectLike, isString } from "@nodetool-ai/cli-common/predicates";
|
|
18
|
+
// ---------------------------------------------------------------------------
|
|
19
|
+
// Helpers
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
const RESPONSE_PREVIEW_MAX = 500;
|
|
22
|
+
const VALUE_PREVIEW_MAX = 120;
|
|
23
|
+
const MEMORY_KEY_LIMIT = 40;
|
|
24
|
+
const FAILED_NODE_STATUSES = new Set(["error", "failed"]);
|
|
25
|
+
/** Job statuses that mean the run did not succeed. */
|
|
26
|
+
const FAILED_JOB_STATUSES = new Set(["failed", "error", "cancelled"]);
|
|
27
|
+
const LLM_SPAN_NAMES = new Set(["llm.chat", "llm.stream"]);
|
|
28
|
+
function str(v) {
|
|
29
|
+
return isString(v) ? v : null;
|
|
30
|
+
}
|
|
31
|
+
function num(v) {
|
|
32
|
+
return isFiniteNumber(v) ? v : null;
|
|
33
|
+
}
|
|
34
|
+
function truncate(s, max) {
|
|
35
|
+
const oneLine = s.replace(/\s+/g, " ").trim();
|
|
36
|
+
return oneLine.length > max ? `${oneLine.slice(0, max)}…[${oneLine.length} chars]` : oneLine;
|
|
37
|
+
}
|
|
38
|
+
/** First non-empty string among the candidates. */
|
|
39
|
+
function firstString(...candidates) {
|
|
40
|
+
for (const c of candidates) {
|
|
41
|
+
const s = str(c);
|
|
42
|
+
if (s && s.trim().length > 0)
|
|
43
|
+
return s;
|
|
44
|
+
}
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
const NO_SITE = {
|
|
48
|
+
kind: "unknown",
|
|
49
|
+
nodeId: null,
|
|
50
|
+
nodeType: null,
|
|
51
|
+
nodeName: null,
|
|
52
|
+
stepId: null,
|
|
53
|
+
stepLabel: null
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Scan the message stream for the first failure. A failing `node_update`
|
|
57
|
+
* (status error/failed) wins; otherwise a failed `task_update`/`step_result`
|
|
58
|
+
* (an agent step); otherwise a top-level `error` message. The scan keeps the
|
|
59
|
+
* earliest failure so the report points at the root cause, not a downstream
|
|
60
|
+
* cascade.
|
|
61
|
+
*/
|
|
62
|
+
function scanMessages(messages) {
|
|
63
|
+
let nodeFailure = null;
|
|
64
|
+
let nodeError = null;
|
|
65
|
+
let stepFailure = null;
|
|
66
|
+
let stepError = null;
|
|
67
|
+
let topError = null;
|
|
68
|
+
let jobError = null;
|
|
69
|
+
for (const raw of messages) {
|
|
70
|
+
const msg = raw;
|
|
71
|
+
switch (msg.type) {
|
|
72
|
+
case "node_update": {
|
|
73
|
+
const status = str(msg.status);
|
|
74
|
+
if (status && FAILED_NODE_STATUSES.has(status) && !nodeFailure) {
|
|
75
|
+
nodeFailure = {
|
|
76
|
+
kind: "node",
|
|
77
|
+
nodeId: str(msg.node_id),
|
|
78
|
+
nodeType: str(msg.node_type),
|
|
79
|
+
nodeName: str(msg.node_name),
|
|
80
|
+
stepId: null,
|
|
81
|
+
stepLabel: null
|
|
82
|
+
};
|
|
83
|
+
nodeError = firstString(msg.error) ?? status;
|
|
84
|
+
}
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
case "task_update": {
|
|
88
|
+
const event = str(msg.event);
|
|
89
|
+
const task = msg.task ?? {};
|
|
90
|
+
const step = msg.step ?? {};
|
|
91
|
+
const failed = event === "step_failed" ||
|
|
92
|
+
str(step.status) === "failed" ||
|
|
93
|
+
str(task.status) === "failed";
|
|
94
|
+
if (failed && !stepFailure) {
|
|
95
|
+
stepFailure = {
|
|
96
|
+
kind: "step",
|
|
97
|
+
nodeId: str(msg.node_id),
|
|
98
|
+
nodeType: null,
|
|
99
|
+
nodeName: firstString(task.title, task.name),
|
|
100
|
+
stepId: firstString(step.id),
|
|
101
|
+
stepLabel: firstString(step.instructions, step.name, task.title)
|
|
102
|
+
};
|
|
103
|
+
stepError = firstString(step.error, task.error);
|
|
104
|
+
}
|
|
105
|
+
break;
|
|
106
|
+
}
|
|
107
|
+
case "step_result": {
|
|
108
|
+
const stepErr = firstString(msg.error);
|
|
109
|
+
if (stepErr && !stepFailure) {
|
|
110
|
+
const step = msg.step ?? {};
|
|
111
|
+
stepFailure = {
|
|
112
|
+
kind: "step",
|
|
113
|
+
nodeId: null,
|
|
114
|
+
nodeType: null,
|
|
115
|
+
nodeName: null,
|
|
116
|
+
stepId: firstString(step.id),
|
|
117
|
+
stepLabel: firstString(step.instructions, step.name)
|
|
118
|
+
};
|
|
119
|
+
stepError = stepErr;
|
|
120
|
+
}
|
|
121
|
+
break;
|
|
122
|
+
}
|
|
123
|
+
case "job_update": {
|
|
124
|
+
const status = str(msg.status);
|
|
125
|
+
if (status && FAILED_JOB_STATUSES.has(status)) {
|
|
126
|
+
jobError ??= firstString(msg.error, msg.message);
|
|
127
|
+
}
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
130
|
+
case "error": {
|
|
131
|
+
topError ??= firstString(msg.message);
|
|
132
|
+
break;
|
|
133
|
+
}
|
|
134
|
+
default:
|
|
135
|
+
break;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
// Precedence: a failing node is the most specific locus, then an agent step,
|
|
139
|
+
// then a job/top-level error with no attributable node.
|
|
140
|
+
if (nodeFailure) {
|
|
141
|
+
return {
|
|
142
|
+
failure: nodeFailure,
|
|
143
|
+
error: nodeError ?? stepError ?? topError ?? jobError,
|
|
144
|
+
failedAtMs: null,
|
|
145
|
+
found: true
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
if (stepFailure) {
|
|
149
|
+
return {
|
|
150
|
+
failure: stepFailure,
|
|
151
|
+
error: stepError ?? topError ?? jobError,
|
|
152
|
+
failedAtMs: null,
|
|
153
|
+
found: true
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
const looseError = topError ?? jobError;
|
|
157
|
+
if (looseError) {
|
|
158
|
+
return {
|
|
159
|
+
failure: { ...NO_SITE, kind: "job" },
|
|
160
|
+
error: looseError,
|
|
161
|
+
failedAtMs: null,
|
|
162
|
+
found: true
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
return { failure: NO_SITE, error: null, failedAtMs: null, found: false };
|
|
166
|
+
}
|
|
167
|
+
// ---------------------------------------------------------------------------
|
|
168
|
+
// Last LLM span at/before the failure
|
|
169
|
+
// ---------------------------------------------------------------------------
|
|
170
|
+
function spanAttr(span, key) {
|
|
171
|
+
return span.attributes ? span.attributes[key] : undefined;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Pick the last `llm.chat`/`llm.stream` span that started at or before the
|
|
175
|
+
* failure. When no failure time is known, the last LLM span in trace order is
|
|
176
|
+
* used. Ties on start time resolve to the later end time (and otherwise the
|
|
177
|
+
* later position in the array), so the most recent call wins deterministically.
|
|
178
|
+
*/
|
|
179
|
+
function selectLastLlmSpan(spans, failedAtMs) {
|
|
180
|
+
let best = null;
|
|
181
|
+
let bestStart = Number.NEGATIVE_INFINITY;
|
|
182
|
+
let bestEnd = Number.NEGATIVE_INFINITY;
|
|
183
|
+
for (const span of spans) {
|
|
184
|
+
if (!LLM_SPAN_NAMES.has(span.name))
|
|
185
|
+
continue;
|
|
186
|
+
const start = num(span.start_time_ms);
|
|
187
|
+
if (failedAtMs !== null && start !== null && start > failedAtMs)
|
|
188
|
+
continue;
|
|
189
|
+
const startKey = start ?? Number.NEGATIVE_INFINITY;
|
|
190
|
+
const endKey = num(span.end_time_ms) ?? startKey;
|
|
191
|
+
// `>=` so a later array position with an equal key still wins (trace order).
|
|
192
|
+
if (best === null || startKey > bestStart || (startKey === bestStart && endKey >= bestEnd)) {
|
|
193
|
+
best = span;
|
|
194
|
+
bestStart = startKey;
|
|
195
|
+
bestEnd = endKey;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return best;
|
|
199
|
+
}
|
|
200
|
+
function summarizeLlmSpan(span) {
|
|
201
|
+
const provider = firstString(spanAttr(span, "gen_ai.system"), spanAttr(span, "agent.provider")) ?? null;
|
|
202
|
+
const model = firstString(spanAttr(span, "gen_ai.request.model"), spanAttr(span, "gen_ai.response.model"), spanAttr(span, "agent.model")) ?? null;
|
|
203
|
+
const responseRaw = str(spanAttr(span, "llm.response.content"));
|
|
204
|
+
const start = num(span.start_time_ms);
|
|
205
|
+
const end = num(span.end_time_ms);
|
|
206
|
+
return {
|
|
207
|
+
name: span.name,
|
|
208
|
+
provider,
|
|
209
|
+
model,
|
|
210
|
+
inputTokens: num(spanAttr(span, "gen_ai.usage.input_tokens")),
|
|
211
|
+
outputTokens: num(spanAttr(span, "gen_ai.usage.output_tokens")),
|
|
212
|
+
totalTokens: num(spanAttr(span, "gen_ai.usage.total_tokens")),
|
|
213
|
+
costUsd: num(spanAttr(span, "gen_ai.usage.cost_usd")),
|
|
214
|
+
responsePreview: responseRaw ? truncate(responseRaw, RESPONSE_PREVIEW_MAX) : null,
|
|
215
|
+
durationMs: start !== null && end !== null ? end - start : null,
|
|
216
|
+
statusCode: span.status?.code ?? null
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
// ---------------------------------------------------------------------------
|
|
220
|
+
// Memory snapshot
|
|
221
|
+
// ---------------------------------------------------------------------------
|
|
222
|
+
function summarizeMemory(memory) {
|
|
223
|
+
const keys = Object.keys(memory);
|
|
224
|
+
const shown = keys.slice(0, MEMORY_KEY_LIMIT);
|
|
225
|
+
const preview = {};
|
|
226
|
+
for (const k of shown) {
|
|
227
|
+
const v = memory[k];
|
|
228
|
+
let s;
|
|
229
|
+
if (isString(v))
|
|
230
|
+
s = v;
|
|
231
|
+
else if (v === null || v === undefined)
|
|
232
|
+
s = String(v);
|
|
233
|
+
else if (isObjectLike(v))
|
|
234
|
+
s = Array.isArray(v) ? `array(${v.length})` : "{…}";
|
|
235
|
+
else
|
|
236
|
+
s = String(v);
|
|
237
|
+
preview[k] = truncate(s, VALUE_PREVIEW_MAX);
|
|
238
|
+
}
|
|
239
|
+
return { keyCount: keys.length, keys: shown, preview };
|
|
240
|
+
}
|
|
241
|
+
// ---------------------------------------------------------------------------
|
|
242
|
+
// Fix locus heuristic
|
|
243
|
+
// ---------------------------------------------------------------------------
|
|
244
|
+
/** Extract concrete file/prompt/model hints from an error string. */
|
|
245
|
+
function extractHints(error, model) {
|
|
246
|
+
const hints = [];
|
|
247
|
+
if (!error)
|
|
248
|
+
return hints;
|
|
249
|
+
const lower = error.toLowerCase();
|
|
250
|
+
// File path references (./foo.ts, /abs/path, src/x.json).
|
|
251
|
+
// Scan each path-like token once, including long malformed error messages.
|
|
252
|
+
let pathHint;
|
|
253
|
+
let tokenStart = 0;
|
|
254
|
+
for (let cursor = 0; cursor <= error.length; cursor++) {
|
|
255
|
+
const character = error[cursor];
|
|
256
|
+
if (character !== undefined && /[\w./-]/.test(character))
|
|
257
|
+
continue;
|
|
258
|
+
if (cursor > tokenStart) {
|
|
259
|
+
const token = error.slice(tokenStart, cursor);
|
|
260
|
+
const slash = token.indexOf("/");
|
|
261
|
+
const dot = token.lastIndexOf(".");
|
|
262
|
+
if (slash >= 0 && dot > slash + 1 && dot < token.length - 1 && /^\w+$/.test(token.slice(dot + 1))) {
|
|
263
|
+
pathHint = token;
|
|
264
|
+
break;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
tokenStart = cursor + 1;
|
|
268
|
+
}
|
|
269
|
+
if (pathHint)
|
|
270
|
+
hints.push(`file: ${pathHint}`);
|
|
271
|
+
if (/\bprompt\b/.test(lower) || /system\s*prompt/.test(lower)) {
|
|
272
|
+
hints.push("prompt: review the node/agent prompt");
|
|
273
|
+
}
|
|
274
|
+
if (/\bmodel\b/.test(lower) || /\bcontext\s*length\b/.test(lower) || /\btoken/.test(lower)) {
|
|
275
|
+
hints.push(model ? `model: ${model}` : "model: check the model id/limits");
|
|
276
|
+
}
|
|
277
|
+
if (/\bapi[\s_-]?key\b/.test(lower) || /unauthorized|401|forbidden|403/.test(lower)) {
|
|
278
|
+
hints.push("auth: missing/invalid API key or permissions");
|
|
279
|
+
}
|
|
280
|
+
if (/timeout|timed out|etimedout/.test(lower)) {
|
|
281
|
+
hints.push("timeout: increase the run/request timeout or retry");
|
|
282
|
+
}
|
|
283
|
+
if (/rate.?limit|429/.test(lower)) {
|
|
284
|
+
hints.push("rate-limit: back off or lower concurrency");
|
|
285
|
+
}
|
|
286
|
+
return hints;
|
|
287
|
+
}
|
|
288
|
+
function buildFixLocus(failure, error, lastLlm) {
|
|
289
|
+
const model = lastLlm?.model ?? null;
|
|
290
|
+
const hints = extractHints(error, model);
|
|
291
|
+
const where = failure.kind === "node"
|
|
292
|
+
? `node ${failure.nodeName ?? failure.nodeId ?? "?"}` +
|
|
293
|
+
(failure.nodeType ? ` (${failure.nodeType})` : "")
|
|
294
|
+
: failure.kind === "step"
|
|
295
|
+
? `agent step ${failure.stepLabel ?? failure.stepId ?? "?"}`
|
|
296
|
+
: failure.kind === "job"
|
|
297
|
+
? "the job (no node attributed)"
|
|
298
|
+
: "the run";
|
|
299
|
+
const errPart = error ? ` — ${truncate(error, 160)}` : "";
|
|
300
|
+
const summary = `Start at ${where}${errPart}`;
|
|
301
|
+
return {
|
|
302
|
+
summary,
|
|
303
|
+
nodeType: failure.nodeType,
|
|
304
|
+
model,
|
|
305
|
+
hints
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
// ---------------------------------------------------------------------------
|
|
309
|
+
// diagnoseRun
|
|
310
|
+
// ---------------------------------------------------------------------------
|
|
311
|
+
/**
|
|
312
|
+
* Aggregate a failed run's job record, message stream, and trace spans into a
|
|
313
|
+
* single `DiagnosisReport`. Deterministic and side-effect-free.
|
|
314
|
+
*/
|
|
315
|
+
export function diagnoseRun(inputs) {
|
|
316
|
+
const { job, messages, spans, memory } = inputs;
|
|
317
|
+
const missing = [];
|
|
318
|
+
// ---- Failure site + error -------------------------------------------------
|
|
319
|
+
let findings = { failure: NO_SITE, error: null, failedAtMs: null, found: false };
|
|
320
|
+
if (messages && messages.length > 0) {
|
|
321
|
+
findings = scanMessages(messages);
|
|
322
|
+
}
|
|
323
|
+
else {
|
|
324
|
+
missing.push("messages");
|
|
325
|
+
}
|
|
326
|
+
// The job record can supply (or override-fill) the error and status even when
|
|
327
|
+
// the message stream named the failing node.
|
|
328
|
+
const jobStatus = job?.status ?? null;
|
|
329
|
+
const jobError = firstString(job?.error);
|
|
330
|
+
const jobFailed = jobStatus ? FAILED_JOB_STATUSES.has(jobStatus) : false;
|
|
331
|
+
let { failure, error } = findings;
|
|
332
|
+
let found = findings.found;
|
|
333
|
+
if (!found && (jobFailed || jobError)) {
|
|
334
|
+
failure = { ...NO_SITE, kind: "job" };
|
|
335
|
+
error = jobError;
|
|
336
|
+
found = true;
|
|
337
|
+
}
|
|
338
|
+
else if (found && !error && jobError) {
|
|
339
|
+
error = jobError;
|
|
340
|
+
}
|
|
341
|
+
if (!job)
|
|
342
|
+
missing.push("job");
|
|
343
|
+
// ---- Last LLM span --------------------------------------------------------
|
|
344
|
+
let lastLlm = null;
|
|
345
|
+
if (spans && spans.length > 0) {
|
|
346
|
+
const span = selectLastLlmSpan(spans, findings.failedAtMs);
|
|
347
|
+
if (span)
|
|
348
|
+
lastLlm = summarizeLlmSpan(span);
|
|
349
|
+
else
|
|
350
|
+
missing.push("llm-span");
|
|
351
|
+
}
|
|
352
|
+
else {
|
|
353
|
+
missing.push("trace");
|
|
354
|
+
}
|
|
355
|
+
// ---- Memory snapshot ------------------------------------------------------
|
|
356
|
+
let memorySnapshot = null;
|
|
357
|
+
if (memory && Object.keys(memory).length > 0) {
|
|
358
|
+
memorySnapshot = summarizeMemory(memory);
|
|
359
|
+
}
|
|
360
|
+
else {
|
|
361
|
+
missing.push("memory");
|
|
362
|
+
}
|
|
363
|
+
// ---- Verdict --------------------------------------------------------------
|
|
364
|
+
const ok = !found;
|
|
365
|
+
const fixLocus = ok ? null : buildFixLocus(failure, error, lastLlm);
|
|
366
|
+
return {
|
|
367
|
+
ok,
|
|
368
|
+
jobId: job?.id ?? null,
|
|
369
|
+
jobStatus,
|
|
370
|
+
failure: ok ? NO_SITE : failure,
|
|
371
|
+
error: ok ? null : error,
|
|
372
|
+
lastLlm,
|
|
373
|
+
memory: memorySnapshot,
|
|
374
|
+
fixLocus,
|
|
375
|
+
missing
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
// ---------------------------------------------------------------------------
|
|
379
|
+
// Human-readable rendering
|
|
380
|
+
// ---------------------------------------------------------------------------
|
|
381
|
+
/**
|
|
382
|
+
* Render a `DiagnosisReport` as a plain-text block for the terminal. Kept here
|
|
383
|
+
* (not in the CLI command) so the formatting is unit-testable and dependency-
|
|
384
|
+
* free; the command adds color separately if desired.
|
|
385
|
+
*/
|
|
386
|
+
export function renderDiagnosis(report) {
|
|
387
|
+
const lines = [];
|
|
388
|
+
const id = report.jobId ?? "(unknown job)";
|
|
389
|
+
if (report.ok) {
|
|
390
|
+
lines.push(`✓ No failure detected for ${id}.`);
|
|
391
|
+
if (report.jobStatus)
|
|
392
|
+
lines.push(` status: ${report.jobStatus}`);
|
|
393
|
+
if (report.missing.length > 0) {
|
|
394
|
+
lines.push(` sources missing: ${report.missing.join(", ")}`);
|
|
395
|
+
}
|
|
396
|
+
return lines.join("\n");
|
|
397
|
+
}
|
|
398
|
+
lines.push(`✗ Diagnosis for ${id}${report.jobStatus ? ` (${report.jobStatus})` : ""}`);
|
|
399
|
+
const f = report.failure;
|
|
400
|
+
const site = f.kind === "node"
|
|
401
|
+
? `node ${f.nodeName ?? f.nodeId ?? "?"}${f.nodeType ? ` [${f.nodeType}]` : ""}`
|
|
402
|
+
: f.kind === "step"
|
|
403
|
+
? `step ${f.stepLabel ?? f.stepId ?? "?"}`
|
|
404
|
+
: f.kind === "job"
|
|
405
|
+
? "job (no node attributed)"
|
|
406
|
+
: "unknown";
|
|
407
|
+
lines.push(` failure: ${site}`);
|
|
408
|
+
lines.push(` error: ${report.error ?? "(none reported)"}`);
|
|
409
|
+
if (report.lastLlm) {
|
|
410
|
+
const l = report.lastLlm;
|
|
411
|
+
const tok = l.inputTokens !== null || l.outputTokens !== null
|
|
412
|
+
? ` tokens=${l.inputTokens ?? "?"}/${l.outputTokens ?? "?"}`
|
|
413
|
+
: "";
|
|
414
|
+
lines.push(` last LLM (${l.name}): ${l.provider ?? "?"}/${l.model ?? "?"}${tok}` +
|
|
415
|
+
(l.statusCode ? ` status=${l.statusCode}` : ""));
|
|
416
|
+
if (l.responsePreview)
|
|
417
|
+
lines.push(` response: ${l.responsePreview}`);
|
|
418
|
+
}
|
|
419
|
+
else {
|
|
420
|
+
lines.push(" last LLM: (no trace span available)");
|
|
421
|
+
}
|
|
422
|
+
if (report.memory) {
|
|
423
|
+
lines.push(` memory: ${report.memory.keyCount} key(s): ${report.memory.keys.join(", ")}`);
|
|
424
|
+
}
|
|
425
|
+
if (report.fixLocus) {
|
|
426
|
+
lines.push(` → ${report.fixLocus.summary}`);
|
|
427
|
+
for (const hint of report.fixLocus.hints)
|
|
428
|
+
lines.push(` • ${hint}`);
|
|
429
|
+
}
|
|
430
|
+
if (report.missing.length > 0) {
|
|
431
|
+
lines.push(` sources missing: ${report.missing.join(", ")}`);
|
|
432
|
+
}
|
|
433
|
+
return lines.join("\n");
|
|
434
|
+
}
|
|
435
|
+
//# sourceMappingURL=diagnose.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnose.js","sourceRoot":"","sources":["../src/diagnose.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
export declare function createProgram(): Command;
|
|
3
|
+
export declare function run(argv: readonly string[]): Promise<void>;
|
|
4
|
+
export declare const feature: {
|
|
5
|
+
descriptor: {
|
|
6
|
+
id: string;
|
|
7
|
+
apiVersion: number;
|
|
8
|
+
requires: never[];
|
|
9
|
+
capabilities: string[];
|
|
10
|
+
};
|
|
11
|
+
run: typeof run;
|
|
12
|
+
};
|
|
13
|
+
export default feature;
|
|
14
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,wBAAgB,aAAa,IAAI,OAAO,CAMvC;AAED,wBAAsB,GAAG,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBhE;AAED,eAAO,MAAM,OAAO;;QAAmB,EAAE;QAAc,UAAU;QAAK,QAAQ;QAAM,YAAY;;;CAAiD,CAAC;eACnI,OAAO"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
import { Command } from "commander";
|
|
4
|
+
import { closePythonProviders } from "@nodetool-ai/cli-providers";
|
|
5
|
+
import { registerAgentCommands } from "./commands/agent.js";
|
|
6
|
+
import { registerAuthoringCommands } from "./commands/tools.js";
|
|
7
|
+
import { initializeCliRuntime } from "@nodetool-ai/cli-common/runtime-env";
|
|
8
|
+
import { configureCliPackHost } from "@nodetool-ai/cli-execution/packs/host";
|
|
9
|
+
export function createProgram() {
|
|
10
|
+
const program = new Command().name("nodetool");
|
|
11
|
+
program.command("chat").description("Start interactive chat (chat --help for options)");
|
|
12
|
+
registerAgentCommands(program);
|
|
13
|
+
registerAuthoringCommands(program);
|
|
14
|
+
return program;
|
|
15
|
+
}
|
|
16
|
+
export async function run(argv) {
|
|
17
|
+
initializeCliRuntime(import.meta.url);
|
|
18
|
+
configureCliPackHost(import.meta.url);
|
|
19
|
+
if (argv[0] === "chat") {
|
|
20
|
+
const entry = new URL(import.meta.url.endsWith(".ts") ? "./chat-entry.ts" : "./chat-entry.js", import.meta.url);
|
|
21
|
+
await new Promise((resolve, reject) => {
|
|
22
|
+
const child = spawn(process.execPath, [...process.execArgv, fileURLToPath(entry), ...argv.slice(1)], { stdio: "inherit" });
|
|
23
|
+
child.once("error", reject);
|
|
24
|
+
child.once("exit", (code, signal) => {
|
|
25
|
+
process.exitCode = code ?? (signal ? 1 : 0);
|
|
26
|
+
resolve();
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
await createProgram().parseAsync([...argv], { from: "user" });
|
|
33
|
+
}
|
|
34
|
+
finally {
|
|
35
|
+
await closePythonProviders();
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export const feature = { descriptor: { id: "cli-chat", apiVersion: 1, requires: [], capabilities: ["cli:chat", "cli:agent", "cli:tools"] }, run };
|
|
39
|
+
export default feature;
|
|
40
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAE7E,MAAM,UAAU,aAAa;IAC3B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC/C,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,kDAAkD,CAAC,CAAC;IACxF,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAC/B,yBAAyB,CAAC,OAAO,CAAC,CAAC;IACnC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,GAAG,CAAC,IAAuB;IAC/C,oBAAoB,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;IACtC,oBAAoB,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,iBAAiB,EAAE,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;QAChH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,GAAG,OAAO,CAAC,QAAQ,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YAC3H,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;gBAClC,OAAO,CAAC,QAAQ,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC5C,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,MAAM,aAAa,EAAE,CAAC,UAAU,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAChE,CAAC;YAAS,CAAC;QACT,MAAM,oBAAoB,EAAE,CAAC;IAC/B,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC,UAAU,EAAE,WAAW,EAAE,WAAW,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC;AAClJ,eAAe,OAAO,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Markdown rendering for the terminal.
|
|
3
|
+
* Uses marked + marked-terminal for full markdown support including
|
|
4
|
+
* syntax-highlighted code blocks, tables, bold/italic, links.
|
|
5
|
+
*/
|
|
6
|
+
export declare function renderMarkdown(text: string): Promise<string>;
|
|
7
|
+
/** Synchronous fallback — strips markdown syntax for plain display. */
|
|
8
|
+
export declare function stripMarkdown(text: string): string;
|
|
9
|
+
//# sourceMappingURL=markdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA6BlE;AAED,uEAAuE;AACvE,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQlD"}
|
package/dist/markdown.js
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Markdown rendering for the terminal.
|
|
3
|
+
* Uses marked + marked-terminal for full markdown support including
|
|
4
|
+
* syntax-highlighted code blocks, tables, bold/italic, links.
|
|
5
|
+
*/
|
|
6
|
+
import { marked } from "marked";
|
|
7
|
+
import { isString } from "@nodetool-ai/cli-common/predicates";
|
|
8
|
+
// Cache so we only set the extension once
|
|
9
|
+
let _initialized = false;
|
|
10
|
+
let _available = false;
|
|
11
|
+
export async function renderMarkdown(text) {
|
|
12
|
+
if (!_initialized) {
|
|
13
|
+
try {
|
|
14
|
+
// marked-terminal v7 exports markedTerminal() as a MarkedExtension factory
|
|
15
|
+
const mod = await import("marked-terminal");
|
|
16
|
+
const markedTerminal = mod.markedTerminal ?? mod.default;
|
|
17
|
+
marked.use(markedTerminal({
|
|
18
|
+
width: process.stdout.columns ?? 80,
|
|
19
|
+
emoji: false,
|
|
20
|
+
tab: 2,
|
|
21
|
+
showSectionPrefix: false,
|
|
22
|
+
reflowText: false
|
|
23
|
+
}));
|
|
24
|
+
_available = true;
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
// Keep Markdown readable rather than returning marked's HTML renderer.
|
|
28
|
+
}
|
|
29
|
+
_initialized = true;
|
|
30
|
+
}
|
|
31
|
+
if (!_available)
|
|
32
|
+
return text;
|
|
33
|
+
try {
|
|
34
|
+
const result = marked(text);
|
|
35
|
+
if (isString(result))
|
|
36
|
+
return result;
|
|
37
|
+
return await result;
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
return text; // fallback to raw text on render error
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/** Synchronous fallback — strips markdown syntax for plain display. */
|
|
44
|
+
export function stripMarkdown(text) {
|
|
45
|
+
return text
|
|
46
|
+
.replace(/```[\s\S]*?```/g, "[code]")
|
|
47
|
+
.replace(/`([^`]+)`/g, "$1")
|
|
48
|
+
.replace(/\*\*([^*]+)\*\*/g, "$1")
|
|
49
|
+
.replace(/\*([^*]+)\*/g, "$1")
|
|
50
|
+
.replace(/^#{1,6}\s+/gm, "")
|
|
51
|
+
.replace(/\[([^\]]+)\]\([^)]+\)/g, "$1");
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAE9D,0CAA0C;AAC1C,IAAI,YAAY,GAAG,KAAK,CAAC;AACzB,IAAI,UAAU,GAAG,KAAK,CAAC;AACvB,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAY;IAC/C,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,IAAI,CAAC;YACH,2EAA2E;YAC3E,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;YAC5C,MAAM,cAAc,GAAG,GAAG,CAAC,cAAc,IAAI,GAAG,CAAC,OAAO,CAAC;YACzD,MAAM,CAAC,GAAG,CACR,cAAc,CAAC;gBACb,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE;gBACnC,KAAK,EAAE,KAAK;gBACZ,GAAG,EAAE,CAAC;gBACN,iBAAiB,EAAE,KAAK;gBACxB,UAAU,EAAE,KAAK;aAClB,CAAC,CACH,CAAC;YACF,UAAU,GAAG,IAAI,CAAC;QACpB,CAAC;QAAC,MAAM,CAAC;YACP,uEAAuE;QACzE,CAAC;QACD,YAAY,GAAG,IAAI,CAAC;IACtB,CAAC;IACD,IAAI,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,MAAM,CAAC;QACpC,OAAO,MAAM,MAAM,CAAC;IACtB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC,CAAC,uCAAuC;IACtD,CAAC;AACH,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,IAAI;SACR,OAAO,CAAC,iBAAiB,EAAE,QAAQ,CAAC;SACpC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC;SAC3B,OAAO,CAAC,kBAAkB,EAAE,IAAI,CAAC;SACjC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC;SAC7B,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC;SAC3B,OAAO,CAAC,wBAAwB,EAAE,IAAI,CAAC,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nodetool.d.ts","sourceRoot":"","sources":["../src/nodetool.ts"],"names":[],"mappings":""}
|
package/dist/nodetool.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nodetool.js","sourceRoot":"","sources":["../src/nodetool.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AACjC,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC"}
|