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.
- package/.env.example +14 -2
- package/CHANGELOG.md +52 -0
- package/CONTRIBUTING.md +20 -0
- package/Dockerfile +39 -23
- package/README.md +178 -41
- package/config/pricing.yml +26 -2
- package/dist/agents/agent-summary.d.ts +44 -0
- package/dist/agents/agent-summary.js +176 -0
- package/dist/agents/auto-memory.d.ts +59 -0
- package/dist/agents/auto-memory.js +310 -0
- package/dist/agents/checkpoint-manager.d.ts +76 -0
- package/dist/agents/checkpoint-manager.js +156 -0
- package/dist/agents/circuit-breaker.d.ts +54 -0
- package/dist/agents/circuit-breaker.js +153 -0
- package/dist/agents/command-sandbox.d.ts +93 -0
- package/dist/agents/command-sandbox.js +235 -0
- package/dist/agents/context-compactor.d.ts +70 -0
- package/dist/agents/context-compactor.js +361 -0
- package/dist/agents/conversation-branch.d.ts +55 -0
- package/dist/agents/conversation-branch.js +115 -0
- package/dist/agents/error-recovery.d.ts +44 -0
- package/dist/agents/error-recovery.js +197 -0
- package/dist/agents/events.d.ts +76 -0
- package/dist/agents/events.js +8 -0
- package/dist/agents/executor-runner.d.ts +135 -0
- package/dist/agents/executor-runner.js +303 -0
- package/dist/agents/executor.d.ts +37 -1
- package/dist/agents/executor.js +606 -124
- package/dist/agents/file-snapshots.d.ts +72 -0
- package/dist/agents/file-snapshots.js +182 -0
- package/dist/agents/index.d.ts +2 -0
- package/dist/agents/orchestrator.d.ts +183 -0
- package/dist/agents/orchestrator.js +495 -0
- package/dist/agents/output-truncator.d.ts +59 -0
- package/dist/agents/output-truncator.js +128 -0
- package/dist/agents/permissions.d.ts +63 -0
- package/dist/agents/permissions.js +138 -0
- package/dist/agents/plan-mode.d.ts +71 -0
- package/dist/agents/plan-mode.js +186 -0
- package/dist/agents/prompt-suggestions.d.ts +33 -0
- package/dist/agents/prompt-suggestions.js +208 -0
- package/dist/agents/rate-limit-monitor.d.ts +56 -0
- package/dist/agents/rate-limit-monitor.js +224 -0
- package/dist/agents/receipt/receipt-cli.d.ts +43 -0
- package/dist/agents/receipt/receipt-cli.js +82 -0
- package/dist/agents/receipt/receipt-types.d.ts +136 -0
- package/dist/agents/receipt/receipt-types.js +19 -0
- package/dist/agents/receipt/receipt-verify.d.ts +19 -0
- package/dist/agents/receipt/receipt-verify.js +176 -0
- package/dist/agents/receipt/receipt-view.d.ts +29 -0
- package/dist/agents/receipt/receipt-view.js +227 -0
- package/dist/agents/receipt/receipt-writer.d.ts +47 -0
- package/dist/agents/receipt/receipt-writer.js +186 -0
- package/dist/agents/result-store.d.ts +43 -0
- package/dist/agents/result-store.js +145 -0
- package/dist/agents/session-diff.d.ts +49 -0
- package/dist/agents/session-diff.js +249 -0
- package/dist/agents/tool-loader.d.ts +65 -0
- package/dist/agents/tool-loader.js +273 -0
- package/dist/agents/tool-selector.d.ts +123 -0
- package/dist/agents/tool-selector.js +321 -0
- package/dist/agents/transcript.d.ts +96 -0
- package/dist/agents/transcript.js +267 -0
- package/dist/agents/verified-run-git.d.ts +49 -0
- package/dist/agents/verified-run-git.js +82 -0
- package/dist/agents/verified-run.d.ts +149 -0
- package/dist/agents/verified-run.js +402 -0
- package/dist/agents/verifier.d.ts +64 -0
- package/dist/agents/verifier.js +186 -0
- package/dist/agents/worktree-manager.d.ts +80 -0
- package/dist/agents/worktree-manager.js +203 -0
- package/dist/agents/worktree-tools.d.ts +47 -0
- package/dist/agents/worktree-tools.js +246 -0
- package/dist/auth/middleware.js +14 -0
- package/dist/chat/agentic-executor.d.ts +7 -0
- package/dist/chat/agentic-executor.js +263 -32
- package/dist/chat/conversations.d.ts +2 -0
- package/dist/chat/conversations.js +8 -0
- package/dist/chat/execution/executor.d.ts +8 -0
- package/dist/chat/execution/executor.js +157 -103
- package/dist/chat/execution/index.js +5 -1
- package/dist/chat/execution/sandbox.d.ts +8 -0
- package/dist/chat/execution/sandbox.js +25 -1
- package/dist/chat/execution/tool-router.js +40 -14
- package/dist/chat/execution/tools/canvas.d.ts +2 -2
- package/dist/chat/execution/tools/code-tools.d.ts +66 -0
- package/dist/chat/execution/tools/code-tools.js +353 -0
- package/dist/chat/execution/tools/complete-task.d.ts +2 -2
- package/dist/chat/execution/tools/cron-tool.d.ts +26 -10
- package/dist/chat/execution/tools/cron-tool.js +48 -3
- package/dist/chat/execution/tools/decompose-task.d.ts +58 -0
- package/dist/chat/execution/tools/decompose-task.js +166 -0
- package/dist/chat/execution/tools/exec.d.ts +5 -2
- package/dist/chat/execution/tools/exec.js +294 -155
- package/dist/chat/execution/tools/feed-tools.d.ts +77 -0
- package/dist/chat/execution/tools/feed-tools.js +142 -0
- package/dist/chat/execution/tools/file-ops.d.ts +1 -1
- package/dist/chat/execution/tools/github.d.ts +2 -2
- package/dist/chat/execution/tools/index.d.ts +14 -2
- package/dist/chat/execution/tools/index.js +86 -12
- package/dist/chat/execution/tools/integrations.d.ts +8 -8
- package/dist/chat/execution/tools/multi-patch.d.ts +53 -0
- package/dist/chat/execution/tools/multi-patch.js +373 -0
- package/dist/chat/execution/tools/openai-image-gen.d.ts +2 -2
- package/dist/chat/execution/tools/plan-tools.d.ts +80 -0
- package/dist/chat/execution/tools/plan-tools.js +134 -0
- package/dist/chat/execution/tools/profclaw-ops.d.ts +6 -6
- package/dist/chat/execution/tools/repl-tool.d.ts +46 -0
- package/dist/chat/execution/tools/repl-tool.js +207 -0
- package/dist/chat/execution/tools/sessions-send.d.ts +2 -2
- package/dist/chat/execution/tools/slack-actions.d.ts +2 -2
- package/dist/chat/execution/tools/system.d.ts +4 -4
- package/dist/chat/execution/tools/todo-tool.d.ts +72 -0
- package/dist/chat/execution/tools/todo-tool.js +152 -0
- package/dist/chat/execution/tools/tool-search.d.ts +50 -0
- package/dist/chat/execution/tools/tool-search.js +155 -0
- package/dist/chat/execution/tools/tts-speak.d.ts +2 -2
- package/dist/chat/execution/types.d.ts +21 -14
- package/dist/chat/execution/workflows/executor.d.ts +11 -0
- package/dist/chat/execution/workflows/executor.js +99 -1
- package/dist/chat/execution/workflows/types.d.ts +35 -2
- package/dist/chat/format/index.d.ts +1 -0
- package/dist/chat/format/index.js +1 -0
- package/dist/chat/format/markdown-convert.d.ts +23 -0
- package/dist/chat/format/markdown-convert.js +149 -0
- package/dist/chat/index.d.ts +1 -1
- package/dist/chat/index.js +1 -1
- package/dist/chat/message-handler.js +58 -6
- package/dist/chat/meta-tool-handlers.d.ts +18 -0
- package/dist/chat/meta-tool-handlers.js +51 -0
- package/dist/chat/proactive/index.d.ts +62 -0
- package/dist/chat/proactive/index.js +147 -0
- package/dist/chat/prompt-adapter.js +2 -0
- package/dist/chat/providers/irc/index.d.ts +2 -2
- package/dist/chat/providers/telegram/index.d.ts +2 -0
- package/dist/chat/providers/telegram/index.js +21 -2
- package/dist/chat/system-prompts.d.ts +3 -3
- package/dist/chat/system-prompts.js +121 -61
- package/dist/chat/tool-handler.d.ts +2 -0
- package/dist/chat/tool-handler.js +47 -3
- package/dist/chat/tools.d.ts +6 -6
- package/dist/cli/commands/auth.js +64 -1
- package/dist/cli/commands/chat.js +1327 -138
- package/dist/cli/commands/doctor.js +222 -16
- package/dist/cli/commands/history.d.ts +3 -0
- package/dist/cli/commands/history.js +138 -0
- package/dist/cli/commands/import.d.ts +44 -0
- package/dist/cli/commands/import.js +526 -0
- package/dist/cli/commands/init.d.ts +13 -0
- package/dist/cli/commands/init.js +381 -0
- package/dist/cli/commands/onboard.js +210 -30
- package/dist/cli/commands/plan.d.ts +13 -0
- package/dist/cli/commands/plan.js +184 -0
- package/dist/cli/commands/receipt.d.ts +7 -0
- package/dist/cli/commands/receipt.js +90 -0
- package/dist/cli/commands/run.d.ts +28 -0
- package/dist/cli/commands/run.js +204 -0
- package/dist/cli/commands/serve.d.ts +7 -0
- package/dist/cli/commands/serve.js +77 -18
- package/dist/cli/commands/setup.js +84 -3
- package/dist/cli/commands/status.js +54 -0
- package/dist/cli/commands/tools.js +13 -13
- package/dist/cli/commands/tui.js +26 -1
- package/dist/cli/index.js +23 -0
- package/dist/cli/ink/App.d.ts +13 -0
- package/dist/cli/ink/App.js +6 -0
- package/dist/cli/ink/ChatApp.d.ts +60 -0
- package/dist/cli/ink/ChatApp.js +325 -0
- package/dist/cli/ink/DashboardApp.d.ts +3 -0
- package/dist/cli/ink/DashboardApp.js +143 -0
- package/dist/cli/ink/components/AgentStatus.d.ts +17 -0
- package/dist/cli/ink/components/AgentStatus.js +33 -0
- package/dist/cli/ink/components/ChannelList.d.ts +17 -0
- package/dist/cli/ink/components/ChannelList.js +33 -0
- package/dist/cli/ink/components/ConnectionStatus.d.ts +19 -0
- package/dist/cli/ink/components/ConnectionStatus.js +50 -0
- package/dist/cli/ink/components/CostBar.d.ts +19 -0
- package/dist/cli/ink/components/CostBar.js +35 -0
- package/dist/cli/ink/components/HookStatus.d.ts +15 -0
- package/dist/cli/ink/components/HookStatus.js +7 -0
- package/dist/cli/ink/components/PermissionPrompt.d.ts +21 -0
- package/dist/cli/ink/components/PermissionPrompt.js +51 -0
- package/dist/cli/ink/components/PlanView.d.ts +23 -0
- package/dist/cli/ink/components/PlanView.js +26 -0
- package/dist/cli/ink/components/ProviderList.d.ts +16 -0
- package/dist/cli/ink/components/ProviderList.js +16 -0
- package/dist/cli/ink/components/SessionHeader.d.ts +15 -0
- package/dist/cli/ink/components/SessionHeader.js +15 -0
- package/dist/cli/ink/components/StreamingMessage.d.ts +20 -0
- package/dist/cli/ink/components/StreamingMessage.js +27 -0
- package/dist/cli/ink/components/SuggestionBar.d.ts +15 -0
- package/dist/cli/ink/components/SuggestionBar.js +28 -0
- package/dist/cli/ink/components/SystemHealth.d.ts +20 -0
- package/dist/cli/ink/components/SystemHealth.js +39 -0
- package/dist/cli/ink/components/TaskList.d.ts +17 -0
- package/dist/cli/ink/components/TaskList.js +59 -0
- package/dist/cli/ink/components/ToolCall.d.ts +17 -0
- package/dist/cli/ink/components/ToolCall.js +43 -0
- package/dist/cli/ink/index.d.ts +23 -0
- package/dist/cli/ink/index.js +15 -0
- package/dist/cli/ink/keybindings.d.ts +35 -0
- package/dist/cli/ink/keybindings.js +105 -0
- package/dist/cli/ink/markdown-renderer.d.ts +47 -0
- package/dist/cli/ink/markdown-renderer.js +380 -0
- package/dist/cli/ink/output-styles.d.ts +39 -0
- package/dist/cli/ink/output-styles.js +119 -0
- package/dist/cli/interactive/auto-serve.d.ts +38 -0
- package/dist/cli/interactive/auto-serve.js +209 -0
- package/dist/cli/interactive/index.d.ts +25 -0
- package/dist/cli/interactive/index.js +23 -0
- package/dist/cli/interactive/picker.d.ts +28 -0
- package/dist/cli/interactive/picker.js +153 -0
- package/dist/cli/interactive/renderer.d.ts +26 -0
- package/dist/cli/interactive/renderer.js +555 -0
- package/dist/cli/interactive/repl.d.ts +14 -0
- package/dist/cli/interactive/repl.js +1516 -0
- package/dist/cli/interactive/stream-client.d.ts +59 -0
- package/dist/cli/interactive/stream-client.js +506 -0
- package/dist/cli/interactive/types.d.ts +121 -0
- package/dist/cli/interactive/types.js +10 -0
- package/dist/cli/utils/api.d.ts +9 -0
- package/dist/cli/utils/api.js +58 -2
- package/dist/costs/token-tracker.d.ts +10 -1
- package/dist/costs/token-tracker.js +37 -5
- package/dist/cron/natural-language.d.ts +54 -0
- package/dist/cron/natural-language.js +569 -0
- package/dist/cron/scheduler.d.ts +34 -4
- package/dist/cron/scheduler.js +141 -9
- package/dist/cron/templates.d.ts +1 -1
- package/dist/cron/templates.js +219 -0
- package/dist/feeds/feed-engine.d.ts +149 -0
- package/dist/feeds/feed-engine.js +600 -0
- package/dist/feeds/index.d.ts +9 -0
- package/dist/feeds/index.js +8 -0
- package/dist/gateway/router.js +6 -1
- package/dist/hooks/built-in/audit-log.d.ts +11 -0
- package/dist/hooks/built-in/audit-log.js +84 -0
- package/dist/hooks/built-in/cost-warning.d.ts +10 -0
- package/dist/hooks/built-in/cost-warning.js +59 -0
- package/dist/hooks/built-in/dangerous-tool.d.ts +32 -0
- package/dist/hooks/built-in/dangerous-tool.js +80 -0
- package/dist/hooks/built-in/index.d.ts +14 -0
- package/dist/hooks/built-in/index.js +20 -0
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/index.js +6 -0
- package/dist/hooks/loader.d.ts +17 -0
- package/dist/hooks/loader.js +142 -0
- package/dist/hooks/registry.d.ts +62 -0
- package/dist/hooks/registry.js +127 -0
- package/dist/integrations/web-search.js +6 -3
- package/dist/memory/index.d.ts +1 -0
- package/dist/memory/index.js +2 -0
- package/dist/memory/memory-service.js +14 -13
- package/dist/memory/observational.d.ts +62 -0
- package/dist/memory/observational.js +396 -0
- package/dist/middleware/content-filter.d.ts +22 -0
- package/dist/middleware/content-filter.js +69 -0
- package/dist/middleware/request-validator.d.ts +159 -0
- package/dist/middleware/request-validator.js +93 -0
- package/dist/plugins/sdk.d.ts +22 -0
- package/dist/plugins/sdk.js +17 -1
- package/dist/projects/types.d.ts +10 -10
- package/dist/providers/ai-sdk.d.ts +11 -0
- package/dist/providers/ai-sdk.js +111 -56
- package/dist/providers/core/models.js +114 -6
- package/dist/providers/core/types.d.ts +7 -0
- package/dist/providers/index.d.ts +1 -0
- package/dist/providers/index.js +1 -0
- package/dist/providers/prompt-cache.d.ts +68 -0
- package/dist/providers/prompt-cache.js +165 -0
- package/dist/providers/smart-router.d.ts +118 -0
- package/dist/providers/smart-router.js +693 -0
- package/dist/providers/types.d.ts +16 -16
- package/dist/routes/agents.js +50 -0
- package/dist/routes/auth.js +8 -1
- package/dist/routes/chat.js +280 -18
- package/dist/routes/costs.js +32 -0
- package/dist/routes/cron.js +80 -5
- package/dist/routes/feeds.d.ts +10 -0
- package/dist/routes/feeds.js +168 -0
- package/dist/routes/mcp.js +21 -0
- package/dist/routes/memory.js +130 -0
- package/dist/routes/skills.js +129 -0
- package/dist/routes/teams.d.ts +9 -0
- package/dist/routes/teams.js +210 -0
- package/dist/routes/tools.js +14 -0
- package/dist/routes/users.js +2 -0
- package/dist/server/route-loader.js +3 -1
- package/dist/server/stream-bridge.d.ts +19 -0
- package/dist/server/stream-bridge.js +38 -0
- package/dist/server.js +313 -36
- package/dist/skills/marketplace.d.ts +87 -0
- package/dist/skills/marketplace.js +268 -0
- package/dist/storage/index.d.ts +14 -0
- package/dist/storage/index.js +64 -3
- package/dist/storage/schema.d.ts +4 -4
- package/dist/storage/schema.js +1 -1
- package/dist/teams/index.d.ts +110 -0
- package/dist/teams/index.js +365 -0
- package/dist/tickets/types.d.ts +39 -39
- package/dist/types/summary.d.ts +5 -5
- package/dist/utils/auto-update.d.ts +23 -0
- package/dist/utils/auto-update.js +157 -0
- package/dist/utils/offline-detect.d.ts +55 -0
- package/dist/utils/offline-detect.js +121 -0
- package/dist/utils/pid-file.d.ts +36 -0
- package/dist/utils/pid-file.js +125 -0
- package/dist/utils/prevent-sleep.d.ts +27 -0
- package/dist/utils/prevent-sleep.js +95 -0
- package/dist/utils/sanitizer.d.ts +57 -0
- package/dist/utils/sanitizer.js +174 -0
- package/docker-compose.yml +13 -137
- package/package.json +31 -6
- package/skills/deploy-cloudflare/SKILL.md +62 -0
- package/skills/deploy-vercel/SKILL.md +67 -0
- package/skills/docker-deploy/SKILL.md +158 -0
- package/skills/full-stack-builder/SKILL.md +92 -0
- package/skills/humanizer/SKILL.md +488 -0
- package/skills/profclaw-assistant/SKILL.md +85 -56
- package/ui/dist/assets/ActivityView-Da6HQ8ws.js +1 -0
- package/ui/dist/assets/AgentList-H58R0kX3.js +1 -0
- package/ui/dist/assets/AnalyticsDashboard-B28AeRsc.js +1 -0
- package/ui/dist/assets/AreaChart-DwLzeAQ8.js +1 -0
- package/ui/dist/assets/CartesianChart-piKQsTAR.js +36 -0
- package/ui/dist/assets/ChatView-Dbj8rxU5.js +10 -0
- package/ui/dist/assets/CostsDashboard-C6F5df0F.js +1 -0
- package/ui/dist/assets/EstimateSelect-wga0rUKX.js +1 -0
- package/ui/dist/assets/FeedDashboard-Ef6FEzEf.js +1 -0
- package/ui/dist/assets/FloatingChatbot-0yhkUeCq.js +2 -0
- package/ui/dist/assets/InviteCodeManagement-tUXfx4Bc.js +2 -0
- package/ui/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/ui/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/ui/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/ui/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/ui/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/ui/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/ui/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/ui/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/ui/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/ui/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/ui/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/ui/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/ui/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/ui/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/ui/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/ui/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/ui/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/ui/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/ui/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/ui/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/ui/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/ui/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/ui/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/ui/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/ui/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/ui/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/ui/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/ui/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/ui/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/ui/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/ui/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/ui/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/ui/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/ui/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/ui/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/ui/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/ui/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/ui/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/ui/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/ui/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/ui/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/ui/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/ui/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/ui/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/ui/dist/assets/MarketplacePage-DGrLtolR.js +1 -0
- package/ui/dist/assets/{ProjectDetail--gPfvATB.js → ProjectDetail-BgWvA6UP.js} +2 -2
- package/ui/dist/assets/ProjectIcon-TDuliqwg.js +1 -0
- package/ui/dist/assets/ProjectList-DXgM4187.js +1 -0
- package/ui/dist/assets/{Settings-1kaf7VHE.js → Settings-xA8Zhi3p.js} +3 -3
- package/ui/dist/assets/StatusIndicator-B8vfFAxg.js +1 -0
- package/ui/dist/assets/{SummaryDetail-DV3AmONk.js → SummaryDetail-eedRfTtF.js} +2 -2
- package/ui/dist/assets/SummaryList-CLNX2P84.js +1 -0
- package/ui/dist/assets/TaskDetail-BtWclNiR.js +1 -0
- package/ui/dist/assets/TaskList-JjODAgSc.js +1 -0
- package/ui/dist/assets/TeamsPage-CBK5iAyx.js +1 -0
- package/ui/dist/assets/TicketBoard-C9aJNNYp.js +1 -0
- package/ui/dist/assets/TicketDetail-CV5JmL31.js +1 -0
- package/ui/dist/assets/TicketList-68V4lzUz.js +1 -0
- package/ui/dist/assets/UserManagement-DKTb6UpE.js +2 -0
- package/ui/dist/assets/ViewSwitcher-BvdQht2Y.js +1 -0
- package/ui/dist/assets/alert-dialog-O6qBOv_f.js +1 -0
- package/ui/dist/assets/{archive-BsLa7brF.js → archive-CX7UvZpf.js} +1 -1
- package/ui/dist/assets/badge-BbfnwDJP.js +1 -0
- package/ui/dist/assets/{bug-CmZI7jqM.js → bug-3WX0394-.js} +1 -1
- package/ui/dist/assets/{calendar-Bf0t2B82.js → calendar-buq77TaS.js} +1 -1
- package/ui/dist/assets/{chevron-up-CoUsOvZj.js → chevron-up-4ymsBJRo.js} +1 -1
- package/ui/dist/assets/{circle-x-Dgw11LgT.js → circle-x-ByXtwR6Y.js} +1 -1
- package/ui/dist/assets/constants-CVdDh7p0.js +1 -0
- package/ui/dist/assets/{cpu-DiPMQICV.js → cpu-CiuoCeDY.js} +1 -1
- package/ui/dist/assets/{database-BwTfupDi.js → database-BWXSBg5a.js} +1 -1
- package/ui/dist/assets/dialog-lDg4NvMV.js +1 -0
- package/ui/dist/assets/dollar-sign-Dmijd6DP.js +1 -0
- package/ui/dist/assets/{ellipsis-UJx4Xnf6.js → ellipsis-vT-5SVIp.js} +1 -1
- package/ui/dist/assets/{ellipsis-vertical-DoULYEKn.js → ellipsis-vertical-B4tAX_bL.js} +1 -1
- package/ui/dist/assets/feature-markdown-DBo5Q7uq.js +289 -0
- package/ui/dist/assets/{file-code-B2UrJLwi.js → file-code-ChOWdKXf.js} +1 -1
- package/ui/dist/assets/{folder-open-BJi577JH.js → folder-open-CkOUbIiP.js} +1 -1
- package/ui/dist/assets/{funnel-PkaD_HSR.js → funnel-uZkoSPP-.js} +1 -1
- package/ui/dist/assets/{git-branch-C_K30am0.js → git-branch-CwvUxj7C.js} +1 -1
- package/ui/dist/assets/{git-commit-horizontal-IT6ecxWQ.js → git-commit-horizontal-lxPzCvhD.js} +1 -1
- package/ui/dist/assets/{globe-f-jjCa_g.js → globe-D_WpJdsj.js} +1 -1
- package/ui/dist/assets/{hash-DNEv8Elo.js → hash-CA0hJ7vh.js} +1 -1
- package/ui/dist/assets/{history-BQSBo_1Q.js → history-CEWMLELs.js} +1 -1
- package/ui/dist/assets/inbox-ehtOptTV.js +1 -0
- package/ui/dist/assets/{index-nS3EErDg.js → index-C1rhbml4.js} +3 -3
- package/ui/dist/assets/index-CR8gfCHv.js +1 -0
- package/ui/dist/assets/index-DVXMpWai.js +1 -0
- package/ui/dist/assets/index-DaDJMM2v.js +1 -0
- package/ui/dist/assets/index-Djdq_0xu.js +1 -0
- package/ui/dist/assets/index-M46Gcb8K.css +1 -0
- package/ui/dist/assets/index-sEBN7w8J.js +109 -0
- package/ui/dist/assets/layers-C6Mhf8Nk.js +1 -0
- package/ui/dist/assets/{layout-dashboard-CcKt1hXw.js → layout-dashboard-BRUM0kpT.js} +1 -1
- package/ui/dist/assets/{lightbulb-Jhp7FvbU.js → lightbulb-CN2q1O5l.js} +1 -1
- package/ui/dist/assets/{link-2-DdO7ostF.js → link-2-CC4E28yJ.js} +1 -1
- package/ui/dist/assets/markdown-renderer-C6ENbB0u.js +10 -0
- package/ui/dist/assets/markdown-renderer-CfVKi3_s.css +1 -0
- package/ui/dist/assets/{message-square-CBgH65X7.js → message-square-Bbb241am.js} +1 -1
- package/ui/dist/assets/package-CwT3IzFx.js +1 -0
- package/ui/dist/assets/{pencil-CYXCEPQh.js → pencil-CDmiHzoj.js} +1 -1
- package/ui/dist/assets/{play-d1ONaH0-.js → play-tjy5jMQX.js} +1 -1
- package/ui/dist/assets/popover-CFHZf3pE.js +1 -0
- package/ui/dist/assets/progress-BboUHuLf.js +1 -0
- package/ui/dist/assets/{rocket-DhvUetsk.js → rocket--8ZHgdXJ.js} +1 -1
- package/ui/dist/assets/select-n108rXny.js +1 -0
- package/ui/dist/assets/{send-P0r5D7td.js → send-Cu7MR2Qh.js} +1 -1
- package/ui/dist/assets/server-DmodxZp-.js +1 -0
- package/ui/dist/assets/{settings-2-ocj5uHGx.js → settings-2-CkRNqkxj.js} +1 -1
- package/ui/dist/assets/sheet-7aUJkyzU.js +1 -0
- package/ui/dist/assets/{shield-check-DfVdE34l.js → shield-check-ViI3nMKE.js} +1 -1
- package/ui/dist/assets/{shield-off-8l0J6R-8.js → shield-off-DN3tagkn.js} +1 -1
- package/ui/dist/assets/skeleton-C0E1Nfro.js +1 -0
- package/ui/dist/assets/{smartphone-77_g3SQn.js → smartphone-5FghiXpA.js} +1 -1
- package/ui/dist/assets/{square-Ckzsr3Rn.js → square-DiNSx8K7.js} +1 -1
- package/ui/dist/assets/star-DhdFVidS.js +1 -0
- package/ui/dist/assets/switch-CIgVbZqQ.js +1 -0
- package/ui/dist/assets/table-BC56FVMV.js +1 -0
- package/ui/dist/assets/{tag-C35mgoEv.js → tag-CH_vQliw.js} +1 -1
- package/ui/dist/assets/textarea-CxDiKFXZ.js +1 -0
- package/ui/dist/assets/{timer-DHJBS2w1.js → timer-CdGVTb60.js} +1 -1
- package/ui/dist/assets/tooltip-BuW9A5UO.js +1 -0
- package/ui/dist/assets/{trash-2-keO5tKPE.js → trash-2-CucZJL0N.js} +1 -1
- package/ui/dist/assets/trending-down-BCezC1z2.js +1 -0
- package/ui/dist/assets/{trending-up-BBv8KbrY.js → trending-up-C5OYX2k2.js} +1 -1
- package/ui/dist/assets/vendor-query-C0p7b53x.js +4 -0
- package/ui/dist/assets/vendor-react-Mc5_kfYG.js +12 -0
- package/ui/dist/assets/vendor-ui-CXPAUBFv.js +51 -0
- package/ui/dist/assets/{wand-sparkles-BusQ52ZK.js → wand-sparkles-BaH6pJnc.js} +1 -1
- package/ui/dist/assets/{wrench-02YaOSiK.js → wrench-CjxjP6ok.js} +1 -1
- package/ui/dist/index.html +5 -2
- package/ui/dist/assets/ActivityView-BeshZXmE.js +0 -1
- package/ui/dist/assets/AgentList-QVHeldPi.js +0 -1
- package/ui/dist/assets/AnalyticsDashboard-C9R97dXE.js +0 -1
- package/ui/dist/assets/AreaChart-B73gaiVQ.js +0 -1
- package/ui/dist/assets/CartesianChart-CXYL2R-A.js +0 -36
- package/ui/dist/assets/ChatView-qjZErlrp.js +0 -10
- package/ui/dist/assets/CostsDashboard-O4DCLy1i.js +0 -1
- package/ui/dist/assets/EstimateSelect-1hQf4Osk.js +0 -1
- package/ui/dist/assets/FloatingChatbot-BZBzrJxd.js +0 -2
- package/ui/dist/assets/InviteCodeManagement-LEoGqYeA.js +0 -2
- package/ui/dist/assets/ProjectIcon-Chd_ofsw.js +0 -1
- package/ui/dist/assets/ProjectList-BvUfVB6c.js +0 -4
- package/ui/dist/assets/StatusIndicator-pRfkNcdV.js +0 -1
- package/ui/dist/assets/SummaryList-B6kXiTxL.js +0 -1
- package/ui/dist/assets/TaskDetail-CV6CzbOS.js +0 -1
- package/ui/dist/assets/TaskList-DL7brQKd.js +0 -1
- package/ui/dist/assets/TicketBoard-CrkkFj7C.js +0 -1
- package/ui/dist/assets/TicketDetail-hnnYclpD.js +0 -1
- package/ui/dist/assets/TicketList-CsDAyQCL.js +0 -1
- package/ui/dist/assets/UserManagement-BGFQyTSr.js +0 -2
- package/ui/dist/assets/ViewSwitcher-CnL0OqA8.js +0 -1
- package/ui/dist/assets/alert-dialog-SKM6Gjz4.js +0 -7
- package/ui/dist/assets/badge-CVHH1a-v.js +0 -1
- package/ui/dist/assets/brain-6o_RHVpe.js +0 -1
- package/ui/dist/assets/constants-Q5Zivl-a.js +0 -1
- package/ui/dist/assets/dialog-BUqN9Psj.js +0 -1
- package/ui/dist/assets/index-BUmnwPQr.js +0 -1
- package/ui/dist/assets/index-BfF5G4Cw.js +0 -1
- package/ui/dist/assets/index-C8N375c2.js +0 -1
- package/ui/dist/assets/index-CuxnqVVz.css +0 -1
- package/ui/dist/assets/index-CzMM3QOk.js +0 -1
- package/ui/dist/assets/index-lJlNPFVJ.js +0 -67
- package/ui/dist/assets/layers-jFqVrWMD.js +0 -1
- package/ui/dist/assets/markdown-renderer-n1ToC4XQ.js +0 -36
- package/ui/dist/assets/popover-CrmZgoWu.js +0 -1
- package/ui/dist/assets/progress-uv4SPkL5.js +0 -1
- package/ui/dist/assets/select-CeQ8AHGy.js +0 -1
- package/ui/dist/assets/server-CVHTZB72.js +0 -1
- package/ui/dist/assets/sheet-DuQExSho.js +0 -1
- package/ui/dist/assets/skeleton-TFiFJ3nB.js +0 -1
- package/ui/dist/assets/switch-CAePkd6k.js +0 -1
- package/ui/dist/assets/table-ZjAZ7hkt.js +0 -1
- package/ui/dist/assets/textarea-DsVPnSgR.js +0 -1
- package/ui/dist/assets/tooltip-BYmQ331W.js +0 -1
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ExecutorRunner: the built-in model-backed AgentRunner for verified runs.
|
|
3
|
+
*
|
|
4
|
+
* Adapts AgentExecutor to the AgentRunner seam used by runVerifiedGoal:
|
|
5
|
+
* - runs the executor with the run's worktree as the only place it can touch
|
|
6
|
+
* (worktree-confined tools plus the PermissionManager, never push or PR);
|
|
7
|
+
* - feeds it the goal plus the previous attempt's trimmed verifier output;
|
|
8
|
+
* - reports tokens, dollars and cache hit rate so the loop's budget guard works,
|
|
9
|
+
* and cancels an attempt mid-flight when the remaining budget is spent;
|
|
10
|
+
* - cascades models: starts on the smart router's cheap pick and moves one
|
|
11
|
+
* tier up after N consecutive verifier failures (N is configurable).
|
|
12
|
+
*
|
|
13
|
+
* AgentExecutor is used as-is. Cache usage is read from its public
|
|
14
|
+
* `step:complete` event, so the executor internals are not touched.
|
|
15
|
+
*/
|
|
16
|
+
import { randomUUID } from 'node:crypto';
|
|
17
|
+
import { AgentExecutor } from './executor.js';
|
|
18
|
+
import { createRunPermissionManager, createWorktreeToolset } from './worktree-tools.js';
|
|
19
|
+
import { classifyComplexity, selectModel } from '../providers/smart-router.js';
|
|
20
|
+
import { getModelInfo, resolveModelAlias } from '../providers/core/models.js';
|
|
21
|
+
import { extractCacheUsage, getCacheConfigForModel } from '../providers/prompt-cache.js';
|
|
22
|
+
const TIER_ORDER = ['trivial', 'standard', 'complex'];
|
|
23
|
+
function toChoice(spec, tier) {
|
|
24
|
+
const resolved = resolveModelAlias(spec);
|
|
25
|
+
const modelId = resolved?.model ?? spec;
|
|
26
|
+
const info = getModelInfo(modelId);
|
|
27
|
+
const provider = resolved?.provider ?? info?.provider;
|
|
28
|
+
if (!provider) {
|
|
29
|
+
throw new Error(`Unknown model "${spec}". Use an alias, a catalog id, or provider/model.`);
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
provider,
|
|
33
|
+
model: modelId,
|
|
34
|
+
costPer1MInput: info?.costPer1MInput ?? 0,
|
|
35
|
+
costPer1MOutput: info?.costPer1MOutput ?? 0,
|
|
36
|
+
tier,
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Build the ordered list of models an attempt series may use.
|
|
41
|
+
*
|
|
42
|
+
* `modelSpec` (comma separated) pins an explicit ladder, cheapest first.
|
|
43
|
+
* Without it the smart router classifies the goal, picks the cheap model for
|
|
44
|
+
* that tier, and appends the picks for each higher tier (deduplicated).
|
|
45
|
+
*/
|
|
46
|
+
export function buildModelLadder(goal, availableProviders, modelSpec) {
|
|
47
|
+
const specs = (modelSpec ?? '').split(',').map((s) => s.trim()).filter((s) => s.length > 0);
|
|
48
|
+
if (specs.length > 0)
|
|
49
|
+
return specs.map((s) => toChoice(s, 'pinned'));
|
|
50
|
+
if (availableProviders.size === 0) {
|
|
51
|
+
throw new Error('No model provider is configured. Set a provider API key or pass --model.');
|
|
52
|
+
}
|
|
53
|
+
const complexity = classifyComplexity(goal, { hasCodeContext: true, hasToolUse: true });
|
|
54
|
+
const startIndex = TIER_ORDER.indexOf(complexity.tier);
|
|
55
|
+
const ladder = [];
|
|
56
|
+
for (const tier of TIER_ORDER.slice(startIndex)) {
|
|
57
|
+
const picked = selectModel({ ...complexity, tier }, availableProviders).selectedModel;
|
|
58
|
+
if (!picked.supportsTools)
|
|
59
|
+
continue;
|
|
60
|
+
if (ladder.some((c) => c.model === picked.id))
|
|
61
|
+
continue;
|
|
62
|
+
ladder.push({
|
|
63
|
+
provider: picked.provider,
|
|
64
|
+
model: picked.id,
|
|
65
|
+
costPer1MInput: picked.costPer1MInput,
|
|
66
|
+
costPer1MOutput: picked.costPer1MOutput,
|
|
67
|
+
tier,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
if (ladder.length === 0)
|
|
71
|
+
throw new Error('The router found no tool-capable model. Pass --model.');
|
|
72
|
+
return ladder;
|
|
73
|
+
}
|
|
74
|
+
/** Dollar cost with cache reads and writes priced by their multipliers. */
|
|
75
|
+
export function computeCostUsd(choice, usage, cache) {
|
|
76
|
+
const read = Math.min(usage.cacheReadTokens, usage.inputTokens);
|
|
77
|
+
const write = Math.min(usage.cacheWriteTokens, usage.inputTokens - read);
|
|
78
|
+
const fresh = usage.inputTokens - read - write;
|
|
79
|
+
const inputUnits = fresh + read * cache.readMultiplier + write * cache.writeMultiplier;
|
|
80
|
+
return (inputUnits * choice.costPer1MInput + usage.outputTokens * choice.costPer1MOutput) / 1_000_000;
|
|
81
|
+
}
|
|
82
|
+
export const DEFAULT_RUNNER_CONFIG = {
|
|
83
|
+
escalateAfter: 2,
|
|
84
|
+
maxStepsPerAttempt: 40,
|
|
85
|
+
attemptTokenBudget: 200_000,
|
|
86
|
+
commandTimeoutMs: 120_000,
|
|
87
|
+
maxToolOutputChars: 8_000,
|
|
88
|
+
};
|
|
89
|
+
function envNumber(env, key) {
|
|
90
|
+
const raw = env[key];
|
|
91
|
+
if (raw === undefined || raw.trim() === '')
|
|
92
|
+
return undefined;
|
|
93
|
+
const n = Number(raw);
|
|
94
|
+
return Number.isFinite(n) && n >= 0 ? n : undefined;
|
|
95
|
+
}
|
|
96
|
+
/** Precedence: explicit flag > PROFCLAW_RUN_* env var > default. */
|
|
97
|
+
export function resolveRunnerConfig(flags, env = process.env) {
|
|
98
|
+
const pick = (key, envKey) => flags[key] ?? envNumber(env, envKey) ?? DEFAULT_RUNNER_CONFIG[key];
|
|
99
|
+
const cfg = {
|
|
100
|
+
escalateAfter: Math.floor(pick('escalateAfter', 'PROFCLAW_RUN_ESCALATE_AFTER')),
|
|
101
|
+
maxStepsPerAttempt: Math.max(1, Math.floor(pick('maxStepsPerAttempt', 'PROFCLAW_RUN_MAX_STEPS'))),
|
|
102
|
+
attemptTokenBudget: Math.max(1, Math.floor(pick('attemptTokenBudget', 'PROFCLAW_RUN_ATTEMPT_TOKENS'))),
|
|
103
|
+
commandTimeoutMs: Math.max(1, pick('commandTimeoutMs', 'PROFCLAW_RUN_COMMAND_TIMEOUT_MS')),
|
|
104
|
+
maxToolOutputChars: Math.max(1, Math.floor(pick('maxToolOutputChars', 'PROFCLAW_RUN_TOOL_OUTPUT_CHARS'))),
|
|
105
|
+
};
|
|
106
|
+
return cfg;
|
|
107
|
+
}
|
|
108
|
+
const SYSTEM_PROMPT = [
|
|
109
|
+
'You are a coding agent working toward a goal inside an isolated git worktree.',
|
|
110
|
+
'Use the tools to read and edit files and to run commands. Every path is relative to the working directory and you cannot leave it.',
|
|
111
|
+
'Run the verify command yourself to check your work. The run only counts as done when that command exits 0.',
|
|
112
|
+
'Never push to a remote, never open pull requests, never touch git configuration.',
|
|
113
|
+
'When finished, call complete_task with a short summary.',
|
|
114
|
+
].join('\n');
|
|
115
|
+
export function buildAgentMessages(input) {
|
|
116
|
+
const lines = [
|
|
117
|
+
`Goal: ${input.goal}`,
|
|
118
|
+
`Verify command (must exit 0): ${input.verifyCommand}`,
|
|
119
|
+
`Attempt ${input.attempt}.`,
|
|
120
|
+
];
|
|
121
|
+
if (input.feedback) {
|
|
122
|
+
lines.push('', 'The previous attempt did not pass verification. Trimmed verifier output:', input.feedback);
|
|
123
|
+
}
|
|
124
|
+
return [
|
|
125
|
+
{ role: 'system', content: SYSTEM_PROMPT },
|
|
126
|
+
{ role: 'user', content: lines.join('\n') },
|
|
127
|
+
];
|
|
128
|
+
}
|
|
129
|
+
function stepUsage(result) {
|
|
130
|
+
return typeof result === 'object' && result !== null ? result['usage'] : undefined;
|
|
131
|
+
}
|
|
132
|
+
/** Tool results that report failure as data ({ success: false } or { error }) rather than throwing. */
|
|
133
|
+
function isFailedToolResult(out) {
|
|
134
|
+
if (typeof out !== 'object' || out === null)
|
|
135
|
+
return false;
|
|
136
|
+
const rec = out;
|
|
137
|
+
return rec['success'] === false || rec['ok'] === false || (typeof rec['error'] === 'string' && rec['error'] !== '');
|
|
138
|
+
}
|
|
139
|
+
export class ExecutorRunner {
|
|
140
|
+
options;
|
|
141
|
+
config;
|
|
142
|
+
env;
|
|
143
|
+
permissions;
|
|
144
|
+
tierIndex = 0;
|
|
145
|
+
failuresOnTier = 0;
|
|
146
|
+
spentTokens = 0;
|
|
147
|
+
spentUsd = 0;
|
|
148
|
+
constructor(options) {
|
|
149
|
+
this.options = options;
|
|
150
|
+
if (options.ladder.length === 0)
|
|
151
|
+
throw new Error('ExecutorRunner needs at least one model');
|
|
152
|
+
this.config = resolveRunnerConfig(options.config ?? {}, options.env);
|
|
153
|
+
this.env = options.env;
|
|
154
|
+
this.permissions = options.permissions ?? createRunPermissionManager();
|
|
155
|
+
}
|
|
156
|
+
/** Model the next attempt would use (for tests and diagnostics). */
|
|
157
|
+
get currentChoice() {
|
|
158
|
+
return this.options.ladder[this.tierIndex];
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* A call that arrives with feedback means the previous attempt failed
|
|
162
|
+
* verification (or crashed). After `escalateAfter` such failures in a row on
|
|
163
|
+
* the same model, move to the next tier up, if there is one.
|
|
164
|
+
*/
|
|
165
|
+
selectChoice(input) {
|
|
166
|
+
let escalated = false;
|
|
167
|
+
if (input.feedback !== undefined)
|
|
168
|
+
this.failuresOnTier++;
|
|
169
|
+
const { escalateAfter } = this.config;
|
|
170
|
+
if (escalateAfter > 0 &&
|
|
171
|
+
this.failuresOnTier >= escalateAfter &&
|
|
172
|
+
this.tierIndex < this.options.ladder.length - 1) {
|
|
173
|
+
this.tierIndex++;
|
|
174
|
+
this.failuresOnTier = 0;
|
|
175
|
+
escalated = true;
|
|
176
|
+
}
|
|
177
|
+
return { choice: this.currentChoice, escalated };
|
|
178
|
+
}
|
|
179
|
+
async runAttempt(input) {
|
|
180
|
+
const { choice, escalated } = this.selectChoice(input);
|
|
181
|
+
this.options.onEvent?.({ type: 'model_selected', attempt: input.attempt, choice, escalated });
|
|
182
|
+
const tokenCap = this.options.maxTokens ?? 0;
|
|
183
|
+
const costCap = this.options.maxCostUsd ?? 0;
|
|
184
|
+
const tokensLeft = tokenCap > 0 ? Math.max(1, tokenCap - this.spentTokens) : Number.POSITIVE_INFINITY;
|
|
185
|
+
const costLeft = costCap > 0 ? costCap - this.spentUsd : Number.POSITIVE_INFINITY;
|
|
186
|
+
const attemptBudget = Math.floor(Math.min(this.config.attemptTokenBudget, tokensLeft));
|
|
187
|
+
const toolset = createWorktreeToolset({
|
|
188
|
+
workdir: input.workdir,
|
|
189
|
+
permissions: this.permissions,
|
|
190
|
+
commandTimeoutMs: this.config.commandTimeoutMs,
|
|
191
|
+
maxOutputChars: this.config.maxToolOutputChars,
|
|
192
|
+
});
|
|
193
|
+
const sessionId = `verified-run-${randomUUID().slice(0, 8)}-a${input.attempt}`;
|
|
194
|
+
const loop = (this.options.createLoop ?? defaultCreateLoop)({
|
|
195
|
+
sessionId,
|
|
196
|
+
goal: input.goal,
|
|
197
|
+
config: {
|
|
198
|
+
maxSteps: this.config.maxStepsPerAttempt,
|
|
199
|
+
maxBudget: attemptBudget,
|
|
200
|
+
securityMode: 'sandbox',
|
|
201
|
+
// Tool timeout in the executor must outlast the shell timeout.
|
|
202
|
+
stepTimeoutMs: this.config.commandTimeoutMs + 5_000,
|
|
203
|
+
enableStreaming: false,
|
|
204
|
+
},
|
|
205
|
+
});
|
|
206
|
+
let cacheRead = 0;
|
|
207
|
+
let cacheWrite = 0;
|
|
208
|
+
let budgetStopped = false;
|
|
209
|
+
const usageNow = (state) => ({
|
|
210
|
+
inputTokens: state.inputTokensUsed,
|
|
211
|
+
outputTokens: state.outputTokensUsed,
|
|
212
|
+
cacheReadTokens: cacheRead,
|
|
213
|
+
cacheWriteTokens: cacheWrite,
|
|
214
|
+
});
|
|
215
|
+
loop.on('step:complete', (state, result) => {
|
|
216
|
+
const usage = extractCacheUsage(stepUsage(result));
|
|
217
|
+
cacheRead += usage.cacheReadTokens;
|
|
218
|
+
cacheWrite += usage.cacheWriteTokens;
|
|
219
|
+
if (computeCostUsd(choice, usageNow(state), getCacheConfigForModel(choice.model, this.env)) >= costLeft && !budgetStopped) {
|
|
220
|
+
budgetStopped = true;
|
|
221
|
+
loop.cancel();
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
input.signal?.addEventListener('abort', () => loop.cancel(), { once: true });
|
|
225
|
+
let failure;
|
|
226
|
+
let finalState;
|
|
227
|
+
try {
|
|
228
|
+
const model = await this.options.createModel(choice);
|
|
229
|
+
const onToolCall = this.options.onToolCall;
|
|
230
|
+
const execute = onToolCall
|
|
231
|
+
? async (name, args) => {
|
|
232
|
+
const startedAt = Date.now();
|
|
233
|
+
try {
|
|
234
|
+
const out = await toolset.execute(name, args);
|
|
235
|
+
onToolCall({ attempt: input.attempt, name, args, durationMs: Date.now() - startedAt, ok: !isFailedToolResult(out) });
|
|
236
|
+
return out;
|
|
237
|
+
}
|
|
238
|
+
catch (error) {
|
|
239
|
+
onToolCall({ attempt: input.attempt, name, args, durationMs: Date.now() - startedAt, ok: false });
|
|
240
|
+
throw error;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
: toolset.execute;
|
|
244
|
+
finalState = await loop.run(model, buildAgentMessages(input), toolset.tools, execute, choice.provider);
|
|
245
|
+
}
|
|
246
|
+
catch (error) {
|
|
247
|
+
failure = error instanceof Error ? error.message : String(error);
|
|
248
|
+
finalState = loop.getState();
|
|
249
|
+
}
|
|
250
|
+
finally {
|
|
251
|
+
await toolset.dispose();
|
|
252
|
+
}
|
|
253
|
+
const inputTokens = finalState.inputTokensUsed;
|
|
254
|
+
const outputTokens = finalState.outputTokensUsed;
|
|
255
|
+
const tokens = inputTokens + outputTokens > 0 ? inputTokens + outputTokens : finalState.usedBudget;
|
|
256
|
+
const costUsd = computeCostUsd(choice, usageNow(finalState), getCacheConfigForModel(choice.model, this.env));
|
|
257
|
+
this.spentTokens += tokens;
|
|
258
|
+
this.spentUsd += costUsd;
|
|
259
|
+
// A failure before any tokens were spent is a setup problem (auth, model
|
|
260
|
+
// unavailable): surface it so the loop records an agent error. After real
|
|
261
|
+
// spend, report it in the summary and let the verifier judge the worktree.
|
|
262
|
+
if (failure !== undefined && tokens === 0)
|
|
263
|
+
throw new Error(failure);
|
|
264
|
+
const summary = this.summarize(finalState, failure, budgetStopped);
|
|
265
|
+
const cacheHitRate = inputTokens > 0 && cacheRead + cacheWrite > 0 ? cacheRead / inputTokens : undefined;
|
|
266
|
+
return {
|
|
267
|
+
summary,
|
|
268
|
+
tokensUsed: tokens,
|
|
269
|
+
costUsd,
|
|
270
|
+
model: choice.model,
|
|
271
|
+
cacheHitRate,
|
|
272
|
+
usage: { inputTokens, outputTokens, cacheReadTokens: cacheRead, cacheWriteTokens: cacheWrite },
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
summarize(state, failure, budgetStopped) {
|
|
276
|
+
if (budgetStopped)
|
|
277
|
+
return 'Stopped mid-attempt: the run cost budget was reached.';
|
|
278
|
+
if (failure !== undefined)
|
|
279
|
+
return `Agent error after partial work: ${failure}`;
|
|
280
|
+
return (state.finalResult?.summary ?? 'Agent finished without a summary.').slice(0, 500);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
function defaultCreateLoop(args) {
|
|
284
|
+
return new AgentExecutor(args.sessionId, args.sessionId, args.goal, args.config);
|
|
285
|
+
}
|
|
286
|
+
/** Build a runner on the configured providers via the smart router. */
|
|
287
|
+
export async function createDefaultExecutorRunner(args) {
|
|
288
|
+
const { aiProvider } = await import('../providers/ai-sdk.js');
|
|
289
|
+
const env = args.env ?? process.env;
|
|
290
|
+
const modelSpec = args.model ?? (env['PROFCLAW_RUN_MODEL']?.trim() || undefined);
|
|
291
|
+
const ladder = buildModelLadder(args.goal, new Set(aiProvider.getConfiguredProviders()), modelSpec);
|
|
292
|
+
return new ExecutorRunner({
|
|
293
|
+
ladder,
|
|
294
|
+
createModel: (choice) => aiProvider.getModel(choice.provider, choice.model),
|
|
295
|
+
config: args.config,
|
|
296
|
+
env,
|
|
297
|
+
maxTokens: args.maxTokens,
|
|
298
|
+
maxCostUsd: args.maxCostUsd,
|
|
299
|
+
onEvent: args.onEvent,
|
|
300
|
+
onToolCall: args.onToolCall,
|
|
301
|
+
});
|
|
302
|
+
}
|
|
303
|
+
//# sourceMappingURL=executor-runner.js.map
|
|
@@ -9,19 +9,47 @@
|
|
|
9
9
|
import type { LanguageModel, ModelMessage, ToolSet } from "ai";
|
|
10
10
|
import { EventEmitter } from "node:events";
|
|
11
11
|
import type { AgentState, AgentConfig, AgentEvents } from "./types.js";
|
|
12
|
+
import type { AgentEvent } from "./events.js";
|
|
13
|
+
import type { ExecutorCheckpoint } from "./checkpoint-manager.js";
|
|
14
|
+
/** Handler called by the executor to execute a tool by name */
|
|
15
|
+
export type ToolExecuteHandler = (name: string, args: Record<string, unknown>) => Promise<unknown>;
|
|
12
16
|
type ExecutorTools = ToolSet;
|
|
13
17
|
export declare class AgentExecutor extends EventEmitter<AgentEvents> {
|
|
14
18
|
private state;
|
|
15
19
|
private config;
|
|
16
20
|
private abortController;
|
|
17
21
|
private isRunning;
|
|
22
|
+
private resultStore;
|
|
23
|
+
private circuitBreaker;
|
|
24
|
+
private hooks;
|
|
25
|
+
private compactor;
|
|
26
|
+
private checkpointManager;
|
|
18
27
|
constructor(sessionId: string, conversationId: string, goal: string, config?: Partial<AgentConfig>);
|
|
28
|
+
/**
|
|
29
|
+
* Async generator that streams agent events as they happen.
|
|
30
|
+
*
|
|
31
|
+
* Yields AgentEvent values in real time: session:start, step:start,
|
|
32
|
+
* tool:call, tool:result/tool:error, content, cost:update, step:complete,
|
|
33
|
+
* and finally session:complete, session:error, or session:abort.
|
|
34
|
+
*
|
|
35
|
+
* This is the canonical implementation; run() delegates here.
|
|
36
|
+
*/
|
|
37
|
+
stream(model: LanguageModel, messages: ModelMessage[], tools: ExecutorTools, onToolExecute?: ToolExecuteHandler, providerHint?: string): AsyncGenerator<AgentEvent>;
|
|
19
38
|
/**
|
|
20
39
|
* Run the agent until completion or stop condition.
|
|
21
40
|
* Uses AI SDK's native multi-step execution — a single generateText call
|
|
22
41
|
* with stopWhen + onStepFinish replaces the old manual loop.
|
|
42
|
+
*
|
|
43
|
+
* Backward-compatible: delegates to stream() and returns the final AgentState.
|
|
44
|
+
*/
|
|
45
|
+
run(model: LanguageModel, messages: ModelMessage[], tools: ExecutorTools, onToolExecute?: ToolExecuteHandler, providerHint?: string): Promise<AgentState>;
|
|
46
|
+
/**
|
|
47
|
+
* Resume execution from a saved checkpoint.
|
|
48
|
+
*
|
|
49
|
+
* Restores the message history and step counter from the checkpoint, emits a
|
|
50
|
+
* checkpoint:resumed event, then continues with generateText from that point.
|
|
23
51
|
*/
|
|
24
|
-
|
|
52
|
+
resume(checkpoint: ExecutorCheckpoint, model: LanguageModel, tools: ExecutorTools, onToolExecute?: ToolExecuteHandler, providerHint?: string): AsyncGenerator<AgentEvent>;
|
|
25
53
|
/**
|
|
26
54
|
* Cancel the running agent.
|
|
27
55
|
*/
|
|
@@ -45,6 +73,12 @@ export declare class AgentExecutor extends EventEmitter<AgentEvents> {
|
|
|
45
73
|
* after each step, the SDK calls execute() and feeds results back.
|
|
46
74
|
*/
|
|
47
75
|
private wrapToolsWithExecute;
|
|
76
|
+
/**
|
|
77
|
+
* Like wrapToolsWithExecute, but additionally pushes tool:call, tool:result,
|
|
78
|
+
* and tool:error AgentEvents via the provided push callback so that the
|
|
79
|
+
* stream() generator can yield them in real time.
|
|
80
|
+
*/
|
|
81
|
+
private wrapToolsWithExecuteAndEvents;
|
|
48
82
|
/**
|
|
49
83
|
* Check custom stop conditions that can't be expressed via AI SDK's stopWhen.
|
|
50
84
|
* These include consecutive failures, same tool repeated, budget, timeout, etc.
|
|
@@ -57,6 +91,8 @@ export declare class AgentExecutor extends EventEmitter<AgentEvents> {
|
|
|
57
91
|
*/
|
|
58
92
|
private injectFailureHint;
|
|
59
93
|
private extractContext;
|
|
94
|
+
/** Route one step's usage (with cache tokens) into the cost tracker. */
|
|
95
|
+
private trackStepUsage;
|
|
60
96
|
private finalize;
|
|
61
97
|
private collectArtifacts;
|
|
62
98
|
private collectNextSteps;
|