agent-nuvira 3.5.0 → 3.5.2
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/README.md +13 -13
- package/dist/agent-sdk/src/scaffold.d.ts +1 -1
- package/dist/agent-sdk/src/scaffold.js +1 -1
- package/dist/cli/chat.d.ts +159 -6
- package/dist/cli/chat.d.ts.map +1 -1
- package/dist/cli/chat.js +583 -35
- package/dist/cli/chat.js.map +1 -1
- package/dist/cli/duties.d.ts +11 -0
- package/dist/cli/duties.d.ts.map +1 -1
- package/dist/cli/duties.js +31 -0
- package/dist/cli/duties.js.map +1 -1
- package/dist/cli/edit.d.ts.map +1 -1
- package/dist/cli/edit.js +3 -2
- package/dist/cli/edit.js.map +1 -1
- package/dist/cli/execute.d.ts.map +1 -1
- package/dist/cli/execute.js +10 -3
- package/dist/cli/execute.js.map +1 -1
- package/dist/cli/loop-executor.d.ts +16 -0
- package/dist/cli/loop-executor.d.ts.map +1 -1
- package/dist/cli/loop-executor.js +9 -0
- package/dist/cli/loop-executor.js.map +1 -1
- package/dist/cli/models.d.ts.map +1 -1
- package/dist/cli/models.js +55 -0
- package/dist/cli/models.js.map +1 -1
- package/dist/cli/plan.d.ts.map +1 -1
- package/dist/cli/plan.js +18 -6
- package/dist/cli/plan.js.map +1 -1
- package/dist/cli/run.d.ts.map +1 -1
- package/dist/cli/run.js +23 -8
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/ui/answer-view.d.ts +38 -0
- package/dist/cli/ui/answer-view.d.ts.map +1 -0
- package/dist/cli/ui/answer-view.js +72 -0
- package/dist/cli/ui/answer-view.js.map +1 -0
- package/dist/cli/ui/cards.d.ts +61 -0
- package/dist/cli/ui/cards.d.ts.map +1 -0
- package/dist/cli/ui/cards.js +141 -0
- package/dist/cli/ui/cards.js.map +1 -0
- package/dist/cli/ui/highlight.d.ts +32 -0
- package/dist/cli/ui/highlight.d.ts.map +1 -0
- package/dist/cli/ui/highlight.js +261 -0
- package/dist/cli/ui/highlight.js.map +1 -0
- package/dist/cli/ui/index.d.ts +21 -0
- package/dist/cli/ui/index.d.ts.map +1 -0
- package/dist/cli/ui/index.js +14 -0
- package/dist/cli/ui/index.js.map +1 -0
- package/dist/cli/ui/markdown.d.ts +90 -0
- package/dist/cli/ui/markdown.d.ts.map +1 -0
- package/dist/cli/ui/markdown.js +292 -0
- package/dist/cli/ui/markdown.js.map +1 -0
- package/dist/cli/ui/presenter.d.ts +147 -0
- package/dist/cli/ui/presenter.d.ts.map +1 -0
- package/dist/cli/ui/presenter.js +313 -0
- package/dist/cli/ui/presenter.js.map +1 -0
- package/dist/cli/ui/render.d.ts +52 -0
- package/dist/cli/ui/render.d.ts.map +1 -0
- package/dist/cli/ui/render.js +384 -0
- package/dist/cli/ui/render.js.map +1 -0
- package/dist/cli/ui/theme.d.ts +36 -0
- package/dist/cli/ui/theme.d.ts.map +1 -0
- package/dist/cli/ui/theme.js +92 -0
- package/dist/cli/ui/theme.js.map +1 -0
- package/dist/inference/model-entitlement.d.ts +10 -0
- package/dist/inference/model-entitlement.d.ts.map +1 -1
- package/dist/inference/model-entitlement.js +1 -1
- package/dist/inference/model-entitlement.js.map +1 -1
- package/dist/learning/auto-router.d.ts +38 -1
- package/dist/learning/auto-router.d.ts.map +1 -1
- package/dist/learning/auto-router.js +139 -8
- package/dist/learning/auto-router.js.map +1 -1
- package/dist/learning/duty-lease.d.ts +163 -0
- package/dist/learning/duty-lease.d.ts.map +1 -0
- package/dist/learning/duty-lease.js +301 -0
- package/dist/learning/duty-lease.js.map +1 -0
- package/dist/learning/model-first-router.d.ts +14 -0
- package/dist/learning/model-first-router.d.ts.map +1 -1
- package/dist/learning/model-first-router.js +54 -17
- package/dist/learning/model-first-router.js.map +1 -1
- package/dist/learning/model-warmup.d.ts +92 -0
- package/dist/learning/model-warmup.d.ts.map +1 -1
- package/dist/learning/model-warmup.js +137 -2
- package/dist/learning/model-warmup.js.map +1 -1
- package/dist/learning/reasoning-trace.d.ts +21 -1
- package/dist/learning/reasoning-trace.d.ts.map +1 -1
- package/dist/learning/reasoning-trace.js.map +1 -1
- package/dist/learning/resilient-call.d.ts.map +1 -1
- package/dist/learning/resilient-call.js +70 -4
- package/dist/learning/resilient-call.js.map +1 -1
- package/dist/learning/retry-patience.d.ts +139 -0
- package/dist/learning/retry-patience.d.ts.map +1 -0
- package/dist/learning/retry-patience.js +169 -0
- package/dist/learning/retry-patience.js.map +1 -0
- package/dist/tools/process-liveness.d.ts +227 -0
- package/dist/tools/process-liveness.d.ts.map +1 -0
- package/dist/tools/process-liveness.js +486 -0
- package/dist/tools/process-liveness.js.map +1 -0
- package/dist/tools/registry.d.ts.map +1 -1
- package/dist/tools/registry.js +4 -2
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/run-registry.d.ts +282 -0
- package/dist/tools/run-registry.d.ts.map +1 -0
- package/dist/tools/run-registry.js +544 -0
- package/dist/tools/run-registry.js.map +1 -0
- package/dist/tools/run-terminal.d.ts +100 -2
- package/dist/tools/run-terminal.d.ts.map +1 -1
- package/dist/tools/run-terminal.js +841 -67
- package/dist/tools/run-terminal.js.map +1 -1
- package/dist/tools/tool-loop.d.ts +87 -3
- package/dist/tools/tool-loop.d.ts.map +1 -1
- package/dist/tools/tool-loop.js +375 -6
- package/dist/tools/tool-loop.js.map +1 -1
- package/dist/web-dashboard/chat-console.d.ts +25 -0
- package/dist/web-dashboard/chat-console.d.ts.map +1 -1
- package/dist/web-dashboard/chat-console.js +16 -1
- package/dist/web-dashboard/chat-console.js.map +1 -1
- package/dist/web-dashboard/server.d.ts.map +1 -1
- package/dist/web-dashboard/server.js +7 -1
- package/dist/web-dashboard/server.js.map +1 -1
- package/dist/web-dashboard/src/types.d.ts +32 -1
- package/dist/web-dashboard/src/types.d.ts.map +1 -1
- package/dist/web-dashboard/task-registry.d.ts +98 -0
- package/dist/web-dashboard/task-registry.d.ts.map +1 -0
- package/dist/web-dashboard/task-registry.js +159 -0
- package/dist/web-dashboard/task-registry.js.map +1 -0
- package/dist/web-dashboard/task-runner.d.ts +155 -5
- package/dist/web-dashboard/task-runner.d.ts.map +1 -1
- package/dist/web-dashboard/task-runner.js +505 -14
- package/dist/web-dashboard/task-runner.js.map +1 -1
- package/package.json +4 -1
- package/src/web-dashboard/public/assets/index-DycGBWwy.js +236 -0
- package/src/web-dashboard/public/assets/index-DycGBWwy.js.map +1 -0
- package/src/web-dashboard/public/index.html +1 -1
- package/src/web-dashboard/public/assets/index-yky0dw5e.js +0 -236
- package/src/web-dashboard/public/assets/index-yky0dw5e.js.map +0 -1
|
@@ -0,0 +1,486 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Process liveness — is a long-running command WORKING, or is it HUNG?
|
|
3
|
+
*
|
|
4
|
+
* WHY THIS EXISTS. Handing a command to monitoring instead of killing it at a
|
|
5
|
+
* clock (see `run-terminal.ts`) removed the false failure, but it left the
|
|
6
|
+
* opposite hole open: a command that is genuinely STUCK — waiting on a prompt
|
|
7
|
+
* with no stdin, holding a lock, blocked on a socket that will never answer —
|
|
8
|
+
* now runs forever, and "it is still running" is not a diagnosis. Silence alone
|
|
9
|
+
* cannot tell the two apart, because a real test suite can be quiet for minutes
|
|
10
|
+
* while it works. The signal that separates them is CPU:
|
|
11
|
+
*
|
|
12
|
+
* - producing output → it is doing something
|
|
13
|
+
* - burning CPU with no output → it is computing (a build, a solver)
|
|
14
|
+
* - NO output AND NO CPU for a long time → it is waiting for something that is
|
|
15
|
+
* never coming. That is a hang, and it is a FACT about the process, not a
|
|
16
|
+
* guess from a stopwatch.
|
|
17
|
+
*
|
|
18
|
+
* So this module samples the process TREE (the shell `spawn(..., { shell: true })`
|
|
19
|
+
* creates plus everything under it) for cumulative CPU time, and classifies a
|
|
20
|
+
* run into `working` / `stalled` / `hung` with the evidence attached. Callers
|
|
21
|
+
* decide what to do with the verdict; the one rule this module enforces is that
|
|
22
|
+
* `hung` requires POSITIVE evidence (measurable CPU that is not advancing) —
|
|
23
|
+
* when CPU cannot be measured, a long silence is reported as `stalled`, never as
|
|
24
|
+
* `hung`, because an unmeasurable process must not be reaped on a guess.
|
|
25
|
+
*
|
|
26
|
+
* Platform: on POSIX the table comes from `ps` (macOS + Linux), the same tool
|
|
27
|
+
* `src/cli/process-control.ts` already relies on. On Windows it comes from ONE
|
|
28
|
+
* `Get-CimInstance Win32_Process` query — which reports `ParentProcessId` AND
|
|
29
|
+
* `KernelModeTime` + `UserModeTime` (CPU, in 100ns units) — so the same rule
|
|
30
|
+
* works there instead of degrading to silence-only: the tree walk and the
|
|
31
|
+
* zero-CPU evidence are both available, with `wmic` as the fallback the rest of
|
|
32
|
+
* this repo already uses.
|
|
33
|
+
*
|
|
34
|
+
* One Windows semantic difference is worth stating plainly, because `kill`
|
|
35
|
+
* implies something it cannot deliver there: Windows has no graceful SIGTERM.
|
|
36
|
+
* `process.kill(pid, 'SIGTERM')` is an immediate termination, so the
|
|
37
|
+
* SIGTERM→grace→SIGKILL ladder is a POSIX-only refinement.
|
|
38
|
+
*/
|
|
39
|
+
import { execFileSync, execSync } from 'node:child_process';
|
|
40
|
+
export const DEFAULT_LIVENESS_THRESHOLDS = {
|
|
41
|
+
stallQuietMs: 60_000,
|
|
42
|
+
hangQuietMs: 300_000,
|
|
43
|
+
hangCpuFloorMs: 500,
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* The thresholds, with env overrides — read at CALL time, not module load, so a
|
|
47
|
+
* test (or an operator) can change them without re-importing.
|
|
48
|
+
*
|
|
49
|
+
* `NUVIRA_HANG_QUIET_MS` is the one that matters operationally: it is how long a
|
|
50
|
+
* command may be silent AND idle before the agent is told it is hung.
|
|
51
|
+
*/
|
|
52
|
+
export function livenessThresholds(env = process.env) {
|
|
53
|
+
const int = (raw, fallback) => {
|
|
54
|
+
const n = Number.parseInt(String(raw ?? '').trim(), 10);
|
|
55
|
+
return Number.isFinite(n) && n > 0 ? n : fallback;
|
|
56
|
+
};
|
|
57
|
+
return {
|
|
58
|
+
stallQuietMs: int(env.NUVIRA_STALL_QUIET_MS, DEFAULT_LIVENESS_THRESHOLDS.stallQuietMs),
|
|
59
|
+
hangQuietMs: int(env.NUVIRA_HANG_QUIET_MS, DEFAULT_LIVENESS_THRESHOLDS.hangQuietMs),
|
|
60
|
+
hangCpuFloorMs: int(env.NUVIRA_HANG_CPU_MS, DEFAULT_LIVENESS_THRESHOLDS.hangCpuFloorMs),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Parse a `ps -o time=` value into milliseconds of cumulative CPU.
|
|
65
|
+
*
|
|
66
|
+
* Formats seen in the wild: `MM:SS.cc` (macOS), `HH:MM:SS` (Linux), and
|
|
67
|
+
* `DD-HH:MM:SS` (BSD, for a long-lived process). A value that does not parse is
|
|
68
|
+
* `null` — the caller must treat "no reading" differently from "no CPU", or a
|
|
69
|
+
* formatting change would read as a hang.
|
|
70
|
+
*/
|
|
71
|
+
export function parseCpuTime(text) {
|
|
72
|
+
const m = /^(?:(\d+)-)?(?:(\d+):)?(\d+):(\d+(?:\.\d+)?)$/.exec(text.trim());
|
|
73
|
+
if (!m)
|
|
74
|
+
return null;
|
|
75
|
+
const days = Number(m[1] ?? 0);
|
|
76
|
+
const hours = Number(m[2] ?? 0);
|
|
77
|
+
const minutes = Number(m[3]);
|
|
78
|
+
const seconds = Number(m[4]);
|
|
79
|
+
if (![days, hours, minutes, seconds].every((n) => Number.isFinite(n)))
|
|
80
|
+
return null;
|
|
81
|
+
return ((days * 24 + hours) * 60 + minutes) * 60_000 + Math.round(seconds * 1000);
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* `lstart`, the OS's own answer to "when did this process start" — `Day Mon D
|
|
85
|
+
* HH:MM:SS YYYY` (e.g. `Tue Oct 14 15:02:03 2026`).
|
|
86
|
+
*
|
|
87
|
+
* Matched structurally because `ps` has no way to emit a marker column: the
|
|
88
|
+
* pattern is anchored right after the CPU field, and a command line whose first
|
|
89
|
+
* five words happen to look exactly like that is not a thing. If it does not
|
|
90
|
+
* match, the remainder is the command — the old behaviour, unchanged.
|
|
91
|
+
*/
|
|
92
|
+
const POSIX_LSTART = /^([A-Za-z]{3}\s+[A-Za-z]{3}\s+\d{1,2}\s+\d{2}:\d{2}:\d{2}\s+\d{4})\s+(.*)$/;
|
|
93
|
+
/**
|
|
94
|
+
* Parse a POSIX process table: `ps -eo pid=,ppid=,time=,lstart=,command=` — and
|
|
95
|
+
* the older `…,command=` shape, which parses identically minus the start token.
|
|
96
|
+
*
|
|
97
|
+
* The command column is LAST on purpose: it may contain spaces and anything else,
|
|
98
|
+
* so everything after the known fields is taken verbatim.
|
|
99
|
+
*/
|
|
100
|
+
export function parsePosixProcessTable(stdout) {
|
|
101
|
+
const table = new Map();
|
|
102
|
+
for (const line of stdout.split('\n')) {
|
|
103
|
+
const m = /^\s*(\d+)\s+(\d+)\s+(\S+)\s+(.*)$/.exec(line);
|
|
104
|
+
if (!m)
|
|
105
|
+
continue;
|
|
106
|
+
const rest = m[4].trim();
|
|
107
|
+
const withStart = POSIX_LSTART.exec(rest);
|
|
108
|
+
table.set(Number.parseInt(m[1], 10), {
|
|
109
|
+
ppid: Number.parseInt(m[2], 10),
|
|
110
|
+
cpuMs: parseCpuTime(m[3]),
|
|
111
|
+
command: (withStart ? withStart[2] : rest).trim() || null,
|
|
112
|
+
// Whitespace inside the token is collapsed so `ps`'s column padding cannot
|
|
113
|
+
// make two readings of the SAME process compare unequal.
|
|
114
|
+
startedAtText: withStart ? withStart[1].replace(/\s+/g, ' ').trim() : null,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
return table;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Parse the Windows probe: `<pid>|<ppid>|<kernel 100ns>|<user 100ns>|<command>`.
|
|
121
|
+
*
|
|
122
|
+
* The pipe-delimited shape is the one `src/cli/process-control.ts` already uses
|
|
123
|
+
* for the same reason: it survives command lines that contain spaces, commas or
|
|
124
|
+
* quotes. A process whose CPU counters are unreadable (`KernelModeTime` is null
|
|
125
|
+
* for some system processes) yields an EMPTY field, which must stay
|
|
126
|
+
* "unmeasurable" — not zero — or an unreadable counter would read as a hang.
|
|
127
|
+
*
|
|
128
|
+
* 100ns units are converted to ms (÷10 000), the same unit `ps` reports in.
|
|
129
|
+
*/
|
|
130
|
+
export function parseWindowsProcessTable(stdout) {
|
|
131
|
+
const table = new Map();
|
|
132
|
+
for (const line of stdout.split(/\r?\n/)) {
|
|
133
|
+
const parts = line.split('|');
|
|
134
|
+
if (parts.length < 4)
|
|
135
|
+
continue;
|
|
136
|
+
const pid = Number.parseInt(parts[0].trim(), 10);
|
|
137
|
+
const ppid = Number.parseInt(parts[1].trim(), 10);
|
|
138
|
+
if (!Number.isFinite(pid) || !Number.isFinite(ppid))
|
|
139
|
+
continue;
|
|
140
|
+
const kernel = Number.parseInt(parts[2].trim(), 10);
|
|
141
|
+
const user = Number.parseInt(parts[3].trim(), 10);
|
|
142
|
+
const measurable = Number.isFinite(kernel) && Number.isFinite(user);
|
|
143
|
+
// The start token is MARKED (`t<ticks>`), so the shape is unambiguous: a
|
|
144
|
+
// command line containing `|` can add fields but cannot manufacture a `t`
|
|
145
|
+
// marker, which a positional guess could be fooled by. A `t` with nothing
|
|
146
|
+
// after it is the honest "the OS would not tell us", not a fabricated value.
|
|
147
|
+
const marked = parts.length >= 5 && /^t\d*$/.test(parts[4].trim());
|
|
148
|
+
const commandFrom = marked ? 5 : 4;
|
|
149
|
+
table.set(pid, {
|
|
150
|
+
ppid,
|
|
151
|
+
cpuMs: measurable ? Math.round((kernel + user) / 10_000) : null,
|
|
152
|
+
command: (parts.slice(commandFrom).join('|').trim() || null),
|
|
153
|
+
startedAtText: marked ? parts[4].trim().slice(1) || null : null,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
return table;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Parse the `wmic … /format:csv` fallback.
|
|
160
|
+
*
|
|
161
|
+
* Header-driven, because wmic emits its columns in QUERY order and the values
|
|
162
|
+
* themselves can contain commas — so the header is the only reliable index.
|
|
163
|
+
*/
|
|
164
|
+
export function parseWmicProcessTable(stdout) {
|
|
165
|
+
const table = new Map();
|
|
166
|
+
const lines = stdout.split(/\r?\n/).filter((l) => l.trim().length > 0);
|
|
167
|
+
if (lines.length === 0)
|
|
168
|
+
return table;
|
|
169
|
+
const header = lines[0].split(',').map((h) => h.trim().toLowerCase());
|
|
170
|
+
const at = (...names) => header.findIndex((h) => names.includes(h));
|
|
171
|
+
const pidAt = at('processid');
|
|
172
|
+
const ppidAt = at('parentprocessid');
|
|
173
|
+
const kernelAt = at('kernelmodetime');
|
|
174
|
+
const userAt = at('usermodetime');
|
|
175
|
+
const created = at('creationdate');
|
|
176
|
+
if (pidAt < 0)
|
|
177
|
+
return table;
|
|
178
|
+
for (const line of lines.slice(1)) {
|
|
179
|
+
const cells = line.split(',');
|
|
180
|
+
const pid = Number.parseInt((cells[pidAt] ?? '').trim(), 10);
|
|
181
|
+
if (!Number.isFinite(pid))
|
|
182
|
+
continue;
|
|
183
|
+
const ppid = ppidAt >= 0 ? Number.parseInt((cells[ppidAt] ?? '').trim(), 10) : 0;
|
|
184
|
+
const kernel = kernelAt >= 0 ? Number.parseInt((cells[kernelAt] ?? '').trim(), 10) : Number.NaN;
|
|
185
|
+
const user = userAt >= 0 ? Number.parseInt((cells[userAt] ?? '').trim(), 10) : Number.NaN;
|
|
186
|
+
const measurable = Number.isFinite(kernel) && Number.isFinite(user);
|
|
187
|
+
// wmic CSV puts the host name first and the command line LAST (it can itself
|
|
188
|
+
// contain commas, so it is everything after the last known column).
|
|
189
|
+
table.set(pid, {
|
|
190
|
+
ppid: Number.isFinite(ppid) ? ppid : 0,
|
|
191
|
+
cpuMs: measurable ? Math.round((kernel + user) / 10_000) : null,
|
|
192
|
+
command: null,
|
|
193
|
+
// wmic's `creationdate` (`20261014150203.000000+060`): an opaque token that
|
|
194
|
+
// is stable across reads, which is all the identity check needs.
|
|
195
|
+
startedAtText: created >= 0 ? (cells[created] ?? '').trim() || null : null,
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
return table;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* The Windows probe. `CreationDate.Ticks` (100ns since 0001-01-01) is the start
|
|
202
|
+
* token: a plain integer, so it cannot be mangled by locale, date format or the
|
|
203
|
+
* pipe the rest of the row uses. The `t` prefix marks the field's PRESENCE — an
|
|
204
|
+
* absent `CreationDate` yields bare `t`, which parses as "unknown", rather than
|
|
205
|
+
* shifting the command line into the wrong column.
|
|
206
|
+
*/
|
|
207
|
+
const WINDOWS_PS_QUERY = 'Get-CimInstance Win32_Process | ForEach-Object { "$($_.ProcessId)|$($_.ParentProcessId)|$($_.KernelModeTime)|$($_.UserModeTime)|t$(if ($_.CreationDate) { $_.CreationDate.Ticks })|$($_.CommandLine)" }';
|
|
208
|
+
function readWindowsProcessTable() {
|
|
209
|
+
// execFileSync, not execSync: cmd.exe mangles PowerShell's `$()` syntax.
|
|
210
|
+
try {
|
|
211
|
+
const out = execFileSync('powershell', ['-NoProfile', '-NonInteractive', '-Command', WINDOWS_PS_QUERY], { encoding: 'utf8', timeout: 15_000, stdio: ['ignore', 'pipe', 'ignore'] });
|
|
212
|
+
const table = parseWindowsProcessTable(out);
|
|
213
|
+
if (table.size > 0)
|
|
214
|
+
return table;
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
// PowerShell unavailable or too slow — try the older tool.
|
|
218
|
+
}
|
|
219
|
+
try {
|
|
220
|
+
const out = execSync('wmic process get processid,parentprocessid,kernelmodetime,usermodetime,creationdate /format:csv', { encoding: 'utf8', timeout: 15_000, stdio: ['ignore', 'pipe', 'ignore'] });
|
|
221
|
+
const table = parseWmicProcessTable(out);
|
|
222
|
+
return table.size > 0 ? table : null;
|
|
223
|
+
}
|
|
224
|
+
catch {
|
|
225
|
+
return null;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
function readPosixProcessTable() {
|
|
229
|
+
// `lstart` first, because it carries the identity token. A `ps` without it
|
|
230
|
+
// (an old or trimmed build) still gets the whole table — the start token is
|
|
231
|
+
// then simply unknown, which the identity rule treats as "no second witness"
|
|
232
|
+
// rather than as a mismatch.
|
|
233
|
+
for (const args of ['ps -eo pid=,ppid=,time=,lstart=,command=', 'ps -eo pid=,ppid=,time=,command=']) {
|
|
234
|
+
try {
|
|
235
|
+
const out = execSync(args, {
|
|
236
|
+
encoding: 'utf8',
|
|
237
|
+
timeout: 3_000,
|
|
238
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
239
|
+
});
|
|
240
|
+
const table = parsePosixProcessTable(out);
|
|
241
|
+
if (table.size > 0)
|
|
242
|
+
return table;
|
|
243
|
+
}
|
|
244
|
+
catch {
|
|
245
|
+
// Try the next shape; if both fail the answer is "unmeasurable", never
|
|
246
|
+
// "no CPU" — that distinction is what keeps a missing reading from
|
|
247
|
+
// certifying a hang.
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
return null;
|
|
251
|
+
}
|
|
252
|
+
/** One process table read: pid → { parent, cpu, command }. NEVER cached. */
|
|
253
|
+
function readProcessTable() {
|
|
254
|
+
return process.platform === 'win32' ? readWindowsProcessTable() : readPosixProcessTable();
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* One process table read, for a caller that needs the SAME view several times.
|
|
258
|
+
*
|
|
259
|
+
* A sample tick asks about every monitored run and then signals some of them, and
|
|
260
|
+
* on Windows each read costs a PowerShell start — so the tick reads the table ONCE
|
|
261
|
+
* and threads it through, instead of N times.
|
|
262
|
+
*
|
|
263
|
+
* Deliberately NOT a time-based cache. A cached table can answer about a snapshot
|
|
264
|
+
* taken before a process existed, and the answer it gives is "not found" — which
|
|
265
|
+
* a caller reads as "it is gone". That is the one direction this module must never
|
|
266
|
+
* guess in.
|
|
267
|
+
*/
|
|
268
|
+
export function processTableSnapshot() {
|
|
269
|
+
return readProcessTable();
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Sample the process tree rooted at `pid`: whether it exists, what it has cost
|
|
273
|
+
* in CPU so far, and every pid in it.
|
|
274
|
+
*
|
|
275
|
+
* The tree is the point. `spawn(command, { shell: true })` means the REAL work
|
|
276
|
+
* is a child of the shell we hold the handle to, so a sample (and a stop) that
|
|
277
|
+
* only looked at the root would report the shell's own ~0 CPU while the build
|
|
278
|
+
* underneath burned a core — the exact false hang this must not produce.
|
|
279
|
+
*/
|
|
280
|
+
export function processTreeOf(table, pid) {
|
|
281
|
+
// pid <= 0 is not a process: 0 means "my process group" and -1 means "EVERY
|
|
282
|
+
// process I am allowed to signal". A caller that lost its pid must get an empty
|
|
283
|
+
// sample, never a signal to the whole machine.
|
|
284
|
+
if (!Number.isFinite(pid) || pid <= 0)
|
|
285
|
+
return { found: false, cpuMs: null, pids: [] };
|
|
286
|
+
if (!table.has(pid))
|
|
287
|
+
return { found: false, cpuMs: null, pids: [pid] };
|
|
288
|
+
// Children indexed by parent, so the walk is one pass per level.
|
|
289
|
+
const byParent = new Map();
|
|
290
|
+
for (const [childPid, info] of table) {
|
|
291
|
+
const siblings = byParent.get(info.ppid);
|
|
292
|
+
if (siblings)
|
|
293
|
+
siblings.push(childPid);
|
|
294
|
+
else
|
|
295
|
+
byParent.set(info.ppid, [childPid]);
|
|
296
|
+
}
|
|
297
|
+
const pids = [];
|
|
298
|
+
const queue = [pid];
|
|
299
|
+
const seen = new Set([pid]);
|
|
300
|
+
while (queue.length > 0) {
|
|
301
|
+
const current = queue.shift();
|
|
302
|
+
pids.push(current);
|
|
303
|
+
for (const child of byParent.get(current) ?? []) {
|
|
304
|
+
if (seen.has(child))
|
|
305
|
+
continue;
|
|
306
|
+
seen.add(child);
|
|
307
|
+
queue.push(child);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
// CPU is summed only when EVERY node gave a reading: a partial sum would look
|
|
311
|
+
// like "less CPU than it really used", which is the safe direction only by
|
|
312
|
+
// accident. Missing data must stay "unmeasurable" — because "unmeasurable"
|
|
313
|
+
// cannot certify a hang, while a partial zero can.
|
|
314
|
+
let total = 0;
|
|
315
|
+
let measurable = true;
|
|
316
|
+
for (const treePid of pids) {
|
|
317
|
+
const info = table.get(treePid);
|
|
318
|
+
if (!info || info.cpuMs === null) {
|
|
319
|
+
measurable = false;
|
|
320
|
+
break;
|
|
321
|
+
}
|
|
322
|
+
total += info.cpuMs;
|
|
323
|
+
}
|
|
324
|
+
return { found: true, cpuMs: measurable ? total : null, pids };
|
|
325
|
+
}
|
|
326
|
+
export function sampleProcessTree(pid, table) {
|
|
327
|
+
if (!Number.isFinite(pid) || pid <= 0)
|
|
328
|
+
return { found: false, cpuMs: null, pids: [] };
|
|
329
|
+
const resolved = table === undefined ? readProcessTable() : table;
|
|
330
|
+
if (!resolved)
|
|
331
|
+
return { found: false, cpuMs: null, pids: [pid] };
|
|
332
|
+
return processTreeOf(resolved, pid);
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Is this pid running? `null` means THIS PLATFORM CANNOT TELL.
|
|
336
|
+
*
|
|
337
|
+
* The distinction is load-bearing for a run recovered from disk: "not found"
|
|
338
|
+
* must never be read as "finished" on a platform where the process table is not
|
|
339
|
+
* readable, or a restart would declare live work dead (and a dead run's recorded
|
|
340
|
+
* exit code would be reported as its verdict).
|
|
341
|
+
*/
|
|
342
|
+
export function processAlive(pid) {
|
|
343
|
+
return tableAlive(readProcessTable(), pid);
|
|
344
|
+
}
|
|
345
|
+
/**
|
|
346
|
+
* `processAlive`, answered from a table the caller ALREADY read — so a tick that
|
|
347
|
+
* samples every monitored run (and reconciles the recovered ones) costs one
|
|
348
|
+
* process listing, not one per run.
|
|
349
|
+
*/
|
|
350
|
+
export function tableAlive(table, pid) {
|
|
351
|
+
if (!Number.isFinite(pid) || pid <= 0)
|
|
352
|
+
return false;
|
|
353
|
+
if (!table)
|
|
354
|
+
return null;
|
|
355
|
+
return table.has(pid);
|
|
356
|
+
}
|
|
357
|
+
/**
|
|
358
|
+
* One process's row, cross-platform: `null` when the platform cannot read the
|
|
359
|
+
* table at all, `{ found: false }` when the pid is simply not there.
|
|
360
|
+
*
|
|
361
|
+
* The distinction matters to a caller that has to decide whether a pid is still
|
|
362
|
+
* OURS: "gone" is an answer, "cannot tell" is not.
|
|
363
|
+
*/
|
|
364
|
+
export function lookupProcess(pid) {
|
|
365
|
+
if (!Number.isFinite(pid) || pid <= 0)
|
|
366
|
+
return { found: false, command: null, startedAtText: null };
|
|
367
|
+
const table = readProcessTable();
|
|
368
|
+
if (!table)
|
|
369
|
+
return null;
|
|
370
|
+
const row = table.get(pid);
|
|
371
|
+
return row
|
|
372
|
+
? { found: true, command: row.command, startedAtText: row.startedAtText }
|
|
373
|
+
: { found: false, command: null, startedAtText: null };
|
|
374
|
+
}
|
|
375
|
+
/** `45s` / `3m 05s` — how long, for a human reading a message. */
|
|
376
|
+
export function formatSpan(ms) {
|
|
377
|
+
const totalSeconds = Math.max(0, Math.round(ms / 1000));
|
|
378
|
+
if (totalSeconds < 60)
|
|
379
|
+
return `${totalSeconds}s`;
|
|
380
|
+
const minutes = Math.floor(totalSeconds / 60);
|
|
381
|
+
const seconds = totalSeconds % 60;
|
|
382
|
+
if (minutes < 60)
|
|
383
|
+
return `${minutes}m ${String(seconds).padStart(2, '0')}s`;
|
|
384
|
+
return `${Math.floor(minutes / 60)}h ${String(minutes % 60).padStart(2, '0')}m`;
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* Classify a run from its evidence. Deterministic and pure, so the decision can
|
|
388
|
+
* be asserted directly instead of inferred from a message.
|
|
389
|
+
*
|
|
390
|
+
* Order matters, and it is deliberately "innocent until proven hung":
|
|
391
|
+
* output recently → working; CPU advancing → working; only then, silence PLUS a
|
|
392
|
+
* measurable absence of CPU → hung. Anything we cannot prove lands in `stalled`,
|
|
393
|
+
* which is reported but never reaped.
|
|
394
|
+
*/
|
|
395
|
+
export function classifyLiveness(input, thresholds = DEFAULT_LIVENESS_THRESHOLDS) {
|
|
396
|
+
if (!input.alive)
|
|
397
|
+
return { verdict: 'finished', why: 'the process has exited' };
|
|
398
|
+
// A command seconds old has simply not said anything yet.
|
|
399
|
+
if (input.ageMs < 3_000)
|
|
400
|
+
return { verdict: 'starting', why: 'just started' };
|
|
401
|
+
if (input.quietMs < thresholds.stallQuietMs) {
|
|
402
|
+
return {
|
|
403
|
+
verdict: 'working',
|
|
404
|
+
why: input.bytes > 0 ? `produced output ${formatSpan(input.quietMs)} ago` : 'producing output',
|
|
405
|
+
};
|
|
406
|
+
}
|
|
407
|
+
// "the last 0s" reads as nonsense, so a sub-second sample window is reported
|
|
408
|
+
// as one second — the point is that a MEASURABLE window passed with no CPU.
|
|
409
|
+
const windowLabel = formatSpan(Math.max(1_000, input.sampleWindowMs));
|
|
410
|
+
const measurable = input.cpuMs !== null && input.prevCpuMs !== null;
|
|
411
|
+
const cpuDelta = measurable ? Math.max(0, input.cpuMs - input.prevCpuMs) : null;
|
|
412
|
+
if (cpuDelta !== null && cpuDelta >= thresholds.hangCpuFloorMs) {
|
|
413
|
+
return {
|
|
414
|
+
verdict: 'working',
|
|
415
|
+
why: `silent for ${formatSpan(input.quietMs)} but still computing — ` +
|
|
416
|
+
`${cpuDelta}ms of CPU in the last ${windowLabel}`,
|
|
417
|
+
};
|
|
418
|
+
}
|
|
419
|
+
if (input.quietMs >= thresholds.hangQuietMs) {
|
|
420
|
+
if (cpuDelta !== null) {
|
|
421
|
+
return {
|
|
422
|
+
verdict: 'hung',
|
|
423
|
+
why: `no output for ${formatSpan(input.quietMs)} and no CPU in that time ` +
|
|
424
|
+
`(${cpuDelta}ms over the last ${windowLabel}) — it is waiting for something ` +
|
|
425
|
+
`that is not coming (a prompt with no stdin, a lock, or a socket that never answers)`,
|
|
426
|
+
};
|
|
427
|
+
}
|
|
428
|
+
return {
|
|
429
|
+
verdict: 'stalled',
|
|
430
|
+
why: `no output for ${formatSpan(input.quietMs)}; CPU is not measurable on this platform, so this is ` +
|
|
431
|
+
`reported rather than treated as a confirmed hang`,
|
|
432
|
+
};
|
|
433
|
+
}
|
|
434
|
+
return {
|
|
435
|
+
verdict: 'stalled',
|
|
436
|
+
why: measurable
|
|
437
|
+
? `quiet for ${formatSpan(input.quietMs)} with only ${cpuDelta}ms of CPU in the last ` +
|
|
438
|
+
`${windowLabel} — slowing rather than stopped`
|
|
439
|
+
: `quiet for ${formatSpan(input.quietMs)}`,
|
|
440
|
+
};
|
|
441
|
+
}
|
|
442
|
+
/**
|
|
443
|
+
* Stop a process TREE, deepest first — the shell we spawned and the real work
|
|
444
|
+
* under it.
|
|
445
|
+
*
|
|
446
|
+
* A plain `child.kill()` reaches only the shell, which is why a "stopped" hung
|
|
447
|
+
* build can keep running: the shell dies, the compiler it launched does not.
|
|
448
|
+
* Best-effort throughout — a pid that exited between the sample and the signal
|
|
449
|
+
* must not throw, and a failed signal falls back to the child handle.
|
|
450
|
+
*
|
|
451
|
+
* On Windows the tree comes from WMI (`Get-CimInstance`), so this genuinely
|
|
452
|
+
* reaches grandchildren there too; if that probe is unavailable the tree is just
|
|
453
|
+
* the root, which is the old behaviour rather than a regression. Note that a
|
|
454
|
+
* Windows "signal" takes effect immediately — there is no graceful SIGTERM to
|
|
455
|
+
* follow with a SIGKILL.
|
|
456
|
+
*/
|
|
457
|
+
export function killProcessTree(pid, signal, child, table) {
|
|
458
|
+
const signalled = [];
|
|
459
|
+
// GUARD, and it is not defensive theatre: `process.kill(-1, sig)` signals
|
|
460
|
+
// EVERY process this user can signal — on a developer machine that is a
|
|
461
|
+
// spontaneous logout. Only real, positive pids are ever signalled.
|
|
462
|
+
if (Number.isFinite(pid) && pid > 0) {
|
|
463
|
+
const { pids } = sampleProcessTree(pid, table);
|
|
464
|
+
for (const treePid of [...pids].reverse()) {
|
|
465
|
+
if (!Number.isFinite(treePid) || treePid <= 0)
|
|
466
|
+
continue;
|
|
467
|
+
try {
|
|
468
|
+
process.kill(treePid, signal);
|
|
469
|
+
signalled.push(treePid);
|
|
470
|
+
}
|
|
471
|
+
catch {
|
|
472
|
+
/* already gone — nothing to do */
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
if (signalled.length === 0 && child) {
|
|
477
|
+
try {
|
|
478
|
+
child.kill(signal);
|
|
479
|
+
}
|
|
480
|
+
catch {
|
|
481
|
+
/* best-effort */
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
return signalled;
|
|
485
|
+
}
|
|
486
|
+
//# sourceMappingURL=process-liveness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process-liveness.js","sourceRoot":"","sources":["../../src/tools/process-liveness.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"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"}
|
package/dist/tools/registry.js
CHANGED
|
@@ -343,7 +343,9 @@ const writeFileSchema = z.object({
|
|
|
343
343
|
const runTerminalSchema = z.object({
|
|
344
344
|
command: z.string().min(1).describe('The shell command to run in the workspace — e.g. "npx vitest run tests/foo.test.ts", "npx tsc --noEmit", "npm run build", "git diff --stat". Read-only verify commands run directly. Recoverable workspace commands (dependency installs, mkdir/touch/cp/mv, git add, npm init) also run directly when the request authorized the work; every other state-changing command needs confirm:true after the user approves via ask_user. Destructive/system commands are denied outright.'),
|
|
345
345
|
confirm: z.boolean().default(false).describe('Set true ONLY after the user explicitly confirmed a command you initiated. Required for state-changing commands outside the recoverable workspace set (network fetches, arbitrary code, global installs, anything that leaves the machine).'),
|
|
346
|
-
|
|
346
|
+
action: z.enum(['run', 'poll', 'list', 'stop']).optional().describe("Default 'run'. 'poll' reports a long command that outlived its wait budget (pass process_id) — status, liveness (WORKING/STALLED/HUNG, judged from its output and its CPU), output tail, and the real exit code once it lands; 'list' shows every command currently being monitored; 'stop' deliberately stops one monitored run and everything under it. A command that outlives its wait budget is NOT killed, so poll it instead of re-running it — and a run that is genuinely HUNG (no output AND no CPU for minutes) is reported as such and stopped after a further grace, so a hang is never left running forever."),
|
|
347
|
+
process_id: z.string().optional().describe("The monitored run to report on or stop, from a 'still running' result or from action:'list'."),
|
|
348
|
+
timeout_ms: z.number().int().min(1000).max(1800000).optional().describe('How long THIS call waits in ms before handing the command to monitoring (default: assessed from the command — 15 min for a test suite/install, 10 min for a build, 120s otherwise; 60s when a person is watching). Reaching it never kills the command: it keeps running and you follow it with action:\'poll\'.'),
|
|
347
349
|
verb: z.string().optional().describe('What this command is FOR (e.g. "install java"). When it SUCCEEDS, it is remembered for this verb on this machine, so the next tool_search resolve can offer it instead of re-deriving it. Optional.'),
|
|
348
350
|
});
|
|
349
351
|
/** The C2 requirementState check as a reusable tool. */
|
|
@@ -834,7 +836,7 @@ registerTool({
|
|
|
834
836
|
registerTool({
|
|
835
837
|
name: 'run_terminal',
|
|
836
838
|
capability: { effectClass: 'local-state', grantCategory: 'terminal' },
|
|
837
|
-
description: 'Run a shell command in the workspace and see its REAL output — typecheck, a single test file, a build, git diff/status. Use to verify code by actual invocation: run, read the failure, edit, re-run. Verify-class commands (tests/typecheck/build/git-readonly) run directly; state-changing commands need confirm:true after the user approves via ask_user. Destructive/system commands (sudo, git push, rm -rf at dangerous targets, ...) are denied outright.',
|
|
839
|
+
description: 'Run a shell command in the workspace and see its REAL output — typecheck, a single test file, a build, git diff/status. Use to verify code by actual invocation: run, read the failure, edit, re-run. Verify-class commands (tests/typecheck/build/git-readonly) run directly; state-changing commands need confirm:true after the user approves via ask_user. Destructive/system commands (sudo, git push, rm -rf at dangerous targets, ...) are denied outright. A long command (a full test suite, a build) is NOT killed when it outlives the call\'s wait budget: it keeps running, and you follow it with action:\'poll\' (process_id) until it reports its real exit code — never re-run it. A monitored run is watched for liveness: one that produces neither output nor CPU for minutes is reported as HUNG and stopped after a further grace (action:\'stop\' stops it now), while a slow-but-working command is left alone.',
|
|
838
840
|
category: 'workflow',
|
|
839
841
|
inputSchema: runTerminalSchema,
|
|
840
842
|
endsAgentStep: false,
|