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
|
@@ -17,6 +17,7 @@ import { logger } from "../../utils/logger.js";
|
|
|
17
17
|
import { randomUUID } from "crypto";
|
|
18
18
|
import { hasSecrets, isSecretsDetectionEnabled, redactSecrets, } from "./secrets.js";
|
|
19
19
|
import { checkSafetyBounds } from "./guardrails.js";
|
|
20
|
+
import { CorrectionTracker, executeWithSelfCorrection, formatErrorContextForPrompt, suggestParameterFixes, classifyFailure, } from "./self-correction.js";
|
|
20
21
|
// Constants
|
|
21
22
|
const DEFAULT_TIMEOUT_MS = 300_000; // 5 minutes
|
|
22
23
|
const PROGRESS_THROTTLE_MS = 100; // Throttle progress updates
|
|
@@ -33,8 +34,39 @@ const redactToolText = (text) => {
|
|
|
33
34
|
return redactSecrets(text);
|
|
34
35
|
};
|
|
35
36
|
// Tool Executor
|
|
37
|
+
/** Error codes that represent user/policy decisions - self-correction must not retry these */
|
|
38
|
+
const NON_RETRYABLE_CODES = new Set([
|
|
39
|
+
'APPROVAL_REQUIRED',
|
|
40
|
+
'DENIED',
|
|
41
|
+
'USER_DENIED',
|
|
42
|
+
'SAFETY_BLOCKED',
|
|
43
|
+
'PROMPT_BLOCKED',
|
|
44
|
+
'RATE_LIMITED',
|
|
45
|
+
'TOOL_NOT_FOUND',
|
|
46
|
+
'MISSING_PARAMS',
|
|
47
|
+
'INVALID_PARAMS',
|
|
48
|
+
]);
|
|
49
|
+
/** Maximum retries per tool call enforced by the correction budget */
|
|
50
|
+
const MAX_CORRECTIONS_PER_CALL = 3;
|
|
36
51
|
export class ToolExecutor {
|
|
37
52
|
abortControllers = new Map();
|
|
53
|
+
/**
|
|
54
|
+
* One CorrectionTracker per conversation, reset when a conversation ends.
|
|
55
|
+
* Key: conversationId
|
|
56
|
+
*/
|
|
57
|
+
correctionTrackers = new Map();
|
|
58
|
+
getOrCreateTracker(conversationId) {
|
|
59
|
+
let tracker = this.correctionTrackers.get(conversationId);
|
|
60
|
+
if (!tracker) {
|
|
61
|
+
tracker = new CorrectionTracker(MAX_CORRECTIONS_PER_CALL);
|
|
62
|
+
this.correctionTrackers.set(conversationId, tracker);
|
|
63
|
+
}
|
|
64
|
+
return tracker;
|
|
65
|
+
}
|
|
66
|
+
/** Call this when a conversation is done to free the tracker. */
|
|
67
|
+
resetCorrectionBudget(conversationId) {
|
|
68
|
+
this.correctionTrackers.delete(conversationId);
|
|
69
|
+
}
|
|
38
70
|
/**
|
|
39
71
|
* Execute a single tool call
|
|
40
72
|
*/
|
|
@@ -242,137 +274,159 @@ export class ToolExecutor {
|
|
|
242
274
|
},
|
|
243
275
|
};
|
|
244
276
|
}
|
|
245
|
-
// Execute the tool through process pool
|
|
277
|
+
// Execute the tool through process pool, wrapped with self-correction
|
|
246
278
|
const processPool = getProcessPool();
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
return
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
const sanitizedOutput = redactToolText(result.output);
|
|
268
|
-
const sanitizedResult = sanitizedOutput === result.output
|
|
269
|
-
? result
|
|
270
|
-
: {
|
|
271
|
-
...result,
|
|
272
|
-
output: sanitizedOutput,
|
|
273
|
-
};
|
|
274
|
-
// Log successful execution
|
|
275
|
-
auditLogger.logExecution({
|
|
276
|
-
toolName: toolCall.name,
|
|
277
|
-
toolCallId,
|
|
278
|
-
conversationId: context.conversationId,
|
|
279
|
-
userId: context.userId,
|
|
280
|
-
params,
|
|
281
|
-
command: this.extractCommand(params),
|
|
282
|
-
securityMode: securityPolicy.mode,
|
|
283
|
-
success: sanitizedResult.success,
|
|
284
|
-
durationMs,
|
|
285
|
-
exitCode: sanitizedResult.data?.exitCode,
|
|
286
|
-
output: sanitizedResult.output,
|
|
287
|
-
error: sanitizedResult.error?.message,
|
|
288
|
-
});
|
|
289
|
-
logger.info(`[Executor] Tool ${toolCall.name} completed in ${durationMs}ms`, { component: "ToolExecutor" });
|
|
290
|
-
return {
|
|
291
|
-
toolCallId,
|
|
292
|
-
toolName: toolCall.name,
|
|
293
|
-
result: {
|
|
294
|
-
...sanitizedResult,
|
|
295
|
-
durationMs,
|
|
296
|
-
},
|
|
297
|
-
rateLimitInfo: {
|
|
298
|
-
remaining: rateLimitResult.remaining - 1,
|
|
299
|
-
resetAt: rateLimitResult.resetAt,
|
|
300
|
-
},
|
|
301
|
-
};
|
|
302
|
-
}
|
|
303
|
-
catch (error) {
|
|
304
|
-
const durationMs = Date.now() - startTime;
|
|
305
|
-
// Handle specific error types
|
|
306
|
-
if (error instanceof PoolFullError) {
|
|
307
|
-
auditLogger.logError({
|
|
308
|
-
toolName: toolCall.name,
|
|
309
|
-
toolCallId,
|
|
310
|
-
conversationId: context.conversationId,
|
|
279
|
+
const correctionTracker = this.getOrCreateTracker(context.conversationId);
|
|
280
|
+
/**
|
|
281
|
+
* Inner executor: submits one attempt to the process pool and converts
|
|
282
|
+
* thrown pool errors (PoolFullError, TimeoutError) into ToolResult failures
|
|
283
|
+
* so the self-correction classifier can handle them uniformly.
|
|
284
|
+
*/
|
|
285
|
+
const poolExecutor = async () => {
|
|
286
|
+
try {
|
|
287
|
+
return await processPool.submit(toolCallId, toolCall.name, context.conversationId, async () => {
|
|
288
|
+
if (securityCheck.sandboxRequired &&
|
|
289
|
+
securityPolicy.mode === "sandbox") {
|
|
290
|
+
return this.executeInSandbox(tool, params, context, toolCallId);
|
|
291
|
+
}
|
|
292
|
+
return this.executeWithTimeout(tool, params, {
|
|
293
|
+
...context,
|
|
294
|
+
toolCallId,
|
|
295
|
+
sessionManager: getSessionManager(),
|
|
296
|
+
securityPolicy,
|
|
297
|
+
}, DEFAULT_TIMEOUT_MS);
|
|
298
|
+
}, {
|
|
311
299
|
userId: context.userId,
|
|
312
|
-
|
|
300
|
+
priority: tool.securityLevel === "safe" ? 1 : 0,
|
|
301
|
+
timeout: DEFAULT_TIMEOUT_MS,
|
|
313
302
|
});
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
303
|
+
}
|
|
304
|
+
catch (err) {
|
|
305
|
+
if (err instanceof PoolFullError) {
|
|
306
|
+
return {
|
|
318
307
|
success: false,
|
|
319
308
|
error: {
|
|
320
309
|
code: "POOL_FULL",
|
|
321
310
|
message: "Too many concurrent executions. Please try again later.",
|
|
322
311
|
retryable: true,
|
|
323
312
|
},
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
if (error instanceof TimeoutError || error instanceof QueueTimeoutError) {
|
|
329
|
-
auditLogger.logTimeout({
|
|
330
|
-
toolName: toolCall.name,
|
|
331
|
-
toolCallId,
|
|
332
|
-
conversationId: context.conversationId,
|
|
333
|
-
userId: context.userId,
|
|
334
|
-
durationMs,
|
|
335
|
-
});
|
|
336
|
-
return {
|
|
337
|
-
toolCallId,
|
|
338
|
-
toolName: toolCall.name,
|
|
339
|
-
result: {
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
if (err instanceof TimeoutError || err instanceof QueueTimeoutError) {
|
|
316
|
+
return {
|
|
340
317
|
success: false,
|
|
341
318
|
error: {
|
|
342
319
|
code: "TIMEOUT",
|
|
343
|
-
message:
|
|
320
|
+
message: err instanceof Error ? err.message : "Execution timed out",
|
|
344
321
|
retryable: true,
|
|
345
322
|
},
|
|
346
|
-
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
return {
|
|
326
|
+
success: false,
|
|
327
|
+
error: {
|
|
328
|
+
code: "EXECUTION_ERROR",
|
|
329
|
+
message: err instanceof Error ? err.message : "Unknown error",
|
|
347
330
|
},
|
|
348
331
|
};
|
|
349
332
|
}
|
|
350
|
-
|
|
333
|
+
};
|
|
334
|
+
// Run with self-correction (auto-retry for retryable, context injection for fixable)
|
|
335
|
+
const correctionOutcome = await executeWithSelfCorrection(toolCall.name, poolExecutor, {
|
|
336
|
+
correctionBudget: correctionTracker.canCorrect()
|
|
337
|
+
? correctionTracker.getStatus().maxCorrections - correctionTracker.getStatus().used
|
|
338
|
+
: 0,
|
|
339
|
+
signal: undefined,
|
|
340
|
+
onRetry: (attempt, error) => {
|
|
341
|
+
logger.info(`[Executor] Self-correction retry ${attempt} for "${toolCall.name}": ${error.code} - ${error.message}`, { component: "ToolExecutor", toolName: toolCall.name, attempt });
|
|
342
|
+
correctionTracker.recordCorrection();
|
|
343
|
+
},
|
|
344
|
+
});
|
|
345
|
+
const rawResult = correctionOutcome.result;
|
|
346
|
+
const durationMs = Date.now() - startTime;
|
|
347
|
+
// Sanitize output secrets
|
|
348
|
+
const sanitizedOutput = redactToolText(rawResult.output);
|
|
349
|
+
const sanitizedResult = sanitizedOutput === rawResult.output
|
|
350
|
+
? rawResult
|
|
351
|
+
: { ...rawResult, output: sanitizedOutput };
|
|
352
|
+
// Audit log the final outcome
|
|
353
|
+
if (rawResult.error?.code === "POOL_FULL") {
|
|
354
|
+
auditLogger.logError({
|
|
355
|
+
toolName: toolCall.name,
|
|
356
|
+
toolCallId,
|
|
357
|
+
conversationId: context.conversationId,
|
|
358
|
+
userId: context.userId,
|
|
359
|
+
error: rawResult.error.message,
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
else if (rawResult.error?.code === "TIMEOUT") {
|
|
363
|
+
auditLogger.logTimeout({
|
|
364
|
+
toolName: toolCall.name,
|
|
365
|
+
toolCallId,
|
|
366
|
+
conversationId: context.conversationId,
|
|
367
|
+
userId: context.userId,
|
|
368
|
+
durationMs,
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
else {
|
|
351
372
|
auditLogger.logExecution({
|
|
352
373
|
toolName: toolCall.name,
|
|
353
374
|
toolCallId,
|
|
354
375
|
conversationId: context.conversationId,
|
|
355
376
|
userId: context.userId,
|
|
356
377
|
params,
|
|
378
|
+
command: this.extractCommand(params),
|
|
357
379
|
securityMode: securityPolicy.mode,
|
|
358
|
-
success:
|
|
380
|
+
success: sanitizedResult.success,
|
|
359
381
|
durationMs,
|
|
360
|
-
|
|
382
|
+
exitCode: sanitizedResult.data?.exitCode,
|
|
383
|
+
output: sanitizedResult.output,
|
|
384
|
+
error: sanitizedResult.error?.message,
|
|
361
385
|
});
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
386
|
+
}
|
|
387
|
+
if (sanitizedResult.success) {
|
|
388
|
+
logger.info(`[Executor] Tool ${toolCall.name} completed in ${durationMs}ms` +
|
|
389
|
+
(correctionOutcome.retries > 0
|
|
390
|
+
? ` (after ${correctionOutcome.retries} self-correction retries)`
|
|
391
|
+
: ""), { component: "ToolExecutor" });
|
|
392
|
+
}
|
|
393
|
+
else {
|
|
394
|
+
logger.error(`[Executor] Tool ${toolCall.name} failed after ${correctionOutcome.retries} retries`, undefined);
|
|
395
|
+
}
|
|
396
|
+
// Build self-correction metadata to attach to the result
|
|
397
|
+
const hasCorrectionActivity = correctionOutcome.retries > 0 || correctionOutcome.corrections > 0;
|
|
398
|
+
let selfCorrection;
|
|
399
|
+
if (hasCorrectionActivity || correctionOutcome.errorContexts.length > 0) {
|
|
400
|
+
// For fixable failures, generate parameter fix suggestions
|
|
401
|
+
const parameterFixes = !sanitizedResult.success && sanitizedResult.error
|
|
402
|
+
? (() => {
|
|
403
|
+
const cls = classifyFailure(sanitizedResult.error, toolCall.name);
|
|
404
|
+
return cls.type === 'fixable'
|
|
405
|
+
? suggestParameterFixes(sanitizedResult.error, toolCall.name, params)
|
|
406
|
+
: [];
|
|
407
|
+
})()
|
|
408
|
+
: [];
|
|
409
|
+
selfCorrection = {
|
|
410
|
+
retries: correctionOutcome.retries,
|
|
411
|
+
corrections: correctionOutcome.corrections,
|
|
412
|
+
promptContext: correctionOutcome.errorContexts.map(formatErrorContextForPrompt),
|
|
413
|
+
alternativeTools: correctionOutcome.alternativesSuggested.map((a) => a.toolName),
|
|
414
|
+
parameterFixes,
|
|
374
415
|
};
|
|
375
416
|
}
|
|
417
|
+
return {
|
|
418
|
+
toolCallId,
|
|
419
|
+
toolName: toolCall.name,
|
|
420
|
+
result: {
|
|
421
|
+
...sanitizedResult,
|
|
422
|
+
durationMs,
|
|
423
|
+
},
|
|
424
|
+
rateLimitInfo: {
|
|
425
|
+
remaining: rateLimitResult.remaining - 1,
|
|
426
|
+
resetAt: rateLimitResult.resetAt,
|
|
427
|
+
},
|
|
428
|
+
...(selfCorrection ? { selfCorrection } : {}),
|
|
429
|
+
};
|
|
376
430
|
}
|
|
377
431
|
/**
|
|
378
432
|
* Execute multiple tool calls (parallel or sequential)
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
// Types
|
|
8
8
|
export * from './types.js';
|
|
9
9
|
// Core modules
|
|
10
|
+
import { configureToolRouter } from './tool-router.js';
|
|
10
11
|
export { getToolRegistry, ToolRegistryImpl } from './registry.js';
|
|
11
12
|
export { getSecurityManager, initSecurityManager, SecurityPolicyManager } from './security.js';
|
|
12
13
|
export { getSessionManager, ToolSessionManager } from './session-manager.js';
|
|
@@ -102,9 +103,12 @@ export async function initializeToolExecution(options) {
|
|
|
102
103
|
}
|
|
103
104
|
// Register built-in tools
|
|
104
105
|
if (options?.registerBuiltins !== false) {
|
|
105
|
-
registerBuiltinTools();
|
|
106
|
+
await registerBuiltinTools();
|
|
106
107
|
logger.debug('[Execution] Built-in tools registered', { component: 'ToolExecution' });
|
|
107
108
|
}
|
|
109
|
+
// Enable model-aware tool filtering to reduce token usage
|
|
110
|
+
configureToolRouter({ enabled: true });
|
|
111
|
+
logger.debug('[Execution] Tool router enabled', { component: 'ToolExecution' });
|
|
108
112
|
initialized = true;
|
|
109
113
|
logger.info('[Execution] Tool execution system initialized', { component: 'ToolExecution' });
|
|
110
114
|
}
|
|
@@ -23,6 +23,14 @@ export interface SandboxExecuteResult {
|
|
|
23
23
|
containerId?: string;
|
|
24
24
|
error?: string;
|
|
25
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* Ping the Docker daemon, giving up after a timeout. A wedged daemon (for example a
|
|
28
|
+
* half-started Docker Desktop) accepts the connection but never answers, which would
|
|
29
|
+
* otherwise hang startup forever.
|
|
30
|
+
*/
|
|
31
|
+
export declare function pingDockerWithTimeout(docker: {
|
|
32
|
+
ping(): Promise<unknown>;
|
|
33
|
+
}, timeoutMs?: number): Promise<void>;
|
|
26
34
|
export declare class SandboxManager {
|
|
27
35
|
private config;
|
|
28
36
|
private securityConfig;
|
|
@@ -16,6 +16,30 @@ const DEFAULT_CPU_LIMIT = '1';
|
|
|
16
16
|
const CONTAINER_POOL_SIZE = 3;
|
|
17
17
|
const CONTAINER_MAX_AGE_MS = 3600_000; // 1 hour
|
|
18
18
|
const CLEANUP_INTERVAL_MS = 60_000; // 1 minute
|
|
19
|
+
const DEFAULT_DOCKER_PING_TIMEOUT_MS = 3_000;
|
|
20
|
+
/** How long to wait for the Docker daemon to answer before treating it as unavailable. */
|
|
21
|
+
function getDockerPingTimeoutMs(env = process.env) {
|
|
22
|
+
const parsed = Number(env['PROFCLAW_DOCKER_PING_TIMEOUT_MS']);
|
|
23
|
+
return Number.isFinite(parsed) && parsed > 0 ? parsed : DEFAULT_DOCKER_PING_TIMEOUT_MS;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Ping the Docker daemon, giving up after a timeout. A wedged daemon (for example a
|
|
27
|
+
* half-started Docker Desktop) accepts the connection but never answers, which would
|
|
28
|
+
* otherwise hang startup forever.
|
|
29
|
+
*/
|
|
30
|
+
export async function pingDockerWithTimeout(docker, timeoutMs = getDockerPingTimeoutMs()) {
|
|
31
|
+
let timer;
|
|
32
|
+
const timeout = new Promise((_, reject) => {
|
|
33
|
+
timer = setTimeout(() => reject(new Error(`Docker daemon did not respond within ${timeoutMs}ms`)), timeoutMs);
|
|
34
|
+
});
|
|
35
|
+
try {
|
|
36
|
+
await Promise.race([docker.ping(), timeout]);
|
|
37
|
+
}
|
|
38
|
+
finally {
|
|
39
|
+
if (timer)
|
|
40
|
+
clearTimeout(timer);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
19
43
|
const DEFAULT_SESSION_IDLE_MS = 600_000; // 10 minutes
|
|
20
44
|
export class SandboxManager {
|
|
21
45
|
config;
|
|
@@ -76,7 +100,7 @@ export class SandboxManager {
|
|
|
76
100
|
: new DockerModule.default();
|
|
77
101
|
}
|
|
78
102
|
// Check Docker connection
|
|
79
|
-
await this.docker
|
|
103
|
+
await pingDockerWithTimeout(this.docker);
|
|
80
104
|
logger.info('[Sandbox] Docker connection established', { component: 'Sandbox' });
|
|
81
105
|
// Log active security level so operators know what enforcement is in place
|
|
82
106
|
logger.info(`[Sandbox] Security level: ${this.securityConfig.level} (mode override: ${process.env.PROFCLAW_SANDBOX_LEVEL ?? 'none'}, resolved: ${getSecurityLevel()})`, {
|
|
@@ -17,7 +17,7 @@ import { logger } from '../../utils/logger.js';
|
|
|
17
17
|
const MODEL_PATTERNS = [
|
|
18
18
|
// Large reasoning models (full tier)
|
|
19
19
|
{ pattern: /claude-(3\.5|4|opus|sonnet-4)/i, capability: 'reasoning', tier: 'full' },
|
|
20
|
-
{ pattern: /gpt
|
|
20
|
+
{ pattern: /gpt-?4o|gpt-4-turbo|gpt-4\.5|gpt-4\.1/i, capability: 'reasoning', tier: 'full' },
|
|
21
21
|
{ pattern: /gemini-(pro|1\.5|2)/i, capability: 'reasoning', tier: 'full' },
|
|
22
22
|
{ pattern: /o[13]-/i, capability: 'reasoning', tier: 'full' },
|
|
23
23
|
{ pattern: /deepseek-(v3|r1|chat)/i, capability: 'reasoning', tier: 'full' },
|
|
@@ -38,6 +38,9 @@ const MODEL_PATTERNS = [
|
|
|
38
38
|
{ pattern: /glm-4-(air|flashx|long)/i, capability: 'instruction', tier: 'standard' },
|
|
39
39
|
{ pattern: /glm-4\.7-flash/i, capability: 'instruction', tier: 'standard' },
|
|
40
40
|
{ pattern: /moonshot|kimi/i, capability: 'instruction', tier: 'standard' },
|
|
41
|
+
// Models with strong native tool calling despite small size
|
|
42
|
+
{ pattern: /gemma-?4/i, capability: 'instruction', tier: 'standard' },
|
|
43
|
+
{ pattern: /qwen-?3/i, capability: 'instruction', tier: 'standard' },
|
|
41
44
|
// Small/local basic models (essential tier)
|
|
42
45
|
{ pattern: /llama-?3\.(2-[13]b|1-8b)|llama3\.2/i, capability: 'basic', tier: 'essential' },
|
|
43
46
|
{ pattern: /qwen-?2\.5-[37]b|qwen2\.5:[37]b/i, capability: 'basic', tier: 'essential' },
|
|
@@ -54,23 +57,17 @@ export const ESSENTIAL_TOOL_NAMES = new Set([
|
|
|
54
57
|
'exec',
|
|
55
58
|
'read_file',
|
|
56
59
|
'write_file',
|
|
57
|
-
'edit_file',
|
|
58
|
-
'search_files',
|
|
59
60
|
'web_search',
|
|
60
61
|
'web_fetch',
|
|
61
62
|
'complete_task',
|
|
62
|
-
'memory_search',
|
|
63
|
-
'agents_list',
|
|
64
63
|
]);
|
|
65
64
|
/**
|
|
66
65
|
* Tools restricted to full tier only (large capable models).
|
|
67
66
|
*/
|
|
68
67
|
export const FULL_ONLY_TOOL_NAMES = new Set([
|
|
68
|
+
// Browser automation
|
|
69
69
|
'canvas_render',
|
|
70
70
|
'image_analyze',
|
|
71
|
-
'subagent_orchestrate',
|
|
72
|
-
'openai_image_gen',
|
|
73
|
-
'tts_speak',
|
|
74
71
|
'browser_navigate',
|
|
75
72
|
'browser_snapshot',
|
|
76
73
|
'browser_click',
|
|
@@ -79,9 +76,33 @@ export const FULL_ONLY_TOOL_NAMES = new Set([
|
|
|
79
76
|
'browser_screenshot',
|
|
80
77
|
'browser_pages',
|
|
81
78
|
'browser_close',
|
|
79
|
+
// Advanced orchestration
|
|
80
|
+
'subagent_orchestrate',
|
|
81
|
+
'openai_image_gen',
|
|
82
|
+
'tts_speak',
|
|
82
83
|
'discord_actions',
|
|
83
84
|
'slack_actions',
|
|
84
85
|
'telegram_actions',
|
|
86
|
+
// Heavy tools that small models misuse
|
|
87
|
+
'sessions_spawn',
|
|
88
|
+
'sessions_send',
|
|
89
|
+
'decompose_task',
|
|
90
|
+
'multi_patch',
|
|
91
|
+
'github_pr',
|
|
92
|
+
'create_pr',
|
|
93
|
+
'cron_create',
|
|
94
|
+
'cron_trigger',
|
|
95
|
+
'cron_delete',
|
|
96
|
+
'cron_archive',
|
|
97
|
+
'cron_pause',
|
|
98
|
+
'cron_history',
|
|
99
|
+
'feed_add',
|
|
100
|
+
'feed_bundle_install',
|
|
101
|
+
'feed_poll',
|
|
102
|
+
'feed_digest',
|
|
103
|
+
'feed_discover',
|
|
104
|
+
'repl_execute',
|
|
105
|
+
'db_maintenance',
|
|
85
106
|
]);
|
|
86
107
|
// State
|
|
87
108
|
let config = {
|
|
@@ -92,6 +113,11 @@ let config = {
|
|
|
92
113
|
};
|
|
93
114
|
// Track promoted tools per conversation (conversationId -> set of tool names)
|
|
94
115
|
const promotedTools = new Map();
|
|
116
|
+
const TIER_MAX_TOOLS = {
|
|
117
|
+
essential: 8,
|
|
118
|
+
standard: 12,
|
|
119
|
+
full: 50,
|
|
120
|
+
};
|
|
95
121
|
// Core Functions
|
|
96
122
|
/**
|
|
97
123
|
* Classify a model ID into a capability profile.
|
|
@@ -103,7 +129,7 @@ export function classifyModel(modelId) {
|
|
|
103
129
|
return {
|
|
104
130
|
capability: entry.capability,
|
|
105
131
|
tier: entry.tier,
|
|
106
|
-
maxTools: entry.tier
|
|
132
|
+
maxTools: TIER_MAX_TOOLS[entry.tier],
|
|
107
133
|
contextWindow,
|
|
108
134
|
toolTokenBudget: Math.floor(contextWindow * (config.maxToolTokenPercent / 100)),
|
|
109
135
|
};
|
|
@@ -118,7 +144,7 @@ export function classifyModel(modelId) {
|
|
|
118
144
|
return {
|
|
119
145
|
capability: 'basic',
|
|
120
146
|
tier: 'essential',
|
|
121
|
-
maxTools:
|
|
147
|
+
maxTools: TIER_MAX_TOOLS['essential'],
|
|
122
148
|
contextWindow,
|
|
123
149
|
toolTokenBudget: Math.floor(contextWindow * (config.maxToolTokenPercent / 100)),
|
|
124
150
|
};
|
|
@@ -127,18 +153,18 @@ export function classifyModel(modelId) {
|
|
|
127
153
|
return {
|
|
128
154
|
capability: 'instruction',
|
|
129
155
|
tier: 'standard',
|
|
130
|
-
maxTools:
|
|
156
|
+
maxTools: TIER_MAX_TOOLS['standard'],
|
|
131
157
|
contextWindow,
|
|
132
158
|
toolTokenBudget: Math.floor(contextWindow * (config.maxToolTokenPercent / 100)),
|
|
133
159
|
};
|
|
134
160
|
}
|
|
135
161
|
}
|
|
136
|
-
// Unknown model: default to
|
|
162
|
+
// Unknown model: default to standard tier (balances capability vs token cost)
|
|
137
163
|
const contextWindow = 128000;
|
|
138
164
|
return {
|
|
139
165
|
capability: 'reasoning',
|
|
140
|
-
tier:
|
|
141
|
-
maxTools:
|
|
166
|
+
tier: 'standard',
|
|
167
|
+
maxTools: TIER_MAX_TOOLS['standard'],
|
|
142
168
|
contextWindow,
|
|
143
169
|
toolTokenBudget: Math.floor(contextWindow * (config.maxToolTokenPercent / 100)),
|
|
144
170
|
};
|
|
@@ -43,13 +43,13 @@ declare const CanvasRenderParamsSchema: z.ZodObject<{
|
|
|
43
43
|
language: z.ZodOptional<z.ZodString>;
|
|
44
44
|
metadata: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
45
45
|
}, "strip", z.ZodTypeAny, {
|
|
46
|
-
type: "code" | "markdown" | "table" | "
|
|
46
|
+
type: "code" | "markdown" | "table" | "html" | "chart" | "diagram" | "mermaid" | "svg";
|
|
47
47
|
content: string;
|
|
48
48
|
title?: string | undefined;
|
|
49
49
|
metadata?: Record<string, unknown> | undefined;
|
|
50
50
|
language?: string | undefined;
|
|
51
51
|
}, {
|
|
52
|
-
type: "code" | "markdown" | "table" | "
|
|
52
|
+
type: "code" | "markdown" | "table" | "html" | "chart" | "diagram" | "mermaid" | "svg";
|
|
53
53
|
content: string;
|
|
54
54
|
title?: string | undefined;
|
|
55
55
|
metadata?: Record<string, unknown> | undefined;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Code Tools
|
|
3
|
+
*
|
|
4
|
+
* Development workflow tools: lint, typecheck, build, format, dependency audit.
|
|
5
|
+
* These complement the existing file-ops, git, and exec tools to enable
|
|
6
|
+
* full coding agent workflows.
|
|
7
|
+
*/
|
|
8
|
+
import { z } from 'zod';
|
|
9
|
+
import type { ToolDefinition } from '../types.js';
|
|
10
|
+
declare const TypeCheckParams: z.ZodObject<{
|
|
11
|
+
path: z.ZodOptional<z.ZodString>;
|
|
12
|
+
}, "strip", z.ZodTypeAny, {
|
|
13
|
+
path?: string | undefined;
|
|
14
|
+
}, {
|
|
15
|
+
path?: string | undefined;
|
|
16
|
+
}>;
|
|
17
|
+
export declare const typeCheckTool: ToolDefinition<z.infer<typeof TypeCheckParams>, unknown>;
|
|
18
|
+
declare const LintParams: z.ZodObject<{
|
|
19
|
+
path: z.ZodOptional<z.ZodString>;
|
|
20
|
+
fix: z.ZodOptional<z.ZodBoolean>;
|
|
21
|
+
}, "strip", z.ZodTypeAny, {
|
|
22
|
+
path?: string | undefined;
|
|
23
|
+
fix?: boolean | undefined;
|
|
24
|
+
}, {
|
|
25
|
+
path?: string | undefined;
|
|
26
|
+
fix?: boolean | undefined;
|
|
27
|
+
}>;
|
|
28
|
+
export declare const lintTool: ToolDefinition<z.infer<typeof LintParams>, unknown>;
|
|
29
|
+
declare const BuildParams: z.ZodObject<{
|
|
30
|
+
script: z.ZodOptional<z.ZodString>;
|
|
31
|
+
}, "strip", z.ZodTypeAny, {
|
|
32
|
+
script?: string | undefined;
|
|
33
|
+
}, {
|
|
34
|
+
script?: string | undefined;
|
|
35
|
+
}>;
|
|
36
|
+
export declare const buildTool: ToolDefinition<z.infer<typeof BuildParams>, unknown>;
|
|
37
|
+
declare const FormatParams: z.ZodObject<{
|
|
38
|
+
path: z.ZodOptional<z.ZodString>;
|
|
39
|
+
}, "strip", z.ZodTypeAny, {
|
|
40
|
+
path?: string | undefined;
|
|
41
|
+
}, {
|
|
42
|
+
path?: string | undefined;
|
|
43
|
+
}>;
|
|
44
|
+
export declare const formatTool: ToolDefinition<z.infer<typeof FormatParams>, unknown>;
|
|
45
|
+
declare const ProjectInfoParams: z.ZodObject<{}, "strip", z.ZodTypeAny, {}, {}>;
|
|
46
|
+
export declare const projectInfoTool: ToolDefinition<z.infer<typeof ProjectInfoParams>, unknown>;
|
|
47
|
+
declare const CreatePrParams: z.ZodObject<{
|
|
48
|
+
title: z.ZodString;
|
|
49
|
+
body: z.ZodOptional<z.ZodString>;
|
|
50
|
+
base: z.ZodOptional<z.ZodString>;
|
|
51
|
+
draft: z.ZodOptional<z.ZodBoolean>;
|
|
52
|
+
}, "strip", z.ZodTypeAny, {
|
|
53
|
+
title: string;
|
|
54
|
+
body?: string | undefined;
|
|
55
|
+
base?: string | undefined;
|
|
56
|
+
draft?: boolean | undefined;
|
|
57
|
+
}, {
|
|
58
|
+
title: string;
|
|
59
|
+
body?: string | undefined;
|
|
60
|
+
base?: string | undefined;
|
|
61
|
+
draft?: boolean | undefined;
|
|
62
|
+
}>;
|
|
63
|
+
export declare const createPrTool: ToolDefinition<z.infer<typeof CreatePrParams>, unknown>;
|
|
64
|
+
export declare const codeTools: ToolDefinition[];
|
|
65
|
+
export {};
|
|
66
|
+
//# sourceMappingURL=code-tools.d.ts.map
|