@pentoshi/clai 4.11.2 → 4.11.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/runner.js +37 -6
- package/dist/agent/runner.js.map +1 -1
- package/dist/agent/tool-history.js +4 -2
- package/dist/agent/tool-history.js.map +1 -1
- package/dist/app/controllers/session-prompt-queue.d.ts +6 -7
- package/dist/app/controllers/session-prompt-queue.js +80 -85
- package/dist/app/controllers/session-prompt-queue.js.map +1 -1
- package/dist/app/controllers/turn-continuation.js +3 -0
- package/dist/app/controllers/turn-continuation.js.map +1 -1
- package/dist/llm/token-estimate-calibration.d.ts +0 -1
- package/dist/llm/token-estimate-calibration.js +3 -3
- package/dist/llm/token-estimate-calibration.js.map +1 -1
- package/dist/llm/tool-protocol.d.ts +1 -0
- package/dist/llm/tool-protocol.js +29 -7
- package/dist/llm/tool-protocol.js.map +1 -1
- package/dist/prompts/embedded.js +1 -1
- package/dist/prompts/embedded.js.map +1 -1
- package/dist/prompts/system.agent.md +5 -5
- package/dist/session-runtime/binding.d.ts +1 -1
- package/dist/session-runtime/binding.js +3 -1
- package/dist/session-runtime/binding.js.map +1 -1
- package/dist/session-runtime/child-bridge.d.ts +7 -2
- package/dist/session-runtime/child-bridge.js +55 -4
- package/dist/session-runtime/child-bridge.js.map +1 -1
- package/dist/session-runtime/client.d.ts +5 -0
- package/dist/session-runtime/client.js +13 -5
- package/dist/session-runtime/client.js.map +1 -1
- package/dist/session-runtime/host.d.ts +7 -0
- package/dist/session-runtime/host.js +112 -19
- package/dist/session-runtime/host.js.map +1 -1
- package/dist/session-runtime/types.d.ts +10 -0
- package/dist/tools/fs.d.ts +0 -5
- package/dist/tools/fs.js +318 -272
- package/dist/tools/fs.js.map +1 -1
- package/dist/tools/shell.d.ts +5 -2
- package/dist/tools/shell.js +313 -20
- package/dist/tools/shell.js.map +1 -1
- package/dist/tui-v2/app/App.js +72 -55
- package/dist/tui-v2/app/App.js.map +1 -1
- package/dist/tui-v2/app/layout-widths.d.ts +21 -0
- package/dist/tui-v2/app/layout-widths.js +50 -0
- package/dist/tui-v2/app/layout-widths.js.map +1 -0
- package/dist/tui-v2/bootstrap/resize-repaint.d.ts +8 -1
- package/dist/tui-v2/bootstrap/resize-repaint.js +8 -0
- package/dist/tui-v2/bootstrap/resize-repaint.js.map +1 -1
- package/dist/tui-v2/bootstrap/start-tui-v2.js +22 -7
- package/dist/tui-v2/bootstrap/start-tui-v2.js.map +1 -1
- package/dist/tui-v2/components/modal/secret-modal.js +10 -10
- package/dist/tui-v2/components/modal/secret-modal.js.map +1 -1
- package/dist/tui-v2/components/pager/pager.js +6 -1
- package/dist/tui-v2/components/pager/pager.js.map +1 -1
- package/dist/tui-v2/components/transcript/assistant-message.d.ts +2 -0
- package/dist/tui-v2/components/transcript/assistant-message.js +4 -2
- package/dist/tui-v2/components/transcript/assistant-message.js.map +1 -1
- package/dist/tui-v2/components/transcript/compacted-row.js +4 -1
- package/dist/tui-v2/components/transcript/compacted-row.js.map +1 -1
- package/dist/tui-v2/components/transcript/tool-card.js +4 -1
- package/dist/tui-v2/components/transcript/tool-card.js.map +1 -1
- package/dist/tui-v2/components/transcript/transcript-row.js +1 -1
- package/dist/tui-v2/components/transcript/transcript-row.js.map +1 -1
- package/dist/tui-v2/input/chord-from-opentui-key.d.ts +6 -0
- package/dist/tui-v2/input/chord-from-opentui-key.js +32 -6
- package/dist/tui-v2/input/chord-from-opentui-key.js.map +1 -1
- package/dist/tui-v2/input/escape-cancellation.d.ts +7 -0
- package/dist/tui-v2/input/escape-cancellation.js +11 -0
- package/dist/tui-v2/input/escape-cancellation.js.map +1 -0
- package/dist/tui-v2/rendering/pager-markdown.d.ts +4 -0
- package/dist/tui-v2/rendering/pager-markdown.js +2 -0
- package/dist/tui-v2/rendering/pager-markdown.js.map +1 -1
- package/dist/ui-core/actions/chord.d.ts +4 -0
- package/dist/ui-core/actions/chord.js.map +1 -1
- package/dist/ui-core/bootstrap/capabilities.d.ts +6 -0
- package/dist/ui-core/bootstrap/capabilities.js +39 -4
- package/dist/ui-core/bootstrap/capabilities.js.map +1 -1
- package/dist/ui-core/react/use-session-state.d.ts +9 -2
- package/dist/ui-core/react/use-session-state.js +35 -4
- package/dist/ui-core/react/use-session-state.js.map +1 -1
- package/dist/ui-core/rendering/code-block.d.ts +10 -5
- package/dist/ui-core/rendering/code-block.js +68 -40
- package/dist/ui-core/rendering/code-block.js.map +1 -1
- package/dist/ui-core/rendering/markdown.d.ts +6 -3
- package/dist/ui-core/rendering/markdown.js +92 -71
- package/dist/ui-core/rendering/markdown.js.map +1 -1
- package/dist/ui-core/rendering/render-markdown-lines.d.ts +4 -0
- package/dist/ui-core/rendering/render-markdown-lines.js +4 -1
- package/dist/ui-core/rendering/render-markdown-lines.js.map +1 -1
- package/dist/ui-core/rendering/streaming-markdown.js +14 -1
- package/dist/ui-core/rendering/streaming-markdown.js.map +1 -1
- package/dist/version.generated.d.ts +2 -2
- package/dist/version.generated.js +2 -2
- package/package.json +1 -1
|
@@ -24,7 +24,7 @@ export function TranscriptRowImpl(props) {
|
|
|
24
24
|
body = (_jsx(UserMessage, { item: item, theme: theme, onOpen: onOpenUserPrompt, contentWidth: contentWidth }));
|
|
25
25
|
break;
|
|
26
26
|
case "assistant":
|
|
27
|
-
body = (_jsx(AssistantMessage, { item: item, theme: theme, contentWidth: contentWidth }));
|
|
27
|
+
body = (_jsx(AssistantMessage, { item: item, theme: theme, colorMode: services.capabilities.colorMode, contentWidth: contentWidth }));
|
|
28
28
|
break;
|
|
29
29
|
case "thinking":
|
|
30
30
|
body = (_jsx(ThinkingBlock, { item: item, theme: theme, expanded: expanded, contentWidth: contentWidth, focused: thinkingFocused ?? false, onFocus: () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transcript-row.js","sourceRoot":"","sources":["../../../../src/tui-v2/components/transcript/transcript-row.tsx"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"transcript-row.js","sourceRoot":"","sources":["../../../../src/tui-v2/components/transcript/transcript-row.tsx"],"names":[],"mappings":"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"}
|
|
@@ -17,4 +17,10 @@
|
|
|
17
17
|
*/
|
|
18
18
|
import { type KeyEventLike } from "../../ui-core/actions/chord.js";
|
|
19
19
|
export type { KeyEventLike };
|
|
20
|
+
export declare function isKeyEventRelease(key: KeyEventLike): boolean;
|
|
21
|
+
export declare function isKeyEventRepeat(key: KeyEventLike): boolean;
|
|
22
|
+
export declare function consumeCancellationKeyRepeat(key: KeyEventLike & {
|
|
23
|
+
preventDefault(): void;
|
|
24
|
+
stopPropagation?(): void;
|
|
25
|
+
}, chord: string): boolean;
|
|
20
26
|
export declare function chordFromKeyEvent(key: KeyEventLike): string;
|
|
@@ -17,19 +17,45 @@
|
|
|
17
17
|
*/
|
|
18
18
|
import { normalizeChord } from "../../ui-core/actions/chord.js";
|
|
19
19
|
const ENTER_NAMES = new Set(["return", "kpenter"]);
|
|
20
|
-
function
|
|
21
|
-
|
|
20
|
+
function isEscapeKey(key) {
|
|
21
|
+
const name = key.name.toLowerCase();
|
|
22
|
+
return (name === "escape" ||
|
|
23
|
+
name === "esc" ||
|
|
24
|
+
key.name === "\x1b" ||
|
|
25
|
+
key.sequence === "\x1b" ||
|
|
26
|
+
key.raw === "\x1b");
|
|
27
|
+
}
|
|
28
|
+
function baseKeyName(key) {
|
|
29
|
+
if (isEscapeKey(key))
|
|
30
|
+
return "escape";
|
|
31
|
+
if (key.name === "linefeed")
|
|
22
32
|
return "j";
|
|
23
|
-
if (ENTER_NAMES.has(name))
|
|
33
|
+
if (ENTER_NAMES.has(key.name))
|
|
24
34
|
return "enter";
|
|
25
|
-
return name;
|
|
35
|
+
return key.name;
|
|
36
|
+
}
|
|
37
|
+
export function isKeyEventRelease(key) {
|
|
38
|
+
return key.eventType === "release";
|
|
39
|
+
}
|
|
40
|
+
export function isKeyEventRepeat(key) {
|
|
41
|
+
return key.eventType === "repeat" || key.repeated === true;
|
|
42
|
+
}
|
|
43
|
+
export function consumeCancellationKeyRepeat(key, chord) {
|
|
44
|
+
if ((chord !== "escape" && chord !== "ctrl+c") ||
|
|
45
|
+
!isKeyEventRepeat(key)) {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
key.preventDefault();
|
|
49
|
+
key.stopPropagation?.();
|
|
50
|
+
return true;
|
|
26
51
|
}
|
|
27
52
|
export function chordFromKeyEvent(key) {
|
|
28
53
|
const isLinefeed = key.name === "linefeed";
|
|
29
54
|
const isBacktab = key.name === "backtab";
|
|
30
55
|
const ctrl = key.ctrl || isLinefeed;
|
|
31
56
|
const alt = Boolean(key.option || key.meta);
|
|
32
|
-
const
|
|
57
|
+
const baseName = isBacktab ? "tab" : baseKeyName(key);
|
|
58
|
+
const isUpper = baseName.length === 1 && baseName >= "A" && baseName <= "Z";
|
|
33
59
|
const hasShiftSequence = typeof key.sequence === "string" &&
|
|
34
60
|
key.sequence.length === 1 &&
|
|
35
61
|
key.sequence >= "A" &&
|
|
@@ -45,7 +71,7 @@ export function chordFromKeyEvent(key) {
|
|
|
45
71
|
parts.push("shift");
|
|
46
72
|
if (meta)
|
|
47
73
|
parts.push("meta");
|
|
48
|
-
parts.push(
|
|
74
|
+
parts.push(baseName.toLowerCase());
|
|
49
75
|
return normalizeChord(parts.join("+"));
|
|
50
76
|
}
|
|
51
77
|
//# sourceMappingURL=chord-from-opentui-key.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chord-from-opentui-key.js","sourceRoot":"","sources":["../../../src/tui-v2/input/chord-from-opentui-key.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,cAAc,EAAqB,MAAM,gCAAgC,CAAC;AAInF,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;AAEnD,SAAS,WAAW,CAAC,
|
|
1
|
+
{"version":3,"file":"chord-from-opentui-key.js","sourceRoot":"","sources":["../../../src/tui-v2/input/chord-from-opentui-key.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type EscapeCancellationAction = "dismiss" | "cancel-all" | "abort-foreground";
|
|
2
|
+
export declare function escapeCancellationAction(input: {
|
|
3
|
+
readonly dismissed: boolean;
|
|
4
|
+
readonly doublePress: boolean;
|
|
5
|
+
readonly hasCancelableWork: boolean;
|
|
6
|
+
}): EscapeCancellationAction;
|
|
7
|
+
export declare function preserveEscapeArmAfterTurn(hasCancelableWork: boolean): boolean;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export function escapeCancellationAction(input) {
|
|
2
|
+
if (input.dismissed)
|
|
3
|
+
return "dismiss";
|
|
4
|
+
if (input.doublePress && input.hasCancelableWork)
|
|
5
|
+
return "cancel-all";
|
|
6
|
+
return "abort-foreground";
|
|
7
|
+
}
|
|
8
|
+
export function preserveEscapeArmAfterTurn(hasCancelableWork) {
|
|
9
|
+
return hasCancelableWork;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=escape-cancellation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"escape-cancellation.js","sourceRoot":"","sources":["../../../src/tui-v2/input/escape-cancellation.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,wBAAwB,CAAC,KAIxC;IACC,IAAI,KAAK,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IACtC,IAAI,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,iBAAiB;QAAE,OAAO,YAAY,CAAC;IACtE,OAAO,kBAAkB,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,iBAA0B;IAE1B,OAAO,iBAAiB,CAAC;AAC3B,CAAC"}
|
|
@@ -6,7 +6,9 @@
|
|
|
6
6
|
* is not mangled by italic underscores or stray asterisks.
|
|
7
7
|
* - Any render failure falls back to plain lines (never throws into the UI).
|
|
8
8
|
*/
|
|
9
|
+
import type { ColorMode } from "../../app/ports/terminal-port.js";
|
|
9
10
|
import { renderStyledMarkdownLines } from "./styled-markdown.js";
|
|
11
|
+
import type { Theme } from "../../ui-core/rendering/theme.js";
|
|
10
12
|
export type PagerMarkdownMode = "auto" | "force" | "plain";
|
|
11
13
|
/** Opaque styled line from renderMarkdownLines (avoids @opentui import here). */
|
|
12
14
|
export type PagerStyledLine = ReturnType<typeof renderStyledMarkdownLines>[number];
|
|
@@ -25,6 +27,8 @@ export interface PreparePagerDisplayOptions {
|
|
|
25
27
|
readonly mode?: PagerMarkdownMode | undefined;
|
|
26
28
|
/** Default body foreground when markdown renders (theme.foreground). */
|
|
27
29
|
readonly defaultFg?: string | undefined;
|
|
30
|
+
readonly theme?: Theme | undefined;
|
|
31
|
+
readonly colorMode?: ColorMode | undefined;
|
|
28
32
|
}
|
|
29
33
|
/**
|
|
30
34
|
* Prepare body lines for the pager. Never throws.
|
|
@@ -34,6 +34,8 @@ export function preparePagerDisplay(options) {
|
|
|
34
34
|
width,
|
|
35
35
|
defaultFg: options.defaultFg,
|
|
36
36
|
stripOuterIndent: true,
|
|
37
|
+
theme: options.theme,
|
|
38
|
+
colorMode: options.colorMode,
|
|
37
39
|
});
|
|
38
40
|
if (styled.length === 0) {
|
|
39
41
|
return { mode: "plain", lines: plainLines(body) };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pager-markdown.js","sourceRoot":"","sources":["../../../src/tui-v2/rendering/pager-markdown.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"pager-markdown.js","sourceRoot":"","sources":["../../../src/tui-v2/rendering/pager-markdown.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AAClF,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AA4B5E,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,yBAAyB,CAAC,IAAI,EAAE;YAC7C,KAAK;YACL,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,gBAAgB,EAAE,IAAI;YACtB,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,SAAS,EAAE,OAAO,CAAC,SAAS;SAC7B,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"}
|
|
@@ -6,6 +6,10 @@ export interface KeyEventLike {
|
|
|
6
6
|
readonly option?: boolean;
|
|
7
7
|
readonly super?: boolean;
|
|
8
8
|
readonly sequence?: string | undefined;
|
|
9
|
+
readonly raw?: string | undefined;
|
|
10
|
+
readonly eventType?: "press" | "repeat" | "release" | undefined;
|
|
11
|
+
readonly source?: "raw" | "kitty" | undefined;
|
|
12
|
+
readonly repeated?: boolean | undefined;
|
|
9
13
|
}
|
|
10
14
|
declare const MODIFIER_ORDER: readonly ["ctrl", "alt", "shift", "meta", "super"];
|
|
11
15
|
export type Modifier = (typeof MODIFIER_ORDER)[number];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chord.js","sourceRoot":"","sources":["../../../src/ui-core/actions/chord.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"chord.js","sourceRoot":"","sources":["../../../src/ui-core/actions/chord.ts"],"names":[],"mappings":"AAcA,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAU,CAAC;AAI1E,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,MAAM,KAAK,GAAG,KAAK;SAChB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;SAClC,MAAM,CAAC,OAAO,CAAC,CAAC;IACnB,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAE,cAAoC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7F,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAE,cAAoC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACrF,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACxC,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,OAAO,CAAC,GAAG,OAAO,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,SAMzB,EAAE,GAAW;IACZ,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,SAAS,CAAC,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,SAAS,CAAC,GAAG;QAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,SAAS,CAAC,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzC,IAAI,SAAS,CAAC,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvC,IAAI,SAAS,CAAC,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,OAAO,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACzC,CAAC"}
|
|
@@ -30,8 +30,14 @@ export interface TerminalCapabilityReport {
|
|
|
30
30
|
readonly reducedMotion: boolean;
|
|
31
31
|
readonly themeHint: ThemeHint;
|
|
32
32
|
}
|
|
33
|
+
export interface OpenTuiNativeAppearance {
|
|
34
|
+
readonly themeMode?: "dark" | "light" | null | undefined;
|
|
35
|
+
readonly rgb?: boolean | undefined;
|
|
36
|
+
readonly ansi256?: boolean | undefined;
|
|
37
|
+
}
|
|
33
38
|
export declare const DEFAULT_COLUMNS = 80;
|
|
34
39
|
export declare const DEFAULT_ROWS = 24;
|
|
35
40
|
export declare function detectThemeHint(env: CapabilityEnv["env"]): ThemeHint;
|
|
36
41
|
export declare function detectCapabilities(input: CapabilityEnv): TerminalCapabilityReport;
|
|
42
|
+
export declare function resolveOpenTuiCapabilities(detected: TerminalCapabilityReport, env: CapabilityEnv["env"], native?: OpenTuiNativeAppearance): TerminalCapabilityReport;
|
|
37
43
|
export declare function readCapabilitiesFromProcess(): TerminalCapabilityReport;
|
|
@@ -15,18 +15,25 @@ function truthy(value) {
|
|
|
15
15
|
const v = value.trim().toLowerCase();
|
|
16
16
|
return v !== "" && v !== "0" && v !== "false" && v !== "no";
|
|
17
17
|
}
|
|
18
|
-
function
|
|
18
|
+
function explicitColorMode(env) {
|
|
19
19
|
if (env.NO_COLOR !== undefined && env.NO_COLOR !== "") {
|
|
20
20
|
return { colorMode: "none", noColor: true };
|
|
21
21
|
}
|
|
22
22
|
if (env.FORCE_COLOR !== undefined && env.FORCE_COLOR !== "" && env.FORCE_COLOR !== "0") {
|
|
23
23
|
const level = env.FORCE_COLOR;
|
|
24
|
-
if (level === "3" || level === "truecolor")
|
|
24
|
+
if (level === "3" || level === "truecolor") {
|
|
25
25
|
return { colorMode: "truecolor", noColor: false };
|
|
26
|
+
}
|
|
26
27
|
if (level === "2")
|
|
27
28
|
return { colorMode: "256", noColor: false };
|
|
28
29
|
return { colorMode: "16", noColor: false };
|
|
29
30
|
}
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
function detectColorMode(env, isTTY, platform) {
|
|
34
|
+
const explicit = explicitColorMode(env);
|
|
35
|
+
if (explicit)
|
|
36
|
+
return explicit;
|
|
30
37
|
if (!isTTY)
|
|
31
38
|
return { colorMode: "none", noColor: false };
|
|
32
39
|
const colorterm = (env.COLORTERM ?? "").toLowerCase();
|
|
@@ -62,9 +69,13 @@ function detectUnicode(env) {
|
|
|
62
69
|
return true; // assume modern terminal when unset
|
|
63
70
|
return /utf-?8/i.test(locale);
|
|
64
71
|
}
|
|
65
|
-
|
|
72
|
+
function explicitThemeHint(env) {
|
|
66
73
|
const explicit = (env.CLAI_THEME ?? "").toLowerCase();
|
|
67
|
-
|
|
74
|
+
return explicit === "dark" || explicit === "light" ? explicit : undefined;
|
|
75
|
+
}
|
|
76
|
+
export function detectThemeHint(env) {
|
|
77
|
+
const explicit = explicitThemeHint(env);
|
|
78
|
+
if (explicit)
|
|
68
79
|
return explicit;
|
|
69
80
|
const colorfgbg = env.COLORFGBG;
|
|
70
81
|
if (colorfgbg) {
|
|
@@ -98,6 +109,30 @@ export function detectCapabilities(input) {
|
|
|
98
109
|
themeHint: detectThemeHint(env),
|
|
99
110
|
};
|
|
100
111
|
}
|
|
112
|
+
export function resolveOpenTuiCapabilities(detected, env, native) {
|
|
113
|
+
const explicitColor = explicitColorMode(env);
|
|
114
|
+
const nativeColorAvailable = native?.rgb !== undefined || native?.ansi256 !== undefined;
|
|
115
|
+
const color = explicitColor ??
|
|
116
|
+
(!detected.isTTY
|
|
117
|
+
? { colorMode: "none", noColor: false }
|
|
118
|
+
: {
|
|
119
|
+
colorMode: nativeColorAvailable
|
|
120
|
+
? native?.rgb
|
|
121
|
+
? "truecolor"
|
|
122
|
+
: native?.ansi256
|
|
123
|
+
? "256"
|
|
124
|
+
: "16"
|
|
125
|
+
: "16",
|
|
126
|
+
noColor: false,
|
|
127
|
+
});
|
|
128
|
+
const themeHint = explicitThemeHint(env) ?? native?.themeMode ?? "dark";
|
|
129
|
+
return {
|
|
130
|
+
...detected,
|
|
131
|
+
colorMode: color.colorMode,
|
|
132
|
+
noColor: color.noColor,
|
|
133
|
+
themeHint,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
101
136
|
export function readCapabilitiesFromProcess() {
|
|
102
137
|
return detectCapabilities({
|
|
103
138
|
env: process.env,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../../src/ui-core/bootstrap/capabilities.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../../src/ui-core/bootstrap/capabilities.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,9 @@
|
|
|
1
|
-
import type { SessionController } from "../../app/controllers/session-controller.js";
|
|
2
|
-
|
|
1
|
+
import type { SessionController, SessionState } from "../../app/controllers/session-controller.js";
|
|
2
|
+
type SessionStateSource = Pick<SessionController, "getState" | "subscribe">;
|
|
3
|
+
export interface SessionStateStore {
|
|
4
|
+
readonly getSnapshot: () => SessionState;
|
|
5
|
+
readonly subscribe: (listener: () => void) => () => void;
|
|
6
|
+
}
|
|
7
|
+
export declare function createSessionStateStore(session: SessionStateSource): SessionStateStore;
|
|
8
|
+
export declare function useSessionState(session: SessionController): SessionState;
|
|
9
|
+
export {};
|
|
@@ -1,7 +1,38 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { useMemo, useSyncExternalStore } from "react";
|
|
2
|
+
export function createSessionStateStore(session) {
|
|
3
|
+
let snapshot = session.getState();
|
|
4
|
+
let unsubscribeSource;
|
|
5
|
+
const listeners = new Set();
|
|
6
|
+
const update = () => {
|
|
7
|
+
snapshot = session.getState();
|
|
8
|
+
for (const listener of listeners)
|
|
9
|
+
listener();
|
|
10
|
+
};
|
|
11
|
+
const subscribe = (listener) => {
|
|
12
|
+
listeners.add(listener);
|
|
13
|
+
if (listeners.size === 1) {
|
|
14
|
+
unsubscribeSource = session.subscribe(update);
|
|
15
|
+
update();
|
|
16
|
+
}
|
|
17
|
+
let active = true;
|
|
18
|
+
return () => {
|
|
19
|
+
if (!active)
|
|
20
|
+
return;
|
|
21
|
+
active = false;
|
|
22
|
+
listeners.delete(listener);
|
|
23
|
+
if (listeners.size === 0) {
|
|
24
|
+
unsubscribeSource?.();
|
|
25
|
+
unsubscribeSource = undefined;
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
return {
|
|
30
|
+
getSnapshot: () => snapshot,
|
|
31
|
+
subscribe,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
2
34
|
export function useSessionState(session) {
|
|
3
|
-
const
|
|
4
|
-
|
|
5
|
-
return state;
|
|
35
|
+
const store = useMemo(() => createSessionStateStore(session), [session]);
|
|
36
|
+
return useSyncExternalStore(store.subscribe, store.getSnapshot, store.getSnapshot);
|
|
6
37
|
}
|
|
7
38
|
//# sourceMappingURL=use-session-state.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-session-state.js","sourceRoot":"","sources":["../../../src/ui-core/react/use-session-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"use-session-state.js","sourceRoot":"","sources":["../../../src/ui-core/react/use-session-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAatD,MAAM,UAAU,uBAAuB,CACrC,OAA2B;IAE3B,IAAI,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAClC,IAAI,iBAA2C,CAAC;IAChD,MAAM,SAAS,GAAG,IAAI,GAAG,EAAc,CAAC;IAExC,MAAM,MAAM,GAAG,GAAS,EAAE;QACxB,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC9B,KAAK,MAAM,QAAQ,IAAI,SAAS;YAAE,QAAQ,EAAE,CAAC;IAC/C,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,CAAC,QAAoB,EAAgB,EAAE;QACvD,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACxB,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACzB,iBAAiB,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAC9C,MAAM,EAAE,CAAC;QACX,CAAC;QACD,IAAI,MAAM,GAAG,IAAI,CAAC;QAClB,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,MAAM;gBAAE,OAAO;YACpB,MAAM,GAAG,KAAK,CAAC;YACf,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC3B,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;gBACzB,iBAAiB,EAAE,EAAE,CAAC;gBACtB,iBAAiB,GAAG,SAAS,CAAC;YAChC,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,CAAC;IAEF,OAAO;QACL,WAAW,EAAE,GAAG,EAAE,CAAC,QAAQ;QAC3B,SAAS;KACV,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAA0B;IACxD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,uBAAuB,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IACzE,OAAO,oBAAoB,CACzB,KAAK,CAAC,SAAS,EACf,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,WAAW,CAClB,CAAC;AACJ,CAAC"}
|
|
@@ -5,9 +5,15 @@
|
|
|
5
5
|
* source indentation, and column-accurate soft wrapping (no ellipsis, no
|
|
6
6
|
* dropped characters, wide glyphs never straddle the right border).
|
|
7
7
|
*/
|
|
8
|
+
import type { ColorMode } from "../../app/ports/terminal-port.js";
|
|
9
|
+
import { type Theme } from "./theme.js";
|
|
8
10
|
import { type HighlightCarry } from "./syntax-highlight.js";
|
|
9
11
|
/** Columns consumed by `│ ` + body + ` │`. */
|
|
10
12
|
export declare const CODE_BLOCK_CHROME = 4;
|
|
13
|
+
export interface CodeBlockAppearance {
|
|
14
|
+
readonly theme?: Theme | undefined;
|
|
15
|
+
readonly colorMode?: ColorMode | undefined;
|
|
16
|
+
}
|
|
11
17
|
export interface CodeFenceState {
|
|
12
18
|
/** Opening run of backticks or tildes — only a matching run closes it. */
|
|
13
19
|
readonly marker: string;
|
|
@@ -37,12 +43,11 @@ export declare function trimCodeBlockBody(lines: readonly string[]): string[];
|
|
|
37
43
|
* wider than the pane, which is when wrapping takes over.
|
|
38
44
|
*/
|
|
39
45
|
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
|
-
|
|
43
|
-
export declare function codeBlockRow(body: string, bodyWidth: number, width: number): string;
|
|
46
|
+
export declare function codeBlockTop(label: string, width: number, appearance?: CodeBlockAppearance): string;
|
|
47
|
+
export declare function codeBlockBottom(width: number, appearance?: CodeBlockAppearance): string;
|
|
48
|
+
export declare function codeBlockRow(body: string, bodyWidth: number, width: number, appearance?: CodeBlockAppearance): string;
|
|
44
49
|
/**
|
|
45
50
|
* Render one source line as complete panel rows. Blank lines are buffered so a
|
|
46
51
|
* block that ends with padding does not push empty rows against the footer.
|
|
47
52
|
*/
|
|
48
|
-
export declare function codeBlockRows(source: string, fence: CodeFenceState, width: number): string[];
|
|
53
|
+
export declare function codeBlockRows(source: string, fence: CodeFenceState, width: number, appearance?: CodeBlockAppearance): string[];
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* source indentation, and column-accurate soft wrapping (no ellipsis, no
|
|
6
6
|
* dropped characters, wide glyphs never straddle the right border).
|
|
7
7
|
*/
|
|
8
|
-
import chalk from "chalk";
|
|
8
|
+
import chalk, { Chalk } from "chalk";
|
|
9
9
|
import { renderColumns } from "./text-width.js";
|
|
10
10
|
import { detectThemeHint } from "../bootstrap/capabilities.js";
|
|
11
11
|
import { themeFor } from "./theme.js";
|
|
@@ -23,35 +23,61 @@ const SOFT_BREAK_FLOOR = 0.5;
|
|
|
23
23
|
const GRAPHEME_SEGMENTER = new Intl.Segmenter(undefined, {
|
|
24
24
|
granularity: "grapheme",
|
|
25
25
|
});
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
26
|
+
const CHALK_LEVEL = {
|
|
27
|
+
none: 0,
|
|
28
|
+
"16": 1,
|
|
29
|
+
"256": 2,
|
|
30
|
+
truecolor: 3,
|
|
31
|
+
};
|
|
32
|
+
const PALETTE_CACHE = new WeakMap();
|
|
33
|
+
const THEME_IDENTITIES = new WeakMap();
|
|
34
|
+
let nextThemeIdentity = 1;
|
|
35
|
+
function themeIdentity(theme) {
|
|
36
|
+
const cached = THEME_IDENTITIES.get(theme);
|
|
37
|
+
if (cached !== undefined)
|
|
38
|
+
return cached;
|
|
39
|
+
const identity = nextThemeIdentity;
|
|
40
|
+
nextThemeIdentity += 1;
|
|
41
|
+
THEME_IDENTITIES.set(theme, identity);
|
|
42
|
+
return identity;
|
|
43
|
+
}
|
|
44
|
+
function buildPalette(theme, level) {
|
|
45
|
+
const paint = new Chalk({ level });
|
|
33
46
|
return {
|
|
34
|
-
|
|
35
|
-
|
|
47
|
+
identity: `${themeIdentity(theme)}:${level}`,
|
|
48
|
+
border: paint.hex(theme.diffGutter),
|
|
49
|
+
label: paint.hex(theme.muted),
|
|
36
50
|
syntax: {
|
|
37
|
-
plain:
|
|
38
|
-
keyword:
|
|
39
|
-
string:
|
|
40
|
-
comment:
|
|
41
|
-
number:
|
|
42
|
-
function:
|
|
43
|
-
type:
|
|
44
|
-
property:
|
|
45
|
-
operator:
|
|
46
|
-
punctuation:
|
|
47
|
-
regex:
|
|
51
|
+
plain: paint.hex(theme.foreground),
|
|
52
|
+
keyword: paint.hex(theme.synKeyword),
|
|
53
|
+
string: paint.hex(theme.synString),
|
|
54
|
+
comment: paint.hex(theme.synComment),
|
|
55
|
+
number: paint.hex(theme.synNumber),
|
|
56
|
+
function: paint.hex(theme.synFunction),
|
|
57
|
+
type: paint.hex(theme.synType),
|
|
58
|
+
property: paint.hex(theme.synProperty),
|
|
59
|
+
operator: paint.hex(theme.synOperator),
|
|
60
|
+
punctuation: paint.hex(theme.muted),
|
|
61
|
+
regex: paint.hex(theme.synRegex),
|
|
48
62
|
},
|
|
49
63
|
};
|
|
50
64
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
65
|
+
function palette(appearance) {
|
|
66
|
+
const theme = appearance?.theme ?? themeFor(detectThemeHint(process.env));
|
|
67
|
+
const level = appearance?.colorMode === undefined
|
|
68
|
+
? chalk.level
|
|
69
|
+
: CHALK_LEVEL[appearance.colorMode];
|
|
70
|
+
let byLevel = PALETTE_CACHE.get(theme);
|
|
71
|
+
if (!byLevel) {
|
|
72
|
+
byLevel = new Map();
|
|
73
|
+
PALETTE_CACHE.set(theme, byLevel);
|
|
74
|
+
}
|
|
75
|
+
const cached = byLevel.get(level);
|
|
76
|
+
if (cached)
|
|
77
|
+
return cached;
|
|
78
|
+
const resolved = buildPalette(theme, level);
|
|
79
|
+
byLevel.set(level, resolved);
|
|
80
|
+
return resolved;
|
|
55
81
|
}
|
|
56
82
|
/** Fence info strings that are not already file extensions. */
|
|
57
83
|
const INFO_EXTENSION = {
|
|
@@ -208,8 +234,8 @@ function truncateLabel(label, maxWidth) {
|
|
|
208
234
|
}
|
|
209
235
|
return text;
|
|
210
236
|
}
|
|
211
|
-
export function codeBlockTop(label, width) {
|
|
212
|
-
const { border, label: paintLabel } = palette();
|
|
237
|
+
export function codeBlockTop(label, width, appearance) {
|
|
238
|
+
const { border, label: paintLabel } = palette(appearance);
|
|
213
239
|
const span = codeBlockWidth(width) - 2;
|
|
214
240
|
const room = span - 4;
|
|
215
241
|
const labelWidth = renderColumns(label);
|
|
@@ -224,15 +250,16 @@ export function codeBlockTop(label, width) {
|
|
|
224
250
|
paintLabel(` ${text} `) +
|
|
225
251
|
border(`${rule(span - 3 - renderColumns(text))}╮`));
|
|
226
252
|
}
|
|
227
|
-
export function codeBlockBottom(width) {
|
|
228
|
-
return palette().border(`╰${rule(codeBlockWidth(width) - 2)}╯`);
|
|
253
|
+
export function codeBlockBottom(width, appearance) {
|
|
254
|
+
return palette(appearance).border(`╰${rule(codeBlockWidth(width) - 2)}╯`);
|
|
229
255
|
}
|
|
230
|
-
|
|
231
|
-
export function codeBlockRow(body, bodyWidth, width) {
|
|
232
|
-
const { border } = palette();
|
|
256
|
+
function codeBlockRowWithPalette(body, bodyWidth, width, resolved) {
|
|
233
257
|
const inner = codeBlockWidth(width) - CODE_BLOCK_CHROME;
|
|
234
258
|
const pad = " ".repeat(Math.max(0, inner - bodyWidth));
|
|
235
|
-
return `${border("│")} ${body}${pad} ${border("│")}`;
|
|
259
|
+
return `${resolved.border("│")} ${body}${pad} ${resolved.border("│")}`;
|
|
260
|
+
}
|
|
261
|
+
export function codeBlockRow(body, bodyWidth, width, appearance) {
|
|
262
|
+
return codeBlockRowWithPalette(body, bodyWidth, width, palette(appearance));
|
|
236
263
|
}
|
|
237
264
|
function graphemes(text) {
|
|
238
265
|
return Array.from(GRAPHEME_SEGMENTER.segment(text), ({ segment }) => segment);
|
|
@@ -307,8 +334,8 @@ function sliceRows(cells, firstBudget, restBudget) {
|
|
|
307
334
|
}
|
|
308
335
|
return rows.length > 0 ? rows : [[]];
|
|
309
336
|
}
|
|
310
|
-
function
|
|
311
|
-
const { syntax } =
|
|
337
|
+
function paintCells(cells, resolved) {
|
|
338
|
+
const { syntax } = resolved;
|
|
312
339
|
let text = "";
|
|
313
340
|
let width = 0;
|
|
314
341
|
let run = "";
|
|
@@ -366,7 +393,8 @@ function cacheRows(key, rows, carry) {
|
|
|
366
393
|
* Render one source line as complete panel rows. Blank lines are buffered so a
|
|
367
394
|
* block that ends with padding does not push empty rows against the footer.
|
|
368
395
|
*/
|
|
369
|
-
export function codeBlockRows(source, fence, width) {
|
|
396
|
+
export function codeBlockRows(source, fence, width, appearance) {
|
|
397
|
+
const resolved = palette(appearance);
|
|
370
398
|
const panel = codeBlockWidth(width);
|
|
371
399
|
const inner = panel - CODE_BLOCK_CHROME;
|
|
372
400
|
const line = expandTabs(source.replace(/\s+$/, ""));
|
|
@@ -378,10 +406,10 @@ export function codeBlockRows(source, fence, width) {
|
|
|
378
406
|
}
|
|
379
407
|
const rows = [];
|
|
380
408
|
for (let i = 0; i < fence.pendingBlanks; i += 1) {
|
|
381
|
-
rows.push(
|
|
409
|
+
rows.push(codeBlockRowWithPalette("", 0, panel, resolved));
|
|
382
410
|
}
|
|
383
411
|
fence.pendingBlanks = 0;
|
|
384
|
-
const key = `${panel}\u0000${fence.langPath}\u0000${carryKey(fence.carry)}\u0000${line}`;
|
|
412
|
+
const key = `${resolved.identity}\u0000${panel}\u0000${fence.langPath}\u0000${carryKey(fence.carry)}\u0000${line}`;
|
|
385
413
|
const cached = ROW_CACHE.get(key);
|
|
386
414
|
if (cached) {
|
|
387
415
|
restoreCarry(fence.carry, cached.carry);
|
|
@@ -396,9 +424,9 @@ export function codeBlockRows(source, fence, width) {
|
|
|
396
424
|
const hang = " ".repeat(indent);
|
|
397
425
|
const chunks = sliceRows(cells, inner, inner - indent);
|
|
398
426
|
const content = chunks.map((chunk, i) => {
|
|
399
|
-
const { text, width: bodyWidth } =
|
|
427
|
+
const { text, width: bodyWidth } = paintCells(chunk, resolved);
|
|
400
428
|
const prefix = i === 0 ? "" : hang;
|
|
401
|
-
return
|
|
429
|
+
return codeBlockRowWithPalette(prefix + text, prefix.length + bodyWidth, panel, resolved);
|
|
402
430
|
});
|
|
403
431
|
cacheRows(key, content, fence.carry);
|
|
404
432
|
rows.push(...content);
|