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,365 @@
|
|
|
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
|
+
import { randomUUID } from 'node:crypto';
|
|
16
|
+
import { createContextualLogger } from '../utils/logger.js';
|
|
17
|
+
import { getClient } from '../storage/index.js';
|
|
18
|
+
const log = createContextualLogger('Teams');
|
|
19
|
+
// DB Initialization
|
|
20
|
+
export async function initTeamsTables() {
|
|
21
|
+
const db = getClient();
|
|
22
|
+
await db.execute(`
|
|
23
|
+
CREATE TABLE IF NOT EXISTS teams (
|
|
24
|
+
id TEXT PRIMARY KEY,
|
|
25
|
+
name TEXT NOT NULL,
|
|
26
|
+
slug TEXT NOT NULL UNIQUE,
|
|
27
|
+
description TEXT,
|
|
28
|
+
avatar_url TEXT,
|
|
29
|
+
owner_id TEXT NOT NULL,
|
|
30
|
+
monthly_budget_usd REAL NOT NULL DEFAULT 100.0,
|
|
31
|
+
daily_budget_usd REAL NOT NULL DEFAULT 10.0,
|
|
32
|
+
budget_alert_thresholds TEXT NOT NULL DEFAULT '[50, 80, 100]',
|
|
33
|
+
default_model TEXT,
|
|
34
|
+
preferred_providers TEXT NOT NULL DEFAULT '[]',
|
|
35
|
+
smart_routing_enabled INTEGER NOT NULL DEFAULT 1,
|
|
36
|
+
member_count INTEGER NOT NULL DEFAULT 1,
|
|
37
|
+
created_at INTEGER NOT NULL DEFAULT (unixepoch()),
|
|
38
|
+
updated_at INTEGER NOT NULL DEFAULT (unixepoch())
|
|
39
|
+
)
|
|
40
|
+
`);
|
|
41
|
+
await db.execute(`
|
|
42
|
+
CREATE TABLE IF NOT EXISTS team_members (
|
|
43
|
+
id TEXT PRIMARY KEY,
|
|
44
|
+
team_id TEXT NOT NULL REFERENCES teams(id) ON DELETE CASCADE,
|
|
45
|
+
user_id TEXT NOT NULL,
|
|
46
|
+
role TEXT NOT NULL DEFAULT 'member',
|
|
47
|
+
personal_budget_usd REAL,
|
|
48
|
+
preferred_model TEXT,
|
|
49
|
+
total_spent_usd REAL NOT NULL DEFAULT 0.0,
|
|
50
|
+
request_count INTEGER NOT NULL DEFAULT 0,
|
|
51
|
+
last_active_at INTEGER,
|
|
52
|
+
joined_at INTEGER NOT NULL DEFAULT (unixepoch()),
|
|
53
|
+
invited_by TEXT,
|
|
54
|
+
UNIQUE(team_id, user_id)
|
|
55
|
+
)
|
|
56
|
+
`);
|
|
57
|
+
await db.execute(`
|
|
58
|
+
CREATE TABLE IF NOT EXISTS team_invites (
|
|
59
|
+
id TEXT PRIMARY KEY,
|
|
60
|
+
team_id TEXT NOT NULL REFERENCES teams(id) ON DELETE CASCADE,
|
|
61
|
+
email TEXT NOT NULL,
|
|
62
|
+
role TEXT NOT NULL DEFAULT 'member',
|
|
63
|
+
invited_by TEXT NOT NULL,
|
|
64
|
+
expires_at INTEGER NOT NULL,
|
|
65
|
+
accepted_at INTEGER
|
|
66
|
+
)
|
|
67
|
+
`);
|
|
68
|
+
await db.execute(`CREATE INDEX IF NOT EXISTS idx_team_members_team ON team_members(team_id)`);
|
|
69
|
+
await db.execute(`CREATE INDEX IF NOT EXISTS idx_team_members_user ON team_members(user_id)`);
|
|
70
|
+
await db.execute(`CREATE INDEX IF NOT EXISTS idx_team_invites_email ON team_invites(email)`);
|
|
71
|
+
}
|
|
72
|
+
// Team CRUD
|
|
73
|
+
export async function createTeam(params) {
|
|
74
|
+
const db = getClient();
|
|
75
|
+
const id = randomUUID();
|
|
76
|
+
const slug = params.slug ?? params.name.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '');
|
|
77
|
+
const now = Math.floor(Date.now() / 1000);
|
|
78
|
+
await db.execute({
|
|
79
|
+
sql: `INSERT INTO teams (id, name, slug, description, owner_id, monthly_budget_usd, daily_budget_usd, created_at, updated_at)
|
|
80
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
|
81
|
+
args: [id, params.name, slug, params.description ?? null, params.ownerId,
|
|
82
|
+
params.monthlyBudget ?? 100.0, params.dailyBudget ?? 10.0, now, now],
|
|
83
|
+
});
|
|
84
|
+
// Add owner as member
|
|
85
|
+
await db.execute({
|
|
86
|
+
sql: `INSERT INTO team_members (id, team_id, user_id, role, joined_at)
|
|
87
|
+
VALUES (?, ?, ?, 'owner', ?)`,
|
|
88
|
+
args: [randomUUID(), id, params.ownerId, now],
|
|
89
|
+
});
|
|
90
|
+
log.info('Team created', { teamId: id, name: params.name, owner: params.ownerId });
|
|
91
|
+
return getTeam(id);
|
|
92
|
+
}
|
|
93
|
+
export async function getTeam(teamId) {
|
|
94
|
+
const db = getClient();
|
|
95
|
+
const result = await db.execute({ sql: 'SELECT * FROM teams WHERE id = ?', args: [teamId] });
|
|
96
|
+
if (result.rows.length === 0)
|
|
97
|
+
return null;
|
|
98
|
+
return rowToTeam(result.rows[0]);
|
|
99
|
+
}
|
|
100
|
+
export async function getTeamBySlug(slug) {
|
|
101
|
+
const db = getClient();
|
|
102
|
+
const result = await db.execute({ sql: 'SELECT * FROM teams WHERE slug = ?', args: [slug] });
|
|
103
|
+
if (result.rows.length === 0)
|
|
104
|
+
return null;
|
|
105
|
+
return rowToTeam(result.rows[0]);
|
|
106
|
+
}
|
|
107
|
+
export async function listUserTeams(userId) {
|
|
108
|
+
const db = getClient();
|
|
109
|
+
const result = await db.execute({
|
|
110
|
+
sql: `SELECT t.* FROM teams t
|
|
111
|
+
INNER JOIN team_members tm ON tm.team_id = t.id
|
|
112
|
+
WHERE tm.user_id = ?
|
|
113
|
+
ORDER BY t.name`,
|
|
114
|
+
args: [userId],
|
|
115
|
+
});
|
|
116
|
+
return result.rows.map(r => rowToTeam(r));
|
|
117
|
+
}
|
|
118
|
+
export async function updateTeam(teamId, updates) {
|
|
119
|
+
const db = getClient();
|
|
120
|
+
const sets = [];
|
|
121
|
+
const args = [];
|
|
122
|
+
if (updates.name !== undefined) {
|
|
123
|
+
sets.push('name = ?');
|
|
124
|
+
args.push(updates.name);
|
|
125
|
+
}
|
|
126
|
+
if (updates.description !== undefined) {
|
|
127
|
+
sets.push('description = ?');
|
|
128
|
+
args.push(updates.description);
|
|
129
|
+
}
|
|
130
|
+
if (updates.monthlyBudgetUsd !== undefined) {
|
|
131
|
+
sets.push('monthly_budget_usd = ?');
|
|
132
|
+
args.push(updates.monthlyBudgetUsd);
|
|
133
|
+
}
|
|
134
|
+
if (updates.dailyBudgetUsd !== undefined) {
|
|
135
|
+
sets.push('daily_budget_usd = ?');
|
|
136
|
+
args.push(updates.dailyBudgetUsd);
|
|
137
|
+
}
|
|
138
|
+
if (updates.budgetAlertThresholds !== undefined) {
|
|
139
|
+
sets.push('budget_alert_thresholds = ?');
|
|
140
|
+
args.push(JSON.stringify(updates.budgetAlertThresholds));
|
|
141
|
+
}
|
|
142
|
+
if (updates.defaultModel !== undefined) {
|
|
143
|
+
sets.push('default_model = ?');
|
|
144
|
+
args.push(updates.defaultModel);
|
|
145
|
+
}
|
|
146
|
+
if (updates.preferredProviders !== undefined) {
|
|
147
|
+
sets.push('preferred_providers = ?');
|
|
148
|
+
args.push(JSON.stringify(updates.preferredProviders));
|
|
149
|
+
}
|
|
150
|
+
if (updates.smartRoutingEnabled !== undefined) {
|
|
151
|
+
sets.push('smart_routing_enabled = ?');
|
|
152
|
+
args.push(updates.smartRoutingEnabled ? 1 : 0);
|
|
153
|
+
}
|
|
154
|
+
if (sets.length === 0)
|
|
155
|
+
return getTeam(teamId);
|
|
156
|
+
sets.push('updated_at = ?');
|
|
157
|
+
args.push(Math.floor(Date.now() / 1000));
|
|
158
|
+
args.push(teamId);
|
|
159
|
+
await db.execute({ sql: `UPDATE teams SET ${sets.join(', ')} WHERE id = ?`, args });
|
|
160
|
+
return getTeam(teamId);
|
|
161
|
+
}
|
|
162
|
+
export async function deleteTeam(teamId) {
|
|
163
|
+
const db = getClient();
|
|
164
|
+
await db.execute({ sql: 'DELETE FROM teams WHERE id = ?', args: [teamId] });
|
|
165
|
+
log.info('Team deleted', { teamId });
|
|
166
|
+
return true;
|
|
167
|
+
}
|
|
168
|
+
// Member Management
|
|
169
|
+
export async function addMember(teamId, userId, role = 'member', invitedBy) {
|
|
170
|
+
const db = getClient();
|
|
171
|
+
const id = randomUUID();
|
|
172
|
+
const now = Math.floor(Date.now() / 1000);
|
|
173
|
+
await db.execute({
|
|
174
|
+
sql: `INSERT INTO team_members (id, team_id, user_id, role, joined_at, invited_by)
|
|
175
|
+
VALUES (?, ?, ?, ?, ?, ?)`,
|
|
176
|
+
args: [id, teamId, userId, role, now, invitedBy ?? null],
|
|
177
|
+
});
|
|
178
|
+
// Update member count
|
|
179
|
+
await db.execute({
|
|
180
|
+
sql: `UPDATE teams SET member_count = (SELECT COUNT(*) FROM team_members WHERE team_id = ?) WHERE id = ?`,
|
|
181
|
+
args: [teamId, teamId],
|
|
182
|
+
});
|
|
183
|
+
log.info('Member added', { teamId, userId, role });
|
|
184
|
+
return getMember(teamId, userId);
|
|
185
|
+
}
|
|
186
|
+
export async function removeMember(teamId, userId) {
|
|
187
|
+
const db = getClient();
|
|
188
|
+
await db.execute({
|
|
189
|
+
sql: 'DELETE FROM team_members WHERE team_id = ? AND user_id = ? AND role != ?',
|
|
190
|
+
args: [teamId, userId, 'owner'], // can't remove owner
|
|
191
|
+
});
|
|
192
|
+
await db.execute({
|
|
193
|
+
sql: `UPDATE teams SET member_count = (SELECT COUNT(*) FROM team_members WHERE team_id = ?) WHERE id = ?`,
|
|
194
|
+
args: [teamId, teamId],
|
|
195
|
+
});
|
|
196
|
+
return true;
|
|
197
|
+
}
|
|
198
|
+
export async function getMember(teamId, userId) {
|
|
199
|
+
const db = getClient();
|
|
200
|
+
const result = await db.execute({
|
|
201
|
+
sql: 'SELECT * FROM team_members WHERE team_id = ? AND user_id = ?',
|
|
202
|
+
args: [teamId, userId],
|
|
203
|
+
});
|
|
204
|
+
if (result.rows.length === 0)
|
|
205
|
+
return null;
|
|
206
|
+
return rowToMember(result.rows[0]);
|
|
207
|
+
}
|
|
208
|
+
export async function listMembers(teamId) {
|
|
209
|
+
const db = getClient();
|
|
210
|
+
const result = await db.execute({
|
|
211
|
+
sql: 'SELECT * FROM team_members WHERE team_id = ? ORDER BY role, joined_at',
|
|
212
|
+
args: [teamId],
|
|
213
|
+
});
|
|
214
|
+
return result.rows.map(r => rowToMember(r));
|
|
215
|
+
}
|
|
216
|
+
export async function updateMemberRole(teamId, userId, newRole) {
|
|
217
|
+
const db = getClient();
|
|
218
|
+
await db.execute({
|
|
219
|
+
sql: 'UPDATE team_members SET role = ? WHERE team_id = ? AND user_id = ?',
|
|
220
|
+
args: [newRole, teamId, userId],
|
|
221
|
+
});
|
|
222
|
+
return true;
|
|
223
|
+
}
|
|
224
|
+
// Usage Tracking
|
|
225
|
+
export async function recordMemberUsage(teamId, userId, costUsd) {
|
|
226
|
+
const db = getClient();
|
|
227
|
+
const now = Math.floor(Date.now() / 1000);
|
|
228
|
+
await db.execute({
|
|
229
|
+
sql: `UPDATE team_members
|
|
230
|
+
SET total_spent_usd = total_spent_usd + ?,
|
|
231
|
+
request_count = request_count + 1,
|
|
232
|
+
last_active_at = ?
|
|
233
|
+
WHERE team_id = ? AND user_id = ?`,
|
|
234
|
+
args: [costUsd, now, teamId, userId],
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
export async function getTeamUsage(teamId) {
|
|
238
|
+
const team = await getTeam(teamId);
|
|
239
|
+
if (!team)
|
|
240
|
+
throw new Error('Team not found');
|
|
241
|
+
const members = await listMembers(teamId);
|
|
242
|
+
const totalSpent = members.reduce((sum, m) => sum + m.totalSpentUsd, 0);
|
|
243
|
+
const budgetPercent = team.monthlyBudgetUsd > 0
|
|
244
|
+
? Math.round((totalSpent / team.monthlyBudgetUsd) * 100)
|
|
245
|
+
: 0;
|
|
246
|
+
const alertsTriggered = team.budgetAlertThresholds.filter(t => budgetPercent >= t);
|
|
247
|
+
return {
|
|
248
|
+
teamId,
|
|
249
|
+
period: 'monthly',
|
|
250
|
+
totalSpentUsd: totalSpent,
|
|
251
|
+
budgetUsd: team.monthlyBudgetUsd,
|
|
252
|
+
budgetUsedPercent: budgetPercent,
|
|
253
|
+
memberBreakdown: members.map(m => ({
|
|
254
|
+
userId: m.userId,
|
|
255
|
+
spentUsd: m.totalSpentUsd,
|
|
256
|
+
requestCount: m.requestCount,
|
|
257
|
+
})),
|
|
258
|
+
alertsTriggered,
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* Check if a member can make a request (budget check).
|
|
263
|
+
*/
|
|
264
|
+
export async function canMemberSpend(teamId, userId, estimatedCostUsd) {
|
|
265
|
+
const team = await getTeam(teamId);
|
|
266
|
+
if (!team)
|
|
267
|
+
return { allowed: false, reason: 'Team not found' };
|
|
268
|
+
const member = await getMember(teamId, userId);
|
|
269
|
+
if (!member)
|
|
270
|
+
return { allowed: false, reason: 'Not a team member' };
|
|
271
|
+
// Check personal budget
|
|
272
|
+
if (member.personalBudgetUsd && member.totalSpentUsd + estimatedCostUsd > member.personalBudgetUsd) {
|
|
273
|
+
return { allowed: false, reason: `Personal budget exceeded ($${member.totalSpentUsd.toFixed(2)} / $${member.personalBudgetUsd.toFixed(2)})` };
|
|
274
|
+
}
|
|
275
|
+
// Check team budget
|
|
276
|
+
const usage = await getTeamUsage(teamId);
|
|
277
|
+
if (usage.totalSpentUsd + estimatedCostUsd > team.monthlyBudgetUsd) {
|
|
278
|
+
return { allowed: false, reason: `Team monthly budget exceeded ($${usage.totalSpentUsd.toFixed(2)} / $${team.monthlyBudgetUsd.toFixed(2)})` };
|
|
279
|
+
}
|
|
280
|
+
return { allowed: true };
|
|
281
|
+
}
|
|
282
|
+
// Invites
|
|
283
|
+
export async function createInvite(teamId, email, role, invitedBy) {
|
|
284
|
+
const db = getClient();
|
|
285
|
+
const id = randomUUID();
|
|
286
|
+
const expiresAt = Math.floor(Date.now() / 1000) + 7 * 24 * 3600; // 7 days
|
|
287
|
+
await db.execute({
|
|
288
|
+
sql: `INSERT INTO team_invites (id, team_id, email, role, invited_by, expires_at)
|
|
289
|
+
VALUES (?, ?, ?, ?, ?, ?)`,
|
|
290
|
+
args: [id, teamId, email, role, invitedBy, expiresAt],
|
|
291
|
+
});
|
|
292
|
+
return { id, teamId, email, role, invitedBy, expiresAt };
|
|
293
|
+
}
|
|
294
|
+
export async function acceptInvite(inviteId, userId) {
|
|
295
|
+
const db = getClient();
|
|
296
|
+
const now = Math.floor(Date.now() / 1000);
|
|
297
|
+
const result = await db.execute({
|
|
298
|
+
sql: 'SELECT * FROM team_invites WHERE id = ? AND accepted_at IS NULL AND expires_at > ?',
|
|
299
|
+
args: [inviteId, now],
|
|
300
|
+
});
|
|
301
|
+
if (result.rows.length === 0)
|
|
302
|
+
return null;
|
|
303
|
+
const invite = result.rows[0];
|
|
304
|
+
// Mark invite as accepted
|
|
305
|
+
await db.execute({
|
|
306
|
+
sql: 'UPDATE team_invites SET accepted_at = ? WHERE id = ?',
|
|
307
|
+
args: [now, inviteId],
|
|
308
|
+
});
|
|
309
|
+
// Add member
|
|
310
|
+
return addMember(invite.team_id, userId, invite.role, invite.invited_by);
|
|
311
|
+
}
|
|
312
|
+
export async function listTeamInvites(teamId) {
|
|
313
|
+
const db = getClient();
|
|
314
|
+
const result = await db.execute({
|
|
315
|
+
sql: 'SELECT * FROM team_invites WHERE team_id = ? AND accepted_at IS NULL ORDER BY expires_at DESC',
|
|
316
|
+
args: [teamId],
|
|
317
|
+
});
|
|
318
|
+
return result.rows.map(r => {
|
|
319
|
+
const row = r;
|
|
320
|
+
return {
|
|
321
|
+
id: String(row['id']),
|
|
322
|
+
teamId: String(row['team_id']),
|
|
323
|
+
email: String(row['email']),
|
|
324
|
+
role: String(row['role']),
|
|
325
|
+
invitedBy: String(row['invited_by']),
|
|
326
|
+
expiresAt: Number(row['expires_at']),
|
|
327
|
+
acceptedAt: row['accepted_at'] ? Number(row['accepted_at']) : undefined,
|
|
328
|
+
};
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
function rowToTeam(row) {
|
|
332
|
+
return {
|
|
333
|
+
id: row.id,
|
|
334
|
+
name: row.name,
|
|
335
|
+
slug: row.slug,
|
|
336
|
+
description: row.description ?? undefined,
|
|
337
|
+
avatarUrl: row.avatar_url ?? undefined,
|
|
338
|
+
ownerId: row.owner_id,
|
|
339
|
+
monthlyBudgetUsd: row.monthly_budget_usd,
|
|
340
|
+
dailyBudgetUsd: row.daily_budget_usd,
|
|
341
|
+
budgetAlertThresholds: JSON.parse(row.budget_alert_thresholds),
|
|
342
|
+
defaultModel: row.default_model ?? undefined,
|
|
343
|
+
preferredProviders: JSON.parse(row.preferred_providers),
|
|
344
|
+
smartRoutingEnabled: row.smart_routing_enabled === 1,
|
|
345
|
+
memberCount: row.member_count,
|
|
346
|
+
createdAt: row.created_at,
|
|
347
|
+
updatedAt: row.updated_at,
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
function rowToMember(row) {
|
|
351
|
+
return {
|
|
352
|
+
id: row.id,
|
|
353
|
+
teamId: row.team_id,
|
|
354
|
+
userId: row.user_id,
|
|
355
|
+
role: row.role,
|
|
356
|
+
personalBudgetUsd: row.personal_budget_usd ?? undefined,
|
|
357
|
+
preferredModel: row.preferred_model ?? undefined,
|
|
358
|
+
totalSpentUsd: row.total_spent_usd,
|
|
359
|
+
requestCount: row.request_count,
|
|
360
|
+
lastActiveAt: row.last_active_at ?? undefined,
|
|
361
|
+
joinedAt: row.joined_at,
|
|
362
|
+
invitedBy: row.invited_by ?? undefined,
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
//# sourceMappingURL=index.js.map
|
package/dist/tickets/types.d.ts
CHANGED
|
@@ -37,7 +37,7 @@ export declare const ExternalLinkSchema: z.ZodObject<{
|
|
|
37
37
|
id: string;
|
|
38
38
|
createdAt: string;
|
|
39
39
|
ticketId: string;
|
|
40
|
-
platform: "jira" | "linear" | "github" | "
|
|
40
|
+
platform: "jira" | "linear" | "github" | "monday" | "plane";
|
|
41
41
|
externalId: string;
|
|
42
42
|
syncEnabled: boolean;
|
|
43
43
|
syncDirection: "push" | "bidirectional" | "pull";
|
|
@@ -48,7 +48,7 @@ export declare const ExternalLinkSchema: z.ZodObject<{
|
|
|
48
48
|
id: string;
|
|
49
49
|
createdAt: string;
|
|
50
50
|
ticketId: string;
|
|
51
|
-
platform: "jira" | "linear" | "github" | "
|
|
51
|
+
platform: "jira" | "linear" | "github" | "monday" | "plane";
|
|
52
52
|
externalId: string;
|
|
53
53
|
externalUrl?: string | undefined;
|
|
54
54
|
syncEnabled?: boolean | undefined;
|
|
@@ -351,7 +351,7 @@ export declare const TicketSchema: z.ZodObject<{
|
|
|
351
351
|
}, "strip", z.ZodTypeAny, {
|
|
352
352
|
title: string;
|
|
353
353
|
description: string;
|
|
354
|
-
priority: "critical" | "medium" | "none" | "
|
|
354
|
+
priority: "critical" | "medium" | "none" | "low" | "high";
|
|
355
355
|
type: "task" | "feature" | "bug" | "story" | "epic" | "subtask";
|
|
356
356
|
status: "in_progress" | "cancelled" | "backlog" | "done" | "todo" | "in_review";
|
|
357
357
|
labels: string[];
|
|
@@ -377,19 +377,19 @@ export declare const TicketSchema: z.ZodObject<{
|
|
|
377
377
|
aiSessionId?: string | undefined;
|
|
378
378
|
aiTaskId?: string | undefined;
|
|
379
379
|
estimate?: number | undefined;
|
|
380
|
-
estimateUnit?: "
|
|
380
|
+
estimateUnit?: "hours" | "points" | "days" | undefined;
|
|
381
381
|
}, {
|
|
382
382
|
title: string;
|
|
383
383
|
id: string;
|
|
384
384
|
createdAt: string;
|
|
385
385
|
updatedAt: string;
|
|
386
386
|
sequence: number;
|
|
387
|
+
startedAt?: string | undefined;
|
|
387
388
|
description?: string | undefined;
|
|
388
|
-
priority?: "critical" | "medium" | "none" | "
|
|
389
|
+
priority?: "critical" | "medium" | "none" | "low" | "high" | undefined;
|
|
389
390
|
type?: "task" | "feature" | "bug" | "story" | "epic" | "subtask" | undefined;
|
|
390
391
|
status?: "in_progress" | "cancelled" | "backlog" | "done" | "todo" | "in_review" | undefined;
|
|
391
392
|
labels?: string[] | undefined;
|
|
392
|
-
startedAt?: string | undefined;
|
|
393
393
|
completedAt?: string | undefined;
|
|
394
394
|
workspaceId?: string | undefined;
|
|
395
395
|
projectId?: string | undefined;
|
|
@@ -407,7 +407,7 @@ export declare const TicketSchema: z.ZodObject<{
|
|
|
407
407
|
aiSessionId?: string | undefined;
|
|
408
408
|
aiTaskId?: string | undefined;
|
|
409
409
|
estimate?: number | undefined;
|
|
410
|
-
estimateUnit?: "
|
|
410
|
+
estimateUnit?: "hours" | "points" | "days" | undefined;
|
|
411
411
|
}>;
|
|
412
412
|
export type Ticket = z.infer<typeof TicketSchema>;
|
|
413
413
|
export interface TicketWithRelations extends Ticket {
|
|
@@ -447,18 +447,18 @@ export declare const CreateTicketSchema: z.ZodObject<{
|
|
|
447
447
|
externalId: z.ZodString;
|
|
448
448
|
externalUrl: z.ZodOptional<z.ZodString>;
|
|
449
449
|
}, "strip", z.ZodTypeAny, {
|
|
450
|
-
platform: "jira" | "linear" | "github" | "
|
|
450
|
+
platform: "jira" | "linear" | "github" | "monday" | "plane";
|
|
451
451
|
externalId: string;
|
|
452
452
|
externalUrl?: string | undefined;
|
|
453
453
|
}, {
|
|
454
|
-
platform: "jira" | "linear" | "github" | "
|
|
454
|
+
platform: "jira" | "linear" | "github" | "monday" | "plane";
|
|
455
455
|
externalId: string;
|
|
456
456
|
externalUrl?: string | undefined;
|
|
457
457
|
}>>;
|
|
458
458
|
}, "strip", z.ZodTypeAny, {
|
|
459
459
|
title: string;
|
|
460
460
|
description?: string | undefined;
|
|
461
|
-
priority?: "critical" | "medium" | "none" | "
|
|
461
|
+
priority?: "critical" | "medium" | "none" | "low" | "high" | undefined;
|
|
462
462
|
type?: "task" | "feature" | "bug" | "story" | "epic" | "subtask" | undefined;
|
|
463
463
|
status?: "in_progress" | "cancelled" | "backlog" | "done" | "todo" | "in_review" | undefined;
|
|
464
464
|
labels?: string[] | undefined;
|
|
@@ -473,16 +473,16 @@ export declare const CreateTicketSchema: z.ZodObject<{
|
|
|
473
473
|
aiSessionId?: string | undefined;
|
|
474
474
|
aiTaskId?: string | undefined;
|
|
475
475
|
estimate?: number | undefined;
|
|
476
|
-
estimateUnit?: "
|
|
476
|
+
estimateUnit?: "hours" | "points" | "days" | undefined;
|
|
477
477
|
externalLink?: {
|
|
478
|
-
platform: "jira" | "linear" | "github" | "
|
|
478
|
+
platform: "jira" | "linear" | "github" | "monday" | "plane";
|
|
479
479
|
externalId: string;
|
|
480
480
|
externalUrl?: string | undefined;
|
|
481
481
|
} | undefined;
|
|
482
482
|
}, {
|
|
483
483
|
title: string;
|
|
484
484
|
description?: string | undefined;
|
|
485
|
-
priority?: "critical" | "medium" | "none" | "
|
|
485
|
+
priority?: "critical" | "medium" | "none" | "low" | "high" | undefined;
|
|
486
486
|
type?: "task" | "feature" | "bug" | "story" | "epic" | "subtask" | undefined;
|
|
487
487
|
status?: "in_progress" | "cancelled" | "backlog" | "done" | "todo" | "in_review" | undefined;
|
|
488
488
|
labels?: string[] | undefined;
|
|
@@ -497,9 +497,9 @@ export declare const CreateTicketSchema: z.ZodObject<{
|
|
|
497
497
|
aiSessionId?: string | undefined;
|
|
498
498
|
aiTaskId?: string | undefined;
|
|
499
499
|
estimate?: number | undefined;
|
|
500
|
-
estimateUnit?: "
|
|
500
|
+
estimateUnit?: "hours" | "points" | "days" | undefined;
|
|
501
501
|
externalLink?: {
|
|
502
|
-
platform: "jira" | "linear" | "github" | "
|
|
502
|
+
platform: "jira" | "linear" | "github" | "monday" | "plane";
|
|
503
503
|
externalId: string;
|
|
504
504
|
externalUrl?: string | undefined;
|
|
505
505
|
} | undefined;
|
|
@@ -529,18 +529,18 @@ export declare const UpdateTicketSchema: z.ZodObject<{
|
|
|
529
529
|
externalId: z.ZodString;
|
|
530
530
|
externalUrl: z.ZodOptional<z.ZodString>;
|
|
531
531
|
}, "strip", z.ZodTypeAny, {
|
|
532
|
-
platform: "jira" | "linear" | "github" | "
|
|
532
|
+
platform: "jira" | "linear" | "github" | "monday" | "plane";
|
|
533
533
|
externalId: string;
|
|
534
534
|
externalUrl?: string | undefined;
|
|
535
535
|
}, {
|
|
536
|
-
platform: "jira" | "linear" | "github" | "
|
|
536
|
+
platform: "jira" | "linear" | "github" | "monday" | "plane";
|
|
537
537
|
externalId: string;
|
|
538
538
|
externalUrl?: string | undefined;
|
|
539
539
|
}>>>;
|
|
540
540
|
}, "strip", z.ZodTypeAny, {
|
|
541
541
|
title?: string | undefined;
|
|
542
542
|
description?: string | undefined;
|
|
543
|
-
priority?: "critical" | "medium" | "none" | "
|
|
543
|
+
priority?: "critical" | "medium" | "none" | "low" | "high" | undefined;
|
|
544
544
|
type?: "task" | "feature" | "bug" | "story" | "epic" | "subtask" | undefined;
|
|
545
545
|
status?: "in_progress" | "cancelled" | "backlog" | "done" | "todo" | "in_review" | undefined;
|
|
546
546
|
labels?: string[] | undefined;
|
|
@@ -555,16 +555,16 @@ export declare const UpdateTicketSchema: z.ZodObject<{
|
|
|
555
555
|
aiSessionId?: string | undefined;
|
|
556
556
|
aiTaskId?: string | undefined;
|
|
557
557
|
estimate?: number | undefined;
|
|
558
|
-
estimateUnit?: "
|
|
558
|
+
estimateUnit?: "hours" | "points" | "days" | undefined;
|
|
559
559
|
externalLink?: {
|
|
560
|
-
platform: "jira" | "linear" | "github" | "
|
|
560
|
+
platform: "jira" | "linear" | "github" | "monday" | "plane";
|
|
561
561
|
externalId: string;
|
|
562
562
|
externalUrl?: string | undefined;
|
|
563
563
|
} | undefined;
|
|
564
564
|
}, {
|
|
565
565
|
title?: string | undefined;
|
|
566
566
|
description?: string | undefined;
|
|
567
|
-
priority?: "critical" | "medium" | "none" | "
|
|
567
|
+
priority?: "critical" | "medium" | "none" | "low" | "high" | undefined;
|
|
568
568
|
type?: "task" | "feature" | "bug" | "story" | "epic" | "subtask" | undefined;
|
|
569
569
|
status?: "in_progress" | "cancelled" | "backlog" | "done" | "todo" | "in_review" | undefined;
|
|
570
570
|
labels?: string[] | undefined;
|
|
@@ -579,9 +579,9 @@ export declare const UpdateTicketSchema: z.ZodObject<{
|
|
|
579
579
|
aiSessionId?: string | undefined;
|
|
580
580
|
aiTaskId?: string | undefined;
|
|
581
581
|
estimate?: number | undefined;
|
|
582
|
-
estimateUnit?: "
|
|
582
|
+
estimateUnit?: "hours" | "points" | "days" | undefined;
|
|
583
583
|
externalLink?: {
|
|
584
|
-
platform: "jira" | "linear" | "github" | "
|
|
584
|
+
platform: "jira" | "linear" | "github" | "monday" | "plane";
|
|
585
585
|
externalId: string;
|
|
586
586
|
externalUrl?: string | undefined;
|
|
587
587
|
} | undefined;
|
|
@@ -613,18 +613,18 @@ export declare const BulkUpdateTicketsSchema: z.ZodObject<{
|
|
|
613
613
|
externalId: z.ZodString;
|
|
614
614
|
externalUrl: z.ZodOptional<z.ZodString>;
|
|
615
615
|
}, "strip", z.ZodTypeAny, {
|
|
616
|
-
platform: "jira" | "linear" | "github" | "
|
|
616
|
+
platform: "jira" | "linear" | "github" | "monday" | "plane";
|
|
617
617
|
externalId: string;
|
|
618
618
|
externalUrl?: string | undefined;
|
|
619
619
|
}, {
|
|
620
|
-
platform: "jira" | "linear" | "github" | "
|
|
620
|
+
platform: "jira" | "linear" | "github" | "monday" | "plane";
|
|
621
621
|
externalId: string;
|
|
622
622
|
externalUrl?: string | undefined;
|
|
623
623
|
}>>>;
|
|
624
624
|
}, "strip", z.ZodTypeAny, {
|
|
625
625
|
title?: string | undefined;
|
|
626
626
|
description?: string | undefined;
|
|
627
|
-
priority?: "critical" | "medium" | "none" | "
|
|
627
|
+
priority?: "critical" | "medium" | "none" | "low" | "high" | undefined;
|
|
628
628
|
type?: "task" | "feature" | "bug" | "story" | "epic" | "subtask" | undefined;
|
|
629
629
|
status?: "in_progress" | "cancelled" | "backlog" | "done" | "todo" | "in_review" | undefined;
|
|
630
630
|
labels?: string[] | undefined;
|
|
@@ -639,16 +639,16 @@ export declare const BulkUpdateTicketsSchema: z.ZodObject<{
|
|
|
639
639
|
aiSessionId?: string | undefined;
|
|
640
640
|
aiTaskId?: string | undefined;
|
|
641
641
|
estimate?: number | undefined;
|
|
642
|
-
estimateUnit?: "
|
|
642
|
+
estimateUnit?: "hours" | "points" | "days" | undefined;
|
|
643
643
|
externalLink?: {
|
|
644
|
-
platform: "jira" | "linear" | "github" | "
|
|
644
|
+
platform: "jira" | "linear" | "github" | "monday" | "plane";
|
|
645
645
|
externalId: string;
|
|
646
646
|
externalUrl?: string | undefined;
|
|
647
647
|
} | undefined;
|
|
648
648
|
}, {
|
|
649
649
|
title?: string | undefined;
|
|
650
650
|
description?: string | undefined;
|
|
651
|
-
priority?: "critical" | "medium" | "none" | "
|
|
651
|
+
priority?: "critical" | "medium" | "none" | "low" | "high" | undefined;
|
|
652
652
|
type?: "task" | "feature" | "bug" | "story" | "epic" | "subtask" | undefined;
|
|
653
653
|
status?: "in_progress" | "cancelled" | "backlog" | "done" | "todo" | "in_review" | undefined;
|
|
654
654
|
labels?: string[] | undefined;
|
|
@@ -663,9 +663,9 @@ export declare const BulkUpdateTicketsSchema: z.ZodObject<{
|
|
|
663
663
|
aiSessionId?: string | undefined;
|
|
664
664
|
aiTaskId?: string | undefined;
|
|
665
665
|
estimate?: number | undefined;
|
|
666
|
-
estimateUnit?: "
|
|
666
|
+
estimateUnit?: "hours" | "points" | "days" | undefined;
|
|
667
667
|
externalLink?: {
|
|
668
|
-
platform: "jira" | "linear" | "github" | "
|
|
668
|
+
platform: "jira" | "linear" | "github" | "monday" | "plane";
|
|
669
669
|
externalId: string;
|
|
670
670
|
externalUrl?: string | undefined;
|
|
671
671
|
} | undefined;
|
|
@@ -674,7 +674,7 @@ export declare const BulkUpdateTicketsSchema: z.ZodObject<{
|
|
|
674
674
|
updates: {
|
|
675
675
|
title?: string | undefined;
|
|
676
676
|
description?: string | undefined;
|
|
677
|
-
priority?: "critical" | "medium" | "none" | "
|
|
677
|
+
priority?: "critical" | "medium" | "none" | "low" | "high" | undefined;
|
|
678
678
|
type?: "task" | "feature" | "bug" | "story" | "epic" | "subtask" | undefined;
|
|
679
679
|
status?: "in_progress" | "cancelled" | "backlog" | "done" | "todo" | "in_review" | undefined;
|
|
680
680
|
labels?: string[] | undefined;
|
|
@@ -689,9 +689,9 @@ export declare const BulkUpdateTicketsSchema: z.ZodObject<{
|
|
|
689
689
|
aiSessionId?: string | undefined;
|
|
690
690
|
aiTaskId?: string | undefined;
|
|
691
691
|
estimate?: number | undefined;
|
|
692
|
-
estimateUnit?: "
|
|
692
|
+
estimateUnit?: "hours" | "points" | "days" | undefined;
|
|
693
693
|
externalLink?: {
|
|
694
|
-
platform: "jira" | "linear" | "github" | "
|
|
694
|
+
platform: "jira" | "linear" | "github" | "monday" | "plane";
|
|
695
695
|
externalId: string;
|
|
696
696
|
externalUrl?: string | undefined;
|
|
697
697
|
} | undefined;
|
|
@@ -701,7 +701,7 @@ export declare const BulkUpdateTicketsSchema: z.ZodObject<{
|
|
|
701
701
|
updates: {
|
|
702
702
|
title?: string | undefined;
|
|
703
703
|
description?: string | undefined;
|
|
704
|
-
priority?: "critical" | "medium" | "none" | "
|
|
704
|
+
priority?: "critical" | "medium" | "none" | "low" | "high" | undefined;
|
|
705
705
|
type?: "task" | "feature" | "bug" | "story" | "epic" | "subtask" | undefined;
|
|
706
706
|
status?: "in_progress" | "cancelled" | "backlog" | "done" | "todo" | "in_review" | undefined;
|
|
707
707
|
labels?: string[] | undefined;
|
|
@@ -716,9 +716,9 @@ export declare const BulkUpdateTicketsSchema: z.ZodObject<{
|
|
|
716
716
|
aiSessionId?: string | undefined;
|
|
717
717
|
aiTaskId?: string | undefined;
|
|
718
718
|
estimate?: number | undefined;
|
|
719
|
-
estimateUnit?: "
|
|
719
|
+
estimateUnit?: "hours" | "points" | "days" | undefined;
|
|
720
720
|
externalLink?: {
|
|
721
|
-
platform: "jira" | "linear" | "github" | "
|
|
721
|
+
platform: "jira" | "linear" | "github" | "monday" | "plane";
|
|
722
722
|
externalId: string;
|
|
723
723
|
externalUrl?: string | undefined;
|
|
724
724
|
} | undefined;
|
|
@@ -761,7 +761,7 @@ export declare const TicketQuerySchema: z.ZodObject<{
|
|
|
761
761
|
cursorId: z.ZodOptional<z.ZodString>;
|
|
762
762
|
}, "strip", z.ZodTypeAny, {
|
|
763
763
|
search?: string | undefined;
|
|
764
|
-
priority?: "critical" | "medium" | "none" | "
|
|
764
|
+
priority?: "critical" | "medium" | "none" | "low" | "high" | ("critical" | "medium" | "none" | "low" | "high")[] | undefined;
|
|
765
765
|
type?: "task" | "feature" | "bug" | "story" | "epic" | "subtask" | ("task" | "feature" | "bug" | "story" | "epic" | "subtask")[] | undefined;
|
|
766
766
|
status?: "in_progress" | "cancelled" | "backlog" | "done" | "todo" | "in_review" | ("in_progress" | "cancelled" | "backlog" | "done" | "todo" | "in_review")[] | undefined;
|
|
767
767
|
labels?: string[] | undefined;
|
|
@@ -786,7 +786,7 @@ export declare const TicketQuerySchema: z.ZodObject<{
|
|
|
786
786
|
includeArchived?: boolean | undefined;
|
|
787
787
|
}, {
|
|
788
788
|
search?: string | undefined;
|
|
789
|
-
priority?: "critical" | "medium" | "none" | "
|
|
789
|
+
priority?: "critical" | "medium" | "none" | "low" | "high" | ("critical" | "medium" | "none" | "low" | "high")[] | undefined;
|
|
790
790
|
type?: "task" | "feature" | "bug" | "story" | "epic" | "subtask" | ("task" | "feature" | "bug" | "story" | "epic" | "subtask")[] | undefined;
|
|
791
791
|
status?: "in_progress" | "cancelled" | "backlog" | "done" | "todo" | "in_review" | ("in_progress" | "cancelled" | "backlog" | "done" | "todo" | "in_review")[] | undefined;
|
|
792
792
|
labels?: string[] | undefined;
|