laohuang 0.3.2 → 0.4.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.
Files changed (86) hide show
  1. package/README.md +142 -16
  2. package/dist/agent.d.ts +166 -0
  3. package/dist/agent.js +858 -0
  4. package/dist/agent.js.map +1 -0
  5. package/dist/bash-runner.d.ts +79 -0
  6. package/dist/bash-runner.js +464 -0
  7. package/dist/bash-runner.js.map +1 -0
  8. package/dist/cancellation.d.ts +36 -0
  9. package/dist/cancellation.js +123 -0
  10. package/dist/cancellation.js.map +1 -0
  11. package/dist/cli.d.ts +117 -0
  12. package/dist/cli.js +1307 -0
  13. package/dist/cli.js.map +1 -0
  14. package/dist/client.d.ts +21 -0
  15. package/dist/client.js +17 -0
  16. package/dist/client.js.map +1 -0
  17. package/dist/commands.d.ts +123 -0
  18. package/dist/commands.js +660 -0
  19. package/dist/commands.js.map +1 -0
  20. package/dist/config.d.ts +51 -0
  21. package/dist/config.js +183 -0
  22. package/dist/config.js.map +1 -0
  23. package/dist/credentials.d.ts +12 -0
  24. package/dist/credentials.js +102 -0
  25. package/dist/credentials.js.map +1 -0
  26. package/dist/events.d.ts +288 -0
  27. package/dist/events.js +838 -0
  28. package/dist/events.js.map +1 -0
  29. package/dist/model-adapter.d.ts +138 -0
  30. package/dist/model-adapter.js +244 -0
  31. package/dist/model-adapter.js.map +1 -0
  32. package/dist/model-selection.d.ts +67 -0
  33. package/dist/model-selection.js +148 -0
  34. package/dist/model-selection.js.map +1 -0
  35. package/dist/model-stream.d.ts +128 -0
  36. package/dist/model-stream.js +582 -0
  37. package/dist/model-stream.js.map +1 -0
  38. package/dist/project-instructions.d.ts +99 -0
  39. package/dist/project-instructions.js +348 -0
  40. package/dist/project-instructions.js.map +1 -0
  41. package/dist/providers.d.ts +9 -0
  42. package/dist/providers.js +26 -0
  43. package/dist/providers.js.map +1 -0
  44. package/dist/routing.d.ts +170 -0
  45. package/dist/routing.js +669 -0
  46. package/dist/routing.js.map +1 -0
  47. package/dist/semantic-classifier.d.ts +66 -0
  48. package/dist/semantic-classifier.js +86 -0
  49. package/dist/semantic-classifier.js.map +1 -0
  50. package/dist/session.d.ts +162 -0
  51. package/dist/session.js +871 -0
  52. package/dist/session.js.map +1 -0
  53. package/dist/system-prompt.d.ts +16 -0
  54. package/dist/system-prompt.js +42 -0
  55. package/dist/system-prompt.js.map +1 -0
  56. package/dist/terminal/editor.d.ts +161 -0
  57. package/dist/terminal/editor.js +1060 -0
  58. package/dist/terminal/editor.js.map +1 -0
  59. package/dist/terminal/input.d.ts +61 -0
  60. package/dist/terminal/input.js +276 -0
  61. package/dist/terminal/input.js.map +1 -0
  62. package/dist/terminal/markdown.d.ts +20 -0
  63. package/dist/terminal/markdown.js +621 -0
  64. package/dist/terminal/markdown.js.map +1 -0
  65. package/dist/terminal/screen.d.ts +66 -0
  66. package/dist/terminal/screen.js +624 -0
  67. package/dist/terminal/screen.js.map +1 -0
  68. package/dist/terminal/theme.d.ts +23 -0
  69. package/dist/terminal/theme.js +101 -0
  70. package/dist/terminal/theme.js.map +1 -0
  71. package/dist/terminal/ui.d.ts +285 -0
  72. package/dist/terminal/ui.js +1815 -0
  73. package/dist/terminal/ui.js.map +1 -0
  74. package/dist/tools.d.ts +95 -0
  75. package/dist/tools.js +444 -0
  76. package/dist/tools.js.map +1 -0
  77. package/dist/ui-state.d.ts +51 -0
  78. package/dist/ui-state.js +194 -0
  79. package/dist/ui-state.js.map +1 -0
  80. package/dist/web.d.ts +56 -0
  81. package/dist/web.js +247 -0
  82. package/dist/web.js.map +1 -0
  83. package/package.json +24 -21
  84. package/bin/laohuang.js +0 -10
  85. package/lib/launcher.js +0 -133
  86. package/vendor/laohuangcode-0.3.2-py3-none-any.whl +0 -0
@@ -0,0 +1,621 @@
1
+ /**
2
+ * Convert Markdown into styled ANSI logical lines without terminal I/O.
3
+ *
4
+ * Hand-written replacement for the Python version's Rich + prompt_toolkit
5
+ * pipeline: a small block/inline Markdown parser emits styled segments,
6
+ * which are word-wrapped and serialized as ANSI SGR strings. Each returned
7
+ * line is one logical line with no newline and fits the requested visible
8
+ * width, with any open SGR style closed before truncation.
9
+ *
10
+ * Rich-fidelity behaviors mirrored from Python's `render_markdown_lines`:
11
+ * links render their URL in parentheses, tables render as a bordered grid,
12
+ * list items keep a hanging indent on wrapped continuation lines, and
13
+ * block-level elements are separated by blank lines (container blocks —
14
+ * lists, tables, quotes — also carry a leading blank line, and a horizontal
15
+ * rule emits its own trailing blank line).
16
+ */
17
+ import { clusterWidth, graphemeClusters, stripTerminalControls, truncateToWidth, } from "./screen.js";
18
+ // The visible-width/escape-sequence helpers are owned by terminal/screen.ts;
19
+ // visibleWidth is re-exported for existing consumers of this module.
20
+ export { visibleWidth } from "./screen.js";
21
+ /** Render Markdown as ANSI logical lines that each fit `width` columns. */
22
+ export function renderMarkdownLines(text, width, theme) {
23
+ const clean = stripTerminalControls(text);
24
+ if (!clean.trim()) {
25
+ return [];
26
+ }
27
+ // Rich lays out at max(12, width) and each line is then truncated to the
28
+ // requested width; keep the same two-step behavior.
29
+ const layoutWidth = Math.max(12, width);
30
+ const lines = [];
31
+ let previous = null;
32
+ for (const block of renderBlocks(clean, theme, layoutWidth)) {
33
+ // Rich yields one blank line before each block-level element whose
34
+ // predecessor sets new_line (every element except a horizontal rule).
35
+ // Container blocks nest paragraph children, so the flag is already set
36
+ // when they render first — hence the leading blank at document start.
37
+ const leadingBlank = previous === null
38
+ ? block.kind === "list" ||
39
+ block.kind === "table" ||
40
+ block.kind === "quote"
41
+ : previous !== "hr";
42
+ if (leadingBlank) {
43
+ lines.push("");
44
+ }
45
+ for (const line of block.lines) {
46
+ lines.push(truncateToWidth(serializeLine(line), width));
47
+ }
48
+ // Rich's HorizontalRule yields an empty Text after the rule itself.
49
+ if (block.kind === "hr") {
50
+ lines.push("");
51
+ }
52
+ previous = block.kind;
53
+ }
54
+ return lines;
55
+ }
56
+ function styleKey(style) {
57
+ return [
58
+ style.bold ? "b" : "",
59
+ style.italic ? "i" : "",
60
+ style.strike ? "s" : "",
61
+ style.underline ? "u" : "",
62
+ style.fg ?? "",
63
+ style.bg ?? "",
64
+ ].join("|");
65
+ }
66
+ function styleCodes(style) {
67
+ const codes = [];
68
+ if (style.bold) {
69
+ codes.push("1");
70
+ }
71
+ if (style.italic) {
72
+ codes.push("3");
73
+ }
74
+ if (style.underline) {
75
+ codes.push("4");
76
+ }
77
+ if (style.strike) {
78
+ codes.push("9");
79
+ }
80
+ if (style.fg) {
81
+ codes.push(`38;2;${hexToRgb(style.fg)}`);
82
+ }
83
+ if (style.bg) {
84
+ codes.push(`48;2;${hexToRgb(style.bg)}`);
85
+ }
86
+ return codes.join(";");
87
+ }
88
+ function hexToRgb(hex) {
89
+ const r = parseInt(hex.slice(1, 3), 16);
90
+ const g = parseInt(hex.slice(3, 5), 16);
91
+ const b = parseInt(hex.slice(5, 7), 16);
92
+ return `${r};${g};${b}`;
93
+ }
94
+ /** Parse the document into blocks with pre-wrapped styled lines. */
95
+ function renderBlocks(text, theme, layoutWidth) {
96
+ const lines = text.replace(/\r\n/g, "\n").split("\n");
97
+ const blocks = [];
98
+ let paragraph = [];
99
+ let index = 0;
100
+ const flushParagraph = () => {
101
+ const content = paragraph.join(" ").trim();
102
+ paragraph = [];
103
+ if (content) {
104
+ blocks.push({
105
+ kind: "paragraph",
106
+ lines: wrapSegments(parseInline(content, {}, theme), layoutWidth),
107
+ });
108
+ }
109
+ };
110
+ while (index < lines.length) {
111
+ const line = lines[index];
112
+ const trimmed = line.trim();
113
+ if (trimmed.startsWith("```") || trimmed.startsWith("~~~")) {
114
+ flushParagraph();
115
+ const fence = trimmed.slice(0, 3);
116
+ index += 1;
117
+ const codeStyle = {
118
+ fg: theme.color("code"),
119
+ bg: theme.color("card"),
120
+ };
121
+ const codeLines = [];
122
+ while (index < lines.length) {
123
+ const body = lines[index];
124
+ if (body.trim().startsWith(fence)) {
125
+ index += 1;
126
+ break;
127
+ }
128
+ codeLines.push(...(body
129
+ ? wrapSegments([{ style: codeStyle, text: body }], layoutWidth)
130
+ : [[]]));
131
+ index += 1;
132
+ }
133
+ blocks.push({ kind: "code", lines: codeLines });
134
+ continue;
135
+ }
136
+ if (!trimmed) {
137
+ flushParagraph();
138
+ index += 1;
139
+ continue;
140
+ }
141
+ // A table is a header row followed by a delimiter row of dashes.
142
+ if (trimmed.includes("|") && index + 1 < lines.length) {
143
+ const header = splitTableRow(trimmed);
144
+ const delimiter = splitTableRow(lines[index + 1].trim());
145
+ if (header !== null &&
146
+ delimiter !== null &&
147
+ delimiter.length === header.length &&
148
+ delimiter.every((cell) => /^:?-+:?$/.test(cell))) {
149
+ flushParagraph();
150
+ index += 2;
151
+ const rows = [];
152
+ while (index < lines.length) {
153
+ const rowLine = lines[index].trim();
154
+ if (!rowLine) {
155
+ break;
156
+ }
157
+ const cells = splitTableRow(rowLine);
158
+ if (cells === null) {
159
+ break;
160
+ }
161
+ rows.push(cells);
162
+ index += 1;
163
+ }
164
+ blocks.push({
165
+ kind: "table",
166
+ lines: renderTable(header, rows, theme, layoutWidth),
167
+ });
168
+ continue;
169
+ }
170
+ }
171
+ const heading = /^(#{1,6})\s+(.*)$/.exec(trimmed);
172
+ if (heading) {
173
+ flushParagraph();
174
+ blocks.push({
175
+ kind: "heading",
176
+ lines: wrapSegments(parseInline(heading[2].replace(/\s+#+\s*$/, ""), { bold: true, fg: theme.color("heading") }, theme), layoutWidth),
177
+ });
178
+ index += 1;
179
+ continue;
180
+ }
181
+ if (/^(-{3,}|\*{3,}|_{3,})$/.test(trimmed)) {
182
+ flushParagraph();
183
+ blocks.push({
184
+ kind: "hr",
185
+ lines: [
186
+ [
187
+ {
188
+ style: { fg: theme.color("border_muted") },
189
+ text: "─".repeat(layoutWidth),
190
+ },
191
+ ],
192
+ ],
193
+ });
194
+ index += 1;
195
+ continue;
196
+ }
197
+ if (trimmed.startsWith(">")) {
198
+ flushParagraph();
199
+ const content = [];
200
+ while (index < lines.length) {
201
+ const match = /^>\s?(.*)$/.exec(lines[index].trim());
202
+ if (!match) {
203
+ break;
204
+ }
205
+ content.push(match[1]);
206
+ index += 1;
207
+ }
208
+ const quote = content.join(" ").trim();
209
+ if (quote) {
210
+ blocks.push({
211
+ kind: "quote",
212
+ lines: wrapSegments(parseInline(quote, { italic: true, fg: theme.color("thinking") }, theme), layoutWidth),
213
+ });
214
+ }
215
+ continue;
216
+ }
217
+ if (/^[-*+]\s+/.test(trimmed)) {
218
+ flushParagraph();
219
+ const items = [];
220
+ while (index < lines.length) {
221
+ const match = /^[-*+]\s+(.*)$/.exec(lines[index].trim());
222
+ if (!match) {
223
+ break;
224
+ }
225
+ items.push(parseInline(match[1], {}, theme));
226
+ index += 1;
227
+ }
228
+ blocks.push({
229
+ kind: "list",
230
+ lines: renderListItems(items, () => " • ", theme, layoutWidth),
231
+ });
232
+ continue;
233
+ }
234
+ const numbered = /^(\d+)[.)]\s+(.*)$/.exec(trimmed);
235
+ if (numbered) {
236
+ flushParagraph();
237
+ const start = parseInt(numbered[1], 10);
238
+ const items = [parseInline(numbered[2], {}, theme)];
239
+ index += 1;
240
+ while (index < lines.length) {
241
+ const match = /^(\d+)[.)]\s+(.*)$/.exec(lines[index].trim());
242
+ if (!match) {
243
+ break;
244
+ }
245
+ items.push(parseInline(match[2], {}, theme));
246
+ index += 1;
247
+ }
248
+ // Rich sizes the number column from start + item count, right-aligns
249
+ // each numeral, and follows it with one space.
250
+ const numberWidth = String(start + items.length).length + 2;
251
+ blocks.push({
252
+ kind: "list",
253
+ lines: renderListItems(items, (item) => String(start + item).padStart(numberWidth - 1) + " ", theme, layoutWidth),
254
+ });
255
+ continue;
256
+ }
257
+ paragraph.push(trimmed);
258
+ index += 1;
259
+ }
260
+ flushParagraph();
261
+ return blocks;
262
+ }
263
+ /** Render list items with the marker and a hanging indent, Rich-style. */
264
+ function renderListItems(items, prefixFor, theme, layoutWidth) {
265
+ const marker = { fg: theme.color("accent") };
266
+ const lines = [];
267
+ for (let index = 0; index < items.length; index += 1) {
268
+ const prefix = prefixFor(index);
269
+ const wrapped = wrapSegments(items[index], Math.max(1, layoutWidth - prefix.length));
270
+ if (wrapped.length === 0) {
271
+ lines.push([{ style: marker, text: prefix }]);
272
+ continue;
273
+ }
274
+ for (let row = 0; row < wrapped.length; row += 1) {
275
+ lines.push([
276
+ {
277
+ style: marker,
278
+ text: row === 0 ? prefix : " ".repeat(prefix.length),
279
+ },
280
+ ...wrapped[row],
281
+ ]);
282
+ }
283
+ }
284
+ return lines;
285
+ }
286
+ // ---------------------------------------------------------------------------
287
+ // Tables (Rich's SIMPLE box: blank edges, dashed header separator)
288
+ // ---------------------------------------------------------------------------
289
+ /** Theme token lookup that tolerates missing or malformed entries. */
290
+ function tableColor(theme, token, fallback) {
291
+ const value = theme.colors[token];
292
+ return value !== undefined && /^#[0-9a-fA-F]{6}$/.test(value)
293
+ ? value
294
+ : theme.color(fallback);
295
+ }
296
+ /** Split a pipe-delimited table row into trimmed cells. */
297
+ function splitTableRow(line) {
298
+ if (!line.includes("|")) {
299
+ return null;
300
+ }
301
+ let rest = line;
302
+ if (rest.startsWith("|")) {
303
+ rest = rest.slice(1);
304
+ }
305
+ if (rest.endsWith("|")) {
306
+ rest = rest.slice(0, -1);
307
+ }
308
+ return rest.split("|").map((cell) => cell.trim());
309
+ }
310
+ /** Visible width of a segment list. */
311
+ function segmentsWidth(segments) {
312
+ let width = 0;
313
+ for (const segment of segments) {
314
+ for (const cluster of graphemeClusters(segment.text)) {
315
+ width += clusterWidth(cluster);
316
+ }
317
+ }
318
+ return width;
319
+ }
320
+ /** Lay out a table as a grid of styled lines that fits `layoutWidth`. */
321
+ function renderTable(header, rows, theme, layoutWidth) {
322
+ const columnCount = header.length;
323
+ const borderStyle = {
324
+ fg: tableColor(theme, "markdown.table.border", "border_muted"),
325
+ };
326
+ const headerStyle = {
327
+ bold: true,
328
+ fg: tableColor(theme, "markdown.table.header", "heading"),
329
+ };
330
+ const normalize = (cells) => Array.from({ length: columnCount }, (_, i) => cells[i] ?? "");
331
+ const headerCells = normalize(header).map((cell) => parseInline(cell, headerStyle, theme));
332
+ const bodyCells = rows.map((row) => normalize(row).map((cell) => parseInline(cell, {}, theme)));
333
+ const widths = Array.from({ length: columnCount }, (_, i) => Math.max(1, segmentsWidth(headerCells[i]), ...bodyCells.map((row) => segmentsWidth(row[i]))));
334
+ const totalWidth = () => widths.reduce((total, w) => total + w, 0) + 2 * (columnCount - 1) + 2;
335
+ while (totalWidth() > layoutWidth && Math.max(...widths) > 1) {
336
+ let widest = 0;
337
+ for (let i = 1; i < widths.length; i += 1) {
338
+ if (widths[i] > widths[widest]) {
339
+ widest = i;
340
+ }
341
+ }
342
+ widths[widest] = widths[widest] - 1;
343
+ }
344
+ const inner = widths.reduce((total, w) => total + w, 0) + 2 * (columnCount - 1);
345
+ const lines = [];
346
+ lines.push([{ style: borderStyle, text: " ".repeat(inner + 2) }]);
347
+ lines.push(...renderTableRows(headerCells, widths, borderStyle, headerStyle));
348
+ lines.push([{ style: borderStyle, text: ` ${"─".repeat(inner)} ` }]);
349
+ for (const row of bodyCells) {
350
+ lines.push(...renderTableRows(row, widths, borderStyle, {}));
351
+ }
352
+ lines.push([{ style: borderStyle, text: " ".repeat(inner + 2) }]);
353
+ return lines;
354
+ }
355
+ /** Render one table row (possibly several physical lines after wrapping). */
356
+ function renderTableRows(cells, widths, borderStyle, padStyle) {
357
+ const wrappedCells = cells.map((cell, i) => {
358
+ const wrapped = wrapSegments(cell, widths[i]);
359
+ return wrapped.length > 0 ? wrapped : [[]];
360
+ });
361
+ const height = Math.max(...wrappedCells.map((cell) => cell.length));
362
+ const lines = [];
363
+ for (let row = 0; row < height; row += 1) {
364
+ // pad_edge=False: outer padding only comes from the (blank) box edges,
365
+ // so interior columns keep one styled space on each side.
366
+ const line = [{ style: borderStyle, text: " " }];
367
+ for (let i = 0; i < cells.length; i += 1) {
368
+ if (i > 0) {
369
+ line.push({ style: borderStyle, text: " " });
370
+ }
371
+ const cellLine = wrappedCells[i][row];
372
+ line.push(...cellLine);
373
+ const pad = widths[i] - segmentsWidth(cellLine);
374
+ if (pad > 0) {
375
+ line.push({ style: padStyle, text: " ".repeat(pad) });
376
+ }
377
+ if (i < cells.length - 1) {
378
+ line.push({ style: padStyle, text: " " });
379
+ }
380
+ }
381
+ line.push({ style: borderStyle, text: " " });
382
+ lines.push(mergeSegments(line));
383
+ }
384
+ return lines;
385
+ }
386
+ const INLINE_PATTERNS = [
387
+ {
388
+ // Inline code: no further parsing inside backticks.
389
+ pattern: /`([^`]+)`/,
390
+ style: (theme) => ({ fg: theme.color("code"), bg: theme.color("card") }),
391
+ },
392
+ {
393
+ pattern: /\*\*([^*]+)\*\*/,
394
+ style: (_theme, base) => ({ ...base, bold: true }),
395
+ },
396
+ {
397
+ pattern: /__([^_]+)__/,
398
+ style: (_theme, base) => ({ ...base, bold: true }),
399
+ },
400
+ {
401
+ pattern: /~~([^~]+)~~/,
402
+ style: (theme, base) => ({
403
+ ...base,
404
+ strike: true,
405
+ fg: theme.color("muted"),
406
+ }),
407
+ },
408
+ {
409
+ pattern: /\*([^*]+)\*/,
410
+ style: (_theme, base) => ({ ...base, italic: true }),
411
+ },
412
+ {
413
+ pattern: /(?<![A-Za-z0-9])_([^_]+)_(?![A-Za-z0-9])/,
414
+ style: (_theme, base) => ({ ...base, italic: true }),
415
+ },
416
+ {
417
+ // Links and images: visible text plus the URL in parentheses, matching
418
+ // Rich's hyperlinks=False output, never OSC-8 controls. Rich renders
419
+ // the link text as plain (unparsed) content.
420
+ pattern: /!?\[([^\]]*)\]\(([^)\s]+)\)/,
421
+ expand: (theme, base, match) => [
422
+ {
423
+ style: { ...base, underline: true, fg: theme.color("link") },
424
+ text: match[1],
425
+ },
426
+ { style: base, text: " (" },
427
+ {
428
+ style: { ...base, fg: theme.color("muted") },
429
+ text: match[2],
430
+ },
431
+ { style: base, text: ")" },
432
+ ],
433
+ },
434
+ ];
435
+ function parseInline(text, base, theme) {
436
+ const segments = [];
437
+ let rest = text;
438
+ while (rest) {
439
+ let best = null;
440
+ for (const { pattern, style, expand } of INLINE_PATTERNS) {
441
+ const match = pattern.exec(rest);
442
+ if (!match) {
443
+ continue;
444
+ }
445
+ if (best !== null && match.index >= best.start) {
446
+ continue;
447
+ }
448
+ if (expand) {
449
+ best = {
450
+ start: match.index,
451
+ end: match.index + match[0].length,
452
+ expanded: expand(theme, base, match),
453
+ };
454
+ continue;
455
+ }
456
+ const next = style(theme, base);
457
+ best = {
458
+ start: match.index,
459
+ end: match.index + match[0].length,
460
+ next,
461
+ };
462
+ }
463
+ if (best === null) {
464
+ segments.push({ style: base, text: rest });
465
+ break;
466
+ }
467
+ if (best.start > 0) {
468
+ segments.push({ style: base, text: rest.slice(0, best.start) });
469
+ }
470
+ if (best.expanded) {
471
+ segments.push(...best.expanded);
472
+ }
473
+ else {
474
+ const inner = rest.slice(best.start, best.end);
475
+ const content = inlineContent(inner);
476
+ segments.push(...parseInline(content, best.next, theme));
477
+ }
478
+ rest = rest.slice(best.end);
479
+ }
480
+ return mergeSegments(segments);
481
+ }
482
+ /** Strip the matched delimiters, returning the text inside. */
483
+ function inlineContent(matched) {
484
+ if (matched.startsWith("```") || matched.startsWith("`")) {
485
+ return matched.slice(1, -1);
486
+ }
487
+ if (matched.startsWith("**") || matched.startsWith("__")) {
488
+ return matched.slice(2, -2);
489
+ }
490
+ if (matched.startsWith("~~")) {
491
+ return matched.slice(2, -2);
492
+ }
493
+ if (matched.startsWith("*") || matched.startsWith("_")) {
494
+ return matched.slice(1, -1);
495
+ }
496
+ return matched;
497
+ }
498
+ function mergeSegments(segments) {
499
+ const merged = [];
500
+ for (const segment of segments) {
501
+ if (!segment.text) {
502
+ continue;
503
+ }
504
+ const last = merged[merged.length - 1];
505
+ if (last && styleKey(last.style) === styleKey(segment.style)) {
506
+ last.text += segment.text;
507
+ }
508
+ else {
509
+ merged.push({ style: segment.style, text: segment.text });
510
+ }
511
+ }
512
+ return merged;
513
+ }
514
+ /** Greedy word wrap over styled segments; long words are hard-broken. */
515
+ function wrapSegments(segments, width) {
516
+ const clusters = [];
517
+ for (const segment of segments) {
518
+ for (const cluster of graphemeClusters(segment.text)) {
519
+ clusters.push({
520
+ style: segment.style,
521
+ text: cluster === "\t" ? " " : cluster,
522
+ width: clusterWidth(cluster),
523
+ space: cluster === " ",
524
+ });
525
+ }
526
+ }
527
+ const words = [];
528
+ let current = [];
529
+ for (const cluster of clusters) {
530
+ if (cluster.space) {
531
+ if (current.length > 0) {
532
+ words.push(current);
533
+ current = [];
534
+ }
535
+ words.push([cluster]);
536
+ }
537
+ else {
538
+ current.push(cluster);
539
+ }
540
+ }
541
+ if (current.length > 0) {
542
+ words.push(current);
543
+ }
544
+ const lines = [];
545
+ let line = [];
546
+ let lineWidth = 0;
547
+ let pendingSpace = null;
548
+ const flushLine = () => {
549
+ // Drop a trailing separator space; it is invisible padding.
550
+ lines.push(line);
551
+ line = [];
552
+ lineWidth = 0;
553
+ pendingSpace = null;
554
+ };
555
+ for (const word of words) {
556
+ const wordWidth = word.reduce((total, c) => total + c.width, 0);
557
+ if (word.length === 1 && word[0]?.space) {
558
+ if (line.length > 0) {
559
+ pendingSpace = word[0];
560
+ }
561
+ continue;
562
+ }
563
+ if (wordWidth > width) {
564
+ // Hard-break an over-wide word cluster by cluster.
565
+ if (line.length > 0) {
566
+ flushLine();
567
+ }
568
+ for (const cluster of word) {
569
+ if (lineWidth > 0 && lineWidth + cluster.width > width) {
570
+ flushLine();
571
+ }
572
+ line.push(cluster);
573
+ lineWidth += cluster.width;
574
+ }
575
+ continue;
576
+ }
577
+ const separator = pendingSpace !== null && line.length > 0 ? 1 : 0;
578
+ if (line.length > 0 && lineWidth + separator + wordWidth > width) {
579
+ flushLine();
580
+ }
581
+ if (pendingSpace !== null && line.length > 0) {
582
+ line.push(pendingSpace);
583
+ lineWidth += 1;
584
+ }
585
+ pendingSpace = null;
586
+ line.push(...word);
587
+ lineWidth += wordWidth;
588
+ }
589
+ if (line.length > 0) {
590
+ flushLine();
591
+ }
592
+ return lines.map((physical) => regroup(physical));
593
+ }
594
+ /** Merge adjacent clusters of equal style back into segments. */
595
+ function regroup(clusters) {
596
+ const segments = [];
597
+ for (const cluster of clusters) {
598
+ const last = segments[segments.length - 1];
599
+ if (last && styleKey(last.style) === styleKey(cluster.style)) {
600
+ last.text += cluster.text;
601
+ }
602
+ else {
603
+ segments.push({ style: cluster.style, text: cluster.text });
604
+ }
605
+ }
606
+ return segments;
607
+ }
608
+ /** Serialize one wrapped line as an ANSI string; plain text stays raw. */
609
+ function serializeLine(segments) {
610
+ let out = "";
611
+ for (const segment of segments) {
612
+ const codes = styleCodes(segment.style);
613
+ if (!codes) {
614
+ out += segment.text;
615
+ continue;
616
+ }
617
+ out += `\x1b[${codes}m${segment.text}\x1b[0m`;
618
+ }
619
+ return out;
620
+ }
621
+ //# sourceMappingURL=markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../src/terminal/markdown.ts"],"names":[],"mappings":"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"}