@prestyj/cli 4.2.77 → 4.3.34

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 (233) hide show
  1. package/README.md +2 -2
  2. package/dist/cli.js +335 -85
  3. package/dist/cli.js.map +1 -1
  4. package/dist/config.d.ts +10 -0
  5. package/dist/config.d.ts.map +1 -1
  6. package/dist/config.js +33 -0
  7. package/dist/config.js.map +1 -1
  8. package/dist/core/agent-session.d.ts.map +1 -1
  9. package/dist/core/agent-session.js +42 -26
  10. package/dist/core/agent-session.js.map +1 -1
  11. package/dist/core/auth-storage.d.ts.map +1 -1
  12. package/dist/core/auth-storage.js +17 -2
  13. package/dist/core/auth-storage.js.map +1 -1
  14. package/dist/core/auto-update.d.ts +16 -3
  15. package/dist/core/auto-update.d.ts.map +1 -1
  16. package/dist/core/auto-update.js +126 -56
  17. package/dist/core/auto-update.js.map +1 -1
  18. package/dist/core/auto-update.test.d.ts +2 -0
  19. package/dist/core/auto-update.test.d.ts.map +1 -0
  20. package/dist/core/auto-update.test.js +205 -0
  21. package/dist/core/auto-update.test.js.map +1 -0
  22. package/dist/core/compaction/compactor.d.ts +18 -1
  23. package/dist/core/compaction/compactor.d.ts.map +1 -1
  24. package/dist/core/compaction/compactor.js +48 -7
  25. package/dist/core/compaction/compactor.js.map +1 -1
  26. package/dist/core/compaction/compactor.test.js +39 -6
  27. package/dist/core/compaction/compactor.test.js.map +1 -1
  28. package/dist/core/compaction/token-estimator.d.ts.map +1 -1
  29. package/dist/core/compaction/token-estimator.js +4 -0
  30. package/dist/core/compaction/token-estimator.js.map +1 -1
  31. package/dist/core/compaction/token-estimator.test.js +1 -1
  32. package/dist/core/index.d.ts +1 -1
  33. package/dist/core/index.d.ts.map +1 -1
  34. package/dist/core/index.js +1 -1
  35. package/dist/core/index.js.map +1 -1
  36. package/dist/core/mcp/client.d.ts.map +1 -1
  37. package/dist/core/mcp/client.js +15 -2
  38. package/dist/core/mcp/client.js.map +1 -1
  39. package/dist/core/model-registry.d.ts.map +1 -1
  40. package/dist/core/model-registry.js +74 -5
  41. package/dist/core/model-registry.js.map +1 -1
  42. package/dist/core/oauth/types.d.ts +1 -0
  43. package/dist/core/oauth/types.d.ts.map +1 -1
  44. package/dist/core/prompt-commands.d.ts.map +1 -1
  45. package/dist/core/prompt-commands.js +134 -0
  46. package/dist/core/prompt-commands.js.map +1 -1
  47. package/dist/core/settings-manager.d.ts +5 -0
  48. package/dist/core/settings-manager.d.ts.map +1 -1
  49. package/dist/core/settings-manager.js +14 -2
  50. package/dist/core/settings-manager.js.map +1 -1
  51. package/dist/interactive.js +1 -1
  52. package/dist/interactive.js.map +1 -1
  53. package/dist/modes/agent-home-mode.d.ts +21 -0
  54. package/dist/modes/agent-home-mode.d.ts.map +1 -0
  55. package/dist/modes/agent-home-mode.js +553 -0
  56. package/dist/modes/agent-home-mode.js.map +1 -0
  57. package/dist/system-prompt.d.ts.map +1 -1
  58. package/dist/system-prompt.js +30 -14
  59. package/dist/system-prompt.js.map +1 -1
  60. package/dist/tools/bash.d.ts.map +1 -1
  61. package/dist/tools/bash.js +9 -2
  62. package/dist/tools/bash.js.map +1 -1
  63. package/dist/tools/edit.d.ts +4 -2
  64. package/dist/tools/edit.d.ts.map +1 -1
  65. package/dist/tools/edit.js +48 -33
  66. package/dist/tools/edit.js.map +1 -1
  67. package/dist/tools/edit.test.js +80 -20
  68. package/dist/tools/edit.test.js.map +1 -1
  69. package/dist/tools/grep.d.ts.map +1 -1
  70. package/dist/tools/grep.js +12 -0
  71. package/dist/tools/grep.js.map +1 -1
  72. package/dist/tools/index.d.ts +1 -0
  73. package/dist/tools/index.d.ts.map +1 -1
  74. package/dist/tools/index.js +6 -0
  75. package/dist/tools/index.js.map +1 -1
  76. package/dist/tools/overflow.js +1 -1
  77. package/dist/tools/overflow.js.map +1 -1
  78. package/dist/tools/plan-mode.test.js +2 -2
  79. package/dist/tools/plan-mode.test.js.map +1 -1
  80. package/dist/tools/read.d.ts.map +1 -1
  81. package/dist/tools/read.js +14 -1
  82. package/dist/tools/read.js.map +1 -1
  83. package/dist/tools/subagent.d.ts.map +1 -1
  84. package/dist/tools/subagent.js +20 -3
  85. package/dist/tools/subagent.js.map +1 -1
  86. package/dist/tools/web-search.d.ts +9 -0
  87. package/dist/tools/web-search.d.ts.map +1 -0
  88. package/dist/tools/web-search.js +241 -0
  89. package/dist/tools/web-search.js.map +1 -0
  90. package/dist/tools/write.js +2 -2
  91. package/dist/tools/write.js.map +1 -1
  92. package/dist/tools/write.test.js +7 -9
  93. package/dist/tools/write.test.js.map +1 -1
  94. package/dist/ui/App.d.ts +4 -0
  95. package/dist/ui/App.d.ts.map +1 -1
  96. package/dist/ui/App.js +324 -161
  97. package/dist/ui/App.js.map +1 -1
  98. package/dist/ui/activity-phrases.d.ts.map +1 -1
  99. package/dist/ui/activity-phrases.js +74 -129
  100. package/dist/ui/activity-phrases.js.map +1 -1
  101. package/dist/ui/components/ActivityIndicator.d.ts +3 -1
  102. package/dist/ui/components/ActivityIndicator.d.ts.map +1 -1
  103. package/dist/ui/components/ActivityIndicator.js +5 -2
  104. package/dist/ui/components/ActivityIndicator.js.map +1 -1
  105. package/dist/ui/components/AssistantMessage.d.ts +1 -0
  106. package/dist/ui/components/AssistantMessage.d.ts.map +1 -1
  107. package/dist/ui/components/AssistantMessage.js +2 -2
  108. package/dist/ui/components/AssistantMessage.js.map +1 -1
  109. package/dist/ui/components/DiffFrame.d.ts +10 -0
  110. package/dist/ui/components/DiffFrame.d.ts.map +1 -0
  111. package/dist/ui/components/DiffFrame.js +13 -0
  112. package/dist/ui/components/DiffFrame.js.map +1 -0
  113. package/dist/ui/components/Footer.d.ts +2 -3
  114. package/dist/ui/components/Footer.d.ts.map +1 -1
  115. package/dist/ui/components/Footer.js +6 -5
  116. package/dist/ui/components/Footer.js.map +1 -1
  117. package/dist/ui/components/InputArea.d.ts.map +1 -1
  118. package/dist/ui/components/InputArea.js +297 -8
  119. package/dist/ui/components/InputArea.js.map +1 -1
  120. package/dist/ui/components/Markdown.d.ts +1 -1
  121. package/dist/ui/components/Markdown.d.ts.map +1 -1
  122. package/dist/ui/components/Markdown.js +25 -213
  123. package/dist/ui/components/Markdown.js.map +1 -1
  124. package/dist/ui/components/ModelSelector.d.ts.map +1 -1
  125. package/dist/ui/components/ModelSelector.js +10 -2
  126. package/dist/ui/components/ModelSelector.js.map +1 -1
  127. package/dist/ui/components/Ratchet.d.ts.map +1 -1
  128. package/dist/ui/components/Ratchet.js +10 -3
  129. package/dist/ui/components/Ratchet.js.map +1 -1
  130. package/dist/ui/components/StreamingArea.d.ts.map +1 -1
  131. package/dist/ui/components/StreamingArea.js +2 -2
  132. package/dist/ui/components/StreamingArea.js.map +1 -1
  133. package/dist/ui/components/SubAgentPanel.d.ts.map +1 -1
  134. package/dist/ui/components/SubAgentPanel.js +5 -1
  135. package/dist/ui/components/SubAgentPanel.js.map +1 -1
  136. package/dist/ui/components/ThemeSelector.d.ts +9 -0
  137. package/dist/ui/components/ThemeSelector.d.ts.map +1 -0
  138. package/dist/ui/components/ThemeSelector.js +25 -0
  139. package/dist/ui/components/ThemeSelector.js.map +1 -0
  140. package/dist/ui/components/ToolExecution.d.ts +2 -0
  141. package/dist/ui/components/ToolExecution.d.ts.map +1 -1
  142. package/dist/ui/components/ToolExecution.js +95 -30
  143. package/dist/ui/components/ToolExecution.js.map +1 -1
  144. package/dist/ui/components/ToolGroupExecution.d.ts +3 -2
  145. package/dist/ui/components/ToolGroupExecution.d.ts.map +1 -1
  146. package/dist/ui/components/ToolGroupExecution.js +68 -51
  147. package/dist/ui/components/ToolGroupExecution.js.map +1 -1
  148. package/dist/ui/hooks/stall-retry-duplicate.test.d.ts +2 -0
  149. package/dist/ui/hooks/stall-retry-duplicate.test.d.ts.map +1 -0
  150. package/dist/ui/hooks/stall-retry-duplicate.test.js +94 -0
  151. package/dist/ui/hooks/stall-retry-duplicate.test.js.map +1 -0
  152. package/dist/ui/hooks/useAgentLoop.d.ts +10 -3
  153. package/dist/ui/hooks/useAgentLoop.d.ts.map +1 -1
  154. package/dist/ui/hooks/useAgentLoop.js +131 -16
  155. package/dist/ui/hooks/useAgentLoop.js.map +1 -1
  156. package/dist/ui/hooks/useDoublePress.d.ts +8 -0
  157. package/dist/ui/hooks/useDoublePress.d.ts.map +1 -0
  158. package/dist/ui/hooks/useDoublePress.js +44 -0
  159. package/dist/ui/hooks/useDoublePress.js.map +1 -0
  160. package/dist/ui/hooks/useTerminalProgress.d.ts +1 -1
  161. package/dist/ui/hooks/useTerminalProgress.d.ts.map +1 -1
  162. package/dist/ui/hooks/useTerminalProgress.js +18 -15
  163. package/dist/ui/hooks/useTerminalProgress.js.map +1 -1
  164. package/dist/ui/hooks/useTerminalTitle.d.ts +3 -6
  165. package/dist/ui/hooks/useTerminalTitle.d.ts.map +1 -1
  166. package/dist/ui/hooks/useTerminalTitle.js +10 -19
  167. package/dist/ui/hooks/useTerminalTitle.js.map +1 -1
  168. package/dist/ui/live-item-flush.d.ts +4 -0
  169. package/dist/ui/live-item-flush.d.ts.map +1 -1
  170. package/dist/ui/live-item-flush.js +36 -0
  171. package/dist/ui/live-item-flush.js.map +1 -1
  172. package/dist/ui/login.d.ts.map +1 -1
  173. package/dist/ui/login.js +3 -0
  174. package/dist/ui/login.js.map +1 -1
  175. package/dist/ui/render.d.ts +3 -1
  176. package/dist/ui/render.d.ts.map +1 -1
  177. package/dist/ui/render.js +9 -3
  178. package/dist/ui/render.js.map +1 -1
  179. package/dist/ui/stores/create-store.d.ts +15 -0
  180. package/dist/ui/stores/create-store.d.ts.map +1 -0
  181. package/dist/ui/stores/create-store.js +30 -0
  182. package/dist/ui/stores/create-store.js.map +1 -0
  183. package/dist/ui/stores/index.d.ts +3 -0
  184. package/dist/ui/stores/index.d.ts.map +1 -0
  185. package/dist/ui/stores/index.js +3 -0
  186. package/dist/ui/stores/index.js.map +1 -0
  187. package/dist/ui/stores/taskbar-store.d.ts +19 -0
  188. package/dist/ui/stores/taskbar-store.d.ts.map +1 -0
  189. package/dist/ui/stores/taskbar-store.js +59 -0
  190. package/dist/ui/stores/taskbar-store.js.map +1 -0
  191. package/dist/ui/theme/dark-ansi.json +48 -0
  192. package/dist/ui/theme/dark-daltonized.json +48 -0
  193. package/dist/ui/theme/dark.json +22 -1
  194. package/dist/ui/theme/detect-theme.d.ts +12 -8
  195. package/dist/ui/theme/detect-theme.d.ts.map +1 -1
  196. package/dist/ui/theme/detect-theme.js +58 -39
  197. package/dist/ui/theme/detect-theme.js.map +1 -1
  198. package/dist/ui/theme/light-ansi.json +48 -0
  199. package/dist/ui/theme/light-daltonized.json +48 -0
  200. package/dist/ui/theme/light.json +44 -23
  201. package/dist/ui/theme/theme.d.ts +27 -1
  202. package/dist/ui/theme/theme.d.ts.map +1 -1
  203. package/dist/ui/theme/theme.js +24 -1
  204. package/dist/ui/theme/theme.js.map +1 -1
  205. package/dist/ui/utils/highlight.d.ts +1 -1
  206. package/dist/ui/utils/highlight.d.ts.map +1 -1
  207. package/dist/ui/utils/highlight.js +24 -4
  208. package/dist/ui/utils/highlight.js.map +1 -1
  209. package/dist/ui/utils/hyperlink.d.ts +11 -0
  210. package/dist/ui/utils/hyperlink.d.ts.map +1 -0
  211. package/dist/ui/utils/hyperlink.js +27 -0
  212. package/dist/ui/utils/hyperlink.js.map +1 -0
  213. package/dist/ui/utils/markdown-cache.d.ts +5 -6
  214. package/dist/ui/utils/markdown-cache.d.ts.map +1 -1
  215. package/dist/ui/utils/markdown-cache.js +5 -5
  216. package/dist/ui/utils/markdown-cache.js.map +1 -1
  217. package/dist/ui/utils/signal.d.ts +21 -0
  218. package/dist/ui/utils/signal.d.ts.map +1 -0
  219. package/dist/ui/utils/signal.js +30 -0
  220. package/dist/ui/utils/signal.js.map +1 -0
  221. package/dist/ui/utils/supports-hyperlinks.d.ts +6 -0
  222. package/dist/ui/utils/supports-hyperlinks.d.ts.map +1 -0
  223. package/dist/ui/utils/supports-hyperlinks.js +52 -0
  224. package/dist/ui/utils/supports-hyperlinks.js.map +1 -0
  225. package/dist/ui/utils/token-to-ansi.d.ts +9 -0
  226. package/dist/ui/utils/token-to-ansi.d.ts.map +1 -0
  227. package/dist/ui/utils/token-to-ansi.js +305 -0
  228. package/dist/ui/utils/token-to-ansi.js.map +1 -0
  229. package/dist/utils/session-title.d.ts +19 -0
  230. package/dist/utils/session-title.d.ts.map +1 -0
  231. package/dist/utils/session-title.js +82 -0
  232. package/dist/utils/session-title.js.map +1 -0
  233. package/package.json +7 -5
@@ -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,9 @@
1
+ import { type Token } from "marked";
2
+ import type { Theme } from "../theme/theme.js";
3
+ /**
4
+ * Convert an array of marked block-level tokens into a single ANSI string.
5
+ * Each block is separated by a blank line. The result can be passed directly
6
+ * to Ink's `<Text>`.
7
+ */
8
+ export declare function tokensToAnsi(tokens: Token[], theme: Theme, columns: number): string;
9
+ //# sourceMappingURL=token-to-ansi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-to-ansi.d.ts","sourceRoot":"","sources":["../../../src/ui/utils/token-to-ansi.ts"],"names":[],"mappings":"AACA,OAAO,EAAU,KAAK,KAAK,EAAe,MAAM,QAAQ,CAAC;AACzD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAuF/C;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAMnF"}
@@ -0,0 +1,305 @@
1
+ import chalk from "chalk";
2
+ import { marked } from "marked";
3
+ import { highlightCode } from "./highlight.js";
4
+ import { fitToWidth, centerToWidth, plainTextLength, wrapPlainTextLines } from "./table-text.js";
5
+ import { createHyperlink } from "./hyperlink.js";
6
+ import { supportsHyperlinks } from "./supports-hyperlinks.js";
7
+ // ── Marked configuration ──────────────────────────────────
8
+ // Disable del (strikethrough) tokenizer — `~` is commonly used for
9
+ // "approximate" in LLM output and causes false strikethrough parsing.
10
+ let markedConfigured = false;
11
+ function configureMarked() {
12
+ if (markedConfigured)
13
+ return;
14
+ markedConfigured = true;
15
+ marked.use({
16
+ extensions: [
17
+ {
18
+ name: "del",
19
+ level: "inline",
20
+ start: () => -1, // never matches
21
+ tokenizer: () => undefined,
22
+ },
23
+ ],
24
+ });
25
+ }
26
+ // ── Helpers ───────────────────────────────────────────────
27
+ /** Prepend a prefix to every line in a string. */
28
+ function prefixLines(text, prefix) {
29
+ return text
30
+ .split("\n")
31
+ .map((line) => prefix + line)
32
+ .join("\n");
33
+ }
34
+ /** Convert number to lowercase letter (1→a, 2→b, ..., 27→aa). */
35
+ function numberToLetter(n) {
36
+ let result = "";
37
+ while (n > 0) {
38
+ n--;
39
+ result = String.fromCharCode(97 + (n % 26)) + result;
40
+ n = Math.floor(n / 26);
41
+ }
42
+ return result;
43
+ }
44
+ /** Convert number to lowercase roman numeral. */
45
+ function numberToRoman(n) {
46
+ const vals = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1];
47
+ const syms = ["m", "cm", "d", "cd", "c", "xc", "l", "xl", "x", "ix", "v", "iv", "i"];
48
+ let result = "";
49
+ for (let i = 0; i < vals.length; i++) {
50
+ while (n >= vals[i]) {
51
+ result += syms[i];
52
+ n -= vals[i];
53
+ }
54
+ }
55
+ return result;
56
+ }
57
+ /** Get formatted list number by depth (numeric → alpha → roman → numeric). */
58
+ function getListNumber(depth, n) {
59
+ switch (depth) {
60
+ case 0:
61
+ case 1:
62
+ return n.toString();
63
+ case 2:
64
+ return numberToLetter(n);
65
+ case 3:
66
+ return numberToRoman(n);
67
+ default:
68
+ return n.toString();
69
+ }
70
+ }
71
+ /** Replace owner/repo#123 with clickable GitHub links (OSC 8 when supported). */
72
+ const ISSUE_REF_PATTERN = /(^|[^\w./-])([A-Za-z0-9][\w-]*\/[A-Za-z0-9][\w.-]*)#(\d+)\b/g;
73
+ function linkifyIssueReferences(text) {
74
+ if (!supportsHyperlinks())
75
+ return text;
76
+ return text.replace(ISSUE_REF_PATTERN, (_match, prefix, repo, num) => {
77
+ return `${prefix}${createHyperlink(`https://github.com/${repo}/issues/${num}`, `${repo}#${num}`)}`;
78
+ });
79
+ }
80
+ // ── Main API ──────────────────────────────────────────────
81
+ /**
82
+ * Convert an array of marked block-level tokens into a single ANSI string.
83
+ * Each block is separated by a blank line. The result can be passed directly
84
+ * to Ink's `<Text>`.
85
+ */
86
+ export function tokensToAnsi(tokens, theme, columns) {
87
+ configureMarked();
88
+ return tokens
89
+ .map((t, i) => tokenToAnsi(t, theme, 0, undefined, undefined, columns, i > 0))
90
+ .join("")
91
+ .trim();
92
+ }
93
+ function tokenToAnsi(token, theme, depth, orderedIndex, parent, columns, addGap) {
94
+ const gap = addGap ? "\n" : "";
95
+ switch (token.type) {
96
+ case "heading": {
97
+ const heading = token;
98
+ const inline = inlineToAnsi(heading.tokens ?? [], theme);
99
+ switch (heading.depth) {
100
+ case 1:
101
+ return gap + chalk.bold.italic.underline(inline) + "\n\n";
102
+ default:
103
+ return gap + chalk.bold(inline) + "\n\n";
104
+ }
105
+ }
106
+ case "paragraph":
107
+ return gap + inlineToAnsi(token.tokens ?? [], theme) + "\n";
108
+ case "list": {
109
+ const list = token;
110
+ const items = list.items.map((item, idx) => {
111
+ const startNum = Number(list.start ?? 1) + idx;
112
+ const bullet = list.ordered ? `${getListNumber(depth, startNum)}. ` : "- ";
113
+ const indent = " ".repeat(depth);
114
+ const content = item.tokens
115
+ .map((t) => {
116
+ if (t.type === "text" && "tokens" in t && t.tokens) {
117
+ return inlineToAnsi(t.tokens, theme);
118
+ }
119
+ if (t.type === "list") {
120
+ return "\n" + tokenToAnsi(t, theme, depth + 1, undefined, token, columns, false);
121
+ }
122
+ if (t.type === "text") {
123
+ return linkifyIssueReferences(t.raw);
124
+ }
125
+ return tokenToAnsi(t, theme, depth + 1, undefined, token, columns, false);
126
+ })
127
+ .join("");
128
+ return indent + bullet + content;
129
+ });
130
+ return gap + items.join("\n");
131
+ }
132
+ case "code": {
133
+ const code = token;
134
+ const lang = code.lang ?? "";
135
+ const raw = code.text;
136
+ const gutter = chalk.hex(theme.border)("\u258E ");
137
+ if (!lang) {
138
+ return gap + prefixLines(raw, gutter);
139
+ }
140
+ const header = chalk.dim.italic(lang);
141
+ const highlighted = highlightCode(raw, lang);
142
+ return gap + gutter + header + "\n" + prefixLines(highlighted, gutter);
143
+ }
144
+ case "blockquote": {
145
+ const bq = token;
146
+ const inner = (bq.tokens ?? [])
147
+ .map((t) => {
148
+ if (t.type === "paragraph") {
149
+ return chalk.italic.hex(theme.textMuted)(inlineToAnsi(t.tokens ?? [], theme, theme.textMuted));
150
+ }
151
+ return tokenToAnsi(t, theme, depth, undefined, token, columns, false);
152
+ })
153
+ .join("\n");
154
+ const bar = chalk.hex(theme.accent)("\u2502 ");
155
+ return gap + prefixLines(inner, bar);
156
+ }
157
+ case "table": {
158
+ const table = token;
159
+ const numCols = table.header.length;
160
+ // Calculate natural column widths
161
+ const naturalWidths = table.header.map((cell, ci) => {
162
+ const headerLen = plainTextLength(cell.tokens);
163
+ const rowMax = table.rows.reduce((max, row) => Math.max(max, plainTextLength(row[ci]?.tokens ?? [])), 0);
164
+ return Math.max(headerLen, rowMax, 3);
165
+ });
166
+ // Cap to fit terminal
167
+ const overhead = numCols * 3 + 1; // "| " per col + trailing " |"
168
+ const availableForContent = columns - overhead;
169
+ const totalNatural = naturalWidths.reduce((a, b) => a + b, 0);
170
+ let colWidths;
171
+ if (totalNatural <= availableForContent) {
172
+ colWidths = naturalWidths;
173
+ }
174
+ else {
175
+ colWidths = [...naturalWidths];
176
+ let remaining = availableForContent;
177
+ const locked = new Set();
178
+ while (locked.size < numCols) {
179
+ const unlocked = colWidths.filter((_, i) => !locked.has(i));
180
+ const fair = Math.floor(remaining / unlocked.length);
181
+ let changed = false;
182
+ for (let i = 0; i < colWidths.length; i++) {
183
+ if (locked.has(i))
184
+ continue;
185
+ if (colWidths[i] <= fair) {
186
+ locked.add(i);
187
+ remaining -= colWidths[i];
188
+ changed = true;
189
+ }
190
+ }
191
+ if (!changed) {
192
+ const unlockedIdxs = colWidths.map((_, i) => i).filter((i) => !locked.has(i));
193
+ const each = Math.floor(remaining / unlockedIdxs.length);
194
+ let leftover = remaining - each * unlockedIdxs.length;
195
+ for (const i of unlockedIdxs) {
196
+ colWidths[i] = each + (leftover > 0 ? 1 : 0);
197
+ if (leftover > 0)
198
+ leftover--;
199
+ }
200
+ break;
201
+ }
202
+ }
203
+ }
204
+ // Box-drawing table with multi-line cell wrapping
205
+ const hLine = (left, mid, right) => left + colWidths.map((w) => "\u2501".repeat(w + 2)).join(mid) + right;
206
+ // Pre-wrap cells into lines of exactly colWidths[ci] chars
207
+ const wrapCell = (tokens, ci) => wrapPlainTextLines(tokens, colWidths[ci]).map((l) => fitToWidth(l, colWidths[ci]));
208
+ const wrapCellCenter = (tokens, ci) => wrapPlainTextLines(tokens, colWidths[ci]).map((l) => centerToWidth(l, colWidths[ci]));
209
+ const headerWrapped = table.header.map((cell, ci) => wrapCellCenter(cell.tokens, ci));
210
+ const headerLineCount = Math.max(1, ...headerWrapped.map((lines) => lines.length));
211
+ const bodyWrapped = table.rows.map((row) => row.map((cell, ci) => wrapCell(cell.tokens, ci)));
212
+ const bodyLineCounts = bodyWrapped.map((row) => Math.max(1, ...row.map((lines) => lines.length)));
213
+ const buildRowLine = (wrappedCells, lineIdx) => {
214
+ let row = "";
215
+ for (let ci = 0; ci < wrappedCells.length; ci++) {
216
+ const cell = wrappedCells[ci][lineIdx] ?? fitToWidth("", colWidths[ci]);
217
+ row += "\u2503 " + cell + " ";
218
+ }
219
+ row += "\u2503";
220
+ return row;
221
+ };
222
+ const lines = [];
223
+ // Top border
224
+ lines.push(hLine("\u250F", "\u2533", "\u2513"));
225
+ // Header lines
226
+ for (let li = 0; li < headerLineCount; li++) {
227
+ lines.push(chalk.bold(buildRowLine(headerWrapped, li)));
228
+ }
229
+ // Header/body separator
230
+ lines.push(hLine("\u2523", "\u254B", "\u252B"));
231
+ // Body rows
232
+ for (let ri = 0; ri < bodyWrapped.length; ri++) {
233
+ for (let li = 0; li < bodyLineCounts[ri]; li++) {
234
+ lines.push(buildRowLine(bodyWrapped[ri], li));
235
+ }
236
+ // Row separator (between rows, not after last)
237
+ if (ri < bodyWrapped.length - 1) {
238
+ lines.push(hLine("\u2523", "\u254B", "\u252B"));
239
+ }
240
+ }
241
+ // Bottom border
242
+ lines.push(hLine("\u2517", "\u253B", "\u251B"));
243
+ return gap + lines.join("\n");
244
+ }
245
+ case "hr":
246
+ return gap + "---";
247
+ case "space":
248
+ return "\n";
249
+ case "html":
250
+ case "def":
251
+ return "";
252
+ default:
253
+ if ("raw" in token && typeof token.raw === "string") {
254
+ return gap + token.raw;
255
+ }
256
+ return "";
257
+ }
258
+ }
259
+ function inlineToAnsi(tokens, theme, _parentColor) {
260
+ return tokens
261
+ .map((token) => {
262
+ switch (token.type) {
263
+ case "strong":
264
+ return chalk.bold(inlineToAnsi(token.tokens ?? [], theme));
265
+ case "em":
266
+ return chalk.italic(inlineToAnsi(token.tokens ?? [], theme));
267
+ case "codespan":
268
+ return chalk.hex("#e2b553")(token.text);
269
+ case "del":
270
+ return chalk.strikethrough.hex(theme.textDim)(token.text);
271
+ case "link": {
272
+ const link = token;
273
+ if (link.href.startsWith("mailto:")) {
274
+ return link.href.replace(/^mailto:/, "");
275
+ }
276
+ // Use OSC 8 clickable hyperlinks when supported
277
+ const linkText = link.text || link.href;
278
+ if (linkText !== link.href) {
279
+ return createHyperlink(link.href, linkText);
280
+ }
281
+ return createHyperlink(link.href);
282
+ }
283
+ case "image":
284
+ return token.href;
285
+ case "text": {
286
+ const textToken = token;
287
+ if ("tokens" in textToken && textToken.tokens) {
288
+ return inlineToAnsi(textToken.tokens, theme);
289
+ }
290
+ return linkifyIssueReferences(textToken.raw);
291
+ }
292
+ case "escape":
293
+ return token.text;
294
+ case "br":
295
+ return "\n";
296
+ default:
297
+ if ("raw" in token && typeof token.raw === "string") {
298
+ return token.raw;
299
+ }
300
+ return "";
301
+ }
302
+ })
303
+ .join("");
304
+ }
305
+ //# sourceMappingURL=token-to-ansi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-to-ansi.js","sourceRoot":"","sources":["../../../src/ui/utils/token-to-ansi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { type Provider } from "@prestyj/ai";
2
+ /**
3
+ * Makes a lightweight LLM call to generate a short session title
4
+ * from the conversation so far. Uses the cheapest/fastest model
5
+ * available for the given provider.
6
+ */
7
+ export declare function generateSessionTitle(opts: {
8
+ provider: Provider;
9
+ userMessage: string;
10
+ assistantPreview: string;
11
+ apiKey?: string;
12
+ baseUrl?: string;
13
+ accountId?: string;
14
+ resolveCredentials?: () => Promise<{
15
+ apiKey: string;
16
+ accountId?: string;
17
+ }>;
18
+ }): Promise<string>;
19
+ //# sourceMappingURL=session-title.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-title.d.ts","sourceRoot":"","sources":["../../src/utils/session-title.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,QAAQ,EAAoB,MAAM,aAAa,CAAC;AAIpF;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE;IAC/C,QAAQ,EAAE,QAAQ,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kBAAkB,CAAC,EAAE,MAAM,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC5E,GAAG,OAAO,CAAC,MAAM,CAAC,CA6DlB"}
@@ -0,0 +1,82 @@
1
+ import { stream } from "@prestyj/ai";
2
+ const TITLE_PROMPT = `Generate an extremely short title (3-7 words) summarizing what the user is asking for. Just the title, nothing else. No quotes, no punctuation at the end.`;
3
+ /**
4
+ * Makes a lightweight LLM call to generate a short session title
5
+ * from the conversation so far. Uses the cheapest/fastest model
6
+ * available for the given provider.
7
+ */
8
+ export async function generateSessionTitle(opts) {
9
+ // Resolve fresh credentials if available
10
+ let apiKey = opts.apiKey;
11
+ let accountId = opts.accountId;
12
+ if (opts.resolveCredentials) {
13
+ const creds = await opts.resolveCredentials();
14
+ apiKey = creds.apiKey;
15
+ accountId = creds.accountId;
16
+ }
17
+ // Use the cheapest model for title generation
18
+ const model = opts.provider === "anthropic"
19
+ ? "claude-haiku-4-5-20251001"
20
+ : opts.provider === "openai"
21
+ ? "gpt-5.1-codex-mini"
22
+ : opts.provider === "glm"
23
+ ? "glm-4.7-flash"
24
+ : opts.provider === "moonshot"
25
+ ? "kimi-k2.5"
26
+ : "claude-haiku-4-5-20251001";
27
+ const messages = [
28
+ { role: "system", content: TITLE_PROMPT },
29
+ {
30
+ role: "user",
31
+ content: `User asked: "${truncate(opts.userMessage, 300)}"\n\nAssistant began: "${truncate(opts.assistantPreview, 200)}"`,
32
+ },
33
+ ];
34
+ try {
35
+ const result = stream({
36
+ provider: opts.provider,
37
+ model,
38
+ messages,
39
+ maxTokens: 30,
40
+ temperature: 0,
41
+ apiKey,
42
+ baseUrl: opts.baseUrl,
43
+ accountId,
44
+ });
45
+ // Attach a no-op catch immediately to prevent Node's unhandled rejection
46
+ // detection from firing in the microtask gap before our await hooks up.
47
+ result.response.catch(() => { });
48
+ const response = await result;
49
+ const msg = response.message;
50
+ const text = typeof msg.content === "string"
51
+ ? msg.content
52
+ : msg.content
53
+ .filter((c) => c.type === "text")
54
+ .map((c) => c.text)
55
+ .join("");
56
+ return text.trim().replace(/[."]+$/, "") || "New conversation";
57
+ }
58
+ catch {
59
+ // Silently fall back — title generation is best-effort
60
+ return fallbackTitle(opts.userMessage);
61
+ }
62
+ }
63
+ function truncate(s, max) {
64
+ if (s.length <= max)
65
+ return s;
66
+ return s.slice(0, max) + "…";
67
+ }
68
+ function fallbackTitle(userMessage) {
69
+ if (!userMessage)
70
+ return "New conversation";
71
+ const cleaned = userMessage
72
+ .replace(/^\/\S+\s*/, "")
73
+ .replace(/\s+/g, " ")
74
+ .trim();
75
+ const first = cleaned.split(/[.\n]/)[0]?.trim() ?? cleaned;
76
+ if (first.length <= 50)
77
+ return first;
78
+ const t = first.slice(0, 50);
79
+ const sp = t.lastIndexOf(" ");
80
+ return (sp > 20 ? t.slice(0, sp) : t) + "…";
81
+ }
82
+ //# sourceMappingURL=session-title.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-title.js","sourceRoot":"","sources":["../../src/utils/session-title.ts"],"names":[],"mappings":"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"}