agent-nuvira 3.3.7 → 3.3.9
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 +57 -50
- package/dist/agents/agents/planner.d.ts.map +1 -1
- package/dist/agents/agents/planner.js +41 -0
- package/dist/agents/agents/planner.js.map +1 -1
- package/dist/agents/agents/reasoner.d.ts.map +1 -1
- package/dist/agents/agents/reasoner.js +6 -0
- package/dist/agents/agents/reasoner.js.map +1 -1
- package/dist/agents/agents/runner.d.ts +6 -0
- package/dist/agents/agents/runner.d.ts.map +1 -1
- package/dist/agents/agents/runner.js +82 -5
- package/dist/agents/agents/runner.js.map +1 -1
- package/dist/agents/agents/writer-tool-calling.d.ts.map +1 -1
- package/dist/agents/agents/writer-tool-calling.js +5 -2
- package/dist/agents/agents/writer-tool-calling.js.map +1 -1
- package/dist/agents/agents/writer.d.ts.map +1 -1
- package/dist/agents/agents/writer.js +8 -4
- package/dist/agents/agents/writer.js.map +1 -1
- package/dist/agents/fanout-scheduler.d.ts +72 -0
- package/dist/agents/fanout-scheduler.d.ts.map +1 -0
- package/dist/agents/fanout-scheduler.js +100 -0
- package/dist/agents/fanout-scheduler.js.map +1 -0
- package/dist/agents/orchestrator.d.ts.map +1 -1
- package/dist/agents/orchestrator.js +30 -1
- package/dist/agents/orchestrator.js.map +1 -1
- package/dist/agents/plan-quality.d.ts +58 -0
- package/dist/agents/plan-quality.d.ts.map +1 -0
- package/dist/agents/plan-quality.js +152 -0
- package/dist/agents/plan-quality.js.map +1 -0
- package/dist/agents/prompt-assembly.d.ts +8 -0
- package/dist/agents/prompt-assembly.d.ts.map +1 -1
- package/dist/agents/prompt-assembly.js +18 -0
- package/dist/agents/prompt-assembly.js.map +1 -1
- package/dist/agents/step-handoff.d.ts +12 -2
- package/dist/agents/step-handoff.d.ts.map +1 -1
- package/dist/agents/step-handoff.js +65 -8
- package/dist/agents/step-handoff.js.map +1 -1
- package/dist/agents/tool-calling-agent.d.ts.map +1 -1
- package/dist/agents/tool-calling-agent.js +18 -0
- package/dist/agents/tool-calling-agent.js.map +1 -1
- package/dist/cli/cache.d.ts.map +1 -1
- package/dist/cli/cache.js +34 -4
- package/dist/cli/cache.js.map +1 -1
- package/dist/cli/chat.d.ts +6 -0
- package/dist/cli/chat.d.ts.map +1 -1
- package/dist/cli/chat.js +79 -18
- package/dist/cli/chat.js.map +1 -1
- package/dist/cli/cli-program.d.ts.map +1 -1
- package/dist/cli/cli-program.js +6 -0
- package/dist/cli/cli-program.js.map +1 -1
- package/dist/cli/config.d.ts +10 -0
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/config.js +179 -1
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/continuity.d.ts +61 -0
- package/dist/cli/continuity.d.ts.map +1 -0
- package/dist/cli/continuity.js +112 -0
- package/dist/cli/continuity.js.map +1 -0
- package/dist/cli/dashboard.d.ts +3 -1
- package/dist/cli/dashboard.d.ts.map +1 -1
- package/dist/cli/dashboard.js +5 -16
- package/dist/cli/dashboard.js.map +1 -1
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +48 -1
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/execute.d.ts +8 -0
- package/dist/cli/execute.d.ts.map +1 -1
- package/dist/cli/execute.js +34 -1
- package/dist/cli/execute.js.map +1 -1
- package/dist/cli/loop-executor.d.ts +24 -0
- package/dist/cli/loop-executor.d.ts.map +1 -1
- package/dist/cli/loop-executor.js +134 -13
- package/dist/cli/loop-executor.js.map +1 -1
- package/dist/cli/website.d.ts +25 -0
- package/dist/cli/website.d.ts.map +1 -0
- package/dist/cli/website.js +58 -0
- package/dist/cli/website.js.map +1 -0
- package/dist/config/manager.d.ts.map +1 -1
- package/dist/config/manager.js +35 -0
- package/dist/config/manager.js.map +1 -1
- package/dist/config/process-env.d.ts.map +1 -1
- package/dist/config/process-env.js +20 -0
- package/dist/config/process-env.js.map +1 -1
- package/dist/config/provider-env.d.ts +2 -1
- package/dist/config/provider-env.d.ts.map +1 -1
- package/dist/config/provider-env.js +19 -2
- package/dist/config/provider-env.js.map +1 -1
- package/dist/config/service-catalog.d.ts +81 -0
- package/dist/config/service-catalog.d.ts.map +1 -0
- package/dist/config/service-catalog.js +286 -0
- package/dist/config/service-catalog.js.map +1 -0
- package/dist/config/service-probe.d.ts +27 -0
- package/dist/config/service-probe.d.ts.map +1 -0
- package/dist/config/service-probe.js +104 -0
- package/dist/config/service-probe.js.map +1 -0
- package/dist/config/types.d.ts +63 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/context/cache.d.ts +46 -2
- package/dist/context/cache.d.ts.map +1 -1
- package/dist/context/cache.js +85 -7
- package/dist/context/cache.js.map +1 -1
- package/dist/findings/verdicts.d.ts +59 -0
- package/dist/findings/verdicts.d.ts.map +1 -1
- package/dist/findings/verdicts.js +117 -0
- package/dist/findings/verdicts.js.map +1 -1
- package/dist/forwarded.d.ts +2 -0
- package/dist/forwarded.d.ts.map +1 -0
- package/dist/forwarded.js +2 -0
- package/dist/forwarded.js.map +1 -0
- package/dist/gateway/registry.d.ts.map +1 -1
- package/dist/gateway/registry.js +9 -0
- package/dist/gateway/registry.js.map +1 -1
- package/dist/learning/auto-router.d.ts +30 -0
- package/dist/learning/auto-router.d.ts.map +1 -1
- package/dist/learning/auto-router.js +69 -12
- package/dist/learning/auto-router.js.map +1 -1
- package/dist/learning/context-assembly.d.ts +37 -0
- package/dist/learning/context-assembly.d.ts.map +1 -0
- package/dist/learning/context-assembly.js +63 -0
- package/dist/learning/context-assembly.js.map +1 -0
- package/dist/learning/reasoning-trace.d.ts +26 -5
- package/dist/learning/reasoning-trace.d.ts.map +1 -1
- package/dist/learning/reasoning-trace.js +21 -1
- package/dist/learning/reasoning-trace.js.map +1 -1
- package/dist/learning/session-digest.d.ts +78 -0
- package/dist/learning/session-digest.d.ts.map +1 -0
- package/dist/learning/session-digest.js +185 -0
- package/dist/learning/session-digest.js.map +1 -0
- package/dist/learning/session-recall.d.ts +135 -0
- package/dist/learning/session-recall.d.ts.map +1 -0
- package/dist/learning/session-recall.js +305 -0
- package/dist/learning/session-recall.js.map +1 -0
- package/dist/learning/session-store.d.ts +172 -0
- package/dist/learning/session-store.d.ts.map +1 -0
- package/dist/learning/session-store.js +424 -0
- package/dist/learning/session-store.js.map +1 -0
- package/dist/learning/step-checkpoint.d.ts +28 -0
- package/dist/learning/step-checkpoint.d.ts.map +1 -1
- package/dist/learning/step-checkpoint.js +90 -6
- package/dist/learning/step-checkpoint.js.map +1 -1
- package/dist/learning/working-state.d.ts +19 -0
- package/dist/learning/working-state.d.ts.map +1 -1
- package/dist/learning/working-state.js +34 -1
- package/dist/learning/working-state.js.map +1 -1
- package/dist/parity/drivers.d.ts.map +1 -1
- package/dist/parity/drivers.js +29 -0
- package/dist/parity/drivers.js.map +1 -1
- package/dist/parity/wire-fixtures.d.ts +88 -0
- package/dist/parity/wire-fixtures.d.ts.map +1 -0
- package/dist/parity/wire-fixtures.js +405 -0
- package/dist/parity/wire-fixtures.js.map +1 -0
- package/dist/tools/artifact-append.d.ts +23 -0
- package/dist/tools/artifact-append.d.ts.map +1 -1
- package/dist/tools/artifact-append.js +28 -0
- package/dist/tools/artifact-append.js.map +1 -1
- package/dist/tools/ask-user.d.ts +5 -0
- package/dist/tools/ask-user.d.ts.map +1 -1
- package/dist/tools/ask-user.js +51 -5
- package/dist/tools/ask-user.js.map +1 -1
- package/dist/tools/child-agent-entry.js +1 -0
- package/dist/tools/child-agent-entry.js.map +1 -1
- package/dist/tools/child-agent-runtime.d.ts +7 -0
- package/dist/tools/child-agent-runtime.d.ts.map +1 -1
- package/dist/tools/child-agent-runtime.js +116 -6
- package/dist/tools/child-agent-runtime.js.map +1 -1
- package/dist/tools/child-agent-worker.d.ts +15 -0
- package/dist/tools/child-agent-worker.d.ts.map +1 -0
- package/dist/tools/child-agent-worker.js.map +1 -0
- package/dist/tools/coding-tools.d.ts.map +1 -1
- package/dist/tools/coding-tools.js +11 -0
- package/dist/tools/coding-tools.js.map +1 -1
- package/dist/tools/finding-tool.d.ts +6 -1
- package/dist/tools/finding-tool.d.ts.map +1 -1
- package/dist/tools/finding-tool.js +15 -2
- package/dist/tools/finding-tool.js.map +1 -1
- package/dist/tools/followup-utils.d.ts +35 -0
- package/dist/tools/followup-utils.d.ts.map +1 -1
- package/dist/tools/followup-utils.js +36 -0
- package/dist/tools/followup-utils.js.map +1 -1
- package/dist/tools/loop-project-context.d.ts +4 -1
- package/dist/tools/loop-project-context.d.ts.map +1 -1
- package/dist/tools/loop-project-context.js +48 -1
- package/dist/tools/loop-project-context.js.map +1 -1
- package/dist/tools/loop-skill-hint.d.ts.map +1 -1
- package/dist/tools/loop-skill-hint.js +7 -0
- package/dist/tools/loop-skill-hint.js.map +1 -1
- package/dist/tools/modality/image-gen.d.ts +25 -6
- package/dist/tools/modality/image-gen.d.ts.map +1 -1
- package/dist/tools/modality/image-gen.js +46 -27
- package/dist/tools/modality/image-gen.js.map +1 -1
- package/dist/tools/modality/image-providers.d.ts +71 -0
- package/dist/tools/modality/image-providers.d.ts.map +1 -0
- package/dist/tools/modality/image-providers.js +277 -0
- package/dist/tools/modality/image-providers.js.map +1 -0
- package/dist/tools/registry.d.ts +10 -1
- package/dist/tools/registry.d.ts.map +1 -1
- package/dist/tools/registry.js +35 -8
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/run-cli.d.ts.map +1 -1
- package/dist/tools/run-cli.js +39 -1
- package/dist/tools/run-cli.js.map +1 -1
- package/dist/tools/run-terminal.d.ts.map +1 -1
- package/dist/tools/run-terminal.js +50 -6
- package/dist/tools/run-terminal.js.map +1 -1
- package/dist/tools/subagent-spawner.d.ts +8 -0
- package/dist/tools/subagent-spawner.d.ts.map +1 -1
- package/dist/tools/subagent-spawner.js +3 -0
- package/dist/tools/subagent-spawner.js.map +1 -1
- package/dist/tools/tool-loop.d.ts +55 -0
- package/dist/tools/tool-loop.d.ts.map +1 -1
- package/dist/tools/tool-loop.js +136 -0
- package/dist/tools/tool-loop.js.map +1 -1
- package/dist/tools/untrusted-content.d.ts +29 -0
- package/dist/tools/untrusted-content.d.ts.map +1 -0
- package/dist/tools/untrusted-content.js +53 -0
- package/dist/tools/untrusted-content.js.map +1 -0
- package/dist/tools/web-research.d.ts +76 -14
- package/dist/tools/web-research.d.ts.map +1 -1
- package/dist/tools/web-research.js +280 -35
- package/dist/tools/web-research.js.map +1 -1
- package/dist/utils/effect-verification.d.ts +115 -0
- package/dist/utils/effect-verification.d.ts.map +1 -0
- package/dist/utils/effect-verification.js +337 -0
- package/dist/utils/effect-verification.js.map +1 -0
- package/dist/utils/open-url.d.ts +16 -0
- package/dist/utils/open-url.d.ts.map +1 -0
- package/dist/utils/open-url.js +32 -0
- package/dist/utils/open-url.js.map +1 -0
- package/dist/utils/project-env.d.ts +146 -0
- package/dist/utils/project-env.d.ts.map +1 -0
- package/dist/utils/project-env.js +584 -0
- package/dist/utils/project-env.js.map +1 -0
- package/dist/utils/shell.d.ts +7 -0
- package/dist/utils/shell.d.ts.map +1 -1
- package/dist/utils/shell.js +2 -0
- package/dist/utils/shell.js.map +1 -1
- package/dist/web-dashboard/chat-console.d.ts +2 -0
- package/dist/web-dashboard/chat-console.d.ts.map +1 -1
- package/dist/web-dashboard/chat-console.js +7 -0
- package/dist/web-dashboard/chat-console.js.map +1 -1
- package/dist/web-dashboard/server.d.ts +3 -1
- package/dist/web-dashboard/server.d.ts.map +1 -1
- package/dist/web-dashboard/server.js +534 -8
- package/dist/web-dashboard/server.js.map +1 -1
- package/dist/web-dashboard/src/types.d.ts +150 -1
- package/dist/web-dashboard/src/types.d.ts.map +1 -1
- package/dist/web-dashboard/workspace-guard.d.ts +40 -0
- package/dist/web-dashboard/workspace-guard.d.ts.map +1 -0
- package/dist/web-dashboard/workspace-guard.js +92 -0
- package/dist/web-dashboard/workspace-guard.js.map +1 -0
- package/package.json +4 -1
- package/src/web-dashboard/public/assets/index-Beportyl.js +207 -0
- package/src/web-dashboard/public/assets/index-Beportyl.js.map +1 -0
- package/src/web-dashboard/public/assets/index-gtQyg9nm.css +1 -0
- package/src/web-dashboard/public/index.html +2 -2
- package/src/web-dashboard/public/assets/index-D1YFCcIZ.js +0 -207
- package/src/web-dashboard/public/assets/index-D1YFCcIZ.js.map +0 -1
- package/src/web-dashboard/public/assets/index-jkW5qcf-.css +0 -1
|
@@ -0,0 +1,405 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Golden provider-wire fixtures — record/replay guard for the REQUEST we send.
|
|
3
|
+
*
|
|
4
|
+
* WHY THIS EXISTS. nuvira's largest failure mode is silent drift on a huge
|
|
5
|
+
* surface: a tool schema, a message-ordering rule, or a serialization detail
|
|
6
|
+
* changes and nothing notices, because every existing test asserts on a
|
|
7
|
+
* RESPONSE (what the engine did) rather than on the REQUEST (what we sent). A
|
|
8
|
+
* recorded golden request catches exactly that class — "the bytes we put on the
|
|
9
|
+
* provider wire changed shape" — and it does so deterministically, with no
|
|
10
|
+
* network and no model.
|
|
11
|
+
*
|
|
12
|
+
* HOW IT CAPTURES, WITHOUT A TEST SEAM IN PRODUCTION CODE. A loopback
|
|
13
|
+
* OpenAI-compatible server stands in for the provider (the same transport-depth
|
|
14
|
+
* seam `src/parity/drivers.ts` uses). A REAL adapter (`GroqAdapter`) is pointed
|
|
15
|
+
* at it, and the REAL tool loop drives the adapter. The server records each
|
|
16
|
+
* request body verbatim. Nothing in `chat.ts`, `tool-loop.ts`, `tools.ts` or the
|
|
17
|
+
* adapters is modified — the seam is configuration, not a mock.
|
|
18
|
+
*
|
|
19
|
+
* WHAT IS NORMALIZED, AND WHY SO LITTLE. The fixture is the request as sent:
|
|
20
|
+
* model, messages (in order), tool schemas (in order), temperature, max_tokens,
|
|
21
|
+
* stream. Object keys are sorted so JSON key order is not drift; array order is
|
|
22
|
+
* PRESERVED because message and tool ordering is exactly the kind of thing this
|
|
23
|
+
* guard exists to protect. Inputs are fixed by the harness, so the request is
|
|
24
|
+
* fully deterministic — there is no timestamp or path to scrub.
|
|
25
|
+
*
|
|
26
|
+
* ADOPTED FROM claw-code's mock parity harness (`mock-anthropic-service` + 21
|
|
27
|
+
* captured `/v1/messages` requests), reimplemented for nuvira's loop and wire.
|
|
28
|
+
*/
|
|
29
|
+
import { createServer } from 'node:http';
|
|
30
|
+
import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from 'node:fs';
|
|
31
|
+
import { fileURLToPath } from 'node:url';
|
|
32
|
+
import { dirname, join, resolve } from 'node:path';
|
|
33
|
+
import { GroqAdapter } from '../inference/groq-adapter.js';
|
|
34
|
+
import { runToolLoop } from '../tools/tool-loop.js';
|
|
35
|
+
// ─── Locations ──────────────────────────────────────────────────────────────
|
|
36
|
+
/** The committed fixture directory (resolved from this module, not cwd). */
|
|
37
|
+
export const WIRE_FIXTURE_DIR = resolve(dirname(fileURLToPath(import.meta.url)), '..', '..', 'tests', 'fixtures', 'provider-wire');
|
|
38
|
+
/** A fixture file path for a named case. */
|
|
39
|
+
export function wireFixturePath(name) {
|
|
40
|
+
return join(WIRE_FIXTURE_DIR, `${name}.json`);
|
|
41
|
+
}
|
|
42
|
+
/** Read a committed fixture, or null when it does not exist yet. */
|
|
43
|
+
export function readWireFixture(name) {
|
|
44
|
+
try {
|
|
45
|
+
const path = wireFixturePath(name);
|
|
46
|
+
if (!existsSync(path))
|
|
47
|
+
return null;
|
|
48
|
+
return JSON.parse(readFileSync(path, 'utf-8'));
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
/** Write a fixture (used by the record mode). */
|
|
55
|
+
export function writeWireFixture(name, fixture) {
|
|
56
|
+
mkdirSync(WIRE_FIXTURE_DIR, { recursive: true });
|
|
57
|
+
writeFileSync(wireFixturePath(name), `${JSON.stringify(fixture, null, 2)}\n`, 'utf-8');
|
|
58
|
+
}
|
|
59
|
+
/** Every committed fixture case name (sorted), for the check loop. */
|
|
60
|
+
export function listWireFixtures() {
|
|
61
|
+
try {
|
|
62
|
+
return readdirSync(WIRE_FIXTURE_DIR)
|
|
63
|
+
.filter((f) => f.endsWith('.json'))
|
|
64
|
+
.map((f) => f.slice(0, -'.json'.length))
|
|
65
|
+
.sort();
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return [];
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Recursively sort object keys so JSON key order is never reported as drift.
|
|
73
|
+
* Arrays keep their order (message/tool ordering IS the contract).
|
|
74
|
+
*/
|
|
75
|
+
export function normalizeWireRequest(value) {
|
|
76
|
+
if (Array.isArray(value))
|
|
77
|
+
return value.map((v) => normalizeWireRequest(v));
|
|
78
|
+
if (value && typeof value === 'object') {
|
|
79
|
+
const out = {};
|
|
80
|
+
for (const key of Object.keys(value).sort()) {
|
|
81
|
+
out[key] = normalizeWireRequest(value[key]);
|
|
82
|
+
}
|
|
83
|
+
return out;
|
|
84
|
+
}
|
|
85
|
+
return value;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Structural diff of two normalized wire values. Returns [] when identical.
|
|
89
|
+
* Paths read like `messages[1].tool_calls[0].function.name`, so a failure names
|
|
90
|
+
* the exact field that drifted rather than dumping two JSON blobs.
|
|
91
|
+
*/
|
|
92
|
+
export function wireDiff(golden, actual, path = '$') {
|
|
93
|
+
if (golden === actual)
|
|
94
|
+
return [];
|
|
95
|
+
if (Array.isArray(golden) || Array.isArray(actual)) {
|
|
96
|
+
if (!Array.isArray(golden) || !Array.isArray(actual)) {
|
|
97
|
+
return [{ path, golden, actual }];
|
|
98
|
+
}
|
|
99
|
+
if (golden.length !== actual.length) {
|
|
100
|
+
return [{ path: `${path}.length`, golden: golden.length, actual: actual.length }];
|
|
101
|
+
}
|
|
102
|
+
const out = [];
|
|
103
|
+
for (let i = 0; i < golden.length; i += 1) {
|
|
104
|
+
out.push(...wireDiff(golden[i], actual[i], `${path}[${i}]`));
|
|
105
|
+
}
|
|
106
|
+
return out;
|
|
107
|
+
}
|
|
108
|
+
if (golden && actual && typeof golden === 'object' && typeof actual === 'object') {
|
|
109
|
+
const g = golden;
|
|
110
|
+
const a = actual;
|
|
111
|
+
const keys = [...new Set([...Object.keys(g), ...Object.keys(a)])].sort();
|
|
112
|
+
const out = [];
|
|
113
|
+
for (const key of keys) {
|
|
114
|
+
if (!(key in g))
|
|
115
|
+
out.push({ path: `${path}.${key}`, golden: undefined, actual: a[key] });
|
|
116
|
+
else if (!(key in a))
|
|
117
|
+
out.push({ path: `${path}.${key}`, golden: g[key], actual: undefined });
|
|
118
|
+
else
|
|
119
|
+
out.push(...wireDiff(g[key], a[key], `${path}.${key}`));
|
|
120
|
+
}
|
|
121
|
+
return out;
|
|
122
|
+
}
|
|
123
|
+
return [{ path, golden, actual }];
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Start a loopback OpenAI-compatible endpoint that records requests.
|
|
127
|
+
*
|
|
128
|
+
* The responder decides what to answer (deterministic, per case). It receives
|
|
129
|
+
* the parsed body and the number of requests seen so far, so a case can script
|
|
130
|
+
* "tool call first, final answer after the tool result".
|
|
131
|
+
*/
|
|
132
|
+
export async function startWireRecorder(respond) {
|
|
133
|
+
const requests = [];
|
|
134
|
+
const server = createServer((req, res) => {
|
|
135
|
+
const chunks = [];
|
|
136
|
+
req.on('data', (c) => chunks.push(c));
|
|
137
|
+
req.on('end', () => {
|
|
138
|
+
if (req.url?.endsWith('/models')) {
|
|
139
|
+
res.writeHead(200, { 'content-type': 'application/json' });
|
|
140
|
+
res.end(JSON.stringify({ data: [{ id: 'wire-stub-model', object: 'model' }] }));
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
if (req.url?.endsWith('/chat/completions')) {
|
|
144
|
+
let body = {};
|
|
145
|
+
try {
|
|
146
|
+
body = JSON.parse(Buffer.concat(chunks).toString('utf8') || '{}');
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
body = {};
|
|
150
|
+
}
|
|
151
|
+
const callIndex = requests.length;
|
|
152
|
+
requests.push(body);
|
|
153
|
+
const answer = respond(body, callIndex);
|
|
154
|
+
// A `{ __sse: [...] }` marker means the case is exercising the STREAMING
|
|
155
|
+
// path (the dashboard typewriter), so answer as a server-sent-event body
|
|
156
|
+
// exactly the way an OpenAI-compatible provider does.
|
|
157
|
+
if (answer && typeof answer === 'object' && Array.isArray(answer.__sse)) {
|
|
158
|
+
res.writeHead(200, { 'content-type': 'text/event-stream', 'cache-control': 'no-cache' });
|
|
159
|
+
const lines = (answer.__sse)
|
|
160
|
+
.map((chunk) => `data: ${JSON.stringify({ choices: [chunk] })}\n\n`)
|
|
161
|
+
.join('');
|
|
162
|
+
res.end(`${lines}data: [DONE]\n\n`);
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
res.writeHead(200, { 'content-type': 'application/json' });
|
|
166
|
+
res.end(JSON.stringify(answer));
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
res.writeHead(404, { 'content-type': 'application/json' });
|
|
170
|
+
res.end('{}');
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
await new Promise((done) => server.listen(0, '127.0.0.1', done));
|
|
174
|
+
const { port } = server.address();
|
|
175
|
+
return {
|
|
176
|
+
baseUrl: `http://127.0.0.1:${port}/v1`,
|
|
177
|
+
requests: () => requests.map((r) => r),
|
|
178
|
+
close: () => new Promise((done) => {
|
|
179
|
+
server.close(() => done());
|
|
180
|
+
}),
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
// ─── The core-loop cases ────────────────────────────────────────────────────
|
|
184
|
+
/**
|
|
185
|
+
* The narrow, fixed tool set the core-loop cases expose. Deliberately SMALL:
|
|
186
|
+
* the fixture is a human-reviewable record of the wire SHAPE (message ordering,
|
|
187
|
+
* tool_call / tool-result serialization, model params), not a dump of every
|
|
188
|
+
* schema. Schema-count drift is a different guard.
|
|
189
|
+
*/
|
|
190
|
+
const CASE_TOOL_NAMES = ['read_file', 'run_terminal'];
|
|
191
|
+
/** The fixed opening thread every case starts from. */
|
|
192
|
+
function caseMessages() {
|
|
193
|
+
return [
|
|
194
|
+
{ role: 'system', content: 'You are a coding agent. Use the tools to complete the task.' },
|
|
195
|
+
{ role: 'user', content: 'Read package.json and report the version.' },
|
|
196
|
+
];
|
|
197
|
+
}
|
|
198
|
+
/** A tool-call response asking for `read_file`, then a final answer. */
|
|
199
|
+
function toolThenAnswer(body) {
|
|
200
|
+
const messages = Array.isArray(body.messages) ? body.messages : [];
|
|
201
|
+
const toolAlreadyRan = messages.some((m) => m?.role === 'tool');
|
|
202
|
+
if (!toolAlreadyRan) {
|
|
203
|
+
return {
|
|
204
|
+
choices: [
|
|
205
|
+
{
|
|
206
|
+
message: {
|
|
207
|
+
content: null,
|
|
208
|
+
tool_calls: [
|
|
209
|
+
{
|
|
210
|
+
id: 'wire_call_1',
|
|
211
|
+
type: 'function',
|
|
212
|
+
function: { name: 'read_file', arguments: JSON.stringify({ path: 'package.json' }) },
|
|
213
|
+
},
|
|
214
|
+
],
|
|
215
|
+
},
|
|
216
|
+
},
|
|
217
|
+
],
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
return { choices: [{ message: { content: 'The version is 3.3.8.' } }] };
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Capture the exact wire requests the REAL core loop sends, for the committed
|
|
224
|
+
* cases. Runs entirely in-process against the loopback recorder: a real Groq
|
|
225
|
+
* adapter, the real `runToolLoop`, a fixed tool set, and a deterministic tool
|
|
226
|
+
* executor. No network, no model, no API key beyond the stub's dummy.
|
|
227
|
+
*/
|
|
228
|
+
export async function captureCoreLoopRequests() {
|
|
229
|
+
const out = [];
|
|
230
|
+
// Case 1 — a tool-calling turn: the first request carries the tool schemas and
|
|
231
|
+
// the opening thread; the second carries the assistant tool_call and the tool
|
|
232
|
+
// result. Both are pinned, because both are things that can drift silently.
|
|
233
|
+
{
|
|
234
|
+
const recorder = await startWireRecorder((body) => toolThenAnswer(body));
|
|
235
|
+
const adapter = new GroqAdapter({
|
|
236
|
+
apiKey: 'wire-stub-key',
|
|
237
|
+
model: 'wire-stub-model',
|
|
238
|
+
baseUrl: recorder.baseUrl,
|
|
239
|
+
});
|
|
240
|
+
const context = {
|
|
241
|
+
configManager: {},
|
|
242
|
+
cwd: process.cwd(),
|
|
243
|
+
authorizationRequest: 'Read package.json and report the version.',
|
|
244
|
+
};
|
|
245
|
+
const deps = {
|
|
246
|
+
callModel: async (messages, tools) => (await adapter.generateTools(messages, tools)),
|
|
247
|
+
executeTool: async () => '{\n "name": "agent-nuvira",\n "version": "3.3.8"\n}',
|
|
248
|
+
onEvent: () => { },
|
|
249
|
+
};
|
|
250
|
+
try {
|
|
251
|
+
await runToolLoop({
|
|
252
|
+
messages: caseMessages(),
|
|
253
|
+
context,
|
|
254
|
+
deps,
|
|
255
|
+
// Narrow the exposed tools so the fixture pins the CORE wire shape
|
|
256
|
+
// (message ordering, tool_call/tool-result serialization) rather than
|
|
257
|
+
// the full ~112-schema catalogue, which would make a 300KB fixture no
|
|
258
|
+
// human can review. Schema-count/shape drift is a separate concern.
|
|
259
|
+
tools: CASE_TOOL_NAMES,
|
|
260
|
+
maxSteps: 4,
|
|
261
|
+
requireVerification: false,
|
|
262
|
+
requireDeliverable: false,
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
finally {
|
|
266
|
+
await recorder.close();
|
|
267
|
+
}
|
|
268
|
+
out.push({
|
|
269
|
+
case: 'tool-call-roundtrip',
|
|
270
|
+
proves: 'The core loop puts the tool schemas, the opening thread, the assistant tool_call and the tool result on the wire in this exact shape and order.',
|
|
271
|
+
requests: recorder.requests().map((r) => normalizeWireRequest(r)),
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
// Case 2 — a plain turn (no tools): the request the adapter sends when the loop
|
|
275
|
+
// finishes without a tool call. Pins model/temperature/max_tokens/stream and
|
|
276
|
+
// the messages-only body shape.
|
|
277
|
+
{
|
|
278
|
+
const recorder = await startWireRecorder(() => ({
|
|
279
|
+
choices: [{ message: { content: 'Done — no tools needed.' } }],
|
|
280
|
+
}));
|
|
281
|
+
const adapter = new GroqAdapter({
|
|
282
|
+
apiKey: 'wire-stub-key',
|
|
283
|
+
model: 'wire-stub-model',
|
|
284
|
+
baseUrl: recorder.baseUrl,
|
|
285
|
+
});
|
|
286
|
+
const context = {
|
|
287
|
+
configManager: {},
|
|
288
|
+
cwd: process.cwd(),
|
|
289
|
+
authorizationRequest: 'Say hello.',
|
|
290
|
+
};
|
|
291
|
+
const deps = {
|
|
292
|
+
callModel: async (messages, tools) => (await adapter.generateTools(messages, tools)),
|
|
293
|
+
executeTool: async () => '',
|
|
294
|
+
onEvent: () => { },
|
|
295
|
+
};
|
|
296
|
+
try {
|
|
297
|
+
await runToolLoop({
|
|
298
|
+
messages: [
|
|
299
|
+
{ role: 'system', content: 'You are a coding agent.' },
|
|
300
|
+
{ role: 'user', content: 'Say hello.' },
|
|
301
|
+
],
|
|
302
|
+
context,
|
|
303
|
+
deps,
|
|
304
|
+
tools: CASE_TOOL_NAMES,
|
|
305
|
+
maxSteps: 2,
|
|
306
|
+
requireVerification: false,
|
|
307
|
+
requireDeliverable: false,
|
|
308
|
+
});
|
|
309
|
+
}
|
|
310
|
+
finally {
|
|
311
|
+
await recorder.close();
|
|
312
|
+
}
|
|
313
|
+
out.push({
|
|
314
|
+
case: 'plain-turn',
|
|
315
|
+
proves: 'A tool-less turn still sends the full tool schema set (native tool-calling) with this body shape; model/temperature/max_tokens drift shows up here.',
|
|
316
|
+
requests: recorder.requests().map((r) => normalizeWireRequest(r)),
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
// Case 3 — the STREAMING tool-calling wire (the dashboard answer typewriter).
|
|
320
|
+
// It adds `stream: true` and `stream_options.include_usage`, and that shape is
|
|
321
|
+
// exactly the one the dashboard depends on — a change here silently breaks the
|
|
322
|
+
// typewriter, which no response-side test catches.
|
|
323
|
+
{
|
|
324
|
+
const recorder = await startWireRecorder((body) => {
|
|
325
|
+
const messages = Array.isArray(body.messages) ? body.messages : [];
|
|
326
|
+
const toolAlreadyRan = messages.some((m) => m?.role === 'tool');
|
|
327
|
+
// Streaming responses are SSE, not JSON — the recorder's responder returns
|
|
328
|
+
// a marker the server turns into an SSE body below.
|
|
329
|
+
return toolAlreadyRan
|
|
330
|
+
? { __sse: [{ delta: { content: 'The version is 3.3.8.' } }, { delta: {}, finish_reason: 'stop' }] }
|
|
331
|
+
: {
|
|
332
|
+
__sse: [
|
|
333
|
+
{
|
|
334
|
+
delta: {
|
|
335
|
+
tool_calls: [
|
|
336
|
+
{
|
|
337
|
+
index: 0,
|
|
338
|
+
id: 'wire_call_1',
|
|
339
|
+
type: 'function',
|
|
340
|
+
function: { name: 'read_file', arguments: '{"path":"package.json"}' },
|
|
341
|
+
},
|
|
342
|
+
],
|
|
343
|
+
},
|
|
344
|
+
},
|
|
345
|
+
{ delta: {}, finish_reason: 'tool_calls' },
|
|
346
|
+
],
|
|
347
|
+
};
|
|
348
|
+
});
|
|
349
|
+
const adapter = new GroqAdapter({
|
|
350
|
+
apiKey: 'wire-stub-key',
|
|
351
|
+
model: 'wire-stub-model',
|
|
352
|
+
baseUrl: recorder.baseUrl,
|
|
353
|
+
});
|
|
354
|
+
const context = {
|
|
355
|
+
configManager: {},
|
|
356
|
+
cwd: process.cwd(),
|
|
357
|
+
authorizationRequest: 'Read package.json and report the version.',
|
|
358
|
+
};
|
|
359
|
+
const deps = {
|
|
360
|
+
callModel: async (messages, tools, onToken) => (await adapter.generateToolsStream(messages, tools, undefined, onToken ?? (() => { }))),
|
|
361
|
+
executeTool: async () => '{\n "name": "agent-nuvira",\n "version": "3.3.8"\n}',
|
|
362
|
+
onEvent: () => { },
|
|
363
|
+
};
|
|
364
|
+
try {
|
|
365
|
+
await runToolLoop({
|
|
366
|
+
messages: caseMessages(),
|
|
367
|
+
context,
|
|
368
|
+
deps,
|
|
369
|
+
tools: CASE_TOOL_NAMES,
|
|
370
|
+
maxSteps: 4,
|
|
371
|
+
requireVerification: false,
|
|
372
|
+
requireDeliverable: false,
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
finally {
|
|
376
|
+
await recorder.close();
|
|
377
|
+
}
|
|
378
|
+
out.push({
|
|
379
|
+
case: 'streaming-tool-call',
|
|
380
|
+
proves: 'The streaming path sends stream:true and stream_options.include_usage with this body — the dashboard typewriter depends on it.',
|
|
381
|
+
requests: recorder.requests().map((r) => normalizeWireRequest(r)),
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
// Case 4 — the plain `generate()` wire (non-tool path used by single-shot
|
|
385
|
+
// calls and the plan/reasoner prompts). Pins the messages-only body shape.
|
|
386
|
+
{
|
|
387
|
+
const recorder = await startWireRecorder(() => ({
|
|
388
|
+
choices: [{ message: { content: 'Hello.' } }],
|
|
389
|
+
}));
|
|
390
|
+
const adapter = new GroqAdapter({
|
|
391
|
+
apiKey: 'wire-stub-key',
|
|
392
|
+
model: 'wire-stub-model',
|
|
393
|
+
baseUrl: recorder.baseUrl,
|
|
394
|
+
});
|
|
395
|
+
await adapter.generate('Say hello.');
|
|
396
|
+
await recorder.close();
|
|
397
|
+
out.push({
|
|
398
|
+
case: 'plain-generate',
|
|
399
|
+
proves: 'The non-tool generate() path sends this body shape (single user message, no tools); the plan/reasoner single-shot calls depend on it.',
|
|
400
|
+
requests: recorder.requests().map((r) => normalizeWireRequest(r)),
|
|
401
|
+
});
|
|
402
|
+
}
|
|
403
|
+
return out;
|
|
404
|
+
}
|
|
405
|
+
//# sourceMappingURL=wire-fixtures.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wire-fixtures.js","sourceRoot":"","sources":["../../src/parity/wire-fixtures.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,EAAE,YAAY,EAAe,MAAM,WAAW,CAAC;AAEtD,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEnD,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAE3D,OAAO,EAAE,WAAW,EAAwC,MAAM,uBAAuB,CAAC;AAG1F,+EAA+E;AAE/E,4EAA4E;AAC5E,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAO,CACrC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EACvC,IAAI,EACJ,IAAI,EACJ,OAAO,EACP,UAAU,EACV,eAAe,CAChB,CAAC;AAEF,4CAA4C;AAC5C,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,IAAI,CAAC,gBAAgB,EAAE,GAAG,IAAI,OAAO,CAAC,CAAC;AAChD,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QACnC,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAgB,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,OAAoB;IACjE,SAAS,CAAC,gBAAgB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,aAAa,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACzF,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,gBAAgB;IAC9B,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,gBAAgB,CAAC;aACjC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;aAClC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;aACvC,IAAI,EAAE,CAAC;IACZ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAcD;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3E,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,GAAG,GAA4B,EAAE,CAAC;QACxC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAgC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YACvE,GAAG,CAAC,GAAG,CAAC,GAAG,oBAAoB,CAAE,KAAiC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3E,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AASD;;;;GAIG;AACH,MAAM,UAAU,QAAQ,CAAC,MAAe,EAAE,MAAe,EAAE,IAAI,GAAG,GAAG;IACnE,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,EAAE,CAAC;IAEjC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACnD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YACrD,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QACpC,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;YACpC,OAAO,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QACpF,CAAC;QACD,MAAM,GAAG,GAAe,EAAE,CAAC;QAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1C,GAAG,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/D,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,MAAM,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QACjF,MAAM,CAAC,GAAG,MAAiC,CAAC;QAC5C,MAAM,CAAC,GAAG,MAAiC,CAAC;QAC5C,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACzE,MAAM,GAAG,GAAe,EAAE,CAAC;QAC3B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;gBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;iBACpF,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;gBAAE,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;;gBACzF,GAAG,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC;QAC/D,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;AACpC,CAAC;AAaD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAsE;IAEtE,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAW,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAC/C,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE;YACjB,IAAI,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;gBACjC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,iBAAiB,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBAChF,OAAO;YACT,CAAC;YACD,IAAI,GAAG,CAAC,GAAG,EAAE,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC;gBAC3C,IAAI,IAAI,GAA4B,EAAE,CAAC;gBACvC,IAAI,CAAC;oBACH,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,IAAI,CAA4B,CAAC;gBAC/F,CAAC;gBAAC,MAAM,CAAC;oBACP,IAAI,GAAG,EAAE,CAAC;gBACZ,CAAC;gBACD,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC;gBAClC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACpB,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;gBACxC,yEAAyE;gBACzE,yEAAyE;gBACzE,sDAAsD;gBACtD,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAE,MAA8B,CAAC,KAAK,CAAC,EAAE,CAAC;oBACjG,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,mBAAmB,EAAE,eAAe,EAAE,UAAU,EAAE,CAAC,CAAC;oBACzF,MAAM,KAAK,GAAG,CAAE,MAAoD,CAAC,KAAK,CAAC;yBACxE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC;yBACnE,IAAI,CAAC,EAAE,CAAC,CAAC;oBACZ,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,kBAAkB,CAAC,CAAC;oBACpC,OAAO;gBACT,CAAC;gBACD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;gBAChC,OAAO;YACT,CAAC;YACD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;YAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,OAAO,CAAO,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC;IACvE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,OAAO,EAAiB,CAAC;IACjD,OAAO;QACL,OAAO,EAAE,oBAAoB,IAAI,KAAK;QACtC,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACtC,KAAK,EAAE,GAAG,EAAE,CACV,IAAI,OAAO,CAAO,CAAC,IAAI,EAAE,EAAE;YACzB,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7B,CAAC,CAAC;KACL,CAAC;AACJ,CAAC;AAED,+EAA+E;AAE/E;;;;;GAKG;AACH,MAAM,eAAe,GAAa,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;AAEhE,uDAAuD;AACvD,SAAS,YAAY;IACnB,OAAO;QACL,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,6DAA6D,EAAE;QAC1F,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,2CAA2C,EAAE;KACvE,CAAC;AACJ,CAAC;AAED,wEAAwE;AACxE,SAAS,cAAc,CAAC,IAA6B;IACnD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAE,IAAI,CAAC,QAAqC,CAAC,CAAC,CAAC,EAAE,CAAC;IACjG,MAAM,cAAc,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC;IAChE,IAAI,CAAC,cAAc,EAAE,CAAC;QACpB,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,OAAO,EAAE;wBACP,OAAO,EAAE,IAAI;wBACb,UAAU,EAAE;4BACV;gCACE,EAAE,EAAE,aAAa;gCACjB,IAAI,EAAE,UAAU;gCAChB,QAAQ,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE;6BACrF;yBACF;qBACF;iBACF;aACF;SACF,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,uBAAuB,EAAE,EAAE,CAAC,EAAE,CAAC;AAC1E,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB;IAC3C,MAAM,GAAG,GAAkB,EAAE,CAAC;IAE9B,+EAA+E;IAC/E,8EAA8E;IAC9E,4EAA4E;IAC5E,CAAC;QACC,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;QACzE,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC;YAC9B,MAAM,EAAE,eAAe;YACvB,KAAK,EAAE,iBAAiB;YACxB,OAAO,EAAE,QAAQ,CAAC,OAAO;SAC1B,CAAC,CAAC;QACH,MAAM,OAAO,GAAgB;YAC3B,aAAa,EAAE,EAAE;YACjB,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YAClB,oBAAoB,EAAE,2CAA2C;SAClE,CAAC;QACF,MAAM,IAAI,GAAiB;YACzB,SAAS,EAAE,KAAK,EAAE,QAAuB,EAAE,KAAuB,EAAE,EAAE,CACpE,CAAC,MAAM,OAAO,CAAC,aAAc,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAiB;YACjE,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC,uDAAuD;YAChF,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC;SAClB,CAAC;QACF,IAAI,CAAC;YACH,MAAM,WAAW,CAAC;gBAChB,QAAQ,EAAE,YAAY,EAAE;gBACxB,OAAO;gBACP,IAAI;gBACJ,mEAAmE;gBACnE,sEAAsE;gBACtE,sEAAsE;gBACtE,oEAAoE;gBACpE,KAAK,EAAE,eAAe;gBACtB,QAAQ,EAAE,CAAC;gBACX,mBAAmB,EAAE,KAAK;gBAC1B,kBAAkB,EAAE,KAAK;aAC1B,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;QACzB,CAAC;QACD,GAAG,CAAC,IAAI,CAAC;YACP,IAAI,EAAE,qBAAqB;YAC3B,MAAM,EACJ,iJAAiJ;YACnJ,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;SAClE,CAAC,CAAC;IACL,CAAC;IAED,gFAAgF;IAChF,6EAA6E;IAC7E,gCAAgC;IAChC,CAAC;QACC,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,GAAG,EAAE,CAAC,CAAC;YAC9C,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,yBAAyB,EAAE,EAAE,CAAC;SAC/D,CAAC,CAAC,CAAC;QACJ,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC;YAC9B,MAAM,EAAE,eAAe;YACvB,KAAK,EAAE,iBAAiB;YACxB,OAAO,EAAE,QAAQ,CAAC,OAAO;SAC1B,CAAC,CAAC;QACH,MAAM,OAAO,GAAgB;YAC3B,aAAa,EAAE,EAAE;YACjB,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YAClB,oBAAoB,EAAE,YAAY;SACnC,CAAC;QACF,MAAM,IAAI,GAAiB;YACzB,SAAS,EAAE,KAAK,EAAE,QAAuB,EAAE,KAAuB,EAAE,EAAE,CACpE,CAAC,MAAM,OAAO,CAAC,aAAc,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAiB;YACjE,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE;YAC3B,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC;SAClB,CAAC;QACF,IAAI,CAAC;YACH,MAAM,WAAW,CAAC;gBAChB,QAAQ,EAAE;oBACR,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,yBAAyB,EAAE;oBACtD,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE;iBACxC;gBACD,OAAO;gBACP,IAAI;gBACJ,KAAK,EAAE,eAAe;gBACtB,QAAQ,EAAE,CAAC;gBACX,mBAAmB,EAAE,KAAK;gBAC1B,kBAAkB,EAAE,KAAK;aAC1B,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;QACzB,CAAC;QACD,GAAG,CAAC,IAAI,CAAC;YACP,IAAI,EAAE,YAAY;YAClB,MAAM,EACJ,qJAAqJ;YACvJ,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;SAClE,CAAC,CAAC;IACL,CAAC;IAED,8EAA8E;IAC9E,+EAA+E;IAC/E,+EAA+E;IAC/E,mDAAmD;IACnD,CAAC;QACC,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,CAAC,IAAI,EAAE,EAAE;YAChD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAE,IAAI,CAAC,QAAqC,CAAC,CAAC,CAAC,EAAE,CAAC;YACjG,MAAM,cAAc,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC;YAChE,2EAA2E;YAC3E,oDAAoD;YACpD,OAAO,cAAc;gBACnB,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,uBAAuB,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,EAAE;gBACpG,CAAC,CAAC;oBACE,KAAK,EAAE;wBACL;4BACE,KAAK,EAAE;gCACL,UAAU,EAAE;oCACV;wCACE,KAAK,EAAE,CAAC;wCACR,EAAE,EAAE,aAAa;wCACjB,IAAI,EAAE,UAAU;wCAChB,QAAQ,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,yBAAyB,EAAE;qCACtE;iCACF;6BACF;yBACF;wBACD,EAAE,KAAK,EAAE,EAAE,EAAE,aAAa,EAAE,YAAY,EAAE;qBAC3C;iBACF,CAAC;QACR,CAAC,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC;YAC9B,MAAM,EAAE,eAAe;YACvB,KAAK,EAAE,iBAAiB;YACxB,OAAO,EAAE,QAAQ,CAAC,OAAO;SAC1B,CAAC,CAAC;QACH,MAAM,OAAO,GAAgB;YAC3B,aAAa,EAAE,EAAE;YACjB,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YAClB,oBAAoB,EAAE,2CAA2C;SAClE,CAAC;QACF,MAAM,IAAI,GAAiB;YACzB,SAAS,EAAE,KAAK,EAAE,QAAuB,EAAE,KAAuB,EAAE,OAA6B,EAAE,EAAE,CACnG,CAAC,MAAM,OAAO,CAAC,mBAAoB,CAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAiB;YACzG,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC,uDAAuD;YAChF,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC;SAClB,CAAC;QACF,IAAI,CAAC;YACH,MAAM,WAAW,CAAC;gBAChB,QAAQ,EAAE,YAAY,EAAE;gBACxB,OAAO;gBACP,IAAI;gBACJ,KAAK,EAAE,eAAe;gBACtB,QAAQ,EAAE,CAAC;gBACX,mBAAmB,EAAE,KAAK;gBAC1B,kBAAkB,EAAE,KAAK;aAC1B,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;QACzB,CAAC;QACD,GAAG,CAAC,IAAI,CAAC;YACP,IAAI,EAAE,qBAAqB;YAC3B,MAAM,EACJ,gIAAgI;YAClI,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;SAClE,CAAC,CAAC;IACL,CAAC;IAED,0EAA0E;IAC1E,2EAA2E;IAC3E,CAAC;QACC,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC,GAAG,EAAE,CAAC,CAAC;YAC9C,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,CAAC;SAC9C,CAAC,CAAC,CAAC;QACJ,MAAM,OAAO,GAAG,IAAI,WAAW,CAAC;YAC9B,MAAM,EAAE,eAAe;YACvB,KAAK,EAAE,iBAAiB;YACxB,OAAO,EAAE,QAAQ,CAAC,OAAO;SAC1B,CAAC,CAAC;QACH,MAAM,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QACrC,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;QACvB,GAAG,CAAC,IAAI,CAAC;YACP,IAAI,EAAE,gBAAgB;YACtB,MAAM,EACJ,uIAAuI;YACzI,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC;SAClE,CAAC,CAAC;IACL,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -33,6 +33,29 @@ export declare function extractToolArtifact(text: string): {
|
|
|
33
33
|
artifact: ToolArtifact;
|
|
34
34
|
result: string;
|
|
35
35
|
} | null;
|
|
36
|
+
/**
|
|
37
|
+
* A deliverable a PRODUCER describes: everything a tool knows about what it
|
|
38
|
+
* made, with the bookkeeping fields optional (filled by `recordArtifact`).
|
|
39
|
+
*/
|
|
40
|
+
export type ArtifactDraft = Omit<ToolArtifact, 'id' | 'createdAt' | 'source'> & {
|
|
41
|
+
id?: string;
|
|
42
|
+
createdAt?: number;
|
|
43
|
+
source?: ToolArtifact['source'];
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* Record a deliverable directly on the session's artifact sink.
|
|
47
|
+
*
|
|
48
|
+
* The `{artifact, result}` payload contract works for a tool that can wrap its
|
|
49
|
+
* whole result, but most tools return prose the model must read verbatim
|
|
50
|
+
* (`write_file: created 'src/x.ts' (412 chars).`) — rewriting those into JSON
|
|
51
|
+
* just to register a deliverable would change every caller's output. This is
|
|
52
|
+
* the other half: a tool that ALREADY has the deliverable (the path it wrote,
|
|
53
|
+
* the file it generated) hands it over directly and returns its text unchanged.
|
|
54
|
+
*
|
|
55
|
+
* No-op without a sink (the CLI, a unit test, a pure run) and never throws —
|
|
56
|
+
* exactly the guarantees the payload path makes.
|
|
57
|
+
*/
|
|
58
|
+
export declare function recordArtifact(sink: ArtifactSink | undefined, artifact: ArtifactDraft): void;
|
|
36
59
|
/**
|
|
37
60
|
* Append an extracted artifact to the sink and return the CLEAN result text.
|
|
38
61
|
* A non-payload result is returned unchanged. This is the tool-loop hook.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifact-append.d.ts","sourceRoot":"","sources":["../../src/tools/artifact-append.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,OAAO,EAAqC,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AA2B9G;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAiDnG;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,MAAM,CAK5E;AAID,6DAA6D;AAC7D,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAE9C;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,SAA6B,GAAG,MAAM,GAAG,SAAS,CAoB/G"}
|
|
1
|
+
{"version":3,"file":"artifact-append.d.ts","sourceRoot":"","sources":["../../src/tools/artifact-append.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAIH,OAAO,EAAqC,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AA2B9G;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAiDnG;AAED;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,YAAY,EAAE,IAAI,GAAG,WAAW,GAAG,QAAQ,CAAC,GAAG;IAC9E,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;CACjC,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,YAAY,GAAG,SAAS,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI,CAY5F;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,MAAM,CAK5E;AAID,6DAA6D;AAC7D,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAE9C;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,SAA6B,GAAG,MAAM,GAAG,SAAS,CAoB/G"}
|
|
@@ -113,6 +113,34 @@ export function extractToolArtifact(text) {
|
|
|
113
113
|
return { artifact, result: resultText };
|
|
114
114
|
}
|
|
115
115
|
}
|
|
116
|
+
/**
|
|
117
|
+
* Record a deliverable directly on the session's artifact sink.
|
|
118
|
+
*
|
|
119
|
+
* The `{artifact, result}` payload contract works for a tool that can wrap its
|
|
120
|
+
* whole result, but most tools return prose the model must read verbatim
|
|
121
|
+
* (`write_file: created 'src/x.ts' (412 chars).`) — rewriting those into JSON
|
|
122
|
+
* just to register a deliverable would change every caller's output. This is
|
|
123
|
+
* the other half: a tool that ALREADY has the deliverable (the path it wrote,
|
|
124
|
+
* the file it generated) hands it over directly and returns its text unchanged.
|
|
125
|
+
*
|
|
126
|
+
* No-op without a sink (the CLI, a unit test, a pure run) and never throws —
|
|
127
|
+
* exactly the guarantees the payload path makes.
|
|
128
|
+
*/
|
|
129
|
+
export function recordArtifact(sink, artifact) {
|
|
130
|
+
if (!sink)
|
|
131
|
+
return;
|
|
132
|
+
try {
|
|
133
|
+
sink.push({
|
|
134
|
+
...artifact,
|
|
135
|
+
id: artifact.id ?? randomUUID(),
|
|
136
|
+
source: artifact.source ?? 'tool',
|
|
137
|
+
createdAt: artifact.createdAt ?? Date.now(),
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
/* best-effort — persistence must never break the tool that produced it */
|
|
142
|
+
}
|
|
143
|
+
}
|
|
116
144
|
/**
|
|
117
145
|
* Append an extracted artifact to the sink and return the CLEAN result text.
|
|
118
146
|
* A non-payload result is returned unchanged. This is the tool-loop hook.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifact-append.js","sourceRoot":"","sources":["../../src/tools/artifact-append.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"artifact-append.js","sourceRoot":"","sources":["../../src/tools/artifact-append.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/ask-user.d.ts
CHANGED
|
@@ -7,6 +7,11 @@
|
|
|
7
7
|
* Injectable via ToolContext.askUser so tests never touch a real TTY.
|
|
8
8
|
*/
|
|
9
9
|
import type { AskUserAnswer, AskUserChoice } from './registry.js';
|
|
10
|
+
/**
|
|
11
|
+
* C1 — the label of the "type my own answer" choice appended to every ask_user
|
|
12
|
+
* list. Exported so surfaces and tests agree on the exact wording.
|
|
13
|
+
*/
|
|
14
|
+
export declare const OTHER_CHOICE_LABEL = "\u270F\uFE0F Other \u2014 type my own answer";
|
|
10
15
|
/**
|
|
11
16
|
* Render an in-loop clarification.
|
|
12
17
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ask-user.d.ts","sourceRoot":"","sources":["../../src/tools/ask-user.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAElE;;;;;;;;;;;;;GAaG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,aAAa,EAAE,EACxB,WAAW,EAAE,OAAO,GACnB,OAAO,CAAC,aAAa,CAAC,
|
|
1
|
+
{"version":3,"file":"ask-user.d.ts","sourceRoot":"","sources":["../../src/tools/ask-user.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAElE;;;GAGG;AACH,eAAO,MAAM,kBAAkB,iDAAkC,CAAC;AAElE;;;;;;;;;;;;;GAaG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,aAAa,EAAE,EACxB,WAAW,EAAE,OAAO,GACnB,OAAO,CAAC,aAAa,CAAC,CAyFxB"}
|
package/dist/tools/ask-user.js
CHANGED
|
@@ -8,6 +8,11 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import inquirer from 'inquirer';
|
|
10
10
|
import { logger } from '../utils/logger.js';
|
|
11
|
+
/**
|
|
12
|
+
* C1 — the label of the "type my own answer" choice appended to every ask_user
|
|
13
|
+
* list. Exported so surfaces and tests agree on the exact wording.
|
|
14
|
+
*/
|
|
15
|
+
export const OTHER_CHOICE_LABEL = '✏️ Other — type my own answer';
|
|
11
16
|
/**
|
|
12
17
|
* Render an in-loop clarification.
|
|
13
18
|
*
|
|
@@ -52,13 +57,21 @@ export async function renderAskUser(question, choices, multiSelect) {
|
|
|
52
57
|
'if you would prefer something else"), then continue with that assumption.',
|
|
53
58
|
};
|
|
54
59
|
}
|
|
60
|
+
// C1 — the model offers 2–4 choices, but the user's real answer is sometimes
|
|
61
|
+
// none of them. Without this the only ways out were picking a wrong option or
|
|
62
|
+
// Skip; the `custom` field was plumbed end-to-end (AskUserAnswer.custom →
|
|
63
|
+
// registry → dashboard `chatRespond`) yet no surface ever let a human type one.
|
|
64
|
+
const other = {
|
|
65
|
+
label: OTHER_CHOICE_LABEL,
|
|
66
|
+
description: 'type an answer that is not in the list',
|
|
67
|
+
};
|
|
55
68
|
const prompt = multiSelect
|
|
56
69
|
? {
|
|
57
70
|
type: 'checkbox',
|
|
58
71
|
name: 'answer',
|
|
59
72
|
message: 'Select all that apply (space to toggle, Enter to confirm):',
|
|
60
73
|
prefix: '🔀',
|
|
61
|
-
choices: choices.map((c) => ({ name: c.label, value: c.label })),
|
|
74
|
+
choices: [...choices, other].map((c) => ({ name: c.label, value: c.label })),
|
|
62
75
|
pageSize: 8,
|
|
63
76
|
}
|
|
64
77
|
: {
|
|
@@ -66,19 +79,52 @@ export async function renderAskUser(question, choices, multiSelect) {
|
|
|
66
79
|
name: 'answer',
|
|
67
80
|
message: 'Choose one:',
|
|
68
81
|
prefix: '🔀',
|
|
69
|
-
choices: choices.map((c) => ({
|
|
82
|
+
choices: [...choices, other].map((c) => ({
|
|
70
83
|
name: c.description ? `${c.label} — ${c.description}` : c.label,
|
|
71
84
|
value: c.label,
|
|
72
85
|
})),
|
|
73
|
-
pageSize:
|
|
86
|
+
pageSize: 9,
|
|
74
87
|
};
|
|
75
88
|
const { answer } = await inquirer.prompt(prompt);
|
|
76
89
|
console.log('');
|
|
77
|
-
|
|
90
|
+
// Single-select "Other": ask for the free text and return it as the answer.
|
|
91
|
+
if (!multiSelect && answer === OTHER_CHOICE_LABEL) {
|
|
92
|
+
const typed = await promptForCustomText();
|
|
93
|
+
if (!typed) {
|
|
94
|
+
// An empty entry is a decline, not an answer of "other").
|
|
95
|
+
return { answer: '', index: -1 };
|
|
96
|
+
}
|
|
97
|
+
return { answer: typed, index: -1, custom: typed };
|
|
98
|
+
}
|
|
99
|
+
const labels = (Array.isArray(answer) ? answer : [answer]).filter((l) => l !== OTHER_CHOICE_LABEL);
|
|
78
100
|
const indices = labels.map((label) => choices.findIndex((c) => c.label === label));
|
|
101
|
+
// Multi-select "Other": the typed text joins the selection.
|
|
102
|
+
let custom;
|
|
103
|
+
if (multiSelect && (Array.isArray(answer) ? answer : [answer]).includes(OTHER_CHOICE_LABEL)) {
|
|
104
|
+
custom = await promptForCustomText();
|
|
105
|
+
}
|
|
106
|
+
const finalLabels = custom ? [...labels, custom] : labels;
|
|
79
107
|
return {
|
|
80
|
-
answer,
|
|
108
|
+
answer: multiSelect ? finalLabels : finalLabels[0] ?? '',
|
|
81
109
|
index: multiSelect ? indices : indices[0] ?? -1,
|
|
110
|
+
...(custom ? { custom } : {}),
|
|
82
111
|
};
|
|
83
112
|
}
|
|
113
|
+
/** Ask for the free-text answer behind the "Other" choice. */
|
|
114
|
+
async function promptForCustomText() {
|
|
115
|
+
try {
|
|
116
|
+
const { text } = await inquirer.prompt([
|
|
117
|
+
{
|
|
118
|
+
type: 'input',
|
|
119
|
+
name: 'text',
|
|
120
|
+
message: 'Type your answer (Enter to skip):',
|
|
121
|
+
prefix: '✏️',
|
|
122
|
+
},
|
|
123
|
+
]);
|
|
124
|
+
return String(text ?? '').trim();
|
|
125
|
+
}
|
|
126
|
+
catch {
|
|
127
|
+
return '';
|
|
128
|
+
}
|
|
129
|
+
}
|
|
84
130
|
//# sourceMappingURL=ask-user.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ask-user.js","sourceRoot":"","sources":["../../src/tools/ask-user.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAG5C;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,QAAgB,EAChB,OAAwB,EACxB,WAAoB;IAEpB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,MAAM,CAAC,SAAS,CAAC,MAAM,QAAQ,EAAE,CAAC,CAAC;IAEnC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,MAAM,CAAC;QAC7C,oEAAoE;QACpE,2EAA2E;QAC3E,4EAA4E;QAC5E,wEAAwE;QACxE,0EAA0E;QAC1E,wEAAwE;QACxE,yEAAyE;QACzE,yEAAyE;QACzE,qEAAqE;QACrE,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAC/B,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACvB,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC9F,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,wDAAwD,QAAQ,kBAAkB,CAAC,CAAC;QAChG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO;YACL,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ;YAC3C,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,EACJ,mDAAmD,QAAQ,iBAAiB;gBAC5E,gGAAgG;gBAChG,sEAAsE,QAAQ,cAAc;gBAC5F,2EAA2E;SAC9E,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,WAAW;QACxB,CAAC,CAAC;YACE,IAAI,EAAE,UAAmB;YACzB,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,4DAA4D;YACrE,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"ask-user.js","sourceRoot":"","sources":["../../src/tools/ask-user.ts"],"names":[],"mappings":"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"}
|