@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,206 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { asJson } from "@nodetool-ai/cli-common/commands/output";
|
|
3
|
+
import { commandFailureExitCode, printCommandError } from "@nodetool-ai/pack-manager/command-errors";
|
|
4
|
+
import { isRecord } from "@nodetool-ai/cli-common/predicates";
|
|
5
|
+
import { setupLocalDb, LOCAL_USER_ID } from "@nodetool-ai/cli-local/local-db";
|
|
6
|
+
async function localTools() {
|
|
7
|
+
const { buildCliToolbelt } = await import("../agent-toolbelt.js");
|
|
8
|
+
const { buildFullRegistry } = await import("@nodetool-ai/cli-execution/node-registry");
|
|
9
|
+
const registry = await buildFullRegistry();
|
|
10
|
+
const { toolForCapabilityName } = await import("@nodetool-ai/agents");
|
|
11
|
+
const byName = new Map(buildCliToolbelt({}, registry).map((tool) => [tool.name, tool]));
|
|
12
|
+
// Model discovery is provider-backed at invocation, but its schema is static.
|
|
13
|
+
for (const name of ["find_model", "list_models"]) {
|
|
14
|
+
if (!byName.has(name)) {
|
|
15
|
+
byName.set(name, toolForCapabilityName(name));
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
const tools = [...byName.values()];
|
|
19
|
+
return {
|
|
20
|
+
list: async () => tools,
|
|
21
|
+
call: async (name, args) => {
|
|
22
|
+
if (!tools.some((candidate) => candidate.name === name)) {
|
|
23
|
+
throw new Error(`Unknown tool: ${name}. Use nodetool tools list to discover names.`);
|
|
24
|
+
}
|
|
25
|
+
const { getDefaultDbPath } = await import("@nodetool-ai/config");
|
|
26
|
+
const { migrateSqliteDb, Project } = await import("@nodetool-ai/models");
|
|
27
|
+
await migrateSqliteDb(getDefaultDbPath());
|
|
28
|
+
await setupLocalDb();
|
|
29
|
+
await Project.ensurePersonal(LOCAL_USER_ID);
|
|
30
|
+
const { buildConfiguredProviders } = await import("@nodetool-ai/cli-providers");
|
|
31
|
+
const providers = await buildConfiguredProviders();
|
|
32
|
+
const tool = buildCliToolbelt(providers, registry).find((candidate) => candidate.name === name);
|
|
33
|
+
if (!tool) {
|
|
34
|
+
throw new Error(`No configured providers are available for ${name}. Configure a provider before calling this tool.`);
|
|
35
|
+
}
|
|
36
|
+
const { createChatContext } = await import("../chat-context.js");
|
|
37
|
+
const context = await createChatContext({
|
|
38
|
+
workspaceDir: process.cwd(),
|
|
39
|
+
userId: LOCAL_USER_ID
|
|
40
|
+
});
|
|
41
|
+
for (const [id, provider] of Object.entries(providers)) {
|
|
42
|
+
context.registerProvider(id, provider);
|
|
43
|
+
}
|
|
44
|
+
const { RUN_BUDGET_CONTEXT_KEY } = await import("@nodetool-ai/runtime");
|
|
45
|
+
const { PERMISSION_GATE_CONTEXT_KEY, headlessGate } = await import("@nodetool-ai/agents");
|
|
46
|
+
const { createCliRunBudget } = await import("@nodetool-ai/cli-execution/run-budget");
|
|
47
|
+
context.set(RUN_BUDGET_CONTEXT_KEY, await createCliRunBudget());
|
|
48
|
+
context.set(PERMISSION_GATE_CONTEXT_KEY, headlessGate("CLI tool call"));
|
|
49
|
+
const { attachRunCostLedger } = await import("@nodetool-ai/execution");
|
|
50
|
+
const ledger = attachRunCostLedger(context, {
|
|
51
|
+
userId: LOCAL_USER_ID,
|
|
52
|
+
workflowId: null
|
|
53
|
+
});
|
|
54
|
+
const controller = new AbortController();
|
|
55
|
+
const cancel = () => controller.abort(new Error("Tool call interrupted"));
|
|
56
|
+
context.signal = controller.signal;
|
|
57
|
+
process.once("SIGINT", cancel);
|
|
58
|
+
process.once("SIGTERM", cancel);
|
|
59
|
+
try {
|
|
60
|
+
return await tool.execute(context, args);
|
|
61
|
+
}
|
|
62
|
+
finally {
|
|
63
|
+
await ledger.settled();
|
|
64
|
+
ledger();
|
|
65
|
+
process.removeListener("SIGINT", cancel);
|
|
66
|
+
process.removeListener("SIGTERM", cancel);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
export async function parseToolArguments(raw) {
|
|
72
|
+
const value = JSON.parse(raw.startsWith("@") ? await readFile(raw.slice(1), "utf8") : raw);
|
|
73
|
+
if (!isRecord(value)) {
|
|
74
|
+
throw new Error("--args must be a JSON object or @path to a JSON object file.");
|
|
75
|
+
}
|
|
76
|
+
return value;
|
|
77
|
+
}
|
|
78
|
+
/** Inspect only result envelopes whose tool contracts define failure statuses. */
|
|
79
|
+
function toolCallFailed(name, result) {
|
|
80
|
+
if (!isRecord(result)) {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
if (commandFailureExitCode(result) === 3 ||
|
|
84
|
+
result.error ||
|
|
85
|
+
result.isError === true ||
|
|
86
|
+
result.success === false ||
|
|
87
|
+
result.ok === false) {
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
switch (name) {
|
|
91
|
+
case "get_node_info":
|
|
92
|
+
case "search_nodes":
|
|
93
|
+
return result.status === "error";
|
|
94
|
+
case "run_node":
|
|
95
|
+
case "run_workflow":
|
|
96
|
+
case "resolve_workflow_escalation":
|
|
97
|
+
return result.status === "failed" || result.status === "error";
|
|
98
|
+
case "debug_app":
|
|
99
|
+
return (result.status === "failed" ||
|
|
100
|
+
(isRecord(result.verdict) && result.verdict.ok === false));
|
|
101
|
+
case "debug_workflow":
|
|
102
|
+
return (isRecord(result.run) &&
|
|
103
|
+
(result.run.status === "failed" ||
|
|
104
|
+
result.run.status === "error" ||
|
|
105
|
+
Boolean(result.run.error) ||
|
|
106
|
+
(isRecord(result.run.verdict) && result.run.verdict.ok === false)));
|
|
107
|
+
default:
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
export const AUTHORING_HELP = `
|
|
112
|
+
Authoring tools and starting documents:
|
|
113
|
+
nodetool tools list timeline
|
|
114
|
+
nodetool tools info create_timeline
|
|
115
|
+
nodetool skills list
|
|
116
|
+
nodetool skills read storyboard-core
|
|
117
|
+
nodetool skills read motion-graphics
|
|
118
|
+
nodetool skills read nodetool-workflow-builder
|
|
119
|
+
nodetool skills read nodetool-app-builder
|
|
120
|
+
nodetool skills read native-game
|
|
121
|
+
nodetool tools call list_projects
|
|
122
|
+
nodetool tools call create_timeline --args '{"name":"My timeline"}'
|
|
123
|
+
nodetool tools call <name> --args @arguments.json
|
|
124
|
+
|
|
125
|
+
Tools expose their current input schemas. Read the matching shipped guide
|
|
126
|
+
before creating workflows, timelines, motion graphics, mini apps, or games.
|
|
127
|
+
`;
|
|
128
|
+
export function registerAuthoringCommands(program, load = localTools) {
|
|
129
|
+
const run = async (name, args) => {
|
|
130
|
+
try {
|
|
131
|
+
const result = await (await load()).call(name, args);
|
|
132
|
+
asJson(result);
|
|
133
|
+
if (toolCallFailed(name, result)) {
|
|
134
|
+
const failure = name === "debug_workflow" && isRecord(result) && isRecord(result.run)
|
|
135
|
+
? result.run
|
|
136
|
+
: result;
|
|
137
|
+
process.exitCode = commandFailureExitCode(failure);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
process.exitCode = printCommandError(error, true);
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
const tools = program
|
|
145
|
+
.command("tools")
|
|
146
|
+
.description("Discover tool schemas and call local authoring tools")
|
|
147
|
+
.addHelpText("after", AUTHORING_HELP);
|
|
148
|
+
tools
|
|
149
|
+
.command("list [query]")
|
|
150
|
+
.description("List tool names and descriptions, optionally filtered")
|
|
151
|
+
.action(async (query) => {
|
|
152
|
+
const matches = (await (await load()).list()).filter((tool) => !query ||
|
|
153
|
+
`${tool.name} ${tool.description}`
|
|
154
|
+
.toLowerCase()
|
|
155
|
+
.includes(query.toLowerCase()));
|
|
156
|
+
asJson(matches.map((tool) => ({
|
|
157
|
+
name: tool.name,
|
|
158
|
+
description: tool.description
|
|
159
|
+
})));
|
|
160
|
+
});
|
|
161
|
+
tools
|
|
162
|
+
.command("info <name>")
|
|
163
|
+
.description("Print the authoritative input schema for a tool")
|
|
164
|
+
.action(async (name) => {
|
|
165
|
+
const tool = (await (await load()).list()).find((candidate) => candidate.name === name);
|
|
166
|
+
if (!tool) {
|
|
167
|
+
throw new Error(`Unknown tool: ${name}. Use nodetool tools list.`);
|
|
168
|
+
}
|
|
169
|
+
asJson({
|
|
170
|
+
name: tool.name,
|
|
171
|
+
description: tool.description,
|
|
172
|
+
inputSchema: tool.inputSchema
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
tools
|
|
176
|
+
.command("call <name>")
|
|
177
|
+
.description("Execute a local tool. Calls can save documents, run jobs, or use configured providers.")
|
|
178
|
+
.option("--args <json|@file>", "JSON arguments, inline or read from a file", "{}")
|
|
179
|
+
.action(async (name, options) => run(name, await parseToolArguments(options.args)));
|
|
180
|
+
const skills = program
|
|
181
|
+
.command("skills")
|
|
182
|
+
.description("Find and read installed authoring guides and user skills");
|
|
183
|
+
skills
|
|
184
|
+
.command("list [query]")
|
|
185
|
+
.description("Search the installed skill catalog")
|
|
186
|
+
.action(async (query) => run("list_skills", query ? { query } : {}));
|
|
187
|
+
skills
|
|
188
|
+
.command("read <name>")
|
|
189
|
+
.description("Read a guide, including its starting examples and tool instructions")
|
|
190
|
+
.action(async (name) => run("load_skill", { name }));
|
|
191
|
+
program.addHelpText("after", AUTHORING_HELP);
|
|
192
|
+
for (const name of [
|
|
193
|
+
"timeline",
|
|
194
|
+
"game",
|
|
195
|
+
"app",
|
|
196
|
+
"apps",
|
|
197
|
+
"workflows",
|
|
198
|
+
"jsscript",
|
|
199
|
+
"sketch"
|
|
200
|
+
]) {
|
|
201
|
+
program.commands
|
|
202
|
+
.find((command) => command.name() === name)
|
|
203
|
+
?.addHelpText("after", AUTHORING_HELP);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/commands/tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,139 @@
|
|
|
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 type { ProcessingMessage } from "@nodetool-ai/protocol";
|
|
18
|
+
/** A failed run/job record, as returned by `jobs.get` (subset we read). */
|
|
19
|
+
export interface DiagnoseJob {
|
|
20
|
+
id: string;
|
|
21
|
+
status?: string;
|
|
22
|
+
error?: string | null;
|
|
23
|
+
workflowId?: string | null;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* One OpenTelemetry span, loosely typed. Structurally compatible with the debug
|
|
27
|
+
* harness `TraceSpan`, but only the fields the diagnoser reads are required so
|
|
28
|
+
* callers can pass either parsed JSONL lines or richer span objects.
|
|
29
|
+
*/
|
|
30
|
+
/** An OpenTelemetry attribute value, as the trace JSONL carries it. */
|
|
31
|
+
export type SpanAttributeValue = string | number | boolean | null | Array<string | number | boolean | null>;
|
|
32
|
+
export interface TraceSpanLite {
|
|
33
|
+
name: string;
|
|
34
|
+
span_id?: string;
|
|
35
|
+
parent_span_id?: string | null;
|
|
36
|
+
start_time_ms?: number;
|
|
37
|
+
end_time_ms?: number;
|
|
38
|
+
attributes?: Record<string, SpanAttributeValue>;
|
|
39
|
+
status?: {
|
|
40
|
+
code?: string;
|
|
41
|
+
message?: string;
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Everything `diagnoseRun` needs. Every field is optional so the diagnoser
|
|
46
|
+
* degrades gracefully when a source is unavailable (it reports what was
|
|
47
|
+
* missing rather than crashing).
|
|
48
|
+
*/
|
|
49
|
+
export interface DiagnoseInputs {
|
|
50
|
+
job?: DiagnoseJob;
|
|
51
|
+
/** Processing messages from the run (e.g. a bundle's messages.jsonl). */
|
|
52
|
+
messages?: ReadonlyArray<ProcessingMessage | Record<string, unknown>>;
|
|
53
|
+
/** Trace spans (e.g. a parsed trace.jsonl). */
|
|
54
|
+
spans?: ReadonlyArray<TraceSpanLite>;
|
|
55
|
+
/** A memory/state snapshot captured at failure. */
|
|
56
|
+
memory?: Record<string, unknown>;
|
|
57
|
+
}
|
|
58
|
+
/** The node or step the run failed on. */
|
|
59
|
+
interface FailureSite {
|
|
60
|
+
/** Where the failure was identified. */
|
|
61
|
+
kind: "node" | "step" | "job" | "unknown";
|
|
62
|
+
/** Node id, when a failing node was found. */
|
|
63
|
+
nodeId: string | null;
|
|
64
|
+
/** Node type, when known (e.g. "nodetool.text.Concatenate"). */
|
|
65
|
+
nodeType: string | null;
|
|
66
|
+
/** Node display name, when known. */
|
|
67
|
+
nodeName: string | null;
|
|
68
|
+
/** Step id, when the failure came from an agent step. */
|
|
69
|
+
stepId: string | null;
|
|
70
|
+
/** Step instructions/title, when known. */
|
|
71
|
+
stepLabel: string | null;
|
|
72
|
+
}
|
|
73
|
+
/** Summary of the last LLM call before the failure. */
|
|
74
|
+
interface LastLlmSummary {
|
|
75
|
+
/** Span name — "llm.chat" or "llm.stream". */
|
|
76
|
+
name: string;
|
|
77
|
+
provider: string | null;
|
|
78
|
+
model: string | null;
|
|
79
|
+
inputTokens: number | null;
|
|
80
|
+
outputTokens: number | null;
|
|
81
|
+
totalTokens: number | null;
|
|
82
|
+
costUsd: number | null;
|
|
83
|
+
/** Truncated `llm.response.content` from the span attributes. */
|
|
84
|
+
responsePreview: string | null;
|
|
85
|
+
durationMs: number | null;
|
|
86
|
+
/** Span status code, when present (e.g. "ERROR"). */
|
|
87
|
+
statusCode: string | null;
|
|
88
|
+
}
|
|
89
|
+
/** Compact view of the memory/state snapshot at failure. */
|
|
90
|
+
interface MemorySnapshot {
|
|
91
|
+
/** Number of top-level keys. */
|
|
92
|
+
keyCount: number;
|
|
93
|
+
/** Top-level keys (capped). */
|
|
94
|
+
keys: string[];
|
|
95
|
+
/** Per-key one-line value previews (capped, truncated). */
|
|
96
|
+
preview: Record<string, string>;
|
|
97
|
+
}
|
|
98
|
+
/** A heuristic pointer at where to start fixing. */
|
|
99
|
+
interface FixLocus {
|
|
100
|
+
/** One-line, human-readable starting point. */
|
|
101
|
+
summary: string;
|
|
102
|
+
/** Failing node type, when derivable. */
|
|
103
|
+
nodeType: string | null;
|
|
104
|
+
/** Model implicated by the last LLM call, when derivable. */
|
|
105
|
+
model: string | null;
|
|
106
|
+
/** Concrete hints (prompt/model/file references) extracted from the error. */
|
|
107
|
+
hints: string[];
|
|
108
|
+
}
|
|
109
|
+
export interface DiagnosisReport {
|
|
110
|
+
/** True when no failure could be identified from any source. */
|
|
111
|
+
ok: boolean;
|
|
112
|
+
jobId: string | null;
|
|
113
|
+
jobStatus: string | null;
|
|
114
|
+
/** The node/step the run failed on. */
|
|
115
|
+
failure: FailureSite;
|
|
116
|
+
/** The failure message, normalized to a single string. */
|
|
117
|
+
error: string | null;
|
|
118
|
+
/** The last llm.chat/llm.stream span at or before the failure. */
|
|
119
|
+
lastLlm: LastLlmSummary | null;
|
|
120
|
+
/** Memory/state snapshot summary, when a snapshot was supplied. */
|
|
121
|
+
memory: MemorySnapshot | null;
|
|
122
|
+
/** Where to start fixing. Null only when there's no failure. */
|
|
123
|
+
fixLocus: FixLocus | null;
|
|
124
|
+
/** Sources that were absent — surfaced so callers see partial coverage. */
|
|
125
|
+
missing: string[];
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Aggregate a failed run's job record, message stream, and trace spans into a
|
|
129
|
+
* single `DiagnosisReport`. Deterministic and side-effect-free.
|
|
130
|
+
*/
|
|
131
|
+
export declare function diagnoseRun(inputs: DiagnoseInputs): DiagnosisReport;
|
|
132
|
+
/**
|
|
133
|
+
* Render a `DiagnosisReport` as a plain-text block for the terminal. Kept here
|
|
134
|
+
* (not in the CLI command) so the formatting is unit-testable and dependency-
|
|
135
|
+
* free; the command adds color separately if desired.
|
|
136
|
+
*/
|
|
137
|
+
export declare function renderDiagnosis(report: DiagnosisReport): string;
|
|
138
|
+
export {};
|
|
139
|
+
//# sourceMappingURL=diagnose.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnose.d.ts","sourceRoot":"","sources":["../src/diagnose.ts"],"names":[],"mappings":"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"}
|