@ironbee-ai/cli 0.5.3 → 0.6.0

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 (135) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/clients/claude/hooks/require-verification.d.ts.map +1 -1
  3. package/dist/clients/claude/hooks/require-verification.js +21 -2
  4. package/dist/clients/claude/hooks/require-verification.js.map +1 -1
  5. package/dist/clients/claude/hooks/session-end.d.ts.map +1 -1
  6. package/dist/clients/claude/hooks/session-end.js +4 -0
  7. package/dist/clients/claude/hooks/session-end.js.map +1 -1
  8. package/dist/clients/claude/hooks/session-start.d.ts.map +1 -1
  9. package/dist/clients/claude/hooks/session-start.js +6 -1
  10. package/dist/clients/claude/hooks/session-start.js.map +1 -1
  11. package/dist/clients/claude/hooks/track-action.d.ts +25 -4
  12. package/dist/clients/claude/hooks/track-action.d.ts.map +1 -1
  13. package/dist/clients/claude/hooks/track-action.js +145 -25
  14. package/dist/clients/claude/hooks/track-action.js.map +1 -1
  15. package/dist/clients/claude/hooks/verify-gate.d.ts.map +1 -1
  16. package/dist/clients/claude/hooks/verify-gate.js +5 -0
  17. package/dist/clients/claude/hooks/verify-gate.js.map +1 -1
  18. package/dist/clients/claude/index.d.ts.map +1 -1
  19. package/dist/clients/claude/index.js +18 -1
  20. package/dist/clients/claude/index.js.map +1 -1
  21. package/dist/clients/claude/util.d.ts +74 -0
  22. package/dist/clients/claude/util.d.ts.map +1 -0
  23. package/dist/clients/claude/util.js +352 -0
  24. package/dist/clients/claude/util.js.map +1 -0
  25. package/dist/clients/cursor/hooks/require-verification.d.ts.map +1 -1
  26. package/dist/clients/cursor/hooks/require-verification.js +18 -2
  27. package/dist/clients/cursor/hooks/require-verification.js.map +1 -1
  28. package/dist/clients/cursor/hooks/session-end.d.ts.map +1 -1
  29. package/dist/clients/cursor/hooks/session-end.js +4 -0
  30. package/dist/clients/cursor/hooks/session-end.js.map +1 -1
  31. package/dist/clients/cursor/hooks/session-start.d.ts.map +1 -1
  32. package/dist/clients/cursor/hooks/session-start.js +4 -1
  33. package/dist/clients/cursor/hooks/session-start.js.map +1 -1
  34. package/dist/clients/cursor/hooks/track-action.d.ts +30 -8
  35. package/dist/clients/cursor/hooks/track-action.d.ts.map +1 -1
  36. package/dist/clients/cursor/hooks/track-action.js +179 -52
  37. package/dist/clients/cursor/hooks/track-action.js.map +1 -1
  38. package/dist/clients/cursor/hooks/verify-gate.d.ts.map +1 -1
  39. package/dist/clients/cursor/hooks/verify-gate.js +4 -0
  40. package/dist/clients/cursor/hooks/verify-gate.js.map +1 -1
  41. package/dist/clients/cursor/index.d.ts.map +1 -1
  42. package/dist/clients/cursor/index.js +13 -2
  43. package/dist/clients/cursor/index.js.map +1 -1
  44. package/dist/clients/cursor/util.d.ts +52 -0
  45. package/dist/clients/cursor/util.d.ts.map +1 -0
  46. package/dist/clients/cursor/util.js +264 -0
  47. package/dist/clients/cursor/util.js.map +1 -0
  48. package/dist/commands/hook.js +1 -2
  49. package/dist/commands/hook.js.map +1 -1
  50. package/dist/commands/process-job-file.d.ts +10 -0
  51. package/dist/commands/process-job-file.d.ts.map +1 -0
  52. package/dist/commands/process-job-file.js +19 -0
  53. package/dist/commands/process-job-file.js.map +1 -0
  54. package/dist/commands/queue.d.ts +12 -0
  55. package/dist/commands/queue.d.ts.map +1 -0
  56. package/dist/commands/queue.js +495 -0
  57. package/dist/commands/queue.js.map +1 -0
  58. package/dist/hooks/core/actions.d.ts +73 -2
  59. package/dist/hooks/core/actions.d.ts.map +1 -1
  60. package/dist/hooks/core/actions.js +36 -2
  61. package/dist/hooks/core/actions.js.map +1 -1
  62. package/dist/hooks/core/session-state.d.ts +13 -0
  63. package/dist/hooks/core/session-state.d.ts.map +1 -1
  64. package/dist/hooks/core/session-state.js +21 -0
  65. package/dist/hooks/core/session-state.js.map +1 -1
  66. package/dist/hooks/core/verify-gate.d.ts.map +1 -1
  67. package/dist/hooks/core/verify-gate.js +13 -5
  68. package/dist/hooks/core/verify-gate.js.map +1 -1
  69. package/dist/index.js +12 -3
  70. package/dist/index.js.map +1 -1
  71. package/dist/lib/collector.d.ts +62 -3
  72. package/dist/lib/collector.d.ts.map +1 -1
  73. package/dist/lib/collector.js +107 -35
  74. package/dist/lib/collector.js.map +1 -1
  75. package/dist/lib/config.d.ts +72 -8
  76. package/dist/lib/config.d.ts.map +1 -1
  77. package/dist/lib/config.js +40 -0
  78. package/dist/lib/config.js.map +1 -1
  79. package/dist/queue/dead-letter.d.ts +26 -0
  80. package/dist/queue/dead-letter.d.ts.map +1 -0
  81. package/dist/queue/dead-letter.js +233 -0
  82. package/dist/queue/dead-letter.js.map +1 -0
  83. package/dist/queue/drain.d.ts +36 -0
  84. package/dist/queue/drain.d.ts.map +1 -0
  85. package/dist/queue/drain.js +170 -0
  86. package/dist/queue/drain.js.map +1 -0
  87. package/dist/queue/flush.d.ts +64 -0
  88. package/dist/queue/flush.d.ts.map +1 -0
  89. package/dist/queue/flush.js +119 -0
  90. package/dist/queue/flush.js.map +1 -0
  91. package/dist/queue/handlers/send-event.d.ts +23 -0
  92. package/dist/queue/handlers/send-event.d.ts.map +1 -0
  93. package/dist/queue/handlers/send-event.js +131 -0
  94. package/dist/queue/handlers/send-event.js.map +1 -0
  95. package/dist/queue/index.d.ts +30 -0
  96. package/dist/queue/index.d.ts.map +1 -0
  97. package/dist/queue/index.js +71 -0
  98. package/dist/queue/index.js.map +1 -0
  99. package/dist/queue/paths.d.ts +40 -0
  100. package/dist/queue/paths.d.ts.map +1 -0
  101. package/dist/queue/paths.js +107 -0
  102. package/dist/queue/paths.js.map +1 -0
  103. package/dist/queue/process-file.d.ts +22 -0
  104. package/dist/queue/process-file.d.ts.map +1 -0
  105. package/dist/queue/process-file.js +257 -0
  106. package/dist/queue/process-file.js.map +1 -0
  107. package/dist/queue/register-handlers.d.ts +26 -0
  108. package/dist/queue/register-handlers.d.ts.map +1 -0
  109. package/dist/queue/register-handlers.js +36 -0
  110. package/dist/queue/register-handlers.js.map +1 -0
  111. package/dist/queue/registry.d.ts +42 -0
  112. package/dist/queue/registry.d.ts.map +1 -0
  113. package/dist/queue/registry.js +36 -0
  114. package/dist/queue/registry.js.map +1 -0
  115. package/dist/queue/snapshot.d.ts +16 -0
  116. package/dist/queue/snapshot.d.ts.map +1 -0
  117. package/dist/queue/snapshot.js +39 -0
  118. package/dist/queue/snapshot.js.map +1 -0
  119. package/dist/queue/spawn.d.ts +15 -0
  120. package/dist/queue/spawn.d.ts.map +1 -0
  121. package/dist/queue/spawn.js +45 -0
  122. package/dist/queue/spawn.js.map +1 -0
  123. package/dist/queue/submit.d.ts +19 -0
  124. package/dist/queue/submit.d.ts.map +1 -0
  125. package/dist/queue/submit.js +94 -0
  126. package/dist/queue/submit.js.map +1 -0
  127. package/dist/queue/types.d.ts +77 -0
  128. package/dist/queue/types.d.ts.map +1 -0
  129. package/dist/queue/types.js +83 -0
  130. package/dist/queue/types.js.map +1 -0
  131. package/dist/queue/worker-log.d.ts +21 -0
  132. package/dist/queue/worker-log.d.ts.map +1 -0
  133. package/dist/queue/worker-log.js +140 -0
  134. package/dist/queue/worker-log.js.map +1 -0
  135. package/package.json +1 -1
@@ -0,0 +1,495 @@
1
+ "use strict";
2
+ /**
3
+ * IronBee CLI — `ironbee queue ...` subcommands
4
+ *
5
+ * See docs/job-queue.md §6.4, §8.2.
6
+ *
7
+ * All operator commands are scoped to the current project directory — they
8
+ * aggregate across every session's queue/ subdir by default, or narrow to a
9
+ * single session via `--session <id>`.
10
+ */
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.queueCommand = void 0;
13
+ const commander_1 = require("commander");
14
+ const fs_1 = require("fs");
15
+ const path_1 = require("path");
16
+ const config_1 = require("../lib/config");
17
+ const queue_1 = require("../queue");
18
+ function listSessionIds(projectDir) {
19
+ const root = (0, queue_1.sessionsRoot)(projectDir);
20
+ if (!(0, fs_1.existsSync)(root)) {
21
+ return [];
22
+ }
23
+ try {
24
+ return (0, fs_1.readdirSync)(root).filter((name) => {
25
+ try {
26
+ return (0, fs_1.statSync)((0, path_1.join)(root, name)).isDirectory();
27
+ }
28
+ catch {
29
+ return false;
30
+ }
31
+ });
32
+ }
33
+ catch {
34
+ return [];
35
+ }
36
+ }
37
+ function countLines(path) {
38
+ try {
39
+ const content = (0, fs_1.readFileSync)(path, "utf-8");
40
+ if (content.length === 0) {
41
+ return 0;
42
+ }
43
+ return content.split("\n").filter((l) => l.length > 0).length;
44
+ }
45
+ catch {
46
+ return 0;
47
+ }
48
+ }
49
+ function listSnapshotsFor(projectDir, sessionId) {
50
+ const dir = (0, queue_1.queueDir)(projectDir, sessionId);
51
+ if (!(0, fs_1.existsSync)(dir)) {
52
+ return [];
53
+ }
54
+ try {
55
+ return (0, fs_1.readdirSync)(dir)
56
+ .filter((name) => queue_1.SNAPSHOT_FILENAME_REGEX.test(name))
57
+ .map((name) => (0, path_1.join)(dir, name));
58
+ }
59
+ catch {
60
+ return [];
61
+ }
62
+ }
63
+ function collectStatus(projectDir, sessionId) {
64
+ const live = (0, queue_1.liveQueueFile)(projectDir, sessionId);
65
+ const dead = (0, queue_1.deadLetterFile)(projectDir, sessionId);
66
+ const snapshots = listSnapshotsFor(projectDir, sessionId);
67
+ let snapBytes = 0;
68
+ for (const p of snapshots) {
69
+ try {
70
+ snapBytes += (0, fs_1.statSync)(p).size;
71
+ }
72
+ catch {
73
+ // skip
74
+ }
75
+ }
76
+ return {
77
+ sessionId,
78
+ liveLines: countLines(live),
79
+ liveBytes: fileSize(live),
80
+ snapshotCount: snapshots.length,
81
+ snapshotBytes: snapBytes,
82
+ deadLetterLines: countLines(dead),
83
+ deadLetterBytes: fileSize(dead),
84
+ };
85
+ }
86
+ function fileSize(path) {
87
+ try {
88
+ return (0, fs_1.statSync)(path).size;
89
+ }
90
+ catch {
91
+ return 0;
92
+ }
93
+ }
94
+ /** Parse duration strings like "14d", "2h", "30m", "60s" → milliseconds. */
95
+ function parseDuration(s) {
96
+ const m = s.match(/^(\d+)\s*(d|h|m|s)$/);
97
+ if (!m) {
98
+ throw new Error(`invalid duration "${s}" — use e.g. 14d, 2h, 30m, 60s`);
99
+ }
100
+ const n = parseInt(m[1], 10);
101
+ const units = { s: 1000, m: 60000, h: 3600000, d: 86400000 };
102
+ return n * units[m[2]];
103
+ }
104
+ exports.queueCommand = new commander_1.Command("queue")
105
+ .description("Inspect and manage the file-backed job queue");
106
+ // ──────────────────────────────────────────────────────────────────────────
107
+ // ironbee queue status
108
+ // ──────────────────────────────────────────────────────────────────────────
109
+ exports.queueCommand
110
+ .command("status")
111
+ .description("Show queue counts per session (aggregated across the project)")
112
+ .option("--session <id>", "limit to one session")
113
+ .option("--project-dir <dir>", "project directory (overrides env/cwd)")
114
+ .action((options) => {
115
+ const projectDir = (0, queue_1.resolveProjectDir)(options.projectDir);
116
+ const sessionIds = options.session
117
+ ? [options.session]
118
+ : listSessionIds(projectDir);
119
+ if (sessionIds.length === 0) {
120
+ process.stdout.write("No sessions found.\n");
121
+ return;
122
+ }
123
+ let totalLive = 0;
124
+ let totalSnap = 0;
125
+ let totalDead = 0;
126
+ for (const sid of sessionIds) {
127
+ const s = collectStatus(projectDir, sid);
128
+ totalLive += s.liveLines;
129
+ totalSnap += s.snapshotCount;
130
+ totalDead += s.deadLetterLines;
131
+ process.stdout.write(`session=${sid}\n`);
132
+ process.stdout.write(` live: ${s.liveLines} lines (${s.liveBytes} B)\n`);
133
+ process.stdout.write(` snapshots: ${s.snapshotCount} files (${s.snapshotBytes} B)\n`);
134
+ process.stdout.write(` dead-letter: ${s.deadLetterLines} lines (${s.deadLetterBytes} B)\n`);
135
+ if (s.deadLetterLines > 0) {
136
+ const entries = (0, queue_1.readDeadLetterEntries)(projectDir, sid);
137
+ const recent = entries.slice(-3);
138
+ for (const e of recent) {
139
+ process.stdout.write(` [${e.received_at}] ${e.category}\n`);
140
+ }
141
+ }
142
+ }
143
+ process.stdout.write(`\nTotals: live=${totalLive} snapshots=${totalSnap} dead=${totalDead}\n`);
144
+ });
145
+ // ──────────────────────────────────────────────────────────────────────────
146
+ // ironbee queue drain
147
+ // ──────────────────────────────────────────────────────────────────────────
148
+ exports.queueCommand
149
+ .command("drain")
150
+ .description("Synchronously drain pending snapshots (per-session or all in the project)")
151
+ .option("--session <id>", "drain one session")
152
+ .option("--project-dir <dir>", "project directory (overrides env/cwd)")
153
+ .action(async (options) => {
154
+ const projectDir = (0, queue_1.resolveProjectDir)(options.projectDir);
155
+ const sessionIds = options.session
156
+ ? [options.session]
157
+ : listSessionIds(projectDir);
158
+ if (sessionIds.length === 0) {
159
+ process.stdout.write("Nothing to drain.\n");
160
+ return;
161
+ }
162
+ let remaining = 0;
163
+ for (const sid of sessionIds) {
164
+ const res = await (0, queue_1.drain)(projectDir, sid);
165
+ process.stdout.write(`session=${sid} processed=${res.snapshotsProcessed} remaining=${res.snapshotsRemaining} cleaned=${res.cleanedQueueDir}\n`);
166
+ remaining += res.snapshotsRemaining;
167
+ }
168
+ if (remaining > 0) {
169
+ process.stdout.write(`\n${remaining} snapshot(s) remain — investigate worker.log.\n`);
170
+ process.exit(1);
171
+ }
172
+ });
173
+ // Note: `ironbee queue drain` deliberately passes skipRecentMs=0 (the default)
174
+ // — it's a manual recovery path that must catch every snapshot, including
175
+ // orphans from a worker that crashed seconds ago.
176
+ // ──────────────────────────────────────────────────────────────────────────
177
+ // ironbee queue purge
178
+ // ──────────────────────────────────────────────────────────────────────────
179
+ exports.queueCommand
180
+ .command("purge")
181
+ .description("Destructive cleanup of queue state")
182
+ .option("--snapshots", "delete all snapshot files in all sessions without processing")
183
+ .option("--sessions <spec>", "remove old queue/ subdirs; use `older-than=<duration>`, e.g. `older-than=14d`")
184
+ .option("--project-dir <dir>", "project directory (overrides env/cwd)")
185
+ .action((options) => {
186
+ const projectDir = (0, queue_1.resolveProjectDir)(options.projectDir);
187
+ if (!options.snapshots && !options.sessions) {
188
+ process.stderr.write("Error: pass --snapshots or --sessions older-than=<dur>.\n");
189
+ process.exit(1);
190
+ }
191
+ if (options.snapshots) {
192
+ let removed = 0;
193
+ for (const sid of listSessionIds(projectDir)) {
194
+ for (const snap of listSnapshotsFor(projectDir, sid)) {
195
+ try {
196
+ (0, fs_1.unlinkSync)(snap);
197
+ removed++;
198
+ }
199
+ catch {
200
+ // best-effort
201
+ }
202
+ }
203
+ }
204
+ process.stdout.write(`Removed ${removed} snapshot file(s).\n`);
205
+ }
206
+ if (options.sessions) {
207
+ const m = options.sessions.match(/^older-than=(.+)$/);
208
+ if (!m) {
209
+ process.stderr.write("Error: --sessions must be of the form `older-than=<duration>` (e.g. older-than=14d).\n");
210
+ process.exit(1);
211
+ }
212
+ let cutoff;
213
+ try {
214
+ cutoff = Date.now() - parseDuration(m[1]);
215
+ }
216
+ catch (e) {
217
+ process.stderr.write(`Error: ${e instanceof Error ? e.message : String(e)}\n`);
218
+ process.exit(1);
219
+ return;
220
+ }
221
+ let removed = 0;
222
+ for (const sid of listSessionIds(projectDir)) {
223
+ const qdir = (0, queue_1.queueDir)(projectDir, sid);
224
+ if (!(0, fs_1.existsSync)(qdir)) {
225
+ continue;
226
+ }
227
+ let st;
228
+ try {
229
+ st = (0, fs_1.statSync)(qdir);
230
+ }
231
+ catch {
232
+ continue;
233
+ }
234
+ if (st.mtimeMs > cutoff) {
235
+ continue;
236
+ }
237
+ // Safety: refuse if any undelivered work or non-empty dead-letter exists.
238
+ let blocked = false;
239
+ try {
240
+ const names = (0, fs_1.readdirSync)(qdir);
241
+ for (const name of names) {
242
+ if (name === "jobs.jsonl" && fileSize((0, path_1.join)(qdir, name)) > 0) {
243
+ blocked = true;
244
+ }
245
+ if (queue_1.SNAPSHOT_FILENAME_REGEX.test(name)) {
246
+ blocked = true;
247
+ }
248
+ if ((name === "dead-letter.jsonl" || queue_1.DEAD_LETTER_ROTATED_REGEX.test(name))
249
+ && fileSize((0, path_1.join)(qdir, name)) > 0) {
250
+ blocked = true;
251
+ }
252
+ if (blocked) {
253
+ break;
254
+ }
255
+ }
256
+ }
257
+ catch {
258
+ continue;
259
+ }
260
+ if (blocked) {
261
+ process.stdout.write(`skip session=${sid} — has undelivered work or triage records\n`);
262
+ continue;
263
+ }
264
+ try {
265
+ (0, fs_1.rmSync)(qdir, { recursive: true, force: true });
266
+ removed++;
267
+ process.stdout.write(`removed queue/ for session=${sid}\n`);
268
+ }
269
+ catch {
270
+ // best-effort
271
+ }
272
+ }
273
+ process.stdout.write(`Removed ${removed} queue/ subdir(s).\n`);
274
+ }
275
+ });
276
+ // ──────────────────────────────────────────────────────────────────────────
277
+ // ironbee queue dead-letter {list,stats,retry,clear}
278
+ // ──────────────────────────────────────────────────────────────────────────
279
+ const deadLetterCommand = new commander_1.Command("dead-letter")
280
+ .description("Inspect and act on dead-letter entries");
281
+ deadLetterCommand
282
+ .command("list")
283
+ .description("List dead-letter entries")
284
+ .option("--session <id>", "scope to one session")
285
+ .option("--limit <n>", "limit output count", (v) => parseInt(v, 10), 50)
286
+ .option("--project-dir <dir>", "project directory (overrides env/cwd)")
287
+ .action((options) => {
288
+ const projectDir = (0, queue_1.resolveProjectDir)(options.projectDir);
289
+ const sessionIds = options.session
290
+ ? [options.session]
291
+ : listSessionIds(projectDir);
292
+ const all = [];
293
+ for (const sid of sessionIds) {
294
+ for (const e of (0, queue_1.readDeadLetterEntries)(projectDir, sid)) {
295
+ all.push({ sessionId: sid, entry: e });
296
+ }
297
+ }
298
+ all.sort((a, b) => a.entry.received_at.localeCompare(b.entry.received_at));
299
+ const limit = options.limit ?? 50;
300
+ const rows = all.slice(-limit);
301
+ for (const r of rows) {
302
+ const origId = "original" in r.entry ? r.entry.original.id : "(parse-error)";
303
+ process.stdout.write(`[${r.entry.received_at}] session=${r.sessionId} id=${r.entry.id} original=${origId} category=${r.entry.category}\n`);
304
+ }
305
+ process.stdout.write(`\nTotal matching: ${all.length} (showing last ${rows.length})\n`);
306
+ });
307
+ deadLetterCommand
308
+ .command("stats")
309
+ .description("Histogram of dead-letter categories")
310
+ .option("--session <id>", "scope to one session")
311
+ .option("--project-dir <dir>", "project directory (overrides env/cwd)")
312
+ .action((options) => {
313
+ const projectDir = (0, queue_1.resolveProjectDir)(options.projectDir);
314
+ const sessionIds = options.session
315
+ ? [options.session]
316
+ : listSessionIds(projectDir);
317
+ const histogram = new Map();
318
+ for (const sid of sessionIds) {
319
+ for (const e of (0, queue_1.readDeadLetterEntries)(projectDir, sid)) {
320
+ const prev = histogram.get(e.category);
321
+ histogram.set(e.category, (prev ?? 0) + 1);
322
+ }
323
+ }
324
+ const rows = [...histogram.entries()].sort((a, b) => b[1] - a[1]);
325
+ if (rows.length === 0) {
326
+ process.stdout.write("No dead-letter entries.\n");
327
+ return;
328
+ }
329
+ for (const [cat, count] of rows) {
330
+ process.stdout.write(`${String(count).padStart(6, " ")} ${cat}\n`);
331
+ }
332
+ });
333
+ deadLetterCommand
334
+ .command("retry <job_id>")
335
+ .description("Re-queue a dead-letter entry by its original job id. Atomic read-modify-write.")
336
+ .option("--session <id>", "force re-queue into a specific session (default: the owning session)")
337
+ .option("--project-dir <dir>", "project directory (overrides env/cwd)")
338
+ .action((jobId, options) => {
339
+ const projectDir = (0, queue_1.resolveProjectDir)(options.projectDir);
340
+ // Operator-facing path: don't silently no-op like the producer guard
341
+ // does — if the queue is disabled, the resubmitted job would never
342
+ // be processed. Tell the operator explicitly.
343
+ if (!(0, config_1.isJobQueueEnabled)(projectDir)) {
344
+ process.stderr.write(`Error: jobQueue is disabled. Add a "jobQueue": {} section to config.json (or remove "enable": false) to retry.\n`);
345
+ process.exit(1);
346
+ return;
347
+ }
348
+ const sessionIds = listSessionIds(projectDir);
349
+ // Locate the dead-letter entry.
350
+ let owningSession = null;
351
+ let foundEntry = null;
352
+ for (const sid of sessionIds) {
353
+ for (const e of (0, queue_1.readDeadLetterEntries)(projectDir, sid)) {
354
+ if ("original" in e && e.original.id === jobId) {
355
+ owningSession = sid;
356
+ foundEntry = e;
357
+ break;
358
+ }
359
+ }
360
+ if (foundEntry) {
361
+ break;
362
+ }
363
+ }
364
+ if (!foundEntry || !owningSession) {
365
+ process.stderr.write(`Error: no dead-letter entry found with original id "${jobId}".\n`);
366
+ process.exit(1);
367
+ return;
368
+ }
369
+ const targetSession = options.session ?? owningSession;
370
+ const targetSessionDir = (0, queue_1.queueDir)(projectDir, targetSession);
371
+ // Redirect requires the target session dir already exist — we don't
372
+ // silently resurrect a removed session.
373
+ const targetParent = (0, path_1.join)(projectDir, ".ironbee", "sessions", targetSession);
374
+ if (!(0, fs_1.existsSync)(targetParent)) {
375
+ process.stderr.write(`Error: target session "${targetSession}" does not exist.\n`);
376
+ process.exit(1);
377
+ return;
378
+ }
379
+ (0, fs_1.mkdirSync)(targetSessionDir, { recursive: true, mode: 0o700 });
380
+ // Atomic read-modify-write on the dead-letter file.
381
+ const dlPath = (0, queue_1.deadLetterFile)(projectDir, owningSession);
382
+ let content;
383
+ try {
384
+ content = (0, fs_1.readFileSync)(dlPath, "utf-8");
385
+ }
386
+ catch (e) {
387
+ process.stderr.write(`Error reading dead-letter file: ${e instanceof Error ? e.message : String(e)}\n`);
388
+ process.exit(1);
389
+ return;
390
+ }
391
+ const lines = content.split("\n");
392
+ const kept = [];
393
+ let removed = false;
394
+ for (const line of lines) {
395
+ if (line.length === 0) {
396
+ continue;
397
+ }
398
+ if (!removed) {
399
+ try {
400
+ const parsed = JSON.parse(line);
401
+ if ("original" in parsed && parsed.original.id === jobId) {
402
+ removed = true;
403
+ continue;
404
+ }
405
+ }
406
+ catch {
407
+ // keep malformed lines; don't risk data loss
408
+ }
409
+ }
410
+ kept.push(line);
411
+ }
412
+ const tmp = `${dlPath}.tmp-${process.pid}-${Date.now()}`;
413
+ try {
414
+ (0, fs_1.writeFileSync)(tmp, kept.length > 0 ? kept.join("\n") + "\n" : "", { mode: 0o600 });
415
+ (0, fs_1.renameSync)(tmp, dlPath);
416
+ }
417
+ catch (e) {
418
+ try {
419
+ (0, fs_1.unlinkSync)(tmp);
420
+ }
421
+ catch {
422
+ // ignore
423
+ }
424
+ process.stderr.write(`Error rewriting dead-letter file: ${e instanceof Error ? e.message : String(e)}\n`);
425
+ process.exit(1);
426
+ return;
427
+ }
428
+ // Re-submit the original job to the target session's live queue.
429
+ try {
430
+ const resubmitted = (0, queue_1.submit)(projectDir, targetSession, foundEntry.original.type, foundEntry.original.data, { id: foundEntry.original.id });
431
+ process.stdout.write(`Re-queued job id=${resubmitted} type=${foundEntry.original.type} session=${targetSession}\n`);
432
+ }
433
+ catch (e) {
434
+ process.stderr.write(`Error re-submitting: ${e instanceof Error ? e.message : String(e)}\n`);
435
+ process.exit(1);
436
+ }
437
+ });
438
+ deadLetterCommand
439
+ .command("clear")
440
+ .description("Empty the live dead-letter file; pass --all to also remove rotated archives")
441
+ .option("--session <id>", "scope to one session")
442
+ .option("--all", "also unlink rotated dead-letter-<UUID>.jsonl archives")
443
+ .option("--project-dir <dir>", "project directory (overrides env/cwd)")
444
+ .action((options) => {
445
+ const projectDir = (0, queue_1.resolveProjectDir)(options.projectDir);
446
+ const sessionIds = options.session
447
+ ? [options.session]
448
+ : listSessionIds(projectDir);
449
+ let cleared = 0;
450
+ let rotatedRemoved = 0;
451
+ for (const sid of sessionIds) {
452
+ const path = (0, queue_1.deadLetterFile)(projectDir, sid);
453
+ if ((0, fs_1.existsSync)(path)) {
454
+ try {
455
+ // Replace with empty file rather than unlink so the next
456
+ // append lands cleanly and permissions/mode are preserved.
457
+ (0, fs_1.writeFileSync)(path, "", { mode: 0o600 });
458
+ cleared++;
459
+ }
460
+ catch {
461
+ // best-effort
462
+ }
463
+ }
464
+ if (options.all) {
465
+ const qdir = (0, queue_1.queueDir)(projectDir, sid);
466
+ let names;
467
+ try {
468
+ names = (0, fs_1.readdirSync)(qdir);
469
+ }
470
+ catch {
471
+ continue;
472
+ }
473
+ for (const name of names) {
474
+ if (!queue_1.DEAD_LETTER_ROTATED_REGEX.test(name)) {
475
+ continue;
476
+ }
477
+ try {
478
+ (0, fs_1.unlinkSync)((0, path_1.join)(qdir, name));
479
+ rotatedRemoved++;
480
+ }
481
+ catch {
482
+ // best-effort
483
+ }
484
+ }
485
+ }
486
+ }
487
+ if (options.all) {
488
+ process.stdout.write(`Cleared dead-letter for ${cleared} session(s); removed ${rotatedRemoved} rotated archive(s).\n`);
489
+ }
490
+ else {
491
+ process.stdout.write(`Cleared dead-letter for ${cleared} session(s). Use --all to also remove rotated archives.\n`);
492
+ }
493
+ });
494
+ exports.queueCommand.addCommand(deadLetterCommand);
495
+ //# sourceMappingURL=queue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.js","sourceRoot":"","sources":["../../src/commands/queue.ts"],"names":[],"mappings":"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"}
@@ -30,17 +30,30 @@ export interface ActionEntry {
30
30
  timestamp: number;
31
31
  session_id: string;
32
32
  project_name: string;
33
+ user_email?: string;
33
34
  [key: string]: unknown;
34
35
  }
36
+ /**
37
+ * Resolve project name by walking up from the given directory looking for a
38
+ * `.git` entry (directory or file — the latter covers worktrees). If a git
39
+ * root is found, its basename becomes the project name. Otherwise falls back
40
+ * to the basename of the starting directory.
41
+ */
42
+ export declare function resolveProjectName(startDir: string): string;
35
43
  /**
36
44
  * Base fields that every event must carry — derived from the actionsFile path.
37
45
  * Writers spread this into concrete event constructions to satisfy the strict
38
46
  * `ActionEntry` contract without duplicating derivation logic.
47
+ *
48
+ * `user_email` is read from the per-session `state.json` (populated once at
49
+ * session start). If state.json is absent or the field is unset, it is
50
+ * omitted from the returned object so JSON.stringify drops it downstream.
39
51
  */
40
52
  export declare function baseFields(actionsFile: string): {
41
53
  id: string;
42
54
  session_id: string;
43
55
  project_name: string;
56
+ user_email?: string;
44
57
  };
45
58
  /**
46
59
  * Marker interfaces for hierarchical parent IDs.
@@ -57,13 +70,71 @@ export interface VerificationAwareActionEntry extends ActivityAwareActionEntry {
57
70
  export interface FixAwareActionEntry extends ActivityAwareActionEntry {
58
71
  fix_id: string;
59
72
  }
60
- export interface ToolCallAction extends VerificationAwareActionEntry {
73
+ /**
74
+ * A tool_call event. Extends ActivityAwareActionEntry (activity is always
75
+ * known when a tool runs) but NOT VerificationAwareActionEntry — tool calls
76
+ * happen everywhere in a session, most of them outside verification cycles
77
+ * (Bash / Edit / Read fire any time the agent wants, whereas verification
78
+ * cycles are bounded windows explicitly opened by the agent). Downstream
79
+ * schema must therefore treat `verification_id` and `trace_id` as optional.
80
+ */
81
+ export interface ToolCallAction extends ActivityAwareActionEntry {
61
82
  type: "tool_call";
83
+ /**
84
+ * Canonical tool identity after classification:
85
+ * - `tool_type="mcp"` → bare tool name WITHOUT server prefix (e.g. `"bdt_navigation_go-to"`)
86
+ * - `tool_type="skill"` → skill name from `tool_input.skill` (e.g. `"commit"`)
87
+ * - `tool_type="sub_agent"` → sub-agent type from `tool_input.subagent_type` (e.g. `"code-reviewer"`)
88
+ * - `tool_type=null` → the raw tool name (`"Read"`, `"Bash"`, …)
89
+ * See `src/lib/tool-taxonomy.ts:classifyTool`.
90
+ */
62
91
  tool_name: string;
92
+ /**
93
+ * Coarse classification of the tool invocation. `null` for native
94
+ * (Read/Write/Bash/…) tool calls; otherwise one of the three special
95
+ * buckets.
96
+ */
97
+ tool_type?: "mcp" | "skill" | "sub_agent" | null;
98
+ /**
99
+ * Hook-provided tool invocation id. Claude sets `tool_use_id` on both
100
+ * PreToolUse and PostToolUse stdin; Cursor sets it on postToolUse. Lets
101
+ * collector joins correlate a `tool_call` event with the MCP server's
102
+ * own span for the same invocation. Absent on nested (bdt_execute-parsed)
103
+ * entries since those never enter the hook lifecycle with a dedicated id.
104
+ */
105
+ tool_use_id?: string;
63
106
  tool_input?: unknown;
64
107
  tool_response?: unknown;
108
+ /**
109
+ * UTF-8 byte length of `tool_input` (serialized when non-string). Used
110
+ * for size-only telemetry where the raw content would leak sensitive
111
+ * data. `actions.jsonl` entries keep the raw fields; queue `send_event`
112
+ * wire payloads strip content and carry only sizes.
113
+ */
114
+ tool_input_size?: number;
115
+ /** UTF-8 byte length of `tool_response`. See `tool_input_size`. */
116
+ tool_response_size?: number;
117
+ /** Present only when the tool call ran inside a verification cycle. */
118
+ verification_id?: string;
119
+ /** Present only when the tool call ran inside a verification cycle (OTel correlation). */
65
120
  trace_id?: string;
66
- duration?: number;
121
+ /**
122
+ * MCP server name owning this tool, when applicable. Claude fills this
123
+ * from its `mcp__<server>__<tool>` naming convention; Cursor leaves it
124
+ * null because none of Cursor's hook stdin fields expose the server.
125
+ * `null` means either "not an MCP tool" OR "Cursor adapter couldn't
126
+ * determine it".
127
+ */
128
+ mcp_server?: string | null;
129
+ /**
130
+ * Tool wall-clock duration in ms — pure tool-execution time, excluding
131
+ * PreToolUse hooks and permission-prompt wait. Claude Code supplies it
132
+ * on both PostToolUse and PostToolUseFailure via stdin `duration_ms`;
133
+ * Cursor supplies it on postToolUseFailure (and sometimes postToolUse).
134
+ * `null` on pre-duration-support Claude versions.
135
+ * Downstream must treat missing / null as "unknown" not "zero".
136
+ */
137
+ duration?: number | null;
67
138
  error?: string;
68
139
  }
69
140
  export interface VerificationRequestedAction extends ActivityAwareActionEntry {
@@ -1 +1 @@
1
- {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../../src/hooks/core/actions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../../src/hooks/core/actions.ts"],"names":[],"mappings":"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"}