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
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Search Tool
|
|
3
|
+
*
|
|
4
|
+
* Allows the AI agent to discover available tool categories and
|
|
5
|
+
* dynamically load them into the current session.
|
|
6
|
+
*
|
|
7
|
+
* This solves the cold-start problem: instead of including all tool
|
|
8
|
+
* schemas up front (high token cost), only core tools are loaded by
|
|
9
|
+
* default, and the agent can search/load others as needed.
|
|
10
|
+
*/
|
|
11
|
+
import { z } from 'zod';
|
|
12
|
+
import { ToolLoader } from '../../../agents/tool-loader.js';
|
|
13
|
+
import { getToolRegistry } from '../registry.js';
|
|
14
|
+
import { logger } from '../../../utils/logger.js';
|
|
15
|
+
// Schema
|
|
16
|
+
const ToolSearchParamsSchema = z.object({
|
|
17
|
+
query: z
|
|
18
|
+
.string()
|
|
19
|
+
.min(1)
|
|
20
|
+
.describe('Search query describing what kind of tools you need (e.g. "browser automation", "git diff", "image generation")'),
|
|
21
|
+
autoLoad: z
|
|
22
|
+
.boolean()
|
|
23
|
+
.optional()
|
|
24
|
+
.default(false)
|
|
25
|
+
.describe('When true, automatically load the top-matching category into the session so its tools become available immediately'),
|
|
26
|
+
});
|
|
27
|
+
// Session-scoped loaders
|
|
28
|
+
// One ToolLoader per session; keyed by conversationId so each session
|
|
29
|
+
// has its own independent set of loaded tools.
|
|
30
|
+
const sessionLoaders = new Map();
|
|
31
|
+
function getOrCreateLoader(conversationId) {
|
|
32
|
+
let loader = sessionLoaders.get(conversationId);
|
|
33
|
+
if (!loader) {
|
|
34
|
+
const registry = getToolRegistry();
|
|
35
|
+
const toolMap = new Map();
|
|
36
|
+
for (const tool of registry.list()) {
|
|
37
|
+
toolMap.set(tool.name, tool);
|
|
38
|
+
}
|
|
39
|
+
loader = new ToolLoader(toolMap);
|
|
40
|
+
sessionLoaders.set(conversationId, loader);
|
|
41
|
+
}
|
|
42
|
+
return loader;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Remove the loader for a conversation when it ends (called externally).
|
|
46
|
+
*/
|
|
47
|
+
export function clearSessionLoader(conversationId) {
|
|
48
|
+
sessionLoaders.delete(conversationId);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Expose the loader for a conversation so callers (e.g. the orchestrator)
|
|
52
|
+
* can query which tools are currently loaded.
|
|
53
|
+
*/
|
|
54
|
+
export function getSessionLoader(conversationId) {
|
|
55
|
+
return sessionLoaders.get(conversationId);
|
|
56
|
+
}
|
|
57
|
+
// Tool Definition
|
|
58
|
+
export const searchAvailableToolsTool = {
|
|
59
|
+
name: 'search_available_tools',
|
|
60
|
+
description: `Search available tool categories and optionally load them for use in this session.
|
|
61
|
+
|
|
62
|
+
Use this tool when you need capabilities that are not yet available (e.g. browser automation,
|
|
63
|
+
advanced git operations, image generation, voice synthesis, or memory access).
|
|
64
|
+
|
|
65
|
+
Steps:
|
|
66
|
+
1. Call with a natural-language query describing what you need.
|
|
67
|
+
2. Review the matching categories and their tool lists.
|
|
68
|
+
3. Call again with autoLoad: true (or call loadCategory manually) to activate the tools.
|
|
69
|
+
|
|
70
|
+
The core tools (read_file, write_file, exec, git_status, git_commit, complete_task) are always
|
|
71
|
+
available and do not need to be loaded.`,
|
|
72
|
+
category: 'profclaw',
|
|
73
|
+
securityLevel: 'safe',
|
|
74
|
+
allowedHosts: ['gateway', 'local'],
|
|
75
|
+
parameters: ToolSearchParamsSchema,
|
|
76
|
+
async execute(context, params) {
|
|
77
|
+
const { query, autoLoad } = params;
|
|
78
|
+
logger.info(`[ToolSearch] Searching for: "${query}"`, {
|
|
79
|
+
component: 'ToolSearch',
|
|
80
|
+
conversationId: context.conversationId,
|
|
81
|
+
autoLoad,
|
|
82
|
+
});
|
|
83
|
+
try {
|
|
84
|
+
const loader = getOrCreateLoader(context.conversationId);
|
|
85
|
+
const matchedCategories = loader.search(query);
|
|
86
|
+
if (matchedCategories.length === 0) {
|
|
87
|
+
const allCategories = loader.getCategories();
|
|
88
|
+
const hint = `No categories matched "${query}". ` +
|
|
89
|
+
`Available categories: ${allCategories.map((c) => c.name).join(', ')}.`;
|
|
90
|
+
return {
|
|
91
|
+
success: true,
|
|
92
|
+
data: {
|
|
93
|
+
query,
|
|
94
|
+
matches: [],
|
|
95
|
+
autoLoaded: null,
|
|
96
|
+
hint,
|
|
97
|
+
},
|
|
98
|
+
output: hint,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
// Optionally auto-load the best match
|
|
102
|
+
let autoLoaded = null;
|
|
103
|
+
if (autoLoad && matchedCategories.length > 0) {
|
|
104
|
+
const best = matchedCategories[0];
|
|
105
|
+
loader.loadCategory(best.name);
|
|
106
|
+
autoLoaded = best.name;
|
|
107
|
+
logger.info(`[ToolSearch] Auto-loaded category: ${best.name}`, {
|
|
108
|
+
component: 'ToolSearch',
|
|
109
|
+
conversationId: context.conversationId,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
const matches = matchedCategories.map((cat) => ({
|
|
113
|
+
categoryName: cat.name,
|
|
114
|
+
description: cat.description,
|
|
115
|
+
keywords: cat.keywords,
|
|
116
|
+
tools: cat.tools,
|
|
117
|
+
alwaysLoaded: cat.alwaysLoaded,
|
|
118
|
+
loaded: cat.tools.some((t) => loader.isLoaded(t)),
|
|
119
|
+
}));
|
|
120
|
+
const loadedNames = matches
|
|
121
|
+
.filter((m) => m.loaded)
|
|
122
|
+
.map((m) => m.categoryName);
|
|
123
|
+
const hint = autoLoaded
|
|
124
|
+
? `Category "${autoLoaded}" has been loaded. Its tools are now available.`
|
|
125
|
+
: loadedNames.length > 0
|
|
126
|
+
? `Categories already loaded: ${loadedNames.join(', ')}. Call again with autoLoad: true to load others.`
|
|
127
|
+
: `Found ${matches.length} matching categor${matches.length === 1 ? 'y' : 'ies'}. Call again with autoLoad: true to activate the best match.`;
|
|
128
|
+
const summary = `Found ${matches.length} matching categor${matches.length === 1 ? 'y' : 'ies'} for "${query}"` +
|
|
129
|
+
(autoLoaded ? ` — loaded "${autoLoaded}"` : '') +
|
|
130
|
+
`.`;
|
|
131
|
+
return {
|
|
132
|
+
success: true,
|
|
133
|
+
data: {
|
|
134
|
+
query,
|
|
135
|
+
matches,
|
|
136
|
+
autoLoaded,
|
|
137
|
+
hint,
|
|
138
|
+
},
|
|
139
|
+
output: summary,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
144
|
+
logger.error(`[ToolSearch] Search failed: ${message}`, error instanceof Error ? error : undefined);
|
|
145
|
+
return {
|
|
146
|
+
success: false,
|
|
147
|
+
error: {
|
|
148
|
+
code: 'TOOL_SEARCH_ERROR',
|
|
149
|
+
message,
|
|
150
|
+
},
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
},
|
|
154
|
+
};
|
|
155
|
+
//# sourceMappingURL=tool-search.js.map
|
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
* Inspired by OpenClaw's execution model.
|
|
6
6
|
*/
|
|
7
7
|
import type { z } from 'zod';
|
|
8
|
+
import type { ToolTier, ModelCapabilityLevel } from '../../providers/core/types.js';
|
|
9
|
+
export type { ToolTier, ModelCapabilityLevel };
|
|
8
10
|
/**
|
|
9
11
|
* Security mode determines how commands are validated
|
|
10
12
|
* - deny: Block all tool execution
|
|
@@ -157,20 +159,6 @@ export interface ToolAvailability {
|
|
|
157
159
|
reason?: string;
|
|
158
160
|
}
|
|
159
161
|
export type ToolCategory = 'execution' | 'filesystem' | 'web' | 'data' | 'system' | 'profclaw' | 'memory' | 'browser' | 'custom';
|
|
160
|
-
/**
|
|
161
|
-
* Tool tier determines which models receive this tool.
|
|
162
|
-
* - essential: Core tools that work reliably with any model (8-10 tools)
|
|
163
|
-
* - standard: Tools that need moderate reasoning (25-30 tools)
|
|
164
|
-
* - full: All tools, only for large/capable models (72 tools)
|
|
165
|
-
*/
|
|
166
|
-
export type ToolTier = 'essential' | 'standard' | 'full';
|
|
167
|
-
/**
|
|
168
|
-
* Model capability level for adaptive prompting and tool selection.
|
|
169
|
-
* - basic: Small/local models (<14B params). Simple instruction following.
|
|
170
|
-
* - instruction: Medium models (14B-70B). Can follow multi-step instructions.
|
|
171
|
-
* - reasoning: Large frontier models. Chain-of-thought, complex tool orchestration.
|
|
172
|
-
*/
|
|
173
|
-
export type ModelCapabilityLevel = 'basic' | 'instruction' | 'reasoning';
|
|
174
162
|
export interface ToolExample {
|
|
175
163
|
description: string;
|
|
176
164
|
params: Record<string, unknown>;
|
|
@@ -283,6 +271,23 @@ export interface AIToolCall {
|
|
|
283
271
|
name: string;
|
|
284
272
|
arguments: Record<string, unknown>;
|
|
285
273
|
}
|
|
274
|
+
export interface SelfCorrectionMeta {
|
|
275
|
+
/** Number of automatic retries performed */
|
|
276
|
+
retries: number;
|
|
277
|
+
/** Number of correction cycles applied (retries + fixable prompts) */
|
|
278
|
+
corrections: number;
|
|
279
|
+
/** Human-readable error context strings to inject into the next AI prompt */
|
|
280
|
+
promptContext: string[];
|
|
281
|
+
/** Names of alternative tools suggested by the self-correction engine */
|
|
282
|
+
alternativeTools: string[];
|
|
283
|
+
/** Parameter fix suggestions for fixable errors */
|
|
284
|
+
parameterFixes: Array<{
|
|
285
|
+
paramName: string;
|
|
286
|
+
currentValue: unknown;
|
|
287
|
+
suggestedValue: unknown;
|
|
288
|
+
reason: string;
|
|
289
|
+
}>;
|
|
290
|
+
}
|
|
286
291
|
export interface ToolCallResult {
|
|
287
292
|
toolCallId: string;
|
|
288
293
|
toolName: string;
|
|
@@ -293,6 +298,8 @@ export interface ToolCallResult {
|
|
|
293
298
|
remaining: number;
|
|
294
299
|
resetAt: number;
|
|
295
300
|
};
|
|
301
|
+
/** Populated when self-correction was attempted (retries, fixable prompts) */
|
|
302
|
+
selfCorrection?: SelfCorrectionMeta;
|
|
296
303
|
}
|
|
297
304
|
/** Options for filtering tools when building AI schemas */
|
|
298
305
|
export interface ToolFilterOptions {
|
|
@@ -9,5 +9,16 @@ export declare class WorkflowExecutor {
|
|
|
9
9
|
cancel(executionId: string): void;
|
|
10
10
|
/** Execute a single workflow step, applying param interpolation and overrides */
|
|
11
11
|
private executeStep;
|
|
12
|
+
/**
|
|
13
|
+
* Execute multiple steps concurrently (fan-out).
|
|
14
|
+
* All parallel steps run at once; results are merged.
|
|
15
|
+
* Fails only if ALL parallel steps fail.
|
|
16
|
+
*/
|
|
17
|
+
private executeParallelSteps;
|
|
18
|
+
/**
|
|
19
|
+
* Execute an agent session step - spawns an isolated AI agent.
|
|
20
|
+
* The agent runs a prompt with tool access and returns the result.
|
|
21
|
+
*/
|
|
22
|
+
private executeAgentStep;
|
|
12
23
|
}
|
|
13
24
|
//# sourceMappingURL=executor.d.ts.map
|
|
@@ -165,7 +165,17 @@ export class WorkflowExecutor {
|
|
|
165
165
|
execution.stepResults[i].status = 'running';
|
|
166
166
|
context.onStepStart?.(step, i);
|
|
167
167
|
const stepStartMs = Date.now();
|
|
168
|
-
const
|
|
168
|
+
const stepType = step.type || 'tool';
|
|
169
|
+
let stepResult;
|
|
170
|
+
if (stepType === 'parallel' && step.parallelSteps?.length) {
|
|
171
|
+
stepResult = await this.executeParallelSteps(step.parallelSteps, variables, context, options);
|
|
172
|
+
}
|
|
173
|
+
else if (stepType === 'agent_session' && step.prompt) {
|
|
174
|
+
stepResult = await this.executeAgentStep(step, variables);
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
stepResult = await this.executeStep(step, variables, context, options);
|
|
178
|
+
}
|
|
169
179
|
const durationMs = Date.now() - stepStartMs;
|
|
170
180
|
execution.stepResults[i] = {
|
|
171
181
|
stepId: step.id,
|
|
@@ -257,5 +267,93 @@ export class WorkflowExecutor {
|
|
|
257
267
|
};
|
|
258
268
|
}
|
|
259
269
|
}
|
|
270
|
+
/**
|
|
271
|
+
* Execute multiple steps concurrently (fan-out).
|
|
272
|
+
* All parallel steps run at once; results are merged.
|
|
273
|
+
* Fails only if ALL parallel steps fail.
|
|
274
|
+
*/
|
|
275
|
+
async executeParallelSteps(steps, variables, context, options) {
|
|
276
|
+
const results = await Promise.allSettled(steps.map((step) => this.executeStep(step, variables, context, options)));
|
|
277
|
+
const outputs = {};
|
|
278
|
+
let anySuccess = false;
|
|
279
|
+
const errors = [];
|
|
280
|
+
for (let i = 0; i < results.length; i++) {
|
|
281
|
+
const result = results[i];
|
|
282
|
+
const step = steps[i];
|
|
283
|
+
if (result.status === 'fulfilled') {
|
|
284
|
+
if (result.value.success) {
|
|
285
|
+
anySuccess = true;
|
|
286
|
+
if (step.captureOutput) {
|
|
287
|
+
outputs[step.captureOutput] = extractOutput(result.value, step.captureOutput);
|
|
288
|
+
variables[step.captureOutput] = outputs[step.captureOutput];
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
errors.push(`${step.name}: ${result.value.error?.message || 'failed'}`);
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
else {
|
|
296
|
+
errors.push(`${step.name}: ${result.reason}`);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
return {
|
|
300
|
+
success: anySuccess,
|
|
301
|
+
output: JSON.stringify(outputs),
|
|
302
|
+
data: outputs,
|
|
303
|
+
error: errors.length > 0 ? { code: 'PARALLEL_ERRORS', message: errors.join('; ') } : undefined,
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
/**
|
|
307
|
+
* Execute an agent session step - spawns an isolated AI agent.
|
|
308
|
+
* The agent runs a prompt with tool access and returns the result.
|
|
309
|
+
*/
|
|
310
|
+
async executeAgentStep(step, variables) {
|
|
311
|
+
try {
|
|
312
|
+
const { executeAgenticChat } = await import('../../agentic-executor.js');
|
|
313
|
+
const { createChatToolHandler } = await import('../../tool-handler.js');
|
|
314
|
+
const prompt = interpolateString(step.prompt || '', variables);
|
|
315
|
+
const conversationId = `workflow-agent-${crypto.randomUUID()}`;
|
|
316
|
+
const toolHandler = await createChatToolHandler({
|
|
317
|
+
conversationId,
|
|
318
|
+
securityMode: 'full',
|
|
319
|
+
});
|
|
320
|
+
const tools = toolHandler.getTools();
|
|
321
|
+
const response = await Promise.race([
|
|
322
|
+
executeAgenticChat({
|
|
323
|
+
conversationId,
|
|
324
|
+
messages: [{
|
|
325
|
+
id: crypto.randomUUID(),
|
|
326
|
+
role: 'user',
|
|
327
|
+
content: prompt,
|
|
328
|
+
timestamp: new Date().toISOString(),
|
|
329
|
+
}],
|
|
330
|
+
systemPrompt: 'You are an AI agent executing a workflow step. Complete the task concisely.',
|
|
331
|
+
model: step.model,
|
|
332
|
+
effort: 'medium',
|
|
333
|
+
toolHandler,
|
|
334
|
+
tools: tools.map((t) => ({
|
|
335
|
+
name: t.name,
|
|
336
|
+
description: t.description,
|
|
337
|
+
parameters: t.parameters,
|
|
338
|
+
})),
|
|
339
|
+
}),
|
|
340
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Agent step timed out')), step.timeoutMs || 300000)),
|
|
341
|
+
]);
|
|
342
|
+
return {
|
|
343
|
+
success: true,
|
|
344
|
+
output: response.content,
|
|
345
|
+
data: { content: response.content, model: response.model, tokens: response.usage?.totalTokens },
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
catch (error) {
|
|
349
|
+
return {
|
|
350
|
+
success: false,
|
|
351
|
+
error: {
|
|
352
|
+
code: 'AGENT_STEP_ERROR',
|
|
353
|
+
message: error instanceof Error ? error.message : 'Agent step failed',
|
|
354
|
+
},
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
}
|
|
260
358
|
}
|
|
261
359
|
//# sourceMappingURL=executor.js.map
|
|
@@ -5,15 +5,37 @@ export interface WorkflowDefinition {
|
|
|
5
5
|
description: string;
|
|
6
6
|
/** Keywords that trigger this workflow */
|
|
7
7
|
triggers: string[];
|
|
8
|
-
/** Sequential steps */
|
|
8
|
+
/** Sequential steps (or parallel groups) */
|
|
9
9
|
steps: WorkflowStep[];
|
|
10
10
|
/** Variables available to all steps */
|
|
11
11
|
variables?: Record<string, unknown>;
|
|
12
|
+
/** Schedule trigger - cron expression to auto-run this workflow */
|
|
13
|
+
schedule?: {
|
|
14
|
+
cron?: string;
|
|
15
|
+
intervalMs?: number;
|
|
16
|
+
timezone?: string;
|
|
17
|
+
};
|
|
18
|
+
/** Delivery configuration - where to send final output */
|
|
19
|
+
delivery?: {
|
|
20
|
+
channels: Array<{
|
|
21
|
+
type: 'telegram' | 'slack' | 'discord' | 'webhook';
|
|
22
|
+
target: string;
|
|
23
|
+
}>;
|
|
24
|
+
/** Which step output(s) to include in delivery */
|
|
25
|
+
includeOutputs?: string[];
|
|
26
|
+
/** Template for formatting the delivery message */
|
|
27
|
+
template?: string;
|
|
28
|
+
};
|
|
29
|
+
/** Max duration for entire workflow (ms) */
|
|
30
|
+
timeoutMs?: number;
|
|
12
31
|
}
|
|
32
|
+
export type WorkflowStepType = 'tool' | 'agent_session' | 'deliver' | 'parallel';
|
|
13
33
|
export interface WorkflowStep {
|
|
14
34
|
id: string;
|
|
15
35
|
name: string;
|
|
16
|
-
/**
|
|
36
|
+
/** Step type - defaults to 'tool' for backwards compatibility */
|
|
37
|
+
type?: WorkflowStepType;
|
|
38
|
+
/** Tool to execute (for type=tool) */
|
|
17
39
|
tool: string;
|
|
18
40
|
/** Parameters - supports {{variable}} interpolation from previous step outputs */
|
|
19
41
|
params: Record<string, unknown>;
|
|
@@ -25,6 +47,17 @@ export interface WorkflowStep {
|
|
|
25
47
|
continueOnError?: boolean;
|
|
26
48
|
/** Timeout override in ms */
|
|
27
49
|
timeoutMs?: number;
|
|
50
|
+
/** For type=parallel: steps to run concurrently */
|
|
51
|
+
parallelSteps?: WorkflowStep[];
|
|
52
|
+
/** For type=agent_session: AI prompt to execute */
|
|
53
|
+
prompt?: string;
|
|
54
|
+
/** For type=agent_session: AI model override */
|
|
55
|
+
model?: string;
|
|
56
|
+
/** For type=deliver: delivery target override */
|
|
57
|
+
deliverTo?: {
|
|
58
|
+
type: 'telegram' | 'slack' | 'discord' | 'webhook';
|
|
59
|
+
target: string;
|
|
60
|
+
};
|
|
28
61
|
}
|
|
29
62
|
export interface WorkflowExecution {
|
|
30
63
|
workflowId: string;
|
|
@@ -4,4 +4,5 @@
|
|
|
4
4
|
* Shared formatters for tool results across web UI and messaging channels.
|
|
5
5
|
*/
|
|
6
6
|
export { formatToolResult, type ChannelFormat, type FormattedToolResult, } from './tool-result-formatter.js';
|
|
7
|
+
export { convertMarkdown, stripMarkdown, type FormatTarget, } from './markdown-convert.js';
|
|
7
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Markdown Converter
|
|
3
|
+
*
|
|
4
|
+
* Converts standard markdown to platform-specific formats.
|
|
5
|
+
* The AI agent always produces markdown. Each delivery channel
|
|
6
|
+
* needs its own format.
|
|
7
|
+
*
|
|
8
|
+
* Supported targets:
|
|
9
|
+
* - telegram: HTML subset (<b>, <i>, <code>, <pre>, <a>)
|
|
10
|
+
* - slack: mrkdwn (*bold*, _italic_, `code`, ```blocks```, <url|text>)
|
|
11
|
+
* - discord: Standard markdown (mostly pass-through)
|
|
12
|
+
* - plain: Strip all formatting
|
|
13
|
+
*/
|
|
14
|
+
export type FormatTarget = 'telegram' | 'slack' | 'discord' | 'plain' | 'html';
|
|
15
|
+
/**
|
|
16
|
+
* Convert markdown text to the target format.
|
|
17
|
+
*/
|
|
18
|
+
export declare function convertMarkdown(text: string, target: FormatTarget): string;
|
|
19
|
+
/**
|
|
20
|
+
* Strip all markdown formatting -> plain text
|
|
21
|
+
*/
|
|
22
|
+
export declare function stripMarkdown(text: string): string;
|
|
23
|
+
//# sourceMappingURL=markdown-convert.d.ts.map
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Markdown Converter
|
|
3
|
+
*
|
|
4
|
+
* Converts standard markdown to platform-specific formats.
|
|
5
|
+
* The AI agent always produces markdown. Each delivery channel
|
|
6
|
+
* needs its own format.
|
|
7
|
+
*
|
|
8
|
+
* Supported targets:
|
|
9
|
+
* - telegram: HTML subset (<b>, <i>, <code>, <pre>, <a>)
|
|
10
|
+
* - slack: mrkdwn (*bold*, _italic_, `code`, ```blocks```, <url|text>)
|
|
11
|
+
* - discord: Standard markdown (mostly pass-through)
|
|
12
|
+
* - plain: Strip all formatting
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Convert markdown text to the target format.
|
|
16
|
+
*/
|
|
17
|
+
export function convertMarkdown(text, target) {
|
|
18
|
+
switch (target) {
|
|
19
|
+
case 'telegram':
|
|
20
|
+
return markdownToTelegramHtml(text);
|
|
21
|
+
case 'slack':
|
|
22
|
+
return markdownToSlackMrkdwn(text);
|
|
23
|
+
case 'discord':
|
|
24
|
+
return text; // Discord supports standard markdown
|
|
25
|
+
case 'plain':
|
|
26
|
+
return stripMarkdown(text);
|
|
27
|
+
case 'html':
|
|
28
|
+
return markdownToHtml(text);
|
|
29
|
+
default:
|
|
30
|
+
return text;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Markdown -> Telegram HTML
|
|
35
|
+
* Telegram supports: <b>, <i>, <u>, <s>, <code>, <pre>, <a href="url">text</a>
|
|
36
|
+
*/
|
|
37
|
+
function markdownToTelegramHtml(text) {
|
|
38
|
+
let result = text;
|
|
39
|
+
// Escape HTML entities first (but not our converted tags)
|
|
40
|
+
result = result
|
|
41
|
+
.replace(/&/g, '&')
|
|
42
|
+
.replace(/</g, '<')
|
|
43
|
+
.replace(/>/g, '>');
|
|
44
|
+
// Code blocks: ```lang\n...\n``` -> <pre><code>...</code></pre>
|
|
45
|
+
result = result.replace(/```(\w*)\n([\s\S]*?)```/g, (_m, lang, code) => {
|
|
46
|
+
const langAttr = lang ? ` class="language-${lang}"` : '';
|
|
47
|
+
return `<pre><code${langAttr}>${code.trim()}</code></pre>`;
|
|
48
|
+
});
|
|
49
|
+
// Inline code: `text` -> <code>text</code>
|
|
50
|
+
result = result.replace(/`([^`]+)`/g, '<code>$1</code>');
|
|
51
|
+
// Bold: **text** -> <b>text</b>
|
|
52
|
+
result = result.replace(/\*\*(.+?)\*\*/g, '<b>$1</b>');
|
|
53
|
+
// Italic: *text* or _text_ -> <i>text</i>
|
|
54
|
+
result = result.replace(/(?<!\*)\*([^*]+)\*(?!\*)/g, '<i>$1</i>');
|
|
55
|
+
result = result.replace(/(?<!_)_([^_]+)_(?!_)/g, '<i>$1</i>');
|
|
56
|
+
// Strikethrough: ~~text~~ -> <s>text</s>
|
|
57
|
+
result = result.replace(/~~(.+?)~~/g, '<s>$1</s>');
|
|
58
|
+
// Links: [text](url) -> <a href="url">text</a>
|
|
59
|
+
result = result.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2">$1</a>');
|
|
60
|
+
// Headings: # text -> <b>text</b> (Telegram has no heading tag)
|
|
61
|
+
result = result.replace(/^#{1,3}\s+(.+)$/gm, '<b>$1</b>');
|
|
62
|
+
// Bullet lists: - text or * text -> bullet
|
|
63
|
+
result = result.replace(/^\s*[-*]\s+(.+)$/gm, '\u2022 $1');
|
|
64
|
+
// Numbered lists: keep as-is (Telegram renders them fine)
|
|
65
|
+
// Block quotes: > text -> (no Telegram equivalent, use italic)
|
|
66
|
+
result = result.replace(/^>\s+(.+)$/gm, '<i>$1</i>');
|
|
67
|
+
return result;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Markdown -> Slack mrkdwn
|
|
71
|
+
* Slack uses: *bold*, _italic_, ~strikethrough~, `code`, ```code blocks```, <url|text>
|
|
72
|
+
*/
|
|
73
|
+
function markdownToSlackMrkdwn(text) {
|
|
74
|
+
let result = text;
|
|
75
|
+
// Code blocks: keep as-is (Slack supports ```)
|
|
76
|
+
// But remove language hints
|
|
77
|
+
result = result.replace(/```\w*\n/g, '```\n');
|
|
78
|
+
// Bold: **text** -> *text*
|
|
79
|
+
result = result.replace(/\*\*(.+?)\*\*/g, '*$1*');
|
|
80
|
+
// Italic: *text* -> _text_ (but not inside bold)
|
|
81
|
+
// Skip this - could conflict with bold conversion
|
|
82
|
+
// Strikethrough: ~~text~~ -> ~text~
|
|
83
|
+
result = result.replace(/~~(.+?)~~/g, '~$1~');
|
|
84
|
+
// Links: [text](url) -> <url|text>
|
|
85
|
+
result = result.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<$2|$1>');
|
|
86
|
+
// Headings: # text -> *text* (bold)
|
|
87
|
+
result = result.replace(/^#{1,3}\s+(.+)$/gm, '*$1*');
|
|
88
|
+
// Block quotes: > text -> > text (Slack supports this)
|
|
89
|
+
// Keep as-is
|
|
90
|
+
return result;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Markdown -> HTML (for web/email)
|
|
94
|
+
*/
|
|
95
|
+
function markdownToHtml(text) {
|
|
96
|
+
let result = text;
|
|
97
|
+
// Escape HTML
|
|
98
|
+
result = result
|
|
99
|
+
.replace(/&/g, '&')
|
|
100
|
+
.replace(/</g, '<')
|
|
101
|
+
.replace(/>/g, '>');
|
|
102
|
+
// Code blocks
|
|
103
|
+
result = result.replace(/```(\w*)\n([\s\S]*?)```/g, (_m, lang, code) => {
|
|
104
|
+
return `<pre><code class="${lang}">${code.trim()}</code></pre>`;
|
|
105
|
+
});
|
|
106
|
+
// Inline code
|
|
107
|
+
result = result.replace(/`([^`]+)`/g, '<code>$1</code>');
|
|
108
|
+
// Bold
|
|
109
|
+
result = result.replace(/\*\*(.+?)\*\*/g, '<strong>$1</strong>');
|
|
110
|
+
// Italic
|
|
111
|
+
result = result.replace(/(?<!\*)\*([^*]+)\*(?!\*)/g, '<em>$1</em>');
|
|
112
|
+
result = result.replace(/(?<!_)_([^_]+)_(?!_)/g, '<em>$1</em>');
|
|
113
|
+
// Links
|
|
114
|
+
result = result.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2">$1</a>');
|
|
115
|
+
// Headings
|
|
116
|
+
result = result.replace(/^### (.+)$/gm, '<h3>$1</h3>');
|
|
117
|
+
result = result.replace(/^## (.+)$/gm, '<h2>$1</h2>');
|
|
118
|
+
result = result.replace(/^# (.+)$/gm, '<h1>$1</h1>');
|
|
119
|
+
// Bullet lists
|
|
120
|
+
result = result.replace(/^\s*[-*]\s+(.+)$/gm, '<li>$1</li>');
|
|
121
|
+
// Paragraphs
|
|
122
|
+
result = result.replace(/\n\n/g, '</p><p>');
|
|
123
|
+
result = `<p>${result}</p>`;
|
|
124
|
+
return result;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Strip all markdown formatting -> plain text
|
|
128
|
+
*/
|
|
129
|
+
export function stripMarkdown(text) {
|
|
130
|
+
let result = text;
|
|
131
|
+
// Code blocks: remove fences, keep content
|
|
132
|
+
result = result.replace(/```\w*\n([\s\S]*?)```/g, '$1');
|
|
133
|
+
// Inline code: remove backticks
|
|
134
|
+
result = result.replace(/`([^`]+)`/g, '$1');
|
|
135
|
+
// Bold/italic: remove markers
|
|
136
|
+
result = result.replace(/\*\*(.+?)\*\*/g, '$1');
|
|
137
|
+
result = result.replace(/(?<!\*)\*([^*]+)\*(?!\*)/g, '$1');
|
|
138
|
+
result = result.replace(/(?<!_)_([^_]+)_(?!_)/g, '$1');
|
|
139
|
+
// Strikethrough
|
|
140
|
+
result = result.replace(/~~(.+?)~~/g, '$1');
|
|
141
|
+
// Links: [text](url) -> text (url)
|
|
142
|
+
result = result.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '$1 ($2)');
|
|
143
|
+
// Headings: remove #
|
|
144
|
+
result = result.replace(/^#{1,3}\s+/gm, '');
|
|
145
|
+
// Bullet lists: - text -> text
|
|
146
|
+
result = result.replace(/^\s*[-*]\s+/gm, '- ');
|
|
147
|
+
return result;
|
|
148
|
+
}
|
|
149
|
+
//# sourceMappingURL=markdown-convert.js.map
|
package/dist/chat/index.d.ts
CHANGED
|
@@ -8,7 +8,7 @@ export * from './system-prompts.js';
|
|
|
8
8
|
export * from './conversations.js';
|
|
9
9
|
export * from './memory.js';
|
|
10
10
|
export { PROFCLAW_CONTEXT, CHAT_PRESETS, QUICK_ACTIONS, buildSystemPrompt, type ChatPreset, type ChatContext, type QuickAction, type RuntimeInfo, } from './system-prompts.js';
|
|
11
|
-
export { initConversationTables, createConversation, getConversation, listConversations, updateConversationTitle, deleteConversation, addMessage, getConversationMessages, getRecentConversationsWithPreview, type Conversation, type ConversationMessage, } from './conversations.js';
|
|
11
|
+
export { initConversationTables, createConversation, getConversation, listConversations, updateConversationTitle, deleteConversation, addMessage, getConversationMessages, getRecentConversationsWithPreview, deleteMessage, type Conversation, type ConversationMessage, } from './conversations.js';
|
|
12
12
|
export { DEFAULT_MEMORY_CONFIG, estimateTokens, estimateMessagesTokens, getContextWindow, needsCompaction, summarizeMessages, compactMessages, getMemoryStats, truncateToolResult, processToolCallsForCompaction, scoreMessageImportance, selectMessagesForRetention, type MemoryConfig, type CompactionResult, type MemoryStats, } from './memory.js';
|
|
13
13
|
export { CHAT_SKILLS, MODEL_TIERS, detectIntent, selectModel, buildSkillPrompt, type ChatSkill, type SkillCapability, type IntentPattern, type SkillMatch, type ModelTier, } from './skills.js';
|
|
14
14
|
export { CHAT_TOOLS, executeTool, getToolDefinitions, type ToolResult, type CreateProjectInput, type CreateTicketInput, type CreateSprintInput, type ConfigureProviderInput, } from './tools.js';
|
package/dist/chat/index.js
CHANGED
|
@@ -9,7 +9,7 @@ export * from './conversations.js';
|
|
|
9
9
|
export * from './memory.js';
|
|
10
10
|
// Re-export for convenience
|
|
11
11
|
export { PROFCLAW_CONTEXT, CHAT_PRESETS, QUICK_ACTIONS, buildSystemPrompt, } from './system-prompts.js';
|
|
12
|
-
export { initConversationTables, createConversation, getConversation, listConversations, updateConversationTitle, deleteConversation, addMessage, getConversationMessages, getRecentConversationsWithPreview, } from './conversations.js';
|
|
12
|
+
export { initConversationTables, createConversation, getConversation, listConversations, updateConversationTitle, deleteConversation, addMessage, getConversationMessages, getRecentConversationsWithPreview, deleteMessage, } from './conversations.js';
|
|
13
13
|
export { DEFAULT_MEMORY_CONFIG, estimateTokens, estimateMessagesTokens, getContextWindow, needsCompaction, summarizeMessages, compactMessages, getMemoryStats,
|
|
14
14
|
// Advanced context pruning
|
|
15
15
|
truncateToolResult, processToolCallsForCompaction, scoreMessageImportance, selectMessagesForRetention, } from './memory.js';
|