@kenkaiiii/ggcoder 4.3.12 → 4.3.14

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 (121) hide show
  1. package/dist/cli.js.map +1 -1
  2. package/dist/config.d.ts +2 -1
  3. package/dist/config.d.ts.map +1 -1
  4. package/dist/config.js +13 -1
  5. package/dist/config.js.map +1 -1
  6. package/dist/core/settings-manager.d.ts +4 -0
  7. package/dist/core/settings-manager.d.ts.map +1 -1
  8. package/dist/core/settings-manager.js +11 -1
  9. package/dist/core/settings-manager.js.map +1 -1
  10. package/dist/tools/bash.d.ts.map +1 -1
  11. package/dist/tools/bash.js +8 -1
  12. package/dist/tools/bash.js.map +1 -1
  13. package/dist/ui/App.d.ts +2 -0
  14. package/dist/ui/App.d.ts.map +1 -1
  15. package/dist/ui/App.js +69 -57
  16. package/dist/ui/App.js.map +1 -1
  17. package/dist/ui/components/ActivityIndicator.d.ts +3 -1
  18. package/dist/ui/components/ActivityIndicator.d.ts.map +1 -1
  19. package/dist/ui/components/ActivityIndicator.js +4 -1
  20. package/dist/ui/components/ActivityIndicator.js.map +1 -1
  21. package/dist/ui/components/DiffFrame.d.ts +10 -0
  22. package/dist/ui/components/DiffFrame.d.ts.map +1 -0
  23. package/dist/ui/components/DiffFrame.js +13 -0
  24. package/dist/ui/components/DiffFrame.js.map +1 -0
  25. package/dist/ui/components/Footer.d.ts +2 -1
  26. package/dist/ui/components/Footer.d.ts.map +1 -1
  27. package/dist/ui/components/Footer.js +4 -1
  28. package/dist/ui/components/Footer.js.map +1 -1
  29. package/dist/ui/components/InputArea.d.ts.map +1 -1
  30. package/dist/ui/components/InputArea.js +176 -2
  31. package/dist/ui/components/InputArea.js.map +1 -1
  32. package/dist/ui/components/Markdown.d.ts +1 -1
  33. package/dist/ui/components/Markdown.d.ts.map +1 -1
  34. package/dist/ui/components/Markdown.js +18 -213
  35. package/dist/ui/components/Markdown.js.map +1 -1
  36. package/dist/ui/components/Ratchet.d.ts.map +1 -1
  37. package/dist/ui/components/Ratchet.js +9 -2
  38. package/dist/ui/components/Ratchet.js.map +1 -1
  39. package/dist/ui/components/ThemeSelector.d.ts +9 -0
  40. package/dist/ui/components/ThemeSelector.d.ts.map +1 -0
  41. package/dist/ui/components/ThemeSelector.js +25 -0
  42. package/dist/ui/components/ThemeSelector.js.map +1 -0
  43. package/dist/ui/components/ToolExecution.d.ts +2 -0
  44. package/dist/ui/components/ToolExecution.d.ts.map +1 -1
  45. package/dist/ui/components/ToolExecution.js +34 -15
  46. package/dist/ui/components/ToolExecution.js.map +1 -1
  47. package/dist/ui/components/ToolGroupExecution.d.ts +3 -2
  48. package/dist/ui/components/ToolGroupExecution.d.ts.map +1 -1
  49. package/dist/ui/components/ToolGroupExecution.js +68 -51
  50. package/dist/ui/components/ToolGroupExecution.js.map +1 -1
  51. package/dist/ui/hooks/useAgentLoop.d.ts +2 -0
  52. package/dist/ui/hooks/useAgentLoop.d.ts.map +1 -1
  53. package/dist/ui/hooks/useAgentLoop.js +14 -9
  54. package/dist/ui/hooks/useAgentLoop.js.map +1 -1
  55. package/dist/ui/hooks/useDoublePress.d.ts +8 -0
  56. package/dist/ui/hooks/useDoublePress.d.ts.map +1 -0
  57. package/dist/ui/hooks/useDoublePress.js +44 -0
  58. package/dist/ui/hooks/useDoublePress.js.map +1 -0
  59. package/dist/ui/live-item-flush.d.ts +4 -0
  60. package/dist/ui/live-item-flush.d.ts.map +1 -1
  61. package/dist/ui/live-item-flush.js +36 -0
  62. package/dist/ui/live-item-flush.js.map +1 -1
  63. package/dist/ui/render.d.ts +2 -1
  64. package/dist/ui/render.d.ts.map +1 -1
  65. package/dist/ui/render.js +9 -3
  66. package/dist/ui/render.js.map +1 -1
  67. package/dist/ui/stores/create-store.d.ts +15 -0
  68. package/dist/ui/stores/create-store.d.ts.map +1 -0
  69. package/dist/ui/stores/create-store.js +30 -0
  70. package/dist/ui/stores/create-store.js.map +1 -0
  71. package/dist/ui/stores/index.d.ts +3 -0
  72. package/dist/ui/stores/index.d.ts.map +1 -0
  73. package/dist/ui/stores/index.js +3 -0
  74. package/dist/ui/stores/index.js.map +1 -0
  75. package/dist/ui/stores/taskbar-store.d.ts +19 -0
  76. package/dist/ui/stores/taskbar-store.d.ts.map +1 -0
  77. package/dist/ui/stores/taskbar-store.js +59 -0
  78. package/dist/ui/stores/taskbar-store.js.map +1 -0
  79. package/dist/ui/theme/dark-ansi.json +48 -0
  80. package/dist/ui/theme/dark-daltonized.json +48 -0
  81. package/dist/ui/theme/dark.json +22 -1
  82. package/dist/ui/theme/detect-theme.d.ts +12 -8
  83. package/dist/ui/theme/detect-theme.d.ts.map +1 -1
  84. package/dist/ui/theme/detect-theme.js +43 -18
  85. package/dist/ui/theme/detect-theme.js.map +1 -1
  86. package/dist/ui/theme/light-ansi.json +48 -0
  87. package/dist/ui/theme/light-daltonized.json +48 -0
  88. package/dist/ui/theme/light.json +44 -23
  89. package/dist/ui/theme/theme.d.ts +27 -1
  90. package/dist/ui/theme/theme.d.ts.map +1 -1
  91. package/dist/ui/theme/theme.js +24 -1
  92. package/dist/ui/theme/theme.js.map +1 -1
  93. package/dist/ui/utils/highlight.d.ts +1 -1
  94. package/dist/ui/utils/highlight.d.ts.map +1 -1
  95. package/dist/ui/utils/highlight.js +24 -4
  96. package/dist/ui/utils/highlight.js.map +1 -1
  97. package/dist/ui/utils/hyperlink.d.ts +11 -0
  98. package/dist/ui/utils/hyperlink.d.ts.map +1 -0
  99. package/dist/ui/utils/hyperlink.js +27 -0
  100. package/dist/ui/utils/hyperlink.js.map +1 -0
  101. package/dist/ui/utils/markdown-cache.d.ts +5 -6
  102. package/dist/ui/utils/markdown-cache.d.ts.map +1 -1
  103. package/dist/ui/utils/markdown-cache.js +5 -5
  104. package/dist/ui/utils/markdown-cache.js.map +1 -1
  105. package/dist/ui/utils/signal.d.ts +21 -0
  106. package/dist/ui/utils/signal.d.ts.map +1 -0
  107. package/dist/ui/utils/signal.js +30 -0
  108. package/dist/ui/utils/signal.js.map +1 -0
  109. package/dist/ui/utils/supports-hyperlinks.d.ts +6 -0
  110. package/dist/ui/utils/supports-hyperlinks.d.ts.map +1 -0
  111. package/dist/ui/utils/supports-hyperlinks.js +52 -0
  112. package/dist/ui/utils/supports-hyperlinks.js.map +1 -0
  113. package/dist/ui/utils/sync-output.d.ts +16 -0
  114. package/dist/ui/utils/sync-output.d.ts.map +1 -0
  115. package/dist/ui/utils/sync-output.js +70 -0
  116. package/dist/ui/utils/sync-output.js.map +1 -0
  117. package/dist/ui/utils/token-to-ansi.d.ts +9 -0
  118. package/dist/ui/utils/token-to-ansi.d.ts.map +1 -0
  119. package/dist/ui/utils/token-to-ansi.js +305 -0
  120. package/dist/ui/utils/token-to-ansi.js.map +1 -0
  121. package/package.json +3 -3
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "light-ansi",
3
+ "primary": "#55ffff",
4
+ "secondary": "#ff55ff",
5
+ "success": "#55ff55",
6
+ "error": "#ff5555",
7
+ "warning": "#ffff55",
8
+ "text": "#ffffff",
9
+ "textDim": "#aaaaaa",
10
+ "textMuted": "#aaaaaa",
11
+ "secondaryText": "#aaaaaa",
12
+ "border": "#555555",
13
+ "background": "",
14
+ "accent": "#55ffff",
15
+ "toolName": "#55ffff",
16
+ "toolSuccess": "#55ff55",
17
+ "toolError": "#ff5555",
18
+ "diffAdded": "#55ff55",
19
+ "diffRemoved": "#ff5555",
20
+ "diffContext": "#aaaaaa",
21
+ "diffAddedDimmed": "#55ff55",
22
+ "diffRemovedDimmed": "#ff5555",
23
+ "diffAddedWord": "#55ff55",
24
+ "diffRemovedWord": "#ff5555",
25
+ "diffAddedWordDimmed": "#55ff55",
26
+ "diffRemovedWordDimmed": "#ff5555",
27
+ "spinnerColor": "#55ffff",
28
+ "claude": "#ff5555",
29
+ "claudeShimmer": "#ff5555",
30
+ "permission": "#55ffff",
31
+ "permissionShimmer": "#55ffff",
32
+ "inputPrompt": "#55ffff",
33
+ "footerText": "#aaaaaa",
34
+ "commandColor": "#ff55ff",
35
+ "planPrimary": "#ffff55",
36
+ "planBorder": "#ffff55",
37
+ "subtle": "#555555",
38
+ "link": "#55ffff",
39
+ "code": "#ffff55",
40
+ "subagent1": "#ff5555",
41
+ "subagent2": "#55ffff",
42
+ "subagent3": "#55ff55",
43
+ "subagent4": "#ffff55",
44
+ "subagent5": "#ff55ff",
45
+ "subagent6": "#ff5555",
46
+ "subagent7": "#ff55ff",
47
+ "subagent8": "#55ffff"
48
+ }
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "light-daltonized",
3
+ "primary": "#93c5fd",
4
+ "secondary": "#c4b5fd",
5
+ "success": "#93c5fd",
6
+ "error": "#fbbf24",
7
+ "warning": "#fbbf24",
8
+ "text": "#e5e7eb",
9
+ "textDim": "#6b7280",
10
+ "textMuted": "#9ca3af",
11
+ "secondaryText": "#999999",
12
+ "border": "#374151",
13
+ "background": "",
14
+ "accent": "#a5b4fc",
15
+ "toolName": "#93c5fd",
16
+ "toolSuccess": "#93c5fd",
17
+ "toolError": "#fbbf24",
18
+ "diffAdded": "#93c5fd",
19
+ "diffRemoved": "#fbbf24",
20
+ "diffContext": "#6b7280",
21
+ "diffAddedDimmed": "#bfdbfe",
22
+ "diffRemovedDimmed": "#fde68a",
23
+ "diffAddedWord": "#60a5fa",
24
+ "diffRemovedWord": "#f59e0b",
25
+ "diffAddedWordDimmed": "#93c5fd",
26
+ "diffRemovedWordDimmed": "#fbbf24",
27
+ "spinnerColor": "#93c5fd",
28
+ "claude": "#fb923c",
29
+ "claudeShimmer": "#fdba74",
30
+ "permission": "#a5b4fc",
31
+ "permissionShimmer": "#c7d2fe",
32
+ "inputPrompt": "#93c5fd",
33
+ "footerText": "#6b7280",
34
+ "commandColor": "#a5b4fc",
35
+ "planPrimary": "#fbbf24",
36
+ "planBorder": "#f59e0b",
37
+ "subtle": "#4b5563",
38
+ "link": "#93c5fd",
39
+ "code": "#fbbf24",
40
+ "subagent1": "#fbbf24",
41
+ "subagent2": "#93c5fd",
42
+ "subagent3": "#a5b4fc",
43
+ "subagent4": "#c4b5fd",
44
+ "subagent5": "#c084fc",
45
+ "subagent6": "#fb923c",
46
+ "subagent7": "#a5b4fc",
47
+ "subagent8": "#22d3ee"
48
+ }
@@ -1,27 +1,48 @@
1
1
  {
2
2
  "name": "light",
3
- "primary": "#2563eb",
4
- "secondary": "#7c3aed",
5
- "success": "#16a34a",
6
- "error": "#dc2626",
7
- "warning": "#d97706",
8
- "text": "#1f2937",
9
- "textDim": "#9ca3af",
10
- "textMuted": "#6b7280",
11
- "border": "#d1d5db",
3
+ "primary": "#93c5fd",
4
+ "secondary": "#c4b5fd",
5
+ "success": "#4ade80",
6
+ "error": "#f87171",
7
+ "warning": "#fbbf24",
8
+ "text": "#e5e7eb",
9
+ "textDim": "#6b7280",
10
+ "textMuted": "#9ca3af",
11
+ "secondaryText": "#999999",
12
+ "border": "#374151",
12
13
  "background": "",
13
- "accent": "#4f46e5",
14
- "toolName": "#2563eb",
15
- "toolSuccess": "#16a34a",
16
- "toolError": "#dc2626",
17
- "diffAdded": "#16a34a",
18
- "diffRemoved": "#dc2626",
19
- "diffContext": "#9ca3af",
20
- "spinnerColor": "#2563eb",
21
- "inputPrompt": "#2563eb",
22
- "footerText": "#9ca3af",
23
- "commandColor": "#4f46e5",
24
- "planPrimary": "#d97706",
25
- "planBorder": "#b45309",
26
- "subtle": "#d1d5db"
14
+ "accent": "#a5b4fc",
15
+ "toolName": "#93c5fd",
16
+ "toolSuccess": "#4ade80",
17
+ "toolError": "#f87171",
18
+ "diffAdded": "#4ade80",
19
+ "diffRemoved": "#f87171",
20
+ "diffContext": "#6b7280",
21
+ "diffAddedDimmed": "#69db7c",
22
+ "diffRemovedDimmed": "#ffa8b4",
23
+ "diffAddedWord": "#86efac",
24
+ "diffRemovedWord": "#fca5a5",
25
+ "diffAddedWordDimmed": "#6ee7b7",
26
+ "diffRemovedWordDimmed": "#fda4af",
27
+ "spinnerColor": "#93c5fd",
28
+ "claude": "#fb923c",
29
+ "claudeShimmer": "#fdba74",
30
+ "permission": "#a5b4fc",
31
+ "permissionShimmer": "#c7d2fe",
32
+ "inputPrompt": "#93c5fd",
33
+ "footerText": "#6b7280",
34
+ "commandColor": "#a5b4fc",
35
+ "planPrimary": "#fbbf24",
36
+ "planBorder": "#f59e0b",
37
+ "subtle": "#4b5563",
38
+ "link": "#93c5fd",
39
+ "code": "#fbbf24",
40
+ "subagent1": "#f87171",
41
+ "subagent2": "#93c5fd",
42
+ "subagent3": "#4ade80",
43
+ "subagent4": "#fbbf24",
44
+ "subagent5": "#c4b5fd",
45
+ "subagent6": "#fb923c",
46
+ "subagent7": "#f472b6",
47
+ "subagent8": "#22d3ee"
27
48
  }
@@ -1,6 +1,7 @@
1
1
  import darkTheme from "./dark.json";
2
2
  export type Theme = typeof darkTheme;
3
- export declare function loadTheme(name: "dark" | "light"): Theme;
3
+ export type ThemeName = "dark" | "light" | "dark-ansi" | "light-ansi" | "dark-daltonized" | "light-daltonized";
4
+ export declare function loadTheme(name: ThemeName): Theme;
4
5
  export declare const ThemeContext: import("react").Context<{
5
6
  name: string;
6
7
  primary: string;
@@ -11,6 +12,7 @@ export declare const ThemeContext: import("react").Context<{
11
12
  text: string;
12
13
  textDim: string;
13
14
  textMuted: string;
15
+ secondaryText: string;
14
16
  border: string;
15
17
  background: string;
16
18
  accent: string;
@@ -20,13 +22,37 @@ export declare const ThemeContext: import("react").Context<{
20
22
  diffAdded: string;
21
23
  diffRemoved: string;
22
24
  diffContext: string;
25
+ diffAddedDimmed: string;
26
+ diffRemovedDimmed: string;
27
+ diffAddedWord: string;
28
+ diffRemovedWord: string;
29
+ diffAddedWordDimmed: string;
30
+ diffRemovedWordDimmed: string;
23
31
  spinnerColor: string;
32
+ claude: string;
33
+ claudeShimmer: string;
34
+ permission: string;
35
+ permissionShimmer: string;
24
36
  inputPrompt: string;
25
37
  footerText: string;
26
38
  commandColor: string;
27
39
  planPrimary: string;
28
40
  planBorder: string;
29
41
  subtle: string;
42
+ link: string;
43
+ code: string;
44
+ subagent1: string;
45
+ subagent2: string;
46
+ subagent3: string;
47
+ subagent4: string;
48
+ subagent5: string;
49
+ subagent6: string;
50
+ subagent7: string;
51
+ subagent8: string;
30
52
  }>;
53
+ /** Callback to switch theme at runtime. Null when not inside ThemeProvider. */
54
+ export declare const SetThemeContext: import("react").Context<((name: ThemeName) => void) | null>;
31
55
  export declare function useTheme(): Theme;
56
+ /** Returns a function to switch themes at runtime. Returns null if not available. */
57
+ export declare function useSetTheme(): ((name: ThemeName) => void) | null;
32
58
  //# sourceMappingURL=theme.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../../src/ui/theme/theme.ts"],"names":[],"mappings":"AACA,OAAO,SAAS,MAAM,aAAa,CAAuB;AAG1D,MAAM,MAAM,KAAK,GAAG,OAAO,SAAS,CAAC;AAErC,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,KAAK,CAEvD;AAED,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;EAAkC,CAAC;AAE5D,wBAAgB,QAAQ,IAAI,KAAK,CAEhC"}
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../../src/ui/theme/theme.ts"],"names":[],"mappings":"AACA,OAAO,SAAS,MAAM,aAAa,CAAuB;AAO1D,MAAM,MAAM,KAAK,GAAG,OAAO,SAAS,CAAC;AAErC,MAAM,MAAM,SAAS,GACjB,MAAM,GACN,OAAO,GACP,WAAW,GACX,YAAY,GACZ,iBAAiB,GACjB,kBAAkB,CAAC;AAEvB,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,GAAG,KAAK,CAehD;AAED,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAkC,CAAC;AAE5D,+EAA+E;AAC/E,eAAO,MAAM,eAAe,kCAAyB,SAAS,KAAK,IAAI,SAAe,CAAC;AAEvF,wBAAgB,QAAQ,IAAI,KAAK,CAEhC;AAED,qFAAqF;AACrF,wBAAgB,WAAW,IAAI,CAAC,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC,GAAG,IAAI,CAEhE"}
@@ -1,11 +1,34 @@
1
1
  import { createContext, useContext } from "react";
2
2
  import darkTheme from "./dark.json" with { type: "json" };
3
3
  import lightTheme from "./light.json" with { type: "json" };
4
+ import darkAnsiTheme from "./dark-ansi.json" with { type: "json" };
5
+ import lightAnsiTheme from "./light-ansi.json" with { type: "json" };
6
+ import darkDaltonizedTheme from "./dark-daltonized.json" with { type: "json" };
7
+ import lightDaltonizedTheme from "./light-daltonized.json" with { type: "json" };
4
8
  export function loadTheme(name) {
5
- return name === "light" ? lightTheme : darkTheme;
9
+ switch (name) {
10
+ case "light":
11
+ return lightTheme;
12
+ case "dark-ansi":
13
+ return darkAnsiTheme;
14
+ case "light-ansi":
15
+ return lightAnsiTheme;
16
+ case "dark-daltonized":
17
+ return darkDaltonizedTheme;
18
+ case "light-daltonized":
19
+ return lightDaltonizedTheme;
20
+ default:
21
+ return darkTheme;
22
+ }
6
23
  }
7
24
  export const ThemeContext = createContext(darkTheme);
25
+ /** Callback to switch theme at runtime. Null when not inside ThemeProvider. */
26
+ export const SetThemeContext = createContext(null);
8
27
  export function useTheme() {
9
28
  return useContext(ThemeContext);
10
29
  }
30
+ /** Returns a function to switch themes at runtime. Returns null if not available. */
31
+ export function useSetTheme() {
32
+ return useContext(SetThemeContext);
33
+ }
11
34
  //# sourceMappingURL=theme.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../../src/ui/theme/theme.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAClD,OAAO,SAAS,MAAM,aAAa,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAC1D,OAAO,UAAU,MAAM,cAAc,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAI5D,MAAM,UAAU,SAAS,CAAC,IAAsB;IAC9C,OAAO,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;AACnD,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,aAAa,CAAQ,SAAS,CAAC,CAAC;AAE5D,MAAM,UAAU,QAAQ;IACtB,OAAO,UAAU,CAAC,YAAY,CAAC,CAAC;AAClC,CAAC"}
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../../src/ui/theme/theme.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAClD,OAAO,SAAS,MAAM,aAAa,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAC1D,OAAO,UAAU,MAAM,cAAc,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAC5D,OAAO,aAAa,MAAM,kBAAkB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACnE,OAAO,cAAc,MAAM,mBAAmB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AACrE,OAAO,mBAAmB,MAAM,wBAAwB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAC/E,OAAO,oBAAoB,MAAM,yBAAyB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAYjF,MAAM,UAAU,SAAS,CAAC,IAAe;IACvC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,OAAO;YACV,OAAO,UAAU,CAAC;QACpB,KAAK,WAAW;YACd,OAAO,aAAa,CAAC;QACvB,KAAK,YAAY;YACf,OAAO,cAAc,CAAC;QACxB,KAAK,iBAAiB;YACpB,OAAO,mBAAmB,CAAC;QAC7B,KAAK,kBAAkB;YACrB,OAAO,oBAAoB,CAAC;QAC9B;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,aAAa,CAAQ,SAAS,CAAC,CAAC;AAE5D,+EAA+E;AAC/E,MAAM,CAAC,MAAM,eAAe,GAAG,aAAa,CAAqC,IAAI,CAAC,CAAC;AAEvF,MAAM,UAAU,QAAQ;IACtB,OAAO,UAAU,CAAC,YAAY,CAAC,CAAC;AAClC,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,WAAW;IACzB,OAAO,UAAU,CAAC,eAAe,CAAC,CAAC;AACrC,CAAC"}
@@ -2,7 +2,7 @@
2
2
  export declare function langFromPath(filePath: string): string | undefined;
3
3
  /**
4
4
  * Syntax-highlight code. Returns ANSI string.
5
- * Falls back to raw code if language unknown.
5
+ * Falls back to raw code if the highlighter hasn't loaded yet or language is unknown.
6
6
  */
7
7
  export declare function highlightCode(code: string, language?: string): string;
8
8
  //# sourceMappingURL=highlight.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"highlight.d.ts","sourceRoot":"","sources":["../../../src/ui/utils/highlight.ts"],"names":[],"mappings":"AA+BA,gDAAgD;AAChD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGjE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAOrE"}
1
+ {"version":3,"file":"highlight.d.ts","sourceRoot":"","sources":["../../../src/ui/utils/highlight.ts"],"names":[],"mappings":"AA8BA,gDAAgD;AAChD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAGjE;AA4BD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CASrE"}
@@ -1,4 +1,3 @@
1
- import { highlight, supportsLanguage } from "cli-highlight";
2
1
  import path from "node:path";
3
2
  /** Map file extension to cli-highlight language name */
4
3
  const EXT_TO_LANG = {
@@ -32,15 +31,36 @@ export function langFromPath(filePath) {
32
31
  const ext = path.extname(filePath).replace(/^\./, "").toLowerCase();
33
32
  return EXT_TO_LANG[ext];
34
33
  }
34
+ // Lazy-load cli-highlight so it doesn't block initial render.
35
+ // First call returns plain text; subsequent calls use the loaded highlighter.
36
+ let hlModule;
37
+ let loadAttempted = false;
38
+ function ensureLoaded() {
39
+ if (hlModule)
40
+ return hlModule;
41
+ if (loadAttempted)
42
+ return undefined;
43
+ loadAttempted = true;
44
+ // Kick off async load for next call
45
+ import("cli-highlight").then((m) => {
46
+ hlModule = m;
47
+ }, () => {
48
+ // Failed to load — will fall back to plain text permanently
49
+ });
50
+ return undefined;
51
+ }
35
52
  /**
36
53
  * Syntax-highlight code. Returns ANSI string.
37
- * Falls back to raw code if language unknown.
54
+ * Falls back to raw code if the highlighter hasn't loaded yet or language is unknown.
38
55
  */
39
56
  export function highlightCode(code, language) {
40
- if (!language || !supportsLanguage(language))
57
+ if (!language)
58
+ return code;
59
+ const hl = ensureLoaded();
60
+ if (!hl || !hl.supportsLanguage(language))
41
61
  return code;
42
62
  try {
43
- return highlight(code, { language, ignoreIllegals: true });
63
+ return hl.highlight(code, { language, ignoreIllegals: true });
44
64
  }
45
65
  catch {
46
66
  return code;
@@ -1 +1 @@
1
- {"version":3,"file":"highlight.js","sourceRoot":"","sources":["../../../src/ui/utils/highlight.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,wDAAwD;AACxD,MAAM,WAAW,GAA2B;IAC1C,EAAE,EAAE,YAAY;IAChB,GAAG,EAAE,YAAY;IACjB,EAAE,EAAE,YAAY;IAChB,GAAG,EAAE,YAAY;IACjB,EAAE,EAAE,QAAQ;IACZ,EAAE,EAAE,MAAM;IACV,EAAE,EAAE,MAAM;IACV,EAAE,EAAE,IAAI;IACR,IAAI,EAAE,MAAM;IACZ,EAAE,EAAE,QAAQ;IACZ,EAAE,EAAE,MAAM;IACV,GAAG,EAAE,MAAM;IACX,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,MAAM;IACX,EAAE,EAAE,UAAU;IACd,IAAI,EAAE,KAAK;IACX,GAAG,EAAE,KAAK;IACV,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,KAAK;IACX,UAAU,EAAE,YAAY;CACzB,CAAC;AAEF,gDAAgD;AAChD,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACpE,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,QAAiB;IAC3D,IAAI,CAAC,QAAQ,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1D,IAAI,CAAC;QACH,OAAO,SAAS,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"highlight.js","sourceRoot":"","sources":["../../../src/ui/utils/highlight.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,wDAAwD;AACxD,MAAM,WAAW,GAA2B;IAC1C,EAAE,EAAE,YAAY;IAChB,GAAG,EAAE,YAAY;IACjB,EAAE,EAAE,YAAY;IAChB,GAAG,EAAE,YAAY;IACjB,EAAE,EAAE,QAAQ;IACZ,EAAE,EAAE,MAAM;IACV,EAAE,EAAE,MAAM;IACV,EAAE,EAAE,IAAI;IACR,IAAI,EAAE,MAAM;IACZ,EAAE,EAAE,QAAQ;IACZ,EAAE,EAAE,MAAM;IACV,GAAG,EAAE,MAAM;IACX,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,MAAM;IACX,EAAE,EAAE,UAAU;IACd,IAAI,EAAE,KAAK;IACX,GAAG,EAAE,KAAK;IACV,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,KAAK;IACX,UAAU,EAAE,YAAY;CACzB,CAAC;AAEF,gDAAgD;AAChD,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACpE,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC;AAC1B,CAAC;AAOD,8DAA8D;AAC9D,8EAA8E;AAC9E,IAAI,QAAqC,CAAC;AAC1C,IAAI,aAAa,GAAG,KAAK,CAAC;AAE1B,SAAS,YAAY;IACnB,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,IAAI,aAAa;QAAE,OAAO,SAAS,CAAC;IACpC,aAAa,GAAG,IAAI,CAAC;IACrB,oCAAoC;IACpC,MAAM,CAAC,eAAe,CAAC,CAAC,IAAI,CAC1B,CAAC,CAAC,EAAE,EAAE;QACJ,QAAQ,GAAG,CAAC,CAAC;IACf,CAAC,EACD,GAAG,EAAE;QACH,4DAA4D;IAC9D,CAAC,CACF,CAAC;IACF,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,QAAiB;IAC3D,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,MAAM,EAAE,GAAG,YAAY,EAAE,CAAC;IAC1B,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC,gBAAgB,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IACvD,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Create a clickable hyperlink using OSC 8 escape sequences.
3
+ * Falls back to plain URL if the terminal doesn't support hyperlinks.
4
+ *
5
+ * @param url - The URL to link to
6
+ * @param content - Optional content to display as the link text.
7
+ * If provided and hyperlinks are supported, this text is shown as a clickable link.
8
+ * If hyperlinks are not supported, content is ignored and only the URL is shown.
9
+ */
10
+ export declare function createHyperlink(url: string, content?: string): string;
11
+ //# sourceMappingURL=hyperlink.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hyperlink.d.ts","sourceRoot":"","sources":["../../../src/ui/utils/hyperlink.ts"],"names":[],"mappings":"AASA;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAUrE"}
@@ -0,0 +1,27 @@
1
+ import chalk from "chalk";
2
+ import { supportsHyperlinks } from "./supports-hyperlinks.js";
3
+ // OSC 8 hyperlink escape sequences
4
+ // Format: \e]8;;URL\e\\TEXT\e]8;;\e\\
5
+ // Using \x07 (BEL) as terminator which is more widely supported
6
+ const OSC8_START = "\x1b]8;;";
7
+ const OSC8_END = "\x07";
8
+ /**
9
+ * Create a clickable hyperlink using OSC 8 escape sequences.
10
+ * Falls back to plain URL if the terminal doesn't support hyperlinks.
11
+ *
12
+ * @param url - The URL to link to
13
+ * @param content - Optional content to display as the link text.
14
+ * If provided and hyperlinks are supported, this text is shown as a clickable link.
15
+ * If hyperlinks are not supported, content is ignored and only the URL is shown.
16
+ */
17
+ export function createHyperlink(url, content) {
18
+ if (!supportsHyperlinks()) {
19
+ return url;
20
+ }
21
+ // Apply basic ANSI blue color — wrap-ansi preserves this across line breaks.
22
+ // RGB colors (like theme colors) are NOT preserved by wrap-ansi with OSC 8.
23
+ const displayText = content ?? url;
24
+ const coloredText = chalk.blue(displayText);
25
+ return `${OSC8_START}${url}${OSC8_END}${coloredText}${OSC8_START}${OSC8_END}`;
26
+ }
27
+ //# sourceMappingURL=hyperlink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hyperlink.js","sourceRoot":"","sources":["../../../src/ui/utils/hyperlink.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAE9D,mCAAmC;AACnC,sCAAsC;AACtC,gEAAgE;AAChE,MAAM,UAAU,GAAG,UAAU,CAAC;AAC9B,MAAM,QAAQ,GAAG,MAAM,CAAC;AAExB;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW,EAAE,OAAgB;IAC3D,IAAI,CAAC,kBAAkB,EAAE,EAAE,CAAC;QAC1B,OAAO,GAAG,CAAC;IACb,CAAC;IAED,6EAA6E;IAC7E,4EAA4E;IAC5E,MAAM,WAAW,GAAG,OAAO,IAAI,GAAG,CAAC;IACnC,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC5C,OAAO,GAAG,UAAU,GAAG,GAAG,GAAG,QAAQ,GAAG,WAAW,GAAG,UAAU,GAAG,QAAQ,EAAE,CAAC;AAChF,CAAC"}
@@ -1,12 +1,11 @@
1
- import type { Token } from "marked";
2
- /** Simple LRU cache for parsed markdown tokens. */
3
- declare class MarkdownLRUCache {
1
+ /** Simple LRU cache for rendered markdown ANSI strings. */
2
+ declare class MarkdownAnsiCache {
4
3
  private cache;
5
- get(body: string): Token[] | undefined;
6
- set(body: string, tokens: Token[]): void;
4
+ get(body: string): string | undefined;
5
+ set(body: string, ansi: string): void;
7
6
  private hash;
8
7
  }
9
- export declare const markdownTokenCache: MarkdownLRUCache;
8
+ export declare const markdownAnsiCache: MarkdownAnsiCache;
10
9
  export declare function containsMarkdownSyntax(text: string): boolean;
11
10
  export {};
12
11
  //# sourceMappingURL=markdown-cache.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"markdown-cache.d.ts","sourceRoot":"","sources":["../../../src/ui/utils/markdown-cache.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAIpC,mDAAmD;AACnD,cAAM,gBAAgB;IACpB,OAAO,CAAC,KAAK,CAA8B;IAE3C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,EAAE,GAAG,SAAS;IAUtC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI;IAYxC,OAAO,CAAC,IAAI;CAGb;AAED,eAAO,MAAM,kBAAkB,kBAAyB,CAAC;AASzD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAI5D"}
1
+ {"version":3,"file":"markdown-cache.d.ts","sourceRoot":"","sources":["../../../src/ui/utils/markdown-cache.ts"],"names":[],"mappings":"AAIA,2DAA2D;AAC3D,cAAM,iBAAiB;IACrB,OAAO,CAAC,KAAK,CAA6B;IAE1C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAUrC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAYrC,OAAO,CAAC,IAAI;CAGb;AAED,eAAO,MAAM,iBAAiB,mBAA0B,CAAC;AASzD,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAI5D"}
@@ -1,7 +1,7 @@
1
1
  import { createHash } from "node:crypto";
2
2
  const MAX_SIZE = 500;
3
- /** Simple LRU cache for parsed markdown tokens. */
4
- class MarkdownLRUCache {
3
+ /** Simple LRU cache for rendered markdown ANSI strings. */
4
+ class MarkdownAnsiCache {
5
5
  cache = new Map();
6
6
  get(body) {
7
7
  const key = this.hash(body);
@@ -13,11 +13,11 @@ class MarkdownLRUCache {
13
13
  this.cache.set(key, entry);
14
14
  return entry;
15
15
  }
16
- set(body, tokens) {
16
+ set(body, ansi) {
17
17
  const key = this.hash(body);
18
18
  // Delete first to reset insertion order
19
19
  this.cache.delete(key);
20
- this.cache.set(key, tokens);
20
+ this.cache.set(key, ansi);
21
21
  // Evict oldest if over capacity
22
22
  if (this.cache.size > MAX_SIZE) {
23
23
  const oldest = this.cache.keys().next().value;
@@ -28,7 +28,7 @@ class MarkdownLRUCache {
28
28
  return createHash("sha256").update(body).digest("hex");
29
29
  }
30
30
  }
31
- export const markdownTokenCache = new MarkdownLRUCache();
31
+ export const markdownAnsiCache = new MarkdownAnsiCache();
32
32
  /**
33
33
  * Check whether text contains markdown syntax worth parsing.
34
34
  * If it doesn't, the caller can skip marked.lexer() entirely.
@@ -1 +1 @@
1
- {"version":3,"file":"markdown-cache.js","sourceRoot":"","sources":["../../../src/ui/utils/markdown-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,MAAM,QAAQ,GAAG,GAAG,CAAC;AAErB,mDAAmD;AACnD,MAAM,gBAAgB;IACZ,KAAK,GAAG,IAAI,GAAG,EAAmB,CAAC;IAE3C,GAAG,CAAC,IAAY;QACd,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAC;QAC7B,mCAAmC;QACnC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,GAAG,CAAC,IAAY,EAAE,MAAe;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,wCAAwC;QACxC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC5B,gCAAgC;QAChC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,QAAQ,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAM,CAAC;YAC/C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAEO,IAAI,CAAC,IAAY;QACvB,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACzD,CAAC;CACF;AAED,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,gBAAgB,EAAE,CAAC;AAEzD;;;;GAIG;AACH,MAAM,kBAAkB,GAAG,qCAAqC,CAAC;AAEjE,MAAM,UAAU,sBAAsB,CAAC,IAAY;IACjD,iDAAiD;IACjD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7D,OAAO,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACzC,CAAC"}
1
+ {"version":3,"file":"markdown-cache.js","sourceRoot":"","sources":["../../../src/ui/utils/markdown-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,QAAQ,GAAG,GAAG,CAAC;AAErB,2DAA2D;AAC3D,MAAM,iBAAiB;IACb,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IAE1C,GAAG,CAAC,IAAY;QACd,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAC;QAC7B,mCAAmC;QACnC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC3B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,GAAG,CAAC,IAAY,EAAE,IAAY;QAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,wCAAwC;QACxC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACvB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC1B,gCAAgC;QAChC,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,QAAQ,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAAM,CAAC;YAC/C,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAEO,IAAI,CAAC,IAAY;QACvB,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACzD,CAAC;CACF;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,EAAE,CAAC;AAEzD;;;;GAIG;AACH,MAAM,kBAAkB,GAAG,qCAAqC,CAAC;AAEjE,MAAM,UAAU,sBAAsB,CAAC,IAAY;IACjD,iDAAiD;IACjD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7D,OAAO,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Tiny listener-set primitive for pure event signals (no stored state).
3
+ *
4
+ * Use this when subscribers only need to know "something happened",
5
+ * not "what is the current value".
6
+ *
7
+ * Usage:
8
+ * const changed = createSignal()
9
+ * const unsub = changed.subscribe(() => console.log("changed"))
10
+ * changed.emit()
11
+ */
12
+ export interface Signal<Args extends unknown[] = []> {
13
+ /** Subscribe a listener. Returns an unsubscribe function. */
14
+ subscribe: (listener: (...args: Args) => void) => () => void;
15
+ /** Call all subscribed listeners with the given arguments. */
16
+ emit: (...args: Args) => void;
17
+ /** Remove all listeners. */
18
+ clear: () => void;
19
+ }
20
+ export declare function createSignal<Args extends unknown[] = []>(): Signal<Args>;
21
+ //# sourceMappingURL=signal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signal.d.ts","sourceRoot":"","sources":["../../../src/ui/utils/signal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,MAAM,CAAC,IAAI,SAAS,OAAO,EAAE,GAAG,EAAE;IACjD,6DAA6D;IAC7D,SAAS,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,IAAI,KAAK,MAAM,IAAI,CAAC;IAC7D,8DAA8D;IAC9D,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IAC9B,4BAA4B;IAC5B,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,wBAAgB,YAAY,CAAC,IAAI,SAAS,OAAO,EAAE,GAAG,EAAE,KAAK,MAAM,CAAC,IAAI,CAAC,CAgBxE"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Tiny listener-set primitive for pure event signals (no stored state).
3
+ *
4
+ * Use this when subscribers only need to know "something happened",
5
+ * not "what is the current value".
6
+ *
7
+ * Usage:
8
+ * const changed = createSignal()
9
+ * const unsub = changed.subscribe(() => console.log("changed"))
10
+ * changed.emit()
11
+ */
12
+ export function createSignal() {
13
+ const listeners = new Set();
14
+ return {
15
+ subscribe(listener) {
16
+ listeners.add(listener);
17
+ return () => {
18
+ listeners.delete(listener);
19
+ };
20
+ },
21
+ emit(...args) {
22
+ for (const listener of listeners)
23
+ listener(...args);
24
+ },
25
+ clear() {
26
+ listeners.clear();
27
+ },
28
+ };
29
+ }
30
+ //# sourceMappingURL=signal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signal.js","sourceRoot":"","sources":["../../../src/ui/utils/signal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAWH,MAAM,UAAU,YAAY;IAC1B,MAAM,SAAS,GAAG,IAAI,GAAG,EAA2B,CAAC;IACrD,OAAO;QACL,SAAS,CAAC,QAAQ;YAChB,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACxB,OAAO,GAAG,EAAE;gBACV,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC7B,CAAC,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,GAAG,IAAI;YACV,KAAK,MAAM,QAAQ,IAAI,SAAS;gBAAE,QAAQ,CAAC,GAAG,IAAI,CAAC,CAAC;QACtD,CAAC;QACD,KAAK;YACH,SAAS,CAAC,KAAK,EAAE,CAAC;QACpB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Returns whether stdout supports OSC 8 hyperlinks.
3
+ * Result is cached after first call since terminal support doesn't change.
4
+ */
5
+ export declare function supportsHyperlinks(): boolean;
6
+ //# sourceMappingURL=supports-hyperlinks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supports-hyperlinks.d.ts","sourceRoot":"","sources":["../../../src/ui/utils/supports-hyperlinks.ts"],"names":[],"mappings":"AAcA;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAuC5C"}
@@ -0,0 +1,52 @@
1
+ // Additional terminals that support OSC 8 hyperlinks but aren't detected by
2
+ // the supports-hyperlinks library. Checked against both TERM_PROGRAM and
3
+ // LC_TERMINAL (the latter is preserved inside tmux).
4
+ const ADDITIONAL_HYPERLINK_TERMINALS = [
5
+ "ghostty",
6
+ "Hyper",
7
+ "kitty",
8
+ "alacritty",
9
+ "iTerm.app",
10
+ "iTerm2",
11
+ ];
12
+ let cached;
13
+ /**
14
+ * Returns whether stdout supports OSC 8 hyperlinks.
15
+ * Result is cached after first call since terminal support doesn't change.
16
+ */
17
+ export function supportsHyperlinks() {
18
+ if (cached !== undefined)
19
+ return cached;
20
+ // Check TERM_PROGRAM
21
+ const termProgram = process.env["TERM_PROGRAM"];
22
+ if (termProgram && ADDITIONAL_HYPERLINK_TERMINALS.includes(termProgram)) {
23
+ cached = true;
24
+ return true;
25
+ }
26
+ // LC_TERMINAL is set by some terminals (e.g. iTerm2) and preserved inside tmux,
27
+ // where TERM_PROGRAM is overwritten to 'tmux'.
28
+ const lcTerminal = process.env["LC_TERMINAL"];
29
+ if (lcTerminal && ADDITIONAL_HYPERLINK_TERMINALS.includes(lcTerminal)) {
30
+ cached = true;
31
+ return true;
32
+ }
33
+ // Kitty sets TERM=xterm-kitty
34
+ const term = process.env["TERM"];
35
+ if (term?.includes("kitty")) {
36
+ cached = true;
37
+ return true;
38
+ }
39
+ // VS Code terminal supports hyperlinks
40
+ if (process.env["TERM_PROGRAM"] === "vscode") {
41
+ cached = true;
42
+ return true;
43
+ }
44
+ // WezTerm supports hyperlinks
45
+ if (process.env["TERM_PROGRAM"] === "WezTerm") {
46
+ cached = true;
47
+ return true;
48
+ }
49
+ cached = false;
50
+ return false;
51
+ }
52
+ //# sourceMappingURL=supports-hyperlinks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"supports-hyperlinks.js","sourceRoot":"","sources":["../../../src/ui/utils/supports-hyperlinks.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,yEAAyE;AACzE,qDAAqD;AACrD,MAAM,8BAA8B,GAAG;IACrC,SAAS;IACT,OAAO;IACP,OAAO;IACP,WAAW;IACX,WAAW;IACX,QAAQ;CACT,CAAC;AAEF,IAAI,MAA2B,CAAC;AAEhC;;;GAGG;AACH,MAAM,UAAU,kBAAkB;IAChC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IAExC,qBAAqB;IACrB,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAChD,IAAI,WAAW,IAAI,8BAA8B,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QACxE,MAAM,GAAG,IAAI,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gFAAgF;IAChF,+CAA+C;IAC/C,MAAM,UAAU,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAC9C,IAAI,UAAU,IAAI,8BAA8B,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QACtE,MAAM,GAAG,IAAI,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAED,8BAA8B;IAC9B,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACjC,IAAI,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,MAAM,GAAG,IAAI,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAED,uCAAuC;IACvC,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC7C,MAAM,GAAG,IAAI,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAED,8BAA8B;IAC9B,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,SAAS,EAAE,CAAC;QAC9C,MAAM,GAAG,IAAI,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,GAAG,KAAK,CAAC;IACf,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * DEC Private Mode 2026 — Synchronized Output.
3
+ *
4
+ * Wraps all stdout writes within a single microtask into BSU/ESU markers.
5
+ * The terminal buffers all changes between BSU and ESU, then paints atomically.
6
+ * This eliminates visible tearing/flicker during fast streaming updates.
7
+ *
8
+ * Matches Claude Code's pattern of batching all terminal patches into a single
9
+ * BSU-prefixed, ESU-suffixed write.
10
+ */
11
+ /**
12
+ * Monkey-patch process.stdout.write to coalesce all writes within a microtask
13
+ * into a single BSU/ESU-wrapped write. No-op if the terminal doesn't support it.
14
+ */
15
+ export declare function enableSyncOutput(): void;
16
+ //# sourceMappingURL=sync-output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-output.d.ts","sourceRoot":"","sources":["../../../src/ui/utils/sync-output.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AA0BH;;;GAGG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAuCvC"}