@ironbee-ai/cli 0.5.2 → 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 (159) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +1 -1
  3. package/dist/analysis/cross-session.d.ts +1 -1
  4. package/dist/analysis/cross-session.js +1 -1
  5. package/dist/analysis/cross-session.js.map +1 -1
  6. package/dist/analysis/time-analysis.js +3 -3
  7. package/dist/analysis/time-analysis.js.map +1 -1
  8. package/dist/analysis/verdict-details.d.ts +1 -1
  9. package/dist/clients/claude/hooks/clear-verdict.d.ts.map +1 -1
  10. package/dist/clients/claude/hooks/clear-verdict.js +17 -9
  11. package/dist/clients/claude/hooks/clear-verdict.js.map +1 -1
  12. package/dist/clients/claude/hooks/require-verification.d.ts.map +1 -1
  13. package/dist/clients/claude/hooks/require-verification.js +31 -4
  14. package/dist/clients/claude/hooks/require-verification.js.map +1 -1
  15. package/dist/clients/claude/hooks/session-end.d.ts.map +1 -1
  16. package/dist/clients/claude/hooks/session-end.js +6 -1
  17. package/dist/clients/claude/hooks/session-end.js.map +1 -1
  18. package/dist/clients/claude/hooks/session-start.d.ts.map +1 -1
  19. package/dist/clients/claude/hooks/session-start.js +9 -3
  20. package/dist/clients/claude/hooks/session-start.js.map +1 -1
  21. package/dist/clients/claude/hooks/track-action.d.ts +25 -4
  22. package/dist/clients/claude/hooks/track-action.d.ts.map +1 -1
  23. package/dist/clients/claude/hooks/track-action.js +160 -29
  24. package/dist/clients/claude/hooks/track-action.js.map +1 -1
  25. package/dist/clients/claude/hooks/verify-gate.d.ts.map +1 -1
  26. package/dist/clients/claude/hooks/verify-gate.js +5 -0
  27. package/dist/clients/claude/hooks/verify-gate.js.map +1 -1
  28. package/dist/clients/claude/index.d.ts.map +1 -1
  29. package/dist/clients/claude/index.js +18 -1
  30. package/dist/clients/claude/index.js.map +1 -1
  31. package/dist/clients/claude/util.d.ts +74 -0
  32. package/dist/clients/claude/util.d.ts.map +1 -0
  33. package/dist/clients/claude/util.js +352 -0
  34. package/dist/clients/claude/util.js.map +1 -0
  35. package/dist/clients/cursor/hooks/clear-verdict.d.ts.map +1 -1
  36. package/dist/clients/cursor/hooks/clear-verdict.js +19 -10
  37. package/dist/clients/cursor/hooks/clear-verdict.js.map +1 -1
  38. package/dist/clients/cursor/hooks/require-verification.d.ts.map +1 -1
  39. package/dist/clients/cursor/hooks/require-verification.js +28 -4
  40. package/dist/clients/cursor/hooks/require-verification.js.map +1 -1
  41. package/dist/clients/cursor/hooks/session-end.d.ts.map +1 -1
  42. package/dist/clients/cursor/hooks/session-end.js +6 -1
  43. package/dist/clients/cursor/hooks/session-end.js.map +1 -1
  44. package/dist/clients/cursor/hooks/session-start.d.ts.map +1 -1
  45. package/dist/clients/cursor/hooks/session-start.js +7 -2
  46. package/dist/clients/cursor/hooks/session-start.js.map +1 -1
  47. package/dist/clients/cursor/hooks/track-action.d.ts +30 -8
  48. package/dist/clients/cursor/hooks/track-action.d.ts.map +1 -1
  49. package/dist/clients/cursor/hooks/track-action.js +192 -54
  50. package/dist/clients/cursor/hooks/track-action.js.map +1 -1
  51. package/dist/clients/cursor/hooks/verify-gate.d.ts.map +1 -1
  52. package/dist/clients/cursor/hooks/verify-gate.js +4 -0
  53. package/dist/clients/cursor/hooks/verify-gate.js.map +1 -1
  54. package/dist/clients/cursor/index.d.ts.map +1 -1
  55. package/dist/clients/cursor/index.js +13 -2
  56. package/dist/clients/cursor/index.js.map +1 -1
  57. package/dist/clients/cursor/util.d.ts +52 -0
  58. package/dist/clients/cursor/util.d.ts.map +1 -0
  59. package/dist/clients/cursor/util.js +264 -0
  60. package/dist/clients/cursor/util.js.map +1 -0
  61. package/dist/commands/analyze.js +3 -3
  62. package/dist/commands/analyze.js.map +1 -1
  63. package/dist/commands/hook.js +1 -2
  64. package/dist/commands/hook.js.map +1 -1
  65. package/dist/commands/process-job-file.d.ts +10 -0
  66. package/dist/commands/process-job-file.d.ts.map +1 -0
  67. package/dist/commands/process-job-file.js +19 -0
  68. package/dist/commands/process-job-file.js.map +1 -0
  69. package/dist/commands/queue.d.ts +12 -0
  70. package/dist/commands/queue.d.ts.map +1 -0
  71. package/dist/commands/queue.js +495 -0
  72. package/dist/commands/queue.js.map +1 -0
  73. package/dist/hooks/core/actions.d.ts +168 -27
  74. package/dist/hooks/core/actions.d.ts.map +1 -1
  75. package/dist/hooks/core/actions.js +81 -4
  76. package/dist/hooks/core/actions.js.map +1 -1
  77. package/dist/hooks/core/activity.d.ts.map +1 -1
  78. package/dist/hooks/core/activity.js +13 -6
  79. package/dist/hooks/core/activity.js.map +1 -1
  80. package/dist/hooks/core/session-state.d.ts +19 -7
  81. package/dist/hooks/core/session-state.d.ts.map +1 -1
  82. package/dist/hooks/core/session-state.js +66 -12
  83. package/dist/hooks/core/session-state.js.map +1 -1
  84. package/dist/hooks/core/submit-verdict.d.ts.map +1 -1
  85. package/dist/hooks/core/submit-verdict.js +13 -4
  86. package/dist/hooks/core/submit-verdict.js.map +1 -1
  87. package/dist/hooks/core/verification-lifecycle.d.ts.map +1 -1
  88. package/dist/hooks/core/verification-lifecycle.js +14 -4
  89. package/dist/hooks/core/verification-lifecycle.js.map +1 -1
  90. package/dist/hooks/core/verify-gate.d.ts.map +1 -1
  91. package/dist/hooks/core/verify-gate.js +31 -19
  92. package/dist/hooks/core/verify-gate.js.map +1 -1
  93. package/dist/index.js +12 -3
  94. package/dist/index.js.map +1 -1
  95. package/dist/lib/collector.d.ts +64 -5
  96. package/dist/lib/collector.d.ts.map +1 -1
  97. package/dist/lib/collector.js +107 -44
  98. package/dist/lib/collector.js.map +1 -1
  99. package/dist/lib/config.d.ts +72 -8
  100. package/dist/lib/config.d.ts.map +1 -1
  101. package/dist/lib/config.js +40 -0
  102. package/dist/lib/config.js.map +1 -1
  103. package/dist/queue/dead-letter.d.ts +26 -0
  104. package/dist/queue/dead-letter.d.ts.map +1 -0
  105. package/dist/queue/dead-letter.js +233 -0
  106. package/dist/queue/dead-letter.js.map +1 -0
  107. package/dist/queue/drain.d.ts +36 -0
  108. package/dist/queue/drain.d.ts.map +1 -0
  109. package/dist/queue/drain.js +170 -0
  110. package/dist/queue/drain.js.map +1 -0
  111. package/dist/queue/flush.d.ts +64 -0
  112. package/dist/queue/flush.d.ts.map +1 -0
  113. package/dist/queue/flush.js +119 -0
  114. package/dist/queue/flush.js.map +1 -0
  115. package/dist/queue/handlers/send-event.d.ts +23 -0
  116. package/dist/queue/handlers/send-event.d.ts.map +1 -0
  117. package/dist/queue/handlers/send-event.js +131 -0
  118. package/dist/queue/handlers/send-event.js.map +1 -0
  119. package/dist/queue/index.d.ts +30 -0
  120. package/dist/queue/index.d.ts.map +1 -0
  121. package/dist/queue/index.js +71 -0
  122. package/dist/queue/index.js.map +1 -0
  123. package/dist/queue/paths.d.ts +40 -0
  124. package/dist/queue/paths.d.ts.map +1 -0
  125. package/dist/queue/paths.js +107 -0
  126. package/dist/queue/paths.js.map +1 -0
  127. package/dist/queue/process-file.d.ts +22 -0
  128. package/dist/queue/process-file.d.ts.map +1 -0
  129. package/dist/queue/process-file.js +257 -0
  130. package/dist/queue/process-file.js.map +1 -0
  131. package/dist/queue/register-handlers.d.ts +26 -0
  132. package/dist/queue/register-handlers.d.ts.map +1 -0
  133. package/dist/queue/register-handlers.js +36 -0
  134. package/dist/queue/register-handlers.js.map +1 -0
  135. package/dist/queue/registry.d.ts +42 -0
  136. package/dist/queue/registry.d.ts.map +1 -0
  137. package/dist/queue/registry.js +36 -0
  138. package/dist/queue/registry.js.map +1 -0
  139. package/dist/queue/snapshot.d.ts +16 -0
  140. package/dist/queue/snapshot.d.ts.map +1 -0
  141. package/dist/queue/snapshot.js +39 -0
  142. package/dist/queue/snapshot.js.map +1 -0
  143. package/dist/queue/spawn.d.ts +15 -0
  144. package/dist/queue/spawn.d.ts.map +1 -0
  145. package/dist/queue/spawn.js +45 -0
  146. package/dist/queue/spawn.js.map +1 -0
  147. package/dist/queue/submit.d.ts +19 -0
  148. package/dist/queue/submit.d.ts.map +1 -0
  149. package/dist/queue/submit.js +94 -0
  150. package/dist/queue/submit.js.map +1 -0
  151. package/dist/queue/types.d.ts +77 -0
  152. package/dist/queue/types.d.ts.map +1 -0
  153. package/dist/queue/types.js +83 -0
  154. package/dist/queue/types.js.map +1 -0
  155. package/dist/queue/worker-log.d.ts +21 -0
  156. package/dist/queue/worker-log.d.ts.map +1 -0
  157. package/dist/queue/worker-log.js +140 -0
  158. package/dist/queue/worker-log.js.map +1 -0
  159. 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":";AAAA;;;;;;;;GAQG;;;AAEH,yCAAoC;AACpC,2BAUY;AACZ,+BAA4B;AAC5B,0CAAkD;AAClD,oCAakB;AAElB,SAAS,cAAc,CAAC,UAAkB;IACtC,MAAM,IAAI,GAAW,IAAA,oBAAY,EAAC,UAAU,CAAC,CAAC;IAC9C,IAAI,CAAC,IAAA,eAAU,EAAC,IAAI,CAAC,EAAE,CAAC;QACpB,OAAO,EAAE,CAAC;IACd,CAAC;IACD,IAAI,CAAC;QACD,OAAO,IAAA,gBAAW,EAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAY,EAAW,EAAE;YACtD,IAAI,CAAC;gBACD,OAAO,IAAA,aAAQ,EAAC,IAAA,WAAI,EAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YACpD,CAAC;YAAC,MAAM,CAAC;gBACL,OAAO,KAAK,CAAC;YACjB,CAAC;QACL,CAAC,CAAC,CAAC;IACP,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,EAAE,CAAC;IACd,CAAC;AACL,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC5B,IAAI,CAAC;QACD,MAAM,OAAO,GAAW,IAAA,iBAAY,EAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACpD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,CAAC;QACb,CAAC;QACD,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAS,EAAW,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;IACnF,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,CAAC,CAAC;IACb,CAAC;AACL,CAAC;AAED,SAAS,gBAAgB,CAAC,UAAkB,EAAE,SAAiB;IAC3D,MAAM,GAAG,GAAW,IAAA,gBAAQ,EAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IACpD,IAAI,CAAC,IAAA,eAAU,EAAC,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO,EAAE,CAAC;IACd,CAAC;IACD,IAAI,CAAC;QACD,OAAO,IAAA,gBAAW,EAAC,GAAG,CAAC;aAClB,MAAM,CAAC,CAAC,IAAY,EAAW,EAAE,CAAC,+BAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aACrE,GAAG,CAAC,CAAC,IAAY,EAAU,EAAE,CAAC,IAAA,WAAI,EAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;IACxD,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,EAAE,CAAC;IACd,CAAC;AACL,CAAC;AAYD,SAAS,aAAa,CAAC,UAAkB,EAAE,SAAiB;IACxD,MAAM,IAAI,GAAW,IAAA,qBAAa,EAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAW,IAAA,sBAAc,EAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IAC3D,MAAM,SAAS,GAAa,gBAAgB,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IACpE,IAAI,SAAS,GAAW,CAAC,CAAC;IAC1B,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QACxB,IAAI,CAAC;YACD,SAAS,IAAI,IAAA,aAAQ,EAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAClC,CAAC;QAAC,MAAM,CAAC;YACL,OAAO;QACX,CAAC;IACL,CAAC;IACD,OAAO;QACH,SAAS;QACT,SAAS,EAAE,UAAU,CAAC,IAAI,CAAC;QAC3B,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC;QACzB,aAAa,EAAE,SAAS,CAAC,MAAM;QAC/B,aAAa,EAAE,SAAS;QACxB,eAAe,EAAE,UAAU,CAAC,IAAI,CAAC;QACjC,eAAe,EAAE,QAAQ,CAAC,IAAI,CAAC;KAClC,CAAC;AACN,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC1B,IAAI,CAAC;QACD,OAAO,IAAA,aAAQ,EAAC,IAAI,CAAC,CAAC,IAAI,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,CAAC,CAAC;IACb,CAAC;AACL,CAAC;AAED,4EAA4E;AAC5E,SAAS,aAAa,CAAC,CAAS;IAC5B,MAAM,CAAC,GAA4B,CAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;IAClE,IAAI,CAAC,CAAC,EAAE,CAAC;QACL,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,gCAAgC,CAAC,CAAC;IAC5E,CAAC;IACD,MAAM,CAAC,GAAW,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACrC,MAAM,KAAK,GAA2B,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAM,EAAE,CAAC,EAAE,OAAS,EAAE,CAAC,EAAE,QAAU,EAAE,CAAC;IAC1F,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3B,CAAC;AAEY,QAAA,YAAY,GAAY,IAAI,mBAAO,CAAC,OAAO,CAAC;KACpD,WAAW,CAAC,8CAA8C,CAAC,CAAC;AAEjE,6EAA6E;AAC7E,uBAAuB;AACvB,6EAA6E;AAE7E,oBAAY;KACP,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,+DAA+D,CAAC;KAC5E,MAAM,CAAC,gBAAgB,EAAE,sBAAsB,CAAC;KAChD,MAAM,CAAC,qBAAqB,EAAE,uCAAuC,CAAC;KACtE,MAAM,CAAC,CAAC,OAAkD,EAAQ,EAAE;IACjE,MAAM,UAAU,GAAW,IAAA,yBAAiB,EAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACjE,MAAM,UAAU,GAAa,OAAO,CAAC,OAAO;QACxC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;QACnB,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;IAEjC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC;QAC7C,OAAO;IACX,CAAC;IAED,IAAI,SAAS,GAAW,CAAC,CAAC;IAC1B,IAAI,SAAS,GAAW,CAAC,CAAC;IAC1B,IAAI,SAAS,GAAW,CAAC,CAAC;IAC1B,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAkB,aAAa,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QACxD,SAAS,IAAI,CAAC,CAAC,SAAS,CAAC;QACzB,SAAS,IAAI,CAAC,CAAC,aAAa,CAAC;QAC7B,SAAS,IAAI,CAAC,CAAC,eAAe,CAAC;QAC/B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;QACzC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,SAAS,WAAW,CAAC,CAAC,SAAS,OAAO,CAAC,CAAC;QACnF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,aAAa,WAAW,CAAC,CAAC,aAAa,OAAO,CAAC,CAAC;QAC3F,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,eAAe,WAAW,CAAC,CAAC,eAAe,OAAO,CAAC,CAAC;QAE/F,IAAI,CAAC,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC;YACxB,MAAM,OAAO,GAAsB,IAAA,6BAAqB,EAAC,UAAU,EAAE,GAAG,CAAC,CAAC;YAC1E,MAAM,MAAM,GAAsB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACpD,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;gBACrB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC;YACnE,CAAC;QACL,CAAC;IACL,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kBAAkB,SAAS,cAAc,SAAS,SAAS,SAAS,IAAI,CAAC,CAAC;AACnG,CAAC,CAAC,CAAC;AAEP,6EAA6E;AAC7E,sBAAsB;AACtB,6EAA6E;AAE7E,oBAAY;KACP,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,2EAA2E,CAAC;KACxF,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC;KAC7C,MAAM,CAAC,qBAAqB,EAAE,uCAAuC,CAAC;KACtE,MAAM,CAAC,KAAK,EAAE,OAAkD,EAAiB,EAAE;IAChF,MAAM,UAAU,GAAW,IAAA,yBAAiB,EAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACjE,MAAM,UAAU,GAAa,OAAO,CAAC,OAAO;QACxC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;QACnB,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;IAEjC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QAC5C,OAAO;IACX,CAAC;IAED,IAAI,SAAS,GAAW,CAAC,CAAC;IAC1B,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAsC,MAAM,IAAA,aAAK,EAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QAC5E,OAAO,CAAC,MAAM,CAAC,KAAK,CAChB,WAAW,GAAG,cAAc,GAAG,CAAC,kBAAkB,cAAc,GAAG,CAAC,kBAAkB,YAAY,GAAG,CAAC,eAAe,IAAI,CAC5H,CAAC;QACF,SAAS,IAAI,GAAG,CAAC,kBAAkB,CAAC;IACxC,CAAC;IACD,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,SAAS,iDAAiD,CAAC,CAAC;QACtF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC,CAAC,CAAC;AACP,+EAA+E;AAC/E,0EAA0E;AAC1E,kDAAkD;AAElD,6EAA6E;AAC7E,sBAAsB;AACtB,6EAA6E;AAE7E,oBAAY;KACP,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,oCAAoC,CAAC;KACjD,MAAM,CAAC,aAAa,EAAE,8DAA8D,CAAC;KACrF,MAAM,CAAC,mBAAmB,EAAE,+EAA+E,CAAC;KAC5G,MAAM,CAAC,qBAAqB,EAAE,uCAAuC,CAAC;KACtE,MAAM,CAAC,CAAC,OAAwE,EAAQ,EAAE;IACvF,MAAM,UAAU,GAAW,IAAA,yBAAiB,EAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAEjE,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC1C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAClF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACpB,IAAI,OAAO,GAAW,CAAC,CAAC;QACxB,KAAK,MAAM,GAAG,IAAI,cAAc,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3C,KAAK,MAAM,IAAI,IAAI,gBAAgB,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE,CAAC;gBACnD,IAAI,CAAC;oBACD,IAAA,eAAU,EAAC,IAAI,CAAC,CAAC;oBACjB,OAAO,EAAE,CAAC;gBACd,CAAC;gBAAC,MAAM,CAAC;oBACL,cAAc;gBAClB,CAAC;YACL,CAAC;QACL,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,OAAO,sBAAsB,CAAC,CAAC;IACnE,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACnB,MAAM,CAAC,GAA4B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAC/E,IAAI,CAAC,CAAC,EAAE,CAAC;YACL,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,wFAAwF,CAAC,CAAC;YAC/G,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;QACD,IAAI,MAAc,CAAC;QACnB,IAAI,CAAC;YACD,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC;QAAC,OAAO,CAAU,EAAE,CAAC;YAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC/E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAChB,OAAO;QACX,CAAC;QAED,IAAI,OAAO,GAAW,CAAC,CAAC;QACxB,KAAK,MAAM,GAAG,IAAI,cAAc,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3C,MAAM,IAAI,GAAW,IAAA,gBAAQ,EAAC,UAAU,EAAE,GAAG,CAAC,CAAC;YAC/C,IAAI,CAAC,IAAA,eAAU,EAAC,IAAI,CAAC,EAAE,CAAC;gBACpB,SAAS;YACb,CAAC;YACD,IAAI,EAA+B,CAAC;YACpC,IAAI,CAAC;gBACD,EAAE,GAAG,IAAA,aAAQ,EAAC,IAAI,CAAC,CAAC;YACxB,CAAC;YAAC,MAAM,CAAC;gBACL,SAAS;YACb,CAAC;YACD,IAAI,EAAE,CAAC,OAAO,GAAG,MAAM,EAAE,CAAC;gBACtB,SAAS;YACb,CAAC;YAED,0EAA0E;YAC1E,IAAI,OAAO,GAAY,KAAK,CAAC;YAC7B,IAAI,CAAC;gBACD,MAAM,KAAK,GAAa,IAAA,gBAAW,EAAC,IAAI,CAAC,CAAC;gBAC1C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACvB,IAAI,IAAI,KAAK,YAAY,IAAI,QAAQ,CAAC,IAAA,WAAI,EAAC,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;wBAC1D,OAAO,GAAG,IAAI,CAAC;oBACnB,CAAC;oBACD,IAAI,+BAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;wBACrC,OAAO,GAAG,IAAI,CAAC;oBACnB,CAAC;oBACD,IAAI,CAAC,IAAI,KAAK,mBAAmB,IAAI,iCAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;2BACnE,QAAQ,CAAC,IAAA,WAAI,EAAC,IAAI,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;wBACpC,OAAO,GAAG,IAAI,CAAC;oBACnB,CAAC;oBACD,IAAI,OAAO,EAAE,CAAC;wBACV,MAAM;oBACV,CAAC;gBACL,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACL,SAAS;YACb,CAAC;YACD,IAAI,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,GAAG,6CAA6C,CAAC,CAAC;gBACvF,SAAS;YACb,CAAC;YAED,IAAI,CAAC;gBACD,IAAA,WAAM,EAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC/C,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,GAAG,IAAI,CAAC,CAAC;YAChE,CAAC;YAAC,MAAM,CAAC;gBACL,cAAc;YAClB,CAAC;QACL,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,OAAO,sBAAsB,CAAC,CAAC;IACnE,CAAC;AACL,CAAC,CAAC,CAAC;AAEP,6EAA6E;AAC7E,qDAAqD;AACrD,6EAA6E;AAE7E,MAAM,iBAAiB,GAAY,IAAI,mBAAO,CAAC,aAAa,CAAC;KACxD,WAAW,CAAC,wCAAwC,CAAC,CAAC;AAE3D,iBAAiB;KACZ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,0BAA0B,CAAC;KACvC,MAAM,CAAC,gBAAgB,EAAE,sBAAsB,CAAC;KAChD,MAAM,CAAC,aAAa,EAAE,oBAAoB,EAAE,CAAC,CAAS,EAAU,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;KACvF,MAAM,CAAC,qBAAqB,EAAE,uCAAuC,CAAC;KACtE,MAAM,CAAC,CAAC,OAAkE,EAAQ,EAAE;IACjF,MAAM,UAAU,GAAW,IAAA,yBAAiB,EAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACjE,MAAM,UAAU,GAAa,OAAO,CAAC,OAAO;QACxC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;QACnB,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;IAGjC,MAAM,GAAG,GAAW,EAAE,CAAC;IACvB,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC3B,KAAK,MAAM,CAAC,IAAI,IAAA,6BAAqB,EAAC,UAAU,EAAE,GAAG,CAAC,EAAE,CAAC;YACrD,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAC3C,CAAC;IACL,CAAC;IAED,GAAG,CAAC,IAAI,CAAC,CAAC,CAAO,EAAE,CAAO,EAAU,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;IAC/F,MAAM,KAAK,GAAW,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;IAC1C,MAAM,IAAI,GAAW,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;IACvC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACnB,MAAM,MAAM,GAAW,UAAU,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC;QACrF,OAAO,CAAC,MAAM,CAAC,KAAK,CAChB,IAAI,CAAC,CAAC,KAAK,CAAC,WAAW,aAAa,CAAC,CAAC,SAAS,OAAO,CAAC,CAAC,KAAK,CAAC,EAAE,aAAa,MAAM,aAAa,CAAC,CAAC,KAAK,CAAC,QAAQ,IAAI,CACvH,CAAC;IACN,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,GAAG,CAAC,MAAM,kBAAkB,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC;AAC5F,CAAC,CAAC,CAAC;AAEP,iBAAiB;KACZ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,qCAAqC,CAAC;KAClD,MAAM,CAAC,gBAAgB,EAAE,sBAAsB,CAAC;KAChD,MAAM,CAAC,qBAAqB,EAAE,uCAAuC,CAAC;KACtE,MAAM,CAAC,CAAC,OAAkD,EAAQ,EAAE;IACjE,MAAM,UAAU,GAAW,IAAA,yBAAiB,EAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACjE,MAAM,UAAU,GAAa,OAAO,CAAC,OAAO;QACxC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;QACnB,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;IAEjC,MAAM,SAAS,GAAwB,IAAI,GAAG,EAAkB,CAAC;IACjE,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC3B,KAAK,MAAM,CAAC,IAAI,IAAA,6BAAqB,EAAC,UAAU,EAAE,GAAG,CAAC,EAAE,CAAC;YACrD,MAAM,IAAI,GAAuB,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YAC3D,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/C,CAAC;IACL,CAAC;IACD,MAAM,IAAI,GAAuB,CAAC,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAC1D,CAAC,CAAmB,EAAE,CAAmB,EAAU,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CACpE,CAAC;IACF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAClD,OAAO;IACX,CAAC;IACD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;QAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IACxE,CAAC;AACL,CAAC,CAAC,CAAC;AAEP,iBAAiB;KACZ,OAAO,CAAC,gBAAgB,CAAC;KACzB,WAAW,CAAC,gFAAgF,CAAC;KAC7F,MAAM,CAAC,gBAAgB,EAAE,sEAAsE,CAAC;KAChG,MAAM,CAAC,qBAAqB,EAAE,uCAAuC,CAAC;KACtE,MAAM,CAAC,CAAC,KAAa,EAAE,OAAkD,EAAQ,EAAE;IAChF,MAAM,UAAU,GAAW,IAAA,yBAAiB,EAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAEjE,qEAAqE;IACrE,mEAAmE;IACnE,8CAA8C;IAC9C,IAAI,CAAC,IAAA,0BAAiB,EAAC,UAAU,CAAC,EAAE,CAAC;QACjC,OAAO,CAAC,MAAM,CAAC,KAAK,CAChB,kHAAkH,CACrH,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO;IACX,CAAC;IAED,MAAM,UAAU,GAAa,cAAc,CAAC,UAAU,CAAC,CAAC;IAExD,gCAAgC;IAChC,IAAI,aAAa,GAAkB,IAAI,CAAC;IACxC,IAAI,UAAU,GAA4B,IAAI,CAAC;IAC/C,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC3B,KAAK,MAAM,CAAC,IAAI,IAAA,6BAAqB,EAAC,UAAU,EAAE,GAAG,CAAC,EAAE,CAAC;YACrD,IAAI,UAAU,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC;gBAC7C,aAAa,GAAG,GAAG,CAAC;gBACpB,UAAU,GAAG,CAAC,CAAC;gBACf,MAAM;YACV,CAAC;QACL,CAAC;QACD,IAAI,UAAU,EAAE,CAAC;YACb,MAAM;QACV,CAAC;IACL,CAAC;IACD,IAAI,CAAC,UAAU,IAAI,CAAC,aAAa,EAAE,CAAC;QAChC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uDAAuD,KAAK,MAAM,CAAC,CAAC;QACzF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO;IACX,CAAC;IAED,MAAM,aAAa,GAAW,OAAO,CAAC,OAAO,IAAI,aAAa,CAAC;IAC/D,MAAM,gBAAgB,GAAW,IAAA,gBAAQ,EAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IACrE,oEAAoE;IACpE,wCAAwC;IACxC,MAAM,YAAY,GAAW,IAAA,WAAI,EAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;IACrF,IAAI,CAAC,IAAA,eAAU,EAAC,YAAY,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,aAAa,qBAAqB,CAAC,CAAC;QACnF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO;IACX,CAAC;IACD,IAAA,cAAS,EAAC,gBAAgB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAE9D,oDAAoD;IACpD,MAAM,MAAM,GAAW,IAAA,sBAAc,EAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IACjE,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACD,OAAO,GAAG,IAAA,iBAAY,EAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACxG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO;IACX,CAAC;IAED,MAAM,KAAK,GAAa,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,OAAO,GAAY,KAAK,CAAC;IAC7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpB,SAAS;QACb,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,CAAC;YACX,IAAI,CAAC;gBACD,MAAM,MAAM,GAAoB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAoB,CAAC;gBACpE,IAAI,UAAU,IAAI,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,KAAK,KAAK,EAAE,CAAC;oBACvD,OAAO,GAAG,IAAI,CAAC;oBACf,SAAS;gBACb,CAAC;YACL,CAAC;YAAC,MAAM,CAAC;gBACL,6CAA6C;YACjD,CAAC;QACL,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,GAAG,GAAW,GAAG,MAAM,QAAQ,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IACjE,IAAI,CAAC;QACD,IAAA,kBAAa,EAAC,GAAG,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACnF,IAAA,eAAU,EAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QAClB,IAAI,CAAC;YACD,IAAA,eAAU,EAAC,GAAG,CAAC,CAAC;QACpB,CAAC;QAAC,MAAM,CAAC;YACL,SAAS;QACb,CAAC;QACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qCAAqC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC1G,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO;IACX,CAAC;IAED,iEAAiE;IACjE,IAAI,CAAC;QACD,MAAM,WAAW,GAAW,IAAA,cAAM,EAC9B,UAAU,EACV,aAAa,EACb,UAAU,CAAC,QAAQ,CAAC,IAAI,EACxB,UAAU,CAAC,QAAQ,CAAC,IAAI,EACxB,EAAE,EAAE,EAAE,UAAU,CAAC,QAAQ,CAAC,EAAE,EAAE,CACjC,CAAC;QACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAChB,oBAAoB,WAAW,SAAS,UAAU,CAAC,QAAQ,CAAC,IAAI,YAAY,aAAa,IAAI,CAChG,CAAC;IACN,CAAC;IAAC,OAAO,CAAU,EAAE,CAAC;QAClB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC7F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC,CAAC,CAAC;AAEP,iBAAiB;KACZ,OAAO,CAAC,OAAO,CAAC;KAChB,WAAW,CAAC,6EAA6E,CAAC;KAC1F,MAAM,CAAC,gBAAgB,EAAE,sBAAsB,CAAC;KAChD,MAAM,CAAC,OAAO,EAAE,uDAAuD,CAAC;KACxE,MAAM,CAAC,qBAAqB,EAAE,uCAAuC,CAAC;KACtE,MAAM,CAAC,CAAC,OAAiE,EAAQ,EAAE;IAChF,MAAM,UAAU,GAAW,IAAA,yBAAiB,EAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACjE,MAAM,UAAU,GAAa,OAAO,CAAC,OAAO;QACxC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC;QACnB,CAAC,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;IAEjC,IAAI,OAAO,GAAW,CAAC,CAAC;IACxB,IAAI,cAAc,GAAW,CAAC,CAAC;IAC/B,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAW,IAAA,sBAAc,EAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QACrD,IAAI,IAAA,eAAU,EAAC,IAAI,CAAC,EAAE,CAAC;YACnB,IAAI,CAAC;gBACD,yDAAyD;gBACzD,2DAA2D;gBAC3D,IAAA,kBAAa,EAAC,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;gBACzC,OAAO,EAAE,CAAC;YACd,CAAC;YAAC,MAAM,CAAC;gBACL,cAAc;YAClB,CAAC;QACL,CAAC;QAED,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;YACd,MAAM,IAAI,GAAW,IAAA,gBAAQ,EAAC,UAAU,EAAE,GAAG,CAAC,CAAC;YAC/C,IAAI,KAAe,CAAC;YACpB,IAAI,CAAC;gBACD,KAAK,GAAG,IAAA,gBAAW,EAAC,IAAI,CAAC,CAAC;YAC9B,CAAC;YAAC,MAAM,CAAC;gBACL,SAAS;YACb,CAAC;YACD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACvB,IAAI,CAAC,iCAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBACxC,SAAS;gBACb,CAAC;gBACD,IAAI,CAAC;oBACD,IAAA,eAAU,EAAC,IAAA,WAAI,EAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;oBAC7B,cAAc,EAAE,CAAC;gBACrB,CAAC;gBAAC,MAAM,CAAC;oBACL,cAAc;gBAClB,CAAC;YACL,CAAC;QACL,CAAC;IACL,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,OAAO,wBAAwB,cAAc,wBAAwB,CAAC,CAAC;IAC3H,CAAC;SAAM,CAAC;QACJ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,OAAO,2DAA2D,CAAC,CAAC;IACxH,CAAC;AACL,CAAC,CAAC,CAAC;AAEP,oBAAY,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC"}