@davidorex/pi-workflows 0.2.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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 +178 -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 +724 -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 +171 -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 +63 -0
- package/dist/step-shared.d.ts.map +1 -0
- package/dist/step-shared.js +136 -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 +165 -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 +738 -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 +457 -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 +476 -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 +107 -0
- package/skills/pi-workflows/SKILL.md +185 -0
- package/skills/pi-workflows/references/bundled-resources.md +87 -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 +94 -0
- package/workflows/create-handoff.workflow.yaml +66 -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 +81 -0
- package/workflows/plan-from-requirements.workflow.yaml +59 -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
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Monitor step executor — runs a monitor's classification as a workflow
|
|
3
|
+
* verification gate. Lightweight: reads monitor spec, loads patterns,
|
|
4
|
+
* renders prompt (Nunjucks or inline), calls LLM, parses verdict.
|
|
5
|
+
*
|
|
6
|
+
* Does NOT depend on pi-behavior-monitors — implements just enough to
|
|
7
|
+
* classify. No event handling, steering, ceiling, or escalation.
|
|
8
|
+
*/
|
|
9
|
+
import * as fs from "node:fs";
|
|
10
|
+
import * as os from "node:os";
|
|
11
|
+
import * as path from "node:path";
|
|
12
|
+
import { complete } from "@mariozechner/pi-ai";
|
|
13
|
+
import nunjucks from "nunjucks";
|
|
14
|
+
import { persistStepOutput } from "./output.js";
|
|
15
|
+
import { zeroUsage } from "./step-shared.js";
|
|
16
|
+
// ── Discovery ────────────────────────────────────────────────────────────────
|
|
17
|
+
/**
|
|
18
|
+
* Find a monitor spec by name. Searches:
|
|
19
|
+
* 1. .pi/monitors/ (project)
|
|
20
|
+
* 2. ~/.pi/agent/monitors/ (user)
|
|
21
|
+
* 3. pi-behavior-monitors examples (if installed as peer)
|
|
22
|
+
*/
|
|
23
|
+
export function findMonitorSpec(monitorName, cwd) {
|
|
24
|
+
const searchDirs = [
|
|
25
|
+
path.join(cwd, ".pi", "monitors"),
|
|
26
|
+
path.join(os.homedir(), ".pi", "agent", "monitors"),
|
|
27
|
+
];
|
|
28
|
+
// Also check pi-behavior-monitors examples via node_modules
|
|
29
|
+
try {
|
|
30
|
+
const bmPath = require.resolve("@davidorex/pi-behavior-monitors/package.json", { paths: [cwd] });
|
|
31
|
+
searchDirs.push(path.join(path.dirname(bmPath), "examples"));
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// pi-behavior-monitors not installed — skip
|
|
35
|
+
}
|
|
36
|
+
for (const dir of searchDirs) {
|
|
37
|
+
const filePath = path.join(dir, `${monitorName}.monitor.json`);
|
|
38
|
+
try {
|
|
39
|
+
const raw = JSON.parse(fs.readFileSync(filePath, "utf-8"));
|
|
40
|
+
if (raw.name && raw.classify && raw.patterns?.path) {
|
|
41
|
+
return {
|
|
42
|
+
spec: {
|
|
43
|
+
name: raw.name,
|
|
44
|
+
classify: {
|
|
45
|
+
model: raw.classify.model ?? "claude-sonnet-4-20250514",
|
|
46
|
+
context: Array.isArray(raw.classify.context) ? raw.classify.context : [],
|
|
47
|
+
prompt: raw.classify.prompt ?? "",
|
|
48
|
+
promptTemplate: typeof raw.classify.promptTemplate === "string" ? raw.classify.promptTemplate : undefined,
|
|
49
|
+
},
|
|
50
|
+
patterns: { path: raw.patterns.path },
|
|
51
|
+
instructions: raw.instructions?.path ? { path: raw.instructions.path } : undefined,
|
|
52
|
+
},
|
|
53
|
+
dir,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
// file doesn't exist or is invalid — try next
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
// ── Pattern & instruction loading ────────────────────────────────────────────
|
|
64
|
+
function loadPatterns(dir, patternsPath) {
|
|
65
|
+
try {
|
|
66
|
+
const resolved = path.resolve(dir, patternsPath);
|
|
67
|
+
return JSON.parse(fs.readFileSync(resolved, "utf-8"));
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return [];
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function loadInstructions(dir, instructionsPath) {
|
|
74
|
+
if (!instructionsPath)
|
|
75
|
+
return [];
|
|
76
|
+
try {
|
|
77
|
+
const resolved = path.resolve(dir, instructionsPath);
|
|
78
|
+
return JSON.parse(fs.readFileSync(resolved, "utf-8"));
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return [];
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
function formatPatterns(patterns) {
|
|
85
|
+
return patterns.map((p, i) => `${i + 1}. [${p.severity ?? "warning"}] ${p.description}`).join("\n");
|
|
86
|
+
}
|
|
87
|
+
function formatInstructions(instructions) {
|
|
88
|
+
if (instructions.length === 0)
|
|
89
|
+
return "";
|
|
90
|
+
const lines = instructions.map((i) => `- ${i.text}`).join("\n");
|
|
91
|
+
return `\nOperating instructions from the user (follow these strictly):\n${lines}\n`;
|
|
92
|
+
}
|
|
93
|
+
// ── Template rendering ───────────────────────────────────────────────────────
|
|
94
|
+
function createTemplateEnv(cwd) {
|
|
95
|
+
const searchPaths = [];
|
|
96
|
+
const projectDir = path.join(cwd, ".pi", "monitors");
|
|
97
|
+
const userDir = path.join(os.homedir(), ".pi", "agent", "monitors");
|
|
98
|
+
if (fs.existsSync(projectDir))
|
|
99
|
+
searchPaths.push(projectDir);
|
|
100
|
+
if (fs.existsSync(userDir))
|
|
101
|
+
searchPaths.push(userDir);
|
|
102
|
+
// pi-behavior-monitors examples
|
|
103
|
+
try {
|
|
104
|
+
const bmPath = require.resolve("@davidorex/pi-behavior-monitors/package.json", { paths: [cwd] });
|
|
105
|
+
const exDir = path.join(path.dirname(bmPath), "examples");
|
|
106
|
+
if (fs.existsSync(exDir))
|
|
107
|
+
searchPaths.push(exDir);
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
/* not installed */
|
|
111
|
+
}
|
|
112
|
+
const loader = searchPaths.length > 0 ? new nunjucks.FileSystemLoader(searchPaths) : undefined;
|
|
113
|
+
return new nunjucks.Environment(loader, { autoescape: false, throwOnUndefined: false });
|
|
114
|
+
}
|
|
115
|
+
function renderPrompt(spec, dir, input, templateEnv) {
|
|
116
|
+
const patterns = loadPatterns(dir, spec.patterns.path);
|
|
117
|
+
if (patterns.length === 0)
|
|
118
|
+
return null;
|
|
119
|
+
const instructions = loadInstructions(dir, spec.instructions?.path);
|
|
120
|
+
// Build context: patterns, instructions, plus any input fields
|
|
121
|
+
const context = {
|
|
122
|
+
patterns: formatPatterns(patterns),
|
|
123
|
+
instructions: formatInstructions(instructions),
|
|
124
|
+
iteration: 0,
|
|
125
|
+
...input,
|
|
126
|
+
};
|
|
127
|
+
if (spec.classify.promptTemplate) {
|
|
128
|
+
try {
|
|
129
|
+
return templateEnv.render(spec.classify.promptTemplate, context);
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
// Fall through to inline prompt
|
|
133
|
+
if (!spec.classify.prompt)
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
if (!spec.classify.prompt)
|
|
138
|
+
return null;
|
|
139
|
+
return spec.classify.prompt.replace(/\{(\w+)\}/g, (match, key) => {
|
|
140
|
+
return String(context[key] ?? match);
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
// ── Verdict parsing ──────────────────────────────────────────────────────────
|
|
144
|
+
function parseVerdict(raw) {
|
|
145
|
+
const text = raw.trim();
|
|
146
|
+
if (text.startsWith("CLEAN"))
|
|
147
|
+
return { verdict: "clean" };
|
|
148
|
+
if (text.startsWith("NEW:")) {
|
|
149
|
+
const rest = text.slice(4);
|
|
150
|
+
const pipe = rest.indexOf("|");
|
|
151
|
+
if (pipe !== -1) {
|
|
152
|
+
return { verdict: "new", pattern: rest.slice(0, pipe).trim(), description: rest.slice(pipe + 1).trim() };
|
|
153
|
+
}
|
|
154
|
+
return { verdict: "new", pattern: rest.trim(), description: rest.trim() };
|
|
155
|
+
}
|
|
156
|
+
if (text.startsWith("FLAG:"))
|
|
157
|
+
return { verdict: "flag", description: text.slice(5).trim() };
|
|
158
|
+
return { verdict: "clean" };
|
|
159
|
+
}
|
|
160
|
+
function extractText(parts) {
|
|
161
|
+
return parts
|
|
162
|
+
.filter((b) => b.type === "text")
|
|
163
|
+
.map((b) => b.text)
|
|
164
|
+
.join("");
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Execute a monitor step: discover monitor, render prompt, classify, return verdict.
|
|
168
|
+
*
|
|
169
|
+
* - CLEAN → status: "completed", output: { verdict: "clean" }
|
|
170
|
+
* - FLAG → status: "failed", output: { verdict: "flag", description }
|
|
171
|
+
* - NEW → status: "failed", output: { verdict: "new", pattern, description }
|
|
172
|
+
*/
|
|
173
|
+
export async function executeMonitor(monitorName, stepName, input, options) {
|
|
174
|
+
const startTime = Date.now();
|
|
175
|
+
// 1. Discover monitor
|
|
176
|
+
const found = findMonitorSpec(monitorName, options.cwd);
|
|
177
|
+
if (!found) {
|
|
178
|
+
return {
|
|
179
|
+
step: stepName,
|
|
180
|
+
agent: `monitor:${monitorName}`,
|
|
181
|
+
status: "failed",
|
|
182
|
+
usage: zeroUsage(),
|
|
183
|
+
durationMs: Date.now() - startTime,
|
|
184
|
+
error: `Monitor '${monitorName}' not found`,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
const { spec, dir } = found;
|
|
188
|
+
// 2. Render prompt
|
|
189
|
+
const templateEnv = createTemplateEnv(options.cwd);
|
|
190
|
+
const prompt = renderPrompt(spec, dir, input, templateEnv);
|
|
191
|
+
if (!prompt) {
|
|
192
|
+
return {
|
|
193
|
+
step: stepName,
|
|
194
|
+
agent: `monitor:${monitorName}`,
|
|
195
|
+
status: "completed",
|
|
196
|
+
output: { verdict: "clean", note: "No patterns loaded — nothing to classify" },
|
|
197
|
+
textOutput: "CLEAN (no patterns)",
|
|
198
|
+
usage: zeroUsage(),
|
|
199
|
+
durationMs: Date.now() - startTime,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
// 3. Resolve model
|
|
203
|
+
const { provider, modelId } = parseModelSpec(spec.classify.model);
|
|
204
|
+
const model = options.ctx.modelRegistry.find(provider, modelId);
|
|
205
|
+
if (!model) {
|
|
206
|
+
return {
|
|
207
|
+
step: stepName,
|
|
208
|
+
agent: `monitor:${monitorName}`,
|
|
209
|
+
status: "failed",
|
|
210
|
+
usage: zeroUsage(),
|
|
211
|
+
durationMs: Date.now() - startTime,
|
|
212
|
+
error: `Model '${spec.classify.model}' not found in registry`,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
const apiKey = await options.ctx.modelRegistry.getApiKey(model);
|
|
216
|
+
if (!apiKey) {
|
|
217
|
+
return {
|
|
218
|
+
step: stepName,
|
|
219
|
+
agent: `monitor:${monitorName}`,
|
|
220
|
+
status: "failed",
|
|
221
|
+
usage: zeroUsage(),
|
|
222
|
+
durationMs: Date.now() - startTime,
|
|
223
|
+
error: `No API key for model '${spec.classify.model}'`,
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
// 4. Classify
|
|
227
|
+
let response;
|
|
228
|
+
try {
|
|
229
|
+
response = await complete(model, { messages: [{ role: "user", content: [{ type: "text", text: prompt }], timestamp: Date.now() }] }, { apiKey, maxTokens: 150, signal: options.signal });
|
|
230
|
+
}
|
|
231
|
+
catch (err) {
|
|
232
|
+
if (options.signal?.aborted) {
|
|
233
|
+
return {
|
|
234
|
+
step: stepName,
|
|
235
|
+
agent: `monitor:${monitorName}`,
|
|
236
|
+
status: "failed",
|
|
237
|
+
usage: zeroUsage(),
|
|
238
|
+
durationMs: Date.now() - startTime,
|
|
239
|
+
error: "Monitor classification cancelled",
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
243
|
+
return {
|
|
244
|
+
step: stepName,
|
|
245
|
+
agent: `monitor:${monitorName}`,
|
|
246
|
+
status: "failed",
|
|
247
|
+
usage: zeroUsage(),
|
|
248
|
+
durationMs: Date.now() - startTime,
|
|
249
|
+
error: `Classification failed: ${msg}`,
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
// 5. Parse verdict
|
|
253
|
+
const rawText = extractText(response.content);
|
|
254
|
+
const verdict = parseVerdict(rawText);
|
|
255
|
+
const durationMs = Date.now() - startTime;
|
|
256
|
+
// Estimate usage from response
|
|
257
|
+
const usage = zeroUsage();
|
|
258
|
+
// Token counts not directly available from complete() — leave as zero
|
|
259
|
+
const output = {
|
|
260
|
+
verdict: verdict.verdict,
|
|
261
|
+
...(verdict.description ? { description: verdict.description } : {}),
|
|
262
|
+
...(verdict.pattern ? { pattern: verdict.pattern } : {}),
|
|
263
|
+
};
|
|
264
|
+
const result = {
|
|
265
|
+
step: stepName,
|
|
266
|
+
agent: `monitor:${monitorName}`,
|
|
267
|
+
status: verdict.verdict === "clean" ? "completed" : "failed",
|
|
268
|
+
output,
|
|
269
|
+
textOutput: rawText.trim(),
|
|
270
|
+
usage,
|
|
271
|
+
durationMs,
|
|
272
|
+
...(verdict.verdict !== "clean" ? { error: verdict.description ?? "Monitor flagged an issue" } : {}),
|
|
273
|
+
};
|
|
274
|
+
if (options.runDir) {
|
|
275
|
+
result.outputPath = persistStepOutput(options.runDir, stepName, output, rawText.trim(), options.outputPath);
|
|
276
|
+
}
|
|
277
|
+
return result;
|
|
278
|
+
}
|
|
279
|
+
// ── Utility ──────────────────────────────────────────────────────────────────
|
|
280
|
+
function parseModelSpec(spec) {
|
|
281
|
+
const slashIndex = spec.indexOf("/");
|
|
282
|
+
if (slashIndex !== -1) {
|
|
283
|
+
return { provider: spec.slice(0, slashIndex), modelId: spec.slice(slashIndex + 1) };
|
|
284
|
+
}
|
|
285
|
+
return { provider: "anthropic", modelId: spec };
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* List all discoverable monitor names for validation.
|
|
289
|
+
*/
|
|
290
|
+
export function availableMonitors(cwd) {
|
|
291
|
+
const searchDirs = [
|
|
292
|
+
path.join(cwd, ".pi", "monitors"),
|
|
293
|
+
path.join(os.homedir(), ".pi", "agent", "monitors"),
|
|
294
|
+
];
|
|
295
|
+
try {
|
|
296
|
+
const bmPath = require.resolve("@davidorex/pi-behavior-monitors/package.json", { paths: [cwd] });
|
|
297
|
+
searchDirs.push(path.join(path.dirname(bmPath), "examples"));
|
|
298
|
+
}
|
|
299
|
+
catch {
|
|
300
|
+
/* not installed */
|
|
301
|
+
}
|
|
302
|
+
const seen = new Set();
|
|
303
|
+
for (const dir of searchDirs) {
|
|
304
|
+
try {
|
|
305
|
+
for (const file of fs.readdirSync(dir)) {
|
|
306
|
+
if (file.endsWith(".monitor.json")) {
|
|
307
|
+
seen.add(file.replace(".monitor.json", ""));
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
catch {
|
|
312
|
+
/* dir doesn't exist */
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
return Array.from(seen).sort();
|
|
316
|
+
}
|
|
317
|
+
//# sourceMappingURL=step-monitor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"step-monitor.js","sourceRoot":"","sources":["../src/step-monitor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parallel step executors — concurrent step execution within a layer
|
|
3
|
+
* or within a single parallel step declaration.
|
|
4
|
+
*/
|
|
5
|
+
import type nunjucks from "nunjucks";
|
|
6
|
+
import type { ExecutionLayer } from "./dag.js";
|
|
7
|
+
import type { ProgressWidgetState } from "./tui.js";
|
|
8
|
+
import type { ExecutionState, StepResult, StepSpec, WorkflowSpec } from "./types.js";
|
|
9
|
+
/** Options shared by parallel execution helpers. */
|
|
10
|
+
export interface ParallelOptions {
|
|
11
|
+
ctx: any;
|
|
12
|
+
pi: any;
|
|
13
|
+
signal?: AbortSignal;
|
|
14
|
+
loadAgent: (name: string) => any;
|
|
15
|
+
runDir: string;
|
|
16
|
+
spec: WorkflowSpec;
|
|
17
|
+
widgetState: ProgressWidgetState;
|
|
18
|
+
templateEnv?: nunjucks.Environment;
|
|
19
|
+
}
|
|
20
|
+
/** Callback type for executing a single step — injected to avoid circular imports. */
|
|
21
|
+
export type SingleStepExecutor = (stepName: string, stepSpec: StepSpec, state: ExecutionState, options: ParallelOptions) => Promise<boolean>;
|
|
22
|
+
/**
|
|
23
|
+
* Execute all steps in a layer concurrently.
|
|
24
|
+
*
|
|
25
|
+
* All steps start at the same time. If any step fails, remaining steps
|
|
26
|
+
* are cancelled via a shared AbortController. All results are collected
|
|
27
|
+
* before proceeding to the next layer.
|
|
28
|
+
*
|
|
29
|
+
* Parallel steps write to distinct keys in `state.steps`, which is safe
|
|
30
|
+
* in single-threaded Node.js. `writeState` uses atomic write (tmp + rename),
|
|
31
|
+
* so concurrent calls are safe — last one wins.
|
|
32
|
+
*/
|
|
33
|
+
export declare function executeParallelLayer(layer: ExecutionLayer, spec: WorkflowSpec, state: ExecutionState, executeSingleStep: SingleStepExecutor, options: ParallelOptions): Promise<void>;
|
|
34
|
+
/**
|
|
35
|
+
* Execute a parallel step — runs all named sub-steps concurrently.
|
|
36
|
+
*
|
|
37
|
+
* Similar to executeParallelLayer but operates on sub-steps within
|
|
38
|
+
* a single declared step. The parallel step's result aggregates
|
|
39
|
+
* all sub-step results. Sub-step outputs are accessible via
|
|
40
|
+
* `${{ steps.<parallelStepName>.output.<subStepName> }}`.
|
|
41
|
+
*/
|
|
42
|
+
export declare function executeParallelStep(parallelSpec: Record<string, StepSpec>, stepName: string, state: ExecutionState, executeSingleStep: SingleStepExecutor, options: ParallelOptions): Promise<StepResult>;
|
|
43
|
+
//# sourceMappingURL=step-parallel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"step-parallel.d.ts","sourceRoot":"","sources":["../src/step-parallel.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AACrC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAEpD,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAErF,oDAAoD;AACpD,MAAM,WAAW,eAAe;IAC/B,GAAG,EAAE,GAAG,CAAC;IACT,EAAE,EAAE,GAAG,CAAC;IACR,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,GAAG,CAAC;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,YAAY,CAAC;IACnB,WAAW,EAAE,mBAAmB,CAAC;IACjC,WAAW,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC;CACnC;AAED,sFAAsF;AACtF,MAAM,MAAM,kBAAkB,GAAG,CAChC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,eAAe,KACpB,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB;;;;;;;;;;GAUG;AACH,wBAAsB,oBAAoB,CACzC,KAAK,EAAE,cAAc,EACrB,IAAI,EAAE,YAAY,EAClB,KAAK,EAAE,cAAc,EACrB,iBAAiB,EAAE,kBAAkB,EACrC,OAAO,EAAE,eAAe,GACtB,OAAO,CAAC,IAAI,CAAC,CA6Cf;AAED;;;;;;;GAOG;AACH,wBAAsB,mBAAmB,CACxC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,EACtC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,cAAc,EACrB,iBAAiB,EAAE,kBAAkB,EACrC,OAAO,EAAE,eAAe,GACtB,OAAO,CAAC,UAAU,CAAC,CA0DrB"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parallel step executors — concurrent step execution within a layer
|
|
3
|
+
* or within a single parallel step declaration.
|
|
4
|
+
*/
|
|
5
|
+
import { addUsage, WIDGET_ID, zeroUsage } from "./step-shared.js";
|
|
6
|
+
import { createProgressWidget } from "./tui.js";
|
|
7
|
+
/**
|
|
8
|
+
* Execute all steps in a layer concurrently.
|
|
9
|
+
*
|
|
10
|
+
* All steps start at the same time. If any step fails, remaining steps
|
|
11
|
+
* are cancelled via a shared AbortController. All results are collected
|
|
12
|
+
* before proceeding to the next layer.
|
|
13
|
+
*
|
|
14
|
+
* Parallel steps write to distinct keys in `state.steps`, which is safe
|
|
15
|
+
* in single-threaded Node.js. `writeState` uses atomic write (tmp + rename),
|
|
16
|
+
* so concurrent calls are safe — last one wins.
|
|
17
|
+
*/
|
|
18
|
+
export async function executeParallelLayer(layer, spec, state, executeSingleStep, options) {
|
|
19
|
+
const { ctx, signal, widgetState } = options;
|
|
20
|
+
// Create a child AbortController to cancel siblings on failure
|
|
21
|
+
const layerController = new AbortController();
|
|
22
|
+
if (signal) {
|
|
23
|
+
if (signal.aborted) {
|
|
24
|
+
layerController.abort(signal.reason);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
signal.addEventListener("abort", () => layerController.abort(signal.reason), { once: true });
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
// Update widget to show all parallel steps as running
|
|
31
|
+
widgetState.currentStep = layer.steps.join(", ");
|
|
32
|
+
if (ctx.hasUI) {
|
|
33
|
+
ctx.ui.setWidget(WIDGET_ID, createProgressWidget(widgetState));
|
|
34
|
+
}
|
|
35
|
+
// Launch all steps concurrently
|
|
36
|
+
const promises = layer.steps.map(async (stepName) => {
|
|
37
|
+
const stepSpec = spec.steps[stepName];
|
|
38
|
+
const success = await executeSingleStep(stepName, stepSpec, state, {
|
|
39
|
+
...options,
|
|
40
|
+
signal: layerController.signal,
|
|
41
|
+
});
|
|
42
|
+
if (!success && !layerController.signal.aborted) {
|
|
43
|
+
layerController.abort(new Error(`Step '${stepName}' failed`));
|
|
44
|
+
}
|
|
45
|
+
return { stepName, success };
|
|
46
|
+
});
|
|
47
|
+
const results = await Promise.allSettled(promises);
|
|
48
|
+
// Check for failures
|
|
49
|
+
for (const result of results) {
|
|
50
|
+
if (result.status === "rejected") {
|
|
51
|
+
state.status = "failed";
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
if (result.status === "fulfilled" && !result.value.success) {
|
|
55
|
+
state.status = "failed";
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Execute a parallel step — runs all named sub-steps concurrently.
|
|
62
|
+
*
|
|
63
|
+
* Similar to executeParallelLayer but operates on sub-steps within
|
|
64
|
+
* a single declared step. The parallel step's result aggregates
|
|
65
|
+
* all sub-step results. Sub-step outputs are accessible via
|
|
66
|
+
* `${{ steps.<parallelStepName>.output.<subStepName> }}`.
|
|
67
|
+
*/
|
|
68
|
+
export async function executeParallelStep(parallelSpec, stepName, state, executeSingleStep, options) {
|
|
69
|
+
const startTime = Date.now();
|
|
70
|
+
const { signal } = options;
|
|
71
|
+
const parallelController = new AbortController();
|
|
72
|
+
if (signal) {
|
|
73
|
+
if (signal.aborted) {
|
|
74
|
+
parallelController.abort(signal.reason);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
signal.addEventListener("abort", () => parallelController.abort(signal.reason), { once: true });
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Sub-steps share the outer state for reading but write to their own keys
|
|
81
|
+
const subResults = {};
|
|
82
|
+
const subPromises = Object.entries(parallelSpec).map(async ([subName, subSpec]) => {
|
|
83
|
+
const success = await executeSingleStep(subName, subSpec, state, {
|
|
84
|
+
...options,
|
|
85
|
+
signal: parallelController.signal,
|
|
86
|
+
});
|
|
87
|
+
subResults[subName] = state.steps[subName];
|
|
88
|
+
if (!success && !parallelController.signal.aborted) {
|
|
89
|
+
parallelController.abort(new Error(`Sub-step '${subName}' failed`));
|
|
90
|
+
}
|
|
91
|
+
return success;
|
|
92
|
+
});
|
|
93
|
+
const settled = await Promise.allSettled(subPromises);
|
|
94
|
+
// Aggregate usage and outputs
|
|
95
|
+
const totalUsage = zeroUsage();
|
|
96
|
+
const subOutputs = {};
|
|
97
|
+
let anyFailed = false;
|
|
98
|
+
for (const [subName] of Object.entries(parallelSpec)) {
|
|
99
|
+
const sub = subResults[subName];
|
|
100
|
+
if (sub) {
|
|
101
|
+
addUsage(totalUsage, sub.usage);
|
|
102
|
+
subOutputs[subName] = sub.output ?? sub.textOutput;
|
|
103
|
+
if (sub.status === "failed")
|
|
104
|
+
anyFailed = true;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
// Check for rejected promises too
|
|
108
|
+
for (const s of settled) {
|
|
109
|
+
if (s.status === "rejected")
|
|
110
|
+
anyFailed = true;
|
|
111
|
+
}
|
|
112
|
+
return {
|
|
113
|
+
step: stepName,
|
|
114
|
+
agent: "parallel",
|
|
115
|
+
status: anyFailed ? "failed" : "completed",
|
|
116
|
+
output: subOutputs,
|
|
117
|
+
textOutput: JSON.stringify(subOutputs, null, 2),
|
|
118
|
+
usage: totalUsage,
|
|
119
|
+
durationMs: Date.now() - startTime,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=step-parallel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"step-parallel.js","sourceRoot":"","sources":["../src/step-parallel.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,8 +2,7 @@
|
|
|
2
2
|
* Pause step executor — halts workflow execution at a deliberate checkpoint.
|
|
3
3
|
* The workflow can be resumed later via /workflow resume or Ctrl+J.
|
|
4
4
|
*/
|
|
5
|
-
import type { StepResult
|
|
6
|
-
|
|
5
|
+
import type { StepResult } from "./types.js";
|
|
7
6
|
/**
|
|
8
7
|
* Execute a pause step.
|
|
9
8
|
*
|
|
@@ -14,14 +13,5 @@ import type { StepResult, StepUsage } from "./types.ts";
|
|
|
14
13
|
* @param message - optional message to display (from pause field)
|
|
15
14
|
* @returns StepResult with status "completed"
|
|
16
15
|
*/
|
|
17
|
-
export function executePause(stepName: string, message?: string): StepResult
|
|
18
|
-
|
|
19
|
-
step: stepName,
|
|
20
|
-
agent: "pause",
|
|
21
|
-
status: "completed",
|
|
22
|
-
output: message ? { message } : undefined,
|
|
23
|
-
textOutput: message || "Workflow paused",
|
|
24
|
-
usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, turns: 0 } as StepUsage,
|
|
25
|
-
durationMs: 0,
|
|
26
|
-
};
|
|
27
|
-
}
|
|
16
|
+
export declare function executePause(stepName: string, message?: string): StepResult;
|
|
17
|
+
//# sourceMappingURL=step-pause.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"step-pause.d.ts","sourceRoot":"","sources":["../src/step-pause.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,UAAU,EAAa,MAAM,YAAY,CAAC;AAExD;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,UAAU,CAU3E"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Execute a pause step.
|
|
3
|
+
*
|
|
4
|
+
* Returns a completed result immediately. The executor is responsible
|
|
5
|
+
* for setting state.status = "paused" and stopping the loop.
|
|
6
|
+
*
|
|
7
|
+
* @param stepName - name of the pause step
|
|
8
|
+
* @param message - optional message to display (from pause field)
|
|
9
|
+
* @returns StepResult with status "completed"
|
|
10
|
+
*/
|
|
11
|
+
export function executePause(stepName, message) {
|
|
12
|
+
return {
|
|
13
|
+
step: stepName,
|
|
14
|
+
agent: "pause",
|
|
15
|
+
status: "completed",
|
|
16
|
+
output: message ? { message } : undefined,
|
|
17
|
+
textOutput: message || "Workflow paused",
|
|
18
|
+
usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, turns: 0 },
|
|
19
|
+
durationMs: 0,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=step-pause.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"step-pause.js","sourceRoot":"","sources":["../src/step-pause.ts"],"names":[],"mappings":"AAMA;;;;;;;;;GASG;AACH,MAAM,UAAU,YAAY,CAAC,QAAgB,EAAE,OAAgB;IAC9D,OAAO;QACN,IAAI,EAAE,QAAQ;QACd,KAAK,EAAE,OAAO;QACd,MAAM,EAAE,WAAW;QACnB,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS;QACzC,UAAU,EAAE,OAAO,IAAI,iBAAiB;QACxC,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAe;QAC3F,UAAU,EAAE,CAAC;KACb,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type nunjucks from "nunjucks";
|
|
2
|
+
import type { ProgressWidgetState } from "./tui.js";
|
|
3
|
+
import type { AgentSpec, ExecutionState, StepResult, StepUsage } from "./types.js";
|
|
4
|
+
/** Grace period (ms) between SIGTERM and SIGKILL when killing subprocesses. */
|
|
5
|
+
export declare const SIGKILL_GRACE_MS = 3000;
|
|
6
|
+
/** Widget ID used for the workflow progress widget. */
|
|
7
|
+
export declare const WIDGET_ID = "workflow-progress";
|
|
8
|
+
/** Default max loop attempts when not specified. */
|
|
9
|
+
export declare const DEFAULT_MAX_ATTEMPTS = 3;
|
|
10
|
+
/**
|
|
11
|
+
* Helper that returns a StepUsage with all zeroes.
|
|
12
|
+
*/
|
|
13
|
+
export declare function zeroUsage(): StepUsage;
|
|
14
|
+
/**
|
|
15
|
+
* Add step usage into a running total (mutates `total`).
|
|
16
|
+
*/
|
|
17
|
+
export declare function addUsage(total: StepUsage, step: StepUsage): void;
|
|
18
|
+
/**
|
|
19
|
+
* Resolve a schema path to an absolute filesystem path.
|
|
20
|
+
*
|
|
21
|
+
* Three resolution modes:
|
|
22
|
+
* - Absolute paths: returned as-is
|
|
23
|
+
* - `block:<name>` prefix: resolves to `.project/schemas/<name>.schema.json` from cwd.
|
|
24
|
+
* This is the portable way to reference project block schemas from any workflow or
|
|
25
|
+
* agent spec regardless of package install location. Uses the user's actual schemas
|
|
26
|
+
* (which may be customized).
|
|
27
|
+
* - Relative paths: resolved against the directory containing the spec file
|
|
28
|
+
*/
|
|
29
|
+
export declare function resolveSchemaPath(schemaPath: string, specFilePath: string, cwd?: string): string;
|
|
30
|
+
/**
|
|
31
|
+
* Build the prompt string sent to the subprocess.
|
|
32
|
+
*
|
|
33
|
+
* The prompt includes:
|
|
34
|
+
* 1. The compiled task template (if set), or the resolved input as context
|
|
35
|
+
* 2. Output instructions (if schema-bound)
|
|
36
|
+
*/
|
|
37
|
+
export declare function buildPrompt(step: {
|
|
38
|
+
agent?: string;
|
|
39
|
+
input?: Record<string, unknown>;
|
|
40
|
+
output?: {
|
|
41
|
+
format?: string;
|
|
42
|
+
schema?: string;
|
|
43
|
+
};
|
|
44
|
+
}, agentSpec: AgentSpec, resolvedInput: unknown, runDir: string, stepName: string, cwd?: string): string;
|
|
45
|
+
/**
|
|
46
|
+
* Persist step result to state and update TUI widget.
|
|
47
|
+
* Replaces the repeated writeState + setWidget pattern.
|
|
48
|
+
*/
|
|
49
|
+
export declare function persistStep(state: ExecutionState, stepName: string, result: StepResult, runDir: string, widgetState: ProgressWidgetState, ctx: {
|
|
50
|
+
hasUI: boolean;
|
|
51
|
+
ui: {
|
|
52
|
+
setWidget(id: string, w: unknown): void;
|
|
53
|
+
notify?(msg: string, level: string): void;
|
|
54
|
+
};
|
|
55
|
+
}): void;
|
|
56
|
+
/**
|
|
57
|
+
* Compile an agent spec: render system and task templates through Nunjucks.
|
|
58
|
+
*
|
|
59
|
+
* Every agent's prompts go through Nunjucks. Plain text without template
|
|
60
|
+
* tags renders to itself. The .md that pi receives is compiled output.
|
|
61
|
+
*/
|
|
62
|
+
export declare function compileAgentSpec(agentSpec: AgentSpec, resolvedInput: unknown, templateEnv?: nunjucks.Environment): AgentSpec;
|
|
63
|
+
//# sourceMappingURL=step-shared.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"step-shared.d.ts","sourceRoot":"","sources":["../src/step-shared.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AAGrC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAEpD,OAAO,KAAK,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEnF,+EAA+E;AAC/E,eAAO,MAAM,gBAAgB,OAAO,CAAC;AAErC,uDAAuD;AACvD,eAAO,MAAM,SAAS,sBAAsB,CAAC;AAE7C,oDAAoD;AACpD,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC;;GAEG;AACH,wBAAgB,SAAS,IAAI,SAAS,CAErC;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,GAAG,IAAI,CAOhE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAQhG;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAC1B,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,MAAM,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,EACxG,SAAS,EAAE,SAAS,EACpB,aAAa,EAAE,OAAO,EACtB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,GAAG,CAAC,EAAE,MAAM,GACV,MAAM,CA2BR;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAC1B,KAAK,EAAE,cAAc,EACrB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,mBAAmB,EAChC,GAAG,EAAE;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE;QAAE,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC;QAAC,MAAM,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAA;CAAE,GACjH,IAAI,CAgBN;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC/B,SAAS,EAAE,SAAS,EACpB,aAAa,EAAE,OAAO,EACtB,WAAW,CAAC,EAAE,QAAQ,CAAC,WAAW,GAChC,SAAS,CAwBX"}
|