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
|
@@ -15,9 +15,25 @@ import { randomUUID } from 'node:crypto';
|
|
|
15
15
|
import { tool as createTool, jsonSchema } from 'ai';
|
|
16
16
|
import { zodToJsonSchema } from 'zod-to-json-schema';
|
|
17
17
|
import { AgentExecutor } from '../agents/index.js';
|
|
18
|
+
import { bridgeStreamToSSE } from '../server/stream-bridge.js';
|
|
19
|
+
import { broadcastEvent } from '../server.js';
|
|
18
20
|
import { MODEL_ALIASES } from '../providers/core/models.js';
|
|
21
|
+
import { routeQuery, recordRoutingDecision, isSmartRouterEnabled } from '../providers/smart-router.js';
|
|
22
|
+
import { generateSuggestions, gatherContext } from './proactive/index.js';
|
|
23
|
+
// Experience store lazy import to avoid circular deps
|
|
24
|
+
let experienceStorePromise = null;
|
|
25
|
+
function getExperienceStore() {
|
|
26
|
+
if (!experienceStorePromise) {
|
|
27
|
+
experienceStorePromise = import('../memory/experience-store.js').catch(() => {
|
|
28
|
+
experienceStorePromise = null;
|
|
29
|
+
return null;
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
return experienceStorePromise;
|
|
33
|
+
}
|
|
19
34
|
import { normalizeToolSchema } from '../providers/schema-utils.js';
|
|
20
35
|
import { logger } from '../utils/logger.js';
|
|
36
|
+
import { selectToolsForRequest } from '../agents/tool-selector.js';
|
|
21
37
|
import { runWithModelFallback, getUserFriendlyErrorMessage, getProvidersInCooldown, describeFailoverError, } from './failover/index.js';
|
|
22
38
|
const passthroughValidate = (value) => ({
|
|
23
39
|
success: true,
|
|
@@ -142,24 +158,80 @@ export async function executeAgenticChat(request) {
|
|
|
142
158
|
conversationId: request.conversationId,
|
|
143
159
|
goal: goal.substring(0, 100),
|
|
144
160
|
});
|
|
145
|
-
//
|
|
161
|
+
// Team budget check (if user is in a team)
|
|
162
|
+
if (request.teamId && request.userId) {
|
|
163
|
+
try {
|
|
164
|
+
const { canMemberSpend, recordMemberUsage } = await import('../teams/index.js');
|
|
165
|
+
const budgetCheck = await canMemberSpend(request.teamId, request.userId, 0.05); // estimated min cost
|
|
166
|
+
if (!budgetCheck.allowed) {
|
|
167
|
+
return {
|
|
168
|
+
content: `Budget exceeded: ${budgetCheck.reason}. Contact your team admin to increase the budget.`,
|
|
169
|
+
model: 'none',
|
|
170
|
+
provider: 'none',
|
|
171
|
+
usage: { promptTokens: 0, completionTokens: 0, totalTokens: 0, cost: 0 },
|
|
172
|
+
agentState: { sessionId, totalSteps: 0, stopReason: 'budget_exceeded', artifacts: [] },
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
// Teams module not initialized - skip budget check
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
// Resolve the primary model and provider - fully provider-agnostic
|
|
146
181
|
const explicitProvider = request.provider;
|
|
147
|
-
const
|
|
182
|
+
const configuredProviders = aiProvider.getConfiguredProviders();
|
|
183
|
+
const availableProviders = new Set(configuredProviders);
|
|
184
|
+
// Smart Model Router: auto-select model based on query complexity
|
|
185
|
+
let modelRef = request.model;
|
|
186
|
+
let smartRouted = false;
|
|
187
|
+
if (!request.model && !explicitProvider && isSmartRouterEnabled()) {
|
|
188
|
+
const routingDecision = routeQuery(goal, availableProviders, {
|
|
189
|
+
conversationLength: request.messages.length,
|
|
190
|
+
hasToolUse: request.tools.length > 0,
|
|
191
|
+
hasCodeContext: request.tools.some(t => t.name.startsWith('git_') || t.name === 'exec'),
|
|
192
|
+
hasImages: false,
|
|
193
|
+
});
|
|
194
|
+
modelRef = routingDecision.selectedModel.id;
|
|
195
|
+
smartRouted = true;
|
|
196
|
+
recordRoutingDecision(routingDecision);
|
|
197
|
+
logger.info('[AgenticChat] Smart-routed to model', {
|
|
198
|
+
tier: routingDecision.complexity.tier,
|
|
199
|
+
model: routingDecision.selectedModel.id,
|
|
200
|
+
provider: routingDecision.selectedModel.provider,
|
|
201
|
+
savings: `${routingDecision.savingsPercent}%`,
|
|
202
|
+
reasoning: routingDecision.complexity.reasoning,
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
// Fall back to provider-agnostic default if no model specified
|
|
206
|
+
if (!modelRef) {
|
|
207
|
+
modelRef = aiProvider.getDefaultProvider();
|
|
208
|
+
// Try to get the default model for the default provider
|
|
209
|
+
try {
|
|
210
|
+
const resolved = aiProvider.resolveModel(modelRef);
|
|
211
|
+
modelRef = resolved.model;
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
modelRef = 'sonnet'; // last resort alias
|
|
215
|
+
}
|
|
216
|
+
}
|
|
148
217
|
const aliasEntry = MODEL_ALIASES[modelRef];
|
|
149
|
-
|
|
218
|
+
// Resolve provider from alias, smart route result, or configured default
|
|
219
|
+
const primaryProvider = explicitProvider
|
|
220
|
+
?? (aliasEntry?.provider && availableProviders.has(aliasEntry.provider) ? aliasEntry.provider : undefined)
|
|
221
|
+
?? aiProvider.getDefaultProvider();
|
|
150
222
|
// For Azure and similar providers, use the configured deployment name, not hardcoded alias
|
|
151
|
-
let primaryModel = aliasEntry?.model || modelRef;
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
223
|
+
let primaryModel = smartRouted ? modelRef : (aliasEntry?.model || modelRef);
|
|
224
|
+
if (!smartRouted) {
|
|
225
|
+
try {
|
|
226
|
+
const resolved = aiProvider.resolveModel(primaryProvider);
|
|
227
|
+
if (resolved.provider === primaryProvider && resolved.model) {
|
|
228
|
+
primaryModel = resolved.model;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
catch {
|
|
232
|
+
// Keep the alias model if provider not configured
|
|
156
233
|
}
|
|
157
234
|
}
|
|
158
|
-
catch {
|
|
159
|
-
// Keep the alias model if provider not configured
|
|
160
|
-
}
|
|
161
|
-
// Get configured providers
|
|
162
|
-
const configuredProviders = aiProvider.getConfiguredProviders();
|
|
163
235
|
// Log if any providers are in cooldown
|
|
164
236
|
const cooldowns = getProvidersInCooldown();
|
|
165
237
|
if (cooldowns.length > 0) {
|
|
@@ -171,19 +243,79 @@ export async function executeAgenticChat(request) {
|
|
|
171
243
|
})),
|
|
172
244
|
});
|
|
173
245
|
}
|
|
246
|
+
// Clone the base system prompt to avoid mutating the request object on retry
|
|
247
|
+
const baseSystemPrompt = request.systemPrompt ?? '';
|
|
248
|
+
// Volatile per-request context is kept out of the base prompt so the base stays byte-stable
|
|
249
|
+
// for prompt caching (a second system message follows the stable one)
|
|
250
|
+
let volatileContext = '';
|
|
251
|
+
// Recall relevant past experiences to enhance system prompt
|
|
252
|
+
try {
|
|
253
|
+
const store = await getExperienceStore();
|
|
254
|
+
if (store) {
|
|
255
|
+
const similar = await store.findSimilarExperiences(goal, [], 3);
|
|
256
|
+
const hints = similar
|
|
257
|
+
.filter(exp => exp.successScore >= 0.7 && exp.weight > 0.1)
|
|
258
|
+
.slice(0, 2)
|
|
259
|
+
.map(exp => {
|
|
260
|
+
if (exp.type === 'tool_chain') {
|
|
261
|
+
const chain = exp.solution;
|
|
262
|
+
return `Previously solved similar task using: ${chain.tools.map(t => t.name).join(' -> ')} (used ${exp.useCount}x)`;
|
|
263
|
+
}
|
|
264
|
+
return `Past experience: ${exp.intent} (score: ${exp.successScore})`;
|
|
265
|
+
});
|
|
266
|
+
if (hints.length > 0) {
|
|
267
|
+
volatileContext += `\n\nRelevant past experiences:\n${hints.join('\n')}`;
|
|
268
|
+
logger.debug('[AgenticChat] Injected experience context', { count: hints.length });
|
|
269
|
+
for (const exp of similar.slice(0, 2)) {
|
|
270
|
+
store.markUsed(exp.id).catch(() => { });
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
catch {
|
|
276
|
+
// Experience recall is best-effort
|
|
277
|
+
}
|
|
278
|
+
// Auto-context gathering for complex queries (code/file-related tasks)
|
|
279
|
+
if (request.tools.length > 0 && goal.length > 30) {
|
|
280
|
+
try {
|
|
281
|
+
const context = await gatherContext(goal, {
|
|
282
|
+
maxSources: 4,
|
|
283
|
+
maxTokens: 2000,
|
|
284
|
+
includeFiles: true,
|
|
285
|
+
includeMemory: false, // memory handled by experience store above
|
|
286
|
+
includeHistory: false,
|
|
287
|
+
});
|
|
288
|
+
if (context.sources.length > 0) {
|
|
289
|
+
const contextBlock = context.sources
|
|
290
|
+
.map(s => `[${s.type}${s.path ? `: ${s.path}` : ''}]\n${s.content.slice(0, 500)}`)
|
|
291
|
+
.join('\n\n');
|
|
292
|
+
volatileContext += `\n\nProject context (auto-gathered):\n${contextBlock}`;
|
|
293
|
+
logger.debug('[AgenticChat] Injected project context', {
|
|
294
|
+
sources: context.sources.length,
|
|
295
|
+
tokens: context.tokens,
|
|
296
|
+
});
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
catch {
|
|
300
|
+
// Context gathering is best-effort
|
|
301
|
+
}
|
|
302
|
+
}
|
|
174
303
|
// Create agent configuration
|
|
175
304
|
const agentConfig = {
|
|
176
|
-
maxSteps:
|
|
177
|
-
maxBudget:
|
|
305
|
+
maxSteps: 20, // Reasonable default
|
|
306
|
+
maxBudget: parseInt(process.env.PROFCLAW_AGENT_MAX_BUDGET || '30000', 10), // configurable via PROFCLAW_AGENT_MAX_BUDGET
|
|
178
307
|
securityMode: 'ask', // Prompt for approval when needed
|
|
179
308
|
enableStreaming: true,
|
|
180
309
|
effort: request.effort,
|
|
181
310
|
};
|
|
182
311
|
// Store raw tool definitions - we'll convert to AI SDK format per-provider
|
|
183
|
-
|
|
312
|
+
// Per-turn tool selection (core set + relevant groups + load_tools meta-tool)
|
|
313
|
+
const turnUserMessage = [...request.messages].reverse().find((m) => m.role === 'user');
|
|
314
|
+
const toolDefinitions = selectToolsForRequest(request.tools, request.conversationId, typeof turnUserMessage?.content === 'string' ? turnUserMessage.content : '');
|
|
184
315
|
// Build messages with system prompt
|
|
185
316
|
const messages = [
|
|
186
|
-
{ role: 'system', content:
|
|
317
|
+
{ role: 'system', content: baseSystemPrompt },
|
|
318
|
+
...(volatileContext ? [{ role: 'system', content: volatileContext.trim() }] : []),
|
|
187
319
|
...request.messages.map((m) => ({
|
|
188
320
|
role: m.role,
|
|
189
321
|
content: m.content,
|
|
@@ -223,8 +355,10 @@ export async function executeAgenticChat(request) {
|
|
|
223
355
|
request.onToolResult(state, toolCall.name, toolCall.result);
|
|
224
356
|
});
|
|
225
357
|
}
|
|
226
|
-
// Run the agent with normalized tools (pass provider hint for effort/thinking)
|
|
227
|
-
|
|
358
|
+
// Run the agent with normalized tools (pass provider hint for effort/thinking).
|
|
359
|
+
// Bridge the stream to SSE so connected clients receive real-time events.
|
|
360
|
+
await bridgeStreamToSSE(agent.stream(modelInstance, messages, aiSdkTools, onToolExecute, provider), broadcastEvent, sessionId);
|
|
361
|
+
return agent.getState();
|
|
228
362
|
},
|
|
229
363
|
onError: (attempt) => {
|
|
230
364
|
const described = describeFailoverError(attempt.error);
|
|
@@ -290,6 +424,51 @@ export async function executeAgenticChat(request) {
|
|
|
290
424
|
model: actualModel,
|
|
291
425
|
usedFallback,
|
|
292
426
|
});
|
|
427
|
+
// Record team usage (async, non-blocking)
|
|
428
|
+
if (request.teamId && request.userId) {
|
|
429
|
+
import('../teams/index.js').then(({ recordMemberUsage }) => {
|
|
430
|
+
const estimatedCost = finalState.usedBudget * 0.00001; // rough token-to-cost estimate
|
|
431
|
+
recordMemberUsage(request.teamId, request.userId, estimatedCost).catch(() => { });
|
|
432
|
+
}).catch(() => { });
|
|
433
|
+
}
|
|
434
|
+
// Record successful tool chains to experience store (async, non-blocking)
|
|
435
|
+
if (toolCalls.length > 0) {
|
|
436
|
+
const successfulCalls = toolCalls.filter(tc => tc.status === 'success');
|
|
437
|
+
if (successfulCalls.length > 0) {
|
|
438
|
+
getExperienceStore().then(async (store) => {
|
|
439
|
+
if (!store)
|
|
440
|
+
return;
|
|
441
|
+
try {
|
|
442
|
+
await store.recordExperience({
|
|
443
|
+
type: 'tool_chain',
|
|
444
|
+
intent: goal.slice(0, 200),
|
|
445
|
+
solution: {
|
|
446
|
+
tools: successfulCalls.map(tc => ({ name: tc.name, params: tc.arguments })),
|
|
447
|
+
totalDurationMs: finalState.usedBudget,
|
|
448
|
+
allSucceeded: successfulCalls.length === toolCalls.length,
|
|
449
|
+
},
|
|
450
|
+
successScore: successfulCalls.length / Math.max(toolCalls.length, 1),
|
|
451
|
+
tags: [
|
|
452
|
+
...new Set(successfulCalls.map(tc => tc.name)),
|
|
453
|
+
actualProvider,
|
|
454
|
+
actualModel,
|
|
455
|
+
],
|
|
456
|
+
sourceConversationId: request.conversationId,
|
|
457
|
+
});
|
|
458
|
+
}
|
|
459
|
+
catch {
|
|
460
|
+
// Non-critical - don't break execution
|
|
461
|
+
}
|
|
462
|
+
}).catch(() => { });
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
// Generate proactive follow-up suggestions
|
|
466
|
+
const suggestions = generateSuggestions(goal, {
|
|
467
|
+
failedTests: toolCalls.filter(tc => tc.name === 'test_run' && tc.status === 'error').length,
|
|
468
|
+
createdFiles: toolCalls.filter(tc => tc.name === 'write_file' && tc.status === 'success')
|
|
469
|
+
.map(tc => String(tc.arguments['path'] ?? '')).filter(Boolean),
|
|
470
|
+
prCreated: toolCalls.some(tc => tc.name === 'github_pr' && tc.status === 'success'),
|
|
471
|
+
});
|
|
293
472
|
return {
|
|
294
473
|
content,
|
|
295
474
|
model: actualModel,
|
|
@@ -313,6 +492,7 @@ export async function executeAgenticChat(request) {
|
|
|
313
492
|
requestedModel: primaryModel,
|
|
314
493
|
attempts: fallbackResult.attempts,
|
|
315
494
|
},
|
|
495
|
+
suggestions: suggestions.length > 0 ? suggestions : undefined,
|
|
316
496
|
};
|
|
317
497
|
}
|
|
318
498
|
catch (error) {
|
|
@@ -375,18 +555,40 @@ export async function* streamAgenticChat(request) {
|
|
|
375
555
|
goal: goal.substring(0, 100),
|
|
376
556
|
showThinking,
|
|
377
557
|
});
|
|
378
|
-
// Resolve the primary model and provider
|
|
379
|
-
// If provider is explicitly given, use it directly
|
|
558
|
+
// Resolve the primary model and provider - provider-agnostic
|
|
380
559
|
const explicitProvider = request.provider;
|
|
381
|
-
const
|
|
560
|
+
const configuredProviders = aiProvider.getConfiguredProviders();
|
|
561
|
+
const availableProviders = new Set(configuredProviders);
|
|
562
|
+
// Use smart routing for streaming too
|
|
563
|
+
let modelRef = request.model;
|
|
564
|
+
if (!request.model && !explicitProvider && isSmartRouterEnabled()) {
|
|
565
|
+
const routingDecision = routeQuery(goal, availableProviders, {
|
|
566
|
+
conversationLength: request.messages.length,
|
|
567
|
+
hasToolUse: request.tools.length > 0,
|
|
568
|
+
});
|
|
569
|
+
modelRef = routingDecision.selectedModel.id;
|
|
570
|
+
recordRoutingDecision(routingDecision);
|
|
571
|
+
}
|
|
572
|
+
// Fall back to provider-agnostic default
|
|
573
|
+
if (!modelRef) {
|
|
574
|
+
try {
|
|
575
|
+
const resolved = aiProvider.resolveModel(aiProvider.getDefaultProvider());
|
|
576
|
+
modelRef = resolved.model;
|
|
577
|
+
}
|
|
578
|
+
catch {
|
|
579
|
+
modelRef = 'sonnet';
|
|
580
|
+
}
|
|
581
|
+
}
|
|
382
582
|
const aliasEntry = MODEL_ALIASES[modelRef];
|
|
383
|
-
const primaryProvider = explicitProvider
|
|
384
|
-
|
|
583
|
+
const primaryProvider = explicitProvider
|
|
584
|
+
?? (aliasEntry?.provider && availableProviders.has(aliasEntry.provider) ? aliasEntry.provider : undefined)
|
|
585
|
+
?? aiProvider.getDefaultProvider();
|
|
586
|
+
// For Azure and similar providers, use the configured deployment name
|
|
385
587
|
let primaryModel = aliasEntry?.model || modelRef;
|
|
386
588
|
try {
|
|
387
589
|
const resolved = aiProvider.resolveModel(primaryProvider);
|
|
388
590
|
if (resolved.provider === primaryProvider && resolved.model) {
|
|
389
|
-
primaryModel = resolved.model;
|
|
591
|
+
primaryModel = resolved.model;
|
|
390
592
|
}
|
|
391
593
|
}
|
|
392
594
|
catch {
|
|
@@ -398,8 +600,6 @@ export async function* streamAgenticChat(request) {
|
|
|
398
600
|
primaryProvider,
|
|
399
601
|
primaryModel,
|
|
400
602
|
});
|
|
401
|
-
// Get configured providers
|
|
402
|
-
const configuredProviders = aiProvider.getConfiguredProviders();
|
|
403
603
|
if (configuredProviders.length === 0) {
|
|
404
604
|
yield {
|
|
405
605
|
type: 'error',
|
|
@@ -438,14 +638,18 @@ export async function* streamAgenticChat(request) {
|
|
|
438
638
|
};
|
|
439
639
|
// Create agent configuration
|
|
440
640
|
const agentConfig = {
|
|
441
|
-
maxSteps: request.maxSteps ??
|
|
442
|
-
|
|
641
|
+
maxSteps: request.maxSteps ?? 20,
|
|
642
|
+
// Azure counts cached prompt tokens in totalUsage (inflates to ~75K for tool schemas)
|
|
643
|
+
// Set budget high enough for multi-step tasks without premature abort
|
|
644
|
+
maxBudget: request.maxBudget ?? 500000,
|
|
443
645
|
securityMode: 'ask',
|
|
444
646
|
enableStreaming: true,
|
|
445
647
|
effort: request.effort,
|
|
446
648
|
};
|
|
447
649
|
// Store raw tool definitions - we'll convert to AI SDK format per-provider
|
|
448
|
-
|
|
650
|
+
// Per-turn tool selection, same as the non-streaming path
|
|
651
|
+
const turnUserMessage = [...request.messages].reverse().find((m) => m.role === 'user');
|
|
652
|
+
const toolDefinitions = selectToolsForRequest(request.tools, request.conversationId, typeof turnUserMessage?.content === 'string' ? turnUserMessage.content : '');
|
|
449
653
|
// Build messages with system prompt
|
|
450
654
|
const messages = [
|
|
451
655
|
{ role: 'system', content: request.systemPrompt },
|
|
@@ -608,8 +812,10 @@ export async function* streamAgenticChat(request) {
|
|
|
608
812
|
// Convert tool definitions to AI SDK format with execute wrappers
|
|
609
813
|
const aiSdkTools = convertToolsToAiSdk(toolDefinitions, provider, 'AgenticChat/Stream', onToolExecute);
|
|
610
814
|
// Run the agent — tools already have execute functions,
|
|
611
|
-
// pass provider hint for effort/thinking options
|
|
612
|
-
|
|
815
|
+
// pass provider hint for effort/thinking options.
|
|
816
|
+
// Bridge the stream to SSE so connected clients receive real-time events.
|
|
817
|
+
await bridgeStreamToSSE(agent.stream(modelInstance, messages, aiSdkTools, onToolExecute, provider), broadcastEvent, sessionId);
|
|
818
|
+
return agent.getState();
|
|
613
819
|
},
|
|
614
820
|
onError: (attempt) => {
|
|
615
821
|
const described = describeFailoverError(attempt.error);
|
|
@@ -734,6 +940,31 @@ export async function* streamAgenticChat(request) {
|
|
|
734
940
|
usedFallback,
|
|
735
941
|
attempts: fallbackAttempts.length,
|
|
736
942
|
});
|
|
943
|
+
// Record tool chain to experience store (async, non-blocking)
|
|
944
|
+
const successfulCalls = toolCalls.filter(tc => tc.status === 'success');
|
|
945
|
+
if (successfulCalls.length > 0) {
|
|
946
|
+
getExperienceStore().then(async (store) => {
|
|
947
|
+
if (!store)
|
|
948
|
+
return;
|
|
949
|
+
try {
|
|
950
|
+
await store.recordExperience({
|
|
951
|
+
type: 'tool_chain',
|
|
952
|
+
intent: goal.slice(0, 200),
|
|
953
|
+
solution: {
|
|
954
|
+
tools: successfulCalls.map(tc => ({ name: tc.name, params: tc.arguments })),
|
|
955
|
+
totalDurationMs: state.usedBudget,
|
|
956
|
+
allSucceeded: successfulCalls.length === toolCalls.length,
|
|
957
|
+
},
|
|
958
|
+
successScore: successfulCalls.length / Math.max(toolCalls.length, 1),
|
|
959
|
+
tags: [...new Set(successfulCalls.map(tc => tc.name)), actualProvider, actualModel],
|
|
960
|
+
sourceConversationId: request.conversationId,
|
|
961
|
+
});
|
|
962
|
+
}
|
|
963
|
+
catch {
|
|
964
|
+
// Non-critical
|
|
965
|
+
}
|
|
966
|
+
}).catch(() => { });
|
|
967
|
+
}
|
|
737
968
|
}
|
|
738
969
|
}
|
|
739
970
|
//# sourceMappingURL=agentic-executor.js.map
|
|
@@ -76,6 +76,7 @@ export declare function getRecentConversationsWithPreview(limit?: number): Promi
|
|
|
76
76
|
preview: string;
|
|
77
77
|
messageCount: number;
|
|
78
78
|
}>>;
|
|
79
|
+
export declare function deleteMessage(conversationId: string, messageId: string): Promise<void>;
|
|
79
80
|
declare const _default: {
|
|
80
81
|
initConversationTables: typeof initConversationTables;
|
|
81
82
|
createConversation: typeof createConversation;
|
|
@@ -86,6 +87,7 @@ declare const _default: {
|
|
|
86
87
|
addMessage: typeof addMessage;
|
|
87
88
|
getConversationMessages: typeof getConversationMessages;
|
|
88
89
|
getRecentConversationsWithPreview: typeof getRecentConversationsWithPreview;
|
|
90
|
+
deleteMessage: typeof deleteMessage;
|
|
89
91
|
};
|
|
90
92
|
export default _default;
|
|
91
93
|
//# sourceMappingURL=conversations.d.ts.map
|
|
@@ -283,6 +283,13 @@ export async function getRecentConversationsWithPreview(limit = 10) {
|
|
|
283
283
|
messageCount: Number(row.message_count),
|
|
284
284
|
}));
|
|
285
285
|
}
|
|
286
|
+
export async function deleteMessage(conversationId, messageId) {
|
|
287
|
+
const client = getClient();
|
|
288
|
+
await client.execute({
|
|
289
|
+
sql: `DELETE FROM conversation_messages WHERE id = ? AND conversation_id = ?`,
|
|
290
|
+
args: [messageId, conversationId],
|
|
291
|
+
});
|
|
292
|
+
}
|
|
286
293
|
export default {
|
|
287
294
|
initConversationTables,
|
|
288
295
|
createConversation,
|
|
@@ -293,5 +300,6 @@ export default {
|
|
|
293
300
|
addMessage,
|
|
294
301
|
getConversationMessages,
|
|
295
302
|
getRecentConversationsWithPreview,
|
|
303
|
+
deleteMessage,
|
|
296
304
|
};
|
|
297
305
|
//# sourceMappingURL=conversations.js.map
|
|
@@ -8,6 +8,14 @@
|
|
|
8
8
|
import type { ToolExecutionContext, AIToolCall, ToolCallResult, ApprovalRequest, ApprovalDecision } from "./types.js";
|
|
9
9
|
export declare class ToolExecutor {
|
|
10
10
|
private abortControllers;
|
|
11
|
+
/**
|
|
12
|
+
* One CorrectionTracker per conversation, reset when a conversation ends.
|
|
13
|
+
* Key: conversationId
|
|
14
|
+
*/
|
|
15
|
+
private correctionTrackers;
|
|
16
|
+
private getOrCreateTracker;
|
|
17
|
+
/** Call this when a conversation is done to free the tracker. */
|
|
18
|
+
resetCorrectionBudget(conversationId: string): void;
|
|
11
19
|
/**
|
|
12
20
|
* Execute a single tool call
|
|
13
21
|
*/
|