@prestyj/cli 4.2.15

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 (429) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +150 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +585 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/config.d.ts +15 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +27 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/core/agent-session.d.ts +65 -0
  12. package/dist/core/agent-session.d.ts.map +1 -0
  13. package/dist/core/agent-session.js +349 -0
  14. package/dist/core/agent-session.js.map +1 -0
  15. package/dist/core/agents.d.ts +32 -0
  16. package/dist/core/agents.d.ts.map +1 -0
  17. package/dist/core/agents.js +95 -0
  18. package/dist/core/agents.js.map +1 -0
  19. package/dist/core/auth-storage.d.ts +33 -0
  20. package/dist/core/auth-storage.d.ts.map +1 -0
  21. package/dist/core/auth-storage.js +95 -0
  22. package/dist/core/auth-storage.js.map +1 -0
  23. package/dist/core/auto-update.d.ts +8 -0
  24. package/dist/core/auto-update.d.ts.map +1 -0
  25. package/dist/core/auto-update.js +152 -0
  26. package/dist/core/auto-update.js.map +1 -0
  27. package/dist/core/compaction/compactor.d.ts +39 -0
  28. package/dist/core/compaction/compactor.d.ts.map +1 -0
  29. package/dist/core/compaction/compactor.js +253 -0
  30. package/dist/core/compaction/compactor.js.map +1 -0
  31. package/dist/core/compaction/compactor.test.d.ts +2 -0
  32. package/dist/core/compaction/compactor.test.d.ts.map +1 -0
  33. package/dist/core/compaction/compactor.test.js +116 -0
  34. package/dist/core/compaction/compactor.test.js.map +1 -0
  35. package/dist/core/compaction/token-estimator.d.ts +5 -0
  36. package/dist/core/compaction/token-estimator.d.ts.map +1 -0
  37. package/dist/core/compaction/token-estimator.js +36 -0
  38. package/dist/core/compaction/token-estimator.js.map +1 -0
  39. package/dist/core/compaction/token-estimator.test.d.ts +2 -0
  40. package/dist/core/compaction/token-estimator.test.d.ts.map +1 -0
  41. package/dist/core/compaction/token-estimator.test.js +115 -0
  42. package/dist/core/compaction/token-estimator.test.js.map +1 -0
  43. package/dist/core/custom-commands.d.ts +13 -0
  44. package/dist/core/custom-commands.d.ts.map +1 -0
  45. package/dist/core/custom-commands.js +40 -0
  46. package/dist/core/custom-commands.js.map +1 -0
  47. package/dist/core/event-bus.d.ts +89 -0
  48. package/dist/core/event-bus.d.ts.map +1 -0
  49. package/dist/core/event-bus.js +92 -0
  50. package/dist/core/event-bus.js.map +1 -0
  51. package/dist/core/extensions/loader.d.ts +8 -0
  52. package/dist/core/extensions/loader.d.ts.map +1 -0
  53. package/dist/core/extensions/loader.js +48 -0
  54. package/dist/core/extensions/loader.js.map +1 -0
  55. package/dist/core/extensions/types.d.ts +19 -0
  56. package/dist/core/extensions/types.d.ts.map +1 -0
  57. package/dist/core/extensions/types.js +2 -0
  58. package/dist/core/extensions/types.js.map +1 -0
  59. package/dist/core/index.d.ts +14 -0
  60. package/dist/core/index.d.ts.map +1 -0
  61. package/dist/core/index.js +13 -0
  62. package/dist/core/index.js.map +1 -0
  63. package/dist/core/logger.d.ts +26 -0
  64. package/dist/core/logger.d.ts.map +1 -0
  65. package/dist/core/logger.js +132 -0
  66. package/dist/core/logger.js.map +1 -0
  67. package/dist/core/mcp/client.d.ts +35 -0
  68. package/dist/core/mcp/client.d.ts.map +1 -0
  69. package/dist/core/mcp/client.js +233 -0
  70. package/dist/core/mcp/client.js.map +1 -0
  71. package/dist/core/mcp/defaults.d.ts +9 -0
  72. package/dist/core/mcp/defaults.d.ts.map +1 -0
  73. package/dist/core/mcp/defaults.js +51 -0
  74. package/dist/core/mcp/defaults.js.map +1 -0
  75. package/dist/core/mcp/index.d.ts +4 -0
  76. package/dist/core/mcp/index.d.ts.map +1 -0
  77. package/dist/core/mcp/index.js +3 -0
  78. package/dist/core/mcp/index.js.map +1 -0
  79. package/dist/core/mcp/types.d.ts +17 -0
  80. package/dist/core/mcp/types.d.ts.map +1 -0
  81. package/dist/core/mcp/types.js +2 -0
  82. package/dist/core/mcp/types.js.map +1 -0
  83. package/dist/core/model-registry.d.ts +24 -0
  84. package/dist/core/model-registry.d.ts.map +1 -0
  85. package/dist/core/model-registry.js +124 -0
  86. package/dist/core/model-registry.js.map +1 -0
  87. package/dist/core/oauth/anthropic.d.ts +4 -0
  88. package/dist/core/oauth/anthropic.d.ts.map +1 -0
  89. package/dist/core/oauth/anthropic.js +75 -0
  90. package/dist/core/oauth/anthropic.js.map +1 -0
  91. package/dist/core/oauth/openai.d.ts +4 -0
  92. package/dist/core/oauth/openai.d.ts.map +1 -0
  93. package/dist/core/oauth/openai.js +186 -0
  94. package/dist/core/oauth/openai.js.map +1 -0
  95. package/dist/core/oauth/pkce.d.ts +5 -0
  96. package/dist/core/oauth/pkce.d.ts.map +1 -0
  97. package/dist/core/oauth/pkce.js +17 -0
  98. package/dist/core/oauth/pkce.js.map +1 -0
  99. package/dist/core/oauth/types.d.ts +12 -0
  100. package/dist/core/oauth/types.d.ts.map +1 -0
  101. package/dist/core/oauth/types.js +2 -0
  102. package/dist/core/oauth/types.js.map +1 -0
  103. package/dist/core/process-manager.d.ts +30 -0
  104. package/dist/core/process-manager.d.ts.map +1 -0
  105. package/dist/core/process-manager.js +125 -0
  106. package/dist/core/process-manager.js.map +1 -0
  107. package/dist/core/prompt-commands.d.ts +14 -0
  108. package/dist/core/prompt-commands.d.ts.map +1 -0
  109. package/dist/core/prompt-commands.js +475 -0
  110. package/dist/core/prompt-commands.js.map +1 -0
  111. package/dist/core/session-manager.d.ts +80 -0
  112. package/dist/core/session-manager.d.ts.map +1 -0
  113. package/dist/core/session-manager.js +220 -0
  114. package/dist/core/session-manager.js.map +1 -0
  115. package/dist/core/settings-manager.d.ts +43 -0
  116. package/dist/core/settings-manager.d.ts.map +1 -0
  117. package/dist/core/settings-manager.js +64 -0
  118. package/dist/core/settings-manager.js.map +1 -0
  119. package/dist/core/skills.d.ts +23 -0
  120. package/dist/core/skills.d.ts.map +1 -0
  121. package/dist/core/skills.js +89 -0
  122. package/dist/core/skills.js.map +1 -0
  123. package/dist/core/slash-commands.d.ts +31 -0
  124. package/dist/core/slash-commands.d.ts.map +1 -0
  125. package/dist/core/slash-commands.js +161 -0
  126. package/dist/core/slash-commands.js.map +1 -0
  127. package/dist/index.d.ts +10 -0
  128. package/dist/index.d.ts.map +1 -0
  129. package/dist/index.js +15 -0
  130. package/dist/index.js.map +1 -0
  131. package/dist/interactive.d.ts +3 -0
  132. package/dist/interactive.d.ts.map +1 -0
  133. package/dist/interactive.js +154 -0
  134. package/dist/interactive.js.map +1 -0
  135. package/dist/modes/index.d.ts +2 -0
  136. package/dist/modes/index.d.ts.map +1 -0
  137. package/dist/modes/index.js +2 -0
  138. package/dist/modes/index.js.map +1 -0
  139. package/dist/modes/json-mode.d.ts +13 -0
  140. package/dist/modes/json-mode.d.ts.map +1 -0
  141. package/dist/modes/json-mode.js +74 -0
  142. package/dist/modes/json-mode.js.map +1 -0
  143. package/dist/modes/print-mode.d.ts +12 -0
  144. package/dist/modes/print-mode.d.ts.map +1 -0
  145. package/dist/modes/print-mode.js +49 -0
  146. package/dist/modes/print-mode.js.map +1 -0
  147. package/dist/session.d.ts +16 -0
  148. package/dist/session.d.ts.map +1 -0
  149. package/dist/session.js +122 -0
  150. package/dist/session.js.map +1 -0
  151. package/dist/system-prompt.d.ts +6 -0
  152. package/dist/system-prompt.d.ts.map +1 -0
  153. package/dist/system-prompt.js +118 -0
  154. package/dist/system-prompt.js.map +1 -0
  155. package/dist/tools/bash.d.ts +11 -0
  156. package/dist/tools/bash.d.ts.map +1 -0
  157. package/dist/tools/bash.js +115 -0
  158. package/dist/tools/bash.js.map +1 -0
  159. package/dist/tools/edit-diff.d.ts +18 -0
  160. package/dist/tools/edit-diff.d.ts.map +1 -0
  161. package/dist/tools/edit-diff.js +92 -0
  162. package/dist/tools/edit-diff.js.map +1 -0
  163. package/dist/tools/edit.d.ts +10 -0
  164. package/dist/tools/edit.d.ts.map +1 -0
  165. package/dist/tools/edit.js +56 -0
  166. package/dist/tools/edit.js.map +1 -0
  167. package/dist/tools/find.d.ts +9 -0
  168. package/dist/tools/find.d.ts.map +1 -0
  169. package/dist/tools/find.js +59 -0
  170. package/dist/tools/find.js.map +1 -0
  171. package/dist/tools/grep.d.ts +12 -0
  172. package/dist/tools/grep.d.ts.map +1 -0
  173. package/dist/tools/grep.js +122 -0
  174. package/dist/tools/grep.js.map +1 -0
  175. package/dist/tools/index.d.ts +26 -0
  176. package/dist/tools/index.d.ts.map +1 -0
  177. package/dist/tools/index.js +47 -0
  178. package/dist/tools/index.js.map +1 -0
  179. package/dist/tools/ls.d.ts +9 -0
  180. package/dist/tools/ls.d.ts.map +1 -0
  181. package/dist/tools/ls.js +56 -0
  182. package/dist/tools/ls.js.map +1 -0
  183. package/dist/tools/path-utils.d.ts +2 -0
  184. package/dist/tools/path-utils.d.ts.map +1 -0
  185. package/dist/tools/path-utils.js +9 -0
  186. package/dist/tools/path-utils.js.map +1 -0
  187. package/dist/tools/read.d.ts +11 -0
  188. package/dist/tools/read.d.ts.map +1 -0
  189. package/dist/tools/read.js +112 -0
  190. package/dist/tools/read.js.map +1 -0
  191. package/dist/tools/subagent.d.ts +26 -0
  192. package/dist/tools/subagent.d.ts.map +1 -0
  193. package/dist/tools/subagent.js +171 -0
  194. package/dist/tools/subagent.js.map +1 -0
  195. package/dist/tools/task-output.d.ts +10 -0
  196. package/dist/tools/task-output.d.ts.map +1 -0
  197. package/dist/tools/task-output.js +33 -0
  198. package/dist/tools/task-output.js.map +1 -0
  199. package/dist/tools/task-stop.d.ts +9 -0
  200. package/dist/tools/task-stop.d.ts.map +1 -0
  201. package/dist/tools/task-stop.js +15 -0
  202. package/dist/tools/task-stop.js.map +1 -0
  203. package/dist/tools/tasks.d.ts +16 -0
  204. package/dist/tools/tasks.d.ts.map +1 -0
  205. package/dist/tools/tasks.js +132 -0
  206. package/dist/tools/tasks.js.map +1 -0
  207. package/dist/tools/truncate.d.ts +19 -0
  208. package/dist/tools/truncate.d.ts.map +1 -0
  209. package/dist/tools/truncate.js +59 -0
  210. package/dist/tools/truncate.js.map +1 -0
  211. package/dist/tools/truncate.test.d.ts +2 -0
  212. package/dist/tools/truncate.test.d.ts.map +1 -0
  213. package/dist/tools/truncate.test.js +100 -0
  214. package/dist/tools/truncate.test.js.map +1 -0
  215. package/dist/tools/web-fetch.d.ts +9 -0
  216. package/dist/tools/web-fetch.d.ts.map +1 -0
  217. package/dist/tools/web-fetch.js +50 -0
  218. package/dist/tools/web-fetch.js.map +1 -0
  219. package/dist/tools/write.d.ts +9 -0
  220. package/dist/tools/write.d.ts.map +1 -0
  221. package/dist/tools/write.js +31 -0
  222. package/dist/tools/write.js.map +1 -0
  223. package/dist/tools/write.test.d.ts +2 -0
  224. package/dist/tools/write.test.d.ts.map +1 -0
  225. package/dist/tools/write.test.js +84 -0
  226. package/dist/tools/write.test.js.map +1 -0
  227. package/dist/types.d.ts +36 -0
  228. package/dist/types.d.ts.map +1 -0
  229. package/dist/types.js +2 -0
  230. package/dist/types.js.map +1 -0
  231. package/dist/ui/App.d.ts +131 -0
  232. package/dist/ui/App.d.ts.map +1 -0
  233. package/dist/ui/App.js +1101 -0
  234. package/dist/ui/App.js.map +1 -0
  235. package/dist/ui/components/ActivityIndicator.d.ts +13 -0
  236. package/dist/ui/components/ActivityIndicator.d.ts.map +1 -0
  237. package/dist/ui/components/ActivityIndicator.js +313 -0
  238. package/dist/ui/components/ActivityIndicator.js.map +1 -0
  239. package/dist/ui/components/AssistantMessage.d.ts +9 -0
  240. package/dist/ui/components/AssistantMessage.d.ts.map +1 -0
  241. package/dist/ui/components/AssistantMessage.js +11 -0
  242. package/dist/ui/components/AssistantMessage.js.map +1 -0
  243. package/dist/ui/components/BackgroundTasksBar.d.ts +15 -0
  244. package/dist/ui/components/BackgroundTasksBar.d.ts.map +1 -0
  245. package/dist/ui/components/BackgroundTasksBar.js +74 -0
  246. package/dist/ui/components/BackgroundTasksBar.js.map +1 -0
  247. package/dist/ui/components/Banner.d.ts +11 -0
  248. package/dist/ui/components/Banner.d.ts.map +1 -0
  249. package/dist/ui/components/Banner.js +58 -0
  250. package/dist/ui/components/Banner.js.map +1 -0
  251. package/dist/ui/components/CompactionNotice.d.ts +10 -0
  252. package/dist/ui/components/CompactionNotice.d.ts.map +1 -0
  253. package/dist/ui/components/CompactionNotice.js +31 -0
  254. package/dist/ui/components/CompactionNotice.js.map +1 -0
  255. package/dist/ui/components/DiffView.d.ts +4 -0
  256. package/dist/ui/components/DiffView.d.ts.map +1 -0
  257. package/dist/ui/components/DiffView.js +20 -0
  258. package/dist/ui/components/DiffView.js.map +1 -0
  259. package/dist/ui/components/Footer.d.ts +10 -0
  260. package/dist/ui/components/Footer.d.ts.map +1 -0
  261. package/dist/ui/components/Footer.js +116 -0
  262. package/dist/ui/components/Footer.js.map +1 -0
  263. package/dist/ui/components/InputArea.d.ts +21 -0
  264. package/dist/ui/components/InputArea.d.ts.map +1 -0
  265. package/dist/ui/components/InputArea.js +476 -0
  266. package/dist/ui/components/InputArea.js.map +1 -0
  267. package/dist/ui/components/Markdown.d.ts +9 -0
  268. package/dist/ui/components/Markdown.d.ts.map +1 -0
  269. package/dist/ui/components/Markdown.js +246 -0
  270. package/dist/ui/components/Markdown.js.map +1 -0
  271. package/dist/ui/components/ModelSelector.d.ts +11 -0
  272. package/dist/ui/components/ModelSelector.d.ts.map +1 -0
  273. package/dist/ui/components/ModelSelector.js +20 -0
  274. package/dist/ui/components/ModelSelector.js.map +1 -0
  275. package/dist/ui/components/Overlay.d.ts +8 -0
  276. package/dist/ui/components/Overlay.d.ts.map +1 -0
  277. package/dist/ui/components/Overlay.js +9 -0
  278. package/dist/ui/components/Overlay.js.map +1 -0
  279. package/dist/ui/components/SelectList.d.ts +14 -0
  280. package/dist/ui/components/SelectList.d.ts.map +1 -0
  281. package/dist/ui/components/SelectList.js +46 -0
  282. package/dist/ui/components/SelectList.js.map +1 -0
  283. package/dist/ui/components/ServerToolExecution.d.ts +16 -0
  284. package/dist/ui/components/ServerToolExecution.d.ts.map +1 -0
  285. package/dist/ui/components/ServerToolExecution.js +25 -0
  286. package/dist/ui/components/ServerToolExecution.js.map +1 -0
  287. package/dist/ui/components/SessionSelector.d.ts +9 -0
  288. package/dist/ui/components/SessionSelector.d.ts.map +1 -0
  289. package/dist/ui/components/SessionSelector.js +13 -0
  290. package/dist/ui/components/SessionSelector.js.map +1 -0
  291. package/dist/ui/components/SettingsSelector.d.ts +9 -0
  292. package/dist/ui/components/SettingsSelector.d.ts.map +1 -0
  293. package/dist/ui/components/SettingsSelector.js +13 -0
  294. package/dist/ui/components/SettingsSelector.js.map +1 -0
  295. package/dist/ui/components/SlashCommandMenu.d.ts +15 -0
  296. package/dist/ui/components/SlashCommandMenu.d.ts.map +1 -0
  297. package/dist/ui/components/SlashCommandMenu.js +32 -0
  298. package/dist/ui/components/SlashCommandMenu.js.map +1 -0
  299. package/dist/ui/components/Spinner.d.ts +4 -0
  300. package/dist/ui/components/Spinner.d.ts.map +1 -0
  301. package/dist/ui/components/Spinner.js +17 -0
  302. package/dist/ui/components/Spinner.js.map +1 -0
  303. package/dist/ui/components/StreamingArea.d.ts +10 -0
  304. package/dist/ui/components/StreamingArea.d.ts.map +1 -0
  305. package/dist/ui/components/StreamingArea.js +56 -0
  306. package/dist/ui/components/StreamingArea.js.map +1 -0
  307. package/dist/ui/components/SubAgentPanel.d.ts +21 -0
  308. package/dist/ui/components/SubAgentPanel.d.ts.map +1 -0
  309. package/dist/ui/components/SubAgentPanel.js +83 -0
  310. package/dist/ui/components/SubAgentPanel.js.map +1 -0
  311. package/dist/ui/components/TaskOverlay.d.ts +10 -0
  312. package/dist/ui/components/TaskOverlay.d.ts.map +1 -0
  313. package/dist/ui/components/TaskOverlay.js +259 -0
  314. package/dist/ui/components/TaskOverlay.js.map +1 -0
  315. package/dist/ui/components/ThinkingBlock.d.ts +11 -0
  316. package/dist/ui/components/ThinkingBlock.d.ts.map +1 -0
  317. package/dist/ui/components/ThinkingBlock.js +40 -0
  318. package/dist/ui/components/ThinkingBlock.js.map +1 -0
  319. package/dist/ui/components/ThinkingIndicator.d.ts +6 -0
  320. package/dist/ui/components/ThinkingIndicator.d.ts.map +1 -0
  321. package/dist/ui/components/ThinkingIndicator.js +169 -0
  322. package/dist/ui/components/ThinkingIndicator.js.map +1 -0
  323. package/dist/ui/components/ToolExecution.d.ts +16 -0
  324. package/dist/ui/components/ToolExecution.d.ts.map +1 -0
  325. package/dist/ui/components/ToolExecution.js +456 -0
  326. package/dist/ui/components/ToolExecution.js.map +1 -0
  327. package/dist/ui/components/UserMessage.d.ts +7 -0
  328. package/dist/ui/components/UserMessage.d.ts.map +1 -0
  329. package/dist/ui/components/UserMessage.js +16 -0
  330. package/dist/ui/components/UserMessage.js.map +1 -0
  331. package/dist/ui/components/index.d.ts +14 -0
  332. package/dist/ui/components/index.d.ts.map +1 -0
  333. package/dist/ui/components/index.js +14 -0
  334. package/dist/ui/components/index.js.map +1 -0
  335. package/dist/ui/hooks/useAgentLoop.d.ts +69 -0
  336. package/dist/ui/hooks/useAgentLoop.d.ts.map +1 -0
  337. package/dist/ui/hooks/useAgentLoop.js +466 -0
  338. package/dist/ui/hooks/useAgentLoop.js.map +1 -0
  339. package/dist/ui/hooks/useSessionManager.d.ts +13 -0
  340. package/dist/ui/hooks/useSessionManager.d.ts.map +1 -0
  341. package/dist/ui/hooks/useSessionManager.js +43 -0
  342. package/dist/ui/hooks/useSessionManager.js.map +1 -0
  343. package/dist/ui/hooks/useSlashCommands.d.ts +7 -0
  344. package/dist/ui/hooks/useSlashCommands.d.ts.map +1 -0
  345. package/dist/ui/hooks/useSlashCommands.js +11 -0
  346. package/dist/ui/hooks/useSlashCommands.js.map +1 -0
  347. package/dist/ui/hooks/useTerminalSize.d.ts +20 -0
  348. package/dist/ui/hooks/useTerminalSize.d.ts.map +1 -0
  349. package/dist/ui/hooks/useTerminalSize.js +53 -0
  350. package/dist/ui/hooks/useTerminalSize.js.map +1 -0
  351. package/dist/ui/hooks/useTerminalTitle.d.ts +3 -0
  352. package/dist/ui/hooks/useTerminalTitle.d.ts.map +1 -0
  353. package/dist/ui/hooks/useTerminalTitle.js +49 -0
  354. package/dist/ui/hooks/useTerminalTitle.js.map +1 -0
  355. package/dist/ui/live-item-flush.d.ts +49 -0
  356. package/dist/ui/live-item-flush.d.ts.map +1 -0
  357. package/dist/ui/live-item-flush.js +56 -0
  358. package/dist/ui/live-item-flush.js.map +1 -0
  359. package/dist/ui/live-item-flush.test.d.ts +2 -0
  360. package/dist/ui/live-item-flush.test.d.ts.map +1 -0
  361. package/dist/ui/live-item-flush.test.js +307 -0
  362. package/dist/ui/live-item-flush.test.js.map +1 -0
  363. package/dist/ui/login.d.ts +3 -0
  364. package/dist/ui/login.d.ts.map +1 -0
  365. package/dist/ui/login.js +93 -0
  366. package/dist/ui/login.js.map +1 -0
  367. package/dist/ui/render.d.ts +38 -0
  368. package/dist/ui/render.d.ts.map +1 -0
  369. package/dist/ui/render.js +63 -0
  370. package/dist/ui/render.js.map +1 -0
  371. package/dist/ui/spinner-frames.d.ts +3 -0
  372. package/dist/ui/spinner-frames.d.ts.map +1 -0
  373. package/dist/ui/spinner-frames.js +7 -0
  374. package/dist/ui/spinner-frames.js.map +1 -0
  375. package/dist/ui/theme/dark.json +24 -0
  376. package/dist/ui/theme/detect-theme.d.ts +12 -0
  377. package/dist/ui/theme/detect-theme.d.ts.map +1 -0
  378. package/dist/ui/theme/detect-theme.js +152 -0
  379. package/dist/ui/theme/detect-theme.js.map +1 -0
  380. package/dist/ui/theme/light.json +24 -0
  381. package/dist/ui/theme/theme.d.ts +29 -0
  382. package/dist/ui/theme/theme.d.ts.map +1 -0
  383. package/dist/ui/theme/theme.js +11 -0
  384. package/dist/ui/theme/theme.js.map +1 -0
  385. package/dist/ui/utils/highlight.d.ts +8 -0
  386. package/dist/ui/utils/highlight.d.ts.map +1 -0
  387. package/dist/ui/utils/highlight.js +49 -0
  388. package/dist/ui/utils/highlight.js.map +1 -0
  389. package/dist/ui/utils/table-text.d.ts +25 -0
  390. package/dist/ui/utils/table-text.d.ts.map +1 -0
  391. package/dist/ui/utils/table-text.js +78 -0
  392. package/dist/ui/utils/table-text.js.map +1 -0
  393. package/dist/ui/utils/table-text.test.d.ts +2 -0
  394. package/dist/ui/utils/table-text.test.d.ts.map +1 -0
  395. package/dist/ui/utils/table-text.test.js +202 -0
  396. package/dist/ui/utils/table-text.test.js.map +1 -0
  397. package/dist/utils/error-handler.d.ts +5 -0
  398. package/dist/utils/error-handler.d.ts.map +1 -0
  399. package/dist/utils/error-handler.js +108 -0
  400. package/dist/utils/error-handler.js.map +1 -0
  401. package/dist/utils/format.d.ts +21 -0
  402. package/dist/utils/format.d.ts.map +1 -0
  403. package/dist/utils/format.js +120 -0
  404. package/dist/utils/format.js.map +1 -0
  405. package/dist/utils/git.d.ts +2 -0
  406. package/dist/utils/git.d.ts.map +1 -0
  407. package/dist/utils/git.js +13 -0
  408. package/dist/utils/git.js.map +1 -0
  409. package/dist/utils/image.d.ts +30 -0
  410. package/dist/utils/image.d.ts.map +1 -0
  411. package/dist/utils/image.js +176 -0
  412. package/dist/utils/image.js.map +1 -0
  413. package/dist/utils/markdown.d.ts +6 -0
  414. package/dist/utils/markdown.d.ts.map +1 -0
  415. package/dist/utils/markdown.js +25 -0
  416. package/dist/utils/markdown.js.map +1 -0
  417. package/dist/utils/process.d.ts +6 -0
  418. package/dist/utils/process.d.ts.map +1 -0
  419. package/dist/utils/process.js +19 -0
  420. package/dist/utils/process.js.map +1 -0
  421. package/dist/utils/shell.d.ts +3 -0
  422. package/dist/utils/shell.d.ts.map +1 -0
  423. package/dist/utils/shell.js +8 -0
  424. package/dist/utils/shell.js.map +1 -0
  425. package/dist/utils/sound.d.ts +2 -0
  426. package/dist/utils/sound.d.ts.map +1 -0
  427. package/dist/utils/sound.js +11 -0
  428. package/dist/utils/sound.js.map +1 -0
  429. package/package.json +56 -0
@@ -0,0 +1,93 @@
1
+ import chalk from "chalk";
2
+ const LOGO_LINES = [" █▀▀▀ ▀▀▀█", " █▀▀ ▄▀ ", " █▄▄▄ █▄▄▄"];
3
+ const GRADIENT = ["#60a5fa", "#6da1f9", "#7a9df7", "#8799f5", "#9495f3", "#a18ff1", "#a78bfa"];
4
+ const GAP = " ";
5
+ const PRIMARY = "#60a5fa";
6
+ const TEXT = "#e2e8f0";
7
+ const TEXT_DIM = "#64748b";
8
+ const PROVIDERS = [
9
+ { label: "Anthropic", value: "anthropic", description: "Claude Opus, Sonnet, Haiku" },
10
+ { label: "OpenAI", value: "openai", description: "GPT-5.3 Codex, GPT-5.1 Codex Mini" },
11
+ { label: "Z.AI (GLM)", value: "glm", description: "GLM-5, GLM-4.7" },
12
+ { label: "Moonshot", value: "moonshot", description: "Kimi K2.5" },
13
+ ];
14
+ function gradientLine(text) {
15
+ let result = "";
16
+ let colorIdx = 0;
17
+ for (const ch of text) {
18
+ if (ch === " ") {
19
+ result += ch;
20
+ }
21
+ else {
22
+ const color = GRADIENT[Math.min(colorIdx, GRADIENT.length - 1)];
23
+ result += chalk.hex(color)(ch);
24
+ colorIdx++;
25
+ }
26
+ }
27
+ return result;
28
+ }
29
+ function renderScreen(selectedIndex) {
30
+ const lines = [];
31
+ lines.push(gradientLine(LOGO_LINES[0]) + GAP + chalk.hex(PRIMARY).bold("Login"));
32
+ lines.push(gradientLine(LOGO_LINES[1]) + GAP + chalk.hex(TEXT_DIM)("Select a provider"));
33
+ lines.push(gradientLine(LOGO_LINES[2]));
34
+ lines.push("");
35
+ for (let i = 0; i < PROVIDERS.length; i++) {
36
+ const item = PROVIDERS[i];
37
+ const selected = i === selectedIndex;
38
+ const marker = selected ? "❯ " : " ";
39
+ const labelColor = selected ? PRIMARY : TEXT;
40
+ lines.push(chalk.hex(labelColor)(marker + item.label) + chalk.hex(TEXT_DIM)(` — ${item.description}`));
41
+ }
42
+ lines.push("");
43
+ lines.push(chalk.hex(TEXT_DIM)("↑↓ navigate · Enter select · Esc cancel"));
44
+ return lines.join("\n");
45
+ }
46
+ export function renderLoginSelector() {
47
+ return new Promise((resolve) => {
48
+ let selectedIndex = 0;
49
+ const draw = () => {
50
+ // Restore saved cursor position, clear everything below, then draw
51
+ process.stdout.write("\x1b[u\x1b[J" + renderScreen(selectedIndex) + "\n");
52
+ };
53
+ // Save cursor position, then draw
54
+ process.stdout.write("\n\x1b[s");
55
+ draw();
56
+ process.stdin.setRawMode(true);
57
+ process.stdin.resume();
58
+ const cleanup = () => {
59
+ process.stdin.removeListener("data", onData);
60
+ process.stdin.setRawMode(false);
61
+ process.stdin.pause();
62
+ // Clear the selector display
63
+ process.stdout.write("\x1b[u\x1b[J");
64
+ };
65
+ const onData = (chunk) => {
66
+ const key = chunk.toString();
67
+ // Escape or Ctrl+C → cancel
68
+ if (key === "\x1b" || key === "\x03") {
69
+ cleanup();
70
+ resolve(null);
71
+ return;
72
+ }
73
+ // Enter → select
74
+ if (key === "\r" || key === "\n") {
75
+ cleanup();
76
+ resolve(PROVIDERS[selectedIndex].value);
77
+ return;
78
+ }
79
+ // Up arrow
80
+ if (key === "\x1b[A" && selectedIndex > 0) {
81
+ selectedIndex--;
82
+ draw();
83
+ }
84
+ // Down arrow
85
+ if (key === "\x1b[B" && selectedIndex < PROVIDERS.length - 1) {
86
+ selectedIndex++;
87
+ draw();
88
+ }
89
+ };
90
+ process.stdin.on("data", onData);
91
+ });
92
+ }
93
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/ui/login.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import type { Message, Provider, ThinkingLevel } from "@prestyj/ai";
2
+ import type { AgentTool } from "@prestyj/agent";
3
+ import type { ProcessManager } from "../core/process-manager.js";
4
+ import type { MCPClientManager } from "../core/mcp/index.js";
5
+ import type { AuthStorage } from "../core/auth-storage.js";
6
+ import { type CompletedItem } from "./App.js";
7
+ export interface RenderAppConfig {
8
+ provider: Provider;
9
+ model: string;
10
+ tools: AgentTool[];
11
+ webSearch?: boolean;
12
+ messages: Message[];
13
+ maxTokens: number;
14
+ thinking?: ThinkingLevel;
15
+ apiKey?: string;
16
+ baseUrl?: string;
17
+ accountId?: string;
18
+ cwd: string;
19
+ version: string;
20
+ theme?: "auto" | "dark" | "light";
21
+ showThinking?: boolean;
22
+ showTokenUsage?: boolean;
23
+ onSlashCommand?: (input: string) => Promise<string | null>;
24
+ loggedInProviders?: Provider[];
25
+ credentialsByProvider?: Record<string, {
26
+ accessToken: string;
27
+ accountId?: string;
28
+ }>;
29
+ initialHistory?: CompletedItem[];
30
+ sessionsDir?: string;
31
+ sessionPath?: string;
32
+ processManager?: ProcessManager;
33
+ settingsFile?: string;
34
+ mcpManager?: MCPClientManager;
35
+ authStorage?: AuthStorage;
36
+ }
37
+ export declare function renderApp(config: RenderAppConfig): Promise<void>;
38
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/ui/render.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAO,KAAK,aAAa,EAAE,MAAM,UAAU,CAAC;AAInD,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IAClC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC3D,iBAAiB,CAAC,EAAE,QAAQ,EAAE,CAAC;IAC/B,qBAAqB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACpF,cAAc,CAAC,EAAE,aAAa,EAAE,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,wBAAsB,SAAS,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAoEtE"}
@@ -0,0 +1,63 @@
1
+ import React from "react";
2
+ import { render } from "ink";
3
+ import { App } from "./App.js";
4
+ import { ThemeContext, loadTheme } from "./theme/theme.js";
5
+ import { detectTheme } from "./theme/detect-theme.js";
6
+ export async function renderApp(config) {
7
+ const themeSetting = config.theme ?? "auto";
8
+ const resolvedTheme = themeSetting === "auto" ? await detectTheme() : themeSetting;
9
+ const theme = loadTheme(resolvedTheme);
10
+ // Clear screen
11
+ process.stdout.write("\x1b[2J\x1b[H");
12
+ const { waitUntilExit, clear } = render(React.createElement(ThemeContext.Provider, { value: theme }, React.createElement(App, {
13
+ provider: config.provider,
14
+ model: config.model,
15
+ tools: config.tools,
16
+ webSearch: config.webSearch,
17
+ messages: config.messages,
18
+ maxTokens: config.maxTokens,
19
+ thinking: config.thinking,
20
+ apiKey: config.apiKey,
21
+ baseUrl: config.baseUrl,
22
+ accountId: config.accountId,
23
+ cwd: config.cwd,
24
+ version: config.version,
25
+ showThinking: config.showThinking,
26
+ showTokenUsage: config.showTokenUsage,
27
+ onSlashCommand: config.onSlashCommand,
28
+ loggedInProviders: config.loggedInProviders,
29
+ credentialsByProvider: config.credentialsByProvider,
30
+ initialHistory: config.initialHistory,
31
+ sessionsDir: config.sessionsDir,
32
+ sessionPath: config.sessionPath,
33
+ processManager: config.processManager,
34
+ settingsFile: config.settingsFile,
35
+ mcpManager: config.mcpManager,
36
+ authStorage: config.authStorage,
37
+ })), {
38
+ // Enable kitty keyboard protocol so terminals that support it can
39
+ // distinguish Shift+Enter from Enter (needed for multiline input).
40
+ // Terminals without support gracefully ignore this.
41
+ kittyKeyboard: {
42
+ mode: "enabled",
43
+ flags: ["disambiguateEscapeCodes"],
44
+ },
45
+ // Ink's built-in exitOnCtrlC checks for the raw \x03 byte, but with
46
+ // kitty keyboard protocol Ctrl+C arrives as \x1b[99;5u so the check
47
+ // never matches. Worse, useInput skips calling our handler when
48
+ // exitOnCtrlC is true. Disable it so our InputArea handles Ctrl+C.
49
+ exitOnCtrlC: false,
50
+ });
51
+ // Resize handling (terminal clear + Static remount) is done inside the
52
+ // React tree via the useTerminalSize hook, which debounces 300ms then
53
+ // clears screen+scrollback and bumps a resizeKey to force Ink to
54
+ // re-render <Static> content. The render.ts layer only needs to call
55
+ // clear() so Ink forgets its stale line-count tracking.
56
+ const onResize = () => {
57
+ clear();
58
+ };
59
+ process.stdout.on("resize", onResize);
60
+ await waitUntilExit();
61
+ process.stdout.off("resize", onResize);
62
+ }
63
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/ui/render.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAM7B,OAAO,EAAE,GAAG,EAAsB,MAAM,UAAU,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AA8BtD,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,MAAuB;IACrD,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC;IAC5C,MAAM,aAAa,GAAG,YAAY,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,WAAW,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC;IACnF,MAAM,KAAK,GAAG,SAAS,CAAC,aAAa,CAAC,CAAC;IAEvC,eAAe;IACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IAEtC,MAAM,EAAE,aAAa,EAAE,KAAK,EAAE,GAAG,MAAM,CACrC,KAAK,CAAC,aAAa,CACjB,YAAY,CAAC,QAAQ,EACrB,EAAE,KAAK,EAAE,KAAK,EAAE,EAChB,KAAK,CAAC,aAAa,CAAC,GAAG,EAAE;QACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;QAC3C,qBAAqB,EAAE,MAAM,CAAC,qBAAqB;QACnD,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,cAAc,EAAE,MAAM,CAAC,cAAc;QACrC,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,WAAW,EAAE,MAAM,CAAC,WAAW;KAChC,CAAC,CACH,EACD;QACE,kEAAkE;QAClE,mEAAmE;QACnE,oDAAoD;QACpD,aAAa,EAAE;YACb,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,CAAC,yBAAyB,CAAC;SACnC;QACD,oEAAoE;QACpE,oEAAoE;QACpE,gEAAgE;QAChE,mEAAmE;QACnE,WAAW,EAAE,KAAK;KACnB,CACF,CAAC;IAEF,uEAAuE;IACvE,sEAAsE;IACtE,iEAAiE;IACjE,sEAAsE;IACtE,wDAAwD;IACxD,MAAM,QAAQ,GAAG,GAAG,EAAE;QACpB,KAAK,EAAE,CAAC;IACV,CAAC,CAAC;IACF,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAEtC,MAAM,aAAa,EAAE,CAAC;IAEtB,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare const SPINNER_FRAMES: string[];
2
+ export declare const SPINNER_INTERVAL = 120;
3
+ //# sourceMappingURL=spinner-frames.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner-frames.d.ts","sourceRoot":"","sources":["../../src/ui/spinner-frames.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc,UAGkC,CAAC;AAE9D,eAAO,MAAM,gBAAgB,MAAM,CAAC"}
@@ -0,0 +1,7 @@
1
+ // Sparkle character set — gives a more distinctive, playful feel
2
+ // compared to the standard braille dots every other CLI uses.
3
+ export const SPINNER_FRAMES = process.platform === "darwin"
4
+ ? ["\u00B7", "\u2726", "\u2733", "\u2217", "\u273B", "\u273D"]
5
+ : ["\u00B7", "\u2726", "*", "\u2217", "\u273B", "\u273D"];
6
+ export const SPINNER_INTERVAL = 120;
7
+ //# sourceMappingURL=spinner-frames.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner-frames.js","sourceRoot":"","sources":["../../src/ui/spinner-frames.ts"],"names":[],"mappings":"AAAA,iEAAiE;AACjE,8DAA8D;AAC9D,MAAM,CAAC,MAAM,cAAc,GACzB,OAAO,CAAC,QAAQ,KAAK,QAAQ;IAC3B,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC;IAC9D,CAAC,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAE9D,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,CAAC"}
@@ -0,0 +1,24 @@
1
+ {
2
+ "name": "dark",
3
+ "primary": "#60a5fa",
4
+ "secondary": "#a78bfa",
5
+ "success": "#4ade80",
6
+ "error": "#f87171",
7
+ "warning": "#fbbf24",
8
+ "text": "#e5e7eb",
9
+ "textDim": "#6b7280",
10
+ "textMuted": "#9ca3af",
11
+ "border": "#374151",
12
+ "background": "",
13
+ "accent": "#818cf8",
14
+ "toolName": "#60a5fa",
15
+ "toolSuccess": "#4ade80",
16
+ "toolError": "#f87171",
17
+ "diffAdded": "#4ade80",
18
+ "diffRemoved": "#f87171",
19
+ "diffContext": "#6b7280",
20
+ "spinnerColor": "#60a5fa",
21
+ "inputPrompt": "#60a5fa",
22
+ "footerText": "#6b7280",
23
+ "commandColor": "#818cf8"
24
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Detect whether the terminal uses a dark or light background.
3
+ *
4
+ * Detection chain (first match wins):
5
+ * 1. VSCODE_THEME_KIND env var (VS Code integrated terminal)
6
+ * 2. OSC 11 escape sequence query (most modern terminals)
7
+ * 3. COLORFGBG env var (rxvt, some other terminals)
8
+ * 4. macOS system dark mode (defaults read -g AppleInterfaceStyle)
9
+ * 5. Default to "dark"
10
+ */
11
+ export declare function detectTheme(): Promise<"dark" | "light">;
12
+ //# sourceMappingURL=detect-theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-theme.d.ts","sourceRoot":"","sources":["../../../src/ui/theme/detect-theme.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,CAuC7D"}
@@ -0,0 +1,152 @@
1
+ import { execFileSync } from "node:child_process";
2
+ /**
3
+ * Detect whether the terminal uses a dark or light background.
4
+ *
5
+ * Detection chain (first match wins):
6
+ * 1. VSCODE_THEME_KIND env var (VS Code integrated terminal)
7
+ * 2. OSC 11 escape sequence query (most modern terminals)
8
+ * 3. COLORFGBG env var (rxvt, some other terminals)
9
+ * 4. macOS system dark mode (defaults read -g AppleInterfaceStyle)
10
+ * 5. Default to "dark"
11
+ */
12
+ export async function detectTheme() {
13
+ // 1. VS Code sets this reliably
14
+ const vscodeTheme = process.env["VSCODE_THEME_KIND"];
15
+ if (vscodeTheme) {
16
+ return vscodeTheme.includes("light") ? "light" : "dark";
17
+ }
18
+ // 2. OSC 11 — query actual terminal background color
19
+ const osc = await queryOSC11();
20
+ if (osc !== null)
21
+ return osc;
22
+ // 3. COLORFGBG — "fg;bg" ANSI color indices
23
+ const colorfgbg = process.env["COLORFGBG"];
24
+ if (colorfgbg) {
25
+ const parts = colorfgbg.split(";");
26
+ const bg = parseInt(parts[parts.length - 1], 10);
27
+ if (!isNaN(bg)) {
28
+ // ANSI colors: 0-6 and 8 are dark, 7 and 9-15 are light
29
+ return bg === 7 || (bg >= 9 && bg <= 15) ? "light" : "dark";
30
+ }
31
+ }
32
+ // 4. macOS system dark mode
33
+ if (process.platform === "darwin") {
34
+ try {
35
+ const result = execFileSync("defaults", ["read", "-g", "AppleInterfaceStyle"], {
36
+ encoding: "utf-8",
37
+ timeout: 500,
38
+ stdio: ["pipe", "pipe", "pipe"],
39
+ });
40
+ return result.trim().toLowerCase() === "dark" ? "dark" : "light";
41
+ }
42
+ catch {
43
+ // Command fails when in light mode (key doesn't exist) — that means light
44
+ return "light";
45
+ }
46
+ }
47
+ // 5. Default
48
+ return "dark";
49
+ }
50
+ /**
51
+ * Send OSC 11 query to the terminal and parse the background color response.
52
+ * Returns "dark" | "light" based on luminance, or null if unsupported.
53
+ */
54
+ // ESC character built without a literal escape so ESLint's no-control-regex is satisfied
55
+ const ESC = String.fromCharCode(27);
56
+ const oscResponsePattern = new RegExp(ESC + "\\]11;rgb:([0-9a-fA-F]+)/([0-9a-fA-F]+)/([0-9a-fA-F]+)");
57
+ const cursorPositionPattern = new RegExp(ESC + "\\[\\d+;\\d+R");
58
+ function queryOSC11() {
59
+ return new Promise((resolve) => {
60
+ // Skip for multiplexers — they don't forward OSC queries
61
+ const term = process.env["TERM"] ?? "";
62
+ if (term.startsWith("screen") || term.startsWith("tmux")) {
63
+ resolve(null);
64
+ return;
65
+ }
66
+ // Need a real TTY
67
+ if (!process.stdin.isTTY || !process.stdout.isTTY) {
68
+ resolve(null);
69
+ return;
70
+ }
71
+ const wasRaw = process.stdin.isRaw;
72
+ let settled = false;
73
+ let buffer = "";
74
+ const cleanup = () => {
75
+ if (settled)
76
+ return;
77
+ settled = true;
78
+ process.stdin.removeListener("data", onData);
79
+ try {
80
+ process.stdin.setRawMode(wasRaw);
81
+ }
82
+ catch {
83
+ // ignore
84
+ }
85
+ // When we pause stdin after raw mode, Node's readline may lose
86
+ // the stream. Only pause if we turned raw mode on ourselves.
87
+ if (!wasRaw) {
88
+ try {
89
+ process.stdin.pause();
90
+ }
91
+ catch {
92
+ // ignore
93
+ }
94
+ }
95
+ };
96
+ const timeout = setTimeout(() => {
97
+ cleanup();
98
+ resolve(null);
99
+ }, 200);
100
+ const onData = (data) => {
101
+ buffer += data.toString();
102
+ // Look for OSC 11 response: ESC]11;rgb:RRRR/GGGG/BBBB followed by BEL or ST
103
+ const match = buffer.match(oscResponsePattern);
104
+ if (match) {
105
+ clearTimeout(timeout);
106
+ cleanup();
107
+ // Parse RGB values (can be 1, 2, or 4 hex digits per channel)
108
+ const r = normalizeChannel(match[1]);
109
+ const g = normalizeChannel(match[2]);
110
+ const b = normalizeChannel(match[3]);
111
+ // Relative luminance (ITU-R BT.709)
112
+ const luminance = 0.2126 * r + 0.7152 * g + 0.0722 * b;
113
+ resolve(luminance < 0.5 ? "dark" : "light");
114
+ return;
115
+ }
116
+ // If we get a cursor position response (ESC[row;colR) without
117
+ // an OSC response, the terminal doesn't support OSC 11
118
+ if (buffer.match(cursorPositionPattern)) {
119
+ clearTimeout(timeout);
120
+ cleanup();
121
+ resolve(null);
122
+ }
123
+ };
124
+ try {
125
+ process.stdin.setRawMode(true);
126
+ process.stdin.resume();
127
+ process.stdin.on("data", onData);
128
+ // Send OSC 11 query + cursor position query as sentinel
129
+ process.stdout.write("\x1b]11;?\x1b\\\x1b[6n");
130
+ }
131
+ catch {
132
+ clearTimeout(timeout);
133
+ cleanup();
134
+ resolve(null);
135
+ }
136
+ });
137
+ }
138
+ /** Normalize a hex color channel (1-4 hex digits) to 0.0–1.0 range. */
139
+ function normalizeChannel(hex) {
140
+ const value = parseInt(hex, 16);
141
+ switch (hex.length) {
142
+ case 1:
143
+ return value / 0xf;
144
+ case 2:
145
+ return value / 0xff;
146
+ case 4:
147
+ return value / 0xffff;
148
+ default:
149
+ return value / (Math.pow(16, hex.length) - 1);
150
+ }
151
+ }
152
+ //# sourceMappingURL=detect-theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-theme.js","sourceRoot":"","sources":["../../../src/ui/theme/detect-theme.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ {
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",
12
+ "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
+ }
@@ -0,0 +1,29 @@
1
+ import darkTheme from "./dark.json";
2
+ export type Theme = typeof darkTheme;
3
+ export declare function loadTheme(name: "dark" | "light"): Theme;
4
+ export declare const ThemeContext: import("react").Context<{
5
+ name: string;
6
+ primary: string;
7
+ secondary: string;
8
+ success: string;
9
+ error: string;
10
+ warning: string;
11
+ text: string;
12
+ textDim: string;
13
+ textMuted: string;
14
+ border: string;
15
+ background: string;
16
+ accent: string;
17
+ toolName: string;
18
+ toolSuccess: string;
19
+ toolError: string;
20
+ diffAdded: string;
21
+ diffRemoved: string;
22
+ diffContext: string;
23
+ spinnerColor: string;
24
+ inputPrompt: string;
25
+ footerText: string;
26
+ commandColor: string;
27
+ }>;
28
+ export declare function useTheme(): Theme;
29
+ //# sourceMappingURL=theme.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,11 @@
1
+ import { createContext, useContext } from "react";
2
+ import darkTheme from "./dark.json" with { type: "json" };
3
+ import lightTheme from "./light.json" with { type: "json" };
4
+ export function loadTheme(name) {
5
+ return name === "light" ? lightTheme : darkTheme;
6
+ }
7
+ export const ThemeContext = createContext(darkTheme);
8
+ export function useTheme() {
9
+ return useContext(ThemeContext);
10
+ }
11
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +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"}
@@ -0,0 +1,8 @@
1
+ /** Get language from a file path's extension */
2
+ export declare function langFromPath(filePath: string): string | undefined;
3
+ /**
4
+ * Syntax-highlight code. Returns ANSI string.
5
+ * Falls back to raw code if language unknown.
6
+ */
7
+ export declare function highlightCode(code: string, language?: string): string;
8
+ //# sourceMappingURL=highlight.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,49 @@
1
+ import { highlight, supportsLanguage } from "cli-highlight";
2
+ import path from "node:path";
3
+ /** Map file extension to cli-highlight language name */
4
+ const EXT_TO_LANG = {
5
+ ts: "typescript",
6
+ tsx: "typescript",
7
+ js: "javascript",
8
+ jsx: "javascript",
9
+ py: "python",
10
+ rb: "ruby",
11
+ rs: "rust",
12
+ go: "go",
13
+ java: "java",
14
+ kt: "kotlin",
15
+ sh: "bash",
16
+ zsh: "bash",
17
+ bash: "bash",
18
+ json: "json",
19
+ yaml: "yaml",
20
+ yml: "yaml",
21
+ md: "markdown",
22
+ html: "xml",
23
+ xml: "xml",
24
+ css: "css",
25
+ scss: "scss",
26
+ sql: "sql",
27
+ toml: "ini",
28
+ dockerfile: "dockerfile",
29
+ };
30
+ /** Get language from a file path's extension */
31
+ export function langFromPath(filePath) {
32
+ const ext = path.extname(filePath).replace(/^\./, "").toLowerCase();
33
+ return EXT_TO_LANG[ext];
34
+ }
35
+ /**
36
+ * Syntax-highlight code. Returns ANSI string.
37
+ * Falls back to raw code if language unknown.
38
+ */
39
+ export function highlightCode(code, language) {
40
+ if (!language || !supportsLanguage(language))
41
+ return code;
42
+ try {
43
+ return highlight(code, { language, ignoreIllegals: true });
44
+ }
45
+ catch {
46
+ return code;
47
+ }
48
+ }
49
+ //# sourceMappingURL=highlight.js.map
@@ -0,0 +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"}
@@ -0,0 +1,25 @@
1
+ import type { Token } from "marked";
2
+ /** Extract all plain text from a token tree. */
3
+ export declare function extractPlainText(tokens: Token[]): string;
4
+ /** Measure the visual display width of a string (handles CJK, emoji, etc). */
5
+ export declare function visualWidth(str: string): number;
6
+ /**
7
+ * Force a string to exactly `width` visual columns.
8
+ * Truncates if too wide (char-by-char to avoid splitting wide chars),
9
+ * pads with spaces if too narrow.
10
+ */
11
+ export declare function fitToWidth(str: string, width: number): string;
12
+ /**
13
+ * Word-wrap plain text extracted from tokens into lines of at most `width`
14
+ * visual columns. Uses `wrap-ansi` for wrapping, then force-clamps each line
15
+ * to exactly `width` with `fitToWidth` to eliminate measurement mismatches.
16
+ */
17
+ export declare function wrapPlainTextLines(tokens: Token[], width: number): string[];
18
+ /**
19
+ * Center a string within `width` visual columns.
20
+ * Truncates if too wide, pads with spaces on both sides if too narrow.
21
+ */
22
+ export declare function centerToWidth(str: string, width: number): string;
23
+ /** Measure the visual display width of plain text in a token tree. */
24
+ export declare function plainTextLength(tokens: Token[]): number;
25
+ //# sourceMappingURL=table-text.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-text.d.ts","sourceRoot":"","sources":["../../../src/ui/utils/table-text.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAIpC,gDAAgD;AAChD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAaxD;AAED,8EAA8E;AAC9E,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAiB7D;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAQ3E;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAKhE;AAED,sEAAsE;AACtE,wBAAgB,eAAe,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAEvD"}