profclaw 2.0.0 → 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 (477) hide show
  1. package/.env.example +14 -2
  2. package/CHANGELOG.md +37 -0
  3. package/CONTRIBUTING.md +20 -0
  4. package/Dockerfile +39 -23
  5. package/README.md +174 -40
  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 +14 -2
  71. package/dist/chat/execution/tools/index.js +86 -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/telegram/index.d.ts +2 -0
  104. package/dist/chat/providers/telegram/index.js +21 -2
  105. package/dist/chat/system-prompts.d.ts +3 -3
  106. package/dist/chat/system-prompts.js +116 -61
  107. package/dist/chat/tools.d.ts +6 -6
  108. package/dist/cli/commands/auth.js +64 -1
  109. package/dist/cli/commands/chat.js +1327 -138
  110. package/dist/cli/commands/doctor.js +222 -16
  111. package/dist/cli/commands/history.d.ts +3 -0
  112. package/dist/cli/commands/history.js +138 -0
  113. package/dist/cli/commands/import.d.ts +44 -0
  114. package/dist/cli/commands/import.js +526 -0
  115. package/dist/cli/commands/init.d.ts +13 -0
  116. package/dist/cli/commands/init.js +381 -0
  117. package/dist/cli/commands/onboard.js +210 -30
  118. package/dist/cli/commands/plan.d.ts +13 -0
  119. package/dist/cli/commands/plan.js +184 -0
  120. package/dist/cli/commands/serve.d.ts +7 -0
  121. package/dist/cli/commands/serve.js +77 -18
  122. package/dist/cli/commands/setup.js +84 -3
  123. package/dist/cli/commands/status.js +54 -0
  124. package/dist/cli/commands/tools.js +13 -13
  125. package/dist/cli/commands/tui.js +26 -1
  126. package/dist/cli/index.js +19 -0
  127. package/dist/cli/ink/App.d.ts +13 -0
  128. package/dist/cli/ink/App.js +6 -0
  129. package/dist/cli/ink/ChatApp.d.ts +60 -0
  130. package/dist/cli/ink/ChatApp.js +325 -0
  131. package/dist/cli/ink/DashboardApp.d.ts +3 -0
  132. package/dist/cli/ink/DashboardApp.js +143 -0
  133. package/dist/cli/ink/components/AgentStatus.d.ts +17 -0
  134. package/dist/cli/ink/components/AgentStatus.js +33 -0
  135. package/dist/cli/ink/components/ChannelList.d.ts +17 -0
  136. package/dist/cli/ink/components/ChannelList.js +33 -0
  137. package/dist/cli/ink/components/ConnectionStatus.d.ts +19 -0
  138. package/dist/cli/ink/components/ConnectionStatus.js +50 -0
  139. package/dist/cli/ink/components/CostBar.d.ts +19 -0
  140. package/dist/cli/ink/components/CostBar.js +35 -0
  141. package/dist/cli/ink/components/HookStatus.d.ts +15 -0
  142. package/dist/cli/ink/components/HookStatus.js +7 -0
  143. package/dist/cli/ink/components/PermissionPrompt.d.ts +21 -0
  144. package/dist/cli/ink/components/PermissionPrompt.js +51 -0
  145. package/dist/cli/ink/components/PlanView.d.ts +23 -0
  146. package/dist/cli/ink/components/PlanView.js +26 -0
  147. package/dist/cli/ink/components/ProviderList.d.ts +16 -0
  148. package/dist/cli/ink/components/ProviderList.js +16 -0
  149. package/dist/cli/ink/components/SessionHeader.d.ts +15 -0
  150. package/dist/cli/ink/components/SessionHeader.js +15 -0
  151. package/dist/cli/ink/components/StreamingMessage.d.ts +20 -0
  152. package/dist/cli/ink/components/StreamingMessage.js +27 -0
  153. package/dist/cli/ink/components/SuggestionBar.d.ts +15 -0
  154. package/dist/cli/ink/components/SuggestionBar.js +28 -0
  155. package/dist/cli/ink/components/SystemHealth.d.ts +20 -0
  156. package/dist/cli/ink/components/SystemHealth.js +39 -0
  157. package/dist/cli/ink/components/TaskList.d.ts +17 -0
  158. package/dist/cli/ink/components/TaskList.js +59 -0
  159. package/dist/cli/ink/components/ToolCall.d.ts +17 -0
  160. package/dist/cli/ink/components/ToolCall.js +43 -0
  161. package/dist/cli/ink/index.d.ts +23 -0
  162. package/dist/cli/ink/index.js +15 -0
  163. package/dist/cli/ink/keybindings.d.ts +35 -0
  164. package/dist/cli/ink/keybindings.js +105 -0
  165. package/dist/cli/ink/markdown-renderer.d.ts +47 -0
  166. package/dist/cli/ink/markdown-renderer.js +380 -0
  167. package/dist/cli/ink/output-styles.d.ts +39 -0
  168. package/dist/cli/ink/output-styles.js +119 -0
  169. package/dist/cli/interactive/auto-serve.d.ts +38 -0
  170. package/dist/cli/interactive/auto-serve.js +209 -0
  171. package/dist/cli/interactive/index.d.ts +25 -0
  172. package/dist/cli/interactive/index.js +23 -0
  173. package/dist/cli/interactive/picker.d.ts +28 -0
  174. package/dist/cli/interactive/picker.js +153 -0
  175. package/dist/cli/interactive/renderer.d.ts +26 -0
  176. package/dist/cli/interactive/renderer.js +555 -0
  177. package/dist/cli/interactive/repl.d.ts +14 -0
  178. package/dist/cli/interactive/repl.js +1516 -0
  179. package/dist/cli/interactive/stream-client.d.ts +59 -0
  180. package/dist/cli/interactive/stream-client.js +506 -0
  181. package/dist/cli/interactive/types.d.ts +121 -0
  182. package/dist/cli/interactive/types.js +10 -0
  183. package/dist/cli/utils/api.d.ts +9 -0
  184. package/dist/cli/utils/api.js +58 -2
  185. package/dist/cron/natural-language.d.ts +54 -0
  186. package/dist/cron/natural-language.js +569 -0
  187. package/dist/cron/scheduler.d.ts +34 -4
  188. package/dist/cron/scheduler.js +141 -9
  189. package/dist/cron/templates.d.ts +1 -1
  190. package/dist/cron/templates.js +219 -0
  191. package/dist/feeds/feed-engine.d.ts +149 -0
  192. package/dist/feeds/feed-engine.js +600 -0
  193. package/dist/feeds/index.d.ts +9 -0
  194. package/dist/feeds/index.js +8 -0
  195. package/dist/gateway/router.js +6 -1
  196. package/dist/hooks/built-in/audit-log.d.ts +11 -0
  197. package/dist/hooks/built-in/audit-log.js +84 -0
  198. package/dist/hooks/built-in/cost-warning.d.ts +10 -0
  199. package/dist/hooks/built-in/cost-warning.js +59 -0
  200. package/dist/hooks/built-in/dangerous-tool.d.ts +32 -0
  201. package/dist/hooks/built-in/dangerous-tool.js +80 -0
  202. package/dist/hooks/built-in/index.d.ts +14 -0
  203. package/dist/hooks/built-in/index.js +20 -0
  204. package/dist/hooks/index.d.ts +3 -0
  205. package/dist/hooks/index.js +6 -0
  206. package/dist/hooks/loader.d.ts +17 -0
  207. package/dist/hooks/loader.js +142 -0
  208. package/dist/hooks/registry.d.ts +62 -0
  209. package/dist/hooks/registry.js +127 -0
  210. package/dist/integrations/web-search.js +6 -3
  211. package/dist/memory/index.d.ts +1 -0
  212. package/dist/memory/index.js +2 -0
  213. package/dist/memory/memory-service.js +14 -13
  214. package/dist/memory/observational.d.ts +62 -0
  215. package/dist/memory/observational.js +396 -0
  216. package/dist/middleware/content-filter.d.ts +22 -0
  217. package/dist/middleware/content-filter.js +69 -0
  218. package/dist/middleware/request-validator.d.ts +159 -0
  219. package/dist/middleware/request-validator.js +93 -0
  220. package/dist/plugins/sdk.d.ts +22 -0
  221. package/dist/plugins/sdk.js +17 -1
  222. package/dist/projects/types.d.ts +10 -10
  223. package/dist/providers/ai-sdk.d.ts +11 -0
  224. package/dist/providers/ai-sdk.js +78 -19
  225. package/dist/providers/core/models.js +67 -1
  226. package/dist/providers/core/types.d.ts +3 -0
  227. package/dist/providers/index.d.ts +1 -0
  228. package/dist/providers/index.js +1 -0
  229. package/dist/providers/smart-router.d.ts +118 -0
  230. package/dist/providers/smart-router.js +685 -0
  231. package/dist/providers/types.d.ts +16 -16
  232. package/dist/routes/agents.js +50 -0
  233. package/dist/routes/auth.js +8 -1
  234. package/dist/routes/chat.js +259 -14
  235. package/dist/routes/costs.js +32 -0
  236. package/dist/routes/cron.js +80 -5
  237. package/dist/routes/feeds.d.ts +10 -0
  238. package/dist/routes/feeds.js +168 -0
  239. package/dist/routes/mcp.js +21 -0
  240. package/dist/routes/memory.js +130 -0
  241. package/dist/routes/skills.js +129 -0
  242. package/dist/routes/teams.d.ts +9 -0
  243. package/dist/routes/teams.js +210 -0
  244. package/dist/routes/tools.js +14 -0
  245. package/dist/routes/users.js +2 -0
  246. package/dist/server/route-loader.js +3 -1
  247. package/dist/server/stream-bridge.d.ts +19 -0
  248. package/dist/server/stream-bridge.js +38 -0
  249. package/dist/server.js +310 -36
  250. package/dist/skills/marketplace.d.ts +87 -0
  251. package/dist/skills/marketplace.js +268 -0
  252. package/dist/storage/index.d.ts +14 -0
  253. package/dist/storage/index.js +64 -3
  254. package/dist/storage/schema.d.ts +4 -4
  255. package/dist/storage/schema.js +1 -1
  256. package/dist/teams/index.d.ts +110 -0
  257. package/dist/teams/index.js +365 -0
  258. package/dist/tickets/types.d.ts +39 -39
  259. package/dist/types/summary.d.ts +5 -5
  260. package/dist/utils/auto-update.d.ts +23 -0
  261. package/dist/utils/auto-update.js +157 -0
  262. package/dist/utils/offline-detect.d.ts +55 -0
  263. package/dist/utils/offline-detect.js +121 -0
  264. package/dist/utils/pid-file.d.ts +36 -0
  265. package/dist/utils/pid-file.js +125 -0
  266. package/dist/utils/prevent-sleep.d.ts +27 -0
  267. package/dist/utils/prevent-sleep.js +95 -0
  268. package/dist/utils/sanitizer.d.ts +57 -0
  269. package/dist/utils/sanitizer.js +174 -0
  270. package/docker-compose.yml +13 -137
  271. package/package.json +31 -6
  272. package/skills/deploy-cloudflare/SKILL.md +62 -0
  273. package/skills/deploy-vercel/SKILL.md +67 -0
  274. package/skills/docker-deploy/SKILL.md +158 -0
  275. package/skills/full-stack-builder/SKILL.md +92 -0
  276. package/skills/humanizer/SKILL.md +488 -0
  277. package/skills/profclaw-assistant/SKILL.md +85 -56
  278. package/ui/dist/assets/ActivityView-Da6HQ8ws.js +1 -0
  279. package/ui/dist/assets/AgentList-H58R0kX3.js +1 -0
  280. package/ui/dist/assets/AnalyticsDashboard-B28AeRsc.js +1 -0
  281. package/ui/dist/assets/AreaChart-DwLzeAQ8.js +1 -0
  282. package/ui/dist/assets/CartesianChart-piKQsTAR.js +36 -0
  283. package/ui/dist/assets/ChatView-Dbj8rxU5.js +10 -0
  284. package/ui/dist/assets/CostsDashboard-C6F5df0F.js +1 -0
  285. package/ui/dist/assets/EstimateSelect-wga0rUKX.js +1 -0
  286. package/ui/dist/assets/FeedDashboard-Ef6FEzEf.js +1 -0
  287. package/ui/dist/assets/FloatingChatbot-0yhkUeCq.js +2 -0
  288. package/ui/dist/assets/InviteCodeManagement-tUXfx4Bc.js +2 -0
  289. package/ui/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  290. package/ui/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  291. package/ui/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  292. package/ui/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  293. package/ui/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  294. package/ui/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  295. package/ui/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  296. package/ui/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  297. package/ui/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  298. package/ui/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  299. package/ui/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  300. package/ui/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  301. package/ui/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  302. package/ui/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  303. package/ui/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  304. package/ui/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  305. package/ui/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  306. package/ui/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  307. package/ui/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  308. package/ui/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  309. package/ui/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  310. package/ui/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  311. package/ui/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  312. package/ui/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  313. package/ui/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  314. package/ui/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  315. package/ui/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  316. package/ui/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  317. package/ui/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  318. package/ui/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  319. package/ui/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  320. package/ui/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  321. package/ui/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  322. package/ui/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  323. package/ui/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  324. package/ui/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  325. package/ui/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  326. package/ui/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  327. package/ui/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  328. package/ui/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  329. package/ui/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  330. package/ui/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  331. package/ui/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  332. package/ui/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  333. package/ui/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  334. package/ui/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  335. package/ui/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  336. package/ui/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  337. package/ui/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  338. package/ui/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  339. package/ui/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  340. package/ui/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  341. package/ui/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  342. package/ui/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  343. package/ui/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  344. package/ui/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  345. package/ui/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  346. package/ui/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  347. package/ui/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  348. package/ui/dist/assets/MarketplacePage-DGrLtolR.js +1 -0
  349. package/ui/dist/assets/{ProjectDetail--gPfvATB.js → ProjectDetail-BgWvA6UP.js} +2 -2
  350. package/ui/dist/assets/ProjectIcon-TDuliqwg.js +1 -0
  351. package/ui/dist/assets/ProjectList-DXgM4187.js +1 -0
  352. package/ui/dist/assets/{Settings-1kaf7VHE.js → Settings-xA8Zhi3p.js} +3 -3
  353. package/ui/dist/assets/StatusIndicator-B8vfFAxg.js +1 -0
  354. package/ui/dist/assets/{SummaryDetail-DV3AmONk.js → SummaryDetail-eedRfTtF.js} +2 -2
  355. package/ui/dist/assets/SummaryList-CLNX2P84.js +1 -0
  356. package/ui/dist/assets/TaskDetail-BtWclNiR.js +1 -0
  357. package/ui/dist/assets/TaskList-JjODAgSc.js +1 -0
  358. package/ui/dist/assets/TeamsPage-CBK5iAyx.js +1 -0
  359. package/ui/dist/assets/TicketBoard-C9aJNNYp.js +1 -0
  360. package/ui/dist/assets/TicketDetail-CV5JmL31.js +1 -0
  361. package/ui/dist/assets/TicketList-68V4lzUz.js +1 -0
  362. package/ui/dist/assets/UserManagement-DKTb6UpE.js +2 -0
  363. package/ui/dist/assets/ViewSwitcher-BvdQht2Y.js +1 -0
  364. package/ui/dist/assets/alert-dialog-O6qBOv_f.js +1 -0
  365. package/ui/dist/assets/{archive-BsLa7brF.js → archive-CX7UvZpf.js} +1 -1
  366. package/ui/dist/assets/badge-BbfnwDJP.js +1 -0
  367. package/ui/dist/assets/{bug-CmZI7jqM.js → bug-3WX0394-.js} +1 -1
  368. package/ui/dist/assets/{calendar-Bf0t2B82.js → calendar-buq77TaS.js} +1 -1
  369. package/ui/dist/assets/{chevron-up-CoUsOvZj.js → chevron-up-4ymsBJRo.js} +1 -1
  370. package/ui/dist/assets/{circle-x-Dgw11LgT.js → circle-x-ByXtwR6Y.js} +1 -1
  371. package/ui/dist/assets/constants-CVdDh7p0.js +1 -0
  372. package/ui/dist/assets/{cpu-DiPMQICV.js → cpu-CiuoCeDY.js} +1 -1
  373. package/ui/dist/assets/{database-BwTfupDi.js → database-BWXSBg5a.js} +1 -1
  374. package/ui/dist/assets/dialog-lDg4NvMV.js +1 -0
  375. package/ui/dist/assets/dollar-sign-Dmijd6DP.js +1 -0
  376. package/ui/dist/assets/{ellipsis-UJx4Xnf6.js → ellipsis-vT-5SVIp.js} +1 -1
  377. package/ui/dist/assets/{ellipsis-vertical-DoULYEKn.js → ellipsis-vertical-B4tAX_bL.js} +1 -1
  378. package/ui/dist/assets/feature-markdown-DBo5Q7uq.js +289 -0
  379. package/ui/dist/assets/{file-code-B2UrJLwi.js → file-code-ChOWdKXf.js} +1 -1
  380. package/ui/dist/assets/{folder-open-BJi577JH.js → folder-open-CkOUbIiP.js} +1 -1
  381. package/ui/dist/assets/{funnel-PkaD_HSR.js → funnel-uZkoSPP-.js} +1 -1
  382. package/ui/dist/assets/{git-branch-C_K30am0.js → git-branch-CwvUxj7C.js} +1 -1
  383. package/ui/dist/assets/{git-commit-horizontal-IT6ecxWQ.js → git-commit-horizontal-lxPzCvhD.js} +1 -1
  384. package/ui/dist/assets/{globe-f-jjCa_g.js → globe-D_WpJdsj.js} +1 -1
  385. package/ui/dist/assets/{hash-DNEv8Elo.js → hash-CA0hJ7vh.js} +1 -1
  386. package/ui/dist/assets/{history-BQSBo_1Q.js → history-CEWMLELs.js} +1 -1
  387. package/ui/dist/assets/inbox-ehtOptTV.js +1 -0
  388. package/ui/dist/assets/{index-nS3EErDg.js → index-C1rhbml4.js} +3 -3
  389. package/ui/dist/assets/index-CR8gfCHv.js +1 -0
  390. package/ui/dist/assets/index-DVXMpWai.js +1 -0
  391. package/ui/dist/assets/index-DaDJMM2v.js +1 -0
  392. package/ui/dist/assets/index-Djdq_0xu.js +1 -0
  393. package/ui/dist/assets/index-M46Gcb8K.css +1 -0
  394. package/ui/dist/assets/index-sEBN7w8J.js +109 -0
  395. package/ui/dist/assets/layers-C6Mhf8Nk.js +1 -0
  396. package/ui/dist/assets/{layout-dashboard-CcKt1hXw.js → layout-dashboard-BRUM0kpT.js} +1 -1
  397. package/ui/dist/assets/{lightbulb-Jhp7FvbU.js → lightbulb-CN2q1O5l.js} +1 -1
  398. package/ui/dist/assets/{link-2-DdO7ostF.js → link-2-CC4E28yJ.js} +1 -1
  399. package/ui/dist/assets/markdown-renderer-C6ENbB0u.js +10 -0
  400. package/ui/dist/assets/markdown-renderer-CfVKi3_s.css +1 -0
  401. package/ui/dist/assets/{message-square-CBgH65X7.js → message-square-Bbb241am.js} +1 -1
  402. package/ui/dist/assets/package-CwT3IzFx.js +1 -0
  403. package/ui/dist/assets/{pencil-CYXCEPQh.js → pencil-CDmiHzoj.js} +1 -1
  404. package/ui/dist/assets/{play-d1ONaH0-.js → play-tjy5jMQX.js} +1 -1
  405. package/ui/dist/assets/popover-CFHZf3pE.js +1 -0
  406. package/ui/dist/assets/progress-BboUHuLf.js +1 -0
  407. package/ui/dist/assets/{rocket-DhvUetsk.js → rocket--8ZHgdXJ.js} +1 -1
  408. package/ui/dist/assets/select-n108rXny.js +1 -0
  409. package/ui/dist/assets/{send-P0r5D7td.js → send-Cu7MR2Qh.js} +1 -1
  410. package/ui/dist/assets/server-DmodxZp-.js +1 -0
  411. package/ui/dist/assets/{settings-2-ocj5uHGx.js → settings-2-CkRNqkxj.js} +1 -1
  412. package/ui/dist/assets/sheet-7aUJkyzU.js +1 -0
  413. package/ui/dist/assets/{shield-check-DfVdE34l.js → shield-check-ViI3nMKE.js} +1 -1
  414. package/ui/dist/assets/{shield-off-8l0J6R-8.js → shield-off-DN3tagkn.js} +1 -1
  415. package/ui/dist/assets/skeleton-C0E1Nfro.js +1 -0
  416. package/ui/dist/assets/{smartphone-77_g3SQn.js → smartphone-5FghiXpA.js} +1 -1
  417. package/ui/dist/assets/{square-Ckzsr3Rn.js → square-DiNSx8K7.js} +1 -1
  418. package/ui/dist/assets/star-DhdFVidS.js +1 -0
  419. package/ui/dist/assets/switch-CIgVbZqQ.js +1 -0
  420. package/ui/dist/assets/table-BC56FVMV.js +1 -0
  421. package/ui/dist/assets/{tag-C35mgoEv.js → tag-CH_vQliw.js} +1 -1
  422. package/ui/dist/assets/textarea-CxDiKFXZ.js +1 -0
  423. package/ui/dist/assets/{timer-DHJBS2w1.js → timer-CdGVTb60.js} +1 -1
  424. package/ui/dist/assets/tooltip-BuW9A5UO.js +1 -0
  425. package/ui/dist/assets/{trash-2-keO5tKPE.js → trash-2-CucZJL0N.js} +1 -1
  426. package/ui/dist/assets/trending-down-BCezC1z2.js +1 -0
  427. package/ui/dist/assets/{trending-up-BBv8KbrY.js → trending-up-C5OYX2k2.js} +1 -1
  428. package/ui/dist/assets/vendor-query-C0p7b53x.js +4 -0
  429. package/ui/dist/assets/vendor-react-Mc5_kfYG.js +12 -0
  430. package/ui/dist/assets/vendor-ui-CXPAUBFv.js +51 -0
  431. package/ui/dist/assets/{wand-sparkles-BusQ52ZK.js → wand-sparkles-BaH6pJnc.js} +1 -1
  432. package/ui/dist/assets/{wrench-02YaOSiK.js → wrench-CjxjP6ok.js} +1 -1
  433. package/ui/dist/index.html +5 -2
  434. package/ui/dist/assets/ActivityView-BeshZXmE.js +0 -1
  435. package/ui/dist/assets/AgentList-QVHeldPi.js +0 -1
  436. package/ui/dist/assets/AnalyticsDashboard-C9R97dXE.js +0 -1
  437. package/ui/dist/assets/AreaChart-B73gaiVQ.js +0 -1
  438. package/ui/dist/assets/CartesianChart-CXYL2R-A.js +0 -36
  439. package/ui/dist/assets/ChatView-qjZErlrp.js +0 -10
  440. package/ui/dist/assets/CostsDashboard-O4DCLy1i.js +0 -1
  441. package/ui/dist/assets/EstimateSelect-1hQf4Osk.js +0 -1
  442. package/ui/dist/assets/FloatingChatbot-BZBzrJxd.js +0 -2
  443. package/ui/dist/assets/InviteCodeManagement-LEoGqYeA.js +0 -2
  444. package/ui/dist/assets/ProjectIcon-Chd_ofsw.js +0 -1
  445. package/ui/dist/assets/ProjectList-BvUfVB6c.js +0 -4
  446. package/ui/dist/assets/StatusIndicator-pRfkNcdV.js +0 -1
  447. package/ui/dist/assets/SummaryList-B6kXiTxL.js +0 -1
  448. package/ui/dist/assets/TaskDetail-CV6CzbOS.js +0 -1
  449. package/ui/dist/assets/TaskList-DL7brQKd.js +0 -1
  450. package/ui/dist/assets/TicketBoard-CrkkFj7C.js +0 -1
  451. package/ui/dist/assets/TicketDetail-hnnYclpD.js +0 -1
  452. package/ui/dist/assets/TicketList-CsDAyQCL.js +0 -1
  453. package/ui/dist/assets/UserManagement-BGFQyTSr.js +0 -2
  454. package/ui/dist/assets/ViewSwitcher-CnL0OqA8.js +0 -1
  455. package/ui/dist/assets/alert-dialog-SKM6Gjz4.js +0 -7
  456. package/ui/dist/assets/badge-CVHH1a-v.js +0 -1
  457. package/ui/dist/assets/brain-6o_RHVpe.js +0 -1
  458. package/ui/dist/assets/constants-Q5Zivl-a.js +0 -1
  459. package/ui/dist/assets/dialog-BUqN9Psj.js +0 -1
  460. package/ui/dist/assets/index-BUmnwPQr.js +0 -1
  461. package/ui/dist/assets/index-BfF5G4Cw.js +0 -1
  462. package/ui/dist/assets/index-C8N375c2.js +0 -1
  463. package/ui/dist/assets/index-CuxnqVVz.css +0 -1
  464. package/ui/dist/assets/index-CzMM3QOk.js +0 -1
  465. package/ui/dist/assets/index-lJlNPFVJ.js +0 -67
  466. package/ui/dist/assets/layers-jFqVrWMD.js +0 -1
  467. package/ui/dist/assets/markdown-renderer-n1ToC4XQ.js +0 -36
  468. package/ui/dist/assets/popover-CrmZgoWu.js +0 -1
  469. package/ui/dist/assets/progress-uv4SPkL5.js +0 -1
  470. package/ui/dist/assets/select-CeQ8AHGy.js +0 -1
  471. package/ui/dist/assets/server-CVHTZB72.js +0 -1
  472. package/ui/dist/assets/sheet-DuQExSho.js +0 -1
  473. package/ui/dist/assets/skeleton-TFiFJ3nB.js +0 -1
  474. package/ui/dist/assets/switch-CAePkd6k.js +0 -1
  475. package/ui/dist/assets/table-ZjAZ7hkt.js +0 -1
  476. package/ui/dist/assets/textarea-DsVPnSgR.js +0 -1
  477. package/ui/dist/assets/tooltip-BYmQ331W.js +0 -1
@@ -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
@@ -0,0 +1,15 @@
1
+ /**
2
+ * SuggestionBar
3
+ *
4
+ * Renders 2-3 dimmed follow-up prompt suggestions below the last assistant
5
+ * response. The user can press 1, 2, or 3 to select a suggestion.
6
+ */
7
+ import React from 'react';
8
+ import type { Suggestion } from '../../../agents/prompt-suggestions.js';
9
+ export interface SuggestionBarProps {
10
+ suggestions: Suggestion[];
11
+ isActive: boolean;
12
+ onSelect: (text: string) => void;
13
+ }
14
+ export declare const SuggestionBar: React.FC<SuggestionBarProps>;
15
+ //# sourceMappingURL=SuggestionBar.d.ts.map
@@ -0,0 +1,28 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text, useInput } from 'ink';
3
+ // ── Category colors ───────────────────────────────────────────────────────────
4
+ function categoryColor(category) {
5
+ switch (category) {
6
+ case 'action': return 'yellow';
7
+ case 'deeper': return 'cyan';
8
+ case 'related': return 'magenta';
9
+ case 'follow-up':
10
+ default: return 'white';
11
+ }
12
+ }
13
+ // ── Component ─────────────────────────────────────────────────────────────────
14
+ export const SuggestionBar = ({ suggestions, isActive, onSelect, }) => {
15
+ useInput((input) => {
16
+ const digit = parseInt(input, 10);
17
+ if (!isNaN(digit) && digit >= 1 && digit <= suggestions.length) {
18
+ const suggestion = suggestions[digit - 1];
19
+ if (suggestion) {
20
+ onSelect(suggestion.text);
21
+ }
22
+ }
23
+ }, { isActive });
24
+ if (suggestions.length === 0)
25
+ return null;
26
+ return (_jsxs(Box, { flexDirection: "column", paddingX: 2, paddingY: 0, marginTop: 0, children: [_jsx(Text, { dimColor: true, children: " \u254C suggestions \u254C" }), suggestions.map((s, i) => (_jsxs(Box, { flexDirection: "row", gap: 1, children: [_jsx(Text, { dimColor: true, bold: true, children: ` ${i + 1}.` }), _jsx(Text, { dimColor: true, color: categoryColor(s.category), children: s.text })] }, i))), _jsxs(Text, { dimColor: true, children: [" press 1\u2013", suggestions.length, " to use"] })] }));
27
+ };
28
+ //# sourceMappingURL=SuggestionBar.js.map
@@ -0,0 +1,20 @@
1
+ import React from 'react';
2
+ export interface SystemMetrics {
3
+ version?: string;
4
+ uptime?: number;
5
+ mode?: string;
6
+ healthy?: boolean;
7
+ memoryUsedMb?: number;
8
+ memoryTotalMb?: number;
9
+ cpuPercent?: number;
10
+ queueBackend?: 'redis' | 'memory';
11
+ degraded?: boolean;
12
+ }
13
+ interface SystemHealthProps {
14
+ metrics: SystemMetrics;
15
+ loading?: boolean;
16
+ error?: string;
17
+ }
18
+ export declare function SystemHealth({ metrics, loading, error }: SystemHealthProps): React.ReactElement;
19
+ export {};
20
+ //# sourceMappingURL=SystemHealth.d.ts.map
@@ -0,0 +1,39 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ function formatUptime(seconds) {
4
+ const d = Math.floor(seconds / 86400);
5
+ const h = Math.floor((seconds % 86400) / 3600);
6
+ const m = Math.floor((seconds % 3600) / 60);
7
+ const parts = [];
8
+ if (d > 0)
9
+ parts.push(`${d}d`);
10
+ if (h > 0)
11
+ parts.push(`${h}h`);
12
+ parts.push(`${m}m`);
13
+ return parts.join(' ');
14
+ }
15
+ function HealthRow({ label, value, color = 'white', dimColor = false }) {
16
+ return (_jsxs(Box, { gap: 0, children: [_jsx(Text, { dimColor: true, children: ' ' + label.padEnd(16) }), _jsx(Text, { color: dimColor ? undefined : color, dimColor: dimColor, children: value })] }));
17
+ }
18
+ export function SystemHealth({ metrics, loading, error }) {
19
+ if (loading) {
20
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, color: "white", children: "System Health" }), _jsx(Text, { dimColor: true, children: " Loading..." })] }));
21
+ }
22
+ if (error) {
23
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, color: "white", children: "System Health" }), _jsxs(Box, { flexDirection: "column", marginTop: 1, children: [_jsx(Text, { color: "red", children: " Unable to connect to profClaw server." }), _jsx(Text, { dimColor: true, children: " Is it running? Try: profclaw serve" })] })] }));
24
+ }
25
+ const healthColor = metrics.healthy ? 'green' : 'red';
26
+ const healthLabel = metrics.healthy
27
+ ? '● healthy'
28
+ : metrics.degraded
29
+ ? '● degraded'
30
+ : '● unhealthy';
31
+ const memUsage = metrics.memoryUsedMb != null && metrics.memoryTotalMb != null
32
+ ? `${metrics.memoryUsedMb}MB / ${metrics.memoryTotalMb}MB`
33
+ : undefined;
34
+ const cpuColor = (metrics.cpuPercent ?? 0) > 80 ? 'red'
35
+ : (metrics.cpuPercent ?? 0) > 50 ? 'yellow'
36
+ : 'green';
37
+ return (_jsxs(Box, { flexDirection: "column", gap: 0, children: [_jsxs(Box, { gap: 2, children: [_jsx(Text, { bold: true, color: "white", children: "System Health" }), metrics.degraded && (_jsx(Text, { color: "yellow", bold: true, children: "\u26A0 DEGRADED" }))] }), _jsxs(Box, { flexDirection: "column", marginTop: 1, children: [metrics.version && (_jsx(HealthRow, { label: "Version", value: metrics.version, dimColor: true })), _jsx(HealthRow, { label: "Status", value: healthLabel, color: healthColor }), _jsx(HealthRow, { label: "Mode", value: metrics.mode ?? 'mini', color: "cyan" }), metrics.uptime != null && (_jsx(HealthRow, { label: "Uptime", value: formatUptime(metrics.uptime), dimColor: true })), memUsage && (_jsx(HealthRow, { label: "Memory", value: memUsage, dimColor: true })), metrics.cpuPercent != null && (_jsx(HealthRow, { label: "CPU", value: `${metrics.cpuPercent.toFixed(1)}%`, color: cpuColor })), _jsx(HealthRow, { label: "Queue backend", value: metrics.queueBackend ?? 'memory', color: metrics.queueBackend === 'redis' ? 'green' : 'yellow' })] })] }));
38
+ }
39
+ //# sourceMappingURL=SystemHealth.js.map
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ export type TaskStatus = 'pending' | 'running' | 'completed' | 'failed' | 'cancelled';
3
+ export interface Task {
4
+ id: string;
5
+ title: string;
6
+ status: TaskStatus;
7
+ createdAt: string;
8
+ durationMs?: number;
9
+ }
10
+ interface TaskListProps {
11
+ tasks: Task[];
12
+ loading?: boolean;
13
+ error?: string;
14
+ }
15
+ export declare function TaskList({ tasks, loading, error }: TaskListProps): React.ReactElement;
16
+ export {};
17
+ //# sourceMappingURL=TaskList.d.ts.map