profclaw 2.0.0 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +14 -2
- package/CHANGELOG.md +37 -0
- package/CONTRIBUTING.md +20 -0
- package/Dockerfile +39 -23
- package/README.md +174 -40
- 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/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.d.ts +35 -1
- package/dist/agents/executor.js +573 -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/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/result-store.d.ts +37 -0
- package/dist/agents/result-store.js +104 -0
- package/dist/agents/session-diff.d.ts +43 -0
- package/dist/agents/session-diff.js +258 -0
- package/dist/agents/tool-loader.d.ts +65 -0
- package/dist/agents/tool-loader.js +273 -0
- package/dist/agents/transcript.d.ts +96 -0
- package/dist/agents/transcript.js +267 -0
- package/dist/agents/worktree-manager.d.ts +80 -0
- package/dist/agents/worktree-manager.js +203 -0
- package/dist/auth/middleware.js +14 -0
- package/dist/chat/agentic-executor.d.ts +7 -0
- package/dist/chat/agentic-executor.js +253 -30
- 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/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/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/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 +116 -61
- 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/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 +19 -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/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 +78 -19
- package/dist/providers/core/models.js +67 -1
- package/dist/providers/core/types.d.ts +3 -0
- package/dist/providers/index.d.ts +1 -0
- package/dist/providers/index.js +1 -0
- package/dist/providers/smart-router.d.ts +118 -0
- package/dist/providers/smart-router.js +685 -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 +259 -14
- 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 +310 -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,7 +15,22 @@ 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';
|
|
21
36
|
import { runWithModelFallback, getUserFriendlyErrorMessage, getProvidersInCooldown, describeFailoverError, } from './failover/index.js';
|
|
@@ -142,24 +157,80 @@ export async function executeAgenticChat(request) {
|
|
|
142
157
|
conversationId: request.conversationId,
|
|
143
158
|
goal: goal.substring(0, 100),
|
|
144
159
|
});
|
|
145
|
-
//
|
|
160
|
+
// Team budget check (if user is in a team)
|
|
161
|
+
if (request.teamId && request.userId) {
|
|
162
|
+
try {
|
|
163
|
+
const { canMemberSpend, recordMemberUsage } = await import('../teams/index.js');
|
|
164
|
+
const budgetCheck = await canMemberSpend(request.teamId, request.userId, 0.05); // estimated min cost
|
|
165
|
+
if (!budgetCheck.allowed) {
|
|
166
|
+
return {
|
|
167
|
+
content: `Budget exceeded: ${budgetCheck.reason}. Contact your team admin to increase the budget.`,
|
|
168
|
+
model: 'none',
|
|
169
|
+
provider: 'none',
|
|
170
|
+
usage: { promptTokens: 0, completionTokens: 0, totalTokens: 0, cost: 0 },
|
|
171
|
+
agentState: { sessionId, totalSteps: 0, stopReason: 'budget_exceeded', artifacts: [] },
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
// Teams module not initialized - skip budget check
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// Resolve the primary model and provider - fully provider-agnostic
|
|
146
180
|
const explicitProvider = request.provider;
|
|
147
|
-
const
|
|
181
|
+
const configuredProviders = aiProvider.getConfiguredProviders();
|
|
182
|
+
const availableProviders = new Set(configuredProviders);
|
|
183
|
+
// Smart Model Router: auto-select model based on query complexity
|
|
184
|
+
let modelRef = request.model;
|
|
185
|
+
let smartRouted = false;
|
|
186
|
+
if (!request.model && !explicitProvider && isSmartRouterEnabled()) {
|
|
187
|
+
const routingDecision = routeQuery(goal, availableProviders, {
|
|
188
|
+
conversationLength: request.messages.length,
|
|
189
|
+
hasToolUse: request.tools.length > 0,
|
|
190
|
+
hasCodeContext: request.tools.some(t => t.name.startsWith('git_') || t.name === 'exec'),
|
|
191
|
+
hasImages: false,
|
|
192
|
+
});
|
|
193
|
+
modelRef = routingDecision.selectedModel.id;
|
|
194
|
+
smartRouted = true;
|
|
195
|
+
recordRoutingDecision(routingDecision);
|
|
196
|
+
logger.info('[AgenticChat] Smart-routed to model', {
|
|
197
|
+
tier: routingDecision.complexity.tier,
|
|
198
|
+
model: routingDecision.selectedModel.id,
|
|
199
|
+
provider: routingDecision.selectedModel.provider,
|
|
200
|
+
savings: `${routingDecision.savingsPercent}%`,
|
|
201
|
+
reasoning: routingDecision.complexity.reasoning,
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
// Fall back to provider-agnostic default if no model specified
|
|
205
|
+
if (!modelRef) {
|
|
206
|
+
modelRef = aiProvider.getDefaultProvider();
|
|
207
|
+
// Try to get the default model for the default provider
|
|
208
|
+
try {
|
|
209
|
+
const resolved = aiProvider.resolveModel(modelRef);
|
|
210
|
+
modelRef = resolved.model;
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
modelRef = 'sonnet'; // last resort alias
|
|
214
|
+
}
|
|
215
|
+
}
|
|
148
216
|
const aliasEntry = MODEL_ALIASES[modelRef];
|
|
149
|
-
|
|
217
|
+
// Resolve provider from alias, smart route result, or configured default
|
|
218
|
+
const primaryProvider = explicitProvider
|
|
219
|
+
?? (aliasEntry?.provider && availableProviders.has(aliasEntry.provider) ? aliasEntry.provider : undefined)
|
|
220
|
+
?? aiProvider.getDefaultProvider();
|
|
150
221
|
// For Azure and similar providers, use the configured deployment name, not hardcoded alias
|
|
151
|
-
let primaryModel = aliasEntry?.model || modelRef;
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
222
|
+
let primaryModel = smartRouted ? modelRef : (aliasEntry?.model || modelRef);
|
|
223
|
+
if (!smartRouted) {
|
|
224
|
+
try {
|
|
225
|
+
const resolved = aiProvider.resolveModel(primaryProvider);
|
|
226
|
+
if (resolved.provider === primaryProvider && resolved.model) {
|
|
227
|
+
primaryModel = resolved.model;
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
catch {
|
|
231
|
+
// Keep the alias model if provider not configured
|
|
156
232
|
}
|
|
157
233
|
}
|
|
158
|
-
catch {
|
|
159
|
-
// Keep the alias model if provider not configured
|
|
160
|
-
}
|
|
161
|
-
// Get configured providers
|
|
162
|
-
const configuredProviders = aiProvider.getConfiguredProviders();
|
|
163
234
|
// Log if any providers are in cooldown
|
|
164
235
|
const cooldowns = getProvidersInCooldown();
|
|
165
236
|
if (cooldowns.length > 0) {
|
|
@@ -171,10 +242,65 @@ export async function executeAgenticChat(request) {
|
|
|
171
242
|
})),
|
|
172
243
|
});
|
|
173
244
|
}
|
|
245
|
+
// Clone the base system prompt to avoid mutating the request object on retry
|
|
246
|
+
const baseSystemPrompt = request.systemPrompt ?? '';
|
|
247
|
+
let augmentedSystemPrompt = baseSystemPrompt;
|
|
248
|
+
// Recall relevant past experiences to enhance system prompt
|
|
249
|
+
try {
|
|
250
|
+
const store = await getExperienceStore();
|
|
251
|
+
if (store) {
|
|
252
|
+
const similar = await store.findSimilarExperiences(goal, [], 3);
|
|
253
|
+
const hints = similar
|
|
254
|
+
.filter(exp => exp.successScore >= 0.7 && exp.weight > 0.1)
|
|
255
|
+
.slice(0, 2)
|
|
256
|
+
.map(exp => {
|
|
257
|
+
if (exp.type === 'tool_chain') {
|
|
258
|
+
const chain = exp.solution;
|
|
259
|
+
return `Previously solved similar task using: ${chain.tools.map(t => t.name).join(' -> ')} (used ${exp.useCount}x)`;
|
|
260
|
+
}
|
|
261
|
+
return `Past experience: ${exp.intent} (score: ${exp.successScore})`;
|
|
262
|
+
});
|
|
263
|
+
if (hints.length > 0) {
|
|
264
|
+
augmentedSystemPrompt += `\n\nRelevant past experiences:\n${hints.join('\n')}`;
|
|
265
|
+
logger.debug('[AgenticChat] Injected experience context', { count: hints.length });
|
|
266
|
+
for (const exp of similar.slice(0, 2)) {
|
|
267
|
+
store.markUsed(exp.id).catch(() => { });
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
catch {
|
|
273
|
+
// Experience recall is best-effort
|
|
274
|
+
}
|
|
275
|
+
// Auto-context gathering for complex queries (code/file-related tasks)
|
|
276
|
+
if (request.tools.length > 0 && goal.length > 30) {
|
|
277
|
+
try {
|
|
278
|
+
const context = await gatherContext(goal, {
|
|
279
|
+
maxSources: 4,
|
|
280
|
+
maxTokens: 2000,
|
|
281
|
+
includeFiles: true,
|
|
282
|
+
includeMemory: false, // memory handled by experience store above
|
|
283
|
+
includeHistory: false,
|
|
284
|
+
});
|
|
285
|
+
if (context.sources.length > 0) {
|
|
286
|
+
const contextBlock = context.sources
|
|
287
|
+
.map(s => `[${s.type}${s.path ? `: ${s.path}` : ''}]\n${s.content.slice(0, 500)}`)
|
|
288
|
+
.join('\n\n');
|
|
289
|
+
augmentedSystemPrompt += `\n\nProject context (auto-gathered):\n${contextBlock}`;
|
|
290
|
+
logger.debug('[AgenticChat] Injected project context', {
|
|
291
|
+
sources: context.sources.length,
|
|
292
|
+
tokens: context.tokens,
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
catch {
|
|
297
|
+
// Context gathering is best-effort
|
|
298
|
+
}
|
|
299
|
+
}
|
|
174
300
|
// Create agent configuration
|
|
175
301
|
const agentConfig = {
|
|
176
|
-
maxSteps:
|
|
177
|
-
maxBudget:
|
|
302
|
+
maxSteps: 20, // Reasonable default
|
|
303
|
+
maxBudget: parseInt(process.env.PROFCLAW_AGENT_MAX_BUDGET || '30000', 10), // configurable via PROFCLAW_AGENT_MAX_BUDGET
|
|
178
304
|
securityMode: 'ask', // Prompt for approval when needed
|
|
179
305
|
enableStreaming: true,
|
|
180
306
|
effort: request.effort,
|
|
@@ -183,7 +309,7 @@ export async function executeAgenticChat(request) {
|
|
|
183
309
|
const toolDefinitions = request.tools;
|
|
184
310
|
// Build messages with system prompt
|
|
185
311
|
const messages = [
|
|
186
|
-
{ role: 'system', content:
|
|
312
|
+
{ role: 'system', content: augmentedSystemPrompt },
|
|
187
313
|
...request.messages.map((m) => ({
|
|
188
314
|
role: m.role,
|
|
189
315
|
content: m.content,
|
|
@@ -223,8 +349,10 @@ export async function executeAgenticChat(request) {
|
|
|
223
349
|
request.onToolResult(state, toolCall.name, toolCall.result);
|
|
224
350
|
});
|
|
225
351
|
}
|
|
226
|
-
// Run the agent with normalized tools (pass provider hint for effort/thinking)
|
|
227
|
-
|
|
352
|
+
// Run the agent with normalized tools (pass provider hint for effort/thinking).
|
|
353
|
+
// Bridge the stream to SSE so connected clients receive real-time events.
|
|
354
|
+
await bridgeStreamToSSE(agent.stream(modelInstance, messages, aiSdkTools, onToolExecute, provider), broadcastEvent, sessionId);
|
|
355
|
+
return agent.getState();
|
|
228
356
|
},
|
|
229
357
|
onError: (attempt) => {
|
|
230
358
|
const described = describeFailoverError(attempt.error);
|
|
@@ -290,6 +418,51 @@ export async function executeAgenticChat(request) {
|
|
|
290
418
|
model: actualModel,
|
|
291
419
|
usedFallback,
|
|
292
420
|
});
|
|
421
|
+
// Record team usage (async, non-blocking)
|
|
422
|
+
if (request.teamId && request.userId) {
|
|
423
|
+
import('../teams/index.js').then(({ recordMemberUsage }) => {
|
|
424
|
+
const estimatedCost = finalState.usedBudget * 0.00001; // rough token-to-cost estimate
|
|
425
|
+
recordMemberUsage(request.teamId, request.userId, estimatedCost).catch(() => { });
|
|
426
|
+
}).catch(() => { });
|
|
427
|
+
}
|
|
428
|
+
// Record successful tool chains to experience store (async, non-blocking)
|
|
429
|
+
if (toolCalls.length > 0) {
|
|
430
|
+
const successfulCalls = toolCalls.filter(tc => tc.status === 'success');
|
|
431
|
+
if (successfulCalls.length > 0) {
|
|
432
|
+
getExperienceStore().then(async (store) => {
|
|
433
|
+
if (!store)
|
|
434
|
+
return;
|
|
435
|
+
try {
|
|
436
|
+
await store.recordExperience({
|
|
437
|
+
type: 'tool_chain',
|
|
438
|
+
intent: goal.slice(0, 200),
|
|
439
|
+
solution: {
|
|
440
|
+
tools: successfulCalls.map(tc => ({ name: tc.name, params: tc.arguments })),
|
|
441
|
+
totalDurationMs: finalState.usedBudget,
|
|
442
|
+
allSucceeded: successfulCalls.length === toolCalls.length,
|
|
443
|
+
},
|
|
444
|
+
successScore: successfulCalls.length / Math.max(toolCalls.length, 1),
|
|
445
|
+
tags: [
|
|
446
|
+
...new Set(successfulCalls.map(tc => tc.name)),
|
|
447
|
+
actualProvider,
|
|
448
|
+
actualModel,
|
|
449
|
+
],
|
|
450
|
+
sourceConversationId: request.conversationId,
|
|
451
|
+
});
|
|
452
|
+
}
|
|
453
|
+
catch {
|
|
454
|
+
// Non-critical - don't break execution
|
|
455
|
+
}
|
|
456
|
+
}).catch(() => { });
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
// Generate proactive follow-up suggestions
|
|
460
|
+
const suggestions = generateSuggestions(goal, {
|
|
461
|
+
failedTests: toolCalls.filter(tc => tc.name === 'test_run' && tc.status === 'error').length,
|
|
462
|
+
createdFiles: toolCalls.filter(tc => tc.name === 'write_file' && tc.status === 'success')
|
|
463
|
+
.map(tc => String(tc.arguments['path'] ?? '')).filter(Boolean),
|
|
464
|
+
prCreated: toolCalls.some(tc => tc.name === 'github_pr' && tc.status === 'success'),
|
|
465
|
+
});
|
|
293
466
|
return {
|
|
294
467
|
content,
|
|
295
468
|
model: actualModel,
|
|
@@ -313,6 +486,7 @@ export async function executeAgenticChat(request) {
|
|
|
313
486
|
requestedModel: primaryModel,
|
|
314
487
|
attempts: fallbackResult.attempts,
|
|
315
488
|
},
|
|
489
|
+
suggestions: suggestions.length > 0 ? suggestions : undefined,
|
|
316
490
|
};
|
|
317
491
|
}
|
|
318
492
|
catch (error) {
|
|
@@ -375,18 +549,40 @@ export async function* streamAgenticChat(request) {
|
|
|
375
549
|
goal: goal.substring(0, 100),
|
|
376
550
|
showThinking,
|
|
377
551
|
});
|
|
378
|
-
// Resolve the primary model and provider
|
|
379
|
-
// If provider is explicitly given, use it directly
|
|
552
|
+
// Resolve the primary model and provider - provider-agnostic
|
|
380
553
|
const explicitProvider = request.provider;
|
|
381
|
-
const
|
|
554
|
+
const configuredProviders = aiProvider.getConfiguredProviders();
|
|
555
|
+
const availableProviders = new Set(configuredProviders);
|
|
556
|
+
// Use smart routing for streaming too
|
|
557
|
+
let modelRef = request.model;
|
|
558
|
+
if (!request.model && !explicitProvider && isSmartRouterEnabled()) {
|
|
559
|
+
const routingDecision = routeQuery(goal, availableProviders, {
|
|
560
|
+
conversationLength: request.messages.length,
|
|
561
|
+
hasToolUse: request.tools.length > 0,
|
|
562
|
+
});
|
|
563
|
+
modelRef = routingDecision.selectedModel.id;
|
|
564
|
+
recordRoutingDecision(routingDecision);
|
|
565
|
+
}
|
|
566
|
+
// Fall back to provider-agnostic default
|
|
567
|
+
if (!modelRef) {
|
|
568
|
+
try {
|
|
569
|
+
const resolved = aiProvider.resolveModel(aiProvider.getDefaultProvider());
|
|
570
|
+
modelRef = resolved.model;
|
|
571
|
+
}
|
|
572
|
+
catch {
|
|
573
|
+
modelRef = 'sonnet';
|
|
574
|
+
}
|
|
575
|
+
}
|
|
382
576
|
const aliasEntry = MODEL_ALIASES[modelRef];
|
|
383
|
-
const primaryProvider = explicitProvider
|
|
384
|
-
|
|
577
|
+
const primaryProvider = explicitProvider
|
|
578
|
+
?? (aliasEntry?.provider && availableProviders.has(aliasEntry.provider) ? aliasEntry.provider : undefined)
|
|
579
|
+
?? aiProvider.getDefaultProvider();
|
|
580
|
+
// For Azure and similar providers, use the configured deployment name
|
|
385
581
|
let primaryModel = aliasEntry?.model || modelRef;
|
|
386
582
|
try {
|
|
387
583
|
const resolved = aiProvider.resolveModel(primaryProvider);
|
|
388
584
|
if (resolved.provider === primaryProvider && resolved.model) {
|
|
389
|
-
primaryModel = resolved.model;
|
|
585
|
+
primaryModel = resolved.model;
|
|
390
586
|
}
|
|
391
587
|
}
|
|
392
588
|
catch {
|
|
@@ -398,8 +594,6 @@ export async function* streamAgenticChat(request) {
|
|
|
398
594
|
primaryProvider,
|
|
399
595
|
primaryModel,
|
|
400
596
|
});
|
|
401
|
-
// Get configured providers
|
|
402
|
-
const configuredProviders = aiProvider.getConfiguredProviders();
|
|
403
597
|
if (configuredProviders.length === 0) {
|
|
404
598
|
yield {
|
|
405
599
|
type: 'error',
|
|
@@ -438,8 +632,10 @@ export async function* streamAgenticChat(request) {
|
|
|
438
632
|
};
|
|
439
633
|
// Create agent configuration
|
|
440
634
|
const agentConfig = {
|
|
441
|
-
maxSteps: request.maxSteps ??
|
|
442
|
-
|
|
635
|
+
maxSteps: request.maxSteps ?? 20,
|
|
636
|
+
// Azure counts cached prompt tokens in totalUsage (inflates to ~75K for tool schemas)
|
|
637
|
+
// Set budget high enough for multi-step tasks without premature abort
|
|
638
|
+
maxBudget: request.maxBudget ?? 500000,
|
|
443
639
|
securityMode: 'ask',
|
|
444
640
|
enableStreaming: true,
|
|
445
641
|
effort: request.effort,
|
|
@@ -608,8 +804,10 @@ export async function* streamAgenticChat(request) {
|
|
|
608
804
|
// Convert tool definitions to AI SDK format with execute wrappers
|
|
609
805
|
const aiSdkTools = convertToolsToAiSdk(toolDefinitions, provider, 'AgenticChat/Stream', onToolExecute);
|
|
610
806
|
// Run the agent — tools already have execute functions,
|
|
611
|
-
// pass provider hint for effort/thinking options
|
|
612
|
-
|
|
807
|
+
// pass provider hint for effort/thinking options.
|
|
808
|
+
// Bridge the stream to SSE so connected clients receive real-time events.
|
|
809
|
+
await bridgeStreamToSSE(agent.stream(modelInstance, messages, aiSdkTools, onToolExecute, provider), broadcastEvent, sessionId);
|
|
810
|
+
return agent.getState();
|
|
613
811
|
},
|
|
614
812
|
onError: (attempt) => {
|
|
615
813
|
const described = describeFailoverError(attempt.error);
|
|
@@ -734,6 +932,31 @@ export async function* streamAgenticChat(request) {
|
|
|
734
932
|
usedFallback,
|
|
735
933
|
attempts: fallbackAttempts.length,
|
|
736
934
|
});
|
|
935
|
+
// Record tool chain to experience store (async, non-blocking)
|
|
936
|
+
const successfulCalls = toolCalls.filter(tc => tc.status === 'success');
|
|
937
|
+
if (successfulCalls.length > 0) {
|
|
938
|
+
getExperienceStore().then(async (store) => {
|
|
939
|
+
if (!store)
|
|
940
|
+
return;
|
|
941
|
+
try {
|
|
942
|
+
await store.recordExperience({
|
|
943
|
+
type: 'tool_chain',
|
|
944
|
+
intent: goal.slice(0, 200),
|
|
945
|
+
solution: {
|
|
946
|
+
tools: successfulCalls.map(tc => ({ name: tc.name, params: tc.arguments })),
|
|
947
|
+
totalDurationMs: state.usedBudget,
|
|
948
|
+
allSucceeded: successfulCalls.length === toolCalls.length,
|
|
949
|
+
},
|
|
950
|
+
successScore: successfulCalls.length / Math.max(toolCalls.length, 1),
|
|
951
|
+
tags: [...new Set(successfulCalls.map(tc => tc.name)), actualProvider, actualModel],
|
|
952
|
+
sourceConversationId: request.conversationId,
|
|
953
|
+
});
|
|
954
|
+
}
|
|
955
|
+
catch {
|
|
956
|
+
// Non-critical
|
|
957
|
+
}
|
|
958
|
+
}).catch(() => { });
|
|
959
|
+
}
|
|
737
960
|
}
|
|
738
961
|
}
|
|
739
962
|
//# 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
|
*/
|