@osolmaz/pi-workflows 0.13.2 → 0.13.3

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 (130) hide show
  1. package/README.md +5 -3
  2. package/dist/builtins/autodoc.workflow.d.ts +5 -5
  3. package/dist/builtins/autoimplement.workflow.d.ts +65 -61
  4. package/dist/builtins/autoimplement.workflow.js +47 -8
  5. package/dist/builtins/autoimplement.workflow.js.map +1 -1
  6. package/dist/builtins/autoplan.workflow.d.ts +5 -5
  7. package/dist/builtins/catalog.js +1 -1
  8. package/dist/builtins/change-verification.workflow.d.ts +1 -1
  9. package/dist/builtins/plain-summary.workflow.d.ts +1 -1
  10. package/dist/builtins/plan-approval.workflow.d.ts +1 -1
  11. package/dist/builtins/plan-change.workflow.d.ts +23 -23
  12. package/dist/builtins/sanity-check.workflow.d.ts +3 -3
  13. package/dist/builtins/workspace-preparation.workflow.d.ts +1 -1
  14. package/dist/controllers/index.d.ts +2 -2
  15. package/dist/controllers/index.js.map +1 -1
  16. package/dist/controllers/sqlite.js +85 -23
  17. package/dist/controllers/sqlite.js.map +1 -1
  18. package/dist/controllers/types.d.ts +34 -0
  19. package/dist/controllers/workflow-engine-scheduler.d.ts +5 -1
  20. package/dist/controllers/workflow-engine-scheduler.js +83 -1
  21. package/dist/controllers/workflow-engine-scheduler.js.map +1 -1
  22. package/dist/controllers/workflows.d.ts +8 -1
  23. package/dist/controllers/workflows.js +36 -0
  24. package/dist/controllers/workflows.js.map +1 -1
  25. package/dist/extension/controller-host.d.ts +2 -1
  26. package/dist/extension/controller-host.js +1 -1
  27. package/dist/extension/controller-host.js.map +1 -1
  28. package/dist/extension/follow-up-coordinator.d.ts +27 -0
  29. package/dist/extension/follow-up-coordinator.js +131 -0
  30. package/dist/extension/follow-up-coordinator.js.map +1 -0
  31. package/dist/extension/index.d.ts +9 -0
  32. package/dist/extension/index.js +460 -75
  33. package/dist/extension/index.js.map +1 -1
  34. package/dist/extension/session-events.d.ts +2 -3
  35. package/dist/extension/session-events.js +11 -10
  36. package/dist/extension/session-events.js.map +1 -1
  37. package/dist/extension/widget.js +9 -0
  38. package/dist/extension/widget.js.map +1 -1
  39. package/dist/state/database.d.ts +2 -1
  40. package/dist/state/database.js +11 -13
  41. package/dist/state/database.js.map +1 -1
  42. package/dist/state/json.js +6 -1
  43. package/dist/state/json.js.map +1 -1
  44. package/dist/state/mutation.d.ts +1 -1
  45. package/dist/state/mutation.js.map +1 -1
  46. package/dist/state/prune.d.ts +18 -0
  47. package/dist/state/prune.js +373 -0
  48. package/dist/state/prune.js.map +1 -0
  49. package/dist/state/schema.d.ts +1 -1
  50. package/dist/state/schema.js +116 -18
  51. package/dist/state/schema.js.map +1 -1
  52. package/dist/viewer/cli.d.ts +3 -1
  53. package/dist/viewer/cli.js +55 -4
  54. package/dist/viewer/cli.js.map +1 -1
  55. package/dist/viewer/render.js +19 -1
  56. package/dist/viewer/render.js.map +1 -1
  57. package/dist/workflows/composition.d.ts +2 -0
  58. package/dist/workflows/composition.js +15 -0
  59. package/dist/workflows/composition.js.map +1 -1
  60. package/dist/workflows/definition.d.ts +6 -3
  61. package/dist/workflows/definition.js +3 -0
  62. package/dist/workflows/definition.js.map +1 -1
  63. package/dist/workflows/engine.d.ts +6 -1
  64. package/dist/workflows/engine.js +301 -35
  65. package/dist/workflows/engine.js.map +1 -1
  66. package/dist/workflows/human-decision.d.ts +1 -0
  67. package/dist/workflows/human-decision.js +25 -9
  68. package/dist/workflows/human-decision.js.map +1 -1
  69. package/dist/workflows/index.d.ts +3 -1
  70. package/dist/workflows/index.js +2 -0
  71. package/dist/workflows/index.js.map +1 -1
  72. package/dist/workflows/json-patch.d.ts +47 -0
  73. package/dist/workflows/json-patch.js +298 -0
  74. package/dist/workflows/json-patch.js.map +1 -0
  75. package/dist/workflows/schema.js +29 -1
  76. package/dist/workflows/schema.js.map +1 -1
  77. package/dist/workflows/settings.d.ts +128 -0
  78. package/dist/workflows/settings.js +199 -0
  79. package/dist/workflows/settings.js.map +1 -0
  80. package/dist/workflows/store.d.ts +75 -2
  81. package/dist/workflows/store.js +1349 -89
  82. package/dist/workflows/store.js.map +1 -1
  83. package/dist/workflows/tool-input.d.ts +22 -0
  84. package/dist/workflows/tool-input.js +43 -0
  85. package/dist/workflows/tool-input.js.map +1 -1
  86. package/dist/workflows/types.d.ts +40 -5
  87. package/docs/2026-08-25-workflow-follow-ups.md +132 -0
  88. package/docs/2026-08-25-workflow-settings.md +169 -0
  89. package/docs/DEFERRED_TURNS.md +6 -0
  90. package/docs/DESIGN_PHILOSOPHY.md +2 -0
  91. package/docs/SQLITE_STATE.md +31 -18
  92. package/docs/WORKFLOW_COMPOSITION.md +15 -0
  93. package/docs/WORKFLOW_STEP_MESSAGES.md +4 -2
  94. package/docs/plans/2026-08-25-live-workflow-settings-plan.md +532 -0
  95. package/docs/plans/2026-08-25-workflow-run-storage-plan.md +67 -0
  96. package/docs/tui-viewer.md +7 -6
  97. package/docs/workflows.md +22 -1
  98. package/examples/workflows/live-settings.workflow.ts +93 -0
  99. package/herdr-plugin.toml +1 -1
  100. package/package.json +1 -1
  101. package/src/builtins/autoimplement.workflow.ts +56 -8
  102. package/src/builtins/catalog.ts +1 -1
  103. package/src/controllers/index.ts +6 -0
  104. package/src/controllers/sqlite.ts +129 -35
  105. package/src/controllers/types.ts +40 -0
  106. package/src/controllers/workflow-engine-scheduler.ts +103 -1
  107. package/src/controllers/workflows.ts +68 -0
  108. package/src/extension/controller-host.ts +6 -1
  109. package/src/extension/follow-up-coordinator.ts +151 -0
  110. package/src/extension/index.ts +538 -88
  111. package/src/extension/session-events.ts +15 -13
  112. package/src/extension/widget.ts +8 -0
  113. package/src/state/database.ts +12 -12
  114. package/src/state/json.ts +6 -1
  115. package/src/state/mutation.ts +4 -1
  116. package/src/state/prune.ts +502 -0
  117. package/src/state/schema.ts +116 -18
  118. package/src/viewer/cli.ts +52 -5
  119. package/src/viewer/render.ts +43 -1
  120. package/src/workflows/composition.ts +19 -0
  121. package/src/workflows/definition.ts +19 -5
  122. package/src/workflows/engine.ts +363 -35
  123. package/src/workflows/human-decision.ts +41 -11
  124. package/src/workflows/index.ts +43 -0
  125. package/src/workflows/json-patch.ts +375 -0
  126. package/src/workflows/schema.ts +31 -1
  127. package/src/workflows/settings.ts +430 -0
  128. package/src/workflows/store.ts +1977 -184
  129. package/src/workflows/tool-input.ts +58 -0
  130. package/src/workflows/types.ts +43 -4
@@ -59,7 +59,7 @@ export declare const planChangeWorkflow: import("../workflows/types.js").Workflo
59
59
  readonly from: "finish";
60
60
  readonly validate: (value: unknown) => import("./plain-summary.workflow.js").PlainSummaryResult;
61
61
  };
62
- }, import("../workflows/types.js").WorkflowIncludeMap> & {
62
+ }, import("../workflows/types.js").WorkflowIncludeMap, unknown> & {
63
63
  nodes: {
64
64
  readonly summarize: import("../workflows/types.js").AssistantAgentNodeDefinition;
65
65
  readonly finish: import("../workflows/types.js").ComputeNodeDefinition;
@@ -77,7 +77,7 @@ export declare const planChangeWorkflow: import("../workflows/types.js").Workflo
77
77
  readonly from: "finish";
78
78
  readonly validate: (value: unknown) => import("./plain-summary.workflow.js").PlainSummaryResult;
79
79
  };
80
- }, import("../workflows/types.js").WorkflowIncludeMap> & {
80
+ }, import("../workflows/types.js").WorkflowIncludeMap, unknown> & {
81
81
  nodes: {
82
82
  readonly summarize: import("../workflows/types.js").AssistantAgentNodeDefinition;
83
83
  readonly finish: import("../workflows/types.js").ComputeNodeDefinition;
@@ -90,7 +90,7 @@ export declare const planChangeWorkflow: import("../workflows/types.js").Workflo
90
90
  };
91
91
  };
92
92
  }>;
93
- }> & {
93
+ }, unknown> & {
94
94
  nodes: {
95
95
  readonly captureIntent: import("../workflows/types.js").SubmittedAgentNodeDefinition;
96
96
  readonly frame: import("../workflows/types.js").SubmittedAgentNodeDefinition;
@@ -107,7 +107,7 @@ export declare const planChangeWorkflow: import("../workflows/types.js").Workflo
107
107
  readonly from: "finish";
108
108
  readonly validate: (value: unknown) => import("./plain-summary.workflow.js").PlainSummaryResult;
109
109
  };
110
- }, import("../workflows/types.js").WorkflowIncludeMap> & {
110
+ }, import("../workflows/types.js").WorkflowIncludeMap, unknown> & {
111
111
  nodes: {
112
112
  readonly summarize: import("../workflows/types.js").AssistantAgentNodeDefinition;
113
113
  readonly finish: import("../workflows/types.js").ComputeNodeDefinition;
@@ -125,7 +125,7 @@ export declare const planChangeWorkflow: import("../workflows/types.js").Workflo
125
125
  readonly from: "finish";
126
126
  readonly validate: (value: unknown) => import("./plain-summary.workflow.js").PlainSummaryResult;
127
127
  };
128
- }, import("../workflows/types.js").WorkflowIncludeMap> & {
128
+ }, import("../workflows/types.js").WorkflowIncludeMap, unknown> & {
129
129
  nodes: {
130
130
  readonly summarize: import("../workflows/types.js").AssistantAgentNodeDefinition;
131
131
  readonly finish: import("../workflows/types.js").ComputeNodeDefinition;
@@ -180,7 +180,7 @@ export declare const planChangeWorkflow: import("../workflows/types.js").Workflo
180
180
  evidence: string[];
181
181
  };
182
182
  };
183
- }, import("../workflows/types.js").WorkflowIncludeMap> & {
183
+ }, import("../workflows/types.js").WorkflowIncludeMap, unknown> & {
184
184
  nodes: {
185
185
  readonly inspect: import("../workflows/types.js").FunctionActionNodeDefinition;
186
186
  readonly propose: import("../workflows/types.js").SubmittedAgentNodeDefinition;
@@ -220,7 +220,7 @@ export declare const planChangeWorkflow: import("../workflows/types.js").Workflo
220
220
  readonly from: "blocked";
221
221
  readonly validate: (value: unknown) => import("./change-verification.workflow.js").ChangeVerificationResult;
222
222
  };
223
- }, import("../workflows/types.js").WorkflowIncludeMap> & {
223
+ }, import("../workflows/types.js").WorkflowIncludeMap, unknown> & {
224
224
  nodes: {
225
225
  readonly selectChecks: import("../workflows/types.js").ComputeNodeDefinition;
226
226
  readonly planChecks: import("../workflows/types.js").SubmittedAgentNodeDefinition;
@@ -246,7 +246,7 @@ export declare const planChangeWorkflow: import("../workflows/types.js").Workflo
246
246
  };
247
247
  };
248
248
  }>;
249
- }> & {
249
+ }, unknown> & {
250
250
  nodes: {
251
251
  readonly prepare: import("../workflows/types.js").ComputeNodeDefinition;
252
252
  readonly locatePlan: import("../workflows/types.js").SubmittedAgentNodeDefinition;
@@ -277,7 +277,7 @@ export declare const planChangeWorkflow: import("../workflows/types.js").Workflo
277
277
  evidence: string[];
278
278
  };
279
279
  };
280
- }, import("../workflows/types.js").WorkflowIncludeMap> & {
280
+ }, import("../workflows/types.js").WorkflowIncludeMap, unknown> & {
281
281
  nodes: {
282
282
  readonly inspect: import("../workflows/types.js").FunctionActionNodeDefinition;
283
283
  readonly propose: import("../workflows/types.js").SubmittedAgentNodeDefinition;
@@ -317,7 +317,7 @@ export declare const planChangeWorkflow: import("../workflows/types.js").Workflo
317
317
  readonly from: "blocked";
318
318
  readonly validate: (value: unknown) => import("./change-verification.workflow.js").ChangeVerificationResult;
319
319
  };
320
- }, import("../workflows/types.js").WorkflowIncludeMap> & {
320
+ }, import("../workflows/types.js").WorkflowIncludeMap, unknown> & {
321
321
  nodes: {
322
322
  readonly selectChecks: import("../workflows/types.js").ComputeNodeDefinition;
323
323
  readonly planChecks: import("../workflows/types.js").SubmittedAgentNodeDefinition;
@@ -368,7 +368,7 @@ export declare const planChangeWorkflow: import("../workflows/types.js").Workflo
368
368
  readonly from: "replan";
369
369
  readonly validate: (value: unknown) => import("./plan-approval.workflow.js").PlanApprovalReplan;
370
370
  };
371
- }, import("../workflows/types.js").WorkflowIncludeMap> & {
371
+ }, import("../workflows/types.js").WorkflowIncludeMap, unknown> & {
372
372
  nodes: {
373
373
  readonly routePolicy: import("../workflows/types.js").ComputeNodeDefinition;
374
374
  readonly approve: import("../workflows/types.js").WorkflowNodeCommon & {
@@ -412,7 +412,7 @@ export declare const planChangeWorkflow: import("../workflows/types.js").Workflo
412
412
  };
413
413
  };
414
414
  }>;
415
- }> & {
415
+ }, unknown> & {
416
416
  nodes: {
417
417
  readonly start: import("../workflows/types.js").ComputeNodeDefinition;
418
418
  readonly assessPlan: import("../workflows/types.js").ComputeNodeDefinition;
@@ -436,7 +436,7 @@ export declare const planChangeWorkflow: import("../workflows/types.js").Workflo
436
436
  readonly from: "finish";
437
437
  readonly validate: (value: unknown) => import("./plain-summary.workflow.js").PlainSummaryResult;
438
438
  };
439
- }, import("../workflows/types.js").WorkflowIncludeMap> & {
439
+ }, import("../workflows/types.js").WorkflowIncludeMap, unknown> & {
440
440
  nodes: {
441
441
  readonly summarize: import("../workflows/types.js").AssistantAgentNodeDefinition;
442
442
  readonly finish: import("../workflows/types.js").ComputeNodeDefinition;
@@ -454,7 +454,7 @@ export declare const planChangeWorkflow: import("../workflows/types.js").Workflo
454
454
  readonly from: "finish";
455
455
  readonly validate: (value: unknown) => import("./plain-summary.workflow.js").PlainSummaryResult;
456
456
  };
457
- }, import("../workflows/types.js").WorkflowIncludeMap> & {
457
+ }, import("../workflows/types.js").WorkflowIncludeMap, unknown> & {
458
458
  nodes: {
459
459
  readonly summarize: import("../workflows/types.js").AssistantAgentNodeDefinition;
460
460
  readonly finish: import("../workflows/types.js").ComputeNodeDefinition;
@@ -467,7 +467,7 @@ export declare const planChangeWorkflow: import("../workflows/types.js").Workflo
467
467
  };
468
468
  };
469
469
  }>;
470
- }> & {
470
+ }, unknown> & {
471
471
  nodes: {
472
472
  readonly captureIntent: import("../workflows/types.js").SubmittedAgentNodeDefinition;
473
473
  readonly frame: import("../workflows/types.js").SubmittedAgentNodeDefinition;
@@ -484,7 +484,7 @@ export declare const planChangeWorkflow: import("../workflows/types.js").Workflo
484
484
  readonly from: "finish";
485
485
  readonly validate: (value: unknown) => import("./plain-summary.workflow.js").PlainSummaryResult;
486
486
  };
487
- }, import("../workflows/types.js").WorkflowIncludeMap> & {
487
+ }, import("../workflows/types.js").WorkflowIncludeMap, unknown> & {
488
488
  nodes: {
489
489
  readonly summarize: import("../workflows/types.js").AssistantAgentNodeDefinition;
490
490
  readonly finish: import("../workflows/types.js").ComputeNodeDefinition;
@@ -502,7 +502,7 @@ export declare const planChangeWorkflow: import("../workflows/types.js").Workflo
502
502
  readonly from: "finish";
503
503
  readonly validate: (value: unknown) => import("./plain-summary.workflow.js").PlainSummaryResult;
504
504
  };
505
- }, import("../workflows/types.js").WorkflowIncludeMap> & {
505
+ }, import("../workflows/types.js").WorkflowIncludeMap, unknown> & {
506
506
  nodes: {
507
507
  readonly summarize: import("../workflows/types.js").AssistantAgentNodeDefinition;
508
508
  readonly finish: import("../workflows/types.js").ComputeNodeDefinition;
@@ -557,7 +557,7 @@ export declare const planChangeWorkflow: import("../workflows/types.js").Workflo
557
557
  evidence: string[];
558
558
  };
559
559
  };
560
- }, import("../workflows/types.js").WorkflowIncludeMap> & {
560
+ }, import("../workflows/types.js").WorkflowIncludeMap, unknown> & {
561
561
  nodes: {
562
562
  readonly inspect: import("../workflows/types.js").FunctionActionNodeDefinition;
563
563
  readonly propose: import("../workflows/types.js").SubmittedAgentNodeDefinition;
@@ -597,7 +597,7 @@ export declare const planChangeWorkflow: import("../workflows/types.js").Workflo
597
597
  readonly from: "blocked";
598
598
  readonly validate: (value: unknown) => import("./change-verification.workflow.js").ChangeVerificationResult;
599
599
  };
600
- }, import("../workflows/types.js").WorkflowIncludeMap> & {
600
+ }, import("../workflows/types.js").WorkflowIncludeMap, unknown> & {
601
601
  nodes: {
602
602
  readonly selectChecks: import("../workflows/types.js").ComputeNodeDefinition;
603
603
  readonly planChecks: import("../workflows/types.js").SubmittedAgentNodeDefinition;
@@ -623,7 +623,7 @@ export declare const planChangeWorkflow: import("../workflows/types.js").Workflo
623
623
  };
624
624
  };
625
625
  }>;
626
- }> & {
626
+ }, unknown> & {
627
627
  nodes: {
628
628
  readonly prepare: import("../workflows/types.js").ComputeNodeDefinition;
629
629
  readonly locatePlan: import("../workflows/types.js").SubmittedAgentNodeDefinition;
@@ -654,7 +654,7 @@ export declare const planChangeWorkflow: import("../workflows/types.js").Workflo
654
654
  evidence: string[];
655
655
  };
656
656
  };
657
- }, import("../workflows/types.js").WorkflowIncludeMap> & {
657
+ }, import("../workflows/types.js").WorkflowIncludeMap, unknown> & {
658
658
  nodes: {
659
659
  readonly inspect: import("../workflows/types.js").FunctionActionNodeDefinition;
660
660
  readonly propose: import("../workflows/types.js").SubmittedAgentNodeDefinition;
@@ -694,7 +694,7 @@ export declare const planChangeWorkflow: import("../workflows/types.js").Workflo
694
694
  readonly from: "blocked";
695
695
  readonly validate: (value: unknown) => import("./change-verification.workflow.js").ChangeVerificationResult;
696
696
  };
697
- }, import("../workflows/types.js").WorkflowIncludeMap> & {
697
+ }, import("../workflows/types.js").WorkflowIncludeMap, unknown> & {
698
698
  nodes: {
699
699
  readonly selectChecks: import("../workflows/types.js").ComputeNodeDefinition;
700
700
  readonly planChecks: import("../workflows/types.js").SubmittedAgentNodeDefinition;
@@ -745,7 +745,7 @@ export declare const planChangeWorkflow: import("../workflows/types.js").Workflo
745
745
  readonly from: "replan";
746
746
  readonly validate: (value: unknown) => import("./plan-approval.workflow.js").PlanApprovalReplan;
747
747
  };
748
- }, import("../workflows/types.js").WorkflowIncludeMap> & {
748
+ }, import("../workflows/types.js").WorkflowIncludeMap, unknown> & {
749
749
  nodes: {
750
750
  readonly routePolicy: import("../workflows/types.js").ComputeNodeDefinition;
751
751
  readonly approve: import("../workflows/types.js").WorkflowNodeCommon & {
@@ -80,7 +80,7 @@ export declare const sanityCheckWorkflow: import("../workflows/types.js").Workfl
80
80
  readonly from: "finish";
81
81
  readonly validate: (value: unknown) => import("./plain-summary.workflow.js").PlainSummaryResult;
82
82
  };
83
- }, import("../workflows/types.js").WorkflowIncludeMap> & {
83
+ }, import("../workflows/types.js").WorkflowIncludeMap, unknown> & {
84
84
  nodes: {
85
85
  readonly summarize: import("../workflows/types.js").AssistantAgentNodeDefinition;
86
86
  readonly finish: import("../workflows/types.js").ComputeNodeDefinition;
@@ -93,7 +93,7 @@ export declare const sanityCheckWorkflow: import("../workflows/types.js").Workfl
93
93
  };
94
94
  };
95
95
  }>;
96
- }> & {
96
+ }, unknown> & {
97
97
  nodes: {
98
98
  readonly prepare: import("../workflows/types.js").ComputeNodeDefinition;
99
99
  readonly collectEvidence: import("../workflows/types.js").FunctionActionNodeDefinition;
@@ -108,7 +108,7 @@ export declare const sanityCheckWorkflow: import("../workflows/types.js").Workfl
108
108
  readonly from: "finish";
109
109
  readonly validate: (value: unknown) => import("./plain-summary.workflow.js").PlainSummaryResult;
110
110
  };
111
- }, import("../workflows/types.js").WorkflowIncludeMap> & {
111
+ }, import("../workflows/types.js").WorkflowIncludeMap, unknown> & {
112
112
  nodes: {
113
113
  readonly summarize: import("../workflows/types.js").AssistantAgentNodeDefinition;
114
114
  readonly finish: import("../workflows/types.js").ComputeNodeDefinition;
@@ -52,7 +52,7 @@ export declare const workspacePreparationWorkflow: import("../workflows/types.js
52
52
  readonly from: "blocked";
53
53
  readonly validate: (value: unknown) => WorkspaceInspection;
54
54
  };
55
- }, import("../workflows/types.js").WorkflowIncludeMap> & {
55
+ }, import("../workflows/types.js").WorkflowIncludeMap, unknown> & {
56
56
  nodes: {
57
57
  readonly inspect: import("../workflows/types.js").FunctionActionNodeDefinition;
58
58
  readonly propose: import("../workflows/types.js").SubmittedAgentNodeDefinition;
@@ -9,5 +9,5 @@ export { SqliteControllerStore, type RunEventRecord, type WorkflowNotificationRe
9
9
  export { type ControllerStore, type EffectReservation, type QueueItem, type QueueRequeueOptions, type WorkflowRecordUpdate, type WorkflowReservation, } from "./store.js";
10
10
  export { controllerFileStem, controllerSearchDirs, discoverControllers, loadControllerFile, loadDiscoveredControllers, type DiscoveredController, } from "./loader.js";
11
11
  export { WorkflowEngineScheduler, type ResolvedChildWorkflow, type WorkflowEngineSchedulerOptions, } from "./workflow-engine-scheduler.js";
12
- export { ControllerWorkflowCoordinator, type ControllerWorkflowScheduler, type WorkflowSchedulerRequest, type WorkflowSchedulerResult, } from "./workflows.js";
13
- export type { AnyControllerDefinition, ChildWorkflowRecord, ChildWorkflowReference, ChildWorkflowRequest, ChildWorkflowState, ControllerCondition, ControllerConditionInput, ControllerConditionStatus, ControllerDefinition, ControllerEffects, ControllerEvent, ControllerQueueClaim, ControllerResource, ControllerResourceRef, ControllerResourceStatus, ControllerStatusPatch, ControllerWorkflows, EffectApplication, EffectDefinition, EffectObservation, EffectRecord, EffectState, JsonObject, JsonPrimitive, JsonValue, MaybePromise, ReconcileContext, ReconcileResult, } from "./types.js";
12
+ export { ControllerWorkflowCoordinator, type ControllerWorkflowControlRequest, type ControllerWorkflowScheduler, type WorkflowSchedulerRequest, type WorkflowSchedulerResult, } from "./workflows.js";
13
+ export type { AnyControllerDefinition, ChildWorkflowRecord, ChildWorkflowReference, ChildWorkflowRequest, ChildWorkflowState, ControllerCondition, ControllerConditionInput, ControllerConditionStatus, ControllerDefinition, ControllerEffects, ControllerFollowUpResult, ControllerQueueFollowUpRequest, ControllerRemoveFollowUpRequest, ControllerSettingsChangeRequest, ControllerSettingsChangeResult, ControllerEvent, ControllerQueueClaim, ControllerResource, ControllerResourceRef, ControllerResourceStatus, ControllerStatusPatch, ControllerWorkflows, EffectApplication, EffectDefinition, EffectObservation, EffectRecord, EffectState, JsonObject, JsonPrimitive, JsonValue, MaybePromise, ReconcileContext, ReconcileResult, } from "./types.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/controllers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,+BAA+B,EAC/B,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,eAAe,GAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,0BAA0B,EAC1B,qBAAqB,EACrB,qBAAqB,EACrB,4BAA4B,GAC7B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAiC,MAAM,cAAc,CAAC;AAChF,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACnF,OAAO,EACL,qBAAqB,GAItB,MAAM,aAAa,CAAC;AACrB,OAAO,EAON,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,yBAAyB,GAE1B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,uBAAuB,GAGxB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,6BAA6B,GAI9B,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/controllers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,+BAA+B,EAC/B,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,eAAe,GAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,0BAA0B,EAC1B,qBAAqB,EACrB,qBAAqB,EACrB,4BAA4B,GAC7B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAiC,MAAM,cAAc,CAAC;AAChF,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACnF,OAAO,EACL,qBAAqB,GAItB,MAAM,aAAa,CAAC;AACrB,OAAO,EAON,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,mBAAmB,EACnB,kBAAkB,EAClB,yBAAyB,GAE1B,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,uBAAuB,GAGxB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,6BAA6B,GAK9B,MAAM,gBAAgB,CAAC"}
@@ -534,8 +534,6 @@ export class SqliteControllerStore {
534
534
  const resourceId = resourceIdFor("run", options.runId);
535
535
  const definitionHash = this.state.putJson(options.definitionSnapshot, now);
536
536
  const queuedSource = queuedWorkflowSource(options.workflowSource);
537
- const sourceHash = this.state.putJson(queuedSource.root, now);
538
- const mountedSourcesHash = queuedSource.mounted.length === 0 ? null : this.state.putJson(queuedSource.mounted, now);
539
537
  const inputHash = this.state.putJson(options.input ?? null, now);
540
538
  const launchHash = this.state.putJson(options.launchOptions ?? {}, now);
541
539
  this.state.connection
@@ -551,15 +549,14 @@ export class SqliteControllerStore {
551
549
  this.state.connection
552
550
  .prepare("INSERT INTO leases(resource_id, generation) VALUES (?, 0)")
553
551
  .run(resourceId);
554
- const source = sourceParts(options.workflowSourceRef, options.definitionDigest);
555
552
  this.state.connection
556
553
  .prepare(`INSERT INTO runs(
557
554
  run_id, resource_id, project_id, parent_run_id, definition_digest,
558
- workflow_ref, workflow_source_hash, launch_options_hash,
559
- source_type, source_ref, source_revision, status, paused,
560
- input_hash, workflow_sources_hash, created_at, updated_at
561
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'queued', 0, ?, ?, ?, ?)`)
562
- .run(options.runId, resourceId, this.requireProjectId(), options.parentRunId ?? null, definitionDigest, options.workflowSourceRef, sourceHash, launchHash, source.type, source.ref, source.revision, inputHash, mountedSourcesHash, now, now);
555
+ workflow_ref, launch_options_hash, status, paused,
556
+ input_hash, created_at, updated_at
557
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, 'queued', 0, ?, ?, ?)`)
558
+ .run(options.runId, resourceId, this.requireProjectId(), options.parentRunId ?? null, definitionDigest, options.workflowSourceRef, launchHash, inputHash, now, now);
559
+ insertQueuedRunSources(this.state, options.runId, queuedSource);
563
560
  this.state.connection
564
561
  .prepare(`INSERT INTO run_bindings(run_id, origin_session_id, execution_mode, created_at)
565
562
  VALUES (?, ?, 'interactive', ?)`)
@@ -1284,10 +1281,7 @@ export class SqliteControllerStore {
1284
1281
  runId: row.runId,
1285
1282
  workflowName: row.workflowName,
1286
1283
  workflowSourceRef: row.workflowRef,
1287
- workflowSource: {
1288
- root: this.state.readJson(row.workflowSourceHash),
1289
- mounted: row.workflowSourcesHash === null ? [] : this.state.readJson(row.workflowSourcesHash),
1290
- },
1284
+ workflowSource: readQueuedRunSources(this.state, row),
1291
1285
  initialized: row.runStatus !== "queued",
1292
1286
  definitionDigest: `sha256:${row.definitionDigest.toString("hex")}`,
1293
1287
  input: this.state.readJson(row.inputHash),
@@ -1433,8 +1427,6 @@ export class SqliteControllerStore {
1433
1427
  this.state.connection
1434
1428
  .prepare(`UPDATE runs
1435
1429
  SET status = ?, paused = 0, status_detail = NULL, error_hash = ?,
1436
- current_node = NULL, current_attempt_id = NULL,
1437
- current_node_started_at = NULL, waiting_on = NULL,
1438
1430
  updated_at = ?, finished_at = ?
1439
1431
  WHERE run_id = ?`)
1440
1432
  .run(status, errorHash, now, now, runId);
@@ -1631,9 +1623,8 @@ function workflowSelect(clause) {
1631
1623
  function workflowRunSelect(clause) {
1632
1624
  return `SELECT r.run_id AS runId, r.resource_id AS resourceId,
1633
1625
  d.workflow_name AS workflowName, r.workflow_ref AS workflowRef, r.status AS runStatus,
1634
- r.workflow_source_hash AS workflowSourceHash,
1635
- r.workflow_sources_hash AS workflowSourcesHash,
1636
- r.definition_digest AS definitionDigest, r.input_hash AS inputHash,
1626
+ r.definition_digest AS definitionDigest, d.definition_hash AS definitionHash,
1627
+ r.input_hash AS inputHash,
1637
1628
  r.launch_options_hash AS launchOptionsHash,
1638
1629
  q.status, q.available_at AS availableAt, q.affinity_runner_id AS affinityRunnerId,
1639
1630
  q.consecutive_errors AS consecutiveErrors, q.error_code AS errorCode,
@@ -1681,6 +1672,9 @@ function isLeaseRow(value) {
1681
1672
  function isRunRow(value) {
1682
1673
  return isRecord(value);
1683
1674
  }
1675
+ function isRunSourceIdentityRow(value) {
1676
+ return isRecord(value);
1677
+ }
1684
1678
  function isEffectRow(value) {
1685
1679
  return isRecord(value);
1686
1680
  }
@@ -1753,18 +1747,86 @@ function digestBuffer(value) {
1753
1747
  return Buffer.from(hex, "hex");
1754
1748
  }
1755
1749
  function queuedWorkflowSource(value) {
1756
- if (isRecord(value) && (value.kind === "builtin" || value.kind === "file")) {
1750
+ if (isWorkflowSource(value)) {
1757
1751
  return { root: value, mounted: [] };
1758
1752
  }
1759
- if (isRecord(value) && isRecord(value.root) && Array.isArray(value.mounted)) {
1753
+ if (isRecord(value) &&
1754
+ isWorkflowSource(value.root) &&
1755
+ Array.isArray(value.mounted) &&
1756
+ value.mounted.every(isMountedWorkflowSource)) {
1760
1757
  return { root: value.root, mounted: value.mounted };
1761
1758
  }
1762
1759
  throw new Error("Stored workflow source identity is invalid");
1763
1760
  }
1764
- function sourceParts(ref, revision) {
1765
- return ref.startsWith("builtin:")
1766
- ? { type: "builtin", ref: ref.slice(8), revision }
1767
- : { type: "file", ref, revision };
1761
+ function isWorkflowSource(value) {
1762
+ return (isRecord(value) &&
1763
+ ((value.kind === "builtin" &&
1764
+ typeof value.id === "string" &&
1765
+ typeof value.revision === "string") ||
1766
+ (value.kind === "file" && typeof value.path === "string" && typeof value.hash === "string")));
1767
+ }
1768
+ function isMountedWorkflowSource(value) {
1769
+ return (isRecord(value) &&
1770
+ Array.isArray(value.mountPath) &&
1771
+ value.mountPath.every((part) => typeof part === "string") &&
1772
+ typeof value.workflowName === "string" &&
1773
+ isWorkflowSource(value.source));
1774
+ }
1775
+ function insertQueuedRunSources(state, runId, value) {
1776
+ const insert = state.connection.prepare(`INSERT INTO run_sources(run_id, mount_path, source_type, source_ref, source_revision)
1777
+ VALUES (?, ?, ?, ?, ?)`);
1778
+ const root = queuedSourceParts(value.root);
1779
+ insert.run(runId, "", root.type, root.ref, root.revision);
1780
+ for (const mounted of value.mounted) {
1781
+ const source = queuedSourceParts(mounted.source);
1782
+ insert.run(runId, mounted.mountPath.join("/"), source.type, source.ref, source.revision);
1783
+ }
1784
+ }
1785
+ function queuedSourceParts(source) {
1786
+ return source.kind === "builtin"
1787
+ ? { type: "builtin", ref: source.id, revision: source.revision }
1788
+ : { type: "file", ref: source.path, revision: source.hash };
1789
+ }
1790
+ function readQueuedRunSources(state, run) {
1791
+ const rows = state.connection
1792
+ .prepare(`SELECT mount_path AS mountPath, source_type AS sourceType,
1793
+ source_ref AS sourceRef, source_revision AS sourceRevision
1794
+ FROM run_sources WHERE run_id = ? ORDER BY mount_path`)
1795
+ .all(run.runId)
1796
+ .filter(isRunSourceIdentityRow);
1797
+ const rootRow = rows.find((row) => row.mountPath === "");
1798
+ if (rootRow === undefined)
1799
+ throw new Error(`Workflow run source is missing: ${run.runId}`);
1800
+ const snapshot = state.readJson(run.definitionHash);
1801
+ const mounts = isRecord(snapshot) &&
1802
+ isRecord(snapshot.composition) &&
1803
+ Array.isArray(snapshot.composition.mounts)
1804
+ ? snapshot.composition.mounts
1805
+ : [];
1806
+ const names = new Map(mounts.flatMap((mount) => {
1807
+ if (!isRecord(mount) ||
1808
+ !Array.isArray(mount.mountPath) ||
1809
+ !mount.mountPath.every((part) => typeof part === "string") ||
1810
+ typeof mount.workflowName !== "string") {
1811
+ return [];
1812
+ }
1813
+ return [[mount.mountPath.join("/"), mount.workflowName]];
1814
+ }));
1815
+ return {
1816
+ root: rowToSource(rootRow),
1817
+ mounted: rows
1818
+ .filter((row) => row.mountPath !== "")
1819
+ .map((row) => ({
1820
+ mountPath: row.mountPath.split("/"),
1821
+ workflowName: names.get(row.mountPath) ?? row.mountPath,
1822
+ source: rowToSource(row),
1823
+ })),
1824
+ };
1825
+ }
1826
+ function rowToSource(row) {
1827
+ return row.sourceType === "builtin"
1828
+ ? { kind: "builtin", id: row.sourceRef, revision: row.sourceRevision }
1829
+ : { kind: "file", path: row.sourceRef, hash: row.sourceRevision };
1768
1830
  }
1769
1831
  function effectStatus(value) {
1770
1832
  return value === "indeterminate" ? "ambiguous" : value;