@osolmaz/pi-workflows 0.9.1 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +64 -19
- package/dist/builtins/autodoc.workflow.d.ts +58 -0
- package/dist/builtins/autodoc.workflow.js +266 -0
- package/dist/builtins/autodoc.workflow.js.map +1 -0
- package/dist/builtins/autoimplement.workflow.d.ts +353 -0
- package/dist/builtins/autoimplement.workflow.js +961 -0
- package/dist/builtins/autoimplement.workflow.js.map +1 -0
- package/dist/builtins/autoplan.workflow.d.ts +58 -0
- package/dist/builtins/autoplan.workflow.js +190 -0
- package/dist/builtins/autoplan.workflow.js.map +1 -0
- package/dist/builtins/catalog.js +9 -1
- package/dist/builtins/catalog.js.map +1 -1
- package/dist/builtins/index.d.ts +6 -0
- package/dist/builtins/index.js +7 -0
- package/dist/builtins/index.js.map +1 -0
- package/dist/builtins/monitor.workflow.d.ts +29 -3
- package/dist/builtins/monitor.workflow.js +325 -13
- package/dist/builtins/monitor.workflow.js.map +1 -1
- package/dist/builtins/plan-approval.workflow.d.ts +83 -0
- package/dist/builtins/plan-approval.workflow.js +148 -0
- package/dist/builtins/plan-approval.workflow.js.map +1 -0
- package/dist/builtins/plan-presentation.d.ts +7 -0
- package/dist/builtins/plan-presentation.js +44 -0
- package/dist/builtins/plan-presentation.js.map +1 -0
- package/dist/extension/decision-channels.d.ts +132 -0
- package/dist/extension/decision-channels.js +1082 -0
- package/dist/extension/decision-channels.js.map +1 -0
- package/dist/extension/index.d.ts +1 -0
- package/dist/extension/index.js +426 -11
- package/dist/extension/index.js.map +1 -1
- package/dist/extension/widget.js +26 -2
- package/dist/extension/widget.js.map +1 -1
- package/dist/extension/workflow-tool.d.ts +1 -37
- package/dist/extension/workflow-tool.js +1 -42
- package/dist/extension/workflow-tool.js.map +1 -1
- package/dist/host/rpc-bridge.js +4 -21
- package/dist/host/rpc-bridge.js.map +1 -1
- package/dist/render/graph-render.js +46 -10
- package/dist/render/graph-render.js.map +1 -1
- package/dist/viewer/render.js +36 -2
- package/dist/viewer/render.js.map +1 -1
- package/dist/workflows/catalog.d.ts +1 -0
- package/dist/workflows/catalog.js +6 -0
- package/dist/workflows/catalog.js.map +1 -1
- package/dist/workflows/composition.d.ts +45 -0
- package/dist/workflows/composition.js +485 -0
- package/dist/workflows/composition.js.map +1 -0
- package/dist/workflows/decision-presentation.d.ts +18 -0
- package/dist/workflows/decision-presentation.js +417 -0
- package/dist/workflows/decision-presentation.js.map +1 -0
- package/dist/workflows/decision.d.ts +11 -5
- package/dist/workflows/decision.js.map +1 -1
- package/dist/workflows/definition.d.ts +22 -3
- package/dist/workflows/definition.js +46 -3
- package/dist/workflows/definition.js.map +1 -1
- package/dist/workflows/engine.d.ts +2 -1
- package/dist/workflows/engine.js +199 -18
- package/dist/workflows/engine.js.map +1 -1
- package/dist/workflows/graph.js +8 -6
- package/dist/workflows/graph.js.map +1 -1
- package/dist/workflows/human-decision.d.ts +87 -0
- package/dist/workflows/human-decision.js +583 -0
- package/dist/workflows/human-decision.js.map +1 -0
- package/dist/workflows/index.d.ts +5 -2
- package/dist/workflows/index.js +4 -1
- package/dist/workflows/index.js.map +1 -1
- package/dist/workflows/loader.d.ts +5 -4
- package/dist/workflows/loader.js +118 -18
- package/dist/workflows/loader.js.map +1 -1
- package/dist/workflows/schema.d.ts +3 -1
- package/dist/workflows/schema.js +64 -2
- package/dist/workflows/schema.js.map +1 -1
- package/dist/workflows/store.js +39 -2
- package/dist/workflows/store.js.map +1 -1
- package/dist/workflows/tool-input.d.ts +72 -0
- package/dist/workflows/tool-input.js +141 -0
- package/dist/workflows/tool-input.js.map +1 -0
- package/dist/workflows/types.d.ts +300 -2
- package/docs/CONTROLLERS.md +1 -1
- package/docs/DESIGN_PHILOSOPHY.md +1 -1
- package/docs/HUMAN_DECISIONS.md +371 -0
- package/docs/HUMAN_DECISION_PRESENTATIONS.md +323 -0
- package/docs/MONITOR.md +46 -18
- package/docs/WORKFLOW_COMPOSITION.md +333 -0
- package/docs/plans/2026-08-19-human-decision-gates-plan.md +296 -0
- package/docs/plans/2026-08-19-human-decision-presentations-plan.md +172 -0
- package/docs/plans/2026-08-19-provider-compatible-workflow-tool-schema-plan.md +45 -0
- package/docs/plans/2026-08-19-workflow-composition-plan.md +308 -0
- package/docs/run-bundles.md +45 -10
- package/docs/workflows.md +106 -15
- package/examples/workflows/approved-plan.workflow.ts +58 -0
- package/examples/workflows/autoimplement.workflow.ts +1 -92
- package/examples/workflows/autoplan.workflow.ts +1 -0
- package/examples/workflows/human-decision.workflow.ts +62 -0
- package/herdr-plugin.toml +1 -1
- package/package.json +6 -1
- package/schemas/decision-presentation-v1.schema.json +83 -0
- package/schemas/human-decision-accepted-v1.schema.json +44 -0
- package/schemas/human-decision-accepted-v2.schema.json +50 -0
- package/schemas/human-decision-answer-attempt-v1.schema.json +37 -0
- package/schemas/human-decision-cancellation-v1.schema.json +15 -0
- package/schemas/human-decision-continuation-v1.schema.json +16 -0
- package/schemas/human-decision-delivery-v1.schema.json +28 -0
- package/schemas/human-decision-delivery-v2.schema.json +36 -0
- package/schemas/human-decision-receipt-v1.schema.json +33 -0
- package/schemas/human-decision-receipt-v2.schema.json +39 -0
- package/schemas/human-decision-request-v1.schema.json +59 -0
- package/schemas/human-decision-request-v2.schema.json +69 -0
- package/schemas/human-decision-resolution-v1.schema.json +27 -0
- package/schemas/human-decision-resolution-v2.schema.json +27 -0
- package/schemas/human-decision-settlement-v1.schema.json +28 -0
- package/skills/autodoc/SKILL.md +43 -0
- package/skills/autoimplement/SKILL.md +58 -0
- package/skills/autoimplement/agents/openai.yaml +4 -0
- package/skills/autoplan/SKILL.md +25 -0
- package/skills/monitor/SKILL.md +8 -1
- package/skills/pi-workflows/SKILL.md +5 -3
- package/src/builtins/autodoc.workflow.ts +325 -0
- package/src/builtins/autoimplement.workflow.ts +1123 -0
- package/src/builtins/autoplan.workflow.ts +231 -0
- package/src/builtins/catalog.ts +9 -1
- package/src/builtins/index.ts +32 -0
- package/src/builtins/monitor.workflow.ts +396 -15
- package/src/builtins/plan-approval.workflow.ts +190 -0
- package/src/builtins/plan-presentation.ts +57 -0
- package/src/extension/decision-channels.ts +1533 -0
- package/src/extension/index.ts +499 -9
- package/src/extension/widget.ts +39 -2
- package/src/extension/workflow-tool.ts +5 -81
- package/src/host/rpc-bridge.ts +7 -30
- package/src/render/graph-render.ts +54 -5
- package/src/viewer/render.ts +56 -3
- package/src/workflows/catalog.ts +7 -0
- package/src/workflows/composition.ts +642 -0
- package/src/workflows/decision-presentation.ts +501 -0
- package/src/workflows/decision.ts +12 -5
- package/src/workflows/definition.ts +118 -8
- package/src/workflows/engine.ts +257 -20
- package/src/workflows/graph.ts +8 -6
- package/src/workflows/human-decision.ts +819 -0
- package/src/workflows/index.ts +89 -0
- package/src/workflows/loader.ts +186 -18
- package/src/workflows/schema.ts +79 -2
- package/src/workflows/store.ts +45 -2
- package/src/workflows/tool-input.ts +202 -0
- package/src/workflows/types.ts +374 -2
- package/examples/workflows/elegant-solution.workflow.ts +0 -95
package/README.md
CHANGED
|
@@ -36,12 +36,15 @@ Or try the npm package without installing it:
|
|
|
36
36
|
pi -e npm:@osolmaz/pi-workflows
|
|
37
37
|
```
|
|
38
38
|
|
|
39
|
-
The Pi package includes the extension and
|
|
39
|
+
The Pi package includes the extension and five optional skills:
|
|
40
40
|
|
|
41
41
|
- `pi-workflows` teaches the agent how to operate and author workflows.
|
|
42
42
|
- `monitor` starts and operates the built-in monitor workflow.
|
|
43
|
+
- `autoplan` selects the best practical solution and writes an implementation plan.
|
|
44
|
+
- `autodoc` records an existing plan in canonical documentation.
|
|
45
|
+
- `autoimplement` implements an existing plan and verifies the result.
|
|
43
46
|
|
|
44
|
-
Pi discovers
|
|
47
|
+
Pi discovers these skills when it loads the package. Use `pi config` to disable
|
|
45
48
|
the extension, all bundled skills, or one skill independently. The equivalent
|
|
46
49
|
settings entry below keeps the extension and disables only `monitor`:
|
|
47
50
|
|
|
@@ -56,7 +59,7 @@ settings entry below keeps the extension and disables only `monitor`:
|
|
|
56
59
|
}
|
|
57
60
|
```
|
|
58
61
|
|
|
59
|
-
Set `"skills": []` to disable
|
|
62
|
+
Set `"skills": []` to disable all bundled skills while keeping the extension.
|
|
60
63
|
Set `"extensions": []` to keep the skills without loading the extension.
|
|
61
64
|
|
|
62
65
|
Install the interactive terminal viewer separately from crates.io. The crate
|
|
@@ -139,6 +142,37 @@ structured run ends to request one normal, human-readable assistant response.
|
|
|
139
142
|
Workflows without it remain silent after their final structured output, which
|
|
140
143
|
keeps shell-only and machine-consumed workflows model-free.
|
|
141
144
|
|
|
145
|
+
## Compose workflows
|
|
146
|
+
|
|
147
|
+
A workflow can import another workflow and connect its named exits without copying its nodes:
|
|
148
|
+
|
|
149
|
+
```typescript
|
|
150
|
+
import { compute, defineWorkflow, includeWorkflow } from "@osolmaz/pi-workflows";
|
|
151
|
+
import autoplan from "./autoplan.workflow.js";
|
|
152
|
+
|
|
153
|
+
export default defineWorkflow({
|
|
154
|
+
source: import.meta.url,
|
|
155
|
+
name: "parent",
|
|
156
|
+
startAt: "start",
|
|
157
|
+
includes: {
|
|
158
|
+
design: includeWorkflow(autoplan, {
|
|
159
|
+
input: ({ outputs }) => ({ problem: String(outputs.start) }),
|
|
160
|
+
}),
|
|
161
|
+
},
|
|
162
|
+
nodes: {
|
|
163
|
+
start: compute({ run: () => "Fix the reported defect" }),
|
|
164
|
+
finish: compute({ run: ({ outputs }) => outputs.design }),
|
|
165
|
+
},
|
|
166
|
+
edges: [
|
|
167
|
+
{ from: "start", to: "design" },
|
|
168
|
+
{ from: "design.ready", to: "finish" },
|
|
169
|
+
{ from: "design.blocked", to: "finish" },
|
|
170
|
+
],
|
|
171
|
+
});
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
Direct imports check child input and exit names in TypeScript. Names and paths remain available for dynamic discovery. Nested children share one run, trace, pause state, and cancellation state. See [Workflow composition](docs/WORKFLOW_COMPOSITION.md) for the complete contract.
|
|
175
|
+
|
|
142
176
|
## Agent-managed workflows
|
|
143
177
|
|
|
144
178
|
The model can use the same `workflow` tool to list, start, inspect, pause,
|
|
@@ -151,10 +185,10 @@ Pi Workflows includes a `monitor` workflow for plain-language requests such as:
|
|
|
151
185
|
|
|
152
186
|
The monitor checks immediately, reports only the states requested by the user,
|
|
153
187
|
waits with a normal shell action, and loops until its stop condition or check
|
|
154
|
-
limit. Its input supports `task`, `everyMinutes`, `
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
by using the same file name.
|
|
188
|
+
limit. Its input supports `task`, `everyMinutes`, `stopWhen`, `maxChecks`, and
|
|
189
|
+
an optional `checkTimeoutMinutes`.
|
|
190
|
+
|
|
191
|
+
Monitor is observation-only by default. An explicit `repair` policy authorizes its composed `autoplan` and `autoimplement` path. The monitor checks the target again after repair and stops when the same issue and target evidence return without progress. Project and global workflows can replace the built-in `monitor` by using the same file name.
|
|
158
192
|
|
|
159
193
|
A monitor occupies the session's one active workflow slot. If its Pi runner
|
|
160
194
|
stops during the shell wait, the run parks and repeats that wait node when a
|
|
@@ -162,13 +196,13 @@ runner resumes it.
|
|
|
162
196
|
|
|
163
197
|
Because the workflow runs in your current conversation, you can have a long
|
|
164
198
|
discussion first and then trigger a workflow that builds on it. The
|
|
165
|
-
`
|
|
166
|
-
elegant
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
199
|
+
`autoplan` example does exactly that. It frames the problem and scope, devises
|
|
200
|
+
an elegant production-ready solution, and compares it with the holy grail. It
|
|
201
|
+
then selects the best practical in-scope solution without asking the user to
|
|
202
|
+
resolve the gap. The ideal can win when it is feasible, but work outside the
|
|
203
|
+
current authority cannot block a valid practical solution. The workflow ends
|
|
204
|
+
with a detailed implementation plan. `autoplan` replaces the earlier
|
|
205
|
+
`autodevise` name; the old command and export are not retained.
|
|
172
206
|
|
|
173
207
|
## Watching a run
|
|
174
208
|
|
|
@@ -183,7 +217,7 @@ pi-workflows view --once # print a snapshot and exit (good for scripts)
|
|
|
183
217
|
```
|
|
184
218
|
|
|
185
219
|
The run detail view draws the workflow as a boxed graph, like the acpx replay
|
|
186
|
-
viewer. Every card has a centered step-name header and a divider above its
|
|
220
|
+
viewer. Included nodes use hierarchical labels such as `implementation › redesign › plan`. Every card has a centered step-name header and a divider above its
|
|
187
221
|
structured metadata. Border characters keep the graph background, the body
|
|
188
222
|
surface begins inside the border, and the header interior uses a separate
|
|
189
223
|
surface. Node type, status, attempts, and timing use compact symbol rows; start
|
|
@@ -302,10 +336,21 @@ example set. Copy any of them into `.pi/workflows/` to use them:
|
|
|
302
336
|
while they run.
|
|
303
337
|
- `two-turn` chains three agent steps that build on each other's outputs in
|
|
304
338
|
the same conversation.
|
|
305
|
-
- `
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
339
|
+
- `autoplan` turns the current problem into a chosen practical solution and
|
|
340
|
+
a detailed implementation plan, using the ideal end state as guidance rather
|
|
341
|
+
than an out-of-scope requirement.
|
|
342
|
+
- `autoimplement` finds a clear existing plan, documents it when needed,
|
|
343
|
+
implements and verifies it, writes and runs the exact Pi Reviewer command,
|
|
344
|
+
tracks P0 through P2, handles PR comments and CI, and
|
|
345
|
+
finalizes the PR. P0 and P1 fixes require another review. P2-only work is
|
|
346
|
+
verified without another reviewer round. A five-minute CI wait routes to
|
|
347
|
+
additional useful local testing. New evidence can route through autoplan
|
|
348
|
+
and autodoc before implementation resumes.
|
|
349
|
+
- `human-decision` shows a reusable verified-human gate with a structured
|
|
350
|
+
machine subject, a separate readable operator presentation, plain choices,
|
|
351
|
+
and exact replan text.
|
|
352
|
+
- `approved-plan` composes autoplan, autodoc, and the reusable plan-approval
|
|
353
|
+
workflow without copying their internal nodes.
|
|
309
354
|
- `autoresearch` runs an iterative feature-search loop in the style of
|
|
310
355
|
[karpathy/autoresearch](https://github.com/karpathy/autoresearch): setup
|
|
311
356
|
creates a frozen evaluation harness, one editable feature file, and a
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
export type AutodocInput = {
|
|
2
|
+
task: string;
|
|
3
|
+
plan?: unknown;
|
|
4
|
+
repository?: string;
|
|
5
|
+
documents?: string[];
|
|
6
|
+
evidence?: unknown;
|
|
7
|
+
};
|
|
8
|
+
export type DocumentedPlan = {
|
|
9
|
+
status: "ready";
|
|
10
|
+
task: string;
|
|
11
|
+
plan: unknown;
|
|
12
|
+
planDigest: string;
|
|
13
|
+
documentation: {
|
|
14
|
+
state: "current" | "updated";
|
|
15
|
+
files: string[];
|
|
16
|
+
digests: Record<string, string>;
|
|
17
|
+
evidence: unknown;
|
|
18
|
+
};
|
|
19
|
+
verification: unknown;
|
|
20
|
+
};
|
|
21
|
+
export type AutodocBlocked = {
|
|
22
|
+
status: "blocked";
|
|
23
|
+
task: string;
|
|
24
|
+
reason: string;
|
|
25
|
+
evidence: unknown;
|
|
26
|
+
};
|
|
27
|
+
export declare const autodocWorkflow: import("../workflows/types.js").WorkflowDefinition<AutodocInput, {
|
|
28
|
+
readonly ready: {
|
|
29
|
+
readonly from: "finalize";
|
|
30
|
+
readonly validate: (value: unknown) => DocumentedPlan;
|
|
31
|
+
};
|
|
32
|
+
readonly blocked: {
|
|
33
|
+
readonly from: "blocked";
|
|
34
|
+
readonly validate: (value: unknown) => AutodocBlocked;
|
|
35
|
+
};
|
|
36
|
+
}, import("../workflows/types.js").WorkflowIncludeMap> & {
|
|
37
|
+
nodes: {
|
|
38
|
+
readonly prepare: import("../workflows/types.js").ComputeNodeDefinition;
|
|
39
|
+
readonly locatePlan: import("../workflows/types.js").AgentNodeDefinition;
|
|
40
|
+
readonly inspectDocumentation: import("../workflows/types.js").AgentNodeDefinition;
|
|
41
|
+
readonly updateDocumentation: import("../workflows/types.js").AgentNodeDefinition;
|
|
42
|
+
readonly verifyDocumentation: import("../workflows/types.js").AgentNodeDefinition;
|
|
43
|
+
readonly finalize: import("../workflows/types.js").ComputeNodeDefinition;
|
|
44
|
+
readonly blocked: import("../workflows/types.js").ComputeNodeDefinition;
|
|
45
|
+
};
|
|
46
|
+
includes?: import("../workflows/types.js").WorkflowIncludeMap;
|
|
47
|
+
exits?: {
|
|
48
|
+
readonly ready: {
|
|
49
|
+
readonly from: "finalize";
|
|
50
|
+
readonly validate: (value: unknown) => DocumentedPlan;
|
|
51
|
+
};
|
|
52
|
+
readonly blocked: {
|
|
53
|
+
readonly from: "blocked";
|
|
54
|
+
readonly validate: (value: unknown) => AutodocBlocked;
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
export default autodocWorkflow;
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import { agent, compute, defineWorkflow } from "../workflows/definition.js";
|
|
2
|
+
import { digest } from "../workflows/human-decision.js";
|
|
3
|
+
function requireRecord(value, label) {
|
|
4
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
5
|
+
throw new Error(`${label} must be an object`);
|
|
6
|
+
}
|
|
7
|
+
return value;
|
|
8
|
+
}
|
|
9
|
+
function requireString(value, label) {
|
|
10
|
+
if (typeof value !== "string" || value.trim().length === 0) {
|
|
11
|
+
throw new Error(`${label} must be a non-empty string`);
|
|
12
|
+
}
|
|
13
|
+
return value.trim();
|
|
14
|
+
}
|
|
15
|
+
function stringArray(value, label) {
|
|
16
|
+
if (!Array.isArray(value) || value.some((item) => typeof item !== "string")) {
|
|
17
|
+
throw new Error(`${label} must be an array of strings`);
|
|
18
|
+
}
|
|
19
|
+
return [...value];
|
|
20
|
+
}
|
|
21
|
+
function stringRecord(value, label) {
|
|
22
|
+
if (value === undefined)
|
|
23
|
+
return {};
|
|
24
|
+
const record = requireRecord(value, label);
|
|
25
|
+
if (Object.values(record).some((item) => typeof item !== "string")) {
|
|
26
|
+
throw new Error(`${label} values must be strings`);
|
|
27
|
+
}
|
|
28
|
+
return record;
|
|
29
|
+
}
|
|
30
|
+
function parseInput(value) {
|
|
31
|
+
const input = requireRecord(value, "autodoc input");
|
|
32
|
+
const documents = input.documents;
|
|
33
|
+
return {
|
|
34
|
+
task: requireString(input.task, "autodoc task"),
|
|
35
|
+
...(input.plan !== undefined ? { plan: input.plan } : {}),
|
|
36
|
+
...(input.repository !== undefined
|
|
37
|
+
? { repository: requireString(input.repository, "autodoc repository") }
|
|
38
|
+
: {}),
|
|
39
|
+
...(documents !== undefined ? { documents: stringArray(documents, "autodoc documents") } : {}),
|
|
40
|
+
...(input.evidence !== undefined ? { evidence: input.evidence } : {}),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function parseLocatedPlan(value) {
|
|
44
|
+
const result = requireRecord(value, "located plan");
|
|
45
|
+
if (result.route !== "found" && result.route !== "blocked") {
|
|
46
|
+
throw new Error("located plan route must be found or blocked");
|
|
47
|
+
}
|
|
48
|
+
if (result.route === "found" && result.plan === undefined) {
|
|
49
|
+
throw new Error("located plan must include the selected plan");
|
|
50
|
+
}
|
|
51
|
+
return {
|
|
52
|
+
route: result.route,
|
|
53
|
+
...(result.plan !== undefined ? { plan: result.plan } : {}),
|
|
54
|
+
...(result.sources !== undefined
|
|
55
|
+
? { sources: stringArray(result.sources, "located plan sources") }
|
|
56
|
+
: {}),
|
|
57
|
+
reason: requireString(result.reason, "located plan reason"),
|
|
58
|
+
evidence: result.evidence ?? null,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function parseDocumentationAssessment(value) {
|
|
62
|
+
const result = requireRecord(value, "documentation assessment");
|
|
63
|
+
if (result.route !== "current" && result.route !== "update" && result.route !== "blocked") {
|
|
64
|
+
throw new Error("documentation assessment route must be current, update, or blocked");
|
|
65
|
+
}
|
|
66
|
+
return {
|
|
67
|
+
route: result.route,
|
|
68
|
+
files: stringArray(result.files, "documentation files"),
|
|
69
|
+
digests: stringRecord(result.digests, "documentation digests"),
|
|
70
|
+
reason: requireString(result.reason, "documentation reason"),
|
|
71
|
+
evidence: result.evidence ?? null,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
function currentPlan(context) {
|
|
75
|
+
const explicit = context.input.plan;
|
|
76
|
+
if (explicit !== undefined)
|
|
77
|
+
return explicit;
|
|
78
|
+
const located = context.outputs.locatePlan;
|
|
79
|
+
if (located?.route === "found" && located.plan !== undefined)
|
|
80
|
+
return located.plan;
|
|
81
|
+
throw new Error("autodoc does not have a selected plan");
|
|
82
|
+
}
|
|
83
|
+
function blockedReason(context) {
|
|
84
|
+
const request = context.input;
|
|
85
|
+
const assessment = context.outputs.inspectDocumentation;
|
|
86
|
+
const located = context.outputs.locatePlan;
|
|
87
|
+
return {
|
|
88
|
+
status: "blocked",
|
|
89
|
+
task: request.task,
|
|
90
|
+
reason: assessment?.route === "blocked"
|
|
91
|
+
? assessment.reason
|
|
92
|
+
: located?.route === "blocked"
|
|
93
|
+
? located.reason
|
|
94
|
+
: "Autodoc could not identify a clear selected plan or canonical document target.",
|
|
95
|
+
evidence: assessment?.evidence ?? located?.evidence ?? null,
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
export const autodocWorkflow = defineWorkflow({
|
|
99
|
+
source: import.meta.url,
|
|
100
|
+
contractId: "pi-workflows.autodoc.v1",
|
|
101
|
+
name: "autodoc",
|
|
102
|
+
input: parseInput,
|
|
103
|
+
title: ({ input }) => `autodoc: ${input.task.slice(0, 60)}`,
|
|
104
|
+
startAt: "prepare",
|
|
105
|
+
maxSteps: 24,
|
|
106
|
+
exits: {
|
|
107
|
+
ready: {
|
|
108
|
+
from: "finalize",
|
|
109
|
+
validate: (value) => value,
|
|
110
|
+
},
|
|
111
|
+
blocked: {
|
|
112
|
+
from: "blocked",
|
|
113
|
+
validate: (value) => value,
|
|
114
|
+
},
|
|
115
|
+
},
|
|
116
|
+
nodes: {
|
|
117
|
+
prepare: compute({
|
|
118
|
+
run: ({ input }) => ({
|
|
119
|
+
route: input.plan === undefined ? "locate" : "inspect",
|
|
120
|
+
}),
|
|
121
|
+
}),
|
|
122
|
+
locatePlan: agent({
|
|
123
|
+
statusDetail: "locating selected plan",
|
|
124
|
+
prompt: ({ input }) => {
|
|
125
|
+
const request = input;
|
|
126
|
+
return [
|
|
127
|
+
"Find the clear plan that has already been selected for this task.",
|
|
128
|
+
"Look in the current conversation context and in the referenced canonical documents.",
|
|
129
|
+
"Do not devise, improve, replace, or implement the plan.",
|
|
130
|
+
"Return blocked when no single clear selected plan exists.",
|
|
131
|
+
`Task: ${request.task}`,
|
|
132
|
+
`Repository: ${request.repository ?? "current repository"}`,
|
|
133
|
+
`Referenced documents: ${JSON.stringify(request.documents ?? [])}`,
|
|
134
|
+
`Evidence: ${JSON.stringify(request.evidence ?? null)}`,
|
|
135
|
+
].join("\n");
|
|
136
|
+
},
|
|
137
|
+
expectedOutput: '{ "route": "found" | "blocked", "plan": {} (required when found), "sources": ["source"], "reason": "reason", "evidence": "evidence" }',
|
|
138
|
+
validate: parseLocatedPlan,
|
|
139
|
+
}),
|
|
140
|
+
inspectDocumentation: agent({
|
|
141
|
+
statusDetail: "checking canonical documentation",
|
|
142
|
+
prompt: (context) => {
|
|
143
|
+
const request = context.input;
|
|
144
|
+
return [
|
|
145
|
+
"Check whether the selected plan is already recorded completely and accurately in the canonical specification and implementation plan.",
|
|
146
|
+
"Use repository guidance to choose canonical files. Do not redesign or implement anything.",
|
|
147
|
+
"Choose current only when the documents already preserve the whole selected plan and its boundaries.",
|
|
148
|
+
"Choose update when documents are missing or stale and can be corrected in scope.",
|
|
149
|
+
"Choose blocked only when no safe canonical target exists or repository rules prohibit the documentation change.",
|
|
150
|
+
`Task: ${request.task}`,
|
|
151
|
+
`Selected plan: ${JSON.stringify(currentPlan(context))}`,
|
|
152
|
+
`Preferred documents: ${JSON.stringify(request.documents ?? [])}`,
|
|
153
|
+
].join("\n");
|
|
154
|
+
},
|
|
155
|
+
expectedOutput: '{ "route": "current" | "update" | "blocked", "files": ["canonical file"], "digests": { "file": "sha256:digest" }, "reason": "reason", "evidence": "evidence" }',
|
|
156
|
+
validate: parseDocumentationAssessment,
|
|
157
|
+
}),
|
|
158
|
+
updateDocumentation: agent({
|
|
159
|
+
timeoutMs: 30 * 60_000,
|
|
160
|
+
statusDetail: "updating canonical documentation",
|
|
161
|
+
prompt: (context) => {
|
|
162
|
+
const request = context.input;
|
|
163
|
+
const assessment = context.outputs.inspectDocumentation;
|
|
164
|
+
return [
|
|
165
|
+
"Update the canonical specification and implementation plan to preserve the selected plan exactly.",
|
|
166
|
+
"Use the repository documentation rules and keep the text plain and complete.",
|
|
167
|
+
"Do not redesign the solution and do not implement code.",
|
|
168
|
+
`Task: ${request.task}`,
|
|
169
|
+
`Selected plan: ${JSON.stringify(currentPlan(context))}`,
|
|
170
|
+
`Canonical files: ${JSON.stringify(assessment.files)}`,
|
|
171
|
+
`Assessment: ${JSON.stringify(assessment)}`,
|
|
172
|
+
].join("\n");
|
|
173
|
+
},
|
|
174
|
+
expectedOutput: '{ "updated": true, "files": ["changed file"], "digests": { "file": "sha256:digest" }, "summary": "what was recorded" }',
|
|
175
|
+
validate: (value) => {
|
|
176
|
+
const result = requireRecord(value, "documentation update");
|
|
177
|
+
if (result.updated !== true)
|
|
178
|
+
throw new Error("documentation update must report updated: true");
|
|
179
|
+
stringArray(result.files, "updated documentation files");
|
|
180
|
+
stringRecord(result.digests, "updated documentation digests");
|
|
181
|
+
requireString(result.summary, "documentation update summary");
|
|
182
|
+
return result;
|
|
183
|
+
},
|
|
184
|
+
}),
|
|
185
|
+
verifyDocumentation: agent({
|
|
186
|
+
timeoutMs: 20 * 60_000,
|
|
187
|
+
statusDetail: "verifying documentation",
|
|
188
|
+
prompt: ({ outputs }) => [
|
|
189
|
+
"Verify the changed canonical documentation.",
|
|
190
|
+
"Run the repository documentation, formatting, link, and privacy checks that apply.",
|
|
191
|
+
"Do not implement code.",
|
|
192
|
+
`Documentation update: ${JSON.stringify(outputs.updateDocumentation)}`,
|
|
193
|
+
].join("\n"),
|
|
194
|
+
expectedOutput: '{ "passed": true | false, "commands": [{ "command": "exact command", "outcome": "result" }], "failures": ["failure"] }',
|
|
195
|
+
validate: (value) => {
|
|
196
|
+
const result = requireRecord(value, "documentation verification");
|
|
197
|
+
if (typeof result.passed !== "boolean") {
|
|
198
|
+
throw new Error("documentation verification passed must be boolean");
|
|
199
|
+
}
|
|
200
|
+
return result;
|
|
201
|
+
},
|
|
202
|
+
}),
|
|
203
|
+
finalize: compute({
|
|
204
|
+
run: (context) => {
|
|
205
|
+
const request = context.input;
|
|
206
|
+
const assessment = context.outputs.inspectDocumentation;
|
|
207
|
+
const plan = currentPlan(context);
|
|
208
|
+
const updated = context.outputs.updateDocumentation;
|
|
209
|
+
if (updated === undefined) {
|
|
210
|
+
return {
|
|
211
|
+
status: "ready",
|
|
212
|
+
task: request.task,
|
|
213
|
+
plan,
|
|
214
|
+
planDigest: digest(plan),
|
|
215
|
+
documentation: {
|
|
216
|
+
state: "current",
|
|
217
|
+
files: assessment.files,
|
|
218
|
+
digests: assessment.digests,
|
|
219
|
+
evidence: assessment.evidence,
|
|
220
|
+
},
|
|
221
|
+
verification: { passed: true, reason: "Canonical documentation was already current." },
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
const updateRecord = requireRecord(updated, "documentation update");
|
|
225
|
+
return {
|
|
226
|
+
status: "ready",
|
|
227
|
+
task: request.task,
|
|
228
|
+
plan,
|
|
229
|
+
planDigest: digest(plan),
|
|
230
|
+
documentation: {
|
|
231
|
+
state: "updated",
|
|
232
|
+
files: stringArray(updateRecord.files, "updated documentation files"),
|
|
233
|
+
digests: stringRecord(updateRecord.digests, "updated documentation digests"),
|
|
234
|
+
evidence: context.outputs.verifyDocumentation,
|
|
235
|
+
},
|
|
236
|
+
verification: context.outputs.verifyDocumentation,
|
|
237
|
+
};
|
|
238
|
+
},
|
|
239
|
+
}),
|
|
240
|
+
blocked: compute({ run: blockedReason }),
|
|
241
|
+
},
|
|
242
|
+
edges: [
|
|
243
|
+
{
|
|
244
|
+
from: "prepare",
|
|
245
|
+
switch: { on: "$.route", cases: { locate: "locatePlan", inspect: "inspectDocumentation" } },
|
|
246
|
+
},
|
|
247
|
+
{
|
|
248
|
+
from: "locatePlan",
|
|
249
|
+
switch: { on: "$.route", cases: { found: "inspectDocumentation", blocked: "blocked" } },
|
|
250
|
+
},
|
|
251
|
+
{
|
|
252
|
+
from: "inspectDocumentation",
|
|
253
|
+
switch: {
|
|
254
|
+
on: "$.route",
|
|
255
|
+
cases: { current: "finalize", update: "updateDocumentation", blocked: "blocked" },
|
|
256
|
+
},
|
|
257
|
+
},
|
|
258
|
+
{ from: "updateDocumentation", to: "verifyDocumentation" },
|
|
259
|
+
{
|
|
260
|
+
from: "verifyDocumentation",
|
|
261
|
+
switch: { on: "$.passed", cases: { true: "finalize", false: "blocked" } },
|
|
262
|
+
},
|
|
263
|
+
],
|
|
264
|
+
});
|
|
265
|
+
export default autodocWorkflow;
|
|
266
|
+
//# sourceMappingURL=autodoc.workflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"autodoc.workflow.js","sourceRoot":"","sources":["../../src/builtins/autodoc.workflow.ts"],"names":[],"mappings":"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"}
|