botmux 2.16.0 → 2.16.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -6,25 +6,32 @@
6
6
  * path renders identically in the Lark thread — same chrome, same markdown
7
7
  * rendering, same table widget.
8
8
  *
9
- * Pure: no I/O, no module-level state. Exported helpers are tested by their
10
- * call sites' integration tests; no separate unit suite to keep the module
11
- * dependency-free.
9
+ * Implementation note: parsing is delegated to `markdown-it` (CommonMark +
10
+ * GFM tables) instead of hand-rolled regex. The previous regex-based fence
11
+ * splitter mis-fired on two real cases observed in production:
12
+ * 1. Code fences directly adjacent to a prose line (no blank line) — Feishu's
13
+ * markdown widget needs blank lines around fences, and the old splitter
14
+ * didn't enforce them, so fences leaked through as literal `\`\`\`` text.
15
+ * 2. Nested 3-backtick fences — the non-greedy regex closed the outer fence
16
+ * at the first inner one, garbling everything after it.
17
+ * markdown-it tokenizes correctly per CommonMark and gives us blank-line
18
+ * normalization for free. For nested fences users should use 4+ backticks for
19
+ * the outer block (CommonMark spec).
12
20
  */
13
- /** Feishu card markdown element doesn't render ATX headings → promote to bold. */
14
- export declare function transformHeadings(md: string): string;
15
- /** Parse a contiguous pipe-table block into a Feishu card v2 `table` element. */
16
- export declare function parseTableBlock(block: string): any | null;
17
21
  /**
18
22
  * Split markdown into card v2 body elements:
19
- * 1. Fenced code blocks are preserved verbatim (shielded from heading/table
20
- * transforms so `#` and `|` inside code don't get mis-parsed).
21
- * 2. Pipe-table blocks in prose become native `table` elements.
22
- * 3. Everything else becomes a `markdown` element with ATX headings promoted
23
- * to bold (Feishu's markdown element doesn't render `#`).
24
- * Consecutive markdown fragments are merged so the card keeps reasonable
25
- * element counts.
23
+ * 1. Pipe tables native `table` widget (Feishu's markdown widget can't
24
+ * render them as a grid).
25
+ * 2. Headings bold (Feishu's markdown widget doesn't render ATX `#`).
26
+ * 3. Code fences re-emitted with the original backtick run, joined with
27
+ * blank lines on either side (Feishu's widget needs them to recognise the
28
+ * fence).
29
+ * 4. Everything else → original source slice, glued by blank lines.
30
+ *
31
+ * All non-table blocks are merged into a single `markdown` element to keep
32
+ * card element counts modest.
26
33
  */
27
- export declare function buildCardBodyElements(md: string): any[];
34
+ export declare function buildCardBodyElements(input: string): any[];
28
35
  /**
29
36
  * Heuristic: does `text` contain markdown syntax that renders badly as plain
30
37
  * text in Feishu (code fences, headings, lists, bold, inline code, links,
@@ -1 +1 @@
1
- {"version":3,"file":"md-card.d.ts","sourceRoot":"","sources":["../../../src/im/lark/md-card.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,kFAAkF;AAClF,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED,iFAAiF;AACjF,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,IAAI,CAkCzD;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,MAAM,GAAG,GAAG,EAAE,CAyCvD;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAcjD;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,CAe9E"}
1
+ {"version":3,"file":"md-card.d.ts","sourceRoot":"","sources":["../../../src/im/lark/md-card.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAyFH;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,EAAE,CAwE1D;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAcjD;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,EAAE,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,CAe9E"}
@@ -6,40 +6,85 @@
6
6
  * path renders identically in the Lark thread — same chrome, same markdown
7
7
  * rendering, same table widget.
8
8
  *
9
- * Pure: no I/O, no module-level state. Exported helpers are tested by their
10
- * call sites' integration tests; no separate unit suite to keep the module
11
- * dependency-free.
9
+ * Implementation note: parsing is delegated to `markdown-it` (CommonMark +
10
+ * GFM tables) instead of hand-rolled regex. The previous regex-based fence
11
+ * splitter mis-fired on two real cases observed in production:
12
+ * 1. Code fences directly adjacent to a prose line (no blank line) — Feishu's
13
+ * markdown widget needs blank lines around fences, and the old splitter
14
+ * didn't enforce them, so fences leaked through as literal `\`\`\`` text.
15
+ * 2. Nested 3-backtick fences — the non-greedy regex closed the outer fence
16
+ * at the first inner one, garbling everything after it.
17
+ * markdown-it tokenizes correctly per CommonMark and gives us blank-line
18
+ * normalization for free. For nested fences users should use 4+ backticks for
19
+ * the outer block (CommonMark spec).
12
20
  */
13
- /** Feishu card markdown element doesn't render ATX headings → promote to bold. */
14
- export function transformHeadings(md) {
15
- return md.replace(/^#{1,6}\s+(.+)$/gm, (_m, c) => `**${c.trim()}**`);
16
- }
17
- /** Parse a contiguous pipe-table block into a Feishu card v2 `table` element. */
18
- export function parseTableBlock(block) {
19
- const lines = block.split(/\r?\n/).map(l => l.trim()).filter(Boolean);
20
- if (lines.length < 2)
21
- return null;
22
- const rows = lines.map(l => l.replace(/^\|/, '').replace(/\|$/, '').split('|').map(c => c.trim()));
23
- const sepIdx = rows.findIndex(r => r.length > 0 && r.every(c => /^:?-{2,}:?$/.test(c)));
24
- const header = rows[0];
25
- const body = sepIdx === 1 ? rows.slice(2) : rows.slice(1);
26
- if (header.length === 0)
21
+ import MarkdownIt from 'markdown-it';
22
+ const md = new MarkdownIt({ html: false, linkify: false, breaks: false });
23
+ /** Build a Feishu native `table` element from a `table_open … table_close` token slice. */
24
+ function buildTableFromTokens(tokens) {
25
+ const headerCells = [];
26
+ const bodyRows = [];
27
+ let inHead = false;
28
+ let inBody = false;
29
+ let currentRow = null;
30
+ let inCell = false;
31
+ for (const t of tokens) {
32
+ switch (t.type) {
33
+ case 'thead_open':
34
+ inHead = true;
35
+ break;
36
+ case 'thead_close':
37
+ inHead = false;
38
+ break;
39
+ case 'tbody_open':
40
+ inBody = true;
41
+ break;
42
+ case 'tbody_close':
43
+ inBody = false;
44
+ break;
45
+ case 'tr_open':
46
+ currentRow = [];
47
+ break;
48
+ case 'tr_close':
49
+ if (inBody && currentRow)
50
+ bodyRows.push(currentRow);
51
+ currentRow = null;
52
+ break;
53
+ case 'th_open':
54
+ case 'td_open':
55
+ inCell = true;
56
+ break;
57
+ case 'th_close':
58
+ case 'td_close':
59
+ inCell = false;
60
+ break;
61
+ case 'inline':
62
+ if (inCell) {
63
+ if (inHead)
64
+ headerCells.push(t.content);
65
+ else if (currentRow)
66
+ currentRow.push(t.content);
67
+ }
68
+ break;
69
+ }
70
+ }
71
+ if (headerCells.length === 0)
27
72
  return null;
28
- const columns = header.map((h, i) => ({
73
+ const columns = headerCells.map((h, i) => ({
29
74
  name: `c${i}`,
30
75
  display_name: h || ' ',
31
76
  data_type: 'lark_md',
32
77
  width: 'auto',
33
78
  }));
34
- const tableRows = body.map(r => {
79
+ const rows = bodyRows.map(r => {
35
80
  const o = {};
36
- for (let i = 0; i < header.length; i++)
81
+ for (let i = 0; i < headerCells.length; i++)
37
82
  o[`c${i}`] = r[i] ?? '';
38
83
  return o;
39
84
  });
40
85
  return {
41
86
  tag: 'table',
42
- page_size: Math.min(10, Math.max(1, tableRows.length || 1)),
87
+ page_size: Math.min(10, Math.max(1, rows.length || 1)),
43
88
  row_height: 'low',
44
89
  header_style: {
45
90
  text_align: 'left',
@@ -50,62 +95,110 @@ export function parseTableBlock(block) {
50
95
  lines: 1,
51
96
  },
52
97
  columns,
53
- rows: tableRows,
98
+ rows,
54
99
  };
55
100
  }
101
+ function sliceLines(lines, map) {
102
+ return lines.slice(map[0], map[1]).join('\n');
103
+ }
104
+ /** Find index of the matching close token at the same nesting depth. */
105
+ function findMatchingClose(tokens, openIdx) {
106
+ const open = tokens[openIdx];
107
+ const close = open.type.replace(/_open$/, '_close');
108
+ let depth = 1;
109
+ for (let j = openIdx + 1; j < tokens.length; j++) {
110
+ if (tokens[j].type === open.type)
111
+ depth++;
112
+ else if (tokens[j].type === close) {
113
+ depth--;
114
+ if (depth === 0)
115
+ return j;
116
+ }
117
+ }
118
+ return tokens.length - 1;
119
+ }
56
120
  /**
57
121
  * Split markdown into card v2 body elements:
58
- * 1. Fenced code blocks are preserved verbatim (shielded from heading/table
59
- * transforms so `#` and `|` inside code don't get mis-parsed).
60
- * 2. Pipe-table blocks in prose become native `table` elements.
61
- * 3. Everything else becomes a `markdown` element with ATX headings promoted
62
- * to bold (Feishu's markdown element doesn't render `#`).
63
- * Consecutive markdown fragments are merged so the card keeps reasonable
64
- * element counts.
122
+ * 1. Pipe tables native `table` widget (Feishu's markdown widget can't
123
+ * render them as a grid).
124
+ * 2. Headings bold (Feishu's markdown widget doesn't render ATX `#`).
125
+ * 3. Code fences re-emitted with the original backtick run, joined with
126
+ * blank lines on either side (Feishu's widget needs them to recognise the
127
+ * fence).
128
+ * 4. Everything else → original source slice, glued by blank lines.
129
+ *
130
+ * All non-table blocks are merged into a single `markdown` element to keep
131
+ * card element counts modest.
65
132
  */
66
- export function buildCardBodyElements(md) {
133
+ export function buildCardBodyElements(input) {
134
+ if (!input)
135
+ return [];
136
+ const tokens = md.parse(input, {});
137
+ const lines = input.split('\n');
67
138
  const elements = [];
68
- let buffer = '';
69
- const flushBuffer = () => {
70
- const t = buffer.replace(/^\s+|\s+$/g, '');
71
- if (t)
72
- elements.push({ tag: 'markdown', content: transformHeadings(t) });
73
- buffer = '';
139
+ const buf = [];
140
+ const flushBuf = () => {
141
+ const text = buf.join('\n\n').replace(/\n{3,}/g, '\n\n').trim();
142
+ if (text)
143
+ elements.push({ tag: 'markdown', content: text });
144
+ buf.length = 0;
74
145
  };
75
- // Segment by fenced code blocks (``` ... ```)
76
- const fenceRe = /^```[^\n]*\n[\s\S]*?^```[ \t]*$/gm;
77
- const segments = [];
78
- let fCursor = 0;
79
- let fm;
80
- while ((fm = fenceRe.exec(md)) !== null) {
81
- if (fm.index > fCursor)
82
- segments.push({ type: 'prose', text: md.slice(fCursor, fm.index) });
83
- segments.push({ type: 'code', text: fm[0] });
84
- fCursor = fm.index + fm[0].length;
85
- }
86
- if (fCursor < md.length)
87
- segments.push({ type: 'prose', text: md.slice(fCursor) });
88
- for (const seg of segments) {
89
- if (seg.type === 'code') {
90
- buffer += (buffer && !buffer.endsWith('\n') ? '\n' : '') + seg.text + '\n';
146
+ let i = 0;
147
+ while (i < tokens.length) {
148
+ const t = tokens[i];
149
+ if (t.level !== 0) {
150
+ i++;
91
151
  continue;
92
152
  }
93
- const tableRe = /(?:^[ \t]*\|.+\|[ \t]*\r?\n?){2,}/gm;
94
- let tCursor = 0;
95
- let tm;
96
- while ((tm = tableRe.exec(seg.text)) !== null) {
97
- buffer += seg.text.slice(tCursor, tm.index);
98
- flushBuffer();
99
- const table = parseTableBlock(tm[0]);
100
- if (table)
101
- elements.push(table);
102
- else
103
- buffer += tm[0];
104
- tCursor = tm.index + tm[0].length;
153
+ if (t.type === 'table_open') {
154
+ flushBuf();
155
+ const j = findMatchingClose(tokens, i);
156
+ const tableEl = buildTableFromTokens(tokens.slice(i, j + 1));
157
+ if (tableEl)
158
+ elements.push(tableEl);
159
+ else if (t.map)
160
+ buf.push(sliceLines(lines, t.map));
161
+ i = j + 1;
162
+ continue;
163
+ }
164
+ if (t.type === 'heading_open') {
165
+ const inline = tokens[i + 1];
166
+ const text = (inline?.content ?? '').replace(/^#{1,6}\s+/, '').trim();
167
+ if (text)
168
+ buf.push(`**${text}**`);
169
+ i += 3; // heading_open, inline, heading_close
170
+ continue;
171
+ }
172
+ if (t.type === 'fence' || t.type === 'code_block') {
173
+ const fence = t.markup || '```';
174
+ const info = (t.info || '').trim();
175
+ const content = t.content.replace(/\n+$/, '');
176
+ buf.push(`${fence}${info}\n${content}\n${fence}`);
177
+ i++;
178
+ continue;
179
+ }
180
+ if (t.type === 'hr') {
181
+ buf.push('---');
182
+ i++;
183
+ continue;
184
+ }
185
+ if (t.type === 'html_block') {
186
+ if (t.map)
187
+ buf.push(sliceLines(lines, t.map));
188
+ i++;
189
+ continue;
190
+ }
191
+ // Generic open token (paragraph_open, bullet_list_open, ordered_list_open,
192
+ // blockquote_open, …): slice source by the open-token's line map and skip
193
+ // to the matching close.
194
+ if (t.type.endsWith('_open') && t.map) {
195
+ buf.push(sliceLines(lines, t.map));
196
+ i = findMatchingClose(tokens, i) + 1;
197
+ continue;
105
198
  }
106
- buffer += seg.text.slice(tCursor);
199
+ i++;
107
200
  }
108
- flushBuffer();
201
+ flushBuf();
109
202
  return elements;
110
203
  }
111
204
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"md-card.js","sourceRoot":"","sources":["../../../src/im/lark/md-card.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"md-card.js","sourceRoot":"","sources":["../../../src/im/lark/md-card.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "botmux",
3
- "version": "2.16.0",
3
+ "version": "2.16.1",
4
4
  "description": "Bridge between IM platforms and AI coding CLIs — one topic, one CLI session with live streaming",
5
5
  "type": "module",
6
6
  "main": "dist/index-daemon.js",
@@ -38,6 +38,7 @@
38
38
  "@xterm/headless": "^6.0.0",
39
39
  "croner": "^10.0.1",
40
40
  "dotenv": "^17.3.1",
41
+ "markdown-it": "^14.1.1",
41
42
  "node-pty": "^1.1.0",
42
43
  "pm2": "^6.0.0",
43
44
  "ws": "^8.19.0",
@@ -46,6 +47,7 @@
46
47
  "devDependencies": {
47
48
  "@midscene/web": "^1.7.6",
48
49
  "@playwright/test": "^1.58.2",
50
+ "@types/markdown-it": "^14.1.2",
49
51
  "@types/node": "^20.0.0",
50
52
  "@types/ws": "^8.18.1",
51
53
  "esbuild": "^0.28.0",