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,65 @@
1
+ /**
2
+ * Tool Loader
3
+ *
4
+ * Manages tool categorization and lazy loading for the agentic system.
5
+ * Provides search over tool categories so the AI can discover and enable
6
+ * tools on demand without paying the full context cost of all schemas.
7
+ */
8
+ import type { ToolDefinition } from '../chat/execution/types.js';
9
+ export interface ToolCategory {
10
+ /** Unique slug for this category (e.g. "file_ops") */
11
+ name: string;
12
+ /** Human-readable description shown to users and the AI */
13
+ description: string;
14
+ /** Keywords used for fuzzy search / auto-load decisions */
15
+ keywords: string[];
16
+ /** Canonical tool names that belong to this category */
17
+ tools: string[];
18
+ /** When true, these tools are always included in every session */
19
+ alwaysLoaded: boolean;
20
+ }
21
+ export declare class ToolLoader {
22
+ private allTools;
23
+ private categories;
24
+ private loadedToolNames;
25
+ constructor(allTools: Map<string, ToolDefinition>);
26
+ /**
27
+ * Return the subset of tools that are always loaded (core session tools).
28
+ */
29
+ getCoreTools(): ToolDefinition[];
30
+ /**
31
+ * Return all tools that have been loaded for the current session,
32
+ * including always_loaded plus any dynamically loaded categories/tools.
33
+ */
34
+ getSessionTools(): ToolDefinition[];
35
+ /**
36
+ * Search categories by query string.
37
+ * Matches against category name, description, and keywords using
38
+ * case-insensitive substring matching; results are ranked by score.
39
+ */
40
+ search(query: string): ToolCategory[];
41
+ /**
42
+ * Load all tools belonging to a named category into the active session.
43
+ * Silently ignores tool names that are not registered.
44
+ */
45
+ loadCategory(categoryName: string): void;
46
+ /**
47
+ * Load a single tool by name into the active session.
48
+ * Silently ignores names that are not registered.
49
+ */
50
+ loadTool(toolName: string): void;
51
+ /**
52
+ * Return all registered categories.
53
+ */
54
+ getCategories(): ToolCategory[];
55
+ /**
56
+ * Register a custom category.
57
+ * Will overwrite any existing category with the same name.
58
+ */
59
+ registerCategory(category: ToolCategory): void;
60
+ /**
61
+ * Check whether a specific tool is currently loaded into the session.
62
+ */
63
+ isLoaded(toolName: string): boolean;
64
+ }
65
+ //# sourceMappingURL=tool-loader.d.ts.map
@@ -0,0 +1,273 @@
1
+ /**
2
+ * Tool Loader
3
+ *
4
+ * Manages tool categorization and lazy loading for the agentic system.
5
+ * Provides search over tool categories so the AI can discover and enable
6
+ * tools on demand without paying the full context cost of all schemas.
7
+ */
8
+ // Built-in Category Definitions
9
+ const BUILT_IN_CATEGORIES = [
10
+ {
11
+ name: 'always_loaded',
12
+ description: 'Core tools that are always available in every session',
13
+ keywords: ['core', 'always', 'base', 'default', 'essential'],
14
+ tools: [
15
+ 'read_file',
16
+ 'write_file',
17
+ 'search_files',
18
+ 'exec',
19
+ 'git_status',
20
+ 'git_commit',
21
+ 'complete_task',
22
+ 'search_available_tools',
23
+ ],
24
+ alwaysLoaded: true,
25
+ },
26
+ {
27
+ name: 'file_ops',
28
+ description: 'Extended file system operations: edit, grep, patch, directory tree',
29
+ keywords: ['file', 'filesystem', 'read', 'write', 'edit', 'grep', 'search', 'patch', 'directory'],
30
+ tools: [
31
+ 'read_file',
32
+ 'write_file',
33
+ 'search_files',
34
+ 'grep',
35
+ 'edit_file',
36
+ 'directory_tree',
37
+ 'patch_apply',
38
+ 'multi_patch',
39
+ ],
40
+ alwaysLoaded: false,
41
+ },
42
+ {
43
+ name: 'browser',
44
+ description: 'Browser automation tools for web scraping and UI testing',
45
+ keywords: ['browser', 'playwright', 'navigate', 'click', 'screenshot', 'web', 'automation', 'scrape'],
46
+ tools: [
47
+ 'browser_navigate',
48
+ 'browser_click',
49
+ 'browser_fill',
50
+ 'browser_screenshot',
51
+ 'browser_evaluate',
52
+ ],
53
+ alwaysLoaded: false,
54
+ },
55
+ {
56
+ name: 'integration',
57
+ description: 'Third-party integration tools: Slack, Discord, Telegram, screen capture, clipboard',
58
+ keywords: ['slack', 'discord', 'telegram', 'notification', 'clipboard', 'screen', 'capture', 'integration'],
59
+ tools: [
60
+ 'slack_actions',
61
+ 'discord_actions',
62
+ 'telegram_actions',
63
+ 'screen_capture',
64
+ 'clipboard_read',
65
+ 'clipboard_write',
66
+ 'notify',
67
+ ],
68
+ alwaysLoaded: false,
69
+ },
70
+ {
71
+ name: 'git_advanced',
72
+ description: 'Advanced Git operations beyond status and commit',
73
+ keywords: ['git', 'diff', 'log', 'branch', 'stash', 'remote', 'merge', 'rebase', 'version control'],
74
+ tools: [
75
+ 'git_status',
76
+ 'git_diff',
77
+ 'git_log',
78
+ 'git_commit',
79
+ 'git_branch',
80
+ 'git_stash',
81
+ 'git_remote',
82
+ ],
83
+ alwaysLoaded: false,
84
+ },
85
+ {
86
+ name: 'canvas',
87
+ description: 'Canvas rendering and image generation tools',
88
+ keywords: ['canvas', 'image', 'render', 'draw', 'generate', 'visual', 'graphic'],
89
+ tools: [
90
+ 'canvas_render',
91
+ 'openai_image_gen',
92
+ 'image_analyze',
93
+ ],
94
+ alwaysLoaded: false,
95
+ },
96
+ {
97
+ name: 'voice',
98
+ description: 'Text-to-speech and voice synthesis tools',
99
+ keywords: ['voice', 'tts', 'speech', 'audio', 'speak', 'synthesize'],
100
+ tools: [
101
+ 'tts_speak',
102
+ ],
103
+ alwaysLoaded: false,
104
+ },
105
+ {
106
+ name: 'memory',
107
+ description: 'Conversation memory management: search, retrieval, and statistics',
108
+ keywords: ['memory', 'remember', 'recall', 'search', 'context', 'history', 'retrieve'],
109
+ tools: [
110
+ 'memory_search',
111
+ 'memory_get',
112
+ 'memory_stats',
113
+ ],
114
+ alwaysLoaded: false,
115
+ },
116
+ {
117
+ name: 'system',
118
+ description: 'System information, environment variables, and process management',
119
+ keywords: ['system', 'env', 'environment', 'process', 'info', 'hardware', 'os', 'which', 'path'],
120
+ tools: [
121
+ 'env',
122
+ 'system_info',
123
+ 'process_list',
124
+ 'path_info',
125
+ 'which',
126
+ ],
127
+ alwaysLoaded: false,
128
+ },
129
+ ];
130
+ // Tool Loader
131
+ export class ToolLoader {
132
+ allTools;
133
+ categories;
134
+ loadedToolNames;
135
+ constructor(allTools) {
136
+ this.allTools = allTools;
137
+ this.categories = new Map();
138
+ this.loadedToolNames = new Set();
139
+ // Register built-in categories
140
+ for (const category of BUILT_IN_CATEGORIES) {
141
+ this.categories.set(category.name, category);
142
+ }
143
+ // Pre-load always_loaded tools
144
+ const alwaysLoaded = this.categories.get('always_loaded');
145
+ if (alwaysLoaded) {
146
+ for (const toolName of alwaysLoaded.tools) {
147
+ if (this.allTools.has(toolName)) {
148
+ this.loadedToolNames.add(toolName);
149
+ }
150
+ }
151
+ }
152
+ }
153
+ /**
154
+ * Return the subset of tools that are always loaded (core session tools).
155
+ */
156
+ getCoreTools() {
157
+ const core = this.categories.get('always_loaded');
158
+ if (!core)
159
+ return [];
160
+ return core.tools
161
+ .map((name) => this.allTools.get(name))
162
+ .filter((tool) => tool !== undefined);
163
+ }
164
+ /**
165
+ * Return all tools that have been loaded for the current session,
166
+ * including always_loaded plus any dynamically loaded categories/tools.
167
+ */
168
+ getSessionTools() {
169
+ return Array.from(this.loadedToolNames)
170
+ .map((name) => this.allTools.get(name))
171
+ .filter((tool) => tool !== undefined);
172
+ }
173
+ /**
174
+ * Search categories by query string.
175
+ * Matches against category name, description, and keywords using
176
+ * case-insensitive substring matching; results are ranked by score.
177
+ */
178
+ search(query) {
179
+ if (!query.trim()) {
180
+ return Array.from(this.categories.values());
181
+ }
182
+ const terms = query
183
+ .toLowerCase()
184
+ .split(/\s+/)
185
+ .filter((t) => t.length > 0);
186
+ const scored = [];
187
+ for (const category of this.categories.values()) {
188
+ let score = 0;
189
+ for (const term of terms) {
190
+ // Exact name match gets highest weight
191
+ if (category.name === term) {
192
+ score += 10;
193
+ }
194
+ else if (category.name.includes(term)) {
195
+ score += 5;
196
+ }
197
+ // Description match
198
+ if (category.description.toLowerCase().includes(term)) {
199
+ score += 3;
200
+ }
201
+ // Keyword match
202
+ for (const keyword of category.keywords) {
203
+ if (keyword === term) {
204
+ score += 4;
205
+ }
206
+ else if (keyword.includes(term)) {
207
+ score += 2;
208
+ }
209
+ }
210
+ // Tool name match
211
+ for (const toolName of category.tools) {
212
+ if (toolName.includes(term)) {
213
+ score += 1;
214
+ }
215
+ }
216
+ }
217
+ if (score > 0) {
218
+ scored.push({ category, score });
219
+ }
220
+ }
221
+ return scored
222
+ .sort((a, b) => b.score - a.score)
223
+ .map((s) => s.category);
224
+ }
225
+ /**
226
+ * Load all tools belonging to a named category into the active session.
227
+ * Silently ignores tool names that are not registered.
228
+ */
229
+ loadCategory(categoryName) {
230
+ const category = this.categories.get(categoryName);
231
+ if (!category) {
232
+ return;
233
+ }
234
+ for (const toolName of category.tools) {
235
+ if (this.allTools.has(toolName)) {
236
+ this.loadedToolNames.add(toolName);
237
+ }
238
+ }
239
+ }
240
+ /**
241
+ * Load a single tool by name into the active session.
242
+ * Silently ignores names that are not registered.
243
+ */
244
+ loadTool(toolName) {
245
+ if (this.allTools.has(toolName)) {
246
+ this.loadedToolNames.add(toolName);
247
+ }
248
+ }
249
+ /**
250
+ * Return all registered categories.
251
+ */
252
+ getCategories() {
253
+ return Array.from(this.categories.values());
254
+ }
255
+ /**
256
+ * Register a custom category.
257
+ * Will overwrite any existing category with the same name.
258
+ */
259
+ registerCategory(category) {
260
+ this.categories.set(category.name, category);
261
+ // If the new category is marked always_loaded, immediately load its tools
262
+ if (category.alwaysLoaded) {
263
+ this.loadCategory(category.name);
264
+ }
265
+ }
266
+ /**
267
+ * Check whether a specific tool is currently loaded into the session.
268
+ */
269
+ isLoaded(toolName) {
270
+ return this.loadedToolNames.has(toolName);
271
+ }
272
+ }
273
+ //# sourceMappingURL=tool-loader.js.map
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Transcript Persistence
3
+ *
4
+ * Saves all conversations to JSONL files for searchable history and session resumption.
5
+ * Files are stored at .profclaw/transcripts/{sessionId}.jsonl
6
+ * Index is stored at .profclaw/transcripts/index.json
7
+ */
8
+ import * as os from 'os';
9
+ export interface TranscriptEntry {
10
+ timestamp: number;
11
+ sessionId: string;
12
+ type: 'user' | 'assistant' | 'tool_call' | 'tool_result' | 'system' | 'error';
13
+ content: string;
14
+ metadata?: {
15
+ toolName?: string;
16
+ toolCallId?: string;
17
+ model?: string;
18
+ tokensUsed?: number;
19
+ duration?: number;
20
+ };
21
+ }
22
+ export interface SessionMeta {
23
+ sessionId: string;
24
+ title: string;
25
+ startedAt: number;
26
+ lastActivityAt: number;
27
+ messageCount: number;
28
+ tokensUsed: number;
29
+ model?: string;
30
+ }
31
+ export declare class TranscriptStore {
32
+ private transcriptsDir;
33
+ private sessionsIndex;
34
+ private indexDirty;
35
+ private indexTimer;
36
+ constructor(projectRoot?: string);
37
+ /**
38
+ * Append a single entry to the session's JSONL file.
39
+ */
40
+ append(entry: TranscriptEntry): void;
41
+ /**
42
+ * Read all entries for a session from its JSONL file.
43
+ */
44
+ getSession(sessionId: string): TranscriptEntry[];
45
+ /**
46
+ * List sessions sorted by lastActivityAt descending.
47
+ */
48
+ listSessions(options?: {
49
+ limit?: number;
50
+ offset?: number;
51
+ }): SessionMeta[];
52
+ /**
53
+ * Full-text search across transcript entries.
54
+ * Returns matching entries with their session ID and line number.
55
+ */
56
+ search(query: string, options?: {
57
+ sessionId?: string;
58
+ limit?: number;
59
+ }): Array<{
60
+ entry: TranscriptEntry;
61
+ sessionId: string;
62
+ lineNumber: number;
63
+ }>;
64
+ /**
65
+ * Get or create session metadata. Uses firstMessage to auto-generate a title
66
+ * if the session doesn't yet exist.
67
+ */
68
+ getOrCreateMeta(sessionId: string, firstMessage?: string): SessionMeta;
69
+ /**
70
+ * Merge partial updates into an existing session's metadata.
71
+ */
72
+ updateMeta(sessionId: string, updates: Partial<SessionMeta>): void;
73
+ /**
74
+ * Delete a session's JSONL file and remove it from the index.
75
+ */
76
+ deleteSession(sessionId: string): void;
77
+ flush(): void;
78
+ private markIndexDirty;
79
+ private sessionFilePath;
80
+ private indexFilePath;
81
+ private ensureDir;
82
+ private loadIndex;
83
+ private saveIndex;
84
+ /**
85
+ * Generate a human-readable title from the first 50 chars of a message.
86
+ * Strips newlines, trims whitespace.
87
+ */
88
+ private generateTitle;
89
+ }
90
+ /**
91
+ * Returns the process-level singleton TranscriptStore, rooted at cwd().
92
+ */
93
+ export declare function getTranscriptStore(): TranscriptStore;
94
+ export declare function _resetTranscriptStoreSingleton(): void;
95
+ export { os };
96
+ //# sourceMappingURL=transcript.d.ts.map
@@ -0,0 +1,267 @@
1
+ /**
2
+ * Transcript Persistence
3
+ *
4
+ * Saves all conversations to JSONL files for searchable history and session resumption.
5
+ * Files are stored at .profclaw/transcripts/{sessionId}.jsonl
6
+ * Index is stored at .profclaw/transcripts/index.json
7
+ */
8
+ import * as fs from 'fs';
9
+ import * as path from 'path';
10
+ import * as os from 'os';
11
+ let _instance = null;
12
+ export class TranscriptStore {
13
+ transcriptsDir;
14
+ sessionsIndex;
15
+ indexDirty = false;
16
+ indexTimer = null;
17
+ constructor(projectRoot) {
18
+ const root = projectRoot ?? process.cwd();
19
+ this.transcriptsDir = path.join(root, '.profclaw', 'transcripts');
20
+ this.sessionsIndex = new Map();
21
+ this.loadIndex();
22
+ }
23
+ /**
24
+ * Append a single entry to the session's JSONL file.
25
+ */
26
+ append(entry) {
27
+ this.ensureDir();
28
+ const filePath = this.sessionFilePath(entry.sessionId);
29
+ const line = JSON.stringify(entry) + '\n';
30
+ try {
31
+ fs.appendFileSync(filePath, line, 'utf8');
32
+ }
33
+ catch (err) {
34
+ console.error('[TranscriptStore] Failed to append entry:', err);
35
+ return;
36
+ }
37
+ // Update session metadata
38
+ const meta = this.getOrCreateMeta(entry.sessionId);
39
+ meta.lastActivityAt = entry.timestamp;
40
+ meta.messageCount += 1;
41
+ if (entry.metadata?.tokensUsed) {
42
+ meta.tokensUsed += entry.metadata.tokensUsed;
43
+ }
44
+ if (entry.metadata?.model && !meta.model) {
45
+ meta.model = entry.metadata.model;
46
+ }
47
+ this.sessionsIndex.set(entry.sessionId, meta);
48
+ this.markIndexDirty();
49
+ }
50
+ /**
51
+ * Read all entries for a session from its JSONL file.
52
+ */
53
+ getSession(sessionId) {
54
+ const filePath = this.sessionFilePath(sessionId);
55
+ if (!fs.existsSync(filePath)) {
56
+ return [];
57
+ }
58
+ try {
59
+ const raw = fs.readFileSync(filePath, 'utf8');
60
+ const entries = [];
61
+ for (const line of raw.split('\n')) {
62
+ const trimmed = line.trim();
63
+ if (!trimmed)
64
+ continue;
65
+ try {
66
+ entries.push(JSON.parse(trimmed));
67
+ }
68
+ catch {
69
+ // Skip malformed lines
70
+ }
71
+ }
72
+ return entries;
73
+ }
74
+ catch (err) {
75
+ console.error(`[TranscriptStore] Failed to read session ${sessionId}:`, err);
76
+ return [];
77
+ }
78
+ }
79
+ /**
80
+ * List sessions sorted by lastActivityAt descending.
81
+ */
82
+ listSessions(options) {
83
+ const all = Array.from(this.sessionsIndex.values()).sort((a, b) => b.lastActivityAt - a.lastActivityAt);
84
+ const offset = options?.offset ?? 0;
85
+ const limit = options?.limit ?? all.length;
86
+ return all.slice(offset, offset + limit);
87
+ }
88
+ /**
89
+ * Full-text search across transcript entries.
90
+ * Returns matching entries with their session ID and line number.
91
+ */
92
+ search(query, options) {
93
+ const results = [];
94
+ const lowerQuery = query.toLowerCase();
95
+ const limit = options?.limit ?? 50;
96
+ const sessionIds = options?.sessionId
97
+ ? [options.sessionId]
98
+ : Array.from(this.sessionsIndex.keys());
99
+ for (const sessionId of sessionIds) {
100
+ if (results.length >= limit)
101
+ break;
102
+ const filePath = this.sessionFilePath(sessionId);
103
+ if (!fs.existsSync(filePath))
104
+ continue;
105
+ let raw;
106
+ try {
107
+ raw = fs.readFileSync(filePath, 'utf8');
108
+ }
109
+ catch {
110
+ continue;
111
+ }
112
+ const lines = raw.split('\n');
113
+ for (let i = 0; i < lines.length; i++) {
114
+ if (results.length >= limit)
115
+ break;
116
+ const line = lines[i].trim();
117
+ if (!line)
118
+ continue;
119
+ if (line.toLowerCase().includes(lowerQuery)) {
120
+ try {
121
+ const entry = JSON.parse(line);
122
+ results.push({ entry, sessionId, lineNumber: i + 1 });
123
+ }
124
+ catch {
125
+ // Skip malformed lines
126
+ }
127
+ }
128
+ }
129
+ }
130
+ return results;
131
+ }
132
+ /**
133
+ * Get or create session metadata. Uses firstMessage to auto-generate a title
134
+ * if the session doesn't yet exist.
135
+ */
136
+ getOrCreateMeta(sessionId, firstMessage) {
137
+ const existing = this.sessionsIndex.get(sessionId);
138
+ if (existing)
139
+ return existing;
140
+ const now = Date.now();
141
+ const meta = {
142
+ sessionId,
143
+ title: firstMessage ? this.generateTitle(firstMessage) : `Session ${sessionId.slice(0, 8)}`,
144
+ startedAt: now,
145
+ lastActivityAt: now,
146
+ messageCount: 0,
147
+ tokensUsed: 0,
148
+ };
149
+ this.sessionsIndex.set(sessionId, meta);
150
+ this.saveIndex();
151
+ return meta;
152
+ }
153
+ /**
154
+ * Merge partial updates into an existing session's metadata.
155
+ */
156
+ updateMeta(sessionId, updates) {
157
+ const existing = this.sessionsIndex.get(sessionId);
158
+ if (!existing)
159
+ return;
160
+ this.sessionsIndex.set(sessionId, { ...existing, ...updates, sessionId });
161
+ this.saveIndex();
162
+ }
163
+ /**
164
+ * Delete a session's JSONL file and remove it from the index.
165
+ */
166
+ deleteSession(sessionId) {
167
+ const filePath = this.sessionFilePath(sessionId);
168
+ if (fs.existsSync(filePath)) {
169
+ try {
170
+ fs.unlinkSync(filePath);
171
+ }
172
+ catch (err) {
173
+ console.error(`[TranscriptStore] Failed to delete session file ${sessionId}:`, err);
174
+ }
175
+ }
176
+ this.sessionsIndex.delete(sessionId);
177
+ this.saveIndex();
178
+ }
179
+ flush() {
180
+ if (this.indexTimer) {
181
+ clearTimeout(this.indexTimer);
182
+ this.indexTimer = null;
183
+ }
184
+ if (this.indexDirty) {
185
+ this.saveIndex();
186
+ this.indexDirty = false;
187
+ }
188
+ }
189
+ // ---------------------------------------------------------------------------
190
+ // Private helpers
191
+ // ---------------------------------------------------------------------------
192
+ markIndexDirty() {
193
+ this.indexDirty = true;
194
+ if (!this.indexTimer) {
195
+ this.indexTimer = setTimeout(() => {
196
+ this.indexTimer = null;
197
+ if (this.indexDirty) {
198
+ this.saveIndex();
199
+ this.indexDirty = false;
200
+ }
201
+ }, 1000);
202
+ }
203
+ }
204
+ sessionFilePath(sessionId) {
205
+ return path.join(this.transcriptsDir, `${sessionId}.jsonl`);
206
+ }
207
+ indexFilePath() {
208
+ return path.join(this.transcriptsDir, 'index.json');
209
+ }
210
+ ensureDir() {
211
+ if (!fs.existsSync(this.transcriptsDir)) {
212
+ fs.mkdirSync(this.transcriptsDir, { recursive: true });
213
+ }
214
+ }
215
+ loadIndex() {
216
+ const indexPath = this.indexFilePath();
217
+ if (!fs.existsSync(indexPath))
218
+ return;
219
+ try {
220
+ const raw = fs.readFileSync(indexPath, 'utf8');
221
+ const sessions = JSON.parse(raw);
222
+ for (const session of sessions) {
223
+ this.sessionsIndex.set(session.sessionId, session);
224
+ }
225
+ }
226
+ catch (err) {
227
+ console.error('[TranscriptStore] Failed to load index:', err);
228
+ }
229
+ }
230
+ saveIndex() {
231
+ this.ensureDir();
232
+ const indexPath = this.indexFilePath();
233
+ const sessions = Array.from(this.sessionsIndex.values());
234
+ try {
235
+ fs.writeFileSync(indexPath, JSON.stringify(sessions, null, 2), 'utf8');
236
+ }
237
+ catch (err) {
238
+ console.error('[TranscriptStore] Failed to save index:', err);
239
+ }
240
+ }
241
+ /**
242
+ * Generate a human-readable title from the first 50 chars of a message.
243
+ * Strips newlines, trims whitespace.
244
+ */
245
+ generateTitle(message) {
246
+ const cleaned = message.replace(/[\r\n\t]+/g, ' ').trim();
247
+ if (cleaned.length <= 50)
248
+ return cleaned;
249
+ return cleaned.slice(0, 47) + '...';
250
+ }
251
+ }
252
+ /**
253
+ * Returns the process-level singleton TranscriptStore, rooted at cwd().
254
+ */
255
+ export function getTranscriptStore() {
256
+ if (!_instance) {
257
+ _instance = new TranscriptStore();
258
+ }
259
+ return _instance;
260
+ }
261
+ // Exported for test injection
262
+ export function _resetTranscriptStoreSingleton() {
263
+ _instance = null;
264
+ }
265
+ // Re-export os for use in tests (avoids test-only imports from module internals)
266
+ export { os };
267
+ //# sourceMappingURL=transcript.js.map