@llm-dev-ops/agentics-cli 2.7.25 → 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.
- package/dist/cli/index.js +9 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/ui/heartbeat.d.ts +101 -0
- package/dist/cli/ui/heartbeat.d.ts.map +1 -0
- package/dist/cli/ui/heartbeat.js +275 -0
- package/dist/cli/ui/heartbeat.js.map +1 -0
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +17 -0
- package/dist/commands/agents.js.map +1 -1
- package/dist/pipeline/auto-chain.d.ts.map +1 -1
- package/dist/pipeline/auto-chain.js +86 -2
- package/dist/pipeline/auto-chain.js.map +1 -1
- package/dist/pipeline/local-fallback/phase5a-local-fallback.d.ts +18 -21
- package/dist/pipeline/local-fallback/phase5a-local-fallback.d.ts.map +1 -1
- package/dist/pipeline/local-fallback/phase5a-local-fallback.js +287 -94
- package/dist/pipeline/local-fallback/phase5a-local-fallback.js.map +1 -1
- package/dist/pipeline/phases/prompt-generator.js +65 -136
- package/dist/pipeline/phases/prompt-generator.js.map +1 -1
- package/dist/pipeline/ruflo-phase-executor.d.ts.map +1 -1
- package/dist/pipeline/ruflo-phase-executor.js +23 -18
- package/dist/pipeline/ruflo-phase-executor.js.map +1 -1
- package/dist/synthesis/agent-fleet-decomposer.d.ts +100 -0
- package/dist/synthesis/agent-fleet-decomposer.d.ts.map +1 -0
- package/dist/synthesis/agent-fleet-decomposer.js +550 -0
- package/dist/synthesis/agent-fleet-decomposer.js.map +1 -0
- package/package.json +1 -1
|
@@ -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":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAEH,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AACpC,MAAM,YAAY,GAAG,GAAG,CAAC;AACzB,MAAM,aAAa,GAAG,MAAM,CAAC;AAC7B,MAAM,wBAAwB,GAAG,KAAK,CAAC;AAEvC,MAAM,KAAK,GAAG;IACZ,KAAK,EAAE,SAAS;IAChB,GAAG,EAAE,SAAS;IACd,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,UAAU;CACR,CAAC;AAEX,gEAAgE;AAChE,SAAS,YAAY;IACnB,IAAI,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,KAAK,GAAG;QAAE,OAAO,KAAK,CAAC;IAC/D,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,KAAK,GAAG;QAAE,OAAO,KAAK,CAAC;IAC1D,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACpC,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1C,OAAO,OAAO,CAAE,OAAO,CAAC,MAA6B,CAAC,KAAK,CAAC,CAAC;AAC/D,CAAC;AAED,SAAS,UAAU,CAAC,EAAU;IAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;IACvC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAC;IACpC,MAAM,CAAC,GAAG,QAAQ,GAAG,EAAE,CAAC;IACxB,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AACvE,CAAC;AAED,MAAM,iBAAiB;IACJ,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC9B,KAAK,GAAG,UAAU,CAAC;IACnB,KAAK,GAAG,UAAU,CAAC;IACnB,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC5B,QAAQ,GAAG,EAAE,CAAC;IACd,aAAa,GAAG,CAAC,CAAC;IAClB,UAAU,GAAG,CAAC,CAAC;IACf,KAAK,GAA0B,IAAI,CAAC;IACpC,IAAI,GAA4B,KAAK,CAAC;IACtC,iBAAiB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC/B,kBAAkB,GAAG,KAAK,CAAC;IAC3B,mBAAmB,GAAuC,IAAI,CAAC;IAC/D,qBAAqB,GAAG,KAAK,CAAC;IAEtC;;;OAGG;IACH,KAAK,CAAC,KAAa;QACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO;QAEvB,qEAAqE;QACrE,kEAAkE;QAClE,qEAAqE;QACrE,wBAAwB;QACxB,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,KAAK,GAAG;YAAE,OAAO;QAC1D,IAAI,CAAC,IAAI,GAAG,YAAY,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;QAE7C,IAAI,CAAC,wBAAwB,EAAE,CAAC;QAChC,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAE3B,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;QAC/D,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,aAAa,CAAC,CAAC;QAClE,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;IAED;;;;OAIG;IACH,QAAQ,CAAC,KAAa;QACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACjC,IAAI,CAAC,QAAQ,GAAG,EAAE,CAAC;QACnB,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;QACvB,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK;YAAE,IAAI,CAAC,aAAa,EAAE,CAAC;IAChD,CAAC;IAED;;;;OAIG;IACH,WAAW,CAAC,QAAgB;QAC1B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAChC,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK;YAAE,IAAI,CAAC,aAAa,EAAE,CAAC;IAChD,CAAC;IAED,kEAAkE;IAClE,IAAI;QACF,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YACnD,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC;QACD,IAAI,CAAC,0BAA0B,EAAE,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;IACpB,CAAC;IAED,4EAA4E;IAEpE,OAAO;QACb,0EAA0E;QAC1E,4DAA4D;QAC5D,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,aAAa,GAAG,GAAG,IAAI,IAAI,CAAC,aAAa,GAAG,CAAC;YAAE,OAAO;QAC5E,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;QACxD,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAEO,aAAa;QACnB,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC;QACxD,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAEO,SAAS;QACf,sEAAsE;QACtE,uCAAuC;QACvC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,iBAAiB,GAAG,wBAAwB;YAAE,OAAO;QAC3E,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;QACtD,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,KAAK,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACzG,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,MAAM,IAAI,GAAG,gCAAgC,OAAO,MAAM,YAAY,GAAG,eAAe,IAAI,CAAC;QAC7F,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IAEO,eAAe;QACrB,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAE,CAAC;QACvC,MAAM,YAAY,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;QAC3D,MAAM,YAAY,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,CAAC;QAClE,MAAM,QAAQ,GAAG,GAAG,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC;QAC5D,MAAM,UAAU,GAAG,GAAG,KAAK,CAAC,GAAG,GAAG,YAAY,YAAY,YAAY,SAAS,KAAK,CAAC,KAAK,EAAE,CAAC;QAC7F,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1F,MAAM,IAAI,GAAG,IAAI,KAAK,CAAC,IAAI,GAAG,KAAK,GAAG,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,IAAI,UAAU,GAAG,WAAW,EAAE,CAAC;QACzI,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACpB,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;IACjC,CAAC;IAEO,eAAe;QACrB,IAAI,CAAC,IAAI,CAAC,kBAAkB;YAAE,OAAO;QACrC,0DAA0D;QAC1D,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAC3B,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;IAClC,CAAC;IAED;;;;;;OAMG;IACK,wBAAwB;QAC9B,IAAI,IAAI,CAAC,mBAAmB;YAAE,OAAO;QACrC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC9B,IAAI,CAAC,mBAAmB,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrD,MAAM,IAAI,GAAG,IAAI,CAAC,mBAAmB,CAAC;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC;QAClB,8DAA8D;QAC7D,MAAc,CAAC,KAAK,GAAG,UAAU,KAAU,EAAE,GAAG,IAAW;YAC1D,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACpC,oDAAoD;YACpD,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;gBACxB,OAAO,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC;YAC9B,CAAC;YACD,qEAAqE;YACrE,sEAAsE;YACtE,oCAAoC;YACpC,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBAC5B,IAAI,CAAC,WAAW,CAAC,CAAC;gBAClB,IAAI,CAAC,kBAAkB,GAAG,KAAK,CAAC;YAClC,CAAC;YACD,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC;YAChC,yEAAyE;YACzE,oCAAoC;YACpC,cAAc,CAAC,GAAG,EAAE;gBAClB,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;oBAClE,IAAI,CAAC,eAAe,EAAE,CAAC;gBACzB,CAAC;YACH,CAAC,CAAC,CAAC;YACH,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;IACJ,CAAC;IAEO,0BAA0B;QAChC,IAAI,CAAC,IAAI,CAAC,mBAAmB;YAAE,OAAO;QACtC,8DAA8D;QAC7D,OAAO,CAAC,MAAc,CAAC,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC;QACzD,IAAI,CAAC,mBAAmB,GAAG,IAAI,CAAC;IAClC,CAAC;IAED,yEAAyE;IACjE,QAAQ,CAAC,CAAS;QACxB,MAAM,CAAC,GAAG,IAAI,CAAC,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAChF,CAAC,CAAC,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,mBAAmB;QACzB,IAAI,IAAI,CAAC,qBAAqB;YAAE,OAAO;QACvC,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC;QAClC,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAClC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC5B,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9D,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/D,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,GAAG,EAAE,EAAE;YACtC,OAAO,EAAE,CAAC;YACV,0EAA0E;YAC1E,YAAY,CAAC,GAAG,EAAE,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAED,8BAA8B;AAC9B,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,EAAE,CAAC;AAEzD;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,UAAkB,EAAE,qBAA6B;IAC7E,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC1B,MAAM,CAAC,GAAG,UAAU,CAAC,qBAAqB,CAAC,CAAC;IAC5C,iBAAiB,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IACvC,mEAAmE;IACnE,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI;QACvB,OAAO,UAAU,+BAA+B,CAAC,IAAI;QACrD,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CACtB,CAAC;IACF,OAAO,GAAG,EAAE;QACV,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC;QAC5C,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI;YACrB,OAAO,UAAU,mBAAmB,GAAG,YAAY;YACnD,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CACxB,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/commands/agents.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAMxD,OAAO,EAAwB,KAAK,mBAAmB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/commands/agents.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/agents.js
CHANGED
|
@@ -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
|
// ============================================================================
|
|
@@ -3775,6 +3776,18 @@ export function buildDomainPayload(domain, agent, query, correlationId) {
|
|
|
3775
3776
|
export async function executeNaturalLanguageRoute(query, options) {
|
|
3776
3777
|
const start = Date.now();
|
|
3777
3778
|
const correlationId = options.trace_id ?? crypto.randomUUID();
|
|
3779
|
+
// Top-of-function entry banner — fires within microseconds of dispatch so
|
|
3780
|
+
// the user sees the route is executing even if subsequent operations
|
|
3781
|
+
// (graph load, ruvector simulation, fleet dispatch) take a while.
|
|
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`);
|
|
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');
|
|
3778
3791
|
// ========================================================================
|
|
3779
3792
|
// ADR-030: Capability Graph Routing
|
|
3780
3793
|
//
|
|
@@ -3817,6 +3830,7 @@ export async function executeNaturalLanguageRoute(query, options) {
|
|
|
3817
3830
|
console.error(graphResult.routing.explanation);
|
|
3818
3831
|
// Run ruvector simulation first (same as full-fleet path, ADR-016)
|
|
3819
3832
|
console.error(' [RUVECTOR] Running simulation before graph-routed dispatch (ADR-016)...');
|
|
3833
|
+
pipelineHeartbeat.setActivity(`ruvector: simulating ${graphResult.routing.totalAgents}-agent graph route`);
|
|
3820
3834
|
const simResult = await (async () => {
|
|
3821
3835
|
const MAX_RETRIES = 3;
|
|
3822
3836
|
let lastErr;
|
|
@@ -3855,6 +3869,7 @@ export async function executeNaturalLanguageRoute(query, options) {
|
|
|
3855
3869
|
const REPO_LOCAL_DOMAINS = new Set(['copilot']);
|
|
3856
3870
|
const prevLocalAgents = process.env['AGENTICS_LOCAL_AGENTS'];
|
|
3857
3871
|
console.error(` Dispatching ${graphResult.agents.length} graph-routed agents...`);
|
|
3872
|
+
pipelineHeartbeat.setActivity(`fleet: dispatching ${graphResult.agents.length} graph-routed agents`);
|
|
3858
3873
|
const agentPromises = [];
|
|
3859
3874
|
for (const ref of graphResult.agents) {
|
|
3860
3875
|
agentPromises.push((async () => {
|
|
@@ -4165,6 +4180,7 @@ export async function executeNaturalLanguageRoute(query, options) {
|
|
|
4165
4180
|
{ domain: 'platform', agent: 'risk-score' },
|
|
4166
4181
|
];
|
|
4167
4182
|
console.error(`Dispatching ${fleetAgents.length} agents across ALL 27 domains + ruvector simulation`);
|
|
4183
|
+
pipelineHeartbeat.setActivity(`fleet: dispatching ${fleetAgents.length} agents across 27 domains`);
|
|
4168
4184
|
// ========================================================================
|
|
4169
4185
|
// ADR-016: Run ruvector simulation BEFORE fleet dispatch (sequential).
|
|
4170
4186
|
//
|
|
@@ -4177,6 +4193,7 @@ export async function executeNaturalLanguageRoute(query, options) {
|
|
|
4177
4193
|
// start the fleet. Adds ~5s latency but guarantees simulation success.
|
|
4178
4194
|
// ========================================================================
|
|
4179
4195
|
console.error(' [RUVECTOR] Running simulation before fleet dispatch (ADR-016)...');
|
|
4196
|
+
pipelineHeartbeat.setActivity('ruvector: pre-fleet simulation');
|
|
4180
4197
|
const simResult = await (async () => {
|
|
4181
4198
|
const MAX_RETRIES = 3;
|
|
4182
4199
|
let lastErr;
|