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
|
@@ -29,11 +29,16 @@ import { buildSystemPrompt } from './system-prompts.js';
|
|
|
29
29
|
import { createConversation, addMessage, getConversationMessages, } from './conversations.js';
|
|
30
30
|
import { needsCompaction, compactMessages } from './memory.js';
|
|
31
31
|
import { getSessionModel } from './execution/tools/session-status.js';
|
|
32
|
+
import { routeQuery, recordRoutingDecision, isSmartRouterEnabled } from '../providers/smart-router.js';
|
|
33
|
+
import { AutomationPatternDetector } from './proactive/index.js';
|
|
34
|
+
import { observeWindow } from '../memory/observational.js';
|
|
32
35
|
// CONSTANTS
|
|
33
36
|
/** Max concurrent AI calls to prevent overload (inspired by NanoClaw GroupQueue) */
|
|
34
37
|
const MAX_CONCURRENT = parseInt(process.env['POOL_MAX_CONCURRENT'] ?? '50', 10);
|
|
35
38
|
/** Currently processing count */
|
|
36
39
|
let activeCount = 0;
|
|
40
|
+
/** Singleton automation pattern detector - learns across all conversations */
|
|
41
|
+
const patternDetector = new AutomationPatternDetector({ minOccurrences: 3 });
|
|
37
42
|
// CONVERSATION CACHE
|
|
38
43
|
/** In-memory cache: "telegram:default:12345" -> conversationId */
|
|
39
44
|
const channelConversations = new Map();
|
|
@@ -151,8 +156,22 @@ async function handleIncomingMessage(event, _context) {
|
|
|
151
156
|
const result = await compactMessages(messages);
|
|
152
157
|
messages = result.messages;
|
|
153
158
|
}
|
|
154
|
-
// Resolve model - per-conversation override or system default
|
|
155
|
-
const
|
|
159
|
+
// Resolve model - per-conversation override, smart routing, or system default
|
|
160
|
+
const sessionModel = getSessionModel(conversationId);
|
|
161
|
+
// Smart Model Router: auto-select cheapest capable model when no explicit override
|
|
162
|
+
const { aiProvider } = await import('../providers/ai-sdk.js');
|
|
163
|
+
let resolvedModel = sessionModel;
|
|
164
|
+
let routingDecision;
|
|
165
|
+
if (!sessionModel && isSmartRouterEnabled()) {
|
|
166
|
+
const availableProviders = new Set(aiProvider.getConfiguredProviders());
|
|
167
|
+
routingDecision = routeQuery(message.text, availableProviders, {
|
|
168
|
+
conversationLength: messages.length,
|
|
169
|
+
hasToolUse: false, // simple chat path has no tools
|
|
170
|
+
hasImages: false,
|
|
171
|
+
});
|
|
172
|
+
resolvedModel = routingDecision.selectedModel.id;
|
|
173
|
+
recordRoutingDecision(routingDecision);
|
|
174
|
+
}
|
|
156
175
|
// Build system prompt with channel personality
|
|
157
176
|
const personality = groupManager.getPersonality(message.chatId, message.provider);
|
|
158
177
|
const promptContext = {
|
|
@@ -160,7 +179,7 @@ async function handleIncomingMessage(event, _context) {
|
|
|
160
179
|
name: message.senderName || message.senderUsername,
|
|
161
180
|
},
|
|
162
181
|
runtime: {
|
|
163
|
-
model:
|
|
182
|
+
model: resolvedModel,
|
|
164
183
|
conversationId,
|
|
165
184
|
},
|
|
166
185
|
};
|
|
@@ -182,11 +201,10 @@ async function handleIncomingMessage(event, _context) {
|
|
|
182
201
|
content: message.text,
|
|
183
202
|
timestamp: message.timestamp.toISOString(),
|
|
184
203
|
});
|
|
185
|
-
// Call AI
|
|
186
|
-
const { aiProvider } = await import('../providers/ai-sdk.js');
|
|
204
|
+
// Call AI with smart-routed or user-selected model
|
|
187
205
|
const response = await aiProvider.chat({
|
|
188
206
|
messages: aiMessages,
|
|
189
|
-
model:
|
|
207
|
+
model: resolvedModel,
|
|
190
208
|
systemPrompt,
|
|
191
209
|
temperature: 0.7,
|
|
192
210
|
});
|
|
@@ -227,7 +245,41 @@ async function handleIncomingMessage(event, _context) {
|
|
|
227
245
|
conversationId,
|
|
228
246
|
model: response.model,
|
|
229
247
|
tokens: response.usage.totalTokens,
|
|
248
|
+
...(routingDecision && {
|
|
249
|
+
smartRouted: true,
|
|
250
|
+
complexity: routingDecision.complexity.tier,
|
|
251
|
+
savings: `${routingDecision.savingsPercent}%`,
|
|
252
|
+
}),
|
|
230
253
|
});
|
|
254
|
+
// Track query for automation pattern detection (non-blocking)
|
|
255
|
+
patternDetector.recordQuery(message.text);
|
|
256
|
+
const automationHint = patternDetector.detectPatterns();
|
|
257
|
+
if (automationHint) {
|
|
258
|
+
// Send a follow-up suggestion message
|
|
259
|
+
const hint = automationHint.suggestion;
|
|
260
|
+
const suggestionText = `${hint.message}\n\nI can set this up: "${hint.templateName}" (${hint.suggestedCron}).\nJust say "automate it" or "set it up" to create this automation.`;
|
|
261
|
+
sendProviderMessage({
|
|
262
|
+
provider: message.provider,
|
|
263
|
+
accountId: message.accountId,
|
|
264
|
+
to: message.chatId,
|
|
265
|
+
text: suggestionText,
|
|
266
|
+
threadId: replyTarget.threadId,
|
|
267
|
+
}).catch(() => { }); // fire and forget
|
|
268
|
+
logger.info('[MessageHandler] Automation pattern detected', {
|
|
269
|
+
pattern: automationHint.pattern,
|
|
270
|
+
count: automationHint.count,
|
|
271
|
+
template: hint.templateName,
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
// Observational memory: extract learnings every 10 messages (async, non-blocking)
|
|
275
|
+
if (messages.length > 0 && messages.length % 10 === 0) {
|
|
276
|
+
const observationMessages = messages.map(m => ({
|
|
277
|
+
role: m.role,
|
|
278
|
+
content: m.content,
|
|
279
|
+
}));
|
|
280
|
+
observeWindow(conversationId, observationMessages, 20, message.senderUsername)
|
|
281
|
+
.catch(() => { }); // fire and forget
|
|
282
|
+
}
|
|
231
283
|
}
|
|
232
284
|
catch (error) {
|
|
233
285
|
logger.error('[MessageHandler] Failed to process message', {
|
|
@@ -163,5 +163,67 @@ export declare class BackgroundResearcher {
|
|
|
163
163
|
inject(taskId: string, results: ResearchResult[]): void;
|
|
164
164
|
private run;
|
|
165
165
|
}
|
|
166
|
+
export interface PatternMatch {
|
|
167
|
+
pattern: string;
|
|
168
|
+
count: number;
|
|
169
|
+
firstSeen: number;
|
|
170
|
+
lastSeen: number;
|
|
171
|
+
/** Suggested automation */
|
|
172
|
+
suggestion: AutomationSuggestion;
|
|
173
|
+
}
|
|
174
|
+
export interface AutomationSuggestion {
|
|
175
|
+
message: string;
|
|
176
|
+
templateName: string;
|
|
177
|
+
suggestedCron: string;
|
|
178
|
+
params: Record<string, unknown>;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Detects repeated patterns in user queries and suggests automations.
|
|
182
|
+
*
|
|
183
|
+
* Tracks query frequency, tool usage patterns, and timing to identify
|
|
184
|
+
* tasks that should be automated via cron jobs.
|
|
185
|
+
*/
|
|
186
|
+
export declare class AutomationPatternDetector {
|
|
187
|
+
private queryHistory;
|
|
188
|
+
private dismissedPatterns;
|
|
189
|
+
private maxHistory;
|
|
190
|
+
private readonly minOccurrences;
|
|
191
|
+
private readonly windowMs;
|
|
192
|
+
/** Max 1 suggestion per session */
|
|
193
|
+
private suggestedThisSession;
|
|
194
|
+
constructor(options?: {
|
|
195
|
+
/** Min occurrences before suggesting automation (default: 3) */
|
|
196
|
+
minOccurrences?: number;
|
|
197
|
+
/** Time window to look at (default: 7 days) */
|
|
198
|
+
windowMs?: number;
|
|
199
|
+
});
|
|
200
|
+
/**
|
|
201
|
+
* Record a user query for pattern analysis.
|
|
202
|
+
*/
|
|
203
|
+
recordQuery(query: string, toolsUsed?: string[]): void;
|
|
204
|
+
/**
|
|
205
|
+
* Check for automation-worthy patterns.
|
|
206
|
+
* Returns a suggestion if a pattern is detected, or null.
|
|
207
|
+
* Only returns one suggestion per session to avoid fatigue.
|
|
208
|
+
*/
|
|
209
|
+
detectPatterns(): PatternMatch | null;
|
|
210
|
+
/**
|
|
211
|
+
* User dismissed a suggestion - don't suggest it again.
|
|
212
|
+
*/
|
|
213
|
+
dismiss(pattern: string): void;
|
|
214
|
+
/**
|
|
215
|
+
* Reset session state (call at session start).
|
|
216
|
+
*/
|
|
217
|
+
resetSession(): void;
|
|
218
|
+
/**
|
|
219
|
+
* Normalize a query for pattern matching.
|
|
220
|
+
* Strips dates, numbers, and common filler to find the core intent.
|
|
221
|
+
*/
|
|
222
|
+
private normalizeQuery;
|
|
223
|
+
/**
|
|
224
|
+
* Build an automation suggestion from a detected pattern.
|
|
225
|
+
*/
|
|
226
|
+
private buildSuggestion;
|
|
227
|
+
}
|
|
166
228
|
export {};
|
|
167
229
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -720,4 +720,151 @@ export class BackgroundResearcher {
|
|
|
720
720
|
}
|
|
721
721
|
}
|
|
722
722
|
}
|
|
723
|
+
/**
|
|
724
|
+
* Detects repeated patterns in user queries and suggests automations.
|
|
725
|
+
*
|
|
726
|
+
* Tracks query frequency, tool usage patterns, and timing to identify
|
|
727
|
+
* tasks that should be automated via cron jobs.
|
|
728
|
+
*/
|
|
729
|
+
export class AutomationPatternDetector {
|
|
730
|
+
queryHistory = [];
|
|
731
|
+
dismissedPatterns = new Set();
|
|
732
|
+
maxHistory = 500;
|
|
733
|
+
minOccurrences;
|
|
734
|
+
windowMs;
|
|
735
|
+
/** Max 1 suggestion per session */
|
|
736
|
+
suggestedThisSession = false;
|
|
737
|
+
constructor(options) {
|
|
738
|
+
this.minOccurrences = options?.minOccurrences ?? 3;
|
|
739
|
+
this.windowMs = options?.windowMs ?? 7 * 24 * 60 * 60 * 1000;
|
|
740
|
+
}
|
|
741
|
+
/**
|
|
742
|
+
* Record a user query for pattern analysis.
|
|
743
|
+
*/
|
|
744
|
+
recordQuery(query, toolsUsed = []) {
|
|
745
|
+
this.queryHistory.push({
|
|
746
|
+
query,
|
|
747
|
+
normalized: this.normalizeQuery(query),
|
|
748
|
+
timestamp: Date.now(),
|
|
749
|
+
toolsUsed,
|
|
750
|
+
});
|
|
751
|
+
// Trim old entries
|
|
752
|
+
if (this.queryHistory.length > this.maxHistory) {
|
|
753
|
+
this.queryHistory = this.queryHistory.slice(-this.maxHistory);
|
|
754
|
+
}
|
|
755
|
+
}
|
|
756
|
+
/**
|
|
757
|
+
* Check for automation-worthy patterns.
|
|
758
|
+
* Returns a suggestion if a pattern is detected, or null.
|
|
759
|
+
* Only returns one suggestion per session to avoid fatigue.
|
|
760
|
+
*/
|
|
761
|
+
detectPatterns() {
|
|
762
|
+
if (this.suggestedThisSession)
|
|
763
|
+
return null;
|
|
764
|
+
const cutoff = Date.now() - this.windowMs;
|
|
765
|
+
const recent = this.queryHistory.filter((q) => q.timestamp >= cutoff);
|
|
766
|
+
// Group by normalized query
|
|
767
|
+
const groups = new Map();
|
|
768
|
+
for (const record of recent) {
|
|
769
|
+
const existing = groups.get(record.normalized) || [];
|
|
770
|
+
existing.push(record);
|
|
771
|
+
groups.set(record.normalized, existing);
|
|
772
|
+
}
|
|
773
|
+
// Find patterns that exceed threshold
|
|
774
|
+
for (const [normalized, records] of groups) {
|
|
775
|
+
if (records.length < this.minOccurrences)
|
|
776
|
+
continue;
|
|
777
|
+
if (this.dismissedPatterns.has(normalized))
|
|
778
|
+
continue;
|
|
779
|
+
const suggestion = this.buildSuggestion(normalized, records);
|
|
780
|
+
if (!suggestion)
|
|
781
|
+
continue;
|
|
782
|
+
this.suggestedThisSession = true;
|
|
783
|
+
return {
|
|
784
|
+
pattern: normalized,
|
|
785
|
+
count: records.length,
|
|
786
|
+
firstSeen: records[0].timestamp,
|
|
787
|
+
lastSeen: records[records.length - 1].timestamp,
|
|
788
|
+
suggestion,
|
|
789
|
+
};
|
|
790
|
+
}
|
|
791
|
+
return null;
|
|
792
|
+
}
|
|
793
|
+
/**
|
|
794
|
+
* User dismissed a suggestion - don't suggest it again.
|
|
795
|
+
*/
|
|
796
|
+
dismiss(pattern) {
|
|
797
|
+
this.dismissedPatterns.add(pattern);
|
|
798
|
+
}
|
|
799
|
+
/**
|
|
800
|
+
* Reset session state (call at session start).
|
|
801
|
+
*/
|
|
802
|
+
resetSession() {
|
|
803
|
+
this.suggestedThisSession = false;
|
|
804
|
+
}
|
|
805
|
+
/**
|
|
806
|
+
* Normalize a query for pattern matching.
|
|
807
|
+
* Strips dates, numbers, and common filler to find the core intent.
|
|
808
|
+
*/
|
|
809
|
+
normalizeQuery(query) {
|
|
810
|
+
return query
|
|
811
|
+
.toLowerCase()
|
|
812
|
+
.replace(/\b(today|yesterday|this week|last week|this morning)\b/g, '')
|
|
813
|
+
.replace(/\b\d{4}[-/]\d{2}[-/]\d{2}\b/g, '')
|
|
814
|
+
.replace(/\b\d+\b/g, 'N')
|
|
815
|
+
.replace(/\s+/g, ' ')
|
|
816
|
+
.trim();
|
|
817
|
+
}
|
|
818
|
+
/**
|
|
819
|
+
* Build an automation suggestion from a detected pattern.
|
|
820
|
+
*/
|
|
821
|
+
buildSuggestion(normalized, records) {
|
|
822
|
+
// Detect common tool patterns
|
|
823
|
+
const toolCounts = new Map();
|
|
824
|
+
for (const record of records) {
|
|
825
|
+
for (const tool of record.toolsUsed) {
|
|
826
|
+
toolCounts.set(tool, (toolCounts.get(tool) || 0) + 1);
|
|
827
|
+
}
|
|
828
|
+
}
|
|
829
|
+
const usesWebSearch = (toolCounts.get('web_search') || 0) >= 2;
|
|
830
|
+
const usesWebFetch = (toolCounts.get('web_fetch') || 0) >= 2;
|
|
831
|
+
// News/research patterns
|
|
832
|
+
if (usesWebSearch || normalized.includes('news') || normalized.includes('latest') || normalized.includes('update')) {
|
|
833
|
+
return {
|
|
834
|
+
message: `You've asked about this ${records.length} times recently. Want me to set up a daily digest?`,
|
|
835
|
+
templateName: 'Morning AI News Digest',
|
|
836
|
+
suggestedCron: '0 7 * * 1-5',
|
|
837
|
+
params: { prompt: records[records.length - 1].query },
|
|
838
|
+
};
|
|
839
|
+
}
|
|
840
|
+
// Status/report patterns
|
|
841
|
+
if (normalized.includes('status') || normalized.includes('summary') || normalized.includes('report')) {
|
|
842
|
+
return {
|
|
843
|
+
message: `You check this regularly. Want me to generate this report automatically?`,
|
|
844
|
+
templateName: 'Daily Status Report',
|
|
845
|
+
suggestedCron: '0 9 * * 1-5',
|
|
846
|
+
params: { prompt: records[records.length - 1].query },
|
|
847
|
+
};
|
|
848
|
+
}
|
|
849
|
+
// Health/monitoring patterns
|
|
850
|
+
if (normalized.includes('health') || normalized.includes('check') || normalized.includes('monitor')) {
|
|
851
|
+
return {
|
|
852
|
+
message: `You run this check often. Want me to monitor this automatically?`,
|
|
853
|
+
templateName: 'Health Check',
|
|
854
|
+
suggestedCron: '*/30 * * * *',
|
|
855
|
+
params: { prompt: records[records.length - 1].query },
|
|
856
|
+
};
|
|
857
|
+
}
|
|
858
|
+
// Generic repeated task
|
|
859
|
+
if (records.length >= 5) {
|
|
860
|
+
return {
|
|
861
|
+
message: `You've done this ${records.length} times. Want me to automate it on a schedule?`,
|
|
862
|
+
templateName: 'Custom AI Agent Task',
|
|
863
|
+
suggestedCron: '0 9 * * *',
|
|
864
|
+
params: { prompt: records[records.length - 1].query },
|
|
865
|
+
};
|
|
866
|
+
}
|
|
867
|
+
return null;
|
|
868
|
+
}
|
|
869
|
+
}
|
|
723
870
|
//# sourceMappingURL=index.js.map
|
|
@@ -47,10 +47,10 @@ export declare const IRCAccountConfigSchema: z.ZodObject<{
|
|
|
47
47
|
channels: z.ZodOptional<z.ZodArray<z.ZodString, "many">>;
|
|
48
48
|
useTLS: z.ZodDefault<z.ZodBoolean>;
|
|
49
49
|
}, "strip", z.ZodTypeAny, {
|
|
50
|
+
port: number;
|
|
50
51
|
id: string;
|
|
51
52
|
provider: "irc";
|
|
52
53
|
enabled: boolean;
|
|
53
|
-
port: number;
|
|
54
54
|
useTLS: boolean;
|
|
55
55
|
name?: string | undefined;
|
|
56
56
|
isDefault?: boolean | undefined;
|
|
@@ -62,10 +62,10 @@ export declare const IRCAccountConfigSchema: z.ZodObject<{
|
|
|
62
62
|
id: string;
|
|
63
63
|
provider: "irc";
|
|
64
64
|
name?: string | undefined;
|
|
65
|
+
port?: number | undefined;
|
|
65
66
|
isDefault?: boolean | undefined;
|
|
66
67
|
enabled?: boolean | undefined;
|
|
67
68
|
password?: string | undefined;
|
|
68
|
-
port?: number | undefined;
|
|
69
69
|
channels?: string[] | undefined;
|
|
70
70
|
server?: string | undefined;
|
|
71
71
|
nick?: string | undefined;
|
|
@@ -28,6 +28,7 @@ interface TelegramChat {
|
|
|
28
28
|
}
|
|
29
29
|
interface TelegramMessage {
|
|
30
30
|
message_id: number;
|
|
31
|
+
message_thread_id?: number;
|
|
31
32
|
from?: TelegramUser;
|
|
32
33
|
chat: TelegramChat;
|
|
33
34
|
date: number;
|
|
@@ -48,6 +49,7 @@ interface TelegramMessage {
|
|
|
48
49
|
file_name?: string;
|
|
49
50
|
mime_type?: string;
|
|
50
51
|
};
|
|
52
|
+
is_topic_message?: boolean;
|
|
51
53
|
}
|
|
52
54
|
interface TelegramCallbackQuery {
|
|
53
55
|
id: string;
|
|
@@ -46,7 +46,7 @@ const capabilities = {
|
|
|
46
46
|
reactions: true,
|
|
47
47
|
edit: true,
|
|
48
48
|
delete: true,
|
|
49
|
-
threads:
|
|
49
|
+
threads: true, // Forum topics via message_thread_id
|
|
50
50
|
media: true,
|
|
51
51
|
richBlocks: false, // Uses HTML/Markdown
|
|
52
52
|
oauth: false,
|
|
@@ -176,11 +176,26 @@ const outboundAdapter = {
|
|
|
176
176
|
const chunks = textChunks.length > 0 ? textChunks : [undefined];
|
|
177
177
|
let replyToId = message.replyToId ? parseInt(message.replyToId, 10) : undefined;
|
|
178
178
|
let firstMessage;
|
|
179
|
+
// Parse topic from threadId or "chatId:topic:topicId" format in `to`
|
|
180
|
+
let targetChatId = message.to;
|
|
181
|
+
let topicId;
|
|
182
|
+
if (message.threadId) {
|
|
183
|
+
topicId = parseInt(message.threadId, 10);
|
|
184
|
+
}
|
|
185
|
+
else if (targetChatId.includes(':topic:')) {
|
|
186
|
+
const parts = targetChatId.split(':topic:');
|
|
187
|
+
targetChatId = parts[0];
|
|
188
|
+
topicId = parseInt(parts[1], 10);
|
|
189
|
+
}
|
|
179
190
|
for (const [index, chunk] of chunks.entries()) {
|
|
180
191
|
const params = {
|
|
181
|
-
chat_id:
|
|
192
|
+
chat_id: targetChatId,
|
|
182
193
|
parse_mode: 'HTML',
|
|
183
194
|
};
|
|
195
|
+
// Forum topic support
|
|
196
|
+
if (topicId && !isNaN(topicId)) {
|
|
197
|
+
params.message_thread_id = topicId;
|
|
198
|
+
}
|
|
184
199
|
if (chunk !== undefined) {
|
|
185
200
|
params.text = chunk;
|
|
186
201
|
}
|
|
@@ -288,6 +303,10 @@ const inboundAdapter = {
|
|
|
288
303
|
chatType: getChatType(message.chat.type),
|
|
289
304
|
chatId: String(message.chat.id),
|
|
290
305
|
chatName: message.chat.title || message.chat.first_name,
|
|
306
|
+
// Forum topic support: include topic ID as threadId
|
|
307
|
+
threadId: message.message_thread_id
|
|
308
|
+
? String(message.message_thread_id)
|
|
309
|
+
: undefined,
|
|
291
310
|
replyToId: message.reply_to_message
|
|
292
311
|
? String(message.reply_to_message.message_id)
|
|
293
312
|
: undefined,
|
|
@@ -13,10 +13,10 @@ export interface RuntimeInfo {
|
|
|
13
13
|
conversationId?: string;
|
|
14
14
|
sessionOverride?: string;
|
|
15
15
|
}
|
|
16
|
-
export declare const PROFCLAW_CONTEXT = "You are profClaw
|
|
16
|
+
export declare const PROFCLAW_CONTEXT = "You are profClaw, a personal AI assistant running inside profClaw engine.\nYou help with coding, research, automation, and general tasks. You have access to tools - use them.\n\n## Response Style\n- Be concise and direct. No filler, no preamble.\n- Do NOT use emoji headers, LaTeX, or excessive formatting.\n- Use short paragraphs and plain markdown (headers, bold, code blocks only when needed).\n- Match the user's tone \u2014 casual question gets a casual answer.\n- Lead with the answer, then explain only if needed.";
|
|
17
17
|
export declare const GROUNDING_SUFFIX = "\n\n## Important Reminder\nYou are a chat assistant, not an execution engine. You can:\n- Help draft content, analyze information, and answer questions\n- Provide guidance on how to use profClaw\n\nYou CANNOT:\n- Execute code, run scripts, or make API calls\n- Directly modify tasks, tickets, or any data\n- Access external systems or the user's files\n\nIf asked to \"run\" or \"execute\" something, explain that you can help write or draft it, but the user needs to execute it themselves through the profClaw UI or API.";
|
|
18
|
-
export declare const TOOL_ENABLED_SUFFIX = "\n\n##
|
|
19
|
-
export declare const AGENT_MODE_SUFFIX = "\n\n## Tool Usage\nYou have
|
|
18
|
+
export declare const TOOL_ENABLED_SUFFIX = "\n\n## Tools \u2014 YOU MUST USE THEM\nYou have real tools that execute actions. You are NOT limited to text responses.\n\nALWAYS call a tool when the user asks you to:\n- Search the web \u2192 call web_search\n- Read a URL or website \u2192 call web_fetch\n- Read a file \u2192 call read_file\n- Run a command \u2192 call exec\n- Write a file \u2192 call write_file\n\nDo NOT say \"I can't browse the web\" or \"I can't access files.\" You CAN. Call the tool.\nIf you're unsure, call the tool anyway \u2014 it's better to try and fail than refuse.";
|
|
19
|
+
export declare const AGENT_MODE_SUFFIX = "\n\n## Tool Call Style\nDo not narrate routine tool calls - just call the tool.\nNarrate only for multi-step work, complex problems, or sensitive actions.\nWhen a tool exists for an action, use it directly. Never say \"I can't do that\" when a tool can.\n\n## Tool Usage\nYou have tools. Use them when the task requires external data or actions.\n\n**ALWAYS use tools for:**\n- Any search/lookup/research request -> web_search\n- Reading a URL/website -> web_fetch\n- File operations -> read_file, write_file, edit_file, grep\n- Running commands -> exec\n- Git/GitHub operations -> git_*, github_pr, create_pr\n- Code quality -> typecheck, lint, build, test_run\n- \"What is X?\" about anything specific -> web_search (do NOT guess)\n\n**Skip tools only for:** greetings, thanks, simple math, questions about yourself.\n\n**Rules:**\n- Chain tools for multi-step tasks. Do not stop after one call.\n- Use parallel calls when steps are independent.\n- Do NOT ask permission. Just execute.\n- If a tool fails, try an alternative approach.\n- After completing work, call complete_task with a brief summary.\n- For text-only replies, do NOT call complete_task.\n\n## Skills\nYou have access to skills (see Available Skills list). Before starting a complex task:\n1. Scan the skills list for a relevant skill\n2. If found, read the skill's SKILL.md with read_file to get detailed instructions\n3. Follow the skill's workflow\n\n## Workspace\nTreat the current directory as your workspace. Use relative paths.\nWhen modifying code: read first, then edit, then verify (typecheck/test).\n\n## Safety\nDo not pursue independent goals beyond the user's request.\nPrioritize safety and human oversight. If instructions conflict, ask.\nDo not manipulate access controls or bypass safeguards.";
|
|
20
20
|
export interface ChatPreset {
|
|
21
21
|
id: string;
|
|
22
22
|
name: string;
|