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
@@ -0,0 +1,143 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { useState, useEffect, useCallback } from 'react';
3
+ import { Box, Text, useInput, useApp } from 'ink';
4
+ import { ProviderList } from './components/ProviderList.js';
5
+ import { TaskList } from './components/TaskList.js';
6
+ import { SystemHealth } from './components/SystemHealth.js';
7
+ import { HookStatus } from './components/HookStatus.js';
8
+ import { ChannelList } from './components/ChannelList.js';
9
+ import { api } from '../utils/api.js';
10
+ const TABS = [
11
+ { id: 'overview', label: 'Overview' },
12
+ { id: 'tasks', label: 'Tasks' },
13
+ { id: 'channels', label: 'Channels' },
14
+ { id: 'hooks', label: 'Hooks' },
15
+ ];
16
+ // ---- Helpers ----
17
+ function toTaskStatus(raw) {
18
+ const allowed = ['pending', 'running', 'completed', 'failed', 'cancelled'];
19
+ return allowed.includes(raw)
20
+ ? raw
21
+ : 'pending';
22
+ }
23
+ function toChannelStatus(raw) {
24
+ const allowed = ['connected', 'disconnected', 'error', 'connecting'];
25
+ return allowed.includes(raw)
26
+ ? raw
27
+ : 'disconnected';
28
+ }
29
+ // ---- Tab bar ----
30
+ function TabBar({ current, onSelect }) {
31
+ void onSelect; // navigation handled via keyboard, kept for future mouse use
32
+ return (_jsxs(Box, { gap: 1, marginBottom: 1, children: [TABS.map((tab, i) => (_jsx(Box, { gap: 0, children: _jsxs(Text, { color: current === tab.id ? 'cyan' : 'white', bold: current === tab.id, dimColor: current !== tab.id, children: [i > 0 ? '│ ' : '', tab.label] }) }, tab.id))), _jsx(Text, { dimColor: true, children: " \u2190 \u2192 to switch q to quit" })] }));
33
+ }
34
+ // ---- Main app ----
35
+ export function DashboardApp() {
36
+ const { exit } = useApp();
37
+ const [tabIndex, setTabIndex] = useState(0);
38
+ const [lastRefresh, setLastRefresh] = useState(new Date());
39
+ const [data, setData] = useState({
40
+ system: {},
41
+ providers: [],
42
+ tasks: [],
43
+ hooks: [],
44
+ channels: [],
45
+ });
46
+ const [loadState, setLoadState] = useState({ loading: true });
47
+ const fetchData = useCallback(async () => {
48
+ setLoadState((prev) => ({ ...prev, loading: true }));
49
+ const [sysRes, provRes, taskRes, hookRes, chanRes] = await Promise.allSettled([
50
+ api.get('/health'),
51
+ api.get('/api/chat/providers'),
52
+ api.get('/api/tasks?limit=20&sort=createdAt'),
53
+ api.get('/api/hooks'),
54
+ api.get('/api/channels'),
55
+ ]);
56
+ const next = {
57
+ system: {},
58
+ providers: [],
59
+ tasks: [],
60
+ hooks: [],
61
+ channels: [],
62
+ };
63
+ const errors = { loading: false };
64
+ if (sysRes.status === 'fulfilled' && sysRes.value.ok && sysRes.value.data) {
65
+ const raw = sysRes.value.data;
66
+ next.system = {
67
+ ...raw,
68
+ healthy: raw.status === 'ok' || raw.healthy === true,
69
+ queueBackend: (raw.queue ?? raw.queueBackend),
70
+ };
71
+ }
72
+ else {
73
+ errors.systemError =
74
+ sysRes.status === 'fulfilled'
75
+ ? (sysRes.value.error ?? 'Failed to load system status')
76
+ : 'Failed to load system status';
77
+ }
78
+ if (provRes.status === 'fulfilled' && provRes.value.ok && provRes.value.data) {
79
+ next.providers = provRes.value.data.providers;
80
+ }
81
+ else {
82
+ errors.providersError = 'Failed to load providers';
83
+ }
84
+ if (taskRes.status === 'fulfilled' && taskRes.value.ok && taskRes.value.data) {
85
+ next.tasks = taskRes.value.data.tasks.map((t) => ({
86
+ ...t,
87
+ status: toTaskStatus(t.status),
88
+ }));
89
+ }
90
+ else {
91
+ errors.tasksError = 'Failed to load tasks';
92
+ }
93
+ if (hookRes.status === 'fulfilled' && hookRes.value.ok && hookRes.value.data) {
94
+ next.hooks = hookRes.value.data.hooks;
95
+ }
96
+ else {
97
+ // /api/hooks may not exist yet — show empty list instead of error
98
+ next.hooks = [];
99
+ }
100
+ if (chanRes.status === 'fulfilled' && chanRes.value.ok && chanRes.value.data) {
101
+ // API returns { provider, registered, enabled, configured } — map to our Channel shape
102
+ const raw = chanRes.value.data.channels;
103
+ next.channels = raw.map((c) => ({
104
+ name: (c.name ?? c.provider ?? 'unknown'),
105
+ type: (c.type ?? c.provider ?? ''),
106
+ status: toChannelStatus(c.status ??
107
+ (c.registered ? 'connected' : c.configured ? 'disconnected' : 'disconnected')),
108
+ messageCount: (c.messageCount ?? 0),
109
+ lastActivity: (c.lastActivity ?? c.lastActivityAt ?? ''),
110
+ }));
111
+ }
112
+ else {
113
+ errors.channelsError = 'Failed to load channels';
114
+ }
115
+ setData(next);
116
+ setLoadState(errors);
117
+ setLastRefresh(new Date());
118
+ }, []);
119
+ // Initial load + auto-refresh every 5 seconds
120
+ useEffect(() => {
121
+ void fetchData();
122
+ const timer = setInterval(() => { void fetchData(); }, 5000);
123
+ return () => clearInterval(timer);
124
+ }, [fetchData]);
125
+ useInput((input, key) => {
126
+ if (input === 'q' || (key.ctrl && input === 'c')) {
127
+ exit();
128
+ return;
129
+ }
130
+ if (key.rightArrow) {
131
+ setTabIndex((i) => (i + 1) % TABS.length);
132
+ }
133
+ if (key.leftArrow) {
134
+ setTabIndex((i) => (i - 1 + TABS.length) % TABS.length);
135
+ }
136
+ if (input === 'r') {
137
+ void fetchData();
138
+ }
139
+ });
140
+ const currentTab = TABS[tabIndex].id;
141
+ return (_jsxs(Box, { flexDirection: "column", padding: 1, children: [_jsxs(Box, { marginBottom: 1, gap: 2, children: [_jsx(Text, { bold: true, color: "cyan", children: "profClaw Dashboard" }), _jsxs(Text, { dimColor: true, children: [lastRefresh.toLocaleTimeString(), " \u00B7 r to refresh"] })] }), _jsx(TabBar, { current: currentTab, onSelect: (id) => setTabIndex(TABS.findIndex((t) => t.id === id)) }), _jsx(Text, { dimColor: true, children: '─'.repeat(60) }), _jsxs(Box, { flexDirection: "column", marginTop: 1, children: [currentTab === 'overview' && (_jsxs(Box, { flexDirection: "column", gap: 2, children: [_jsx(SystemHealth, { metrics: data.system, loading: loadState.loading, error: loadState.systemError }), _jsx(ProviderList, { providers: data.providers, loading: loadState.loading, error: loadState.providersError })] })), currentTab === 'tasks' && (_jsx(TaskList, { tasks: data.tasks, loading: loadState.loading, error: loadState.tasksError })), currentTab === 'channels' && (_jsx(ChannelList, { channels: data.channels, loading: loadState.loading, error: loadState.channelsError })), currentTab === 'hooks' && (_jsx(HookStatus, { hooks: data.hooks, loading: loadState.loading, error: loadState.hooksError }))] })] }));
142
+ }
143
+ //# sourceMappingURL=DashboardApp.js.map
@@ -0,0 +1,17 @@
1
+ /**
2
+ * AgentStatus Component
3
+ *
4
+ * Real-time agent status display showing current action, step count,
5
+ * tokens used, and elapsed time. Uses a spinner when agent is active.
6
+ */
7
+ import React from 'react';
8
+ export type AgentStatusState = 'idle' | 'thinking' | 'executing' | 'complete' | 'error';
9
+ export interface AgentStatusProps {
10
+ status: AgentStatusState;
11
+ currentAction?: string;
12
+ stepCount: number;
13
+ tokensUsed: number;
14
+ elapsedMs: number;
15
+ }
16
+ export declare const AgentStatus: React.FC<AgentStatusProps>;
17
+ //# sourceMappingURL=AgentStatus.d.ts.map
@@ -0,0 +1,33 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ import Spinner from 'ink-spinner';
4
+ function formatElapsed(ms) {
5
+ if (ms < 1000)
6
+ return `${ms}ms`;
7
+ if (ms < 60000)
8
+ return `${(ms / 1000).toFixed(1)}s`;
9
+ const mins = Math.floor(ms / 60000);
10
+ const secs = Math.floor((ms % 60000) / 1000);
11
+ return `${mins}m ${secs}s`;
12
+ }
13
+ function formatTokens(count) {
14
+ if (count >= 1000000)
15
+ return `${(count / 1000000).toFixed(1)}M`;
16
+ if (count >= 1000)
17
+ return `${(count / 1000).toFixed(1)}K`;
18
+ return count.toString();
19
+ }
20
+ const STATUS_COLORS = {
21
+ idle: 'gray',
22
+ thinking: 'yellow',
23
+ executing: 'cyan',
24
+ complete: 'green',
25
+ error: 'red',
26
+ };
27
+ const isActive = (status) => status === 'thinking' || status === 'executing';
28
+ export const AgentStatus = ({ status, currentAction, stepCount, tokensUsed, elapsedMs, }) => {
29
+ const statusColor = STATUS_COLORS[status];
30
+ const active = isActive(status);
31
+ return (_jsxs(Box, { flexDirection: "row", gap: 1, paddingX: 1, children: [active ? (_jsx(Text, { color: statusColor, children: _jsx(Spinner, { type: "dots" }) })) : (_jsx(Text, { color: statusColor, children: status === 'complete' ? '✓' : status === 'error' ? '✗' : '·' })), _jsx(Text, { color: statusColor, bold: active, children: status }), currentAction !== undefined && currentAction.length > 0 && (_jsxs(_Fragment, { children: [_jsx(Text, { dimColor: true, children: "\u203A" }), _jsx(Text, { color: "white", children: currentAction })] })), _jsxs(Text, { dimColor: true, children: [' ', "step ", stepCount, " \u00B7 ", formatTokens(tokensUsed), " tok \u00B7 ", formatElapsed(elapsedMs)] })] }));
32
+ };
33
+ //# sourceMappingURL=AgentStatus.js.map
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ export type ChannelStatus = 'connected' | 'disconnected' | 'error' | 'connecting';
3
+ export interface Channel {
4
+ name: string;
5
+ type: string;
6
+ status: ChannelStatus;
7
+ messageCount?: number;
8
+ lastActivity?: string;
9
+ }
10
+ interface ChannelListProps {
11
+ channels: Channel[];
12
+ loading?: boolean;
13
+ error?: string;
14
+ }
15
+ export declare function ChannelList({ channels, loading, error }: ChannelListProps): React.ReactElement;
16
+ export {};
17
+ //# sourceMappingURL=ChannelList.d.ts.map
@@ -0,0 +1,33 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ function statusColor(status) {
4
+ const map = {
5
+ connected: 'green',
6
+ connecting: 'yellow',
7
+ disconnected: 'gray',
8
+ error: 'red',
9
+ };
10
+ return map[status];
11
+ }
12
+ function statusDot(status) {
13
+ return status === 'connected' ? '●' : status === 'connecting' ? '◐' : '○';
14
+ }
15
+ function formatRelative(iso) {
16
+ if (!iso)
17
+ return '-';
18
+ const diff = Date.now() - new Date(iso).getTime();
19
+ const s = Math.floor(diff / 1000);
20
+ if (s < 60)
21
+ return `${s}s ago`;
22
+ const m = Math.floor(s / 60);
23
+ if (m < 60)
24
+ return `${m}m ago`;
25
+ const h = Math.floor(m / 60);
26
+ if (h < 24)
27
+ return `${h}h ago`;
28
+ return `${Math.floor(h / 24)}d ago`;
29
+ }
30
+ export function ChannelList({ channels, loading, error }) {
31
+ return (_jsxs(Box, { flexDirection: "column", gap: 0, children: [_jsx(Text, { bold: true, color: "white", children: "Chat Channels" }), _jsxs(Box, { flexDirection: "column", marginTop: 1, children: [loading && _jsx(Text, { dimColor: true, children: " Loading channels..." }), error && _jsxs(Text, { color: "red", children: [" ", error] }), !loading && !error && channels.length === 0 && (_jsx(Text, { dimColor: true, children: " No channels configured" })), !loading && !error && channels.length > 0 && (_jsxs(_Fragment, { children: [_jsxs(Box, { gap: 2, marginBottom: 1, children: [_jsx(Text, { dimColor: true, bold: true, children: ' Channel'.padEnd(18) }), _jsx(Text, { dimColor: true, bold: true, children: 'Type'.padEnd(12) }), _jsx(Text, { dimColor: true, bold: true, children: 'Status'.padEnd(16) }), _jsx(Text, { dimColor: true, bold: true, children: 'Messages'.padEnd(10) }), _jsx(Text, { dimColor: true, bold: true, children: "Last active" })] }), channels.filter((c) => c.name).map((c) => (_jsxs(Box, { gap: 2, children: [_jsx(Text, { children: ' ' + (c.name ?? '').slice(0, 16).padEnd(16) }), _jsx(Text, { dimColor: true, children: (c.type ?? '').slice(0, 10).padEnd(10) }), _jsxs(Box, { width: 16, gap: 1, children: [_jsx(Text, { color: statusColor(c.status), children: statusDot(c.status) }), _jsx(Text, { color: statusColor(c.status), children: c.status })] }), _jsx(Text, { dimColor: true, children: String(c.messageCount ?? 0).padEnd(8) }), _jsx(Text, { dimColor: true, children: formatRelative(c.lastActivity) })] }, c.name)))] }))] })] }));
32
+ }
33
+ //# sourceMappingURL=ChannelList.js.map
@@ -0,0 +1,19 @@
1
+ /**
2
+ * ConnectionStatus Component
3
+ *
4
+ * Small indicator shown in the session header area displaying the live
5
+ * server connection state, optional latency, and active provider.
6
+ *
7
+ * Visual states:
8
+ * ● Connected (green)
9
+ * ○ Reconnecting... (yellow, animated dot cycle)
10
+ * ✗ Disconnected (red)
11
+ */
12
+ import React from 'react';
13
+ export interface ConnectionStatusProps {
14
+ status: 'connected' | 'reconnecting' | 'disconnected';
15
+ latencyMs?: number;
16
+ provider?: string;
17
+ }
18
+ export declare const ConnectionStatus: React.FC<ConnectionStatusProps>;
19
+ //# sourceMappingURL=ConnectionStatus.d.ts.map
@@ -0,0 +1,50 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * ConnectionStatus Component
4
+ *
5
+ * Small indicator shown in the session header area displaying the live
6
+ * server connection state, optional latency, and active provider.
7
+ *
8
+ * Visual states:
9
+ * ● Connected (green)
10
+ * ○ Reconnecting... (yellow, animated dot cycle)
11
+ * ✗ Disconnected (red)
12
+ */
13
+ import { useState, useEffect } from 'react';
14
+ import { Box, Text } from 'ink';
15
+ // Spinner frames used while reconnecting
16
+ const SPINNER_FRAMES = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
17
+ export const ConnectionStatus = ({ status, latencyMs, provider, }) => {
18
+ const [spinnerIdx, setSpinnerIdx] = useState(0);
19
+ // Animate the spinner only while reconnecting
20
+ useEffect(() => {
21
+ if (status !== 'reconnecting')
22
+ return;
23
+ const id = setInterval(() => {
24
+ setSpinnerIdx(prev => (prev + 1) % SPINNER_FRAMES.length);
25
+ }, 80);
26
+ return () => clearInterval(id);
27
+ }, [status]);
28
+ let indicator;
29
+ let color;
30
+ let label;
31
+ switch (status) {
32
+ case 'connected':
33
+ indicator = '●';
34
+ color = 'green';
35
+ label = 'Connected';
36
+ break;
37
+ case 'reconnecting':
38
+ indicator = SPINNER_FRAMES[spinnerIdx] ?? '○';
39
+ color = 'yellow';
40
+ label = 'Reconnecting...';
41
+ break;
42
+ case 'disconnected':
43
+ indicator = '✗';
44
+ color = 'red';
45
+ label = 'Disconnected';
46
+ break;
47
+ }
48
+ return (_jsxs(Box, { flexDirection: "row", gap: 1, children: [_jsx(Text, { color: color, children: indicator }), _jsx(Text, { color: color, children: label }), provider !== undefined && provider.length > 0 && (_jsxs(Text, { dimColor: true, children: ["via ", provider] })), latencyMs !== undefined && status === 'connected' && (_jsxs(Text, { dimColor: true, children: [latencyMs, "ms"] }))] }));
49
+ };
50
+ //# sourceMappingURL=ConnectionStatus.js.map
@@ -0,0 +1,19 @@
1
+ /**
2
+ * CostBar Component
3
+ *
4
+ * Horizontal progress bar showing budget usage.
5
+ * - Green when < 50%
6
+ * - Yellow when 50-80%
7
+ * - Red when > 80%
8
+ *
9
+ * Shows: tokens used / max, estimated cost, and percentage.
10
+ */
11
+ import React from 'react';
12
+ export interface CostBarProps {
13
+ tokensUsed: number;
14
+ tokensMax: number;
15
+ estimatedCost?: number;
16
+ width?: number;
17
+ }
18
+ export declare const CostBar: React.FC<CostBarProps>;
19
+ //# sourceMappingURL=CostBar.d.ts.map
@@ -0,0 +1,35 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text, useStdout } from 'ink';
3
+ function formatTokens(count) {
4
+ if (count >= 1000000)
5
+ return `${(count / 1000000).toFixed(1)}M`;
6
+ if (count >= 1000)
7
+ return `${(count / 1000).toFixed(1)}K`;
8
+ return count.toString();
9
+ }
10
+ function getBarColor(ratio) {
11
+ if (ratio > 0.8)
12
+ return 'red';
13
+ if (ratio > 0.5)
14
+ return 'yellow';
15
+ return 'green';
16
+ }
17
+ function buildBar(filled, total, fillChar = '█', emptyChar = '░') {
18
+ return fillChar.repeat(filled) + emptyChar.repeat(total - filled);
19
+ }
20
+ export const CostBar = ({ tokensUsed, tokensMax, estimatedCost, width, }) => {
21
+ const { stdout } = useStdout();
22
+ const termWidth = width ?? stdout?.columns ?? 80;
23
+ // Reserve space for labels on each side
24
+ const barWidth = Math.max(10, termWidth - 40);
25
+ const ratio = tokensMax > 0 ? Math.min(tokensUsed / tokensMax, 1) : 0;
26
+ const filledCount = Math.round(ratio * barWidth);
27
+ const barColor = getBarColor(ratio);
28
+ const pct = Math.round(ratio * 100);
29
+ const bar = buildBar(filledCount, barWidth);
30
+ const costStr = estimatedCost !== undefined && estimatedCost > 0
31
+ ? ` $${estimatedCost.toFixed(4)}`
32
+ : '';
33
+ return (_jsxs(Box, { flexDirection: "row", gap: 1, paddingX: 1, children: [_jsx(Text, { dimColor: true, children: "tokens" }), _jsx(Text, { color: barColor, children: bar }), _jsxs(Text, { dimColor: true, children: [formatTokens(tokensUsed), "/", formatTokens(tokensMax), " (", pct, "%)", costStr] })] }));
34
+ };
35
+ //# sourceMappingURL=CostBar.js.map
@@ -0,0 +1,15 @@
1
+ import React from 'react';
2
+ export interface Hook {
3
+ name: string;
4
+ point: string;
5
+ priority?: number;
6
+ active: boolean;
7
+ }
8
+ interface HookStatusProps {
9
+ hooks: Hook[];
10
+ loading?: boolean;
11
+ error?: string;
12
+ }
13
+ export declare function HookStatus({ hooks, loading, error }: HookStatusProps): React.ReactElement;
14
+ export {};
15
+ //# sourceMappingURL=HookStatus.d.ts.map
@@ -0,0 +1,7 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ export function HookStatus({ hooks, loading, error }) {
4
+ const sorted = [...hooks].sort((a, b) => (a.priority ?? 50) - (b.priority ?? 50));
5
+ return (_jsxs(Box, { flexDirection: "column", gap: 0, children: [_jsx(Text, { bold: true, color: "white", children: "Registered Hooks" }), _jsxs(Box, { flexDirection: "column", marginTop: 1, children: [loading && _jsx(Text, { dimColor: true, children: " Loading hooks..." }), error && _jsxs(Text, { color: "red", children: [" ", error] }), !loading && !error && sorted.length === 0 && (_jsx(Text, { dimColor: true, children: " No hooks registered" })), !loading && !error && sorted.length > 0 && (_jsxs(_Fragment, { children: [_jsxs(Box, { gap: 2, marginBottom: 1, children: [_jsx(Text, { dimColor: true, bold: true, children: ' Name'.padEnd(22) }), _jsx(Text, { dimColor: true, bold: true, children: 'Hook point'.padEnd(20) }), _jsx(Text, { dimColor: true, bold: true, children: 'Priority'.padEnd(10) }), _jsx(Text, { dimColor: true, bold: true, children: "State" })] }), sorted.map((h, i) => (_jsxs(Box, { gap: 2, children: [_jsx(Text, { children: ' ' + h.name.slice(0, 20).padEnd(20) }), _jsx(Text, { dimColor: true, children: h.point.slice(0, 18).padEnd(18) }), _jsx(Text, { dimColor: true, children: String(h.priority ?? '-').padEnd(8) }), _jsx(Text, { color: h.active ? 'green' : 'gray', children: h.active ? '● active' : '○ inactive' })] }, `${h.name}-${i}`)))] }))] })] }));
6
+ }
7
+ //# sourceMappingURL=HookStatus.js.map
@@ -0,0 +1,21 @@
1
+ /**
2
+ * PermissionPrompt Component
3
+ *
4
+ * Interactive dialog asking user to approve/deny a tool action.
5
+ * Shows: tool name, args, permission level, reason.
6
+ * Options: [y]es, [n]o, [a]lways allow, [d]eny always.
7
+ *
8
+ * Captures keypress and calls onDecision with the result.
9
+ */
10
+ import React from 'react';
11
+ export type PermissionDecision = 'yes' | 'no' | 'always' | 'deny_always';
12
+ export type PermissionLevel = 'read' | 'write' | 'execute' | 'network' | 'sensitive';
13
+ export interface PermissionPromptProps {
14
+ toolName: string;
15
+ args: Record<string, unknown>;
16
+ permissionLevel: PermissionLevel;
17
+ reason?: string;
18
+ onDecision: (decision: PermissionDecision) => void;
19
+ }
20
+ export declare const PermissionPrompt: React.FC<PermissionPromptProps>;
21
+ //# sourceMappingURL=PermissionPrompt.d.ts.map
@@ -0,0 +1,51 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * PermissionPrompt Component
4
+ *
5
+ * Interactive dialog asking user to approve/deny a tool action.
6
+ * Shows: tool name, args, permission level, reason.
7
+ * Options: [y]es, [n]o, [a]lways allow, [d]eny always.
8
+ *
9
+ * Captures keypress and calls onDecision with the result.
10
+ */
11
+ import { useEffect } from 'react';
12
+ import { Box, Text, useInput } from 'ink';
13
+ const LEVEL_COLORS = {
14
+ read: 'green',
15
+ write: 'yellow',
16
+ execute: 'red',
17
+ network: 'magenta',
18
+ sensitive: 'red',
19
+ };
20
+ function argsDisplay(args) {
21
+ const entries = Object.entries(args).slice(0, 3);
22
+ return entries
23
+ .map(([k, v]) => {
24
+ const val = String(v ?? '');
25
+ return `${k}: ${val.length > 40 ? val.slice(0, 39) + '…' : val}`;
26
+ })
27
+ .join(', ');
28
+ }
29
+ export const PermissionPrompt = ({ toolName, args, permissionLevel, reason, onDecision, }) => {
30
+ const levelColor = LEVEL_COLORS[permissionLevel];
31
+ useInput((input, key) => {
32
+ if (key.escape || input === 'n') {
33
+ onDecision('no');
34
+ }
35
+ else if (input === 'y') {
36
+ onDecision('yes');
37
+ }
38
+ else if (input === 'a') {
39
+ onDecision('always');
40
+ }
41
+ else if (input === 'd') {
42
+ onDecision('deny_always');
43
+ }
44
+ });
45
+ // Memoize useEffect dependency
46
+ useEffect(() => {
47
+ // no-op; key capture is handled by useInput above
48
+ }, []);
49
+ return (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "yellow", paddingX: 2, paddingY: 1, marginY: 1, children: [_jsx(Text, { bold: true, color: "yellow", children: "Permission Required" }), _jsxs(Box, { marginTop: 1, flexDirection: "row", gap: 1, children: [_jsx(Text, { dimColor: true, children: "Tool:" }), _jsx(Text, { bold: true, color: "cyan", children: toolName }), _jsx(Text, { dimColor: true, children: "\u00B7" }), _jsx(Text, { color: levelColor, children: permissionLevel })] }), Object.keys(args).length > 0 && (_jsxs(Box, { marginTop: 0, flexDirection: "row", gap: 1, children: [_jsx(Text, { dimColor: true, children: "Args:" }), _jsx(Text, { color: "gray", children: argsDisplay(args) })] })), reason !== undefined && reason.length > 0 && (_jsxs(Box, { marginTop: 0, flexDirection: "row", gap: 1, children: [_jsx(Text, { dimColor: true, children: "Why:" }), _jsx(Text, { color: "white", children: reason })] })), _jsxs(Box, { marginTop: 1, flexDirection: "row", gap: 2, children: [_jsx(Text, { color: "green", children: "[y] Yes" }), _jsx(Text, { color: "red", children: "[n] No" }), _jsx(Text, { color: "cyan", children: "[a] Always allow" }), _jsx(Text, { color: "magenta", children: "[d] Always deny" })] })] }));
50
+ };
51
+ //# sourceMappingURL=PermissionPrompt.js.map
@@ -0,0 +1,23 @@
1
+ /**
2
+ * PlanView Component
3
+ *
4
+ * Renders a Plan with steps. Each step shows: index, description,
5
+ * and status (checkbox style).
6
+ * - Green checkmark for completed
7
+ * - Yellow circle for in_progress
8
+ * - Gray dash for pending
9
+ */
10
+ import React from 'react';
11
+ export type PlanStepStatus = 'pending' | 'in_progress' | 'completed' | 'failed' | 'skipped';
12
+ export interface PlanStep {
13
+ index: number;
14
+ description: string;
15
+ status: PlanStepStatus;
16
+ detail?: string;
17
+ }
18
+ export interface PlanViewProps {
19
+ title?: string;
20
+ steps: PlanStep[];
21
+ }
22
+ export declare const PlanView: React.FC<PlanViewProps>;
23
+ //# sourceMappingURL=PlanView.d.ts.map
@@ -0,0 +1,26 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ const STEP_ICON = {
4
+ pending: '○',
5
+ in_progress: '◐',
6
+ completed: '✓',
7
+ failed: '✗',
8
+ skipped: '—',
9
+ };
10
+ const STEP_COLOR = {
11
+ pending: 'gray',
12
+ in_progress: 'yellow',
13
+ completed: 'green',
14
+ failed: 'red',
15
+ skipped: 'gray',
16
+ };
17
+ const PlanStepRow = ({ step }) => {
18
+ const icon = STEP_ICON[step.status];
19
+ const color = STEP_COLOR[step.status];
20
+ const isActive = step.status === 'in_progress';
21
+ return (_jsxs(Box, { flexDirection: "column", paddingLeft: 2, children: [_jsxs(Box, { flexDirection: "row", gap: 1, children: [_jsx(Text, { color: color, children: icon }), _jsxs(Text, { color: isActive ? 'white' : 'gray', bold: isActive, children: [step.index + 1, "."] }), _jsx(Text, { color: isActive ? 'white' : 'gray', children: step.description })] }), step.detail !== undefined && step.detail.length > 0 && (_jsx(Box, { paddingLeft: 4, children: _jsx(Text, { dimColor: true, children: step.detail }) }))] }));
22
+ };
23
+ export const PlanView = ({ title, steps }) => {
24
+ return (_jsxs(Box, { flexDirection: "column", paddingX: 1, marginY: 1, children: [title !== undefined && title.length > 0 && (_jsx(Text, { bold: true, color: "cyan", children: title })), steps.map((step) => (_jsx(PlanStepRow, { step: step }, step.index)))] }));
25
+ };
26
+ //# sourceMappingURL=PlanView.js.map
@@ -0,0 +1,16 @@
1
+ import React from 'react';
2
+ export interface Provider {
3
+ type: string;
4
+ healthy: boolean;
5
+ latencyMs?: number;
6
+ modelCount?: number;
7
+ priority?: number;
8
+ }
9
+ interface ProviderListProps {
10
+ providers: Provider[];
11
+ loading?: boolean;
12
+ error?: string;
13
+ }
14
+ export declare function ProviderList({ providers, loading, error }: ProviderListProps): React.ReactElement;
15
+ export {};
16
+ //# sourceMappingURL=ProviderList.d.ts.map
@@ -0,0 +1,16 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ function StatusDot({ healthy }) {
4
+ return (_jsx(Text, { color: healthy ? 'green' : 'red', children: healthy ? '●' : '●' }));
5
+ }
6
+ function LatencyLabel({ ms }) {
7
+ if (ms == null)
8
+ return _jsx(Text, { dimColor: true, children: "-" });
9
+ const color = ms < 500 ? 'green' : ms < 1500 ? 'yellow' : 'red';
10
+ return _jsxs(Text, { color: color, children: [ms, "ms"] });
11
+ }
12
+ export function ProviderList({ providers, loading, error }) {
13
+ const sorted = [...providers].sort((a, b) => (a.priority ?? 99) - (b.priority ?? 99));
14
+ return (_jsxs(Box, { flexDirection: "column", gap: 0, children: [_jsx(Text, { bold: true, color: "white", children: "AI Providers" }), _jsxs(Box, { flexDirection: "column", marginTop: 1, children: [loading && _jsx(Text, { dimColor: true, children: " Loading providers..." }), error && _jsxs(Text, { color: "red", children: [" ", error] }), !loading && !error && sorted.length === 0 && (_jsx(Text, { dimColor: true, children: " No providers configured" })), !loading && !error && sorted.length > 0 && (_jsxs(_Fragment, { children: [_jsxs(Box, { gap: 2, marginBottom: 1, children: [_jsx(Text, { dimColor: true, bold: true, children: ' Provider'.padEnd(16) }), _jsx(Text, { dimColor: true, bold: true, children: 'Status'.padEnd(10) }), _jsx(Text, { dimColor: true, bold: true, children: 'Latency'.padEnd(10) }), _jsx(Text, { dimColor: true, bold: true, children: "Models" })] }), sorted.filter((p) => p.type).map((p) => (_jsxs(Box, { gap: 2, children: [_jsx(Text, { children: ' ' + (p.type ?? '').padEnd(14) }), _jsxs(Box, { width: 10, gap: 1, children: [_jsx(StatusDot, { healthy: p.healthy }), _jsx(Text, { color: p.healthy ? 'green' : 'red', children: p.healthy ? 'online' : 'offline' })] }), _jsx(Box, { width: 10, children: _jsx(LatencyLabel, { ms: p.latencyMs }) }), _jsx(Text, { dimColor: true, children: p.modelCount != null ? String(p.modelCount) : '-' })] }, p.type)))] }))] })] }));
15
+ }
16
+ //# sourceMappingURL=ProviderList.js.map
@@ -0,0 +1,15 @@
1
+ /**
2
+ * SessionHeader Component
3
+ *
4
+ * Compact one-line display showing session info:
5
+ * model name, provider, session ID, and mode (pico/mini/pro).
6
+ */
7
+ import React from 'react';
8
+ export interface SessionHeaderProps {
9
+ model: string;
10
+ provider: string;
11
+ sessionId: string;
12
+ mode: 'pico' | 'mini' | 'pro' | 'chat' | 'agentic';
13
+ }
14
+ export declare const SessionHeader: React.FC<SessionHeaderProps>;
15
+ //# sourceMappingURL=SessionHeader.d.ts.map
@@ -0,0 +1,15 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ const MODE_COLORS = {
4
+ pico: 'cyan',
5
+ mini: 'green',
6
+ pro: 'magenta',
7
+ chat: 'cyan',
8
+ agentic: 'yellow',
9
+ };
10
+ export const SessionHeader = ({ model, provider, sessionId, mode, }) => {
11
+ const modeColor = MODE_COLORS[mode] ?? 'white';
12
+ const shortId = sessionId.slice(0, 8);
13
+ return (_jsxs(Box, { flexDirection: "row", gap: 2, borderStyle: "single", borderColor: "gray", paddingX: 1, children: [_jsx(Text, { color: "cyan", bold: true, children: "profClaw" }), _jsx(Text, { dimColor: true, children: "\u00B7" }), _jsx(Text, { color: "white", children: model }), _jsx(Text, { dimColor: true, children: "via" }), _jsx(Text, { color: "blue", children: provider }), _jsx(Text, { dimColor: true, children: "\u00B7" }), _jsx(Text, { color: modeColor, children: mode }), _jsx(Text, { dimColor: true, children: "\u00B7" }), _jsxs(Text, { dimColor: true, children: ["#", shortId] })] }));
14
+ };
15
+ //# sourceMappingURL=SessionHeader.js.map
@@ -0,0 +1,20 @@
1
+ /**
2
+ * StreamingMessage Component
3
+ *
4
+ * Renders streaming or complete LLM output with full markdown formatting.
5
+ * Delegates to renderMarkdown() in markdown-renderer.tsx for consistent,
6
+ * rich rendering: bold, italic, code blocks with syntax highlighting,
7
+ * headings, blockquotes, lists, links, strikethrough, and horizontal rules.
8
+ *
9
+ * For streaming, pass isStreaming=true and update `content` as tokens arrive.
10
+ * A blinking cursor is shown at the end of the partial line while streaming.
11
+ */
12
+ import React from 'react';
13
+ export interface StreamingMessageProps {
14
+ role: 'user' | 'assistant';
15
+ content: string;
16
+ isStreaming?: boolean;
17
+ model?: string;
18
+ }
19
+ export declare const StreamingMessage: React.FC<StreamingMessageProps>;
20
+ //# sourceMappingURL=StreamingMessage.d.ts.map
@@ -0,0 +1,27 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * StreamingMessage Component
4
+ *
5
+ * Renders streaming or complete LLM output with full markdown formatting.
6
+ * Delegates to renderMarkdown() in markdown-renderer.tsx for consistent,
7
+ * rich rendering: bold, italic, code blocks with syntax highlighting,
8
+ * headings, blockquotes, lists, links, strikethrough, and horizontal rules.
9
+ *
10
+ * For streaming, pass isStreaming=true and update `content` as tokens arrive.
11
+ * A blinking cursor is shown at the end of the partial line while streaming.
12
+ */
13
+ import { useMemo } from 'react';
14
+ import { Box, Text } from 'ink';
15
+ import { renderMarkdown } from '../markdown-renderer.js';
16
+ export const StreamingMessage = ({ role, content, isStreaming = false, model, }) => {
17
+ const isUser = role === 'user';
18
+ // For streaming, append the cursor character to the raw content so
19
+ // renderMarkdown sees it as part of the last text run.
20
+ const displayContent = isStreaming ? content + '▌' : content;
21
+ // Memoize rendered output so renderMarkdown is only called when content changes
22
+ const rendered = useMemo(() => {
23
+ return renderMarkdown(displayContent, { syntaxHighlight: true, linkStyle: 'inline' });
24
+ }, [displayContent]);
25
+ return (_jsxs(Box, { flexDirection: "column", paddingX: 1, marginY: 0, borderLeft: !isUser, borderTop: false, borderBottom: false, borderRight: false, borderLeftColor: !isUser ? 'cyan' : undefined, borderStyle: "single", children: [_jsxs(Box, { flexDirection: "row", gap: 1, marginBottom: 0, children: [_jsx(Text, { bold: true, color: isUser ? 'green' : 'cyan', children: isUser ? 'You' : 'profClaw' }), model !== undefined && !isUser && (_jsxs(Text, { dimColor: true, children: ["(", model, ")"] }))] }), _jsx(Box, { flexDirection: "column", paddingLeft: isUser ? 0 : 1, children: rendered })] }));
26
+ };
27
+ //# sourceMappingURL=StreamingMessage.js.map