@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.
- package/dist/apme/classifier.d.ts.map +1 -1
- package/dist/apme/classifier.js +18 -10
- package/dist/apme/classifier.js.map +1 -1
- package/dist/apme/claude-transcript-reader.d.ts +36 -0
- package/dist/apme/claude-transcript-reader.d.ts.map +1 -1
- package/dist/apme/claude-transcript-reader.js +78 -2
- package/dist/apme/claude-transcript-reader.js.map +1 -1
- package/dist/apme/collector.d.ts +109 -3
- package/dist/apme/collector.d.ts.map +1 -1
- package/dist/apme/collector.js +408 -44
- package/dist/apme/collector.js.map +1 -1
- package/dist/apme/dashboard-html.d.ts.map +1 -1
- package/dist/apme/dashboard-html.js +4 -2
- package/dist/apme/dashboard-html.js.map +1 -1
- package/dist/apme/graph.d.ts +1 -1
- package/dist/apme/graph.d.ts.map +1 -1
- package/dist/apme/graph.js +51 -1
- package/dist/apme/graph.js.map +1 -1
- package/dist/apme/http.d.ts.map +1 -1
- package/dist/apme/http.js +4 -0
- package/dist/apme/http.js.map +1 -1
- package/dist/apme/index.d.ts +4 -0
- package/dist/apme/index.d.ts.map +1 -1
- package/dist/apme/index.js +13 -1
- package/dist/apme/index.js.map +1 -1
- package/dist/apme/runner.d.ts +90 -0
- package/dist/apme/runner.d.ts.map +1 -1
- package/dist/apme/runner.js +524 -48
- package/dist/apme/runner.js.map +1 -1
- package/dist/apme/sample-to-timeline.d.ts.map +1 -1
- package/dist/apme/sample-to-timeline.js +5 -0
- package/dist/apme/sample-to-timeline.js.map +1 -1
- package/dist/apme/settings.d.ts +8 -0
- package/dist/apme/settings.d.ts.map +1 -1
- package/dist/apme/settings.js +4 -0
- package/dist/apme/settings.js.map +1 -1
- package/dist/apme/store.d.ts +77 -8
- package/dist/apme/store.d.ts.map +1 -1
- package/dist/apme/store.js +189 -17
- package/dist/apme/store.js.map +1 -1
- package/dist/apme/task-gradeability.d.ts +82 -0
- package/dist/apme/task-gradeability.d.ts.map +1 -0
- package/dist/apme/task-gradeability.js +126 -0
- package/dist/apme/task-gradeability.js.map +1 -0
- package/dist/awaiting-overlay.d.ts +13 -26
- package/dist/awaiting-overlay.d.ts.map +1 -1
- package/dist/awaiting-overlay.js +7 -40
- package/dist/awaiting-overlay.js.map +1 -1
- package/dist/claude-permission-rules.d.ts +20 -32
- package/dist/claude-permission-rules.d.ts.map +1 -1
- package/dist/claude-permission-rules.js +19 -102
- package/dist/claude-permission-rules.js.map +1 -1
- package/dist/claude-usage-recovery.d.ts +54 -0
- package/dist/claude-usage-recovery.d.ts.map +1 -0
- package/dist/claude-usage-recovery.js +200 -0
- package/dist/claude-usage-recovery.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +28 -8
- package/dist/cli.js.map +1 -1
- package/dist/codex-rollout-response.d.ts +43 -0
- package/dist/codex-rollout-response.d.ts.map +1 -1
- package/dist/codex-rollout-response.js +67 -0
- package/dist/codex-rollout-response.js.map +1 -1
- package/dist/coordination-evidence.d.ts +150 -0
- package/dist/coordination-evidence.d.ts.map +1 -0
- package/dist/coordination-evidence.js +455 -0
- package/dist/coordination-evidence.js.map +1 -0
- package/dist/daemon-server.d.ts.map +1 -1
- package/dist/daemon-server.js +329 -34
- package/dist/daemon-server.js.map +1 -1
- package/dist/daemon.js +1 -1
- package/dist/deferred-reply-read.d.ts +24 -0
- package/dist/deferred-reply-read.d.ts.map +1 -0
- package/dist/deferred-reply-read.js +42 -0
- package/dist/deferred-reply-read.js.map +1 -0
- package/dist/esp32-serial.d.ts +11 -0
- package/dist/esp32-serial.d.ts.map +1 -1
- package/dist/esp32-serial.js +57 -2
- package/dist/esp32-serial.js.map +1 -1
- package/dist/hook-codex-sessions.d.ts +9 -0
- package/dist/hook-codex-sessions.d.ts.map +1 -1
- package/dist/hook-codex-sessions.js +35 -2
- package/dist/hook-codex-sessions.js.map +1 -1
- package/dist/hook-opencode-sessions.d.ts +62 -0
- package/dist/hook-opencode-sessions.d.ts.map +1 -0
- package/dist/hook-opencode-sessions.js +180 -0
- package/dist/hook-opencode-sessions.js.map +1 -0
- package/dist/hook-response-source.d.ts +40 -0
- package/dist/hook-response-source.d.ts.map +1 -0
- package/dist/hook-response-source.js +31 -0
- package/dist/hook-response-source.js.map +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/native-dependency-diagnostics.d.ts +29 -0
- package/dist/native-dependency-diagnostics.d.ts.map +1 -0
- package/dist/native-dependency-diagnostics.js +95 -0
- package/dist/native-dependency-diagnostics.js.map +1 -0
- package/dist/observed-steering.d.ts +4 -4
- package/dist/observed-steering.d.ts.map +1 -1
- package/dist/observed-steering.js +28 -32
- package/dist/observed-steering.js.map +1 -1
- package/dist/openclaw-gateway-stability.d.ts +94 -0
- package/dist/openclaw-gateway-stability.d.ts.map +1 -0
- package/dist/openclaw-gateway-stability.js +176 -0
- package/dist/openclaw-gateway-stability.js.map +1 -0
- package/dist/passive-observer.d.ts +5 -0
- package/dist/passive-observer.d.ts.map +1 -1
- package/dist/passive-observer.js +6 -0
- package/dist/passive-observer.js.map +1 -1
- package/dist/review-runner.js +1 -1
- package/dist/subagent-timeline.d.ts +27 -0
- package/dist/subagent-timeline.d.ts.map +1 -1
- package/dist/subagent-timeline.js +52 -5
- package/dist/subagent-timeline.js.map +1 -1
- package/dist/usage-api.d.ts +3 -0
- package/dist/usage-api.d.ts.map +1 -1
- package/dist/usage-api.js +101 -36
- package/dist/usage-api.js.map +1 -1
- package/dist/usage-event.d.ts.map +1 -1
- package/dist/usage-event.js +2 -1
- package/dist/usage-event.js.map +1 -1
- 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
|
|
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(
|
|
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
|
});
|