@davidorex/pi-workflows 0.2.0 → 0.3.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/CHANGELOG.md +7 -4
- package/README.md +12 -2
- package/agents/architecture-designer.agent.yaml +58 -0
- package/agents/architecture-inferrer.agent.yaml +60 -0
- package/agents/gap-identifier.agent.yaml +66 -0
- package/agents/handoff-writer.agent.yaml +64 -0
- package/agents/plan-creator.agent.yaml +63 -0
- package/agents/project-definer.agent.yaml +53 -0
- package/agents/project-inferrer.agent.yaml +63 -0
- package/agents/requirements-gatherer.agent.yaml +58 -0
- package/dist/agent-spec.d.ts +27 -0
- package/dist/agent-spec.d.ts.map +1 -0
- package/dist/agent-spec.js +112 -0
- package/dist/agent-spec.js.map +1 -0
- package/dist/checkpoint.d.ts +50 -0
- package/dist/checkpoint.d.ts.map +1 -0
- package/dist/checkpoint.js +109 -0
- package/dist/checkpoint.js.map +1 -0
- package/dist/completion.d.ts +18 -0
- package/dist/completion.d.ts.map +1 -0
- package/dist/completion.js +58 -0
- package/dist/completion.js.map +1 -0
- package/dist/dag.d.ts +56 -0
- package/dist/dag.d.ts.map +1 -0
- package/dist/dag.js +172 -0
- package/dist/dag.js.map +1 -0
- package/dist/dispatch.d.ts +35 -0
- package/dist/dispatch.d.ts.map +1 -0
- package/dist/dispatch.js +311 -0
- package/dist/dispatch.js.map +1 -0
- package/dist/expression.d.ts +64 -0
- package/dist/expression.d.ts.map +1 -0
- package/dist/expression.js +294 -0
- package/dist/expression.js.map +1 -0
- package/dist/format.d.ts +19 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/format.js +42 -0
- package/dist/format.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +675 -0
- package/dist/index.js.map +1 -0
- package/dist/output.d.ts +12 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +59 -0
- package/dist/output.js.map +1 -0
- package/dist/state.d.ts +66 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +227 -0
- package/dist/state.js.map +1 -0
- package/dist/step-agent.d.ts +35 -0
- package/dist/step-agent.d.ts.map +1 -0
- package/dist/step-agent.js +156 -0
- package/dist/step-agent.js.map +1 -0
- package/dist/step-command.d.ts +21 -0
- package/dist/step-command.d.ts.map +1 -0
- package/dist/step-command.js +150 -0
- package/dist/step-command.js.map +1 -0
- package/dist/step-foreach.d.ts +33 -0
- package/dist/step-foreach.d.ts.map +1 -0
- package/dist/step-foreach.js +112 -0
- package/dist/step-foreach.js.map +1 -0
- package/dist/step-gate.d.ts +18 -0
- package/dist/step-gate.d.ts.map +1 -0
- package/dist/step-gate.js +137 -0
- package/dist/step-gate.js.map +1 -0
- package/dist/step-loop.d.ts +32 -0
- package/dist/step-loop.d.ts.map +1 -0
- package/dist/step-loop.js +278 -0
- package/dist/step-loop.js.map +1 -0
- package/dist/step-monitor.d.ts +56 -0
- package/dist/step-monitor.d.ts.map +1 -0
- package/dist/step-monitor.js +317 -0
- package/dist/step-monitor.js.map +1 -0
- package/dist/step-parallel.d.ts +43 -0
- package/dist/step-parallel.d.ts.map +1 -0
- package/dist/step-parallel.js +122 -0
- package/dist/step-parallel.js.map +1 -0
- package/{src/step-pause.ts → dist/step-pause.d.ts} +3 -13
- package/dist/step-pause.d.ts.map +1 -0
- package/dist/step-pause.js +22 -0
- package/dist/step-pause.js.map +1 -0
- package/dist/step-shared.d.ts +57 -0
- package/dist/step-shared.d.ts.map +1 -0
- package/dist/step-shared.js +125 -0
- package/dist/step-shared.js.map +1 -0
- package/dist/step-transform.d.ts +11 -0
- package/dist/step-transform.d.ts.map +1 -0
- package/dist/step-transform.js +41 -0
- package/dist/step-transform.js.map +1 -0
- package/dist/template.d.ts +51 -0
- package/dist/template.d.ts.map +1 -0
- package/{src/template.ts → dist/template.js} +32 -38
- package/dist/template.js.map +1 -0
- package/dist/test-helpers.d.ts +17 -0
- package/dist/test-helpers.d.ts.map +1 -0
- package/dist/test-helpers.js +46 -0
- package/dist/test-helpers.js.map +1 -0
- package/dist/tui.d.ts +47 -0
- package/dist/tui.d.ts.map +1 -0
- package/dist/tui.js +143 -0
- package/dist/tui.js.map +1 -0
- package/dist/types.d.ts +164 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/workflow-discovery.d.ts +23 -0
- package/dist/workflow-discovery.d.ts.map +1 -0
- package/dist/workflow-discovery.js +103 -0
- package/dist/workflow-discovery.js.map +1 -0
- package/dist/workflow-executor.d.ts +50 -0
- package/dist/workflow-executor.d.ts.map +1 -0
- package/dist/workflow-executor.js +726 -0
- package/dist/workflow-executor.js.map +1 -0
- package/dist/workflow-sdk.d.ts +44 -0
- package/dist/workflow-sdk.d.ts.map +1 -0
- package/dist/workflow-sdk.js +438 -0
- package/dist/workflow-sdk.js.map +1 -0
- package/dist/workflow-spec.d.ts +33 -0
- package/dist/workflow-spec.d.ts.map +1 -0
- package/dist/workflow-spec.js +464 -0
- package/dist/workflow-spec.js.map +1 -0
- package/dist/workflows-dir.d.ts +3 -0
- package/dist/workflows-dir.d.ts.map +1 -0
- package/{src/workflows-dir.ts → dist/workflows-dir.js} +1 -0
- package/dist/workflows-dir.js.map +1 -0
- package/package.json +53 -38
- package/schemas/decomposition-specs.schema.json +48 -48
- package/schemas/execution-results.schema.json +48 -48
- package/schemas/investigation-findings.schema.json +43 -43
- package/schemas/pattern-analysis.schema.json +41 -41
- package/schemas/phase.schema.json +48 -0
- package/schemas/plan-breakdown.schema.json +20 -20
- package/schemas/quality-analysis.schema.json +33 -33
- package/schemas/research-findings.schema.json +42 -42
- package/schemas/structure-analysis.schema.json +40 -40
- package/schemas/synthesis.schema.json +31 -31
- package/schemas/verifier-output.schema.json +94 -94
- package/skill-narrative.md +84 -0
- package/skills/pi-workflows/SKILL.md +247 -0
- package/templates/architecture-designer/task.md +117 -0
- package/templates/architecture-inferrer/task.md +61 -0
- package/templates/gap-identifier/task.md +103 -0
- package/templates/handoff-writer/task.md +91 -0
- package/templates/plan-creator/task.md +143 -0
- package/templates/project-definer/task.md +67 -0
- package/templates/project-inferrer/task.md +56 -0
- package/templates/requirements-gatherer/task.md +90 -0
- package/workflows/analyze-existing-project.workflow.yaml +74 -0
- package/workflows/create-handoff.workflow.yaml +58 -0
- package/workflows/create-phase.workflow.yaml +1 -1
- package/workflows/do-gap.workflow.yaml +4 -4
- package/workflows/fix-audit.workflow.yaml +1 -1
- package/workflows/gap-to-phase.workflow.yaml +1 -1
- package/workflows/init-new-project.workflow.yaml +55 -0
- package/workflows/plan-from-requirements.workflow.yaml +51 -0
- package/workflows/self-implement.workflow.yaml +3 -3
- package/workflows/typed-analysis.workflow.yaml +4 -4
- package/src/agent-spec.test.ts +0 -289
- package/src/agent-spec.ts +0 -122
- package/src/block-validation.test.ts +0 -350
- package/src/checkpoint.test.ts +0 -237
- package/src/checkpoint.ts +0 -140
- package/src/completion.test.ts +0 -143
- package/src/completion.ts +0 -68
- package/src/dag.test.ts +0 -350
- package/src/dag.ts +0 -219
- package/src/dispatch.test.ts +0 -475
- package/src/dispatch.ts +0 -353
- package/src/expression.test.ts +0 -353
- package/src/expression.ts +0 -332
- package/src/format.test.ts +0 -80
- package/src/format.ts +0 -41
- package/src/graduated-failure.test.ts +0 -556
- package/src/index.test.ts +0 -114
- package/src/index.ts +0 -516
- package/src/loop.test.ts +0 -551
- package/src/output.test.ts +0 -213
- package/src/output.ts +0 -70
- package/src/parallel-integration.test.ts +0 -175
- package/src/resume.test.ts +0 -192
- package/src/state.test.ts +0 -192
- package/src/state.ts +0 -254
- package/src/step-agent.test.ts +0 -327
- package/src/step-agent.ts +0 -178
- package/src/step-command.test.ts +0 -330
- package/src/step-command.ts +0 -132
- package/src/step-foreach.test.ts +0 -647
- package/src/step-foreach.ts +0 -148
- package/src/step-gate.test.ts +0 -185
- package/src/step-gate.ts +0 -116
- package/src/step-loop.test.ts +0 -626
- package/src/step-loop.ts +0 -323
- package/src/step-parallel.test.ts +0 -475
- package/src/step-parallel.ts +0 -168
- package/src/step-pause.test.ts +0 -30
- package/src/step-shared.test.ts +0 -355
- package/src/step-shared.ts +0 -157
- package/src/step-transform.test.ts +0 -155
- package/src/step-transform.ts +0 -47
- package/src/template-integration.test.ts +0 -72
- package/src/template.test.ts +0 -162
- package/src/test-helpers.ts +0 -51
- package/src/tui.test.ts +0 -355
- package/src/tui.ts +0 -182
- package/src/types.ts +0 -195
- package/src/verifier-schema.test.ts +0 -226
- package/src/workflow-discovery.test.ts +0 -105
- package/src/workflow-discovery.ts +0 -114
- package/src/workflow-executor.test.ts +0 -1532
- package/src/workflow-executor.ts +0 -810
- package/src/workflow-sdk.test.ts +0 -238
- package/src/workflow-sdk.ts +0 -262
- package/src/workflow-spec.test.ts +0 -576
- package/src/workflow-spec.ts +0 -471
package/dist/dispatch.js
ADDED
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Subprocess dispatch for workflow steps — spawns pi in JSON mode,
|
|
3
|
+
* collects events, usage, and output. Supports cancellation and timeout.
|
|
4
|
+
*/
|
|
5
|
+
import { spawn } from "node:child_process";
|
|
6
|
+
import fs from "node:fs";
|
|
7
|
+
import os from "node:os";
|
|
8
|
+
import path from "node:path";
|
|
9
|
+
import { SIGKILL_GRACE_MS } from "./step-shared.js";
|
|
10
|
+
/**
|
|
11
|
+
* Prompt length threshold (chars) for switching to @file argument passing.
|
|
12
|
+
* Avoids OS-level argument length limits (typically 128–256 KB) with headroom
|
|
13
|
+
* for the rest of the CLI args. 8000 chars is well under all limits while
|
|
14
|
+
* keeping short prompts as direct args for simplicity.
|
|
15
|
+
*/
|
|
16
|
+
const PROMPT_ARG_LIMIT = 8000;
|
|
17
|
+
/** Maximum stdout buffer size (10 MB) to prevent OOM from runaway subprocesses. */
|
|
18
|
+
const MAX_STDOUT_BYTES = 10 * 1024 * 1024;
|
|
19
|
+
export function extractText(content) {
|
|
20
|
+
if (!content || !Array.isArray(content))
|
|
21
|
+
return "";
|
|
22
|
+
for (const part of content) {
|
|
23
|
+
if (part && typeof part === "object" && "type" in part && part.type === "text" && "text" in part) {
|
|
24
|
+
return String(part.text);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return "";
|
|
28
|
+
}
|
|
29
|
+
export function extractToolArgsPreview(args) {
|
|
30
|
+
if (!args || typeof args !== "object")
|
|
31
|
+
return "";
|
|
32
|
+
const obj = args;
|
|
33
|
+
for (const key of ["command", "path", "pattern", "query", "task"]) {
|
|
34
|
+
if (typeof obj[key] === "string") {
|
|
35
|
+
const val = obj[key];
|
|
36
|
+
return val.length > 60 ? val.slice(0, 57) + "..." : val;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return "";
|
|
40
|
+
}
|
|
41
|
+
export function buildArgs(step, agentSpec, prompt, options) {
|
|
42
|
+
const args = ["--mode", "json"];
|
|
43
|
+
// Session log
|
|
44
|
+
args.push("--session-dir", options.sessionLogDir);
|
|
45
|
+
// Model: step > agent spec > model-config by role > model-config default
|
|
46
|
+
const model = step.model ??
|
|
47
|
+
agentSpec.model ??
|
|
48
|
+
(agentSpec.role && options.modelConfig?.by_role?.[agentSpec.role]) ??
|
|
49
|
+
options.modelConfig?.default;
|
|
50
|
+
if (model) {
|
|
51
|
+
const modelArg = `${model}:${agentSpec.thinking ?? "off"}`;
|
|
52
|
+
args.push("--models", modelArg);
|
|
53
|
+
}
|
|
54
|
+
// Tool filtering
|
|
55
|
+
if (agentSpec.tools?.length) {
|
|
56
|
+
const builtinTools = [];
|
|
57
|
+
const extensionPaths = [];
|
|
58
|
+
for (const tool of agentSpec.tools) {
|
|
59
|
+
if (tool.includes("/") || tool.endsWith(".ts") || tool.endsWith(".js")) {
|
|
60
|
+
extensionPaths.push(tool);
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
builtinTools.push(tool);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (builtinTools.length > 0)
|
|
67
|
+
args.push("--tools", builtinTools.join(","));
|
|
68
|
+
for (const ext of extensionPaths)
|
|
69
|
+
args.push("--extension", ext);
|
|
70
|
+
}
|
|
71
|
+
// Extension scoping
|
|
72
|
+
if (agentSpec.extensions !== undefined) {
|
|
73
|
+
args.push("--no-extensions");
|
|
74
|
+
for (const ext of agentSpec.extensions)
|
|
75
|
+
args.push("--extension", ext);
|
|
76
|
+
}
|
|
77
|
+
// Skill scoping
|
|
78
|
+
if (agentSpec.skills?.length) {
|
|
79
|
+
args.push("--no-skills");
|
|
80
|
+
// Skills are injected via --append-system-prompt, not CLI flags
|
|
81
|
+
}
|
|
82
|
+
// System prompt (if agent spec has one)
|
|
83
|
+
// Write to temp file if present, pass via --append-system-prompt
|
|
84
|
+
// (handled in dispatch() body, not buildArgs)
|
|
85
|
+
// Prompt — use @file for long prompts
|
|
86
|
+
args.push("-p");
|
|
87
|
+
args.push(prompt); // or @<tmpfile> if prompt > 8000 chars
|
|
88
|
+
return args;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Spawn a pi subprocess for a workflow step and collect the result.
|
|
92
|
+
*
|
|
93
|
+
* Builds CLI args from the step spec and agent spec.
|
|
94
|
+
* Streams stdout as newline-delimited JSON.
|
|
95
|
+
* Collects messages, usage, timing.
|
|
96
|
+
* Returns StepResult when the process exits.
|
|
97
|
+
*/
|
|
98
|
+
export async function dispatch(step, agentSpec, prompt, options) {
|
|
99
|
+
const startTime = Date.now();
|
|
100
|
+
const args = buildArgs(step, agentSpec, prompt, options);
|
|
101
|
+
// Handle long prompts: write to temp file
|
|
102
|
+
let tmpDir = null;
|
|
103
|
+
if (prompt.length > PROMPT_ARG_LIMIT) {
|
|
104
|
+
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "pi-wf-"));
|
|
105
|
+
const promptFile = path.join(tmpDir, "prompt.md");
|
|
106
|
+
fs.writeFileSync(promptFile, prompt, { mode: 0o600 });
|
|
107
|
+
// Replace last two args ("-p", prompt) with ("-p", "@<file>")
|
|
108
|
+
args[args.length - 1] = `@${promptFile}`;
|
|
109
|
+
}
|
|
110
|
+
// Handle system prompt: write to temp file
|
|
111
|
+
if (agentSpec.systemPrompt) {
|
|
112
|
+
if (!tmpDir)
|
|
113
|
+
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "pi-wf-"));
|
|
114
|
+
const sysFile = path.join(tmpDir, "system.md");
|
|
115
|
+
fs.writeFileSync(sysFile, agentSpec.systemPrompt, { mode: 0o600 });
|
|
116
|
+
// Insert before -p flag
|
|
117
|
+
const pIdx = args.indexOf("-p");
|
|
118
|
+
args.splice(pIdx, 0, "--append-system-prompt", sysFile);
|
|
119
|
+
}
|
|
120
|
+
const proc = spawn("pi", args, {
|
|
121
|
+
cwd: options.cwd,
|
|
122
|
+
env: process.env,
|
|
123
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
124
|
+
});
|
|
125
|
+
// Cancellation support
|
|
126
|
+
if (options.signal) {
|
|
127
|
+
const kill = () => {
|
|
128
|
+
proc.kill("SIGTERM");
|
|
129
|
+
setTimeout(() => {
|
|
130
|
+
if (!proc.killed)
|
|
131
|
+
proc.kill("SIGKILL");
|
|
132
|
+
}, SIGKILL_GRACE_MS);
|
|
133
|
+
};
|
|
134
|
+
if (options.signal.aborted)
|
|
135
|
+
kill();
|
|
136
|
+
else
|
|
137
|
+
options.signal.addEventListener("abort", kill, { once: true });
|
|
138
|
+
}
|
|
139
|
+
// Timeout support: SIGTERM after deadline, SIGKILL after 5s grace
|
|
140
|
+
let timedOut = false;
|
|
141
|
+
let timeoutTimer;
|
|
142
|
+
let killTimer;
|
|
143
|
+
if (options.timeoutMs) {
|
|
144
|
+
timeoutTimer = setTimeout(() => {
|
|
145
|
+
timedOut = true;
|
|
146
|
+
proc.kill("SIGTERM");
|
|
147
|
+
killTimer = setTimeout(() => {
|
|
148
|
+
if (!proc.killed)
|
|
149
|
+
proc.kill("SIGKILL");
|
|
150
|
+
}, SIGKILL_GRACE_MS);
|
|
151
|
+
}, options.timeoutMs);
|
|
152
|
+
}
|
|
153
|
+
// Collect result
|
|
154
|
+
const messages = [];
|
|
155
|
+
const usage = { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, turns: 0 };
|
|
156
|
+
let lastAssistantText = "";
|
|
157
|
+
let stderrBuf = "";
|
|
158
|
+
function processEvent(evt) {
|
|
159
|
+
// Track messages
|
|
160
|
+
if (evt.type === "message_end" && evt.message) {
|
|
161
|
+
messages.push(evt.message);
|
|
162
|
+
if (evt.message.role === "assistant") {
|
|
163
|
+
usage.turns++;
|
|
164
|
+
const u = evt.message.usage;
|
|
165
|
+
if (u) {
|
|
166
|
+
usage.input += u.input || 0;
|
|
167
|
+
usage.output += u.output || 0;
|
|
168
|
+
usage.cacheRead += u.cacheRead || 0;
|
|
169
|
+
usage.cacheWrite += u.cacheWrite || 0;
|
|
170
|
+
usage.cost += u.cost?.total || 0;
|
|
171
|
+
}
|
|
172
|
+
// Extract text from last assistant message
|
|
173
|
+
const text = extractText(evt.message.content);
|
|
174
|
+
if (text)
|
|
175
|
+
lastAssistantText = text;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
// Forward to TUI callback
|
|
179
|
+
if (options.onEvent) {
|
|
180
|
+
options.onEvent({
|
|
181
|
+
type: evt.type || "unknown",
|
|
182
|
+
raw: evt,
|
|
183
|
+
toolName: evt.type === "tool_execution_start" ? evt.toolName : undefined,
|
|
184
|
+
toolArgs: evt.type === "tool_execution_start" ? extractToolArgsPreview(evt.args) : undefined,
|
|
185
|
+
messageText: evt.type === "message_end" && evt.message?.role === "assistant"
|
|
186
|
+
? extractText(evt.message.content)
|
|
187
|
+
: undefined,
|
|
188
|
+
usage: evt.type === "message_end" && evt.message?.role === "assistant" && evt.message.usage
|
|
189
|
+
? {
|
|
190
|
+
input: evt.message.usage.input,
|
|
191
|
+
output: evt.message.usage.output,
|
|
192
|
+
cost: evt.message.usage.cost?.total,
|
|
193
|
+
}
|
|
194
|
+
: undefined,
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// Stream stdout as newline-delimited JSON
|
|
199
|
+
let buf = "";
|
|
200
|
+
let bufBytes = 0;
|
|
201
|
+
let stdoutTruncated = false;
|
|
202
|
+
proc.stdout.on("data", (chunk) => {
|
|
203
|
+
bufBytes += chunk.length;
|
|
204
|
+
if (bufBytes > MAX_STDOUT_BYTES) {
|
|
205
|
+
if (!stdoutTruncated) {
|
|
206
|
+
stdoutTruncated = true;
|
|
207
|
+
// Process any remaining partial line in buf before discarding
|
|
208
|
+
if (buf.trim()) {
|
|
209
|
+
try {
|
|
210
|
+
const evt = JSON.parse(buf);
|
|
211
|
+
processEvent(evt);
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
// incomplete JSON line — discard
|
|
215
|
+
}
|
|
216
|
+
buf = "";
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
buf += chunk.toString();
|
|
222
|
+
const lines = buf.split("\n");
|
|
223
|
+
buf = lines.pop() || "";
|
|
224
|
+
for (const line of lines) {
|
|
225
|
+
if (!line.trim())
|
|
226
|
+
continue;
|
|
227
|
+
try {
|
|
228
|
+
const evt = JSON.parse(line);
|
|
229
|
+
processEvent(evt);
|
|
230
|
+
}
|
|
231
|
+
catch {
|
|
232
|
+
// Skip unparseable lines
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
});
|
|
236
|
+
proc.stderr.on("data", (chunk) => {
|
|
237
|
+
stderrBuf += chunk.toString();
|
|
238
|
+
});
|
|
239
|
+
// Wait for process to exit
|
|
240
|
+
const exitCode = await new Promise((resolve) => {
|
|
241
|
+
proc.on("close", (code) => {
|
|
242
|
+
// Process remaining buffer
|
|
243
|
+
if (buf.trim()) {
|
|
244
|
+
try {
|
|
245
|
+
const evt = JSON.parse(buf);
|
|
246
|
+
processEvent(evt);
|
|
247
|
+
}
|
|
248
|
+
catch {
|
|
249
|
+
// Skip unparseable remainder
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
resolve(code);
|
|
253
|
+
});
|
|
254
|
+
});
|
|
255
|
+
// Clear timeout timers
|
|
256
|
+
if (timeoutTimer)
|
|
257
|
+
clearTimeout(timeoutTimer);
|
|
258
|
+
if (killTimer)
|
|
259
|
+
clearTimeout(killTimer);
|
|
260
|
+
// Cleanup temp files
|
|
261
|
+
if (tmpDir) {
|
|
262
|
+
try {
|
|
263
|
+
fs.rmSync(tmpDir, { recursive: true, force: true });
|
|
264
|
+
}
|
|
265
|
+
catch {
|
|
266
|
+
// Best-effort cleanup
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
// Timeout overrides exit code interpretation
|
|
270
|
+
if (timedOut) {
|
|
271
|
+
const warnings = [];
|
|
272
|
+
if (stdoutTruncated) {
|
|
273
|
+
warnings.push(`Stdout exceeded ${MAX_STDOUT_BYTES / (1024 * 1024)}MB limit — ` +
|
|
274
|
+
`output stream was truncated at ${bufBytes} bytes. ` +
|
|
275
|
+
`Usage counters (tokens, cost, turns) and textOutput may be incomplete.`);
|
|
276
|
+
}
|
|
277
|
+
return {
|
|
278
|
+
step: options.stepName,
|
|
279
|
+
agent: step.agent,
|
|
280
|
+
status: "failed",
|
|
281
|
+
output: undefined,
|
|
282
|
+
textOutput: lastAssistantText,
|
|
283
|
+
sessionLog: options.sessionLogDir,
|
|
284
|
+
usage,
|
|
285
|
+
durationMs: Date.now() - startTime,
|
|
286
|
+
error: `Step timed out after ${options.timeoutMs / 1000}s`,
|
|
287
|
+
truncated: stdoutTruncated || undefined,
|
|
288
|
+
warnings: warnings.length > 0 ? warnings : undefined,
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
const warnings = [];
|
|
292
|
+
if (stdoutTruncated) {
|
|
293
|
+
warnings.push(`Stdout exceeded ${MAX_STDOUT_BYTES / (1024 * 1024)}MB limit — ` +
|
|
294
|
+
`output stream was truncated at ${bufBytes} bytes. ` +
|
|
295
|
+
`Usage counters (tokens, cost, turns) and textOutput may be incomplete.`);
|
|
296
|
+
}
|
|
297
|
+
return {
|
|
298
|
+
step: options.stepName,
|
|
299
|
+
agent: step.agent,
|
|
300
|
+
status: exitCode === 0 ? "completed" : "failed",
|
|
301
|
+
output: undefined, // structured output handled by caller (workflow-executor)
|
|
302
|
+
textOutput: lastAssistantText,
|
|
303
|
+
sessionLog: options.sessionLogDir,
|
|
304
|
+
usage,
|
|
305
|
+
durationMs: Date.now() - startTime,
|
|
306
|
+
error: exitCode !== 0 ? stderrBuf.trim() || "Process exited with code " + exitCode : undefined,
|
|
307
|
+
truncated: stdoutTruncated || undefined,
|
|
308
|
+
warnings: warnings.length > 0 ? warnings : undefined,
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
//# sourceMappingURL=dispatch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../src/dispatch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/** Filter names derived from the FILTERS registry — add a filter above, this updates automatically. */
|
|
2
|
+
export declare const FILTER_NAMES: string[];
|
|
3
|
+
/** Known root-level expression scope keys. */
|
|
4
|
+
export declare const EXPRESSION_ROOTS: readonly ["input", "steps"];
|
|
5
|
+
/**
|
|
6
|
+
* Error class for expression resolution failures.
|
|
7
|
+
* Contains the original expression and a diagnostic reason.
|
|
8
|
+
*/
|
|
9
|
+
export declare class ExpressionError extends Error {
|
|
10
|
+
readonly expression: string;
|
|
11
|
+
readonly reason: string;
|
|
12
|
+
constructor(expression: string, reason: string);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Resolve a single expression string (without the ${{ }} delimiters).
|
|
16
|
+
* E.g. "steps.diagnose.output.rootCause" walks scope.steps.diagnose.output.rootCause
|
|
17
|
+
*
|
|
18
|
+
* Supports pipe filters: "totalDurationMs | duration"
|
|
19
|
+
*
|
|
20
|
+
* Scope is Record<string, unknown> — accepts ExpressionScope, CompletionScope, or any object.
|
|
21
|
+
*
|
|
22
|
+
* Throws ExpressionError if any segment of the path is undefined or null,
|
|
23
|
+
* or if a filter name is unknown.
|
|
24
|
+
*/
|
|
25
|
+
export declare function resolveExpression(expr: string, scope: Record<string, unknown>): unknown;
|
|
26
|
+
/**
|
|
27
|
+
* Resolve all ${{ }} expressions in a value.
|
|
28
|
+
*
|
|
29
|
+
* - If `value` is a string containing `${{ expr }}`, resolve the expression.
|
|
30
|
+
* - If `value` is a string that IS entirely `${{ expr }}`, return the resolved value
|
|
31
|
+
* (preserving its type -- object, array, number, etc.).
|
|
32
|
+
* - If `value` is a string with `${{ expr }}` embedded in other text,
|
|
33
|
+
* stringify the resolved value and interpolate.
|
|
34
|
+
* - If `value` is an object, recursively resolve all values.
|
|
35
|
+
* - If `value` is an array, recursively resolve all elements.
|
|
36
|
+
* - If `value` is anything else (number, boolean, null), return as-is.
|
|
37
|
+
*
|
|
38
|
+
* Throws ExpressionError if a property path doesn't resolve.
|
|
39
|
+
*/
|
|
40
|
+
export declare function resolveExpressions(value: unknown, scope: Record<string, unknown>): unknown;
|
|
41
|
+
/**
|
|
42
|
+
* Parse a right-hand operand string into a typed value.
|
|
43
|
+
* Supports: string literals ('value' or "value"), number literals, boolean literals (true/false),
|
|
44
|
+
* null, undefined, or expression paths resolved against scope.
|
|
45
|
+
*/
|
|
46
|
+
export declare function parseRightOperand(str: string, scope: Record<string, unknown>): unknown;
|
|
47
|
+
/**
|
|
48
|
+
* Compare two values using a comparison operator.
|
|
49
|
+
* == and === both use strict equality (===).
|
|
50
|
+
*/
|
|
51
|
+
export declare function compare(left: unknown, right: unknown, op: string): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Evaluate a condition expression for boolean truthiness.
|
|
54
|
+
*
|
|
55
|
+
* Supports:
|
|
56
|
+
* - Simple path expressions: truthy/falsy evaluation of the resolved value
|
|
57
|
+
* - Negation with ! prefix
|
|
58
|
+
* - Comparison operators: ==, !=, ===, !==, >, <, >=, <=
|
|
59
|
+
* - Right operands: string literals, number literals, boolean literals, null, undefined, or expression paths
|
|
60
|
+
*
|
|
61
|
+
* JS truthiness rules: undefined, null, false, 0, "" are falsy; everything else is truthy.
|
|
62
|
+
*/
|
|
63
|
+
export declare function evaluateCondition(expr: string, scope: Record<string, unknown>): boolean;
|
|
64
|
+
//# sourceMappingURL=expression.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"expression.d.ts","sourceRoot":"","sources":["../src/expression.ts"],"names":[],"mappings":"AAkBA,uGAAuG;AACvG,eAAO,MAAM,YAAY,UAAuB,CAAC;AAEjD,8CAA8C;AAC9C,eAAO,MAAM,gBAAgB,6BAA8B,CAAC;AAE5D;;;GAGG;AACH,qBAAa,eAAgB,SAAQ,KAAK;IACzC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEZ,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAM9C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAuDvF;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAmB1F;AAmCD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAoBtF;AAED;;;GAGG;AACH,wBAAgB,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAmB1E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAgCvF"}
|