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,95 @@
1
+ /**
2
+ * Sleep Prevention Utility
3
+ *
4
+ * Prevents OS sleep/screensaver during long agent runs.
5
+ * - macOS: uses `caffeinate -i -w {pid}`
6
+ * - Linux: tries `systemd-inhibit` then falls back to `xdg-screensaver suspend`
7
+ * - Windows: no-op (PowerShell SetThreadExecutionState not exposed without ffi)
8
+ */
9
+ import { spawn } from 'child_process';
10
+ let _instance = null;
11
+ export class SleepPreventer {
12
+ _process = null;
13
+ _active = false;
14
+ /**
15
+ * Start preventing OS sleep.
16
+ * Safe to call multiple times — subsequent calls are no-ops if already active.
17
+ */
18
+ start() {
19
+ if (this._active)
20
+ return;
21
+ const platform = process.platform;
22
+ try {
23
+ if (platform === 'darwin') {
24
+ this._process = spawn('caffeinate', ['-i', '-w', String(process.pid)], {
25
+ detached: false,
26
+ stdio: 'ignore',
27
+ });
28
+ this._process.unref();
29
+ this._active = true;
30
+ }
31
+ else if (platform === 'linux') {
32
+ // Try systemd-inhibit first; it works on most modern distros
33
+ this._process = spawn('systemd-inhibit', [
34
+ '--what=sleep:idle',
35
+ '--who=profClaw',
36
+ '--why=Agent run in progress',
37
+ '--mode=block',
38
+ 'sleep', 'infinity',
39
+ ], { detached: false, stdio: 'ignore' });
40
+ this._process.unref();
41
+ this._process.on('error', () => {
42
+ // systemd-inhibit unavailable — try xdg-screensaver
43
+ this._process = null;
44
+ try {
45
+ const p = spawn('xdg-screensaver', ['suspend', String(process.pid)], {
46
+ detached: false,
47
+ stdio: 'ignore',
48
+ });
49
+ p.unref();
50
+ this._process = p;
51
+ }
52
+ catch {
53
+ // xdg-screensaver also unavailable — silent no-op
54
+ }
55
+ });
56
+ this._active = true;
57
+ }
58
+ // Windows / unknown: no-op — _active stays false
59
+ }
60
+ catch {
61
+ // If spawn itself throws, treat as silent failure
62
+ this._process = null;
63
+ }
64
+ }
65
+ /**
66
+ * Stop preventing sleep and release the system process.
67
+ */
68
+ stop() {
69
+ if (!this._active)
70
+ return;
71
+ if (this._process) {
72
+ try {
73
+ this._process.kill();
74
+ }
75
+ catch {
76
+ // Already dead — ignore
77
+ }
78
+ this._process = null;
79
+ }
80
+ this._active = false;
81
+ }
82
+ isActive() {
83
+ return this._active;
84
+ }
85
+ }
86
+ /**
87
+ * Returns the shared singleton SleepPreventer instance.
88
+ */
89
+ export function getSleepPreventer() {
90
+ if (!_instance) {
91
+ _instance = new SleepPreventer();
92
+ }
93
+ return _instance;
94
+ }
95
+ //# sourceMappingURL=prevent-sleep.js.map
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Output Sanitization Utilities
3
+ *
4
+ * Protects against terminal injection, path traversal, dangerous shell commands,
5
+ * and sensitive data leaking into logs.
6
+ */
7
+ /**
8
+ * Sanitize text before displaying in a terminal.
9
+ *
10
+ * - Strips all ANSI/VT escape sequences to prevent terminal injection via
11
+ * malicious model responses (e.g. cursor repositioning, title bar spoofing).
12
+ * - Removes non-printable control characters except newlines.
13
+ *
14
+ * @param text Untrusted string from external source (model output, API data, etc.)
15
+ * @returns Safe string suitable for terminal display
16
+ */
17
+ export declare function sanitizeForTerminal(text: string): string;
18
+ /**
19
+ * Sanitize a file path to prevent path traversal attacks.
20
+ *
21
+ * Checks that the resolved path is strictly inside `baseDir`.
22
+ * Rejects:
23
+ * - Paths containing `..` segments that escape the base
24
+ * - Absolute paths outside `baseDir`
25
+ * - Null bytes
26
+ *
27
+ * @param inputPath Path provided by the user / untrusted source
28
+ * @param baseDir Absolute directory that the path must stay inside
29
+ * @returns Normalized absolute path if safe, or `null` if the path is unsafe
30
+ */
31
+ export declare function sanitizePath(inputPath: string, baseDir: string): string | null;
32
+ interface ShellSafetyResult {
33
+ safe: boolean;
34
+ reason?: string;
35
+ }
36
+ /**
37
+ * Evaluate whether a shell command string is safe to run.
38
+ *
39
+ * This is a best-effort heuristic for the `/run` feature and is NOT a sandbox.
40
+ * Dangerous patterns (rm -rf, sudo, chmod 777, curl | bash, etc.) are rejected.
41
+ *
42
+ * @param cmd Raw command string submitted by the user
43
+ * @returns `{ safe: true }` or `{ safe: false, reason: '...' }`
44
+ */
45
+ export declare function sanitizeShellCommand(cmd: string): ShellSafetyResult;
46
+ /**
47
+ * Redact sensitive values from a plain-text string before it reaches logs.
48
+ *
49
+ * Replaces patterns matching API keys, bearer tokens, passwords, and similar
50
+ * credential-shaped values with `[REDACTED]`.
51
+ *
52
+ * @param text Raw string that may contain secrets
53
+ * @returns String with sensitive values replaced
54
+ */
55
+ export declare function redactSensitive(text: string): string;
56
+ export {};
57
+ //# sourceMappingURL=sanitizer.d.ts.map
@@ -0,0 +1,174 @@
1
+ /**
2
+ * Output Sanitization Utilities
3
+ *
4
+ * Protects against terminal injection, path traversal, dangerous shell commands,
5
+ * and sensitive data leaking into logs.
6
+ */
7
+ import { resolve, normalize, relative, isAbsolute } from 'node:path';
8
+ // ─── Terminal sanitization ────────────────────────────────────────────────────
9
+ /**
10
+ * ANSI / VT escape sequence pattern.
11
+ *
12
+ * Handles:
13
+ * - CSI sequences: ESC [ <params> <final>
14
+ * - OSC sequences: ESC ] <text> BEL or ESC ] <text> ESC \
15
+ * - Two-char ESC sequences: ESC <single byte in 0x40-0x5F>
16
+ *
17
+ * Must be listed longest-match first (OSC before two-char) to avoid partial matches.
18
+ */
19
+ const ANSI_ESCAPE_RE = /\x1B(?:\][^\x07\x1B]*(?:\x07|\x1B\\)|\[[0-?]*[ -/]*[@-~]|[@-_])/g;
20
+ /**
21
+ * Additional terminal control characters that should not appear in display output.
22
+ * Excludes LF (\n) and CR (\r) which are legitimate line endings.
23
+ */
24
+ const CONTROL_CHARS_RE = /[\x00-\x08\x0B\x0C\x0E-\x1A\x1C-\x1F\x7F]/g;
25
+ /**
26
+ * Sanitize text before displaying in a terminal.
27
+ *
28
+ * - Strips all ANSI/VT escape sequences to prevent terminal injection via
29
+ * malicious model responses (e.g. cursor repositioning, title bar spoofing).
30
+ * - Removes non-printable control characters except newlines.
31
+ *
32
+ * @param text Untrusted string from external source (model output, API data, etc.)
33
+ * @returns Safe string suitable for terminal display
34
+ */
35
+ export function sanitizeForTerminal(text) {
36
+ if (!text)
37
+ return text;
38
+ return text
39
+ .replace(ANSI_ESCAPE_RE, '')
40
+ .replace(CONTROL_CHARS_RE, '');
41
+ }
42
+ // ─── Path sanitization ────────────────────────────────────────────────────────
43
+ /**
44
+ * Sanitize a file path to prevent path traversal attacks.
45
+ *
46
+ * Checks that the resolved path is strictly inside `baseDir`.
47
+ * Rejects:
48
+ * - Paths containing `..` segments that escape the base
49
+ * - Absolute paths outside `baseDir`
50
+ * - Null bytes
51
+ *
52
+ * @param inputPath Path provided by the user / untrusted source
53
+ * @param baseDir Absolute directory that the path must stay inside
54
+ * @returns Normalized absolute path if safe, or `null` if the path is unsafe
55
+ */
56
+ export function sanitizePath(inputPath, baseDir) {
57
+ if (!inputPath || typeof inputPath !== 'string')
58
+ return null;
59
+ // Reject null bytes
60
+ if (inputPath.includes('\x00'))
61
+ return null;
62
+ // Reject clearly absolute paths that start outside baseDir right away
63
+ // (resolve will handle this too, but this is a fast early-exit)
64
+ const normalizedBase = normalize(resolve(baseDir));
65
+ const resolvedInput = resolve(normalizedBase, inputPath);
66
+ const rel = relative(normalizedBase, resolvedInput);
67
+ // relative() returns something starting with '..' when outside base
68
+ if (rel.startsWith('..') || isAbsolute(rel))
69
+ return null;
70
+ return resolvedInput;
71
+ }
72
+ /**
73
+ * Patterns that indicate a dangerously destructive or privilege-escalating command.
74
+ * Order matters — first match wins and provides the clearest reason.
75
+ */
76
+ const DANGEROUS_PATTERNS = [
77
+ // Destructive filesystem
78
+ { pattern: /rm\s+(-[a-zA-Z]*f[a-zA-Z]*|-[a-zA-Z]*r[a-zA-Z]*f[a-zA-Z]*|--force|--recursive)/, reason: 'destructive rm flags detected' },
79
+ { pattern: /rm\s+-rf/, reason: 'rm -rf detected' },
80
+ { pattern: /:\s*\(\s*\)\s*\{.*\}/, reason: 'fork bomb pattern detected' },
81
+ // Privilege escalation
82
+ { pattern: /\bsudo\b/, reason: 'sudo is not allowed' },
83
+ { pattern: /\bsu\s+-/, reason: 'su command is not allowed' },
84
+ { pattern: /chmod\s+[0-7]*7[0-7][0-7]/, reason: 'chmod 777 / world-writable permission denied' },
85
+ { pattern: /chown\s+root/, reason: 'chown root is not allowed' },
86
+ // Remote code execution via pipe-to-shell
87
+ { pattern: /\|\s*(ba|z|da|fi|c)?sh\b/, reason: 'pipe to shell is not allowed' },
88
+ { pattern: /curl[^|]*\|/, reason: 'curl piped to shell is not allowed' },
89
+ { pattern: /wget[^|]*\|/, reason: 'wget piped to shell is not allowed' },
90
+ // Disk wipe / overwrite
91
+ { pattern: /\bdd\s+.*of=\/dev\/(sd|nvme|hd|disk)/, reason: 'dd write to block device is not allowed' },
92
+ { pattern: /mkfs\./, reason: 'filesystem format command is not allowed' },
93
+ // Environment manipulation that could bypass guards
94
+ { pattern: /\benv\s+-i\b/, reason: 'env -i clears environment and is not allowed' },
95
+ // Bypass via exec
96
+ { pattern: /\bexec\s+bash\b/, reason: 'exec bash shell replacement is not allowed' },
97
+ ];
98
+ /**
99
+ * Evaluate whether a shell command string is safe to run.
100
+ *
101
+ * This is a best-effort heuristic for the `/run` feature and is NOT a sandbox.
102
+ * Dangerous patterns (rm -rf, sudo, chmod 777, curl | bash, etc.) are rejected.
103
+ *
104
+ * @param cmd Raw command string submitted by the user
105
+ * @returns `{ safe: true }` or `{ safe: false, reason: '...' }`
106
+ */
107
+ export function sanitizeShellCommand(cmd) {
108
+ if (!cmd || typeof cmd !== 'string') {
109
+ return { safe: false, reason: 'empty or invalid command' };
110
+ }
111
+ const trimmed = cmd.trim();
112
+ if (trimmed.length === 0) {
113
+ return { safe: false, reason: 'empty command' };
114
+ }
115
+ // Null bytes in commands indicate injection attempts
116
+ if (trimmed.includes('\x00')) {
117
+ return { safe: false, reason: 'null byte in command' };
118
+ }
119
+ for (const { pattern, reason } of DANGEROUS_PATTERNS) {
120
+ if (pattern.test(trimmed)) {
121
+ return { safe: false, reason };
122
+ }
123
+ }
124
+ return { safe: true };
125
+ }
126
+ // ─── Sensitive value redaction ────────────────────────────────────────────────
127
+ /**
128
+ * Matches common API key / token / secret value patterns in plain text.
129
+ *
130
+ * Designed to catch values that appear in log lines such as:
131
+ * Authorization: Bearer sk-proj-abc123...
132
+ * token=ghp_abcXYZ
133
+ * password=s3cr3t
134
+ * OPENAI_API_KEY=sk-...
135
+ */
136
+ const SENSITIVE_PATTERNS = [
137
+ // Authorization header value
138
+ { pattern: /((?:Bearer|Basic|Token)\s+)[A-Za-z0-9\-._~+/]+=*/gi, replacement: '$1[REDACTED]' },
139
+ // API key prefixes (OpenAI sk-, Anthropic sk-ant-, etc.)
140
+ { pattern: /\b(sk-(?:ant-|proj-)?)[A-Za-z0-9\-_]{8,}/g, replacement: '$1[REDACTED]' },
141
+ // GitHub tokens
142
+ { pattern: /\b(gh[pousr]_)[A-Za-z0-9]{36,}/g, replacement: '$1[REDACTED]' },
143
+ // Generic "key-*" style tokens
144
+ { pattern: /\b(key-)[A-Za-z0-9\-_]{8,}/g, replacement: '$1[REDACTED]' },
145
+ // Query / form param assignments: token=, password=, api_key=, apikey=, secret=
146
+ {
147
+ pattern: /\b((?:token|password|passwd|api[_-]?key|secret|access[_-]?token|refresh[_-]?token|client[_-]?secret)=)[^\s&"']+/gi,
148
+ replacement: '$1[REDACTED]',
149
+ },
150
+ // JSON field values: "password": "...", "token": "..."
151
+ {
152
+ pattern: /"(password|token|secret|apiKey|api_key|accessToken|access_token|refreshToken|refresh_token|clientSecret|client_secret|authorization)"\s*:\s*"[^"]{4,}"/gi,
153
+ replacement: '"$1": "[REDACTED]"',
154
+ },
155
+ ];
156
+ /**
157
+ * Redact sensitive values from a plain-text string before it reaches logs.
158
+ *
159
+ * Replaces patterns matching API keys, bearer tokens, passwords, and similar
160
+ * credential-shaped values with `[REDACTED]`.
161
+ *
162
+ * @param text Raw string that may contain secrets
163
+ * @returns String with sensitive values replaced
164
+ */
165
+ export function redactSensitive(text) {
166
+ if (!text || typeof text !== 'string')
167
+ return text;
168
+ let result = text;
169
+ for (const { pattern, replacement } of SENSITIVE_PATTERNS) {
170
+ result = result.replace(pattern, replacement);
171
+ }
172
+ return result;
173
+ }
174
+ //# sourceMappingURL=sanitizer.js.map
@@ -1,17 +1,12 @@
1
1
  # Profiles:
2
2
  # (default) profclaw (pro mode) + redis
3
- # pico profclaw (pico mode) -- no redis, no UI
4
- # ai + ollama (free local AI)
5
- # tools + redis-commander
6
- # monitoring + prometheus + grafana
3
+ # ai + ollama (free local AI, optional)
7
4
  #
8
- # Quick start per mode:
9
- # docker compose up -d # pro (default)
10
- # docker compose up -d profclaw-pico # pico only (minimal)
11
- # docker compose --profile ai up -d # pro + ollama
5
+ # Quick start:
6
+ # docker compose up -d # pro mode (default)
7
+ # docker compose --profile ai up -d # pro + ollama
12
8
  #
13
- # NOTE: `docker compose --profile pico up -d` starts pico AND pro (port conflict).
14
- # Use `docker compose up -d profclaw-pico` for pico-only.
9
+ # Copy .env.example to .env and fill in your keys before starting.
15
10
 
16
11
  services:
17
12
  # ===================
@@ -24,40 +19,19 @@ services:
24
19
  container_name: profclaw
25
20
  ports:
26
21
  - "${PORT:-3000}:3000"
22
+ env_file:
23
+ - .env
27
24
  environment:
28
- # Core
25
+ # Core (override .env values for container-specific settings)
29
26
  - NODE_ENV=production
30
27
  - PORT=3000
31
28
  - PROFCLAW_MODE=pro
32
- # Redis
29
+ # Redis (points to the redis service in this compose network)
33
30
  - REDIS_URL=redis://redis:6379
34
- - PROFCLAW_REQUIRE_REDIS=true
35
- # Database
31
+ # Database (stored in the data volume)
36
32
  - DATABASE_URL=file:/app/data/profclaw.db
37
- # OpenClaw
38
- - OPENCLAW_BASE_URL=${OPENCLAW_BASE_URL:-http://host.docker.internal:18789}
39
- - OPENCLAW_GATEWAY_TOKEN=${OPENCLAW_GATEWAY_TOKEN}
40
- - OPENCLAW_WORKING_DIR=/workspace
41
- # GitHub
42
- - GITHUB_TOKEN=${GITHUB_TOKEN}
43
- - GITHUB_WEBHOOK_SECRET=${GITHUB_WEBHOOK_SECRET}
44
- - GITHUB_AI_TASK_LABEL=${GITHUB_AI_TASK_LABEL:-ai-task}
45
- # Task Queue
46
- - TASK_CONCURRENCY=${TASK_CONCURRENCY:-2}
47
- # AI Providers (optional)
48
- - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
49
- - OPENAI_API_KEY=${OPENAI_API_KEY}
50
- - AZURE_OPENAI_API_KEY=${AZURE_OPENAI_API_KEY}
51
- - AZURE_OPENAI_ENDPOINT=${AZURE_OPENAI_ENDPOINT}
52
- - GROQ_API_KEY=${GROQ_API_KEY}
53
- # Ollama (free local AI)
54
- - OLLAMA_BASE_URL=${OLLAMA_BASE_URL:-http://ollama:11434}
55
- # Tool Execution
56
- - POOL_MAX_CONCURRENT=${POOL_MAX_CONCURRENT:-50}
57
- - POOL_TIMEOUT_MS=${POOL_TIMEOUT_MS:-300000}
58
33
  volumes:
59
- - profclaw-data:/app/data
60
- - workspace:/workspace
34
+ - ./data:/app/data
61
35
  depends_on:
62
36
  redis:
63
37
  condition: service_healthy
@@ -72,38 +46,7 @@ services:
72
46
  - profclaw-network
73
47
 
74
48
  # ===================
75
- # profClaw Pico (minimal, no Redis)
76
- # ===================
77
- profclaw-pico:
78
- build:
79
- context: .
80
- dockerfile: Dockerfile.pico
81
- container_name: profclaw-pico
82
- ports:
83
- - "${PORT:-3000}:3000"
84
- environment:
85
- - NODE_ENV=production
86
- - PORT=3000
87
- - PROFCLAW_MODE=pico
88
- - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
89
- - OPENAI_API_KEY=${OPENAI_API_KEY}
90
- - OLLAMA_BASE_URL=${OLLAMA_BASE_URL:-http://host.docker.internal:11434}
91
- volumes:
92
- - profclaw-data:/app/data
93
- healthcheck:
94
- test: ["CMD", "curl", "-f", "http://localhost:3000/health"]
95
- interval: 30s
96
- timeout: 10s
97
- retries: 3
98
- start_period: 5s
99
- restart: unless-stopped
100
- profiles:
101
- - pico
102
- networks:
103
- - profclaw-network
104
-
105
- # ===================
106
- # Redis (Task Queue)
49
+ # Redis (Task Queue - required for pro mode)
107
50
  # ===================
108
51
  redis:
109
52
  image: redis:7-alpine
@@ -123,7 +66,7 @@ services:
123
66
  - profclaw-network
124
67
 
125
68
  # ===================
126
- # Ollama (Free Local AI)
69
+ # Ollama (Free Local AI - optional profile)
127
70
  # ===================
128
71
  ollama:
129
72
  image: ollama/ollama:latest
@@ -144,78 +87,11 @@ services:
144
87
  networks:
145
88
  - profclaw-network
146
89
 
147
- # ===================
148
- # Redis Commander (Dev Tools)
149
- # ===================
150
- redis-commander:
151
- image: rediscommander/redis-commander:latest
152
- container_name: profclaw-redis-ui
153
- environment:
154
- - REDIS_HOSTS=profclaw:redis:6379
155
- ports:
156
- - "${REDIS_COMMANDER_PORT:-8081}:8081"
157
- depends_on:
158
- redis:
159
- condition: service_healthy
160
- profiles:
161
- - tools
162
- networks:
163
- - profclaw-network
164
-
165
- # ===================
166
- # Prometheus (Metrics)
167
- # ===================
168
- prometheus:
169
- image: prom/prometheus:latest
170
- container_name: profclaw-prometheus
171
- ports:
172
- - "${PROMETHEUS_PORT:-9090}:9090"
173
- volumes:
174
- - ./docker/prometheus.yml:/etc/prometheus/prometheus.yml:ro
175
- - prometheus-data:/prometheus
176
- command:
177
- - '--config.file=/etc/prometheus/prometheus.yml'
178
- - '--storage.tsdb.path=/prometheus'
179
- - '--storage.tsdb.retention.time=15d'
180
- profiles:
181
- - monitoring
182
- networks:
183
- - profclaw-network
184
-
185
- # ===================
186
- # Grafana (Dashboards)
187
- # ===================
188
- grafana:
189
- image: grafana/grafana:latest
190
- container_name: profclaw-grafana
191
- ports:
192
- - "${GRAFANA_PORT:-3001}:3000"
193
- environment:
194
- - GF_SECURITY_ADMIN_PASSWORD=${GRAFANA_PASSWORD:-admin}
195
- - GF_USERS_ALLOW_SIGN_UP=false
196
- volumes:
197
- - grafana-data:/var/lib/grafana
198
- - ./docker/grafana/provisioning:/etc/grafana/provisioning:ro
199
- depends_on:
200
- - prometheus
201
- profiles:
202
- - monitoring
203
- networks:
204
- - profclaw-network
205
-
206
90
  volumes:
207
- profclaw-data:
208
- driver: local
209
91
  redis-data:
210
92
  driver: local
211
- workspace:
212
- driver: local
213
93
  ollama-data:
214
94
  driver: local
215
- prometheus-data:
216
- driver: local
217
- grafana-data:
218
- driver: local
219
95
 
220
96
  networks:
221
97
  profclaw-network:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "profclaw",
3
- "version": "2.0.0",
3
+ "version": "2.3.0",
4
4
  "description": "Smart, lightweight AI agent engine -- run locally on anything from a $10 board to a VPS",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -47,7 +47,8 @@
47
47
  "dev:api": "tsx watch src/server.ts",
48
48
  "dev:ui": "pnpm --dir ui dev",
49
49
  "kill:ports": "lsof -ti :3000 | xargs kill -9 2>/dev/null || true; lsof -ti :5173 | xargs kill -9 2>/dev/null || true",
50
- "build": "tsc && pnpm --dir ui build",
50
+ "build": "tsc --skipLibCheck && pnpm --dir ui build",
51
+ "build:backend": "tsc",
51
52
  "prepublishOnly": "pnpm build",
52
53
  "start": "node dist/server.js",
53
54
  "profclaw": "node profclaw.mjs",
@@ -104,11 +105,11 @@
104
105
  "@ai-sdk/azure": "^3.0.26",
105
106
  "@ai-sdk/google": "^3.0.20",
106
107
  "@ai-sdk/openai": "^3.0.25",
107
- "@hono/node-server": "^1.13.8",
108
+ "@hono/node-server": "^1.19.10",
108
109
  "@hono/zod-validator": "^0.4.3",
109
110
  "@inquirer/prompts": "^8.3.0",
110
111
  "@libsql/client": "^0.17.0",
111
- "@modelcontextprotocol/sdk": "^1.0.0",
112
+ "@modelcontextprotocol/sdk": "^1.26.0",
112
113
  "ai": "^6.0.68",
113
114
  "ai-sdk-ollama": "^3.3.0",
114
115
  "bullmq": "^5.34.8",
@@ -119,34 +120,58 @@
119
120
  "dockerode": "^4.0.9",
120
121
  "drizzle-orm": "^0.39.1",
121
122
  "figlet": "^1.8.0",
123
+ "glin-profanity": "^3.3.0",
122
124
  "glob": "^13.0.1",
123
- "hono": "^4.6.16",
125
+ "hono": "^4.12.7",
126
+ "ink": "^5.2.1",
127
+ "ink-select-input": "^6.2.0",
128
+ "ink-spinner": "^5.0.0",
129
+ "ink-table": "^3.0.0",
130
+ "ink-text-input": "^6.0.0",
124
131
  "ioredis": "^5.4.2",
125
132
  "js-yaml": "^4.1.1",
126
- "minimatch": "^10.1.2",
133
+ "minimatch": "^10.2.3",
127
134
  "node-pty": "^1.1.0",
128
135
  "openai": "^6.17.0",
129
136
  "ora": "^8.1.1",
130
137
  "playwright-core": "^1.58.1",
131
138
  "postgres": "^3.4.5",
132
139
  "proper-lockfile": "^4.1.2",
140
+ "react": "^18.3.1",
133
141
  "sqlite-vec": "0.1.7-alpha.2",
134
142
  "sqlite3": "^5.1.7",
135
143
  "zod": "^3.24.1",
136
144
  "zod-to-json-schema": "^3.25.1"
137
145
  },
146
+ "pnpm": {
147
+ "overrides": {
148
+ "tar": ">=7.5.11",
149
+ "minimatch": ">=10.2.3",
150
+ "rollup": ">=4.59.0",
151
+ "flatted": ">=3.4.2",
152
+ "esbuild": ">=0.25.0",
153
+ "prismjs": ">=1.30.0",
154
+ "markdown-it": ">=14.1.1",
155
+ "qs": ">=6.14.2",
156
+ "@types/react": "^19.2.5",
157
+ "@types/react-dom": "^19.2.3"
158
+ }
159
+ },
138
160
  "devDependencies": {
139
161
  "@types/dockerode": "^4.0.1",
140
162
  "@types/figlet": "^1.7.0",
141
163
  "@types/js-yaml": "^4.0.9",
142
164
  "@types/node": "^22.10.7",
143
165
  "@types/proper-lockfile": "^4.1.4",
166
+ "@types/react": "^19.2.5",
144
167
  "@types/sqlite3": "^5.1.0",
145
168
  "@vitest/coverage-v8": "^4.0.18",
146
169
  "@vitest/ui": "^4.0.18",
170
+ "ajv": "8.17.1",
147
171
  "concurrently": "^9.1.2",
148
172
  "drizzle-kit": "^0.30.2",
149
173
  "eslint": "^9.18.0",
174
+ "ink-testing-library": "^4.0.0",
150
175
  "tsx": "^4.19.2",
151
176
  "typescript": "^5.7.3",
152
177
  "typescript-eslint": "^8.54.0",
@@ -0,0 +1,62 @@
1
+ ---
2
+ name: deploy-cloudflare
3
+ description: |
4
+ Deploy applications to Cloudflare Workers/Pages. Handles wrangler setup,
5
+ configuration, and deployment. Returns the live URL.
6
+ user-invocable: true
7
+ metadata:
8
+ profclaw:
9
+ emoji: "☁️"
10
+ category: deployment
11
+ requires:
12
+ bins: ["wrangler"]
13
+ ---
14
+
15
+ # Deploy to Cloudflare
16
+
17
+ Deploy to Cloudflare Workers (APIs/functions) or Pages (static/SSR sites).
18
+
19
+ ## When to Use
20
+ - User asks to deploy to Cloudflare
21
+ - User wants edge/serverless deployment
22
+ - Project is a Hono/Express API, static site, or Next.js/Remix/Astro
23
+
24
+ ## Workers (API/Backend)
25
+
26
+ ### 1. Generate wrangler.toml
27
+ ```toml
28
+ name = "my-app"
29
+ main = "src/index.ts"
30
+ compatibility_date = "2024-01-01"
31
+
32
+ [vars]
33
+ ENVIRONMENT = "production"
34
+ ```
35
+
36
+ ### 2. Deploy
37
+ ```bash
38
+ exec command:"wrangler deploy"
39
+ ```
40
+
41
+ URL: `https://my-app.<account>.workers.dev`
42
+
43
+ ## Pages (Frontend/SSR)
44
+
45
+ ### 1. Build the project
46
+ ```bash
47
+ exec command:"pnpm build"
48
+ ```
49
+
50
+ ### 2. Deploy
51
+ ```bash
52
+ exec command:"wrangler pages deploy dist"
53
+ ```
54
+
55
+ URL: `https://my-app.pages.dev`
56
+
57
+ ## After Deploy
58
+ Tell the user:
59
+ 1. The live URL (*.workers.dev or *.pages.dev)
60
+ 2. Custom domain: `wrangler pages domains add my-app example.com`
61
+ 3. Logs: `wrangler tail` (real-time)
62
+ 4. Env vars: `wrangler secret put API_KEY`