profclaw 0.0.1-beta.3 โ†’ 2.3.0

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 (535) hide show
  1. package/.env.example +14 -2
  2. package/CHANGELOG.md +54 -34
  3. package/CONTRIBUTING.md +23 -5
  4. package/Dockerfile +39 -23
  5. package/README.md +271 -72
  6. package/dist/agents/agent-summary.d.ts +44 -0
  7. package/dist/agents/agent-summary.js +176 -0
  8. package/dist/agents/auto-memory.d.ts +59 -0
  9. package/dist/agents/auto-memory.js +310 -0
  10. package/dist/agents/checkpoint-manager.d.ts +76 -0
  11. package/dist/agents/checkpoint-manager.js +156 -0
  12. package/dist/agents/circuit-breaker.d.ts +54 -0
  13. package/dist/agents/circuit-breaker.js +153 -0
  14. package/dist/agents/context-compactor.d.ts +70 -0
  15. package/dist/agents/context-compactor.js +361 -0
  16. package/dist/agents/conversation-branch.d.ts +55 -0
  17. package/dist/agents/conversation-branch.js +115 -0
  18. package/dist/agents/error-recovery.d.ts +44 -0
  19. package/dist/agents/error-recovery.js +197 -0
  20. package/dist/agents/events.d.ts +76 -0
  21. package/dist/agents/events.js +8 -0
  22. package/dist/agents/executor.d.ts +35 -1
  23. package/dist/agents/executor.js +573 -124
  24. package/dist/agents/file-snapshots.d.ts +72 -0
  25. package/dist/agents/file-snapshots.js +182 -0
  26. package/dist/agents/index.d.ts +2 -0
  27. package/dist/agents/orchestrator.d.ts +183 -0
  28. package/dist/agents/orchestrator.js +495 -0
  29. package/dist/agents/permissions.d.ts +63 -0
  30. package/dist/agents/permissions.js +138 -0
  31. package/dist/agents/plan-mode.d.ts +71 -0
  32. package/dist/agents/plan-mode.js +186 -0
  33. package/dist/agents/prompt-suggestions.d.ts +33 -0
  34. package/dist/agents/prompt-suggestions.js +208 -0
  35. package/dist/agents/rate-limit-monitor.d.ts +56 -0
  36. package/dist/agents/rate-limit-monitor.js +224 -0
  37. package/dist/agents/result-store.d.ts +37 -0
  38. package/dist/agents/result-store.js +104 -0
  39. package/dist/agents/session-diff.d.ts +43 -0
  40. package/dist/agents/session-diff.js +258 -0
  41. package/dist/agents/tool-loader.d.ts +65 -0
  42. package/dist/agents/tool-loader.js +273 -0
  43. package/dist/agents/transcript.d.ts +96 -0
  44. package/dist/agents/transcript.js +267 -0
  45. package/dist/agents/worktree-manager.d.ts +80 -0
  46. package/dist/agents/worktree-manager.js +203 -0
  47. package/dist/auth/middleware.js +14 -0
  48. package/dist/chat/agentic-executor.d.ts +7 -0
  49. package/dist/chat/agentic-executor.js +253 -30
  50. package/dist/chat/conversations.d.ts +2 -0
  51. package/dist/chat/conversations.js +8 -0
  52. package/dist/chat/execution/executor.d.ts +8 -0
  53. package/dist/chat/execution/executor.js +157 -103
  54. package/dist/chat/execution/index.js +5 -1
  55. package/dist/chat/execution/tool-router.js +40 -14
  56. package/dist/chat/execution/tools/canvas.d.ts +2 -2
  57. package/dist/chat/execution/tools/code-tools.d.ts +66 -0
  58. package/dist/chat/execution/tools/code-tools.js +353 -0
  59. package/dist/chat/execution/tools/complete-task.d.ts +2 -2
  60. package/dist/chat/execution/tools/cron-tool.d.ts +26 -10
  61. package/dist/chat/execution/tools/cron-tool.js +48 -3
  62. package/dist/chat/execution/tools/decompose-task.d.ts +58 -0
  63. package/dist/chat/execution/tools/decompose-task.js +166 -0
  64. package/dist/chat/execution/tools/exec.d.ts +5 -2
  65. package/dist/chat/execution/tools/exec.js +294 -155
  66. package/dist/chat/execution/tools/feed-tools.d.ts +77 -0
  67. package/dist/chat/execution/tools/feed-tools.js +142 -0
  68. package/dist/chat/execution/tools/file-ops.d.ts +1 -1
  69. package/dist/chat/execution/tools/github.d.ts +2 -2
  70. package/dist/chat/execution/tools/index.d.ts +15 -3
  71. package/dist/chat/execution/tools/index.js +125 -12
  72. package/dist/chat/execution/tools/integrations.d.ts +8 -8
  73. package/dist/chat/execution/tools/multi-patch.d.ts +53 -0
  74. package/dist/chat/execution/tools/multi-patch.js +373 -0
  75. package/dist/chat/execution/tools/openai-image-gen.d.ts +2 -2
  76. package/dist/chat/execution/tools/plan-tools.d.ts +80 -0
  77. package/dist/chat/execution/tools/plan-tools.js +134 -0
  78. package/dist/chat/execution/tools/profclaw-ops.d.ts +6 -6
  79. package/dist/chat/execution/tools/repl-tool.d.ts +46 -0
  80. package/dist/chat/execution/tools/repl-tool.js +207 -0
  81. package/dist/chat/execution/tools/sessions-send.d.ts +2 -2
  82. package/dist/chat/execution/tools/slack-actions.d.ts +2 -2
  83. package/dist/chat/execution/tools/system.d.ts +4 -4
  84. package/dist/chat/execution/tools/todo-tool.d.ts +72 -0
  85. package/dist/chat/execution/tools/todo-tool.js +152 -0
  86. package/dist/chat/execution/tools/tool-search.d.ts +50 -0
  87. package/dist/chat/execution/tools/tool-search.js +155 -0
  88. package/dist/chat/execution/types.d.ts +21 -14
  89. package/dist/chat/execution/workflows/executor.d.ts +11 -0
  90. package/dist/chat/execution/workflows/executor.js +99 -1
  91. package/dist/chat/execution/workflows/types.d.ts +35 -2
  92. package/dist/chat/format/index.d.ts +1 -0
  93. package/dist/chat/format/index.js +1 -0
  94. package/dist/chat/format/markdown-convert.d.ts +23 -0
  95. package/dist/chat/format/markdown-convert.js +149 -0
  96. package/dist/chat/index.d.ts +1 -1
  97. package/dist/chat/index.js +1 -1
  98. package/dist/chat/message-handler.js +58 -6
  99. package/dist/chat/proactive/index.d.ts +62 -0
  100. package/dist/chat/proactive/index.js +147 -0
  101. package/dist/chat/prompt-adapter.js +2 -0
  102. package/dist/chat/providers/irc/index.d.ts +2 -2
  103. package/dist/chat/providers/slack/index.d.ts +2 -2
  104. package/dist/chat/providers/telegram/index.d.ts +2 -0
  105. package/dist/chat/providers/telegram/index.js +21 -2
  106. package/dist/chat/system-prompts.d.ts +3 -3
  107. package/dist/chat/system-prompts.js +116 -61
  108. package/dist/chat/tools.d.ts +6 -6
  109. package/dist/cli/commands/auth.js +64 -1
  110. package/dist/cli/commands/chat.js +1327 -138
  111. package/dist/cli/commands/doctor.js +222 -16
  112. package/dist/cli/commands/history.d.ts +3 -0
  113. package/dist/cli/commands/history.js +138 -0
  114. package/dist/cli/commands/import.d.ts +44 -0
  115. package/dist/cli/commands/import.js +526 -0
  116. package/dist/cli/commands/init.d.ts +13 -0
  117. package/dist/cli/commands/init.js +381 -0
  118. package/dist/cli/commands/models.js +39 -26
  119. package/dist/cli/commands/onboard.js +263 -98
  120. package/dist/cli/commands/plan.d.ts +13 -0
  121. package/dist/cli/commands/plan.js +184 -0
  122. package/dist/cli/commands/serve.d.ts +7 -0
  123. package/dist/cli/commands/serve.js +77 -18
  124. package/dist/cli/commands/setup.js +375 -91
  125. package/dist/cli/commands/status.js +54 -0
  126. package/dist/cli/commands/tools.js +13 -13
  127. package/dist/cli/commands/tui.js +26 -1
  128. package/dist/cli/index.js +19 -6
  129. package/dist/cli/ink/App.d.ts +13 -0
  130. package/dist/cli/ink/App.js +6 -0
  131. package/dist/cli/ink/ChatApp.d.ts +60 -0
  132. package/dist/cli/ink/ChatApp.js +325 -0
  133. package/dist/cli/ink/DashboardApp.d.ts +3 -0
  134. package/dist/cli/ink/DashboardApp.js +143 -0
  135. package/dist/cli/ink/components/AgentStatus.d.ts +17 -0
  136. package/dist/cli/ink/components/AgentStatus.js +33 -0
  137. package/dist/cli/ink/components/ChannelList.d.ts +17 -0
  138. package/dist/cli/ink/components/ChannelList.js +33 -0
  139. package/dist/cli/ink/components/ConnectionStatus.d.ts +19 -0
  140. package/dist/cli/ink/components/ConnectionStatus.js +50 -0
  141. package/dist/cli/ink/components/CostBar.d.ts +19 -0
  142. package/dist/cli/ink/components/CostBar.js +35 -0
  143. package/dist/cli/ink/components/HookStatus.d.ts +15 -0
  144. package/dist/cli/ink/components/HookStatus.js +7 -0
  145. package/dist/cli/ink/components/PermissionPrompt.d.ts +21 -0
  146. package/dist/cli/ink/components/PermissionPrompt.js +51 -0
  147. package/dist/cli/ink/components/PlanView.d.ts +23 -0
  148. package/dist/cli/ink/components/PlanView.js +26 -0
  149. package/dist/cli/ink/components/ProviderList.d.ts +16 -0
  150. package/dist/cli/ink/components/ProviderList.js +16 -0
  151. package/dist/cli/ink/components/SessionHeader.d.ts +15 -0
  152. package/dist/cli/ink/components/SessionHeader.js +15 -0
  153. package/dist/cli/ink/components/StreamingMessage.d.ts +20 -0
  154. package/dist/cli/ink/components/StreamingMessage.js +27 -0
  155. package/dist/cli/ink/components/SuggestionBar.d.ts +15 -0
  156. package/dist/cli/ink/components/SuggestionBar.js +28 -0
  157. package/dist/cli/ink/components/SystemHealth.d.ts +20 -0
  158. package/dist/cli/ink/components/SystemHealth.js +39 -0
  159. package/dist/cli/ink/components/TaskList.d.ts +17 -0
  160. package/dist/cli/ink/components/TaskList.js +59 -0
  161. package/dist/cli/ink/components/ToolCall.d.ts +17 -0
  162. package/dist/cli/ink/components/ToolCall.js +43 -0
  163. package/dist/cli/ink/index.d.ts +23 -0
  164. package/dist/cli/ink/index.js +15 -0
  165. package/dist/cli/ink/keybindings.d.ts +35 -0
  166. package/dist/cli/ink/keybindings.js +105 -0
  167. package/dist/cli/ink/markdown-renderer.d.ts +47 -0
  168. package/dist/cli/ink/markdown-renderer.js +380 -0
  169. package/dist/cli/ink/output-styles.d.ts +39 -0
  170. package/dist/cli/ink/output-styles.js +119 -0
  171. package/dist/cli/interactive/auto-serve.d.ts +38 -0
  172. package/dist/cli/interactive/auto-serve.js +209 -0
  173. package/dist/cli/interactive/index.d.ts +25 -0
  174. package/dist/cli/interactive/index.js +23 -0
  175. package/dist/cli/interactive/picker.d.ts +28 -0
  176. package/dist/cli/interactive/picker.js +153 -0
  177. package/dist/cli/interactive/renderer.d.ts +26 -0
  178. package/dist/cli/interactive/renderer.js +555 -0
  179. package/dist/cli/interactive/repl.d.ts +14 -0
  180. package/dist/cli/interactive/repl.js +1516 -0
  181. package/dist/cli/interactive/stream-client.d.ts +59 -0
  182. package/dist/cli/interactive/stream-client.js +506 -0
  183. package/dist/cli/interactive/types.d.ts +121 -0
  184. package/dist/cli/interactive/types.js +10 -0
  185. package/dist/cli/providers.d.ts +15 -0
  186. package/dist/cli/providers.js +41 -0
  187. package/dist/cli/utils/api.d.ts +9 -0
  188. package/dist/cli/utils/api.js +58 -2
  189. package/dist/core/deployment.js +2 -0
  190. package/dist/cron/natural-language.d.ts +54 -0
  191. package/dist/cron/natural-language.js +569 -0
  192. package/dist/cron/scheduler.d.ts +34 -4
  193. package/dist/cron/scheduler.js +141 -9
  194. package/dist/cron/templates.d.ts +1 -1
  195. package/dist/cron/templates.js +219 -0
  196. package/dist/feeds/feed-engine.d.ts +149 -0
  197. package/dist/feeds/feed-engine.js +600 -0
  198. package/dist/feeds/index.d.ts +9 -0
  199. package/dist/feeds/index.js +8 -0
  200. package/dist/gateway/router.js +6 -1
  201. package/dist/hooks/built-in/audit-log.d.ts +11 -0
  202. package/dist/hooks/built-in/audit-log.js +84 -0
  203. package/dist/hooks/built-in/cost-warning.d.ts +10 -0
  204. package/dist/hooks/built-in/cost-warning.js +59 -0
  205. package/dist/hooks/built-in/dangerous-tool.d.ts +32 -0
  206. package/dist/hooks/built-in/dangerous-tool.js +80 -0
  207. package/dist/hooks/built-in/index.d.ts +14 -0
  208. package/dist/hooks/built-in/index.js +20 -0
  209. package/dist/hooks/index.d.ts +3 -0
  210. package/dist/hooks/index.js +6 -0
  211. package/dist/hooks/loader.d.ts +17 -0
  212. package/dist/hooks/loader.js +142 -0
  213. package/dist/hooks/registry.d.ts +62 -0
  214. package/dist/hooks/registry.js +127 -0
  215. package/dist/integrations/web-search.js +6 -3
  216. package/dist/memory/index.d.ts +1 -0
  217. package/dist/memory/index.js +2 -0
  218. package/dist/memory/memory-service.js +14 -13
  219. package/dist/memory/observational.d.ts +62 -0
  220. package/dist/memory/observational.js +396 -0
  221. package/dist/middleware/content-filter.d.ts +22 -0
  222. package/dist/middleware/content-filter.js +69 -0
  223. package/dist/middleware/request-validator.d.ts +159 -0
  224. package/dist/middleware/request-validator.js +93 -0
  225. package/dist/plugins/sdk.d.ts +22 -0
  226. package/dist/plugins/sdk.js +17 -1
  227. package/dist/projects/types.d.ts +10 -10
  228. package/dist/providers/ai-sdk.d.ts +11 -0
  229. package/dist/providers/ai-sdk.js +97 -18
  230. package/dist/providers/core/models.js +67 -1
  231. package/dist/providers/core/types.d.ts +3 -0
  232. package/dist/providers/index.d.ts +1 -0
  233. package/dist/providers/index.js +1 -0
  234. package/dist/providers/smart-router.d.ts +118 -0
  235. package/dist/providers/smart-router.js +685 -0
  236. package/dist/providers/types.d.ts +16 -16
  237. package/dist/routes/agents.js +50 -0
  238. package/dist/routes/auth.js +8 -1
  239. package/dist/routes/channels.d.ts +12 -0
  240. package/dist/routes/channels.js +166 -0
  241. package/dist/routes/chat.js +259 -14
  242. package/dist/routes/costs.js +32 -0
  243. package/dist/routes/cron.js +80 -5
  244. package/dist/routes/feeds.d.ts +10 -0
  245. package/dist/routes/feeds.js +168 -0
  246. package/dist/routes/mcp.js +21 -0
  247. package/dist/routes/memory.js +130 -0
  248. package/dist/routes/skills.js +129 -0
  249. package/dist/routes/teams.d.ts +9 -0
  250. package/dist/routes/teams.js +210 -0
  251. package/dist/routes/tools.js +14 -0
  252. package/dist/routes/users.js +2 -0
  253. package/dist/server/route-loader.js +4 -1
  254. package/dist/server/stream-bridge.d.ts +19 -0
  255. package/dist/server/stream-bridge.js +38 -0
  256. package/dist/server.js +421 -141
  257. package/dist/skills/marketplace.d.ts +87 -0
  258. package/dist/skills/marketplace.js +268 -0
  259. package/dist/storage/index.d.ts +14 -0
  260. package/dist/storage/index.js +64 -3
  261. package/dist/storage/schema.d.ts +4 -4
  262. package/dist/storage/schema.js +1 -1
  263. package/dist/teams/index.d.ts +110 -0
  264. package/dist/teams/index.js +365 -0
  265. package/dist/tickets/types.d.ts +39 -39
  266. package/dist/types/summary.d.ts +5 -5
  267. package/dist/utils/auto-update.d.ts +23 -0
  268. package/dist/utils/auto-update.js +157 -0
  269. package/dist/utils/offline-detect.d.ts +55 -0
  270. package/dist/utils/offline-detect.js +121 -0
  271. package/dist/utils/pid-file.d.ts +36 -0
  272. package/dist/utils/pid-file.js +125 -0
  273. package/dist/utils/prevent-sleep.d.ts +27 -0
  274. package/dist/utils/prevent-sleep.js +95 -0
  275. package/dist/utils/sanitizer.d.ts +57 -0
  276. package/dist/utils/sanitizer.js +174 -0
  277. package/docker-compose.yml +13 -137
  278. package/package.json +31 -6
  279. package/skills/deploy-cloudflare/SKILL.md +62 -0
  280. package/skills/deploy-vercel/SKILL.md +67 -0
  281. package/skills/docker-deploy/SKILL.md +158 -0
  282. package/skills/full-stack-builder/SKILL.md +92 -0
  283. package/skills/git-workflow/SKILL.md +3 -3
  284. package/skills/humanizer/SKILL.md +488 -0
  285. package/skills/profclaw-assistant/SKILL.md +85 -56
  286. package/ui/dist/assets/ActivityView-Da6HQ8ws.js +1 -0
  287. package/ui/dist/assets/AgentList-H58R0kX3.js +1 -0
  288. package/ui/dist/assets/AnalyticsDashboard-B28AeRsc.js +1 -0
  289. package/ui/dist/assets/AreaChart-DwLzeAQ8.js +1 -0
  290. package/ui/dist/assets/CartesianChart-piKQsTAR.js +36 -0
  291. package/ui/dist/assets/ChatView-Dbj8rxU5.js +10 -0
  292. package/ui/dist/assets/CostsDashboard-C6F5df0F.js +1 -0
  293. package/ui/dist/assets/EstimateSelect-wga0rUKX.js +1 -0
  294. package/ui/dist/assets/FeedDashboard-Ef6FEzEf.js +1 -0
  295. package/ui/dist/assets/FloatingChatbot-0yhkUeCq.js +2 -0
  296. package/ui/dist/assets/InviteCodeManagement-tUXfx4Bc.js +2 -0
  297. package/ui/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  298. package/ui/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  299. package/ui/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  300. package/ui/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  301. package/ui/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  302. package/ui/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  303. package/ui/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  304. package/ui/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  305. package/ui/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  306. package/ui/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  307. package/ui/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  308. package/ui/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  309. package/ui/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  310. package/ui/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  311. package/ui/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  312. package/ui/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  313. package/ui/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  314. package/ui/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  315. package/ui/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  316. package/ui/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  317. package/ui/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  318. package/ui/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  319. package/ui/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  320. package/ui/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  321. package/ui/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  322. package/ui/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  323. package/ui/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  324. package/ui/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  325. package/ui/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  326. package/ui/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  327. package/ui/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  328. package/ui/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  329. package/ui/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  330. package/ui/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  331. package/ui/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  332. package/ui/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  333. package/ui/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  334. package/ui/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  335. package/ui/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  336. package/ui/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  337. package/ui/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  338. package/ui/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  339. package/ui/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  340. package/ui/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  341. package/ui/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  342. package/ui/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  343. package/ui/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  344. package/ui/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  345. package/ui/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  346. package/ui/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  347. package/ui/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  348. package/ui/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  349. package/ui/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  350. package/ui/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  351. package/ui/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  352. package/ui/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  353. package/ui/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  354. package/ui/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  355. package/ui/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  356. package/ui/dist/assets/MarketplacePage-DGrLtolR.js +1 -0
  357. package/ui/dist/assets/{ProjectDetail-DlYUcOss.js โ†’ ProjectDetail-BgWvA6UP.js} +2 -2
  358. package/ui/dist/assets/ProjectIcon-TDuliqwg.js +1 -0
  359. package/ui/dist/assets/ProjectList-DXgM4187.js +1 -0
  360. package/ui/dist/assets/{Settings-CgPqzUvj.js โ†’ Settings-xA8Zhi3p.js} +3 -3
  361. package/ui/dist/assets/StatusIndicator-B8vfFAxg.js +1 -0
  362. package/ui/dist/assets/{SummaryDetail-CwLAfHgJ.js โ†’ SummaryDetail-eedRfTtF.js} +2 -2
  363. package/ui/dist/assets/SummaryList-CLNX2P84.js +1 -0
  364. package/ui/dist/assets/TaskDetail-BtWclNiR.js +1 -0
  365. package/ui/dist/assets/TaskList-JjODAgSc.js +1 -0
  366. package/ui/dist/assets/TeamsPage-CBK5iAyx.js +1 -0
  367. package/ui/dist/assets/TicketBoard-C9aJNNYp.js +1 -0
  368. package/ui/dist/assets/TicketDetail-CV5JmL31.js +1 -0
  369. package/ui/dist/assets/TicketList-68V4lzUz.js +1 -0
  370. package/ui/dist/assets/UserManagement-DKTb6UpE.js +2 -0
  371. package/ui/dist/assets/ViewSwitcher-BvdQht2Y.js +1 -0
  372. package/ui/dist/assets/alert-dialog-O6qBOv_f.js +1 -0
  373. package/ui/dist/assets/{archive-CGck7gxR.js โ†’ archive-CX7UvZpf.js} +1 -1
  374. package/ui/dist/assets/badge-BbfnwDJP.js +1 -0
  375. package/ui/dist/assets/{bug-DqSGPUUE.js โ†’ bug-3WX0394-.js} +1 -1
  376. package/ui/dist/assets/{calendar-BuZ4zbPW.js โ†’ calendar-buq77TaS.js} +1 -1
  377. package/ui/dist/assets/{chevron-up-DcJ4LL_N.js โ†’ chevron-up-4ymsBJRo.js} +1 -1
  378. package/ui/dist/assets/{circle-x-C78PNZjF.js โ†’ circle-x-ByXtwR6Y.js} +1 -1
  379. package/ui/dist/assets/constants-CVdDh7p0.js +1 -0
  380. package/ui/dist/assets/{cpu-Ck6AoG8c.js โ†’ cpu-CiuoCeDY.js} +1 -1
  381. package/ui/dist/assets/{database-CA2w8Lvt.js โ†’ database-BWXSBg5a.js} +1 -1
  382. package/ui/dist/assets/dialog-lDg4NvMV.js +1 -0
  383. package/ui/dist/assets/dollar-sign-Dmijd6DP.js +1 -0
  384. package/ui/dist/assets/{ellipsis-FhHKRbfl.js โ†’ ellipsis-vT-5SVIp.js} +1 -1
  385. package/ui/dist/assets/{ellipsis-vertical-CO0UqE4-.js โ†’ ellipsis-vertical-B4tAX_bL.js} +1 -1
  386. package/ui/dist/assets/feature-markdown-DBo5Q7uq.js +289 -0
  387. package/ui/dist/assets/{file-code-ChnhYYj1.js โ†’ file-code-ChOWdKXf.js} +1 -1
  388. package/ui/dist/assets/{folder-open-CHwA1-ve.js โ†’ folder-open-CkOUbIiP.js} +1 -1
  389. package/ui/dist/assets/{funnel-ByEjRFNB.js โ†’ funnel-uZkoSPP-.js} +1 -1
  390. package/ui/dist/assets/{git-branch-GTOPQgU4.js โ†’ git-branch-CwvUxj7C.js} +1 -1
  391. package/ui/dist/assets/{git-commit-horizontal-F5M84Kut.js โ†’ git-commit-horizontal-lxPzCvhD.js} +1 -1
  392. package/ui/dist/assets/{globe-CQWfr7hT.js โ†’ globe-D_WpJdsj.js} +1 -1
  393. package/ui/dist/assets/{hash-nKC9gtLg.js โ†’ hash-CA0hJ7vh.js} +1 -1
  394. package/ui/dist/assets/{history-DfFSA9xJ.js โ†’ history-CEWMLELs.js} +1 -1
  395. package/ui/dist/assets/inbox-ehtOptTV.js +1 -0
  396. package/ui/dist/assets/{index-a4Fxq0Hb.js โ†’ index-C1rhbml4.js} +3 -3
  397. package/ui/dist/assets/index-CR8gfCHv.js +1 -0
  398. package/ui/dist/assets/index-DVXMpWai.js +1 -0
  399. package/ui/dist/assets/index-DaDJMM2v.js +1 -0
  400. package/ui/dist/assets/index-Djdq_0xu.js +1 -0
  401. package/ui/dist/assets/index-M46Gcb8K.css +1 -0
  402. package/ui/dist/assets/index-sEBN7w8J.js +109 -0
  403. package/ui/dist/assets/layers-C6Mhf8Nk.js +1 -0
  404. package/ui/dist/assets/{layout-dashboard-WmgjMhWF.js โ†’ layout-dashboard-BRUM0kpT.js} +1 -1
  405. package/ui/dist/assets/{lightbulb-Bo8hEr7B.js โ†’ lightbulb-CN2q1O5l.js} +1 -1
  406. package/ui/dist/assets/{link-2-YqrpQXBH.js โ†’ link-2-CC4E28yJ.js} +1 -1
  407. package/ui/dist/assets/markdown-renderer-C6ENbB0u.js +10 -0
  408. package/ui/dist/assets/markdown-renderer-CfVKi3_s.css +1 -0
  409. package/ui/dist/assets/{message-square-CD0H5hot.js โ†’ message-square-Bbb241am.js} +1 -1
  410. package/ui/dist/assets/package-CwT3IzFx.js +1 -0
  411. package/ui/dist/assets/{pencil-DpFnj5dn.js โ†’ pencil-CDmiHzoj.js} +1 -1
  412. package/ui/dist/assets/{play-DVgea_jT.js โ†’ play-tjy5jMQX.js} +1 -1
  413. package/ui/dist/assets/popover-CFHZf3pE.js +1 -0
  414. package/ui/dist/assets/progress-BboUHuLf.js +1 -0
  415. package/ui/dist/assets/{rocket-BFxPYGx9.js โ†’ rocket--8ZHgdXJ.js} +1 -1
  416. package/ui/dist/assets/select-n108rXny.js +1 -0
  417. package/ui/dist/assets/{send-eYnW_7n-.js โ†’ send-Cu7MR2Qh.js} +1 -1
  418. package/ui/dist/assets/server-DmodxZp-.js +1 -0
  419. package/ui/dist/assets/{settings-2-scXUOuE_.js โ†’ settings-2-CkRNqkxj.js} +1 -1
  420. package/ui/dist/assets/sheet-7aUJkyzU.js +1 -0
  421. package/ui/dist/assets/{shield-check-PEr7nmVw.js โ†’ shield-check-ViI3nMKE.js} +1 -1
  422. package/ui/dist/assets/{shield-off-CLtXio62.js โ†’ shield-off-DN3tagkn.js} +1 -1
  423. package/ui/dist/assets/skeleton-C0E1Nfro.js +1 -0
  424. package/ui/dist/assets/{smartphone-DusFfY0U.js โ†’ smartphone-5FghiXpA.js} +1 -1
  425. package/ui/dist/assets/{square-e1yxB2eR.js โ†’ square-DiNSx8K7.js} +1 -1
  426. package/ui/dist/assets/star-DhdFVidS.js +1 -0
  427. package/ui/dist/assets/switch-CIgVbZqQ.js +1 -0
  428. package/ui/dist/assets/table-BC56FVMV.js +1 -0
  429. package/ui/dist/assets/{tag-tAwMmQ9G.js โ†’ tag-CH_vQliw.js} +1 -1
  430. package/ui/dist/assets/textarea-CxDiKFXZ.js +1 -0
  431. package/ui/dist/assets/{timer-Vel1N3RP.js โ†’ timer-CdGVTb60.js} +1 -1
  432. package/ui/dist/assets/tooltip-BuW9A5UO.js +1 -0
  433. package/ui/dist/assets/{trash-2-eM-CNwsZ.js โ†’ trash-2-CucZJL0N.js} +1 -1
  434. package/ui/dist/assets/trending-down-BCezC1z2.js +1 -0
  435. package/ui/dist/assets/{trending-up-BGafmjRo.js โ†’ trending-up-C5OYX2k2.js} +1 -1
  436. package/ui/dist/assets/vendor-query-C0p7b53x.js +4 -0
  437. package/ui/dist/assets/vendor-react-Mc5_kfYG.js +12 -0
  438. package/ui/dist/assets/vendor-ui-CXPAUBFv.js +51 -0
  439. package/ui/dist/assets/{wand-sparkles-DPvcd9Pi.js โ†’ wand-sparkles-BaH6pJnc.js} +1 -1
  440. package/ui/dist/assets/{wrench-B8s3zYVV.js โ†’ wrench-CjxjP6ok.js} +1 -1
  441. package/ui/dist/index.html +5 -2
  442. package/dist/chat/auto-reply.d.ts +0 -90
  443. package/dist/chat/auto-reply.js +0 -272
  444. package/dist/chat/execution/pty.d.ts +0 -92
  445. package/dist/chat/execution/pty.js +0 -285
  446. package/dist/chat/execution/tools/glinr-ops.d.ts +0 -202
  447. package/dist/chat/execution/tools/glinr-ops.js +0 -694
  448. package/dist/cli/commands/browser.d.ts +0 -3
  449. package/dist/cli/commands/browser.js +0 -138
  450. package/dist/cli/commands/canvas.d.ts +0 -3
  451. package/dist/cli/commands/canvas.js +0 -155
  452. package/dist/cli/commands/nodes.d.ts +0 -3
  453. package/dist/cli/commands/nodes.js +0 -193
  454. package/dist/diagnostics/exporters.d.ts +0 -21
  455. package/dist/diagnostics/exporters.js +0 -138
  456. package/dist/diagnostics/index.d.ts +0 -10
  457. package/dist/diagnostics/index.js +0 -9
  458. package/dist/diagnostics/middleware.d.ts +0 -12
  459. package/dist/diagnostics/middleware.js +0 -58
  460. package/dist/diagnostics/tracer.d.ts +0 -133
  461. package/dist/diagnostics/tracer.js +0 -257
  462. package/dist/discovery/index.d.ts +0 -8
  463. package/dist/discovery/index.js +0 -7
  464. package/dist/discovery/mdns.d.ts +0 -40
  465. package/dist/discovery/mdns.js +0 -249
  466. package/dist/plugins/registry.d.ts +0 -122
  467. package/dist/plugins/registry.js +0 -352
  468. package/dist/plugins/sandbox.d.ts +0 -77
  469. package/dist/plugins/sandbox.js +0 -287
  470. package/dist/plugins/search/brave.d.ts +0 -9
  471. package/dist/plugins/search/brave.js +0 -157
  472. package/dist/plugins/search/duckduckgo.d.ts +0 -9
  473. package/dist/plugins/search/duckduckgo.js +0 -171
  474. package/dist/plugins/search/index.d.ts +0 -13
  475. package/dist/plugins/search/index.js +0 -23
  476. package/dist/plugins/search/searxng.d.ts +0 -9
  477. package/dist/plugins/search/searxng.js +0 -170
  478. package/dist/plugins/search/serper.d.ts +0 -9
  479. package/dist/plugins/search/serper.js +0 -135
  480. package/dist/plugins/search/tavily.d.ts +0 -9
  481. package/dist/plugins/search/tavily.js +0 -146
  482. package/dist/providers/adapters/anthropic.d.ts +0 -26
  483. package/dist/providers/adapters/anthropic.js +0 -306
  484. package/dist/providers/adapters/base.d.ts +0 -53
  485. package/dist/providers/adapters/base.js +0 -99
  486. package/dist/providers/adapters/ollama.d.ts +0 -30
  487. package/dist/providers/adapters/ollama.js +0 -292
  488. package/dist/utils/ai-cache.d.ts +0 -72
  489. package/dist/utils/ai-cache.js +0 -204
  490. package/dist/utils/file-lock.d.ts +0 -85
  491. package/dist/utils/file-lock.js +0 -204
  492. package/ui/dist/assets/ActivityView-DIPQSJ_d.js +0 -1
  493. package/ui/dist/assets/AgentList-CqyaYrcq.js +0 -1
  494. package/ui/dist/assets/AnalyticsDashboard-C-mjuGHT.js +0 -1
  495. package/ui/dist/assets/AreaChart-CfYWmbtr.js +0 -1
  496. package/ui/dist/assets/CartesianChart-BaQ3It0c.js +0 -36
  497. package/ui/dist/assets/ChatView-DxxQy6pl.js +0 -10
  498. package/ui/dist/assets/CostsDashboard-CDBBcGkg.js +0 -1
  499. package/ui/dist/assets/EstimateSelect-CDjf5qKl.js +0 -1
  500. package/ui/dist/assets/FloatingChatbot-CZHjvJIe.js +0 -2
  501. package/ui/dist/assets/InviteCodeManagement-DTm-IPTm.js +0 -2
  502. package/ui/dist/assets/ProjectIcon-BMRpnM04.js +0 -1
  503. package/ui/dist/assets/ProjectList-D85TN0i0.js +0 -4
  504. package/ui/dist/assets/StatusIndicator-yig0uZEA.js +0 -1
  505. package/ui/dist/assets/SummaryList-BvS5Idnu.js +0 -1
  506. package/ui/dist/assets/TaskDetail-zarC1fOt.js +0 -1
  507. package/ui/dist/assets/TaskList-CyJq3ANE.js +0 -1
  508. package/ui/dist/assets/TicketBoard-BlWr3-iH.js +0 -1
  509. package/ui/dist/assets/TicketDetail-DmqWKj2W.js +0 -1
  510. package/ui/dist/assets/TicketList-Scj4pMWa.js +0 -1
  511. package/ui/dist/assets/UserManagement-BH7uG7dw.js +0 -2
  512. package/ui/dist/assets/ViewSwitcher-3HzZUdWn.js +0 -1
  513. package/ui/dist/assets/alert-dialog-DWPb2IfQ.js +0 -7
  514. package/ui/dist/assets/badge-DEmc3Z_l.js +0 -1
  515. package/ui/dist/assets/brain-CfFdLVqb.js +0 -1
  516. package/ui/dist/assets/constants-DhDjZe4P.js +0 -1
  517. package/ui/dist/assets/dialog-BOdGWhgE.js +0 -1
  518. package/ui/dist/assets/index--JkIxVXb.js +0 -67
  519. package/ui/dist/assets/index-Ca3vk7Gq.js +0 -1
  520. package/ui/dist/assets/index-DHGvP9mp.js +0 -1
  521. package/ui/dist/assets/index-DeI8lKRR.js +0 -1
  522. package/ui/dist/assets/index-WclMPci1.css +0 -1
  523. package/ui/dist/assets/index-Z4-RtZcs.js +0 -1
  524. package/ui/dist/assets/layers-DFeLExSa.js +0 -1
  525. package/ui/dist/assets/markdown-renderer-Croje6Xe.js +0 -36
  526. package/ui/dist/assets/popover-JXecfWG5.js +0 -1
  527. package/ui/dist/assets/progress-C1ghf1Fu.js +0 -1
  528. package/ui/dist/assets/select-MADP8m6Q.js +0 -1
  529. package/ui/dist/assets/server-CPMaysH8.js +0 -1
  530. package/ui/dist/assets/sheet-r6NSOxi-.js +0 -1
  531. package/ui/dist/assets/skeleton-C9oEzNlU.js +0 -1
  532. package/ui/dist/assets/switch-tNs0n-kz.js +0 -1
  533. package/ui/dist/assets/table-CXxtLicg.js +0 -1
  534. package/ui/dist/assets/textarea-BjiEeIWh.js +0 -1
  535. package/ui/dist/assets/tooltip-ZMwtfr1J.js +0 -1
@@ -11,9 +11,9 @@ import { registerBuiltinTools } from '../../chat/execution/tools/index.js';
11
11
  import { getToolRegistry } from '../../chat/execution/registry.js';
12
12
  // Lazy initialization - only register tools when a tools command actually runs
13
13
  let toolsInitialized = false;
14
- function getRegistry() {
14
+ async function getRegistry() {
15
15
  if (!toolsInitialized) {
16
- registerBuiltinTools();
16
+ await registerBuiltinTools();
17
17
  toolsInitialized = true;
18
18
  }
19
19
  return getToolRegistry();
@@ -93,7 +93,7 @@ export function toolsCommands() {
93
93
  .option('--json', 'Output as JSON')
94
94
  .option('-c, --category <cat>', 'Filter by category')
95
95
  .action(async (options) => {
96
- const registry = getRegistry();
96
+ const registry = await getRegistry();
97
97
  let toolList = registry.list();
98
98
  if (options.category) {
99
99
  toolList = toolList.filter((t) => t.category === options.category);
@@ -145,7 +145,7 @@ export function toolsCommands() {
145
145
  .description('Show detailed information about a tool')
146
146
  .option('--json', 'Output as JSON')
147
147
  .action(async (name, options) => {
148
- const registry = getRegistry();
148
+ const registry = await getRegistry();
149
149
  const tool = registry.get(name);
150
150
  if (!tool) {
151
151
  error(`Tool '${name}' not found`);
@@ -192,7 +192,7 @@ export function toolsCommands() {
192
192
  .option('--json', 'Output result as JSON')
193
193
  .option('-y, --yes', 'Skip approval for moderate tools')
194
194
  .action(async (name, options) => {
195
- const registry = getRegistry();
195
+ const registry = await getRegistry();
196
196
  const tool = registry.get(name);
197
197
  if (!tool) {
198
198
  error(`Tool '${name}' not found`);
@@ -270,7 +270,7 @@ export function toolsCommands() {
270
270
  .option('--json', 'Output as JSON')
271
271
  .action(async (commandParts, options) => {
272
272
  const command = commandParts.join(' ');
273
- const registry = getRegistry();
273
+ const registry = await getRegistry();
274
274
  const tool = registry.get('exec');
275
275
  if (!tool) {
276
276
  error('exec tool not found');
@@ -308,7 +308,7 @@ export function toolsCommands() {
308
308
  .option('-s, --short', 'Short format')
309
309
  .option('-w, --workdir <path>', 'Repository path')
310
310
  .action(async (options) => {
311
- const registry = getRegistry();
311
+ const registry = await getRegistry();
312
312
  const tool = registry.get('git_status');
313
313
  if (!tool) {
314
314
  error('git_status tool not found');
@@ -332,7 +332,7 @@ export function toolsCommands() {
332
332
  .option('-t, --type <type>', 'Info type: all, cpu, memory, os, network', 'all')
333
333
  .option('--json', 'Output as JSON')
334
334
  .action(async (options) => {
335
- const registry = getRegistry();
335
+ const registry = await getRegistry();
336
336
  const tool = registry.get('system_info');
337
337
  if (!tool) {
338
338
  error('system_info tool not found');
@@ -359,7 +359,7 @@ export function toolsCommands() {
359
359
  .description('Shortcut: Show environment variables')
360
360
  .option('-f, --filter <pattern>', 'Filter by pattern')
361
361
  .action(async (name, options) => {
362
- const registry = getRegistry();
362
+ const registry = await getRegistry();
363
363
  const tool = registry.get('env');
364
364
  if (!tool) {
365
365
  error('env tool not found');
@@ -381,7 +381,7 @@ export function toolsCommands() {
381
381
  .command('which <command>')
382
382
  .description('Shortcut: Find command location')
383
383
  .action(async (command) => {
384
- const registry = getRegistry();
384
+ const registry = await getRegistry();
385
385
  const tool = registry.get('which');
386
386
  if (!tool) {
387
387
  error('which tool not found');
@@ -403,7 +403,7 @@ export function toolsCommands() {
403
403
  .description('Shortcut: Read a file')
404
404
  .option('-l, --lines <n>', 'Max lines to read', '100')
405
405
  .action(async (filePath, options) => {
406
- const registry = getRegistry();
406
+ const registry = await getRegistry();
407
407
  const tool = registry.get('read_file');
408
408
  if (!tool) {
409
409
  error('read_file tool not found');
@@ -431,7 +431,7 @@ export function toolsCommands() {
431
431
  .option('-p, --path <dir>', 'Search directory', '.')
432
432
  .option('-t, --type <type>', 'File type: file, directory, both', 'file')
433
433
  .action(async (pattern, options) => {
434
- const registry = getRegistry();
434
+ const registry = await getRegistry();
435
435
  const tool = registry.get('search_files');
436
436
  if (!tool) {
437
437
  error('search_files tool not found');
@@ -469,7 +469,7 @@ export function toolsCommands() {
469
469
  .option('-i, --ignore-case', 'Case insensitive')
470
470
  .option('-c, --context <n>', 'Context lines', '0')
471
471
  .action(async (pattern, searchPath, options) => {
472
- const registry = getRegistry();
472
+ const registry = await getRegistry();
473
473
  const tool = registry.get('grep');
474
474
  if (!tool) {
475
475
  error('grep tool not found');
@@ -2,6 +2,20 @@ import { Command } from 'commander';
2
2
  import chalk from 'chalk';
3
3
  import { api } from '../utils/api.js';
4
4
  import { spinner, error, createTable, formatRelativeTime, truncate } from '../utils/output.js';
5
+ async function launchInkDashboard() {
6
+ // Check if we have a real TTY (Ink needs raw mode)
7
+ if (!process.stdin.isTTY) {
8
+ console.error(chalk.red('Error: Ink TUI requires an interactive terminal (TTY).'));
9
+ console.error(chalk.dim('Run this command directly in your terminal, not piped.'));
10
+ process.exit(1);
11
+ }
12
+ // Dynamic import so ink is only loaded when --ink flag is used
13
+ const { render } = await import('ink');
14
+ const React = await import('react');
15
+ const { DashboardApp } = await import('../ink/DashboardApp.js');
16
+ const { waitUntilExit } = render(React.createElement(DashboardApp));
17
+ await waitUntilExit();
18
+ }
5
19
  function formatUptime(seconds) {
6
20
  const d = Math.floor(seconds / 86400);
7
21
  const h = Math.floor((seconds % 86400) / 3600);
@@ -130,8 +144,19 @@ export function tuiCommand() {
130
144
  const cmd = new Command('tui')
131
145
  .description('Show terminal dashboard')
132
146
  .option('--watch', 'Refresh dashboard every 5 seconds')
133
- .option('--interval <seconds>', 'Refresh interval in seconds', '5');
147
+ .option('--interval <seconds>', 'Refresh interval in seconds', '5')
148
+ .option('--ink', 'Launch rich interactive Ink dashboard (tabs, auto-refresh, keyboard nav)');
134
149
  cmd.action(async (options) => {
150
+ if (options.ink) {
151
+ try {
152
+ await launchInkDashboard();
153
+ }
154
+ catch (err) {
155
+ error(err instanceof Error ? err.message : 'Failed to launch Ink dashboard');
156
+ process.exit(1);
157
+ }
158
+ return;
159
+ }
135
160
  try {
136
161
  await renderDashboard();
137
162
  if (options.watch) {
package/dist/cli/index.js CHANGED
@@ -2,6 +2,7 @@
2
2
  import { Command } from 'commander';
3
3
  import chalk from 'chalk';
4
4
  import figlet from 'figlet';
5
+ import { checkForUpdate, formatUpdateMessage } from '../utils/auto-update.js';
5
6
  import { taskCommands } from './commands/task.js';
6
7
  import { ticketCommands } from './commands/ticket.js';
7
8
  import { summaryCommands } from './commands/summary.js';
@@ -23,18 +24,19 @@ import { sessionCommands } from './commands/session.js';
23
24
  import { doctorCommand } from './commands/doctor.js';
24
25
  import { providerCommands } from './commands/provider.js';
25
26
  import { mcpCommands } from './commands/mcp.js';
26
- import { browserCommands } from './commands/browser.js';
27
27
  import { devicesCommands } from './commands/devices.js';
28
28
  import { daemonCommand } from './commands/daemon.js';
29
29
  import { completionCommands } from './commands/completion.js';
30
- import { canvasCommands } from './commands/canvas.js';
31
30
  import { webhooksCommands } from './commands/webhooks.js';
32
31
  import { channelsCommands } from './commands/channels.js';
33
32
  import { securityCommands } from './commands/security.js';
34
33
  import { logsCommand } from './commands/logs.js';
35
34
  import { modelsCommands } from './commands/models.js';
36
- import { nodesCommands } from './commands/nodes.js';
37
35
  import { tuiCommand } from './commands/tui.js';
36
+ import { importCommands } from './commands/import.js';
37
+ import { historyCommands } from './commands/history.js';
38
+ import { planCommands } from './commands/plan.js';
39
+ import { initCommand } from './commands/init.js';
38
40
  const VERSION = '2.0.0';
39
41
  // ASCII Banner
40
42
  function showBanner() {
@@ -77,18 +79,19 @@ program.addCommand(doctorCommand());
77
79
  program.addCommand(providerCommands());
78
80
  program.addCommand(mcpCommands());
79
81
  // Phase 9 - OpenClaw parity commands
80
- program.addCommand(browserCommands());
81
82
  program.addCommand(devicesCommands());
82
83
  program.addCommand(daemonCommand());
83
84
  program.addCommand(completionCommands());
84
- program.addCommand(canvasCommands());
85
85
  program.addCommand(webhooksCommands());
86
86
  program.addCommand(channelsCommands());
87
87
  program.addCommand(securityCommands());
88
88
  program.addCommand(logsCommand());
89
89
  program.addCommand(modelsCommands());
90
- program.addCommand(nodesCommands());
91
90
  program.addCommand(tuiCommand());
91
+ program.addCommand(importCommands());
92
+ program.addCommand(historyCommands());
93
+ program.addCommand(planCommands());
94
+ program.addCommand(initCommand());
92
95
  // Default action (no command) - show banner and help
93
96
  program.action(() => {
94
97
  showBanner();
@@ -124,4 +127,14 @@ program.action(() => {
124
127
  });
125
128
  // Parse and execute (parseAsync required for async command actions)
126
129
  await program.parseAsync();
130
+ // Non-blocking update check โ€” runs after the main command completes.
131
+ // Only checks if 24h have elapsed (enforced inside checkForUpdate via cache).
132
+ checkForUpdate().then((info) => {
133
+ const msg = formatUpdateMessage(info);
134
+ if (msg) {
135
+ console.log('\n' + chalk.yellow(' ' + msg));
136
+ }
137
+ }).catch(() => {
138
+ // Update check is best-effort; never surface errors to the user
139
+ });
127
140
  //# sourceMappingURL=index.js.map
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Ink App Wrapper
3
+ *
4
+ * Root container for all Ink-based TUI screens. Provides consistent
5
+ * padding and flex column layout.
6
+ */
7
+ import React from 'react';
8
+ interface AppProps {
9
+ children: React.ReactNode;
10
+ }
11
+ export declare const App: React.FC<AppProps>;
12
+ export {};
13
+ //# sourceMappingURL=App.d.ts.map
@@ -0,0 +1,6 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Box } from 'ink';
3
+ export const App = ({ children }) => {
4
+ return (_jsx(Box, { flexDirection: "column", paddingX: 1, paddingY: 0, children: children }));
5
+ };
6
+ //# sourceMappingURL=App.js.map
@@ -0,0 +1,60 @@
1
+ /**
2
+ * ChatApp โ€” Full Interactive Chat TUI
3
+ *
4
+ * Layout:
5
+ * โ”Œ SessionHeader โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
6
+ * โ”‚ message history (StreamingMessage list) โ”‚
7
+ * โ”‚ AgentStatus (while streaming) โ”‚
8
+ * โ”‚ PermissionPrompt (overlay when needed) โ”‚
9
+ * โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
10
+ * โ”‚ CostBar โ”‚
11
+ * โ”‚ > TextInput โ”‚
12
+ * โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
13
+ */
14
+ import React from 'react';
15
+ import { type SessionHeaderProps } from './components/SessionHeader.js';
16
+ import { type AgentStatusState } from './components/AgentStatus.js';
17
+ import { type PermissionDecision, type PermissionLevel } from './components/PermissionPrompt.js';
18
+ import type { ChatMessage } from '../interactive/types.js';
19
+ import type { Suggestion } from '../../agents/prompt-suggestions.js';
20
+ export interface PendingPermission {
21
+ toolName: string;
22
+ args: Record<string, unknown>;
23
+ permissionLevel: PermissionLevel;
24
+ reason?: string;
25
+ resolve: (decision: PermissionDecision) => void;
26
+ }
27
+ export interface PickerOption {
28
+ label: string;
29
+ value: string;
30
+ description?: string;
31
+ active?: boolean;
32
+ disabled?: boolean;
33
+ }
34
+ export interface ChatAppProps {
35
+ sessionInfo: Omit<SessionHeaderProps, 'sessionId'> & {
36
+ sessionId: string;
37
+ };
38
+ tokensUsed: number;
39
+ tokensMax: number;
40
+ estimatedCost?: number;
41
+ agentStatus: AgentStatusState;
42
+ agentAction?: string;
43
+ stepCount: number;
44
+ elapsedMs: number;
45
+ messages: ChatMessage[];
46
+ streamingContent?: string;
47
+ pendingPermission?: PendingPermission;
48
+ availableModels?: PickerOption[];
49
+ availableProviders?: PickerOption[];
50
+ suggestions?: Suggestion[];
51
+ /** Connection status forwarded from the stream client / offline detector */
52
+ connectionStatus?: 'connected' | 'reconnecting' | 'disconnected';
53
+ /** Measured round-trip latency in ms (updated after each successful ping) */
54
+ connectionLatencyMs?: number;
55
+ onSubmit: (message: string) => void;
56
+ onPermissionDecision?: (decision: PermissionDecision) => void;
57
+ onCancel?: () => void;
58
+ }
59
+ export declare const ChatApp: React.FC<ChatAppProps>;
60
+ //# sourceMappingURL=ChatApp.d.ts.map
@@ -0,0 +1,325 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * ChatApp โ€” Full Interactive Chat TUI
4
+ *
5
+ * Layout:
6
+ * โ”Œ SessionHeader โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
7
+ * โ”‚ message history (StreamingMessage list) โ”‚
8
+ * โ”‚ AgentStatus (while streaming) โ”‚
9
+ * โ”‚ PermissionPrompt (overlay when needed) โ”‚
10
+ * โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
11
+ * โ”‚ CostBar โ”‚
12
+ * โ”‚ > TextInput โ”‚
13
+ * โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
14
+ */
15
+ import { useState, useCallback, useEffect } from 'react';
16
+ import { Box, Text, useApp, useInput } from 'ink';
17
+ import TextInput from 'ink-text-input';
18
+ import { App } from './App.js';
19
+ import { SessionHeader } from './components/SessionHeader.js';
20
+ import { StreamingMessage } from './components/StreamingMessage.js';
21
+ import { AgentStatus } from './components/AgentStatus.js';
22
+ import { CostBar } from './components/CostBar.js';
23
+ import { PermissionPrompt, } from './components/PermissionPrompt.js';
24
+ import { SuggestionBar } from './components/SuggestionBar.js';
25
+ import { ConnectionStatus } from './components/ConnectionStatus.js';
26
+ const SLASH_COMMANDS = [
27
+ { name: '/model', description: 'Switch AI model', hasSubPicker: true, immediate: false },
28
+ { name: '/provider', description: 'Switch provider', hasSubPicker: true, immediate: false },
29
+ { name: '/agentic', description: 'Toggle agentic mode (tools + multi-step)', hasSubPicker: false, immediate: true },
30
+ { name: '/effort', description: 'Set effort: low | medium | high', hasSubPicker: false, immediate: false },
31
+ { name: '/thinking', description: 'Toggle thinking display', hasSubPicker: false, immediate: true },
32
+ { name: '/tools', description: 'Toggle tool call verbosity', hasSubPicker: false, immediate: true },
33
+ { name: '/new', description: 'Start a fresh conversation', hasSubPicker: false, immediate: true },
34
+ { name: '/sessions', description: 'List recent conversations', hasSubPicker: false, immediate: true },
35
+ { name: '/resume', description: 'Resume a session by id prefix', hasSubPicker: false, immediate: false },
36
+ { name: '/status', description: 'Server and provider health', hasSubPicker: false, immediate: true },
37
+ { name: '/insights', description: 'Session and server usage analytics', hasSubPicker: false, immediate: true },
38
+ { name: '/run', description: 'Execute a shell command', hasSubPicker: false, immediate: false },
39
+ { name: '/retry', description: 'Retry last message', hasSubPicker: false, immediate: true },
40
+ { name: '/diff', description: 'Show unified diff of all file changes this session', hasSubPicker: false, immediate: true },
41
+ { name: '/rewind', description: 'List or restore file snapshots (optional: <path> or --turn <n>)', hasSubPicker: false, immediate: false },
42
+ { name: '/compact', description: 'Compact context โ€” summarize old turns (--llm for LLM summary)', hasSubPicker: false, immediate: true },
43
+ { name: '/branch', description: 'Fork conversation at current turn (or /branch <n> for turn N)', hasSubPicker: false, immediate: false },
44
+ { name: '/branches', description: 'List all branches for this conversation', hasSubPicker: false, immediate: true },
45
+ { name: '/clear', description: 'Clear display', hasSubPicker: false, immediate: true },
46
+ { name: '/help', description: 'Show all commands', hasSubPicker: false, immediate: true },
47
+ { name: '/exit', description: 'Quit', hasSubPicker: false, immediate: true },
48
+ ];
49
+ // Max number of history entries to retain
50
+ const MAX_HISTORY = 50;
51
+ export const ChatApp = ({ sessionInfo, tokensUsed, tokensMax, estimatedCost, agentStatus, agentAction, stepCount, elapsedMs, messages, streamingContent, pendingPermission, availableModels = [], availableProviders = [], suggestions = [], connectionStatus = 'connected', connectionLatencyMs, onSubmit, onPermissionDecision, onCancel, }) => {
52
+ const { exit } = useApp();
53
+ const [inputValue, setInputValue] = useState('');
54
+ const [pickerMode, setPickerMode] = useState('none');
55
+ const [selectedIdx, setSelectedIdx] = useState(0);
56
+ const [subPickerTitle, setSubPickerTitle] = useState('');
57
+ const [subPickerItems, setSubPickerItems] = useState([]);
58
+ const [subPickerCommand, setSubPickerCommand] = useState('');
59
+ // โ”€โ”€ Multiline state โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
60
+ const [isMultiline, setIsMultiline] = useState(false);
61
+ const [multilineLines, setMultilineLines] = useState([]);
62
+ // โ”€โ”€ Input history state โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
63
+ const [inputHistory, setInputHistory] = useState([]);
64
+ const [historyIndex, setHistoryIndex] = useState(-1);
65
+ // Saved draft before navigating history (so Down arrow restores it)
66
+ const [historyDraft, setHistoryDraft] = useState('');
67
+ const isStreaming = agentStatus === 'thinking' || agentStatus === 'executing';
68
+ // Compute matching commands when in command picker mode
69
+ const inCommandPicker = inputValue.startsWith('/') && inputValue.indexOf(' ') === -1 && !isStreaming && !isMultiline;
70
+ const matchingCmds = inCommandPicker
71
+ ? SLASH_COMMANDS.filter(c => c.name.startsWith(inputValue.toLowerCase()))
72
+ : [];
73
+ // Auto-show/hide command picker
74
+ useEffect(() => {
75
+ if (inCommandPicker && matchingCmds.length > 0 && pickerMode === 'none') {
76
+ setPickerMode('commands');
77
+ setSelectedIdx(0);
78
+ }
79
+ else if (!inCommandPicker && pickerMode === 'commands') {
80
+ setPickerMode('none');
81
+ }
82
+ }, [inCommandPicker, matchingCmds.length, pickerMode]);
83
+ // Current picker items
84
+ const pickerItems = pickerMode === 'commands'
85
+ ? matchingCmds.map(c => ({ label: c.name, value: c.name, description: c.description }))
86
+ : pickerMode === 'sub'
87
+ ? subPickerItems
88
+ : [];
89
+ // Keep index in bounds
90
+ const maxIdx = Math.max(0, pickerItems.length - 1);
91
+ const safeIdx = Math.min(selectedIdx, maxIdx);
92
+ // Ghost text
93
+ const ghostText = pickerMode === 'commands' && matchingCmds.length > 0
94
+ ? (matchingCmds[safeIdx]?.name ?? '').slice(inputValue.length)
95
+ : '';
96
+ // Open sub-picker for a command
97
+ const openSubPicker = useCallback((cmd) => {
98
+ if (cmd.name === '/model') {
99
+ setSubPickerTitle(`Select Model (${availableModels.length} available)`);
100
+ setSubPickerItems(availableModels);
101
+ setSubPickerCommand('/model');
102
+ }
103
+ else if (cmd.name === '/provider') {
104
+ setSubPickerTitle(`Select Provider (${availableProviders.length} available)`);
105
+ setSubPickerItems(availableProviders);
106
+ setSubPickerCommand('/provider');
107
+ }
108
+ setPickerMode('sub');
109
+ setSelectedIdx(0);
110
+ setInputValue('');
111
+ }, [availableModels, availableProviders]);
112
+ // โ”€โ”€ Ctrl+C handler โ€” always active to intercept before Ink's default exit โ”€โ”€โ”€โ”€
113
+ useInput((input, key) => {
114
+ if (!key.ctrl || input !== 'c')
115
+ return;
116
+ if (isStreaming) {
117
+ // Cancel the in-flight stream; do not exit
118
+ onCancel?.();
119
+ return;
120
+ }
121
+ if (inputValue.length > 0 || isMultiline) {
122
+ // Clear pending input
123
+ setInputValue('');
124
+ setIsMultiline(false);
125
+ setMultilineLines([]);
126
+ setHistoryIndex(-1);
127
+ return;
128
+ }
129
+ // Nothing to cancel โ€” exit normally
130
+ exit();
131
+ });
132
+ // โ”€โ”€ Alt+Enter / history navigation โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
133
+ useInput((input, key) => {
134
+ // Alt+Enter: toggle multiline mode
135
+ if (key.meta && key.return) {
136
+ if (!isMultiline) {
137
+ setIsMultiline(true);
138
+ }
139
+ else {
140
+ // Cancel multiline; discard accumulated lines
141
+ setIsMultiline(false);
142
+ setMultilineLines([]);
143
+ }
144
+ return;
145
+ }
146
+ // Up arrow: navigate backward through history (picker closed, not in multiline)
147
+ if (key.upArrow && pickerMode === 'none' && !isMultiline) {
148
+ if (inputHistory.length === 0)
149
+ return;
150
+ if (historyIndex === -1) {
151
+ setHistoryDraft(inputValue);
152
+ }
153
+ const newIdx = historyIndex === -1
154
+ ? inputHistory.length - 1
155
+ : Math.max(0, historyIndex - 1);
156
+ setHistoryIndex(newIdx);
157
+ setInputValue(inputHistory[newIdx] ?? '');
158
+ return;
159
+ }
160
+ // Down arrow: navigate forward through history (picker closed, not in multiline)
161
+ if (key.downArrow && pickerMode === 'none' && !isMultiline) {
162
+ if (historyIndex === -1)
163
+ return;
164
+ const newIdx = historyIndex + 1;
165
+ if (newIdx >= inputHistory.length) {
166
+ setHistoryIndex(-1);
167
+ setInputValue(historyDraft);
168
+ }
169
+ else {
170
+ setHistoryIndex(newIdx);
171
+ setInputValue(inputHistory[newIdx] ?? '');
172
+ }
173
+ return;
174
+ }
175
+ // Ctrl+Enter in multiline mode: submit all accumulated lines + current line
176
+ if (isMultiline && key.ctrl && key.return) {
177
+ const allLines = [...multilineLines, inputValue].filter(l => l.length > 0);
178
+ if (allLines.length === 0)
179
+ return;
180
+ const combined = allLines.join('\n');
181
+ setIsMultiline(false);
182
+ setMultilineLines([]);
183
+ setInputValue('');
184
+ setHistoryIndex(-1);
185
+ setHistoryDraft('');
186
+ setInputHistory(prev => {
187
+ const next = [...prev, combined];
188
+ return next.length > MAX_HISTORY ? next.slice(next.length - MAX_HISTORY) : next;
189
+ });
190
+ onSubmit(combined);
191
+ return;
192
+ }
193
+ void input;
194
+ }, { isActive: !isStreaming && pendingPermission === undefined });
195
+ // โ”€โ”€ Picker keyboard navigation โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
196
+ useInput((_input, key) => {
197
+ if (pickerMode === 'none' || pickerItems.length === 0)
198
+ return;
199
+ if (key.upArrow) {
200
+ setSelectedIdx(prev => {
201
+ let next = prev <= 0 ? pickerItems.length - 1 : prev - 1;
202
+ // Skip disabled items
203
+ let attempts = 0;
204
+ while (pickerItems[next] && pickerItems[next]?.disabled && attempts < pickerItems.length) {
205
+ next = next <= 0 ? pickerItems.length - 1 : next - 1;
206
+ attempts++;
207
+ }
208
+ return next;
209
+ });
210
+ }
211
+ else if (key.downArrow) {
212
+ setSelectedIdx(prev => {
213
+ let next = prev >= pickerItems.length - 1 ? 0 : prev + 1;
214
+ let attempts = 0;
215
+ while (pickerItems[next] && pickerItems[next]?.disabled && attempts < pickerItems.length) {
216
+ next = next >= pickerItems.length - 1 ? 0 : next + 1;
217
+ attempts++;
218
+ }
219
+ return next;
220
+ });
221
+ }
222
+ else if (key.escape) {
223
+ setPickerMode('none');
224
+ setInputValue('');
225
+ setSelectedIdx(0);
226
+ }
227
+ }, { isActive: pickerMode !== 'none' && !isStreaming });
228
+ const handleSubmit = useCallback((value) => {
229
+ // In multiline mode, Enter appends the current line and moves to the next
230
+ if (isMultiline) {
231
+ setMultilineLines(prev => [...prev, value]);
232
+ setInputValue('');
233
+ return;
234
+ }
235
+ const trimmed = value.trim();
236
+ // Sub-picker: Enter selects the highlighted option (skip disabled)
237
+ if (pickerMode === 'sub' && subPickerItems.length > 0) {
238
+ const item = subPickerItems[safeIdx];
239
+ if (item && !(item.disabled)) {
240
+ setPickerMode('none');
241
+ setInputValue('');
242
+ setSelectedIdx(0);
243
+ onSubmit(`${subPickerCommand} ${item.value}`);
244
+ }
245
+ return;
246
+ }
247
+ // Command picker: Enter selects highlighted command
248
+ if (pickerMode === 'commands' && matchingCmds.length > 0) {
249
+ const cmd = matchingCmds[safeIdx];
250
+ if (cmd) {
251
+ if (cmd.hasSubPicker) {
252
+ openSubPicker(cmd);
253
+ }
254
+ else if (cmd.immediate) {
255
+ setPickerMode('none');
256
+ setInputValue('');
257
+ setSelectedIdx(0);
258
+ if (cmd.name === '/exit') {
259
+ exit();
260
+ return;
261
+ }
262
+ onSubmit(cmd.name);
263
+ }
264
+ }
265
+ return;
266
+ }
267
+ if (trimmed.length === 0)
268
+ return;
269
+ if (trimmed === '/exit' || trimmed === '/quit') {
270
+ exit();
271
+ return;
272
+ }
273
+ setInputValue('');
274
+ setSelectedIdx(0);
275
+ setPickerMode('none');
276
+ setHistoryIndex(-1);
277
+ setHistoryDraft('');
278
+ setInputHistory(prev => {
279
+ const next = [...prev, trimmed];
280
+ return next.length > MAX_HISTORY ? next.slice(next.length - MAX_HISTORY) : next;
281
+ });
282
+ onSubmit(trimmed);
283
+ }, [
284
+ onSubmit,
285
+ exit,
286
+ pickerMode,
287
+ safeIdx,
288
+ matchingCmds,
289
+ subPickerItems,
290
+ subPickerCommand,
291
+ openSubPicker,
292
+ isMultiline,
293
+ ]);
294
+ const handlePermission = useCallback((decision) => {
295
+ if (pendingPermission) {
296
+ pendingPermission.resolve(decision);
297
+ }
298
+ onPermissionDecision?.(decision);
299
+ }, [pendingPermission, onPermissionDecision]);
300
+ // โ”€โ”€ Prompt prefix โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
301
+ const promptPrefix = isMultiline ? '... ' : '> ';
302
+ return (_jsxs(App, { children: [_jsxs(Box, { flexDirection: "row", justifyContent: "space-between", alignItems: "center", children: [_jsx(SessionHeader, { model: sessionInfo.model, provider: sessionInfo.provider, sessionId: sessionInfo.sessionId, mode: sessionInfo.mode }), connectionStatus !== 'connected' && (_jsx(Box, { paddingX: 1, children: _jsx(ConnectionStatus, { status: connectionStatus, latencyMs: connectionLatencyMs, provider: sessionInfo.provider }) }))] }), connectionStatus === 'disconnected' && (_jsxs(Box, { borderStyle: "round", borderColor: "red", paddingX: 2, paddingY: 0, marginX: 1, children: [_jsx(Text, { color: "red", bold: true, children: "Server unreachable \u2014 waiting for connection..." }), _jsx(Text, { dimColor: true, children: " Messages will be sent once the server is back online." })] })), connectionStatus === 'reconnecting' && (_jsx(Box, { paddingX: 1, children: _jsx(Text, { color: "yellow", children: "Reconnecting to server..." }) })), _jsxs(Box, { flexDirection: "column", flexGrow: 1, paddingY: 1, children: [messages.map((msg, idx) => (_jsx(StreamingMessage, { role: msg.role === 'system' ? 'assistant' : msg.role, content: msg.content, model: msg.model }, `msg-${msg.timestamp?.getTime?.() ?? idx}-${idx}`))), streamingContent !== undefined && streamingContent.length > 0 && (_jsx(StreamingMessage, { role: "assistant", content: streamingContent, isStreaming: true, model: sessionInfo.model }))] }), (isStreaming || agentStatus === 'complete') && (_jsx(AgentStatus, { status: agentStatus, currentAction: agentAction, stepCount: stepCount, tokensUsed: tokensUsed, elapsedMs: elapsedMs })), pendingPermission !== undefined && (_jsx(PermissionPrompt, { toolName: pendingPermission.toolName, args: pendingPermission.args, permissionLevel: pendingPermission.permissionLevel, reason: pendingPermission.reason, onDecision: handlePermission })), pickerMode !== 'none' && pickerItems.length > 0 && (() => {
303
+ const MAX_VISIBLE = 6;
304
+ const total = pickerItems.length;
305
+ const start = Math.max(0, Math.min(safeIdx - Math.floor(MAX_VISIBLE / 2), total - MAX_VISIBLE));
306
+ const visible = pickerItems.slice(start, start + MAX_VISIBLE);
307
+ const showScrollUp = start > 0;
308
+ const showScrollDown = start + MAX_VISIBLE < total;
309
+ const title = pickerMode === 'sub' ? subPickerTitle : 'Commands';
310
+ return (_jsx(Box, { flexDirection: "column", paddingX: 2, children: _jsxs(Box, { borderStyle: "round", borderColor: "cyan", flexDirection: "column", paddingX: 1, children: [_jsxs(Text, { bold: true, color: "cyan", children: [' ', title] }), _jsx(Text, { dimColor: true, children: ' โ”€'.repeat(20) }), showScrollUp && _jsxs(Text, { dimColor: true, children: [" \u2191 more (", start, " above)"] }), visible.map((item) => {
311
+ const realIdx = pickerItems.indexOf(item);
312
+ const isSelected = realIdx === safeIdx;
313
+ const isDisabled = item.disabled;
314
+ return (_jsxs(Box, { gap: 1, children: [_jsxs(Text, { color: isDisabled ? 'gray' : isSelected ? 'cyan' : undefined, bold: isSelected && !isDisabled, inverse: isSelected && !isDisabled, dimColor: isDisabled, strikethrough: isDisabled, children: [' ', item.label.padEnd(20)] }), item.description && _jsx(Text, { dimColor: true, children: item.description }), item.active && !isDisabled && _jsx(Text, { color: "green", children: " \u25CF" }), isDisabled && _jsx(Text, { color: "gray", children: " \u2298" })] }, item.value + (isDisabled ? '-disabled' : '')));
315
+ }), showScrollDown && _jsxs(Text, { dimColor: true, children: [" \u2193 more (", total - start - MAX_VISIBLE, " below)"] }), _jsx(Text, { dimColor: true, children: " \u2191\u2193 navigate \u00B7 Enter select \u00B7 Esc back" })] }) }));
316
+ })(), suggestions.length > 0 && !isStreaming && pickerMode === 'none' && (_jsx(SuggestionBar, { suggestions: suggestions, isActive: pendingPermission === undefined && !isStreaming && pickerMode === 'none', onSelect: (text) => {
317
+ onSubmit(text);
318
+ } })), isMultiline && multilineLines.length > 0 && (_jsx(Box, { flexDirection: "column", paddingX: 1, children: multilineLines.map((line, idx) => (_jsxs(Box, { flexDirection: "row", gap: 0, children: [_jsx(Text, { color: "yellow", bold: true, children: '... ' }), _jsx(Text, { children: line })] }, idx))) })), _jsxs(Box, { flexDirection: "row", gap: 0, paddingX: 1, children: [_jsx(Text, { color: isMultiline ? 'yellow' : 'cyan', bold: true, children: promptPrefix }), connectionStatus === 'disconnected' ? (_jsx(Text, { dimColor: true, color: "red", children: "Offline \u2014 waiting for server..." })) : pendingPermission === undefined && !isStreaming ? (_jsxs(Box, { flexDirection: "row", children: [_jsx(TextInput, { value: inputValue, onChange: (val) => { setInputValue(val); if (!isMultiline)
319
+ setSelectedIdx(0); }, onSubmit: handleSubmit, placeholder: isMultiline
320
+ ? 'Add line... (Ctrl+Enter to send ยท Alt+Enter to cancel)'
321
+ : 'Message profClaw... (/ for commands)' }), ghostText.length > 0 && _jsx(Text, { dimColor: true, children: ghostText })] })) : (_jsx(Text, { dimColor: true, children: pendingPermission !== undefined
322
+ ? 'Waiting for permission...'
323
+ : 'Agent is working... (Ctrl+C to cancel)' }))] }), isMultiline && (_jsx(Box, { paddingX: 1, children: _jsx(Text, { dimColor: true, children: " multiline \u2014 Enter adds line \u00B7 Ctrl+Enter sends \u00B7 Alt+Enter cancels" }) })), _jsx(CostBar, { tokensUsed: tokensUsed, tokensMax: tokensMax, estimatedCost: estimatedCost })] }));
324
+ };
325
+ //# sourceMappingURL=ChatApp.js.map
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ export declare function DashboardApp(): React.ReactElement;
3
+ //# sourceMappingURL=DashboardApp.d.ts.map