@revisium/orchestrator 0.1.0-alpha.8 → 0.1.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 (127) hide show
  1. package/README.md +150 -130
  2. package/control-plane/default-playbook/catalog/pipelines.json +280 -11
  3. package/control-plane/default-playbook/package.json +1 -1
  4. package/control-plane/default-playbook/prompts/developer.md +1 -0
  5. package/control-plane/default-playbook/prompts/triager.md +3 -0
  6. package/dist/api/graphql-api/graphql-ws/subscription-mappers.js +3 -0
  7. package/dist/api/graphql-api/graphql-ws/subscription-mappers.js.map +1 -1
  8. package/dist/api/graphql-api/pr/inputs/pr-readiness.input.js +6 -0
  9. package/dist/api/graphql-api/pr/inputs/pr-readiness.input.js.map +1 -1
  10. package/dist/api/graphql-api/pr/model/pr-readiness.model.js +30 -0
  11. package/dist/api/graphql-api/pr/model/pr-readiness.model.js.map +1 -1
  12. package/dist/api/graphql-api/runs/inputs/create-run.input.js +6 -0
  13. package/dist/api/graphql-api/runs/inputs/create-run.input.js.map +1 -1
  14. package/dist/api/graphql-api/runs/model/run.model.js +6 -0
  15. package/dist/api/graphql-api/runs/model/run.model.js.map +1 -1
  16. package/dist/api/graphql-api/share/model/issue-ref.model.js +53 -0
  17. package/dist/api/graphql-api/share/model/issue-ref.model.js.map +1 -0
  18. package/dist/cli/commands/lifecycle.js +113 -8
  19. package/dist/cli/commands/lifecycle.js.map +1 -1
  20. package/dist/cli/commands/mcp.js +8 -1
  21. package/dist/cli/commands/mcp.js.map +1 -1
  22. package/dist/cli/commands/process-tree.js +42 -0
  23. package/dist/cli/commands/process-tree.js.map +1 -1
  24. package/dist/cli/commands/rogue-reaper.js +63 -0
  25. package/dist/cli/commands/rogue-reaper.js.map +1 -0
  26. package/dist/config.js +9 -0
  27. package/dist/config.js.map +1 -1
  28. package/dist/control-plane/bootstrap.js +14 -1
  29. package/dist/control-plane/bootstrap.js.map +1 -1
  30. package/dist/control-plane/client-transport.js +1 -1
  31. package/dist/control-plane/client-transport.js.map +1 -1
  32. package/dist/control-plane/default-playbook-policy.js +593 -0
  33. package/dist/control-plane/default-playbook-policy.js.map +1 -0
  34. package/dist/control-plane/seed-default-playbook.js +77 -8
  35. package/dist/control-plane/seed-default-playbook.js.map +1 -1
  36. package/dist/e2e/kit/agents.js +15 -21
  37. package/dist/e2e/kit/agents.js.map +1 -1
  38. package/dist/e2e/kit/assertions.js +18 -13
  39. package/dist/e2e/kit/assertions.js.map +1 -1
  40. package/dist/e2e/kit/fake-integrator.js +11 -2
  41. package/dist/e2e/kit/fake-integrator.js.map +1 -1
  42. package/dist/e2e/kit/gh-emulator.js +2 -1
  43. package/dist/e2e/kit/gh-emulator.js.map +1 -1
  44. package/dist/e2e/kit/git-target-repo.js +1 -1
  45. package/dist/engine/dbos.service.js +3 -0
  46. package/dist/engine/dbos.service.js.map +1 -1
  47. package/dist/features/pr/queries/impl/get-pr-readiness.query.js.map +1 -1
  48. package/dist/features/runs/commands/impl/create-run.command.js.map +1 -1
  49. package/dist/features/runs/queries/handlers/runs-query.handlers.js +1 -0
  50. package/dist/features/runs/queries/handlers/runs-query.handlers.js.map +1 -1
  51. package/dist/host/daemon.js +14 -1
  52. package/dist/host/daemon.js.map +1 -1
  53. package/dist/host/host-runtime.js +20 -2
  54. package/dist/host/host-runtime.js.map +1 -1
  55. package/dist/mcp/mcp-capabilities.js +16 -1
  56. package/dist/mcp/mcp-capabilities.js.map +1 -1
  57. package/dist/mcp/mcp-facade.service.js +325 -12
  58. package/dist/mcp/mcp-facade.service.js.map +1 -1
  59. package/dist/mcp/mcp-tools.js +58 -12
  60. package/dist/mcp/mcp-tools.js.map +1 -1
  61. package/dist/observability/activity-signal.js +107 -0
  62. package/dist/observability/activity-signal.js.map +1 -0
  63. package/dist/observability/index.js +1 -0
  64. package/dist/observability/index.js.map +1 -1
  65. package/dist/pipeline/data-driven-task.workflow.js +549 -44
  66. package/dist/pipeline/data-driven-task.workflow.js.map +1 -1
  67. package/dist/pipeline/pipeline.service.js +195 -101
  68. package/dist/pipeline/pipeline.service.js.map +1 -1
  69. package/dist/pipeline/route-contract.js +4 -3
  70. package/dist/pipeline/route-contract.js.map +1 -1
  71. package/dist/pipeline-core/interpret.js +2 -0
  72. package/dist/pipeline-core/interpret.js.map +1 -1
  73. package/dist/pipeline-core/kit/builders.js +2 -0
  74. package/dist/pipeline-core/kit/builders.js.map +1 -1
  75. package/dist/pipeline-core/kit/fixtures.js +72 -21
  76. package/dist/pipeline-core/kit/fixtures.js.map +1 -1
  77. package/dist/pipeline-core/types.js +2 -0
  78. package/dist/pipeline-core/types.js.map +1 -1
  79. package/dist/pipeline-core/validate-dataflow.js +32 -0
  80. package/dist/pipeline-core/validate-dataflow.js.map +1 -1
  81. package/dist/playbook/import-mapper.js +8 -1
  82. package/dist/playbook/import-mapper.js.map +1 -1
  83. package/dist/poller/pr-readiness-core.js +299 -28
  84. package/dist/poller/pr-readiness-core.js.map +1 -1
  85. package/dist/revisium/playbooks.service.js +17 -2
  86. package/dist/revisium/playbooks.service.js.map +1 -1
  87. package/dist/revisium/run.service.js +1 -0
  88. package/dist/revisium/run.service.js.map +1 -1
  89. package/dist/run/append-event.js +8 -5
  90. package/dist/run/append-event.js.map +1 -1
  91. package/dist/run/create-run.js +5 -1
  92. package/dist/run/create-run.js.map +1 -1
  93. package/dist/run/inspect-run.js +30 -4
  94. package/dist/run/inspect-run.js.map +1 -1
  95. package/dist/run/issue-ref.js +88 -0
  96. package/dist/run/issue-ref.js.map +1 -0
  97. package/dist/runners/claude-code.service.js +2 -2
  98. package/dist/runners/claude-code.service.js.map +1 -1
  99. package/dist/runners/codex.service.js +2 -2
  100. package/dist/runners/codex.service.js.map +1 -1
  101. package/dist/runners/integrator-branch-naming.js +33 -13
  102. package/dist/runners/integrator-branch-naming.js.map +1 -1
  103. package/dist/runners/integrator.js +285 -72
  104. package/dist/runners/integrator.js.map +1 -1
  105. package/dist/runners/worktree.service.js +2 -2
  106. package/dist/runners/worktree.service.js.map +1 -1
  107. package/dist/task-control-plane/pr-readiness.service.js +15 -13
  108. package/dist/task-control-plane/pr-readiness.service.js.map +1 -1
  109. package/dist/task-control-plane/run-watch.service.js +512 -0
  110. package/dist/task-control-plane/run-watch.service.js.map +1 -0
  111. package/dist/task-control-plane/task-control-plane-api.service.js +277 -25
  112. package/dist/task-control-plane/task-control-plane-api.service.js.map +1 -1
  113. package/dist/worker/artifact-store.js +21 -3
  114. package/dist/worker/artifact-store.js.map +1 -1
  115. package/dist/worker/build-context.js +19 -3
  116. package/dist/worker/build-context.js.map +1 -1
  117. package/dist/worker/claude-code-runner.js +76 -15
  118. package/dist/worker/claude-code-runner.js.map +1 -1
  119. package/dist/worker/codex-runner.js +40 -13
  120. package/dist/worker/codex-runner.js.map +1 -1
  121. package/dist/worker/process-executor.js +149 -20
  122. package/dist/worker/process-executor.js.map +1 -1
  123. package/dist/worker/runner-common.js +29 -0
  124. package/dist/worker/runner-common.js.map +1 -1
  125. package/dist/worker/runner.js +16 -1
  126. package/dist/worker/runner.js.map +1 -1
  127. package/package.json +1 -1
@@ -0,0 +1,512 @@
1
+ /**
2
+ * RunWatchService — bounded long-poll watch primitive over many runs (slice 141 D2).
3
+ *
4
+ * The MCP HTTP transport is stateless-per-request with a request timeout (see McpHttpService): no
5
+ * session, no held async-iterator, no server-initiated SSE survives one POST. So we cannot "subscribe
6
+ * over MCP"; instead we convert the daemon's existing in-process push (APP_PUB_SUB) into a bounded
7
+ * long-poll that RETURNS UNDER THE BRIDGE TIMEOUT with a resume cursor.
8
+ *
9
+ * Correctness rests on the SWEEP + CURSOR, not the push. The push (option A) only lowers latency; a
10
+ * pure poll (option B, no pubSub) is an equivalent-correctness degrade. Delivery is **at-least-once +
11
+ * idempotent**: `resolveRunState` is a point-in-time LEVEL read (a gate is `inbox.find(approval)`, not
12
+ * an event edge), so the cursor is a per-run *marker* watermark — a re-call suppresses a run whose
13
+ * actionable level it already delivered, and reports it again only when the marker changes (a new gate
14
+ * id, or a status transition). Approving the same gate twice is already guarded downstream.
15
+ */
16
+ import { ControlPlaneError } from '../control-plane/errors.js';
17
+ import { deriveCanonicalActivitySignal, } from '../observability/activity-signal.js';
18
+ // Single source of truth for the topic names (a zero-import leaf module, so no import cycle). The
19
+ // ControlPlaneSubscriptionBridge publishes these from the Postgres LISTEN feed, each payload carrying
20
+ // `runId` — the field we filter wakeups on.
21
+ import { INBOX_ITEM_ADDED_TOPIC, RUN_UPDATED_TOPIC } from '../api/graphql-api/graphql-ws/constants.js';
22
+ export const MAX_RUN_IDS = 50;
23
+ /** Below the SDK inner-hop default of 60000ms with margin for two serial hops + the sweep itself. */
24
+ export const MAX_SERVER_HOLD_MS = 45_000;
25
+ export const DEFAULT_SERVER_HOLD_MS = 28_000;
26
+ const WAKEUP_DEBOUNCE_MS = 75;
27
+ const POLL_INTERVAL_MS = 500;
28
+ const ACTIVITY_READ_TIMEOUT_MS = 250;
29
+ const GATE_STATES = new Set(['pending_gate', 'question']);
30
+ const WATCH_STATES = new Set([
31
+ 'pending_gate',
32
+ 'question',
33
+ 'completed',
34
+ 'failed',
35
+ 'blocked',
36
+ ]);
37
+ const OBSERVE_TRANSITION_STATES = new Set([
38
+ 'ready',
39
+ 'pending_gate',
40
+ 'question',
41
+ 'completed',
42
+ 'failed',
43
+ 'blocked',
44
+ 'retrying',
45
+ ]);
46
+ const TERMINAL_RUN_STATUS = new Set(['completed', 'failed', 'cancelled']);
47
+ /** Defensive cap on caller-supplied cursor size (a legitimate cursor only carries the watched runs, ≤ MAX_RUN_IDS). */
48
+ const MAX_CURSOR_ENTRIES = 200;
49
+ export const MAX_WATCH_CURSOR_CHARS = 8_192;
50
+ export const DEFAULT_HEARTBEAT_EVERY_MS = 5_000;
51
+ export const MAX_HEARTBEAT_EVERY_MS = MAX_SERVER_HOLD_MS;
52
+ /** The topics this watch composes off APP_PUB_SUB — exported so a test can assert sync with constants.js. */
53
+ export const WATCH_TOPICS = [INBOX_ITEM_ADDED_TOPIC, RUN_UPDATED_TOPIC];
54
+ export function clampServerHold(timeoutMs) {
55
+ const requested = timeoutMs ?? DEFAULT_SERVER_HOLD_MS;
56
+ if (!Number.isFinite(requested) || requested < 0)
57
+ return DEFAULT_SERVER_HOLD_MS;
58
+ return Math.min(requested, MAX_SERVER_HOLD_MS);
59
+ }
60
+ export function clampHeartbeatEvery(heartbeatEveryMs) {
61
+ const requested = heartbeatEveryMs ?? DEFAULT_HEARTBEAT_EVERY_MS;
62
+ if (!Number.isFinite(requested) || requested <= 0)
63
+ return DEFAULT_HEARTBEAT_EVERY_MS;
64
+ return Math.min(requested, MAX_HEARTBEAT_EVERY_MS);
65
+ }
66
+ /**
67
+ * The cursor marker for an *actionable* run level. A *changed* marker (vs the caller's cursor) is a new
68
+ * transition worth delivering: a gate is keyed by its inbox id (deterministic per gateKey, so a
69
+ * *different* gate yields a different id), a terminal/blocked run by its status. `running` is not
70
+ * actionable and is never recorded — `null`.
71
+ */
72
+ function markerFor(state) {
73
+ switch (state.state) {
74
+ case 'ready':
75
+ return 'ready';
76
+ case 'pending_gate':
77
+ case 'question':
78
+ return `g:${state.inbox?.id ?? ''}`;
79
+ case 'completed':
80
+ return 'c';
81
+ case 'failed':
82
+ return 'f';
83
+ case 'blocked':
84
+ return `b:${state.runStatus}`;
85
+ case 'retrying':
86
+ return `r:${state.runStatus}:${state.workflowStatus}`;
87
+ case 'running':
88
+ return null;
89
+ }
90
+ }
91
+ function encodeCursor(markers) {
92
+ return Buffer.from(JSON.stringify({ v: 1, m: markers }), 'utf8').toString('base64url');
93
+ }
94
+ function decodeCursor(cursor) {
95
+ if (!cursor)
96
+ return {};
97
+ if (cursor.length > MAX_WATCH_CURSOR_CHARS)
98
+ return {};
99
+ try {
100
+ const parsed = JSON.parse(Buffer.from(cursor, 'base64url').toString('utf8'));
101
+ if (!parsed || parsed.v !== 1 || !parsed.m || typeof parsed.m !== 'object')
102
+ return {};
103
+ // Keep only well-formed string markers, capped — a forged/oversized cursor can't force unbounded work.
104
+ const out = {};
105
+ for (const [runId, marker] of Object.entries(parsed.m)) {
106
+ if (typeof marker !== 'string')
107
+ continue;
108
+ out[runId] = marker;
109
+ if (Object.keys(out).length >= MAX_CURSOR_ENTRIES)
110
+ break;
111
+ }
112
+ return out;
113
+ }
114
+ catch {
115
+ return {};
116
+ }
117
+ }
118
+ export class RunWatchService {
119
+ api;
120
+ pubSub;
121
+ now;
122
+ constructor(api, pubSub, now = () => Date.now()) {
123
+ this.api = api;
124
+ this.pubSub = pubSub;
125
+ this.now = now;
126
+ }
127
+ /** Block until any watched run hits an approval/question gate (or the hold elapses). */
128
+ waitForAnyGate(input) {
129
+ return this.watch(input, GATE_STATES);
130
+ }
131
+ /** Like waitForAnyGate, but also surfaces terminal (completed/failed) and blocked transitions. */
132
+ watchRuns(input) {
133
+ return this.watch(input, WATCH_STATES);
134
+ }
135
+ async observeRun(input) {
136
+ const mode = input.mode ?? 'actionable';
137
+ const activityRead = this.startActivitySignalRead(input.runId);
138
+ const timeoutMs = mode === 'heartbeat'
139
+ ? Math.min(clampServerHold(input.timeoutMs), clampHeartbeatEvery(input.heartbeatEveryMs))
140
+ : clampServerHold(input.timeoutMs);
141
+ const watched = await this.watch({
142
+ runIds: [input.runId],
143
+ cursor: input.cursor,
144
+ timeoutMs,
145
+ signal: input.signal,
146
+ }, OBSERVE_TRANSITION_STATES);
147
+ const transition = watched.transitions[0];
148
+ const state = transition ?? await this.resolveRunState(input.runId);
149
+ const rawActivity = await activityRead.readIfSettled();
150
+ const activity = shouldExposeActivitySignal(state, rawActivity) ? rawActivity : undefined;
151
+ const nextAction = observeNextAction(state, activity);
152
+ const activeAttempt = shouldExposeActiveAttempt(state, activity) ? activity?.attempt : undefined;
153
+ const heartbeat = mode === 'heartbeat' || mode === 'diagnostic'
154
+ ? observeHeartbeat(state, activity, this.now)
155
+ : undefined;
156
+ return {
157
+ runId: input.runId,
158
+ cursor: watched.cursor,
159
+ state: state.state,
160
+ timedOut: watched.timedOut,
161
+ ...(state.issueRef ? { issueRef: state.issueRef } : {}),
162
+ ...(transition ? { transition: observeTransition(transition, activity) } : {}),
163
+ ...(activeAttempt ? { activeAttempt } : {}),
164
+ ...(heartbeat ? { heartbeat } : {}),
165
+ nextAction,
166
+ ...(mode === 'diagnostic' ? { diagnostic: observeDiagnostic(state, activity) } : {}),
167
+ };
168
+ }
169
+ async watch(input, actionable) {
170
+ const prev = decodeCursor(input.cursor);
171
+ const runIds = await this.resolveRunIds(input.runIds);
172
+ const serverHold = clampServerHold(input.timeoutMs);
173
+ // 1. Initial sweep first — deliver anything already actionable (the common "already gated" case
174
+ // returns instantly) without arming a subscription. A transition that lands AFTER this read but
175
+ // BEFORE the subscription resolves is not lost: the cursor re-call's next sweep observes it.
176
+ const sweep = await this.sweep(runIds);
177
+ const initial = collectNew(sweep, prev, actionable);
178
+ const cursor0 = mergeCursor(sweep, actionable);
179
+ if (initial.length > 0) {
180
+ return { transitions: initial, cursor: encodeCursor(cursor0), timedOut: false };
181
+ }
182
+ if (runIds.length === 0 || serverHold <= 0 || input.signal?.aborted) {
183
+ return { transitions: [], cursor: encodeCursor(cursor0), timedOut: true };
184
+ }
185
+ // 2. Nothing actionable yet → hold this single request open for the next transition.
186
+ return this.holdForTransition(runIds, prev, actionable, cursor0, serverHold, input.signal);
187
+ }
188
+ holdForTransition(runIds, prev, actionable, cursor0, serverHold, signal) {
189
+ return new Promise((resolve) => {
190
+ let settled = false;
191
+ const subIds = [];
192
+ const dirty = new Set();
193
+ const watched = new Set(runIds);
194
+ let debounceTimer;
195
+ let pollTimer;
196
+ const timeout = () => ({ transitions: [], cursor: encodeCursor(cursor0), timedOut: true });
197
+ const onAbort = () => settle(timeout());
198
+ const cleanup = () => {
199
+ clearTimeout(holdTimer);
200
+ if (debounceTimer)
201
+ clearTimeout(debounceTimer);
202
+ if (pollTimer)
203
+ clearInterval(pollTimer);
204
+ // Detach the pubsub subscription — a held-open request that is torn down (abort/timeout) must
205
+ // not leak a subscriber on the long-lived APP_PUB_SUB.
206
+ for (const id of subIds)
207
+ this.pubSub?.unsubscribe(id);
208
+ subIds.length = 0;
209
+ signal?.removeEventListener('abort', onAbort);
210
+ };
211
+ const settle = (result) => {
212
+ if (settled)
213
+ return;
214
+ settled = true;
215
+ cleanup();
216
+ resolve(result);
217
+ };
218
+ const reSweep = async () => {
219
+ const ids = dirty.size > 0 ? [...dirty] : runIds;
220
+ dirty.clear();
221
+ let states;
222
+ try {
223
+ states = await this.sweep(ids);
224
+ }
225
+ catch {
226
+ return; // transient; a later wakeup/poll retries
227
+ }
228
+ if (settled)
229
+ return;
230
+ const found = collectNew(states, prev, actionable);
231
+ // Merge the re-swept (dirty) runs' markers over this call's initial cursor so the other watched
232
+ // runs keep theirs; still this-call-only (no cross-call carry-forward → bounded).
233
+ if (found.length > 0) {
234
+ settle({ transitions: found, cursor: encodeCursor({ ...cursor0, ...mergeCursor(states, actionable) }), timedOut: false });
235
+ }
236
+ };
237
+ // Coalesce a burst of wakeups into one re-sweep per tick (each sweep is ~4 control-plane reads/run).
238
+ const scheduleReSweep = () => {
239
+ if (settled || debounceTimer)
240
+ return;
241
+ debounceTimer = setTimeout(() => {
242
+ debounceTimer = undefined;
243
+ void reSweep();
244
+ }, WAKEUP_DEBOUNCE_MS);
245
+ };
246
+ // res.on('close') in McpHttpService aborts extra.signal mid-handler (SDK protocol _onclose).
247
+ if (signal)
248
+ signal.addEventListener('abort', onAbort, { once: true });
249
+ const holdTimer = setTimeout(() => settle(timeout()), serverHold);
250
+ if (this.pubSub) {
251
+ const onMessage = (payload) => {
252
+ const rid = payload?.runId;
253
+ if (rid !== undefined && !watched.has(rid))
254
+ return; // not one of ours
255
+ if (rid)
256
+ dirty.add(rid);
257
+ scheduleReSweep();
258
+ };
259
+ for (const topic of WATCH_TOPICS) {
260
+ this.pubSub
261
+ .subscribe(topic, onMessage)
262
+ .then((id) => {
263
+ // The hold may have settled (timer/abort) before subscribe resolved — detach immediately.
264
+ if (settled)
265
+ this.pubSub?.unsubscribe(id);
266
+ else
267
+ subIds.push(id);
268
+ })
269
+ .catch(() => undefined);
270
+ }
271
+ }
272
+ else {
273
+ // Option B: no push source → poll. Same sweep+cursor correctness, latency rises by one interval.
274
+ pollTimer = setInterval(() => {
275
+ if (!settled)
276
+ void reSweep();
277
+ }, POLL_INTERVAL_MS);
278
+ }
279
+ });
280
+ }
281
+ async resolveRunIds(provided) {
282
+ if (provided && provided.length > 0) {
283
+ if (provided.length > MAX_RUN_IDS) {
284
+ throw new Error(`VALIDATION_FAILURE: watch supports at most ${MAX_RUN_IDS} runIds (received ${provided.length}); narrow the set`);
285
+ }
286
+ return [...new Set(provided)];
287
+ }
288
+ // Omitted → watch every active (non-terminal) run, capped. A run that terminates between polls drops
289
+ // out of this set, so omit-mode is best-effort for terminal transitions — pass explicit runIds for
290
+ // guaranteed terminal delivery (those are always swept regardless of status).
291
+ const runs = await this.api.listRuns({});
292
+ return runs
293
+ .filter((run) => !TERMINAL_RUN_STATUS.has(run.status))
294
+ .map((run) => run.runId)
295
+ .slice(0, MAX_RUN_IDS);
296
+ }
297
+ sweep(runIds) {
298
+ return Promise.all(runIds.map((runId) => this.resolveRunState(runId)));
299
+ }
300
+ async resolveRunState(runId) {
301
+ return this.api.resolveRunState(runId).catch((error) => {
302
+ if (error instanceof ControlPlaneError && error.code === 'ROW_NOT_FOUND') {
303
+ return { runId, state: 'failed', nextAction: 'run not found', runStatus: 'not_found', workflowStatus: '' };
304
+ }
305
+ // A transient read error must not masquerade as a terminal transition; keep waiting.
306
+ return { runId, state: 'running', nextAction: 'transient read error; will retry', runStatus: 'unknown', workflowStatus: '' };
307
+ });
308
+ }
309
+ async readActivitySignal(runId) {
310
+ if (!this.api.getAgentActivity)
311
+ return undefined;
312
+ try {
313
+ return deriveCanonicalActivitySignal(await withDeadline(this.api.getAgentActivity(runId), ACTIVITY_READ_TIMEOUT_MS));
314
+ }
315
+ catch {
316
+ return undefined;
317
+ }
318
+ }
319
+ startActivitySignalRead(runId) {
320
+ let settled = false;
321
+ const read = this.readActivitySignal(runId).then((activity) => {
322
+ settled = true;
323
+ return activity;
324
+ }, () => {
325
+ settled = true;
326
+ return undefined;
327
+ });
328
+ return {
329
+ readIfSettled: async () => settled ? read : undefined,
330
+ };
331
+ }
332
+ }
333
+ async function withDeadline(promise, timeoutMs) {
334
+ let timer;
335
+ try {
336
+ return await Promise.race([
337
+ promise,
338
+ new Promise((resolve) => {
339
+ timer = setTimeout(() => resolve(undefined), timeoutMs);
340
+ timer.unref?.();
341
+ }),
342
+ ]);
343
+ }
344
+ finally {
345
+ if (timer)
346
+ clearTimeout(timer);
347
+ }
348
+ }
349
+ function collectNew(states, prev, actionable) {
350
+ const out = [];
351
+ for (const state of states) {
352
+ if (!actionable.has(state.state))
353
+ continue;
354
+ const marker = markerFor(state);
355
+ if (prev[state.runId] === marker)
356
+ continue;
357
+ out.push({
358
+ runId: state.runId,
359
+ state: state.state,
360
+ nextAction: state.nextAction,
361
+ runStatus: state.runStatus,
362
+ workflowStatus: state.workflowStatus,
363
+ ...(state.issueRef ? { issueRef: state.issueRef } : {}),
364
+ inbox: state.inbox,
365
+ latestBlockingEvent: state.latestBlockingEvent,
366
+ blockedReason: state.blockedReason,
367
+ latestEventAt: state.latestEventAt,
368
+ latestEventType: state.latestEventType,
369
+ });
370
+ }
371
+ return out;
372
+ }
373
+ /**
374
+ * Build the next cursor from THIS sweep only — no carry-forward of prior keys, so it never grows beyond
375
+ * the watched set (bounds it at ≤ MAX_RUN_IDS). Records a marker only for states actionable in the
376
+ * CURRENT mode: a tool must not advance the cursor past a transition it did not deliver (else a later
377
+ * call in the other mode — e.g. watch_runs after wait_for_any_gate saw a `completed` run — would
378
+ * wrongly suppress it). `running` and other non-actionable states carry no marker.
379
+ */
380
+ function mergeCursor(states, actionable) {
381
+ const next = {};
382
+ for (const state of states) {
383
+ if (!actionable.has(state.state))
384
+ continue;
385
+ const marker = markerFor(state);
386
+ if (marker !== null)
387
+ next[state.runId] = marker;
388
+ }
389
+ return next;
390
+ }
391
+ function compactInbox(inbox) {
392
+ if (!inbox)
393
+ return undefined;
394
+ return {
395
+ id: inbox.id,
396
+ kind: inbox.kind,
397
+ title: inbox.title,
398
+ status: inbox.status,
399
+ ...(inbox.stepId ? { stepId: inbox.stepId } : {}),
400
+ optionCount: Array.isArray(inbox.options) ? inbox.options.length : 0,
401
+ };
402
+ }
403
+ function shouldInspectLog(activity) {
404
+ const status = activity?.attempt?.status ?? activity?.aggregateStatus;
405
+ return status === 'failed' || status === 'timed_out' || status === 'permission_blocked';
406
+ }
407
+ function shouldExposeActiveAttempt(state, activity) {
408
+ if (!activity?.attempt)
409
+ return false;
410
+ return state.state !== 'completed';
411
+ }
412
+ function shouldExposeActivitySignal(state, activity) {
413
+ if (!activity)
414
+ return false;
415
+ return state.state !== 'completed';
416
+ }
417
+ function observeNextAction(state, activity) {
418
+ switch (state.state) {
419
+ case 'ready':
420
+ return 'start_run';
421
+ case 'pending_gate':
422
+ case 'question':
423
+ return 'ask_human';
424
+ case 'completed':
425
+ return 'done';
426
+ case 'failed':
427
+ return shouldInspectLog(activity) ? 'inspect_log' : 'inspect_digest';
428
+ case 'blocked':
429
+ if (state.runStatus === 'cancelled')
430
+ return 'done';
431
+ return 'inspect_digest';
432
+ case 'retrying':
433
+ case 'running':
434
+ return 'wait';
435
+ }
436
+ }
437
+ function observeTransition(state, activity) {
438
+ const inbox = compactInbox(state.inbox);
439
+ return {
440
+ runId: state.runId,
441
+ state: state.state,
442
+ nextAction: observeNextAction(state, activity),
443
+ ...(state.issueRef ? { issueRef: state.issueRef } : {}),
444
+ ...(inbox ? { inbox } : {}),
445
+ ...(state.blockedReason ? { blockedReason: state.blockedReason } : {}),
446
+ };
447
+ }
448
+ function observeHeartbeat(state, activity, now) {
449
+ const compact = compactActivity(activity);
450
+ return {
451
+ observedAt: new Date(now()).toISOString(),
452
+ workflow: {
453
+ runStatus: state.runStatus,
454
+ workflowStatus: state.workflowStatus,
455
+ ...(state.latestEventAt ? { latestEventAt: state.latestEventAt } : {}),
456
+ ...(state.latestEventType ? { latestEventType: state.latestEventType } : {}),
457
+ },
458
+ ...(compact ? { activity: compact } : {}),
459
+ };
460
+ }
461
+ function asRecord(value) {
462
+ if (value === null || typeof value !== 'object' || Array.isArray(value))
463
+ return null;
464
+ return value;
465
+ }
466
+ function compactBlockingEvent(event) {
467
+ const record = asRecord(event);
468
+ if (!record)
469
+ return undefined;
470
+ return {
471
+ ...(typeof record.eventId === 'string' ? { eventId: record.eventId } : {}),
472
+ ...(typeof record.type === 'string' ? { type: record.type } : {}),
473
+ ...(typeof record.createdAt === 'string' ? { createdAt: record.createdAt } : {}),
474
+ };
475
+ }
476
+ function compactActivity(activity) {
477
+ if (!activity)
478
+ return undefined;
479
+ return {
480
+ aggregateStatus: activity.aggregateStatus,
481
+ latestActivityAt: activity.latestActivityAt,
482
+ ...(activity.latestOutputAt ? { latestOutputAt: activity.latestOutputAt } : {}),
483
+ stdoutBytes: activity.stdoutBytes,
484
+ stderrBytes: activity.stderrBytes,
485
+ eventCount: activity.eventCount,
486
+ };
487
+ }
488
+ function suggestedTools(state, activity) {
489
+ const nextAction = observeNextAction(state, activity);
490
+ if (nextAction === 'inspect_log')
491
+ return ['get_agent_log'];
492
+ if (nextAction === 'inspect_digest')
493
+ return ['get_run_digest'];
494
+ if (nextAction === 'ask_human')
495
+ return ['get_inbox_item', 'approve_gate', 'reject_gate', 'answer_question'];
496
+ if (nextAction === 'start_run')
497
+ return ['start_run'];
498
+ return [];
499
+ }
500
+ function observeDiagnostic(state, activity) {
501
+ const latestBlockingEvent = compactBlockingEvent(state.latestBlockingEvent);
502
+ const compact = compactActivity(activity);
503
+ return {
504
+ runStatus: state.runStatus,
505
+ workflowStatus: state.workflowStatus,
506
+ ...(state.blockedReason ? { blockedReason: state.blockedReason } : {}),
507
+ ...(latestBlockingEvent ? { latestBlockingEvent } : {}),
508
+ ...(compact ? { activity: compact } : {}),
509
+ suggestedTools: suggestedTools(state, activity),
510
+ };
511
+ }
512
+ //# sourceMappingURL=run-watch.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-watch.service.js","sourceRoot":"","sources":["../../src/task-control-plane/run-watch.service.ts"],"names":[],"mappings":"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"}