@osolmaz/pi-workflows 0.2.0 → 0.4.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 +72 -5
- package/dist/builtins/catalog.d.ts +2 -0
- package/dist/builtins/catalog.js +22 -0
- package/dist/builtins/catalog.js.map +1 -0
- package/dist/builtins/monitor.workflow.d.ts +71 -0
- package/dist/builtins/monitor.workflow.js +250 -0
- package/dist/builtins/monitor.workflow.js.map +1 -0
- package/dist/controllers/conditions.d.ts +6 -0
- package/dist/controllers/conditions.js +68 -0
- package/dist/controllers/conditions.js.map +1 -0
- package/dist/controllers/definition.d.ts +6 -0
- package/dist/controllers/definition.js +45 -0
- package/dist/controllers/definition.js.map +1 -0
- package/dist/controllers/effects.d.ts +14 -0
- package/dist/controllers/effects.js +104 -0
- package/dist/controllers/effects.js.map +1 -0
- package/dist/controllers/errors.d.ts +12 -0
- package/dist/controllers/errors.js +25 -0
- package/dist/controllers/errors.js.map +1 -0
- package/dist/controllers/index.d.ts +13 -0
- package/dist/controllers/index.js +13 -0
- package/dist/controllers/index.js.map +1 -0
- package/dist/controllers/json.d.ts +5 -0
- package/dist/controllers/json.js +57 -0
- package/dist/controllers/json.js.map +1 -0
- package/dist/controllers/loader.d.ts +23 -0
- package/dist/controllers/loader.js +74 -0
- package/dist/controllers/loader.js.map +1 -0
- package/dist/controllers/manager.d.ts +58 -0
- package/dist/controllers/manager.js +399 -0
- package/dist/controllers/manager.js.map +1 -0
- package/dist/controllers/results.d.ts +5 -0
- package/dist/controllers/results.js +32 -0
- package/dist/controllers/results.js.map +1 -0
- package/dist/controllers/sqlite.d.ts +235 -0
- package/dist/controllers/sqlite.js +1087 -0
- package/dist/controllers/sqlite.js.map +1 -0
- package/dist/controllers/store.d.ts +112 -0
- package/dist/controllers/store.js +32 -0
- package/dist/controllers/store.js.map +1 -0
- package/dist/controllers/types.d.ts +159 -0
- package/dist/controllers/types.js +2 -0
- package/dist/controllers/types.js.map +1 -0
- package/dist/controllers/workflow-engine-scheduler.d.ts +25 -0
- package/dist/controllers/workflow-engine-scheduler.js +95 -0
- package/dist/controllers/workflow-engine-scheduler.js.map +1 -0
- package/dist/controllers/workflows.d.ts +27 -0
- package/dist/controllers/workflows.js +109 -0
- package/dist/controllers/workflows.js.map +1 -0
- package/dist/extension/controller-host.d.ts +47 -0
- package/dist/extension/controller-host.js +110 -0
- package/dist/extension/controller-host.js.map +1 -0
- package/dist/extension/executor.d.ts +3 -0
- package/dist/extension/executor.js +12 -2
- package/dist/extension/executor.js.map +1 -1
- package/dist/extension/index.d.ts +7 -0
- package/dist/extension/index.js +1118 -106
- package/dist/extension/index.js.map +1 -1
- package/dist/extension/recorder.d.ts +6 -0
- package/dist/extension/recorder.js +20 -8
- package/dist/extension/recorder.js.map +1 -1
- package/dist/extension/workflow-tool.d.ts +28 -0
- package/dist/extension/workflow-tool.js +33 -0
- package/dist/extension/workflow-tool.js.map +1 -0
- package/dist/host/processes.d.ts +24 -0
- package/dist/host/processes.js +114 -0
- package/dist/host/processes.js.map +1 -0
- package/dist/host/rpc-bridge.d.ts +9 -0
- package/dist/host/rpc-bridge.js +39 -0
- package/dist/host/rpc-bridge.js.map +1 -0
- package/dist/host/rpc-executor.d.ts +38 -0
- package/dist/host/rpc-executor.js +254 -0
- package/dist/host/rpc-executor.js.map +1 -0
- package/dist/host/runner.d.ts +50 -0
- package/dist/host/runner.js +379 -0
- package/dist/host/runner.js.map +1 -0
- package/dist/viewer/cli.d.ts +7 -3
- package/dist/viewer/cli.js +150 -19
- package/dist/viewer/cli.js.map +1 -1
- package/dist/workflows/catalog.d.ts +43 -0
- package/dist/workflows/catalog.js +79 -0
- package/dist/workflows/catalog.js.map +1 -0
- package/dist/workflows/engine.d.ts +37 -2
- package/dist/workflows/engine.js +297 -29
- package/dist/workflows/engine.js.map +1 -1
- package/dist/workflows/errors.d.ts +23 -0
- package/dist/workflows/errors.js +38 -0
- package/dist/workflows/errors.js.map +1 -1
- package/dist/workflows/graph.js +0 -5
- package/dist/workflows/graph.js.map +1 -1
- package/dist/workflows/index.d.ts +2 -2
- package/dist/workflows/index.js +1 -1
- package/dist/workflows/index.js.map +1 -1
- package/dist/workflows/loader.d.ts +19 -15
- package/dist/workflows/loader.js +63 -19
- package/dist/workflows/loader.js.map +1 -1
- package/dist/workflows/migrate-sources.d.ts +41 -0
- package/dist/workflows/migrate-sources.js +129 -0
- package/dist/workflows/migrate-sources.js.map +1 -0
- package/dist/workflows/schema.js +3 -2
- package/dist/workflows/schema.js.map +1 -1
- package/dist/workflows/store.d.ts +50 -6
- package/dist/workflows/store.js +448 -53
- package/dist/workflows/store.js.map +1 -1
- package/dist/workflows/types.d.ts +27 -3
- package/docs/CONTROLLERS.md +215 -0
- package/docs/development.md +14 -9
- package/docs/plans/2026-08-04-controller-runtime-plan.md +169 -0
- package/docs/plans/2026-08-05-always-on-workflows-plan.md +125 -0
- package/docs/plans/2026-08-10-agent-managed-monitor-workflows-plan.md +184 -0
- package/docs/plans/2026-08-12-coordinated-workflow-timeouts-plan.md +74 -0
- package/docs/plans/2026-08-13-built-in-workflow-catalog-plan.md +97 -0
- package/docs/run-bundles.md +85 -28
- package/docs/workflows.md +161 -17
- package/examples/controllers/pull-request.controller.ts +215 -0
- package/package.json +10 -2
- package/src/builtins/catalog.ts +22 -0
- package/src/builtins/monitor.workflow.ts +302 -0
- package/src/controllers/conditions.ts +110 -0
- package/src/controllers/definition.ts +65 -0
- package/src/controllers/effects.ts +123 -0
- package/src/controllers/errors.ts +27 -0
- package/src/controllers/index.ts +90 -0
- package/src/controllers/json.ts +62 -0
- package/src/controllers/loader.ts +104 -0
- package/src/controllers/manager.ts +533 -0
- package/src/controllers/results.ts +46 -0
- package/src/controllers/sqlite.ts +1545 -0
- package/src/controllers/store.ts +160 -0
- package/src/controllers/types.ts +183 -0
- package/src/controllers/workflow-engine-scheduler.ts +148 -0
- package/src/controllers/workflows.ts +152 -0
- package/src/extension/controller-host.ts +163 -0
- package/src/extension/executor.ts +13 -2
- package/src/extension/index.ts +1325 -130
- package/src/extension/recorder.ts +65 -36
- package/src/extension/workflow-tool.ts +59 -0
- package/src/host/processes.ts +119 -0
- package/src/host/rpc-bridge.ts +44 -0
- package/src/host/rpc-executor.ts +299 -0
- package/src/host/runner.ts +445 -0
- package/src/viewer/cli.ts +167 -21
- package/src/workflows/catalog.ts +135 -0
- package/src/workflows/engine.ts +404 -41
- package/src/workflows/errors.ts +45 -0
- package/src/workflows/graph.ts +0 -5
- package/src/workflows/index.ts +2 -0
- package/src/workflows/loader.ts +76 -22
- package/src/workflows/migrate-sources.ts +167 -0
- package/src/workflows/schema.ts +3 -2
- package/src/workflows/store.ts +557 -48
- package/src/workflows/types.ts +22 -3
|
@@ -18,12 +18,24 @@ export declare function createRunId(workflowName: string, now?: Date): string;
|
|
|
18
18
|
* into content-addressed `artifacts/`. Bundles are private: directories are
|
|
19
19
|
* 0700 and files 0600.
|
|
20
20
|
*/
|
|
21
|
+
/**
|
|
22
|
+
* A fence proves the writer still owns the run. It is checked before every
|
|
23
|
+
* locked write; it throws (ClaimLostError) when the queue claim was lost, so
|
|
24
|
+
* a stalled runner can never interleave writes with the new claim holder.
|
|
25
|
+
*/
|
|
26
|
+
export type RunFence = () => void;
|
|
27
|
+
export type WorkflowRunStoreOptions = {
|
|
28
|
+
fenceProvider?: (runDir: string) => RunFence | undefined;
|
|
29
|
+
};
|
|
21
30
|
export declare class WorkflowRunStore {
|
|
22
31
|
readonly outputRoot: string;
|
|
32
|
+
private readonly fenceProvider;
|
|
23
33
|
private readonly contexts;
|
|
24
|
-
constructor(outputRoot?: string);
|
|
34
|
+
constructor(outputRoot?: string, options?: WorkflowRunStoreOptions);
|
|
25
35
|
runDirFor(runId: string): string;
|
|
36
|
+
quarantineIncompleteRun(runId: string): Promise<string | undefined>;
|
|
26
37
|
private contextFor;
|
|
38
|
+
private streamFor;
|
|
27
39
|
/**
|
|
28
40
|
* Run `task` exclusively for this bundle. Sequence numbers are assigned
|
|
29
41
|
* inside the lock, so physical file order always matches logical order.
|
|
@@ -31,6 +43,20 @@ export declare class WorkflowRunStore {
|
|
|
31
43
|
private withRunLock;
|
|
32
44
|
private withSessionEventLock;
|
|
33
45
|
initializeRunBundle(workflow: WorkflowDefinition, state: WorkflowRunState): Promise<string>;
|
|
46
|
+
/**
|
|
47
|
+
* Prepare an interrupted bundle for resume. Repairs a torn trace tail,
|
|
48
|
+
* drops trace events the state projection never recorded, and seeds the
|
|
49
|
+
* in-process context so new events continue the sequence. The caller must
|
|
50
|
+
* hold the run's queue claim; the fence is verified before any write.
|
|
51
|
+
*/
|
|
52
|
+
prepareRunResume(runId: string): Promise<LoadedRunBundle>;
|
|
53
|
+
/**
|
|
54
|
+
* Finalize captures left "recording" by a session that is gone, so they
|
|
55
|
+
* report failed with the reason instead of dangling forever.
|
|
56
|
+
*/
|
|
57
|
+
private finalizeRecordingCaptures;
|
|
58
|
+
/** Mark a nonterminal bundle failed and append an interruption event. */
|
|
59
|
+
markRunInterrupted(runId: string, reason?: string): Promise<LoadedRunBundle | null>;
|
|
34
60
|
/**
|
|
35
61
|
* Persist one transition: append the trace event, then rewrite the
|
|
36
62
|
* projections reflecting it.
|
|
@@ -41,26 +67,40 @@ export declare class WorkflowRunStore {
|
|
|
41
67
|
* append a `session_bound` trace event. Projections catch up on the next
|
|
42
68
|
* snapshot.
|
|
43
69
|
*/
|
|
44
|
-
|
|
70
|
+
/** True when a session binding already exists for this bundle. */
|
|
71
|
+
hasSessionBinding(runDir: string): Promise<boolean>;
|
|
72
|
+
/** List capture segment attempt ids under `session/segments/`. */
|
|
73
|
+
listSessionSegments(runDir: string): Promise<string[]>;
|
|
74
|
+
writeSessionBinding(runDir: string, binding: WorkflowSessionBinding, attemptId?: string): Promise<void>;
|
|
45
75
|
/** Append one verbatim Pi session entry to `session/entries.ndjson`. */
|
|
46
|
-
appendSessionEntry(runDir: string, entry: Record<string, unknown
|
|
76
|
+
appendSessionEntry(runDir: string, entry: Record<string, unknown>, attemptId?: string): Promise<number>;
|
|
47
77
|
/** Append a fully stamped ordered batch to `session/events.ndjson`. */
|
|
48
|
-
appendSessionEventBatch(runDir: string, records: WorkflowSessionEventRecord[]): Promise<void>;
|
|
78
|
+
appendSessionEventBatch(runDir: string, records: WorkflowSessionEventRecord[], attemptId?: string): Promise<void>;
|
|
49
79
|
/** Atomically replace the temporal capture integrity projection. */
|
|
50
|
-
writeSessionCapture(runDir: string, capture: WorkflowSessionCapture): Promise<void>;
|
|
80
|
+
writeSessionCapture(runDir: string, capture: WorkflowSessionCapture, attemptId?: string): Promise<void>;
|
|
51
81
|
/** Count complete durable session records after both writers have drained. */
|
|
52
|
-
sessionCounts(runDir: string): Promise<{
|
|
82
|
+
sessionCounts(runDir: string, attemptId?: string): Promise<{
|
|
53
83
|
eventCount: number;
|
|
54
84
|
entryCount: number;
|
|
55
85
|
lastEventSeq: number;
|
|
56
86
|
}>;
|
|
57
87
|
private appendTraceEvent;
|
|
58
88
|
private writeProjections;
|
|
89
|
+
private writeLoadedProjections;
|
|
59
90
|
}
|
|
60
91
|
export type SessionCaptureIntegrity = {
|
|
61
92
|
status: "unavailable" | "recording" | "complete" | "failed" | "invalid";
|
|
62
93
|
diagnostics: string[];
|
|
63
94
|
};
|
|
95
|
+
/** One capture attempt: the session data a single recorder wrote. */
|
|
96
|
+
export type SessionCaptureSegment = {
|
|
97
|
+
attemptId: string;
|
|
98
|
+
binding: WorkflowSessionBinding | null;
|
|
99
|
+
entries: WorkflowSessionEntryRecord[];
|
|
100
|
+
events: WorkflowSessionEventRecord[];
|
|
101
|
+
capture: WorkflowSessionCapture | null;
|
|
102
|
+
integrity: SessionCaptureIntegrity;
|
|
103
|
+
};
|
|
64
104
|
export type LoadedRunBundle = {
|
|
65
105
|
runDir: string;
|
|
66
106
|
manifest: WorkflowRunManifest;
|
|
@@ -71,7 +111,11 @@ export type LoadedRunBundle = {
|
|
|
71
111
|
sessionEvents: WorkflowSessionEventRecord[];
|
|
72
112
|
sessionCapture: WorkflowSessionCapture | null;
|
|
73
113
|
sessionIntegrity: SessionCaptureIntegrity;
|
|
114
|
+
/** Per-attempt captures written after a handoff or resume. */
|
|
115
|
+
sessionSegments: SessionCaptureSegment[];
|
|
74
116
|
};
|
|
117
|
+
/** Read the final trace record without loading the rest of a run bundle. */
|
|
118
|
+
export declare function readLastTraceEvent(runDir: string, tracePath?: string): Promise<WorkflowTraceEvent | null>;
|
|
75
119
|
/** Read a run bundle from disk. Returns null when the bundle is unreadable. */
|
|
76
120
|
export declare function readRunBundle(runDir: string): Promise<LoadedRunBundle | null>;
|
|
77
121
|
/** List run bundles under `outputRoot`, most recently started first. */
|