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.
Files changed (477) hide show
  1. package/.env.example +14 -2
  2. package/CHANGELOG.md +37 -0
  3. package/CONTRIBUTING.md +20 -0
  4. package/Dockerfile +39 -23
  5. package/README.md +174 -40
  6. package/dist/agents/agent-summary.d.ts +44 -0
  7. package/dist/agents/agent-summary.js +176 -0
  8. package/dist/agents/auto-memory.d.ts +59 -0
  9. package/dist/agents/auto-memory.js +310 -0
  10. package/dist/agents/checkpoint-manager.d.ts +76 -0
  11. package/dist/agents/checkpoint-manager.js +156 -0
  12. package/dist/agents/circuit-breaker.d.ts +54 -0
  13. package/dist/agents/circuit-breaker.js +153 -0
  14. package/dist/agents/context-compactor.d.ts +70 -0
  15. package/dist/agents/context-compactor.js +361 -0
  16. package/dist/agents/conversation-branch.d.ts +55 -0
  17. package/dist/agents/conversation-branch.js +115 -0
  18. package/dist/agents/error-recovery.d.ts +44 -0
  19. package/dist/agents/error-recovery.js +197 -0
  20. package/dist/agents/events.d.ts +76 -0
  21. package/dist/agents/events.js +8 -0
  22. package/dist/agents/executor.d.ts +35 -1
  23. package/dist/agents/executor.js +573 -124
  24. package/dist/agents/file-snapshots.d.ts +72 -0
  25. package/dist/agents/file-snapshots.js +182 -0
  26. package/dist/agents/index.d.ts +2 -0
  27. package/dist/agents/orchestrator.d.ts +183 -0
  28. package/dist/agents/orchestrator.js +495 -0
  29. package/dist/agents/permissions.d.ts +63 -0
  30. package/dist/agents/permissions.js +138 -0
  31. package/dist/agents/plan-mode.d.ts +71 -0
  32. package/dist/agents/plan-mode.js +186 -0
  33. package/dist/agents/prompt-suggestions.d.ts +33 -0
  34. package/dist/agents/prompt-suggestions.js +208 -0
  35. package/dist/agents/rate-limit-monitor.d.ts +56 -0
  36. package/dist/agents/rate-limit-monitor.js +224 -0
  37. package/dist/agents/result-store.d.ts +37 -0
  38. package/dist/agents/result-store.js +104 -0
  39. package/dist/agents/session-diff.d.ts +43 -0
  40. package/dist/agents/session-diff.js +258 -0
  41. package/dist/agents/tool-loader.d.ts +65 -0
  42. package/dist/agents/tool-loader.js +273 -0
  43. package/dist/agents/transcript.d.ts +96 -0
  44. package/dist/agents/transcript.js +267 -0
  45. package/dist/agents/worktree-manager.d.ts +80 -0
  46. package/dist/agents/worktree-manager.js +203 -0
  47. package/dist/auth/middleware.js +14 -0
  48. package/dist/chat/agentic-executor.d.ts +7 -0
  49. package/dist/chat/agentic-executor.js +253 -30
  50. package/dist/chat/conversations.d.ts +2 -0
  51. package/dist/chat/conversations.js +8 -0
  52. package/dist/chat/execution/executor.d.ts +8 -0
  53. package/dist/chat/execution/executor.js +157 -103
  54. package/dist/chat/execution/index.js +5 -1
  55. package/dist/chat/execution/tool-router.js +40 -14
  56. package/dist/chat/execution/tools/canvas.d.ts +2 -2
  57. package/dist/chat/execution/tools/code-tools.d.ts +66 -0
  58. package/dist/chat/execution/tools/code-tools.js +353 -0
  59. package/dist/chat/execution/tools/complete-task.d.ts +2 -2
  60. package/dist/chat/execution/tools/cron-tool.d.ts +26 -10
  61. package/dist/chat/execution/tools/cron-tool.js +48 -3
  62. package/dist/chat/execution/tools/decompose-task.d.ts +58 -0
  63. package/dist/chat/execution/tools/decompose-task.js +166 -0
  64. package/dist/chat/execution/tools/exec.d.ts +5 -2
  65. package/dist/chat/execution/tools/exec.js +294 -155
  66. package/dist/chat/execution/tools/feed-tools.d.ts +77 -0
  67. package/dist/chat/execution/tools/feed-tools.js +142 -0
  68. package/dist/chat/execution/tools/file-ops.d.ts +1 -1
  69. package/dist/chat/execution/tools/github.d.ts +2 -2
  70. package/dist/chat/execution/tools/index.d.ts +14 -2
  71. package/dist/chat/execution/tools/index.js +86 -12
  72. package/dist/chat/execution/tools/integrations.d.ts +8 -8
  73. package/dist/chat/execution/tools/multi-patch.d.ts +53 -0
  74. package/dist/chat/execution/tools/multi-patch.js +373 -0
  75. package/dist/chat/execution/tools/openai-image-gen.d.ts +2 -2
  76. package/dist/chat/execution/tools/plan-tools.d.ts +80 -0
  77. package/dist/chat/execution/tools/plan-tools.js +134 -0
  78. package/dist/chat/execution/tools/profclaw-ops.d.ts +6 -6
  79. package/dist/chat/execution/tools/repl-tool.d.ts +46 -0
  80. package/dist/chat/execution/tools/repl-tool.js +207 -0
  81. package/dist/chat/execution/tools/sessions-send.d.ts +2 -2
  82. package/dist/chat/execution/tools/slack-actions.d.ts +2 -2
  83. package/dist/chat/execution/tools/system.d.ts +4 -4
  84. package/dist/chat/execution/tools/todo-tool.d.ts +72 -0
  85. package/dist/chat/execution/tools/todo-tool.js +152 -0
  86. package/dist/chat/execution/tools/tool-search.d.ts +50 -0
  87. package/dist/chat/execution/tools/tool-search.js +155 -0
  88. package/dist/chat/execution/types.d.ts +21 -14
  89. package/dist/chat/execution/workflows/executor.d.ts +11 -0
  90. package/dist/chat/execution/workflows/executor.js +99 -1
  91. package/dist/chat/execution/workflows/types.d.ts +35 -2
  92. package/dist/chat/format/index.d.ts +1 -0
  93. package/dist/chat/format/index.js +1 -0
  94. package/dist/chat/format/markdown-convert.d.ts +23 -0
  95. package/dist/chat/format/markdown-convert.js +149 -0
  96. package/dist/chat/index.d.ts +1 -1
  97. package/dist/chat/index.js +1 -1
  98. package/dist/chat/message-handler.js +58 -6
  99. package/dist/chat/proactive/index.d.ts +62 -0
  100. package/dist/chat/proactive/index.js +147 -0
  101. package/dist/chat/prompt-adapter.js +2 -0
  102. package/dist/chat/providers/irc/index.d.ts +2 -2
  103. package/dist/chat/providers/telegram/index.d.ts +2 -0
  104. package/dist/chat/providers/telegram/index.js +21 -2
  105. package/dist/chat/system-prompts.d.ts +3 -3
  106. package/dist/chat/system-prompts.js +116 -61
  107. package/dist/chat/tools.d.ts +6 -6
  108. package/dist/cli/commands/auth.js +64 -1
  109. package/dist/cli/commands/chat.js +1327 -138
  110. package/dist/cli/commands/doctor.js +222 -16
  111. package/dist/cli/commands/history.d.ts +3 -0
  112. package/dist/cli/commands/history.js +138 -0
  113. package/dist/cli/commands/import.d.ts +44 -0
  114. package/dist/cli/commands/import.js +526 -0
  115. package/dist/cli/commands/init.d.ts +13 -0
  116. package/dist/cli/commands/init.js +381 -0
  117. package/dist/cli/commands/onboard.js +210 -30
  118. package/dist/cli/commands/plan.d.ts +13 -0
  119. package/dist/cli/commands/plan.js +184 -0
  120. package/dist/cli/commands/serve.d.ts +7 -0
  121. package/dist/cli/commands/serve.js +77 -18
  122. package/dist/cli/commands/setup.js +84 -3
  123. package/dist/cli/commands/status.js +54 -0
  124. package/dist/cli/commands/tools.js +13 -13
  125. package/dist/cli/commands/tui.js +26 -1
  126. package/dist/cli/index.js +19 -0
  127. package/dist/cli/ink/App.d.ts +13 -0
  128. package/dist/cli/ink/App.js +6 -0
  129. package/dist/cli/ink/ChatApp.d.ts +60 -0
  130. package/dist/cli/ink/ChatApp.js +325 -0
  131. package/dist/cli/ink/DashboardApp.d.ts +3 -0
  132. package/dist/cli/ink/DashboardApp.js +143 -0
  133. package/dist/cli/ink/components/AgentStatus.d.ts +17 -0
  134. package/dist/cli/ink/components/AgentStatus.js +33 -0
  135. package/dist/cli/ink/components/ChannelList.d.ts +17 -0
  136. package/dist/cli/ink/components/ChannelList.js +33 -0
  137. package/dist/cli/ink/components/ConnectionStatus.d.ts +19 -0
  138. package/dist/cli/ink/components/ConnectionStatus.js +50 -0
  139. package/dist/cli/ink/components/CostBar.d.ts +19 -0
  140. package/dist/cli/ink/components/CostBar.js +35 -0
  141. package/dist/cli/ink/components/HookStatus.d.ts +15 -0
  142. package/dist/cli/ink/components/HookStatus.js +7 -0
  143. package/dist/cli/ink/components/PermissionPrompt.d.ts +21 -0
  144. package/dist/cli/ink/components/PermissionPrompt.js +51 -0
  145. package/dist/cli/ink/components/PlanView.d.ts +23 -0
  146. package/dist/cli/ink/components/PlanView.js +26 -0
  147. package/dist/cli/ink/components/ProviderList.d.ts +16 -0
  148. package/dist/cli/ink/components/ProviderList.js +16 -0
  149. package/dist/cli/ink/components/SessionHeader.d.ts +15 -0
  150. package/dist/cli/ink/components/SessionHeader.js +15 -0
  151. package/dist/cli/ink/components/StreamingMessage.d.ts +20 -0
  152. package/dist/cli/ink/components/StreamingMessage.js +27 -0
  153. package/dist/cli/ink/components/SuggestionBar.d.ts +15 -0
  154. package/dist/cli/ink/components/SuggestionBar.js +28 -0
  155. package/dist/cli/ink/components/SystemHealth.d.ts +20 -0
  156. package/dist/cli/ink/components/SystemHealth.js +39 -0
  157. package/dist/cli/ink/components/TaskList.d.ts +17 -0
  158. package/dist/cli/ink/components/TaskList.js +59 -0
  159. package/dist/cli/ink/components/ToolCall.d.ts +17 -0
  160. package/dist/cli/ink/components/ToolCall.js +43 -0
  161. package/dist/cli/ink/index.d.ts +23 -0
  162. package/dist/cli/ink/index.js +15 -0
  163. package/dist/cli/ink/keybindings.d.ts +35 -0
  164. package/dist/cli/ink/keybindings.js +105 -0
  165. package/dist/cli/ink/markdown-renderer.d.ts +47 -0
  166. package/dist/cli/ink/markdown-renderer.js +380 -0
  167. package/dist/cli/ink/output-styles.d.ts +39 -0
  168. package/dist/cli/ink/output-styles.js +119 -0
  169. package/dist/cli/interactive/auto-serve.d.ts +38 -0
  170. package/dist/cli/interactive/auto-serve.js +209 -0
  171. package/dist/cli/interactive/index.d.ts +25 -0
  172. package/dist/cli/interactive/index.js +23 -0
  173. package/dist/cli/interactive/picker.d.ts +28 -0
  174. package/dist/cli/interactive/picker.js +153 -0
  175. package/dist/cli/interactive/renderer.d.ts +26 -0
  176. package/dist/cli/interactive/renderer.js +555 -0
  177. package/dist/cli/interactive/repl.d.ts +14 -0
  178. package/dist/cli/interactive/repl.js +1516 -0
  179. package/dist/cli/interactive/stream-client.d.ts +59 -0
  180. package/dist/cli/interactive/stream-client.js +506 -0
  181. package/dist/cli/interactive/types.d.ts +121 -0
  182. package/dist/cli/interactive/types.js +10 -0
  183. package/dist/cli/utils/api.d.ts +9 -0
  184. package/dist/cli/utils/api.js +58 -2
  185. package/dist/cron/natural-language.d.ts +54 -0
  186. package/dist/cron/natural-language.js +569 -0
  187. package/dist/cron/scheduler.d.ts +34 -4
  188. package/dist/cron/scheduler.js +141 -9
  189. package/dist/cron/templates.d.ts +1 -1
  190. package/dist/cron/templates.js +219 -0
  191. package/dist/feeds/feed-engine.d.ts +149 -0
  192. package/dist/feeds/feed-engine.js +600 -0
  193. package/dist/feeds/index.d.ts +9 -0
  194. package/dist/feeds/index.js +8 -0
  195. package/dist/gateway/router.js +6 -1
  196. package/dist/hooks/built-in/audit-log.d.ts +11 -0
  197. package/dist/hooks/built-in/audit-log.js +84 -0
  198. package/dist/hooks/built-in/cost-warning.d.ts +10 -0
  199. package/dist/hooks/built-in/cost-warning.js +59 -0
  200. package/dist/hooks/built-in/dangerous-tool.d.ts +32 -0
  201. package/dist/hooks/built-in/dangerous-tool.js +80 -0
  202. package/dist/hooks/built-in/index.d.ts +14 -0
  203. package/dist/hooks/built-in/index.js +20 -0
  204. package/dist/hooks/index.d.ts +3 -0
  205. package/dist/hooks/index.js +6 -0
  206. package/dist/hooks/loader.d.ts +17 -0
  207. package/dist/hooks/loader.js +142 -0
  208. package/dist/hooks/registry.d.ts +62 -0
  209. package/dist/hooks/registry.js +127 -0
  210. package/dist/integrations/web-search.js +6 -3
  211. package/dist/memory/index.d.ts +1 -0
  212. package/dist/memory/index.js +2 -0
  213. package/dist/memory/memory-service.js +14 -13
  214. package/dist/memory/observational.d.ts +62 -0
  215. package/dist/memory/observational.js +396 -0
  216. package/dist/middleware/content-filter.d.ts +22 -0
  217. package/dist/middleware/content-filter.js +69 -0
  218. package/dist/middleware/request-validator.d.ts +159 -0
  219. package/dist/middleware/request-validator.js +93 -0
  220. package/dist/plugins/sdk.d.ts +22 -0
  221. package/dist/plugins/sdk.js +17 -1
  222. package/dist/projects/types.d.ts +10 -10
  223. package/dist/providers/ai-sdk.d.ts +11 -0
  224. package/dist/providers/ai-sdk.js +78 -19
  225. package/dist/providers/core/models.js +67 -1
  226. package/dist/providers/core/types.d.ts +3 -0
  227. package/dist/providers/index.d.ts +1 -0
  228. package/dist/providers/index.js +1 -0
  229. package/dist/providers/smart-router.d.ts +118 -0
  230. package/dist/providers/smart-router.js +685 -0
  231. package/dist/providers/types.d.ts +16 -16
  232. package/dist/routes/agents.js +50 -0
  233. package/dist/routes/auth.js +8 -1
  234. package/dist/routes/chat.js +259 -14
  235. package/dist/routes/costs.js +32 -0
  236. package/dist/routes/cron.js +80 -5
  237. package/dist/routes/feeds.d.ts +10 -0
  238. package/dist/routes/feeds.js +168 -0
  239. package/dist/routes/mcp.js +21 -0
  240. package/dist/routes/memory.js +130 -0
  241. package/dist/routes/skills.js +129 -0
  242. package/dist/routes/teams.d.ts +9 -0
  243. package/dist/routes/teams.js +210 -0
  244. package/dist/routes/tools.js +14 -0
  245. package/dist/routes/users.js +2 -0
  246. package/dist/server/route-loader.js +3 -1
  247. package/dist/server/stream-bridge.d.ts +19 -0
  248. package/dist/server/stream-bridge.js +38 -0
  249. package/dist/server.js +310 -36
  250. package/dist/skills/marketplace.d.ts +87 -0
  251. package/dist/skills/marketplace.js +268 -0
  252. package/dist/storage/index.d.ts +14 -0
  253. package/dist/storage/index.js +64 -3
  254. package/dist/storage/schema.d.ts +4 -4
  255. package/dist/storage/schema.js +1 -1
  256. package/dist/teams/index.d.ts +110 -0
  257. package/dist/teams/index.js +365 -0
  258. package/dist/tickets/types.d.ts +39 -39
  259. package/dist/types/summary.d.ts +5 -5
  260. package/dist/utils/auto-update.d.ts +23 -0
  261. package/dist/utils/auto-update.js +157 -0
  262. package/dist/utils/offline-detect.d.ts +55 -0
  263. package/dist/utils/offline-detect.js +121 -0
  264. package/dist/utils/pid-file.d.ts +36 -0
  265. package/dist/utils/pid-file.js +125 -0
  266. package/dist/utils/prevent-sleep.d.ts +27 -0
  267. package/dist/utils/prevent-sleep.js +95 -0
  268. package/dist/utils/sanitizer.d.ts +57 -0
  269. package/dist/utils/sanitizer.js +174 -0
  270. package/docker-compose.yml +13 -137
  271. package/package.json +31 -6
  272. package/skills/deploy-cloudflare/SKILL.md +62 -0
  273. package/skills/deploy-vercel/SKILL.md +67 -0
  274. package/skills/docker-deploy/SKILL.md +158 -0
  275. package/skills/full-stack-builder/SKILL.md +92 -0
  276. package/skills/humanizer/SKILL.md +488 -0
  277. package/skills/profclaw-assistant/SKILL.md +85 -56
  278. package/ui/dist/assets/ActivityView-Da6HQ8ws.js +1 -0
  279. package/ui/dist/assets/AgentList-H58R0kX3.js +1 -0
  280. package/ui/dist/assets/AnalyticsDashboard-B28AeRsc.js +1 -0
  281. package/ui/dist/assets/AreaChart-DwLzeAQ8.js +1 -0
  282. package/ui/dist/assets/CartesianChart-piKQsTAR.js +36 -0
  283. package/ui/dist/assets/ChatView-Dbj8rxU5.js +10 -0
  284. package/ui/dist/assets/CostsDashboard-C6F5df0F.js +1 -0
  285. package/ui/dist/assets/EstimateSelect-wga0rUKX.js +1 -0
  286. package/ui/dist/assets/FeedDashboard-Ef6FEzEf.js +1 -0
  287. package/ui/dist/assets/FloatingChatbot-0yhkUeCq.js +2 -0
  288. package/ui/dist/assets/InviteCodeManagement-tUXfx4Bc.js +2 -0
  289. package/ui/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  290. package/ui/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  291. package/ui/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  292. package/ui/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  293. package/ui/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  294. package/ui/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  295. package/ui/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  296. package/ui/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  297. package/ui/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  298. package/ui/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  299. package/ui/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  300. package/ui/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  301. package/ui/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  302. package/ui/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  303. package/ui/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  304. package/ui/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  305. package/ui/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  306. package/ui/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  307. package/ui/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  308. package/ui/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  309. package/ui/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  310. package/ui/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  311. package/ui/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  312. package/ui/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  313. package/ui/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  314. package/ui/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  315. package/ui/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  316. package/ui/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  317. package/ui/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  318. package/ui/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  319. package/ui/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  320. package/ui/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  321. package/ui/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  322. package/ui/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  323. package/ui/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  324. package/ui/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  325. package/ui/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  326. package/ui/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  327. package/ui/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  328. package/ui/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  329. package/ui/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  330. package/ui/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  331. package/ui/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  332. package/ui/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  333. package/ui/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  334. package/ui/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  335. package/ui/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  336. package/ui/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  337. package/ui/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  338. package/ui/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  339. package/ui/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  340. package/ui/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  341. package/ui/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  342. package/ui/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  343. package/ui/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  344. package/ui/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  345. package/ui/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  346. package/ui/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  347. package/ui/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  348. package/ui/dist/assets/MarketplacePage-DGrLtolR.js +1 -0
  349. package/ui/dist/assets/{ProjectDetail--gPfvATB.js → ProjectDetail-BgWvA6UP.js} +2 -2
  350. package/ui/dist/assets/ProjectIcon-TDuliqwg.js +1 -0
  351. package/ui/dist/assets/ProjectList-DXgM4187.js +1 -0
  352. package/ui/dist/assets/{Settings-1kaf7VHE.js → Settings-xA8Zhi3p.js} +3 -3
  353. package/ui/dist/assets/StatusIndicator-B8vfFAxg.js +1 -0
  354. package/ui/dist/assets/{SummaryDetail-DV3AmONk.js → SummaryDetail-eedRfTtF.js} +2 -2
  355. package/ui/dist/assets/SummaryList-CLNX2P84.js +1 -0
  356. package/ui/dist/assets/TaskDetail-BtWclNiR.js +1 -0
  357. package/ui/dist/assets/TaskList-JjODAgSc.js +1 -0
  358. package/ui/dist/assets/TeamsPage-CBK5iAyx.js +1 -0
  359. package/ui/dist/assets/TicketBoard-C9aJNNYp.js +1 -0
  360. package/ui/dist/assets/TicketDetail-CV5JmL31.js +1 -0
  361. package/ui/dist/assets/TicketList-68V4lzUz.js +1 -0
  362. package/ui/dist/assets/UserManagement-DKTb6UpE.js +2 -0
  363. package/ui/dist/assets/ViewSwitcher-BvdQht2Y.js +1 -0
  364. package/ui/dist/assets/alert-dialog-O6qBOv_f.js +1 -0
  365. package/ui/dist/assets/{archive-BsLa7brF.js → archive-CX7UvZpf.js} +1 -1
  366. package/ui/dist/assets/badge-BbfnwDJP.js +1 -0
  367. package/ui/dist/assets/{bug-CmZI7jqM.js → bug-3WX0394-.js} +1 -1
  368. package/ui/dist/assets/{calendar-Bf0t2B82.js → calendar-buq77TaS.js} +1 -1
  369. package/ui/dist/assets/{chevron-up-CoUsOvZj.js → chevron-up-4ymsBJRo.js} +1 -1
  370. package/ui/dist/assets/{circle-x-Dgw11LgT.js → circle-x-ByXtwR6Y.js} +1 -1
  371. package/ui/dist/assets/constants-CVdDh7p0.js +1 -0
  372. package/ui/dist/assets/{cpu-DiPMQICV.js → cpu-CiuoCeDY.js} +1 -1
  373. package/ui/dist/assets/{database-BwTfupDi.js → database-BWXSBg5a.js} +1 -1
  374. package/ui/dist/assets/dialog-lDg4NvMV.js +1 -0
  375. package/ui/dist/assets/dollar-sign-Dmijd6DP.js +1 -0
  376. package/ui/dist/assets/{ellipsis-UJx4Xnf6.js → ellipsis-vT-5SVIp.js} +1 -1
  377. package/ui/dist/assets/{ellipsis-vertical-DoULYEKn.js → ellipsis-vertical-B4tAX_bL.js} +1 -1
  378. package/ui/dist/assets/feature-markdown-DBo5Q7uq.js +289 -0
  379. package/ui/dist/assets/{file-code-B2UrJLwi.js → file-code-ChOWdKXf.js} +1 -1
  380. package/ui/dist/assets/{folder-open-BJi577JH.js → folder-open-CkOUbIiP.js} +1 -1
  381. package/ui/dist/assets/{funnel-PkaD_HSR.js → funnel-uZkoSPP-.js} +1 -1
  382. package/ui/dist/assets/{git-branch-C_K30am0.js → git-branch-CwvUxj7C.js} +1 -1
  383. package/ui/dist/assets/{git-commit-horizontal-IT6ecxWQ.js → git-commit-horizontal-lxPzCvhD.js} +1 -1
  384. package/ui/dist/assets/{globe-f-jjCa_g.js → globe-D_WpJdsj.js} +1 -1
  385. package/ui/dist/assets/{hash-DNEv8Elo.js → hash-CA0hJ7vh.js} +1 -1
  386. package/ui/dist/assets/{history-BQSBo_1Q.js → history-CEWMLELs.js} +1 -1
  387. package/ui/dist/assets/inbox-ehtOptTV.js +1 -0
  388. package/ui/dist/assets/{index-nS3EErDg.js → index-C1rhbml4.js} +3 -3
  389. package/ui/dist/assets/index-CR8gfCHv.js +1 -0
  390. package/ui/dist/assets/index-DVXMpWai.js +1 -0
  391. package/ui/dist/assets/index-DaDJMM2v.js +1 -0
  392. package/ui/dist/assets/index-Djdq_0xu.js +1 -0
  393. package/ui/dist/assets/index-M46Gcb8K.css +1 -0
  394. package/ui/dist/assets/index-sEBN7w8J.js +109 -0
  395. package/ui/dist/assets/layers-C6Mhf8Nk.js +1 -0
  396. package/ui/dist/assets/{layout-dashboard-CcKt1hXw.js → layout-dashboard-BRUM0kpT.js} +1 -1
  397. package/ui/dist/assets/{lightbulb-Jhp7FvbU.js → lightbulb-CN2q1O5l.js} +1 -1
  398. package/ui/dist/assets/{link-2-DdO7ostF.js → link-2-CC4E28yJ.js} +1 -1
  399. package/ui/dist/assets/markdown-renderer-C6ENbB0u.js +10 -0
  400. package/ui/dist/assets/markdown-renderer-CfVKi3_s.css +1 -0
  401. package/ui/dist/assets/{message-square-CBgH65X7.js → message-square-Bbb241am.js} +1 -1
  402. package/ui/dist/assets/package-CwT3IzFx.js +1 -0
  403. package/ui/dist/assets/{pencil-CYXCEPQh.js → pencil-CDmiHzoj.js} +1 -1
  404. package/ui/dist/assets/{play-d1ONaH0-.js → play-tjy5jMQX.js} +1 -1
  405. package/ui/dist/assets/popover-CFHZf3pE.js +1 -0
  406. package/ui/dist/assets/progress-BboUHuLf.js +1 -0
  407. package/ui/dist/assets/{rocket-DhvUetsk.js → rocket--8ZHgdXJ.js} +1 -1
  408. package/ui/dist/assets/select-n108rXny.js +1 -0
  409. package/ui/dist/assets/{send-P0r5D7td.js → send-Cu7MR2Qh.js} +1 -1
  410. package/ui/dist/assets/server-DmodxZp-.js +1 -0
  411. package/ui/dist/assets/{settings-2-ocj5uHGx.js → settings-2-CkRNqkxj.js} +1 -1
  412. package/ui/dist/assets/sheet-7aUJkyzU.js +1 -0
  413. package/ui/dist/assets/{shield-check-DfVdE34l.js → shield-check-ViI3nMKE.js} +1 -1
  414. package/ui/dist/assets/{shield-off-8l0J6R-8.js → shield-off-DN3tagkn.js} +1 -1
  415. package/ui/dist/assets/skeleton-C0E1Nfro.js +1 -0
  416. package/ui/dist/assets/{smartphone-77_g3SQn.js → smartphone-5FghiXpA.js} +1 -1
  417. package/ui/dist/assets/{square-Ckzsr3Rn.js → square-DiNSx8K7.js} +1 -1
  418. package/ui/dist/assets/star-DhdFVidS.js +1 -0
  419. package/ui/dist/assets/switch-CIgVbZqQ.js +1 -0
  420. package/ui/dist/assets/table-BC56FVMV.js +1 -0
  421. package/ui/dist/assets/{tag-C35mgoEv.js → tag-CH_vQliw.js} +1 -1
  422. package/ui/dist/assets/textarea-CxDiKFXZ.js +1 -0
  423. package/ui/dist/assets/{timer-DHJBS2w1.js → timer-CdGVTb60.js} +1 -1
  424. package/ui/dist/assets/tooltip-BuW9A5UO.js +1 -0
  425. package/ui/dist/assets/{trash-2-keO5tKPE.js → trash-2-CucZJL0N.js} +1 -1
  426. package/ui/dist/assets/trending-down-BCezC1z2.js +1 -0
  427. package/ui/dist/assets/{trending-up-BBv8KbrY.js → trending-up-C5OYX2k2.js} +1 -1
  428. package/ui/dist/assets/vendor-query-C0p7b53x.js +4 -0
  429. package/ui/dist/assets/vendor-react-Mc5_kfYG.js +12 -0
  430. package/ui/dist/assets/vendor-ui-CXPAUBFv.js +51 -0
  431. package/ui/dist/assets/{wand-sparkles-BusQ52ZK.js → wand-sparkles-BaH6pJnc.js} +1 -1
  432. package/ui/dist/assets/{wrench-02YaOSiK.js → wrench-CjxjP6ok.js} +1 -1
  433. package/ui/dist/index.html +5 -2
  434. package/ui/dist/assets/ActivityView-BeshZXmE.js +0 -1
  435. package/ui/dist/assets/AgentList-QVHeldPi.js +0 -1
  436. package/ui/dist/assets/AnalyticsDashboard-C9R97dXE.js +0 -1
  437. package/ui/dist/assets/AreaChart-B73gaiVQ.js +0 -1
  438. package/ui/dist/assets/CartesianChart-CXYL2R-A.js +0 -36
  439. package/ui/dist/assets/ChatView-qjZErlrp.js +0 -10
  440. package/ui/dist/assets/CostsDashboard-O4DCLy1i.js +0 -1
  441. package/ui/dist/assets/EstimateSelect-1hQf4Osk.js +0 -1
  442. package/ui/dist/assets/FloatingChatbot-BZBzrJxd.js +0 -2
  443. package/ui/dist/assets/InviteCodeManagement-LEoGqYeA.js +0 -2
  444. package/ui/dist/assets/ProjectIcon-Chd_ofsw.js +0 -1
  445. package/ui/dist/assets/ProjectList-BvUfVB6c.js +0 -4
  446. package/ui/dist/assets/StatusIndicator-pRfkNcdV.js +0 -1
  447. package/ui/dist/assets/SummaryList-B6kXiTxL.js +0 -1
  448. package/ui/dist/assets/TaskDetail-CV6CzbOS.js +0 -1
  449. package/ui/dist/assets/TaskList-DL7brQKd.js +0 -1
  450. package/ui/dist/assets/TicketBoard-CrkkFj7C.js +0 -1
  451. package/ui/dist/assets/TicketDetail-hnnYclpD.js +0 -1
  452. package/ui/dist/assets/TicketList-CsDAyQCL.js +0 -1
  453. package/ui/dist/assets/UserManagement-BGFQyTSr.js +0 -2
  454. package/ui/dist/assets/ViewSwitcher-CnL0OqA8.js +0 -1
  455. package/ui/dist/assets/alert-dialog-SKM6Gjz4.js +0 -7
  456. package/ui/dist/assets/badge-CVHH1a-v.js +0 -1
  457. package/ui/dist/assets/brain-6o_RHVpe.js +0 -1
  458. package/ui/dist/assets/constants-Q5Zivl-a.js +0 -1
  459. package/ui/dist/assets/dialog-BUqN9Psj.js +0 -1
  460. package/ui/dist/assets/index-BUmnwPQr.js +0 -1
  461. package/ui/dist/assets/index-BfF5G4Cw.js +0 -1
  462. package/ui/dist/assets/index-C8N375c2.js +0 -1
  463. package/ui/dist/assets/index-CuxnqVVz.css +0 -1
  464. package/ui/dist/assets/index-CzMM3QOk.js +0 -1
  465. package/ui/dist/assets/index-lJlNPFVJ.js +0 -67
  466. package/ui/dist/assets/layers-jFqVrWMD.js +0 -1
  467. package/ui/dist/assets/markdown-renderer-n1ToC4XQ.js +0 -36
  468. package/ui/dist/assets/popover-CrmZgoWu.js +0 -1
  469. package/ui/dist/assets/progress-uv4SPkL5.js +0 -1
  470. package/ui/dist/assets/select-CeQ8AHGy.js +0 -1
  471. package/ui/dist/assets/server-CVHTZB72.js +0 -1
  472. package/ui/dist/assets/sheet-DuQExSho.js +0 -1
  473. package/ui/dist/assets/skeleton-TFiFJ3nB.js +0 -1
  474. package/ui/dist/assets/switch-CAePkd6k.js +0 -1
  475. package/ui/dist/assets/table-ZjAZ7hkt.js +0 -1
  476. package/ui/dist/assets/textarea-DsVPnSgR.js +0 -1
  477. 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
@@ -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" | "plane" | "monday";
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" | "plane" | "monday";
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" | "high" | "low";
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?: "points" | "hours" | "days" | undefined;
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" | "high" | "low" | undefined;
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?: "points" | "hours" | "days" | undefined;
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" | "plane" | "monday";
450
+ platform: "jira" | "linear" | "github" | "monday" | "plane";
451
451
  externalId: string;
452
452
  externalUrl?: string | undefined;
453
453
  }, {
454
- platform: "jira" | "linear" | "github" | "plane" | "monday";
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" | "high" | "low" | undefined;
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?: "points" | "hours" | "days" | undefined;
476
+ estimateUnit?: "hours" | "points" | "days" | undefined;
477
477
  externalLink?: {
478
- platform: "jira" | "linear" | "github" | "plane" | "monday";
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" | "high" | "low" | undefined;
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?: "points" | "hours" | "days" | undefined;
500
+ estimateUnit?: "hours" | "points" | "days" | undefined;
501
501
  externalLink?: {
502
- platform: "jira" | "linear" | "github" | "plane" | "monday";
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" | "plane" | "monday";
532
+ platform: "jira" | "linear" | "github" | "monday" | "plane";
533
533
  externalId: string;
534
534
  externalUrl?: string | undefined;
535
535
  }, {
536
- platform: "jira" | "linear" | "github" | "plane" | "monday";
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" | "high" | "low" | undefined;
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?: "points" | "hours" | "days" | undefined;
558
+ estimateUnit?: "hours" | "points" | "days" | undefined;
559
559
  externalLink?: {
560
- platform: "jira" | "linear" | "github" | "plane" | "monday";
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" | "high" | "low" | undefined;
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?: "points" | "hours" | "days" | undefined;
582
+ estimateUnit?: "hours" | "points" | "days" | undefined;
583
583
  externalLink?: {
584
- platform: "jira" | "linear" | "github" | "plane" | "monday";
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" | "plane" | "monday";
616
+ platform: "jira" | "linear" | "github" | "monday" | "plane";
617
617
  externalId: string;
618
618
  externalUrl?: string | undefined;
619
619
  }, {
620
- platform: "jira" | "linear" | "github" | "plane" | "monday";
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" | "high" | "low" | undefined;
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?: "points" | "hours" | "days" | undefined;
642
+ estimateUnit?: "hours" | "points" | "days" | undefined;
643
643
  externalLink?: {
644
- platform: "jira" | "linear" | "github" | "plane" | "monday";
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" | "high" | "low" | undefined;
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?: "points" | "hours" | "days" | undefined;
666
+ estimateUnit?: "hours" | "points" | "days" | undefined;
667
667
  externalLink?: {
668
- platform: "jira" | "linear" | "github" | "plane" | "monday";
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" | "high" | "low" | undefined;
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?: "points" | "hours" | "days" | undefined;
692
+ estimateUnit?: "hours" | "points" | "days" | undefined;
693
693
  externalLink?: {
694
- platform: "jira" | "linear" | "github" | "plane" | "monday";
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" | "high" | "low" | undefined;
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?: "points" | "hours" | "days" | undefined;
719
+ estimateUnit?: "hours" | "points" | "days" | undefined;
720
720
  externalLink?: {
721
- platform: "jira" | "linear" | "github" | "plane" | "monday";
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" | "high" | "low" | ("critical" | "medium" | "none" | "high" | "low")[] | undefined;
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" | "high" | "low" | ("critical" | "medium" | "none" | "high" | "low")[] | undefined;
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;