@pentoshi/clai 4.11.2 → 4.11.4

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 (101) hide show
  1. package/dist/agent/runner.js +37 -6
  2. package/dist/agent/runner.js.map +1 -1
  3. package/dist/agent/tool-history.js +4 -2
  4. package/dist/agent/tool-history.js.map +1 -1
  5. package/dist/app/controllers/session-prompt-queue.d.ts +6 -7
  6. package/dist/app/controllers/session-prompt-queue.js +80 -85
  7. package/dist/app/controllers/session-prompt-queue.js.map +1 -1
  8. package/dist/app/controllers/turn-continuation.js +3 -0
  9. package/dist/app/controllers/turn-continuation.js.map +1 -1
  10. package/dist/classic/input/terminal-sequences.d.ts +1 -3
  11. package/dist/classic/input/terminal-sequences.js +1 -3
  12. package/dist/classic/input/terminal-sequences.js.map +1 -1
  13. package/dist/llm/token-estimate-calibration.d.ts +0 -1
  14. package/dist/llm/token-estimate-calibration.js +3 -3
  15. package/dist/llm/token-estimate-calibration.js.map +1 -1
  16. package/dist/llm/tool-protocol.d.ts +1 -0
  17. package/dist/llm/tool-protocol.js +29 -7
  18. package/dist/llm/tool-protocol.js.map +1 -1
  19. package/dist/prompts/embedded.js +1 -1
  20. package/dist/prompts/embedded.js.map +1 -1
  21. package/dist/prompts/system.agent.md +7 -7
  22. package/dist/session-runtime/binding.d.ts +1 -1
  23. package/dist/session-runtime/binding.js +3 -1
  24. package/dist/session-runtime/binding.js.map +1 -1
  25. package/dist/session-runtime/child-bridge.d.ts +7 -2
  26. package/dist/session-runtime/child-bridge.js +55 -4
  27. package/dist/session-runtime/child-bridge.js.map +1 -1
  28. package/dist/session-runtime/client.d.ts +5 -0
  29. package/dist/session-runtime/client.js +13 -5
  30. package/dist/session-runtime/client.js.map +1 -1
  31. package/dist/session-runtime/host.d.ts +7 -0
  32. package/dist/session-runtime/host.js +112 -19
  33. package/dist/session-runtime/host.js.map +1 -1
  34. package/dist/session-runtime/types.d.ts +10 -0
  35. package/dist/tools/definitions.js +2 -2
  36. package/dist/tools/definitions.js.map +1 -1
  37. package/dist/tools/fs.d.ts +0 -5
  38. package/dist/tools/fs.js +363 -272
  39. package/dist/tools/fs.js.map +1 -1
  40. package/dist/tools/shell.d.ts +5 -2
  41. package/dist/tools/shell.js +313 -20
  42. package/dist/tools/shell.js.map +1 -1
  43. package/dist/tui-v2/app/App.js +67 -61
  44. package/dist/tui-v2/app/App.js.map +1 -1
  45. package/dist/tui-v2/app/layout-widths.d.ts +21 -0
  46. package/dist/tui-v2/app/layout-widths.js +50 -0
  47. package/dist/tui-v2/app/layout-widths.js.map +1 -0
  48. package/dist/tui-v2/bootstrap/resize-repaint.d.ts +8 -1
  49. package/dist/tui-v2/bootstrap/resize-repaint.js +8 -0
  50. package/dist/tui-v2/bootstrap/resize-repaint.js.map +1 -1
  51. package/dist/tui-v2/bootstrap/start-tui-v2.js +22 -7
  52. package/dist/tui-v2/bootstrap/start-tui-v2.js.map +1 -1
  53. package/dist/tui-v2/components/modal/secret-modal.js +10 -10
  54. package/dist/tui-v2/components/modal/secret-modal.js.map +1 -1
  55. package/dist/tui-v2/components/pager/pager.js +6 -1
  56. package/dist/tui-v2/components/pager/pager.js.map +1 -1
  57. package/dist/tui-v2/components/transcript/assistant-message.d.ts +2 -0
  58. package/dist/tui-v2/components/transcript/assistant-message.js +4 -2
  59. package/dist/tui-v2/components/transcript/assistant-message.js.map +1 -1
  60. package/dist/tui-v2/components/transcript/compacted-row.js +4 -1
  61. package/dist/tui-v2/components/transcript/compacted-row.js.map +1 -1
  62. package/dist/tui-v2/components/transcript/tool-card.js +4 -1
  63. package/dist/tui-v2/components/transcript/tool-card.js.map +1 -1
  64. package/dist/tui-v2/components/transcript/transcript-row.js +1 -1
  65. package/dist/tui-v2/components/transcript/transcript-row.js.map +1 -1
  66. package/dist/tui-v2/input/chord-from-opentui-key.d.ts +6 -0
  67. package/dist/tui-v2/input/chord-from-opentui-key.js +32 -6
  68. package/dist/tui-v2/input/chord-from-opentui-key.js.map +1 -1
  69. package/dist/tui-v2/input/escape-cancellation.d.ts +7 -0
  70. package/dist/tui-v2/input/escape-cancellation.js +11 -0
  71. package/dist/tui-v2/input/escape-cancellation.js.map +1 -0
  72. package/dist/tui-v2/rendering/pager-markdown.d.ts +4 -0
  73. package/dist/tui-v2/rendering/pager-markdown.js +2 -0
  74. package/dist/tui-v2/rendering/pager-markdown.js.map +1 -1
  75. package/dist/ui-core/actions/cancel-timing.d.ts +6 -0
  76. package/dist/ui-core/actions/cancel-timing.js +7 -0
  77. package/dist/ui-core/actions/cancel-timing.js.map +1 -0
  78. package/dist/ui-core/actions/chord.d.ts +4 -0
  79. package/dist/ui-core/actions/chord.js.map +1 -1
  80. package/dist/ui-core/bootstrap/capabilities.d.ts +6 -0
  81. package/dist/ui-core/bootstrap/capabilities.js +51 -4
  82. package/dist/ui-core/bootstrap/capabilities.js.map +1 -1
  83. package/dist/ui-core/react/use-session-state.d.ts +9 -2
  84. package/dist/ui-core/react/use-session-state.js +35 -4
  85. package/dist/ui-core/react/use-session-state.js.map +1 -1
  86. package/dist/ui-core/rendering/code-block.d.ts +10 -5
  87. package/dist/ui-core/rendering/code-block.js +68 -40
  88. package/dist/ui-core/rendering/code-block.js.map +1 -1
  89. package/dist/ui-core/rendering/markdown.d.ts +6 -3
  90. package/dist/ui-core/rendering/markdown.js +92 -71
  91. package/dist/ui-core/rendering/markdown.js.map +1 -1
  92. package/dist/ui-core/rendering/render-markdown-lines.d.ts +4 -0
  93. package/dist/ui-core/rendering/render-markdown-lines.js +4 -1
  94. package/dist/ui-core/rendering/render-markdown-lines.js.map +1 -1
  95. package/dist/ui-core/rendering/streaming-markdown.js +14 -1
  96. package/dist/ui-core/rendering/streaming-markdown.js.map +1 -1
  97. package/dist/ui-core/rendering/tool-presenter.js +6 -2
  98. package/dist/ui-core/rendering/tool-presenter.js.map +1 -1
  99. package/dist/version.generated.d.ts +2 -2
  100. package/dist/version.generated.js +2 -2
  101. 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 baseKeyName(name) {
21
- if (name === "linefeed")
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 isUpper = key.name.length === 1 && key.name >= "A" && key.name <= "Z";
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(isBacktab ? "tab" : baseKeyName(key.name).toLowerCase());
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,IAAY;IAC/B,IAAI,IAAI,KAAK,UAAU;QAAE,OAAO,GAAG,CAAC;IACpC,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC;IAC1C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,GAAiB;IACjD,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,KAAK,UAAU,CAAC;IAC3C,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC;IACzC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,UAAU,CAAC;IACpC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;IAC5C,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC;IAC5E,MAAM,gBAAgB,GACpB,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ;QAChC,GAAG,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;QACzB,GAAG,CAAC,QAAQ,IAAI,GAAG;QACnB,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC;IACtB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,SAAS,IAAI,OAAO,IAAI,gBAAgB,CAAC;IAC7E,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAEhC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7B,IAAI,GAAG;QAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3B,IAAI,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC/B,IAAI,IAAI;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7B,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;IAEpE,OAAO,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACzC,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" | "arm" | "cancel-all" | "none";
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.hasCancelableWork)
5
+ return "none";
6
+ return input.doublePress ? "cancel-all" : "arm";
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":"AAMA,MAAM,UAAU,wBAAwB,CAAC,KAIxC;IACC,IAAI,KAAK,CAAC,SAAS;QAAE,OAAO,SAAS,CAAC;IACtC,IAAI,CAAC,KAAK,CAAC,iBAAiB;QAAE,OAAO,MAAM,CAAC;IAC5C,OAAO,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC;AAClD,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;AAEH,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6CAA6C,CAAC;AAClF,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AAyB5E,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;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":"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"}
@@ -0,0 +1,6 @@
1
+ export declare const CTRL_C_QUIT_WINDOW_MS = 1500;
2
+ export declare const ESC_CANCEL_WINDOW_MS = 1500;
3
+ /** Collapses one physical Esc reaching several handlers into a single logical
4
+ * press. Well under a human double-tap, so it cannot swallow a real second
5
+ * press on any platform. */
6
+ export declare const ESC_SAME_PRESS_MS = 80;
@@ -0,0 +1,7 @@
1
+ export const CTRL_C_QUIT_WINDOW_MS = 1500;
2
+ export const ESC_CANCEL_WINDOW_MS = 1500;
3
+ /** Collapses one physical Esc reaching several handlers into a single logical
4
+ * press. Well under a human double-tap, so it cannot swallow a real second
5
+ * press on any platform. */
6
+ export const ESC_SAME_PRESS_MS = 80;
7
+ //# sourceMappingURL=cancel-timing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cancel-timing.js","sourceRoot":"","sources":["../../../src/ui-core/actions/cancel-timing.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAE1C,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAEzC;;6BAE6B;AAC7B,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,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":"AAUA,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"}
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 detectColorMode(env, isTTY, platform) {
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
- export function detectThemeHint(env) {
72
+ function explicitThemeHint(env) {
66
73
  const explicit = (env.CLAI_THEME ?? "").toLowerCase();
67
- if (explicit === "dark" || explicit === "light")
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,42 @@ export function detectCapabilities(input) {
98
109
  themeHint: detectThemeHint(env),
99
110
  };
100
111
  }
112
+ const COLOR_DEPTH = {
113
+ none: 0,
114
+ "16": 1,
115
+ "256": 2,
116
+ truecolor: 3,
117
+ };
118
+ function nativeColorMode(native) {
119
+ if (native?.rgb)
120
+ return "truecolor";
121
+ if (native?.ansi256)
122
+ return "256";
123
+ if (native?.rgb === false || native?.ansi256 === false)
124
+ return "16";
125
+ return undefined;
126
+ }
127
+ export function resolveOpenTuiCapabilities(detected, env, native) {
128
+ const explicitColor = explicitColorMode(env);
129
+ const nativeMode = nativeColorMode(native);
130
+ const deepest = nativeMode !== undefined &&
131
+ COLOR_DEPTH[nativeMode] > COLOR_DEPTH[detected.colorMode]
132
+ ? nativeMode
133
+ : detected.colorMode;
134
+ const color = explicitColor ??
135
+ (!detected.isTTY
136
+ ? { colorMode: "none", noColor: false }
137
+ : { colorMode: deepest, noColor: false });
138
+ const themeHint = explicitThemeHint(env) ??
139
+ native?.themeMode ??
140
+ (detected.themeHint === "unknown" ? "dark" : detected.themeHint);
141
+ return {
142
+ ...detected,
143
+ colorMode: color.colorMode,
144
+ noColor: color.noColor,
145
+ themeHint,
146
+ };
147
+ }
101
148
  export function readCapabilitiesFromProcess() {
102
149
  return detectCapabilities({
103
150
  env: process.env,
@@ -1 +1 @@
1
- {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../../src/ui-core/bootstrap/capabilities.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA+BH,MAAM,CAAC,MAAM,eAAe,GAAG,EAAE,CAAC;AAClC,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,CAAC;AAE/B,MAAM,eAAe,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC;AACrF,MAAM,oBAAoB,GAAG,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;AAErE,SAAS,MAAM,CAAC,KAAyB;IACvC,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACtC,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,OAAO,IAAI,CAAC,KAAK,IAAI,CAAC;AAC9D,CAAC;AAED,SAAS,eAAe,CACtB,GAAyB,EACzB,KAAc,EACd,QAAiB;IAEjB,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,IAAI,GAAG,CAAC,QAAQ,KAAK,EAAE,EAAE,CAAC;QACtD,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC9C,CAAC;IACD,IAAI,GAAG,CAAC,WAAW,KAAK,SAAS,IAAI,GAAG,CAAC,WAAW,KAAK,EAAE,IAAI,GAAG,CAAC,WAAW,KAAK,GAAG,EAAE,CAAC;QACvF,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,CAAC;QAC9B,IAAI,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,WAAW;YAAE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC9F,IAAI,KAAK,KAAK,GAAG;YAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC/D,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC7C,CAAC;IACD,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAEzD,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACtD,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC5C,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAE3D,IAAI,SAAS,KAAK,WAAW,IAAI,SAAS,KAAK,OAAO,EAAE,CAAC;QACvD,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACpD,CAAC;IACD,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7E,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACpD,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACtE,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QACnC,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YACzB,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,UAAU,KAAK,IAAI,IAAI,GAAG,CAAC,iBAAiB,KAAK,oBAAoB,EAAE,CAAC;gBAChG,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YACpD,CAAC;YACD,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAC7C,CAAC;QACD,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAC/C,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAC7C,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAyB;IACpD,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC5C,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC3D,OAAO,oBAAoB,CAAC,IAAI,CAC9B,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CACnD,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,GAAyB;IAC9C,MAAM,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,IAAI,EAAE,GAAG,GAAG,CAAC,QAAQ,IAAI,EAAE,GAAG,GAAG,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;IAC3E,IAAI,MAAM,KAAK,EAAE;QAAE,OAAO,IAAI,CAAC,CAAC,oCAAoC;IACpE,OAAO,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAyB;IACvD,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACtD,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,OAAO;QAAE,OAAO,QAAQ,CAAC;IACjE,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC;IAChC,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QAC3C,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IAC7D,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,UAAU,CAAC,KAAyB,EAAE,QAAgB;IAC7D,OAAO,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;AACvF,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,KAAoB;IAEpB,MAAM,EAAE,GAAG,EAAE,GAAG,KAAK,CAAC;IACtB,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,IAAI,KAAK,CAAC,UAAU,CAAC;IACpD,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,eAAe,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC3E,MAAM,aAAa,GAAG,KAAK,IAAI,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAExD,OAAO;QACL,KAAK;QACL,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,eAAe,CAAC;QACnD,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,YAAY,CAAC;QAC1C,SAAS;QACT,OAAO;QACP,aAAa;QACb,wBAAwB,EAAE,aAAa;QACvC,KAAK,EAAE,KAAK;QACZ,OAAO,EAAE,aAAa,CAAC,GAAG,CAAC;QAC3B,KAAK,EAAE,KAAK;QACZ,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC;QACvE,SAAS,EAAE,eAAe,CAAC,GAAG,CAAC;KAChC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,2BAA2B;IACzC,OAAO,kBAAkB,CAAC;QACxB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;QAC1C,UAAU,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC;QACxC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO;QAC/B,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI;QACzB,QAAQ,EAAE,OAAO,CAAC,QAAQ;KAC3B,CAAC,CAAC;AACL,CAAC"}
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
- export declare function useSessionState(session: SessionController): import("../../app/controllers/session-controller.js").SessionState;
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 { useEffect, useState } from "react";
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 [state, setState] = useState(() => session.getState());
4
- useEffect(() => session.subscribe(() => setState(session.getState())), [session]);
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,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAG5C,MAAM,UAAU,eAAe,CAAC,OAA0B;IACxD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC7D,SAAS,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAClF,OAAO,KAAK,CAAC;AACf,CAAC"}
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
- /** 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;
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
- * 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));
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
- border: chalk.hex(theme.diffGutter),
35
- label: chalk.hex(theme.muted),
47
+ identity: `${themeIdentity(theme)}:${level}`,
48
+ border: paint.hex(theme.diffGutter),
49
+ label: paint.hex(theme.muted),
36
50
  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),
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
- let resolvedPalette;
52
- function palette() {
53
- resolvedPalette ??= buildPalette();
54
- return resolvedPalette;
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
- /** 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();
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 paint(cells) {
311
- const { syntax } = palette();
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(codeBlockRow("", 0, panel));
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 } = paint(chunk);
427
+ const { text, width: bodyWidth } = paintCells(chunk, resolved);
400
428
  const prefix = i === 0 ? "" : hang;
401
- return codeBlockRow(prefix + text, prefix.length + bodyWidth, panel);
429
+ return codeBlockRowWithPalette(prefix + text, prefix.length + bodyWidth, panel, resolved);
402
430
  });
403
431
  cacheRows(key, content, fence.carry);
404
432
  rows.push(...content);