profclaw 0.0.1-beta.3 → 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 +54 -34
- package/CONTRIBUTING.md +23 -5
- package/Dockerfile +39 -23
- package/README.md +271 -72
- 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 +15 -3
- package/dist/chat/execution/tools/index.js +125 -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/slack/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/models.js +39 -26
- package/dist/cli/commands/onboard.js +263 -98
- 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 +375 -91
- 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 -6
- 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/providers.d.ts +15 -0
- package/dist/cli/providers.js +41 -0
- package/dist/cli/utils/api.d.ts +9 -0
- package/dist/cli/utils/api.js +58 -2
- package/dist/core/deployment.js +2 -0
- 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 +97 -18
- 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/channels.d.ts +12 -0
- package/dist/routes/channels.js +166 -0
- 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 +4 -1
- package/dist/server/stream-bridge.d.ts +19 -0
- package/dist/server/stream-bridge.js +38 -0
- package/dist/server.js +421 -141
- 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/git-workflow/SKILL.md +3 -3
- 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-DlYUcOss.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-CgPqzUvj.js → Settings-xA8Zhi3p.js} +3 -3
- package/ui/dist/assets/StatusIndicator-B8vfFAxg.js +1 -0
- package/ui/dist/assets/{SummaryDetail-CwLAfHgJ.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-CGck7gxR.js → archive-CX7UvZpf.js} +1 -1
- package/ui/dist/assets/badge-BbfnwDJP.js +1 -0
- package/ui/dist/assets/{bug-DqSGPUUE.js → bug-3WX0394-.js} +1 -1
- package/ui/dist/assets/{calendar-BuZ4zbPW.js → calendar-buq77TaS.js} +1 -1
- package/ui/dist/assets/{chevron-up-DcJ4LL_N.js → chevron-up-4ymsBJRo.js} +1 -1
- package/ui/dist/assets/{circle-x-C78PNZjF.js → circle-x-ByXtwR6Y.js} +1 -1
- package/ui/dist/assets/constants-CVdDh7p0.js +1 -0
- package/ui/dist/assets/{cpu-Ck6AoG8c.js → cpu-CiuoCeDY.js} +1 -1
- package/ui/dist/assets/{database-CA2w8Lvt.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-FhHKRbfl.js → ellipsis-vT-5SVIp.js} +1 -1
- package/ui/dist/assets/{ellipsis-vertical-CO0UqE4-.js → ellipsis-vertical-B4tAX_bL.js} +1 -1
- package/ui/dist/assets/feature-markdown-DBo5Q7uq.js +289 -0
- package/ui/dist/assets/{file-code-ChnhYYj1.js → file-code-ChOWdKXf.js} +1 -1
- package/ui/dist/assets/{folder-open-CHwA1-ve.js → folder-open-CkOUbIiP.js} +1 -1
- package/ui/dist/assets/{funnel-ByEjRFNB.js → funnel-uZkoSPP-.js} +1 -1
- package/ui/dist/assets/{git-branch-GTOPQgU4.js → git-branch-CwvUxj7C.js} +1 -1
- package/ui/dist/assets/{git-commit-horizontal-F5M84Kut.js → git-commit-horizontal-lxPzCvhD.js} +1 -1
- package/ui/dist/assets/{globe-CQWfr7hT.js → globe-D_WpJdsj.js} +1 -1
- package/ui/dist/assets/{hash-nKC9gtLg.js → hash-CA0hJ7vh.js} +1 -1
- package/ui/dist/assets/{history-DfFSA9xJ.js → history-CEWMLELs.js} +1 -1
- package/ui/dist/assets/inbox-ehtOptTV.js +1 -0
- package/ui/dist/assets/{index-a4Fxq0Hb.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-WmgjMhWF.js → layout-dashboard-BRUM0kpT.js} +1 -1
- package/ui/dist/assets/{lightbulb-Bo8hEr7B.js → lightbulb-CN2q1O5l.js} +1 -1
- package/ui/dist/assets/{link-2-YqrpQXBH.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-CD0H5hot.js → message-square-Bbb241am.js} +1 -1
- package/ui/dist/assets/package-CwT3IzFx.js +1 -0
- package/ui/dist/assets/{pencil-DpFnj5dn.js → pencil-CDmiHzoj.js} +1 -1
- package/ui/dist/assets/{play-DVgea_jT.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-BFxPYGx9.js → rocket--8ZHgdXJ.js} +1 -1
- package/ui/dist/assets/select-n108rXny.js +1 -0
- package/ui/dist/assets/{send-eYnW_7n-.js → send-Cu7MR2Qh.js} +1 -1
- package/ui/dist/assets/server-DmodxZp-.js +1 -0
- package/ui/dist/assets/{settings-2-scXUOuE_.js → settings-2-CkRNqkxj.js} +1 -1
- package/ui/dist/assets/sheet-7aUJkyzU.js +1 -0
- package/ui/dist/assets/{shield-check-PEr7nmVw.js → shield-check-ViI3nMKE.js} +1 -1
- package/ui/dist/assets/{shield-off-CLtXio62.js → shield-off-DN3tagkn.js} +1 -1
- package/ui/dist/assets/skeleton-C0E1Nfro.js +1 -0
- package/ui/dist/assets/{smartphone-DusFfY0U.js → smartphone-5FghiXpA.js} +1 -1
- package/ui/dist/assets/{square-e1yxB2eR.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-tAwMmQ9G.js → tag-CH_vQliw.js} +1 -1
- package/ui/dist/assets/textarea-CxDiKFXZ.js +1 -0
- package/ui/dist/assets/{timer-Vel1N3RP.js → timer-CdGVTb60.js} +1 -1
- package/ui/dist/assets/tooltip-BuW9A5UO.js +1 -0
- package/ui/dist/assets/{trash-2-eM-CNwsZ.js → trash-2-CucZJL0N.js} +1 -1
- package/ui/dist/assets/trending-down-BCezC1z2.js +1 -0
- package/ui/dist/assets/{trending-up-BGafmjRo.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-DPvcd9Pi.js → wand-sparkles-BaH6pJnc.js} +1 -1
- package/ui/dist/assets/{wrench-B8s3zYVV.js → wrench-CjxjP6ok.js} +1 -1
- package/ui/dist/index.html +5 -2
- package/dist/chat/auto-reply.d.ts +0 -90
- package/dist/chat/auto-reply.js +0 -272
- package/dist/chat/execution/pty.d.ts +0 -92
- package/dist/chat/execution/pty.js +0 -285
- package/dist/chat/execution/tools/glinr-ops.d.ts +0 -202
- package/dist/chat/execution/tools/glinr-ops.js +0 -694
- package/dist/cli/commands/browser.d.ts +0 -3
- package/dist/cli/commands/browser.js +0 -138
- package/dist/cli/commands/canvas.d.ts +0 -3
- package/dist/cli/commands/canvas.js +0 -155
- package/dist/cli/commands/nodes.d.ts +0 -3
- package/dist/cli/commands/nodes.js +0 -193
- package/dist/diagnostics/exporters.d.ts +0 -21
- package/dist/diagnostics/exporters.js +0 -138
- package/dist/diagnostics/index.d.ts +0 -10
- package/dist/diagnostics/index.js +0 -9
- package/dist/diagnostics/middleware.d.ts +0 -12
- package/dist/diagnostics/middleware.js +0 -58
- package/dist/diagnostics/tracer.d.ts +0 -133
- package/dist/diagnostics/tracer.js +0 -257
- package/dist/discovery/index.d.ts +0 -8
- package/dist/discovery/index.js +0 -7
- package/dist/discovery/mdns.d.ts +0 -40
- package/dist/discovery/mdns.js +0 -249
- package/dist/plugins/registry.d.ts +0 -122
- package/dist/plugins/registry.js +0 -352
- package/dist/plugins/sandbox.d.ts +0 -77
- package/dist/plugins/sandbox.js +0 -287
- package/dist/plugins/search/brave.d.ts +0 -9
- package/dist/plugins/search/brave.js +0 -157
- package/dist/plugins/search/duckduckgo.d.ts +0 -9
- package/dist/plugins/search/duckduckgo.js +0 -171
- package/dist/plugins/search/index.d.ts +0 -13
- package/dist/plugins/search/index.js +0 -23
- package/dist/plugins/search/searxng.d.ts +0 -9
- package/dist/plugins/search/searxng.js +0 -170
- package/dist/plugins/search/serper.d.ts +0 -9
- package/dist/plugins/search/serper.js +0 -135
- package/dist/plugins/search/tavily.d.ts +0 -9
- package/dist/plugins/search/tavily.js +0 -146
- package/dist/providers/adapters/anthropic.d.ts +0 -26
- package/dist/providers/adapters/anthropic.js +0 -306
- package/dist/providers/adapters/base.d.ts +0 -53
- package/dist/providers/adapters/base.js +0 -99
- package/dist/providers/adapters/ollama.d.ts +0 -30
- package/dist/providers/adapters/ollama.js +0 -292
- package/dist/utils/ai-cache.d.ts +0 -72
- package/dist/utils/ai-cache.js +0 -204
- package/dist/utils/file-lock.d.ts +0 -85
- package/dist/utils/file-lock.js +0 -204
- package/ui/dist/assets/ActivityView-DIPQSJ_d.js +0 -1
- package/ui/dist/assets/AgentList-CqyaYrcq.js +0 -1
- package/ui/dist/assets/AnalyticsDashboard-C-mjuGHT.js +0 -1
- package/ui/dist/assets/AreaChart-CfYWmbtr.js +0 -1
- package/ui/dist/assets/CartesianChart-BaQ3It0c.js +0 -36
- package/ui/dist/assets/ChatView-DxxQy6pl.js +0 -10
- package/ui/dist/assets/CostsDashboard-CDBBcGkg.js +0 -1
- package/ui/dist/assets/EstimateSelect-CDjf5qKl.js +0 -1
- package/ui/dist/assets/FloatingChatbot-CZHjvJIe.js +0 -2
- package/ui/dist/assets/InviteCodeManagement-DTm-IPTm.js +0 -2
- package/ui/dist/assets/ProjectIcon-BMRpnM04.js +0 -1
- package/ui/dist/assets/ProjectList-D85TN0i0.js +0 -4
- package/ui/dist/assets/StatusIndicator-yig0uZEA.js +0 -1
- package/ui/dist/assets/SummaryList-BvS5Idnu.js +0 -1
- package/ui/dist/assets/TaskDetail-zarC1fOt.js +0 -1
- package/ui/dist/assets/TaskList-CyJq3ANE.js +0 -1
- package/ui/dist/assets/TicketBoard-BlWr3-iH.js +0 -1
- package/ui/dist/assets/TicketDetail-DmqWKj2W.js +0 -1
- package/ui/dist/assets/TicketList-Scj4pMWa.js +0 -1
- package/ui/dist/assets/UserManagement-BH7uG7dw.js +0 -2
- package/ui/dist/assets/ViewSwitcher-3HzZUdWn.js +0 -1
- package/ui/dist/assets/alert-dialog-DWPb2IfQ.js +0 -7
- package/ui/dist/assets/badge-DEmc3Z_l.js +0 -1
- package/ui/dist/assets/brain-CfFdLVqb.js +0 -1
- package/ui/dist/assets/constants-DhDjZe4P.js +0 -1
- package/ui/dist/assets/dialog-BOdGWhgE.js +0 -1
- package/ui/dist/assets/index--JkIxVXb.js +0 -67
- package/ui/dist/assets/index-Ca3vk7Gq.js +0 -1
- package/ui/dist/assets/index-DHGvP9mp.js +0 -1
- package/ui/dist/assets/index-DeI8lKRR.js +0 -1
- package/ui/dist/assets/index-WclMPci1.css +0 -1
- package/ui/dist/assets/index-Z4-RtZcs.js +0 -1
- package/ui/dist/assets/layers-DFeLExSa.js +0 -1
- package/ui/dist/assets/markdown-renderer-Croje6Xe.js +0 -36
- package/ui/dist/assets/popover-JXecfWG5.js +0 -1
- package/ui/dist/assets/progress-C1ghf1Fu.js +0 -1
- package/ui/dist/assets/select-MADP8m6Q.js +0 -1
- package/ui/dist/assets/server-CPMaysH8.js +0 -1
- package/ui/dist/assets/sheet-r6NSOxi-.js +0 -1
- package/ui/dist/assets/skeleton-C9oEzNlU.js +0 -1
- package/ui/dist/assets/switch-tNs0n-kz.js +0 -1
- package/ui/dist/assets/table-CXxtLicg.js +0 -1
- package/ui/dist/assets/textarea-BjiEeIWh.js +0 -1
- package/ui/dist/assets/tooltip-ZMwtfr1J.js +0 -1
package/dist/chat/auto-reply.js
DELETED
|
@@ -1,272 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Auto-Reply System
|
|
3
|
-
*
|
|
4
|
-
* Template-based automatic responses for chat messages.
|
|
5
|
-
* Supports:
|
|
6
|
-
* - Out-of-office / away mode
|
|
7
|
-
* - Busy/DND mode with queue position
|
|
8
|
-
* - Keyword-triggered quick replies
|
|
9
|
-
* - Rate-limited to prevent spam
|
|
10
|
-
* - Per-channel configuration
|
|
11
|
-
*/
|
|
12
|
-
import { logger } from '../utils/logger.js';
|
|
13
|
-
// --- State ---
|
|
14
|
-
const DEFAULT_CONFIG = {
|
|
15
|
-
enabled: false,
|
|
16
|
-
templates: [],
|
|
17
|
-
globalCooldownMs: 30_000, // 30 seconds between replies to same user
|
|
18
|
-
maxRepliesPerHour: 10,
|
|
19
|
-
};
|
|
20
|
-
let config = { ...DEFAULT_CONFIG };
|
|
21
|
-
// Track last reply time per user to enforce cooldowns
|
|
22
|
-
const lastReplyMap = new Map();
|
|
23
|
-
// --- Core Functions ---
|
|
24
|
-
/**
|
|
25
|
-
* Load auto-reply configuration
|
|
26
|
-
*/
|
|
27
|
-
export function configureAutoReply(newConfig) {
|
|
28
|
-
config = { ...config, ...newConfig };
|
|
29
|
-
if (newConfig.templates) {
|
|
30
|
-
// Sort by priority descending
|
|
31
|
-
config.templates.sort((a, b) => b.priority - a.priority);
|
|
32
|
-
}
|
|
33
|
-
logger.info('[AutoReply] Configuration updated', {
|
|
34
|
-
enabled: config.enabled,
|
|
35
|
-
templates: config.templates.length,
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
/**
|
|
39
|
-
* Get current auto-reply configuration
|
|
40
|
-
*/
|
|
41
|
-
export function getAutoReplyConfig() {
|
|
42
|
-
return { ...config };
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Check if a message should trigger an auto-reply
|
|
46
|
-
*/
|
|
47
|
-
export function checkAutoReply(message, userId, channelId) {
|
|
48
|
-
if (!config.enabled || config.templates.length === 0) {
|
|
49
|
-
return { shouldReply: false, reason: 'disabled' };
|
|
50
|
-
}
|
|
51
|
-
// Check global cooldown
|
|
52
|
-
const userState = lastReplyMap.get(userId);
|
|
53
|
-
const now = Date.now();
|
|
54
|
-
if (userState) {
|
|
55
|
-
// Reset hourly counter if hour has passed
|
|
56
|
-
if (now - userState.hourStart > 3_600_000) {
|
|
57
|
-
userState.count = 0;
|
|
58
|
-
userState.hourStart = now;
|
|
59
|
-
}
|
|
60
|
-
// Check cooldown
|
|
61
|
-
if (now - userState.time < config.globalCooldownMs) {
|
|
62
|
-
return { shouldReply: false, reason: 'cooldown' };
|
|
63
|
-
}
|
|
64
|
-
// Check rate limit
|
|
65
|
-
if (userState.count >= config.maxRepliesPerHour) {
|
|
66
|
-
return { shouldReply: false, reason: 'rate_limited' };
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
// Find matching template (sorted by priority)
|
|
70
|
-
for (const template of config.templates) {
|
|
71
|
-
if (!template.enabled)
|
|
72
|
-
continue;
|
|
73
|
-
// Check channel filter
|
|
74
|
-
if (template.channels && template.channels.length > 0 && channelId) {
|
|
75
|
-
if (!template.channels.includes(channelId))
|
|
76
|
-
continue;
|
|
77
|
-
}
|
|
78
|
-
// Check per-template cooldown
|
|
79
|
-
const templateKey = `${userId}:${template.id}`;
|
|
80
|
-
const templateState = lastReplyMap.get(templateKey);
|
|
81
|
-
if (templateState && now - templateState.time < template.cooldownMs) {
|
|
82
|
-
continue;
|
|
83
|
-
}
|
|
84
|
-
// Check trigger
|
|
85
|
-
if (matchesTrigger(template.trigger, message)) {
|
|
86
|
-
// Update global user state
|
|
87
|
-
const existing = lastReplyMap.get(userId);
|
|
88
|
-
const updatedState = existing
|
|
89
|
-
? { ...existing, time: now, count: existing.count + 1 }
|
|
90
|
-
: { time: now, count: 1, hourStart: now };
|
|
91
|
-
lastReplyMap.set(userId, updatedState);
|
|
92
|
-
// Update per-template state
|
|
93
|
-
lastReplyMap.set(templateKey, { time: now, count: 1, hourStart: now });
|
|
94
|
-
// Render message with variables
|
|
95
|
-
const rendered = renderTemplate(template.message, {
|
|
96
|
-
...template.variables,
|
|
97
|
-
user: userId,
|
|
98
|
-
channel: channelId ?? 'unknown',
|
|
99
|
-
time: new Date().toLocaleTimeString(),
|
|
100
|
-
date: new Date().toLocaleDateString(),
|
|
101
|
-
});
|
|
102
|
-
logger.debug('[AutoReply] Triggered', { templateId: template.id, userId, channelId });
|
|
103
|
-
return {
|
|
104
|
-
shouldReply: true,
|
|
105
|
-
templateId: template.id,
|
|
106
|
-
message: rendered,
|
|
107
|
-
};
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
return { shouldReply: false, reason: 'no_match' };
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Check if a trigger matches the message
|
|
114
|
-
*/
|
|
115
|
-
function matchesTrigger(trigger, message) {
|
|
116
|
-
switch (trigger.type) {
|
|
117
|
-
case 'always':
|
|
118
|
-
return true;
|
|
119
|
-
case 'keyword': {
|
|
120
|
-
const lower = message.toLowerCase();
|
|
121
|
-
return trigger.keywords.some(kw => lower.includes(kw.toLowerCase()));
|
|
122
|
-
}
|
|
123
|
-
case 'regex': {
|
|
124
|
-
try {
|
|
125
|
-
const re = new RegExp(trigger.pattern, 'i');
|
|
126
|
-
return re.test(message);
|
|
127
|
-
}
|
|
128
|
-
catch {
|
|
129
|
-
return false;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
case 'no_agent':
|
|
133
|
-
// This is checked externally - always matches when the trigger is selected
|
|
134
|
-
return true;
|
|
135
|
-
case 'after_hours':
|
|
136
|
-
return isAfterHours(trigger.schedule);
|
|
137
|
-
default:
|
|
138
|
-
return false;
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
/**
|
|
142
|
-
* Check if current time is outside business hours
|
|
143
|
-
*/
|
|
144
|
-
function isAfterHours(schedule) {
|
|
145
|
-
try {
|
|
146
|
-
const now = new Date();
|
|
147
|
-
// Use Intl to get time in the specified timezone
|
|
148
|
-
const formatter = new Intl.DateTimeFormat('en-US', {
|
|
149
|
-
timeZone: schedule.timezone,
|
|
150
|
-
hour: 'numeric',
|
|
151
|
-
minute: 'numeric',
|
|
152
|
-
hour12: false,
|
|
153
|
-
weekday: 'short',
|
|
154
|
-
});
|
|
155
|
-
const parts = formatter.formatToParts(now);
|
|
156
|
-
const hour = Number(parts.find(p => p.type === 'hour')?.value ?? 0);
|
|
157
|
-
const weekday = parts.find(p => p.type === 'weekday')?.value ?? '';
|
|
158
|
-
// Map weekday names to numbers
|
|
159
|
-
const dayMap = {
|
|
160
|
-
Sun: 0, Mon: 1, Tue: 2, Wed: 3, Thu: 4, Fri: 5, Sat: 6,
|
|
161
|
-
};
|
|
162
|
-
const dayNum = dayMap[weekday] ?? -1;
|
|
163
|
-
// Check if today is a business day
|
|
164
|
-
if (!schedule.days.includes(dayNum))
|
|
165
|
-
return true;
|
|
166
|
-
// Check if current hour is outside business hours
|
|
167
|
-
return hour < schedule.hours.start || hour >= schedule.hours.end;
|
|
168
|
-
}
|
|
169
|
-
catch {
|
|
170
|
-
return false;
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
/**
|
|
174
|
-
* Render template variables: {{variable}} -> value
|
|
175
|
-
*/
|
|
176
|
-
function renderTemplate(template, vars) {
|
|
177
|
-
return template.replace(/\{\{(\w+)\}\}/g, (_match, key) => {
|
|
178
|
-
return vars[key] ?? `{{${key}}}`;
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
/**
|
|
182
|
-
* Add or replace a template by ID
|
|
183
|
-
*/
|
|
184
|
-
export function addTemplate(template) {
|
|
185
|
-
// Remove existing with same ID
|
|
186
|
-
config.templates = config.templates.filter(t => t.id !== template.id);
|
|
187
|
-
config.templates.push(template);
|
|
188
|
-
config.templates.sort((a, b) => b.priority - a.priority);
|
|
189
|
-
}
|
|
190
|
-
/**
|
|
191
|
-
* Remove a template by ID
|
|
192
|
-
*/
|
|
193
|
-
export function removeTemplate(id) {
|
|
194
|
-
const before = config.templates.length;
|
|
195
|
-
config.templates = config.templates.filter(t => t.id !== id);
|
|
196
|
-
return config.templates.length < before;
|
|
197
|
-
}
|
|
198
|
-
/**
|
|
199
|
-
* Get built-in template presets
|
|
200
|
-
*/
|
|
201
|
-
export function getTemplatePresets() {
|
|
202
|
-
return [
|
|
203
|
-
{
|
|
204
|
-
id: 'away',
|
|
205
|
-
name: 'Away / Out of Office',
|
|
206
|
-
trigger: { type: 'always' },
|
|
207
|
-
message: "I'm currently away and will respond when I return. For urgent matters, please contact the team directly.",
|
|
208
|
-
enabled: false,
|
|
209
|
-
cooldownMs: 300_000, // 5 min
|
|
210
|
-
maxPerHour: 5,
|
|
211
|
-
priority: 100,
|
|
212
|
-
},
|
|
213
|
-
{
|
|
214
|
-
id: 'after-hours',
|
|
215
|
-
name: 'After Hours',
|
|
216
|
-
trigger: {
|
|
217
|
-
type: 'after_hours',
|
|
218
|
-
schedule: {
|
|
219
|
-
timezone: 'America/New_York',
|
|
220
|
-
hours: { start: 9, end: 17 },
|
|
221
|
-
days: [1, 2, 3, 4, 5], // Mon-Fri
|
|
222
|
-
},
|
|
223
|
-
},
|
|
224
|
-
message: "Thanks for your message! I'm currently outside business hours (Mon-Fri 9AM-5PM ET). I'll respond during the next business day.",
|
|
225
|
-
enabled: false,
|
|
226
|
-
cooldownMs: 600_000, // 10 min
|
|
227
|
-
maxPerHour: 3,
|
|
228
|
-
priority: 90,
|
|
229
|
-
},
|
|
230
|
-
{
|
|
231
|
-
id: 'help',
|
|
232
|
-
name: 'Help / FAQ',
|
|
233
|
-
trigger: { type: 'keyword', keywords: ['help', 'faq', 'how to', 'getting started'] },
|
|
234
|
-
message: "Need help? Here are some commands:\n- `/help` - Show all commands\n- `/status` - System status\n- `/skills` - Available skills\n\nOr just ask me anything!",
|
|
235
|
-
enabled: false,
|
|
236
|
-
cooldownMs: 60_000,
|
|
237
|
-
maxPerHour: 10,
|
|
238
|
-
priority: 50,
|
|
239
|
-
},
|
|
240
|
-
{
|
|
241
|
-
id: 'no-agent',
|
|
242
|
-
name: 'No Agent Available',
|
|
243
|
-
trigger: { type: 'no_agent' },
|
|
244
|
-
message: "All agents are currently busy. Your message has been queued and will be processed shortly. Current wait time: approximately {{waitTime}}.",
|
|
245
|
-
enabled: false,
|
|
246
|
-
cooldownMs: 120_000,
|
|
247
|
-
maxPerHour: 5,
|
|
248
|
-
priority: 80,
|
|
249
|
-
variables: { waitTime: '1-2 minutes' },
|
|
250
|
-
},
|
|
251
|
-
];
|
|
252
|
-
}
|
|
253
|
-
/**
|
|
254
|
-
* Cleanup stale tracking entries (call periodically)
|
|
255
|
-
*/
|
|
256
|
-
export function cleanupAutoReplyState() {
|
|
257
|
-
const now = Date.now();
|
|
258
|
-
const staleThreshold = 3_600_000; // 1 hour
|
|
259
|
-
for (const [key, state] of lastReplyMap) {
|
|
260
|
-
if (now - state.time > staleThreshold) {
|
|
261
|
-
lastReplyMap.delete(key);
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
/**
|
|
266
|
-
* Reset all state (for testing)
|
|
267
|
-
*/
|
|
268
|
-
export function resetAutoReply() {
|
|
269
|
-
config = { ...DEFAULT_CONFIG };
|
|
270
|
-
lastReplyMap.clear();
|
|
271
|
-
}
|
|
272
|
-
//# sourceMappingURL=auto-reply.js.map
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* PTY (Pseudo-Terminal) Support
|
|
3
|
-
*
|
|
4
|
-
* Provides interactive terminal support for commands that require TTY.
|
|
5
|
-
* Uses node-pty for cross-platform PTY handling.
|
|
6
|
-
*
|
|
7
|
-
* Use cases:
|
|
8
|
-
* - Interactive installers (npm init, create-react-app)
|
|
9
|
-
* - Text editors (vim, nano)
|
|
10
|
-
* - Pagers (less, more)
|
|
11
|
-
* - Password prompts
|
|
12
|
-
* - SSH sessions
|
|
13
|
-
*/
|
|
14
|
-
import { EventEmitter } from 'events';
|
|
15
|
-
export interface PTYSession {
|
|
16
|
-
id: string;
|
|
17
|
-
pid: number;
|
|
18
|
-
command: string;
|
|
19
|
-
cols: number;
|
|
20
|
-
rows: number;
|
|
21
|
-
status: 'running' | 'exited';
|
|
22
|
-
exitCode?: number;
|
|
23
|
-
output: string;
|
|
24
|
-
createdAt: Date;
|
|
25
|
-
exitedAt?: Date;
|
|
26
|
-
}
|
|
27
|
-
export interface PTYOptions {
|
|
28
|
-
cols?: number;
|
|
29
|
-
rows?: number;
|
|
30
|
-
cwd?: string;
|
|
31
|
-
env?: Record<string, string>;
|
|
32
|
-
timeout?: number;
|
|
33
|
-
maxOutputChars?: number;
|
|
34
|
-
}
|
|
35
|
-
export interface PTYResult {
|
|
36
|
-
success: boolean;
|
|
37
|
-
exitCode: number;
|
|
38
|
-
output: string;
|
|
39
|
-
durationMs: number;
|
|
40
|
-
truncated: boolean;
|
|
41
|
-
secretsRedacted: boolean;
|
|
42
|
-
}
|
|
43
|
-
export declare class PTYManager extends EventEmitter {
|
|
44
|
-
private sessions;
|
|
45
|
-
private sessionCounter;
|
|
46
|
-
/**
|
|
47
|
-
* Spawn a new PTY session
|
|
48
|
-
*/
|
|
49
|
-
spawn(command: string, args?: string[], options?: PTYOptions): PTYSession;
|
|
50
|
-
/**
|
|
51
|
-
* Execute a command and wait for completion
|
|
52
|
-
*/
|
|
53
|
-
execute(command: string, args?: string[], options?: PTYOptions): Promise<PTYResult>;
|
|
54
|
-
/**
|
|
55
|
-
* Write input to PTY
|
|
56
|
-
*/
|
|
57
|
-
write(sessionId: string, data: string): boolean;
|
|
58
|
-
/**
|
|
59
|
-
* Resize PTY dimensions
|
|
60
|
-
*/
|
|
61
|
-
resize(sessionId: string, cols: number, rows: number): boolean;
|
|
62
|
-
/**
|
|
63
|
-
* Kill a PTY session
|
|
64
|
-
*/
|
|
65
|
-
kill(sessionId: string, signal?: string): boolean;
|
|
66
|
-
/**
|
|
67
|
-
* Get session info
|
|
68
|
-
*/
|
|
69
|
-
getSession(sessionId: string): PTYSession | null;
|
|
70
|
-
/**
|
|
71
|
-
* Get all active sessions
|
|
72
|
-
*/
|
|
73
|
-
getActiveSessions(): PTYSession[];
|
|
74
|
-
/**
|
|
75
|
-
* Subscribe to session output
|
|
76
|
-
*/
|
|
77
|
-
subscribe(sessionId: string, listener: (data: string) => void): () => void;
|
|
78
|
-
/**
|
|
79
|
-
* Clean up completed session
|
|
80
|
-
*/
|
|
81
|
-
cleanup(sessionId: string): void;
|
|
82
|
-
/**
|
|
83
|
-
* Clean up all sessions
|
|
84
|
-
*/
|
|
85
|
-
cleanupAll(): void;
|
|
86
|
-
}
|
|
87
|
-
export declare function getPTYManager(): PTYManager;
|
|
88
|
-
/**
|
|
89
|
-
* Check if a command likely requires PTY
|
|
90
|
-
*/
|
|
91
|
-
export declare function commandNeedsPTY(command: string): boolean;
|
|
92
|
-
//# sourceMappingURL=pty.d.ts.map
|
|
@@ -1,285 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* PTY (Pseudo-Terminal) Support
|
|
3
|
-
*
|
|
4
|
-
* Provides interactive terminal support for commands that require TTY.
|
|
5
|
-
* Uses node-pty for cross-platform PTY handling.
|
|
6
|
-
*
|
|
7
|
-
* Use cases:
|
|
8
|
-
* - Interactive installers (npm init, create-react-app)
|
|
9
|
-
* - Text editors (vim, nano)
|
|
10
|
-
* - Pagers (less, more)
|
|
11
|
-
* - Password prompts
|
|
12
|
-
* - SSH sessions
|
|
13
|
-
*/
|
|
14
|
-
import * as pty from 'node-pty';
|
|
15
|
-
import { EventEmitter } from 'events';
|
|
16
|
-
import { logger } from '../../utils/logger.js';
|
|
17
|
-
import { redactSecrets, isSecretsDetectionEnabled } from './secrets.js';
|
|
18
|
-
// =============================================================================
|
|
19
|
-
// Constants
|
|
20
|
-
// =============================================================================
|
|
21
|
-
const DEFAULT_COLS = 80;
|
|
22
|
-
const DEFAULT_ROWS = 24;
|
|
23
|
-
const DEFAULT_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes
|
|
24
|
-
const DEFAULT_MAX_OUTPUT = 200_000;
|
|
25
|
-
// =============================================================================
|
|
26
|
-
// PTY Manager
|
|
27
|
-
// =============================================================================
|
|
28
|
-
export class PTYManager extends EventEmitter {
|
|
29
|
-
sessions = new Map();
|
|
30
|
-
sessionCounter = 0;
|
|
31
|
-
/**
|
|
32
|
-
* Spawn a new PTY session
|
|
33
|
-
*/
|
|
34
|
-
spawn(command, args = [], options = {}) {
|
|
35
|
-
const id = `pty_${Date.now()}_${++this.sessionCounter}`;
|
|
36
|
-
const cols = options.cols ?? DEFAULT_COLS;
|
|
37
|
-
const rows = options.rows ?? DEFAULT_ROWS;
|
|
38
|
-
// Determine shell
|
|
39
|
-
const shell = process.platform === 'win32'
|
|
40
|
-
? process.env.ComSpec || 'cmd.exe'
|
|
41
|
-
: process.env.SHELL || '/bin/bash';
|
|
42
|
-
// Build args
|
|
43
|
-
const shellArgs = process.platform === 'win32'
|
|
44
|
-
? ['/c', command, ...args]
|
|
45
|
-
: ['-c', `${command} ${args.join(' ')}`];
|
|
46
|
-
logger.debug(`[PTY] Spawning: ${command}`, { id, cols, rows });
|
|
47
|
-
// Spawn PTY
|
|
48
|
-
const ptyProcess = pty.spawn(shell, shellArgs, {
|
|
49
|
-
name: 'xterm-256color',
|
|
50
|
-
cols,
|
|
51
|
-
rows,
|
|
52
|
-
cwd: options.cwd ?? process.cwd(),
|
|
53
|
-
env: {
|
|
54
|
-
...process.env,
|
|
55
|
-
...options.env,
|
|
56
|
-
TERM: 'xterm-256color',
|
|
57
|
-
COLORTERM: 'truecolor',
|
|
58
|
-
},
|
|
59
|
-
});
|
|
60
|
-
const session = {
|
|
61
|
-
id,
|
|
62
|
-
pid: ptyProcess.pid,
|
|
63
|
-
command,
|
|
64
|
-
cols,
|
|
65
|
-
rows,
|
|
66
|
-
status: 'running',
|
|
67
|
-
output: '',
|
|
68
|
-
createdAt: new Date(),
|
|
69
|
-
};
|
|
70
|
-
const entry = {
|
|
71
|
-
pty: ptyProcess,
|
|
72
|
-
session,
|
|
73
|
-
outputBuffer: '',
|
|
74
|
-
listeners: new Set(),
|
|
75
|
-
};
|
|
76
|
-
this.sessions.set(id, entry);
|
|
77
|
-
// Handle data
|
|
78
|
-
ptyProcess.onData((data) => {
|
|
79
|
-
entry.outputBuffer += data;
|
|
80
|
-
session.output = entry.outputBuffer;
|
|
81
|
-
// Truncate if needed
|
|
82
|
-
const maxChars = options.maxOutputChars ?? DEFAULT_MAX_OUTPUT;
|
|
83
|
-
if (entry.outputBuffer.length > maxChars) {
|
|
84
|
-
entry.outputBuffer = `[...truncated...]\n${entry.outputBuffer.slice(-maxChars)}`;
|
|
85
|
-
session.output = entry.outputBuffer;
|
|
86
|
-
}
|
|
87
|
-
// Notify listeners
|
|
88
|
-
for (const listener of entry.listeners) {
|
|
89
|
-
listener(data);
|
|
90
|
-
}
|
|
91
|
-
this.emit('data', id, data);
|
|
92
|
-
});
|
|
93
|
-
// Handle exit
|
|
94
|
-
ptyProcess.onExit(({ exitCode }) => {
|
|
95
|
-
session.status = 'exited';
|
|
96
|
-
session.exitCode = exitCode;
|
|
97
|
-
session.exitedAt = new Date();
|
|
98
|
-
logger.debug(`[PTY] Exited: ${id}`, { exitCode });
|
|
99
|
-
this.emit('exit', id, exitCode);
|
|
100
|
-
});
|
|
101
|
-
return session;
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* Execute a command and wait for completion
|
|
105
|
-
*/
|
|
106
|
-
async execute(command, args = [], options = {}) {
|
|
107
|
-
const startTime = Date.now();
|
|
108
|
-
const timeout = options.timeout ?? DEFAULT_TIMEOUT_MS;
|
|
109
|
-
const maxOutput = options.maxOutputChars ?? DEFAULT_MAX_OUTPUT;
|
|
110
|
-
const session = this.spawn(command, args, options);
|
|
111
|
-
const entry = this.sessions.get(session.id);
|
|
112
|
-
if (!entry) {
|
|
113
|
-
throw new Error('Failed to create PTY session');
|
|
114
|
-
}
|
|
115
|
-
return new Promise((resolve) => {
|
|
116
|
-
let timedOut = false;
|
|
117
|
-
// Timeout handler
|
|
118
|
-
const timeoutId = setTimeout(() => {
|
|
119
|
-
timedOut = true;
|
|
120
|
-
this.kill(session.id);
|
|
121
|
-
}, timeout);
|
|
122
|
-
// Wait for exit
|
|
123
|
-
const exitHandler = (id, exitCode) => {
|
|
124
|
-
if (id !== session.id)
|
|
125
|
-
return;
|
|
126
|
-
clearTimeout(timeoutId);
|
|
127
|
-
this.off('exit', exitHandler);
|
|
128
|
-
const durationMs = Date.now() - startTime;
|
|
129
|
-
let output = entry.outputBuffer;
|
|
130
|
-
let secretsRedacted = false;
|
|
131
|
-
// Redact secrets if enabled
|
|
132
|
-
if (isSecretsDetectionEnabled()) {
|
|
133
|
-
output = redactSecrets(output);
|
|
134
|
-
secretsRedacted = output !== entry.outputBuffer;
|
|
135
|
-
}
|
|
136
|
-
// Clean up session after a delay
|
|
137
|
-
setTimeout(() => this.cleanup(session.id), 5000);
|
|
138
|
-
resolve({
|
|
139
|
-
success: !timedOut && exitCode === 0,
|
|
140
|
-
exitCode: timedOut ? -1 : exitCode,
|
|
141
|
-
output: output.trim() || '(no output)',
|
|
142
|
-
durationMs,
|
|
143
|
-
truncated: entry.outputBuffer.length >= maxOutput,
|
|
144
|
-
secretsRedacted,
|
|
145
|
-
});
|
|
146
|
-
};
|
|
147
|
-
this.on('exit', exitHandler);
|
|
148
|
-
});
|
|
149
|
-
}
|
|
150
|
-
/**
|
|
151
|
-
* Write input to PTY
|
|
152
|
-
*/
|
|
153
|
-
write(sessionId, data) {
|
|
154
|
-
const entry = this.sessions.get(sessionId);
|
|
155
|
-
if (!entry || entry.session.status !== 'running') {
|
|
156
|
-
return false;
|
|
157
|
-
}
|
|
158
|
-
entry.pty.write(data);
|
|
159
|
-
return true;
|
|
160
|
-
}
|
|
161
|
-
/**
|
|
162
|
-
* Resize PTY dimensions
|
|
163
|
-
*/
|
|
164
|
-
resize(sessionId, cols, rows) {
|
|
165
|
-
const entry = this.sessions.get(sessionId);
|
|
166
|
-
if (!entry || entry.session.status !== 'running') {
|
|
167
|
-
return false;
|
|
168
|
-
}
|
|
169
|
-
entry.pty.resize(cols, rows);
|
|
170
|
-
entry.session.cols = cols;
|
|
171
|
-
entry.session.rows = rows;
|
|
172
|
-
return true;
|
|
173
|
-
}
|
|
174
|
-
/**
|
|
175
|
-
* Kill a PTY session
|
|
176
|
-
*/
|
|
177
|
-
kill(sessionId, signal = 'SIGTERM') {
|
|
178
|
-
const entry = this.sessions.get(sessionId);
|
|
179
|
-
if (!entry || entry.session.status !== 'running') {
|
|
180
|
-
return false;
|
|
181
|
-
}
|
|
182
|
-
try {
|
|
183
|
-
entry.pty.kill(signal);
|
|
184
|
-
return true;
|
|
185
|
-
}
|
|
186
|
-
catch (error) {
|
|
187
|
-
logger.warn(`[PTY] Failed to kill session ${sessionId}`, { error });
|
|
188
|
-
return false;
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
/**
|
|
192
|
-
* Get session info
|
|
193
|
-
*/
|
|
194
|
-
getSession(sessionId) {
|
|
195
|
-
return this.sessions.get(sessionId)?.session ?? null;
|
|
196
|
-
}
|
|
197
|
-
/**
|
|
198
|
-
* Get all active sessions
|
|
199
|
-
*/
|
|
200
|
-
getActiveSessions() {
|
|
201
|
-
return Array.from(this.sessions.values())
|
|
202
|
-
.filter((e) => e.session.status === 'running')
|
|
203
|
-
.map((e) => e.session);
|
|
204
|
-
}
|
|
205
|
-
/**
|
|
206
|
-
* Subscribe to session output
|
|
207
|
-
*/
|
|
208
|
-
subscribe(sessionId, listener) {
|
|
209
|
-
const entry = this.sessions.get(sessionId);
|
|
210
|
-
if (!entry) {
|
|
211
|
-
return () => { };
|
|
212
|
-
}
|
|
213
|
-
entry.listeners.add(listener);
|
|
214
|
-
return () => entry.listeners.delete(listener);
|
|
215
|
-
}
|
|
216
|
-
/**
|
|
217
|
-
* Clean up completed session
|
|
218
|
-
*/
|
|
219
|
-
cleanup(sessionId) {
|
|
220
|
-
const entry = this.sessions.get(sessionId);
|
|
221
|
-
if (entry) {
|
|
222
|
-
if (entry.session.status === 'running') {
|
|
223
|
-
this.kill(sessionId);
|
|
224
|
-
}
|
|
225
|
-
entry.listeners.clear();
|
|
226
|
-
this.sessions.delete(sessionId);
|
|
227
|
-
logger.debug(`[PTY] Cleaned up session: ${sessionId}`);
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
/**
|
|
231
|
-
* Clean up all sessions
|
|
232
|
-
*/
|
|
233
|
-
cleanupAll() {
|
|
234
|
-
for (const sessionId of this.sessions.keys()) {
|
|
235
|
-
this.cleanup(sessionId);
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
// =============================================================================
|
|
240
|
-
// Singleton Instance
|
|
241
|
-
// =============================================================================
|
|
242
|
-
let _ptyManager = null;
|
|
243
|
-
export function getPTYManager() {
|
|
244
|
-
if (!_ptyManager) {
|
|
245
|
-
_ptyManager = new PTYManager();
|
|
246
|
-
}
|
|
247
|
-
return _ptyManager;
|
|
248
|
-
}
|
|
249
|
-
// =============================================================================
|
|
250
|
-
// Helper: Check if command needs PTY
|
|
251
|
-
// =============================================================================
|
|
252
|
-
const PTY_REQUIRED_COMMANDS = new Set([
|
|
253
|
-
'vim', 'vi', 'nvim', 'nano', 'emacs',
|
|
254
|
-
'less', 'more', 'man',
|
|
255
|
-
'top', 'htop', 'btop',
|
|
256
|
-
'ssh', 'telnet',
|
|
257
|
-
'ftp', 'sftp',
|
|
258
|
-
'mysql', 'psql', 'mongo', 'redis-cli',
|
|
259
|
-
'python', 'python3', 'node', 'irb', 'rails',
|
|
260
|
-
'bash', 'zsh', 'sh', 'fish',
|
|
261
|
-
]);
|
|
262
|
-
const PTY_HINT_PATTERNS = [
|
|
263
|
-
/npm\s+init/i,
|
|
264
|
-
/yarn\s+init/i,
|
|
265
|
-
/npx\s+create-/i,
|
|
266
|
-
/\bpassword\b/i,
|
|
267
|
-
/\bsudo\b/,
|
|
268
|
-
/--interactive/i,
|
|
269
|
-
/-i\b/,
|
|
270
|
-
];
|
|
271
|
-
/**
|
|
272
|
-
* Check if a command likely requires PTY
|
|
273
|
-
*/
|
|
274
|
-
export function commandNeedsPTY(command) {
|
|
275
|
-
// Extract base command
|
|
276
|
-
const parts = command.trim().split(/\s+/);
|
|
277
|
-
const baseCmd = parts[0]?.split('/').pop() ?? '';
|
|
278
|
-
// Check known PTY-required commands
|
|
279
|
-
if (PTY_REQUIRED_COMMANDS.has(baseCmd)) {
|
|
280
|
-
return true;
|
|
281
|
-
}
|
|
282
|
-
// Check hint patterns
|
|
283
|
-
return PTY_HINT_PATTERNS.some((p) => p.test(command));
|
|
284
|
-
}
|
|
285
|
-
//# sourceMappingURL=pty.js.map
|