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.
- package/dist/commands/server.d.ts.map +1 -1
- package/dist/commands/server.js +4 -1
- package/dist/commands/server.js.map +1 -1
- package/dist/config/ConfigDefaults.d.ts.map +1 -1
- package/dist/config/ConfigDefaults.js +1 -0
- package/dist/config/ConfigDefaults.js.map +1 -1
- package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
- package/dist/core/PostUpdateMigrator.js +19 -0
- package/dist/core/PostUpdateMigrator.js.map +1 -1
- package/dist/core/types.d.ts +4 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/messaging/slack/SlackAdapter.d.ts +16 -0
- package/dist/messaging/slack/SlackAdapter.d.ts.map +1 -1
- package/dist/messaging/slack/SlackAdapter.js +29 -5
- package/dist/messaging/slack/SlackAdapter.js.map +1 -1
- package/dist/messaging/slack/SlackMrkdwnFormatter.d.ts +78 -0
- package/dist/messaging/slack/SlackMrkdwnFormatter.d.ts.map +1 -0
- package/dist/messaging/slack/SlackMrkdwnFormatter.js +485 -0
- package/dist/messaging/slack/SlackMrkdwnFormatter.js.map +1 -0
- package/dist/messaging/slack/index.d.ts +2 -0
- package/dist/messaging/slack/index.d.ts.map +1 -1
- package/dist/messaging/slack/index.js +1 -0
- package/dist/messaging/slack/index.js.map +1 -1
- package/dist/messaging/slack/types.d.ts +11 -0
- package/dist/messaging/slack/types.d.ts.map +1 -1
- package/dist/messaging/slack/types.js.map +1 -1
- package/dist/monitoring/AgentWorktreeReaper.d.ts +12 -0
- package/dist/monitoring/AgentWorktreeReaper.d.ts.map +1 -1
- package/dist/monitoring/AgentWorktreeReaper.js +19 -0
- package/dist/monitoring/AgentWorktreeReaper.js.map +1 -1
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +8 -1
- package/dist/server/routes.js.map +1 -1
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +63 -63
- package/upgrades/{1.3.724.md → 1.3.725.md} +53 -0
- package/upgrades/1.3.726.md +61 -0
- package/upgrades/side-effects/reaper-initial-pass.md +103 -0
- 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 `>`.
|
|
192
|
+
* Runs AFTER escapeMrkdwn: a leading run of `>` 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(/^((?:>\s?)+)/gm, (run) => run.replace(/>/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 `&` — 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;
|
|
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":"AAAA;;GAEG;AAIH;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG,WAAW,GAAG,QAAQ,CAAC;AAExD;;;;GAIG;AACH,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,cAAc,CAAC;AAEtD,MAAM,WAAW,WAAW;IAC1B,mDAAmD;IACnD,QAAQ,EAAE,MAAM,CAAC;IACjB,4DAA4D;IAC5D,QAAQ,EAAE,MAAM,CAAC;IACjB,0BAA0B;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iCAAiC;IACjC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B;;;;OAIG;IACH,aAAa,CAAC,EAAE,kBAAkB,CAAC;IACnC;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;;OAIG;IACH,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAC/B,wCAAwC;IACxC,0BAA0B,CAAC,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC/C,sDAAsD;IACtD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,8DAA8D;IAC9D,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,yBAAyB;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yBAAyB;IACzB,UAAU,CAAC,EAAE;QACX,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,mBAAmB,CAAC,EAAE,MAAM,CAAC;KAC9B,CAAC;IACF;;;;;;OAMG;IACH,cAAc,CAAC,EAAE;QACf,WAAW,CAAC,EAAE,OAAO,CAAC;QACtB,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC;IACF;;;;;;OAMG;IACH,mBAAmB,CAAC,EAAE;QACpB,oFAAoF;QACpF,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;QAC7B,wFAAwF;QACxF,sBAAsB,CAAC,EAAE,MAAM,CAAC;QAChC,kEAAkE;QAClE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,qFAAqF;QACrF,aAAa,CAAC,EAAE,MAAM,CAAC;KACxB,CAAC;IACF;;;;;;;;;;;;;;OAcG;IACH,cAAc,CAAC,EAAE;QACf;;;;WAIG;QACH,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;QAC7B;;;;WAIG;QACH,WAAW,CAAC,EAAE,OAAO,CAAC;KACvB,CAAC;CACH;AAID,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,aAAa,EAAE,CAAC;IACxB,SAAS,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;IACrD,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE;QACR,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1B,OAAO,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAID,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,YAAY,GAAG,aAAa,GAAG,gBAAgB,GAAG,YAAY,CAAC;IACrE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,YAAY,CAAC;IACnB,MAAM,EAAE,qBAAqB,GAAG,mBAAmB,GAAG,eAAe,GAAG,SAAS,CAAC;IAClF,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,OAAO,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,+DAA+D;IAC/D,2BAA2B,CAAC,EAAE,MAAM,CAAC;CACtC;AAID,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,eAAe,GAAG,gBAAgB,GAAG,iBAAiB,CAAC;IAC7D,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACnC,OAAO,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACvC,OAAO,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACvC,OAAO,CAAC,EAAE,iBAAiB,EAAE,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAID,wDAAwD;AACxD,oBAAY,aAAa;IACvB,+DAA+D;IAC/D,KAAK,IAAI;IACT,oDAAoD;IACpD,KAAK,KAAK;IACV,4DAA4D;IAC5D,KAAK,KAAK;IACV,2CAA2C;IAC3C,KAAK,MAAM;CACZ;AAED;;;GAGG;AACH,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CA+BzD,CAAC;AAEF,yEAAyE;AACzE,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAErD;AAID,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB"}
|
|
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;
|
|
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,
|
|
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;;;;;;;;OAQG;IACH,kBAAkB,EAAE,MAAM,CAAC;IAC3B,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,yBAQlD,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,YAAY,CAAC,CAAiB;IACtC,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;IAiBb,IAAI,IAAI,IAAI;IAKZ,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,kBAAkB,EAAE,OAAO,CAAC;QAC5B,SAAS,EAAE,kBAAkB,EAAE,CAAC;QAChC,WAAW,EAAE,MAAM,CAAC;KACrB;CAkBF"}
|