@llm-dev-ops/agentics-cli 2.7.26 → 2.7.27

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.
@@ -0,0 +1,101 @@
1
+ /**
2
+ * ADR-PIPELINE-099 D3 + D4 — Process-wide pipeline heartbeat.
3
+ *
4
+ * Singleton that emits a continuous "still alive" signal for the entire
5
+ * `agentics ask` lifecycle, not just Phase 1. Replaces the per-call heartbeat
6
+ * inside `executeNaturalLanguageRoute` which died as soon as auto-chain
7
+ * took over Phases 2–7, leaving the user staring at a silent terminal for
8
+ * minutes at a stretch.
9
+ *
10
+ * Two render modes:
11
+ *
12
+ * - **TTY** (`stderr.isTTY` and not opted out): a single status line is
13
+ * repainted in place every 250ms at the cursor position using a four-frame
14
+ * spinner (`◐ ◓ ◑ ◒`). The line shows the current phase, total elapsed
15
+ * time, time-since-phase-entry, and the most recent activity hint set by
16
+ * the pipeline. Other writers (`console.error`, `process.stderr.write`)
17
+ * print above the status line via cursor save/restore.
18
+ *
19
+ * - **Non-TTY** (CI, piped output, `AGENTICS_NO_HEARTBEAT=1`): the spinner
20
+ * is suppressed; instead a plain `[agentics] ⏳ still working — Phase X
21
+ * (MM:SS) — <activity>` line prints every 10 seconds, throttled to skip
22
+ * any tick that happened within 9s of another stderr write.
23
+ *
24
+ * The singleton is crash-safe: `process.on('exit' | 'SIGINT' | 'SIGTERM')`
25
+ * handlers call `stop()` to clear the live status line so it doesn't leave a
26
+ * stale frame on the user's terminal after Ctrl-C.
27
+ *
28
+ * Usage:
29
+ * ```ts
30
+ * import { pipelineHeartbeat } from './cli/ui/heartbeat.js';
31
+ * pipelineHeartbeat.start('agentics ask');
32
+ * pipelineHeartbeat.setPhase('Phase 4 — ADRs + DDDs');
33
+ * pipelineHeartbeat.setActivity('ruflo: writing adr-007');
34
+ * // ... long-running work ...
35
+ * pipelineHeartbeat.stop();
36
+ * ```
37
+ */
38
+ declare class PipelineHeartbeat {
39
+ private readonly started;
40
+ private label;
41
+ private phase;
42
+ private phaseStartedAt;
43
+ private activity;
44
+ private activitySetAt;
45
+ private frameIndex;
46
+ private timer;
47
+ private mode;
48
+ private lastStderrWriteAt;
49
+ private statusLineRendered;
50
+ private originalStderrWrite;
51
+ private exitHandlersInstalled;
52
+ /**
53
+ * Begin emitting heartbeat ticks. Idempotent — repeated `start()` calls
54
+ * with a different label update the label but do not restart the timer.
55
+ */
56
+ start(label: string): void;
57
+ /**
58
+ * Update the current phase label. Resets the per-phase timer. Called at
59
+ * every `[BEGIN]` boundary in auto-chain so the user can see which phase
60
+ * the pipeline is currently inside.
61
+ */
62
+ setPhase(phase: string): void;
63
+ /**
64
+ * Update the latest activity hint. Examples: "ruflo: dispatching task adr-007",
65
+ * "fleet: 47/109 agents complete", "phase7: rendering decision-memo.md".
66
+ * Recent sets (within ~750ms) suppress the next TTY tick to avoid flicker.
67
+ */
68
+ setActivity(activity: string): void;
69
+ /** Stop the timer, clear the live status line, restore stderr. */
70
+ stop(): void;
71
+ private tickTty;
72
+ private repaintTtyNow;
73
+ private tickPlain;
74
+ private paintStatusLine;
75
+ private clearStatusLine;
76
+ /**
77
+ * Wrap process.stderr.write so other writers (`console.error` etc.) clear
78
+ * the status line before printing, then we repaint after. This prevents
79
+ * the status line from being interleaved with normal log output in TTY
80
+ * mode. In plain mode the wrapper just records the timestamp so the 10s
81
+ * tick can self-suppress when other writes are happening.
82
+ */
83
+ private installStderrInterceptor;
84
+ private uninstallStderrInterceptor;
85
+ /** Bypass the interceptor — used for our own status-line paint/clear. */
86
+ private writeRaw;
87
+ private installExitHandlers;
88
+ }
89
+ /** Process-wide singleton. */
90
+ export declare const pipelineHeartbeat: PipelineHeartbeat;
91
+ /**
92
+ * Bracket a phase with `[BEGIN]` / `[END]` log markers and update the
93
+ * heartbeat's phase label. Call at the top of each phase in auto-chain.
94
+ *
95
+ * Returns a `done()` closure that emits the matching `[END]` line when the
96
+ * phase finishes. Always pair `phaseBoundary` with its returned `done` to
97
+ * keep the trace greppable.
98
+ */
99
+ export declare function phaseBoundary(phaseLabel: string, totalElapsedFromStart: number): () => void;
100
+ export {};
101
+ //# sourceMappingURL=heartbeat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heartbeat.d.ts","sourceRoot":"","sources":["../../../src/cli/ui/heartbeat.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AA8BH,cAAM,iBAAiB;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAc;IACtC,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,QAAQ,CAAM;IACtB,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,KAAK,CAA+B;IAC5C,OAAO,CAAC,IAAI,CAAkC;IAC9C,OAAO,CAAC,iBAAiB,CAAc;IACvC,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,mBAAmB,CAA4C;IACvE,OAAO,CAAC,qBAAqB,CAAS;IAEtC;;;OAGG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAsB1B;;;;OAIG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAQ7B;;;;OAIG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAMnC,kEAAkE;IAClE,IAAI,IAAI,IAAI;IAcZ,OAAO,CAAC,OAAO;IAQf,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,SAAS;IAWjB,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,eAAe;IAOvB;;;;;;OAMG;IACH,OAAO,CAAC,wBAAwB;IAgChC,OAAO,CAAC,0BAA0B;IAOlC,yEAAyE;IACzE,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,mBAAmB;CAa5B;AAED,8BAA8B;AAC9B,eAAO,MAAM,iBAAiB,mBAA0B,CAAC;AAEzD;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,qBAAqB,EAAE,MAAM,GAAG,MAAM,IAAI,CAkB3F"}
@@ -0,0 +1,275 @@
1
+ /**
2
+ * ADR-PIPELINE-099 D3 + D4 — Process-wide pipeline heartbeat.
3
+ *
4
+ * Singleton that emits a continuous "still alive" signal for the entire
5
+ * `agentics ask` lifecycle, not just Phase 1. Replaces the per-call heartbeat
6
+ * inside `executeNaturalLanguageRoute` which died as soon as auto-chain
7
+ * took over Phases 2–7, leaving the user staring at a silent terminal for
8
+ * minutes at a stretch.
9
+ *
10
+ * Two render modes:
11
+ *
12
+ * - **TTY** (`stderr.isTTY` and not opted out): a single status line is
13
+ * repainted in place every 250ms at the cursor position using a four-frame
14
+ * spinner (`◐ ◓ ◑ ◒`). The line shows the current phase, total elapsed
15
+ * time, time-since-phase-entry, and the most recent activity hint set by
16
+ * the pipeline. Other writers (`console.error`, `process.stderr.write`)
17
+ * print above the status line via cursor save/restore.
18
+ *
19
+ * - **Non-TTY** (CI, piped output, `AGENTICS_NO_HEARTBEAT=1`): the spinner
20
+ * is suppressed; instead a plain `[agentics] ⏳ still working — Phase X
21
+ * (MM:SS) — <activity>` line prints every 10 seconds, throttled to skip
22
+ * any tick that happened within 9s of another stderr write.
23
+ *
24
+ * The singleton is crash-safe: `process.on('exit' | 'SIGINT' | 'SIGTERM')`
25
+ * handlers call `stop()` to clear the live status line so it doesn't leave a
26
+ * stale frame on the user's terminal after Ctrl-C.
27
+ *
28
+ * Usage:
29
+ * ```ts
30
+ * import { pipelineHeartbeat } from './cli/ui/heartbeat.js';
31
+ * pipelineHeartbeat.start('agentics ask');
32
+ * pipelineHeartbeat.setPhase('Phase 4 — ADRs + DDDs');
33
+ * pipelineHeartbeat.setActivity('ruflo: writing adr-007');
34
+ * // ... long-running work ...
35
+ * pipelineHeartbeat.stop();
36
+ * ```
37
+ */
38
+ const FRAMES = ['◐', '◓', '◑', '◒'];
39
+ const TTY_FRAME_MS = 250;
40
+ const PLAIN_TICK_MS = 10_000;
41
+ const PLAIN_QUIET_THRESHOLD_MS = 9_000;
42
+ const COLOR = {
43
+ reset: '\x1b[0m',
44
+ dim: '\x1b[2m',
45
+ cyan: '\x1b[36m',
46
+ gray: '\x1b[90m',
47
+ };
48
+ /** True when stderr is a TTY and the user has not opted out. */
49
+ function isTtyEnabled() {
50
+ if (process.env['AGENTICS_NO_HEARTBEAT'] === '1')
51
+ return false;
52
+ if (process.env['AGENTICS_NO_LIVE'] === '1')
53
+ return false;
54
+ if (process.env['CI'])
55
+ return false;
56
+ if (process.env['NO_COLOR'])
57
+ return false;
58
+ return Boolean(process.stderr.isTTY);
59
+ }
60
+ function fmtElapsed(ms) {
61
+ const totalSec = Math.floor(ms / 1000);
62
+ const m = Math.floor(totalSec / 60);
63
+ const s = totalSec % 60;
64
+ return `${String(m).padStart(2, '0')}:${String(s).padStart(2, '0')}`;
65
+ }
66
+ class PipelineHeartbeat {
67
+ started = Date.now();
68
+ label = 'agentics';
69
+ phase = 'starting';
70
+ phaseStartedAt = Date.now();
71
+ activity = '';
72
+ activitySetAt = 0;
73
+ frameIndex = 0;
74
+ timer = null;
75
+ mode = 'off';
76
+ lastStderrWriteAt = Date.now();
77
+ statusLineRendered = false;
78
+ originalStderrWrite = null;
79
+ exitHandlersInstalled = false;
80
+ /**
81
+ * Begin emitting heartbeat ticks. Idempotent — repeated `start()` calls
82
+ * with a different label update the label but do not restart the timer.
83
+ */
84
+ start(label) {
85
+ this.label = label;
86
+ if (this.timer)
87
+ return;
88
+ // AGENTICS_HEARTBEAT_OFF=1 disables the singleton entirely (e.g. for
89
+ // tests or for users who pipe stderr to a file and don't want the
90
+ // periodic chatter). Default behaviour: tty mode if stderr is a tty,
91
+ // plain mode otherwise.
92
+ if (process.env['AGENTICS_HEARTBEAT_OFF'] === '1')
93
+ return;
94
+ this.mode = isTtyEnabled() ? 'tty' : 'plain';
95
+ this.installStderrInterceptor();
96
+ this.installExitHandlers();
97
+ if (this.mode === 'tty') {
98
+ this.timer = setInterval(() => this.tickTty(), TTY_FRAME_MS);
99
+ }
100
+ else {
101
+ this.timer = setInterval(() => this.tickPlain(), PLAIN_TICK_MS);
102
+ }
103
+ this.timer.unref();
104
+ }
105
+ /**
106
+ * Update the current phase label. Resets the per-phase timer. Called at
107
+ * every `[BEGIN]` boundary in auto-chain so the user can see which phase
108
+ * the pipeline is currently inside.
109
+ */
110
+ setPhase(phase) {
111
+ this.phase = phase;
112
+ this.phaseStartedAt = Date.now();
113
+ this.activity = '';
114
+ this.activitySetAt = 0;
115
+ if (this.mode === 'tty')
116
+ this.repaintTtyNow();
117
+ }
118
+ /**
119
+ * Update the latest activity hint. Examples: "ruflo: dispatching task adr-007",
120
+ * "fleet: 47/109 agents complete", "phase7: rendering decision-memo.md".
121
+ * Recent sets (within ~750ms) suppress the next TTY tick to avoid flicker.
122
+ */
123
+ setActivity(activity) {
124
+ this.activity = activity;
125
+ this.activitySetAt = Date.now();
126
+ if (this.mode === 'tty')
127
+ this.repaintTtyNow();
128
+ }
129
+ /** Stop the timer, clear the live status line, restore stderr. */
130
+ stop() {
131
+ if (this.timer) {
132
+ clearInterval(this.timer);
133
+ this.timer = null;
134
+ }
135
+ if (this.mode === 'tty' && this.statusLineRendered) {
136
+ this.clearStatusLine();
137
+ }
138
+ this.uninstallStderrInterceptor();
139
+ this.mode = 'off';
140
+ }
141
+ // ── Internal ─────────────────────────────────────────────────────────────
142
+ tickTty() {
143
+ // Auto-suppress flicker: if setActivity fired within the last 750ms, skip
144
+ // this tick — the activity-driven repaint already happened.
145
+ if (Date.now() - this.activitySetAt < 750 && this.activitySetAt > 0)
146
+ return;
147
+ this.frameIndex = (this.frameIndex + 1) % FRAMES.length;
148
+ this.paintStatusLine();
149
+ }
150
+ repaintTtyNow() {
151
+ this.frameIndex = (this.frameIndex + 1) % FRAMES.length;
152
+ this.paintStatusLine();
153
+ }
154
+ tickPlain() {
155
+ // Skip if some other writer just printed something — the user already
156
+ // has a fresh signal that we're alive.
157
+ if (Date.now() - this.lastStderrWriteAt < PLAIN_QUIET_THRESHOLD_MS)
158
+ return;
159
+ const elapsed = fmtElapsed(Date.now() - this.started);
160
+ const phaseSegment = this.phase ? `${this.phase} (${fmtElapsed(Date.now() - this.phaseStartedAt)})` : '';
161
+ const activitySegment = this.activity ? ` — ${this.activity}` : '';
162
+ const line = `[agentics] ⏳ still working — ${elapsed} — ${phaseSegment}${activitySegment}\n`;
163
+ this.writeRaw(line);
164
+ }
165
+ paintStatusLine() {
166
+ const frame = FRAMES[this.frameIndex];
167
+ const elapsedTotal = fmtElapsed(Date.now() - this.started);
168
+ const elapsedPhase = fmtElapsed(Date.now() - this.phaseStartedAt);
169
+ const phaseStr = `${COLOR.cyan}${this.phase}${COLOR.reset}`;
170
+ const elapsedStr = `${COLOR.dim}${elapsedTotal} total · ${elapsedPhase} phase${COLOR.reset}`;
171
+ const activityStr = this.activity ? ` ${COLOR.gray}·${COLOR.reset} ${this.activity}` : '';
172
+ const line = ` ${COLOR.cyan}${frame}${COLOR.reset} [${this.label}] ${phaseStr} ${COLOR.gray}·${COLOR.reset} ${elapsedStr}${activityStr}`;
173
+ this.clearStatusLine();
174
+ this.writeRaw(line);
175
+ this.statusLineRendered = true;
176
+ }
177
+ clearStatusLine() {
178
+ if (!this.statusLineRendered)
179
+ return;
180
+ // \r returns to column 0; \x1b[2K clears the entire line.
181
+ this.writeRaw('\r\x1b[2K');
182
+ this.statusLineRendered = false;
183
+ }
184
+ /**
185
+ * Wrap process.stderr.write so other writers (`console.error` etc.) clear
186
+ * the status line before printing, then we repaint after. This prevents
187
+ * the status line from being interleaved with normal log output in TTY
188
+ * mode. In plain mode the wrapper just records the timestamp so the 10s
189
+ * tick can self-suppress when other writes are happening.
190
+ */
191
+ installStderrInterceptor() {
192
+ if (this.originalStderrWrite)
193
+ return;
194
+ const stderr = process.stderr;
195
+ this.originalStderrWrite = stderr.write.bind(stderr);
196
+ const orig = this.originalStderrWrite;
197
+ const self = this;
198
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
199
+ stderr.write = function (chunk, ...rest) {
200
+ self.lastStderrWriteAt = Date.now();
201
+ // If our own paint is in flight, just pass through.
202
+ if (self.mode !== 'tty') {
203
+ return orig(chunk, ...rest);
204
+ }
205
+ // For TTY: clear the status line, write the foreign output, repaint.
206
+ // We detect "our own writes" by a sentinel prefix — calls to writeRaw
207
+ // bypass this interceptor entirely.
208
+ if (self.statusLineRendered) {
209
+ orig('\r\x1b[2K');
210
+ self.statusLineRendered = false;
211
+ }
212
+ const ok = orig(chunk, ...rest);
213
+ // Defer repaint by one tick so chained writes (multi-line console.error)
214
+ // don't repaint between every line.
215
+ queueMicrotask(() => {
216
+ if (self.mode === 'tty' && !self.statusLineRendered && self.timer) {
217
+ self.paintStatusLine();
218
+ }
219
+ });
220
+ return ok;
221
+ };
222
+ }
223
+ uninstallStderrInterceptor() {
224
+ if (!this.originalStderrWrite)
225
+ return;
226
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
227
+ process.stderr.write = this.originalStderrWrite;
228
+ this.originalStderrWrite = null;
229
+ }
230
+ /** Bypass the interceptor — used for our own status-line paint/clear. */
231
+ writeRaw(s) {
232
+ const w = this.originalStderrWrite ?? process.stderr.write.bind(process.stderr);
233
+ w(s);
234
+ }
235
+ installExitHandlers() {
236
+ if (this.exitHandlersInstalled)
237
+ return;
238
+ this.exitHandlersInstalled = true;
239
+ const cleanup = () => this.stop();
240
+ process.on('exit', cleanup);
241
+ process.on('SIGINT', () => { cleanup(); process.exit(130); });
242
+ process.on('SIGTERM', () => { cleanup(); process.exit(143); });
243
+ process.on('uncaughtException', (err) => {
244
+ cleanup();
245
+ // Re-throw on next tick so default handler still prints + exits non-zero.
246
+ setImmediate(() => { throw err; });
247
+ });
248
+ }
249
+ }
250
+ /** Process-wide singleton. */
251
+ export const pipelineHeartbeat = new PipelineHeartbeat();
252
+ /**
253
+ * Bracket a phase with `[BEGIN]` / `[END]` log markers and update the
254
+ * heartbeat's phase label. Call at the top of each phase in auto-chain.
255
+ *
256
+ * Returns a `done()` closure that emits the matching `[END]` line when the
257
+ * phase finishes. Always pair `phaseBoundary` with its returned `done` to
258
+ * keep the trace greppable.
259
+ */
260
+ export function phaseBoundary(phaseLabel, totalElapsedFromStart) {
261
+ const tStart = Date.now();
262
+ const t = fmtElapsed(totalElapsedFromStart);
263
+ pipelineHeartbeat.setPhase(phaseLabel);
264
+ // ANSI bold for the [BEGIN] marker so it stands out in scrollback.
265
+ process.stderr.write(`\n${'='.repeat(72)}\n` +
266
+ ` ▶ ${phaseLabel} [BEGIN] T+${t}\n` +
267
+ `${'='.repeat(72)}\n`);
268
+ return () => {
269
+ const dur = fmtElapsed(Date.now() - tStart);
270
+ process.stderr.write(`${'='.repeat(72)}\n` +
271
+ ` ▼ ${phaseLabel} ✓ completed (${dur}) [END]\n` +
272
+ `${'='.repeat(72)}\n\n`);
273
+ };
274
+ }
275
+ //# sourceMappingURL=heartbeat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"heartbeat.js","sourceRoot":"","sources":["../../../src/cli/ui/heartbeat.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/commands/agents.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/commands/agents.ts"],"names":[],"mappings":"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"}
@@ -17,6 +17,7 @@ import { execFileSync } from 'node:child_process';
17
17
  import { isTransientFailure, isTerminalFailure } from '../errors/transient.js';
18
18
  import { recordDegradation, drainDegradations } from '../observability/degradations.js';
19
19
  import { computePhase1Verdict } from '../pipeline/phase1-verdict.js';
20
+ import { pipelineHeartbeat } from '../cli/ui/heartbeat.js';
20
21
  // ============================================================================
21
22
  // ADR-066: Copilot agents via claude --print (Claude Max — no API key needed)
22
23
  // ============================================================================
@@ -3779,26 +3780,14 @@ export async function executeNaturalLanguageRoute(query, options) {
3779
3780
  // the user sees the route is executing even if subsequent operations
3780
3781
  // (graph load, ruvector simulation, fleet dispatch) take a while.
3781
3782
  process.stderr.write(`[agentics] route entered — query="${query.slice(0, 100)}${query.length > 100 ? '…' : ''}" depth=${options.depth ?? 'lite'} trace=${correlationId.slice(0, 8)}\n`);
3782
- // Global 10-second heartbeat. Ticks until process exit (`unref()` keeps it
3783
- // from blocking termination). When any other code emits its own output the
3784
- // tick still fires but that's acceptable better noisy than silent. The
3785
- // heartbeat suppresses itself via `lastOutputAt` if other writes have
3786
- // happened recently.
3787
- let lastOutputAt = Date.now();
3788
- const realStderrWrite = process.stderr.write.bind(process.stderr);
3789
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
3790
- process.stderr.write = (chunk, ...rest) => {
3791
- lastOutputAt = Date.now();
3792
- return realStderrWrite(chunk, ...rest);
3793
- };
3794
- const heartbeat = setInterval(() => {
3795
- if (Date.now() - lastOutputAt < 9_000)
3796
- return; // something else just wrote
3797
- const elapsedSec = Math.floor((Date.now() - start) / 1000);
3798
- realStderrWrite(`[agentics] ⏳ still working — ${elapsedSec}s elapsed\n`);
3799
- lastOutputAt = Date.now();
3800
- }, 10_000);
3801
- heartbeat.unref();
3783
+ // ADR-PIPELINE-099 D3 process-wide heartbeat. Survives across the
3784
+ // executeNaturalLanguageRoute executeAutoChain handoff (the previous
3785
+ // per-call heartbeat died at the function boundary, leaving Phases 2–7
3786
+ // silent for minutes at a time). Idempotent auto-chain calls start()
3787
+ // again with no effect. Stop happens at the end of executeAutoChain or
3788
+ // via the singleton's exit handlers.
3789
+ pipelineHeartbeat.start('agentics ask');
3790
+ pipelineHeartbeat.setPhase('Phase 1 — Fleet Dispatch + Simulation');
3802
3791
  // ========================================================================
3803
3792
  // ADR-030: Capability Graph Routing
3804
3793
  //
@@ -3841,6 +3830,7 @@ export async function executeNaturalLanguageRoute(query, options) {
3841
3830
  console.error(graphResult.routing.explanation);
3842
3831
  // Run ruvector simulation first (same as full-fleet path, ADR-016)
3843
3832
  console.error(' [RUVECTOR] Running simulation before graph-routed dispatch (ADR-016)...');
3833
+ pipelineHeartbeat.setActivity(`ruvector: simulating ${graphResult.routing.totalAgents}-agent graph route`);
3844
3834
  const simResult = await (async () => {
3845
3835
  const MAX_RETRIES = 3;
3846
3836
  let lastErr;
@@ -3879,6 +3869,7 @@ export async function executeNaturalLanguageRoute(query, options) {
3879
3869
  const REPO_LOCAL_DOMAINS = new Set(['copilot']);
3880
3870
  const prevLocalAgents = process.env['AGENTICS_LOCAL_AGENTS'];
3881
3871
  console.error(` Dispatching ${graphResult.agents.length} graph-routed agents...`);
3872
+ pipelineHeartbeat.setActivity(`fleet: dispatching ${graphResult.agents.length} graph-routed agents`);
3882
3873
  const agentPromises = [];
3883
3874
  for (const ref of graphResult.agents) {
3884
3875
  agentPromises.push((async () => {
@@ -4189,6 +4180,7 @@ export async function executeNaturalLanguageRoute(query, options) {
4189
4180
  { domain: 'platform', agent: 'risk-score' },
4190
4181
  ];
4191
4182
  console.error(`Dispatching ${fleetAgents.length} agents across ALL 27 domains + ruvector simulation`);
4183
+ pipelineHeartbeat.setActivity(`fleet: dispatching ${fleetAgents.length} agents across 27 domains`);
4192
4184
  // ========================================================================
4193
4185
  // ADR-016: Run ruvector simulation BEFORE fleet dispatch (sequential).
4194
4186
  //
@@ -4201,6 +4193,7 @@ export async function executeNaturalLanguageRoute(query, options) {
4201
4193
  // start the fleet. Adds ~5s latency but guarantees simulation success.
4202
4194
  // ========================================================================
4203
4195
  console.error(' [RUVECTOR] Running simulation before fleet dispatch (ADR-016)...');
4196
+ pipelineHeartbeat.setActivity('ruvector: pre-fleet simulation');
4204
4197
  const simResult = await (async () => {
4205
4198
  const MAX_RETRIES = 3;
4206
4199
  let lastErr;