instar 1.3.724 → 1.3.726

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 (40) hide show
  1. package/dist/commands/server.d.ts.map +1 -1
  2. package/dist/commands/server.js +4 -1
  3. package/dist/commands/server.js.map +1 -1
  4. package/dist/config/ConfigDefaults.d.ts.map +1 -1
  5. package/dist/config/ConfigDefaults.js +1 -0
  6. package/dist/config/ConfigDefaults.js.map +1 -1
  7. package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
  8. package/dist/core/PostUpdateMigrator.js +19 -0
  9. package/dist/core/PostUpdateMigrator.js.map +1 -1
  10. package/dist/core/types.d.ts +4 -0
  11. package/dist/core/types.d.ts.map +1 -1
  12. package/dist/core/types.js.map +1 -1
  13. package/dist/messaging/slack/SlackAdapter.d.ts +16 -0
  14. package/dist/messaging/slack/SlackAdapter.d.ts.map +1 -1
  15. package/dist/messaging/slack/SlackAdapter.js +29 -5
  16. package/dist/messaging/slack/SlackAdapter.js.map +1 -1
  17. package/dist/messaging/slack/SlackMrkdwnFormatter.d.ts +78 -0
  18. package/dist/messaging/slack/SlackMrkdwnFormatter.d.ts.map +1 -0
  19. package/dist/messaging/slack/SlackMrkdwnFormatter.js +485 -0
  20. package/dist/messaging/slack/SlackMrkdwnFormatter.js.map +1 -0
  21. package/dist/messaging/slack/index.d.ts +2 -0
  22. package/dist/messaging/slack/index.d.ts.map +1 -1
  23. package/dist/messaging/slack/index.js +1 -0
  24. package/dist/messaging/slack/index.js.map +1 -1
  25. package/dist/messaging/slack/types.d.ts +11 -0
  26. package/dist/messaging/slack/types.d.ts.map +1 -1
  27. package/dist/messaging/slack/types.js.map +1 -1
  28. package/dist/monitoring/AgentWorktreeReaper.d.ts +12 -0
  29. package/dist/monitoring/AgentWorktreeReaper.d.ts.map +1 -1
  30. package/dist/monitoring/AgentWorktreeReaper.js +19 -0
  31. package/dist/monitoring/AgentWorktreeReaper.js.map +1 -1
  32. package/dist/server/routes.d.ts.map +1 -1
  33. package/dist/server/routes.js +8 -1
  34. package/dist/server/routes.js.map +1 -1
  35. package/package.json +1 -1
  36. package/src/data/builtin-manifest.json +63 -63
  37. package/upgrades/{1.3.724.md → 1.3.725.md} +53 -0
  38. package/upgrades/1.3.726.md +61 -0
  39. package/upgrades/side-effects/reaper-initial-pass.md +103 -0
  40. package/upgrades/side-effects/slack-mrkdwn-formatter.md +143 -0
@@ -0,0 +1,485 @@
1
+ /**
2
+ * SlackMrkdwnFormatter — server-side formatter that converts agent-authored
3
+ * GitHub-flavored markdown into Slack mrkdwn on outbound sends (roadmap 0.1).
4
+ *
5
+ * Mirrors the TelegramMarkdownFormatter pattern (src/messaging/
6
+ * TelegramMarkdownFormatter.ts): default ON ('mrkdwn'), config rollback to
7
+ * 'legacy-passthrough' (byte-for-byte), per-call `_formatMode` opt-out for
8
+ * callers that already produce mrkdwn.
9
+ *
10
+ * Wired at the single SlackAdapter outbound chokepoint (formattedApiCall) so
11
+ * every chat.postMessage / chat.update / chat.postEphemeral send funnels
12
+ * through it. See applySlackFormatter() below.
13
+ *
14
+ * Conversion contract (GFM → mrkdwn):
15
+ * **bold** → *bold*
16
+ * __bold__ → *bold*
17
+ * *italic* → _italic_ (tight word-boundary rule; `3*5` untouched)
18
+ * _italic_ → _italic_ (already mrkdwn — passes through)
19
+ * ***both*** → *_both_*
20
+ * ~~strike~~ → ~strike~
21
+ * `code` → `code` (content &<> escaped, otherwise verbatim)
22
+ * ```fenced``` → ```fenced``` (language tag dropped; content escaped)
23
+ * [text](url) → <url|text> (scheme allowlist; unsafe → literal)
24
+ * # Heading → *Heading* (Slack has no headings)
25
+ * - bullet → • bullet
26
+ * 1. numbered → 1. numbered (passes through — reads natively)
27
+ * > quote → > quote (preserved; Slack renders quotes)
28
+ * | tables | → fenced code block (Slack has no tables)
29
+ * --- / *** / ___ → ─ rule line
30
+ * emoji + :shortcodes: untouched
31
+ *
32
+ * Escaping: Slack's API contract requires `&`, `<`, `>` HTML-entity-escaped in
33
+ * the text payload; Slack decodes exactly these three entities everywhere
34
+ * (including code blocks), so we escape ONCE per segment — prose and code
35
+ * segment contents alike — and never re-process extracted segments (sentinel
36
+ * placeholders make double-escaping structurally impossible).
37
+ */
38
+ import { escapeMrkdwn } from './sanitize.js';
39
+ /** 32KB hard cap. Above this, markdown conversion is skipped (ReDoS defense). */
40
+ export const MAX_INPUT_LENGTH = 32_768;
41
+ /** Max chars scanned forward in the balanced-paren URL walker. */
42
+ const URL_SCAN_MAX = 2048;
43
+ // ─── Placeholder sentinels ──────────────────────────────────────────────────
44
+ // Same scheme as TelegramMarkdownFormatter: Supplementary-PUA-B
45
+ // (U+100000..U+10FFFD) — near-zero real-world usage. We strip this range from
46
+ // input BEFORE inserting any sentinel, so collision is structurally impossible.
47
+ const PUA_B_START = 0x100000;
48
+ const BLOCK_SIZE = 0x4000; // 16384 entries per kind — plenty
49
+ const SENTINEL_CLOSE = String.fromCodePoint(0x10fffd);
50
+ const KIND_PRE = 0; // fenced code blocks (rendered ```…```)
51
+ const KIND_TABLE = 1; // tables (rendered as fenced code blocks)
52
+ const KIND_CODE = 2; // inline code spans
53
+ const KIND_RAW = 3; // already-final mrkdwn (bold/heading output) — spliced verbatim
54
+ function makeSentinel(kind, n) {
55
+ if (n < 0 || n >= BLOCK_SIZE) {
56
+ throw new Error(`sentinel index out of range: ${n}`);
57
+ }
58
+ const code = PUA_B_START + kind * BLOCK_SIZE + n;
59
+ return SENTINEL_CLOSE + String.fromCodePoint(code) + SENTINEL_CLOSE;
60
+ }
61
+ function decodeSentinelCodepoint(cp) {
62
+ const offset = cp - PUA_B_START;
63
+ if (offset < 0)
64
+ return null;
65
+ const kind = Math.floor(offset / BLOCK_SIZE);
66
+ const n = offset % BLOCK_SIZE;
67
+ if (kind > 3)
68
+ return null;
69
+ return { kind, n };
70
+ }
71
+ /** Strip the entire Supplementary-PUA-B range from user input. */
72
+ function stripPuaB(s) {
73
+ return s.replace(/[\u{100000}-\u{10FFFD}]/gu, '');
74
+ }
75
+ /** Strip NUL bytes. Always step 0. */
76
+ function stripNul(s) {
77
+ return s.replace(/\x00/g, '');
78
+ }
79
+ // ─── URL safety ─────────────────────────────────────────────────────────────
80
+ const SAFE_SCHEMES = new Set(['http', 'https', 'mailto']);
81
+ /**
82
+ * Check a URL against the scheme allowlist using WHATWG URL parsing.
83
+ * Returns the trimmed URL string on success, or null on reject.
84
+ * javascript:, data:, file: etc. are refused — the link stays literal text.
85
+ */
86
+ function isSafeUrl(raw) {
87
+ const trimmed = raw.replace(/^[\s\x00-\x1f]+/, '');
88
+ if (!trimmed)
89
+ return null;
90
+ let parsed;
91
+ try {
92
+ parsed = new URL(trimmed);
93
+ }
94
+ catch {
95
+ return null;
96
+ }
97
+ const scheme = parsed.protocol.toLowerCase().replace(':', '');
98
+ if (!SAFE_SCHEMES.has(scheme))
99
+ return null;
100
+ return trimmed;
101
+ }
102
+ /**
103
+ * Extract fenced code blocks. Replaces each with a PUA sentinel. Content is
104
+ * &<>-escaped (Slack decodes these entities inside code blocks) and re-fenced
105
+ * without the language tag (mrkdwn has no syntax highlighting).
106
+ */
107
+ function extractFencedCode(text, pre) {
108
+ const out = [];
109
+ let i = 0;
110
+ while (i < text.length) {
111
+ if (text.startsWith('```', i)) {
112
+ const start = i + 3;
113
+ const end = text.indexOf('```', start);
114
+ if (end === -1) {
115
+ // No closing fence — emit literal backticks, keep scanning.
116
+ out.push('```');
117
+ i += 3;
118
+ continue;
119
+ }
120
+ // Optional language tag on the opening line (skip to first \n).
121
+ let contentStart = start;
122
+ const nl = text.indexOf('\n', start);
123
+ if (nl !== -1 && nl < end) {
124
+ contentStart = nl + 1;
125
+ }
126
+ let inner = text.slice(contentStart, end);
127
+ // Trim ONE trailing newline so the closing fence hugs the content.
128
+ if (inner.endsWith('\n'))
129
+ inner = inner.slice(0, -1);
130
+ const idx = pre.length;
131
+ pre.push('```' + '\n' + escapeMrkdwn(inner) + '\n' + '```');
132
+ out.push(makeSentinel(KIND_PRE, idx));
133
+ i = end + 3;
134
+ }
135
+ else {
136
+ out.push(text[i]);
137
+ i++;
138
+ }
139
+ }
140
+ return out.join('');
141
+ }
142
+ /**
143
+ * Extract markdown table blocks (pipe rows + an alignment separator row).
144
+ * Slack has no table rendering — the whole block becomes a fenced code block
145
+ * so columns keep their monospace alignment.
146
+ */
147
+ function extractTables(text, table) {
148
+ const lines = text.split('\n');
149
+ const isRow = (s) => /^\s*\|.{1,2000}\|\s*$/.test(s);
150
+ const isSep = (s) => /^\s*\|[\s\-:|]{1,2000}\|\s*$/.test(s);
151
+ const out = [];
152
+ let i = 0;
153
+ while (i < lines.length) {
154
+ if (isRow(lines[i])) {
155
+ const block = [];
156
+ let hasSep = false;
157
+ let j = i;
158
+ while (j < lines.length && isRow(lines[j])) {
159
+ if (isSep(lines[j])) {
160
+ hasSep = true;
161
+ }
162
+ else {
163
+ block.push(lines[j]);
164
+ }
165
+ j++;
166
+ }
167
+ if (hasSep && block.length > 0) {
168
+ const escaped = block.map(escapeMrkdwn).join('\n');
169
+ const idx = table.length;
170
+ table.push('```' + '\n' + escaped + '\n' + '```');
171
+ out.push(makeSentinel(KIND_TABLE, idx));
172
+ i = j;
173
+ continue;
174
+ }
175
+ }
176
+ out.push(lines[i]);
177
+ i++;
178
+ }
179
+ return out.join('\n');
180
+ }
181
+ /** Extract inline code spans (`x`). Non-greedy, newline-bounded. */
182
+ function extractInlineCode(text, code) {
183
+ return text.replace(/`([^`\n]{1,500})`/g, (_m, inner) => {
184
+ const idx = code.length;
185
+ code.push('`' + escapeMrkdwn(inner) + '`');
186
+ return makeSentinel(KIND_CODE, idx);
187
+ });
188
+ }
189
+ // ─── Blockquotes ────────────────────────────────────────────────────────────
190
+ /**
191
+ * Restore blockquote markers that the prose escape turned into `&gt;`.
192
+ * Runs AFTER escapeMrkdwn: a leading run of `&gt;` on a line was a GFM quote
193
+ * marker — Slack needs the literal `>` there to render the quote bar.
194
+ */
195
+ function restoreBlockquotes(text) {
196
+ return text.replace(/^((?:&gt;\s?)+)/gm, (run) => run.replace(/&gt;/g, '>'));
197
+ }
198
+ // ─── Emphasis / headings / bullets / rules / links ──────────────────────────
199
+ /**
200
+ * Tight italic boundary — same rule as the Telegram formatter: requires a
201
+ * word-boundary-like context on both sides so `3*5`, `f(x) = x * y`, `a*b*c`
202
+ * are untouched. Bounded quantifier (ReDoS defense).
203
+ */
204
+ const TIGHT_ITALIC = /(^|[\s(,.;:!?])\*(?!\s)([^*\n]{1,200}?)(?<!\s)\*(?=$|[\s),.;:!?])/g;
205
+ /**
206
+ * Order is load-bearing (the mrkdwn output alphabet overlaps the GFM input
207
+ * alphabet, unlike Telegram HTML):
208
+ * 1. tight italic *x* → _x_ FIRST — it cannot match `**`/`***` runs (its
209
+ * content class excludes '*'), and running it first means it can never
210
+ * re-match the single-asterisk output of the bold conversions.
211
+ * 2. bold-italic / bold / __bold__ are then emitted as RAW sentinels so no
212
+ * later pass (or a second formatter application) can re-interpret them.
213
+ * Because RAW content is spliced verbatim, links INSIDE the emphasis
214
+ * (`**see [docs](url)**`) are converted at emission time — the main
215
+ * convertLinks pass never sees RAW content. (The Telegram formatter keeps
216
+ * emphasis output inline so its later link pass covers this case; the
217
+ * sentinel approach must do it here instead.)
218
+ * 3. strikethrough last (its alphabet '~' is disjoint).
219
+ */
220
+ function applyEmphasis(text, raw) {
221
+ const emitRaw = (mrkdwn) => {
222
+ const idx = raw.length;
223
+ raw.push(mrkdwn);
224
+ return makeSentinel(KIND_RAW, idx);
225
+ };
226
+ // 1. Tight italic (asterisk form). Underscore italic `_x_` is already valid
227
+ // mrkdwn and passes through untouched. Italic output stays INLINE, so
228
+ // links inside italic are handled by the main convertLinks pass.
229
+ text = text.replace(TIGHT_ITALIC, (_m, lead, inner) => `${lead}_${inner}_`);
230
+ // 2a. Bold-italic (triple asterisk).
231
+ text = text.replace(/\*\*\*([^*\n]{1,200}?)\*\*\*/g, (_m, inner) => emitRaw(`*_${convertLinks(inner)}_*`));
232
+ // 2b. Bold (double asterisk).
233
+ text = text.replace(/\*\*([^*\n]{1,200}?)\*\*/g, (_m, inner) => emitRaw(`*${convertLinks(inner)}*`));
234
+ // 2c. Bold (double underscore — GFM strong). Word-boundary constrained:
235
+ // GFM underscore emphasis never applies intraword (`my__var__name`).
236
+ text = text.replace(/(^|[\s(,.;:!?])__(?!\s)([^_\n]{1,200}?)(?<!\s)__(?=$|[\s),.;:!?])/gm, (_m, lead, inner) => `${lead}${emitRaw(`*${convertLinks(inner)}*`)}`);
237
+ // 3. Strikethrough.
238
+ text = text.replace(/~~([^~\n]{1,200}?)~~/g, '~$1~');
239
+ return text;
240
+ }
241
+ /**
242
+ * Headings → one bold line (Slack has no headings). Any emphasis markers the
243
+ * earlier passes left INSIDE the title (as RAW sentinels) splice back inside
244
+ * the bold wrapper — mrkdwn tolerates `*a *b* c*` poorly, so we strip nested
245
+ * bold sentinels back to their inner text via the raw store when the whole
246
+ * title is a single RAW bold; otherwise we wrap as-is (best-effort, same
247
+ * spirit as the Telegram formatter's <b> wrap).
248
+ */
249
+ function applyHeadings(text, raw) {
250
+ // Whitespace classes are [ \t] (never \s): a trailing \s* would swallow the
251
+ // newline AND the blank line after the heading under the /m flag.
252
+ return text.replace(/^(#{1,6})[ \t]+(.{1,2000}?)[ \t]*#*[ \t]*$/gm, (_m, _h, title) => {
253
+ // If the entire title is exactly one RAW sentinel (e.g. `# **Bold**`),
254
+ // unwrap it so we don't emit nested bold markers.
255
+ const soleRaw = title.match(/^\u{10FFFD}([\u{100000}-\u{10FFFC}])\u{10FFFD}$/u);
256
+ if (soleRaw) {
257
+ const dec = decodeSentinelCodepoint(soleRaw[1].codePointAt(0));
258
+ if (dec && dec.kind === KIND_RAW) {
259
+ const inner = raw[dec.n] ?? '';
260
+ // raw entries for bold are `*…*` already — reuse verbatim.
261
+ if (inner.startsWith('*') && inner.endsWith('*'))
262
+ return inner;
263
+ }
264
+ }
265
+ const idx = raw.length;
266
+ // Heading titles become RAW (spliced verbatim), so links inside a heading
267
+ // (`# See [docs](url)`) must be converted here — the main convertLinks
268
+ // pass never sees RAW content.
269
+ raw.push(`*${convertLinks(title)}*`);
270
+ return makeSentinel(KIND_RAW, idx);
271
+ });
272
+ }
273
+ /** Bullets → • (indent preserved). Numbered lists pass through as-is. */
274
+ function applyBullets(text) {
275
+ return text.replace(/^(\s{0,20})[-*+]\s+/gm, '$1• ');
276
+ }
277
+ /** Horizontal rules → a light box-drawing line (Slack has no <hr>). */
278
+ function applyHorizontalRules(text) {
279
+ return text.replace(/^\s{0,3}(?:-{3,}|\*{3,}|_{3,})\s*$/gm, '──────────');
280
+ }
281
+ /**
282
+ * `[text](url)` → `<url|text>` with a balanced-paren URL scanner (Wikipedia
283
+ * URLs with parens parse correctly). Runs on post-escape text, so the URL's
284
+ * `&` is already `&amp;` — exactly what Slack's link syntax requires. A `|`
285
+ * inside the URL is %-encoded (it would terminate the link); unsafe schemes
286
+ * leave the whole construct as literal text.
287
+ */
288
+ function convertLinks(text) {
289
+ const out = [];
290
+ let i = 0;
291
+ while (i < text.length) {
292
+ const ch = text[i];
293
+ if (ch !== '[') {
294
+ out.push(ch);
295
+ i++;
296
+ continue;
297
+ }
298
+ // Find matching ] on the same line, bounded length.
299
+ let j = i + 1;
300
+ let foundClose = -1;
301
+ const maxTextEnd = Math.min(text.length, i + 1 + 500);
302
+ while (j < maxTextEnd) {
303
+ const c = text[j];
304
+ if (c === '\n')
305
+ break;
306
+ if (c === ']') {
307
+ foundClose = j;
308
+ break;
309
+ }
310
+ j++;
311
+ }
312
+ if (foundClose === -1 || text[foundClose + 1] !== '(') {
313
+ out.push(ch);
314
+ i++;
315
+ continue;
316
+ }
317
+ const visibleText = text.slice(i + 1, foundClose);
318
+ // Walk the URL with paren balance.
319
+ let k = foundClose + 2;
320
+ let depth = 1;
321
+ const urlStart = k;
322
+ const scanEnd = Math.min(text.length, urlStart + URL_SCAN_MAX);
323
+ let urlEnd = -1;
324
+ while (k < scanEnd) {
325
+ const c = text[k];
326
+ if (c === '\n')
327
+ break;
328
+ if (c === '\\' && k + 1 < scanEnd) {
329
+ k += 2;
330
+ continue;
331
+ }
332
+ if (c === '(')
333
+ depth++;
334
+ else if (c === ')') {
335
+ depth--;
336
+ if (depth === 0) {
337
+ urlEnd = k;
338
+ break;
339
+ }
340
+ }
341
+ k++;
342
+ }
343
+ if (urlEnd === -1) {
344
+ out.push(text.slice(i, foundClose + 2));
345
+ i = foundClose + 2;
346
+ continue;
347
+ }
348
+ const rawUrl = text.slice(urlStart, urlEnd);
349
+ const safeUrl = isSafeUrl(rawUrl);
350
+ if (safeUrl === null) {
351
+ out.push(text.slice(i, urlEnd + 1));
352
+ i = urlEnd + 1;
353
+ continue;
354
+ }
355
+ out.push(`<${safeUrl.replace(/\|/g, '%7C')}|${visibleText}>`);
356
+ i = urlEnd + 1;
357
+ }
358
+ return out.join('');
359
+ }
360
+ // ─── Splice ─────────────────────────────────────────────────────────────────
361
+ function splicePlaceholders(text, seg) {
362
+ const re = /\u{10FFFD}([\u{100000}-\u{10FFFC}])\u{10FFFD}/gu;
363
+ // RAW entries may reference other sentinels (a heading wrapping a bold);
364
+ // splice repeatedly until stable (bounded — nesting depth is tiny).
365
+ for (let pass = 0; pass < 4; pass++) {
366
+ if (!re.test(text))
367
+ break;
368
+ re.lastIndex = 0;
369
+ text = text.replace(re, (_m, ch) => {
370
+ const cp = ch.codePointAt(0);
371
+ const dec = decodeSentinelCodepoint(cp);
372
+ if (!dec)
373
+ return '';
374
+ if (dec.kind === KIND_PRE)
375
+ return seg.pre[dec.n] ?? '';
376
+ if (dec.kind === KIND_TABLE)
377
+ return seg.table[dec.n] ?? '';
378
+ if (dec.kind === KIND_CODE)
379
+ return seg.code[dec.n] ?? '';
380
+ if (dec.kind === KIND_RAW)
381
+ return seg.raw[dec.n] ?? '';
382
+ return '';
383
+ });
384
+ re.lastIndex = 0;
385
+ }
386
+ return text;
387
+ }
388
+ // ─── Main entry ─────────────────────────────────────────────────────────────
389
+ function convertMarkdownToMrkdwn(text) {
390
+ const seg = { pre: [], table: [], code: [], raw: [] };
391
+ // 1. Extract literal segments (never re-processed → no double-escaping).
392
+ text = extractFencedCode(text, seg.pre);
393
+ text = extractTables(text, seg.table);
394
+ text = extractInlineCode(text, seg.code);
395
+ // 2. Escape remaining prose ONCE (&, <, > — Slack's three specials).
396
+ text = escapeMrkdwn(text);
397
+ // 3. Restore blockquote markers the escape consumed.
398
+ text = restoreBlockquotes(text);
399
+ // 4. Emphasis (italic → bold family → strike; see order note).
400
+ text = applyEmphasis(text, seg.raw);
401
+ // 5. Headings → bold line.
402
+ text = applyHeadings(text, seg.raw);
403
+ // 6. Horizontal rules (before bullets: a `***` rule must not become `• `).
404
+ text = applyHorizontalRules(text);
405
+ // 7. Bullets → •.
406
+ text = applyBullets(text);
407
+ // 8. Links → <url|text>.
408
+ text = convertLinks(text);
409
+ // 9. Splice literal segments back.
410
+ return splicePlaceholders(text, seg);
411
+ }
412
+ /**
413
+ * Format text for a Slack send.
414
+ *
415
+ * `'mrkdwn'` (default): convert GFM → mrkdwn per the contract above.
416
+ * `'legacy-passthrough'`: byte-for-byte unchanged — the rollback mode AND the
417
+ * per-call opt-out for callers that already author mrkdwn.
418
+ */
419
+ export function formatForSlack(text, mode = 'mrkdwn') {
420
+ if (mode === 'legacy-passthrough') {
421
+ return {
422
+ text,
423
+ modeApplied: 'legacy-passthrough',
424
+ conversionSkipped: false,
425
+ legacyPassthrough: true,
426
+ };
427
+ }
428
+ // Step 0: strip NUL, then PUA-B (sentinel-collision defense).
429
+ let working = stripNul(text);
430
+ working = stripPuaB(working);
431
+ // ReDoS guard: oversized input skips conversion (raw bytes preserved —
432
+ // exactly today's pre-formatter behavior).
433
+ if (working.length > MAX_INPUT_LENGTH) {
434
+ return {
435
+ text,
436
+ modeApplied: 'mrkdwn',
437
+ conversionSkipped: true,
438
+ legacyPassthrough: false,
439
+ };
440
+ }
441
+ return {
442
+ text: convertMarkdownToMrkdwn(working),
443
+ modeApplied: 'mrkdwn',
444
+ conversionSkipped: false,
445
+ legacyPassthrough: false,
446
+ };
447
+ }
448
+ // ─── Wire-up helper (the single outbound chokepoint contract) ───────────────
449
+ /** Slack Web API methods whose `text` is a user-visible message body. */
450
+ const SEND_METHODS = new Set(['chat.postMessage', 'chat.update', 'chat.postEphemeral']);
451
+ /**
452
+ * Shared formatter wire-up used by SlackAdapter.formattedApiCall — the Slack
453
+ * sibling of applyTelegramFormatter. Pure function for testability.
454
+ *
455
+ * - Non-send methods pass through unchanged.
456
+ * - `params._formatMode` is the per-call override (stripped before the HTTP
457
+ * call): `'legacy-passthrough'` = "my bytes are already mrkdwn, don't touch".
458
+ * - Block Kit sends (`params.blocks`) pass through — blocks are authored
459
+ * deliberately; `text` is only the notification fallback.
460
+ * - `params.mrkdwn === false` passes through — the caller asked Slack for
461
+ * plain text; converting would be nonsense.
462
+ * - Mode resolution: per-call → config → `'mrkdwn'` (default ON, post-cutover;
463
+ * rollback via `formatMode: 'legacy-passthrough'` in the slack messaging
464
+ * config block).
465
+ */
466
+ export function applySlackFormatter(method, params, configMode) {
467
+ const callerMode = params._formatMode;
468
+ // Strip internal flags before sending to the Slack API.
469
+ const stripped = { ...params };
470
+ delete stripped._formatMode;
471
+ const mode = callerMode ?? configMode ?? 'mrkdwn';
472
+ if (!SEND_METHODS.has(method) ||
473
+ mode === 'legacy-passthrough' ||
474
+ typeof stripped.text !== 'string' ||
475
+ stripped.blocks !== undefined ||
476
+ stripped.mrkdwn === false) {
477
+ return { outgoingParams: stripped, didFormat: false };
478
+ }
479
+ const result = formatForSlack(stripped.text, mode);
480
+ return {
481
+ outgoingParams: { ...stripped, text: result.text },
482
+ didFormat: !result.legacyPassthrough && !result.conversionSkipped,
483
+ };
484
+ }
485
+ //# sourceMappingURL=SlackMrkdwnFormatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SlackMrkdwnFormatter.js","sourceRoot":"","sources":["../../../src/messaging/slack/SlackMrkdwnFormatter.ts"],"names":[],"mappings":"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"}
@@ -9,4 +9,6 @@ export { FileHandler } from './FileHandler.js';
9
9
  export { RingBuffer } from './RingBuffer.js';
10
10
  export type { SlackConfig, SlackMessage, SlackUser, SlackChannel } from './types.js';
11
11
  export * from './sanitize.js';
12
+ export { formatForSlack, applySlackFormatter, MAX_INPUT_LENGTH as SLACK_FORMATTER_MAX_INPUT_LENGTH, } from './SlackMrkdwnFormatter.js';
13
+ export type { SlackFormatMode, SlackFormatResult } from './SlackMrkdwnFormatter.js';
12
14
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/messaging/slack/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACrF,cAAc,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/messaging/slack/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACrF,cAAc,eAAe,CAAC;AAC9B,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,gBAAgB,IAAI,gCAAgC,GACrD,MAAM,2BAA2B,CAAC;AACnC,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC"}
@@ -8,6 +8,7 @@ export { ChannelManager } from './ChannelManager.js';
8
8
  export { FileHandler } from './FileHandler.js';
9
9
  export { RingBuffer } from './RingBuffer.js';
10
10
  export * from './sanitize.js';
11
+ export { formatForSlack, applySlackFormatter, MAX_INPUT_LENGTH as SLACK_FORMATTER_MAX_INPUT_LENGTH, } from './SlackMrkdwnFormatter.js';
11
12
  // Register with the adapter registry at module load time
12
13
  import { registerAdapter } from '../AdapterRegistry.js';
13
14
  import { SlackAdapter } from './SlackAdapter.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/messaging/slack/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,cAAc,eAAe,CAAC;AAE9B,yDAAyD;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,eAAe,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/messaging/slack/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,cAAc,eAAe,CAAC;AAC9B,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,gBAAgB,IAAI,gCAAgC,GACrD,MAAM,2BAA2B,CAAC;AAGnC,yDAAyD;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,eAAe,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC"}
@@ -45,6 +45,17 @@ export interface SlackConfig {
45
45
  * DMs always use "all" mode regardless of this setting.
46
46
  */
47
47
  respondMode?: SlackRespondMode;
48
+ /**
49
+ * Outbound GFM→mrkdwn formatter mode (roadmap 0.1). Default `'mrkdwn'` —
50
+ * agent-authored GitHub-flavored markdown is converted to native Slack
51
+ * mrkdwn at the outbound chokepoint (so `**bold**` renders bold instead of
52
+ * as literal asterisks). Flip to `'legacy-passthrough'` for byte-for-byte
53
+ * pre-formatter behavior (the rollback lever, mirroring
54
+ * `telegramFormatMode`). Callers that already author mrkdwn opt out
55
+ * per-call via `sendToChannel(..., { formatMode: 'legacy-passthrough' })`.
56
+ * See src/messaging/slack/SlackMrkdwnFormatter.ts.
57
+ */
58
+ formatMode?: 'mrkdwn' | 'legacy-passthrough';
48
59
  /** Audio file transcription provider */
49
60
  audioTranscriptionProvider?: 'groq' | 'openai';
50
61
  /** Stall detection timeout in minutes (default: 5) */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/messaging/slack/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/messaging/slack/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/messaging/slack/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAyNH,yBAAyB;AAEzB,wDAAwD;AACxD,MAAM,CAAN,IAAY,aASX;AATD,WAAY,aAAa;IACvB,+DAA+D;IAC/D,mDAAS,CAAA;IACT,oDAAoD;IACpD,oDAAU,CAAA;IACV,4DAA4D;IAC5D,oDAAU,CAAA;IACV,2CAA2C;IAC3C,qDAAW,CAAA;AACb,CAAC,EATW,aAAa,KAAb,aAAa,QASxB;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAkC;IAC5D,2BAA2B;IAC3B,sBAAsB,EAAE,aAAa,CAAC,KAAK;IAC3C,uBAAuB,EAAE,aAAa,CAAC,KAAK;IAC5C,yBAAyB,EAAE,aAAa,CAAC,KAAK;IAC9C,sBAAsB,EAAE,aAAa,CAAC,KAAK;IAC3C,wBAAwB,EAAE,aAAa,CAAC,KAAK;IAC7C,0BAA0B,EAAE,aAAa,CAAC,KAAK;IAE/C,oBAAoB;IACpB,eAAe,EAAE,aAAa,CAAC,KAAK;IACpC,kBAAkB,EAAE,aAAa,CAAC,KAAK;IACvC,UAAU,EAAE,aAAa,CAAC,KAAK;IAC/B,aAAa,EAAE,aAAa,CAAC,KAAK;IAClC,aAAa,EAAE,aAAa,CAAC,KAAK;IAElC,uCAAuC;IACvC,kBAAkB,EAAE,aAAa,CAAC,KAAK;IACvC,oBAAoB,EAAE,aAAa,CAAC,KAAK;IACzC,uBAAuB,EAAE,aAAa,CAAC,KAAK;IAC5C,oBAAoB,EAAE,aAAa,CAAC,KAAK;IACzC,oBAAoB,EAAE,aAAa,CAAC,KAAK;IACzC,uBAAuB,EAAE,aAAa,CAAC,KAAK;IAC5C,4BAA4B,EAAE,aAAa,CAAC,KAAK;IACjD,8BAA8B,EAAE,aAAa,CAAC,KAAK;IAEnD,oBAAoB;IACpB,WAAW,EAAE,aAAa,CAAC,KAAK;IAChC,YAAY,EAAE,aAAa,CAAC,KAAK;IACjC,YAAY,EAAE,aAAa,CAAC,KAAK;IACjC,uBAAuB,EAAE,aAAa,CAAC,KAAK;CAC7C,CAAC;AAEF,yEAAyE;AACzE,MAAM,UAAU,OAAO,CAAC,MAAc;IACpC,OAAO,eAAe,CAAC,MAAM,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC;AACxD,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/messaging/slack/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAoOH,yBAAyB;AAEzB,wDAAwD;AACxD,MAAM,CAAN,IAAY,aASX;AATD,WAAY,aAAa;IACvB,+DAA+D;IAC/D,mDAAS,CAAA;IACT,oDAAoD;IACpD,oDAAU,CAAA;IACV,4DAA4D;IAC5D,oDAAU,CAAA;IACV,2CAA2C;IAC3C,qDAAW,CAAA;AACb,CAAC,EATW,aAAa,KAAb,aAAa,QASxB;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAkC;IAC5D,2BAA2B;IAC3B,sBAAsB,EAAE,aAAa,CAAC,KAAK;IAC3C,uBAAuB,EAAE,aAAa,CAAC,KAAK;IAC5C,yBAAyB,EAAE,aAAa,CAAC,KAAK;IAC9C,sBAAsB,EAAE,aAAa,CAAC,KAAK;IAC3C,wBAAwB,EAAE,aAAa,CAAC,KAAK;IAC7C,0BAA0B,EAAE,aAAa,CAAC,KAAK;IAE/C,oBAAoB;IACpB,eAAe,EAAE,aAAa,CAAC,KAAK;IACpC,kBAAkB,EAAE,aAAa,CAAC,KAAK;IACvC,UAAU,EAAE,aAAa,CAAC,KAAK;IAC/B,aAAa,EAAE,aAAa,CAAC,KAAK;IAClC,aAAa,EAAE,aAAa,CAAC,KAAK;IAElC,uCAAuC;IACvC,kBAAkB,EAAE,aAAa,CAAC,KAAK;IACvC,oBAAoB,EAAE,aAAa,CAAC,KAAK;IACzC,uBAAuB,EAAE,aAAa,CAAC,KAAK;IAC5C,oBAAoB,EAAE,aAAa,CAAC,KAAK;IACzC,oBAAoB,EAAE,aAAa,CAAC,KAAK;IACzC,uBAAuB,EAAE,aAAa,CAAC,KAAK;IAC5C,4BAA4B,EAAE,aAAa,CAAC,KAAK;IACjD,8BAA8B,EAAE,aAAa,CAAC,KAAK;IAEnD,oBAAoB;IACpB,WAAW,EAAE,aAAa,CAAC,KAAK;IAChC,YAAY,EAAE,aAAa,CAAC,KAAK;IACjC,YAAY,EAAE,aAAa,CAAC,KAAK;IACjC,uBAAuB,EAAE,aAAa,CAAC,KAAK;CAC7C,CAAC;AAEF,yEAAyE;AACzE,MAAM,UAAU,OAAO,CAAC,MAAc;IACpC,OAAO,eAAe,CAAC,MAAM,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC;AACxD,CAAC"}
@@ -30,6 +30,16 @@ export interface AgentWorktreeReaperConfig {
30
30
  enabled: boolean;
31
31
  dryRun: boolean;
32
32
  reapIntervalMs: number;
33
+ /**
34
+ * Delay before the ONE-TIME initial pass after start() (default 15 min).
35
+ * Without it the reaper's first pass is a full `reapIntervalMs` (24h) after
36
+ * boot — and because agent servers restart far more often than daily, the
37
+ * interval timer resets forever and an enabled+armed reaper NEVER runs a
38
+ * single pass (the 2026-07-02 incident: 86 worktrees / 25GB accumulated with
39
+ * the feature switched on). The delay keeps the pass off the busy post-boot
40
+ * window; <= 0 disables the initial pass (interval-only — the rollback lever).
41
+ */
42
+ initialPassDelayMs: number;
33
43
  /** Bounded blast radius per pass. */
34
44
  maxReapsPerPass: number;
35
45
  /**
@@ -85,6 +95,7 @@ export declare class AgentWorktreeReaper extends EventEmitter {
85
95
  private readonly deps;
86
96
  private readonly now;
87
97
  private timer?;
98
+ private initialTimer?;
88
99
  private running;
89
100
  private lastPassAt;
90
101
  private reapedLastPass;
@@ -121,6 +132,7 @@ export declare class AgentWorktreeReaper extends EventEmitter {
121
132
  dryRun: boolean;
122
133
  lastPassAt: number;
123
134
  reapedLastPass: number;
135
+ initialPassPending: boolean;
124
136
  worktrees: WorktreeEvaluation[];
125
137
  reclaimable: number;
126
138
  };
@@ -1 +1 @@
1
- {"version":3,"file":"AgentWorktreeReaper.d.ts","sourceRoot":"","sources":["../../src/monitoring/AgentWorktreeReaper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,qCAAqC;IACrC,eAAe,EAAE,MAAM,CAAC;IACxB;;;;;OAKG;IACH,yBAAyB,EAAE,MAAM,CAAC;IAClC;;;;;;OAMG;IACH,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,eAAO,MAAM,oCAAoC,EAAE,yBAOlD,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,eAAe,CAAC;AAE/C,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,4EAA4E;IAC5E,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,8EAA8E;IAC9E,aAAa,EAAE,MAAM,YAAY,EAAE,CAAC;IACpC,sEAAsE;IACtE,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IACnC,uEAAuE;IACvE,QAAQ,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,OAAO,CAAC;IAC1C;2EACuE;IACvE,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IACnC,gFAAgF;IAChF,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CACpB;AAED,qBAAa,mBAAoB,SAAQ,YAAY;IACnD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAA4B;IAChD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA0B;IAC/C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,KAAK,CAAC,CAAiB;IAC/B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,cAAc,CAAK;IAC3B;8FAC0F;IAC1F,OAAO,CAAC,eAAe,CAA6B;IACpD,qEAAqE;IACrE,OAAO,CAAC,cAAc,CAAqB;gBAE/B,IAAI,EAAE,uBAAuB,EAAE,GAAG,CAAC,EAAE,OAAO,CAAC,yBAAyB,CAAC;IAOnF,KAAK,IAAI,IAAI;IAMb,IAAI,IAAI,IAAI;IAIZ,OAAO,KAAK,YAAY,GAEvB;IAED;;;;OAIG;IACH,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,kBAAkB;IAWhD,6EAA6E;IACvE,IAAI,IAAI,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,kBAAkB,EAAE,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,OAAO,CAAA;KAAE,CAAC;IAsD3G;kDAC8C;IAC9C,OAAO,CAAC,cAAc;IAMtB,iGAAiG;IACjG,OAAO,CAAC,oBAAoB;IAU5B,gFAAgF;IAChF,QAAQ,IAAI;QACV,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAC9E,SAAS,EAAE,kBAAkB,EAAE,CAAC;QAChC,WAAW,EAAE,MAAM,CAAC;KACrB;CAiBF"}
1
+ {"version":3,"file":"AgentWorktreeReaper.d.ts","sourceRoot":"","sources":["../../src/monitoring/AgentWorktreeReaper.ts"],"names":[],"mappings":"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"}