@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.
Files changed (152) hide show
  1. package/README.md +72 -5
  2. package/dist/builtins/catalog.d.ts +2 -0
  3. package/dist/builtins/catalog.js +22 -0
  4. package/dist/builtins/catalog.js.map +1 -0
  5. package/dist/builtins/monitor.workflow.d.ts +71 -0
  6. package/dist/builtins/monitor.workflow.js +250 -0
  7. package/dist/builtins/monitor.workflow.js.map +1 -0
  8. package/dist/controllers/conditions.d.ts +6 -0
  9. package/dist/controllers/conditions.js +68 -0
  10. package/dist/controllers/conditions.js.map +1 -0
  11. package/dist/controllers/definition.d.ts +6 -0
  12. package/dist/controllers/definition.js +45 -0
  13. package/dist/controllers/definition.js.map +1 -0
  14. package/dist/controllers/effects.d.ts +14 -0
  15. package/dist/controllers/effects.js +104 -0
  16. package/dist/controllers/effects.js.map +1 -0
  17. package/dist/controllers/errors.d.ts +12 -0
  18. package/dist/controllers/errors.js +25 -0
  19. package/dist/controllers/errors.js.map +1 -0
  20. package/dist/controllers/index.d.ts +13 -0
  21. package/dist/controllers/index.js +13 -0
  22. package/dist/controllers/index.js.map +1 -0
  23. package/dist/controllers/json.d.ts +5 -0
  24. package/dist/controllers/json.js +57 -0
  25. package/dist/controllers/json.js.map +1 -0
  26. package/dist/controllers/loader.d.ts +23 -0
  27. package/dist/controllers/loader.js +74 -0
  28. package/dist/controllers/loader.js.map +1 -0
  29. package/dist/controllers/manager.d.ts +58 -0
  30. package/dist/controllers/manager.js +399 -0
  31. package/dist/controllers/manager.js.map +1 -0
  32. package/dist/controllers/results.d.ts +5 -0
  33. package/dist/controllers/results.js +32 -0
  34. package/dist/controllers/results.js.map +1 -0
  35. package/dist/controllers/sqlite.d.ts +235 -0
  36. package/dist/controllers/sqlite.js +1087 -0
  37. package/dist/controllers/sqlite.js.map +1 -0
  38. package/dist/controllers/store.d.ts +112 -0
  39. package/dist/controllers/store.js +32 -0
  40. package/dist/controllers/store.js.map +1 -0
  41. package/dist/controllers/types.d.ts +159 -0
  42. package/dist/controllers/types.js +2 -0
  43. package/dist/controllers/types.js.map +1 -0
  44. package/dist/controllers/workflow-engine-scheduler.d.ts +25 -0
  45. package/dist/controllers/workflow-engine-scheduler.js +95 -0
  46. package/dist/controllers/workflow-engine-scheduler.js.map +1 -0
  47. package/dist/controllers/workflows.d.ts +27 -0
  48. package/dist/controllers/workflows.js +109 -0
  49. package/dist/controllers/workflows.js.map +1 -0
  50. package/dist/extension/controller-host.d.ts +47 -0
  51. package/dist/extension/controller-host.js +110 -0
  52. package/dist/extension/controller-host.js.map +1 -0
  53. package/dist/extension/executor.d.ts +3 -0
  54. package/dist/extension/executor.js +12 -2
  55. package/dist/extension/executor.js.map +1 -1
  56. package/dist/extension/index.d.ts +7 -0
  57. package/dist/extension/index.js +1118 -106
  58. package/dist/extension/index.js.map +1 -1
  59. package/dist/extension/recorder.d.ts +6 -0
  60. package/dist/extension/recorder.js +20 -8
  61. package/dist/extension/recorder.js.map +1 -1
  62. package/dist/extension/workflow-tool.d.ts +28 -0
  63. package/dist/extension/workflow-tool.js +33 -0
  64. package/dist/extension/workflow-tool.js.map +1 -0
  65. package/dist/host/processes.d.ts +24 -0
  66. package/dist/host/processes.js +114 -0
  67. package/dist/host/processes.js.map +1 -0
  68. package/dist/host/rpc-bridge.d.ts +9 -0
  69. package/dist/host/rpc-bridge.js +39 -0
  70. package/dist/host/rpc-bridge.js.map +1 -0
  71. package/dist/host/rpc-executor.d.ts +38 -0
  72. package/dist/host/rpc-executor.js +254 -0
  73. package/dist/host/rpc-executor.js.map +1 -0
  74. package/dist/host/runner.d.ts +50 -0
  75. package/dist/host/runner.js +379 -0
  76. package/dist/host/runner.js.map +1 -0
  77. package/dist/viewer/cli.d.ts +7 -3
  78. package/dist/viewer/cli.js +150 -19
  79. package/dist/viewer/cli.js.map +1 -1
  80. package/dist/workflows/catalog.d.ts +43 -0
  81. package/dist/workflows/catalog.js +79 -0
  82. package/dist/workflows/catalog.js.map +1 -0
  83. package/dist/workflows/engine.d.ts +37 -2
  84. package/dist/workflows/engine.js +297 -29
  85. package/dist/workflows/engine.js.map +1 -1
  86. package/dist/workflows/errors.d.ts +23 -0
  87. package/dist/workflows/errors.js +38 -0
  88. package/dist/workflows/errors.js.map +1 -1
  89. package/dist/workflows/graph.js +0 -5
  90. package/dist/workflows/graph.js.map +1 -1
  91. package/dist/workflows/index.d.ts +2 -2
  92. package/dist/workflows/index.js +1 -1
  93. package/dist/workflows/index.js.map +1 -1
  94. package/dist/workflows/loader.d.ts +19 -15
  95. package/dist/workflows/loader.js +63 -19
  96. package/dist/workflows/loader.js.map +1 -1
  97. package/dist/workflows/migrate-sources.d.ts +41 -0
  98. package/dist/workflows/migrate-sources.js +129 -0
  99. package/dist/workflows/migrate-sources.js.map +1 -0
  100. package/dist/workflows/schema.js +3 -2
  101. package/dist/workflows/schema.js.map +1 -1
  102. package/dist/workflows/store.d.ts +50 -6
  103. package/dist/workflows/store.js +448 -53
  104. package/dist/workflows/store.js.map +1 -1
  105. package/dist/workflows/types.d.ts +27 -3
  106. package/docs/CONTROLLERS.md +215 -0
  107. package/docs/development.md +14 -9
  108. package/docs/plans/2026-08-04-controller-runtime-plan.md +169 -0
  109. package/docs/plans/2026-08-05-always-on-workflows-plan.md +125 -0
  110. package/docs/plans/2026-08-10-agent-managed-monitor-workflows-plan.md +184 -0
  111. package/docs/plans/2026-08-12-coordinated-workflow-timeouts-plan.md +74 -0
  112. package/docs/plans/2026-08-13-built-in-workflow-catalog-plan.md +97 -0
  113. package/docs/run-bundles.md +85 -28
  114. package/docs/workflows.md +161 -17
  115. package/examples/controllers/pull-request.controller.ts +215 -0
  116. package/package.json +10 -2
  117. package/src/builtins/catalog.ts +22 -0
  118. package/src/builtins/monitor.workflow.ts +302 -0
  119. package/src/controllers/conditions.ts +110 -0
  120. package/src/controllers/definition.ts +65 -0
  121. package/src/controllers/effects.ts +123 -0
  122. package/src/controllers/errors.ts +27 -0
  123. package/src/controllers/index.ts +90 -0
  124. package/src/controllers/json.ts +62 -0
  125. package/src/controllers/loader.ts +104 -0
  126. package/src/controllers/manager.ts +533 -0
  127. package/src/controllers/results.ts +46 -0
  128. package/src/controllers/sqlite.ts +1545 -0
  129. package/src/controllers/store.ts +160 -0
  130. package/src/controllers/types.ts +183 -0
  131. package/src/controllers/workflow-engine-scheduler.ts +148 -0
  132. package/src/controllers/workflows.ts +152 -0
  133. package/src/extension/controller-host.ts +163 -0
  134. package/src/extension/executor.ts +13 -2
  135. package/src/extension/index.ts +1325 -130
  136. package/src/extension/recorder.ts +65 -36
  137. package/src/extension/workflow-tool.ts +59 -0
  138. package/src/host/processes.ts +119 -0
  139. package/src/host/rpc-bridge.ts +44 -0
  140. package/src/host/rpc-executor.ts +299 -0
  141. package/src/host/runner.ts +445 -0
  142. package/src/viewer/cli.ts +167 -21
  143. package/src/workflows/catalog.ts +135 -0
  144. package/src/workflows/engine.ts +404 -41
  145. package/src/workflows/errors.ts +45 -0
  146. package/src/workflows/graph.ts +0 -5
  147. package/src/workflows/index.ts +2 -0
  148. package/src/workflows/loader.ts +76 -22
  149. package/src/workflows/migrate-sources.ts +167 -0
  150. package/src/workflows/schema.ts +3 -2
  151. package/src/workflows/store.ts +557 -48
  152. 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
- writeSessionBinding(runDir: string, binding: WorkflowSessionBinding): Promise<void>;
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>): Promise<number>;
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. */