@pentoshi/clai 3.11.4 → 3.11.6

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 (43) hide show
  1. package/dist/agent/runner.js +9 -6
  2. package/dist/agent/runner.js.map +1 -1
  3. package/dist/agent/tool-history.d.ts +6 -3
  4. package/dist/agent/tool-history.js +90 -11
  5. package/dist/agent/tool-history.js.map +1 -1
  6. package/dist/modes/ask.js +14 -11
  7. package/dist/modes/ask.js.map +1 -1
  8. package/dist/tui-v2/bootstrap/capabilities.d.ts +1 -0
  9. package/dist/tui-v2/bootstrap/capabilities.js +1 -1
  10. package/dist/tui-v2/bootstrap/capabilities.js.map +1 -1
  11. package/dist/tui-v2/components/pager/pager-line.js +7 -4
  12. package/dist/tui-v2/components/pager/pager-line.js.map +1 -1
  13. package/dist/tui-v2/components/pager/pager.js +2 -2
  14. package/dist/tui-v2/components/pager/pager.js.map +1 -1
  15. package/dist/tui-v2/components/transcript/assistant-message.js +5 -3
  16. package/dist/tui-v2/components/transcript/assistant-message.js.map +1 -1
  17. package/dist/tui-v2/components/transcript/file-diff-card.js +3 -0
  18. package/dist/tui-v2/components/transcript/file-diff-card.js.map +1 -1
  19. package/dist/tui-v2/components/transcript/selectable-line.d.ts +13 -0
  20. package/dist/tui-v2/components/transcript/selectable-line.js +11 -0
  21. package/dist/tui-v2/components/transcript/selectable-line.js.map +1 -1
  22. package/dist/tui-v2/components/transcript/thinking-block.js +7 -4
  23. package/dist/tui-v2/components/transcript/thinking-block.js.map +1 -1
  24. package/dist/tui-v2/components/transcript/tool-card.js +3 -3
  25. package/dist/tui-v2/components/transcript/tool-card.js.map +1 -1
  26. package/dist/tui-v2/rendering/pager-chrome.d.ts +14 -3
  27. package/dist/tui-v2/rendering/pager-chrome.js +86 -23
  28. package/dist/tui-v2/rendering/pager-chrome.js.map +1 -1
  29. package/dist/tui-v2/rendering/pager-markdown.js +5 -0
  30. package/dist/tui-v2/rendering/pager-markdown.js.map +1 -1
  31. package/dist/tui-v2/rendering/streaming-markdown.js +11 -2
  32. package/dist/tui-v2/rendering/streaming-markdown.js.map +1 -1
  33. package/dist/ui/code-block.d.ts +48 -0
  34. package/dist/ui/code-block.js +407 -0
  35. package/dist/ui/code-block.js.map +1 -0
  36. package/dist/ui/markdown.js +91 -54
  37. package/dist/ui/markdown.js.map +1 -1
  38. package/dist/ui/text-width.d.ts +27 -0
  39. package/dist/ui/text-width.js +36 -0
  40. package/dist/ui/text-width.js.map +1 -0
  41. package/dist/version.generated.d.ts +2 -2
  42. package/dist/version.generated.js +2 -2
  43. package/package.json +12 -12
@@ -20,6 +20,11 @@ export function stripPagerLineGutters(body) {
20
20
  return body
21
21
  .split("\n")
22
22
  .map((line) => {
23
+ // formatModalPlainText writes blank rows as a bare gutter (` │`,
24
+ // no trailing space). Without this the pipe survives into format mode
25
+ // and paints as a stray vertical bar under the header.
26
+ if (/^[\d ]{0,8} │\s*$/.test(line))
27
+ return "";
23
28
  // formatModalPlainText: `<lineno> │ [+/-/ ]body`
24
29
  const withMark = /^(?:[\d ]{0,8}) │ ([+\-−] )?(.*)$/.exec(line);
25
30
  if (withMark) {
@@ -1 +1 @@
1
- {"version":3,"file":"pager-markdown.js","sourceRoot":"","sources":["../../../src/tui-v2/rendering/pager-markdown.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAyB5D;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,OAAO,IAAI;SACR,KAAK,CAAC,IAAI,CAAC;SACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;QACZ,iDAAiD;QACjD,MAAM,QAAQ,GAAG,mCAAmC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChE,IAAI,QAAQ,EAAE,CAAC;YACb,iEAAiE;YACjE,OAAO,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3B,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAW;IAC/C,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IACpB,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACrD,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,wBAAwB;QACxB,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAAE,SAAS;QACjD,IAAI,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAS;QACtD,IAAI,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAS;QACnD,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAS;QACxC,iDAAiD;QACjD,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAS;QAC5C,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAS;QAC1C,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAS;QACvC,IAAI,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAS;QACjD,IAAI,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAS;QACnD,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAS;QACvC,oDAAoD;QACpD,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,GAAG,EAAE,CAAC;YACR,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACxB,SAAS;QACX,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACjE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,KAAK,IAAI,CAAC,CAAC;IAC3C,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,KAAK,IAAI,CAAC,CAAC;IAC7C,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,KAAK,IAAI,CAAC,CAAC;IACvE,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,KAAK,IAAI,CAAC,CAAC;IACtC,6DAA6D;IAC7D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IACjD,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC;QAAE,KAAK,IAAI,CAAC,CAAC;IACzC,IAAI,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACtE,KAAK,IAAI,CAAC,CAAC;IACb,CAAC;IACD,+CAA+C;IAC/C,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,KAAK,IAAI,CAAC,CAAC;IACtE,OAAO,KAAK,IAAI,CAAC,CAAC;AACpB,CAAC;AAED,SAAS,UAAU,CAAC,IAAY;IAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACrC,IAAI,CAAC,GAAG;QAAE,OAAO,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;IAClC,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;AACpF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAAmC;IAEnC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC;IACpC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;IAChC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAE1C,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;IACpD,CAAC;IAED,MAAM,YAAY,GAChB,IAAI,KAAK,OAAO,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;IAEnE,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;IACpD,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,EAAE;YACvC,KAAK;YACL,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,gBAAgB,EAAE,IAAI;SACvB,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACpD,CAAC;QACD,MAAM,KAAK,GAAuB,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;YAClD,yEAAyE;YACzE,uEAAuE;YACvE,MAAM,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACrD,MAAM,KAAK,GAAG,mBAAmB,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC;YACjD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QAC/B,CAAC,CAAC,CAAC;QACH,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,4CAA4C;QAC5C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;IACpD,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"pager-markdown.js","sourceRoot":"","sources":["../../../src/tui-v2/rendering/pager-markdown.ts"],"names":[],"mappings":"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"}
@@ -3,14 +3,23 @@
3
3
  // and O(n^2) per reply. Completed blocks are rendered once, cached, and only the
4
4
  // streaming tail is re-rendered. Finalized rows always use a single one-shot
5
5
  // render so goldens stay exact.
6
+ import { isCodeFenceClose, matchCodeFenceOpen, } from "../../ui/code-block.js";
6
7
  import { renderMarkdownLines, } from "./render-markdown-lines.js";
7
8
  // A tail block that could still be re-numbered or re-aligned by the block above
8
9
  // it (lists, tables, quotes, indented code) is never split from that block.
9
10
  const BLOCK_CONTINUATION = /^(?:[ \t]*(?:[-*+][ \t]|\d+[.)][ \t]|\||>)|[ \t]{4,}\S)/;
10
11
  const MIN_STABLE_CHARS = 512;
11
12
  function fencesBalanced(text) {
12
- const matches = text.match(/^[ \t]*```/gm);
13
- return (matches?.length ?? 0) % 2 === 0;
13
+ let marker;
14
+ for (const line of text.split("\n")) {
15
+ if (marker) {
16
+ if (isCodeFenceClose(line, marker))
17
+ marker = undefined;
18
+ continue;
19
+ }
20
+ marker = matchCodeFenceOpen(line)?.marker;
21
+ }
22
+ return marker === undefined;
14
23
  }
15
24
  // Split at the latest blank line that is a true block boundary.
16
25
  export function stableMarkdownSplit(text, minStableChars = MIN_STABLE_CHARS) {
@@ -1 +1 @@
1
- {"version":3,"file":"streaming-markdown.js","sourceRoot":"","sources":["../../../src/tui-v2/rendering/streaming-markdown.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"streaming-markdown.js","sourceRoot":"","sources":["../../../src/tui-v2/rendering/streaming-markdown.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Fenced code block presentation for chat + pager markdown.
3
+ *
4
+ * Renders a bordered panel with a language label, real syntax colors, exact
5
+ * source indentation, and column-accurate soft wrapping (no ellipsis, no
6
+ * dropped characters, wide glyphs never straddle the right border).
7
+ */
8
+ import { type HighlightCarry } from "../tui-v2/rendering/syntax-highlight.js";
9
+ /** Columns consumed by `│ ` + body + ` │`. */
10
+ export declare const CODE_BLOCK_CHROME = 4;
11
+ export interface CodeFenceState {
12
+ /** Opening run of backticks or tildes — only a matching run closes it. */
13
+ readonly marker: string;
14
+ /** Language name or file path shown in the panel header. */
15
+ readonly label: string;
16
+ /** Synthetic path handed to the highlighter to resolve the language. */
17
+ readonly langPath: string;
18
+ readonly carry: HighlightCarry;
19
+ /** Blank rows held back so trailing padding never reaches the footer. */
20
+ pendingBlanks: number;
21
+ }
22
+ /** Match an opening fence and capture its marker + info string. */
23
+ export declare function matchCodeFenceOpen(line: string): {
24
+ marker: string;
25
+ info: string;
26
+ } | undefined;
27
+ /** A fence closes on a bare run of the same character, at least as long. */
28
+ export declare function isCodeFenceClose(line: string, marker: string): boolean;
29
+ export declare function openCodeFence(marker: string, info: string): CodeFenceState;
30
+ /** Clamp the panel to the wrap budget so it never overflows the pane. */
31
+ export declare function codeBlockWidth(wrapWidth: number): number;
32
+ /** Drop blank lines at the block edges so the panel hugs its code. */
33
+ export declare function trimCodeBlockBody(lines: readonly string[]): string[];
34
+ /**
35
+ * Panel width that fits the widest code line, so a one-line snippet is not
36
+ * stretched across the whole pane. Falls back to `available` when the code is
37
+ * wider than the pane, which is when wrapping takes over.
38
+ */
39
+ export declare function codeBlockFitWidth(lines: readonly string[], label: string, available: number): number;
40
+ export declare function codeBlockTop(label: string, width: number): string;
41
+ export declare function codeBlockBottom(width: number): string;
42
+ /** Pad a painted body to the panel's inner width and add both borders. */
43
+ export declare function codeBlockRow(body: string, bodyWidth: number, width: number): string;
44
+ /**
45
+ * Render one source line as complete panel rows. Blank lines are buffered so a
46
+ * block that ends with padding does not push empty rows against the footer.
47
+ */
48
+ export declare function codeBlockRows(source: string, fence: CodeFenceState, width: number): string[];
@@ -0,0 +1,407 @@
1
+ /**
2
+ * Fenced code block presentation for chat + pager markdown.
3
+ *
4
+ * Renders a bordered panel with a language label, real syntax colors, exact
5
+ * source indentation, and column-accurate soft wrapping (no ellipsis, no
6
+ * dropped characters, wide glyphs never straddle the right border).
7
+ */
8
+ import chalk from "chalk";
9
+ import { renderColumns } from "./text-width.js";
10
+ import { detectThemeHint } from "../tui-v2/bootstrap/capabilities.js";
11
+ import { themeFor } from "../tui-v2/rendering/theme.js";
12
+ import { emptyCarry, highlightLineForPath, } from "../tui-v2/rendering/syntax-highlight.js";
13
+ /** Columns consumed by `│ ` + body + ` │`. */
14
+ export const CODE_BLOCK_CHROME = 4;
15
+ const TAB_WIDTH = 2;
16
+ const HANGING_INDENT = 2;
17
+ /** Narrowest code body worth rendering — the panel is sized to protect it. */
18
+ const MIN_BODY = 8;
19
+ const MIN_WIDTH = CODE_BLOCK_CHROME + MIN_BODY;
20
+ const MAX_WIDTH = 120;
21
+ /** Only honour a soft break past this fraction of the row budget. */
22
+ const SOFT_BREAK_FLOOR = 0.5;
23
+ const GRAPHEME_SEGMENTER = new Intl.Segmenter(undefined, {
24
+ granularity: "grapheme",
25
+ });
26
+ /**
27
+ * Colors resolve from the shared theme tokens — the same syntax palette the
28
+ * diff cards use — against the terminal's light/dark hint, so a light terminal
29
+ * is never handed dark-tuned code colors.
30
+ */
31
+ function buildPalette() {
32
+ const theme = themeFor(detectThemeHint(process.env));
33
+ return {
34
+ border: chalk.hex(theme.diffGutter),
35
+ label: chalk.hex(theme.muted),
36
+ syntax: {
37
+ plain: chalk.hex(theme.foreground),
38
+ keyword: chalk.hex(theme.synKeyword),
39
+ string: chalk.hex(theme.synString),
40
+ comment: chalk.hex(theme.synComment),
41
+ number: chalk.hex(theme.synNumber),
42
+ function: chalk.hex(theme.synFunction),
43
+ type: chalk.hex(theme.synType),
44
+ property: chalk.hex(theme.synProperty),
45
+ operator: chalk.hex(theme.synOperator),
46
+ punctuation: chalk.hex(theme.muted),
47
+ regex: chalk.hex(theme.synRegex),
48
+ },
49
+ };
50
+ }
51
+ let resolvedPalette;
52
+ function palette() {
53
+ resolvedPalette ??= buildPalette();
54
+ return resolvedPalette;
55
+ }
56
+ /** Fence info strings that are not already file extensions. */
57
+ const INFO_EXTENSION = {
58
+ typescript: "ts",
59
+ javascript: "js",
60
+ node: "js",
61
+ nodejs: "js",
62
+ react: "jsx",
63
+ python: "py",
64
+ python3: "py",
65
+ ipython: "py",
66
+ shell: "sh",
67
+ shellsession: "sh",
68
+ console: "sh",
69
+ terminal: "sh",
70
+ golang: "go",
71
+ rust: "rs",
72
+ ruby: "rb",
73
+ kotlin: "kt",
74
+ csharp: "cs",
75
+ "c#": "cs",
76
+ "c++": "cpp",
77
+ cplusplus: "cpp",
78
+ objc: "m",
79
+ "objective-c": "m",
80
+ haskell: "hs",
81
+ elixir: "ex",
82
+ erlang: "erl",
83
+ clojure: "clj",
84
+ scheme: "scm",
85
+ julia: "jl",
86
+ docker: "dockerfile",
87
+ make: "makefile",
88
+ terraform: "tf",
89
+ protobuf: "proto",
90
+ postgres: "sql",
91
+ postgresql: "sql",
92
+ plpgsql: "sql",
93
+ sqlite: "sql",
94
+ powershell: "ps1",
95
+ batch: "bat",
96
+ vim: "txt",
97
+ tex: "txt",
98
+ latex: "txt",
99
+ plaintext: "txt",
100
+ plain: "txt",
101
+ text: "txt",
102
+ output: "txt",
103
+ none: "txt",
104
+ };
105
+ /** Short fence tags shown under their full language name. */
106
+ const INFO_LABEL = {
107
+ ts: "typescript",
108
+ js: "javascript",
109
+ py: "python",
110
+ rb: "ruby",
111
+ rs: "rust",
112
+ kt: "kotlin",
113
+ cs: "c#",
114
+ cpp: "c++",
115
+ sh: "shell",
116
+ yml: "yaml",
117
+ md: "markdown",
118
+ ps1: "powershell",
119
+ ex: "elixir",
120
+ hs: "haskell",
121
+ jl: "julia",
122
+ clj: "clojure",
123
+ tf: "terraform",
124
+ };
125
+ const FENCE_OPEN_RE = /^\s*(`{3,}|~{3,})[ \t]*(.*)$/;
126
+ /** Match an opening fence and capture its marker + info string. */
127
+ export function matchCodeFenceOpen(line) {
128
+ const match = FENCE_OPEN_RE.exec(line);
129
+ if (!match)
130
+ return undefined;
131
+ return { marker: match[1], info: (match[2] ?? "").trim() };
132
+ }
133
+ /** A fence closes on a bare run of the same character, at least as long. */
134
+ export function isCodeFenceClose(line, marker) {
135
+ const match = /^\s*(`{3,}|~{3,})\s*$/.exec(line);
136
+ if (!match)
137
+ return false;
138
+ const run = match[1];
139
+ return run[0] === marker[0] && run.length >= marker.length;
140
+ }
141
+ function looksLikePath(info) {
142
+ if (info.includes("/") || info.includes("\\"))
143
+ return true;
144
+ return /^[\w.-]+\.[A-Za-z][\w]*$/.test(info) && !info.startsWith(".");
145
+ }
146
+ export function openCodeFence(marker, info) {
147
+ // Info strings carry attributes models pick up from docs: `ts {1,3}`,
148
+ // `py title="x"`. Only the first token identifies the language.
149
+ const token = (info.split(/[\s,;]+/)[0] ?? "").replace(/^[{"']|["']$/g, "");
150
+ const tag = token.toLowerCase();
151
+ if (looksLikePath(token)) {
152
+ return { marker, label: token, langPath: token, carry: emptyCarry(), pendingBlanks: 0 };
153
+ }
154
+ const extension = INFO_EXTENSION[tag] ?? tag;
155
+ return {
156
+ marker,
157
+ label: INFO_LABEL[tag] ?? (tag || "code"),
158
+ langPath: extension ? `code.${extension}` : "code.txt",
159
+ carry: emptyCarry(),
160
+ pendingBlanks: 0,
161
+ };
162
+ }
163
+ /** Clamp the panel to the wrap budget so it never overflows the pane. */
164
+ export function codeBlockWidth(wrapWidth) {
165
+ return Math.max(MIN_WIDTH, Math.min(Math.floor(wrapWidth), MAX_WIDTH));
166
+ }
167
+ /** Drop blank lines at the block edges so the panel hugs its code. */
168
+ export function trimCodeBlockBody(lines) {
169
+ let start = 0;
170
+ let end = lines.length;
171
+ while (start < end && lines[start].trim().length === 0)
172
+ start += 1;
173
+ while (end > start && lines[end - 1].trim().length === 0)
174
+ end -= 1;
175
+ return lines.slice(start, end);
176
+ }
177
+ /**
178
+ * Panel width that fits the widest code line, so a one-line snippet is not
179
+ * stretched across the whole pane. Falls back to `available` when the code is
180
+ * wider than the pane, which is when wrapping takes over.
181
+ */
182
+ export function codeBlockFitWidth(lines, label, available) {
183
+ let widest = 0;
184
+ for (const line of lines) {
185
+ const width = renderColumns(expandTabs(line.replace(/\s+$/, "")));
186
+ if (width > widest)
187
+ widest = width;
188
+ }
189
+ // `╭─ label ─╮` needs the label plus six columns of chrome.
190
+ const labelNeeds = label ? renderColumns(label) + 6 : 0;
191
+ const wanted = Math.max(widest + CODE_BLOCK_CHROME, labelNeeds);
192
+ return codeBlockWidth(Math.min(codeBlockWidth(available), wanted));
193
+ }
194
+ function rule(count) {
195
+ return "─".repeat(Math.max(0, count));
196
+ }
197
+ function truncateLabel(label, maxWidth) {
198
+ if (maxWidth < 1)
199
+ return "";
200
+ let text = "";
201
+ let width = 0;
202
+ for (const cluster of graphemes(label)) {
203
+ const clusterWidth = renderColumns(cluster);
204
+ if (width + clusterWidth > maxWidth)
205
+ break;
206
+ text += cluster;
207
+ width += clusterWidth;
208
+ }
209
+ return text;
210
+ }
211
+ export function codeBlockTop(label, width) {
212
+ const { border, label: paintLabel } = palette();
213
+ const span = codeBlockWidth(width) - 2;
214
+ const room = span - 4;
215
+ const labelWidth = renderColumns(label);
216
+ const text = room < 1
217
+ ? ""
218
+ : labelWidth <= room
219
+ ? label
220
+ : `${truncateLabel(label, room - 1)}…`;
221
+ if (!text)
222
+ return border(`╭${rule(span)}╮`);
223
+ return (border("╭─") +
224
+ paintLabel(` ${text} `) +
225
+ border(`${rule(span - 3 - renderColumns(text))}╮`));
226
+ }
227
+ export function codeBlockBottom(width) {
228
+ return palette().border(`╰${rule(codeBlockWidth(width) - 2)}╯`);
229
+ }
230
+ /** Pad a painted body to the panel's inner width and add both borders. */
231
+ export function codeBlockRow(body, bodyWidth, width) {
232
+ const { border } = palette();
233
+ const inner = codeBlockWidth(width) - CODE_BLOCK_CHROME;
234
+ const pad = " ".repeat(Math.max(0, inner - bodyWidth));
235
+ return `${border("│")} ${body}${pad} ${border("│")}`;
236
+ }
237
+ function graphemes(text) {
238
+ return Array.from(GRAPHEME_SEGMENTER.segment(text), ({ segment }) => segment);
239
+ }
240
+ function expandTabs(line) {
241
+ if (!line.includes("\t"))
242
+ return line;
243
+ let out = "";
244
+ let col = 0;
245
+ for (const ch of graphemes(line)) {
246
+ if (ch === "\t") {
247
+ const gap = TAB_WIDTH - (col % TAB_WIDTH);
248
+ out += " ".repeat(gap);
249
+ col += gap;
250
+ continue;
251
+ }
252
+ out += ch;
253
+ col += renderColumns(ch);
254
+ }
255
+ return out;
256
+ }
257
+ function toCells(spans) {
258
+ const text = spans.map((span) => span.text).join("");
259
+ const kinds = [];
260
+ for (const span of spans) {
261
+ for (let i = 0; i < span.text.length; i += 1)
262
+ kinds.push(span.kind);
263
+ }
264
+ const cells = [];
265
+ for (const { segment, index } of GRAPHEME_SEGMENTER.segment(text)) {
266
+ cells.push({
267
+ ch: segment,
268
+ kind: kinds[index] ?? "plain",
269
+ w: renderColumns(segment),
270
+ });
271
+ }
272
+ return cells;
273
+ }
274
+ /** Break after separators so wrapped code splits at token edges when it can. */
275
+ function breaksAfter(ch) {
276
+ return ch === " " || ",;)]}>".includes(ch);
277
+ }
278
+ /**
279
+ * Split one highlighted source line into rows that fit its column budget.
280
+ * Breaks at a token edge when one falls in the back half of the row, otherwise
281
+ * hard-breaks. Separator cells remain in the output so wrapping never changes
282
+ * meaningful code whitespace. Always consumes at least one cell so a glyph
283
+ * wider than the budget cannot stall the loop.
284
+ */
285
+ function sliceRows(cells, firstBudget, restBudget) {
286
+ const rows = [];
287
+ let start = 0;
288
+ while (start < cells.length) {
289
+ const budget = Math.max(1, rows.length === 0 ? firstBudget : restBudget);
290
+ const floor = budget * SOFT_BREAK_FLOOR;
291
+ let used = 0;
292
+ let end = start;
293
+ let soft = -1;
294
+ while (end < cells.length && used + cells[end].w <= budget) {
295
+ used += cells[end].w;
296
+ end += 1;
297
+ if (used >= floor && breaksAfter(cells[end - 1].ch))
298
+ soft = end;
299
+ }
300
+ if (end >= cells.length) {
301
+ rows.push(cells.slice(start));
302
+ return rows;
303
+ }
304
+ const cut = soft > start ? soft : Math.max(end, start + 1);
305
+ rows.push(cells.slice(start, cut));
306
+ start = cut;
307
+ }
308
+ return rows.length > 0 ? rows : [[]];
309
+ }
310
+ function paint(cells) {
311
+ const { syntax } = palette();
312
+ let text = "";
313
+ let width = 0;
314
+ let run = "";
315
+ let kind = "plain";
316
+ for (const cell of cells) {
317
+ if (cell.kind !== kind) {
318
+ if (run)
319
+ text += syntax[kind](run);
320
+ run = "";
321
+ kind = cell.kind;
322
+ }
323
+ run += cell.ch;
324
+ width += cell.w;
325
+ }
326
+ if (run)
327
+ text += syntax[kind](run);
328
+ return { text, width };
329
+ }
330
+ function leadingSpaces(line) {
331
+ const match = /^ */.exec(line);
332
+ return match ? match[0].length : 0;
333
+ }
334
+ /**
335
+ * Streaming re-renders the whole open fence on every frame, so highlighting +
336
+ * wrapping one source line is memoised on its language, width, and inbound
337
+ * carry. The carry after the line is replayed on a hit so multi-line strings
338
+ * and block comments still chain correctly.
339
+ */
340
+ const ROW_CACHE = new Map();
341
+ const ROW_CACHE_MAX = 4096;
342
+ function carryKey(carry) {
343
+ return `${carry.inBlockComment ? 1 : 0}${carry.inTripleString ? 1 : 0}${carry.tripleQuote ?? ""}`;
344
+ }
345
+ function snapshotCarry(carry) {
346
+ return {
347
+ inBlockComment: carry.inBlockComment,
348
+ inTripleString: carry.inTripleString,
349
+ tripleQuote: carry.tripleQuote,
350
+ };
351
+ }
352
+ function restoreCarry(target, source) {
353
+ target.inBlockComment = source.inBlockComment;
354
+ target.inTripleString = source.inTripleString;
355
+ target.tripleQuote = source.tripleQuote;
356
+ }
357
+ function cacheRows(key, rows, carry) {
358
+ if (ROW_CACHE.size >= ROW_CACHE_MAX) {
359
+ const oldest = ROW_CACHE.keys().next();
360
+ if (!oldest.done)
361
+ ROW_CACHE.delete(oldest.value);
362
+ }
363
+ ROW_CACHE.set(key, { rows, carry: snapshotCarry(carry) });
364
+ }
365
+ /**
366
+ * Render one source line as complete panel rows. Blank lines are buffered so a
367
+ * block that ends with padding does not push empty rows against the footer.
368
+ */
369
+ export function codeBlockRows(source, fence, width) {
370
+ const panel = codeBlockWidth(width);
371
+ const inner = panel - CODE_BLOCK_CHROME;
372
+ const line = expandTabs(source.replace(/\s+$/, ""));
373
+ // Leading blanks are dropped outright; interior ones survive as padding once
374
+ // a following content row proves they were not trailing.
375
+ if (line.length === 0) {
376
+ fence.pendingBlanks += 1;
377
+ return [];
378
+ }
379
+ const rows = [];
380
+ for (let i = 0; i < fence.pendingBlanks; i += 1) {
381
+ rows.push(codeBlockRow("", 0, panel));
382
+ }
383
+ fence.pendingBlanks = 0;
384
+ const key = `${panel}\u0000${fence.langPath}\u0000${carryKey(fence.carry)}\u0000${line}`;
385
+ const cached = ROW_CACHE.get(key);
386
+ if (cached) {
387
+ restoreCarry(fence.carry, cached.carry);
388
+ rows.push(...cached.rows);
389
+ return rows;
390
+ }
391
+ const cells = toCells(highlightLineForPath(line, fence.langPath, fence.carry));
392
+ // Continuation rows are indented under the source line so a wrap reads as a
393
+ // wrap. It never eats more than half the body, nor the minimum code columns,
394
+ // so `prefix + body` always fits `inner` and the right border stays flush.
395
+ const indent = Math.min(leadingSpaces(line) + HANGING_INDENT, Math.floor(inner / 2), Math.max(0, inner - MIN_BODY));
396
+ const hang = " ".repeat(indent);
397
+ const chunks = sliceRows(cells, inner, inner - indent);
398
+ const content = chunks.map((chunk, i) => {
399
+ const { text, width: bodyWidth } = paint(chunk);
400
+ const prefix = i === 0 ? "" : hang;
401
+ return codeBlockRow(prefix + text, prefix.length + bodyWidth, panel);
402
+ });
403
+ cacheRows(key, content, fence.carry);
404
+ rows.push(...content);
405
+ return rows;
406
+ }
407
+ //# sourceMappingURL=code-block.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-block.js","sourceRoot":"","sources":["../../src/ui/code-block.ts"],"names":[],"mappings":"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"}