profclaw 2.0.0 → 2.4.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 (519) hide show
  1. package/.env.example +14 -2
  2. package/CHANGELOG.md +52 -0
  3. package/CONTRIBUTING.md +20 -0
  4. package/Dockerfile +39 -23
  5. package/README.md +178 -41
  6. package/config/pricing.yml +26 -2
  7. package/dist/agents/agent-summary.d.ts +44 -0
  8. package/dist/agents/agent-summary.js +176 -0
  9. package/dist/agents/auto-memory.d.ts +59 -0
  10. package/dist/agents/auto-memory.js +310 -0
  11. package/dist/agents/checkpoint-manager.d.ts +76 -0
  12. package/dist/agents/checkpoint-manager.js +156 -0
  13. package/dist/agents/circuit-breaker.d.ts +54 -0
  14. package/dist/agents/circuit-breaker.js +153 -0
  15. package/dist/agents/command-sandbox.d.ts +93 -0
  16. package/dist/agents/command-sandbox.js +235 -0
  17. package/dist/agents/context-compactor.d.ts +70 -0
  18. package/dist/agents/context-compactor.js +361 -0
  19. package/dist/agents/conversation-branch.d.ts +55 -0
  20. package/dist/agents/conversation-branch.js +115 -0
  21. package/dist/agents/error-recovery.d.ts +44 -0
  22. package/dist/agents/error-recovery.js +197 -0
  23. package/dist/agents/events.d.ts +76 -0
  24. package/dist/agents/events.js +8 -0
  25. package/dist/agents/executor-runner.d.ts +135 -0
  26. package/dist/agents/executor-runner.js +303 -0
  27. package/dist/agents/executor.d.ts +37 -1
  28. package/dist/agents/executor.js +606 -124
  29. package/dist/agents/file-snapshots.d.ts +72 -0
  30. package/dist/agents/file-snapshots.js +182 -0
  31. package/dist/agents/index.d.ts +2 -0
  32. package/dist/agents/orchestrator.d.ts +183 -0
  33. package/dist/agents/orchestrator.js +495 -0
  34. package/dist/agents/output-truncator.d.ts +59 -0
  35. package/dist/agents/output-truncator.js +128 -0
  36. package/dist/agents/permissions.d.ts +63 -0
  37. package/dist/agents/permissions.js +138 -0
  38. package/dist/agents/plan-mode.d.ts +71 -0
  39. package/dist/agents/plan-mode.js +186 -0
  40. package/dist/agents/prompt-suggestions.d.ts +33 -0
  41. package/dist/agents/prompt-suggestions.js +208 -0
  42. package/dist/agents/rate-limit-monitor.d.ts +56 -0
  43. package/dist/agents/rate-limit-monitor.js +224 -0
  44. package/dist/agents/receipt/receipt-cli.d.ts +43 -0
  45. package/dist/agents/receipt/receipt-cli.js +82 -0
  46. package/dist/agents/receipt/receipt-types.d.ts +136 -0
  47. package/dist/agents/receipt/receipt-types.js +19 -0
  48. package/dist/agents/receipt/receipt-verify.d.ts +19 -0
  49. package/dist/agents/receipt/receipt-verify.js +176 -0
  50. package/dist/agents/receipt/receipt-view.d.ts +29 -0
  51. package/dist/agents/receipt/receipt-view.js +227 -0
  52. package/dist/agents/receipt/receipt-writer.d.ts +47 -0
  53. package/dist/agents/receipt/receipt-writer.js +186 -0
  54. package/dist/agents/result-store.d.ts +43 -0
  55. package/dist/agents/result-store.js +145 -0
  56. package/dist/agents/session-diff.d.ts +49 -0
  57. package/dist/agents/session-diff.js +249 -0
  58. package/dist/agents/tool-loader.d.ts +65 -0
  59. package/dist/agents/tool-loader.js +273 -0
  60. package/dist/agents/tool-selector.d.ts +123 -0
  61. package/dist/agents/tool-selector.js +321 -0
  62. package/dist/agents/transcript.d.ts +96 -0
  63. package/dist/agents/transcript.js +267 -0
  64. package/dist/agents/verified-run-git.d.ts +49 -0
  65. package/dist/agents/verified-run-git.js +82 -0
  66. package/dist/agents/verified-run.d.ts +149 -0
  67. package/dist/agents/verified-run.js +402 -0
  68. package/dist/agents/verifier.d.ts +64 -0
  69. package/dist/agents/verifier.js +186 -0
  70. package/dist/agents/worktree-manager.d.ts +80 -0
  71. package/dist/agents/worktree-manager.js +203 -0
  72. package/dist/agents/worktree-tools.d.ts +47 -0
  73. package/dist/agents/worktree-tools.js +246 -0
  74. package/dist/auth/middleware.js +14 -0
  75. package/dist/chat/agentic-executor.d.ts +7 -0
  76. package/dist/chat/agentic-executor.js +263 -32
  77. package/dist/chat/conversations.d.ts +2 -0
  78. package/dist/chat/conversations.js +8 -0
  79. package/dist/chat/execution/executor.d.ts +8 -0
  80. package/dist/chat/execution/executor.js +157 -103
  81. package/dist/chat/execution/index.js +5 -1
  82. package/dist/chat/execution/sandbox.d.ts +8 -0
  83. package/dist/chat/execution/sandbox.js +25 -1
  84. package/dist/chat/execution/tool-router.js +40 -14
  85. package/dist/chat/execution/tools/canvas.d.ts +2 -2
  86. package/dist/chat/execution/tools/code-tools.d.ts +66 -0
  87. package/dist/chat/execution/tools/code-tools.js +353 -0
  88. package/dist/chat/execution/tools/complete-task.d.ts +2 -2
  89. package/dist/chat/execution/tools/cron-tool.d.ts +26 -10
  90. package/dist/chat/execution/tools/cron-tool.js +48 -3
  91. package/dist/chat/execution/tools/decompose-task.d.ts +58 -0
  92. package/dist/chat/execution/tools/decompose-task.js +166 -0
  93. package/dist/chat/execution/tools/exec.d.ts +5 -2
  94. package/dist/chat/execution/tools/exec.js +294 -155
  95. package/dist/chat/execution/tools/feed-tools.d.ts +77 -0
  96. package/dist/chat/execution/tools/feed-tools.js +142 -0
  97. package/dist/chat/execution/tools/file-ops.d.ts +1 -1
  98. package/dist/chat/execution/tools/github.d.ts +2 -2
  99. package/dist/chat/execution/tools/index.d.ts +14 -2
  100. package/dist/chat/execution/tools/index.js +86 -12
  101. package/dist/chat/execution/tools/integrations.d.ts +8 -8
  102. package/dist/chat/execution/tools/multi-patch.d.ts +53 -0
  103. package/dist/chat/execution/tools/multi-patch.js +373 -0
  104. package/dist/chat/execution/tools/openai-image-gen.d.ts +2 -2
  105. package/dist/chat/execution/tools/plan-tools.d.ts +80 -0
  106. package/dist/chat/execution/tools/plan-tools.js +134 -0
  107. package/dist/chat/execution/tools/profclaw-ops.d.ts +6 -6
  108. package/dist/chat/execution/tools/repl-tool.d.ts +46 -0
  109. package/dist/chat/execution/tools/repl-tool.js +207 -0
  110. package/dist/chat/execution/tools/sessions-send.d.ts +2 -2
  111. package/dist/chat/execution/tools/slack-actions.d.ts +2 -2
  112. package/dist/chat/execution/tools/system.d.ts +4 -4
  113. package/dist/chat/execution/tools/todo-tool.d.ts +72 -0
  114. package/dist/chat/execution/tools/todo-tool.js +152 -0
  115. package/dist/chat/execution/tools/tool-search.d.ts +50 -0
  116. package/dist/chat/execution/tools/tool-search.js +155 -0
  117. package/dist/chat/execution/tools/tts-speak.d.ts +2 -2
  118. package/dist/chat/execution/types.d.ts +21 -14
  119. package/dist/chat/execution/workflows/executor.d.ts +11 -0
  120. package/dist/chat/execution/workflows/executor.js +99 -1
  121. package/dist/chat/execution/workflows/types.d.ts +35 -2
  122. package/dist/chat/format/index.d.ts +1 -0
  123. package/dist/chat/format/index.js +1 -0
  124. package/dist/chat/format/markdown-convert.d.ts +23 -0
  125. package/dist/chat/format/markdown-convert.js +149 -0
  126. package/dist/chat/index.d.ts +1 -1
  127. package/dist/chat/index.js +1 -1
  128. package/dist/chat/message-handler.js +58 -6
  129. package/dist/chat/meta-tool-handlers.d.ts +18 -0
  130. package/dist/chat/meta-tool-handlers.js +51 -0
  131. package/dist/chat/proactive/index.d.ts +62 -0
  132. package/dist/chat/proactive/index.js +147 -0
  133. package/dist/chat/prompt-adapter.js +2 -0
  134. package/dist/chat/providers/irc/index.d.ts +2 -2
  135. package/dist/chat/providers/telegram/index.d.ts +2 -0
  136. package/dist/chat/providers/telegram/index.js +21 -2
  137. package/dist/chat/system-prompts.d.ts +3 -3
  138. package/dist/chat/system-prompts.js +121 -61
  139. package/dist/chat/tool-handler.d.ts +2 -0
  140. package/dist/chat/tool-handler.js +47 -3
  141. package/dist/chat/tools.d.ts +6 -6
  142. package/dist/cli/commands/auth.js +64 -1
  143. package/dist/cli/commands/chat.js +1327 -138
  144. package/dist/cli/commands/doctor.js +222 -16
  145. package/dist/cli/commands/history.d.ts +3 -0
  146. package/dist/cli/commands/history.js +138 -0
  147. package/dist/cli/commands/import.d.ts +44 -0
  148. package/dist/cli/commands/import.js +526 -0
  149. package/dist/cli/commands/init.d.ts +13 -0
  150. package/dist/cli/commands/init.js +381 -0
  151. package/dist/cli/commands/onboard.js +210 -30
  152. package/dist/cli/commands/plan.d.ts +13 -0
  153. package/dist/cli/commands/plan.js +184 -0
  154. package/dist/cli/commands/receipt.d.ts +7 -0
  155. package/dist/cli/commands/receipt.js +90 -0
  156. package/dist/cli/commands/run.d.ts +28 -0
  157. package/dist/cli/commands/run.js +204 -0
  158. package/dist/cli/commands/serve.d.ts +7 -0
  159. package/dist/cli/commands/serve.js +77 -18
  160. package/dist/cli/commands/setup.js +84 -3
  161. package/dist/cli/commands/status.js +54 -0
  162. package/dist/cli/commands/tools.js +13 -13
  163. package/dist/cli/commands/tui.js +26 -1
  164. package/dist/cli/index.js +23 -0
  165. package/dist/cli/ink/App.d.ts +13 -0
  166. package/dist/cli/ink/App.js +6 -0
  167. package/dist/cli/ink/ChatApp.d.ts +60 -0
  168. package/dist/cli/ink/ChatApp.js +325 -0
  169. package/dist/cli/ink/DashboardApp.d.ts +3 -0
  170. package/dist/cli/ink/DashboardApp.js +143 -0
  171. package/dist/cli/ink/components/AgentStatus.d.ts +17 -0
  172. package/dist/cli/ink/components/AgentStatus.js +33 -0
  173. package/dist/cli/ink/components/ChannelList.d.ts +17 -0
  174. package/dist/cli/ink/components/ChannelList.js +33 -0
  175. package/dist/cli/ink/components/ConnectionStatus.d.ts +19 -0
  176. package/dist/cli/ink/components/ConnectionStatus.js +50 -0
  177. package/dist/cli/ink/components/CostBar.d.ts +19 -0
  178. package/dist/cli/ink/components/CostBar.js +35 -0
  179. package/dist/cli/ink/components/HookStatus.d.ts +15 -0
  180. package/dist/cli/ink/components/HookStatus.js +7 -0
  181. package/dist/cli/ink/components/PermissionPrompt.d.ts +21 -0
  182. package/dist/cli/ink/components/PermissionPrompt.js +51 -0
  183. package/dist/cli/ink/components/PlanView.d.ts +23 -0
  184. package/dist/cli/ink/components/PlanView.js +26 -0
  185. package/dist/cli/ink/components/ProviderList.d.ts +16 -0
  186. package/dist/cli/ink/components/ProviderList.js +16 -0
  187. package/dist/cli/ink/components/SessionHeader.d.ts +15 -0
  188. package/dist/cli/ink/components/SessionHeader.js +15 -0
  189. package/dist/cli/ink/components/StreamingMessage.d.ts +20 -0
  190. package/dist/cli/ink/components/StreamingMessage.js +27 -0
  191. package/dist/cli/ink/components/SuggestionBar.d.ts +15 -0
  192. package/dist/cli/ink/components/SuggestionBar.js +28 -0
  193. package/dist/cli/ink/components/SystemHealth.d.ts +20 -0
  194. package/dist/cli/ink/components/SystemHealth.js +39 -0
  195. package/dist/cli/ink/components/TaskList.d.ts +17 -0
  196. package/dist/cli/ink/components/TaskList.js +59 -0
  197. package/dist/cli/ink/components/ToolCall.d.ts +17 -0
  198. package/dist/cli/ink/components/ToolCall.js +43 -0
  199. package/dist/cli/ink/index.d.ts +23 -0
  200. package/dist/cli/ink/index.js +15 -0
  201. package/dist/cli/ink/keybindings.d.ts +35 -0
  202. package/dist/cli/ink/keybindings.js +105 -0
  203. package/dist/cli/ink/markdown-renderer.d.ts +47 -0
  204. package/dist/cli/ink/markdown-renderer.js +380 -0
  205. package/dist/cli/ink/output-styles.d.ts +39 -0
  206. package/dist/cli/ink/output-styles.js +119 -0
  207. package/dist/cli/interactive/auto-serve.d.ts +38 -0
  208. package/dist/cli/interactive/auto-serve.js +209 -0
  209. package/dist/cli/interactive/index.d.ts +25 -0
  210. package/dist/cli/interactive/index.js +23 -0
  211. package/dist/cli/interactive/picker.d.ts +28 -0
  212. package/dist/cli/interactive/picker.js +153 -0
  213. package/dist/cli/interactive/renderer.d.ts +26 -0
  214. package/dist/cli/interactive/renderer.js +555 -0
  215. package/dist/cli/interactive/repl.d.ts +14 -0
  216. package/dist/cli/interactive/repl.js +1516 -0
  217. package/dist/cli/interactive/stream-client.d.ts +59 -0
  218. package/dist/cli/interactive/stream-client.js +506 -0
  219. package/dist/cli/interactive/types.d.ts +121 -0
  220. package/dist/cli/interactive/types.js +10 -0
  221. package/dist/cli/utils/api.d.ts +9 -0
  222. package/dist/cli/utils/api.js +58 -2
  223. package/dist/costs/token-tracker.d.ts +10 -1
  224. package/dist/costs/token-tracker.js +37 -5
  225. package/dist/cron/natural-language.d.ts +54 -0
  226. package/dist/cron/natural-language.js +569 -0
  227. package/dist/cron/scheduler.d.ts +34 -4
  228. package/dist/cron/scheduler.js +141 -9
  229. package/dist/cron/templates.d.ts +1 -1
  230. package/dist/cron/templates.js +219 -0
  231. package/dist/feeds/feed-engine.d.ts +149 -0
  232. package/dist/feeds/feed-engine.js +600 -0
  233. package/dist/feeds/index.d.ts +9 -0
  234. package/dist/feeds/index.js +8 -0
  235. package/dist/gateway/router.js +6 -1
  236. package/dist/hooks/built-in/audit-log.d.ts +11 -0
  237. package/dist/hooks/built-in/audit-log.js +84 -0
  238. package/dist/hooks/built-in/cost-warning.d.ts +10 -0
  239. package/dist/hooks/built-in/cost-warning.js +59 -0
  240. package/dist/hooks/built-in/dangerous-tool.d.ts +32 -0
  241. package/dist/hooks/built-in/dangerous-tool.js +80 -0
  242. package/dist/hooks/built-in/index.d.ts +14 -0
  243. package/dist/hooks/built-in/index.js +20 -0
  244. package/dist/hooks/index.d.ts +3 -0
  245. package/dist/hooks/index.js +6 -0
  246. package/dist/hooks/loader.d.ts +17 -0
  247. package/dist/hooks/loader.js +142 -0
  248. package/dist/hooks/registry.d.ts +62 -0
  249. package/dist/hooks/registry.js +127 -0
  250. package/dist/integrations/web-search.js +6 -3
  251. package/dist/memory/index.d.ts +1 -0
  252. package/dist/memory/index.js +2 -0
  253. package/dist/memory/memory-service.js +14 -13
  254. package/dist/memory/observational.d.ts +62 -0
  255. package/dist/memory/observational.js +396 -0
  256. package/dist/middleware/content-filter.d.ts +22 -0
  257. package/dist/middleware/content-filter.js +69 -0
  258. package/dist/middleware/request-validator.d.ts +159 -0
  259. package/dist/middleware/request-validator.js +93 -0
  260. package/dist/plugins/sdk.d.ts +22 -0
  261. package/dist/plugins/sdk.js +17 -1
  262. package/dist/projects/types.d.ts +10 -10
  263. package/dist/providers/ai-sdk.d.ts +11 -0
  264. package/dist/providers/ai-sdk.js +111 -56
  265. package/dist/providers/core/models.js +114 -6
  266. package/dist/providers/core/types.d.ts +7 -0
  267. package/dist/providers/index.d.ts +1 -0
  268. package/dist/providers/index.js +1 -0
  269. package/dist/providers/prompt-cache.d.ts +68 -0
  270. package/dist/providers/prompt-cache.js +165 -0
  271. package/dist/providers/smart-router.d.ts +118 -0
  272. package/dist/providers/smart-router.js +693 -0
  273. package/dist/providers/types.d.ts +16 -16
  274. package/dist/routes/agents.js +50 -0
  275. package/dist/routes/auth.js +8 -1
  276. package/dist/routes/chat.js +280 -18
  277. package/dist/routes/costs.js +32 -0
  278. package/dist/routes/cron.js +80 -5
  279. package/dist/routes/feeds.d.ts +10 -0
  280. package/dist/routes/feeds.js +168 -0
  281. package/dist/routes/mcp.js +21 -0
  282. package/dist/routes/memory.js +130 -0
  283. package/dist/routes/skills.js +129 -0
  284. package/dist/routes/teams.d.ts +9 -0
  285. package/dist/routes/teams.js +210 -0
  286. package/dist/routes/tools.js +14 -0
  287. package/dist/routes/users.js +2 -0
  288. package/dist/server/route-loader.js +3 -1
  289. package/dist/server/stream-bridge.d.ts +19 -0
  290. package/dist/server/stream-bridge.js +38 -0
  291. package/dist/server.js +313 -36
  292. package/dist/skills/marketplace.d.ts +87 -0
  293. package/dist/skills/marketplace.js +268 -0
  294. package/dist/storage/index.d.ts +14 -0
  295. package/dist/storage/index.js +64 -3
  296. package/dist/storage/schema.d.ts +4 -4
  297. package/dist/storage/schema.js +1 -1
  298. package/dist/teams/index.d.ts +110 -0
  299. package/dist/teams/index.js +365 -0
  300. package/dist/tickets/types.d.ts +39 -39
  301. package/dist/types/summary.d.ts +5 -5
  302. package/dist/utils/auto-update.d.ts +23 -0
  303. package/dist/utils/auto-update.js +157 -0
  304. package/dist/utils/offline-detect.d.ts +55 -0
  305. package/dist/utils/offline-detect.js +121 -0
  306. package/dist/utils/pid-file.d.ts +36 -0
  307. package/dist/utils/pid-file.js +125 -0
  308. package/dist/utils/prevent-sleep.d.ts +27 -0
  309. package/dist/utils/prevent-sleep.js +95 -0
  310. package/dist/utils/sanitizer.d.ts +57 -0
  311. package/dist/utils/sanitizer.js +174 -0
  312. package/docker-compose.yml +13 -137
  313. package/package.json +31 -6
  314. package/skills/deploy-cloudflare/SKILL.md +62 -0
  315. package/skills/deploy-vercel/SKILL.md +67 -0
  316. package/skills/docker-deploy/SKILL.md +158 -0
  317. package/skills/full-stack-builder/SKILL.md +92 -0
  318. package/skills/humanizer/SKILL.md +488 -0
  319. package/skills/profclaw-assistant/SKILL.md +85 -56
  320. package/ui/dist/assets/ActivityView-Da6HQ8ws.js +1 -0
  321. package/ui/dist/assets/AgentList-H58R0kX3.js +1 -0
  322. package/ui/dist/assets/AnalyticsDashboard-B28AeRsc.js +1 -0
  323. package/ui/dist/assets/AreaChart-DwLzeAQ8.js +1 -0
  324. package/ui/dist/assets/CartesianChart-piKQsTAR.js +36 -0
  325. package/ui/dist/assets/ChatView-Dbj8rxU5.js +10 -0
  326. package/ui/dist/assets/CostsDashboard-C6F5df0F.js +1 -0
  327. package/ui/dist/assets/EstimateSelect-wga0rUKX.js +1 -0
  328. package/ui/dist/assets/FeedDashboard-Ef6FEzEf.js +1 -0
  329. package/ui/dist/assets/FloatingChatbot-0yhkUeCq.js +2 -0
  330. package/ui/dist/assets/InviteCodeManagement-tUXfx4Bc.js +2 -0
  331. package/ui/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  332. package/ui/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  333. package/ui/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  334. package/ui/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  335. package/ui/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  336. package/ui/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  337. package/ui/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  338. package/ui/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  339. package/ui/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  340. package/ui/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  341. package/ui/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  342. package/ui/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  343. package/ui/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  344. package/ui/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  345. package/ui/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  346. package/ui/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  347. package/ui/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  348. package/ui/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  349. package/ui/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  350. package/ui/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  351. package/ui/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  352. package/ui/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  353. package/ui/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  354. package/ui/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  355. package/ui/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  356. package/ui/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  357. package/ui/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  358. package/ui/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  359. package/ui/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  360. package/ui/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  361. package/ui/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  362. package/ui/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  363. package/ui/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  364. package/ui/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  365. package/ui/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  366. package/ui/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  367. package/ui/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  368. package/ui/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  369. package/ui/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  370. package/ui/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  371. package/ui/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  372. package/ui/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  373. package/ui/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  374. package/ui/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  375. package/ui/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  376. package/ui/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  377. package/ui/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  378. package/ui/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  379. package/ui/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  380. package/ui/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  381. package/ui/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  382. package/ui/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  383. package/ui/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  384. package/ui/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  385. package/ui/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  386. package/ui/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  387. package/ui/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  388. package/ui/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  389. package/ui/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  390. package/ui/dist/assets/MarketplacePage-DGrLtolR.js +1 -0
  391. package/ui/dist/assets/{ProjectDetail--gPfvATB.js → ProjectDetail-BgWvA6UP.js} +2 -2
  392. package/ui/dist/assets/ProjectIcon-TDuliqwg.js +1 -0
  393. package/ui/dist/assets/ProjectList-DXgM4187.js +1 -0
  394. package/ui/dist/assets/{Settings-1kaf7VHE.js → Settings-xA8Zhi3p.js} +3 -3
  395. package/ui/dist/assets/StatusIndicator-B8vfFAxg.js +1 -0
  396. package/ui/dist/assets/{SummaryDetail-DV3AmONk.js → SummaryDetail-eedRfTtF.js} +2 -2
  397. package/ui/dist/assets/SummaryList-CLNX2P84.js +1 -0
  398. package/ui/dist/assets/TaskDetail-BtWclNiR.js +1 -0
  399. package/ui/dist/assets/TaskList-JjODAgSc.js +1 -0
  400. package/ui/dist/assets/TeamsPage-CBK5iAyx.js +1 -0
  401. package/ui/dist/assets/TicketBoard-C9aJNNYp.js +1 -0
  402. package/ui/dist/assets/TicketDetail-CV5JmL31.js +1 -0
  403. package/ui/dist/assets/TicketList-68V4lzUz.js +1 -0
  404. package/ui/dist/assets/UserManagement-DKTb6UpE.js +2 -0
  405. package/ui/dist/assets/ViewSwitcher-BvdQht2Y.js +1 -0
  406. package/ui/dist/assets/alert-dialog-O6qBOv_f.js +1 -0
  407. package/ui/dist/assets/{archive-BsLa7brF.js → archive-CX7UvZpf.js} +1 -1
  408. package/ui/dist/assets/badge-BbfnwDJP.js +1 -0
  409. package/ui/dist/assets/{bug-CmZI7jqM.js → bug-3WX0394-.js} +1 -1
  410. package/ui/dist/assets/{calendar-Bf0t2B82.js → calendar-buq77TaS.js} +1 -1
  411. package/ui/dist/assets/{chevron-up-CoUsOvZj.js → chevron-up-4ymsBJRo.js} +1 -1
  412. package/ui/dist/assets/{circle-x-Dgw11LgT.js → circle-x-ByXtwR6Y.js} +1 -1
  413. package/ui/dist/assets/constants-CVdDh7p0.js +1 -0
  414. package/ui/dist/assets/{cpu-DiPMQICV.js → cpu-CiuoCeDY.js} +1 -1
  415. package/ui/dist/assets/{database-BwTfupDi.js → database-BWXSBg5a.js} +1 -1
  416. package/ui/dist/assets/dialog-lDg4NvMV.js +1 -0
  417. package/ui/dist/assets/dollar-sign-Dmijd6DP.js +1 -0
  418. package/ui/dist/assets/{ellipsis-UJx4Xnf6.js → ellipsis-vT-5SVIp.js} +1 -1
  419. package/ui/dist/assets/{ellipsis-vertical-DoULYEKn.js → ellipsis-vertical-B4tAX_bL.js} +1 -1
  420. package/ui/dist/assets/feature-markdown-DBo5Q7uq.js +289 -0
  421. package/ui/dist/assets/{file-code-B2UrJLwi.js → file-code-ChOWdKXf.js} +1 -1
  422. package/ui/dist/assets/{folder-open-BJi577JH.js → folder-open-CkOUbIiP.js} +1 -1
  423. package/ui/dist/assets/{funnel-PkaD_HSR.js → funnel-uZkoSPP-.js} +1 -1
  424. package/ui/dist/assets/{git-branch-C_K30am0.js → git-branch-CwvUxj7C.js} +1 -1
  425. package/ui/dist/assets/{git-commit-horizontal-IT6ecxWQ.js → git-commit-horizontal-lxPzCvhD.js} +1 -1
  426. package/ui/dist/assets/{globe-f-jjCa_g.js → globe-D_WpJdsj.js} +1 -1
  427. package/ui/dist/assets/{hash-DNEv8Elo.js → hash-CA0hJ7vh.js} +1 -1
  428. package/ui/dist/assets/{history-BQSBo_1Q.js → history-CEWMLELs.js} +1 -1
  429. package/ui/dist/assets/inbox-ehtOptTV.js +1 -0
  430. package/ui/dist/assets/{index-nS3EErDg.js → index-C1rhbml4.js} +3 -3
  431. package/ui/dist/assets/index-CR8gfCHv.js +1 -0
  432. package/ui/dist/assets/index-DVXMpWai.js +1 -0
  433. package/ui/dist/assets/index-DaDJMM2v.js +1 -0
  434. package/ui/dist/assets/index-Djdq_0xu.js +1 -0
  435. package/ui/dist/assets/index-M46Gcb8K.css +1 -0
  436. package/ui/dist/assets/index-sEBN7w8J.js +109 -0
  437. package/ui/dist/assets/layers-C6Mhf8Nk.js +1 -0
  438. package/ui/dist/assets/{layout-dashboard-CcKt1hXw.js → layout-dashboard-BRUM0kpT.js} +1 -1
  439. package/ui/dist/assets/{lightbulb-Jhp7FvbU.js → lightbulb-CN2q1O5l.js} +1 -1
  440. package/ui/dist/assets/{link-2-DdO7ostF.js → link-2-CC4E28yJ.js} +1 -1
  441. package/ui/dist/assets/markdown-renderer-C6ENbB0u.js +10 -0
  442. package/ui/dist/assets/markdown-renderer-CfVKi3_s.css +1 -0
  443. package/ui/dist/assets/{message-square-CBgH65X7.js → message-square-Bbb241am.js} +1 -1
  444. package/ui/dist/assets/package-CwT3IzFx.js +1 -0
  445. package/ui/dist/assets/{pencil-CYXCEPQh.js → pencil-CDmiHzoj.js} +1 -1
  446. package/ui/dist/assets/{play-d1ONaH0-.js → play-tjy5jMQX.js} +1 -1
  447. package/ui/dist/assets/popover-CFHZf3pE.js +1 -0
  448. package/ui/dist/assets/progress-BboUHuLf.js +1 -0
  449. package/ui/dist/assets/{rocket-DhvUetsk.js → rocket--8ZHgdXJ.js} +1 -1
  450. package/ui/dist/assets/select-n108rXny.js +1 -0
  451. package/ui/dist/assets/{send-P0r5D7td.js → send-Cu7MR2Qh.js} +1 -1
  452. package/ui/dist/assets/server-DmodxZp-.js +1 -0
  453. package/ui/dist/assets/{settings-2-ocj5uHGx.js → settings-2-CkRNqkxj.js} +1 -1
  454. package/ui/dist/assets/sheet-7aUJkyzU.js +1 -0
  455. package/ui/dist/assets/{shield-check-DfVdE34l.js → shield-check-ViI3nMKE.js} +1 -1
  456. package/ui/dist/assets/{shield-off-8l0J6R-8.js → shield-off-DN3tagkn.js} +1 -1
  457. package/ui/dist/assets/skeleton-C0E1Nfro.js +1 -0
  458. package/ui/dist/assets/{smartphone-77_g3SQn.js → smartphone-5FghiXpA.js} +1 -1
  459. package/ui/dist/assets/{square-Ckzsr3Rn.js → square-DiNSx8K7.js} +1 -1
  460. package/ui/dist/assets/star-DhdFVidS.js +1 -0
  461. package/ui/dist/assets/switch-CIgVbZqQ.js +1 -0
  462. package/ui/dist/assets/table-BC56FVMV.js +1 -0
  463. package/ui/dist/assets/{tag-C35mgoEv.js → tag-CH_vQliw.js} +1 -1
  464. package/ui/dist/assets/textarea-CxDiKFXZ.js +1 -0
  465. package/ui/dist/assets/{timer-DHJBS2w1.js → timer-CdGVTb60.js} +1 -1
  466. package/ui/dist/assets/tooltip-BuW9A5UO.js +1 -0
  467. package/ui/dist/assets/{trash-2-keO5tKPE.js → trash-2-CucZJL0N.js} +1 -1
  468. package/ui/dist/assets/trending-down-BCezC1z2.js +1 -0
  469. package/ui/dist/assets/{trending-up-BBv8KbrY.js → trending-up-C5OYX2k2.js} +1 -1
  470. package/ui/dist/assets/vendor-query-C0p7b53x.js +4 -0
  471. package/ui/dist/assets/vendor-react-Mc5_kfYG.js +12 -0
  472. package/ui/dist/assets/vendor-ui-CXPAUBFv.js +51 -0
  473. package/ui/dist/assets/{wand-sparkles-BusQ52ZK.js → wand-sparkles-BaH6pJnc.js} +1 -1
  474. package/ui/dist/assets/{wrench-02YaOSiK.js → wrench-CjxjP6ok.js} +1 -1
  475. package/ui/dist/index.html +5 -2
  476. package/ui/dist/assets/ActivityView-BeshZXmE.js +0 -1
  477. package/ui/dist/assets/AgentList-QVHeldPi.js +0 -1
  478. package/ui/dist/assets/AnalyticsDashboard-C9R97dXE.js +0 -1
  479. package/ui/dist/assets/AreaChart-B73gaiVQ.js +0 -1
  480. package/ui/dist/assets/CartesianChart-CXYL2R-A.js +0 -36
  481. package/ui/dist/assets/ChatView-qjZErlrp.js +0 -10
  482. package/ui/dist/assets/CostsDashboard-O4DCLy1i.js +0 -1
  483. package/ui/dist/assets/EstimateSelect-1hQf4Osk.js +0 -1
  484. package/ui/dist/assets/FloatingChatbot-BZBzrJxd.js +0 -2
  485. package/ui/dist/assets/InviteCodeManagement-LEoGqYeA.js +0 -2
  486. package/ui/dist/assets/ProjectIcon-Chd_ofsw.js +0 -1
  487. package/ui/dist/assets/ProjectList-BvUfVB6c.js +0 -4
  488. package/ui/dist/assets/StatusIndicator-pRfkNcdV.js +0 -1
  489. package/ui/dist/assets/SummaryList-B6kXiTxL.js +0 -1
  490. package/ui/dist/assets/TaskDetail-CV6CzbOS.js +0 -1
  491. package/ui/dist/assets/TaskList-DL7brQKd.js +0 -1
  492. package/ui/dist/assets/TicketBoard-CrkkFj7C.js +0 -1
  493. package/ui/dist/assets/TicketDetail-hnnYclpD.js +0 -1
  494. package/ui/dist/assets/TicketList-CsDAyQCL.js +0 -1
  495. package/ui/dist/assets/UserManagement-BGFQyTSr.js +0 -2
  496. package/ui/dist/assets/ViewSwitcher-CnL0OqA8.js +0 -1
  497. package/ui/dist/assets/alert-dialog-SKM6Gjz4.js +0 -7
  498. package/ui/dist/assets/badge-CVHH1a-v.js +0 -1
  499. package/ui/dist/assets/brain-6o_RHVpe.js +0 -1
  500. package/ui/dist/assets/constants-Q5Zivl-a.js +0 -1
  501. package/ui/dist/assets/dialog-BUqN9Psj.js +0 -1
  502. package/ui/dist/assets/index-BUmnwPQr.js +0 -1
  503. package/ui/dist/assets/index-BfF5G4Cw.js +0 -1
  504. package/ui/dist/assets/index-C8N375c2.js +0 -1
  505. package/ui/dist/assets/index-CuxnqVVz.css +0 -1
  506. package/ui/dist/assets/index-CzMM3QOk.js +0 -1
  507. package/ui/dist/assets/index-lJlNPFVJ.js +0 -67
  508. package/ui/dist/assets/layers-jFqVrWMD.js +0 -1
  509. package/ui/dist/assets/markdown-renderer-n1ToC4XQ.js +0 -36
  510. package/ui/dist/assets/popover-CrmZgoWu.js +0 -1
  511. package/ui/dist/assets/progress-uv4SPkL5.js +0 -1
  512. package/ui/dist/assets/select-CeQ8AHGy.js +0 -1
  513. package/ui/dist/assets/server-CVHTZB72.js +0 -1
  514. package/ui/dist/assets/sheet-DuQExSho.js +0 -1
  515. package/ui/dist/assets/skeleton-TFiFJ3nB.js +0 -1
  516. package/ui/dist/assets/switch-CAePkd6k.js +0 -1
  517. package/ui/dist/assets/table-ZjAZ7hkt.js +0 -1
  518. package/ui/dist/assets/textarea-DsVPnSgR.js +0 -1
  519. package/ui/dist/assets/tooltip-BYmQ331W.js +0 -1
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Plan Mode CLI Commands
3
+ *
4
+ * View and manage agent plans created during plan-mode sessions.
5
+ *
6
+ * Usage:
7
+ * profclaw plan list
8
+ * profclaw plan show <id>
9
+ * profclaw plan approve <id>
10
+ */
11
+ import { Command } from 'commander';
12
+ export declare function planCommands(): Command;
13
+ //# sourceMappingURL=plan.d.ts.map
@@ -0,0 +1,184 @@
1
+ /**
2
+ * Plan Mode CLI Commands
3
+ *
4
+ * View and manage agent plans created during plan-mode sessions.
5
+ *
6
+ * Usage:
7
+ * profclaw plan list
8
+ * profclaw plan show <id>
9
+ * profclaw plan approve <id>
10
+ */
11
+ import { Command } from 'commander';
12
+ import chalk from 'chalk';
13
+ import { planManager } from '../../agents/plan-mode.js';
14
+ import { createTable, formatRelativeTime, success, error, warn, truncate, } from '../utils/output.js';
15
+ // ─── Status formatting ───────────────────────────────────────────────────────
16
+ const PLAN_STATUS_COLORS = {
17
+ draft: chalk.yellow,
18
+ approved: chalk.blue,
19
+ in_progress: chalk.cyan,
20
+ completed: chalk.green,
21
+ rejected: chalk.red,
22
+ };
23
+ const STEP_STATUS_SYMBOLS = {
24
+ pending: chalk.dim('○'),
25
+ in_progress: chalk.cyan('◑'),
26
+ completed: chalk.green('●'),
27
+ skipped: chalk.gray('–'),
28
+ };
29
+ function formatPlanStatus(status) {
30
+ const colorFn = PLAN_STATUS_COLORS[status] ?? chalk.white;
31
+ return colorFn(status.toUpperCase().replace('_', ' '));
32
+ }
33
+ // ─── Command builder ─────────────────────────────────────────────────────────
34
+ export function planCommands() {
35
+ const plan = new Command('plan').description('Manage agent implementation plans');
36
+ // ── list ──────────────────────────────────────────────────────────────────
37
+ plan
38
+ .command('list')
39
+ .alias('ls')
40
+ .description('List all plans')
41
+ .option('-s, --status <status>', 'Filter by status (draft|approved|in_progress|completed|rejected)')
42
+ .option('--json', 'Output as JSON')
43
+ .action((options) => {
44
+ let plans = planManager.list();
45
+ if (options.status) {
46
+ plans = plans.filter((p) => p.status === options.status);
47
+ }
48
+ if (options.json) {
49
+ console.log(JSON.stringify(plans, null, 2));
50
+ return;
51
+ }
52
+ if (plans.length === 0) {
53
+ console.log(chalk.dim('No plans found.'));
54
+ return;
55
+ }
56
+ const table = createTable(['ID', 'Title', 'Status', 'Steps', 'Created']);
57
+ for (const p of plans) {
58
+ const doneSteps = p.steps.filter((s) => s.status === 'completed' || s.status === 'skipped').length;
59
+ table.push([
60
+ p.id.slice(0, 8),
61
+ truncate(p.title, 40),
62
+ formatPlanStatus(p.status),
63
+ `${doneSteps}/${p.steps.length}`,
64
+ formatRelativeTime(new Date(p.createdAt)),
65
+ ]);
66
+ }
67
+ console.log(table.toString());
68
+ console.log(chalk.dim(`\n${plans.length} plan(s) total`));
69
+ });
70
+ // ── show ──────────────────────────────────────────────────────────────────
71
+ plan
72
+ .command('show <id>')
73
+ .alias('get')
74
+ .description('Show plan details and step list')
75
+ .option('--json', 'Output as JSON')
76
+ .action((id, options) => {
77
+ // Support partial ID prefix matching
78
+ const allPlans = planManager.list();
79
+ const found = allPlans.find((p) => p.id === id || p.id.startsWith(id));
80
+ if (!found) {
81
+ error(`Plan not found: ${id}`);
82
+ process.exit(1);
83
+ }
84
+ if (options.json) {
85
+ console.log(JSON.stringify(found, null, 2));
86
+ return;
87
+ }
88
+ console.log('');
89
+ console.log(chalk.bold(`Plan: ${found.id}`));
90
+ console.log(`Title: ${found.title}`);
91
+ console.log(`Status: ${formatPlanStatus(found.status)}`);
92
+ console.log(`Created: ${formatRelativeTime(new Date(found.createdAt))}`);
93
+ if (found.approvedAt) {
94
+ console.log(`Approved: ${formatRelativeTime(new Date(found.approvedAt))}`);
95
+ }
96
+ if (found.completedAt) {
97
+ console.log(`Completed: ${formatRelativeTime(new Date(found.completedAt))}`);
98
+ }
99
+ if (found.rejectionReason) {
100
+ console.log(`Rejection reason: ${chalk.red(found.rejectionReason)}`);
101
+ }
102
+ if (found.taskId) {
103
+ console.log(`Task ID: ${found.taskId}`);
104
+ }
105
+ console.log('');
106
+ console.log(chalk.bold('Steps:'));
107
+ for (const step of found.steps) {
108
+ const symbol = STEP_STATUS_SYMBOLS[step.status];
109
+ const effort = step.estimatedEffort ? chalk.dim(` [${step.estimatedEffort}]`) : '';
110
+ console.log(` ${symbol} ${step.index}. ${step.description}${effort}`);
111
+ if (step.files && step.files.length > 0) {
112
+ for (const f of step.files) {
113
+ console.log(` ${chalk.dim(f)}`);
114
+ }
115
+ }
116
+ }
117
+ console.log('');
118
+ });
119
+ // ── approve ───────────────────────────────────────────────────────────────
120
+ plan
121
+ .command('approve <id>')
122
+ .description('Approve a pending plan so the agent can begin implementation')
123
+ .option('--json', 'Output as JSON')
124
+ .action((id, options) => {
125
+ const allPlans = planManager.list();
126
+ const found = allPlans.find((p) => p.id === id || p.id.startsWith(id));
127
+ if (!found) {
128
+ error(`Plan not found: ${id}`);
129
+ process.exit(1);
130
+ }
131
+ if (found.status !== 'draft') {
132
+ warn(`Plan ${found.id.slice(0, 8)} is already ${found.status}, cannot approve.`);
133
+ process.exit(1);
134
+ }
135
+ try {
136
+ const approved = planManager.approve(found.id);
137
+ if (options.json) {
138
+ console.log(JSON.stringify(approved, null, 2));
139
+ return;
140
+ }
141
+ success(`Plan approved: ${approved.id.slice(0, 8)} — "${approved.title}"`);
142
+ console.log(chalk.dim('The agent will now begin implementation.'));
143
+ }
144
+ catch (err) {
145
+ error(err instanceof Error ? err.message : 'Failed to approve plan');
146
+ process.exit(1);
147
+ }
148
+ });
149
+ // ── reject ────────────────────────────────────────────────────────────────
150
+ plan
151
+ .command('reject <id>')
152
+ .description('Reject a pending plan')
153
+ .option('-r, --reason <reason>', 'Reason for rejection')
154
+ .option('--json', 'Output as JSON')
155
+ .action((id, options) => {
156
+ const allPlans = planManager.list();
157
+ const found = allPlans.find((p) => p.id === id || p.id.startsWith(id));
158
+ if (!found) {
159
+ error(`Plan not found: ${id}`);
160
+ process.exit(1);
161
+ }
162
+ if (found.status !== 'draft') {
163
+ warn(`Plan ${found.id.slice(0, 8)} is already ${found.status}, cannot reject.`);
164
+ process.exit(1);
165
+ }
166
+ try {
167
+ const rejected = planManager.reject(found.id, options.reason);
168
+ if (options.json) {
169
+ console.log(JSON.stringify(rejected, null, 2));
170
+ return;
171
+ }
172
+ console.log(chalk.red('✗') + ` Plan rejected: ${rejected.id.slice(0, 8)}`);
173
+ if (options.reason) {
174
+ console.log(chalk.dim(`Reason: ${options.reason}`));
175
+ }
176
+ }
177
+ catch (err) {
178
+ error(err instanceof Error ? err.message : 'Failed to reject plan');
179
+ process.exit(1);
180
+ }
181
+ });
182
+ return plan;
183
+ }
184
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1,7 @@
1
+ /**
2
+ * profclaw receipt: verify, view and key generation for run receipts.
3
+ * Spec: docs/specs/run-receipt-v0.md
4
+ */
5
+ import { Command } from 'commander';
6
+ export declare function receiptCommand(): Command;
7
+ //# sourceMappingURL=receipt.d.ts.map
@@ -0,0 +1,90 @@
1
+ /**
2
+ * profclaw receipt: verify, view and key generation for run receipts.
3
+ * Spec: docs/specs/run-receipt-v0.md
4
+ */
5
+ import { readFileSync, writeFileSync } from 'node:fs';
6
+ import { Command } from 'commander';
7
+ import { verifyReceiptText, parseReceiptText } from '../../agents/receipt/receipt-verify.js';
8
+ import { renderHtml, renderTerminalSummary } from '../../agents/receipt/receipt-view.js';
9
+ import { generateKeyPairFiles } from '../../agents/receipt/receipt-cli.js';
10
+ import { error, info, success } from '../utils/output.js';
11
+ function readOrExit(file) {
12
+ try {
13
+ return readFileSync(file, 'utf-8');
14
+ }
15
+ catch (err) {
16
+ error(`Cannot read ${file}: ${err instanceof Error ? err.message : 'unknown error'}`);
17
+ process.exitCode = 1;
18
+ return null;
19
+ }
20
+ }
21
+ export function receiptCommand() {
22
+ const cmd = new Command('receipt').description('Verify, view and sign tamper-evident run receipts');
23
+ cmd
24
+ .command('verify')
25
+ .description('Check a receipt: exit 0 if intact, 1 if tampered, truncated or invalid')
26
+ .argument('<file>', 'Path to receipt.jsonl')
27
+ .option('--pubkey <file>', 'Trusted Ed25519 public key (PEM); the receipt must be signed by it')
28
+ .option('--require-signature', 'Fail if the receipt is not signed')
29
+ .action((file, opts) => {
30
+ const text = readOrExit(file);
31
+ if (text === null)
32
+ return;
33
+ let expectedPublicKey;
34
+ if (opts.pubkey) {
35
+ const key = readOrExit(opts.pubkey);
36
+ if (key === null)
37
+ return;
38
+ expectedPublicKey = key;
39
+ }
40
+ const result = verifyReceiptText(text, { expectedPublicKey, requireSignature: opts.requireSignature });
41
+ if (result.ok) {
42
+ success(result.message);
43
+ info('This shows the receipt was not altered after it was written. It does not prove the run happened.');
44
+ process.exitCode = 0;
45
+ }
46
+ else {
47
+ error(`TAMPERED or invalid at seq ${result.firstBadSeq ?? 0} (${result.reason ?? 'unknown'}): ${result.message}`);
48
+ process.exitCode = 1;
49
+ }
50
+ });
51
+ cmd
52
+ .command('view')
53
+ .description('Print a summary, or write a self-contained HTML viewer with --html')
54
+ .argument('<file>', 'Path to receipt.jsonl')
55
+ .option('--html <out>', 'Write a single-file HTML viewer to this path')
56
+ .action((file, opts) => {
57
+ const text = readOrExit(file);
58
+ if (text === null)
59
+ return;
60
+ const verify = verifyReceiptText(text);
61
+ const events = parseReceiptText(text);
62
+ if (opts.html) {
63
+ writeFileSync(opts.html, renderHtml(events, verify), 'utf-8');
64
+ info(`Wrote ${opts.html}`);
65
+ }
66
+ else {
67
+ process.stdout.write(renderTerminalSummary(events, verify));
68
+ }
69
+ if (!verify.ok)
70
+ process.exitCode = 1;
71
+ });
72
+ cmd
73
+ .command('keygen')
74
+ .description('Write an Ed25519 keypair for signing receipts (private key mode 0600)')
75
+ .argument('<dir>', 'Directory to write receipt-key.pem and receipt-key.pub.pem into')
76
+ .action((dir) => {
77
+ try {
78
+ const files = generateKeyPairFiles(dir);
79
+ success(`Private key: ${files.privateKeyPath} (keep it off the machine that runs agents if you can)`);
80
+ info(`Public key: ${files.publicKeyPath}`);
81
+ info('Sign with --sign-key <private key> or env PROFCLAW_RECEIPT_KEY; check with: profclaw receipt verify <file> --pubkey <public key>');
82
+ }
83
+ catch (err) {
84
+ error(err instanceof Error ? err.message : 'Key generation failed');
85
+ process.exitCode = 1;
86
+ }
87
+ });
88
+ return cmd;
89
+ }
90
+ //# sourceMappingURL=receipt.js.map
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Verified Run CLI Command
3
+ *
4
+ * Usage:
5
+ * profclaw run "<goal>" --verify "pnpm test" (built-in agent)
6
+ * profclaw run "<goal>" --verify "pnpm test" --agent-cmd "my-agent-cli"
7
+ *
8
+ * Done means verified: the run only succeeds when the verify command exits 0.
9
+ * Work happens in an isolated git worktree on a local branch. Nothing is
10
+ * pushed and no PR is opened.
11
+ *
12
+ * By default the built-in model-backed agent runs inside the worktree, starting
13
+ * on the smart router's cheap model and escalating a tier after repeated
14
+ * verifier failures. --agent-cmd overrides it with an external agent; the goal
15
+ * and feedback are written to that agent's stdin, never interpolated into a
16
+ * shell string.
17
+ */
18
+ import { Command } from 'commander';
19
+ import type { AgentAttemptInput, AgentAttemptResult, AgentRunner } from '../../agents/verified-run.js';
20
+ /** Runs an external agent command, feeding the prompt on stdin. */
21
+ export declare class CommandAgent implements AgentRunner {
22
+ private readonly command;
23
+ constructor(command: string);
24
+ runAttempt(input: AgentAttemptInput): Promise<AgentAttemptResult>;
25
+ }
26
+ export declare function buildPrompt(input: AgentAttemptInput): string;
27
+ export declare function runCommand(): Command;
28
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1,204 @@
1
+ /**
2
+ * Verified Run CLI Command
3
+ *
4
+ * Usage:
5
+ * profclaw run "<goal>" --verify "pnpm test" (built-in agent)
6
+ * profclaw run "<goal>" --verify "pnpm test" --agent-cmd "my-agent-cli"
7
+ *
8
+ * Done means verified: the run only succeeds when the verify command exits 0.
9
+ * Work happens in an isolated git worktree on a local branch. Nothing is
10
+ * pushed and no PR is opened.
11
+ *
12
+ * By default the built-in model-backed agent runs inside the worktree, starting
13
+ * on the smart router's cheap model and escalating a tier after repeated
14
+ * verifier failures. --agent-cmd overrides it with an external agent; the goal
15
+ * and feedback are written to that agent's stdin, never interpolated into a
16
+ * shell string.
17
+ */
18
+ import { spawn } from 'node:child_process';
19
+ import { Command } from 'commander';
20
+ import { describeSandbox, resolveSandboxMode } from '../../agents/command-sandbox.js';
21
+ import { CommandVerifier } from '../../agents/verifier.js';
22
+ import { runVerifiedGoal, resolveLimits } from '../../agents/verified-run.js';
23
+ import { createDefaultExecutorRunner } from '../../agents/executor-runner.js';
24
+ import { setupRunReceipt, toolVersion } from '../../agents/receipt/receipt-cli.js';
25
+ import { error, info, success, warn, formatCost, formatTokens } from '../utils/output.js';
26
+ /** Runs an external agent command, feeding the prompt on stdin. */
27
+ export class CommandAgent {
28
+ command;
29
+ constructor(command) {
30
+ this.command = command;
31
+ }
32
+ runAttempt(input) {
33
+ const prompt = buildPrompt(input);
34
+ return new Promise((resolve, reject) => {
35
+ const child = spawn('/bin/sh', ['-c', this.command], {
36
+ cwd: input.workdir,
37
+ stdio: ['pipe', 'pipe', 'pipe'],
38
+ });
39
+ let out = '';
40
+ child.stdout.on('data', (d) => {
41
+ out = (out + d.toString('utf-8')).slice(-4000);
42
+ });
43
+ child.stderr.on('data', (d) => {
44
+ out = (out + d.toString('utf-8')).slice(-4000);
45
+ });
46
+ input.signal?.addEventListener('abort', () => child.kill('SIGTERM'), { once: true });
47
+ child.on('error', reject);
48
+ child.on('close', (code) => {
49
+ if (code === 0)
50
+ resolve({ summary: out.trim().slice(-500), tokensUsed: 0, costUsd: 0 });
51
+ else
52
+ reject(new Error(`agent command exited with code ${code ?? 'null'}: ${out.trim().slice(-500)}`));
53
+ });
54
+ child.stdin.on('error', () => undefined);
55
+ child.stdin.end(prompt);
56
+ });
57
+ }
58
+ }
59
+ export function buildPrompt(input) {
60
+ const parts = [
61
+ `Goal: ${input.goal}`,
62
+ `Work only inside: ${input.workdir}`,
63
+ `Your work is judged by running: ${input.verifyCommand}`,
64
+ 'Do not push to any remote or open pull requests.',
65
+ ];
66
+ if (input.feedback)
67
+ parts.push('', `Attempt ${input.attempt}. Previous attempt feedback:`, input.feedback);
68
+ return parts.join('\n') + '\n';
69
+ }
70
+ function parseNumber(raw, name) {
71
+ if (raw === undefined)
72
+ return undefined;
73
+ const n = Number(raw);
74
+ if (!Number.isFinite(n) || n < 0)
75
+ throw new Error(`${name} must be a non-negative number`);
76
+ return n;
77
+ }
78
+ function formatAttemptUsage(record) {
79
+ const parts = [`${formatTokens(record.tokensUsed)} tokens`];
80
+ if (record.cacheHitRate !== undefined)
81
+ parts.push(`cache hit ${(record.cacheHitRate * 100).toFixed(0)}%`);
82
+ parts.push(formatCost(record.costUsd));
83
+ if (record.model)
84
+ parts.push(record.model);
85
+ return parts.join(', ');
86
+ }
87
+ function printRunnerEvent(event) {
88
+ const { attempt, choice, escalated } = event;
89
+ const prefix = escalated ? 'Escalating to' : 'Using';
90
+ info(`Attempt ${attempt}: ${prefix} ${choice.provider}/${choice.model} (${choice.tier})`);
91
+ }
92
+ function printEvent(event) {
93
+ if (event.type === 'start')
94
+ info(`Run ${event.runId} on branch ${event.branch}`);
95
+ else if (event.type === 'attempt_start')
96
+ info(`Attempt ${event.attempt}...`);
97
+ else if (event.type === 'attempt_end') {
98
+ const { record } = event;
99
+ const line = `Attempt ${record.attempt}: ${record.outcome}${record.rolledBack ? ' (rolled back)' : ''} [${formatAttemptUsage(record)}]`;
100
+ if (record.outcome === 'verified')
101
+ success(line);
102
+ else
103
+ warn(line);
104
+ }
105
+ }
106
+ export function runCommand() {
107
+ return new Command('run')
108
+ .description('Run an agent toward a goal and only finish when a verify command passes')
109
+ .argument('<goal>', 'What the agent should accomplish')
110
+ .requiredOption('--verify <command>', 'Command that must exit 0 (tests, typecheck, lint, build)')
111
+ .option('--agent-cmd <command>', 'External agent command (overrides the built-in agent); receives the prompt on stdin')
112
+ .option('--model <ids>', 'Model, or comma separated ladder cheapest first (env PROFCLAW_RUN_MODEL); default: smart router')
113
+ .option('--escalate-after <n>', 'Verifier failures in a row before moving up a model tier, 0 disables (env PROFCLAW_RUN_ESCALATE_AFTER)')
114
+ .option('--max-attempts <n>', 'Maximum attempts (env PROFCLAW_RUN_MAX_ATTEMPTS)')
115
+ .option('--max-tokens <n>', 'Token budget, 0 disables (env PROFCLAW_RUN_MAX_TOKENS)')
116
+ .option('--max-cost <usd>', 'Dollar budget, 0 disables (env PROFCLAW_RUN_MAX_COST_USD)')
117
+ .option('--breaker <n>', 'Non-improving attempts before the circuit breaker trips (env PROFCLAW_RUN_BREAKER_THRESHOLD)')
118
+ .option('--verify-timeout <ms>', 'Verifier timeout (env PROFCLAW_RUN_VERIFY_TIMEOUT_MS)')
119
+ .option('--branch <name>', 'Branch name for the run (default profclaw/run-<id>)')
120
+ .option('--sandbox-verify', 'Also run the verify command under the OS sandbox (env PROFCLAW_RUN_SANDBOX_VERIFY=1); default off')
121
+ .option('--cleanup', 'Remove the worktree afterwards (the branch is kept)')
122
+ .option('--no-receipt', 'Do not write a tamper-evident receipt.jsonl for the run')
123
+ .option('--sign-key <path>', 'Ed25519 private key (PEM) to sign the receipt (env PROFCLAW_RECEIPT_KEY)')
124
+ .option('--json', 'Output the result as JSON')
125
+ .action(async (goal, options) => {
126
+ try {
127
+ const flags = {
128
+ maxAttempts: parseNumber(options.maxAttempts, '--max-attempts'),
129
+ maxTokens: parseNumber(options.maxTokens, '--max-tokens'),
130
+ maxCostUsd: parseNumber(options.maxCost, '--max-cost'),
131
+ breakerThreshold: parseNumber(options.breaker, '--breaker'),
132
+ verifyTimeoutMs: parseNumber(options.verifyTimeout, '--verify-timeout'),
133
+ };
134
+ for (const key of Object.keys(flags)) {
135
+ if (flags[key] === undefined)
136
+ delete flags[key];
137
+ }
138
+ const verifyCommand = options.verify;
139
+ const sandboxMode = resolveSandboxMode();
140
+ const sandboxVerify = options.sandboxVerify === true || process.env.PROFCLAW_RUN_SANDBOX_VERIFY === '1';
141
+ if (!options.json)
142
+ info(`${describeSandbox(sandboxMode)}${sandboxVerify ? '; verify command sandboxed' : ''}`);
143
+ const limits = resolveLimits(flags);
144
+ const rc = setupRunReceipt({ enabled: options.receipt !== false, projectRoot: process.cwd(), signKeyPath: options.signKey });
145
+ const agent = options.agentCmd
146
+ ? new CommandAgent(options.agentCmd)
147
+ : await createDefaultExecutorRunner({
148
+ goal,
149
+ model: options.model,
150
+ config: { escalateAfter: parseNumber(options.escalateAfter, '--escalate-after') },
151
+ maxTokens: limits.maxTokens,
152
+ maxCostUsd: limits.maxCostUsd,
153
+ onEvent: options.json ? undefined : printRunnerEvent,
154
+ onToolCall: rc.onToolCall,
155
+ });
156
+ const result = await runVerifiedGoal({
157
+ goal,
158
+ verifyCommand,
159
+ agent,
160
+ projectRoot: process.cwd(),
161
+ runId: rc.runId,
162
+ receipt: rc.receipt,
163
+ toolInfo: { name: 'profclaw', version: toolVersion() },
164
+ limits: flags,
165
+ branchName: options.branch,
166
+ removeWorktree: options.cleanup,
167
+ onEvent: options.json ? undefined : printEvent,
168
+ createVerifier: (cwd) => new CommandVerifier(verifyCommand, {
169
+ cwd,
170
+ timeoutMs: flags.verifyTimeoutMs ?? Number(process.env.PROFCLAW_RUN_VERIFY_TIMEOUT_MS ?? 600_000),
171
+ maxOutputChars: Number(process.env.PROFCLAW_RUN_MAX_OUTPUT_CHARS ?? 4_000),
172
+ sandbox: sandboxVerify ? { mode: sandboxMode } : undefined,
173
+ }),
174
+ });
175
+ if (options.json) {
176
+ console.log(JSON.stringify({ ...result, diff: undefined }, null, 2));
177
+ }
178
+ else if (result.verified) {
179
+ success(`Verified after ${result.attempts.length} attempt(s), cost ${formatCost(result.totalCostUsd)}`);
180
+ info(`Branch ${result.branch} is ready for review (not pushed).`);
181
+ if (result.reportPath)
182
+ info(`Evidence: ${result.reportPath}`);
183
+ if (rc.receipt)
184
+ info(`Receipt: ${rc.receipt.path}`);
185
+ }
186
+ else if (result.stopReason === 'already_passing') {
187
+ warn('The verify command already passes before any change, so no attempt was made.');
188
+ if (result.reportPath)
189
+ info(`Report: ${result.reportPath}`);
190
+ }
191
+ else {
192
+ error(`Not verified (${result.stopReason}) after ${result.attempts.length} attempt(s)`);
193
+ if (result.reportPath)
194
+ info(`Report: ${result.reportPath}`);
195
+ }
196
+ process.exitCode = result.verified || result.stopReason === 'already_passing' ? 0 : 1;
197
+ }
198
+ catch (err) {
199
+ error(err instanceof Error ? err.message : 'Verified run failed');
200
+ process.exitCode = 1;
201
+ }
202
+ });
203
+ }
204
+ //# sourceMappingURL=run.js.map
@@ -1,3 +1,10 @@
1
1
  import { Command } from 'commander';
2
+ export declare function checkPortAvailable(port: number): Promise<boolean>;
3
+ /**
4
+ * Try to find an available port starting at `startPort`.
5
+ * Attempts up to MAX_PORT_ATTEMPTS consecutive ports.
6
+ * Returns the available port, or null if all attempts fail.
7
+ */
8
+ export declare function resolvePort(startPort: number): Promise<number | null>;
2
9
  export declare function serveCommand(): Command;
3
10
  //# sourceMappingURL=serve.d.ts.map