@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
@@ -0,0 +1,135 @@
1
+ import { isWorkflowDefinition } from "./definition.js";
2
+ import { WorkflowSourceChangedError } from "./errors.js";
3
+ import type { WorkflowDefinition, WorkflowSource } from "./types.js";
4
+
5
+ const BUILTIN_ID_PATTERN = /^[a-z][a-z0-9-]{0,63}$/;
6
+ const REVISION_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/;
7
+
8
+ export type LegacyBuiltinSource = {
9
+ workflowHash: string;
10
+ revision: string;
11
+ pathSuffixes: readonly string[];
12
+ };
13
+
14
+ export type BuiltinWorkflowRegistration = {
15
+ id: string;
16
+ revision: string;
17
+ definition: WorkflowDefinition;
18
+ legacySources?: LegacyBuiltinSource[];
19
+ };
20
+
21
+ export type BuiltinWorkflowEntry = Readonly<{
22
+ id: string;
23
+ ref: string;
24
+ revision: string;
25
+ definition: WorkflowDefinition;
26
+ legacySources: readonly LegacyBuiltinSource[];
27
+ }>;
28
+
29
+ export type LegacyBuiltinMatch = {
30
+ entry: BuiltinWorkflowEntry;
31
+ revision: string;
32
+ };
33
+
34
+ /** Process-local catalog of package-provided workflow definitions. */
35
+ export class BuiltinWorkflowCatalog {
36
+ private readonly byId = new Map<string, BuiltinWorkflowEntry>();
37
+ private readonly byName = new Map<string, BuiltinWorkflowEntry>();
38
+
39
+ constructor(registrations: BuiltinWorkflowRegistration[]) {
40
+ for (const registration of registrations) {
41
+ if (!BUILTIN_ID_PATTERN.test(registration.id)) {
42
+ throw new Error(`Invalid built-in workflow id: ${JSON.stringify(registration.id)}`);
43
+ }
44
+ if (!REVISION_PATTERN.test(registration.revision)) {
45
+ throw new Error(
46
+ `Invalid built-in workflow revision: ${JSON.stringify(registration.revision)}`,
47
+ );
48
+ }
49
+ if (!isWorkflowDefinition(registration.definition)) {
50
+ throw new Error(`Built-in workflow ${registration.id} is not defined with defineWorkflow`);
51
+ }
52
+ if (this.byId.has(registration.id)) {
53
+ throw new Error(`Duplicate built-in workflow id: ${registration.id}`);
54
+ }
55
+ if (this.byName.has(registration.definition.name)) {
56
+ throw new Error(`Duplicate built-in workflow name: ${registration.definition.name}`);
57
+ }
58
+ const entry: BuiltinWorkflowEntry = Object.freeze({
59
+ id: registration.id,
60
+ ref: `builtin:${registration.id}`,
61
+ revision: registration.revision,
62
+ definition: registration.definition,
63
+ legacySources: Object.freeze(
64
+ (registration.legacySources ?? []).map((legacy) =>
65
+ Object.freeze({ ...legacy, pathSuffixes: Object.freeze([...legacy.pathSuffixes]) }),
66
+ ),
67
+ ),
68
+ });
69
+ this.byId.set(entry.id, entry);
70
+ this.byName.set(entry.definition.name, entry);
71
+ }
72
+ }
73
+
74
+ list(): BuiltinWorkflowEntry[] {
75
+ return [...this.byId.values()];
76
+ }
77
+
78
+ get(id: string): BuiltinWorkflowEntry | undefined {
79
+ return this.byId.get(id);
80
+ }
81
+
82
+ getByName(name: string): BuiltinWorkflowEntry | undefined {
83
+ return this.byName.get(name);
84
+ }
85
+
86
+ resolve(
87
+ source: WorkflowSource,
88
+ runId = `builtin:${source.kind === "builtin" ? source.id : "unknown"}`,
89
+ ): WorkflowDefinition {
90
+ if (source.kind !== "builtin") {
91
+ throw new Error("A file workflow source cannot be resolved by the built-in catalog");
92
+ }
93
+ const entry = this.byId.get(source.id);
94
+ if (entry === undefined) {
95
+ throw new Error(`Unknown built-in workflow: ${source.id}`);
96
+ }
97
+ if (entry.revision !== source.revision) {
98
+ throw new WorkflowSourceChangedError(runId);
99
+ }
100
+ return entry.definition;
101
+ }
102
+
103
+ matchLegacy(options: {
104
+ workflowName: string;
105
+ workflowPath: string;
106
+ workflowHash: string;
107
+ }): LegacyBuiltinMatch | undefined {
108
+ const entry = this.legacyPathEntry(options);
109
+ if (entry === undefined) return undefined;
110
+ const workflowPath = options.workflowPath.replaceAll("\\", "/");
111
+ const legacy = entry.legacySources.find(
112
+ (candidate) =>
113
+ candidate.workflowHash === options.workflowHash &&
114
+ candidate.pathSuffixes.some((suffix) =>
115
+ workflowPath.endsWith(suffix.replaceAll("\\", "/")),
116
+ ),
117
+ );
118
+ return legacy === undefined ? undefined : { entry, revision: legacy.revision };
119
+ }
120
+
121
+ /** Identify a registered old built-in path without accepting its revision. */
122
+ legacyPathEntry(options: {
123
+ workflowName: string;
124
+ workflowPath: string;
125
+ }): BuiltinWorkflowEntry | undefined {
126
+ const entry = this.byName.get(options.workflowName);
127
+ if (entry === undefined) return undefined;
128
+ const workflowPath = options.workflowPath.replaceAll("\\", "/");
129
+ return entry.legacySources.some((legacy) =>
130
+ legacy.pathSuffixes.some((suffix) => workflowPath.endsWith(suffix.replaceAll("\\", "/"))),
131
+ )
132
+ ? entry
133
+ : undefined;
134
+ }
135
+ }