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,353 @@
1
+ /**
2
+ * Code Tools
3
+ *
4
+ * Development workflow tools: lint, typecheck, build, format, dependency audit.
5
+ * These complement the existing file-ops, git, and exec tools to enable
6
+ * full coding agent workflows.
7
+ */
8
+ import { z } from 'zod';
9
+ import { spawn } from 'node:child_process';
10
+ import { existsSync, readFileSync } from 'node:fs';
11
+ import { resolve, join } from 'node:path';
12
+ // Helper: run a command and capture output
13
+ async function runCommand(cmd, args, options = {}) {
14
+ const timeout = options.timeout || 60000;
15
+ const maxOutput = options.maxOutput || 200000;
16
+ return new Promise((resolve) => {
17
+ const proc = spawn(cmd, args, {
18
+ cwd: options.cwd || process.cwd(),
19
+ shell: false,
20
+ timeout,
21
+ env: { ...process.env, FORCE_COLOR: '0', NO_COLOR: '1' },
22
+ });
23
+ let stdout = '';
24
+ let stderr = '';
25
+ proc.stdout?.on('data', (chunk) => {
26
+ if (stdout.length < maxOutput)
27
+ stdout += chunk.toString();
28
+ });
29
+ proc.stderr?.on('data', (chunk) => {
30
+ if (stderr.length < maxOutput)
31
+ stderr += chunk.toString();
32
+ });
33
+ proc.on('close', (code) => {
34
+ resolve({ code: code ?? 1, stdout, stderr });
35
+ });
36
+ proc.on('error', (err) => {
37
+ resolve({ code: 1, stdout, stderr: err.message });
38
+ });
39
+ });
40
+ }
41
+ // Detect package manager
42
+ function detectPackageManager(cwd) {
43
+ if (existsSync(join(cwd, 'pnpm-lock.yaml')))
44
+ return 'pnpm';
45
+ if (existsSync(join(cwd, 'yarn.lock')))
46
+ return 'yarn';
47
+ if (existsSync(join(cwd, 'bun.lockb')))
48
+ return 'bun';
49
+ return 'npm';
50
+ }
51
+ function detectProject(cwd) {
52
+ const pkgPath = join(cwd, 'package.json');
53
+ const info = {
54
+ hasTypeScript: existsSync(join(cwd, 'tsconfig.json')),
55
+ hasEslint: existsSync(join(cwd, '.eslintrc.json')) || existsSync(join(cwd, '.eslintrc.js')) || existsSync(join(cwd, 'eslint.config.js')) || existsSync(join(cwd, 'eslint.config.mjs')),
56
+ hasPrettier: existsSync(join(cwd, '.prettierrc')) || existsSync(join(cwd, '.prettierrc.json')) || existsSync(join(cwd, 'prettier.config.js')),
57
+ hasBiome: existsSync(join(cwd, 'biome.json')),
58
+ scripts: {},
59
+ packageManager: detectPackageManager(cwd),
60
+ };
61
+ try {
62
+ if (existsSync(pkgPath)) {
63
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
64
+ info.scripts = (pkg.scripts || {});
65
+ const deps = { ...(pkg.dependencies || {}), ...(pkg.devDependencies || {}) };
66
+ if (deps.typescript)
67
+ info.hasTypeScript = true;
68
+ if (deps.eslint)
69
+ info.hasEslint = true;
70
+ if (deps.prettier)
71
+ info.hasPrettier = true;
72
+ if (deps['@biomejs/biome'])
73
+ info.hasBiome = true;
74
+ }
75
+ }
76
+ catch { /* empty */ }
77
+ return info;
78
+ }
79
+ // === TypeCheck Tool ===
80
+ const TypeCheckParams = z.object({
81
+ path: z.string().optional().describe('Specific file or directory to check. Defaults to project root.'),
82
+ });
83
+ export const typeCheckTool = {
84
+ name: 'typecheck',
85
+ description: 'Run TypeScript type checking (tsc --noEmit). Reports type errors without compiling. Use after editing TypeScript files.',
86
+ category: 'execution',
87
+ parameters: TypeCheckParams,
88
+ securityLevel: 'safe',
89
+ async execute(context, params) {
90
+ const cwd = params.path ? resolve(context.workdir, params.path) : context.workdir;
91
+ const project = detectProject(cwd);
92
+ if (!project.hasTypeScript) {
93
+ return { success: true, output: 'No tsconfig.json found - not a TypeScript project.' };
94
+ }
95
+ const result = await runCommand('npx', ['tsc', '--noEmit', '--pretty'], { cwd, timeout: 120000 });
96
+ const errors = result.stdout.split('\n').filter((l) => l.includes('error TS')).length;
97
+ if (result.code === 0) {
98
+ return { success: true, output: 'Type check passed - no errors.' };
99
+ }
100
+ return {
101
+ success: false,
102
+ output: `${errors} type error(s) found:\n\n${result.stdout.slice(0, 5000)}`,
103
+ error: { code: 'TYPE_ERRORS', message: `${errors} type error(s)` },
104
+ };
105
+ },
106
+ };
107
+ // === Lint Tool ===
108
+ const LintParams = z.object({
109
+ path: z.string().optional().describe('File or directory to lint. Defaults to project root.'),
110
+ fix: z.boolean().optional().describe('Auto-fix fixable issues.'),
111
+ });
112
+ export const lintTool = {
113
+ name: 'lint',
114
+ description: 'Run linter (ESLint, Biome, or project lint script). Detects the linter automatically. Use --fix to auto-fix.',
115
+ category: 'execution',
116
+ parameters: LintParams,
117
+ securityLevel: 'safe',
118
+ async execute(context, params) {
119
+ const cwd = context.workdir;
120
+ const project = detectProject(cwd);
121
+ const target = params.path || '.';
122
+ const fixFlag = params.fix ? '--fix' : '';
123
+ // Try project lint script first
124
+ if (project.scripts.lint) {
125
+ const pm = project.packageManager;
126
+ const result = await runCommand(pm, ['run', 'lint', ...(fixFlag ? ['--', fixFlag] : [])], { cwd, timeout: 120000 });
127
+ if (result.code === 0) {
128
+ return { success: true, output: 'Lint passed - no issues.' };
129
+ }
130
+ return {
131
+ success: false,
132
+ output: `Lint issues:\n\n${(result.stdout + result.stderr).slice(0, 5000)}`,
133
+ error: { code: 'LINT_ERRORS', message: 'Lint found issues' },
134
+ };
135
+ }
136
+ // Try Biome
137
+ if (project.hasBiome) {
138
+ const args = params.fix ? ['check', '--write', target] : ['check', target];
139
+ const result = await runCommand('npx', ['@biomejs/biome', ...args], { cwd });
140
+ if (result.code === 0) {
141
+ return { success: true, output: 'Biome check passed.' };
142
+ }
143
+ return {
144
+ success: false,
145
+ output: `Biome issues:\n\n${(result.stdout + result.stderr).slice(0, 5000)}`,
146
+ error: { code: 'LINT_ERRORS', message: 'Biome found issues' },
147
+ };
148
+ }
149
+ // Try ESLint
150
+ if (project.hasEslint) {
151
+ const args = [target, '--format', 'stylish', ...(fixFlag ? [fixFlag] : [])];
152
+ const result = await runCommand('npx', ['eslint', ...args], { cwd });
153
+ if (result.code === 0) {
154
+ return { success: true, output: 'ESLint passed - no issues.' };
155
+ }
156
+ return {
157
+ success: false,
158
+ output: `ESLint issues:\n\n${(result.stdout + result.stderr).slice(0, 5000)}`,
159
+ error: { code: 'LINT_ERRORS', message: 'ESLint found issues' },
160
+ };
161
+ }
162
+ return { success: true, output: 'No linter configured (eslint, biome, or lint script).' };
163
+ },
164
+ };
165
+ // === Build Tool ===
166
+ const BuildParams = z.object({
167
+ script: z.string().optional().describe('Build script name to run. Defaults to "build".'),
168
+ });
169
+ export const buildTool = {
170
+ name: 'build',
171
+ description: 'Run the project build command. Auto-detects package manager and build script.',
172
+ category: 'execution',
173
+ parameters: BuildParams,
174
+ securityLevel: 'moderate',
175
+ async execute(context, params) {
176
+ const cwd = context.workdir;
177
+ const project = detectProject(cwd);
178
+ const scriptName = params.script || 'build';
179
+ if (!project.scripts[scriptName]) {
180
+ return {
181
+ success: false,
182
+ output: `No "${scriptName}" script found in package.json. Available scripts: ${Object.keys(project.scripts).join(', ')}`,
183
+ error: { code: 'NO_BUILD_SCRIPT', message: `Script "${scriptName}" not found` },
184
+ };
185
+ }
186
+ const pm = project.packageManager;
187
+ const result = await runCommand(pm, ['run', scriptName], { cwd, timeout: 300000 });
188
+ if (result.code === 0) {
189
+ return { success: true, output: `Build succeeded.\n${result.stdout.slice(-500)}` };
190
+ }
191
+ return {
192
+ success: false,
193
+ output: `Build failed:\n\n${(result.stdout + result.stderr).slice(0, 5000)}`,
194
+ error: { code: 'BUILD_FAILED', message: 'Build failed' },
195
+ };
196
+ },
197
+ };
198
+ // === Format Tool ===
199
+ const FormatParams = z.object({
200
+ path: z.string().optional().describe('File or directory to format. Defaults to current changes.'),
201
+ });
202
+ export const formatTool = {
203
+ name: 'format',
204
+ description: 'Auto-format code using Prettier, Biome, or project format script.',
205
+ category: 'execution',
206
+ parameters: FormatParams,
207
+ securityLevel: 'moderate',
208
+ async execute(context, params) {
209
+ const cwd = context.workdir;
210
+ const project = detectProject(cwd);
211
+ const target = params.path || '.';
212
+ if (project.scripts.format) {
213
+ const result = await runCommand(project.packageManager, ['run', 'format'], { cwd });
214
+ return {
215
+ success: result.code === 0,
216
+ output: result.code === 0 ? 'Formatted.' : `Format failed:\n${(result.stdout + result.stderr).slice(0, 2000)}`,
217
+ };
218
+ }
219
+ if (project.hasBiome) {
220
+ const result = await runCommand('npx', ['@biomejs/biome', 'format', '--write', target], { cwd });
221
+ return { success: result.code === 0, output: result.code === 0 ? 'Biome formatted.' : `Biome format failed:\n${result.stderr.slice(0, 2000)}` };
222
+ }
223
+ if (project.hasPrettier) {
224
+ const result = await runCommand('npx', ['prettier', '--write', target], { cwd });
225
+ return { success: result.code === 0, output: result.code === 0 ? 'Prettier formatted.' : `Prettier failed:\n${result.stderr.slice(0, 2000)}` };
226
+ }
227
+ return { success: true, output: 'No formatter configured (prettier, biome, or format script).' };
228
+ },
229
+ };
230
+ // === Project Info Tool ===
231
+ const ProjectInfoParams = z.object({});
232
+ export const projectInfoTool = {
233
+ name: 'project_info',
234
+ description: 'Detect project type, dependencies, scripts, and tooling. Use to understand the codebase before making changes.',
235
+ category: 'execution',
236
+ parameters: ProjectInfoParams,
237
+ securityLevel: 'safe',
238
+ async execute(context) {
239
+ const cwd = context.workdir;
240
+ const project = detectProject(cwd);
241
+ const lines = [];
242
+ lines.push(`Package manager: ${project.packageManager}`);
243
+ lines.push(`TypeScript: ${project.hasTypeScript ? 'yes' : 'no'}`);
244
+ lines.push(`Linter: ${project.hasBiome ? 'Biome' : project.hasEslint ? 'ESLint' : 'none'}`);
245
+ lines.push(`Formatter: ${project.hasBiome ? 'Biome' : project.hasPrettier ? 'Prettier' : 'none'}`);
246
+ if (Object.keys(project.scripts).length > 0) {
247
+ lines.push('');
248
+ lines.push('Scripts:');
249
+ for (const [name, cmd] of Object.entries(project.scripts)) {
250
+ lines.push(` ${name}: ${cmd.slice(0, 80)}`);
251
+ }
252
+ }
253
+ // Check for common config files
254
+ const configs = [];
255
+ const configFiles = [
256
+ 'tsconfig.json', 'package.json', '.eslintrc.json', 'eslint.config.js',
257
+ 'biome.json', '.prettierrc', 'vitest.config.ts', 'jest.config.ts',
258
+ 'Dockerfile', 'docker-compose.yml', '.github/workflows',
259
+ 'CLAUDE.md', 'AGENTS.md', 'README.md',
260
+ ];
261
+ for (const f of configFiles) {
262
+ if (existsSync(join(cwd, f)))
263
+ configs.push(f);
264
+ }
265
+ if (configs.length > 0) {
266
+ lines.push('');
267
+ lines.push(`Config files: ${configs.join(', ')}`);
268
+ }
269
+ return {
270
+ success: true,
271
+ output: lines.join('\n'),
272
+ data: project,
273
+ };
274
+ },
275
+ };
276
+ // === Create PR Tool ===
277
+ const CreatePrParams = z.object({
278
+ title: z.string().describe('PR title'),
279
+ body: z.string().optional().describe('PR description/body'),
280
+ base: z.string().optional().describe('Base branch (default: main)'),
281
+ draft: z.boolean().optional().describe('Create as draft PR'),
282
+ });
283
+ export const createPrTool = {
284
+ name: 'create_pr',
285
+ description: 'Create a GitHub Pull Request from the current branch. Requires gh CLI authenticated.',
286
+ category: 'execution',
287
+ parameters: CreatePrParams,
288
+ securityLevel: 'moderate',
289
+ requiresApproval: true,
290
+ async execute(context, params) {
291
+ const cwd = context.workdir;
292
+ // Check gh is available
293
+ const ghCheck = await runCommand('gh', ['auth', 'status'], { cwd, timeout: 5000 });
294
+ if (ghCheck.code !== 0) {
295
+ return {
296
+ success: false,
297
+ output: 'GitHub CLI (gh) is not installed or not authenticated. Run: gh auth login',
298
+ error: { code: 'GH_NOT_CONFIGURED', message: 'gh CLI not available' },
299
+ };
300
+ }
301
+ // Get current branch
302
+ const branchResult = await runCommand('git', ['branch', '--show-current'], { cwd });
303
+ const branch = branchResult.stdout.trim();
304
+ if (!branch || branch === 'main' || branch === 'master') {
305
+ return {
306
+ success: false,
307
+ output: `Cannot create PR from ${branch || 'detached HEAD'}. Create a feature branch first.`,
308
+ error: { code: 'WRONG_BRANCH', message: 'Cannot PR from main/master' },
309
+ };
310
+ }
311
+ // Push branch
312
+ const pushResult = await runCommand('git', ['push', '-u', 'origin', branch], { cwd, timeout: 30000 });
313
+ if (pushResult.code !== 0 && !pushResult.stderr.includes('Everything up-to-date')) {
314
+ return {
315
+ success: false,
316
+ output: `Failed to push branch: ${pushResult.stderr.slice(0, 500)}`,
317
+ error: { code: 'PUSH_FAILED', message: 'git push failed' },
318
+ };
319
+ }
320
+ // Create PR
321
+ const prArgs = ['pr', 'create', '--title', params.title];
322
+ if (params.body)
323
+ prArgs.push('--body', params.body);
324
+ if (params.base)
325
+ prArgs.push('--base', params.base);
326
+ if (params.draft)
327
+ prArgs.push('--draft');
328
+ const prResult = await runCommand('gh', prArgs, { cwd, timeout: 15000 });
329
+ if (prResult.code === 0) {
330
+ const prUrl = prResult.stdout.trim();
331
+ return {
332
+ success: true,
333
+ output: `PR created: ${prUrl}`,
334
+ data: { url: prUrl, branch, title: params.title },
335
+ };
336
+ }
337
+ return {
338
+ success: false,
339
+ output: `Failed to create PR: ${(prResult.stdout + prResult.stderr).slice(0, 1000)}`,
340
+ error: { code: 'PR_CREATE_FAILED', message: 'gh pr create failed' },
341
+ };
342
+ },
343
+ };
344
+ // Export all
345
+ export const codeTools = [
346
+ typeCheckTool,
347
+ lintTool,
348
+ buildTool,
349
+ formatTool,
350
+ projectInfoTool,
351
+ createPrTool,
352
+ ];
353
+ //# sourceMappingURL=code-tools.js.map
@@ -27,7 +27,7 @@ declare const CompleteTaskParamsSchema: z.ZodObject<{
27
27
  nextSteps: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
28
28
  confidence: z.ZodDefault<z.ZodEnum<["high", "medium", "low"]>>;
29
29
  }, "strip", z.ZodTypeAny, {
30
- confidence: "medium" | "high" | "low";
30
+ confidence: "medium" | "low" | "high";
31
31
  summary: string;
32
32
  artifacts?: {
33
33
  type: "commit" | "file" | "comment" | "other" | "ticket" | "pr" | "project";
@@ -38,7 +38,7 @@ declare const CompleteTaskParamsSchema: z.ZodObject<{
38
38
  nextSteps?: string[] | undefined;
39
39
  }, {
40
40
  summary: string;
41
- confidence?: "medium" | "high" | "low" | undefined;
41
+ confidence?: "medium" | "low" | "high" | undefined;
42
42
  artifacts?: {
43
43
  type: "commit" | "file" | "comment" | "other" | "ticket" | "pr" | "project";
44
44
  id: string;
@@ -14,7 +14,7 @@ declare const CronCreateParamsSchema: z.ZodObject<{
14
14
  description: z.ZodOptional<z.ZodString>;
15
15
  cron: z.ZodOptional<z.ZodString>;
16
16
  interval: z.ZodOptional<z.ZodNumber>;
17
- type: z.ZodDefault<z.ZodEnum<["http", "tool", "script"]>>;
17
+ type: z.ZodDefault<z.ZodEnum<["http", "tool", "script", "agent_session"]>>;
18
18
  url: z.ZodOptional<z.ZodString>;
19
19
  method: z.ZodOptional<z.ZodEnum<["GET", "POST", "PUT", "DELETE"]>>;
20
20
  headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
@@ -24,42 +24,54 @@ declare const CronCreateParamsSchema: z.ZodObject<{
24
24
  command: z.ZodOptional<z.ZodString>;
25
25
  args: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
26
26
  workdir: z.ZodOptional<z.ZodString>;
27
+ prompt: z.ZodOptional<z.ZodString>;
28
+ model: z.ZodOptional<z.ZodString>;
29
+ effort: z.ZodOptional<z.ZodEnum<["low", "medium", "high"]>>;
30
+ deliverTo: z.ZodOptional<z.ZodString>;
27
31
  maxRuns: z.ZodOptional<z.ZodNumber>;
28
32
  maxFailures: z.ZodOptional<z.ZodNumber>;
29
33
  }, "strip", z.ZodTypeAny, {
30
34
  name: string;
31
- type: "tool" | "script" | "http";
35
+ type: "tool" | "script" | "http" | "agent_session";
32
36
  description?: string | undefined;
37
+ prompt?: string | undefined;
33
38
  url?: string | undefined;
39
+ model?: string | undefined;
34
40
  maxRuns?: number | undefined;
35
41
  maxFailures?: number | undefined;
36
42
  args?: string[] | undefined;
37
43
  method?: "GET" | "POST" | "PUT" | "DELETE" | undefined;
38
44
  cron?: string | undefined;
39
45
  body?: unknown;
40
- command?: string | undefined;
41
- headers?: Record<string, string> | undefined;
42
46
  tool?: string | undefined;
47
+ command?: string | undefined;
48
+ effort?: "medium" | "low" | "high" | undefined;
43
49
  workdir?: string | undefined;
50
+ headers?: Record<string, string> | undefined;
44
51
  interval?: number | undefined;
45
52
  toolParams?: Record<string, unknown> | undefined;
53
+ deliverTo?: string | undefined;
46
54
  }, {
47
55
  name: string;
48
56
  description?: string | undefined;
49
- type?: "tool" | "script" | "http" | undefined;
57
+ prompt?: string | undefined;
58
+ type?: "tool" | "script" | "http" | "agent_session" | undefined;
50
59
  url?: string | undefined;
60
+ model?: string | undefined;
51
61
  maxRuns?: number | undefined;
52
62
  maxFailures?: number | undefined;
53
63
  args?: string[] | undefined;
54
64
  method?: "GET" | "POST" | "PUT" | "DELETE" | undefined;
55
65
  cron?: string | undefined;
56
66
  body?: unknown;
57
- command?: string | undefined;
58
- headers?: Record<string, string> | undefined;
59
67
  tool?: string | undefined;
68
+ command?: string | undefined;
69
+ effort?: "medium" | "low" | "high" | undefined;
60
70
  workdir?: string | undefined;
71
+ headers?: Record<string, string> | undefined;
61
72
  interval?: number | undefined;
62
73
  toolParams?: Record<string, unknown> | undefined;
74
+ deliverTo?: string | undefined;
63
75
  }>;
64
76
  export type CronCreateParams = z.infer<typeof CronCreateParamsSchema>;
65
77
  export interface CronCreateResult {
@@ -167,21 +179,25 @@ export interface CronHistoryResult {
167
179
  export declare const cronHistoryTool: ToolDefinition<CronHistoryParams, CronHistoryResult>;
168
180
  export declare const cronTools: (ToolDefinition<{
169
181
  name: string;
170
- type: "tool" | "script" | "http";
182
+ type: "tool" | "script" | "http" | "agent_session";
171
183
  description?: string | undefined;
184
+ prompt?: string | undefined;
172
185
  url?: string | undefined;
186
+ model?: string | undefined;
173
187
  maxRuns?: number | undefined;
174
188
  maxFailures?: number | undefined;
175
189
  args?: string[] | undefined;
176
190
  method?: "GET" | "POST" | "PUT" | "DELETE" | undefined;
177
191
  cron?: string | undefined;
178
192
  body?: unknown;
179
- command?: string | undefined;
180
- headers?: Record<string, string> | undefined;
181
193
  tool?: string | undefined;
194
+ command?: string | undefined;
195
+ effort?: "medium" | "low" | "high" | undefined;
182
196
  workdir?: string | undefined;
197
+ headers?: Record<string, string> | undefined;
183
198
  interval?: number | undefined;
184
199
  toolParams?: Record<string, unknown> | undefined;
200
+ deliverTo?: string | undefined;
185
201
  }, CronCreateResult> | ToolDefinition<{
186
202
  limit: number;
187
203
  type?: "message" | "tool" | "script" | "http" | undefined;
@@ -18,8 +18,8 @@ const CronCreateParamsSchema = z.object({
18
18
  .describe('Cron expression (e.g., "*/5 * * * *" for every 5 minutes, "0 9 * * 1-5" for 9am weekdays)'),
19
19
  interval: z.number().min(1000).optional()
20
20
  .describe('Alternative: interval in milliseconds (minimum 1000ms = 1 second)'),
21
- type: z.enum(['http', 'tool', 'script']).default('http')
22
- .describe('Job type: http (webhook), tool (execute a tool), script (run command)'),
21
+ type: z.enum(['http', 'tool', 'script', 'agent_session']).default('http')
22
+ .describe('Job type: http (webhook), tool (execute a tool), script (run command), agent_session (run AI agent with prompt)'),
23
23
  url: z.string().url().optional()
24
24
  .describe('For HTTP jobs: URL to call'),
25
25
  method: z.enum(['GET', 'POST', 'PUT', 'DELETE']).optional()
@@ -37,7 +37,17 @@ const CronCreateParamsSchema = z.object({
37
37
  args: z.array(z.string()).optional()
38
38
  .describe('For script jobs: Command arguments'),
39
39
  workdir: z.string().optional()
40
- .describe('For script jobs: Working directory'),
40
+ .describe('For script/agent_session jobs: Working directory'),
41
+ // Agent session params
42
+ prompt: z.string().optional()
43
+ .describe('For agent_session jobs: The prompt/instruction for the AI agent to execute'),
44
+ model: z.string().optional()
45
+ .describe('For agent_session jobs: AI model to use (e.g., sonnet, opus)'),
46
+ effort: z.enum(['low', 'medium', 'high']).optional()
47
+ .describe('For agent_session jobs: Thinking effort level'),
48
+ // Delivery
49
+ deliverTo: z.string().optional()
50
+ .describe('Deliver results to this target (e.g., "telegram:<chat_id>" or "slack:#channel")'),
41
51
  maxRuns: z.number().min(1).optional()
42
52
  .describe('Stop job after this many runs'),
43
53
  maxFailures: z.number().min(1).optional()
@@ -149,6 +159,40 @@ Or use \`interval\` for fixed millisecond intervals.`,
149
159
  workdir: params.workdir || context.workdir,
150
160
  };
151
161
  break;
162
+ case 'agent_session':
163
+ if (!params.prompt) {
164
+ return {
165
+ success: false,
166
+ error: {
167
+ code: 'MISSING_PROMPT',
168
+ message: 'Agent session jobs require a prompt parameter',
169
+ },
170
+ };
171
+ }
172
+ payload = {
173
+ prompt: params.prompt,
174
+ model: params.model,
175
+ effort: params.effort || 'medium',
176
+ workdir: params.workdir || context.workdir,
177
+ };
178
+ break;
179
+ }
180
+ // Parse delivery target (format: "telegram:chatId" or "slack:#channel")
181
+ let delivery;
182
+ if (params.deliverTo) {
183
+ const [channelType, ...targetParts] = params.deliverTo.split(':');
184
+ const target = targetParts.join(':');
185
+ const validTypes = ['slack', 'webhook', 'email', 'telegram', 'discord'];
186
+ if (channelType && target && validTypes.includes(channelType)) {
187
+ delivery = {
188
+ channels: [{
189
+ type: channelType,
190
+ target,
191
+ onSuccess: true,
192
+ onFailure: true,
193
+ }],
194
+ };
195
+ }
152
196
  }
153
197
  const job = await createScheduledJob({
154
198
  name: params.name,
@@ -157,6 +201,7 @@ Or use \`interval\` for fixed millisecond intervals.`,
157
201
  intervalMs: params.interval,
158
202
  jobType: params.type,
159
203
  payload,
204
+ delivery,
160
205
  createdBy: 'ai',
161
206
  maxRuns: params.maxRuns,
162
207
  maxFailures: params.maxFailures,
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Decompose Task Tool
3
+ *
4
+ * Splits a large task into smaller, independently-executable subtasks and
5
+ * persists the plan to .profclaw/plans/ so it can be resumed across multiple
6
+ * profClaw sessions.
7
+ */
8
+ import { z } from 'zod';
9
+ import type { ToolDefinition } from '../types.js';
10
+ declare const DecomposeTaskParamsSchema: z.ZodObject<{
11
+ originalTask: z.ZodString;
12
+ subtasks: z.ZodArray<z.ZodObject<{
13
+ description: z.ZodString;
14
+ estimatedSteps: z.ZodNumber;
15
+ files: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
16
+ dependencies: z.ZodOptional<z.ZodArray<z.ZodNumber, "many">>;
17
+ }, "strip", z.ZodTypeAny, {
18
+ description: string;
19
+ estimatedSteps: number;
20
+ files?: string[] | undefined;
21
+ dependencies?: number[] | undefined;
22
+ }, {
23
+ description: string;
24
+ estimatedSteps: number;
25
+ files?: string[] | undefined;
26
+ dependencies?: number[] | undefined;
27
+ }>, "many">;
28
+ currentProgress: z.ZodOptional<z.ZodString>;
29
+ }, "strip", z.ZodTypeAny, {
30
+ subtasks: {
31
+ description: string;
32
+ estimatedSteps: number;
33
+ files?: string[] | undefined;
34
+ dependencies?: number[] | undefined;
35
+ }[];
36
+ originalTask: string;
37
+ currentProgress?: string | undefined;
38
+ }, {
39
+ subtasks: {
40
+ description: string;
41
+ estimatedSteps: number;
42
+ files?: string[] | undefined;
43
+ dependencies?: number[] | undefined;
44
+ }[];
45
+ originalTask: string;
46
+ currentProgress?: string | undefined;
47
+ }>;
48
+ export type DecomposeTaskParams = z.infer<typeof DecomposeTaskParamsSchema>;
49
+ interface DecomposeTaskResult {
50
+ planId: string;
51
+ planFile: string;
52
+ subtaskCount: number;
53
+ resumeCommand: string;
54
+ summary: string;
55
+ }
56
+ export declare const decomposeTaskTool: ToolDefinition<DecomposeTaskParams, DecomposeTaskResult>;
57
+ export default decomposeTaskTool;
58
+ //# sourceMappingURL=decompose-task.d.ts.map