profclaw 2.0.0 → 2.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +14 -2
- package/CHANGELOG.md +37 -0
- package/CONTRIBUTING.md +20 -0
- package/Dockerfile +39 -23
- package/README.md +174 -40
- package/dist/agents/agent-summary.d.ts +44 -0
- package/dist/agents/agent-summary.js +176 -0
- package/dist/agents/auto-memory.d.ts +59 -0
- package/dist/agents/auto-memory.js +310 -0
- package/dist/agents/checkpoint-manager.d.ts +76 -0
- package/dist/agents/checkpoint-manager.js +156 -0
- package/dist/agents/circuit-breaker.d.ts +54 -0
- package/dist/agents/circuit-breaker.js +153 -0
- package/dist/agents/context-compactor.d.ts +70 -0
- package/dist/agents/context-compactor.js +361 -0
- package/dist/agents/conversation-branch.d.ts +55 -0
- package/dist/agents/conversation-branch.js +115 -0
- package/dist/agents/error-recovery.d.ts +44 -0
- package/dist/agents/error-recovery.js +197 -0
- package/dist/agents/events.d.ts +76 -0
- package/dist/agents/events.js +8 -0
- package/dist/agents/executor.d.ts +35 -1
- package/dist/agents/executor.js +573 -124
- package/dist/agents/file-snapshots.d.ts +72 -0
- package/dist/agents/file-snapshots.js +182 -0
- package/dist/agents/index.d.ts +2 -0
- package/dist/agents/orchestrator.d.ts +183 -0
- package/dist/agents/orchestrator.js +495 -0
- package/dist/agents/permissions.d.ts +63 -0
- package/dist/agents/permissions.js +138 -0
- package/dist/agents/plan-mode.d.ts +71 -0
- package/dist/agents/plan-mode.js +186 -0
- package/dist/agents/prompt-suggestions.d.ts +33 -0
- package/dist/agents/prompt-suggestions.js +208 -0
- package/dist/agents/rate-limit-monitor.d.ts +56 -0
- package/dist/agents/rate-limit-monitor.js +224 -0
- package/dist/agents/result-store.d.ts +37 -0
- package/dist/agents/result-store.js +104 -0
- package/dist/agents/session-diff.d.ts +43 -0
- package/dist/agents/session-diff.js +258 -0
- package/dist/agents/tool-loader.d.ts +65 -0
- package/dist/agents/tool-loader.js +273 -0
- package/dist/agents/transcript.d.ts +96 -0
- package/dist/agents/transcript.js +267 -0
- package/dist/agents/worktree-manager.d.ts +80 -0
- package/dist/agents/worktree-manager.js +203 -0
- package/dist/auth/middleware.js +14 -0
- package/dist/chat/agentic-executor.d.ts +7 -0
- package/dist/chat/agentic-executor.js +253 -30
- package/dist/chat/conversations.d.ts +2 -0
- package/dist/chat/conversations.js +8 -0
- package/dist/chat/execution/executor.d.ts +8 -0
- package/dist/chat/execution/executor.js +157 -103
- package/dist/chat/execution/index.js +5 -1
- package/dist/chat/execution/tool-router.js +40 -14
- package/dist/chat/execution/tools/canvas.d.ts +2 -2
- package/dist/chat/execution/tools/code-tools.d.ts +66 -0
- package/dist/chat/execution/tools/code-tools.js +353 -0
- package/dist/chat/execution/tools/complete-task.d.ts +2 -2
- package/dist/chat/execution/tools/cron-tool.d.ts +26 -10
- package/dist/chat/execution/tools/cron-tool.js +48 -3
- package/dist/chat/execution/tools/decompose-task.d.ts +58 -0
- package/dist/chat/execution/tools/decompose-task.js +166 -0
- package/dist/chat/execution/tools/exec.d.ts +5 -2
- package/dist/chat/execution/tools/exec.js +294 -155
- package/dist/chat/execution/tools/feed-tools.d.ts +77 -0
- package/dist/chat/execution/tools/feed-tools.js +142 -0
- package/dist/chat/execution/tools/file-ops.d.ts +1 -1
- package/dist/chat/execution/tools/github.d.ts +2 -2
- package/dist/chat/execution/tools/index.d.ts +14 -2
- package/dist/chat/execution/tools/index.js +86 -12
- package/dist/chat/execution/tools/integrations.d.ts +8 -8
- package/dist/chat/execution/tools/multi-patch.d.ts +53 -0
- package/dist/chat/execution/tools/multi-patch.js +373 -0
- package/dist/chat/execution/tools/openai-image-gen.d.ts +2 -2
- package/dist/chat/execution/tools/plan-tools.d.ts +80 -0
- package/dist/chat/execution/tools/plan-tools.js +134 -0
- package/dist/chat/execution/tools/profclaw-ops.d.ts +6 -6
- package/dist/chat/execution/tools/repl-tool.d.ts +46 -0
- package/dist/chat/execution/tools/repl-tool.js +207 -0
- package/dist/chat/execution/tools/sessions-send.d.ts +2 -2
- package/dist/chat/execution/tools/slack-actions.d.ts +2 -2
- package/dist/chat/execution/tools/system.d.ts +4 -4
- package/dist/chat/execution/tools/todo-tool.d.ts +72 -0
- package/dist/chat/execution/tools/todo-tool.js +152 -0
- package/dist/chat/execution/tools/tool-search.d.ts +50 -0
- package/dist/chat/execution/tools/tool-search.js +155 -0
- package/dist/chat/execution/types.d.ts +21 -14
- package/dist/chat/execution/workflows/executor.d.ts +11 -0
- package/dist/chat/execution/workflows/executor.js +99 -1
- package/dist/chat/execution/workflows/types.d.ts +35 -2
- package/dist/chat/format/index.d.ts +1 -0
- package/dist/chat/format/index.js +1 -0
- package/dist/chat/format/markdown-convert.d.ts +23 -0
- package/dist/chat/format/markdown-convert.js +149 -0
- package/dist/chat/index.d.ts +1 -1
- package/dist/chat/index.js +1 -1
- package/dist/chat/message-handler.js +58 -6
- package/dist/chat/proactive/index.d.ts +62 -0
- package/dist/chat/proactive/index.js +147 -0
- package/dist/chat/prompt-adapter.js +2 -0
- package/dist/chat/providers/irc/index.d.ts +2 -2
- package/dist/chat/providers/telegram/index.d.ts +2 -0
- package/dist/chat/providers/telegram/index.js +21 -2
- package/dist/chat/system-prompts.d.ts +3 -3
- package/dist/chat/system-prompts.js +116 -61
- package/dist/chat/tools.d.ts +6 -6
- package/dist/cli/commands/auth.js +64 -1
- package/dist/cli/commands/chat.js +1327 -138
- package/dist/cli/commands/doctor.js +222 -16
- package/dist/cli/commands/history.d.ts +3 -0
- package/dist/cli/commands/history.js +138 -0
- package/dist/cli/commands/import.d.ts +44 -0
- package/dist/cli/commands/import.js +526 -0
- package/dist/cli/commands/init.d.ts +13 -0
- package/dist/cli/commands/init.js +381 -0
- package/dist/cli/commands/onboard.js +210 -30
- package/dist/cli/commands/plan.d.ts +13 -0
- package/dist/cli/commands/plan.js +184 -0
- package/dist/cli/commands/serve.d.ts +7 -0
- package/dist/cli/commands/serve.js +77 -18
- package/dist/cli/commands/setup.js +84 -3
- package/dist/cli/commands/status.js +54 -0
- package/dist/cli/commands/tools.js +13 -13
- package/dist/cli/commands/tui.js +26 -1
- package/dist/cli/index.js +19 -0
- package/dist/cli/ink/App.d.ts +13 -0
- package/dist/cli/ink/App.js +6 -0
- package/dist/cli/ink/ChatApp.d.ts +60 -0
- package/dist/cli/ink/ChatApp.js +325 -0
- package/dist/cli/ink/DashboardApp.d.ts +3 -0
- package/dist/cli/ink/DashboardApp.js +143 -0
- package/dist/cli/ink/components/AgentStatus.d.ts +17 -0
- package/dist/cli/ink/components/AgentStatus.js +33 -0
- package/dist/cli/ink/components/ChannelList.d.ts +17 -0
- package/dist/cli/ink/components/ChannelList.js +33 -0
- package/dist/cli/ink/components/ConnectionStatus.d.ts +19 -0
- package/dist/cli/ink/components/ConnectionStatus.js +50 -0
- package/dist/cli/ink/components/CostBar.d.ts +19 -0
- package/dist/cli/ink/components/CostBar.js +35 -0
- package/dist/cli/ink/components/HookStatus.d.ts +15 -0
- package/dist/cli/ink/components/HookStatus.js +7 -0
- package/dist/cli/ink/components/PermissionPrompt.d.ts +21 -0
- package/dist/cli/ink/components/PermissionPrompt.js +51 -0
- package/dist/cli/ink/components/PlanView.d.ts +23 -0
- package/dist/cli/ink/components/PlanView.js +26 -0
- package/dist/cli/ink/components/ProviderList.d.ts +16 -0
- package/dist/cli/ink/components/ProviderList.js +16 -0
- package/dist/cli/ink/components/SessionHeader.d.ts +15 -0
- package/dist/cli/ink/components/SessionHeader.js +15 -0
- package/dist/cli/ink/components/StreamingMessage.d.ts +20 -0
- package/dist/cli/ink/components/StreamingMessage.js +27 -0
- package/dist/cli/ink/components/SuggestionBar.d.ts +15 -0
- package/dist/cli/ink/components/SuggestionBar.js +28 -0
- package/dist/cli/ink/components/SystemHealth.d.ts +20 -0
- package/dist/cli/ink/components/SystemHealth.js +39 -0
- package/dist/cli/ink/components/TaskList.d.ts +17 -0
- package/dist/cli/ink/components/TaskList.js +59 -0
- package/dist/cli/ink/components/ToolCall.d.ts +17 -0
- package/dist/cli/ink/components/ToolCall.js +43 -0
- package/dist/cli/ink/index.d.ts +23 -0
- package/dist/cli/ink/index.js +15 -0
- package/dist/cli/ink/keybindings.d.ts +35 -0
- package/dist/cli/ink/keybindings.js +105 -0
- package/dist/cli/ink/markdown-renderer.d.ts +47 -0
- package/dist/cli/ink/markdown-renderer.js +380 -0
- package/dist/cli/ink/output-styles.d.ts +39 -0
- package/dist/cli/ink/output-styles.js +119 -0
- package/dist/cli/interactive/auto-serve.d.ts +38 -0
- package/dist/cli/interactive/auto-serve.js +209 -0
- package/dist/cli/interactive/index.d.ts +25 -0
- package/dist/cli/interactive/index.js +23 -0
- package/dist/cli/interactive/picker.d.ts +28 -0
- package/dist/cli/interactive/picker.js +153 -0
- package/dist/cli/interactive/renderer.d.ts +26 -0
- package/dist/cli/interactive/renderer.js +555 -0
- package/dist/cli/interactive/repl.d.ts +14 -0
- package/dist/cli/interactive/repl.js +1516 -0
- package/dist/cli/interactive/stream-client.d.ts +59 -0
- package/dist/cli/interactive/stream-client.js +506 -0
- package/dist/cli/interactive/types.d.ts +121 -0
- package/dist/cli/interactive/types.js +10 -0
- package/dist/cli/utils/api.d.ts +9 -0
- package/dist/cli/utils/api.js +58 -2
- package/dist/cron/natural-language.d.ts +54 -0
- package/dist/cron/natural-language.js +569 -0
- package/dist/cron/scheduler.d.ts +34 -4
- package/dist/cron/scheduler.js +141 -9
- package/dist/cron/templates.d.ts +1 -1
- package/dist/cron/templates.js +219 -0
- package/dist/feeds/feed-engine.d.ts +149 -0
- package/dist/feeds/feed-engine.js +600 -0
- package/dist/feeds/index.d.ts +9 -0
- package/dist/feeds/index.js +8 -0
- package/dist/gateway/router.js +6 -1
- package/dist/hooks/built-in/audit-log.d.ts +11 -0
- package/dist/hooks/built-in/audit-log.js +84 -0
- package/dist/hooks/built-in/cost-warning.d.ts +10 -0
- package/dist/hooks/built-in/cost-warning.js +59 -0
- package/dist/hooks/built-in/dangerous-tool.d.ts +32 -0
- package/dist/hooks/built-in/dangerous-tool.js +80 -0
- package/dist/hooks/built-in/index.d.ts +14 -0
- package/dist/hooks/built-in/index.js +20 -0
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/index.js +6 -0
- package/dist/hooks/loader.d.ts +17 -0
- package/dist/hooks/loader.js +142 -0
- package/dist/hooks/registry.d.ts +62 -0
- package/dist/hooks/registry.js +127 -0
- package/dist/integrations/web-search.js +6 -3
- package/dist/memory/index.d.ts +1 -0
- package/dist/memory/index.js +2 -0
- package/dist/memory/memory-service.js +14 -13
- package/dist/memory/observational.d.ts +62 -0
- package/dist/memory/observational.js +396 -0
- package/dist/middleware/content-filter.d.ts +22 -0
- package/dist/middleware/content-filter.js +69 -0
- package/dist/middleware/request-validator.d.ts +159 -0
- package/dist/middleware/request-validator.js +93 -0
- package/dist/plugins/sdk.d.ts +22 -0
- package/dist/plugins/sdk.js +17 -1
- package/dist/projects/types.d.ts +10 -10
- package/dist/providers/ai-sdk.d.ts +11 -0
- package/dist/providers/ai-sdk.js +78 -19
- package/dist/providers/core/models.js +67 -1
- package/dist/providers/core/types.d.ts +3 -0
- package/dist/providers/index.d.ts +1 -0
- package/dist/providers/index.js +1 -0
- package/dist/providers/smart-router.d.ts +118 -0
- package/dist/providers/smart-router.js +685 -0
- package/dist/providers/types.d.ts +16 -16
- package/dist/routes/agents.js +50 -0
- package/dist/routes/auth.js +8 -1
- package/dist/routes/chat.js +259 -14
- package/dist/routes/costs.js +32 -0
- package/dist/routes/cron.js +80 -5
- package/dist/routes/feeds.d.ts +10 -0
- package/dist/routes/feeds.js +168 -0
- package/dist/routes/mcp.js +21 -0
- package/dist/routes/memory.js +130 -0
- package/dist/routes/skills.js +129 -0
- package/dist/routes/teams.d.ts +9 -0
- package/dist/routes/teams.js +210 -0
- package/dist/routes/tools.js +14 -0
- package/dist/routes/users.js +2 -0
- package/dist/server/route-loader.js +3 -1
- package/dist/server/stream-bridge.d.ts +19 -0
- package/dist/server/stream-bridge.js +38 -0
- package/dist/server.js +310 -36
- package/dist/skills/marketplace.d.ts +87 -0
- package/dist/skills/marketplace.js +268 -0
- package/dist/storage/index.d.ts +14 -0
- package/dist/storage/index.js +64 -3
- package/dist/storage/schema.d.ts +4 -4
- package/dist/storage/schema.js +1 -1
- package/dist/teams/index.d.ts +110 -0
- package/dist/teams/index.js +365 -0
- package/dist/tickets/types.d.ts +39 -39
- package/dist/types/summary.d.ts +5 -5
- package/dist/utils/auto-update.d.ts +23 -0
- package/dist/utils/auto-update.js +157 -0
- package/dist/utils/offline-detect.d.ts +55 -0
- package/dist/utils/offline-detect.js +121 -0
- package/dist/utils/pid-file.d.ts +36 -0
- package/dist/utils/pid-file.js +125 -0
- package/dist/utils/prevent-sleep.d.ts +27 -0
- package/dist/utils/prevent-sleep.js +95 -0
- package/dist/utils/sanitizer.d.ts +57 -0
- package/dist/utils/sanitizer.js +174 -0
- package/docker-compose.yml +13 -137
- package/package.json +31 -6
- package/skills/deploy-cloudflare/SKILL.md +62 -0
- package/skills/deploy-vercel/SKILL.md +67 -0
- package/skills/docker-deploy/SKILL.md +158 -0
- package/skills/full-stack-builder/SKILL.md +92 -0
- package/skills/humanizer/SKILL.md +488 -0
- package/skills/profclaw-assistant/SKILL.md +85 -56
- package/ui/dist/assets/ActivityView-Da6HQ8ws.js +1 -0
- package/ui/dist/assets/AgentList-H58R0kX3.js +1 -0
- package/ui/dist/assets/AnalyticsDashboard-B28AeRsc.js +1 -0
- package/ui/dist/assets/AreaChart-DwLzeAQ8.js +1 -0
- package/ui/dist/assets/CartesianChart-piKQsTAR.js +36 -0
- package/ui/dist/assets/ChatView-Dbj8rxU5.js +10 -0
- package/ui/dist/assets/CostsDashboard-C6F5df0F.js +1 -0
- package/ui/dist/assets/EstimateSelect-wga0rUKX.js +1 -0
- package/ui/dist/assets/FeedDashboard-Ef6FEzEf.js +1 -0
- package/ui/dist/assets/FloatingChatbot-0yhkUeCq.js +2 -0
- package/ui/dist/assets/InviteCodeManagement-tUXfx4Bc.js +2 -0
- package/ui/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/ui/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/ui/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/ui/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/ui/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/ui/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/ui/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/ui/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/ui/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/ui/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/ui/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/ui/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/ui/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/ui/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/ui/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/ui/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/ui/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/ui/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/ui/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/ui/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/ui/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/ui/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/ui/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/ui/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/ui/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/ui/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/ui/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/ui/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/ui/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/ui/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/ui/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/ui/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/ui/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/ui/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/ui/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/ui/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/ui/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/ui/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/ui/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/ui/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/ui/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/ui/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/ui/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/ui/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/ui/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/ui/dist/assets/MarketplacePage-DGrLtolR.js +1 -0
- package/ui/dist/assets/{ProjectDetail--gPfvATB.js → ProjectDetail-BgWvA6UP.js} +2 -2
- package/ui/dist/assets/ProjectIcon-TDuliqwg.js +1 -0
- package/ui/dist/assets/ProjectList-DXgM4187.js +1 -0
- package/ui/dist/assets/{Settings-1kaf7VHE.js → Settings-xA8Zhi3p.js} +3 -3
- package/ui/dist/assets/StatusIndicator-B8vfFAxg.js +1 -0
- package/ui/dist/assets/{SummaryDetail-DV3AmONk.js → SummaryDetail-eedRfTtF.js} +2 -2
- package/ui/dist/assets/SummaryList-CLNX2P84.js +1 -0
- package/ui/dist/assets/TaskDetail-BtWclNiR.js +1 -0
- package/ui/dist/assets/TaskList-JjODAgSc.js +1 -0
- package/ui/dist/assets/TeamsPage-CBK5iAyx.js +1 -0
- package/ui/dist/assets/TicketBoard-C9aJNNYp.js +1 -0
- package/ui/dist/assets/TicketDetail-CV5JmL31.js +1 -0
- package/ui/dist/assets/TicketList-68V4lzUz.js +1 -0
- package/ui/dist/assets/UserManagement-DKTb6UpE.js +2 -0
- package/ui/dist/assets/ViewSwitcher-BvdQht2Y.js +1 -0
- package/ui/dist/assets/alert-dialog-O6qBOv_f.js +1 -0
- package/ui/dist/assets/{archive-BsLa7brF.js → archive-CX7UvZpf.js} +1 -1
- package/ui/dist/assets/badge-BbfnwDJP.js +1 -0
- package/ui/dist/assets/{bug-CmZI7jqM.js → bug-3WX0394-.js} +1 -1
- package/ui/dist/assets/{calendar-Bf0t2B82.js → calendar-buq77TaS.js} +1 -1
- package/ui/dist/assets/{chevron-up-CoUsOvZj.js → chevron-up-4ymsBJRo.js} +1 -1
- package/ui/dist/assets/{circle-x-Dgw11LgT.js → circle-x-ByXtwR6Y.js} +1 -1
- package/ui/dist/assets/constants-CVdDh7p0.js +1 -0
- package/ui/dist/assets/{cpu-DiPMQICV.js → cpu-CiuoCeDY.js} +1 -1
- package/ui/dist/assets/{database-BwTfupDi.js → database-BWXSBg5a.js} +1 -1
- package/ui/dist/assets/dialog-lDg4NvMV.js +1 -0
- package/ui/dist/assets/dollar-sign-Dmijd6DP.js +1 -0
- package/ui/dist/assets/{ellipsis-UJx4Xnf6.js → ellipsis-vT-5SVIp.js} +1 -1
- package/ui/dist/assets/{ellipsis-vertical-DoULYEKn.js → ellipsis-vertical-B4tAX_bL.js} +1 -1
- package/ui/dist/assets/feature-markdown-DBo5Q7uq.js +289 -0
- package/ui/dist/assets/{file-code-B2UrJLwi.js → file-code-ChOWdKXf.js} +1 -1
- package/ui/dist/assets/{folder-open-BJi577JH.js → folder-open-CkOUbIiP.js} +1 -1
- package/ui/dist/assets/{funnel-PkaD_HSR.js → funnel-uZkoSPP-.js} +1 -1
- package/ui/dist/assets/{git-branch-C_K30am0.js → git-branch-CwvUxj7C.js} +1 -1
- package/ui/dist/assets/{git-commit-horizontal-IT6ecxWQ.js → git-commit-horizontal-lxPzCvhD.js} +1 -1
- package/ui/dist/assets/{globe-f-jjCa_g.js → globe-D_WpJdsj.js} +1 -1
- package/ui/dist/assets/{hash-DNEv8Elo.js → hash-CA0hJ7vh.js} +1 -1
- package/ui/dist/assets/{history-BQSBo_1Q.js → history-CEWMLELs.js} +1 -1
- package/ui/dist/assets/inbox-ehtOptTV.js +1 -0
- package/ui/dist/assets/{index-nS3EErDg.js → index-C1rhbml4.js} +3 -3
- package/ui/dist/assets/index-CR8gfCHv.js +1 -0
- package/ui/dist/assets/index-DVXMpWai.js +1 -0
- package/ui/dist/assets/index-DaDJMM2v.js +1 -0
- package/ui/dist/assets/index-Djdq_0xu.js +1 -0
- package/ui/dist/assets/index-M46Gcb8K.css +1 -0
- package/ui/dist/assets/index-sEBN7w8J.js +109 -0
- package/ui/dist/assets/layers-C6Mhf8Nk.js +1 -0
- package/ui/dist/assets/{layout-dashboard-CcKt1hXw.js → layout-dashboard-BRUM0kpT.js} +1 -1
- package/ui/dist/assets/{lightbulb-Jhp7FvbU.js → lightbulb-CN2q1O5l.js} +1 -1
- package/ui/dist/assets/{link-2-DdO7ostF.js → link-2-CC4E28yJ.js} +1 -1
- package/ui/dist/assets/markdown-renderer-C6ENbB0u.js +10 -0
- package/ui/dist/assets/markdown-renderer-CfVKi3_s.css +1 -0
- package/ui/dist/assets/{message-square-CBgH65X7.js → message-square-Bbb241am.js} +1 -1
- package/ui/dist/assets/package-CwT3IzFx.js +1 -0
- package/ui/dist/assets/{pencil-CYXCEPQh.js → pencil-CDmiHzoj.js} +1 -1
- package/ui/dist/assets/{play-d1ONaH0-.js → play-tjy5jMQX.js} +1 -1
- package/ui/dist/assets/popover-CFHZf3pE.js +1 -0
- package/ui/dist/assets/progress-BboUHuLf.js +1 -0
- package/ui/dist/assets/{rocket-DhvUetsk.js → rocket--8ZHgdXJ.js} +1 -1
- package/ui/dist/assets/select-n108rXny.js +1 -0
- package/ui/dist/assets/{send-P0r5D7td.js → send-Cu7MR2Qh.js} +1 -1
- package/ui/dist/assets/server-DmodxZp-.js +1 -0
- package/ui/dist/assets/{settings-2-ocj5uHGx.js → settings-2-CkRNqkxj.js} +1 -1
- package/ui/dist/assets/sheet-7aUJkyzU.js +1 -0
- package/ui/dist/assets/{shield-check-DfVdE34l.js → shield-check-ViI3nMKE.js} +1 -1
- package/ui/dist/assets/{shield-off-8l0J6R-8.js → shield-off-DN3tagkn.js} +1 -1
- package/ui/dist/assets/skeleton-C0E1Nfro.js +1 -0
- package/ui/dist/assets/{smartphone-77_g3SQn.js → smartphone-5FghiXpA.js} +1 -1
- package/ui/dist/assets/{square-Ckzsr3Rn.js → square-DiNSx8K7.js} +1 -1
- package/ui/dist/assets/star-DhdFVidS.js +1 -0
- package/ui/dist/assets/switch-CIgVbZqQ.js +1 -0
- package/ui/dist/assets/table-BC56FVMV.js +1 -0
- package/ui/dist/assets/{tag-C35mgoEv.js → tag-CH_vQliw.js} +1 -1
- package/ui/dist/assets/textarea-CxDiKFXZ.js +1 -0
- package/ui/dist/assets/{timer-DHJBS2w1.js → timer-CdGVTb60.js} +1 -1
- package/ui/dist/assets/tooltip-BuW9A5UO.js +1 -0
- package/ui/dist/assets/{trash-2-keO5tKPE.js → trash-2-CucZJL0N.js} +1 -1
- package/ui/dist/assets/trending-down-BCezC1z2.js +1 -0
- package/ui/dist/assets/{trending-up-BBv8KbrY.js → trending-up-C5OYX2k2.js} +1 -1
- package/ui/dist/assets/vendor-query-C0p7b53x.js +4 -0
- package/ui/dist/assets/vendor-react-Mc5_kfYG.js +12 -0
- package/ui/dist/assets/vendor-ui-CXPAUBFv.js +51 -0
- package/ui/dist/assets/{wand-sparkles-BusQ52ZK.js → wand-sparkles-BaH6pJnc.js} +1 -1
- package/ui/dist/assets/{wrench-02YaOSiK.js → wrench-CjxjP6ok.js} +1 -1
- package/ui/dist/index.html +5 -2
- package/ui/dist/assets/ActivityView-BeshZXmE.js +0 -1
- package/ui/dist/assets/AgentList-QVHeldPi.js +0 -1
- package/ui/dist/assets/AnalyticsDashboard-C9R97dXE.js +0 -1
- package/ui/dist/assets/AreaChart-B73gaiVQ.js +0 -1
- package/ui/dist/assets/CartesianChart-CXYL2R-A.js +0 -36
- package/ui/dist/assets/ChatView-qjZErlrp.js +0 -10
- package/ui/dist/assets/CostsDashboard-O4DCLy1i.js +0 -1
- package/ui/dist/assets/EstimateSelect-1hQf4Osk.js +0 -1
- package/ui/dist/assets/FloatingChatbot-BZBzrJxd.js +0 -2
- package/ui/dist/assets/InviteCodeManagement-LEoGqYeA.js +0 -2
- package/ui/dist/assets/ProjectIcon-Chd_ofsw.js +0 -1
- package/ui/dist/assets/ProjectList-BvUfVB6c.js +0 -4
- package/ui/dist/assets/StatusIndicator-pRfkNcdV.js +0 -1
- package/ui/dist/assets/SummaryList-B6kXiTxL.js +0 -1
- package/ui/dist/assets/TaskDetail-CV6CzbOS.js +0 -1
- package/ui/dist/assets/TaskList-DL7brQKd.js +0 -1
- package/ui/dist/assets/TicketBoard-CrkkFj7C.js +0 -1
- package/ui/dist/assets/TicketDetail-hnnYclpD.js +0 -1
- package/ui/dist/assets/TicketList-CsDAyQCL.js +0 -1
- package/ui/dist/assets/UserManagement-BGFQyTSr.js +0 -2
- package/ui/dist/assets/ViewSwitcher-CnL0OqA8.js +0 -1
- package/ui/dist/assets/alert-dialog-SKM6Gjz4.js +0 -7
- package/ui/dist/assets/badge-CVHH1a-v.js +0 -1
- package/ui/dist/assets/brain-6o_RHVpe.js +0 -1
- package/ui/dist/assets/constants-Q5Zivl-a.js +0 -1
- package/ui/dist/assets/dialog-BUqN9Psj.js +0 -1
- package/ui/dist/assets/index-BUmnwPQr.js +0 -1
- package/ui/dist/assets/index-BfF5G4Cw.js +0 -1
- package/ui/dist/assets/index-C8N375c2.js +0 -1
- package/ui/dist/assets/index-CuxnqVVz.css +0 -1
- package/ui/dist/assets/index-CzMM3QOk.js +0 -1
- package/ui/dist/assets/index-lJlNPFVJ.js +0 -67
- package/ui/dist/assets/layers-jFqVrWMD.js +0 -1
- package/ui/dist/assets/markdown-renderer-n1ToC4XQ.js +0 -36
- package/ui/dist/assets/popover-CrmZgoWu.js +0 -1
- package/ui/dist/assets/progress-uv4SPkL5.js +0 -1
- package/ui/dist/assets/select-CeQ8AHGy.js +0 -1
- package/ui/dist/assets/server-CVHTZB72.js +0 -1
- package/ui/dist/assets/sheet-DuQExSho.js +0 -1
- package/ui/dist/assets/skeleton-TFiFJ3nB.js +0 -1
- package/ui/dist/assets/switch-CAePkd6k.js +0 -1
- package/ui/dist/assets/table-ZjAZ7hkt.js +0 -1
- package/ui/dist/assets/textarea-DsVPnSgR.js +0 -1
- package/ui/dist/assets/tooltip-BYmQ331W.js +0 -1
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Loader
|
|
3
|
+
*
|
|
4
|
+
* Manages tool categorization and lazy loading for the agentic system.
|
|
5
|
+
* Provides search over tool categories so the AI can discover and enable
|
|
6
|
+
* tools on demand without paying the full context cost of all schemas.
|
|
7
|
+
*/
|
|
8
|
+
import type { ToolDefinition } from '../chat/execution/types.js';
|
|
9
|
+
export interface ToolCategory {
|
|
10
|
+
/** Unique slug for this category (e.g. "file_ops") */
|
|
11
|
+
name: string;
|
|
12
|
+
/** Human-readable description shown to users and the AI */
|
|
13
|
+
description: string;
|
|
14
|
+
/** Keywords used for fuzzy search / auto-load decisions */
|
|
15
|
+
keywords: string[];
|
|
16
|
+
/** Canonical tool names that belong to this category */
|
|
17
|
+
tools: string[];
|
|
18
|
+
/** When true, these tools are always included in every session */
|
|
19
|
+
alwaysLoaded: boolean;
|
|
20
|
+
}
|
|
21
|
+
export declare class ToolLoader {
|
|
22
|
+
private allTools;
|
|
23
|
+
private categories;
|
|
24
|
+
private loadedToolNames;
|
|
25
|
+
constructor(allTools: Map<string, ToolDefinition>);
|
|
26
|
+
/**
|
|
27
|
+
* Return the subset of tools that are always loaded (core session tools).
|
|
28
|
+
*/
|
|
29
|
+
getCoreTools(): ToolDefinition[];
|
|
30
|
+
/**
|
|
31
|
+
* Return all tools that have been loaded for the current session,
|
|
32
|
+
* including always_loaded plus any dynamically loaded categories/tools.
|
|
33
|
+
*/
|
|
34
|
+
getSessionTools(): ToolDefinition[];
|
|
35
|
+
/**
|
|
36
|
+
* Search categories by query string.
|
|
37
|
+
* Matches against category name, description, and keywords using
|
|
38
|
+
* case-insensitive substring matching; results are ranked by score.
|
|
39
|
+
*/
|
|
40
|
+
search(query: string): ToolCategory[];
|
|
41
|
+
/**
|
|
42
|
+
* Load all tools belonging to a named category into the active session.
|
|
43
|
+
* Silently ignores tool names that are not registered.
|
|
44
|
+
*/
|
|
45
|
+
loadCategory(categoryName: string): void;
|
|
46
|
+
/**
|
|
47
|
+
* Load a single tool by name into the active session.
|
|
48
|
+
* Silently ignores names that are not registered.
|
|
49
|
+
*/
|
|
50
|
+
loadTool(toolName: string): void;
|
|
51
|
+
/**
|
|
52
|
+
* Return all registered categories.
|
|
53
|
+
*/
|
|
54
|
+
getCategories(): ToolCategory[];
|
|
55
|
+
/**
|
|
56
|
+
* Register a custom category.
|
|
57
|
+
* Will overwrite any existing category with the same name.
|
|
58
|
+
*/
|
|
59
|
+
registerCategory(category: ToolCategory): void;
|
|
60
|
+
/**
|
|
61
|
+
* Check whether a specific tool is currently loaded into the session.
|
|
62
|
+
*/
|
|
63
|
+
isLoaded(toolName: string): boolean;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=tool-loader.d.ts.map
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Loader
|
|
3
|
+
*
|
|
4
|
+
* Manages tool categorization and lazy loading for the agentic system.
|
|
5
|
+
* Provides search over tool categories so the AI can discover and enable
|
|
6
|
+
* tools on demand without paying the full context cost of all schemas.
|
|
7
|
+
*/
|
|
8
|
+
// Built-in Category Definitions
|
|
9
|
+
const BUILT_IN_CATEGORIES = [
|
|
10
|
+
{
|
|
11
|
+
name: 'always_loaded',
|
|
12
|
+
description: 'Core tools that are always available in every session',
|
|
13
|
+
keywords: ['core', 'always', 'base', 'default', 'essential'],
|
|
14
|
+
tools: [
|
|
15
|
+
'read_file',
|
|
16
|
+
'write_file',
|
|
17
|
+
'search_files',
|
|
18
|
+
'exec',
|
|
19
|
+
'git_status',
|
|
20
|
+
'git_commit',
|
|
21
|
+
'complete_task',
|
|
22
|
+
'search_available_tools',
|
|
23
|
+
],
|
|
24
|
+
alwaysLoaded: true,
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
name: 'file_ops',
|
|
28
|
+
description: 'Extended file system operations: edit, grep, patch, directory tree',
|
|
29
|
+
keywords: ['file', 'filesystem', 'read', 'write', 'edit', 'grep', 'search', 'patch', 'directory'],
|
|
30
|
+
tools: [
|
|
31
|
+
'read_file',
|
|
32
|
+
'write_file',
|
|
33
|
+
'search_files',
|
|
34
|
+
'grep',
|
|
35
|
+
'edit_file',
|
|
36
|
+
'directory_tree',
|
|
37
|
+
'patch_apply',
|
|
38
|
+
'multi_patch',
|
|
39
|
+
],
|
|
40
|
+
alwaysLoaded: false,
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
name: 'browser',
|
|
44
|
+
description: 'Browser automation tools for web scraping and UI testing',
|
|
45
|
+
keywords: ['browser', 'playwright', 'navigate', 'click', 'screenshot', 'web', 'automation', 'scrape'],
|
|
46
|
+
tools: [
|
|
47
|
+
'browser_navigate',
|
|
48
|
+
'browser_click',
|
|
49
|
+
'browser_fill',
|
|
50
|
+
'browser_screenshot',
|
|
51
|
+
'browser_evaluate',
|
|
52
|
+
],
|
|
53
|
+
alwaysLoaded: false,
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
name: 'integration',
|
|
57
|
+
description: 'Third-party integration tools: Slack, Discord, Telegram, screen capture, clipboard',
|
|
58
|
+
keywords: ['slack', 'discord', 'telegram', 'notification', 'clipboard', 'screen', 'capture', 'integration'],
|
|
59
|
+
tools: [
|
|
60
|
+
'slack_actions',
|
|
61
|
+
'discord_actions',
|
|
62
|
+
'telegram_actions',
|
|
63
|
+
'screen_capture',
|
|
64
|
+
'clipboard_read',
|
|
65
|
+
'clipboard_write',
|
|
66
|
+
'notify',
|
|
67
|
+
],
|
|
68
|
+
alwaysLoaded: false,
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
name: 'git_advanced',
|
|
72
|
+
description: 'Advanced Git operations beyond status and commit',
|
|
73
|
+
keywords: ['git', 'diff', 'log', 'branch', 'stash', 'remote', 'merge', 'rebase', 'version control'],
|
|
74
|
+
tools: [
|
|
75
|
+
'git_status',
|
|
76
|
+
'git_diff',
|
|
77
|
+
'git_log',
|
|
78
|
+
'git_commit',
|
|
79
|
+
'git_branch',
|
|
80
|
+
'git_stash',
|
|
81
|
+
'git_remote',
|
|
82
|
+
],
|
|
83
|
+
alwaysLoaded: false,
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
name: 'canvas',
|
|
87
|
+
description: 'Canvas rendering and image generation tools',
|
|
88
|
+
keywords: ['canvas', 'image', 'render', 'draw', 'generate', 'visual', 'graphic'],
|
|
89
|
+
tools: [
|
|
90
|
+
'canvas_render',
|
|
91
|
+
'openai_image_gen',
|
|
92
|
+
'image_analyze',
|
|
93
|
+
],
|
|
94
|
+
alwaysLoaded: false,
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
name: 'voice',
|
|
98
|
+
description: 'Text-to-speech and voice synthesis tools',
|
|
99
|
+
keywords: ['voice', 'tts', 'speech', 'audio', 'speak', 'synthesize'],
|
|
100
|
+
tools: [
|
|
101
|
+
'tts_speak',
|
|
102
|
+
],
|
|
103
|
+
alwaysLoaded: false,
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
name: 'memory',
|
|
107
|
+
description: 'Conversation memory management: search, retrieval, and statistics',
|
|
108
|
+
keywords: ['memory', 'remember', 'recall', 'search', 'context', 'history', 'retrieve'],
|
|
109
|
+
tools: [
|
|
110
|
+
'memory_search',
|
|
111
|
+
'memory_get',
|
|
112
|
+
'memory_stats',
|
|
113
|
+
],
|
|
114
|
+
alwaysLoaded: false,
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
name: 'system',
|
|
118
|
+
description: 'System information, environment variables, and process management',
|
|
119
|
+
keywords: ['system', 'env', 'environment', 'process', 'info', 'hardware', 'os', 'which', 'path'],
|
|
120
|
+
tools: [
|
|
121
|
+
'env',
|
|
122
|
+
'system_info',
|
|
123
|
+
'process_list',
|
|
124
|
+
'path_info',
|
|
125
|
+
'which',
|
|
126
|
+
],
|
|
127
|
+
alwaysLoaded: false,
|
|
128
|
+
},
|
|
129
|
+
];
|
|
130
|
+
// Tool Loader
|
|
131
|
+
export class ToolLoader {
|
|
132
|
+
allTools;
|
|
133
|
+
categories;
|
|
134
|
+
loadedToolNames;
|
|
135
|
+
constructor(allTools) {
|
|
136
|
+
this.allTools = allTools;
|
|
137
|
+
this.categories = new Map();
|
|
138
|
+
this.loadedToolNames = new Set();
|
|
139
|
+
// Register built-in categories
|
|
140
|
+
for (const category of BUILT_IN_CATEGORIES) {
|
|
141
|
+
this.categories.set(category.name, category);
|
|
142
|
+
}
|
|
143
|
+
// Pre-load always_loaded tools
|
|
144
|
+
const alwaysLoaded = this.categories.get('always_loaded');
|
|
145
|
+
if (alwaysLoaded) {
|
|
146
|
+
for (const toolName of alwaysLoaded.tools) {
|
|
147
|
+
if (this.allTools.has(toolName)) {
|
|
148
|
+
this.loadedToolNames.add(toolName);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Return the subset of tools that are always loaded (core session tools).
|
|
155
|
+
*/
|
|
156
|
+
getCoreTools() {
|
|
157
|
+
const core = this.categories.get('always_loaded');
|
|
158
|
+
if (!core)
|
|
159
|
+
return [];
|
|
160
|
+
return core.tools
|
|
161
|
+
.map((name) => this.allTools.get(name))
|
|
162
|
+
.filter((tool) => tool !== undefined);
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Return all tools that have been loaded for the current session,
|
|
166
|
+
* including always_loaded plus any dynamically loaded categories/tools.
|
|
167
|
+
*/
|
|
168
|
+
getSessionTools() {
|
|
169
|
+
return Array.from(this.loadedToolNames)
|
|
170
|
+
.map((name) => this.allTools.get(name))
|
|
171
|
+
.filter((tool) => tool !== undefined);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Search categories by query string.
|
|
175
|
+
* Matches against category name, description, and keywords using
|
|
176
|
+
* case-insensitive substring matching; results are ranked by score.
|
|
177
|
+
*/
|
|
178
|
+
search(query) {
|
|
179
|
+
if (!query.trim()) {
|
|
180
|
+
return Array.from(this.categories.values());
|
|
181
|
+
}
|
|
182
|
+
const terms = query
|
|
183
|
+
.toLowerCase()
|
|
184
|
+
.split(/\s+/)
|
|
185
|
+
.filter((t) => t.length > 0);
|
|
186
|
+
const scored = [];
|
|
187
|
+
for (const category of this.categories.values()) {
|
|
188
|
+
let score = 0;
|
|
189
|
+
for (const term of terms) {
|
|
190
|
+
// Exact name match gets highest weight
|
|
191
|
+
if (category.name === term) {
|
|
192
|
+
score += 10;
|
|
193
|
+
}
|
|
194
|
+
else if (category.name.includes(term)) {
|
|
195
|
+
score += 5;
|
|
196
|
+
}
|
|
197
|
+
// Description match
|
|
198
|
+
if (category.description.toLowerCase().includes(term)) {
|
|
199
|
+
score += 3;
|
|
200
|
+
}
|
|
201
|
+
// Keyword match
|
|
202
|
+
for (const keyword of category.keywords) {
|
|
203
|
+
if (keyword === term) {
|
|
204
|
+
score += 4;
|
|
205
|
+
}
|
|
206
|
+
else if (keyword.includes(term)) {
|
|
207
|
+
score += 2;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
// Tool name match
|
|
211
|
+
for (const toolName of category.tools) {
|
|
212
|
+
if (toolName.includes(term)) {
|
|
213
|
+
score += 1;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
if (score > 0) {
|
|
218
|
+
scored.push({ category, score });
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return scored
|
|
222
|
+
.sort((a, b) => b.score - a.score)
|
|
223
|
+
.map((s) => s.category);
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Load all tools belonging to a named category into the active session.
|
|
227
|
+
* Silently ignores tool names that are not registered.
|
|
228
|
+
*/
|
|
229
|
+
loadCategory(categoryName) {
|
|
230
|
+
const category = this.categories.get(categoryName);
|
|
231
|
+
if (!category) {
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
for (const toolName of category.tools) {
|
|
235
|
+
if (this.allTools.has(toolName)) {
|
|
236
|
+
this.loadedToolNames.add(toolName);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Load a single tool by name into the active session.
|
|
242
|
+
* Silently ignores names that are not registered.
|
|
243
|
+
*/
|
|
244
|
+
loadTool(toolName) {
|
|
245
|
+
if (this.allTools.has(toolName)) {
|
|
246
|
+
this.loadedToolNames.add(toolName);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Return all registered categories.
|
|
251
|
+
*/
|
|
252
|
+
getCategories() {
|
|
253
|
+
return Array.from(this.categories.values());
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Register a custom category.
|
|
257
|
+
* Will overwrite any existing category with the same name.
|
|
258
|
+
*/
|
|
259
|
+
registerCategory(category) {
|
|
260
|
+
this.categories.set(category.name, category);
|
|
261
|
+
// If the new category is marked always_loaded, immediately load its tools
|
|
262
|
+
if (category.alwaysLoaded) {
|
|
263
|
+
this.loadCategory(category.name);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Check whether a specific tool is currently loaded into the session.
|
|
268
|
+
*/
|
|
269
|
+
isLoaded(toolName) {
|
|
270
|
+
return this.loadedToolNames.has(toolName);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
//# sourceMappingURL=tool-loader.js.map
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transcript Persistence
|
|
3
|
+
*
|
|
4
|
+
* Saves all conversations to JSONL files for searchable history and session resumption.
|
|
5
|
+
* Files are stored at .profclaw/transcripts/{sessionId}.jsonl
|
|
6
|
+
* Index is stored at .profclaw/transcripts/index.json
|
|
7
|
+
*/
|
|
8
|
+
import * as os from 'os';
|
|
9
|
+
export interface TranscriptEntry {
|
|
10
|
+
timestamp: number;
|
|
11
|
+
sessionId: string;
|
|
12
|
+
type: 'user' | 'assistant' | 'tool_call' | 'tool_result' | 'system' | 'error';
|
|
13
|
+
content: string;
|
|
14
|
+
metadata?: {
|
|
15
|
+
toolName?: string;
|
|
16
|
+
toolCallId?: string;
|
|
17
|
+
model?: string;
|
|
18
|
+
tokensUsed?: number;
|
|
19
|
+
duration?: number;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
export interface SessionMeta {
|
|
23
|
+
sessionId: string;
|
|
24
|
+
title: string;
|
|
25
|
+
startedAt: number;
|
|
26
|
+
lastActivityAt: number;
|
|
27
|
+
messageCount: number;
|
|
28
|
+
tokensUsed: number;
|
|
29
|
+
model?: string;
|
|
30
|
+
}
|
|
31
|
+
export declare class TranscriptStore {
|
|
32
|
+
private transcriptsDir;
|
|
33
|
+
private sessionsIndex;
|
|
34
|
+
private indexDirty;
|
|
35
|
+
private indexTimer;
|
|
36
|
+
constructor(projectRoot?: string);
|
|
37
|
+
/**
|
|
38
|
+
* Append a single entry to the session's JSONL file.
|
|
39
|
+
*/
|
|
40
|
+
append(entry: TranscriptEntry): void;
|
|
41
|
+
/**
|
|
42
|
+
* Read all entries for a session from its JSONL file.
|
|
43
|
+
*/
|
|
44
|
+
getSession(sessionId: string): TranscriptEntry[];
|
|
45
|
+
/**
|
|
46
|
+
* List sessions sorted by lastActivityAt descending.
|
|
47
|
+
*/
|
|
48
|
+
listSessions(options?: {
|
|
49
|
+
limit?: number;
|
|
50
|
+
offset?: number;
|
|
51
|
+
}): SessionMeta[];
|
|
52
|
+
/**
|
|
53
|
+
* Full-text search across transcript entries.
|
|
54
|
+
* Returns matching entries with their session ID and line number.
|
|
55
|
+
*/
|
|
56
|
+
search(query: string, options?: {
|
|
57
|
+
sessionId?: string;
|
|
58
|
+
limit?: number;
|
|
59
|
+
}): Array<{
|
|
60
|
+
entry: TranscriptEntry;
|
|
61
|
+
sessionId: string;
|
|
62
|
+
lineNumber: number;
|
|
63
|
+
}>;
|
|
64
|
+
/**
|
|
65
|
+
* Get or create session metadata. Uses firstMessage to auto-generate a title
|
|
66
|
+
* if the session doesn't yet exist.
|
|
67
|
+
*/
|
|
68
|
+
getOrCreateMeta(sessionId: string, firstMessage?: string): SessionMeta;
|
|
69
|
+
/**
|
|
70
|
+
* Merge partial updates into an existing session's metadata.
|
|
71
|
+
*/
|
|
72
|
+
updateMeta(sessionId: string, updates: Partial<SessionMeta>): void;
|
|
73
|
+
/**
|
|
74
|
+
* Delete a session's JSONL file and remove it from the index.
|
|
75
|
+
*/
|
|
76
|
+
deleteSession(sessionId: string): void;
|
|
77
|
+
flush(): void;
|
|
78
|
+
private markIndexDirty;
|
|
79
|
+
private sessionFilePath;
|
|
80
|
+
private indexFilePath;
|
|
81
|
+
private ensureDir;
|
|
82
|
+
private loadIndex;
|
|
83
|
+
private saveIndex;
|
|
84
|
+
/**
|
|
85
|
+
* Generate a human-readable title from the first 50 chars of a message.
|
|
86
|
+
* Strips newlines, trims whitespace.
|
|
87
|
+
*/
|
|
88
|
+
private generateTitle;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Returns the process-level singleton TranscriptStore, rooted at cwd().
|
|
92
|
+
*/
|
|
93
|
+
export declare function getTranscriptStore(): TranscriptStore;
|
|
94
|
+
export declare function _resetTranscriptStoreSingleton(): void;
|
|
95
|
+
export { os };
|
|
96
|
+
//# sourceMappingURL=transcript.d.ts.map
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transcript Persistence
|
|
3
|
+
*
|
|
4
|
+
* Saves all conversations to JSONL files for searchable history and session resumption.
|
|
5
|
+
* Files are stored at .profclaw/transcripts/{sessionId}.jsonl
|
|
6
|
+
* Index is stored at .profclaw/transcripts/index.json
|
|
7
|
+
*/
|
|
8
|
+
import * as fs from 'fs';
|
|
9
|
+
import * as path from 'path';
|
|
10
|
+
import * as os from 'os';
|
|
11
|
+
let _instance = null;
|
|
12
|
+
export class TranscriptStore {
|
|
13
|
+
transcriptsDir;
|
|
14
|
+
sessionsIndex;
|
|
15
|
+
indexDirty = false;
|
|
16
|
+
indexTimer = null;
|
|
17
|
+
constructor(projectRoot) {
|
|
18
|
+
const root = projectRoot ?? process.cwd();
|
|
19
|
+
this.transcriptsDir = path.join(root, '.profclaw', 'transcripts');
|
|
20
|
+
this.sessionsIndex = new Map();
|
|
21
|
+
this.loadIndex();
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Append a single entry to the session's JSONL file.
|
|
25
|
+
*/
|
|
26
|
+
append(entry) {
|
|
27
|
+
this.ensureDir();
|
|
28
|
+
const filePath = this.sessionFilePath(entry.sessionId);
|
|
29
|
+
const line = JSON.stringify(entry) + '\n';
|
|
30
|
+
try {
|
|
31
|
+
fs.appendFileSync(filePath, line, 'utf8');
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
console.error('[TranscriptStore] Failed to append entry:', err);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
// Update session metadata
|
|
38
|
+
const meta = this.getOrCreateMeta(entry.sessionId);
|
|
39
|
+
meta.lastActivityAt = entry.timestamp;
|
|
40
|
+
meta.messageCount += 1;
|
|
41
|
+
if (entry.metadata?.tokensUsed) {
|
|
42
|
+
meta.tokensUsed += entry.metadata.tokensUsed;
|
|
43
|
+
}
|
|
44
|
+
if (entry.metadata?.model && !meta.model) {
|
|
45
|
+
meta.model = entry.metadata.model;
|
|
46
|
+
}
|
|
47
|
+
this.sessionsIndex.set(entry.sessionId, meta);
|
|
48
|
+
this.markIndexDirty();
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Read all entries for a session from its JSONL file.
|
|
52
|
+
*/
|
|
53
|
+
getSession(sessionId) {
|
|
54
|
+
const filePath = this.sessionFilePath(sessionId);
|
|
55
|
+
if (!fs.existsSync(filePath)) {
|
|
56
|
+
return [];
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
const raw = fs.readFileSync(filePath, 'utf8');
|
|
60
|
+
const entries = [];
|
|
61
|
+
for (const line of raw.split('\n')) {
|
|
62
|
+
const trimmed = line.trim();
|
|
63
|
+
if (!trimmed)
|
|
64
|
+
continue;
|
|
65
|
+
try {
|
|
66
|
+
entries.push(JSON.parse(trimmed));
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// Skip malformed lines
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return entries;
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
console.error(`[TranscriptStore] Failed to read session ${sessionId}:`, err);
|
|
76
|
+
return [];
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* List sessions sorted by lastActivityAt descending.
|
|
81
|
+
*/
|
|
82
|
+
listSessions(options) {
|
|
83
|
+
const all = Array.from(this.sessionsIndex.values()).sort((a, b) => b.lastActivityAt - a.lastActivityAt);
|
|
84
|
+
const offset = options?.offset ?? 0;
|
|
85
|
+
const limit = options?.limit ?? all.length;
|
|
86
|
+
return all.slice(offset, offset + limit);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Full-text search across transcript entries.
|
|
90
|
+
* Returns matching entries with their session ID and line number.
|
|
91
|
+
*/
|
|
92
|
+
search(query, options) {
|
|
93
|
+
const results = [];
|
|
94
|
+
const lowerQuery = query.toLowerCase();
|
|
95
|
+
const limit = options?.limit ?? 50;
|
|
96
|
+
const sessionIds = options?.sessionId
|
|
97
|
+
? [options.sessionId]
|
|
98
|
+
: Array.from(this.sessionsIndex.keys());
|
|
99
|
+
for (const sessionId of sessionIds) {
|
|
100
|
+
if (results.length >= limit)
|
|
101
|
+
break;
|
|
102
|
+
const filePath = this.sessionFilePath(sessionId);
|
|
103
|
+
if (!fs.existsSync(filePath))
|
|
104
|
+
continue;
|
|
105
|
+
let raw;
|
|
106
|
+
try {
|
|
107
|
+
raw = fs.readFileSync(filePath, 'utf8');
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
const lines = raw.split('\n');
|
|
113
|
+
for (let i = 0; i < lines.length; i++) {
|
|
114
|
+
if (results.length >= limit)
|
|
115
|
+
break;
|
|
116
|
+
const line = lines[i].trim();
|
|
117
|
+
if (!line)
|
|
118
|
+
continue;
|
|
119
|
+
if (line.toLowerCase().includes(lowerQuery)) {
|
|
120
|
+
try {
|
|
121
|
+
const entry = JSON.parse(line);
|
|
122
|
+
results.push({ entry, sessionId, lineNumber: i + 1 });
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
// Skip malformed lines
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
return results;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Get or create session metadata. Uses firstMessage to auto-generate a title
|
|
134
|
+
* if the session doesn't yet exist.
|
|
135
|
+
*/
|
|
136
|
+
getOrCreateMeta(sessionId, firstMessage) {
|
|
137
|
+
const existing = this.sessionsIndex.get(sessionId);
|
|
138
|
+
if (existing)
|
|
139
|
+
return existing;
|
|
140
|
+
const now = Date.now();
|
|
141
|
+
const meta = {
|
|
142
|
+
sessionId,
|
|
143
|
+
title: firstMessage ? this.generateTitle(firstMessage) : `Session ${sessionId.slice(0, 8)}`,
|
|
144
|
+
startedAt: now,
|
|
145
|
+
lastActivityAt: now,
|
|
146
|
+
messageCount: 0,
|
|
147
|
+
tokensUsed: 0,
|
|
148
|
+
};
|
|
149
|
+
this.sessionsIndex.set(sessionId, meta);
|
|
150
|
+
this.saveIndex();
|
|
151
|
+
return meta;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Merge partial updates into an existing session's metadata.
|
|
155
|
+
*/
|
|
156
|
+
updateMeta(sessionId, updates) {
|
|
157
|
+
const existing = this.sessionsIndex.get(sessionId);
|
|
158
|
+
if (!existing)
|
|
159
|
+
return;
|
|
160
|
+
this.sessionsIndex.set(sessionId, { ...existing, ...updates, sessionId });
|
|
161
|
+
this.saveIndex();
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Delete a session's JSONL file and remove it from the index.
|
|
165
|
+
*/
|
|
166
|
+
deleteSession(sessionId) {
|
|
167
|
+
const filePath = this.sessionFilePath(sessionId);
|
|
168
|
+
if (fs.existsSync(filePath)) {
|
|
169
|
+
try {
|
|
170
|
+
fs.unlinkSync(filePath);
|
|
171
|
+
}
|
|
172
|
+
catch (err) {
|
|
173
|
+
console.error(`[TranscriptStore] Failed to delete session file ${sessionId}:`, err);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
this.sessionsIndex.delete(sessionId);
|
|
177
|
+
this.saveIndex();
|
|
178
|
+
}
|
|
179
|
+
flush() {
|
|
180
|
+
if (this.indexTimer) {
|
|
181
|
+
clearTimeout(this.indexTimer);
|
|
182
|
+
this.indexTimer = null;
|
|
183
|
+
}
|
|
184
|
+
if (this.indexDirty) {
|
|
185
|
+
this.saveIndex();
|
|
186
|
+
this.indexDirty = false;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
// ---------------------------------------------------------------------------
|
|
190
|
+
// Private helpers
|
|
191
|
+
// ---------------------------------------------------------------------------
|
|
192
|
+
markIndexDirty() {
|
|
193
|
+
this.indexDirty = true;
|
|
194
|
+
if (!this.indexTimer) {
|
|
195
|
+
this.indexTimer = setTimeout(() => {
|
|
196
|
+
this.indexTimer = null;
|
|
197
|
+
if (this.indexDirty) {
|
|
198
|
+
this.saveIndex();
|
|
199
|
+
this.indexDirty = false;
|
|
200
|
+
}
|
|
201
|
+
}, 1000);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
sessionFilePath(sessionId) {
|
|
205
|
+
return path.join(this.transcriptsDir, `${sessionId}.jsonl`);
|
|
206
|
+
}
|
|
207
|
+
indexFilePath() {
|
|
208
|
+
return path.join(this.transcriptsDir, 'index.json');
|
|
209
|
+
}
|
|
210
|
+
ensureDir() {
|
|
211
|
+
if (!fs.existsSync(this.transcriptsDir)) {
|
|
212
|
+
fs.mkdirSync(this.transcriptsDir, { recursive: true });
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
loadIndex() {
|
|
216
|
+
const indexPath = this.indexFilePath();
|
|
217
|
+
if (!fs.existsSync(indexPath))
|
|
218
|
+
return;
|
|
219
|
+
try {
|
|
220
|
+
const raw = fs.readFileSync(indexPath, 'utf8');
|
|
221
|
+
const sessions = JSON.parse(raw);
|
|
222
|
+
for (const session of sessions) {
|
|
223
|
+
this.sessionsIndex.set(session.sessionId, session);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
catch (err) {
|
|
227
|
+
console.error('[TranscriptStore] Failed to load index:', err);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
saveIndex() {
|
|
231
|
+
this.ensureDir();
|
|
232
|
+
const indexPath = this.indexFilePath();
|
|
233
|
+
const sessions = Array.from(this.sessionsIndex.values());
|
|
234
|
+
try {
|
|
235
|
+
fs.writeFileSync(indexPath, JSON.stringify(sessions, null, 2), 'utf8');
|
|
236
|
+
}
|
|
237
|
+
catch (err) {
|
|
238
|
+
console.error('[TranscriptStore] Failed to save index:', err);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Generate a human-readable title from the first 50 chars of a message.
|
|
243
|
+
* Strips newlines, trims whitespace.
|
|
244
|
+
*/
|
|
245
|
+
generateTitle(message) {
|
|
246
|
+
const cleaned = message.replace(/[\r\n\t]+/g, ' ').trim();
|
|
247
|
+
if (cleaned.length <= 50)
|
|
248
|
+
return cleaned;
|
|
249
|
+
return cleaned.slice(0, 47) + '...';
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Returns the process-level singleton TranscriptStore, rooted at cwd().
|
|
254
|
+
*/
|
|
255
|
+
export function getTranscriptStore() {
|
|
256
|
+
if (!_instance) {
|
|
257
|
+
_instance = new TranscriptStore();
|
|
258
|
+
}
|
|
259
|
+
return _instance;
|
|
260
|
+
}
|
|
261
|
+
// Exported for test injection
|
|
262
|
+
export function _resetTranscriptStoreSingleton() {
|
|
263
|
+
_instance = null;
|
|
264
|
+
}
|
|
265
|
+
// Re-export os for use in tests (avoids test-only imports from module internals)
|
|
266
|
+
export { os };
|
|
267
|
+
//# sourceMappingURL=transcript.js.map
|