@mohanscodex/spectra-code 0.4.5

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 (319) hide show
  1. package/README.md +275 -0
  2. package/dist/package.json +62 -0
  3. package/dist/src/agents/definitions.d.ts +16 -0
  4. package/dist/src/agents/definitions.d.ts.map +1 -0
  5. package/dist/src/agents/definitions.js +148 -0
  6. package/dist/src/agents/definitions.js.map +1 -0
  7. package/dist/src/agents/registry.d.ts +11 -0
  8. package/dist/src/agents/registry.d.ts.map +1 -0
  9. package/dist/src/agents/registry.js +13 -0
  10. package/dist/src/agents/registry.js.map +1 -0
  11. package/dist/src/cli.d.ts +3 -0
  12. package/dist/src/cli.d.ts.map +1 -0
  13. package/dist/src/cli.js +436 -0
  14. package/dist/src/cli.js.map +1 -0
  15. package/dist/src/commands/agent.d.ts +3 -0
  16. package/dist/src/commands/agent.d.ts.map +1 -0
  17. package/dist/src/commands/agent.js +28 -0
  18. package/dist/src/commands/agent.js.map +1 -0
  19. package/dist/src/commands/db.d.ts +3 -0
  20. package/dist/src/commands/db.d.ts.map +1 -0
  21. package/dist/src/commands/db.js +47 -0
  22. package/dist/src/commands/db.js.map +1 -0
  23. package/dist/src/commands/doctor.d.ts +12 -0
  24. package/dist/src/commands/doctor.d.ts.map +1 -0
  25. package/dist/src/commands/doctor.js +59 -0
  26. package/dist/src/commands/doctor.js.map +1 -0
  27. package/dist/src/commands/mcp.d.ts +9 -0
  28. package/dist/src/commands/mcp.d.ts.map +1 -0
  29. package/dist/src/commands/mcp.js +208 -0
  30. package/dist/src/commands/mcp.js.map +1 -0
  31. package/dist/src/commands/plugin.d.ts +3 -0
  32. package/dist/src/commands/plugin.d.ts.map +1 -0
  33. package/dist/src/commands/plugin.js +36 -0
  34. package/dist/src/commands/plugin.js.map +1 -0
  35. package/dist/src/commands/session.d.ts +3 -0
  36. package/dist/src/commands/session.d.ts.map +1 -0
  37. package/dist/src/commands/session.js +49 -0
  38. package/dist/src/commands/session.js.map +1 -0
  39. package/dist/src/index.d.ts +19 -0
  40. package/dist/src/index.d.ts.map +1 -0
  41. package/dist/src/index.js +17 -0
  42. package/dist/src/index.js.map +1 -0
  43. package/dist/src/integrations/acp/index.d.ts +2 -0
  44. package/dist/src/integrations/acp/index.d.ts.map +1 -0
  45. package/dist/src/integrations/acp/index.js +2 -0
  46. package/dist/src/integrations/acp/index.js.map +1 -0
  47. package/dist/src/integrations/acp/server.d.ts +11 -0
  48. package/dist/src/integrations/acp/server.d.ts.map +1 -0
  49. package/dist/src/integrations/acp/server.js +220 -0
  50. package/dist/src/integrations/acp/server.js.map +1 -0
  51. package/dist/src/integrations/custom-tools/index.d.ts +3 -0
  52. package/dist/src/integrations/custom-tools/index.d.ts.map +1 -0
  53. package/dist/src/integrations/custom-tools/index.js +2 -0
  54. package/dist/src/integrations/custom-tools/index.js.map +1 -0
  55. package/dist/src/integrations/custom-tools/loader.d.ts +16 -0
  56. package/dist/src/integrations/custom-tools/loader.d.ts.map +1 -0
  57. package/dist/src/integrations/custom-tools/loader.js +95 -0
  58. package/dist/src/integrations/custom-tools/loader.js.map +1 -0
  59. package/dist/src/integrations/mcp/client.d.ts +32 -0
  60. package/dist/src/integrations/mcp/client.d.ts.map +1 -0
  61. package/dist/src/integrations/mcp/client.js +117 -0
  62. package/dist/src/integrations/mcp/client.js.map +1 -0
  63. package/dist/src/integrations/mcp/index.d.ts +3 -0
  64. package/dist/src/integrations/mcp/index.d.ts.map +1 -0
  65. package/dist/src/integrations/mcp/index.js +2 -0
  66. package/dist/src/integrations/mcp/index.js.map +1 -0
  67. package/dist/src/security/doom-loop.d.ts +22 -0
  68. package/dist/src/security/doom-loop.d.ts.map +1 -0
  69. package/dist/src/security/doom-loop.js +72 -0
  70. package/dist/src/security/doom-loop.js.map +1 -0
  71. package/dist/src/security/index.d.ts +46 -0
  72. package/dist/src/security/index.d.ts.map +1 -0
  73. package/dist/src/security/index.js +362 -0
  74. package/dist/src/security/index.js.map +1 -0
  75. package/dist/src/security/path-safety.d.ts +15 -0
  76. package/dist/src/security/path-safety.d.ts.map +1 -0
  77. package/dist/src/security/path-safety.js +57 -0
  78. package/dist/src/security/path-safety.js.map +1 -0
  79. package/dist/src/security/permissions.d.ts +7 -0
  80. package/dist/src/security/permissions.d.ts.map +1 -0
  81. package/dist/src/security/permissions.js +41 -0
  82. package/dist/src/security/permissions.js.map +1 -0
  83. package/dist/src/security/read-tracker.d.ts +20 -0
  84. package/dist/src/security/read-tracker.d.ts.map +1 -0
  85. package/dist/src/security/read-tracker.js +73 -0
  86. package/dist/src/security/read-tracker.js.map +1 -0
  87. package/dist/src/security/ssrf-guard.d.ts +19 -0
  88. package/dist/src/security/ssrf-guard.d.ts.map +1 -0
  89. package/dist/src/security/ssrf-guard.js +98 -0
  90. package/dist/src/security/ssrf-guard.js.map +1 -0
  91. package/dist/src/security/types.d.ts +70 -0
  92. package/dist/src/security/types.d.ts.map +1 -0
  93. package/dist/src/security/types.js +2 -0
  94. package/dist/src/security/types.js.map +1 -0
  95. package/dist/src/security/wildcard.d.ts +5 -0
  96. package/dist/src/security/wildcard.d.ts.map +1 -0
  97. package/dist/src/security/wildcard.js +50 -0
  98. package/dist/src/security/wildcard.js.map +1 -0
  99. package/dist/src/services/auth-store.d.ts +25 -0
  100. package/dist/src/services/auth-store.d.ts.map +1 -0
  101. package/dist/src/services/auth-store.js +40 -0
  102. package/dist/src/services/auth-store.js.map +1 -0
  103. package/dist/src/services/config.d.ts +66 -0
  104. package/dist/src/services/config.d.ts.map +1 -0
  105. package/dist/src/services/config.js +83 -0
  106. package/dist/src/services/config.js.map +1 -0
  107. package/dist/src/services/context.d.ts +7 -0
  108. package/dist/src/services/context.d.ts.map +1 -0
  109. package/dist/src/services/context.js +23 -0
  110. package/dist/src/services/context.js.map +1 -0
  111. package/dist/src/services/custom-providers.d.ts +5 -0
  112. package/dist/src/services/custom-providers.d.ts.map +1 -0
  113. package/dist/src/services/custom-providers.js +213 -0
  114. package/dist/src/services/custom-providers.js.map +1 -0
  115. package/dist/src/services/session-store.d.ts +76 -0
  116. package/dist/src/services/session-store.d.ts.map +1 -0
  117. package/dist/src/services/session-store.js +199 -0
  118. package/dist/src/services/session-store.js.map +1 -0
  119. package/dist/src/services/snapshot-manager.d.ts +46 -0
  120. package/dist/src/services/snapshot-manager.d.ts.map +1 -0
  121. package/dist/src/services/snapshot-manager.js +183 -0
  122. package/dist/src/services/snapshot-manager.js.map +1 -0
  123. package/dist/src/tools/edit.d.ts +3 -0
  124. package/dist/src/tools/edit.d.ts.map +1 -0
  125. package/dist/src/tools/edit.js +57 -0
  126. package/dist/src/tools/edit.js.map +1 -0
  127. package/dist/src/tools/glob.d.ts +3 -0
  128. package/dist/src/tools/glob.d.ts.map +1 -0
  129. package/dist/src/tools/glob.js +46 -0
  130. package/dist/src/tools/glob.js.map +1 -0
  131. package/dist/src/tools/grep.d.ts +3 -0
  132. package/dist/src/tools/grep.d.ts.map +1 -0
  133. package/dist/src/tools/grep.js +50 -0
  134. package/dist/src/tools/grep.js.map +1 -0
  135. package/dist/src/tools/index.d.ts +26 -0
  136. package/dist/src/tools/index.d.ts.map +1 -0
  137. package/dist/src/tools/index.js +202 -0
  138. package/dist/src/tools/index.js.map +1 -0
  139. package/dist/src/tools/mcp-tool.d.ts +5 -0
  140. package/dist/src/tools/mcp-tool.d.ts.map +1 -0
  141. package/dist/src/tools/mcp-tool.js +82 -0
  142. package/dist/src/tools/mcp-tool.js.map +1 -0
  143. package/dist/src/tools/read.d.ts +3 -0
  144. package/dist/src/tools/read.d.ts.map +1 -0
  145. package/dist/src/tools/read.js +48 -0
  146. package/dist/src/tools/read.js.map +1 -0
  147. package/dist/src/tools/shell.d.ts +3 -0
  148. package/dist/src/tools/shell.d.ts.map +1 -0
  149. package/dist/src/tools/shell.js +266 -0
  150. package/dist/src/tools/shell.js.map +1 -0
  151. package/dist/src/tools/task.d.ts +3 -0
  152. package/dist/src/tools/task.d.ts.map +1 -0
  153. package/dist/src/tools/task.js +75 -0
  154. package/dist/src/tools/task.js.map +1 -0
  155. package/dist/src/tools/types.d.ts +18 -0
  156. package/dist/src/tools/types.d.ts.map +1 -0
  157. package/dist/src/tools/types.js +2 -0
  158. package/dist/src/tools/types.js.map +1 -0
  159. package/dist/src/tools/utils.d.ts +4 -0
  160. package/dist/src/tools/utils.d.ts.map +1 -0
  161. package/dist/src/tools/utils.js +10 -0
  162. package/dist/src/tools/utils.js.map +1 -0
  163. package/dist/src/tools/web-fetch.d.ts +3 -0
  164. package/dist/src/tools/web-fetch.d.ts.map +1 -0
  165. package/dist/src/tools/web-fetch.js +81 -0
  166. package/dist/src/tools/web-fetch.js.map +1 -0
  167. package/dist/src/tools/write.d.ts +3 -0
  168. package/dist/src/tools/write.d.ts.map +1 -0
  169. package/dist/src/tools/write.js +28 -0
  170. package/dist/src/tools/write.js.map +1 -0
  171. package/dist/src/tui/app-constants.d.ts +3 -0
  172. package/dist/src/tui/app-constants.d.ts.map +1 -0
  173. package/dist/src/tui/app-constants.js +4 -0
  174. package/dist/src/tui/app-constants.js.map +1 -0
  175. package/dist/src/tui/app.d.ts +5 -0
  176. package/dist/src/tui/app.d.ts.map +1 -0
  177. package/dist/src/tui/app.js +322 -0
  178. package/dist/src/tui/app.js.map +1 -0
  179. package/dist/src/tui/commands.d.ts +61 -0
  180. package/dist/src/tui/commands.d.ts.map +1 -0
  181. package/dist/src/tui/commands.js +95 -0
  182. package/dist/src/tui/commands.js.map +1 -0
  183. package/dist/src/tui/components/chat-area.d.ts +9 -0
  184. package/dist/src/tui/components/chat-area.d.ts.map +1 -0
  185. package/dist/src/tui/components/chat-area.js +12 -0
  186. package/dist/src/tui/components/chat-area.js.map +1 -0
  187. package/dist/src/tui/components/command-palette.d.ts +18 -0
  188. package/dist/src/tui/components/command-palette.d.ts.map +1 -0
  189. package/dist/src/tui/components/command-palette.js +50 -0
  190. package/dist/src/tui/components/command-palette.js.map +1 -0
  191. package/dist/src/tui/components/message.d.ts +9 -0
  192. package/dist/src/tui/components/message.d.ts.map +1 -0
  193. package/dist/src/tui/components/message.js +116 -0
  194. package/dist/src/tui/components/message.js.map +1 -0
  195. package/dist/src/tui/components/slash-autocomplete.d.ts +14 -0
  196. package/dist/src/tui/components/slash-autocomplete.d.ts.map +1 -0
  197. package/dist/src/tui/components/slash-autocomplete.js +29 -0
  198. package/dist/src/tui/components/slash-autocomplete.js.map +1 -0
  199. package/dist/src/tui/components/toast.d.ts +8 -0
  200. package/dist/src/tui/components/toast.d.ts.map +1 -0
  201. package/dist/src/tui/components/toast.js +29 -0
  202. package/dist/src/tui/components/toast.js.map +1 -0
  203. package/dist/src/tui/hooks/use-agent.d.ts +20 -0
  204. package/dist/src/tui/hooks/use-agent.d.ts.map +1 -0
  205. package/dist/src/tui/hooks/use-agent.js +129 -0
  206. package/dist/src/tui/hooks/use-agent.js.map +1 -0
  207. package/dist/src/tui/hooks/use-app-keyboard.d.ts +53 -0
  208. package/dist/src/tui/hooks/use-app-keyboard.d.ts.map +1 -0
  209. package/dist/src/tui/hooks/use-app-keyboard.js +155 -0
  210. package/dist/src/tui/hooks/use-app-keyboard.js.map +1 -0
  211. package/dist/src/tui/hooks/use-chat-submit.d.ts +61 -0
  212. package/dist/src/tui/hooks/use-chat-submit.d.ts.map +1 -0
  213. package/dist/src/tui/hooks/use-chat-submit.js +269 -0
  214. package/dist/src/tui/hooks/use-chat-submit.js.map +1 -0
  215. package/dist/src/tui/hooks/use-permission-queue.d.ts +10 -0
  216. package/dist/src/tui/hooks/use-permission-queue.d.ts.map +1 -0
  217. package/dist/src/tui/hooks/use-permission-queue.js +26 -0
  218. package/dist/src/tui/hooks/use-permission-queue.js.map +1 -0
  219. package/dist/src/tui/hooks/use-revert.d.ts +26 -0
  220. package/dist/src/tui/hooks/use-revert.d.ts.map +1 -0
  221. package/dist/src/tui/hooks/use-revert.js +88 -0
  222. package/dist/src/tui/hooks/use-revert.js.map +1 -0
  223. package/dist/src/tui/index.d.ts +5 -0
  224. package/dist/src/tui/index.d.ts.map +1 -0
  225. package/dist/src/tui/index.js +38 -0
  226. package/dist/src/tui/index.js.map +1 -0
  227. package/dist/src/tui/prompt-bar.d.ts +29 -0
  228. package/dist/src/tui/prompt-bar.d.ts.map +1 -0
  229. package/dist/src/tui/prompt-bar.js +41 -0
  230. package/dist/src/tui/prompt-bar.js.map +1 -0
  231. package/dist/src/tui/slash-commands.d.ts +20 -0
  232. package/dist/src/tui/slash-commands.d.ts.map +1 -0
  233. package/dist/src/tui/slash-commands.js +30 -0
  234. package/dist/src/tui/slash-commands.js.map +1 -0
  235. package/dist/src/tui/theme.d.ts +29 -0
  236. package/dist/src/tui/theme.d.ts.map +1 -0
  237. package/dist/src/tui/theme.js +54 -0
  238. package/dist/src/tui/theme.js.map +1 -0
  239. package/dist/src/tui/tips.d.ts +2 -0
  240. package/dist/src/tui/tips.d.ts.map +1 -0
  241. package/dist/src/tui/tips.js +40 -0
  242. package/dist/src/tui/tips.js.map +1 -0
  243. package/dist/src/tui/types.d.ts +34 -0
  244. package/dist/src/tui/types.d.ts.map +1 -0
  245. package/dist/src/tui/types.js +2 -0
  246. package/dist/src/tui/types.js.map +1 -0
  247. package/dist/src/tui/ui/about-dialog.d.ts +8 -0
  248. package/dist/src/tui/ui/about-dialog.d.ts.map +1 -0
  249. package/dist/src/tui/ui/about-dialog.js +21 -0
  250. package/dist/src/tui/ui/about-dialog.js.map +1 -0
  251. package/dist/src/tui/ui/agent-switcher.d.ts +10 -0
  252. package/dist/src/tui/ui/agent-switcher.d.ts.map +1 -0
  253. package/dist/src/tui/ui/agent-switcher.js +77 -0
  254. package/dist/src/tui/ui/agent-switcher.js.map +1 -0
  255. package/dist/src/tui/ui/debug-dialog.d.ts +15 -0
  256. package/dist/src/tui/ui/debug-dialog.d.ts.map +1 -0
  257. package/dist/src/tui/ui/debug-dialog.js +74 -0
  258. package/dist/src/tui/ui/debug-dialog.js.map +1 -0
  259. package/dist/src/tui/ui/doctor-dialog.d.ts +9 -0
  260. package/dist/src/tui/ui/doctor-dialog.d.ts.map +1 -0
  261. package/dist/src/tui/ui/doctor-dialog.js +45 -0
  262. package/dist/src/tui/ui/doctor-dialog.js.map +1 -0
  263. package/dist/src/tui/ui/manage-providers-dialog.d.ts +10 -0
  264. package/dist/src/tui/ui/manage-providers-dialog.d.ts.map +1 -0
  265. package/dist/src/tui/ui/manage-providers-dialog.js +257 -0
  266. package/dist/src/tui/ui/manage-providers-dialog.js.map +1 -0
  267. package/dist/src/tui/ui/mcp-toggle-dialog.d.ts +8 -0
  268. package/dist/src/tui/ui/mcp-toggle-dialog.d.ts.map +1 -0
  269. package/dist/src/tui/ui/mcp-toggle-dialog.js +89 -0
  270. package/dist/src/tui/ui/mcp-toggle-dialog.js.map +1 -0
  271. package/dist/src/tui/ui/message-controls.d.ts +16 -0
  272. package/dist/src/tui/ui/message-controls.d.ts.map +1 -0
  273. package/dist/src/tui/ui/message-controls.js +102 -0
  274. package/dist/src/tui/ui/message-controls.js.map +1 -0
  275. package/dist/src/tui/ui/model-switcher.d.ts +10 -0
  276. package/dist/src/tui/ui/model-switcher.d.ts.map +1 -0
  277. package/dist/src/tui/ui/model-switcher.js +139 -0
  278. package/dist/src/tui/ui/model-switcher.js.map +1 -0
  279. package/dist/src/tui/ui/permission-dialog.d.ts +12 -0
  280. package/dist/src/tui/ui/permission-dialog.d.ts.map +1 -0
  281. package/dist/src/tui/ui/permission-dialog.js +37 -0
  282. package/dist/src/tui/ui/permission-dialog.js.map +1 -0
  283. package/dist/src/tui/ui/provider-dialog.d.ts +11 -0
  284. package/dist/src/tui/ui/provider-dialog.d.ts.map +1 -0
  285. package/dist/src/tui/ui/provider-dialog.js +232 -0
  286. package/dist/src/tui/ui/provider-dialog.js.map +1 -0
  287. package/dist/src/tui/ui/session-list.d.ts +23 -0
  288. package/dist/src/tui/ui/session-list.d.ts.map +1 -0
  289. package/dist/src/tui/ui/session-list.js +147 -0
  290. package/dist/src/tui/ui/session-list.js.map +1 -0
  291. package/dist/src/tui/ui/thinking-effort-dialog.d.ts +11 -0
  292. package/dist/src/tui/ui/thinking-effort-dialog.d.ts.map +1 -0
  293. package/dist/src/tui/ui/thinking-effort-dialog.js +79 -0
  294. package/dist/src/tui/ui/thinking-effort-dialog.js.map +1 -0
  295. package/dist/src/tui/utils/model-config.d.ts +9 -0
  296. package/dist/src/tui/utils/model-config.d.ts.map +1 -0
  297. package/dist/src/tui/utils/model-config.js +63 -0
  298. package/dist/src/tui/utils/model-config.js.map +1 -0
  299. package/dist/src/tui/utils/session-messages.d.ts +22 -0
  300. package/dist/src/tui/utils/session-messages.d.ts.map +1 -0
  301. package/dist/src/tui/utils/session-messages.js +62 -0
  302. package/dist/src/tui/utils/session-messages.js.map +1 -0
  303. package/dist/src/tui/utils.d.ts +6 -0
  304. package/dist/src/tui/utils.d.ts.map +1 -0
  305. package/dist/src/tui/utils.js +23 -0
  306. package/dist/src/tui/utils.js.map +1 -0
  307. package/dist/src/tui/variant-cycle.d.ts +10 -0
  308. package/dist/src/tui/variant-cycle.d.ts.map +1 -0
  309. package/dist/src/tui/variant-cycle.js +64 -0
  310. package/dist/src/tui/variant-cycle.js.map +1 -0
  311. package/dist/src/utils/paths.d.ts +10 -0
  312. package/dist/src/utils/paths.d.ts.map +1 -0
  313. package/dist/src/utils/paths.js +106 -0
  314. package/dist/src/utils/paths.js.map +1 -0
  315. package/dist/src/utils/platform.d.ts +10 -0
  316. package/dist/src/utils/platform.d.ts.map +1 -0
  317. package/dist/src/utils/platform.js +133 -0
  318. package/dist/src/utils/platform.js.map +1 -0
  319. package/package.json +62 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slash-commands.d.ts","sourceRoot":"","sources":["../../../src/tui/slash-commands.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,GAAG,EAAE,MAAM,CAAA;CACZ;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,SAAS,CAAA;IACf,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAA;CAC7C;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,MAAM,WAAW,GAAG,kBAAkB,GAAG,eAAe,CAAA;AAE9D,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAW7D;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAI3E;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,SAAS,GAChC,WAAW,CAMb"}
@@ -0,0 +1,30 @@
1
+ export function slashHead(text) {
2
+ if (!text.startsWith("/"))
3
+ return;
4
+ for (let i = 1; i < text.length; i++) {
5
+ switch (text[i]) {
6
+ case " ":
7
+ case "\t":
8
+ case "\n":
9
+ return { name: text.slice(1, i), arguments: text.slice(i + 1), end: i };
10
+ }
11
+ }
12
+ return { name: text.slice(1), arguments: "", end: text.length };
13
+ }
14
+ export function slashQuery(text, cursor) {
15
+ const head = slashHead(text.slice(0, cursor));
16
+ if (!head || head.end !== cursor)
17
+ return;
18
+ return head.name;
19
+ }
20
+ export function parseSlashCommand(text, commands) {
21
+ const head = slashHead(text);
22
+ if (!head || head.name.length === 0)
23
+ return { type: "none" };
24
+ if (!commands)
25
+ return { type: "none" };
26
+ if (!commands.has(head.name))
27
+ return { type: "none" };
28
+ return { type: "command", command: { name: head.name, arguments: head.arguments } };
29
+ }
30
+ //# sourceMappingURL=slash-commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slash-commands.js","sourceRoot":"","sources":["../../../src/tui/slash-commands.ts"],"names":[],"mappings":"AAiBA,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAM;IACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,QAAQ,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAChB,KAAK,GAAG,CAAC;YACT,KAAK,IAAI,CAAC;YACV,KAAK,IAAI;gBACP,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAA;QAC3E,CAAC;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,CAAA;AACjE,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,MAAc;IACrD,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAA;IAC7C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,KAAK,MAAM;QAAE,OAAM;IACxC,OAAO,IAAI,CAAC,IAAI,CAAA;AAClB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,IAAY,EACZ,QAAiC;IAEjC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;IAC5B,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;IAC5D,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;IACtC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAA;IACrD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,CAAA;AACrF,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { SyntaxStyle } from "@opentui/core";
2
+ export declare const c: {
3
+ text: string;
4
+ subtext: string;
5
+ dim: string;
6
+ accent: string;
7
+ purple: string;
8
+ success: string;
9
+ warn: string;
10
+ error: string;
11
+ user: string;
12
+ tool: string;
13
+ thinking: string;
14
+ info: string;
15
+ bg: string;
16
+ bgBar: string;
17
+ bgCard: string;
18
+ bgThink: string;
19
+ bgTool: string;
20
+ bgInput: string;
21
+ bgOverlay: string;
22
+ bgSelect: string;
23
+ sbThumb: string;
24
+ sbTrack: string;
25
+ border: string;
26
+ };
27
+ export declare const mdStyle: SyntaxStyle;
28
+ export declare const SPINNER: string[];
29
+ //# sourceMappingURL=theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../../src/tui/theme.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,WAAW,EAAE,MAAM,eAAe,CAAA;AAIjD,eAAO,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;CA0Bb,CAAA;AAED,eAAO,MAAM,OAAO,aAoBlB,CAAA;AAEF,eAAO,MAAM,OAAO,UAGnB,CAAA"}
@@ -0,0 +1,54 @@
1
+ import { RGBA, SyntaxStyle } from "@opentui/core";
2
+ // Spectra Void — deep dark bg with a soft spectral teal accent.
3
+ // Comfortable for long sessions; no harsh purples.
4
+ export const c = {
5
+ text: "#D5D8E0",
6
+ subtext: "#9CA3B0",
7
+ dim: "#5A6070",
8
+ accent: "#6EC8D0",
9
+ purple: "#7EC8D0",
10
+ success: "#A3D9A0",
11
+ warn: "#E0C8A0",
12
+ error: "#E0A0A8",
13
+ user: "#7AA8F0",
14
+ tool: "#E0B890",
15
+ thinking: "#90C0D8",
16
+ info: "#7EC8D0",
17
+ bg: "#0C0C12",
18
+ bgBar: "#141420",
19
+ bgCard: "#141420",
20
+ bgThink: "#141420",
21
+ bgTool: "#141420",
22
+ bgInput: "#12121A",
23
+ bgOverlay: "#08080ECC",
24
+ bgSelect: "#2E2E50",
25
+ sbThumb: "#2A2A3A",
26
+ sbTrack: "#181822",
27
+ border: "#2A2A3A",
28
+ };
29
+ export const mdStyle = SyntaxStyle.fromStyles({
30
+ "markup.heading.1": { fg: RGBA.fromHex(c.accent), bold: true },
31
+ "markup.heading.2": { fg: RGBA.fromHex(c.accent), bold: true },
32
+ "markup.heading.3": { fg: RGBA.fromHex(c.accent), bold: true },
33
+ "markup.heading.4": { fg: RGBA.fromHex(c.accent) },
34
+ "markup.bold": { bold: true },
35
+ "markup.italic": { italic: true },
36
+ "markup.list": { fg: RGBA.fromHex(c.text) },
37
+ "markup.raw": { fg: RGBA.fromHex(c.thinking) },
38
+ "markup.link": { fg: RGBA.fromHex(c.user) },
39
+ "markup.quote": { fg: RGBA.fromHex(c.dim) },
40
+ "markup.table": { fg: RGBA.fromHex(c.text) },
41
+ "markup.table.header": { fg: RGBA.fromHex(c.accent), bold: true },
42
+ keyword: { fg: RGBA.fromHex(c.accent) },
43
+ string: { fg: RGBA.fromHex(c.success) },
44
+ comment: { fg: RGBA.fromHex(c.dim), italic: true },
45
+ number: { fg: RGBA.fromHex(c.tool) },
46
+ function: { fg: RGBA.fromHex(c.user) },
47
+ type: { fg: RGBA.fromHex(c.accent) },
48
+ default: { fg: RGBA.fromHex(c.text) },
49
+ });
50
+ export const SPINNER = [
51
+ "\u280B", "\u2819", "\u2839", "\u2838", "\u283C", "\u2834", "\u2826",
52
+ "\u2827", "\u2807", "\u280F",
53
+ ];
54
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../../src/tui/theme.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function Tips(): import("react").ReactNode;
2
+ //# sourceMappingURL=tips.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tips.d.ts","sourceRoot":"","sources":["../../../src/tui/tips.tsx"],"names":[],"mappings":"AAgCA,wBAAgB,IAAI,8BAenB"}
@@ -0,0 +1,40 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "@opentui/react/jsx-runtime";
2
+ import { useMemo } from "react";
3
+ import { c } from "./theme.js";
4
+ const TIPS = [
5
+ "Type {highlight}:q{/highlight} to exit Spectra Code",
6
+ "Press {highlight}Tab{/highlight} to cycle between Build, Plan, Debug, and Explore agents",
7
+ "Press {highlight}Ctrl+P{/highlight} to open the command palette",
8
+ "Press {highlight}Ctrl+L{/highlight} to clear the conversation",
9
+ "Use {highlight}Esc{/highlight} to stop the AI mid-response or go back",
10
+ "Switch to {highlight}Plan{/highlight} agent to get suggestions without making changes",
11
+ "Commit your project's {highlight}AGENTS.md{/highlight} file to Git for team-wide instructions",
12
+ "Run {highlight}spectra doctor{/highlight} from CLI to check system health",
13
+ "Press {highlight}↑{/highlight} to edit your last message",
14
+ "Run {highlight}spectra session list{/highlight} to browse all conversations",
15
+ "Use {highlight}Ctrl+P{/highlight} → {highlight}doctor{/highlight} to run a health check from the TUI",
16
+ "Add {highlight}.spectra/{/highlight} to your project for project-level config",
17
+ ];
18
+ function parse(tip) {
19
+ const parts = [];
20
+ const regex = /\{highlight\}(.*?)\{\/highlight\}/g;
21
+ let last = 0;
22
+ let match;
23
+ while ((match = regex.exec(tip)) !== null) {
24
+ if (match.index > last)
25
+ parts.push({ text: tip.slice(last, match.index), highlight: false });
26
+ parts.push({ text: match[1], highlight: true });
27
+ last = match.index + match[0].length;
28
+ }
29
+ if (last < tip.length)
30
+ parts.push({ text: tip.slice(last), highlight: false });
31
+ return parts;
32
+ }
33
+ export function Tips() {
34
+ const parts = useMemo(() => {
35
+ const tip = TIPS[Math.floor(Math.random() * TIPS.length)];
36
+ return parse(tip);
37
+ }, []);
38
+ return (_jsxs("box", { height: 1, paddingTop: 1, flexDirection: "row", gap: 1, children: [_jsx("text", { fg: c.warn, children: "\u25CF" }), _jsx("text", { fg: c.dim, children: "Tip" }), parts.map((p, i) => (_jsx("text", { fg: p.highlight ? c.text : c.dim, children: p.text }, i)))] }));
39
+ }
40
+ //# sourceMappingURL=tips.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tips.js","sourceRoot":"","sources":["../../../src/tui/tips.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAC/B,OAAO,EAAE,CAAC,EAAE,MAAM,YAAY,CAAA;AAE9B,MAAM,IAAI,GAAG;IACX,qDAAqD;IACrD,0FAA0F;IAC1F,iEAAiE;IACjE,+DAA+D;IAC/D,uEAAuE;IACvE,uFAAuF;IACvF,+FAA+F;IAC/F,2EAA2E;IAC3E,0DAA0D;IAC1D,6EAA6E;IAC7E,sGAAsG;IACtG,+EAA+E;CAChF,CAAA;AAED,SAAS,KAAK,CAAC,GAAW;IACxB,MAAM,KAAK,GAA2C,EAAE,CAAA;IACxD,MAAM,KAAK,GAAG,oCAAoC,CAAA;IAClD,IAAI,IAAI,GAAG,CAAC,CAAA;IACZ,IAAI,KAA6B,CAAA;IACjC,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC1C,IAAI,KAAK,CAAC,KAAK,GAAG,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAA;QAC5F,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;QAC/C,IAAI,GAAG,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;IACtC,CAAC;IACD,IAAI,IAAI,GAAG,GAAG,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAA;IAC9E,OAAO,KAAK,CAAA;AACd,CAAC;AAED,MAAM,UAAU,IAAI;IAClB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;QACzD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAA;IACnB,CAAC,EAAE,EAAE,CAAC,CAAA;IAEN,OAAO,CACL,eAAK,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,aAAa,EAAC,KAAK,EAAC,GAAG,EAAE,CAAC,aACvD,eAAM,EAAE,EAAE,CAAC,CAAC,IAAI,YAAG,QAAQ,GAAQ,EACnC,eAAM,EAAE,EAAE,CAAC,CAAC,GAAG,oBAAY,EAC1B,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CACnB,eAAc,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,YAAG,CAAC,CAAC,IAAI,IAA5C,CAAC,CAAmD,CAChE,CAAC,IACE,CACP,CAAA;AACH,CAAC"}
@@ -0,0 +1,34 @@
1
+ export type ContentBlock = {
2
+ type: "text";
3
+ content: string;
4
+ } | {
5
+ type: "thinking";
6
+ content: string;
7
+ } | {
8
+ type: "toolCall";
9
+ name: string;
10
+ args: string;
11
+ };
12
+ export interface ChatMessage {
13
+ id: string;
14
+ role: "user" | "assistant" | "tool" | "error";
15
+ content: string;
16
+ blocks?: ContentBlock[];
17
+ meta?: string;
18
+ streaming?: boolean;
19
+ model?: string;
20
+ /** Turn status — set when the assistant turn completes/interrupts/errors */
21
+ turnStatus?: "completed" | "interrupted" | "error";
22
+ /** Turn duration in milliseconds */
23
+ turnDurationMs?: number;
24
+ /** Token usage for this turn */
25
+ turnTokens?: {
26
+ input: number;
27
+ output: number;
28
+ };
29
+ /** Exit code for shell tool results (structured, no regex parsing needed) */
30
+ exitCode?: number;
31
+ /** Agent that generated this message */
32
+ agent?: string;
33
+ }
34
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/tui/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GACpB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACrC;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAA;AAEpD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,GAAG,OAAO,CAAA;IAC7C,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,YAAY,EAAE,CAAA;IACvB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,4EAA4E;IAC5E,UAAU,CAAC,EAAE,WAAW,GAAG,aAAa,GAAG,OAAO,CAAA;IAClD,oCAAoC;IACpC,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,gCAAgC;IAChC,UAAU,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IAC9C,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,wCAAwC;IACxC,KAAK,CAAC,EAAE,MAAM,CAAA;CACf"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/tui/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ export interface AboutDialogProps {
2
+ onClose: () => void;
3
+ termWidth: number;
4
+ termHeight: number;
5
+ registerHandler?: (fn: (key: any) => void) => void;
6
+ }
7
+ export declare function AboutDialog({ onClose, termWidth, termHeight, registerHandler }: AboutDialogProps): import("react").ReactNode;
8
+ //# sourceMappingURL=about-dialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"about-dialog.d.ts","sourceRoot":"","sources":["../../../../src/tui/ui/about-dialog.tsx"],"names":[],"mappings":"AAGA,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,eAAe,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,KAAK,IAAI,CAAA;CACnD;AAED,wBAAgB,WAAW,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,eAAe,EAAE,EAAE,gBAAgB,6BA6ChG"}
@@ -0,0 +1,21 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "@opentui/react/jsx-runtime";
2
+ import { useEffect } from "react";
3
+ import { c } from "../theme.js";
4
+ export function AboutDialog({ onClose, termWidth, termHeight, registerHandler }) {
5
+ useEffect(() => {
6
+ const handler = (key) => {
7
+ if (key.name === "escape" || key.name === "return" || key.name === "enter") {
8
+ onClose();
9
+ }
10
+ };
11
+ registerHandler?.(handler);
12
+ }, [onClose, registerHandler]);
13
+ const mw = Math.min(50, termWidth - 4);
14
+ const ml = Math.floor((termWidth - mw) / 2);
15
+ const mh = 14;
16
+ const mt = Math.max(0, Math.floor((termHeight - mh) / 3));
17
+ const innerW = mw - 4;
18
+ const maxH = mh - 5;
19
+ return (_jsx("box", { position: "absolute", left: 0, right: 0, top: 0, bottom: 0, backgroundColor: c.bgOverlay, children: _jsxs("box", { position: "absolute", left: ml, top: mt, width: mw, height: mh, backgroundColor: c.bgCard, children: [_jsxs("box", { height: 1, paddingX: 2, paddingTop: 1, paddingBottom: 1, flexDirection: "row", justifyContent: "space-between", backgroundColor: c.bgCard, children: [_jsx("text", { fg: c.accent, flexDirection: "row", attributes: 1, height: 1, children: "About" }), _jsx("text", { fg: c.dim, flexDirection: "row", height: 1, children: "esc" })] }), _jsx("box", { height: 1, paddingX: 2, children: _jsx("text", { fg: c.border, children: "─".repeat(innerW) }) }), _jsxs("box", { flexDirection: "column", paddingX: 2, gap: 1, flexGrow: 1, children: [_jsxs("box", { children: [_jsx("text", { fg: c.text, children: "Spectra Code" }), _jsx("text", { fg: c.dim, children: "Version 0.1.0" })] }), _jsxs("box", { children: [_jsx("text", { fg: c.dim, children: "Minimal, ultra-fast AI coding agent" }), _jsx("text", { fg: c.dim, children: "Built with Spectra SDK" })] })] }), _jsx("box", { paddingX: 2, paddingY: 1, paddingBottom: 1, flexDirection: "row", justifyContent: "center", children: _jsx("text", { fg: c.dim, children: "esc/enter close" }) })] }) }));
20
+ }
21
+ //# sourceMappingURL=about-dialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"about-dialog.js","sourceRoot":"","sources":["../../../../src/tui/ui/about-dialog.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export interface AgentSwitcherProps {
2
+ currentAgent: string;
3
+ termWidth: number;
4
+ termHeight: number;
5
+ onAgentSelected: (agent: string) => void;
6
+ onClose: () => void;
7
+ registerHandler: (fn: ((key: any) => void) | null) => void;
8
+ }
9
+ export declare function AgentSwitcher(props: AgentSwitcherProps): import("react").ReactNode;
10
+ //# sourceMappingURL=agent-switcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-switcher.d.ts","sourceRoot":"","sources":["../../../../src/tui/ui/agent-switcher.tsx"],"names":[],"mappings":"AAKA,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;IACrC,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACxC,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,eAAe,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC,GAAG,IAAI,KAAK,IAAI,CAAA;CAC3D;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,6BA6FtD"}
@@ -0,0 +1,77 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "@opentui/react/jsx-runtime";
2
+ import { useState, useEffect, useMemo, useRef } from "react";
3
+ import { c } from "../theme.js";
4
+ import { AGENT_DEFINITIONS, PRIMARY_AGENTS } from "../../agents/definitions.js";
5
+ import { titlecase } from "../utils.js";
6
+ export function AgentSwitcher(props) {
7
+ const { currentAgent, termWidth, termHeight, onAgentSelected, onClose, registerHandler } = props;
8
+ const [filter, setFilter] = useState("");
9
+ const [sel, setSel] = useState(0);
10
+ const scrollRef = useRef(null);
11
+ const mw = Math.min(56, termWidth - 4);
12
+ const ml = Math.floor((termWidth - mw) / 2);
13
+ const mh = Math.min(16, termHeight - 4);
14
+ const mt = Math.max(1, Math.floor((termHeight - mh) / 2));
15
+ const innerW = mw - 4;
16
+ const listH = mh - 6;
17
+ const items = useMemo(() => {
18
+ return PRIMARY_AGENTS.map((name) => ({
19
+ name,
20
+ def: AGENT_DEFINITIONS[name],
21
+ }));
22
+ }, []);
23
+ const filtered = useMemo(() => {
24
+ if (!filter)
25
+ return items.map((i, idx) => ({ ...i, idx }));
26
+ const q = filter.toLowerCase();
27
+ return items
28
+ .map((i, idx) => ({ ...i, idx }))
29
+ .filter((i) => i.name.includes(q) || i.def?.description.toLowerCase().includes(q));
30
+ }, [items, filter]);
31
+ useEffect(() => {
32
+ registerHandler((key) => {
33
+ if (key.name === "up") {
34
+ setSel((s) => Math.max(0, s - 1));
35
+ return;
36
+ }
37
+ if (key.name === "down") {
38
+ setSel((s) => Math.min(filtered.length - 1, s + 1));
39
+ return;
40
+ }
41
+ if (key.name === "return" || key.name === "enter") {
42
+ if (filtered[sel])
43
+ onAgentSelected(filtered[sel].name);
44
+ return;
45
+ }
46
+ if (key.name === "escape") {
47
+ onClose();
48
+ return;
49
+ }
50
+ if (key.name === "backspace") {
51
+ setFilter((f) => f.slice(0, -1));
52
+ setSel(0);
53
+ return;
54
+ }
55
+ if (key.name?.length === 1) {
56
+ setFilter((f) => f + key.name);
57
+ setSel(0);
58
+ return;
59
+ }
60
+ });
61
+ return () => registerHandler(null);
62
+ }, [filtered, sel, onAgentSelected, onClose, registerHandler]);
63
+ useEffect(() => {
64
+ if (scrollRef.current && filtered[sel]) {
65
+ const el = scrollRef.current;
66
+ if (typeof el.scrollChildIntoView === "function") {
67
+ el.scrollChildIntoView(`agent-${filtered[sel].name}`);
68
+ }
69
+ }
70
+ }, [sel, filtered]);
71
+ return (_jsx("box", { position: "absolute", left: 0, right: 0, top: 0, bottom: 0, backgroundColor: c.bgOverlay, children: _jsxs("box", { position: "absolute", left: ml, top: mt, width: mw, height: mh, backgroundColor: c.bgCard, children: [_jsxs("box", { height: 1, paddingX: 2, paddingTop: 1, flexDirection: "row", justifyContent: "space-between", alignItems: "center", children: [_jsxs("box", { flexDirection: "row", gap: 1, alignItems: "center", children: [_jsx("text", { fg: c.accent, children: ">" }), _jsx("text", { fg: c.text, children: filter || "Type to filter..." })] }), _jsx("box", { height: 1, children: _jsx("text", { fg: c.dim, children: "esc" }) })] }), _jsx("box", { height: 1 }), _jsx("box", { height: 1, paddingX: 2, children: _jsx("text", { fg: c.border, children: "─".repeat(innerW) }) }), _jsx("scrollbox", { ref: (r) => { scrollRef.current = r; }, paddingX: 1, maxHeight: listH, scrollY: true, scrollbarOptions: { visible: false }, children: _jsx("box", { flexDirection: "column", children: filtered.length === 0 ? (_jsx("box", { height: 1, paddingX: 1, children: _jsx("text", { fg: c.dim, children: "No matching agents" }) })) : filtered.map((item, i) => {
72
+ const isSelected = i === sel;
73
+ const isCurrent = item.name === currentAgent;
74
+ return (_jsxs("box", { id: `agent-${item.name}`, height: 2, paddingLeft: 2, paddingRight: 1, backgroundColor: isSelected ? c.bgSelect : c.bgCard, children: [_jsxs("box", { flexDirection: "row", alignItems: "center", gap: 1, children: [_jsx("text", { fg: isCurrent ? c.accent : c.dim, children: isCurrent ? "●" : " " }), _jsx("text", { fg: isSelected ? c.accent : isCurrent ? c.text : c.dim, children: titlecase(item.name) })] }), _jsx("text", { fg: c.dim, overflow: "hidden", wrapMode: "none", children: item.def?.description })] }, item.name));
75
+ }) }) }), _jsx("box", { paddingX: 2, paddingTop: 1, paddingBottom: 1, flexDirection: "row", justifyContent: "center", children: _jsxs("text", { fg: c.dim, children: ["\u2191\u2193", " navigate \u00B7 ", "\u23CE", " select \u00B7 esc close"] }) })] }) }));
76
+ }
77
+ //# sourceMappingURL=agent-switcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-switcher.js","sourceRoot":"","sources":["../../../../src/tui/ui/agent-switcher.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { SessionStore } from "../../services/session-store.js";
2
+ export interface DebugDialogProps {
3
+ termWidth: number;
4
+ termHeight: number;
5
+ selectedModel: string | null;
6
+ provider: string | null;
7
+ selectedAgent: string;
8
+ thinkingEffort?: string;
9
+ sessionStore: SessionStore;
10
+ mcpCount: number;
11
+ onClose: () => void;
12
+ registerHandler: (fn: ((key: any) => void) | null) => void;
13
+ }
14
+ export declare function DebugDialog(props: DebugDialogProps): import("react").ReactNode;
15
+ //# sourceMappingURL=debug-dialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug-dialog.d.ts","sourceRoot":"","sources":["../../../../src/tui/ui/debug-dialog.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAA;AAGnE,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;IACrC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,aAAa,EAAE,MAAM,CAAA;IACrB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,YAAY,EAAE,YAAY,CAAA;IAC1B,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,eAAe,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC,GAAG,IAAI,KAAK,IAAI,CAAA;CAC3D;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,6BAmGlD"}
@@ -0,0 +1,74 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "@opentui/react/jsx-runtime";
2
+ import { useMemo, useEffect } from "react";
3
+ import { c } from "../theme.js";
4
+ import { loadConfig } from "../../services/config.js";
5
+ import { listConnectedServers } from "../../integrations/mcp/index.js";
6
+ import { readAll } from "../../services/auth-store.js";
7
+ import { getGlobalConfigDir, getGlobalDataDir } from "../../utils/paths.js";
8
+ import { getPlatformInfo } from "../../utils/platform.js";
9
+ import { titlecase } from "../utils.js";
10
+ export function DebugDialog(props) {
11
+ const { termWidth, termHeight, selectedModel, provider, selectedAgent, thinkingEffort, sessionStore, mcpCount, onClose, registerHandler } = props;
12
+ const mw = Math.min(64, termWidth - 4);
13
+ const ml = Math.floor((termWidth - mw) / 2);
14
+ const mh = Math.min(24, termHeight - 4);
15
+ const mt = Math.max(1, Math.floor((termHeight - mh) / 2));
16
+ const innerW = mw - 4;
17
+ const listH = mh - 5;
18
+ const info = useMemo(() => {
19
+ const config = loadConfig();
20
+ const connected = listConnectedServers();
21
+ const authStore = readAll();
22
+ const platform = getPlatformInfo();
23
+ const sessions = sessionStore.list();
24
+ const configDir = getGlobalConfigDir();
25
+ const dataDir = getGlobalDataDir();
26
+ const groups = [
27
+ {
28
+ rows: [
29
+ { label: "Version", value: "0.4.1" },
30
+ { label: "Directory", value: platform.cwd },
31
+ { label: "Platform", value: `${platform.os} (${platform.arch})` },
32
+ { label: "Shell", value: platform.shell },
33
+ ],
34
+ },
35
+ {
36
+ rows: [
37
+ { label: "Agent", value: titlecase(selectedAgent) },
38
+ { label: "Model", value: selectedModel || "(none)" },
39
+ { label: "Provider", value: provider || "(none)" },
40
+ { label: "Thinking effort", value: thinkingEffort || "default" },
41
+ ],
42
+ },
43
+ {
44
+ rows: [
45
+ { label: "MCP servers", value: `${config.mcp?.length ?? 0} configured, ${mcpCount} connected` },
46
+ { label: "Sessions", value: `${sessions.length} total` },
47
+ { label: "Auth keys", value: `${Object.keys(authStore).length} provider(s)` },
48
+ ],
49
+ },
50
+ {
51
+ rows: [
52
+ { label: "Config dir", value: configDir },
53
+ { label: "Data dir", value: dataDir },
54
+ ],
55
+ },
56
+ ];
57
+ return groups;
58
+ }, [selectedModel, provider, selectedAgent, thinkingEffort, sessionStore, mcpCount]);
59
+ const maxLabel = useMemo(() => Math.max(...info.flatMap((g) => g.rows.map((r) => r.label.length))), [info]);
60
+ useEffect(() => {
61
+ registerHandler((key) => {
62
+ if (key.name === "escape") {
63
+ onClose();
64
+ return;
65
+ }
66
+ });
67
+ return () => registerHandler(null);
68
+ }, [onClose, registerHandler]);
69
+ return (_jsx("box", { position: "absolute", left: 0, right: 0, top: 0, bottom: 0, backgroundColor: c.bgOverlay, children: _jsxs("box", { position: "absolute", left: ml, top: mt, width: mw, height: mh, backgroundColor: c.bgCard, children: [_jsxs("box", { height: 1, paddingX: 2, paddingTop: 1, paddingBottom: 1, flexDirection: "row", justifyContent: "space-between", backgroundColor: c.bgCard, children: [_jsx("text", { fg: c.accent, flexDirection: "row", attributes: 1, height: 1, children: "Debug" }), _jsx("text", { fg: c.dim, flexDirection: "row", height: 1, children: "esc" })] }), _jsx("box", { height: 1, paddingX: 2, children: _jsx("text", { fg: c.border, children: "─".repeat(innerW) }) }), _jsx("scrollbox", { maxHeight: listH, paddingX: 2, scrollY: true, scrollbarOptions: { visible: false }, children: _jsx("box", { flexDirection: "column", children: info.map((group, gi) => (_jsxs("box", { flexDirection: "column", children: [gi > 0 ? _jsx("box", { height: 1 }) : null, group.rows.map((row, i) => {
70
+ const pad = maxLabel - row.label.length + 1;
71
+ return (_jsxs("box", { height: 1, flexDirection: "row", children: [_jsxs("text", { fg: c.dim, children: [row.label, ":"] }), _jsxs("text", { fg: c.text, children: [" ".repeat(pad), row.value] })] }, i));
72
+ })] }, gi))) }) }), _jsx("box", { paddingX: 2, paddingTop: 1, paddingBottom: 1, flexDirection: "row", justifyContent: "center", children: _jsx("text", { fg: c.dim, children: "esc/enter close" }) })] }) }));
73
+ }
74
+ //# sourceMappingURL=debug-dialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"debug-dialog.js","sourceRoot":"","sources":["../../../../src/tui/ui/debug-dialog.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { DoctorResult } from "../../commands/doctor.js";
2
+ export declare function DoctorDialog({ result, onClose, termWidth, termHeight, registerHandler }: {
3
+ result: DoctorResult;
4
+ onClose: () => void;
5
+ termWidth: number;
6
+ termHeight: number;
7
+ registerHandler?: (fn: (key: any) => void) => void;
8
+ }): import("react").ReactNode;
9
+ //# sourceMappingURL=doctor-dialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor-dialog.d.ts","sourceRoot":"","sources":["../../../../src/tui/ui/doctor-dialog.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAG5D,wBAAgB,YAAY,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,eAAe,EAAE,EAAE;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,MAAM,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,KAAK,IAAI,CAAA;CAAE,6BAsFjO"}
@@ -0,0 +1,45 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "@opentui/react/jsx-runtime";
2
+ import { useEffect, useRef } from "react";
3
+ import { c } from "../theme.js";
4
+ export function DoctorDialog({ result, onClose, termWidth, termHeight, registerHandler }) {
5
+ const scrollRef = useRef(null);
6
+ useEffect(() => {
7
+ const handler = (key) => {
8
+ if (key.name === "escape" || key.name === "return" || key.name === "enter") {
9
+ onClose();
10
+ }
11
+ };
12
+ registerHandler?.(handler);
13
+ }, [onClose, registerHandler]);
14
+ const mw = Math.min(68, termWidth - 4);
15
+ const ml = Math.floor((termWidth - mw) / 2);
16
+ const mh = Math.min(32, termHeight - 4);
17
+ const mt = Math.max(0, Math.floor((termHeight - mh) / 3));
18
+ const innerW = mw - 4;
19
+ const listH = mh - 5;
20
+ const failedCount = result.checks.filter((check) => !check.passed).length;
21
+ // Name/detail inline: ✓ Name detail
22
+ // Reserve: icon(1) + gap(1) + gap(2) + detail padding = ~4 chars overhead
23
+ const nameMax = Math.floor(innerW * 0.35);
24
+ const detailMax = innerW - nameMax - 4;
25
+ function trunc(s, max) {
26
+ if (s.length <= max)
27
+ return s;
28
+ return s.slice(0, Math.max(1, max - 1)) + "…";
29
+ }
30
+ const rows = [];
31
+ let prevSection = "";
32
+ for (let i = 0; i < result.checks.length; i++) {
33
+ const check = result.checks[i];
34
+ if (check.section !== prevSection) {
35
+ if (prevSection) {
36
+ rows.push(_jsx("box", { height: 1, backgroundColor: c.bgCard }, `gap-${i}`));
37
+ }
38
+ prevSection = check.section;
39
+ rows.push(_jsx("box", { height: 1, paddingLeft: 2, backgroundColor: c.bgCard, children: _jsx("text", { fg: c.accent, children: check.section }) }, `sec-${check.section}`));
40
+ }
41
+ rows.push(_jsxs("box", { flexDirection: "row", height: 1, paddingLeft: 4, paddingRight: 1, gap: 2, alignItems: "center", backgroundColor: c.bgCard, children: [_jsx("text", { fg: check.passed ? c.success : c.error, width: 1, children: check.passed ? "✓" : "✗" }), _jsx("text", { fg: c.text, children: trunc(check.name, nameMax) }), check.detail && (_jsx("text", { fg: c.dim, children: trunc(check.detail, detailMax) }))] }, check.name));
42
+ }
43
+ return (_jsx("box", { position: "absolute", left: 0, right: 0, top: 0, bottom: 0, backgroundColor: c.bgOverlay, children: _jsxs("box", { position: "absolute", left: ml, top: mt, width: mw, height: mh, backgroundColor: c.bgCard, children: [_jsx("box", { height: 1, paddingX: 2, paddingTop: 1, paddingBottom: 1, backgroundColor: c.bgCard, children: _jsx("text", { fg: result.allPassed ? c.success : c.error, children: result.allPassed ? "✓ All checks passed" : `✗ ${failedCount}/${result.checks.length} failed` }) }), _jsx("box", { height: 1, paddingX: 2, backgroundColor: c.bgCard, children: _jsx("text", { fg: c.border, children: "─".repeat(innerW) }) }), _jsx("scrollbox", { ref: (r) => { scrollRef.current = r; }, paddingX: 1, maxHeight: listH, scrollY: true, backgroundColor: c.bgCard, children: _jsx("box", { flexDirection: "column", backgroundColor: c.bgCard, children: rows.length === 0 ? (_jsx("box", { height: 1, paddingX: 1, backgroundColor: c.bgCard, children: _jsx("text", { fg: c.dim, children: "No checks" }) })) : rows }) }), _jsx("box", { paddingX: 2, paddingTop: 1, paddingBottom: 1, flexDirection: "row", justifyContent: "center", children: _jsx("text", { fg: c.dim, children: "esc/enter close" }) })] }) }));
44
+ }
45
+ //# sourceMappingURL=doctor-dialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor-dialog.js","sourceRoot":"","sources":["../../../../src/tui/ui/doctor-dialog.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { CustomProviderConfig } from "../../services/config.js";
2
+ export declare function ManageProvidersDialog(props: {
3
+ termWidth: number;
4
+ termHeight: number;
5
+ providers: Record<string, CustomProviderConfig>;
6
+ onProvidersChange: (updated: Record<string, CustomProviderConfig>) => void;
7
+ onClose: () => void;
8
+ registerHandler: (fn: ((key: any) => void) | null) => void;
9
+ }): import("react").ReactNode;
10
+ //# sourceMappingURL=manage-providers-dialog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manage-providers-dialog.d.ts","sourceRoot":"","sources":["../../../../src/tui/ui/manage-providers-dialog.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAA;AA2BpE,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAC3C,SAAS,EAAE,MAAM,CAAA;IACjB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAA;IAC/C,iBAAiB,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,KAAK,IAAI,CAAA;IAC1E,OAAO,EAAE,MAAM,IAAI,CAAA;IACnB,eAAe,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,KAAK,IAAI,CAAC,GAAG,IAAI,KAAK,IAAI,CAAA;CAC3D,6BAwPA"}