@namzu/cli 28.1.0 → 29.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/CHANGELOG.md +92 -0
  2. package/dist/integrations/subagents/runtime.d.ts +25 -0
  3. package/dist/integrations/subagents/runtime.d.ts.map +1 -1
  4. package/dist/integrations/subagents/runtime.js +40 -4
  5. package/dist/integrations/subagents/runtime.js.map +1 -1
  6. package/dist/tui/AgentExplorer.d.ts +28 -4
  7. package/dist/tui/AgentExplorer.d.ts.map +1 -1
  8. package/dist/tui/AgentExplorer.js +177 -35
  9. package/dist/tui/AgentExplorer.js.map +1 -1
  10. package/dist/tui/App.d.ts.map +1 -1
  11. package/dist/tui/App.js +235 -21
  12. package/dist/tui/App.js.map +1 -1
  13. package/dist/tui/Composer.d.ts.map +1 -1
  14. package/dist/tui/Composer.js +10 -4
  15. package/dist/tui/Composer.js.map +1 -1
  16. package/dist/tui/ComposerFrame.d.ts +10 -1
  17. package/dist/tui/ComposerFrame.d.ts.map +1 -1
  18. package/dist/tui/ComposerFrame.js +27 -4
  19. package/dist/tui/ComposerFrame.js.map +1 -1
  20. package/dist/tui/EffortSlider.d.ts +54 -0
  21. package/dist/tui/EffortSlider.d.ts.map +1 -0
  22. package/dist/tui/EffortSlider.js +131 -0
  23. package/dist/tui/EffortSlider.js.map +1 -0
  24. package/dist/tui/LiveActivity.d.ts +23 -3
  25. package/dist/tui/LiveActivity.d.ts.map +1 -1
  26. package/dist/tui/LiveActivity.js +23 -17
  27. package/dist/tui/LiveActivity.js.map +1 -1
  28. package/dist/tui/Markdown.d.ts +29 -2
  29. package/dist/tui/Markdown.d.ts.map +1 -1
  30. package/dist/tui/Markdown.js +74 -36
  31. package/dist/tui/Markdown.js.map +1 -1
  32. package/dist/tui/StatusBar.js +1 -1
  33. package/dist/tui/StatusBar.js.map +1 -1
  34. package/dist/tui/Transcript.d.ts +24 -1
  35. package/dist/tui/Transcript.d.ts.map +1 -1
  36. package/dist/tui/Transcript.js +35 -8
  37. package/dist/tui/Transcript.js.map +1 -1
  38. package/dist/tui/ViewportBound.d.ts +48 -0
  39. package/dist/tui/ViewportBound.d.ts.map +1 -0
  40. package/dist/tui/ViewportBound.js +55 -0
  41. package/dist/tui/ViewportBound.js.map +1 -0
  42. package/dist/tui/agent-transcript-rows.d.ts +59 -0
  43. package/dist/tui/agent-transcript-rows.d.ts.map +1 -0
  44. package/dist/tui/agent-transcript-rows.js +115 -0
  45. package/dist/tui/agent-transcript-rows.js.map +1 -0
  46. package/dist/tui/agent.d.ts +39 -0
  47. package/dist/tui/agent.d.ts.map +1 -1
  48. package/dist/tui/agent.js +86 -5
  49. package/dist/tui/agent.js.map +1 -1
  50. package/dist/tui/live-window.d.ts +16 -0
  51. package/dist/tui/live-window.d.ts.map +1 -1
  52. package/dist/tui/live-window.js +50 -3
  53. package/dist/tui/live-window.js.map +1 -1
  54. package/dist/tui/markdown-block-cache.d.ts +9 -7
  55. package/dist/tui/markdown-block-cache.d.ts.map +1 -1
  56. package/dist/tui/markdown-block-cache.js +9 -7
  57. package/dist/tui/markdown-block-cache.js.map +1 -1
  58. package/dist/tui/markdown-table.d.ts +55 -0
  59. package/dist/tui/markdown-table.d.ts.map +1 -0
  60. package/dist/tui/markdown-table.js +175 -0
  61. package/dist/tui/markdown-table.js.map +1 -0
  62. package/dist/tui/markdown-wrap.d.ts +53 -0
  63. package/dist/tui/markdown-wrap.d.ts.map +1 -0
  64. package/dist/tui/markdown-wrap.js +189 -0
  65. package/dist/tui/markdown-wrap.js.map +1 -0
  66. package/dist/tui/markdownParser.d.ts +6 -0
  67. package/dist/tui/markdownParser.d.ts.map +1 -1
  68. package/dist/tui/markdownParser.js +49 -10
  69. package/dist/tui/markdownParser.js.map +1 -1
  70. package/dist/tui/slashCommands.d.ts.map +1 -1
  71. package/dist/tui/slashCommands.js +3 -0
  72. package/dist/tui/slashCommands.js.map +1 -1
  73. package/dist/tui/stream-blocks.d.ts.map +1 -1
  74. package/dist/tui/stream-blocks.js +32 -3
  75. package/dist/tui/stream-blocks.js.map +1 -1
  76. package/dist/tui/theme.d.ts +13 -0
  77. package/dist/tui/theme.d.ts.map +1 -1
  78. package/dist/tui/theme.js +16 -0
  79. package/dist/tui/theme.js.map +1 -1
  80. package/dist/tui/types.d.ts +7 -2
  81. package/dist/tui/types.d.ts.map +1 -1
  82. package/dist/tui/units.d.ts +6 -0
  83. package/dist/tui/units.d.ts.map +1 -0
  84. package/dist/tui/units.js +20 -0
  85. package/dist/tui/units.js.map +1 -0
  86. package/dist/tui/web-activity.d.ts +58 -0
  87. package/dist/tui/web-activity.d.ts.map +1 -0
  88. package/dist/tui/web-activity.js +105 -0
  89. package/dist/tui/web-activity.js.map +1 -0
  90. package/package.json +8 -8
@@ -42,6 +42,8 @@
42
42
  */
43
43
  import { checklistBlockRows, checklistLine } from './Checklist.js';
44
44
  import { renderedDetailLines } from './Transcript.js';
45
+ import { tableHeight } from './markdown-table.js';
46
+ import { parseBlock, scanBlocks } from './markdownParser.js';
45
47
  import { statusPanelLayout } from './status-panel-layout.js';
46
48
  import { terminalDisplayText } from './terminal-display.js';
47
49
  /** Rows kept clear between the redrawable tail and the terminal boundary. */
@@ -156,10 +158,33 @@ const ROW_HEIGHT_ALLOWANCE = 2;
156
158
  * source line is a conservative ceiling on those vertical margins. Detail and
157
159
  * non-assistant rows render as plain Text and need no such allowance.
158
160
  */
159
- function markdownHeightAllowance(message, raw) {
161
+ function markdownHeightAllowance(message, raw, columns) {
160
162
  if (raw || message.role !== 'assistant')
161
163
  return 0;
162
- return message.content.split('\n').filter((line) => line.trim().length > 0).length;
164
+ return (message.content.split('\n').filter((line) => line.trim().length > 0).length +
165
+ tableAllowance(message.content, columns));
166
+ }
167
+ /**
168
+ * Rows a table draws beyond its source lines.
169
+ *
170
+ * A boxed table adds a rule above, below and between every row and wraps each
171
+ * cell inside its column, so a four-line source table can draw twenty rows:
172
+ * more than the per-line allowance above admits. The layout is the one the
173
+ * renderer uses, at the width it will have, so this is the table's real
174
+ * height rather than a guess at it.
175
+ */
176
+ function tableAllowance(content, columns) {
177
+ if (!content.includes('|'))
178
+ return 0;
179
+ const width = Math.max(10, (columns ?? 80) - 4);
180
+ let extra = 0;
181
+ for (const segment of scanBlocks(content)) {
182
+ const block = parseBlock(segment);
183
+ if (block.type !== 'table')
184
+ continue;
185
+ extra += Math.max(0, tableHeight(block, width) - segment.split('\n').length);
186
+ }
187
+ return extra;
163
188
  }
164
189
  /** How tall one row is expected to render, rounded UP. */
165
190
  function messageHeight(message, hasPrev, columns, raw) {
@@ -167,7 +192,7 @@ function messageHeight(message, hasPrev, columns, raw) {
167
192
  return statusPanelLayout(message.statusRows, columns).height + 1;
168
193
  return (estimateRenderedLines(messageLines(message, hasPrev, raw), columns) +
169
194
  ROW_HEIGHT_ALLOWANCE +
170
- markdownHeightAllowance(message, raw));
195
+ markdownHeightAllowance(message, raw, columns));
171
196
  }
172
197
  /**
173
198
  * How much of the transcript stays live, given the room there is for it.
@@ -199,6 +224,28 @@ export function liveWindow(input) {
199
224
  }
200
225
  return { settled: messages.length - held, rows: height };
201
226
  }
227
+ /**
228
+ * The settled floor, held below the first row still streaming.
229
+ *
230
+ * The live window counts FINALIZED rows, and a streaming row is not one yet.
231
+ * A row written while another is still streaming — a delegated agent's launch
232
+ * receipt or completion, a notice — sits after it in the conversation but
233
+ * before it in the finalized list. Settling that row early, and then
234
+ * finalizing the streaming one, inserts a row BELOW the floor: `<Static>`,
235
+ * which prints only past its count, then prints an already-printed row a
236
+ * second time and never prints the one that moved in. So nothing after the
237
+ * first streaming row settles until it has finished.
238
+ *
239
+ * `previous` is what has already been printed; the result never goes below
240
+ * it, because a printed row cannot come back.
241
+ */
242
+ export function settledBeforeStreaming(messages, windowSettled, previous) {
243
+ const streaming = messages.findIndex((message) => message.pending);
244
+ if (streaming < 0)
245
+ return Math.max(previous, windowSettled);
246
+ const before = messages.slice(0, streaming).filter((message) => !message.pending).length;
247
+ return Math.max(previous, Math.min(windowSettled, before));
248
+ }
202
249
  /**
203
250
  * Whether the newest checklist block is still wholly on screen.
204
251
  *
@@ -1 +1 @@
1
- {"version":3,"file":"live-window.js","sourceRoot":"","sources":["../../src/tui/live-window.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"live-window.js","sourceRoot":"","sources":["../../src/tui/live-window.ts"],"names":[],"mappings":"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"}
@@ -35,13 +35,15 @@
35
35
  * quadratic parse was costing, moved rather than removed.
36
36
  *
37
37
  * Two, not one, because the block still being written is not always the last
38
- * segment. A half-typed table row is not yet a table row — `| 1 | 2` has no
39
- * closing pipe — so it scans as a paragraph of its own, and the table above it
40
- * becomes the second-to-last segment while still growing a row at a time. One
41
- * excluded segment would have cached that table once per row, at increasing
42
- * size. The line being typed can reach back exactly one segment and no further:
43
- * it can be absorbed by the block above it, and that block is maximal, so there
44
- * is nothing for it to reach past.
38
+ * segment. A line still arriving can begin as something of its own and then
39
+ * turn out to belong to the block above it — a lone `| a | b |` is a paragraph
40
+ * until the separator under it makes it a table's header — so the block above
41
+ * the last one can still change. One excluded segment would cache such a block
42
+ * once per line, at increasing size. The line being typed can reach back
43
+ * exactly one segment and no further: it can be absorbed by the block above
44
+ * it, and that block is maximal, so there is nothing for it to reach past.
45
+ * (A table's half-typed row no longer does even that: every line with a pipe
46
+ * after the separator is a row of the table, typed or not.)
45
47
  *
46
48
  * The cost of the wider exclusion is one extra parse per block over the life of
47
49
  * the message, against a saving of one per block per token.
@@ -1 +1 @@
1
- {"version":3,"file":"markdown-block-cache.d.ts","sourceRoot":"","sources":["../../src/tui/markdown-block-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AAEH,OAAO,EAAE,KAAK,OAAO,EAA0B,MAAM,qBAAqB,CAAA;AAE1E,MAAM,WAAW,UAAU;IAC1B,wEAAwE;IACxE,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,EAAE,CAAA;IAC7B,iEAAiE;IACjE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACrB;AAED,wBAAgB,gBAAgB,IAAI,UAAU,CAqB7C"}
1
+ {"version":3,"file":"markdown-block-cache.d.ts","sourceRoot":"","sources":["../../src/tui/markdown-block-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AAEH,OAAO,EAAE,KAAK,OAAO,EAA0B,MAAM,qBAAqB,CAAA;AAE1E,MAAM,WAAW,UAAU;IAC1B,wEAAwE;IACxE,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,EAAE,CAAA;IAC7B,iEAAiE;IACjE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACrB;AAED,wBAAgB,gBAAgB,IAAI,UAAU,CAqB7C"}
@@ -35,13 +35,15 @@
35
35
  * quadratic parse was costing, moved rather than removed.
36
36
  *
37
37
  * Two, not one, because the block still being written is not always the last
38
- * segment. A half-typed table row is not yet a table row — `| 1 | 2` has no
39
- * closing pipe — so it scans as a paragraph of its own, and the table above it
40
- * becomes the second-to-last segment while still growing a row at a time. One
41
- * excluded segment would have cached that table once per row, at increasing
42
- * size. The line being typed can reach back exactly one segment and no further:
43
- * it can be absorbed by the block above it, and that block is maximal, so there
44
- * is nothing for it to reach past.
38
+ * segment. A line still arriving can begin as something of its own and then
39
+ * turn out to belong to the block above it — a lone `| a | b |` is a paragraph
40
+ * until the separator under it makes it a table's header — so the block above
41
+ * the last one can still change. One excluded segment would cache such a block
42
+ * once per line, at increasing size. The line being typed can reach back
43
+ * exactly one segment and no further: it can be absorbed by the block above
44
+ * it, and that block is maximal, so there is nothing for it to reach past.
45
+ * (A table's half-typed row no longer does even that: every line with a pipe
46
+ * after the separator is a row of the table, typed or not.)
45
47
  *
46
48
  * The cost of the wider exclusion is one extra parse per block over the life of
47
49
  * the message, against a saving of one per block per token.
@@ -1 +1 @@
1
- {"version":3,"file":"markdown-block-cache.js","sourceRoot":"","sources":["../../src/tui/markdown-block-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AAEH,OAAO,EAAgB,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAS1E,MAAM,UAAU,gBAAgB;IAC/B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAmB,CAAA;IACzC,OAAO;QACN,KAAK,CAAC,GAAW;YAChB,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,CAAA;YAChC,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAA;YACnC,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE;gBAClC,qEAAqE;gBACrE,+BAA+B;gBAC/B,IAAI,CAAC,IAAI,OAAO;oBAAE,OAAO,UAAU,CAAC,OAAO,CAAC,CAAA;gBAC5C,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;gBAC/B,IAAI,GAAG;oBAAE,OAAO,GAAG,CAAA;gBACnB,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;gBAClC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;gBAC3B,OAAO,MAAM,CAAA;YACd,CAAC,CAAC,CAAA;QACH,CAAC;QACD,IAAI,IAAI;YACP,OAAO,MAAM,CAAC,IAAI,CAAA;QACnB,CAAC;KACD,CAAA;AACF,CAAC"}
1
+ {"version":3,"file":"markdown-block-cache.js","sourceRoot":"","sources":["../../src/tui/markdown-block-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDG;AAEH,OAAO,EAAgB,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAS1E,MAAM,UAAU,gBAAgB;IAC/B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAmB,CAAA;IACzC,OAAO;QACN,KAAK,CAAC,GAAW;YAChB,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,CAAA;YAChC,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAA;YACnC,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE;gBAClC,qEAAqE;gBACrE,+BAA+B;gBAC/B,IAAI,CAAC,IAAI,OAAO;oBAAE,OAAO,UAAU,CAAC,OAAO,CAAC,CAAA;gBAC5C,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;gBAC/B,IAAI,GAAG;oBAAE,OAAO,GAAG,CAAA;gBACnB,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;gBAClC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;gBAC3B,OAAO,MAAM,CAAA;YACd,CAAC,CAAC,CAAA;QACH,CAAC;QACD,IAAI,IAAI;YACP,OAAO,MAAM,CAAC,IAAI,CAAA;QACnB,CAAC;KACD,CAAA;AACF,CAAC"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * A markdown table laid out for the terminal, as the reference terminal draws
3
+ * one.
4
+ *
5
+ * ## Grid
6
+ *
7
+ * A box of one-cell-wide rule glyphs (`┌┬┐ ├┼┤ └┴┘ │ ─`), sized to the room
8
+ * there is: each column gets its widest line when everything fits, and
9
+ * otherwise at least its longest word, with the rest of the room shared in
10
+ * proportion to how much more each column wanted. A cell too long for its
11
+ * column wraps inside it, with its inline markdown — `**bold**`, `` `code` ``,
12
+ * links — drawn, not shown as source. The header is bold and centred; body
13
+ * cells take the separator row's alignment. A rule separates every row, so a
14
+ * wrapped cell cannot be read as two rows.
15
+ *
16
+ * ## Stacked
17
+ *
18
+ * Below the width where the grid can hold every column's longest word, or
19
+ * where a row would wrap to more than {@link MAX_ROW_LINES} lines, the table
20
+ * is drawn as records instead: one `Header: value` line per column, wrapped to
21
+ * the full width, records separated by a short `─` rule. A table squeezed into
22
+ * a column a few characters wide is harder to read than the same facts as a
23
+ * list.
24
+ *
25
+ * Widths are terminal cells (`string-width`), so CJK text and emoji keep the
26
+ * box straight. Pure; unit-tested. `Markdown.tsx` draws the result.
27
+ */
28
+ import { type DisplaySpan } from './markdown-wrap.js';
29
+ import type { TableAlign } from './markdownParser.js';
30
+ /** A row taller than this, in the grid, reads worse than the stacked form. */
31
+ export declare const MAX_ROW_LINES = 4;
32
+ /** A drawn span, plus the two roles only a table has. */
33
+ export interface TableSpan extends DisplaySpan {
34
+ /** Box-drawing glyphs and the stacked rule: drawn in the border colour. */
35
+ readonly border?: boolean;
36
+ /** Header text: drawn bold. */
37
+ readonly header?: boolean;
38
+ }
39
+ export type TableLine = readonly TableSpan[];
40
+ export interface TableLayout {
41
+ readonly mode: 'grid' | 'stacked';
42
+ readonly lines: readonly TableLine[];
43
+ }
44
+ export interface TableSource {
45
+ readonly headers: readonly string[];
46
+ readonly rows: readonly (readonly string[])[];
47
+ readonly align?: readonly TableAlign[];
48
+ }
49
+ /** Lay a table out in `width` terminal cells. */
50
+ export declare function layoutTable(table: TableSource, width: number, options?: {
51
+ readonly hyperlinks?: boolean;
52
+ }): TableLayout;
53
+ /** How many terminal rows a table occupies at `width`, for the live-region height estimate. */
54
+ export declare function tableHeight(table: TableSource, width: number): number;
55
+ //# sourceMappingURL=markdown-table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-table.d.ts","sourceRoot":"","sources":["../../src/tui/markdown-table.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAEN,KAAK,WAAW,EAKhB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAA;AAErD,8EAA8E;AAC9E,eAAO,MAAM,aAAa,IAAI,CAAA;AAQ9B,yDAAyD;AACzD,MAAM,WAAW,SAAU,SAAQ,WAAW;IAC7C,2EAA2E;IAC3E,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;IACzB,+BAA+B;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CACzB;AAED,MAAM,MAAM,SAAS,GAAG,SAAS,SAAS,EAAE,CAAA;AAE5C,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAA;IACjC,QAAQ,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,CAAA;CACpC;AAED,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;IACnC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAA;IAC7C,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,UAAU,EAAE,CAAA;CACtC;AAED,iDAAiD;AACjD,wBAAgB,WAAW,CAC1B,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;IAAE,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAA;CAAO,GAC7C,WAAW,CAWb;AA0JD,+FAA+F;AAC/F,wBAAgB,WAAW,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAErE"}
@@ -0,0 +1,175 @@
1
+ /**
2
+ * A markdown table laid out for the terminal, as the reference terminal draws
3
+ * one.
4
+ *
5
+ * ## Grid
6
+ *
7
+ * A box of one-cell-wide rule glyphs (`┌┬┐ ├┼┤ └┴┘ │ ─`), sized to the room
8
+ * there is: each column gets its widest line when everything fits, and
9
+ * otherwise at least its longest word, with the rest of the room shared in
10
+ * proportion to how much more each column wanted. A cell too long for its
11
+ * column wraps inside it, with its inline markdown — `**bold**`, `` `code` ``,
12
+ * links — drawn, not shown as source. The header is bold and centred; body
13
+ * cells take the separator row's alignment. A rule separates every row, so a
14
+ * wrapped cell cannot be read as two rows.
15
+ *
16
+ * ## Stacked
17
+ *
18
+ * Below the width where the grid can hold every column's longest word, or
19
+ * where a row would wrap to more than {@link MAX_ROW_LINES} lines, the table
20
+ * is drawn as records instead: one `Header: value` line per column, wrapped to
21
+ * the full width, records separated by a short `─` rule. A table squeezed into
22
+ * a column a few characters wide is harder to read than the same facts as a
23
+ * list.
24
+ *
25
+ * Widths are terminal cells (`string-width`), so CJK text and emoji keep the
26
+ * box straight. Pure; unit-tested. `Markdown.tsx` draws the result.
27
+ */
28
+ import { displayWidth, inlineDisplaySpans, longestWordWidth, wrapSpans, } from './markdown-wrap.js';
29
+ /** A row taller than this, in the grid, reads worse than the stacked form. */
30
+ export const MAX_ROW_LINES = 4;
31
+ /** The longest word a column is widened to hold whole; longer ones break inside the cell. */
32
+ const MAX_UNBROKEN_WORD = 30;
33
+ /** The rule between stacked records is at most this wide. */
34
+ const STACKED_RULE_MAX = 40;
35
+ /** Lay a table out in `width` terminal cells. */
36
+ export function layoutTable(table, width, options = {}) {
37
+ const hyperlinks = options.hyperlinks === true;
38
+ const columns = Math.max(1, table.headers.length);
39
+ const headers = Array.from({ length: columns }, (_, c) => inlineDisplaySpans(table.headers[c] ?? '', hyperlinks).map((s) => ({ ...s, bold: true })));
40
+ const rows = table.rows.map((row) => Array.from({ length: columns }, (_, c) => inlineDisplaySpans(row[c] ?? '', hyperlinks)));
41
+ const grid = gridLayout(headers, rows, table.align, width);
42
+ return grid ?? { mode: 'stacked', lines: stackedLines(headers, rows, width) };
43
+ }
44
+ function gridLayout(headers, rows, align, width) {
45
+ const columns = headers.length;
46
+ // `│ a │ b │`: a rule before every column and after the last, and one
47
+ // space of padding each side of every cell.
48
+ const room = width - (3 * columns + 1);
49
+ if (room < columns * 3)
50
+ return undefined;
51
+ const all = [headers, ...rows];
52
+ const want = Array.from({ length: columns }, (_, c) => Math.max(1, ...all.map((row) => displayWidth(row[c] ?? []))));
53
+ // A word longer than this — a URL, a path — is broken inside its cell
54
+ // rather than allowed to push the whole table into the stacked form.
55
+ const least = Array.from({ length: columns }, (_, c) => Math.min(MAX_UNBROKEN_WORD, Math.max(1, ...all.map((row) => longestWordWidth(row[c] ?? [])))));
56
+ const widths = columnWidths(want, least, room);
57
+ if (!widths)
58
+ return undefined;
59
+ const wrapRow = (row) => widths.map((w, c) => wrapSpans(row[c] ?? [], w));
60
+ const body = rows.map(wrapRow);
61
+ if (body.some((cells) => Math.max(...cells.map((lines) => lines.length)) > MAX_ROW_LINES))
62
+ return undefined;
63
+ const rule = (left, middle, right) => [
64
+ { text: `${left}${widths.map((w) => '─'.repeat(w + 2)).join(middle)}${right}`, border: true },
65
+ ];
66
+ const lines = [rule('┌', '┬', '┐')];
67
+ lines.push(...drawRow(wrapRow(headers), widths, () => 'center', true));
68
+ for (const cells of body) {
69
+ lines.push(rule('├', '┼', '┤'));
70
+ lines.push(...drawRow(cells, widths, (c) => align?.[c] ?? 'left', false));
71
+ }
72
+ lines.push(rule('└', '┴', '┘'));
73
+ return { mode: 'grid', lines };
74
+ }
75
+ /**
76
+ * Column widths that fit `room`, or `undefined` when even every column's
77
+ * longest word does not.
78
+ *
79
+ * Columns that want no more than an even share get what they want, first —
80
+ * a short label column is never wrapped to make room for a long one that
81
+ * would wrap anyway. The columns left share what remains: each gets its
82
+ * longest word, and the spare is divided in proportion to how much more each
83
+ * wanted.
84
+ */
85
+ function columnWidths(want, least, room) {
86
+ if (want.reduce((a, b) => a + b, 0) <= room)
87
+ return [...want];
88
+ const widths = want.map(() => 0);
89
+ let open = want.map((_, c) => c);
90
+ let remaining = room;
91
+ for (;;) {
92
+ const share = Math.floor(remaining / Math.max(1, open.length));
93
+ const settled = open.filter((c) => (want[c] ?? 0) <= share);
94
+ if (settled.length === 0 || settled.length === open.length)
95
+ break;
96
+ for (const c of settled) {
97
+ widths[c] = want[c] ?? 0;
98
+ remaining -= want[c] ?? 0;
99
+ }
100
+ open = open.filter((c) => !settled.includes(c));
101
+ }
102
+ const floor = open.map((c) => Math.min(least[c] ?? 1, want[c] ?? 1));
103
+ const floorTotal = floor.reduce((a, b) => a + b, 0);
104
+ if (floorTotal > remaining)
105
+ return undefined;
106
+ const spare = remaining - floorTotal;
107
+ const extra = open.map((c, i) => (want[c] ?? 0) - (floor[i] ?? 0));
108
+ const extraTotal = extra.reduce((a, b) => a + b, 0);
109
+ open.forEach((c, i) => {
110
+ widths[c] =
111
+ (floor[i] ?? 0) + (extraTotal === 0 ? 0 : Math.floor((spare * (extra[i] ?? 0)) / extraTotal));
112
+ });
113
+ // Hand out what rounding left, one cell at a time, to the columns that
114
+ // still want the most.
115
+ let left = room - widths.reduce((a, b) => a + b, 0);
116
+ while (left > 0) {
117
+ let best = -1;
118
+ for (let c = 0; c < widths.length; c++) {
119
+ const short = (want[c] ?? 0) - (widths[c] ?? 0);
120
+ if (short > 0 && (best < 0 || short > (want[best] ?? 0) - (widths[best] ?? 0)))
121
+ best = c;
122
+ }
123
+ if (best < 0)
124
+ break;
125
+ widths[best] = (widths[best] ?? 0) + 1;
126
+ left -= 1;
127
+ }
128
+ return widths;
129
+ }
130
+ function drawRow(cells, widths, alignOf, header) {
131
+ const height = Math.max(1, ...cells.map((lines) => lines.length));
132
+ const out = [];
133
+ for (let r = 0; r < height; r++) {
134
+ const line = [{ text: '│', border: true }];
135
+ cells.forEach((lines, c) => {
136
+ const content = lines[r] ?? [];
137
+ const w = widths[c] ?? 0;
138
+ const gap = Math.max(0, w - displayWidth(content));
139
+ const align = alignOf(c);
140
+ const before = align === 'right' ? gap : align === 'center' ? Math.floor(gap / 2) : 0;
141
+ line.push({ text: ` ${' '.repeat(before)}` });
142
+ for (const span of content)
143
+ line.push(header ? { ...span, header: true } : span);
144
+ line.push({ text: `${' '.repeat(gap - before)} ` });
145
+ line.push({ text: '│', border: true });
146
+ });
147
+ out.push(line);
148
+ }
149
+ return out;
150
+ }
151
+ function stackedLines(headers, rows, width) {
152
+ const lines = [];
153
+ const rule = [
154
+ { text: '─'.repeat(Math.max(1, Math.min(width, STACKED_RULE_MAX))), border: true },
155
+ ];
156
+ rows.forEach((row, r) => {
157
+ if (r > 0)
158
+ lines.push(rule);
159
+ headers.forEach((header, c) => {
160
+ const label = [
161
+ ...header.map((s) => ({ ...s, bold: true })),
162
+ { text: ': ', bold: true },
163
+ ];
164
+ lines.push(...wrapSpans([...label, ...(row[c] ?? [])], width));
165
+ });
166
+ });
167
+ if (rows.length === 0)
168
+ lines.push(...wrapSpans(headers.flatMap((h, c) => (c > 0 ? [{ text: ' · ' }, ...h] : h)), width));
169
+ return lines;
170
+ }
171
+ /** How many terminal rows a table occupies at `width`, for the live-region height estimate. */
172
+ export function tableHeight(table, width) {
173
+ return layoutTable(table, width).lines.length;
174
+ }
175
+ //# sourceMappingURL=markdown-table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-table.js","sourceRoot":"","sources":["../../src/tui/markdown-table.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Word wrapping for styled inline text, measured in terminal cells.
3
+ *
4
+ * ## Why the transcript wraps its own prose
5
+ *
6
+ * Ink wraps a `<Text>` with `wrap-ansi` and `trim: false`. When a word ends
7
+ * exactly at the right edge, the space after it becomes the first character of
8
+ * the next row, so a wrapped paragraph showed a ragged one-column indent on
9
+ * some of its rows (` Cevabı …` under ` …araştır.`), and a word exactly as
10
+ * wide as the row left a row holding nothing but that space. Text wrapped here
11
+ * breaks at the space and drops it, so every row starts in the column the first
12
+ * one did; Ink then sees rows that already fit and leaves them alone.
13
+ *
14
+ * A table cell needs the same thing with a narrower width, which is the other
15
+ * reason this exists: a cell is wrapped to its column, inline styles and all.
16
+ *
17
+ * ## Width
18
+ *
19
+ * Every grapheme is measured with `string-width`, the measure Ink itself lays
20
+ * out with, so a CJK character or an emoji is two cells and a combining mark
21
+ * rides on the letter before it. A word wider than the row is broken between
22
+ * graphemes, never inside one: a URL longer than the terminal continues on the
23
+ * next row rather than being cut at the edge.
24
+ *
25
+ * Pure; unit-tested.
26
+ */
27
+ import { type InlineSpan } from './markdownParser.js';
28
+ /** An inline span as it is drawn: a link's trailing ` (url)` is its own muted span. */
29
+ export interface DisplaySpan extends InlineSpan {
30
+ /** Dim secondary text, such as the address after a link's label. */
31
+ readonly muted?: boolean;
32
+ }
33
+ export type DisplayLine = readonly DisplaySpan[];
34
+ /**
35
+ * Inline markdown as the spans it is drawn with. A link's address follows its
36
+ * label, dim, unless the terminal will draw the label as the link itself — the
37
+ * address is text on the row, so it has to be measured with the row.
38
+ */
39
+ export declare function inlineDisplaySpans(source: string, hyperlinks: boolean): DisplaySpan[];
40
+ /** Terminal cells a run of spans occupies on one row. */
41
+ export declare function displayWidth(spans: readonly DisplaySpan[]): number;
42
+ /** The widest single word, in cells: the narrowest a column can be without breaking one. */
43
+ export declare function longestWordWidth(spans: readonly DisplaySpan[]): number;
44
+ /**
45
+ * Split styled text into rows no wider than `width` cells.
46
+ *
47
+ * Breaks at whitespace, dropping the space it breaks at; a `\n` always breaks,
48
+ * and the indentation at the start of a source line is kept. A word that does
49
+ * not fit on a row of its own is broken between graphemes. Always returns at
50
+ * least one row, possibly empty.
51
+ */
52
+ export declare function wrapSpans(spans: readonly DisplaySpan[], width: number): DisplayLine[];
53
+ //# sourceMappingURL=markdown-wrap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-wrap.d.ts","sourceRoot":"","sources":["../../src/tui/markdown-wrap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAIH,OAAO,EAAE,KAAK,UAAU,EAAe,MAAM,qBAAqB,CAAA;AAGlE,uFAAuF;AACvF,MAAM,WAAW,WAAY,SAAQ,UAAU;IAC9C,oEAAoE;IACpE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CACxB;AAED,MAAM,MAAM,WAAW,GAAG,SAAS,WAAW,EAAE,CAAA;AAEhD;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,WAAW,EAAE,CAWrF;AAkCD,yDAAyD;AACzD,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,GAAG,MAAM,CAIlE;AAED,4FAA4F;AAC5F,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,GAAG,MAAM,CAWtE;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW,EAAE,CAkFrF"}