profclaw 0.0.1-beta.3 → 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 (535) hide show
  1. package/.env.example +14 -2
  2. package/CHANGELOG.md +54 -34
  3. package/CONTRIBUTING.md +23 -5
  4. package/Dockerfile +39 -23
  5. package/README.md +271 -72
  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 +15 -3
  71. package/dist/chat/execution/tools/index.js +125 -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/slack/index.d.ts +2 -2
  104. package/dist/chat/providers/telegram/index.d.ts +2 -0
  105. package/dist/chat/providers/telegram/index.js +21 -2
  106. package/dist/chat/system-prompts.d.ts +3 -3
  107. package/dist/chat/system-prompts.js +116 -61
  108. package/dist/chat/tools.d.ts +6 -6
  109. package/dist/cli/commands/auth.js +64 -1
  110. package/dist/cli/commands/chat.js +1327 -138
  111. package/dist/cli/commands/doctor.js +222 -16
  112. package/dist/cli/commands/history.d.ts +3 -0
  113. package/dist/cli/commands/history.js +138 -0
  114. package/dist/cli/commands/import.d.ts +44 -0
  115. package/dist/cli/commands/import.js +526 -0
  116. package/dist/cli/commands/init.d.ts +13 -0
  117. package/dist/cli/commands/init.js +381 -0
  118. package/dist/cli/commands/models.js +39 -26
  119. package/dist/cli/commands/onboard.js +263 -98
  120. package/dist/cli/commands/plan.d.ts +13 -0
  121. package/dist/cli/commands/plan.js +184 -0
  122. package/dist/cli/commands/serve.d.ts +7 -0
  123. package/dist/cli/commands/serve.js +77 -18
  124. package/dist/cli/commands/setup.js +375 -91
  125. package/dist/cli/commands/status.js +54 -0
  126. package/dist/cli/commands/tools.js +13 -13
  127. package/dist/cli/commands/tui.js +26 -1
  128. package/dist/cli/index.js +19 -6
  129. package/dist/cli/ink/App.d.ts +13 -0
  130. package/dist/cli/ink/App.js +6 -0
  131. package/dist/cli/ink/ChatApp.d.ts +60 -0
  132. package/dist/cli/ink/ChatApp.js +325 -0
  133. package/dist/cli/ink/DashboardApp.d.ts +3 -0
  134. package/dist/cli/ink/DashboardApp.js +143 -0
  135. package/dist/cli/ink/components/AgentStatus.d.ts +17 -0
  136. package/dist/cli/ink/components/AgentStatus.js +33 -0
  137. package/dist/cli/ink/components/ChannelList.d.ts +17 -0
  138. package/dist/cli/ink/components/ChannelList.js +33 -0
  139. package/dist/cli/ink/components/ConnectionStatus.d.ts +19 -0
  140. package/dist/cli/ink/components/ConnectionStatus.js +50 -0
  141. package/dist/cli/ink/components/CostBar.d.ts +19 -0
  142. package/dist/cli/ink/components/CostBar.js +35 -0
  143. package/dist/cli/ink/components/HookStatus.d.ts +15 -0
  144. package/dist/cli/ink/components/HookStatus.js +7 -0
  145. package/dist/cli/ink/components/PermissionPrompt.d.ts +21 -0
  146. package/dist/cli/ink/components/PermissionPrompt.js +51 -0
  147. package/dist/cli/ink/components/PlanView.d.ts +23 -0
  148. package/dist/cli/ink/components/PlanView.js +26 -0
  149. package/dist/cli/ink/components/ProviderList.d.ts +16 -0
  150. package/dist/cli/ink/components/ProviderList.js +16 -0
  151. package/dist/cli/ink/components/SessionHeader.d.ts +15 -0
  152. package/dist/cli/ink/components/SessionHeader.js +15 -0
  153. package/dist/cli/ink/components/StreamingMessage.d.ts +20 -0
  154. package/dist/cli/ink/components/StreamingMessage.js +27 -0
  155. package/dist/cli/ink/components/SuggestionBar.d.ts +15 -0
  156. package/dist/cli/ink/components/SuggestionBar.js +28 -0
  157. package/dist/cli/ink/components/SystemHealth.d.ts +20 -0
  158. package/dist/cli/ink/components/SystemHealth.js +39 -0
  159. package/dist/cli/ink/components/TaskList.d.ts +17 -0
  160. package/dist/cli/ink/components/TaskList.js +59 -0
  161. package/dist/cli/ink/components/ToolCall.d.ts +17 -0
  162. package/dist/cli/ink/components/ToolCall.js +43 -0
  163. package/dist/cli/ink/index.d.ts +23 -0
  164. package/dist/cli/ink/index.js +15 -0
  165. package/dist/cli/ink/keybindings.d.ts +35 -0
  166. package/dist/cli/ink/keybindings.js +105 -0
  167. package/dist/cli/ink/markdown-renderer.d.ts +47 -0
  168. package/dist/cli/ink/markdown-renderer.js +380 -0
  169. package/dist/cli/ink/output-styles.d.ts +39 -0
  170. package/dist/cli/ink/output-styles.js +119 -0
  171. package/dist/cli/interactive/auto-serve.d.ts +38 -0
  172. package/dist/cli/interactive/auto-serve.js +209 -0
  173. package/dist/cli/interactive/index.d.ts +25 -0
  174. package/dist/cli/interactive/index.js +23 -0
  175. package/dist/cli/interactive/picker.d.ts +28 -0
  176. package/dist/cli/interactive/picker.js +153 -0
  177. package/dist/cli/interactive/renderer.d.ts +26 -0
  178. package/dist/cli/interactive/renderer.js +555 -0
  179. package/dist/cli/interactive/repl.d.ts +14 -0
  180. package/dist/cli/interactive/repl.js +1516 -0
  181. package/dist/cli/interactive/stream-client.d.ts +59 -0
  182. package/dist/cli/interactive/stream-client.js +506 -0
  183. package/dist/cli/interactive/types.d.ts +121 -0
  184. package/dist/cli/interactive/types.js +10 -0
  185. package/dist/cli/providers.d.ts +15 -0
  186. package/dist/cli/providers.js +41 -0
  187. package/dist/cli/utils/api.d.ts +9 -0
  188. package/dist/cli/utils/api.js +58 -2
  189. package/dist/core/deployment.js +2 -0
  190. package/dist/cron/natural-language.d.ts +54 -0
  191. package/dist/cron/natural-language.js +569 -0
  192. package/dist/cron/scheduler.d.ts +34 -4
  193. package/dist/cron/scheduler.js +141 -9
  194. package/dist/cron/templates.d.ts +1 -1
  195. package/dist/cron/templates.js +219 -0
  196. package/dist/feeds/feed-engine.d.ts +149 -0
  197. package/dist/feeds/feed-engine.js +600 -0
  198. package/dist/feeds/index.d.ts +9 -0
  199. package/dist/feeds/index.js +8 -0
  200. package/dist/gateway/router.js +6 -1
  201. package/dist/hooks/built-in/audit-log.d.ts +11 -0
  202. package/dist/hooks/built-in/audit-log.js +84 -0
  203. package/dist/hooks/built-in/cost-warning.d.ts +10 -0
  204. package/dist/hooks/built-in/cost-warning.js +59 -0
  205. package/dist/hooks/built-in/dangerous-tool.d.ts +32 -0
  206. package/dist/hooks/built-in/dangerous-tool.js +80 -0
  207. package/dist/hooks/built-in/index.d.ts +14 -0
  208. package/dist/hooks/built-in/index.js +20 -0
  209. package/dist/hooks/index.d.ts +3 -0
  210. package/dist/hooks/index.js +6 -0
  211. package/dist/hooks/loader.d.ts +17 -0
  212. package/dist/hooks/loader.js +142 -0
  213. package/dist/hooks/registry.d.ts +62 -0
  214. package/dist/hooks/registry.js +127 -0
  215. package/dist/integrations/web-search.js +6 -3
  216. package/dist/memory/index.d.ts +1 -0
  217. package/dist/memory/index.js +2 -0
  218. package/dist/memory/memory-service.js +14 -13
  219. package/dist/memory/observational.d.ts +62 -0
  220. package/dist/memory/observational.js +396 -0
  221. package/dist/middleware/content-filter.d.ts +22 -0
  222. package/dist/middleware/content-filter.js +69 -0
  223. package/dist/middleware/request-validator.d.ts +159 -0
  224. package/dist/middleware/request-validator.js +93 -0
  225. package/dist/plugins/sdk.d.ts +22 -0
  226. package/dist/plugins/sdk.js +17 -1
  227. package/dist/projects/types.d.ts +10 -10
  228. package/dist/providers/ai-sdk.d.ts +11 -0
  229. package/dist/providers/ai-sdk.js +97 -18
  230. package/dist/providers/core/models.js +67 -1
  231. package/dist/providers/core/types.d.ts +3 -0
  232. package/dist/providers/index.d.ts +1 -0
  233. package/dist/providers/index.js +1 -0
  234. package/dist/providers/smart-router.d.ts +118 -0
  235. package/dist/providers/smart-router.js +685 -0
  236. package/dist/providers/types.d.ts +16 -16
  237. package/dist/routes/agents.js +50 -0
  238. package/dist/routes/auth.js +8 -1
  239. package/dist/routes/channels.d.ts +12 -0
  240. package/dist/routes/channels.js +166 -0
  241. package/dist/routes/chat.js +259 -14
  242. package/dist/routes/costs.js +32 -0
  243. package/dist/routes/cron.js +80 -5
  244. package/dist/routes/feeds.d.ts +10 -0
  245. package/dist/routes/feeds.js +168 -0
  246. package/dist/routes/mcp.js +21 -0
  247. package/dist/routes/memory.js +130 -0
  248. package/dist/routes/skills.js +129 -0
  249. package/dist/routes/teams.d.ts +9 -0
  250. package/dist/routes/teams.js +210 -0
  251. package/dist/routes/tools.js +14 -0
  252. package/dist/routes/users.js +2 -0
  253. package/dist/server/route-loader.js +4 -1
  254. package/dist/server/stream-bridge.d.ts +19 -0
  255. package/dist/server/stream-bridge.js +38 -0
  256. package/dist/server.js +421 -141
  257. package/dist/skills/marketplace.d.ts +87 -0
  258. package/dist/skills/marketplace.js +268 -0
  259. package/dist/storage/index.d.ts +14 -0
  260. package/dist/storage/index.js +64 -3
  261. package/dist/storage/schema.d.ts +4 -4
  262. package/dist/storage/schema.js +1 -1
  263. package/dist/teams/index.d.ts +110 -0
  264. package/dist/teams/index.js +365 -0
  265. package/dist/tickets/types.d.ts +39 -39
  266. package/dist/types/summary.d.ts +5 -5
  267. package/dist/utils/auto-update.d.ts +23 -0
  268. package/dist/utils/auto-update.js +157 -0
  269. package/dist/utils/offline-detect.d.ts +55 -0
  270. package/dist/utils/offline-detect.js +121 -0
  271. package/dist/utils/pid-file.d.ts +36 -0
  272. package/dist/utils/pid-file.js +125 -0
  273. package/dist/utils/prevent-sleep.d.ts +27 -0
  274. package/dist/utils/prevent-sleep.js +95 -0
  275. package/dist/utils/sanitizer.d.ts +57 -0
  276. package/dist/utils/sanitizer.js +174 -0
  277. package/docker-compose.yml +13 -137
  278. package/package.json +31 -6
  279. package/skills/deploy-cloudflare/SKILL.md +62 -0
  280. package/skills/deploy-vercel/SKILL.md +67 -0
  281. package/skills/docker-deploy/SKILL.md +158 -0
  282. package/skills/full-stack-builder/SKILL.md +92 -0
  283. package/skills/git-workflow/SKILL.md +3 -3
  284. package/skills/humanizer/SKILL.md +488 -0
  285. package/skills/profclaw-assistant/SKILL.md +85 -56
  286. package/ui/dist/assets/ActivityView-Da6HQ8ws.js +1 -0
  287. package/ui/dist/assets/AgentList-H58R0kX3.js +1 -0
  288. package/ui/dist/assets/AnalyticsDashboard-B28AeRsc.js +1 -0
  289. package/ui/dist/assets/AreaChart-DwLzeAQ8.js +1 -0
  290. package/ui/dist/assets/CartesianChart-piKQsTAR.js +36 -0
  291. package/ui/dist/assets/ChatView-Dbj8rxU5.js +10 -0
  292. package/ui/dist/assets/CostsDashboard-C6F5df0F.js +1 -0
  293. package/ui/dist/assets/EstimateSelect-wga0rUKX.js +1 -0
  294. package/ui/dist/assets/FeedDashboard-Ef6FEzEf.js +1 -0
  295. package/ui/dist/assets/FloatingChatbot-0yhkUeCq.js +2 -0
  296. package/ui/dist/assets/InviteCodeManagement-tUXfx4Bc.js +2 -0
  297. package/ui/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  298. package/ui/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  299. package/ui/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  300. package/ui/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  301. package/ui/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  302. package/ui/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  303. package/ui/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  304. package/ui/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  305. package/ui/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  306. package/ui/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  307. package/ui/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  308. package/ui/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  309. package/ui/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  310. package/ui/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  311. package/ui/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  312. package/ui/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  313. package/ui/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  314. package/ui/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  315. package/ui/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  316. package/ui/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  317. package/ui/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  318. package/ui/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  319. package/ui/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  320. package/ui/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  321. package/ui/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  322. package/ui/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  323. package/ui/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  324. package/ui/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  325. package/ui/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  326. package/ui/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  327. package/ui/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  328. package/ui/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  329. package/ui/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  330. package/ui/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  331. package/ui/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  332. package/ui/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  333. package/ui/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  334. package/ui/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  335. package/ui/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  336. package/ui/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  337. package/ui/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  338. package/ui/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  339. package/ui/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  340. package/ui/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  341. package/ui/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  342. package/ui/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  343. package/ui/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  344. package/ui/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  345. package/ui/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  346. package/ui/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  347. package/ui/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  348. package/ui/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  349. package/ui/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  350. package/ui/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  351. package/ui/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  352. package/ui/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  353. package/ui/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  354. package/ui/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  355. package/ui/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  356. package/ui/dist/assets/MarketplacePage-DGrLtolR.js +1 -0
  357. package/ui/dist/assets/{ProjectDetail-DlYUcOss.js → ProjectDetail-BgWvA6UP.js} +2 -2
  358. package/ui/dist/assets/ProjectIcon-TDuliqwg.js +1 -0
  359. package/ui/dist/assets/ProjectList-DXgM4187.js +1 -0
  360. package/ui/dist/assets/{Settings-CgPqzUvj.js → Settings-xA8Zhi3p.js} +3 -3
  361. package/ui/dist/assets/StatusIndicator-B8vfFAxg.js +1 -0
  362. package/ui/dist/assets/{SummaryDetail-CwLAfHgJ.js → SummaryDetail-eedRfTtF.js} +2 -2
  363. package/ui/dist/assets/SummaryList-CLNX2P84.js +1 -0
  364. package/ui/dist/assets/TaskDetail-BtWclNiR.js +1 -0
  365. package/ui/dist/assets/TaskList-JjODAgSc.js +1 -0
  366. package/ui/dist/assets/TeamsPage-CBK5iAyx.js +1 -0
  367. package/ui/dist/assets/TicketBoard-C9aJNNYp.js +1 -0
  368. package/ui/dist/assets/TicketDetail-CV5JmL31.js +1 -0
  369. package/ui/dist/assets/TicketList-68V4lzUz.js +1 -0
  370. package/ui/dist/assets/UserManagement-DKTb6UpE.js +2 -0
  371. package/ui/dist/assets/ViewSwitcher-BvdQht2Y.js +1 -0
  372. package/ui/dist/assets/alert-dialog-O6qBOv_f.js +1 -0
  373. package/ui/dist/assets/{archive-CGck7gxR.js → archive-CX7UvZpf.js} +1 -1
  374. package/ui/dist/assets/badge-BbfnwDJP.js +1 -0
  375. package/ui/dist/assets/{bug-DqSGPUUE.js → bug-3WX0394-.js} +1 -1
  376. package/ui/dist/assets/{calendar-BuZ4zbPW.js → calendar-buq77TaS.js} +1 -1
  377. package/ui/dist/assets/{chevron-up-DcJ4LL_N.js → chevron-up-4ymsBJRo.js} +1 -1
  378. package/ui/dist/assets/{circle-x-C78PNZjF.js → circle-x-ByXtwR6Y.js} +1 -1
  379. package/ui/dist/assets/constants-CVdDh7p0.js +1 -0
  380. package/ui/dist/assets/{cpu-Ck6AoG8c.js → cpu-CiuoCeDY.js} +1 -1
  381. package/ui/dist/assets/{database-CA2w8Lvt.js → database-BWXSBg5a.js} +1 -1
  382. package/ui/dist/assets/dialog-lDg4NvMV.js +1 -0
  383. package/ui/dist/assets/dollar-sign-Dmijd6DP.js +1 -0
  384. package/ui/dist/assets/{ellipsis-FhHKRbfl.js → ellipsis-vT-5SVIp.js} +1 -1
  385. package/ui/dist/assets/{ellipsis-vertical-CO0UqE4-.js → ellipsis-vertical-B4tAX_bL.js} +1 -1
  386. package/ui/dist/assets/feature-markdown-DBo5Q7uq.js +289 -0
  387. package/ui/dist/assets/{file-code-ChnhYYj1.js → file-code-ChOWdKXf.js} +1 -1
  388. package/ui/dist/assets/{folder-open-CHwA1-ve.js → folder-open-CkOUbIiP.js} +1 -1
  389. package/ui/dist/assets/{funnel-ByEjRFNB.js → funnel-uZkoSPP-.js} +1 -1
  390. package/ui/dist/assets/{git-branch-GTOPQgU4.js → git-branch-CwvUxj7C.js} +1 -1
  391. package/ui/dist/assets/{git-commit-horizontal-F5M84Kut.js → git-commit-horizontal-lxPzCvhD.js} +1 -1
  392. package/ui/dist/assets/{globe-CQWfr7hT.js → globe-D_WpJdsj.js} +1 -1
  393. package/ui/dist/assets/{hash-nKC9gtLg.js → hash-CA0hJ7vh.js} +1 -1
  394. package/ui/dist/assets/{history-DfFSA9xJ.js → history-CEWMLELs.js} +1 -1
  395. package/ui/dist/assets/inbox-ehtOptTV.js +1 -0
  396. package/ui/dist/assets/{index-a4Fxq0Hb.js → index-C1rhbml4.js} +3 -3
  397. package/ui/dist/assets/index-CR8gfCHv.js +1 -0
  398. package/ui/dist/assets/index-DVXMpWai.js +1 -0
  399. package/ui/dist/assets/index-DaDJMM2v.js +1 -0
  400. package/ui/dist/assets/index-Djdq_0xu.js +1 -0
  401. package/ui/dist/assets/index-M46Gcb8K.css +1 -0
  402. package/ui/dist/assets/index-sEBN7w8J.js +109 -0
  403. package/ui/dist/assets/layers-C6Mhf8Nk.js +1 -0
  404. package/ui/dist/assets/{layout-dashboard-WmgjMhWF.js → layout-dashboard-BRUM0kpT.js} +1 -1
  405. package/ui/dist/assets/{lightbulb-Bo8hEr7B.js → lightbulb-CN2q1O5l.js} +1 -1
  406. package/ui/dist/assets/{link-2-YqrpQXBH.js → link-2-CC4E28yJ.js} +1 -1
  407. package/ui/dist/assets/markdown-renderer-C6ENbB0u.js +10 -0
  408. package/ui/dist/assets/markdown-renderer-CfVKi3_s.css +1 -0
  409. package/ui/dist/assets/{message-square-CD0H5hot.js → message-square-Bbb241am.js} +1 -1
  410. package/ui/dist/assets/package-CwT3IzFx.js +1 -0
  411. package/ui/dist/assets/{pencil-DpFnj5dn.js → pencil-CDmiHzoj.js} +1 -1
  412. package/ui/dist/assets/{play-DVgea_jT.js → play-tjy5jMQX.js} +1 -1
  413. package/ui/dist/assets/popover-CFHZf3pE.js +1 -0
  414. package/ui/dist/assets/progress-BboUHuLf.js +1 -0
  415. package/ui/dist/assets/{rocket-BFxPYGx9.js → rocket--8ZHgdXJ.js} +1 -1
  416. package/ui/dist/assets/select-n108rXny.js +1 -0
  417. package/ui/dist/assets/{send-eYnW_7n-.js → send-Cu7MR2Qh.js} +1 -1
  418. package/ui/dist/assets/server-DmodxZp-.js +1 -0
  419. package/ui/dist/assets/{settings-2-scXUOuE_.js → settings-2-CkRNqkxj.js} +1 -1
  420. package/ui/dist/assets/sheet-7aUJkyzU.js +1 -0
  421. package/ui/dist/assets/{shield-check-PEr7nmVw.js → shield-check-ViI3nMKE.js} +1 -1
  422. package/ui/dist/assets/{shield-off-CLtXio62.js → shield-off-DN3tagkn.js} +1 -1
  423. package/ui/dist/assets/skeleton-C0E1Nfro.js +1 -0
  424. package/ui/dist/assets/{smartphone-DusFfY0U.js → smartphone-5FghiXpA.js} +1 -1
  425. package/ui/dist/assets/{square-e1yxB2eR.js → square-DiNSx8K7.js} +1 -1
  426. package/ui/dist/assets/star-DhdFVidS.js +1 -0
  427. package/ui/dist/assets/switch-CIgVbZqQ.js +1 -0
  428. package/ui/dist/assets/table-BC56FVMV.js +1 -0
  429. package/ui/dist/assets/{tag-tAwMmQ9G.js → tag-CH_vQliw.js} +1 -1
  430. package/ui/dist/assets/textarea-CxDiKFXZ.js +1 -0
  431. package/ui/dist/assets/{timer-Vel1N3RP.js → timer-CdGVTb60.js} +1 -1
  432. package/ui/dist/assets/tooltip-BuW9A5UO.js +1 -0
  433. package/ui/dist/assets/{trash-2-eM-CNwsZ.js → trash-2-CucZJL0N.js} +1 -1
  434. package/ui/dist/assets/trending-down-BCezC1z2.js +1 -0
  435. package/ui/dist/assets/{trending-up-BGafmjRo.js → trending-up-C5OYX2k2.js} +1 -1
  436. package/ui/dist/assets/vendor-query-C0p7b53x.js +4 -0
  437. package/ui/dist/assets/vendor-react-Mc5_kfYG.js +12 -0
  438. package/ui/dist/assets/vendor-ui-CXPAUBFv.js +51 -0
  439. package/ui/dist/assets/{wand-sparkles-DPvcd9Pi.js → wand-sparkles-BaH6pJnc.js} +1 -1
  440. package/ui/dist/assets/{wrench-B8s3zYVV.js → wrench-CjxjP6ok.js} +1 -1
  441. package/ui/dist/index.html +5 -2
  442. package/dist/chat/auto-reply.d.ts +0 -90
  443. package/dist/chat/auto-reply.js +0 -272
  444. package/dist/chat/execution/pty.d.ts +0 -92
  445. package/dist/chat/execution/pty.js +0 -285
  446. package/dist/chat/execution/tools/glinr-ops.d.ts +0 -202
  447. package/dist/chat/execution/tools/glinr-ops.js +0 -694
  448. package/dist/cli/commands/browser.d.ts +0 -3
  449. package/dist/cli/commands/browser.js +0 -138
  450. package/dist/cli/commands/canvas.d.ts +0 -3
  451. package/dist/cli/commands/canvas.js +0 -155
  452. package/dist/cli/commands/nodes.d.ts +0 -3
  453. package/dist/cli/commands/nodes.js +0 -193
  454. package/dist/diagnostics/exporters.d.ts +0 -21
  455. package/dist/diagnostics/exporters.js +0 -138
  456. package/dist/diagnostics/index.d.ts +0 -10
  457. package/dist/diagnostics/index.js +0 -9
  458. package/dist/diagnostics/middleware.d.ts +0 -12
  459. package/dist/diagnostics/middleware.js +0 -58
  460. package/dist/diagnostics/tracer.d.ts +0 -133
  461. package/dist/diagnostics/tracer.js +0 -257
  462. package/dist/discovery/index.d.ts +0 -8
  463. package/dist/discovery/index.js +0 -7
  464. package/dist/discovery/mdns.d.ts +0 -40
  465. package/dist/discovery/mdns.js +0 -249
  466. package/dist/plugins/registry.d.ts +0 -122
  467. package/dist/plugins/registry.js +0 -352
  468. package/dist/plugins/sandbox.d.ts +0 -77
  469. package/dist/plugins/sandbox.js +0 -287
  470. package/dist/plugins/search/brave.d.ts +0 -9
  471. package/dist/plugins/search/brave.js +0 -157
  472. package/dist/plugins/search/duckduckgo.d.ts +0 -9
  473. package/dist/plugins/search/duckduckgo.js +0 -171
  474. package/dist/plugins/search/index.d.ts +0 -13
  475. package/dist/plugins/search/index.js +0 -23
  476. package/dist/plugins/search/searxng.d.ts +0 -9
  477. package/dist/plugins/search/searxng.js +0 -170
  478. package/dist/plugins/search/serper.d.ts +0 -9
  479. package/dist/plugins/search/serper.js +0 -135
  480. package/dist/plugins/search/tavily.d.ts +0 -9
  481. package/dist/plugins/search/tavily.js +0 -146
  482. package/dist/providers/adapters/anthropic.d.ts +0 -26
  483. package/dist/providers/adapters/anthropic.js +0 -306
  484. package/dist/providers/adapters/base.d.ts +0 -53
  485. package/dist/providers/adapters/base.js +0 -99
  486. package/dist/providers/adapters/ollama.d.ts +0 -30
  487. package/dist/providers/adapters/ollama.js +0 -292
  488. package/dist/utils/ai-cache.d.ts +0 -72
  489. package/dist/utils/ai-cache.js +0 -204
  490. package/dist/utils/file-lock.d.ts +0 -85
  491. package/dist/utils/file-lock.js +0 -204
  492. package/ui/dist/assets/ActivityView-DIPQSJ_d.js +0 -1
  493. package/ui/dist/assets/AgentList-CqyaYrcq.js +0 -1
  494. package/ui/dist/assets/AnalyticsDashboard-C-mjuGHT.js +0 -1
  495. package/ui/dist/assets/AreaChart-CfYWmbtr.js +0 -1
  496. package/ui/dist/assets/CartesianChart-BaQ3It0c.js +0 -36
  497. package/ui/dist/assets/ChatView-DxxQy6pl.js +0 -10
  498. package/ui/dist/assets/CostsDashboard-CDBBcGkg.js +0 -1
  499. package/ui/dist/assets/EstimateSelect-CDjf5qKl.js +0 -1
  500. package/ui/dist/assets/FloatingChatbot-CZHjvJIe.js +0 -2
  501. package/ui/dist/assets/InviteCodeManagement-DTm-IPTm.js +0 -2
  502. package/ui/dist/assets/ProjectIcon-BMRpnM04.js +0 -1
  503. package/ui/dist/assets/ProjectList-D85TN0i0.js +0 -4
  504. package/ui/dist/assets/StatusIndicator-yig0uZEA.js +0 -1
  505. package/ui/dist/assets/SummaryList-BvS5Idnu.js +0 -1
  506. package/ui/dist/assets/TaskDetail-zarC1fOt.js +0 -1
  507. package/ui/dist/assets/TaskList-CyJq3ANE.js +0 -1
  508. package/ui/dist/assets/TicketBoard-BlWr3-iH.js +0 -1
  509. package/ui/dist/assets/TicketDetail-DmqWKj2W.js +0 -1
  510. package/ui/dist/assets/TicketList-Scj4pMWa.js +0 -1
  511. package/ui/dist/assets/UserManagement-BH7uG7dw.js +0 -2
  512. package/ui/dist/assets/ViewSwitcher-3HzZUdWn.js +0 -1
  513. package/ui/dist/assets/alert-dialog-DWPb2IfQ.js +0 -7
  514. package/ui/dist/assets/badge-DEmc3Z_l.js +0 -1
  515. package/ui/dist/assets/brain-CfFdLVqb.js +0 -1
  516. package/ui/dist/assets/constants-DhDjZe4P.js +0 -1
  517. package/ui/dist/assets/dialog-BOdGWhgE.js +0 -1
  518. package/ui/dist/assets/index--JkIxVXb.js +0 -67
  519. package/ui/dist/assets/index-Ca3vk7Gq.js +0 -1
  520. package/ui/dist/assets/index-DHGvP9mp.js +0 -1
  521. package/ui/dist/assets/index-DeI8lKRR.js +0 -1
  522. package/ui/dist/assets/index-WclMPci1.css +0 -1
  523. package/ui/dist/assets/index-Z4-RtZcs.js +0 -1
  524. package/ui/dist/assets/layers-DFeLExSa.js +0 -1
  525. package/ui/dist/assets/markdown-renderer-Croje6Xe.js +0 -36
  526. package/ui/dist/assets/popover-JXecfWG5.js +0 -1
  527. package/ui/dist/assets/progress-C1ghf1Fu.js +0 -1
  528. package/ui/dist/assets/select-MADP8m6Q.js +0 -1
  529. package/ui/dist/assets/server-CPMaysH8.js +0 -1
  530. package/ui/dist/assets/sheet-r6NSOxi-.js +0 -1
  531. package/ui/dist/assets/skeleton-C9oEzNlU.js +0 -1
  532. package/ui/dist/assets/switch-tNs0n-kz.js +0 -1
  533. package/ui/dist/assets/table-CXxtLicg.js +0 -1
  534. package/ui/dist/assets/textarea-BjiEeIWh.js +0 -1
  535. package/ui/dist/assets/tooltip-ZMwtfr1J.js +0 -1
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Auto-Memory Extractor
3
+ *
4
+ * Extracts durable insights from conversation turns using local
5
+ * keyword/pattern matching — no LLM calls required.
6
+ *
7
+ * Memories are stored at .profclaw/memory/entries.json
8
+ */
9
+ export type MemoryType = 'decision' | 'preference' | 'context' | 'pattern' | 'error_fix';
10
+ export interface MemoryEntry {
11
+ id: string;
12
+ type: MemoryType;
13
+ content: string;
14
+ source: {
15
+ sessionId: string;
16
+ turnIndex: number;
17
+ };
18
+ createdAt: number;
19
+ /** 0-1, decays over time via prune() */
20
+ relevance: number;
21
+ }
22
+ export interface TurnInput {
23
+ userMessage: string;
24
+ assistantResponse: string;
25
+ toolCalls?: Array<{
26
+ name: string;
27
+ args: unknown;
28
+ result: unknown;
29
+ }>;
30
+ sessionId: string;
31
+ turnIndex: number;
32
+ }
33
+ export declare class AutoMemoryExtractor {
34
+ private memoryDir;
35
+ private entries;
36
+ /** Tool sequence tracking keyed by sequence fingerprint */
37
+ private toolSequences;
38
+ constructor(projectRoot?: string);
39
+ extractFromTurn(turn: TurnInput): MemoryEntry[];
40
+ search(query: string, limit?: number): MemoryEntry[];
41
+ getAll(): MemoryEntry[];
42
+ save(): void;
43
+ load(): void;
44
+ /**
45
+ * Remove entries that are too old or too low relevance.
46
+ * Also applies time-based decay to remaining entries.
47
+ * Returns the count of pruned entries.
48
+ */
49
+ prune(maxAgeMs?: number, minRelevance?: number): number;
50
+ private entriesFilePath;
51
+ private ensureDir;
52
+ }
53
+ /**
54
+ * Returns the process-level singleton AutoMemoryExtractor, rooted at cwd().
55
+ */
56
+ export declare function getAutoMemoryExtractor(): AutoMemoryExtractor;
57
+ /** Exported for test injection. */
58
+ export declare function _resetAutoMemoryExtractorSingleton(): void;
59
+ //# sourceMappingURL=auto-memory.d.ts.map
@@ -0,0 +1,310 @@
1
+ /**
2
+ * Auto-Memory Extractor
3
+ *
4
+ * Extracts durable insights from conversation turns using local
5
+ * keyword/pattern matching — no LLM calls required.
6
+ *
7
+ * Memories are stored at .profclaw/memory/entries.json
8
+ */
9
+ import * as fs from 'fs';
10
+ import * as path from 'path';
11
+ import { randomUUID } from 'node:crypto';
12
+ const EXTRACTION_RULES = [
13
+ // Decision: "no, use X instead" / "don't do X" / "use X not Y"
14
+ {
15
+ type: 'decision',
16
+ userPatterns: [
17
+ /\bno[,.]?\s+use\s+(.+?)\s+instead\b/i,
18
+ /\bdon['']?t\s+use\s+(.+?)[\.,]/i,
19
+ /\buse\s+(.+?)\s+(?:not|instead of)\s+(.+?)[\.,]/i,
20
+ /\bplease\s+(?:use|switch to)\s+(.+?)\s+instead\b/i,
21
+ /\bthat'?s?\s+(?:wrong|incorrect)[,.]?\s+(?:it\s+should\s+be|use)\s+(.+?)[\.,]/i,
22
+ ],
23
+ format: (userMsg) => `Decision: ${userMsg.trim()}`,
24
+ },
25
+ // Preference: "I prefer X" / "I like X" / "always use X"
26
+ {
27
+ type: 'preference',
28
+ userPatterns: [
29
+ /\bI\s+prefer\s+(.+?)[\.,]/i,
30
+ /\bI\s+(?:always|usually)\s+use\s+(.+?)[\.,]/i,
31
+ /\bI\s+like\s+(?:to\s+use\s+)?(.+?)[\.,]/i,
32
+ /\balways\s+use\s+(.+?)[\.,]/i,
33
+ /\bmy\s+preferred\s+(.+?)\s+is\s+(.+?)[\.,]/i,
34
+ ],
35
+ format: (userMsg) => `Preference: ${userMsg.trim()}`,
36
+ },
37
+ // Context: "this project uses X" / "we use X" / "the stack is X"
38
+ {
39
+ type: 'context',
40
+ userPatterns: [
41
+ /\bthis\s+project\s+uses?\s+(.+?)[\.,]/i,
42
+ /\bwe\s+(?:use|are using)\s+(.+?)[\.,]/i,
43
+ /\bthe\s+stack\s+is\s+(.+?)[\.,]/i,
44
+ /\bour\s+(?:app|service|backend|frontend)\s+(?:uses?|runs?)\s+(.+?)[\.,]/i,
45
+ /\bbuilt\s+(?:with|on|using)\s+(.+?)[\.,]/i,
46
+ ],
47
+ format: (userMsg) => `Context: ${userMsg.trim()}`,
48
+ },
49
+ // Error fix: "the fix was X" / "the issue was X" / "solved by X"
50
+ {
51
+ type: 'error_fix',
52
+ userPatterns: [
53
+ /\bthe\s+(?:fix|solution)\s+(?:was|is)\s+(.+?)[\.,]/i,
54
+ /\bthe\s+(?:issue|problem|bug)\s+(?:was|is)\s+(.+?)[\.,]/i,
55
+ /\bsolved\s+by\s+(.+?)[\.,]/i,
56
+ /\bfixed\s+(?:by|with|using)\s+(.+?)[\.,]/i,
57
+ ],
58
+ assistantPatterns: [
59
+ /\bthe\s+(?:fix|issue|problem)\s+(?:was|is)\s+(.+?)[\.,]/i,
60
+ /\bthis\s+(?:was\s+caused|happened)\s+(?:by|because)\s+(.+?)[\.,]/i,
61
+ /\broot\s+cause[:\s]+(.+?)[\.,]/i,
62
+ ],
63
+ format: (userMsg, assistantMsg, match) => {
64
+ const src = match ? assistantMsg : userMsg;
65
+ return `Error fix: ${src.trim()}`;
66
+ },
67
+ },
68
+ // Context: assistant explains project facts
69
+ {
70
+ type: 'context',
71
+ assistantPatterns: [
72
+ /\bthis\s+project\s+uses?\s+(.+?)[\.,]/i,
73
+ /\byou(?:'re|\s+are)\s+using\s+(.+?)[\.,]/i,
74
+ ],
75
+ format: (_userMsg, assistantMsg) => `Context: ${assistantMsg.trim()}`,
76
+ },
77
+ ];
78
+ const PATTERN_THRESHOLD = 3;
79
+ // ---------------------------------------------------------------------------
80
+ // AutoMemoryExtractor
81
+ // ---------------------------------------------------------------------------
82
+ let _instance = null;
83
+ export class AutoMemoryExtractor {
84
+ memoryDir;
85
+ entries;
86
+ /** Tool sequence tracking keyed by sequence fingerprint */
87
+ toolSequences;
88
+ constructor(projectRoot) {
89
+ const root = projectRoot ?? process.cwd();
90
+ this.memoryDir = path.join(root, '.profclaw', 'memory');
91
+ this.entries = [];
92
+ this.toolSequences = new Map();
93
+ this.load();
94
+ }
95
+ // -------------------------------------------------------------------------
96
+ // Core: extract memories from a completed turn
97
+ // -------------------------------------------------------------------------
98
+ extractFromTurn(turn) {
99
+ const extracted = [];
100
+ const { userMessage, assistantResponse, toolCalls, sessionId, turnIndex } = turn;
101
+ // Apply each rule
102
+ for (const rule of EXTRACTION_RULES) {
103
+ let matchedUser = null;
104
+ let matchedAssistant = null;
105
+ if (rule.userPatterns) {
106
+ for (const pat of rule.userPatterns) {
107
+ const m = userMessage.match(pat);
108
+ if (m) {
109
+ matchedUser = m;
110
+ break;
111
+ }
112
+ }
113
+ }
114
+ if (rule.assistantPatterns) {
115
+ for (const pat of rule.assistantPatterns) {
116
+ const m = assistantResponse.match(pat);
117
+ if (m) {
118
+ matchedAssistant = m;
119
+ break;
120
+ }
121
+ }
122
+ }
123
+ // Determine if the rule fires
124
+ let fires = false;
125
+ let matchRef = null;
126
+ if (rule.userPatterns && rule.assistantPatterns) {
127
+ // Both required when both pattern sets are defined and requireBoth is true
128
+ if (rule.requireBoth) {
129
+ fires = matchedUser !== null && matchedAssistant !== null;
130
+ matchRef = matchedAssistant;
131
+ }
132
+ else {
133
+ fires = matchedUser !== null || matchedAssistant !== null;
134
+ matchRef = matchedAssistant ?? matchedUser;
135
+ }
136
+ }
137
+ else if (rule.userPatterns) {
138
+ fires = matchedUser !== null;
139
+ matchRef = matchedUser;
140
+ }
141
+ else if (rule.assistantPatterns) {
142
+ fires = matchedAssistant !== null;
143
+ matchRef = matchedAssistant;
144
+ }
145
+ if (!fires)
146
+ continue;
147
+ const content = rule.format(userMessage, assistantResponse, matchRef);
148
+ // Avoid duplicate entries with identical content
149
+ if (this.entries.some((e) => e.content === content))
150
+ continue;
151
+ const entry = {
152
+ id: randomUUID(),
153
+ type: rule.type,
154
+ content,
155
+ source: { sessionId, turnIndex },
156
+ createdAt: Date.now(),
157
+ relevance: 1.0,
158
+ };
159
+ extracted.push(entry);
160
+ this.entries.push(entry);
161
+ }
162
+ // Pattern memory: detect repeated tool sequences
163
+ if (toolCalls && toolCalls.length >= 2) {
164
+ const sequence = toolCalls.map((tc) => tc.name).join(' → ');
165
+ const existing = this.toolSequences.get(sequence);
166
+ if (existing) {
167
+ existing.count += 1;
168
+ existing.lastTurnIndex = turnIndex;
169
+ if (existing.count === PATTERN_THRESHOLD) {
170
+ const content = `Pattern: tool chain "${sequence}" used ${existing.count}+ times`;
171
+ if (!this.entries.some((e) => e.content === content)) {
172
+ const entry = {
173
+ id: randomUUID(),
174
+ type: 'pattern',
175
+ content,
176
+ source: { sessionId, turnIndex },
177
+ createdAt: Date.now(),
178
+ relevance: 1.0,
179
+ };
180
+ extracted.push(entry);
181
+ this.entries.push(entry);
182
+ }
183
+ }
184
+ }
185
+ else {
186
+ this.toolSequences.set(sequence, {
187
+ sequence,
188
+ count: 1,
189
+ lastTurnIndex: turnIndex,
190
+ sessionId,
191
+ });
192
+ }
193
+ }
194
+ if (extracted.length > 0) {
195
+ this.save();
196
+ }
197
+ return extracted;
198
+ }
199
+ // -------------------------------------------------------------------------
200
+ // Search: keyword matching + relevance scoring
201
+ // -------------------------------------------------------------------------
202
+ search(query, limit = 10) {
203
+ if (!query.trim())
204
+ return this.entries.slice(0, limit);
205
+ const words = query
206
+ .toLowerCase()
207
+ .split(/\s+/)
208
+ .filter((w) => w.length >= 2);
209
+ const scored = this.entries.map((entry) => {
210
+ const lower = entry.content.toLowerCase();
211
+ const matchCount = words.filter((w) => lower.includes(w)).length;
212
+ const score = (matchCount / Math.max(words.length, 1)) * entry.relevance;
213
+ return { entry, score };
214
+ });
215
+ return scored
216
+ .filter(({ score }) => score > 0)
217
+ .sort((a, b) => b.score - a.score)
218
+ .slice(0, limit)
219
+ .map(({ entry }) => entry);
220
+ }
221
+ // -------------------------------------------------------------------------
222
+ // Accessors
223
+ // -------------------------------------------------------------------------
224
+ getAll() {
225
+ return [...this.entries];
226
+ }
227
+ // -------------------------------------------------------------------------
228
+ // Persistence
229
+ // -------------------------------------------------------------------------
230
+ save() {
231
+ try {
232
+ this.ensureDir();
233
+ const filePath = this.entriesFilePath();
234
+ fs.writeFileSync(filePath, JSON.stringify({ entries: this.entries, sequences: Array.from(this.toolSequences.entries()) }, null, 2), 'utf8');
235
+ }
236
+ catch (err) {
237
+ console.error('[AutoMemoryExtractor] Failed to save:', err);
238
+ }
239
+ }
240
+ load() {
241
+ const filePath = this.entriesFilePath();
242
+ if (!fs.existsSync(filePath))
243
+ return;
244
+ try {
245
+ const raw = fs.readFileSync(filePath, 'utf8');
246
+ const parsed = JSON.parse(raw);
247
+ this.entries = Array.isArray(parsed.entries) ? parsed.entries : [];
248
+ if (Array.isArray(parsed.sequences)) {
249
+ this.toolSequences = new Map(parsed.sequences);
250
+ }
251
+ }
252
+ catch (err) {
253
+ console.error('[AutoMemoryExtractor] Failed to load:', err);
254
+ this.entries = [];
255
+ }
256
+ }
257
+ // -------------------------------------------------------------------------
258
+ // Pruning
259
+ // -------------------------------------------------------------------------
260
+ /**
261
+ * Remove entries that are too old or too low relevance.
262
+ * Also applies time-based decay to remaining entries.
263
+ * Returns the count of pruned entries.
264
+ */
265
+ prune(maxAgeMs = 30 * 24 * 60 * 60 * 1000, minRelevance = 0.1) {
266
+ const now = Date.now();
267
+ const before = this.entries.length;
268
+ this.entries = this.entries
269
+ .map((e) => {
270
+ // Exponential decay: half-life = maxAgeMs / 2
271
+ const ageFraction = (now - e.createdAt) / maxAgeMs;
272
+ const decayed = e.relevance * Math.exp(-Math.LN2 * ageFraction);
273
+ return { ...e, relevance: Math.max(0, decayed) };
274
+ })
275
+ .filter((e) => {
276
+ const tooOld = now - e.createdAt > maxAgeMs;
277
+ const tooWeak = e.relevance < minRelevance;
278
+ return !tooOld && !tooWeak;
279
+ });
280
+ const pruned = before - this.entries.length;
281
+ if (pruned > 0)
282
+ this.save();
283
+ return pruned;
284
+ }
285
+ // -------------------------------------------------------------------------
286
+ // Private helpers
287
+ // -------------------------------------------------------------------------
288
+ entriesFilePath() {
289
+ return path.join(this.memoryDir, 'entries.json');
290
+ }
291
+ ensureDir() {
292
+ if (!fs.existsSync(this.memoryDir)) {
293
+ fs.mkdirSync(this.memoryDir, { recursive: true });
294
+ }
295
+ }
296
+ }
297
+ /**
298
+ * Returns the process-level singleton AutoMemoryExtractor, rooted at cwd().
299
+ */
300
+ export function getAutoMemoryExtractor() {
301
+ if (!_instance) {
302
+ _instance = new AutoMemoryExtractor();
303
+ }
304
+ return _instance;
305
+ }
306
+ /** Exported for test injection. */
307
+ export function _resetAutoMemoryExtractorSingleton() {
308
+ _instance = null;
309
+ }
310
+ //# sourceMappingURL=auto-memory.js.map
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Checkpoint Manager
3
+ *
4
+ * Saves and restores executor state so long-running agentic sessions can be
5
+ * interrupted and resumed without losing progress. Checkpoints live at
6
+ * .profclaw/checkpoints/<sessionId>.json relative to the project root (or the
7
+ * current working directory when no root is supplied).
8
+ */
9
+ import type { ModelMessage } from 'ai';
10
+ export interface ExecutorCheckpoint {
11
+ /** Session that produced this checkpoint */
12
+ sessionId: string;
13
+ /** Human-readable description of the original task */
14
+ taskDescription?: string;
15
+ /** How many steps have been executed so far */
16
+ currentStep: number;
17
+ /** Expected total steps (best-effort estimate) */
18
+ totalSteps: number;
19
+ /** Full message history up to this point */
20
+ messages: ModelMessage[];
21
+ /** Cumulative tokens consumed */
22
+ tokensUsed: number;
23
+ /** Estimated dollar cost so far */
24
+ estimatedCost: number;
25
+ /** Every tool call made so far: name, success flag, and the step it ran in */
26
+ toolCallHistory: Array<{
27
+ name: string;
28
+ success: boolean;
29
+ step: number;
30
+ }>;
31
+ /** Files that have already been processed (for file-iteration tasks) */
32
+ completedFiles?: string[];
33
+ /** Free-text description of what still needs to happen */
34
+ remainingWork?: string;
35
+ /** Unix epoch ms — when the checkpoint was first created */
36
+ createdAt: number;
37
+ /** Unix epoch ms — when the checkpoint was last saved */
38
+ updatedAt: number;
39
+ }
40
+ /** Lightweight summary returned by list() */
41
+ export interface CheckpointSummary {
42
+ sessionId: string;
43
+ taskDescription?: string;
44
+ step: number;
45
+ updatedAt: number;
46
+ }
47
+ export declare class CheckpointManager {
48
+ private readonly checkpointsDir;
49
+ constructor(projectRoot?: string);
50
+ private filePath;
51
+ private ensureDir;
52
+ /**
53
+ * Persist a checkpoint to disk. Creates .profclaw/checkpoints/ if needed.
54
+ */
55
+ save(checkpoint: ExecutorCheckpoint): Promise<void>;
56
+ /**
57
+ * Load a previously saved checkpoint. Returns null when none exists.
58
+ */
59
+ load(sessionId: string): Promise<ExecutorCheckpoint | null>;
60
+ /**
61
+ * List all checkpoints, sorted newest first.
62
+ */
63
+ list(): Promise<CheckpointSummary[]>;
64
+ /**
65
+ * Delete a checkpoint after the session has completed successfully.
66
+ */
67
+ remove(sessionId: string): Promise<void>;
68
+ /**
69
+ * Find a resumable checkpoint whose taskDescription loosely matches the
70
+ * given description (case-insensitive substring + word overlap heuristic).
71
+ * Returns the most recently updated match, or null if nothing qualifies.
72
+ */
73
+ findResumable(taskDescription: string): Promise<ExecutorCheckpoint | null>;
74
+ }
75
+ export declare function getCheckpointManager(projectRoot?: string): CheckpointManager;
76
+ //# sourceMappingURL=checkpoint-manager.d.ts.map
@@ -0,0 +1,156 @@
1
+ /**
2
+ * Checkpoint Manager
3
+ *
4
+ * Saves and restores executor state so long-running agentic sessions can be
5
+ * interrupted and resumed without losing progress. Checkpoints live at
6
+ * .profclaw/checkpoints/<sessionId>.json relative to the project root (or the
7
+ * current working directory when no root is supplied).
8
+ */
9
+ import { mkdir, readFile, writeFile, unlink, readdir } from 'node:fs/promises';
10
+ import { existsSync } from 'node:fs';
11
+ import { join, resolve } from 'node:path';
12
+ import { logger } from '../utils/logger.js';
13
+ // ─── CheckpointManager ────────────────────────────────────────────────────────
14
+ export class CheckpointManager {
15
+ checkpointsDir;
16
+ constructor(projectRoot) {
17
+ const root = projectRoot ? resolve(projectRoot) : process.cwd();
18
+ this.checkpointsDir = join(root, '.profclaw', 'checkpoints');
19
+ }
20
+ // ── Private helpers ──────────────────────────────────────────────────────
21
+ filePath(sessionId) {
22
+ return join(this.checkpointsDir, `${sessionId}.json`);
23
+ }
24
+ async ensureDir() {
25
+ if (!existsSync(this.checkpointsDir)) {
26
+ await mkdir(this.checkpointsDir, { recursive: true });
27
+ }
28
+ }
29
+ // ── Public API ───────────────────────────────────────────────────────────
30
+ /**
31
+ * Persist a checkpoint to disk. Creates .profclaw/checkpoints/ if needed.
32
+ */
33
+ async save(checkpoint) {
34
+ await this.ensureDir();
35
+ const path = this.filePath(checkpoint.sessionId);
36
+ const payload = JSON.stringify({ ...checkpoint, updatedAt: Date.now() }, null, 2);
37
+ await writeFile(path, payload, 'utf-8');
38
+ logger.debug('[CheckpointManager] Saved checkpoint', {
39
+ sessionId: checkpoint.sessionId,
40
+ step: checkpoint.currentStep,
41
+ path,
42
+ });
43
+ }
44
+ /**
45
+ * Load a previously saved checkpoint. Returns null when none exists.
46
+ */
47
+ async load(sessionId) {
48
+ const path = this.filePath(sessionId);
49
+ try {
50
+ const raw = await readFile(path, 'utf-8');
51
+ const parsed = JSON.parse(raw);
52
+ logger.debug('[CheckpointManager] Loaded checkpoint', {
53
+ sessionId,
54
+ step: parsed.currentStep,
55
+ });
56
+ return parsed;
57
+ }
58
+ catch {
59
+ return null;
60
+ }
61
+ }
62
+ /**
63
+ * List all checkpoints, sorted newest first.
64
+ */
65
+ async list() {
66
+ if (!existsSync(this.checkpointsDir))
67
+ return [];
68
+ let files;
69
+ try {
70
+ files = await readdir(this.checkpointsDir);
71
+ }
72
+ catch {
73
+ return [];
74
+ }
75
+ const summaries = [];
76
+ for (const file of files) {
77
+ if (!file.endsWith('.json'))
78
+ continue;
79
+ try {
80
+ const raw = await readFile(join(this.checkpointsDir, file), 'utf-8');
81
+ const cp = JSON.parse(raw);
82
+ summaries.push({
83
+ sessionId: cp.sessionId,
84
+ taskDescription: cp.taskDescription,
85
+ step: cp.currentStep,
86
+ updatedAt: cp.updatedAt,
87
+ });
88
+ }
89
+ catch {
90
+ // Skip malformed files
91
+ }
92
+ }
93
+ return summaries.sort((a, b) => b.updatedAt - a.updatedAt);
94
+ }
95
+ /**
96
+ * Delete a checkpoint after the session has completed successfully.
97
+ */
98
+ async remove(sessionId) {
99
+ const path = this.filePath(sessionId);
100
+ try {
101
+ await unlink(path);
102
+ logger.debug('[CheckpointManager] Removed checkpoint', { sessionId });
103
+ }
104
+ catch {
105
+ // Already gone — not an error
106
+ }
107
+ }
108
+ /**
109
+ * Find a resumable checkpoint whose taskDescription loosely matches the
110
+ * given description (case-insensitive substring + word overlap heuristic).
111
+ * Returns the most recently updated match, or null if nothing qualifies.
112
+ */
113
+ async findResumable(taskDescription) {
114
+ const all = await this.list();
115
+ if (all.length === 0)
116
+ return null;
117
+ const needle = taskDescription.toLowerCase();
118
+ const needleWords = new Set(needle.split(/\W+/).filter(Boolean));
119
+ let bestScore = 0;
120
+ let bestId = null;
121
+ for (const summary of all) {
122
+ if (!summary.taskDescription)
123
+ continue;
124
+ const hay = summary.taskDescription.toLowerCase();
125
+ // Substring match is a strong signal
126
+ if (hay.includes(needle) || needle.includes(hay)) {
127
+ // Prefer the most recently updated substring match
128
+ if (summary.updatedAt > (bestScore === 2 ? 0 : -1)) {
129
+ bestScore = 2;
130
+ bestId = summary.sessionId;
131
+ }
132
+ continue;
133
+ }
134
+ // Word-overlap fallback
135
+ const hayWords = hay.split(/\W+/).filter(Boolean);
136
+ const overlap = hayWords.filter((w) => needleWords.has(w)).length;
137
+ const ratio = needleWords.size > 0 ? overlap / needleWords.size : 0;
138
+ if (ratio >= 0.5 && ratio > bestScore) {
139
+ bestScore = ratio;
140
+ bestId = summary.sessionId;
141
+ }
142
+ }
143
+ if (!bestId)
144
+ return null;
145
+ return this.load(bestId);
146
+ }
147
+ }
148
+ // ─── Singleton ────────────────────────────────────────────────────────────────
149
+ let _instance;
150
+ export function getCheckpointManager(projectRoot) {
151
+ if (!_instance) {
152
+ _instance = new CheckpointManager(projectRoot);
153
+ }
154
+ return _instance;
155
+ }
156
+ //# sourceMappingURL=checkpoint-manager.js.map
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Tool Circuit Breaker
3
+ *
4
+ * Prevents tools from being called repeatedly when they are failing.
5
+ * Implements the standard circuit breaker pattern:
6
+ * closed → (3 failures in 2 min) → open → (cooldown expires) → half-open
7
+ * half-open → (1 success) → closed
8
+ * half-open → (1 failure) → open (doubled cooldown)
9
+ */
10
+ export type CircuitBreakerStateValue = 'closed' | 'open' | 'half-open';
11
+ export interface CircuitBreakerState {
12
+ state: CircuitBreakerStateValue;
13
+ failureCount: number;
14
+ lastFailureAt: number;
15
+ cooldownMs: number;
16
+ }
17
+ export interface CanExecuteResult {
18
+ allowed: boolean;
19
+ reason?: string;
20
+ }
21
+ export declare class ToolCircuitBreaker {
22
+ private breakers;
23
+ private readonly failureThreshold;
24
+ private readonly windowMs;
25
+ constructor(failureThreshold?: number, windowMs?: number);
26
+ /**
27
+ * Check whether a tool is allowed to execute.
28
+ * Transitions open → half-open when the cooldown has expired.
29
+ */
30
+ canExecute(toolName: string): CanExecuteResult;
31
+ /**
32
+ * Record a successful tool execution.
33
+ * In half-open state this closes the circuit.
34
+ */
35
+ recordSuccess(toolName: string): void;
36
+ /**
37
+ * Record a failed tool execution.
38
+ * Counts failures within the time window and trips the breaker when the
39
+ * threshold is reached. In half-open state it immediately re-opens with
40
+ * a doubled cooldown.
41
+ */
42
+ recordFailure(toolName: string): void;
43
+ /**
44
+ * Reset the circuit breaker for a specific tool, or all tools if no name is given.
45
+ */
46
+ reset(toolName?: string): void;
47
+ /**
48
+ * Return a deep snapshot of all breaker states.
49
+ * Mutations to the live breakers do not affect the returned map.
50
+ */
51
+ getStatus(): Map<string, CircuitBreakerState>;
52
+ private getOrCreate;
53
+ }
54
+ //# sourceMappingURL=circuit-breaker.d.ts.map