@osolmaz/pi-workflows 0.12.1 → 0.13.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/README.md +59 -33
- package/dist/builtins/autodoc.workflow.d.ts +194 -7
- package/dist/builtins/autodoc.workflow.js +156 -30
- package/dist/builtins/autodoc.workflow.js.map +1 -1
- package/dist/builtins/autoimplement-command-batches.d.ts +1 -0
- package/dist/builtins/autoimplement-command-batches.js +29 -31
- package/dist/builtins/autoimplement-command-batches.js.map +1 -1
- package/dist/builtins/autoimplement.workflow.d.ts +1619 -97
- package/dist/builtins/autoimplement.workflow.js +416 -153
- package/dist/builtins/autoimplement.workflow.js.map +1 -1
- package/dist/builtins/autoplan.workflow.d.ts +126 -13
- package/dist/builtins/autoplan.workflow.js +200 -29
- package/dist/builtins/autoplan.workflow.js.map +1 -1
- package/dist/builtins/catalog.js +7 -5
- package/dist/builtins/catalog.js.map +1 -1
- package/dist/builtins/change-verification.workflow.d.ts +110 -0
- package/dist/builtins/change-verification.workflow.js +860 -0
- package/dist/builtins/change-verification.workflow.js.map +1 -0
- package/dist/builtins/index.d.ts +2 -1
- package/dist/builtins/index.js +1 -0
- package/dist/builtins/index.js.map +1 -1
- package/dist/builtins/monitor.workflow.d.ts +56 -21
- package/dist/builtins/monitor.workflow.js +499 -217
- package/dist/builtins/monitor.workflow.js.map +1 -1
- package/dist/builtins/plain-summary.workflow.d.ts +32 -0
- package/dist/builtins/plain-summary.workflow.js +134 -0
- package/dist/builtins/plain-summary.workflow.js.map +1 -0
- package/dist/builtins/plan-change.workflow.d.ts +527 -26
- package/dist/builtins/plan-change.workflow.js +26 -0
- package/dist/builtins/plan-change.workflow.js.map +1 -1
- package/dist/builtins/sanity-check.workflow.d.ts +45 -3
- package/dist/builtins/sanity-check.workflow.js +45 -7
- package/dist/builtins/sanity-check.workflow.js.map +1 -1
- package/dist/builtins/workspace-preparation.workflow.d.ts +75 -0
- package/dist/builtins/workspace-preparation.workflow.js +498 -0
- package/dist/builtins/workspace-preparation.workflow.js.map +1 -0
- package/dist/controllers/effects.d.ts +3 -2
- package/dist/controllers/effects.js +8 -1
- package/dist/controllers/effects.js.map +1 -1
- package/dist/controllers/index.d.ts +1 -1
- package/dist/controllers/index.js +1 -1
- package/dist/controllers/index.js.map +1 -1
- package/dist/controllers/manager.d.ts +1 -0
- package/dist/controllers/manager.js +41 -17
- package/dist/controllers/manager.js.map +1 -1
- package/dist/controllers/sqlite.d.ts +107 -85
- package/dist/controllers/sqlite.js +1611 -1486
- package/dist/controllers/sqlite.js.map +1 -1
- package/dist/controllers/store.d.ts +9 -8
- package/dist/controllers/store.js +1 -31
- package/dist/controllers/store.js.map +1 -1
- package/dist/controllers/types.d.ts +3 -0
- package/dist/controllers/workflow-engine-scheduler.d.ts +1 -1
- package/dist/controllers/workflow-engine-scheduler.js +3 -5
- package/dist/controllers/workflow-engine-scheduler.js.map +1 -1
- package/dist/controllers/workflows.d.ts +2 -2
- package/dist/controllers/workflows.js +11 -10
- package/dist/controllers/workflows.js.map +1 -1
- package/dist/extension/controller-host.js +2 -2
- package/dist/extension/controller-host.js.map +1 -1
- package/dist/extension/decision-channels.d.ts +2 -0
- package/dist/extension/decision-channels.js +311 -118
- package/dist/extension/decision-channels.js.map +1 -1
- package/dist/extension/executor.d.ts +9 -2
- package/dist/extension/executor.js +90 -6
- package/dist/extension/executor.js.map +1 -1
- package/dist/extension/herdr-viewer.d.ts +0 -1
- package/dist/extension/herdr-viewer.js +0 -4
- package/dist/extension/herdr-viewer.js.map +1 -1
- package/dist/extension/index.js +156 -117
- package/dist/extension/index.js.map +1 -1
- package/dist/extension/recorder.d.ts +3 -10
- package/dist/extension/recorder.js +13 -22
- package/dist/extension/recorder.js.map +1 -1
- package/dist/extension/step-message.d.ts +7 -2
- package/dist/extension/step-message.js +94 -2
- package/dist/extension/step-message.js.map +1 -1
- package/dist/extension/widget.js +6 -0
- package/dist/extension/widget.js.map +1 -1
- package/dist/host/rpc-executor.d.ts +3 -0
- package/dist/host/rpc-executor.js +2 -0
- package/dist/host/rpc-executor.js.map +1 -1
- package/dist/host/runner.d.ts +3 -6
- package/dist/host/runner.js +83 -32
- package/dist/host/runner.js.map +1 -1
- package/dist/render/graph-render.js +14 -8
- package/dist/render/graph-render.js.map +1 -1
- package/dist/state/database.d.ts +35 -0
- package/dist/state/database.js +287 -0
- package/dist/state/database.js.map +1 -0
- package/dist/state/index.d.ts +4 -0
- package/dist/state/index.js +5 -0
- package/dist/state/index.js.map +1 -0
- package/dist/state/json.d.ts +6 -0
- package/dist/state/json.js +38 -0
- package/dist/state/json.js.map +1 -0
- package/dist/state/mutation.d.ts +57 -0
- package/dist/state/mutation.js +255 -0
- package/dist/state/mutation.js.map +1 -0
- package/dist/state/schema.d.ts +6 -0
- package/dist/state/schema.js +473 -0
- package/dist/state/schema.js.map +1 -0
- package/dist/viewer/cli.d.ts +2 -2
- package/dist/viewer/cli.js +142 -122
- package/dist/viewer/cli.js.map +1 -1
- package/dist/viewer/render.d.ts +4 -4
- package/dist/viewer/render.js +2 -17
- package/dist/viewer/render.js.map +1 -1
- package/dist/viewer/session-reducer.d.ts +1 -1
- package/dist/viewer/session-reducer.js +1 -1
- package/dist/viewer/tui.d.ts +3 -3
- package/dist/viewer/tui.js +15 -13
- package/dist/viewer/tui.js.map +1 -1
- package/dist/viewer/watch.d.ts +2 -5
- package/dist/viewer/watch.js +13 -13
- package/dist/viewer/watch.js.map +1 -1
- package/dist/workflows/composition.js +12 -2
- package/dist/workflows/composition.js.map +1 -1
- package/dist/workflows/definition.d.ts +6 -2
- package/dist/workflows/definition.js +17 -0
- package/dist/workflows/definition.js.map +1 -1
- package/dist/workflows/engine.d.ts +6 -6
- package/dist/workflows/engine.js +183 -103
- package/dist/workflows/engine.js.map +1 -1
- package/dist/workflows/errors.d.ts +3 -3
- package/dist/workflows/errors.js +3 -3
- package/dist/workflows/human-decision.d.ts +29 -4
- package/dist/workflows/human-decision.js +547 -283
- package/dist/workflows/human-decision.js.map +1 -1
- package/dist/workflows/index.d.ts +4 -5
- package/dist/workflows/index.js +3 -4
- package/dist/workflows/index.js.map +1 -1
- package/dist/workflows/schema.js +17 -1
- package/dist/workflows/schema.js.map +1 -1
- package/dist/workflows/store.d.ts +83 -103
- package/dist/workflows/store.js +902 -951
- package/dist/workflows/store.js.map +1 -1
- package/dist/workflows/types.d.ts +55 -81
- package/docs/CONTROLLERS.md +10 -8
- package/docs/DEFERRED_TURNS.md +2 -2
- package/docs/DESIGN_PHILOSOPHY.md +4 -2
- package/docs/HUMAN_DECISIONS.md +13 -14
- package/docs/MONITOR.md +179 -231
- package/docs/SQLITE_STATE.md +219 -0
- package/docs/WORKFLOW_COMPOSITION.md +27 -19
- package/docs/WORKFLOW_STEP_MESSAGES.md +20 -18
- package/docs/WORKFLOW_UPDATES.md +10 -9
- package/docs/development.md +9 -9
- package/docs/live-replay-protocol.md +28 -37
- package/docs/plans/2026-08-16-workflow-updates-plan.md +1 -1
- package/docs/plans/2026-08-19-human-decision-gates-plan.md +1 -1
- package/docs/plans/2026-08-21-autoimplement-timeout-fallback-plan.md +1 -1
- package/docs/plans/2026-08-21-plan-change-approval-policy-plan.md +1 -1
- package/docs/plans/2026-08-21-sanity-check-plan.md +30 -16
- package/docs/plans/2026-08-22-goal-finishing-monitor-plan.md +200 -0
- package/docs/plans/2026-08-23-assistant-agent-completion-plan.md +701 -0
- package/docs/plans/2026-08-23-sqlite-state-plan.md +970 -0
- package/docs/plans/2026-08-24-change-scoped-verification-plan.md +419 -0
- package/docs/plans/replayable-run-bundles-implementation-plan.md +2 -2
- package/docs/plans/session-event-replay-implementation-plan.md +1 -1
- package/docs/plans/tui-viewer-implementation-plan.md +1 -1
- package/docs/session-event-journal.md +63 -434
- package/docs/tui-viewer.md +13 -15
- package/docs/workflows.md +111 -62
- package/examples/workflows/plain-summary.workflow.ts +1 -0
- package/herdr-plugin.toml +1 -1
- package/package.json +1 -1
- package/plugins/herdr/viewer.mjs +1 -11
- package/skills/autodoc/SKILL.md +7 -0
- package/skills/autoimplement/SKILL.md +4 -0
- package/skills/autoplan/SKILL.md +5 -4
- package/skills/monitor/SKILL.md +91 -163
- package/skills/pi-workflows/SKILL.md +7 -7
- package/skills/sanity-check/SKILL.md +1 -1
- package/src/builtins/autodoc.workflow.ts +184 -33
- package/src/builtins/autoimplement-command-batches.ts +39 -33
- package/src/builtins/autoimplement.workflow.ts +483 -175
- package/src/builtins/autoplan.workflow.ts +290 -40
- package/src/builtins/catalog.ts +7 -5
- package/src/builtins/change-verification.workflow.ts +1143 -0
- package/src/builtins/index.ts +7 -1
- package/src/builtins/monitor.workflow.ts +667 -250
- package/src/builtins/plain-summary.workflow.ts +185 -0
- package/src/builtins/plan-change.workflow.ts +35 -0
- package/src/builtins/sanity-check.workflow.ts +62 -7
- package/src/builtins/workspace-preparation.workflow.ts +668 -0
- package/src/controllers/effects.ts +7 -0
- package/src/controllers/index.ts +0 -6
- package/src/controllers/manager.ts +72 -32
- package/src/controllers/sqlite.ts +2420 -1948
- package/src/controllers/store.ts +17 -38
- package/src/controllers/types.ts +3 -0
- package/src/controllers/workflow-engine-scheduler.ts +4 -8
- package/src/controllers/workflows.ts +45 -21
- package/src/extension/controller-host.ts +1 -2
- package/src/extension/decision-channels.ts +427 -144
- package/src/extension/executor.ts +106 -6
- package/src/extension/herdr-viewer.ts +0 -5
- package/src/extension/index.ts +180 -132
- package/src/extension/recorder.ts +13 -22
- package/src/extension/step-message.ts +106 -4
- package/src/extension/widget.ts +8 -0
- package/src/host/rpc-executor.ts +4 -0
- package/src/host/runner.ts +93 -41
- package/src/render/graph-render.ts +11 -4
- package/src/state/database.ts +375 -0
- package/src/state/index.ts +29 -0
- package/src/state/json.ts +42 -0
- package/src/state/mutation.ts +435 -0
- package/src/state/schema.ts +475 -0
- package/src/viewer/cli.ts +151 -144
- package/src/viewer/render.ts +12 -24
- package/src/viewer/session-reducer.ts +1 -1
- package/src/viewer/tui.ts +18 -17
- package/src/viewer/watch.ts +13 -17
- package/src/workflows/composition.ts +12 -3
- package/src/workflows/definition.ts +36 -3
- package/src/workflows/engine.ts +212 -116
- package/src/workflows/errors.ts +3 -3
- package/src/workflows/human-decision.ts +795 -340
- package/src/workflows/index.ts +15 -19
- package/src/workflows/schema.ts +19 -1
- package/src/workflows/store.ts +1295 -1163
- package/src/workflows/types.ts +61 -81
- package/dist/workflows/artifacts.d.ts +0 -40
- package/dist/workflows/artifacts.js +0 -155
- package/dist/workflows/artifacts.js.map +0 -1
- package/dist/workflows/migrate-sources.d.ts +0 -42
- package/dist/workflows/migrate-sources.js +0 -133
- package/dist/workflows/migrate-sources.js.map +0 -1
- package/docs/run-bundles.md +0 -481
- package/src/workflows/artifacts.ts +0 -188
- package/src/workflows/migrate-sources.ts +0 -178
|
@@ -1,178 +0,0 @@
|
|
|
1
|
-
import { randomUUID } from "node:crypto";
|
|
2
|
-
import fs from "node:fs/promises";
|
|
3
|
-
import path from "node:path";
|
|
4
|
-
import type { BuiltinWorkflowCatalog } from "./catalog.js";
|
|
5
|
-
import { WorkflowRunStore, listRunBundles } from "./store.js";
|
|
6
|
-
import type { WorkflowRunState, WorkflowSource } from "./types.js";
|
|
7
|
-
|
|
8
|
-
export type LegacySourceMigrationQueue = {
|
|
9
|
-
repairCanonicalWorkflowSourceRun(options: {
|
|
10
|
-
runId: string;
|
|
11
|
-
workflowName: string;
|
|
12
|
-
workflowSourceRef: string;
|
|
13
|
-
runnerId: string;
|
|
14
|
-
claimToken: string;
|
|
15
|
-
leaseMs: number;
|
|
16
|
-
}): "unchanged" | "claimed" | false;
|
|
17
|
-
claimLegacyWorkflowSourceRun(options: {
|
|
18
|
-
runId: string;
|
|
19
|
-
workflowName: string;
|
|
20
|
-
oldWorkflowPath: string;
|
|
21
|
-
workflowSourceRef: string;
|
|
22
|
-
runnerId: string;
|
|
23
|
-
claimToken: string;
|
|
24
|
-
leaseMs: number;
|
|
25
|
-
}): boolean;
|
|
26
|
-
parkWorkflowRun(options: { runId: string; claimToken: string }): boolean;
|
|
27
|
-
getWorkflowRun(runId: string):
|
|
28
|
-
| {
|
|
29
|
-
status: "queued" | "starting" | "running" | "parked" | "done" | "failed" | "cancelled";
|
|
30
|
-
}
|
|
31
|
-
| undefined;
|
|
32
|
-
setWorkflowRunOriginSession?(runId: string, originSessionId: string): boolean;
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
const MIGRATION_LEASE_MS = 30_000;
|
|
36
|
-
|
|
37
|
-
export type LegacySourceMigrationResult = {
|
|
38
|
-
migratedRunIds: string[];
|
|
39
|
-
blocked: { runId: string; reason: string }[];
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
/** One bounded migration for nonterminal runs created before canonical sources. */
|
|
43
|
-
export async function migrateLegacyWorkflowSources(options: {
|
|
44
|
-
catalog: BuiltinWorkflowCatalog;
|
|
45
|
-
store?: WorkflowRunStore;
|
|
46
|
-
queue?: LegacySourceMigrationQueue;
|
|
47
|
-
}): Promise<LegacySourceMigrationResult> {
|
|
48
|
-
const store = options.store ?? new WorkflowRunStore();
|
|
49
|
-
const result: LegacySourceMigrationResult = { migratedRunIds: [], blocked: [] };
|
|
50
|
-
for (const bundle of await listRunBundles(store.outputRoot)) {
|
|
51
|
-
const state = bundle.state;
|
|
52
|
-
if (state.status !== "running" && state.status !== "waiting") continue;
|
|
53
|
-
if (
|
|
54
|
-
options.queue?.setWorkflowRunOriginSession !== undefined &&
|
|
55
|
-
bundle.sessionBinding !== null
|
|
56
|
-
) {
|
|
57
|
-
options.queue.setWorkflowRunOriginSession(state.runId, bundle.sessionBinding.piSessionId);
|
|
58
|
-
}
|
|
59
|
-
if (state.workflowSource !== undefined) {
|
|
60
|
-
if (options.queue === undefined) continue;
|
|
61
|
-
const claimToken = randomUUID();
|
|
62
|
-
const repaired = options.queue.repairCanonicalWorkflowSourceRun({
|
|
63
|
-
runId: state.runId,
|
|
64
|
-
workflowName: state.workflowName,
|
|
65
|
-
workflowSourceRef: sourceRef(state.workflowSource),
|
|
66
|
-
runnerId: `source-migration-${process.pid}`,
|
|
67
|
-
claimToken,
|
|
68
|
-
leaseMs: MIGRATION_LEASE_MS,
|
|
69
|
-
});
|
|
70
|
-
if (repaired === false) {
|
|
71
|
-
// Another runner can own a canonical run during startup. Its source is
|
|
72
|
-
// already safe; the normal queue lease will make it claimable later.
|
|
73
|
-
} else if (
|
|
74
|
-
repaired === "claimed" &&
|
|
75
|
-
!options.queue.parkWorkflowRun({ runId: state.runId, claimToken })
|
|
76
|
-
) {
|
|
77
|
-
result.blocked.push({
|
|
78
|
-
runId: state.runId,
|
|
79
|
-
reason: "canonical queue repair could not release its claim",
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
continue;
|
|
83
|
-
}
|
|
84
|
-
if (state.workflowPath === undefined || state.workflowHash === undefined) {
|
|
85
|
-
result.blocked.push({ runId: state.runId, reason: "legacy workflow identity is incomplete" });
|
|
86
|
-
continue;
|
|
87
|
-
}
|
|
88
|
-
const legacyPath = {
|
|
89
|
-
workflowName: state.workflowName,
|
|
90
|
-
workflowPath: state.workflowPath,
|
|
91
|
-
};
|
|
92
|
-
const pathEntry = options.catalog.legacyPathEntry(legacyPath);
|
|
93
|
-
let workflowSource: WorkflowSource;
|
|
94
|
-
let workflowSourceRef: string;
|
|
95
|
-
if (pathEntry === undefined) {
|
|
96
|
-
workflowSource = {
|
|
97
|
-
kind: "file",
|
|
98
|
-
path: path.resolve(state.workflowPath),
|
|
99
|
-
hash: state.workflowHash,
|
|
100
|
-
};
|
|
101
|
-
workflowSourceRef = workflowSource.path;
|
|
102
|
-
} else {
|
|
103
|
-
const legacy = options.catalog.matchLegacy({
|
|
104
|
-
...legacyPath,
|
|
105
|
-
workflowHash: state.workflowHash,
|
|
106
|
-
});
|
|
107
|
-
if (legacy === undefined) {
|
|
108
|
-
const reason = `legacy built-in ${pathEntry.id} has an unknown source revision`;
|
|
109
|
-
result.blocked.push({ runId: state.runId, reason });
|
|
110
|
-
continue;
|
|
111
|
-
}
|
|
112
|
-
workflowSource = {
|
|
113
|
-
kind: "builtin",
|
|
114
|
-
id: legacy.entry.id,
|
|
115
|
-
revision: legacy.revision,
|
|
116
|
-
};
|
|
117
|
-
workflowSourceRef = legacy.entry.ref;
|
|
118
|
-
}
|
|
119
|
-
const claimToken = randomUUID();
|
|
120
|
-
const queueIsDone = options.queue?.getWorkflowRun(state.runId)?.status === "done";
|
|
121
|
-
if (
|
|
122
|
-
options.queue !== undefined &&
|
|
123
|
-
!queueIsDone &&
|
|
124
|
-
!options.queue.claimLegacyWorkflowSourceRun({
|
|
125
|
-
runId: state.runId,
|
|
126
|
-
workflowName: state.workflowName,
|
|
127
|
-
oldWorkflowPath: state.workflowPath,
|
|
128
|
-
workflowSourceRef,
|
|
129
|
-
runnerId: `source-migration-${process.pid}`,
|
|
130
|
-
claimToken,
|
|
131
|
-
leaseMs: MIGRATION_LEASE_MS,
|
|
132
|
-
})
|
|
133
|
-
) {
|
|
134
|
-
result.blocked.push({
|
|
135
|
-
runId: state.runId,
|
|
136
|
-
reason: "matching queue row is active or unavailable",
|
|
137
|
-
});
|
|
138
|
-
continue;
|
|
139
|
-
}
|
|
140
|
-
const migrated: WorkflowRunState = {
|
|
141
|
-
...state,
|
|
142
|
-
workflowSource,
|
|
143
|
-
};
|
|
144
|
-
delete migrated.workflowPath;
|
|
145
|
-
delete migrated.workflowHash;
|
|
146
|
-
const migratedManifest = {
|
|
147
|
-
...bundle.manifest,
|
|
148
|
-
workflowSource: migrated.workflowSource,
|
|
149
|
-
};
|
|
150
|
-
delete (migratedManifest as typeof migratedManifest & { workflowPath?: string }).workflowPath;
|
|
151
|
-
// State is the migration commit point. Queue and manifest updates are
|
|
152
|
-
// idempotent, so a crash before this write can safely retry.
|
|
153
|
-
await writeJsonAtomic(path.join(bundle.runDir, "manifest.json"), migratedManifest);
|
|
154
|
-
await writeJsonAtomic(path.join(bundle.runDir, "state.json"), migrated);
|
|
155
|
-
if (
|
|
156
|
-
options.queue !== undefined &&
|
|
157
|
-
!queueIsDone &&
|
|
158
|
-
!options.queue.parkWorkflowRun({ runId: state.runId, claimToken })
|
|
159
|
-
) {
|
|
160
|
-
result.blocked.push({
|
|
161
|
-
runId: state.runId,
|
|
162
|
-
reason: "migration completed but its queue claim could not be released",
|
|
163
|
-
});
|
|
164
|
-
}
|
|
165
|
-
result.migratedRunIds.push(state.runId);
|
|
166
|
-
}
|
|
167
|
-
return result;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
function sourceRef(source: WorkflowSource): string {
|
|
171
|
-
return source.kind === "builtin" ? `builtin:${source.id}` : source.path;
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
async function writeJsonAtomic(filePath: string, value: unknown): Promise<void> {
|
|
175
|
-
const tempPath = `${filePath}.${process.pid}.${randomUUID()}.source-migration.tmp`;
|
|
176
|
-
await fs.writeFile(tempPath, `${JSON.stringify(value, null, 2)}\n`, { mode: 0o600 });
|
|
177
|
-
await fs.rename(tempPath, filePath);
|
|
178
|
-
}
|