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
|
@@ -238,7 +238,7 @@ export declare const ChatMessageSchema: z.ZodObject<{
|
|
|
238
238
|
id: string;
|
|
239
239
|
timestamp: string;
|
|
240
240
|
content: string;
|
|
241
|
-
role: "user" | "system" | "
|
|
241
|
+
role: "user" | "system" | "tool" | "assistant";
|
|
242
242
|
name?: string | undefined;
|
|
243
243
|
tokensUsed?: number | undefined;
|
|
244
244
|
toolCallId?: string | undefined;
|
|
@@ -247,7 +247,7 @@ export declare const ChatMessageSchema: z.ZodObject<{
|
|
|
247
247
|
id: string;
|
|
248
248
|
timestamp: string;
|
|
249
249
|
content: string;
|
|
250
|
-
role: "user" | "system" | "
|
|
250
|
+
role: "user" | "system" | "tool" | "assistant";
|
|
251
251
|
name?: string | undefined;
|
|
252
252
|
tokensUsed?: number | undefined;
|
|
253
253
|
toolCallId?: string | undefined;
|
|
@@ -270,7 +270,7 @@ export declare const ChatCompletionRequestSchema: z.ZodObject<{
|
|
|
270
270
|
id: string;
|
|
271
271
|
timestamp: string;
|
|
272
272
|
content: string;
|
|
273
|
-
role: "user" | "system" | "
|
|
273
|
+
role: "user" | "system" | "tool" | "assistant";
|
|
274
274
|
name?: string | undefined;
|
|
275
275
|
tokensUsed?: number | undefined;
|
|
276
276
|
toolCallId?: string | undefined;
|
|
@@ -279,7 +279,7 @@ export declare const ChatCompletionRequestSchema: z.ZodObject<{
|
|
|
279
279
|
id: string;
|
|
280
280
|
timestamp: string;
|
|
281
281
|
content: string;
|
|
282
|
-
role: "user" | "system" | "
|
|
282
|
+
role: "user" | "system" | "tool" | "assistant";
|
|
283
283
|
name?: string | undefined;
|
|
284
284
|
tokensUsed?: number | undefined;
|
|
285
285
|
toolCallId?: string | undefined;
|
|
@@ -311,7 +311,7 @@ export declare const ChatCompletionRequestSchema: z.ZodObject<{
|
|
|
311
311
|
id: string;
|
|
312
312
|
timestamp: string;
|
|
313
313
|
content: string;
|
|
314
|
-
role: "user" | "system" | "
|
|
314
|
+
role: "user" | "system" | "tool" | "assistant";
|
|
315
315
|
name?: string | undefined;
|
|
316
316
|
tokensUsed?: number | undefined;
|
|
317
317
|
toolCallId?: string | undefined;
|
|
@@ -328,14 +328,14 @@ export declare const ChatCompletionRequestSchema: z.ZodObject<{
|
|
|
328
328
|
description: string;
|
|
329
329
|
parameters: Record<string, unknown>;
|
|
330
330
|
}[] | undefined;
|
|
331
|
-
systemPrompt?: string | undefined;
|
|
332
331
|
maxTokens?: number | undefined;
|
|
332
|
+
systemPrompt?: string | undefined;
|
|
333
333
|
}, {
|
|
334
334
|
messages: {
|
|
335
335
|
id: string;
|
|
336
336
|
timestamp: string;
|
|
337
337
|
content: string;
|
|
338
|
-
role: "user" | "system" | "
|
|
338
|
+
role: "user" | "system" | "tool" | "assistant";
|
|
339
339
|
name?: string | undefined;
|
|
340
340
|
tokensUsed?: number | undefined;
|
|
341
341
|
toolCallId?: string | undefined;
|
|
@@ -352,9 +352,9 @@ export declare const ChatCompletionRequestSchema: z.ZodObject<{
|
|
|
352
352
|
description: string;
|
|
353
353
|
parameters: Record<string, unknown>;
|
|
354
354
|
}[] | undefined;
|
|
355
|
+
maxTokens?: number | undefined;
|
|
355
356
|
systemPrompt?: string | undefined;
|
|
356
357
|
temperature?: number | undefined;
|
|
357
|
-
maxTokens?: number | undefined;
|
|
358
358
|
}>;
|
|
359
359
|
export type ChatCompletionRequest = z.infer<typeof ChatCompletionRequestSchema>;
|
|
360
360
|
export declare const ChatCompletionResponseSchema: z.ZodObject<{
|
|
@@ -374,7 +374,7 @@ export declare const ChatCompletionResponseSchema: z.ZodObject<{
|
|
|
374
374
|
id: string;
|
|
375
375
|
timestamp: string;
|
|
376
376
|
content: string;
|
|
377
|
-
role: "user" | "system" | "
|
|
377
|
+
role: "user" | "system" | "tool" | "assistant";
|
|
378
378
|
name?: string | undefined;
|
|
379
379
|
tokensUsed?: number | undefined;
|
|
380
380
|
toolCallId?: string | undefined;
|
|
@@ -383,7 +383,7 @@ export declare const ChatCompletionResponseSchema: z.ZodObject<{
|
|
|
383
383
|
id: string;
|
|
384
384
|
timestamp: string;
|
|
385
385
|
content: string;
|
|
386
|
-
role: "user" | "system" | "
|
|
386
|
+
role: "user" | "system" | "tool" | "assistant";
|
|
387
387
|
name?: string | undefined;
|
|
388
388
|
tokensUsed?: number | undefined;
|
|
389
389
|
toolCallId?: string | undefined;
|
|
@@ -425,7 +425,7 @@ export declare const ChatCompletionResponseSchema: z.ZodObject<{
|
|
|
425
425
|
id: string;
|
|
426
426
|
timestamp: string;
|
|
427
427
|
content: string;
|
|
428
|
-
role: "user" | "system" | "
|
|
428
|
+
role: "user" | "system" | "tool" | "assistant";
|
|
429
429
|
name?: string | undefined;
|
|
430
430
|
tokensUsed?: number | undefined;
|
|
431
431
|
toolCallId?: string | undefined;
|
|
@@ -452,7 +452,7 @@ export declare const ChatCompletionResponseSchema: z.ZodObject<{
|
|
|
452
452
|
id: string;
|
|
453
453
|
timestamp: string;
|
|
454
454
|
content: string;
|
|
455
|
-
role: "user" | "system" | "
|
|
455
|
+
role: "user" | "system" | "tool" | "assistant";
|
|
456
456
|
name?: string | undefined;
|
|
457
457
|
tokensUsed?: number | undefined;
|
|
458
458
|
toolCallId?: string | undefined;
|
|
@@ -494,7 +494,7 @@ export declare const ConversationSchema: z.ZodObject<{
|
|
|
494
494
|
id: string;
|
|
495
495
|
timestamp: string;
|
|
496
496
|
content: string;
|
|
497
|
-
role: "user" | "system" | "
|
|
497
|
+
role: "user" | "system" | "tool" | "assistant";
|
|
498
498
|
name?: string | undefined;
|
|
499
499
|
tokensUsed?: number | undefined;
|
|
500
500
|
toolCallId?: string | undefined;
|
|
@@ -503,7 +503,7 @@ export declare const ConversationSchema: z.ZodObject<{
|
|
|
503
503
|
id: string;
|
|
504
504
|
timestamp: string;
|
|
505
505
|
content: string;
|
|
506
|
-
role: "user" | "system" | "
|
|
506
|
+
role: "user" | "system" | "tool" | "assistant";
|
|
507
507
|
name?: string | undefined;
|
|
508
508
|
tokensUsed?: number | undefined;
|
|
509
509
|
toolCallId?: string | undefined;
|
|
@@ -530,7 +530,7 @@ export declare const ConversationSchema: z.ZodObject<{
|
|
|
530
530
|
id: string;
|
|
531
531
|
timestamp: string;
|
|
532
532
|
content: string;
|
|
533
|
-
role: "user" | "system" | "
|
|
533
|
+
role: "user" | "system" | "tool" | "assistant";
|
|
534
534
|
name?: string | undefined;
|
|
535
535
|
tokensUsed?: number | undefined;
|
|
536
536
|
toolCallId?: string | undefined;
|
|
@@ -552,7 +552,7 @@ export declare const ConversationSchema: z.ZodObject<{
|
|
|
552
552
|
id: string;
|
|
553
553
|
timestamp: string;
|
|
554
554
|
content: string;
|
|
555
|
-
role: "user" | "system" | "
|
|
555
|
+
role: "user" | "system" | "tool" | "assistant";
|
|
556
556
|
name?: string | undefined;
|
|
557
557
|
tokensUsed?: number | undefined;
|
|
558
558
|
toolCallId?: string | undefined;
|
package/dist/routes/agents.js
CHANGED
|
@@ -43,5 +43,55 @@ agents.get('/types', (c) => {
|
|
|
43
43
|
types: registry.getAdapterTypes(),
|
|
44
44
|
});
|
|
45
45
|
});
|
|
46
|
+
// --- Multi-Agent Orchestration ---
|
|
47
|
+
import { z } from 'zod';
|
|
48
|
+
import { orchestrate, cancelOrchestration, listActiveOrchestrations } from '../agents/orchestrator.js';
|
|
49
|
+
const subAgentSchema = z.object({
|
|
50
|
+
id: z.string().optional(),
|
|
51
|
+
name: z.string(),
|
|
52
|
+
prompt: z.string(),
|
|
53
|
+
systemPrompt: z.string().optional(),
|
|
54
|
+
model: z.string().optional(),
|
|
55
|
+
maxTokens: z.number().optional(),
|
|
56
|
+
timeoutMs: z.number().optional(),
|
|
57
|
+
allowedTools: z.array(z.string()).optional(),
|
|
58
|
+
effort: z.enum(['low', 'medium', 'high']).optional(),
|
|
59
|
+
});
|
|
60
|
+
const orchestrateSchema = z.object({
|
|
61
|
+
name: z.string().min(1).max(200),
|
|
62
|
+
pattern: z.enum(['fan_out', 'pipeline', 'debate', 'custom']),
|
|
63
|
+
agents: z.array(subAgentSchema).min(1).max(10),
|
|
64
|
+
synthesizerPrompt: z.string().optional(),
|
|
65
|
+
judgePrompt: z.string().optional(),
|
|
66
|
+
timeoutMs: z.number().optional(),
|
|
67
|
+
failFast: z.boolean().optional(),
|
|
68
|
+
});
|
|
69
|
+
/** Execute a multi-agent orchestration */
|
|
70
|
+
agents.post('/orchestrate', async (c) => {
|
|
71
|
+
const body = await c.req.json();
|
|
72
|
+
const parsed = orchestrateSchema.safeParse(body);
|
|
73
|
+
if (!parsed.success) {
|
|
74
|
+
return c.json({ success: false, error: { code: 'VALIDATION_ERROR', message: parsed.error.message } }, 400);
|
|
75
|
+
}
|
|
76
|
+
const config = {
|
|
77
|
+
id: crypto.randomUUID(),
|
|
78
|
+
...parsed.data,
|
|
79
|
+
agents: parsed.data.agents.map((a, i) => ({
|
|
80
|
+
...a,
|
|
81
|
+
id: a.id || `agent-${i}`,
|
|
82
|
+
})),
|
|
83
|
+
};
|
|
84
|
+
const result = await orchestrate(config);
|
|
85
|
+
return c.json({ success: result.success, data: result });
|
|
86
|
+
});
|
|
87
|
+
/** Cancel a running orchestration */
|
|
88
|
+
agents.post('/orchestrate/:id/cancel', (c) => {
|
|
89
|
+
const cancelled = cancelOrchestration(c.req.param('id'));
|
|
90
|
+
return c.json({ success: cancelled });
|
|
91
|
+
});
|
|
92
|
+
/** List active orchestrations */
|
|
93
|
+
agents.get('/orchestrate/active', (c) => {
|
|
94
|
+
return c.json({ success: true, data: listActiveOrchestrations() });
|
|
95
|
+
});
|
|
46
96
|
export { agents as agentsRoutes };
|
|
47
97
|
//# sourceMappingURL=agents.js.map
|
package/dist/routes/auth.js
CHANGED
|
@@ -99,8 +99,15 @@ authRoutes.post('/signup', signupLimiter, async (c) => {
|
|
|
99
99
|
// Check registration mode
|
|
100
100
|
const settings = await getSettingsRaw();
|
|
101
101
|
const mode = settings.system.registrationMode;
|
|
102
|
+
// Allow first user signup without invite code (bootstrap admin)
|
|
103
|
+
const db = getDb();
|
|
104
|
+
let isFirstUser = false;
|
|
105
|
+
if (db) {
|
|
106
|
+
const existingUsers = await db.select({ id: users.id }).from(users).limit(1);
|
|
107
|
+
isFirstUser = existingUsers.length === 0;
|
|
108
|
+
}
|
|
102
109
|
let inviteRecord;
|
|
103
|
-
if (mode === 'invite') {
|
|
110
|
+
if (mode === 'invite' && !isFirstUser) {
|
|
104
111
|
if (!inviteCode) {
|
|
105
112
|
return c.json({ error: 'Registration requires an invite code' }, 403);
|
|
106
113
|
}
|
package/dist/routes/chat.js
CHANGED
|
@@ -9,8 +9,18 @@ import { streamText } from "hono/streaming";
|
|
|
9
9
|
import { zValidator } from "@hono/zod-validator";
|
|
10
10
|
import { z } from "zod";
|
|
11
11
|
import { randomUUID } from "node:crypto";
|
|
12
|
+
import { routeQuery, recordRoutingDecision, isSmartRouterEnabled, getCostComparison, } from "../providers/smart-router.js";
|
|
12
13
|
import { logger } from "../utils/logger.js";
|
|
14
|
+
import { rateLimit } from "../middleware/rate-limit.js";
|
|
15
|
+
import { contentFilter } from "../middleware/content-filter.js";
|
|
13
16
|
const chatRoutes = new Hono();
|
|
17
|
+
// Per-IP sliding-window rate limiter for chat send endpoints
|
|
18
|
+
const chatMaxRequests = parseInt(process.env['CHAT_RATE_LIMIT'] ?? '20', 10);
|
|
19
|
+
const chatRateLimiter = rateLimit({
|
|
20
|
+
maxRequests: chatMaxRequests,
|
|
21
|
+
windowMs: 60_000,
|
|
22
|
+
message: `Chat rate limit exceeded. Maximum ${chatMaxRequests} messages per minute.`,
|
|
23
|
+
});
|
|
14
24
|
let chatRuntimePromise = null;
|
|
15
25
|
let ProviderTypeSchema;
|
|
16
26
|
let aiProvider;
|
|
@@ -26,6 +36,7 @@ let listConversations;
|
|
|
26
36
|
let deleteConversation;
|
|
27
37
|
let addMessage;
|
|
28
38
|
let getConversationMessages;
|
|
39
|
+
let deleteMessage;
|
|
29
40
|
let getRecentConversationsWithPreview;
|
|
30
41
|
let compactMessages;
|
|
31
42
|
let getMemoryStats;
|
|
@@ -42,6 +53,17 @@ let getSessionModel;
|
|
|
42
53
|
let streamAgenticChat;
|
|
43
54
|
let getGroupChatManager;
|
|
44
55
|
let trackChatUsage;
|
|
56
|
+
/** Best-effort removal of spilled tool-result temp files at request end. */
|
|
57
|
+
async function disposeToolHandler(handler) {
|
|
58
|
+
try {
|
|
59
|
+
await handler.dispose?.();
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
logger.warn("[Chat] Tool handler dispose failed", {
|
|
63
|
+
error: error instanceof Error ? error.message : String(error),
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
}
|
|
45
67
|
async function ensureChatRuntime() {
|
|
46
68
|
if (!chatRuntimePromise) {
|
|
47
69
|
chatRuntimePromise = Promise.all([
|
|
@@ -65,6 +87,7 @@ async function ensureChatRuntime() {
|
|
|
65
87
|
deleteConversation = chatModule.deleteConversation;
|
|
66
88
|
addMessage = chatModule.addMessage;
|
|
67
89
|
getConversationMessages = chatModule.getConversationMessages;
|
|
90
|
+
deleteMessage = chatModule.deleteMessage;
|
|
68
91
|
getRecentConversationsWithPreview =
|
|
69
92
|
chatModule.getRecentConversationsWithPreview;
|
|
70
93
|
compactMessages = chatModule.compactMessages;
|
|
@@ -168,6 +191,87 @@ chatRoutes.get("/model-capability", async (c) => {
|
|
|
168
191
|
const resolved = MODEL_ALIASES[model.toLowerCase()]?.model ?? model;
|
|
169
192
|
return c.json(getModelRouting(resolved));
|
|
170
193
|
});
|
|
194
|
+
/**
|
|
195
|
+
* POST /api/chat/send
|
|
196
|
+
* Simple one-shot chat - send a message and get a response
|
|
197
|
+
*/
|
|
198
|
+
chatRoutes.post("/send", chatRateLimiter, contentFilter(), zValidator("json", z.object({
|
|
199
|
+
message: z.string(),
|
|
200
|
+
model: z.string().optional(),
|
|
201
|
+
systemPrompt: z.string().optional(),
|
|
202
|
+
temperature: z.number().min(0).max(2).optional(),
|
|
203
|
+
maxTokens: z.number().positive().optional(),
|
|
204
|
+
})), async (c) => {
|
|
205
|
+
const body = c.req.valid("json");
|
|
206
|
+
try {
|
|
207
|
+
const messages = [
|
|
208
|
+
{
|
|
209
|
+
id: randomUUID(),
|
|
210
|
+
role: "user",
|
|
211
|
+
content: body.message,
|
|
212
|
+
timestamp: new Date().toISOString(),
|
|
213
|
+
},
|
|
214
|
+
];
|
|
215
|
+
// Smart routing: auto-select model if none specified
|
|
216
|
+
let routing;
|
|
217
|
+
let modelToUse = body.model;
|
|
218
|
+
if (!body.model && isSmartRouterEnabled()) {
|
|
219
|
+
const providers = new Set(aiProvider.getConfiguredProviders());
|
|
220
|
+
routing = routeQuery(body.message, providers);
|
|
221
|
+
modelToUse = routing.selectedModel.id;
|
|
222
|
+
recordRoutingDecision(routing);
|
|
223
|
+
}
|
|
224
|
+
const response = await aiProvider.chat({
|
|
225
|
+
messages,
|
|
226
|
+
model: modelToUse,
|
|
227
|
+
systemPrompt: body.systemPrompt,
|
|
228
|
+
temperature: body.temperature,
|
|
229
|
+
maxTokens: body.maxTokens,
|
|
230
|
+
});
|
|
231
|
+
// Track token usage for cost dashboard
|
|
232
|
+
if (response.usage?.totalTokens && response.model) {
|
|
233
|
+
await ensureChatRuntime();
|
|
234
|
+
trackChatUsage(response.model, response.usage.totalTokens, response.usage.promptTokens, response.usage.completionTokens, {
|
|
235
|
+
cacheReadTokens: response.usage.cacheReadTokens,
|
|
236
|
+
cacheWriteTokens: response.usage.cacheWriteTokens,
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
return c.json({
|
|
240
|
+
id: response.id,
|
|
241
|
+
provider: response.provider,
|
|
242
|
+
model: response.model,
|
|
243
|
+
reply: response.content,
|
|
244
|
+
finishReason: response.finishReason,
|
|
245
|
+
usage: response.usage,
|
|
246
|
+
duration: response.duration,
|
|
247
|
+
...(routing && {
|
|
248
|
+
routing: {
|
|
249
|
+
smartRouted: true,
|
|
250
|
+
complexity: routing.complexity.tier,
|
|
251
|
+
confidence: Math.round(routing.complexity.confidence * 100),
|
|
252
|
+
reasoning: routing.complexity.reasoning,
|
|
253
|
+
savings: `${routing.savingsPercent}%`,
|
|
254
|
+
estimatedCost: `$${routing.estimatedCost.toFixed(4)}`,
|
|
255
|
+
summary: getCostComparison(routing),
|
|
256
|
+
...(routing.missingProviderHint && {
|
|
257
|
+
tip: {
|
|
258
|
+
addProvider: routing.missingProviderHint.provider,
|
|
259
|
+
reason: routing.missingProviderHint.reason,
|
|
260
|
+
savings: routing.missingProviderHint.estimatedSavings,
|
|
261
|
+
signupUrl: routing.missingProviderHint.signupUrl,
|
|
262
|
+
},
|
|
263
|
+
}),
|
|
264
|
+
},
|
|
265
|
+
}),
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
catch (error) {
|
|
269
|
+
logger.error("[Chat] Send error:", error instanceof Error ? error : undefined);
|
|
270
|
+
return c.json({
|
|
271
|
+
error: error instanceof Error ? error.message : "Chat send failed",
|
|
272
|
+
}, 500);
|
|
273
|
+
}
|
|
274
|
+
});
|
|
171
275
|
/**
|
|
172
276
|
* POST /api/chat/completions
|
|
173
277
|
* Generate a chat completion
|
|
@@ -183,11 +287,37 @@ chatRoutes.post("/completions", zValidator("json", ChatCompletionSchema), async
|
|
|
183
287
|
}));
|
|
184
288
|
// Handle streaming
|
|
185
289
|
if (body.stream) {
|
|
290
|
+
// Smart route for streaming too
|
|
291
|
+
let streamRouting;
|
|
292
|
+
let streamModel = body.model;
|
|
293
|
+
if (!body.model && isSmartRouterEnabled()) {
|
|
294
|
+
const lastUserMsg = [...body.messages].reverse().find((m) => m.role === "user");
|
|
295
|
+
if (lastUserMsg) {
|
|
296
|
+
const providers = new Set(aiProvider.getConfiguredProviders());
|
|
297
|
+
streamRouting = routeQuery(lastUserMsg.content, providers, {
|
|
298
|
+
conversationLength: body.messages.length,
|
|
299
|
+
});
|
|
300
|
+
streamModel = streamRouting.selectedModel.id;
|
|
301
|
+
recordRoutingDecision(streamRouting);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
186
304
|
return streamText(c, async (stream) => {
|
|
187
305
|
try {
|
|
306
|
+
// Send routing info as first event in stream
|
|
307
|
+
if (streamRouting) {
|
|
308
|
+
await stream.write(`data: ${JSON.stringify({
|
|
309
|
+
routing: {
|
|
310
|
+
smartRouted: true,
|
|
311
|
+
complexity: streamRouting.complexity.tier,
|
|
312
|
+
savings: `${streamRouting.savingsPercent}%`,
|
|
313
|
+
model: streamRouting.selectedModel.id,
|
|
314
|
+
provider: streamRouting.selectedModel.provider,
|
|
315
|
+
},
|
|
316
|
+
})}\n\n`);
|
|
317
|
+
}
|
|
188
318
|
const response = await aiProvider.chatStream({
|
|
189
319
|
messages,
|
|
190
|
-
model:
|
|
320
|
+
model: streamModel,
|
|
191
321
|
systemPrompt: body.systemPrompt,
|
|
192
322
|
temperature: body.temperature,
|
|
193
323
|
maxTokens: body.maxTokens,
|
|
@@ -216,9 +346,23 @@ chatRoutes.post("/completions", zValidator("json", ChatCompletionSchema), async
|
|
|
216
346
|
}
|
|
217
347
|
// Non-streaming
|
|
218
348
|
try {
|
|
349
|
+
// Smart routing for completions
|
|
350
|
+
let routing;
|
|
351
|
+
let modelToUse = body.model;
|
|
352
|
+
if (!body.model && isSmartRouterEnabled()) {
|
|
353
|
+
const lastUserMsg = [...body.messages].reverse().find((m) => m.role === "user");
|
|
354
|
+
if (lastUserMsg) {
|
|
355
|
+
const providers = new Set(aiProvider.getConfiguredProviders());
|
|
356
|
+
routing = routeQuery(lastUserMsg.content, providers, {
|
|
357
|
+
conversationLength: body.messages.length,
|
|
358
|
+
});
|
|
359
|
+
modelToUse = routing.selectedModel.id;
|
|
360
|
+
recordRoutingDecision(routing);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
219
363
|
const response = await aiProvider.chat({
|
|
220
364
|
messages,
|
|
221
|
-
model:
|
|
365
|
+
model: modelToUse,
|
|
222
366
|
systemPrompt: body.systemPrompt,
|
|
223
367
|
temperature: body.temperature,
|
|
224
368
|
maxTokens: body.maxTokens,
|
|
@@ -234,6 +378,15 @@ chatRoutes.post("/completions", zValidator("json", ChatCompletionSchema), async
|
|
|
234
378
|
finishReason: response.finishReason,
|
|
235
379
|
usage: response.usage,
|
|
236
380
|
duration: response.duration,
|
|
381
|
+
...(routing && {
|
|
382
|
+
routing: {
|
|
383
|
+
smartRouted: true,
|
|
384
|
+
complexity: routing.complexity.tier,
|
|
385
|
+
savings: `${routing.savingsPercent}%`,
|
|
386
|
+
estimatedCost: `$${routing.estimatedCost.toFixed(4)}`,
|
|
387
|
+
summary: getCostComparison(routing),
|
|
388
|
+
},
|
|
389
|
+
}),
|
|
237
390
|
});
|
|
238
391
|
}
|
|
239
392
|
catch (error) {
|
|
@@ -751,14 +904,62 @@ chatRoutes.post("/conversations/:id/compact", async (c) => {
|
|
|
751
904
|
return c.json({ error: "Failed to compact conversation" }, 500);
|
|
752
905
|
}
|
|
753
906
|
});
|
|
907
|
+
/**
|
|
908
|
+
* DELETE /api/chat/conversations/:id/messages/:messageId
|
|
909
|
+
* Delete a single message from a conversation
|
|
910
|
+
*/
|
|
911
|
+
chatRoutes.delete("/conversations/:id/messages/:messageId", async (c) => {
|
|
912
|
+
const conversationId = c.req.param("id");
|
|
913
|
+
const messageId = c.req.param("messageId");
|
|
914
|
+
try {
|
|
915
|
+
const conversation = await getConversation(conversationId);
|
|
916
|
+
if (!conversation) {
|
|
917
|
+
return c.json({ error: "Conversation not found" }, 404);
|
|
918
|
+
}
|
|
919
|
+
await deleteMessage(conversationId, messageId);
|
|
920
|
+
return c.json({ success: true });
|
|
921
|
+
}
|
|
922
|
+
catch (error) {
|
|
923
|
+
logger.error("[Chat] Delete message error:", error instanceof Error ? error : undefined);
|
|
924
|
+
return c.json({ error: "Failed to delete message" }, 500);
|
|
925
|
+
}
|
|
926
|
+
});
|
|
927
|
+
/**
|
|
928
|
+
* GET /api/chat/conversations/:id/export
|
|
929
|
+
* Export a conversation as JSON
|
|
930
|
+
*/
|
|
931
|
+
chatRoutes.get("/conversations/:id/export", async (c) => {
|
|
932
|
+
const conversationId = c.req.param("id");
|
|
933
|
+
try {
|
|
934
|
+
const conversation = await getConversation(conversationId);
|
|
935
|
+
if (!conversation) {
|
|
936
|
+
return c.json({ error: "Conversation not found" }, 404);
|
|
937
|
+
}
|
|
938
|
+
const messages = await getConversationMessages(conversationId);
|
|
939
|
+
return c.json({
|
|
940
|
+
conversation: {
|
|
941
|
+
id: conversation.id,
|
|
942
|
+
title: conversation.title,
|
|
943
|
+
createdAt: conversation.createdAt,
|
|
944
|
+
},
|
|
945
|
+
messages,
|
|
946
|
+
exportedAt: new Date().toISOString(),
|
|
947
|
+
});
|
|
948
|
+
}
|
|
949
|
+
catch (error) {
|
|
950
|
+
logger.error("[Chat] Export conversation error:", error instanceof Error ? error : undefined);
|
|
951
|
+
return c.json({ error: "Failed to export conversation" }, 500);
|
|
952
|
+
}
|
|
953
|
+
});
|
|
754
954
|
/**
|
|
755
955
|
* POST /api/chat/conversations/:id/messages
|
|
756
956
|
* Send a message in a conversation (with context and history)
|
|
757
957
|
*/
|
|
758
|
-
chatRoutes.post("/conversations/:id/messages", zValidator("json", z.object({
|
|
958
|
+
chatRoutes.post("/conversations/:id/messages", chatRateLimiter, contentFilter(), zValidator("json", z.object({
|
|
759
959
|
content: z.string(),
|
|
760
960
|
model: z.string().optional(),
|
|
761
961
|
temperature: z.number().min(0).max(2).optional(),
|
|
962
|
+
stream: z.boolean().optional(),
|
|
762
963
|
})), async (c) => {
|
|
763
964
|
const conversationId = c.req.param("id");
|
|
764
965
|
const body = c.req.valid("json");
|
|
@@ -870,7 +1071,56 @@ chatRoutes.post("/conversations/:id/messages", zValidator("json", z.object({
|
|
|
870
1071
|
content: m.content,
|
|
871
1072
|
timestamp: m.createdAt,
|
|
872
1073
|
}));
|
|
873
|
-
//
|
|
1074
|
+
// Streaming branch
|
|
1075
|
+
if (body.stream) {
|
|
1076
|
+
return streamText(c, async (stream) => {
|
|
1077
|
+
try {
|
|
1078
|
+
let fullContent = "";
|
|
1079
|
+
const response = await aiProvider.chatStream({
|
|
1080
|
+
messages: chatMessages,
|
|
1081
|
+
model: body.model,
|
|
1082
|
+
systemPrompt,
|
|
1083
|
+
temperature: body.temperature,
|
|
1084
|
+
}, (chunk) => {
|
|
1085
|
+
fullContent += chunk;
|
|
1086
|
+
stream
|
|
1087
|
+
.write(`data: ${JSON.stringify({ content: chunk })}\n\n`)
|
|
1088
|
+
.catch((err) => {
|
|
1089
|
+
logger.error("[Chat] Stream write error:", err instanceof Error ? err : undefined);
|
|
1090
|
+
});
|
|
1091
|
+
});
|
|
1092
|
+
// Save assistant response after streaming completes
|
|
1093
|
+
const assistantMessage = await addMessage({
|
|
1094
|
+
conversationId,
|
|
1095
|
+
role: "assistant",
|
|
1096
|
+
content: fullContent || response.content,
|
|
1097
|
+
model: response.model,
|
|
1098
|
+
provider: response.provider,
|
|
1099
|
+
tokenUsage: response.usage
|
|
1100
|
+
? {
|
|
1101
|
+
prompt: response.usage.promptTokens,
|
|
1102
|
+
completion: response.usage.completionTokens,
|
|
1103
|
+
total: response.usage.totalTokens,
|
|
1104
|
+
}
|
|
1105
|
+
: undefined,
|
|
1106
|
+
cost: response.usage?.cost,
|
|
1107
|
+
});
|
|
1108
|
+
await stream.write(`data: ${JSON.stringify({
|
|
1109
|
+
done: true,
|
|
1110
|
+
usage: response.usage,
|
|
1111
|
+
messageId: assistantMessage.id,
|
|
1112
|
+
compaction: compactionInfo,
|
|
1113
|
+
})}\n\n`);
|
|
1114
|
+
}
|
|
1115
|
+
catch (error) {
|
|
1116
|
+
logger.error("[Chat] Conversation stream error:", error instanceof Error ? error : undefined);
|
|
1117
|
+
await stream.write(`data: ${JSON.stringify({
|
|
1118
|
+
error: error instanceof Error ? error.message : "Failed to send message",
|
|
1119
|
+
})}\n\n`);
|
|
1120
|
+
}
|
|
1121
|
+
});
|
|
1122
|
+
}
|
|
1123
|
+
// Send to AI (non-streaming)
|
|
874
1124
|
const response = await aiProvider.chat({
|
|
875
1125
|
messages: chatMessages,
|
|
876
1126
|
model: body.model,
|
|
@@ -915,7 +1165,7 @@ chatRoutes.post("/conversations/:id/messages", zValidator("json", z.object({
|
|
|
915
1165
|
* POST /api/chat/conversations/:id/messages/with-tools
|
|
916
1166
|
* Send a message in a conversation with native tool calling enabled
|
|
917
1167
|
*/
|
|
918
|
-
chatRoutes.post("/conversations/:id/messages/with-tools", zValidator("json", z.object({
|
|
1168
|
+
chatRoutes.post("/conversations/:id/messages/with-tools", chatRateLimiter, contentFilter(), zValidator("json", z.object({
|
|
919
1169
|
content: z.string(),
|
|
920
1170
|
model: z.string().optional(),
|
|
921
1171
|
temperature: z.number().min(0).max(2).optional(),
|
|
@@ -993,6 +1243,10 @@ chatRoutes.post("/conversations/:id/messages/with-tools", zValidator("json", z.o
|
|
|
993
1243
|
const tools = enableTools
|
|
994
1244
|
? getChatToolsForModel(modelId, { conversationId })
|
|
995
1245
|
: [];
|
|
1246
|
+
logger.info(`[Chat] Tools for ${modelId}: ${tools.length} (enableTools=${enableTools})`, {
|
|
1247
|
+
component: 'Chat',
|
|
1248
|
+
toolNames: tools.map(t => t.name).join(', '),
|
|
1249
|
+
});
|
|
996
1250
|
// Build system prompt with context and tool mode
|
|
997
1251
|
const systemPrompt = await buildSystemPrompt(conversation.presetId, context, {
|
|
998
1252
|
enableTools: enableTools && tools.length > 0,
|
|
@@ -1057,6 +1311,7 @@ chatRoutes.post("/conversations/:id/messages/with-tools", zValidator("json", z.o
|
|
|
1057
1311
|
});
|
|
1058
1312
|
// Get any pending approvals
|
|
1059
1313
|
const pendingApprovals = toolHandler.getPendingApprovals();
|
|
1314
|
+
await disposeToolHandler(toolHandler);
|
|
1060
1315
|
const inferToolCallStatus = (result) => {
|
|
1061
1316
|
if (!result || typeof result !== "object") {
|
|
1062
1317
|
return "success";
|
|
@@ -1279,6 +1534,7 @@ chatRoutes.post("/with-tools", zValidator("json", z.object({
|
|
|
1279
1534
|
});
|
|
1280
1535
|
// Check for pending approvals
|
|
1281
1536
|
const pendingApprovals = toolHandler.getPendingApprovals();
|
|
1537
|
+
await disposeToolHandler(toolHandler);
|
|
1282
1538
|
return c.json({
|
|
1283
1539
|
id: response.id,
|
|
1284
1540
|
conversationId,
|
|
@@ -1322,7 +1578,7 @@ chatRoutes.post("/with-tools", zValidator("json", z.object({
|
|
|
1322
1578
|
* - complete - Session complete
|
|
1323
1579
|
* - error - Error occurred
|
|
1324
1580
|
*/
|
|
1325
|
-
chatRoutes.post("/conversations/:id/messages/agentic", zValidator("json", z.object({
|
|
1581
|
+
chatRoutes.post("/conversations/:id/messages/agentic", chatRateLimiter, contentFilter(), zValidator("json", z.object({
|
|
1326
1582
|
content: z.string(),
|
|
1327
1583
|
model: z.string().optional(),
|
|
1328
1584
|
provider: z.string().optional(),
|
|
@@ -1385,8 +1641,6 @@ chatRoutes.post("/conversations/:id/messages/agentic", zValidator("json", z.obje
|
|
|
1385
1641
|
conversationId,
|
|
1386
1642
|
sessionOverride,
|
|
1387
1643
|
};
|
|
1388
|
-
// Get tools - agentic mode uses model-aware filtering
|
|
1389
|
-
const tools = getChatToolsForModel(resolvedRef.model, { conversationId, includeAll: true });
|
|
1390
1644
|
// Build system prompt with agent mode (uses AGENT_MODE_SUFFIX)
|
|
1391
1645
|
const systemPrompt = await buildSystemPrompt(conversation.presetId, context, {
|
|
1392
1646
|
agentMode: true,
|
|
@@ -1429,11 +1683,14 @@ chatRoutes.post("/conversations/:id/messages/agentic", zValidator("json", z.obje
|
|
|
1429
1683
|
content: m.content,
|
|
1430
1684
|
timestamp: m.createdAt,
|
|
1431
1685
|
}));
|
|
1432
|
-
// Create tool handler
|
|
1686
|
+
// Create tool handler (triggers tool registration if first call)
|
|
1433
1687
|
const toolHandler = await createChatToolHandler({
|
|
1434
1688
|
conversationId,
|
|
1435
1689
|
securityMode: "full", // Full access in agentic mode (tools are pre-approved)
|
|
1436
1690
|
});
|
|
1691
|
+
// Get tools AFTER handler init (registry is now populated)
|
|
1692
|
+
const tools = getChatToolsForModel(resolvedRef.model, { conversationId });
|
|
1693
|
+
logger.info(`[Chat/Agentic] Tools for model ${resolvedRef.model}: ${tools.length}`);
|
|
1437
1694
|
// Set up SSE streaming response
|
|
1438
1695
|
c.header("Content-Type", "text/event-stream");
|
|
1439
1696
|
c.header("Cache-Control", "no-cache");
|
|
@@ -1491,11 +1748,15 @@ chatRoutes.post("/conversations/:id/messages/agentic", zValidator("json", z.obje
|
|
|
1491
1748
|
provider: body.provider,
|
|
1492
1749
|
temperature: body.temperature,
|
|
1493
1750
|
toolHandler,
|
|
1494
|
-
tools:
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
|
|
1751
|
+
tools: (() => {
|
|
1752
|
+
const mapped = tools.map((t) => ({
|
|
1753
|
+
name: t.name,
|
|
1754
|
+
description: t.description,
|
|
1755
|
+
parameters: t.parameters,
|
|
1756
|
+
}));
|
|
1757
|
+
logger.info(`[Chat/Agentic] Sending ${mapped.length} tools: [${mapped.map(t => t.name).join(', ')}]`);
|
|
1758
|
+
return mapped;
|
|
1759
|
+
})(),
|
|
1499
1760
|
showThinking: body.showThinking,
|
|
1500
1761
|
maxSteps: body.maxSteps,
|
|
1501
1762
|
maxBudget: body.maxBudget,
|
|
@@ -1542,10 +1803,8 @@ chatRoutes.post("/conversations/:id/messages/agentic", zValidator("json", z.obje
|
|
|
1542
1803
|
: undefined,
|
|
1543
1804
|
toolCalls: collectedToolCalls.length > 0 ? collectedToolCalls : undefined,
|
|
1544
1805
|
});
|
|
1545
|
-
//
|
|
1546
|
-
|
|
1547
|
-
trackChatUsage(finalModel, totalTokens, inputTokensTotal, outputTokensTotal);
|
|
1548
|
-
}
|
|
1806
|
+
// Cost tracking for agentic runs happens per step inside AgentExecutor;
|
|
1807
|
+
// tracking totals here as well would double count.
|
|
1549
1808
|
// Send final saved message event
|
|
1550
1809
|
await stream.write(`data: ${JSON.stringify({
|
|
1551
1810
|
type: "message_saved",
|
|
@@ -1567,6 +1826,9 @@ chatRoutes.post("/conversations/:id/messages/agentic", zValidator("json", z.obje
|
|
|
1567
1826
|
timestamp: Date.now(),
|
|
1568
1827
|
})}\n\n`);
|
|
1569
1828
|
}
|
|
1829
|
+
finally {
|
|
1830
|
+
await disposeToolHandler(toolHandler);
|
|
1831
|
+
}
|
|
1570
1832
|
});
|
|
1571
1833
|
}
|
|
1572
1834
|
catch (error) {
|