@revisium/orchestrator 0.0.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 (176) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +20 -0
  3. package/bin/revo.js +2 -0
  4. package/control-plane/bootstrap.config.json +931 -0
  5. package/dist/app.module.js +28 -0
  6. package/dist/app.module.js.map +1 -0
  7. package/dist/cli/commands/bootstrap.js +39 -0
  8. package/dist/cli/commands/bootstrap.js.map +1 -0
  9. package/dist/cli/commands/dev.js +143 -0
  10. package/dist/cli/commands/dev.js.map +1 -0
  11. package/dist/cli/commands/inbox.js +288 -0
  12. package/dist/cli/commands/inbox.js.map +1 -0
  13. package/dist/cli/commands/mcp.js +16 -0
  14. package/dist/cli/commands/mcp.js.map +1 -0
  15. package/dist/cli/commands/playbook.js +74 -0
  16. package/dist/cli/commands/playbook.js.map +1 -0
  17. package/dist/cli/commands/poll-workflow-state.js +144 -0
  18. package/dist/cli/commands/poll-workflow-state.js.map +1 -0
  19. package/dist/cli/commands/revisium-context.js +23 -0
  20. package/dist/cli/commands/revisium-context.js.map +1 -0
  21. package/dist/cli/commands/revisium-helpers.js +61 -0
  22. package/dist/cli/commands/revisium-helpers.js.map +1 -0
  23. package/dist/cli/commands/revisium.js +89 -0
  24. package/dist/cli/commands/revisium.js.map +1 -0
  25. package/dist/cli/commands/run.js +426 -0
  26. package/dist/cli/commands/run.js.map +1 -0
  27. package/dist/cli/commands/work.js +149 -0
  28. package/dist/cli/commands/work.js.map +1 -0
  29. package/dist/cli/config.js +2 -0
  30. package/dist/cli/config.js.map +1 -0
  31. package/dist/cli/index.js +32 -0
  32. package/dist/cli/index.js.map +1 -0
  33. package/dist/cli/live-guard.js +49 -0
  34. package/dist/cli/live-guard.js.map +1 -0
  35. package/dist/cli/needs-host.js +78 -0
  36. package/dist/cli/needs-host.js.map +1 -0
  37. package/dist/cli/program.js +37 -0
  38. package/dist/cli/program.js.map +1 -0
  39. package/dist/config.js +102 -0
  40. package/dist/config.js.map +1 -0
  41. package/dist/control-plane/client-transport.js +146 -0
  42. package/dist/control-plane/client-transport.js.map +1 -0
  43. package/dist/control-plane/data-access.js +99 -0
  44. package/dist/control-plane/data-access.js.map +1 -0
  45. package/dist/control-plane/definitions.js +120 -0
  46. package/dist/control-plane/definitions.js.map +1 -0
  47. package/dist/control-plane/errors.js +13 -0
  48. package/dist/control-plane/errors.js.map +1 -0
  49. package/dist/control-plane/inbox.js +261 -0
  50. package/dist/control-plane/inbox.js.map +1 -0
  51. package/dist/control-plane/index.js +6 -0
  52. package/dist/control-plane/index.js.map +1 -0
  53. package/dist/control-plane/json-fields.js +68 -0
  54. package/dist/control-plane/json-fields.js.map +1 -0
  55. package/dist/control-plane/resolve-cwd.js +75 -0
  56. package/dist/control-plane/resolve-cwd.js.map +1 -0
  57. package/dist/control-plane/steps.js +381 -0
  58. package/dist/control-plane/steps.js.map +1 -0
  59. package/dist/control-plane/tables.js +13 -0
  60. package/dist/control-plane/tables.js.map +1 -0
  61. package/dist/control-plane/versioned-meaning.js +53 -0
  62. package/dist/control-plane/versioned-meaning.js.map +1 -0
  63. package/dist/engine/dbos.module.js +18 -0
  64. package/dist/engine/dbos.module.js.map +1 -0
  65. package/dist/engine/dbos.service.js +296 -0
  66. package/dist/engine/dbos.service.js.map +1 -0
  67. package/dist/engine/ensure-postgres.js +80 -0
  68. package/dist/engine/ensure-postgres.js.map +1 -0
  69. package/dist/engine/types.js +2 -0
  70. package/dist/engine/types.js.map +1 -0
  71. package/dist/host/ensure-revisium.js +269 -0
  72. package/dist/host/ensure-revisium.js.map +1 -0
  73. package/dist/host/host.lifecycle.js +75 -0
  74. package/dist/host/host.lifecycle.js.map +1 -0
  75. package/dist/mcp/mcp-capabilities.js +47 -0
  76. package/dist/mcp/mcp-capabilities.js.map +1 -0
  77. package/dist/mcp/mcp-facade.service.js +130 -0
  78. package/dist/mcp/mcp-facade.service.js.map +1 -0
  79. package/dist/mcp/mcp-stdio.service.js +48 -0
  80. package/dist/mcp/mcp-stdio.service.js.map +1 -0
  81. package/dist/mcp/mcp-tools.js +264 -0
  82. package/dist/mcp/mcp-tools.js.map +1 -0
  83. package/dist/mcp/mcp.module.js +21 -0
  84. package/dist/mcp/mcp.module.js.map +1 -0
  85. package/dist/package-info.js +10 -0
  86. package/dist/package-info.js.map +1 -0
  87. package/dist/pipeline/await-human.js +62 -0
  88. package/dist/pipeline/await-human.js.map +1 -0
  89. package/dist/pipeline/develop-task.workflow.js +497 -0
  90. package/dist/pipeline/develop-task.workflow.js.map +1 -0
  91. package/dist/pipeline/pipeline.module.js +34 -0
  92. package/dist/pipeline/pipeline.module.js.map +1 -0
  93. package/dist/playbook/catalog-loader.js +145 -0
  94. package/dist/playbook/catalog-loader.js.map +1 -0
  95. package/dist/playbook/errors.js +14 -0
  96. package/dist/playbook/errors.js.map +1 -0
  97. package/dist/playbook/import-mapper.js +186 -0
  98. package/dist/playbook/import-mapper.js.map +1 -0
  99. package/dist/playbook/manifest.js +60 -0
  100. package/dist/playbook/manifest.js.map +1 -0
  101. package/dist/playbook/playbook-installer.js +51 -0
  102. package/dist/playbook/playbook-installer.js.map +1 -0
  103. package/dist/playbook/prompt-composer.js +34 -0
  104. package/dist/playbook/prompt-composer.js.map +1 -0
  105. package/dist/playbook/source-resolver.js +105 -0
  106. package/dist/playbook/source-resolver.js.map +1 -0
  107. package/dist/poller/pr-readiness-core.js +656 -0
  108. package/dist/poller/pr-readiness-core.js.map +1 -0
  109. package/dist/poller/pr-readiness.js +91 -0
  110. package/dist/poller/pr-readiness.js.map +1 -0
  111. package/dist/revisium/inbox.service.js +67 -0
  112. package/dist/revisium/inbox.service.js.map +1 -0
  113. package/dist/revisium/playbooks.service.js +99 -0
  114. package/dist/revisium/playbooks.service.js.map +1 -0
  115. package/dist/revisium/revisium.module.js +55 -0
  116. package/dist/revisium/revisium.module.js.map +1 -0
  117. package/dist/revisium/roles.service.js +79 -0
  118. package/dist/revisium/roles.service.js.map +1 -0
  119. package/dist/revisium/run.service.js +182 -0
  120. package/dist/revisium/run.service.js.map +1 -0
  121. package/dist/revisium/tokens.js +7 -0
  122. package/dist/revisium/tokens.js.map +1 -0
  123. package/dist/run/append-event.js +112 -0
  124. package/dist/run/append-event.js.map +1 -0
  125. package/dist/run/cancel-run.js +47 -0
  126. package/dist/run/cancel-run.js.map +1 -0
  127. package/dist/run/create-run.js +208 -0
  128. package/dist/run/create-run.js.map +1 -0
  129. package/dist/run/fail-run.js +20 -0
  130. package/dist/run/fail-run.js.map +1 -0
  131. package/dist/run/inspect-run.js +287 -0
  132. package/dist/run/inspect-run.js.map +1 -0
  133. package/dist/run/terminal-run-status.js +45 -0
  134. package/dist/run/terminal-run-status.js.map +1 -0
  135. package/dist/runners/claude-code.service.js +48 -0
  136. package/dist/runners/claude-code.service.js.map +1 -0
  137. package/dist/runners/gh-identity.js +108 -0
  138. package/dist/runners/gh-identity.js.map +1 -0
  139. package/dist/runners/integrator.js +417 -0
  140. package/dist/runners/integrator.js.map +1 -0
  141. package/dist/runners/runner.module.js +40 -0
  142. package/dist/runners/runner.module.js.map +1 -0
  143. package/dist/runners/tokens.js +7 -0
  144. package/dist/runners/tokens.js.map +1 -0
  145. package/dist/task-control-plane/pr-readiness.service.js +33 -0
  146. package/dist/task-control-plane/pr-readiness.service.js.map +1 -0
  147. package/dist/task-control-plane/task-control-plane-api.service.js +440 -0
  148. package/dist/task-control-plane/task-control-plane-api.service.js.map +1 -0
  149. package/dist/task-control-plane/task-control-plane.module.js +23 -0
  150. package/dist/task-control-plane/task-control-plane.module.js.map +1 -0
  151. package/dist/worker/build-context.js +39 -0
  152. package/dist/worker/build-context.js.map +1 -0
  153. package/dist/worker/claude-code-runner.js +135 -0
  154. package/dist/worker/claude-code-runner.js.map +1 -0
  155. package/dist/worker/git-worktree-manager.js +84 -0
  156. package/dist/worker/git-worktree-manager.js.map +1 -0
  157. package/dist/worker/loop.js +122 -0
  158. package/dist/worker/loop.js.map +1 -0
  159. package/dist/worker/process-executor.js +62 -0
  160. package/dist/worker/process-executor.js.map +1 -0
  161. package/dist/worker/result-envelope.js +134 -0
  162. package/dist/worker/result-envelope.js.map +1 -0
  163. package/dist/worker/runner-dispatch.js +20 -0
  164. package/dist/worker/runner-dispatch.js.map +1 -0
  165. package/dist/worker/runner.js +2 -0
  166. package/dist/worker/runner.js.map +1 -0
  167. package/dist/worker/script-runner.js +28 -0
  168. package/dist/worker/script-runner.js.map +1 -0
  169. package/dist/worker/stub-runner.js +59 -0
  170. package/dist/worker/stub-runner.js.map +1 -0
  171. package/dist/worker/worker-id.js +18 -0
  172. package/dist/worker/worker-id.js.map +1 -0
  173. package/dist/worker/worktree-manager.js +7 -0
  174. package/dist/worker/worktree-manager.js.map +1 -0
  175. package/package.json +66 -0
  176. package/revisium.config.json +10 -0
@@ -0,0 +1,381 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { ControlPlaneError } from './errors.js';
3
+ // ─── internal helpers ────────────────────────────────────────
4
+ const CLAIM_CAP = 500;
5
+ // Per-step attempt fetch limit during crash recovery; N+1 at startup is acceptable at this scale.
6
+ const RECOVERY_ATTEMPT_CAP = 100;
7
+ export function compactStamp(date) {
8
+ const pad = (v, l = 2) => String(v).padStart(l, '0');
9
+ return [
10
+ date.getUTCFullYear(),
11
+ pad(date.getUTCMonth() + 1),
12
+ pad(date.getUTCDate()),
13
+ 'T',
14
+ pad(date.getUTCHours()),
15
+ pad(date.getUTCMinutes()),
16
+ pad(date.getUTCSeconds()),
17
+ pad(date.getUTCMilliseconds(), 3),
18
+ 'Z',
19
+ ].join('');
20
+ }
21
+ function clockNow(opts) {
22
+ return opts?.now ?? new Date();
23
+ }
24
+ function clockSuffix(opts) {
25
+ return opts?.idSuffix ?? randomUUID().replaceAll('-', '').slice(0, 8);
26
+ }
27
+ // Non-cryptographic FNV-1a 64-bit hash → 16 hex chars. Used to derive a child step id that is
28
+ // DETERMINISTIC (same parent + index → same id, so a crash-retry is idempotent) yet BOUNDED in
29
+ // length. Revisium rowIds max out at 64 chars; concatenating the parent id per level
30
+ // (`${parent}_ch_${i}`) overflowed on deep chains. Not crypto, so it does not trip the
31
+ // weak-hash security hotspot.
32
+ export function fnv1a64Hex(input) {
33
+ let hash = 0xcbf29ce484222325n;
34
+ const prime = 0x100000001b3n;
35
+ const mask = 0xffffffffffffffffn;
36
+ for (let i = 0; i < input.length; i++) {
37
+ hash ^= BigInt(input.codePointAt(i) ?? 0);
38
+ hash = (hash * prime) & mask;
39
+ }
40
+ return hash.toString(16).padStart(16, '0');
41
+ }
42
+ export function toStr(v) {
43
+ if (typeof v === 'string')
44
+ return v;
45
+ if (typeof v === 'number')
46
+ return String(v);
47
+ return '';
48
+ }
49
+ function mapStep(row) {
50
+ const d = row.data;
51
+ return {
52
+ id: row.rowId,
53
+ taskId: toStr(d.task_id),
54
+ runId: toStr(d.run_id),
55
+ role: toStr(d.role),
56
+ kind: toStr(d.kind),
57
+ status: toStr(d.status),
58
+ input: d.input ?? null,
59
+ output: d.output ?? null,
60
+ modelProfile: toStr(d.model_profile),
61
+ runAfter: toStr(d.run_after),
62
+ attemptCount: Number(d.attempt_count ?? 0),
63
+ maxAttempts: Number(d.max_attempts ?? 3),
64
+ priority: Number(d.priority ?? 0),
65
+ leaseOwner: toStr(d.lease_owner),
66
+ leaseExpiresAt: toStr(d.lease_expires_at),
67
+ deadReason: toStr(d.dead_reason),
68
+ };
69
+ }
70
+ function compareByPriorityThenAge(a, b) {
71
+ const pa = Number(a.data.priority ?? 0);
72
+ const pb = Number(b.data.priority ?? 0);
73
+ if (pb !== pa)
74
+ return pb - pa;
75
+ const ca = toStr(a.data.created_at);
76
+ const cb = toStr(b.data.created_at);
77
+ if (ca < cb)
78
+ return -1;
79
+ if (ca > cb)
80
+ return 1;
81
+ return 0;
82
+ }
83
+ function backoffRunAfter(t, attemptCount) {
84
+ const delayMs = 30_000 * Math.pow(2, attemptCount);
85
+ return new Date(t.getTime() + delayMs).toISOString();
86
+ }
87
+ // ─── exported verbs ──────────────────────────────────────────
88
+ // MVP: single-worker read-then-write is acceptable; atomic claim belongs only here later.
89
+ export async function claimNextStep(da, workerId, roles, opts) {
90
+ const t = clockNow(opts);
91
+ const nowIso = t.toISOString();
92
+ const leaseTtlMs = opts?.leaseTtlMs ?? 30_000;
93
+ const leaseExpiresAt = new Date(t.getTime() + leaseTtlMs).toISOString();
94
+ // Server-side: filter status=ready AND role∈roles, sort by priority desc then createdAt asc.
95
+ // WORKAROUND: JsonFilterDto.equals is typed as { [key: string]: unknown } but accepts scalar
96
+ // strings at runtime; the @revisium/client JSON-path scalar-equality type gap requires the cast.
97
+ // run_after <= now CANNOT be pushed server-side: JsonFilterDto.lte is typed as number only and
98
+ // has no string/date counterpart. The in-process filter below is the authoritative gate, bounded
99
+ // by CLAIM_CAP so future-scheduled steps cannot exhaust the cap if they accumulate.
100
+ // In-process: re-apply all predicates for correctness against fake/unconstrained transports.
101
+ const rows = await da.listRows('steps', {
102
+ first: CLAIM_CAP,
103
+ where: {
104
+ AND: [
105
+ { data: { path: 'status', equals: 'ready' } },
106
+ { OR: roles.map((r) => ({ data: { path: 'role', equals: r } })) },
107
+ ],
108
+ },
109
+ orderBy: [
110
+ { field: 'data', direction: 'desc', path: 'priority', type: 'int' },
111
+ { field: 'createdAt', direction: 'asc' },
112
+ ],
113
+ });
114
+ const candidateRow = rows
115
+ .filter((row) => {
116
+ const d = row.data;
117
+ return (toStr(d.status) === 'ready' &&
118
+ roles.includes(toStr(d.role)) &&
119
+ (toStr(d.run_after) === '' || toStr(d.run_after) <= nowIso));
120
+ })
121
+ .sort(compareByPriorityThenAge)
122
+ .at(0);
123
+ if (!candidateRow)
124
+ return null;
125
+ const candidate = mapStep(candidateRow);
126
+ await da.patchRow('steps', candidate.id, [
127
+ { op: 'replace', path: 'status', value: 'claimed' },
128
+ { op: 'replace', path: 'lease_owner', value: workerId },
129
+ { op: 'replace', path: 'lease_expires_at', value: leaseExpiresAt },
130
+ { op: 'replace', path: 'updated_at', value: nowIso },
131
+ ]);
132
+ return { ...candidate, status: 'claimed', leaseOwner: workerId, leaseExpiresAt };
133
+ }
134
+ export async function startAttempt(da, step, opts) {
135
+ const t = clockNow(opts);
136
+ const nowIso = t.toISOString();
137
+ const sfx = clockSuffix(opts);
138
+ const st = compactStamp(t);
139
+ const attemptId = `attempt_${st}_${sfx}`;
140
+ const idempotencyKey = `idem_${st}_${sfx}`;
141
+ // Attempt row is written before step status flips to 'running'.
142
+ await da.createRow('attempts', attemptId, {
143
+ id: attemptId,
144
+ step_id: step.id,
145
+ run_id: step.runId,
146
+ worker_id: opts.workerId,
147
+ attempt_no: step.attemptCount + 1,
148
+ status: 'running',
149
+ idempotency_key: idempotencyKey,
150
+ model_profile: opts.modelProfile ?? step.modelProfile,
151
+ input_tokens: 0,
152
+ output_tokens: 0,
153
+ lesson: '',
154
+ error: '',
155
+ started_at: nowIso,
156
+ finished_at: '',
157
+ });
158
+ // Increment attempt_count here so crash recovery (recoverInFlight) sees the correct value
159
+ // even when failStep is never called. failStep reads the same derived value so no double-count.
160
+ await da.patchRow('steps', step.id, [
161
+ { op: 'replace', path: 'status', value: 'running' },
162
+ { op: 'replace', path: 'attempt_count', value: step.attemptCount + 1 },
163
+ { op: 'replace', path: 'updated_at', value: nowIso },
164
+ ]);
165
+ return { attemptId, idempotencyKey };
166
+ }
167
+ export async function writeResult(da, step, attemptId, output, costs, opts) {
168
+ const t = clockNow(opts);
169
+ const nowIso = t.toISOString();
170
+ const sfx = clockSuffix(opts);
171
+ const st = compactStamp(t);
172
+ // 1. Close attempt
173
+ await da.patchRow('attempts', attemptId, [
174
+ { op: 'replace', path: 'status', value: 'succeeded' },
175
+ { op: 'replace', path: 'finished_at', value: nowIso },
176
+ ]);
177
+ // 2. Append event
178
+ await da.createRow('events', `event_${st}_step-succeeded_${sfx}`, {
179
+ id: `event_${st}_step-succeeded_${sfx}`,
180
+ run_id: step.runId,
181
+ task_id: step.taskId,
182
+ step_id: step.id,
183
+ type: 'step_succeeded',
184
+ payload: { attempt_id: attemptId },
185
+ actor: 'orchestrator',
186
+ created_at: nowIso,
187
+ });
188
+ // 3. Append cost rows
189
+ for (let i = 0; i < costs.length; i++) {
190
+ const cost = costs[i];
191
+ if (!cost)
192
+ continue;
193
+ await da.createRow('cost_ledger', `cost_${st}_${sfx}_${i}`, {
194
+ id: `cost_${st}_${sfx}_${i}`,
195
+ run_id: step.runId,
196
+ step_id: step.id,
197
+ attempt_id: attemptId,
198
+ model_profile: cost.modelProfile,
199
+ input_tokens: cost.inputTokens,
200
+ output_tokens: cost.outputTokens,
201
+ cost_amount: cost.costAmount,
202
+ currency: cost.currency ?? 'USD',
203
+ recorded_at: nowIso,
204
+ });
205
+ }
206
+ // 4. Last: flip step status to succeeded, clear lease so terminal state is not misleading
207
+ await da.patchRow('steps', step.id, [
208
+ { op: 'replace', path: 'status', value: 'succeeded' },
209
+ { op: 'replace', path: 'output', value: output },
210
+ { op: 'replace', path: 'lease_owner', value: '' },
211
+ { op: 'replace', path: 'lease_expires_at', value: '' },
212
+ { op: 'replace', path: 'updated_at', value: nowIso },
213
+ ]);
214
+ }
215
+ export async function createSteps(da, steps, opts) {
216
+ const t = clockNow(opts);
217
+ const nowIso = t.toISOString();
218
+ const sfx = clockSuffix(opts);
219
+ const st = compactStamp(t);
220
+ for (let i = 0; i < steps.length; i++) {
221
+ const ns = steps[i];
222
+ if (!ns)
223
+ continue;
224
+ // When parentStepId is supplied, derive a deterministic, BOUNDED-length ID from a hash of
225
+ // (parent id + index) so that a crash-and-retry (new attemptId, same parent) regenerates the
226
+ // exact same child IDs (idempotent: ROW_CONFLICT from createRow means it already exists → skip)
227
+ // WITHOUT growing the id per chain level. Concatenating the full parent id per level
228
+ // (`${parent}_ch_${i}`) overflowed Revisium's 64-char rowId limit on deep chains. The id
229
+ // depends ONLY on (parent id, index) — NOT on role — so the retry contract holds even if a
230
+ // re-run yields a different role for the same logical next step, and the length is fixed
231
+ // ("step_" + 16 hex = 21 chars) regardless of role. The 64-bit hash keeps it collision-resistant.
232
+ const childKey = `${opts?.parentStepId ?? ''}:${i}`;
233
+ const stepId = opts?.parentStepId
234
+ ? `step_${fnv1a64Hex(childKey)}`
235
+ : `step_${st}_${ns.role}_${sfx}_${i}`;
236
+ // Steps with unresolved dependencies start 'pending'; promoting them to 'ready' once their
237
+ // depends_on complete is the dependency resolver's job, deferred to a later plan (not Plan 0006).
238
+ const hasDeps = ns.dependsOn !== undefined && ns.dependsOn.length > 0;
239
+ try {
240
+ await da.createRow('steps', stepId, {
241
+ id: stepId,
242
+ task_id: ns.taskId,
243
+ run_id: ns.runId,
244
+ role: ns.role,
245
+ kind: ns.kind,
246
+ status: hasDeps ? 'pending' : 'ready',
247
+ input: ns.input,
248
+ output: null,
249
+ model_profile: ns.modelProfile,
250
+ run_after: ns.runAfter ?? '',
251
+ attempt_count: 0,
252
+ max_attempts: ns.maxAttempts ?? 3,
253
+ priority: ns.priority ?? 0,
254
+ depends_on: ns.dependsOn ?? [],
255
+ lease_owner: '',
256
+ lease_expires_at: '',
257
+ dead_reason: '',
258
+ created_at: nowIso,
259
+ updated_at: nowIso,
260
+ });
261
+ }
262
+ catch (e) {
263
+ if (e instanceof ControlPlaneError && e.code === 'ROW_CONFLICT' && opts?.parentStepId)
264
+ continue;
265
+ throw e;
266
+ }
267
+ }
268
+ }
269
+ export async function failStep(da, step, attemptId, opts) {
270
+ const t = clockNow(opts);
271
+ const nowIso = t.toISOString();
272
+ const sfx = clockSuffix(opts);
273
+ const st = compactStamp(t);
274
+ // 1. Close attempt
275
+ await da.patchRow('attempts', attemptId, [
276
+ { op: 'replace', path: 'status', value: 'failed' },
277
+ { op: 'replace', path: 'lesson', value: opts.lesson ?? '' },
278
+ { op: 'replace', path: 'error', value: opts.error ?? '' },
279
+ { op: 'replace', path: 'finished_at', value: nowIso },
280
+ ]);
281
+ // 2. Append event
282
+ await da.createRow('events', `event_${st}_step-failed_${sfx}`, {
283
+ id: `event_${st}_step-failed_${sfx}`,
284
+ run_id: step.runId,
285
+ task_id: step.taskId,
286
+ step_id: step.id,
287
+ type: 'step_failed',
288
+ payload: { attempt_id: attemptId, lesson: opts.lesson, error: opts.error },
289
+ actor: 'orchestrator',
290
+ created_at: nowIso,
291
+ });
292
+ // 3. Gate on the PERSISTED attempt_count, never the caller's snapshot. startAttempt owns the
293
+ // increment and already wrote it, so re-deriving here (snapshot + 1) would double-count a step
294
+ // that the worker refetched between startAttempt and failStep, killing it one attempt early.
295
+ // failStep therefore reads the current row and does not write attempt_count itself.
296
+ const current = await da.getRow('steps', step.id);
297
+ const attemptCount = Number(current?.data.attempt_count ?? step.attemptCount);
298
+ const maxAttempts = Number(current?.data.max_attempts ?? step.maxAttempts);
299
+ if (attemptCount < maxAttempts) {
300
+ // 4. Attempts remain: backoff to ready, clear lease (attempt_count left as startAttempt set it)
301
+ await da.patchRow('steps', step.id, [
302
+ { op: 'replace', path: 'status', value: 'ready' },
303
+ { op: 'replace', path: 'run_after', value: backoffRunAfter(t, attemptCount) },
304
+ { op: 'replace', path: 'lease_owner', value: '' },
305
+ { op: 'replace', path: 'lease_expires_at', value: '' },
306
+ { op: 'replace', path: 'updated_at', value: nowIso },
307
+ ]);
308
+ }
309
+ else {
310
+ // 5. Cap reached: dead, clear lease
311
+ const deadReason = opts.lesson ?? opts.error ?? `exhausted ${maxAttempts} attempt(s)`;
312
+ await da.patchRow('steps', step.id, [
313
+ { op: 'replace', path: 'status', value: 'dead' },
314
+ { op: 'replace', path: 'dead_reason', value: deadReason },
315
+ { op: 'replace', path: 'lease_owner', value: '' },
316
+ { op: 'replace', path: 'lease_expires_at', value: '' },
317
+ { op: 'replace', path: 'updated_at', value: nowIso },
318
+ ]);
319
+ }
320
+ }
321
+ export async function recoverInFlight(da, workerId, opts) {
322
+ const t = clockNow(opts);
323
+ const nowIso = t.toISOString();
324
+ const sfx = clockSuffix(opts);
325
+ const st = compactStamp(t);
326
+ // Server-side: filter by lease_owner + status to avoid a full-table scan.
327
+ // MVP single-worker startup: first-page result (CLAIM_CAP rows) is acceptable; a multi-worker
328
+ // deployment would need pagination here, but that belongs to a later plan.
329
+ const allSteps = await da.listRows('steps', {
330
+ first: CLAIM_CAP,
331
+ where: {
332
+ AND: [
333
+ { data: { path: 'lease_owner', equals: workerId } },
334
+ {
335
+ OR: [
336
+ { data: { path: 'status', equals: 'claimed' } },
337
+ { data: { path: 'status', equals: 'running' } },
338
+ ],
339
+ },
340
+ ],
341
+ },
342
+ });
343
+ // In-process filter provides correctness against fake/unconstrained transports.
344
+ const orphans = allSteps
345
+ .map(mapStep)
346
+ .filter((s) => s.leaseOwner === workerId && (s.status === 'claimed' || s.status === 'running'));
347
+ for (let i = 0; i < orphans.length; i++) {
348
+ const orphan = orphans[i];
349
+ if (!orphan)
350
+ continue;
351
+ if (orphan.status === 'running') {
352
+ const allAttempts = await da.listRows('attempts', { first: RECOVERY_ATTEMPT_CAP });
353
+ const runningAttempts = allAttempts.filter((a) => String(a.data.step_id) === orphan.id && String(a.data.status) === 'running');
354
+ for (const attempt of runningAttempts) {
355
+ await da.patchRow('attempts', attempt.rowId, [
356
+ { op: 'replace', path: 'status', value: 'failed' },
357
+ { op: 'replace', path: 'lesson', value: 'worker crashed mid-step' },
358
+ { op: 'replace', path: 'finished_at', value: nowIso },
359
+ ]);
360
+ }
361
+ }
362
+ await da.createRow('events', `event_${st}_step-recovered_${sfx}_${i}`, {
363
+ id: `event_${st}_step-recovered_${sfx}_${i}`,
364
+ run_id: orphan.runId,
365
+ task_id: orphan.taskId,
366
+ step_id: orphan.id,
367
+ type: 'step_recovered',
368
+ payload: { worker_id: workerId },
369
+ actor: 'orchestrator',
370
+ created_at: nowIso,
371
+ });
372
+ await da.patchRow('steps', orphan.id, [
373
+ { op: 'replace', path: 'status', value: 'ready' },
374
+ { op: 'replace', path: 'lease_owner', value: '' },
375
+ { op: 'replace', path: 'lease_expires_at', value: '' },
376
+ { op: 'replace', path: 'updated_at', value: nowIso },
377
+ ]);
378
+ }
379
+ return orphans;
380
+ }
381
+ //# sourceMappingURL=steps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"steps.js","sourceRoot":"","sources":["../../src/control-plane/steps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export const runtimeTables = [
2
+ 'task_runs',
3
+ 'tasks',
4
+ 'steps',
5
+ 'attempts',
6
+ 'events',
7
+ 'inbox',
8
+ 'cost_ledger',
9
+ ];
10
+ export function isRuntimeTable(table) {
11
+ return runtimeTables.includes(table);
12
+ }
13
+ //# sourceMappingURL=tables.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tables.js","sourceRoot":"","sources":["../../src/control-plane/tables.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,WAAW;IACX,OAAO;IACP,OAAO;IACP,UAAU;IACV,QAAQ;IACR,OAAO;IACP,aAAa;CACL,CAAC;AAIX,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,OAAQ,aAAmC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC9D,CAAC"}
@@ -0,0 +1,53 @@
1
+ import { RevisiumClient } from '@revisium/client';
2
+ import { baseUrl, getConfig, isAlive, isHealthy, readRuntime } from '../config.js';
3
+ import { ControlPlaneError } from './errors.js';
4
+ function isRowNotFound(error) {
5
+ const err = error;
6
+ return (err?.statusCode === 404 ||
7
+ err?.status === 404 ||
8
+ err?.code === 'ROW_NOT_FOUND' ||
9
+ (typeof err?.message === 'string' && err.message.toLowerCase().includes('not found')));
10
+ }
11
+ async function createDraftScope() {
12
+ const runtime = readRuntime();
13
+ if (!runtime || !isAlive(runtime.pid) || !(await isHealthy(runtime.httpPort))) {
14
+ throw new ControlPlaneError('DAEMON_NOT_RUNNING', 'Local Revisium daemon is not running or healthy');
15
+ }
16
+ const { org, project, branch } = getConfig();
17
+ const client = new RevisiumClient({ baseUrl: baseUrl(runtime.httpPort) });
18
+ return client.revision({ org, project, branch, revision: 'draft' });
19
+ }
20
+ export function createVersionedMeaningAccess(options = {}) {
21
+ const dryRun = options.dryRun ?? false;
22
+ const scopeFactory = options.scopeFactory ?? createDraftScope;
23
+ let scopePromise;
24
+ function scope() {
25
+ scopePromise ??= scopeFactory();
26
+ return scopePromise;
27
+ }
28
+ return {
29
+ async upsertRow(row) {
30
+ if (dryRun) {
31
+ return { action: 'dry-run', table: row.table, rowId: row.rowId };
32
+ }
33
+ const draft = await scope();
34
+ try {
35
+ await draft.getRow(row.table, row.rowId);
36
+ }
37
+ catch (error) {
38
+ if (!isRowNotFound(error))
39
+ throw error;
40
+ await draft.createRow(row.table, row.rowId, row.data);
41
+ return { action: 'create', table: row.table, rowId: row.rowId };
42
+ }
43
+ await draft.updateRow(row.table, row.rowId, row.data);
44
+ return { action: 'update', table: row.table, rowId: row.rowId };
45
+ },
46
+ async commit(message) {
47
+ if (dryRun)
48
+ return null;
49
+ return (await scope()).commit(message);
50
+ },
51
+ };
52
+ }
53
+ //# sourceMappingURL=versioned-meaning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"versioned-meaning.js","sourceRoot":"","sources":["../../src/control-plane/versioned-meaning.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { Module } from '@nestjs/common';
8
+ import { DbosService } from './dbos.service.js';
9
+ let EngineModule = class EngineModule {
10
+ };
11
+ EngineModule = __decorate([
12
+ Module({
13
+ providers: [DbosService],
14
+ exports: [DbosService],
15
+ })
16
+ ], EngineModule);
17
+ export { EngineModule };
18
+ //# sourceMappingURL=dbos.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dbos.module.js","sourceRoot":"","sources":["../../src/engine/dbos.module.ts"],"names":[],"mappings":";;;;;;AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAMzC,IAAM,YAAY,GAAlB,MAAM,YAAY;CAAG,CAAA;AAAf,YAAY;IAJxB,MAAM,CAAC;QACN,SAAS,EAAE,CAAC,WAAW,CAAC;QACxB,OAAO,EAAE,CAAC,WAAW,CAAC;KACvB,CAAC;GACW,YAAY,CAAG"}