@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.
Files changed (216) hide show
  1. package/CHANGELOG.md +7 -4
  2. package/README.md +12 -2
  3. package/agents/architecture-designer.agent.yaml +58 -0
  4. package/agents/architecture-inferrer.agent.yaml +60 -0
  5. package/agents/gap-identifier.agent.yaml +66 -0
  6. package/agents/handoff-writer.agent.yaml +64 -0
  7. package/agents/plan-creator.agent.yaml +63 -0
  8. package/agents/project-definer.agent.yaml +53 -0
  9. package/agents/project-inferrer.agent.yaml +63 -0
  10. package/agents/requirements-gatherer.agent.yaml +58 -0
  11. package/dist/agent-spec.d.ts +27 -0
  12. package/dist/agent-spec.d.ts.map +1 -0
  13. package/dist/agent-spec.js +112 -0
  14. package/dist/agent-spec.js.map +1 -0
  15. package/dist/checkpoint.d.ts +50 -0
  16. package/dist/checkpoint.d.ts.map +1 -0
  17. package/dist/checkpoint.js +109 -0
  18. package/dist/checkpoint.js.map +1 -0
  19. package/dist/completion.d.ts +18 -0
  20. package/dist/completion.d.ts.map +1 -0
  21. package/dist/completion.js +58 -0
  22. package/dist/completion.js.map +1 -0
  23. package/dist/dag.d.ts +56 -0
  24. package/dist/dag.d.ts.map +1 -0
  25. package/dist/dag.js +178 -0
  26. package/dist/dag.js.map +1 -0
  27. package/dist/dispatch.d.ts +35 -0
  28. package/dist/dispatch.d.ts.map +1 -0
  29. package/dist/dispatch.js +311 -0
  30. package/dist/dispatch.js.map +1 -0
  31. package/dist/expression.d.ts +64 -0
  32. package/dist/expression.d.ts.map +1 -0
  33. package/dist/expression.js +294 -0
  34. package/dist/expression.js.map +1 -0
  35. package/dist/format.d.ts +19 -0
  36. package/dist/format.d.ts.map +1 -0
  37. package/dist/format.js +42 -0
  38. package/dist/format.js.map +1 -0
  39. package/dist/index.d.ts +8 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +724 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/output.d.ts +12 -0
  44. package/dist/output.d.ts.map +1 -0
  45. package/dist/output.js +59 -0
  46. package/dist/output.js.map +1 -0
  47. package/dist/state.d.ts +66 -0
  48. package/dist/state.d.ts.map +1 -0
  49. package/dist/state.js +227 -0
  50. package/dist/state.js.map +1 -0
  51. package/dist/step-agent.d.ts +35 -0
  52. package/dist/step-agent.d.ts.map +1 -0
  53. package/dist/step-agent.js +171 -0
  54. package/dist/step-agent.js.map +1 -0
  55. package/dist/step-command.d.ts +21 -0
  56. package/dist/step-command.d.ts.map +1 -0
  57. package/dist/step-command.js +150 -0
  58. package/dist/step-command.js.map +1 -0
  59. package/dist/step-foreach.d.ts +33 -0
  60. package/dist/step-foreach.d.ts.map +1 -0
  61. package/dist/step-foreach.js +112 -0
  62. package/dist/step-foreach.js.map +1 -0
  63. package/dist/step-gate.d.ts +18 -0
  64. package/dist/step-gate.d.ts.map +1 -0
  65. package/dist/step-gate.js +137 -0
  66. package/dist/step-gate.js.map +1 -0
  67. package/dist/step-loop.d.ts +32 -0
  68. package/dist/step-loop.d.ts.map +1 -0
  69. package/dist/step-loop.js +278 -0
  70. package/dist/step-loop.js.map +1 -0
  71. package/dist/step-monitor.d.ts +56 -0
  72. package/dist/step-monitor.d.ts.map +1 -0
  73. package/dist/step-monitor.js +317 -0
  74. package/dist/step-monitor.js.map +1 -0
  75. package/dist/step-parallel.d.ts +43 -0
  76. package/dist/step-parallel.d.ts.map +1 -0
  77. package/dist/step-parallel.js +122 -0
  78. package/dist/step-parallel.js.map +1 -0
  79. package/{src/step-pause.ts → dist/step-pause.d.ts} +3 -13
  80. package/dist/step-pause.d.ts.map +1 -0
  81. package/dist/step-pause.js +22 -0
  82. package/dist/step-pause.js.map +1 -0
  83. package/dist/step-shared.d.ts +63 -0
  84. package/dist/step-shared.d.ts.map +1 -0
  85. package/dist/step-shared.js +136 -0
  86. package/dist/step-shared.js.map +1 -0
  87. package/dist/step-transform.d.ts +11 -0
  88. package/dist/step-transform.d.ts.map +1 -0
  89. package/dist/step-transform.js +41 -0
  90. package/dist/step-transform.js.map +1 -0
  91. package/dist/template.d.ts +51 -0
  92. package/dist/template.d.ts.map +1 -0
  93. package/{src/template.ts → dist/template.js} +32 -38
  94. package/dist/template.js.map +1 -0
  95. package/dist/test-helpers.d.ts +17 -0
  96. package/dist/test-helpers.d.ts.map +1 -0
  97. package/dist/test-helpers.js +46 -0
  98. package/dist/test-helpers.js.map +1 -0
  99. package/dist/tui.d.ts +47 -0
  100. package/dist/tui.d.ts.map +1 -0
  101. package/dist/tui.js +143 -0
  102. package/dist/tui.js.map +1 -0
  103. package/dist/types.d.ts +165 -0
  104. package/dist/types.d.ts.map +1 -0
  105. package/dist/types.js +3 -0
  106. package/dist/types.js.map +1 -0
  107. package/dist/workflow-discovery.d.ts +23 -0
  108. package/dist/workflow-discovery.d.ts.map +1 -0
  109. package/dist/workflow-discovery.js +103 -0
  110. package/dist/workflow-discovery.js.map +1 -0
  111. package/dist/workflow-executor.d.ts +50 -0
  112. package/dist/workflow-executor.d.ts.map +1 -0
  113. package/dist/workflow-executor.js +738 -0
  114. package/dist/workflow-executor.js.map +1 -0
  115. package/dist/workflow-sdk.d.ts +44 -0
  116. package/dist/workflow-sdk.d.ts.map +1 -0
  117. package/dist/workflow-sdk.js +457 -0
  118. package/dist/workflow-sdk.js.map +1 -0
  119. package/dist/workflow-spec.d.ts +33 -0
  120. package/dist/workflow-spec.d.ts.map +1 -0
  121. package/dist/workflow-spec.js +476 -0
  122. package/dist/workflow-spec.js.map +1 -0
  123. package/dist/workflows-dir.d.ts +3 -0
  124. package/dist/workflows-dir.d.ts.map +1 -0
  125. package/{src/workflows-dir.ts → dist/workflows-dir.js} +1 -0
  126. package/dist/workflows-dir.js.map +1 -0
  127. package/package.json +53 -38
  128. package/schemas/decomposition-specs.schema.json +48 -48
  129. package/schemas/execution-results.schema.json +48 -48
  130. package/schemas/investigation-findings.schema.json +43 -43
  131. package/schemas/pattern-analysis.schema.json +41 -41
  132. package/schemas/phase.schema.json +48 -0
  133. package/schemas/plan-breakdown.schema.json +20 -20
  134. package/schemas/quality-analysis.schema.json +33 -33
  135. package/schemas/research-findings.schema.json +42 -42
  136. package/schemas/structure-analysis.schema.json +40 -40
  137. package/schemas/synthesis.schema.json +31 -31
  138. package/schemas/verifier-output.schema.json +94 -94
  139. package/skill-narrative.md +107 -0
  140. package/skills/pi-workflows/SKILL.md +185 -0
  141. package/skills/pi-workflows/references/bundled-resources.md +87 -0
  142. package/templates/architecture-designer/task.md +117 -0
  143. package/templates/architecture-inferrer/task.md +61 -0
  144. package/templates/gap-identifier/task.md +103 -0
  145. package/templates/handoff-writer/task.md +91 -0
  146. package/templates/plan-creator/task.md +143 -0
  147. package/templates/project-definer/task.md +67 -0
  148. package/templates/project-inferrer/task.md +56 -0
  149. package/templates/requirements-gatherer/task.md +90 -0
  150. package/workflows/analyze-existing-project.workflow.yaml +94 -0
  151. package/workflows/create-handoff.workflow.yaml +66 -0
  152. package/workflows/create-phase.workflow.yaml +1 -1
  153. package/workflows/do-gap.workflow.yaml +4 -4
  154. package/workflows/fix-audit.workflow.yaml +1 -1
  155. package/workflows/gap-to-phase.workflow.yaml +1 -1
  156. package/workflows/init-new-project.workflow.yaml +81 -0
  157. package/workflows/plan-from-requirements.workflow.yaml +59 -0
  158. package/workflows/self-implement.workflow.yaml +3 -3
  159. package/workflows/typed-analysis.workflow.yaml +4 -4
  160. package/src/agent-spec.test.ts +0 -289
  161. package/src/agent-spec.ts +0 -122
  162. package/src/block-validation.test.ts +0 -350
  163. package/src/checkpoint.test.ts +0 -237
  164. package/src/checkpoint.ts +0 -140
  165. package/src/completion.test.ts +0 -143
  166. package/src/completion.ts +0 -68
  167. package/src/dag.test.ts +0 -350
  168. package/src/dag.ts +0 -219
  169. package/src/dispatch.test.ts +0 -475
  170. package/src/dispatch.ts +0 -353
  171. package/src/expression.test.ts +0 -353
  172. package/src/expression.ts +0 -332
  173. package/src/format.test.ts +0 -80
  174. package/src/format.ts +0 -41
  175. package/src/graduated-failure.test.ts +0 -556
  176. package/src/index.test.ts +0 -114
  177. package/src/index.ts +0 -516
  178. package/src/loop.test.ts +0 -551
  179. package/src/output.test.ts +0 -213
  180. package/src/output.ts +0 -70
  181. package/src/parallel-integration.test.ts +0 -175
  182. package/src/resume.test.ts +0 -192
  183. package/src/state.test.ts +0 -192
  184. package/src/state.ts +0 -254
  185. package/src/step-agent.test.ts +0 -327
  186. package/src/step-agent.ts +0 -178
  187. package/src/step-command.test.ts +0 -330
  188. package/src/step-command.ts +0 -132
  189. package/src/step-foreach.test.ts +0 -647
  190. package/src/step-foreach.ts +0 -148
  191. package/src/step-gate.test.ts +0 -185
  192. package/src/step-gate.ts +0 -116
  193. package/src/step-loop.test.ts +0 -626
  194. package/src/step-loop.ts +0 -323
  195. package/src/step-parallel.test.ts +0 -475
  196. package/src/step-parallel.ts +0 -168
  197. package/src/step-pause.test.ts +0 -30
  198. package/src/step-shared.test.ts +0 -355
  199. package/src/step-shared.ts +0 -157
  200. package/src/step-transform.test.ts +0 -155
  201. package/src/step-transform.ts +0 -47
  202. package/src/template-integration.test.ts +0 -72
  203. package/src/template.test.ts +0 -162
  204. package/src/test-helpers.ts +0 -51
  205. package/src/tui.test.ts +0 -355
  206. package/src/tui.ts +0 -182
  207. package/src/types.ts +0 -195
  208. package/src/verifier-schema.test.ts +0 -226
  209. package/src/workflow-discovery.test.ts +0 -105
  210. package/src/workflow-discovery.ts +0 -114
  211. package/src/workflow-executor.test.ts +0 -1532
  212. package/src/workflow-executor.ts +0 -810
  213. package/src/workflow-sdk.test.ts +0 -238
  214. package/src/workflow-sdk.ts +0 -262
  215. package/src/workflow-spec.test.ts +0 -576
  216. package/src/workflow-spec.ts +0 -471
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Gate step executor — runs a shell command and passes/fails based on exit code.
3
+ */
4
+ import { persistStepOutput } from "./output.js";
5
+ import { SIGKILL_GRACE_MS, zeroUsage } from "./step-shared.js";
6
+ /**
7
+ * Execute a gate step: runs a shell command, passes/fails based on exit code.
8
+ *
9
+ * The gate's check command is expected to already have ${{ }} expressions resolved
10
+ * before being passed here.
11
+ */
12
+ export async function executeGate(gate, stepName, options) {
13
+ const startTime = Date.now();
14
+ try {
15
+ const { spawn } = await import("node:child_process");
16
+ const output = await new Promise((resolve, reject) => {
17
+ const proc = spawn("sh", ["-c", gate.check], {
18
+ cwd: options.cwd,
19
+ stdio: ["ignore", "pipe", "pipe"],
20
+ detached: true,
21
+ });
22
+ let stdout = "";
23
+ let stderr = "";
24
+ let settled = false;
25
+ proc.stdout.on("data", (d) => {
26
+ stdout += d.toString();
27
+ });
28
+ proc.stderr.on("data", (d) => {
29
+ stderr += d.toString();
30
+ });
31
+ // Kill the entire process group (sh + children like sleep)
32
+ const killProc = () => {
33
+ if (!proc.pid)
34
+ return;
35
+ try {
36
+ process.kill(-proc.pid, "SIGTERM");
37
+ }
38
+ catch {
39
+ /* already dead */
40
+ }
41
+ setTimeout(() => {
42
+ if (!proc.pid)
43
+ return;
44
+ try {
45
+ process.kill(-proc.pid, "SIGKILL");
46
+ }
47
+ catch {
48
+ /* already dead */
49
+ }
50
+ }, SIGKILL_GRACE_MS);
51
+ };
52
+ // Handle abort signal (from parallel cancellation or timeout)
53
+ const onAbort = () => {
54
+ killProc();
55
+ };
56
+ if (options.signal) {
57
+ if (options.signal.aborted) {
58
+ killProc();
59
+ }
60
+ else {
61
+ options.signal.addEventListener("abort", onAbort, { once: true });
62
+ }
63
+ }
64
+ // Handle step-level timeout
65
+ let timeoutId;
66
+ if (options.timeoutMs) {
67
+ timeoutId = setTimeout(() => {
68
+ killProc();
69
+ }, options.timeoutMs);
70
+ }
71
+ proc.on("close", (code) => {
72
+ if (settled)
73
+ return;
74
+ settled = true;
75
+ if (timeoutId)
76
+ clearTimeout(timeoutId);
77
+ if (options.signal)
78
+ options.signal.removeEventListener("abort", onAbort);
79
+ if (code === 0) {
80
+ resolve(stdout);
81
+ }
82
+ else {
83
+ const err = new Error(`Process exited with code ${code}`);
84
+ err.status = code;
85
+ err.stdout = stdout;
86
+ err.stderr = stderr;
87
+ reject(err);
88
+ }
89
+ });
90
+ proc.on("error", (err) => {
91
+ if (settled)
92
+ return;
93
+ settled = true;
94
+ if (timeoutId)
95
+ clearTimeout(timeoutId);
96
+ if (options.signal)
97
+ options.signal.removeEventListener("abort", onAbort);
98
+ reject(err);
99
+ });
100
+ });
101
+ const gateOutput = { passed: true, exitCode: 0, output: output.trim() };
102
+ const result = {
103
+ step: stepName,
104
+ agent: "gate",
105
+ status: "completed",
106
+ textOutput: output.trim(),
107
+ output: gateOutput,
108
+ usage: zeroUsage(),
109
+ durationMs: Date.now() - startTime,
110
+ };
111
+ if (options.runDir) {
112
+ result.outputPath = persistStepOutput(options.runDir, stepName, gateOutput, undefined, options.outputPath);
113
+ }
114
+ return result;
115
+ }
116
+ catch (err) {
117
+ const execErr = err;
118
+ const exitCode = execErr.status ?? 1;
119
+ const stderr = execErr.stderr?.trim() ?? "";
120
+ const stdout = execErr.stdout?.trim() ?? "";
121
+ const gateOutput = { passed: false, exitCode, output: stderr || stdout };
122
+ const result = {
123
+ step: stepName,
124
+ agent: "gate",
125
+ status: "completed",
126
+ textOutput: stderr || stdout,
127
+ output: gateOutput,
128
+ usage: zeroUsage(),
129
+ durationMs: Date.now() - startTime,
130
+ };
131
+ if (options.runDir) {
132
+ result.outputPath = persistStepOutput(options.runDir, stepName, gateOutput, undefined, options.outputPath);
133
+ }
134
+ return result;
135
+ }
136
+ }
137
+ //# sourceMappingURL=step-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step-gate.js","sourceRoot":"","sources":["../src/step-gate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type nunjucks from "nunjucks";
2
+ import type { AgentSpec, ExecutionState, LoopSpec, StepResult, StepSpec, WorkflowSpec } from "./types.js";
3
+ /** Options for executeLoop, including callback-injected dispatch to avoid circular imports. */
4
+ export interface LoopExecuteOptions {
5
+ ctx: any;
6
+ pi: any;
7
+ signal?: AbortSignal;
8
+ loadAgent: (name: string) => AgentSpec;
9
+ dispatchAgent: (stepSpec: StepSpec, agentSpec: AgentSpec, prompt: string, opts: {
10
+ cwd: string;
11
+ sessionLogDir: string;
12
+ stepName: string;
13
+ signal?: AbortSignal;
14
+ }) => Promise<StepResult>;
15
+ runDir: string;
16
+ spec: WorkflowSpec;
17
+ templateEnv?: nunjucks.Environment;
18
+ outputPath?: string;
19
+ }
20
+ /**
21
+ * Execute a loop step: runs sub-steps repeatedly until a gate breaks,
22
+ * max attempts is reached, or a step fails.
23
+ *
24
+ * Loop sub-steps can be agent, gate, or transform steps.
25
+ * Gates inside loops support onPass: "break" (stop looping on success)
26
+ * and onFail: "continue" (retry on failure, the default inside loops).
27
+ *
28
+ * The loop scope provides ${{ loop.iteration }}, ${{ loop.maxAttempts }},
29
+ * and ${{ loop.priorAttempts }} for expression resolution inside sub-steps.
30
+ */
31
+ export declare function executeLoop(loopSpec: LoopSpec, stepName: string, state: ExecutionState, options: LoopExecuteOptions): Promise<StepResult>;
32
+ //# sourceMappingURL=step-loop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step-loop.d.ts","sourceRoot":"","sources":["../src/step-loop.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,QAAQ,MAAM,UAAU,CAAC;AAMrC,OAAO,KAAK,EACX,SAAS,EACT,cAAc,EAEd,QAAQ,EACR,UAAU,EACV,QAAQ,EAER,YAAY,EACZ,MAAM,YAAY,CAAC;AAEpB,+FAA+F;AAC/F,MAAM,WAAW,kBAAkB;IAClC,GAAG,EAAE,GAAG,CAAC;IACT,EAAE,EAAE,GAAG,CAAC;IACR,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,SAAS,CAAC;IACvC,aAAa,EAAE,CACd,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,KAChF,OAAO,CAAC,UAAU,CAAC,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,YAAY,CAAC;IACnB,WAAW,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC;IACnC,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,WAAW,CAChC,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,cAAc,EACrB,OAAO,EAAE,kBAAkB,GACzB,OAAO,CAAC,UAAU,CAAC,CAiRrB"}
@@ -0,0 +1,278 @@
1
+ /**
2
+ * Loop step executor — runs sub-steps repeatedly until a gate breaks,
3
+ * max attempts is reached, or a step fails.
4
+ */
5
+ import path from "node:path";
6
+ import { evaluateCondition, resolveExpressions } from "./expression.js";
7
+ import { persistStepOutput } from "./output.js";
8
+ import { executeGate } from "./step-gate.js";
9
+ import { addUsage, buildPrompt, compileAgentSpec, DEFAULT_MAX_ATTEMPTS, zeroUsage } from "./step-shared.js";
10
+ import { executeTransform } from "./step-transform.js";
11
+ /**
12
+ * Execute a loop step: runs sub-steps repeatedly until a gate breaks,
13
+ * max attempts is reached, or a step fails.
14
+ *
15
+ * Loop sub-steps can be agent, gate, or transform steps.
16
+ * Gates inside loops support onPass: "break" (stop looping on success)
17
+ * and onFail: "continue" (retry on failure, the default inside loops).
18
+ *
19
+ * The loop scope provides ${{ loop.iteration }}, ${{ loop.maxAttempts }},
20
+ * and ${{ loop.priorAttempts }} for expression resolution inside sub-steps.
21
+ */
22
+ export async function executeLoop(loopSpec, stepName, state, options) {
23
+ const { ctx, signal, loadAgent, dispatchAgent, runDir } = options;
24
+ const startTime = Date.now();
25
+ // Resolve maxAttempts (may be a ${{ }} expression)
26
+ const scope = { input: state.input, steps: state.steps };
27
+ let maxAttempts;
28
+ if (loopSpec.attempts) {
29
+ const resolved = resolveExpressions(loopSpec.attempts, scope);
30
+ maxAttempts = Number(resolved);
31
+ if (isNaN(maxAttempts) || maxAttempts < 1)
32
+ maxAttempts = loopSpec.maxAttempts ?? DEFAULT_MAX_ATTEMPTS;
33
+ }
34
+ else {
35
+ maxAttempts = loopSpec.maxAttempts ?? DEFAULT_MAX_ATTEMPTS;
36
+ }
37
+ const allAttempts = [];
38
+ let loopStatus = "failed"; // assume failure until break
39
+ let lastIterationSteps = {};
40
+ for (let iteration = 0; iteration < maxAttempts; iteration++) {
41
+ // Check cancellation
42
+ if (signal?.aborted)
43
+ break;
44
+ const iterationSteps = {};
45
+ let shouldBreak = false;
46
+ let iterationFailed = false;
47
+ // Execute sub-steps sequentially
48
+ const subStepEntries = Object.entries(loopSpec.steps);
49
+ for (const [subName, subSpec] of subStepEntries) {
50
+ if (signal?.aborted)
51
+ break;
52
+ // Build scope with loop context
53
+ const subScope = {
54
+ input: state.input,
55
+ steps: { ...state.steps, ...iterationSteps }, // see prior sub-steps in this iteration
56
+ loop: {
57
+ iteration,
58
+ maxAttempts,
59
+ priorAttempts: allAttempts,
60
+ },
61
+ };
62
+ // Handle `when` conditional
63
+ if (subSpec.when) {
64
+ const condExpr = subSpec.when.replace(/^\$\{\{\s*/, "").replace(/\s*\}\}$/, "");
65
+ if (!evaluateCondition(condExpr, subScope)) {
66
+ iterationSteps[subName] = {
67
+ step: subName,
68
+ agent: subSpec.agent ?? "skipped",
69
+ status: "skipped",
70
+ usage: zeroUsage(),
71
+ durationMs: 0,
72
+ };
73
+ continue;
74
+ }
75
+ }
76
+ // Execute sub-step based on type
77
+ let result;
78
+ if (subSpec.gate) {
79
+ const resolvedCheck = String(resolveExpressions(subSpec.gate.check, subScope));
80
+ result = await executeGate({ ...subSpec.gate, check: resolvedCheck }, subName, { cwd: ctx.cwd, signal });
81
+ // Handle gate pass/fail with break/continue
82
+ const passed = result.output?.passed;
83
+ if (passed && subSpec.gate.onPass === "break") {
84
+ iterationSteps[subName] = result;
85
+ shouldBreak = true;
86
+ loopStatus = "completed";
87
+ break;
88
+ }
89
+ if (!passed) {
90
+ if (subSpec.gate.onFail === "break") {
91
+ iterationSteps[subName] = result;
92
+ shouldBreak = true;
93
+ break;
94
+ }
95
+ if (subSpec.gate.onFail === "fail") {
96
+ // Explicitly set to "fail" — stop the loop
97
+ result.status = "failed";
98
+ iterationSteps[subName] = result;
99
+ iterationFailed = true;
100
+ break;
101
+ }
102
+ // Default inside loops is "continue" — proceed to next sub-step
103
+ // (or end iteration, triggering retry)
104
+ }
105
+ }
106
+ else if (subSpec.transform) {
107
+ result = executeTransform(subSpec.transform, subName, subScope);
108
+ if (result.status === "failed") {
109
+ iterationSteps[subName] = result;
110
+ iterationFailed = true;
111
+ break;
112
+ }
113
+ }
114
+ else if (subSpec.agent) {
115
+ // Resolve input, load agent, dispatch
116
+ let resolvedInput;
117
+ try {
118
+ resolvedInput = resolveExpressions(subSpec.input ?? {}, subScope);
119
+ }
120
+ catch (err) {
121
+ iterationSteps[subName] = {
122
+ step: subName,
123
+ agent: subSpec.agent,
124
+ status: "failed",
125
+ usage: zeroUsage(),
126
+ durationMs: 0,
127
+ error: err instanceof Error ? err.message : String(err),
128
+ };
129
+ iterationFailed = true;
130
+ break;
131
+ }
132
+ let agentSpec;
133
+ try {
134
+ agentSpec = loadAgent(subSpec.agent);
135
+ }
136
+ catch (err) {
137
+ iterationSteps[subName] = {
138
+ step: subName,
139
+ agent: subSpec.agent,
140
+ status: "failed",
141
+ usage: zeroUsage(),
142
+ durationMs: 0,
143
+ error: err instanceof Error ? err.message : String(err),
144
+ };
145
+ iterationFailed = true;
146
+ break;
147
+ }
148
+ agentSpec = compileAgentSpec(agentSpec, resolvedInput, options.templateEnv);
149
+ const prompt = buildPrompt(subSpec, agentSpec, resolvedInput, runDir, `${stepName}-${iteration}-${subName}`);
150
+ result = await dispatchAgent(subSpec, agentSpec, prompt, {
151
+ cwd: ctx.cwd,
152
+ sessionLogDir: path.join(runDir, "sessions"),
153
+ stepName: `${stepName}-${iteration}-${subName}`,
154
+ signal,
155
+ });
156
+ if (result.status === "failed") {
157
+ iterationSteps[subName] = result;
158
+ iterationFailed = true;
159
+ break;
160
+ }
161
+ }
162
+ else {
163
+ continue; // unknown step type, skip
164
+ }
165
+ iterationSteps[subName] = result;
166
+ }
167
+ // Record this iteration
168
+ lastIterationSteps = iterationSteps;
169
+ allAttempts.push({ iteration, steps: iterationSteps });
170
+ if (shouldBreak)
171
+ break;
172
+ if (iterationFailed) {
173
+ // Agent step failed within loop — stop the loop (not just the iteration)
174
+ loopStatus = "failed";
175
+ break;
176
+ }
177
+ // End of iteration without break — loop continues to next iteration
178
+ }
179
+ // If loop exhausted without break or failure, run onExhausted
180
+ if (loopStatus !== "completed" && loopSpec.onExhausted) {
181
+ const exhaustedScope = {
182
+ input: state.input,
183
+ steps: state.steps,
184
+ loop: {
185
+ iteration: allAttempts.length,
186
+ maxAttempts,
187
+ priorAttempts: allAttempts,
188
+ allAttempts,
189
+ },
190
+ };
191
+ let resolvedInput;
192
+ let exhaustedError;
193
+ try {
194
+ resolvedInput = resolveExpressions(loopSpec.onExhausted.input ?? {}, exhaustedScope);
195
+ }
196
+ catch (err) {
197
+ exhaustedError = err instanceof Error ? err.message : String(err);
198
+ // Still proceed with onExhausted — let the agent run with empty input
199
+ // but record the expression error so it's visible in the result
200
+ }
201
+ if (loopSpec.onExhausted.agent) {
202
+ let agentSpec;
203
+ try {
204
+ agentSpec = loadAgent(loopSpec.onExhausted.agent);
205
+ }
206
+ catch (err) {
207
+ lastIterationSteps["_exhausted"] = {
208
+ step: `${stepName}-exhausted`,
209
+ agent: loopSpec.onExhausted.agent,
210
+ status: "failed",
211
+ usage: zeroUsage(),
212
+ durationMs: 0,
213
+ error: err instanceof Error ? err.message : String(err),
214
+ };
215
+ agentSpec = null;
216
+ }
217
+ if (agentSpec) {
218
+ const prompt = buildPrompt(loopSpec.onExhausted, agentSpec, resolvedInput, runDir, `${stepName}-exhausted`);
219
+ const exhaustedResult = await dispatchAgent(loopSpec.onExhausted, agentSpec, prompt, {
220
+ cwd: ctx.cwd,
221
+ sessionLogDir: path.join(runDir, "sessions"),
222
+ stepName: `${stepName}-exhausted`,
223
+ signal,
224
+ });
225
+ if (exhaustedResult && exhaustedError) {
226
+ exhaustedResult.error = `Expression error in onExhausted input: ${exhaustedError}. Agent ran with empty input.`;
227
+ }
228
+ // Include exhausted result in the loop's output
229
+ lastIterationSteps["_exhausted"] = exhaustedResult;
230
+ }
231
+ }
232
+ if (!loopSpec.onExhausted.agent && exhaustedError) {
233
+ lastIterationSteps["_exhausted"] = {
234
+ step: `${stepName}-exhausted`,
235
+ agent: "exhausted",
236
+ status: "failed",
237
+ usage: zeroUsage(),
238
+ durationMs: 0,
239
+ error: `Expression error in onExhausted input: ${exhaustedError}`,
240
+ };
241
+ }
242
+ }
243
+ // Aggregate usage across all iterations
244
+ const totalUsage = zeroUsage();
245
+ for (const attempt of allAttempts) {
246
+ for (const result of Object.values(attempt.steps)) {
247
+ addUsage(totalUsage, result.usage);
248
+ }
249
+ }
250
+ const loopOutput = {
251
+ iterations: allAttempts.length,
252
+ maxAttempts,
253
+ attempts: allAttempts,
254
+ lastIteration: lastIterationSteps,
255
+ };
256
+ const loopTextOutput = `Loop '${stepName}': ${allAttempts.length}/${maxAttempts} iterations, status: ${loopStatus}`;
257
+ const result = {
258
+ step: stepName,
259
+ agent: "loop",
260
+ status: loopStatus,
261
+ output: loopOutput,
262
+ textOutput: loopTextOutput,
263
+ usage: totalUsage,
264
+ durationMs: Date.now() - startTime,
265
+ };
266
+ // Propagate truncation from any sub-step
267
+ const anyTruncated = allAttempts.some((a) => Object.values(a.steps).some((s) => s.truncated));
268
+ if (anyTruncated) {
269
+ result.truncated = true;
270
+ result.warnings = [
271
+ ...(result.warnings ?? []),
272
+ "One or more loop sub-steps had truncated stdout — usage totals may undercount.",
273
+ ];
274
+ }
275
+ result.outputPath = persistStepOutput(runDir, stepName, loopOutput, loopTextOutput, options.outputPath);
276
+ return result;
277
+ }
278
+ //# sourceMappingURL=step-loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step-loop.js","sourceRoot":"","sources":["../src/step-loop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
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 type { ExtensionContext } from "@mariozechner/pi-coding-agent";
10
+ import type { StepResult } from "./types.js";
11
+ interface MonitorSpec {
12
+ name: string;
13
+ classify: {
14
+ model: string;
15
+ context: string[];
16
+ prompt: string;
17
+ promptTemplate?: string;
18
+ };
19
+ patterns: {
20
+ path: string;
21
+ };
22
+ instructions?: {
23
+ path: string;
24
+ };
25
+ }
26
+ /**
27
+ * Find a monitor spec by name. Searches:
28
+ * 1. .pi/monitors/ (project)
29
+ * 2. ~/.pi/agent/monitors/ (user)
30
+ * 3. pi-behavior-monitors examples (if installed as peer)
31
+ */
32
+ export declare function findMonitorSpec(monitorName: string, cwd: string): {
33
+ spec: MonitorSpec;
34
+ dir: string;
35
+ } | null;
36
+ export interface MonitorStepOptions {
37
+ cwd: string;
38
+ ctx: ExtensionContext;
39
+ signal?: AbortSignal;
40
+ runDir?: string;
41
+ outputPath?: string;
42
+ }
43
+ /**
44
+ * Execute a monitor step: discover monitor, render prompt, classify, return verdict.
45
+ *
46
+ * - CLEAN → status: "completed", output: { verdict: "clean" }
47
+ * - FLAG → status: "failed", output: { verdict: "flag", description }
48
+ * - NEW → status: "failed", output: { verdict: "new", pattern, description }
49
+ */
50
+ export declare function executeMonitor(monitorName: string, stepName: string, input: Record<string, unknown>, options: MonitorStepOptions): Promise<StepResult>;
51
+ /**
52
+ * List all discoverable monitor names for validation.
53
+ */
54
+ export declare function availableMonitors(cwd: string): string[];
55
+ export {};
56
+ //# sourceMappingURL=step-monitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"step-monitor.d.ts","sourceRoot":"","sources":["../src/step-monitor.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAItE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAI7C,UAAU,WAAW;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE;QACT,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,cAAc,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,QAAQ,EAAE;QACT,IAAI,EAAE,MAAM,CAAC;KACb,CAAC;IACF,YAAY,CAAC,EAAE;QACd,IAAI,EAAE,MAAM,CAAC;KACb,CAAC;CACF;AAoBD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAwC3G;AAoHD,MAAM,WAAW,kBAAkB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,gBAAgB,CAAC;IACtB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CACnC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,EAAE,kBAAkB,GACzB,OAAO,CAAC,UAAU,CAAC,CAuHrB;AAYD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CA0BvD"}