@apexops/kernel 0.10.0-next.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 (110) hide show
  1. package/dist/.tsbuildinfo +1 -0
  2. package/dist/benchmark.d.ts +14 -0
  3. package/dist/benchmark.d.ts.map +1 -0
  4. package/dist/benchmark.js +29 -0
  5. package/dist/benchmark.js.map +1 -0
  6. package/dist/canonical.d.ts +10 -0
  7. package/dist/canonical.d.ts.map +1 -0
  8. package/dist/canonical.js +52 -0
  9. package/dist/canonical.js.map +1 -0
  10. package/dist/content-cache.d.ts +18 -0
  11. package/dist/content-cache.d.ts.map +1 -0
  12. package/dist/content-cache.js +94 -0
  13. package/dist/content-cache.js.map +1 -0
  14. package/dist/event-journal.d.ts +20 -0
  15. package/dist/event-journal.d.ts.map +1 -0
  16. package/dist/event-journal.js +136 -0
  17. package/dist/event-journal.js.map +1 -0
  18. package/dist/evidence-store.d.ts +42 -0
  19. package/dist/evidence-store.d.ts.map +1 -0
  20. package/dist/evidence-store.js +151 -0
  21. package/dist/evidence-store.js.map +1 -0
  22. package/dist/files.d.ts +6 -0
  23. package/dist/files.d.ts.map +1 -0
  24. package/dist/files.js +33 -0
  25. package/dist/files.js.map +1 -0
  26. package/dist/gates.d.ts +6 -0
  27. package/dist/gates.d.ts.map +1 -0
  28. package/dist/gates.js +25 -0
  29. package/dist/gates.js.map +1 -0
  30. package/dist/improvement-store.d.ts +48 -0
  31. package/dist/improvement-store.d.ts.map +1 -0
  32. package/dist/improvement-store.js +263 -0
  33. package/dist/improvement-store.js.map +1 -0
  34. package/dist/index.d.ts +18 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +18 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/lease-store.d.ts +23 -0
  39. package/dist/lease-store.d.ts.map +1 -0
  40. package/dist/lease-store.js +108 -0
  41. package/dist/lease-store.js.map +1 -0
  42. package/dist/object-store.d.ts +10 -0
  43. package/dist/object-store.d.ts.map +1 -0
  44. package/dist/object-store.js +86 -0
  45. package/dist/object-store.js.map +1 -0
  46. package/dist/project-store.d.ts +30 -0
  47. package/dist/project-store.d.ts.map +1 -0
  48. package/dist/project-store.js +72 -0
  49. package/dist/project-store.js.map +1 -0
  50. package/dist/run-repository.d.ts +38 -0
  51. package/dist/run-repository.d.ts.map +1 -0
  52. package/dist/run-repository.js +151 -0
  53. package/dist/run-repository.js.map +1 -0
  54. package/dist/tasks.d.ts +14 -0
  55. package/dist/tasks.d.ts.map +1 -0
  56. package/dist/tasks.js +96 -0
  57. package/dist/tasks.js.map +1 -0
  58. package/dist/test/canonical.test.d.ts +2 -0
  59. package/dist/test/canonical.test.d.ts.map +1 -0
  60. package/dist/test/canonical.test.js +18 -0
  61. package/dist/test/canonical.test.js.map +1 -0
  62. package/dist/test/improvement-store.test.d.ts +2 -0
  63. package/dist/test/improvement-store.test.d.ts.map +1 -0
  64. package/dist/test/improvement-store.test.js +130 -0
  65. package/dist/test/improvement-store.test.js.map +1 -0
  66. package/dist/test/journal-lease.test.d.ts +2 -0
  67. package/dist/test/journal-lease.test.d.ts.map +1 -0
  68. package/dist/test/journal-lease.test.js +124 -0
  69. package/dist/test/journal-lease.test.js.map +1 -0
  70. package/dist/test/policies.test.d.ts +2 -0
  71. package/dist/test/policies.test.d.ts.map +1 -0
  72. package/dist/test/policies.test.js +115 -0
  73. package/dist/test/policies.test.js.map +1 -0
  74. package/dist/test/run-repository.test.d.ts +2 -0
  75. package/dist/test/run-repository.test.d.ts.map +1 -0
  76. package/dist/test/run-repository.test.js +100 -0
  77. package/dist/test/run-repository.test.js.map +1 -0
  78. package/dist/test/storage.test.d.ts +2 -0
  79. package/dist/test/storage.test.d.ts.map +1 -0
  80. package/dist/test/storage.test.js +41 -0
  81. package/dist/test/storage.test.js.map +1 -0
  82. package/dist/test/workflow-engine.test.d.ts +2 -0
  83. package/dist/test/workflow-engine.test.d.ts.map +1 -0
  84. package/dist/test/workflow-engine.test.js +108 -0
  85. package/dist/test/workflow-engine.test.js.map +1 -0
  86. package/dist/test/workflow.test.d.ts +2 -0
  87. package/dist/test/workflow.test.d.ts.map +1 -0
  88. package/dist/test/workflow.test.js +119 -0
  89. package/dist/test/workflow.test.js.map +1 -0
  90. package/dist/test/writer-transfer.test.d.ts +2 -0
  91. package/dist/test/writer-transfer.test.d.ts.map +1 -0
  92. package/dist/test/writer-transfer.test.js +355 -0
  93. package/dist/test/writer-transfer.test.js.map +1 -0
  94. package/dist/validator-registry.d.ts +22 -0
  95. package/dist/validator-registry.d.ts.map +1 -0
  96. package/dist/validator-registry.js +42 -0
  97. package/dist/validator-registry.js.map +1 -0
  98. package/dist/workflow-engine.d.ts +72 -0
  99. package/dist/workflow-engine.d.ts.map +1 -0
  100. package/dist/workflow-engine.js +269 -0
  101. package/dist/workflow-engine.js.map +1 -0
  102. package/dist/workflow-validator-ownership.d.ts +12 -0
  103. package/dist/workflow-validator-ownership.d.ts.map +1 -0
  104. package/dist/workflow-validator-ownership.js +163 -0
  105. package/dist/workflow-validator-ownership.js.map +1 -0
  106. package/dist/writer-transfer.d.ts +78 -0
  107. package/dist/writer-transfer.d.ts.map +1 -0
  108. package/dist/writer-transfer.js +313 -0
  109. package/dist/writer-transfer.js.map +1 -0
  110. package/package.json +39 -0
@@ -0,0 +1,72 @@
1
+ import { type JsonValue } from "./canonical.js";
2
+ export type WorkflowCondition = {
3
+ all: WorkflowCondition[];
4
+ } | {
5
+ equals: [{
6
+ path: string;
7
+ }, JsonValue];
8
+ } | {
9
+ in: [{
10
+ path: string;
11
+ }, JsonValue[]];
12
+ } | {
13
+ exists: {
14
+ path: string;
15
+ };
16
+ } | {
17
+ not: WorkflowCondition;
18
+ };
19
+ export interface WorkflowNode {
20
+ id: string;
21
+ kind: string;
22
+ ownerRole: string;
23
+ gateNumber?: number;
24
+ condition?: WorkflowCondition;
25
+ sourceDependencies: string[];
26
+ outputs: string[];
27
+ validators: string[];
28
+ invalidates: string[];
29
+ }
30
+ export interface WorkflowEdge {
31
+ from: string;
32
+ to: string;
33
+ condition?: WorkflowCondition;
34
+ fanout?: boolean;
35
+ }
36
+ export interface WorkflowManifest {
37
+ nodes: WorkflowNode[];
38
+ edges: WorkflowEdge[];
39
+ returnRoutes?: WorkflowEdge[];
40
+ terminalStates: string[];
41
+ blockedStates: string[];
42
+ }
43
+ export interface WorkflowState {
44
+ run: Record<string, JsonValue>;
45
+ artifacts: Record<string, JsonValue>;
46
+ completedNodes?: string[];
47
+ gateStates?: Record<string, string>;
48
+ state?: string;
49
+ }
50
+ export interface WorkflowRoute {
51
+ currentNode: string | null;
52
+ nextTask: string | null;
53
+ ownerRole: string | null;
54
+ blockers: string[];
55
+ terminal: boolean;
56
+ }
57
+ export interface InvalidationEntry {
58
+ nodeId: string;
59
+ reason: string;
60
+ }
61
+ export declare function composeDependencyHash(dependencies: Record<string, JsonValue>): string;
62
+ export declare class WorkflowEngine {
63
+ readonly manifest: WorkflowManifest;
64
+ private readonly nodes;
65
+ constructor(manifest: unknown);
66
+ route(state: WorkflowState): WorkflowRoute;
67
+ activeValidatorIds(state: WorkflowState): string[];
68
+ invalidationPlan(changedNodeId: string, reason: string): InvalidationEntry[];
69
+ private dependencySatisfied;
70
+ }
71
+ export declare function validateWorkflowManifest(value: unknown): WorkflowManifest;
72
+ //# sourceMappingURL=workflow-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-engine.d.ts","sourceRoot":"","sources":["../src/workflow-engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAK5D,MAAM,MAAM,iBAAiB,GACzB;IAAE,GAAG,EAAE,iBAAiB,EAAE,CAAA;CAAE,GAC5B;IAAE,MAAM,EAAE,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,SAAS,CAAC,CAAA;CAAE,GACzC;IAAE,EAAE,EAAE,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,SAAS,EAAE,CAAC,CAAA;CAAE,GACvC;IAAE,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,GAC5B;IAAE,GAAG,EAAE,iBAAiB,CAAA;CAAE,CAAC;AAE/B,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,YAAY,CAAC,EAAE,YAAY,EAAE,CAAC;IAC9B,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC/B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACrC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,MAAM,CAErF;AAED,qBAAa,cAAc;IACzB,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IACpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA4B;IAElD,YAAY,QAAQ,EAAE,OAAO,EAG5B;IAED,KAAK,CAAC,KAAK,EAAE,aAAa,GAAG,aAAa,CAqCzC;IAED,kBAAkB,CAAC,KAAK,EAAE,aAAa,GAAG,MAAM,EAAE,CAIjD;IAED,gBAAgB,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,iBAAiB,EAAE,CAkB3E;IAED,OAAO,CAAC,mBAAmB;CAe5B;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAqCzE"}
@@ -0,0 +1,269 @@
1
+ import { sha256Json } from "./canonical.js";
2
+ import { workflowValidatorOwnership } from "./workflow-validator-ownership.js";
3
+ const OPERATORS = new Set(["all", "equals", "in", "exists", "not"]);
4
+ export function composeDependencyHash(dependencies) {
5
+ return sha256Json(dependencies);
6
+ }
7
+ export class WorkflowEngine {
8
+ manifest;
9
+ nodes;
10
+ constructor(manifest) {
11
+ this.manifest = validateWorkflowManifest(manifest);
12
+ this.nodes = new Map(this.manifest.nodes.map((node) => [node.id, node]));
13
+ }
14
+ route(state) {
15
+ if (state.state !== undefined && this.manifest.terminalStates.includes(state.state)) {
16
+ return { currentNode: state.state, nextTask: null, ownerRole: null, blockers: [], terminal: true };
17
+ }
18
+ if (state.state !== undefined && this.manifest.blockedStates.includes(state.state)) {
19
+ const blocked = this.nodes.get("blocked");
20
+ return {
21
+ currentNode: state.state,
22
+ nextTask: null,
23
+ ownerRole: blocked?.ownerRole ?? null,
24
+ blockers: [state.state],
25
+ terminal: false,
26
+ };
27
+ }
28
+ const completed = new Set(state.completedNodes ?? []);
29
+ for (const node of this.manifest.nodes) {
30
+ if (node.kind === "terminal" || completed.has(node.id) || !evaluateCondition(node.condition, state)) {
31
+ continue;
32
+ }
33
+ const blockers = node.sourceDependencies.filter((dependency) => !this.dependencySatisfied(dependency, state, completed));
34
+ if (blockers.length === 0) {
35
+ return { currentNode: node.id, nextTask: node.id, ownerRole: node.ownerRole, blockers: [], terminal: false };
36
+ }
37
+ const hasActivePredecessor = this.manifest.edges.some((edge) => edge.to === node.id && completed.has(edge.from));
38
+ if (hasActivePredecessor || node === this.manifest.nodes[0]) {
39
+ return {
40
+ currentNode: node.id,
41
+ nextTask: null,
42
+ ownerRole: node.ownerRole,
43
+ blockers: blockers.sort(),
44
+ terminal: false,
45
+ };
46
+ }
47
+ }
48
+ return { currentNode: null, nextTask: null, ownerRole: null, blockers: ["no-eligible-node"], terminal: false };
49
+ }
50
+ activeValidatorIds(state) {
51
+ return this.manifest.nodes
52
+ .filter((node) => evaluateCondition(node.condition, state))
53
+ .flatMap(({ validators }) => validators);
54
+ }
55
+ invalidationPlan(changedNodeId, reason) {
56
+ const start = this.nodes.get(changedNodeId);
57
+ if (start === undefined) {
58
+ throw new Error(`Unknown workflow node ${changedNodeId}`);
59
+ }
60
+ const pending = [...start.invalidates];
61
+ const seen = new Set();
62
+ const plan = [];
63
+ while (pending.length > 0) {
64
+ const nodeId = pending.shift();
65
+ if (nodeId === undefined || seen.has(nodeId))
66
+ continue;
67
+ seen.add(nodeId);
68
+ const node = this.nodes.get(nodeId);
69
+ if (node === undefined)
70
+ throw new Error(`Unknown invalidation target ${nodeId}`);
71
+ plan.push({ nodeId, reason: `${changedNodeId}: ${reason}` });
72
+ pending.push(...node.invalidates);
73
+ }
74
+ return plan;
75
+ }
76
+ dependencySatisfied(dependency, state, completed) {
77
+ const root = dependency.split(".")[0] ?? dependency;
78
+ if (completed.has(root))
79
+ return true;
80
+ if (root.startsWith("gate-")) {
81
+ const gateState = state.gateStates?.[root];
82
+ return gateState === "approved" || gateState === "inherited";
83
+ }
84
+ if (dependency.startsWith("run-config.")) {
85
+ return getPath(state.run, dependency.slice("run-config.".length)) !== undefined;
86
+ }
87
+ return (getPath({ run: state.run, artifacts: state.artifacts }, `artifacts.${dependency}`) !== undefined ||
88
+ getPath({ run: state.run, artifacts: state.artifacts }, dependency) !== undefined);
89
+ }
90
+ }
91
+ export function validateWorkflowManifest(value) {
92
+ if (!isRecord(value) || !Array.isArray(value.nodes) || !Array.isArray(value.edges)) {
93
+ throw new Error("Workflow manifest requires nodes and edges");
94
+ }
95
+ const nodes = value.nodes.map(parseNode);
96
+ const ids = new Set();
97
+ const gates = new Set();
98
+ for (const node of nodes) {
99
+ if (ids.has(node.id))
100
+ throw new Error(`Duplicate workflow node ${node.id}`);
101
+ ids.add(node.id);
102
+ if (node.gateNumber !== undefined) {
103
+ if (node.gateNumber < 1 || node.gateNumber > 4 || gates.has(node.gateNumber))
104
+ throw new Error(`Invalid or duplicate gate ${node.gateNumber}`);
105
+ gates.add(node.gateNumber);
106
+ }
107
+ }
108
+ for (const node of nodes) {
109
+ for (const target of node.invalidates) {
110
+ if (!ids.has(target))
111
+ throw new Error(`Workflow node ${node.id} invalidates unknown node ${target}`);
112
+ }
113
+ }
114
+ if ([1, 2, 3, 4].some((gate) => !gates.has(gate)))
115
+ throw new Error("Workflow requires unique gates 1-4");
116
+ const edges = value.edges.map(parseEdge);
117
+ const returnRoutes = Array.isArray(value.returnRoutes) ? value.returnRoutes.map(parseEdge) : [];
118
+ for (const edge of [...edges, ...returnRoutes]) {
119
+ if (!ids.has(edge.from) || !ids.has(edge.to))
120
+ throw new Error(`Workflow edge references unknown node ${edge.from}->${edge.to}`);
121
+ }
122
+ assertAcyclic(ids, edges);
123
+ const tracks = new Set(nodes.flatMap((node) => conditionTrack(node.condition)));
124
+ if (!tracks.has("bicep") || !tracks.has("terraform"))
125
+ throw new Error("Workflow requires bicep and terraform track conditions");
126
+ const terminalStates = stringArray(value.terminalStates, "terminalStates");
127
+ const blockedStates = stringArray(value.blockedStates, "blockedStates");
128
+ if (terminalStates.length === 0 || blockedStates.length === 0)
129
+ throw new Error("Workflow requires terminal and blocked states");
130
+ return { nodes, edges, returnRoutes, terminalStates, blockedStates };
131
+ }
132
+ function parseNode(value) {
133
+ if (!isRecord(value))
134
+ throw new Error("Workflow node must be an object");
135
+ const condition = value.condition === undefined ? undefined : parseCondition(value.condition);
136
+ const validators = optionalStringArray(value.validators, "validators");
137
+ if (new Set(validators).size !== validators.length) {
138
+ throw new Error(`Duplicate workflow validator on node ${requiredString(value.id, "node id")}`);
139
+ }
140
+ for (const validator of validators) {
141
+ if (workflowValidatorOwnership(validator) === undefined) {
142
+ throw new Error(`Unknown workflow validator ${validator}`);
143
+ }
144
+ }
145
+ return {
146
+ id: requiredString(value.id, "node id"),
147
+ kind: requiredString(value.kind, "node kind"),
148
+ ownerRole: requiredString(value.ownerRole, "ownerRole"),
149
+ ...(value.gateNumber === undefined ? {} : { gateNumber: requiredInteger(value.gateNumber, "gateNumber") }),
150
+ ...(condition === undefined ? {} : { condition }),
151
+ sourceDependencies: optionalStringArray(value.sourceDependencies, "sourceDependencies"),
152
+ outputs: optionalStringArray(value.outputs, "outputs"),
153
+ validators,
154
+ invalidates: optionalStringArray(value.invalidates, "invalidates"),
155
+ };
156
+ }
157
+ function parseEdge(value) {
158
+ if (!isRecord(value))
159
+ throw new Error("Workflow edge must be an object");
160
+ const condition = value.condition === undefined ? undefined : parseCondition(value.condition);
161
+ return {
162
+ from: requiredString(value.from, "edge from"),
163
+ to: requiredString(value.to, "edge to"),
164
+ ...(condition === undefined ? {} : { condition }),
165
+ ...(value.fanout === true ? { fanout: true } : {}),
166
+ };
167
+ }
168
+ function parseCondition(value) {
169
+ if (!isRecord(value))
170
+ throw new Error("Workflow condition must be an object");
171
+ const keys = Object.keys(value);
172
+ if (keys.length !== 1 || !OPERATORS.has(keys[0] ?? ""))
173
+ throw new Error(`Unsupported workflow condition operator ${keys.join(",")}`);
174
+ const operator = keys[0];
175
+ if (operator === "all")
176
+ return { all: array(value.all, "all").map(parseCondition) };
177
+ if (operator === "not")
178
+ return { not: parseCondition(value.not) };
179
+ if (operator === "exists")
180
+ return { exists: parsePath(value.exists) };
181
+ const operands = array(value[operator ?? ""], operator ?? "condition");
182
+ if (operands.length !== 2)
183
+ throw new Error(`${operator} requires two operands`);
184
+ const path = parsePath(operands[0]);
185
+ if (operator === "in")
186
+ return { in: [path, array(operands[1], "in values")] };
187
+ return { equals: [path, operands[1]] };
188
+ }
189
+ function evaluateCondition(condition, state) {
190
+ if (condition === undefined)
191
+ return true;
192
+ if ("all" in condition)
193
+ return condition.all.every((item) => evaluateCondition(item, state));
194
+ if ("not" in condition)
195
+ return !evaluateCondition(condition.not, state);
196
+ if ("exists" in condition)
197
+ return getPath(state, condition.exists.path) !== undefined;
198
+ if ("equals" in condition)
199
+ return getPath(state, condition.equals[0].path) === condition.equals[1];
200
+ return condition.in[1].includes(getPath(state, condition.in[0].path));
201
+ }
202
+ function getPath(value, path) {
203
+ return path.split(".").reduce((current, key) => (isRecord(current) ? current[key] : undefined), value);
204
+ }
205
+ function assertAcyclic(ids, edges) {
206
+ const incoming = new Map([...ids].map((id) => [id, 0]));
207
+ const outgoing = new Map([...ids].map((id) => [id, []]));
208
+ for (const edge of edges) {
209
+ incoming.set(edge.to, (incoming.get(edge.to) ?? 0) + 1);
210
+ outgoing.get(edge.from)?.push(edge.to);
211
+ }
212
+ const pending = [...ids].filter((id) => incoming.get(id) === 0);
213
+ let visited = 0;
214
+ while (pending.length > 0) {
215
+ const id = pending.shift();
216
+ if (id === undefined)
217
+ break;
218
+ visited += 1;
219
+ for (const target of outgoing.get(id) ?? []) {
220
+ const count = (incoming.get(target) ?? 0) - 1;
221
+ incoming.set(target, count);
222
+ if (count === 0)
223
+ pending.push(target);
224
+ }
225
+ }
226
+ if (visited !== ids.size)
227
+ throw new Error("Workflow contains a cycle outside declared return routes");
228
+ }
229
+ function conditionTrack(condition) {
230
+ if (condition === undefined)
231
+ return [];
232
+ if ("equals" in condition && condition.equals[0].path === "run.iacTool" && typeof condition.equals[1] === "string")
233
+ return [condition.equals[1]];
234
+ if ("all" in condition)
235
+ return condition.all.flatMap(conditionTrack);
236
+ if ("not" in condition)
237
+ return conditionTrack(condition.not);
238
+ return [];
239
+ }
240
+ function isRecord(value) {
241
+ return value !== null && typeof value === "object" && !Array.isArray(value);
242
+ }
243
+ function requiredString(value, name) {
244
+ if (typeof value !== "string" || value.length === 0)
245
+ throw new Error(`${name} must be a string`);
246
+ return value;
247
+ }
248
+ function requiredInteger(value, name) {
249
+ if (!Number.isInteger(value))
250
+ throw new Error(`${name} must be an integer`);
251
+ return value;
252
+ }
253
+ function array(value, name) {
254
+ if (!Array.isArray(value))
255
+ throw new Error(`${name} must be an array`);
256
+ return value;
257
+ }
258
+ function stringArray(value, name) {
259
+ return array(value, name).map((item) => requiredString(item, name));
260
+ }
261
+ function optionalStringArray(value, name) {
262
+ return value === undefined ? [] : stringArray(value, name);
263
+ }
264
+ function parsePath(value) {
265
+ if (!isRecord(value))
266
+ throw new Error("Condition path must be an object");
267
+ return { path: requiredString(value.path, "condition path") };
268
+ }
269
+ //# sourceMappingURL=workflow-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-engine.js","sourceRoot":"","sources":["../src/workflow-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export type WorkflowValidatorExecution = "schema" | "inline" | "capability" | "review" | "external-command";
2
+ export type WorkflowValidatorBoundary = "task-output" | "review" | "external-evidence" | "validation" | "gate" | "preview" | "deploy" | "inventory" | "diagnosis" | "quality" | "terminal";
3
+ export interface WorkflowValidatorOwnership {
4
+ readonly id: string;
5
+ readonly owner: "@apexops/kernel" | "@apexops/capabilities" | "@apexops/cli";
6
+ readonly entrypoint: string;
7
+ readonly execution: WorkflowValidatorExecution;
8
+ readonly boundary: WorkflowValidatorBoundary;
9
+ }
10
+ export declare const WORKFLOW_VALIDATOR_OWNERSHIP: ReadonlyMap<string, WorkflowValidatorOwnership>;
11
+ export declare function workflowValidatorOwnership(id: string): WorkflowValidatorOwnership | undefined;
12
+ //# sourceMappingURL=workflow-validator-ownership.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-validator-ownership.d.ts","sourceRoot":"","sources":["../src/workflow-validator-ownership.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,0BAA0B,GAAG,QAAQ,GAAG,QAAQ,GAAG,YAAY,GAAG,QAAQ,GAAG,kBAAkB,CAAC;AAC5G,MAAM,MAAM,yBAAyB,GACjC,aAAa,GACb,QAAQ,GACR,mBAAmB,GACnB,YAAY,GACZ,MAAM,GACN,SAAS,GACT,QAAQ,GACR,WAAW,GACX,WAAW,GACX,SAAS,GACT,UAAU,CAAC;AAEf,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,iBAAiB,GAAG,uBAAuB,GAAG,cAAc,CAAC;IAC7E,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,0BAA0B,CAAC;IAC/C,QAAQ,CAAC,QAAQ,EAAE,yBAAyB,CAAC;CAC9C;AAqKD,eAAO,MAAM,4BAA4B,EAAE,WAAW,CAAC,MAAM,EAAE,0BAA0B,CAExF,CAAC;AAMF,wBAAgB,0BAA0B,CAAC,EAAE,EAAE,MAAM,GAAG,0BAA0B,GAAG,SAAS,CAE7F"}
@@ -0,0 +1,163 @@
1
+ const ownershipGroups = [
2
+ {
3
+ ids: [
4
+ "schema:architecture-v1",
5
+ "schema:governance-constraints-v1",
6
+ "schema:iac-binding-v1",
7
+ "schema:implementation-intent-v1",
8
+ "schema:policy-property-map-v1",
9
+ "schema:requirements-v1",
10
+ "schema:workload-decision-manifest-v1",
11
+ ],
12
+ owner: "@apexops/cli",
13
+ entrypoint: "ApexService.validateTaskValidators",
14
+ execution: "schema",
15
+ boundary: "task-output",
16
+ },
17
+ {
18
+ ids: [
19
+ "business:bicep-binding-coverage",
20
+ "business:binding-track-match",
21
+ "business:cost-arithmetic",
22
+ "business:dependency-acyclic",
23
+ "business:governance-completeness",
24
+ "business:governance-freshness",
25
+ "business:plan-source-coverage",
26
+ "business:policy-effect-coverage",
27
+ "business:requirements-completeness",
28
+ "business:requirements-traceability",
29
+ "business:workload-decision-manifest-coverage",
30
+ "business:terraform-binding-coverage",
31
+ ],
32
+ owner: "@apexops/cli",
33
+ entrypoint: "ApexService.validateTaskValidators",
34
+ execution: "inline",
35
+ boundary: "task-output",
36
+ },
37
+ {
38
+ ids: ["business:availability-current"],
39
+ owner: "@apexops/cli",
40
+ entrypoint: "ApexService.validateTaskValidators",
41
+ execution: "capability",
42
+ boundary: "external-evidence",
43
+ },
44
+ {
45
+ ids: ["business:logical-resource-parity", "business:policy-property-map", "business:security-baseline"],
46
+ owner: "@apexops/capabilities",
47
+ entrypoint: "validateGeneratedTree",
48
+ execution: "capability",
49
+ boundary: "validation",
50
+ },
51
+ {
52
+ ids: [
53
+ "review:architecture-comprehensive",
54
+ "review:governance-reconciliation",
55
+ "review:plan-comprehensive",
56
+ "review:requirements-comprehensive",
57
+ ],
58
+ owner: "@apexops/cli",
59
+ entrypoint: "ApexService.validateTaskValidators",
60
+ execution: "review",
61
+ boundary: "review",
62
+ },
63
+ {
64
+ ids: ["gate:architecture-cost-governance-ready", "gate:implementation-plan-ready", "gate:requirements-ready"],
65
+ owner: "@apexops/cli",
66
+ entrypoint: "ApexService.validateGateValidators",
67
+ execution: "inline",
68
+ boundary: "gate",
69
+ },
70
+ {
71
+ ids: ["gate:approval-binding-complete", "gate:no-hard-blockers", "gate:preview-current"],
72
+ owner: "@apexops/cli",
73
+ entrypoint: "ApexService.validateGateValidators",
74
+ execution: "inline",
75
+ boundary: "gate",
76
+ },
77
+ {
78
+ ids: ["bicep:build", "bicep:format", "bicep:lint"],
79
+ owner: "@apexops/capabilities",
80
+ entrypoint: "validateGeneratedTree",
81
+ execution: "external-command",
82
+ boundary: "validation",
83
+ },
84
+ {
85
+ ids: ["terraform:format", "terraform:init-backend-false", "terraform:validate"],
86
+ owner: "@apexops/capabilities",
87
+ entrypoint: "validateGeneratedTree",
88
+ execution: "external-command",
89
+ boundary: "validation",
90
+ },
91
+ {
92
+ ids: ["terraform:saved-plan-binding"],
93
+ owner: "@apexops/capabilities",
94
+ entrypoint: "NativeTerraformProvider.previewApply",
95
+ execution: "capability",
96
+ boundary: "preview",
97
+ },
98
+ {
99
+ ids: ["preview:coverage", "preview:freshness", "preview:hash-bindings", "preview:policy-precheck"],
100
+ owner: "@apexops/cli",
101
+ entrypoint: "ApexService.validatePreviewValidators",
102
+ execution: "inline",
103
+ boundary: "preview",
104
+ },
105
+ {
106
+ ids: ["deploy:exact-approved-operation", "deploy:stale-writer-rejection"],
107
+ owner: "@apexops/cli",
108
+ entrypoint: "ApexService.validateDeployValidators",
109
+ execution: "inline",
110
+ boundary: "deploy",
111
+ },
112
+ {
113
+ ids: ["deploy:bicep-stack-ownership"],
114
+ owner: "@apexops/capabilities",
115
+ entrypoint: "NativeBicepProvider.apply",
116
+ execution: "capability",
117
+ boundary: "deploy",
118
+ },
119
+ {
120
+ ids: ["deploy:exact-saved-plan", "deploy:state-lineage-and-serial"],
121
+ owner: "@apexops/capabilities",
122
+ entrypoint: "NativeTerraformProvider.apply",
123
+ execution: "capability",
124
+ boundary: "deploy",
125
+ },
126
+ {
127
+ ids: ["inventory:eventual-consistency-reconciled", "inventory:secret-free", "inventory:source-coverage"],
128
+ owner: "@apexops/cli",
129
+ entrypoint: "ApexService.validateInventoryValidators",
130
+ execution: "inline",
131
+ boundary: "inventory",
132
+ },
133
+ {
134
+ ids: ["diagnosis:read-only", "diagnosis:secret-free"],
135
+ owner: "@apexops/cli",
136
+ entrypoint: "ApexService.validateTaskValidators",
137
+ execution: "inline",
138
+ boundary: "diagnosis",
139
+ },
140
+ {
141
+ ids: ["quality:no-subjective-deterministic-claims", "quality:scorecard-decidable"],
142
+ owner: "@apexops/cli",
143
+ entrypoint: "ApexService.validateTaskValidators",
144
+ execution: "inline",
145
+ boundary: "quality",
146
+ },
147
+ {
148
+ ids: ["terminal:run-evidence-complete"],
149
+ owner: "@apexops/cli",
150
+ entrypoint: "ApexService.ensureTerminalCompletion",
151
+ execution: "inline",
152
+ boundary: "terminal",
153
+ },
154
+ ];
155
+ const ownershipEntries = ownershipGroups.flatMap(({ ids, ...ownership }) => ids.map((id) => ({ id, ...ownership })));
156
+ export const WORKFLOW_VALIDATOR_OWNERSHIP = new Map(ownershipEntries.map((entry) => [entry.id, entry]));
157
+ if (WORKFLOW_VALIDATOR_OWNERSHIP.size !== ownershipEntries.length) {
158
+ throw new Error("Workflow validator ownership contains duplicate IDs");
159
+ }
160
+ export function workflowValidatorOwnership(id) {
161
+ return WORKFLOW_VALIDATOR_OWNERSHIP.get(id);
162
+ }
163
+ //# sourceMappingURL=workflow-validator-ownership.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workflow-validator-ownership.js","sourceRoot":"","sources":["../src/workflow-validator-ownership.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ import type { ProjectId, RunId } from "@apexops/contracts";
2
+ import { LeaseStore, type Clock } from "./lease-store.js";
3
+ import { type RunRepositoryOptions } from "./run-repository.js";
4
+ export interface WriterTransferClaim {
5
+ projectId: ProjectId;
6
+ runId: RunId;
7
+ repository: string;
8
+ branch: string;
9
+ commit: string;
10
+ workflowId: string;
11
+ sender: string;
12
+ recipient: string;
13
+ approvalEnvironment?: string;
14
+ nextEpoch: number;
15
+ expiresAt: string;
16
+ }
17
+ export interface CreateTransferInput extends Omit<WriterTransferClaim, "nextEpoch" | "expiresAt"> {
18
+ currentEpoch: number;
19
+ currentGitHead: string;
20
+ ttlMs: number;
21
+ eventId: string;
22
+ }
23
+ export interface AcceptTransferInput {
24
+ claimHash: string;
25
+ recipient: string;
26
+ currentGitHead: string;
27
+ eventId: string;
28
+ }
29
+ export interface ReclaimFailedTransferInput {
30
+ claimHash: string;
31
+ sender: string;
32
+ expectedRecipient: string;
33
+ failedCandidateCommit: string;
34
+ workflowRunId: number;
35
+ workflowStatus: "completed";
36
+ workflowConclusion: "failure";
37
+ importAuthorityConclusion: "skipped";
38
+ deployConclusion: "skipped";
39
+ ttlMs: number;
40
+ eventId: string;
41
+ }
42
+ export interface WriterOwnership {
43
+ ownerId: string;
44
+ ownerEpoch: number;
45
+ claimHash?: string;
46
+ previousOwnerId?: string;
47
+ previousOwnerEpoch?: number;
48
+ repository: string;
49
+ branch: string;
50
+ commit: string;
51
+ workflowId: string;
52
+ approvalEnvironment?: string;
53
+ acceptedAt: string;
54
+ }
55
+ export declare class WriterTransferStore {
56
+ private readonly clock;
57
+ private readonly claimDirectory;
58
+ private readonly ownershipPath;
59
+ private readonly journal;
60
+ private readonly runs;
61
+ private readonly leases;
62
+ constructor(runDirectory: string, clock?: Clock, repositoryOptions?: RunRepositoryOptions);
63
+ leaseStore(): LeaseStore;
64
+ create(input: CreateTransferInput): Promise<{
65
+ claim: WriterTransferClaim;
66
+ hash: string;
67
+ }>;
68
+ accept(input: AcceptTransferInput): Promise<WriterOwnership>;
69
+ reclaimFailedTransfer(input: ReclaimFailedTransferInput): Promise<void>;
70
+ currentOwnership(): Promise<WriterOwnership | null>;
71
+ currentActiveOwnership(): Promise<WriterOwnership | null>;
72
+ hasPendingTransfer(): Promise<boolean>;
73
+ proveOneHopPostPreviewLineage(previewHash: string, previewOwnerEpoch: number): Promise<string | null>;
74
+ proveOneHopPostApprovalLineage(previewHash: string, previewOwnerEpoch: number, approvalHash: string): Promise<string | null>;
75
+ private proveOneHopLineage;
76
+ }
77
+ export type WriterTransferProtocol = Pick<WriterTransferStore, "create" | "accept" | "currentOwnership" | "currentActiveOwnership" | "hasPendingTransfer" | "proveOneHopPostPreviewLineage" | "proveOneHopPostApprovalLineage">;
78
+ //# sourceMappingURL=writer-transfer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer-transfer.d.ts","sourceRoot":"","sources":["../src/writer-transfer.ts"],"names":[],"mappings":"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"}