@agentdeck/bridge 1.2.0 → 1.2.1

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 (123) hide show
  1. package/dist/apme/classifier.d.ts.map +1 -1
  2. package/dist/apme/classifier.js +18 -10
  3. package/dist/apme/classifier.js.map +1 -1
  4. package/dist/apme/claude-transcript-reader.d.ts +36 -0
  5. package/dist/apme/claude-transcript-reader.d.ts.map +1 -1
  6. package/dist/apme/claude-transcript-reader.js +78 -2
  7. package/dist/apme/claude-transcript-reader.js.map +1 -1
  8. package/dist/apme/collector.d.ts +109 -3
  9. package/dist/apme/collector.d.ts.map +1 -1
  10. package/dist/apme/collector.js +408 -44
  11. package/dist/apme/collector.js.map +1 -1
  12. package/dist/apme/dashboard-html.d.ts.map +1 -1
  13. package/dist/apme/dashboard-html.js +4 -2
  14. package/dist/apme/dashboard-html.js.map +1 -1
  15. package/dist/apme/graph.d.ts +1 -1
  16. package/dist/apme/graph.d.ts.map +1 -1
  17. package/dist/apme/graph.js +51 -1
  18. package/dist/apme/graph.js.map +1 -1
  19. package/dist/apme/http.d.ts.map +1 -1
  20. package/dist/apme/http.js +4 -0
  21. package/dist/apme/http.js.map +1 -1
  22. package/dist/apme/index.d.ts +4 -0
  23. package/dist/apme/index.d.ts.map +1 -1
  24. package/dist/apme/index.js +13 -1
  25. package/dist/apme/index.js.map +1 -1
  26. package/dist/apme/runner.d.ts +90 -0
  27. package/dist/apme/runner.d.ts.map +1 -1
  28. package/dist/apme/runner.js +524 -48
  29. package/dist/apme/runner.js.map +1 -1
  30. package/dist/apme/sample-to-timeline.d.ts.map +1 -1
  31. package/dist/apme/sample-to-timeline.js +5 -0
  32. package/dist/apme/sample-to-timeline.js.map +1 -1
  33. package/dist/apme/settings.d.ts +8 -0
  34. package/dist/apme/settings.d.ts.map +1 -1
  35. package/dist/apme/settings.js +4 -0
  36. package/dist/apme/settings.js.map +1 -1
  37. package/dist/apme/store.d.ts +77 -8
  38. package/dist/apme/store.d.ts.map +1 -1
  39. package/dist/apme/store.js +189 -17
  40. package/dist/apme/store.js.map +1 -1
  41. package/dist/apme/task-gradeability.d.ts +82 -0
  42. package/dist/apme/task-gradeability.d.ts.map +1 -0
  43. package/dist/apme/task-gradeability.js +126 -0
  44. package/dist/apme/task-gradeability.js.map +1 -0
  45. package/dist/awaiting-overlay.d.ts +13 -26
  46. package/dist/awaiting-overlay.d.ts.map +1 -1
  47. package/dist/awaiting-overlay.js +7 -40
  48. package/dist/awaiting-overlay.js.map +1 -1
  49. package/dist/claude-permission-rules.d.ts +20 -32
  50. package/dist/claude-permission-rules.d.ts.map +1 -1
  51. package/dist/claude-permission-rules.js +19 -102
  52. package/dist/claude-permission-rules.js.map +1 -1
  53. package/dist/claude-usage-recovery.d.ts +54 -0
  54. package/dist/claude-usage-recovery.d.ts.map +1 -0
  55. package/dist/claude-usage-recovery.js +200 -0
  56. package/dist/claude-usage-recovery.js.map +1 -0
  57. package/dist/cli.d.ts.map +1 -1
  58. package/dist/cli.js +28 -8
  59. package/dist/cli.js.map +1 -1
  60. package/dist/codex-rollout-response.d.ts +43 -0
  61. package/dist/codex-rollout-response.d.ts.map +1 -1
  62. package/dist/codex-rollout-response.js +67 -0
  63. package/dist/codex-rollout-response.js.map +1 -1
  64. package/dist/coordination-evidence.d.ts +150 -0
  65. package/dist/coordination-evidence.d.ts.map +1 -0
  66. package/dist/coordination-evidence.js +455 -0
  67. package/dist/coordination-evidence.js.map +1 -0
  68. package/dist/daemon-server.d.ts.map +1 -1
  69. package/dist/daemon-server.js +329 -34
  70. package/dist/daemon-server.js.map +1 -1
  71. package/dist/daemon.js +1 -1
  72. package/dist/deferred-reply-read.d.ts +24 -0
  73. package/dist/deferred-reply-read.d.ts.map +1 -0
  74. package/dist/deferred-reply-read.js +42 -0
  75. package/dist/deferred-reply-read.js.map +1 -0
  76. package/dist/esp32-serial.d.ts +11 -0
  77. package/dist/esp32-serial.d.ts.map +1 -1
  78. package/dist/esp32-serial.js +57 -2
  79. package/dist/esp32-serial.js.map +1 -1
  80. package/dist/hook-codex-sessions.d.ts +9 -0
  81. package/dist/hook-codex-sessions.d.ts.map +1 -1
  82. package/dist/hook-codex-sessions.js +35 -2
  83. package/dist/hook-codex-sessions.js.map +1 -1
  84. package/dist/hook-opencode-sessions.d.ts +62 -0
  85. package/dist/hook-opencode-sessions.d.ts.map +1 -0
  86. package/dist/hook-opencode-sessions.js +180 -0
  87. package/dist/hook-opencode-sessions.js.map +1 -0
  88. package/dist/hook-response-source.d.ts +40 -0
  89. package/dist/hook-response-source.d.ts.map +1 -0
  90. package/dist/hook-response-source.js +31 -0
  91. package/dist/hook-response-source.js.map +1 -0
  92. package/dist/index.d.ts.map +1 -1
  93. package/dist/index.js +4 -1
  94. package/dist/index.js.map +1 -1
  95. package/dist/native-dependency-diagnostics.d.ts +29 -0
  96. package/dist/native-dependency-diagnostics.d.ts.map +1 -0
  97. package/dist/native-dependency-diagnostics.js +95 -0
  98. package/dist/native-dependency-diagnostics.js.map +1 -0
  99. package/dist/observed-steering.d.ts +4 -4
  100. package/dist/observed-steering.d.ts.map +1 -1
  101. package/dist/observed-steering.js +28 -32
  102. package/dist/observed-steering.js.map +1 -1
  103. package/dist/openclaw-gateway-stability.d.ts +94 -0
  104. package/dist/openclaw-gateway-stability.d.ts.map +1 -0
  105. package/dist/openclaw-gateway-stability.js +176 -0
  106. package/dist/openclaw-gateway-stability.js.map +1 -0
  107. package/dist/passive-observer.d.ts +5 -0
  108. package/dist/passive-observer.d.ts.map +1 -1
  109. package/dist/passive-observer.js +6 -0
  110. package/dist/passive-observer.js.map +1 -1
  111. package/dist/review-runner.js +1 -1
  112. package/dist/subagent-timeline.d.ts +27 -0
  113. package/dist/subagent-timeline.d.ts.map +1 -1
  114. package/dist/subagent-timeline.js +52 -5
  115. package/dist/subagent-timeline.js.map +1 -1
  116. package/dist/usage-api.d.ts +3 -0
  117. package/dist/usage-api.d.ts.map +1 -1
  118. package/dist/usage-api.js +101 -36
  119. package/dist/usage-api.js.map +1 -1
  120. package/dist/usage-event.d.ts.map +1 -1
  121. package/dist/usage-event.js +2 -1
  122. package/dist/usage-event.js.map +1 -1
  123. package/package.json +5 -5
@@ -0,0 +1,200 @@
1
+ import { execFile } from 'child_process';
2
+ import { createHash } from 'crypto';
3
+ import { mkdirSync, readFileSync, renameSync, statSync, writeFileSync } from 'fs';
4
+ import { homedir, tmpdir } from 'os';
5
+ import { delimiter, join, resolve } from 'path';
6
+ import { logTagged } from './logger.js';
7
+ const RECOVERY_TIMEOUT_MS = 25_000;
8
+ const RETRY_MS = 30 * 60_000;
9
+ const LONG_RETRY_MS = 6 * 60 * 60_000;
10
+ /** The daemon's data directory — `AGENTDECK_DATA_DIR` when set, else
11
+ * `~/.agentdeck`. Every other file in that directory resolves it this way; the
12
+ * cooldown record did not, so two daemons pointed at different data dirs
13
+ * silently shared one retry budget and each spent the other's quota. Kept
14
+ * identical to `usage-api.ts`'s AGENTDECK_DIR — they are the same directory,
15
+ * and item 5 of #286 is explicit that both move together or neither does. */
16
+ const AGENTDECK_DIR = process.env.AGENTDECK_DATA_DIR || join(homedir(), '.agentdeck');
17
+ export const CLAUDE_USAGE_RECOVERY_FILE = join(AGENTDECK_DIR, 'claude-usage-recovery.json');
18
+ /** Claude owns the rotating refresh token and its interprocess lock. Never copy,
19
+ * rotate, or write those credentials ourselves. This bounded turn may consume a
20
+ * small amount of subscription quota; it carries no workspace or user content.
21
+ * --bare is NOT appropriate: that mode explicitly disables OAuth/keychain reads.
22
+ * An older CLI rejecting --safe-mode fails closed rather than loading hooks.
23
+ */
24
+ export const CLAUDE_USAGE_RECOVERY_ARGS = [
25
+ '--safe-mode', '--print', '--tools', '', '--strict-mcp-config',
26
+ '--mcp-config', '{"mcpServers":{}}', '--settings', '{"disableAllHooks":true}',
27
+ '--no-session-persistence', '--disable-slash-commands', '--no-chrome',
28
+ '--model', 'haiku', '--max-turns', '1', '--max-budget-usd', '0.01',
29
+ '--system-prompt', 'Reply with OK.', '--output-format', 'json', 'Reply with OK.',
30
+ ];
31
+ /** Keep the recovery CLI on the same credential store as usage-api.ts.
32
+ * On macOS that reader targets the default Keychain service; a custom config
33
+ * directory can select a DIFFERENT Keychain namespace in Claude. Fail closed
34
+ * rather than spend quota or renew an unrelated account. On other platforms,
35
+ * resolve relative paths before the child changes cwd to the temporary folder.
36
+ */
37
+ export function buildClaudeUsageRecoveryEnv(source = process.env, platform = process.platform, home = homedir()) {
38
+ const env = { ...source, CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: '1' };
39
+ if (env.CLAUDE_CONFIG_DIR) {
40
+ const configDir = resolve(env.CLAUDE_CONFIG_DIR);
41
+ if (platform === 'darwin' && configDir !== join(home, '.claude'))
42
+ return null;
43
+ env.CLAUDE_CONFIG_DIR = configDir;
44
+ }
45
+ // A daemon started from an agent must not be mistaken for its nested session.
46
+ // API-key / provider overrides must not redirect an OAuth recovery request.
47
+ for (const key of Object.keys(env)) {
48
+ if (key === 'CLAUDECODE' || key === 'ANTHROPIC_API_KEY' || key === 'ANTHROPIC_AUTH_TOKEN'
49
+ || key === 'ANTHROPIC_BASE_URL' || key === 'CLAUDE_CODE_OAUTH_TOKEN'
50
+ || key.startsWith('CLAUDE_CODE_USE_') || key.startsWith('AGENTDECK_'))
51
+ delete env[key];
52
+ }
53
+ return env;
54
+ }
55
+ /** `execFile` runs one executable — it does not search PATHEXT and (since the
56
+ * Node 20.12/18.20 spawn hardening) will not run a `.cmd`/`.bat` shim without a
57
+ * shell. A bare `'claude'` was therefore ENOENT on every Windows install, and a
58
+ * LaunchAgent carries the installing shell's PATH, which may not contain the
59
+ * CLI at all — both surfaced only as a recurring generic failure line. Resolve
60
+ * the real file once so the unavailable case can SAY it is unavailable.
61
+ * Returns `{ shim: true }` for a Windows shell shim: shell-quoting a JSON
62
+ * argument through cmd.exe is a worse failure than declining, so recovery is
63
+ * skipped there and says so. */
64
+ export function resolveClaudeCli(env = process.env, platform = process.platform) {
65
+ const isFile = (candidate) => {
66
+ try {
67
+ return statSync(candidate).isFile();
68
+ }
69
+ catch {
70
+ return false;
71
+ }
72
+ };
73
+ const override = env.AGENTDECK_CLAUDE_CLI;
74
+ if (override)
75
+ return isFile(override) ? { path: override, shim: false } : null;
76
+ const exts = platform === 'win32'
77
+ ? (env.PATHEXT || '.COM;.EXE;.BAT;.CMD').split(';').filter(Boolean)
78
+ : [''];
79
+ for (const dir of (env.PATH || '').split(delimiter).filter(Boolean)) {
80
+ for (const ext of exts) {
81
+ const candidate = join(dir, `claude${ext}`);
82
+ if (isFile(candidate))
83
+ return { path: candidate, shim: /\.(cmd|bat)$/i.test(ext) };
84
+ }
85
+ }
86
+ return null;
87
+ }
88
+ let reportedUnavailable = false;
89
+ function reportUnavailableOnce(reason) {
90
+ if (reportedUnavailable)
91
+ return;
92
+ reportedUnavailable = true;
93
+ logTagged('usage', `Claude authorization recovery unavailable: ${reason}`);
94
+ }
95
+ export function runClaudeUsageRecovery() {
96
+ const env = buildClaudeUsageRecoveryEnv();
97
+ if (!env) {
98
+ logTagged('usage', 'Claude authorization recovery skipped: custom macOS credential namespace cannot be matched');
99
+ return Promise.resolve();
100
+ }
101
+ const cli = resolveClaudeCli(env);
102
+ if (!cli) {
103
+ reportUnavailableOnce('the claude CLI was not found on this daemon\'s PATH (set AGENTDECK_CLAUDE_CLI to its full path)');
104
+ return Promise.resolve();
105
+ }
106
+ if (cli.shim) {
107
+ reportUnavailableOnce(`only a shell shim is installed (${cli.path}); point AGENTDECK_CLAUDE_CLI at an executable`);
108
+ return Promise.resolve();
109
+ }
110
+ return new Promise((resolve) => {
111
+ const child = execFile(cli.path, CLAUDE_USAGE_RECOVERY_ARGS, {
112
+ cwd: tmpdir(), env, timeout: RECOVERY_TIMEOUT_MS, killSignal: 'SIGKILL',
113
+ maxBuffer: 64 * 1024, windowsHide: true,
114
+ }, (error) => {
115
+ if (error)
116
+ logTagged('usage', `Claude authorization recovery CLI ended (${error.killed ? 'timeout' : error.code ?? 'failed'})`);
117
+ resolve(); // Outcome is verified by re-reading credentials, never stdout.
118
+ });
119
+ child.stdin?.end();
120
+ // The child holds no port and gates no shutdown, but a clean stop that
121
+ // SIGKILLs the daemon takes `execFile`'s timeout with it — the orphan then
122
+ // runs unbounded. Track it so shutdown can end it, and unref it so it can
123
+ // never be the reason this process stays alive.
124
+ child.unref();
125
+ liveRecoveryChildren.add(child);
126
+ // `close`, not `exit`: a spawn that fails outright (the resolved binary
127
+ // vanished between the probe and the spawn) emits `error` + `close` and
128
+ // never `exit`, so an `exit` listener retains a dead ChildProcess for the
129
+ // life of the daemon — one per attempt, against a comment that says "at
130
+ // most one". `close` fires on both paths.
131
+ child.once('close', () => liveRecoveryChildren.delete(child));
132
+ });
133
+ }
134
+ /** Recovery children currently running. At most one — the class serializes on
135
+ * `pending` — but a Set costs nothing and cannot go negative. */
136
+ const liveRecoveryChildren = new Set();
137
+ /** Kill any in-flight recovery child. Called from the daemon's shutdown path;
138
+ * safe to call with none running. */
139
+ export function stopClaudeUsageRecoveryChildren() {
140
+ for (const child of liveRecoveryChildren) {
141
+ try {
142
+ child.kill('SIGKILL');
143
+ }
144
+ catch { /* already gone */ }
145
+ }
146
+ liveRecoveryChildren.clear();
147
+ }
148
+ /** Single daemon owner; persisted cooldown also survives daemon restart. */
149
+ export class ClaudeUsageRecovery {
150
+ deps;
151
+ pending = null;
152
+ record = null;
153
+ constructor(deps) {
154
+ this.deps = deps;
155
+ }
156
+ async recover(accessToken) {
157
+ if (this.pending)
158
+ return this.pending;
159
+ const credentialHash = createHash('sha256').update(accessToken).digest('hex');
160
+ const previous = this.record ?? this.deps.read();
161
+ if (previous && this.deps.now() < previous.nextAttemptAt)
162
+ return;
163
+ const attempts = previous?.credentialHash === credentialHash ? previous.attempts + 1 : 1;
164
+ this.record = { credentialHash, attempts,
165
+ nextAttemptAt: this.deps.now() + (attempts >= 3 ? LONG_RETRY_MS : RETRY_MS) };
166
+ // Record BEFORE spawning: a crash/restart must not cause a recovery loop.
167
+ try {
168
+ this.deps.write(this.record);
169
+ }
170
+ catch {
171
+ return;
172
+ }
173
+ logTagged('usage', `Claude usage authorization expired — requesting bounded CLI recovery (attempt ${attempts})`);
174
+ this.pending = this.deps.run().catch(() => { }).finally(() => { this.pending = null; });
175
+ return this.pending;
176
+ }
177
+ }
178
+ export const claudeUsageRecovery = new ClaudeUsageRecovery({
179
+ now: Date.now,
180
+ read: () => {
181
+ try {
182
+ const r = JSON.parse(readFileSync(CLAUDE_USAGE_RECOVERY_FILE, 'utf8'));
183
+ return typeof r.credentialHash === 'string' && Number.isFinite(r.attempts)
184
+ && Number.isFinite(r.nextAttemptAt) ? r : null;
185
+ }
186
+ catch {
187
+ return null;
188
+ }
189
+ },
190
+ write: (record) => {
191
+ mkdirSync(AGENTDECK_DIR, { recursive: true });
192
+ // tmp+rename like every other file in this directory: a torn write reads
193
+ // back as "no cooldown", which is the one failure that spends quota.
194
+ const tmp = `${CLAUDE_USAGE_RECOVERY_FILE}.${process.pid}.tmp`;
195
+ writeFileSync(tmp, JSON.stringify(record), { mode: 0o600 });
196
+ renameSync(tmp, CLAUDE_USAGE_RECOVERY_FILE);
197
+ },
198
+ run: runClaudeUsageRecovery,
199
+ });
200
+ //# sourceMappingURL=claude-usage-recovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-usage-recovery.js","sourceRoot":"","sources":["../src/claude-usage-recovery.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
package/dist/cli.js CHANGED
@@ -1277,8 +1277,13 @@ daemon
1277
1277
  const targetPort = registryPort ?? port;
1278
1278
  try {
1279
1279
  const res = await fetch(`http://127.0.0.1:${targetPort}/health`);
1280
- const data = await res.json();
1280
+ const data = (await res.json());
1281
1281
  log(`Daemon status (port ${targetPort}): ${JSON.stringify(data, null, 2)}`);
1282
+ const apmeHealth = data.apme;
1283
+ if (apmeHealth?.enabled === false) {
1284
+ log(`WARNING: APME evaluation is disabled${typeof apmeHealth.error === 'string' ? ` — ${apmeHealth.error}` : '.'}`);
1285
+ log('Run `agentdeck diag native` for the exact Node executable, ABI, and recovery command.');
1286
+ }
1282
1287
  // A daemon on a fallback port keeps working — clients resolve it from
1283
1288
  // daemon.json — so nothing else ever says it happened. Without this line
1284
1289
  // the only symptom is that the canonical port is owned by nobody.
@@ -1374,6 +1379,12 @@ daemon
1374
1379
  .option('--loopback', 'Alias for --enterprise')
1375
1380
  .action(async (opts) => {
1376
1381
  const postureArgs = daemonPostureArgs(opts);
1382
+ const { collectNativeDependencyDiagnostic, formatNativeDependencyDiagnosticReport, } = await import('./native-dependency-diagnostics.js');
1383
+ const nativeReport = collectNativeDependencyDiagnostic();
1384
+ if (!nativeReport.ok) {
1385
+ log('WARNING: daemon autostart will be registered, but APME evaluation cannot start under this runtime.');
1386
+ log(formatNativeDependencyDiagnosticReport(nativeReport));
1387
+ }
1377
1388
  if (postureArgs.length > 0) {
1378
1389
  log(`Autostart posture: ${postureArgs.join(' ')} (baked into the autostart unit's arguments).`);
1379
1390
  }
@@ -2378,15 +2389,15 @@ program
2378
2389
  });
2379
2390
  program
2380
2391
  .command('diag [target]')
2381
- .description('Generate a diagnostic dump, or a privacy-safe agent diagnostic')
2392
+ .description('Generate a diagnostic dump, or a focused agent/native-runtime diagnostic')
2382
2393
  .option('-p, --port <port>', 'Bridge server port', String(BRIDGE_WS_PORT))
2383
2394
  .option('-a, --analyze', 'Run AI analysis on the dump')
2384
2395
  .option('-t, --tail <lines>', 'Number of journal entries', '200')
2385
2396
  .option('--json', 'Print target diagnostics as machine-readable JSON')
2386
2397
  .action(async (target, opts) => {
2387
2398
  if (target) {
2388
- if (target !== 'kiro' && target !== 'agents') {
2389
- log(`Unknown diagnostic target: ${target}. Supported targets: agents, kiro`);
2399
+ if (target !== 'kiro' && target !== 'agents' && target !== 'native') {
2400
+ log(`Unknown diagnostic target: ${target}. Supported targets: agents, kiro, native`);
2390
2401
  process.exitCode = 1;
2391
2402
  return;
2392
2403
  }
@@ -2401,6 +2412,14 @@ program
2401
2412
  process.stdout.write(`${opts.json ? JSON.stringify(report, null, 2) : formatAgentCliDiagnosticReport(report)}\n`);
2402
2413
  return;
2403
2414
  }
2415
+ if (target === 'native') {
2416
+ const { collectNativeDependencyDiagnostic, formatNativeDependencyDiagnosticReport, } = await import('./native-dependency-diagnostics.js');
2417
+ const report = collectNativeDependencyDiagnostic();
2418
+ process.stdout.write(`${opts.json ? JSON.stringify(report, null, 2) : formatNativeDependencyDiagnosticReport(report)}\n`);
2419
+ if (!report.ok)
2420
+ process.exitCode = 1;
2421
+ return;
2422
+ }
2404
2423
  const { collectKiroDiagnosticReport, formatKiroDiagnosticReport } = await import('./kiro-diagnostics.js');
2405
2424
  const report = await collectKiroDiagnosticReport();
2406
2425
  process.stdout.write(`${opts.json ? JSON.stringify(report, null, 2) : formatKiroDiagnosticReport(report)}\n`);
@@ -3393,22 +3412,23 @@ apme
3393
3412
  return;
3394
3413
  }
3395
3414
  log(`\n Turns started in the last ${opts.since} — how each one's end was learned`);
3396
- log(` ${'Agent'.padEnd(14)} ${'Turns'.padEnd(7)} ${'Stop'.padEnd(7)} ${'Synth'.padEnd(7)} ${'NoStop'.padEnd(7)} ${'Esc'.padEnd(6)} ${'Abort'.padEnd(6)} ${'Folded'.padEnd(7)} ${'SessEnd'.padEnd(8)} ${'Open'.padEnd(6)} ${'?'.padEnd(6)} Stop loss`);
3397
- log(` ${'─'.repeat(14)} ${'─'.repeat(7)} ${'─'.repeat(7)} ${'─'.repeat(7)} ${'─'.repeat(7)} ${'─'.repeat(6)} ${'─'.repeat(6)} ${'─'.repeat(7)} ${'─'.repeat(8)} ${'─'.repeat(6)} ${'─'.repeat(6)} ${'─'.repeat(9)}`);
3415
+ log(` ${'Agent'.padEnd(14)} ${'Turns'.padEnd(7)} ${'Stop'.padEnd(7)} ${'Synth'.padEnd(7)} ${'NoStop'.padEnd(7)} ${'Esc'.padEnd(6)} ${'Abort'.padEnd(6)} ${'Folded'.padEnd(7)} ${'SessEnd'.padEnd(8)} ${'Reaped'.padEnd(7)} ${'Open'.padEnd(6)} ${'?'.padEnd(6)} Stop loss`);
3416
+ log(` ${'─'.repeat(14)} ${'─'.repeat(7)} ${'─'.repeat(7)} ${'─'.repeat(7)} ${'─'.repeat(7)} ${'─'.repeat(6)} ${'─'.repeat(6)} ${'─'.repeat(7)} ${'─'.repeat(8)} ${'─'.repeat(7)} ${'─'.repeat(6)} ${'─'.repeat(6)} ${'─'.repeat(9)}`);
3398
3417
  for (const r of rows) {
3399
3418
  // Which buckets the ratio may read is defined once, in shared — see
3400
3419
  // `stopDeliveryLoss`. Restating it here is how the instrument would come
3401
3420
  // to measure something other than what its legend claims.
3402
3421
  const { adjudicated, ratio } = stopDeliveryLoss(r);
3403
3422
  const rate = ratio != null ? `${(ratio * 100).toFixed(0)}% of ${adjudicated}` : '—';
3404
- log(` ${r.agentType.slice(0, 14).padEnd(14)} ${String(r.total).padEnd(7)} ${String(r.stop).padEnd(7)} ${String(r.syntheticStop).padEnd(7)} ${String(r.nextPrompt).padEnd(7)} ${String(r.interrupted).padEnd(6)} ${String(r.aborted).padEnd(6)} ${String(r.superseded).padEnd(7)} ${String(r.sessionEnd).padEnd(8)} ${String(r.open).padEnd(6)} ${String(r.preInstrument).padEnd(6)} ${rate}`);
3423
+ log(` ${r.agentType.slice(0, 14).padEnd(14)} ${String(r.total).padEnd(7)} ${String(r.stop).padEnd(7)} ${String(r.syntheticStop).padEnd(7)} ${String(r.nextPrompt).padEnd(7)} ${String(r.interrupted).padEnd(6)} ${String(r.aborted).padEnd(6)} ${String(r.superseded).padEnd(7)} ${String(r.sessionEnd).padEnd(8)} ${String(r.runClose).padEnd(7)} ${String(r.open).padEnd(6)} ${String(r.preInstrument).padEnd(6)} ${rate}`);
3405
3424
  }
3406
3425
  log('');
3407
- log(' Synth = Stop hook dropped, watchdog recovered it from the transcript');
3426
+ log(" Synth = Stop hook dropped, recovered from the agent's own record (transcript watchdog; rollout at the next prompt for Codex)");
3408
3427
  log(' NoStop = Stop hook dropped and nothing recovered it (closed by the next prompt)');
3409
3428
  log(' Esc = user cancelled the turn — Claude Code owes no Stop, so not a loss');
3410
3429
  log(' Abort = usage limit / auth / API error ended the turn — no Stop is fired for those');
3411
3430
  log(' Folded = a second prompt arrived before this one ran; one turn served both');
3431
+ log(' Reaped = the run was reaped under the open turn — the daemon that would have taken its Stop was gone (a restart)');
3412
3432
  log(' ? = closed before end_source existed — signal unknown, never guessed');
3413
3433
  log('');
3414
3434
  });