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,268 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill Marketplace Client
|
|
3
|
+
*
|
|
4
|
+
* Enables discovering, installing, and updating skills from remote registries.
|
|
5
|
+
* Supports the profClaw skill registry (future) and GitHub-hosted skills.
|
|
6
|
+
*
|
|
7
|
+
* Skills are installed to ~/.profclaw/skills/<name>/SKILL.md
|
|
8
|
+
*/
|
|
9
|
+
import { join } from 'node:path';
|
|
10
|
+
import { mkdir, writeFile, readFile, rm } from 'node:fs/promises';
|
|
11
|
+
import { homedir } from 'node:os';
|
|
12
|
+
import { logger } from '../utils/logger.js';
|
|
13
|
+
// Default registries
|
|
14
|
+
const DEFAULT_REGISTRIES = [
|
|
15
|
+
{
|
|
16
|
+
name: 'profclaw-community',
|
|
17
|
+
url: 'https://registry.profclaw.ai/api/v1',
|
|
18
|
+
enabled: true,
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
name: 'clawhub',
|
|
22
|
+
url: 'https://clawhub.dev/api/v1',
|
|
23
|
+
enabled: true,
|
|
24
|
+
},
|
|
25
|
+
];
|
|
26
|
+
// Marketplace Client
|
|
27
|
+
const MANAGED_SKILLS_DIR = join(homedir(), '.profclaw', 'skills');
|
|
28
|
+
export class MarketplaceClient {
|
|
29
|
+
registries;
|
|
30
|
+
constructor(registries) {
|
|
31
|
+
this.registries = registries || [...DEFAULT_REGISTRIES];
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Search for skills across all enabled registries.
|
|
35
|
+
*/
|
|
36
|
+
async search(params = {}) {
|
|
37
|
+
const results = [];
|
|
38
|
+
for (const registry of this.registries.filter((r) => r.enabled)) {
|
|
39
|
+
try {
|
|
40
|
+
const skills = await this.searchRegistry(registry, params);
|
|
41
|
+
results.push(...skills);
|
|
42
|
+
}
|
|
43
|
+
catch (error) {
|
|
44
|
+
logger.warn(`[Marketplace] Failed to search ${registry.name}: ${error instanceof Error ? error.message : 'Unknown'}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// Sort results
|
|
48
|
+
const sortBy = params.sortBy || 'installs';
|
|
49
|
+
results.sort((a, b) => {
|
|
50
|
+
switch (sortBy) {
|
|
51
|
+
case 'installs': return b.installs - a.installs;
|
|
52
|
+
case 'rating': return b.rating - a.rating;
|
|
53
|
+
case 'updated': return new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime();
|
|
54
|
+
case 'name': return a.name.localeCompare(b.name);
|
|
55
|
+
default: return 0;
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
return results.slice(0, params.limit || 50);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Install a skill from a registry or direct URL.
|
|
62
|
+
*/
|
|
63
|
+
async install(source) {
|
|
64
|
+
try {
|
|
65
|
+
let skillContent;
|
|
66
|
+
let skillName;
|
|
67
|
+
if (source.startsWith('http://') || source.startsWith('https://')) {
|
|
68
|
+
// Direct URL install
|
|
69
|
+
const result = await this.fetchSkillFromUrl(source);
|
|
70
|
+
skillContent = result.content;
|
|
71
|
+
skillName = result.name;
|
|
72
|
+
}
|
|
73
|
+
else if (source.includes('/')) {
|
|
74
|
+
// GitHub shorthand: owner/repo or owner/repo/path
|
|
75
|
+
const result = await this.fetchSkillFromGitHub(source);
|
|
76
|
+
skillContent = result.content;
|
|
77
|
+
skillName = result.name;
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
// Registry skill name
|
|
81
|
+
const result = await this.fetchSkillFromRegistry(source);
|
|
82
|
+
skillContent = result.content;
|
|
83
|
+
skillName = result.name;
|
|
84
|
+
}
|
|
85
|
+
// Install to managed skills directory
|
|
86
|
+
const installDir = join(MANAGED_SKILLS_DIR, skillName);
|
|
87
|
+
await mkdir(installDir, { recursive: true });
|
|
88
|
+
const installPath = join(installDir, 'SKILL.md');
|
|
89
|
+
await writeFile(installPath, skillContent, 'utf-8');
|
|
90
|
+
// Parse version from frontmatter
|
|
91
|
+
const versionMatch = skillContent.match(/version:\s*(.+)/);
|
|
92
|
+
const version = versionMatch ? versionMatch[1].trim() : 'unknown';
|
|
93
|
+
logger.info(`[Marketplace] Installed skill: ${skillName} v${version} to ${installPath}`);
|
|
94
|
+
return {
|
|
95
|
+
success: true,
|
|
96
|
+
skillName,
|
|
97
|
+
version,
|
|
98
|
+
installPath,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
const msg = error instanceof Error ? error.message : 'Install failed';
|
|
103
|
+
logger.error(`[Marketplace] Install failed for ${source}: ${msg}`);
|
|
104
|
+
return {
|
|
105
|
+
success: false,
|
|
106
|
+
skillName: source,
|
|
107
|
+
error: msg,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Uninstall a managed skill.
|
|
113
|
+
*/
|
|
114
|
+
async uninstall(skillName) {
|
|
115
|
+
const skillDir = join(MANAGED_SKILLS_DIR, skillName);
|
|
116
|
+
try {
|
|
117
|
+
await rm(skillDir, { recursive: true });
|
|
118
|
+
logger.info(`[Marketplace] Uninstalled skill: ${skillName}`);
|
|
119
|
+
return true;
|
|
120
|
+
}
|
|
121
|
+
catch {
|
|
122
|
+
return false;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Check for updates to installed managed skills.
|
|
127
|
+
*/
|
|
128
|
+
async checkUpdates() {
|
|
129
|
+
const updates = [];
|
|
130
|
+
try {
|
|
131
|
+
const { readdir } = await import('node:fs/promises');
|
|
132
|
+
const dirs = await readdir(MANAGED_SKILLS_DIR).catch(() => []);
|
|
133
|
+
for (const dir of dirs) {
|
|
134
|
+
const skillPath = join(MANAGED_SKILLS_DIR, dir, 'SKILL.md');
|
|
135
|
+
try {
|
|
136
|
+
const content = await readFile(skillPath, 'utf-8');
|
|
137
|
+
const versionMatch = content.match(/version:\s*(.+)/);
|
|
138
|
+
const currentVersion = versionMatch ? versionMatch[1].trim() : 'unknown';
|
|
139
|
+
// Check registry for latest version
|
|
140
|
+
const latest = await this.getLatestVersion(dir);
|
|
141
|
+
if (latest && latest !== currentVersion) {
|
|
142
|
+
updates.push({ name: dir, currentVersion, latestVersion: latest });
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
// Skip skills we can't read
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
// No managed skills directory
|
|
152
|
+
}
|
|
153
|
+
return updates;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Add a custom registry.
|
|
157
|
+
*/
|
|
158
|
+
addRegistry(registry) {
|
|
159
|
+
const existing = this.registries.findIndex((r) => r.name === registry.name);
|
|
160
|
+
if (existing >= 0) {
|
|
161
|
+
this.registries[existing] = registry;
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
this.registries.push(registry);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* List configured registries.
|
|
169
|
+
*/
|
|
170
|
+
listRegistries() {
|
|
171
|
+
return [...this.registries];
|
|
172
|
+
}
|
|
173
|
+
// Private methods
|
|
174
|
+
async searchRegistry(registry, params) {
|
|
175
|
+
const url = new URL(`${registry.url}/skills`);
|
|
176
|
+
if (params.query)
|
|
177
|
+
url.searchParams.set('q', params.query);
|
|
178
|
+
if (params.category)
|
|
179
|
+
url.searchParams.set('category', params.category);
|
|
180
|
+
if (params.tag)
|
|
181
|
+
url.searchParams.set('tag', params.tag);
|
|
182
|
+
if (params.limit)
|
|
183
|
+
url.searchParams.set('limit', String(params.limit));
|
|
184
|
+
if (params.offset)
|
|
185
|
+
url.searchParams.set('offset', String(params.offset));
|
|
186
|
+
const response = await fetch(url.toString(), {
|
|
187
|
+
headers: { 'User-Agent': 'profClaw/2.0 Marketplace' },
|
|
188
|
+
signal: AbortSignal.timeout(10000),
|
|
189
|
+
});
|
|
190
|
+
if (!response.ok) {
|
|
191
|
+
throw new Error(`Registry ${registry.name} returned ${response.status}`);
|
|
192
|
+
}
|
|
193
|
+
const data = await response.json();
|
|
194
|
+
return data.skills || [];
|
|
195
|
+
}
|
|
196
|
+
async fetchSkillFromUrl(url) {
|
|
197
|
+
const response = await fetch(url, {
|
|
198
|
+
headers: { 'User-Agent': 'profClaw/2.0 Marketplace' },
|
|
199
|
+
signal: AbortSignal.timeout(15000),
|
|
200
|
+
});
|
|
201
|
+
if (!response.ok) {
|
|
202
|
+
throw new Error(`Failed to fetch skill: HTTP ${response.status}`);
|
|
203
|
+
}
|
|
204
|
+
const content = await response.text();
|
|
205
|
+
const nameMatch = content.match(/name:\s*(.+)/);
|
|
206
|
+
const name = nameMatch ? nameMatch[1].trim() : `skill-${Date.now()}`;
|
|
207
|
+
return { content, name };
|
|
208
|
+
}
|
|
209
|
+
async fetchSkillFromGitHub(shorthand) {
|
|
210
|
+
// Parse: owner/repo or owner/repo/path/to/SKILL.md
|
|
211
|
+
const parts = shorthand.split('/');
|
|
212
|
+
if (parts.length < 2) {
|
|
213
|
+
throw new Error(`Invalid GitHub shorthand: ${shorthand}. Use owner/repo or owner/repo/path`);
|
|
214
|
+
}
|
|
215
|
+
const owner = parts[0];
|
|
216
|
+
const repo = parts[1];
|
|
217
|
+
const path = parts.length > 2 ? parts.slice(2).join('/') : 'SKILL.md';
|
|
218
|
+
const url = `https://raw.githubusercontent.com/${owner}/${repo}/main/${path}`;
|
|
219
|
+
return this.fetchSkillFromUrl(url);
|
|
220
|
+
}
|
|
221
|
+
async fetchSkillFromRegistry(name) {
|
|
222
|
+
for (const registry of this.registries.filter((r) => r.enabled)) {
|
|
223
|
+
try {
|
|
224
|
+
const url = `${registry.url}/skills/${encodeURIComponent(name)}/content`;
|
|
225
|
+
const response = await fetch(url, {
|
|
226
|
+
headers: { 'User-Agent': 'profClaw/2.0 Marketplace' },
|
|
227
|
+
signal: AbortSignal.timeout(10000),
|
|
228
|
+
});
|
|
229
|
+
if (response.ok) {
|
|
230
|
+
const content = await response.text();
|
|
231
|
+
return { content, name };
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
catch {
|
|
235
|
+
// Try next registry
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
throw new Error(`Skill "${name}" not found in any registry`);
|
|
239
|
+
}
|
|
240
|
+
async getLatestVersion(skillName) {
|
|
241
|
+
for (const registry of this.registries.filter((r) => r.enabled)) {
|
|
242
|
+
try {
|
|
243
|
+
const url = `${registry.url}/skills/${encodeURIComponent(skillName)}`;
|
|
244
|
+
const response = await fetch(url, {
|
|
245
|
+
headers: { 'User-Agent': 'profClaw/2.0 Marketplace' },
|
|
246
|
+
signal: AbortSignal.timeout(5000),
|
|
247
|
+
});
|
|
248
|
+
if (response.ok) {
|
|
249
|
+
const data = await response.json();
|
|
250
|
+
return data.version || null;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
catch {
|
|
254
|
+
// Try next registry
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
return null;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
// Singleton
|
|
261
|
+
let marketplaceInstance = null;
|
|
262
|
+
export function getMarketplace() {
|
|
263
|
+
if (!marketplaceInstance) {
|
|
264
|
+
marketplaceInstance = new MarketplaceClient();
|
|
265
|
+
}
|
|
266
|
+
return marketplaceInstance;
|
|
267
|
+
}
|
|
268
|
+
//# sourceMappingURL=marketplace.js.map
|
package/dist/storage/index.d.ts
CHANGED
|
@@ -2,6 +2,16 @@ import type { StorageAdapter } from "./adapter.js";
|
|
|
2
2
|
import type { LibSQLDatabase } from "drizzle-orm/libsql";
|
|
3
3
|
import type { Client } from "@libsql/client";
|
|
4
4
|
import * as schema from "./schema.js";
|
|
5
|
+
import { type MigrationDb } from "./migrations.js";
|
|
6
|
+
/**
|
|
7
|
+
* Wraps a libsql Client into the MigrationDb interface expected by runMigrations.
|
|
8
|
+
*/
|
|
9
|
+
export declare function buildMigrationDb(client: Client): MigrationDb;
|
|
10
|
+
/**
|
|
11
|
+
* Returns true if the active storage backend is ephemeral (in-memory).
|
|
12
|
+
* Always returns false before initStorage() has been called.
|
|
13
|
+
*/
|
|
14
|
+
export declare function isStorageInMemory(): boolean;
|
|
5
15
|
/**
|
|
6
16
|
* Initialize storage based on configuration
|
|
7
17
|
*/
|
|
@@ -18,6 +28,10 @@ export declare function getDb(): LibSQLDatabase<typeof schema>;
|
|
|
18
28
|
* Get the raw libsql client for executing raw SQL
|
|
19
29
|
*/
|
|
20
30
|
export declare function getClient(): Client;
|
|
31
|
+
/**
|
|
32
|
+
* Close the global storage connection. Call before process exit in CLI commands.
|
|
33
|
+
*/
|
|
34
|
+
export declare function closeStorage(): Promise<void>;
|
|
21
35
|
export * from "./adapter.js";
|
|
22
36
|
export * from "./schema.js";
|
|
23
37
|
export interface SavedProviderConfig {
|
package/dist/storage/index.js
CHANGED
|
@@ -1,8 +1,34 @@
|
|
|
1
1
|
import { LibSQLAdapter } from "./libsql.js";
|
|
2
2
|
import { loadConfig } from "../utils/config-loader.js";
|
|
3
3
|
import { createContextualLogger } from "../utils/logger.js";
|
|
4
|
+
import { runMigrations } from "./migrations.js";
|
|
4
5
|
const log = createContextualLogger('Storage');
|
|
6
|
+
/**
|
|
7
|
+
* Wraps a libsql Client into the MigrationDb interface expected by runMigrations.
|
|
8
|
+
*/
|
|
9
|
+
export function buildMigrationDb(client) {
|
|
10
|
+
return {
|
|
11
|
+
execute: async (sql, params) => {
|
|
12
|
+
const result = await client.execute({
|
|
13
|
+
sql,
|
|
14
|
+
args: (params ?? []),
|
|
15
|
+
});
|
|
16
|
+
return {
|
|
17
|
+
rows: result.rows,
|
|
18
|
+
rowsAffected: result.rowsAffected,
|
|
19
|
+
};
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
}
|
|
5
23
|
let storage = null;
|
|
24
|
+
let storageIsInMemory = false;
|
|
25
|
+
/**
|
|
26
|
+
* Returns true if the active storage backend is ephemeral (in-memory).
|
|
27
|
+
* Always returns false before initStorage() has been called.
|
|
28
|
+
*/
|
|
29
|
+
export function isStorageInMemory() {
|
|
30
|
+
return storageIsInMemory;
|
|
31
|
+
}
|
|
6
32
|
/**
|
|
7
33
|
* Initialize storage based on configuration
|
|
8
34
|
*/
|
|
@@ -19,23 +45,49 @@ export async function initStorage() {
|
|
|
19
45
|
if (tier === "file") {
|
|
20
46
|
tier = "local";
|
|
21
47
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
tier = "local";
|
|
48
|
+
// Extract path from DATABASE_URL when present (works for any tier)
|
|
49
|
+
if (databaseUrl) {
|
|
25
50
|
dbPathOverride = databaseUrl.startsWith("file:")
|
|
26
51
|
? databaseUrl.slice(5)
|
|
27
52
|
: databaseUrl;
|
|
53
|
+
// DATABASE_URL implies persistent storage even if tier was "memory"
|
|
54
|
+
if (tier === "memory") {
|
|
55
|
+
tier = "local";
|
|
56
|
+
}
|
|
28
57
|
}
|
|
29
58
|
if (tier === "local") {
|
|
30
59
|
const dbPath = dbPathOverride || process.env.DB_PATH || settings.storage?.dbPath;
|
|
31
60
|
storage = new LibSQLAdapter({ dbPath });
|
|
61
|
+
storageIsInMemory = false;
|
|
32
62
|
log.info('Initializing LibSQL storage', { dbPath: dbPath || 'default path' });
|
|
33
63
|
}
|
|
34
64
|
else {
|
|
65
|
+
storageIsInMemory = true;
|
|
35
66
|
log.info('Initializing in-memory storage (LibSQL in-memory)');
|
|
36
67
|
storage = new LibSQLAdapter({ dbPath: ":memory:" });
|
|
37
68
|
}
|
|
38
69
|
await storage.connect();
|
|
70
|
+
// Auto-run migrations on startup so first-time users don't hit schema errors
|
|
71
|
+
try {
|
|
72
|
+
const migrationDb = buildMigrationDb(storage.getClient());
|
|
73
|
+
const result = await runMigrations(migrationDb);
|
|
74
|
+
if (result.applied > 0) {
|
|
75
|
+
log.info('Auto-migration complete', {
|
|
76
|
+
applied: result.applied,
|
|
77
|
+
currentVersion: result.currentVersion,
|
|
78
|
+
migrations: result.migrations,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
log.debug('Schema is up to date', { currentVersion: result.currentVersion });
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
87
|
+
log.error('Auto-migration failed', { error: message });
|
|
88
|
+
throw new Error(`Database migration failed during startup: ${message}\n` +
|
|
89
|
+
`To diagnose, run: profclaw db:migrate --verbose`);
|
|
90
|
+
}
|
|
39
91
|
return storage;
|
|
40
92
|
}
|
|
41
93
|
/**
|
|
@@ -65,6 +117,15 @@ export function getClient() {
|
|
|
65
117
|
}
|
|
66
118
|
return storage.getClient();
|
|
67
119
|
}
|
|
120
|
+
/**
|
|
121
|
+
* Close the global storage connection. Call before process exit in CLI commands.
|
|
122
|
+
*/
|
|
123
|
+
export async function closeStorage() {
|
|
124
|
+
if (storage) {
|
|
125
|
+
await storage.disconnect();
|
|
126
|
+
storage = null;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
68
129
|
export * from "./adapter.js";
|
|
69
130
|
export * from "./schema.js";
|
|
70
131
|
/**
|
package/dist/storage/schema.d.ts
CHANGED
|
@@ -7488,7 +7488,7 @@ export declare const scheduledJobs: import("drizzle-orm/sqlite-core").SQLiteTabl
|
|
|
7488
7488
|
columnType: "SQLiteTextJson";
|
|
7489
7489
|
data: {
|
|
7490
7490
|
channels: Array<{
|
|
7491
|
-
type: "slack" | "webhook" | "email";
|
|
7491
|
+
type: "slack" | "webhook" | "email" | "telegram" | "discord";
|
|
7492
7492
|
target: string;
|
|
7493
7493
|
onSuccess?: boolean;
|
|
7494
7494
|
onFailure?: boolean;
|
|
@@ -7507,7 +7507,7 @@ export declare const scheduledJobs: import("drizzle-orm/sqlite-core").SQLiteTabl
|
|
|
7507
7507
|
}, {}, {
|
|
7508
7508
|
$type: {
|
|
7509
7509
|
channels: Array<{
|
|
7510
|
-
type: "slack" | "webhook" | "email";
|
|
7510
|
+
type: "slack" | "webhook" | "email" | "telegram" | "discord";
|
|
7511
7511
|
target: string;
|
|
7512
7512
|
onSuccess?: boolean;
|
|
7513
7513
|
onFailure?: boolean;
|
|
@@ -8908,7 +8908,7 @@ export declare const jobTemplates: import("drizzle-orm/sqlite-core").SQLiteTable
|
|
|
8908
8908
|
columnType: "SQLiteTextJson";
|
|
8909
8909
|
data: {
|
|
8910
8910
|
channels: Array<{
|
|
8911
|
-
type: "slack" | "webhook" | "email";
|
|
8911
|
+
type: "slack" | "webhook" | "email" | "telegram" | "discord";
|
|
8912
8912
|
target: string;
|
|
8913
8913
|
onSuccess?: boolean;
|
|
8914
8914
|
onFailure?: boolean;
|
|
@@ -8927,7 +8927,7 @@ export declare const jobTemplates: import("drizzle-orm/sqlite-core").SQLiteTable
|
|
|
8927
8927
|
}, {}, {
|
|
8928
8928
|
$type: {
|
|
8929
8929
|
channels: Array<{
|
|
8930
|
-
type: "slack" | "webhook" | "email";
|
|
8930
|
+
type: "slack" | "webhook" | "email" | "telegram" | "discord";
|
|
8931
8931
|
target: string;
|
|
8932
8932
|
onSuccess?: boolean;
|
|
8933
8933
|
onFailure?: boolean;
|
package/dist/storage/schema.js
CHANGED
|
@@ -825,7 +825,7 @@ export const scheduledJobs = sqliteTable("scheduled_jobs", {
|
|
|
825
825
|
// Event triggers (for event-driven jobs)
|
|
826
826
|
eventTrigger: text("event_trigger", { mode: "json" }).$type(),
|
|
827
827
|
// Job type and payload
|
|
828
|
-
jobType: text("job_type").notNull(), // 'http' | 'tool' | 'script' | 'message'
|
|
828
|
+
jobType: text("job_type").notNull(), // 'http' | 'tool' | 'script' | 'message' | 'agent_session'
|
|
829
829
|
payload: text("payload", { mode: "json" })
|
|
830
830
|
.$type()
|
|
831
831
|
.notNull(),
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Team Management System
|
|
3
|
+
*
|
|
4
|
+
* Multi-user teams with shared cost budgets, role-based access,
|
|
5
|
+
* and per-member usage tracking.
|
|
6
|
+
*
|
|
7
|
+
* No other OSS AI tool has this - enterprise unlock for profClaw.
|
|
8
|
+
*
|
|
9
|
+
* Roles:
|
|
10
|
+
* owner - full control, billing, can delete team
|
|
11
|
+
* admin - manage members, budgets, settings
|
|
12
|
+
* member - use AI, view costs, manage own preferences
|
|
13
|
+
* viewer - read-only access to dashboards and history
|
|
14
|
+
*/
|
|
15
|
+
export type TeamRole = 'owner' | 'admin' | 'member' | 'viewer';
|
|
16
|
+
export interface Team {
|
|
17
|
+
id: string;
|
|
18
|
+
name: string;
|
|
19
|
+
slug: string;
|
|
20
|
+
description?: string;
|
|
21
|
+
avatarUrl?: string;
|
|
22
|
+
ownerId: string;
|
|
23
|
+
monthlyBudgetUsd: number;
|
|
24
|
+
dailyBudgetUsd: number;
|
|
25
|
+
budgetAlertThresholds: number[];
|
|
26
|
+
defaultModel?: string;
|
|
27
|
+
preferredProviders: string[];
|
|
28
|
+
smartRoutingEnabled: boolean;
|
|
29
|
+
memberCount: number;
|
|
30
|
+
createdAt: number;
|
|
31
|
+
updatedAt: number;
|
|
32
|
+
}
|
|
33
|
+
export interface TeamMember {
|
|
34
|
+
id: string;
|
|
35
|
+
teamId: string;
|
|
36
|
+
userId: string;
|
|
37
|
+
role: TeamRole;
|
|
38
|
+
personalBudgetUsd?: number;
|
|
39
|
+
preferredModel?: string;
|
|
40
|
+
totalSpentUsd: number;
|
|
41
|
+
requestCount: number;
|
|
42
|
+
lastActiveAt?: number;
|
|
43
|
+
joinedAt: number;
|
|
44
|
+
invitedBy?: string;
|
|
45
|
+
}
|
|
46
|
+
export interface TeamInvite {
|
|
47
|
+
id: string;
|
|
48
|
+
teamId: string;
|
|
49
|
+
email: string;
|
|
50
|
+
role: TeamRole;
|
|
51
|
+
invitedBy: string;
|
|
52
|
+
expiresAt: number;
|
|
53
|
+
acceptedAt?: number;
|
|
54
|
+
}
|
|
55
|
+
export interface TeamUsageSummary {
|
|
56
|
+
teamId: string;
|
|
57
|
+
period: 'daily' | 'weekly' | 'monthly';
|
|
58
|
+
totalSpentUsd: number;
|
|
59
|
+
budgetUsd: number;
|
|
60
|
+
budgetUsedPercent: number;
|
|
61
|
+
memberBreakdown: Array<{
|
|
62
|
+
userId: string;
|
|
63
|
+
name?: string;
|
|
64
|
+
spentUsd: number;
|
|
65
|
+
requestCount: number;
|
|
66
|
+
topModel?: string;
|
|
67
|
+
}>;
|
|
68
|
+
alertsTriggered: number[];
|
|
69
|
+
}
|
|
70
|
+
export declare function initTeamsTables(): Promise<void>;
|
|
71
|
+
export declare function createTeam(params: {
|
|
72
|
+
name: string;
|
|
73
|
+
slug?: string;
|
|
74
|
+
description?: string;
|
|
75
|
+
ownerId: string;
|
|
76
|
+
monthlyBudget?: number;
|
|
77
|
+
dailyBudget?: number;
|
|
78
|
+
}): Promise<Team>;
|
|
79
|
+
export declare function getTeam(teamId: string): Promise<Team | null>;
|
|
80
|
+
export declare function getTeamBySlug(slug: string): Promise<Team | null>;
|
|
81
|
+
export declare function listUserTeams(userId: string): Promise<Team[]>;
|
|
82
|
+
export declare function updateTeam(teamId: string, updates: Partial<{
|
|
83
|
+
name: string;
|
|
84
|
+
description: string;
|
|
85
|
+
monthlyBudgetUsd: number;
|
|
86
|
+
dailyBudgetUsd: number;
|
|
87
|
+
budgetAlertThresholds: number[];
|
|
88
|
+
defaultModel: string;
|
|
89
|
+
preferredProviders: string[];
|
|
90
|
+
smartRoutingEnabled: boolean;
|
|
91
|
+
}>): Promise<Team | null>;
|
|
92
|
+
export declare function deleteTeam(teamId: string): Promise<boolean>;
|
|
93
|
+
export declare function addMember(teamId: string, userId: string, role?: TeamRole, invitedBy?: string): Promise<TeamMember>;
|
|
94
|
+
export declare function removeMember(teamId: string, userId: string): Promise<boolean>;
|
|
95
|
+
export declare function getMember(teamId: string, userId: string): Promise<TeamMember | null>;
|
|
96
|
+
export declare function listMembers(teamId: string): Promise<TeamMember[]>;
|
|
97
|
+
export declare function updateMemberRole(teamId: string, userId: string, newRole: TeamRole): Promise<boolean>;
|
|
98
|
+
export declare function recordMemberUsage(teamId: string, userId: string, costUsd: number): Promise<void>;
|
|
99
|
+
export declare function getTeamUsage(teamId: string): Promise<TeamUsageSummary>;
|
|
100
|
+
/**
|
|
101
|
+
* Check if a member can make a request (budget check).
|
|
102
|
+
*/
|
|
103
|
+
export declare function canMemberSpend(teamId: string, userId: string, estimatedCostUsd: number): Promise<{
|
|
104
|
+
allowed: boolean;
|
|
105
|
+
reason?: string;
|
|
106
|
+
}>;
|
|
107
|
+
export declare function createInvite(teamId: string, email: string, role: TeamRole, invitedBy: string): Promise<TeamInvite>;
|
|
108
|
+
export declare function acceptInvite(inviteId: string, userId: string): Promise<TeamMember | null>;
|
|
109
|
+
export declare function listTeamInvites(teamId: string): Promise<TeamInvite[]>;
|
|
110
|
+
//# sourceMappingURL=index.d.ts.map
|