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
@@ -1,24 +1,33 @@
1
1
  import { Command } from 'commander';
2
2
  import chalk from 'chalk';
3
3
  import * as os from 'os';
4
- import { existsSync } from 'node:fs';
4
+ import { existsSync, readFileSync } from 'node:fs';
5
5
  import { join } from 'node:path';
6
6
  import { execFile } from 'node:child_process';
7
7
  import { promisify } from 'node:util';
8
8
  import { api } from '../utils/api.js';
9
9
  import { success, error, info, spinner } from '../utils/output.js';
10
+ import { isServerRunning } from '../../utils/pid-file.js';
10
11
  const execFileAsync = promisify(execFile);
11
12
  async function checkNode() {
12
13
  const version = process.version;
13
14
  const major = parseInt(version.slice(1).split('.')[0], 10);
14
- if (major >= 22) {
15
- return { name: 'Node.js', status: 'pass', message: `${version}` };
15
+ if (major >= 20) {
16
+ return { name: 'Node.js', status: 'pass', message: `${version} (>= 18 required)` };
17
+ }
18
+ if (major >= 18) {
19
+ return {
20
+ name: 'Node.js',
21
+ status: 'warn',
22
+ message: `${version} (>= 20 recommended for best performance)`,
23
+ fix: 'nvm install 20',
24
+ };
16
25
  }
17
26
  return {
18
27
  name: 'Node.js',
19
28
  status: 'fail',
20
- message: `${version} (requires >= 22)`,
21
- fix: 'nvm install 22',
29
+ message: `${version} (requires >= 18)`,
30
+ fix: 'nvm install 20',
22
31
  };
23
32
  }
24
33
  async function checkRedis() {
@@ -203,6 +212,173 @@ async function checkDiskSpace() {
203
212
  return { name: 'Disk', status: 'warn', message: 'Could not check disk space' };
204
213
  }
205
214
  }
215
+ async function checkDatabaseIntegrity() {
216
+ const result = await api.get('/api/setup/db-integrity');
217
+ if (!result.ok) {
218
+ // Try a direct PRAGMA if server is unavailable
219
+ try {
220
+ const { existsSync: fsExists } = await import('node:fs');
221
+ const dbPath = join(process.cwd(), '.profclaw', 'profclaw.db');
222
+ if (!fsExists(dbPath)) {
223
+ return { name: 'DB Integrity', status: 'warn', message: 'Database file not found (server may not have run yet)' };
224
+ }
225
+ // Dynamically attempt SQLite integrity check (optional dep)
226
+ const betterSqlite3 = 'better-sqlite3';
227
+ const { default: Database } = await import(/* @vite-ignore */ betterSqlite3);
228
+ const db = new Database(dbPath, { readonly: true });
229
+ const row = db.prepare('PRAGMA integrity_check').get();
230
+ db.close();
231
+ const integrity = row?.integrity_check ?? 'unknown';
232
+ if (integrity === 'ok') {
233
+ return { name: 'DB Integrity', status: 'pass', message: 'ok' };
234
+ }
235
+ return { name: 'DB Integrity', status: 'fail', message: integrity, fix: 'Backup and recreate the database' };
236
+ }
237
+ catch {
238
+ return { name: 'DB Integrity', status: 'warn', message: 'Cannot check (server not running, SQLite unavailable)' };
239
+ }
240
+ }
241
+ const integrity = result.data?.integrity ?? 'ok';
242
+ if (integrity === 'ok') {
243
+ return { name: 'DB Integrity', status: 'pass', message: 'ok' };
244
+ }
245
+ return { name: 'DB Integrity', status: 'fail', message: integrity, fix: 'Backup and recreate the database' };
246
+ }
247
+ async function checkApiKeyValidation() {
248
+ const result = await api.get('/api/chat/providers');
249
+ if (!result.ok) {
250
+ return [{ name: 'API Keys', status: 'warn', message: 'Cannot check (server not running)', fix: 'profclaw serve' }];
251
+ }
252
+ const configured = result.data?.providers?.filter((p) => p.enabled) ?? [];
253
+ if (configured.length === 0) {
254
+ return [{ name: 'API Keys', status: 'fail', message: 'No AI providers configured', fix: 'profclaw provider add anthropic' }];
255
+ }
256
+ return configured.map((p) => {
257
+ const label = p.type.charAt(0).toUpperCase() + p.type.slice(1);
258
+ if (p.healthy) {
259
+ return { name: label, status: 'pass', message: 'configured' };
260
+ }
261
+ return { name: label, status: 'warn', message: `configured but unreachable${p.message ? ` (${p.message})` : ''}` };
262
+ });
263
+ }
264
+ async function checkPortAvailability() {
265
+ const port = parseInt(process.env.PORT || '3000', 10);
266
+ const net = await import('net');
267
+ return new Promise((resolve) => {
268
+ const server = net.createServer();
269
+ server.once('error', (err) => {
270
+ if (err.code === 'EADDRINUSE') {
271
+ resolve({ name: 'Port availability', status: 'pass', message: `Port ${port} in use (server likely running)` });
272
+ }
273
+ else {
274
+ resolve({ name: 'Port availability', status: 'warn', message: `Port ${port}: ${err.message}` });
275
+ }
276
+ });
277
+ server.once('listening', () => {
278
+ server.close();
279
+ resolve({ name: 'Port availability', status: 'pass', message: `Port ${port} available` });
280
+ });
281
+ server.listen(port, '127.0.0.1');
282
+ });
283
+ }
284
+ async function checkMissingDependencies() {
285
+ const required = ['ink', 'react', 'chalk', 'commander'];
286
+ const missing = [];
287
+ for (const dep of required) {
288
+ try {
289
+ await import(dep);
290
+ }
291
+ catch {
292
+ missing.push(dep);
293
+ }
294
+ }
295
+ if (missing.length === 0) {
296
+ return { name: 'Dependencies', status: 'pass', message: `${required.length} required packages present` };
297
+ }
298
+ return {
299
+ name: 'Dependencies',
300
+ status: 'fail',
301
+ message: `Missing: ${missing.join(', ')}`,
302
+ fix: `npm install ${missing.join(' ')}`,
303
+ };
304
+ }
305
+ async function checkConfigFileValidity() {
306
+ const cwd = process.cwd();
307
+ const errors = [];
308
+ const configJsonPath = join(cwd, '.profclaw', 'config.json');
309
+ if (existsSync(configJsonPath)) {
310
+ try {
311
+ JSON.parse(readFileSync(configJsonPath, 'utf-8'));
312
+ }
313
+ catch {
314
+ errors.push('config.json: invalid JSON');
315
+ }
316
+ }
317
+ // settings.yml validation — check it parses as basic YAML (key: value lines, no tabs)
318
+ const settingsYmlPath = join(cwd, 'config', 'settings.yml');
319
+ if (existsSync(settingsYmlPath)) {
320
+ try {
321
+ const content = readFileSync(settingsYmlPath, 'utf-8');
322
+ if (content.includes('\t')) {
323
+ errors.push('settings.yml: contains tab characters (YAML requires spaces)');
324
+ }
325
+ }
326
+ catch {
327
+ errors.push('settings.yml: unreadable');
328
+ }
329
+ }
330
+ if (errors.length > 0) {
331
+ return {
332
+ name: 'Config files',
333
+ status: 'fail',
334
+ message: errors.join('; '),
335
+ fix: 'Fix the reported config files',
336
+ };
337
+ }
338
+ return { name: 'Config files', status: 'pass', message: 'valid' };
339
+ }
340
+ async function checkPidFileStatus() {
341
+ const status = isServerRunning();
342
+ if (status.running) {
343
+ return {
344
+ name: 'PID file',
345
+ status: 'pass',
346
+ message: `Server running (PID ${status.pid}, port ${status.port})`,
347
+ };
348
+ }
349
+ // Check if a stale PID file was present (isServerRunning cleans it up automatically)
350
+ return { name: 'PID file', status: 'pass', message: 'No server process found' };
351
+ }
352
+ async function checkDiskSpaceBytes() {
353
+ // macOS / Linux: use `df -k` to get kibibyte blocks for a numeric threshold check
354
+ try {
355
+ const { stdout } = await execFileAsync('df', ['-k', process.cwd()], { timeout: 5000 });
356
+ const lines = stdout.trim().split('\n');
357
+ if (lines.length >= 2) {
358
+ const parts = lines[1].split(/\s+/);
359
+ const availKB = parseInt(parts[3] || '0', 10);
360
+ const availMB = availKB / 1024;
361
+ const availGB = (availKB / 1024 / 1024).toFixed(1);
362
+ const usePct = parseInt(parts[4] || '0', 10);
363
+ if (availMB < 500) {
364
+ return {
365
+ name: 'Disk space',
366
+ status: 'warn',
367
+ message: `${availGB} GB free (< 500 MB threshold)`,
368
+ fix: 'Free up disk space',
369
+ };
370
+ }
371
+ if (usePct > 95) {
372
+ return { name: 'Disk space', status: 'fail', message: `${availGB} GB free (${usePct}% used)`, fix: 'Free up disk space' };
373
+ }
374
+ return { name: 'Disk space', status: 'pass', message: `${availGB} GB free` };
375
+ }
376
+ return { name: 'Disk space', status: 'pass', message: 'Readable' };
377
+ }
378
+ catch {
379
+ return { name: 'Disk space', status: 'warn', message: 'Could not check disk space' };
380
+ }
381
+ }
206
382
  async function checkTailscale() {
207
383
  const result = await api.get('/api/tunnels/status');
208
384
  if (!result.ok) {
@@ -235,28 +411,36 @@ export function doctorCommand() {
235
411
  .option('--json', 'Output as JSON')
236
412
  .action(async (options) => {
237
413
  console.log(chalk.bold('\nprofClaw Doctor\n'));
238
- const checks = [
414
+ // Static (single-result) checks
415
+ const singleChecks = [
239
416
  { name: 'Node.js', fn: checkNode },
417
+ { name: 'Disk space', fn: checkDiskSpaceBytes },
418
+ { name: 'Port availability', fn: checkPortAvailability },
419
+ { name: 'DB Integrity', fn: checkDatabaseIntegrity },
420
+ { name: 'Ollama', fn: checkOllama },
421
+ { name: 'Redis', fn: checkRedis },
422
+ { name: 'Config files', fn: checkConfigFileValidity },
423
+ { name: 'Dependencies', fn: checkMissingDependencies },
424
+ { name: 'PID file', fn: checkPidFileStatus },
240
425
  { name: 'Config', fn: checkConfigFiles },
241
426
  { name: 'Port', fn: checkPort },
242
- { name: 'Redis', fn: checkRedis },
243
- { name: 'Ollama', fn: checkOllama },
244
427
  { name: 'Server', fn: checkServer },
245
428
  { name: 'Database', fn: checkDatabase },
246
- { name: 'AI Provider', fn: checkProvider },
247
429
  { name: 'Memory', fn: checkMemory },
248
430
  { name: 'Disk', fn: checkDiskSpace },
249
431
  { name: 'Cloudflared', fn: checkCloudflared },
250
432
  { name: 'Tailscale', fn: checkTailscale },
251
433
  ];
252
434
  const results = [];
253
- for (const check of checks) {
435
+ // Run single-result checks
436
+ for (const check of singleChecks) {
254
437
  const spin = spinner(`Checking ${check.name}...`).start();
255
438
  try {
256
439
  const result = await check.fn();
257
440
  results.push(result);
258
441
  spin.stop();
259
- formatCheck(result);
442
+ if (!options.json)
443
+ formatCheck(result);
260
444
  }
261
445
  catch (err) {
262
446
  spin.stop();
@@ -266,7 +450,30 @@ export function doctorCommand() {
266
450
  message: err instanceof Error ? err.message : 'Unknown error',
267
451
  };
268
452
  results.push(result);
269
- formatCheck(result);
453
+ if (!options.json)
454
+ formatCheck(result);
455
+ }
456
+ }
457
+ // Run multi-result check: API key validation per provider
458
+ {
459
+ const spin = spinner('Checking API keys...').start();
460
+ try {
461
+ const apiKeyResults = await checkApiKeyValidation();
462
+ results.push(...apiKeyResults);
463
+ spin.stop();
464
+ if (!options.json)
465
+ apiKeyResults.forEach(formatCheck);
466
+ }
467
+ catch (err) {
468
+ spin.stop();
469
+ const result = {
470
+ name: 'API Keys',
471
+ status: 'fail',
472
+ message: err instanceof Error ? err.message : 'Unknown error',
473
+ };
474
+ results.push(result);
475
+ if (!options.json)
476
+ formatCheck(result);
270
477
  }
271
478
  }
272
479
  if (options.json) {
@@ -277,15 +484,14 @@ export function doctorCommand() {
277
484
  const warnings = results.filter((r) => r.status === 'warn').length;
278
485
  const failed = results.filter((r) => r.status === 'fail').length;
279
486
  console.log('');
280
- const total = results.length;
281
487
  if (failed === 0 && warnings === 0) {
282
- success(`All ${total} checks passed`);
488
+ success(`${passed} passed`);
283
489
  }
284
490
  else if (failed === 0) {
285
- info(`${passed}/${total} passed, ${warnings} warnings`);
491
+ info(`${passed} passed | ${warnings} warning${warnings !== 1 ? 's' : ''} | 0 failed`);
286
492
  }
287
493
  else {
288
- error(`${passed}/${total} passed, ${warnings} warnings, ${failed} failed`);
494
+ error(`${passed} passed | ${warnings} warning${warnings !== 1 ? 's' : ''} | ${failed} failed`);
289
495
  process.exitCode = 1;
290
496
  }
291
497
  console.log('');
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function historyCommands(): Command;
3
+ //# sourceMappingURL=history.d.ts.map
@@ -0,0 +1,138 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import { TranscriptStore } from '../../agents/transcript.js';
4
+ import { createTable, error, formatRelativeTime, truncate, } from '../utils/output.js';
5
+ function getStore() {
6
+ return new TranscriptStore(process.cwd());
7
+ }
8
+ export function historyCommands() {
9
+ const cmd = new Command('history').description('View and search conversation history');
10
+ // -------------------------------------------------------------------
11
+ // profclaw history
12
+ // -------------------------------------------------------------------
13
+ cmd
14
+ .command('list', { isDefault: true })
15
+ .alias('ls')
16
+ .description('List recent conversation sessions')
17
+ .option('-l, --limit <n>', 'Max sessions to show', '20')
18
+ .option('--offset <n>', 'Skip first N sessions', '0')
19
+ .option('--json', 'Output as JSON')
20
+ .action(async (options) => {
21
+ const store = getStore();
22
+ const sessions = store.listSessions({
23
+ limit: parseInt(options.limit, 10),
24
+ offset: parseInt(options.offset, 10),
25
+ });
26
+ if (options.json) {
27
+ console.log(JSON.stringify(sessions, null, 2));
28
+ return;
29
+ }
30
+ if (sessions.length === 0) {
31
+ console.log(chalk.dim('No sessions found.'));
32
+ return;
33
+ }
34
+ const table = createTable(['Session ID', 'Title', 'Messages', 'Tokens', 'Last Active']);
35
+ for (const s of sessions) {
36
+ table.push([
37
+ chalk.dim(s.sessionId.slice(0, 12)),
38
+ truncate(s.title, 40),
39
+ String(s.messageCount),
40
+ chalk.dim(String(s.tokensUsed)),
41
+ formatRelativeTime(new Date(s.lastActivityAt)),
42
+ ]);
43
+ }
44
+ console.log(`\n${chalk.bold('Conversation History')}`);
45
+ console.log(table.toString());
46
+ console.log(chalk.dim(`\nShowing ${sessions.length} session(s)`));
47
+ });
48
+ // -------------------------------------------------------------------
49
+ // profclaw history search <query>
50
+ // -------------------------------------------------------------------
51
+ cmd
52
+ .command('search <query>')
53
+ .description('Search across all transcript entries')
54
+ .option('-s, --session <sessionId>', 'Restrict search to a specific session')
55
+ .option('-l, --limit <n>', 'Max results to return', '20')
56
+ .option('--json', 'Output as JSON')
57
+ .action(async (query, options) => {
58
+ const store = getStore();
59
+ const results = store.search(query, {
60
+ sessionId: options.session,
61
+ limit: parseInt(options.limit, 10),
62
+ });
63
+ if (options.json) {
64
+ console.log(JSON.stringify(results, null, 2));
65
+ return;
66
+ }
67
+ if (results.length === 0) {
68
+ console.log(chalk.dim(`No matches found for "${query}".`));
69
+ return;
70
+ }
71
+ const table = createTable(['Session', 'Line', 'Type', 'Content']);
72
+ for (const r of results) {
73
+ table.push([
74
+ chalk.dim(r.sessionId.slice(0, 12)),
75
+ chalk.dim(String(r.lineNumber)),
76
+ chalk.cyan(r.entry.type),
77
+ truncate(r.entry.content, 60),
78
+ ]);
79
+ }
80
+ console.log(`\n${chalk.bold(`Search results for "${query}"`)}`);
81
+ console.log(table.toString());
82
+ console.log(chalk.dim(`\nFound ${results.length} match(es)`));
83
+ });
84
+ // -------------------------------------------------------------------
85
+ // profclaw history show <sessionId>
86
+ // -------------------------------------------------------------------
87
+ cmd
88
+ .command('show <sessionId>')
89
+ .description('Show the full transcript for a session')
90
+ .option('--json', 'Output as JSON')
91
+ .option('--no-color', 'Disable color output')
92
+ .action(async (sessionId, options) => {
93
+ const store = getStore();
94
+ const entries = store.getSession(sessionId);
95
+ if (entries.length === 0) {
96
+ error(`No transcript found for session: ${sessionId}`);
97
+ process.exit(1);
98
+ }
99
+ if (options.json) {
100
+ console.log(JSON.stringify(entries, null, 2));
101
+ return;
102
+ }
103
+ console.log(`\n${chalk.bold('Transcript')} ${chalk.dim(sessionId)}\n`);
104
+ for (const entry of entries) {
105
+ const ts = new Date(entry.timestamp).toLocaleTimeString();
106
+ const label = entryLabel(entry.type);
107
+ console.log(`${chalk.dim(ts)} ${label}`);
108
+ console.log(chalk.white(entry.content));
109
+ if (entry.metadata?.toolName) {
110
+ console.log(chalk.dim(` tool: ${entry.metadata.toolName}`));
111
+ }
112
+ if (entry.metadata?.tokensUsed) {
113
+ console.log(chalk.dim(` tokens: ${entry.metadata.tokensUsed}`));
114
+ }
115
+ console.log();
116
+ }
117
+ });
118
+ return cmd;
119
+ }
120
+ function entryLabel(type) {
121
+ switch (type) {
122
+ case 'user':
123
+ return chalk.green('> User');
124
+ case 'assistant':
125
+ return chalk.blue('~ Assistant');
126
+ case 'tool_call':
127
+ return chalk.yellow('# Tool Call');
128
+ case 'tool_result':
129
+ return chalk.yellow('# Tool Result');
130
+ case 'system':
131
+ return chalk.dim('* System');
132
+ case 'error':
133
+ return chalk.red('! Error');
134
+ default:
135
+ return chalk.dim(type);
136
+ }
137
+ }
138
+ //# sourceMappingURL=history.js.map
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Import/Migration CLI Command
3
+ *
4
+ * Imports data from other AI assistants into profClaw:
5
+ * - OpenClaw: memories, skills, conversation history
6
+ * - ChatGPT: exported conversations (JSON)
7
+ * - Aider: chat history
8
+ *
9
+ * Usage:
10
+ * profclaw import --from openclaw [--path ~/.openclaw]
11
+ * profclaw import --from chatgpt --file conversations.json
12
+ * profclaw import --from aider [--path .]
13
+ */
14
+ import { Command } from 'commander';
15
+ export type ImportSource = 'openclaw' | 'chatgpt' | 'aider';
16
+ export interface ImportResult {
17
+ source: ImportSource;
18
+ memories: number;
19
+ conversations: number;
20
+ skills: number;
21
+ preferences: number;
22
+ errors: string[];
23
+ duration: number;
24
+ }
25
+ /**
26
+ * Import data from another AI assistant into profClaw.
27
+ * Returns a summary of what was imported.
28
+ */
29
+ export declare function importFrom(source: ImportSource, options?: {
30
+ path?: string;
31
+ file?: string;
32
+ dryRun?: boolean;
33
+ }): Promise<ImportResult>;
34
+ /**
35
+ * List available import sources and their expected paths.
36
+ */
37
+ export declare function listImportSources(): Array<{
38
+ source: ImportSource;
39
+ description: string;
40
+ defaultPath: string;
41
+ format: string;
42
+ }>;
43
+ export declare function importCommands(): Command;
44
+ //# sourceMappingURL=import.d.ts.map