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