@monoes/monomindcli 2.8.3 → 2.9.1

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 (377) hide show
  1. package/.claude/helpers/auto-memory-hook.mjs +0 -0
  2. package/.claude/helpers/handlers/route-handler.cjs +12 -0
  3. package/.claude/helpers/handlers/session-restore-handler.cjs +28 -7
  4. package/.claude/helpers/hook-handler.cjs +0 -0
  5. package/.claude/helpers/utils/micro-agents.cjs +22 -0
  6. package/.claude/skills/monodesign/scripts/live/sveltekit-adapter.mjs +11 -6
  7. package/.claude/skills/monodesign/scripts/live-inject.mjs +20 -7
  8. package/.claude/skills/monodesign/scripts/live-server.mjs +38 -2
  9. package/LICENSE +191 -0
  10. package/README.md +8 -6
  11. package/dist/src/browser/dashboard/server.d.ts +5 -0
  12. package/dist/src/browser/dashboard/server.d.ts.map +1 -1
  13. package/dist/src/browser/dashboard/server.js +59 -4
  14. package/dist/src/browser/dashboard/server.js.map +1 -1
  15. package/dist/src/browser/dashboard/ui.html +18 -8
  16. package/dist/src/browser/workflow/store.d.ts.map +1 -1
  17. package/dist/src/browser/workflow/store.js +3 -2
  18. package/dist/src/browser/workflow/store.js.map +1 -1
  19. package/dist/src/capabilities/cap-documents.d.ts.map +1 -1
  20. package/dist/src/capabilities/cap-documents.js +14 -9
  21. package/dist/src/capabilities/cap-documents.js.map +1 -1
  22. package/dist/src/commands/design-palette.d.ts +5 -0
  23. package/dist/src/commands/design-palette.d.ts.map +1 -1
  24. package/dist/src/commands/design-palette.js +8 -5
  25. package/dist/src/commands/design-palette.js.map +1 -1
  26. package/dist/src/commands/doctor.d.ts.map +1 -1
  27. package/dist/src/commands/doctor.js +22 -18
  28. package/dist/src/commands/doctor.js.map +1 -1
  29. package/dist/src/commands/download-embeddings.d.ts +8 -0
  30. package/dist/src/commands/download-embeddings.d.ts.map +1 -0
  31. package/dist/src/commands/download-embeddings.js +34 -0
  32. package/dist/src/commands/download-embeddings.js.map +1 -0
  33. package/dist/src/commands/hooks.d.ts.map +1 -1
  34. package/dist/src/commands/hooks.js +14 -0
  35. package/dist/src/commands/hooks.js.map +1 -1
  36. package/dist/src/commands/index.d.ts.map +1 -1
  37. package/dist/src/commands/index.js +4 -0
  38. package/dist/src/commands/index.js.map +1 -1
  39. package/dist/src/commands/init-wizard.js +1 -1
  40. package/dist/src/commands/init-wizard.js.map +1 -1
  41. package/dist/src/commands/init.d.ts.map +1 -1
  42. package/dist/src/commands/init.js +48 -1
  43. package/dist/src/commands/init.js.map +1 -1
  44. package/dist/src/commands/monograph.d.ts.map +1 -1
  45. package/dist/src/commands/monograph.js +35 -1
  46. package/dist/src/commands/monograph.js.map +1 -1
  47. package/dist/src/commands/org-observe.d.ts +10 -0
  48. package/dist/src/commands/org-observe.d.ts.map +1 -1
  49. package/dist/src/commands/org-observe.js +195 -31
  50. package/dist/src/commands/org-observe.js.map +1 -1
  51. package/dist/src/commands/org.d.ts +1 -0
  52. package/dist/src/commands/org.d.ts.map +1 -1
  53. package/dist/src/commands/org.js +139 -3
  54. package/dist/src/commands/org.js.map +1 -1
  55. package/dist/src/commands/route.d.ts +1 -9
  56. package/dist/src/commands/route.d.ts.map +1 -1
  57. package/dist/src/commands/route.js +42 -65
  58. package/dist/src/commands/route.js.map +1 -1
  59. package/dist/src/commands/security-cve.d.ts.map +1 -1
  60. package/dist/src/commands/security-cve.js +2 -1
  61. package/dist/src/commands/security-cve.js.map +1 -1
  62. package/dist/src/index.d.ts +0 -10
  63. package/dist/src/index.d.ts.map +1 -1
  64. package/dist/src/index.js +4 -15
  65. package/dist/src/index.js.map +1 -1
  66. package/dist/src/init/copy-assets.d.ts +17 -0
  67. package/dist/src/init/copy-assets.d.ts.map +1 -0
  68. package/dist/src/init/copy-assets.js +271 -0
  69. package/dist/src/init/copy-assets.js.map +1 -0
  70. package/dist/src/init/executor.d.ts +2 -30
  71. package/dist/src/init/executor.d.ts.map +1 -1
  72. package/dist/src/init/executor.js +56 -2493
  73. package/dist/src/init/executor.js.map +1 -1
  74. package/dist/src/init/geminimd-generator.js +2 -2
  75. package/dist/src/init/helpers-generator.d.ts.map +1 -1
  76. package/dist/src/init/helpers-generator.js +9 -0
  77. package/dist/src/init/helpers-generator.js.map +1 -1
  78. package/dist/src/init/kimi-generator.js +3 -3
  79. package/dist/src/init/kimi-generator.js.map +1 -1
  80. package/dist/src/init/settings-generator.d.ts.map +1 -1
  81. package/dist/src/init/settings-generator.js +0 -4
  82. package/dist/src/init/settings-generator.js.map +1 -1
  83. package/dist/src/init/shared.d.ts +112 -0
  84. package/dist/src/init/shared.d.ts.map +1 -0
  85. package/dist/src/init/shared.js +475 -0
  86. package/dist/src/init/shared.js.map +1 -0
  87. package/dist/src/init/statusline-generator.d.ts.map +1 -1
  88. package/dist/src/init/statusline-generator.js +37 -0
  89. package/dist/src/init/statusline-generator.js.map +1 -1
  90. package/dist/src/init/types.d.ts +1 -1
  91. package/dist/src/init/types.d.ts.map +1 -1
  92. package/dist/src/init/upgrade.d.ts +34 -0
  93. package/dist/src/init/upgrade.d.ts.map +1 -0
  94. package/dist/src/init/upgrade.js +477 -0
  95. package/dist/src/init/upgrade.js.map +1 -0
  96. package/dist/src/init/write-antigravity.d.ts +13 -0
  97. package/dist/src/init/write-antigravity.d.ts.map +1 -0
  98. package/dist/src/init/write-antigravity.js +117 -0
  99. package/dist/src/init/write-antigravity.js.map +1 -0
  100. package/dist/src/init/write-capabilities.d.ts +9 -0
  101. package/dist/src/init/write-capabilities.d.ts.map +1 -0
  102. package/dist/src/init/write-capabilities.js +392 -0
  103. package/dist/src/init/write-capabilities.js.map +1 -0
  104. package/dist/src/init/write-claude.d.ts +25 -0
  105. package/dist/src/init/write-claude.d.ts.map +1 -0
  106. package/dist/src/init/write-claude.js +279 -0
  107. package/dist/src/init/write-claude.js.map +1 -0
  108. package/dist/src/init/write-kimicode.d.ts +19 -0
  109. package/dist/src/init/write-kimicode.d.ts.map +1 -0
  110. package/dist/src/init/write-kimicode.js +223 -0
  111. package/dist/src/init/write-kimicode.js.map +1 -0
  112. package/dist/src/init/write-opencode.d.ts +14 -0
  113. package/dist/src/init/write-opencode.d.ts.map +1 -0
  114. package/dist/src/init/write-opencode.js +130 -0
  115. package/dist/src/init/write-opencode.js.map +1 -0
  116. package/dist/src/init/write-runtime-config.d.ts +14 -0
  117. package/dist/src/init/write-runtime-config.d.ts.map +1 -0
  118. package/dist/src/init/write-runtime-config.js +214 -0
  119. package/dist/src/init/write-runtime-config.js.map +1 -0
  120. package/dist/src/init/write-sample-org.d.ts +9 -0
  121. package/dist/src/init/write-sample-org.d.ts.map +1 -0
  122. package/dist/src/init/write-sample-org.js +39 -0
  123. package/dist/src/init/write-sample-org.js.map +1 -0
  124. package/dist/src/knowledge/eval/golden-set.js +1 -1
  125. package/dist/src/knowledge/eval/golden-set.js.map +1 -1
  126. package/dist/src/mcp-client.d.ts.map +1 -1
  127. package/dist/src/mcp-client.js +7 -3
  128. package/dist/src/mcp-client.js.map +1 -1
  129. package/dist/src/mcp-tools/analyze-tools.d.ts.map +1 -1
  130. package/dist/src/mcp-tools/analyze-tools.js +2 -25
  131. package/dist/src/mcp-tools/analyze-tools.js.map +1 -1
  132. package/dist/src/mcp-tools/auto-install.d.ts.map +1 -1
  133. package/dist/src/mcp-tools/auto-install.js +2 -1
  134. package/dist/src/mcp-tools/auto-install.js.map +1 -1
  135. package/dist/src/mcp-tools/hooks-routing.d.ts.map +1 -1
  136. package/dist/src/mcp-tools/hooks-routing.js +26 -0
  137. package/dist/src/mcp-tools/hooks-routing.js.map +1 -1
  138. package/dist/src/mcp-tools/memory-tools.d.ts.map +1 -1
  139. package/dist/src/mcp-tools/memory-tools.js +2 -37
  140. package/dist/src/mcp-tools/memory-tools.js.map +1 -1
  141. package/dist/src/mcp-tools/monodesign-tools.d.ts +19 -0
  142. package/dist/src/mcp-tools/monodesign-tools.d.ts.map +1 -0
  143. package/dist/src/mcp-tools/monodesign-tools.js +233 -0
  144. package/dist/src/mcp-tools/monodesign-tools.js.map +1 -0
  145. package/dist/src/mcp-tools/monograph/agent-history-tools.d.ts +5 -0
  146. package/dist/src/mcp-tools/monograph/agent-history-tools.d.ts.map +1 -0
  147. package/dist/src/mcp-tools/monograph/agent-history-tools.js +177 -0
  148. package/dist/src/mcp-tools/monograph/agent-history-tools.js.map +1 -0
  149. package/dist/src/mcp-tools/monograph/build-tools.d.ts +9 -0
  150. package/dist/src/mcp-tools/monograph/build-tools.d.ts.map +1 -0
  151. package/dist/src/mcp-tools/monograph/build-tools.js +299 -0
  152. package/dist/src/mcp-tools/monograph/build-tools.js.map +1 -0
  153. package/dist/src/mcp-tools/monograph/group-tools.d.ts +10 -0
  154. package/dist/src/mcp-tools/monograph/group-tools.d.ts.map +1 -0
  155. package/dist/src/mcp-tools/monograph/group-tools.js +225 -0
  156. package/dist/src/mcp-tools/monograph/group-tools.js.map +1 -0
  157. package/dist/src/mcp-tools/monograph/health-tools.d.ts +6 -0
  158. package/dist/src/mcp-tools/monograph/health-tools.d.ts.map +1 -0
  159. package/dist/src/mcp-tools/monograph/health-tools.js +113 -0
  160. package/dist/src/mcp-tools/monograph/health-tools.js.map +1 -0
  161. package/dist/src/mcp-tools/monograph/impact-tools.d.ts +9 -0
  162. package/dist/src/mcp-tools/monograph/impact-tools.d.ts.map +1 -0
  163. package/dist/src/mcp-tools/monograph/impact-tools.js +532 -0
  164. package/dist/src/mcp-tools/monograph/impact-tools.js.map +1 -0
  165. package/dist/src/mcp-tools/monograph/index.d.ts +10 -0
  166. package/dist/src/mcp-tools/monograph/index.d.ts.map +1 -0
  167. package/dist/src/mcp-tools/monograph/index.js +73 -0
  168. package/dist/src/mcp-tools/monograph/index.js.map +1 -0
  169. package/dist/src/mcp-tools/monograph/query-tools.d.ts +11 -0
  170. package/dist/src/mcp-tools/monograph/query-tools.d.ts.map +1 -0
  171. package/dist/src/mcp-tools/monograph/query-tools.js +500 -0
  172. package/dist/src/mcp-tools/monograph/query-tools.js.map +1 -0
  173. package/dist/src/mcp-tools/monograph/shared.d.ts +64 -0
  174. package/dist/src/mcp-tools/monograph/shared.d.ts.map +1 -0
  175. package/dist/src/mcp-tools/monograph/shared.js +215 -0
  176. package/dist/src/mcp-tools/monograph/shared.js.map +1 -0
  177. package/dist/src/mcp-tools/monograph/visualize-tools.d.ts +10 -0
  178. package/dist/src/mcp-tools/monograph/visualize-tools.d.ts.map +1 -0
  179. package/dist/src/mcp-tools/monograph/visualize-tools.js +382 -0
  180. package/dist/src/mcp-tools/monograph/visualize-tools.js.map +1 -0
  181. package/dist/src/mcp-tools/monograph-tools.d.ts +4 -23
  182. package/dist/src/mcp-tools/monograph-tools.d.ts.map +1 -1
  183. package/dist/src/mcp-tools/monograph-tools.js +4 -2439
  184. package/dist/src/mcp-tools/monograph-tools.js.map +1 -1
  185. package/dist/src/mcp-tools/monomind-tools.d.ts +8 -0
  186. package/dist/src/mcp-tools/monomind-tools.d.ts.map +1 -1
  187. package/dist/src/mcp-tools/monomind-tools.js +13 -1
  188. package/dist/src/mcp-tools/monomind-tools.js.map +1 -1
  189. package/dist/src/mcp-tools/quality/security-compliance/detect-secrets.d.ts.map +1 -1
  190. package/dist/src/mcp-tools/quality/security-compliance/detect-secrets.js +31 -2
  191. package/dist/src/mcp-tools/quality/security-compliance/detect-secrets.js.map +1 -1
  192. package/dist/src/mcp-tools/terminal-tools.d.ts.map +1 -1
  193. package/dist/src/mcp-tools/terminal-tools.js +31 -1
  194. package/dist/src/mcp-tools/terminal-tools.js.map +1 -1
  195. package/dist/src/mcp-tools/types.d.ts +8 -27
  196. package/dist/src/mcp-tools/types.d.ts.map +1 -1
  197. package/dist/src/mcp-tools/types.js +9 -91
  198. package/dist/src/mcp-tools/types.js.map +1 -1
  199. package/dist/src/memory/file-permissions.d.ts +15 -0
  200. package/dist/src/memory/file-permissions.d.ts.map +1 -0
  201. package/dist/src/memory/file-permissions.js +25 -0
  202. package/dist/src/memory/file-permissions.js.map +1 -0
  203. package/dist/src/memory/memory-bridge.d.ts.map +1 -1
  204. package/dist/src/memory/memory-bridge.js +94 -34
  205. package/dist/src/memory/memory-bridge.js.map +1 -1
  206. package/dist/src/memory/memory-crud.d.ts.map +1 -1
  207. package/dist/src/memory/memory-crud.js +298 -275
  208. package/dist/src/memory/memory-crud.js.map +1 -1
  209. package/dist/src/memory/memory-initializer.d.ts +2 -4
  210. package/dist/src/memory/memory-initializer.d.ts.map +1 -1
  211. package/dist/src/memory/memory-initializer.js +53 -76
  212. package/dist/src/memory/memory-initializer.js.map +1 -1
  213. package/dist/src/memory/memory-migrations.d.ts +1 -14
  214. package/dist/src/memory/memory-migrations.d.ts.map +1 -1
  215. package/dist/src/memory/memory-migrations.js +52 -105
  216. package/dist/src/memory/memory-migrations.js.map +1 -1
  217. package/dist/src/memory/sona-optimizer.d.ts +1 -1
  218. package/dist/src/memory/sona-optimizer.js +1 -1
  219. package/dist/src/monovector/index.d.ts +16 -19
  220. package/dist/src/monovector/index.d.ts.map +1 -1
  221. package/dist/src/monovector/index.js +50 -8
  222. package/dist/src/monovector/index.js.map +1 -1
  223. package/dist/src/orgrt/approvals.d.ts +16 -0
  224. package/dist/src/orgrt/approvals.d.ts.map +1 -0
  225. package/dist/src/orgrt/approvals.js +72 -0
  226. package/dist/src/orgrt/approvals.js.map +1 -0
  227. package/dist/src/orgrt/bus.d.ts.map +1 -1
  228. package/dist/src/orgrt/bus.js +21 -0
  229. package/dist/src/orgrt/bus.js.map +1 -1
  230. package/dist/src/orgrt/checkpoint-ops.d.ts +19 -0
  231. package/dist/src/orgrt/checkpoint-ops.d.ts.map +1 -0
  232. package/dist/src/orgrt/checkpoint-ops.js +219 -0
  233. package/dist/src/orgrt/checkpoint-ops.js.map +1 -0
  234. package/dist/src/orgrt/checkpoint.d.ts +33 -1
  235. package/dist/src/orgrt/checkpoint.d.ts.map +1 -1
  236. package/dist/src/orgrt/checkpoint.js +50 -6
  237. package/dist/src/orgrt/checkpoint.js.map +1 -1
  238. package/dist/src/orgrt/cross-org.d.ts +32 -0
  239. package/dist/src/orgrt/cross-org.d.ts.map +1 -0
  240. package/dist/src/orgrt/cross-org.js +256 -0
  241. package/dist/src/orgrt/cross-org.js.map +1 -0
  242. package/dist/src/orgrt/daemon.d.ts +131 -157
  243. package/dist/src/orgrt/daemon.d.ts.map +1 -1
  244. package/dist/src/orgrt/daemon.js +356 -966
  245. package/dist/src/orgrt/daemon.js.map +1 -1
  246. package/dist/src/orgrt/decisions.d.ts +33 -0
  247. package/dist/src/orgrt/decisions.d.ts.map +1 -0
  248. package/dist/src/orgrt/decisions.js +169 -0
  249. package/dist/src/orgrt/decisions.js.map +1 -0
  250. package/dist/src/orgrt/kimicode-runner.d.ts.map +1 -1
  251. package/dist/src/orgrt/kimicode-runner.js +5 -1
  252. package/dist/src/orgrt/kimicode-runner.js.map +1 -1
  253. package/dist/src/orgrt/opencode-runner.d.ts.map +1 -1
  254. package/dist/src/orgrt/opencode-runner.js +10 -2
  255. package/dist/src/orgrt/opencode-runner.js.map +1 -1
  256. package/dist/src/orgrt/org-memory.d.ts +45 -0
  257. package/dist/src/orgrt/org-memory.d.ts.map +1 -0
  258. package/dist/src/orgrt/org-memory.js +220 -0
  259. package/dist/src/orgrt/org-memory.js.map +1 -0
  260. package/dist/src/orgrt/policy.d.ts +4 -0
  261. package/dist/src/orgrt/policy.d.ts.map +1 -1
  262. package/dist/src/orgrt/policy.js +13 -1
  263. package/dist/src/orgrt/policy.js.map +1 -1
  264. package/dist/src/orgrt/prechecks.d.ts +15 -0
  265. package/dist/src/orgrt/prechecks.d.ts.map +1 -0
  266. package/dist/src/orgrt/prechecks.js +21 -0
  267. package/dist/src/orgrt/prechecks.js.map +1 -0
  268. package/dist/src/orgrt/questions.d.ts +39 -0
  269. package/dist/src/orgrt/questions.d.ts.map +1 -0
  270. package/dist/src/orgrt/questions.js +135 -0
  271. package/dist/src/orgrt/questions.js.map +1 -0
  272. package/dist/src/orgrt/remote.d.ts +25 -0
  273. package/dist/src/orgrt/remote.d.ts.map +1 -0
  274. package/dist/src/orgrt/remote.js +73 -0
  275. package/dist/src/orgrt/remote.js.map +1 -0
  276. package/dist/src/orgrt/scheduler-integration.d.ts +19 -0
  277. package/dist/src/orgrt/scheduler-integration.d.ts.map +1 -0
  278. package/dist/src/orgrt/scheduler-integration.js +90 -0
  279. package/dist/src/orgrt/scheduler-integration.js.map +1 -0
  280. package/dist/src/orgrt/server.d.ts.map +1 -1
  281. package/dist/src/orgrt/server.js +70 -2
  282. package/dist/src/orgrt/server.js.map +1 -1
  283. package/dist/src/orgrt/session.d.ts +30 -1
  284. package/dist/src/orgrt/session.d.ts.map +1 -1
  285. package/dist/src/orgrt/session.js +184 -53
  286. package/dist/src/orgrt/session.js.map +1 -1
  287. package/dist/src/orgrt/state-detector.d.ts +19 -0
  288. package/dist/src/orgrt/state-detector.d.ts.map +1 -0
  289. package/dist/src/orgrt/state-detector.js +59 -0
  290. package/dist/src/orgrt/state-detector.js.map +1 -0
  291. package/dist/src/orgrt/task-dag.d.ts +27 -0
  292. package/dist/src/orgrt/task-dag.d.ts.map +1 -0
  293. package/dist/src/orgrt/task-dag.js +100 -0
  294. package/dist/src/orgrt/task-dag.js.map +1 -0
  295. package/dist/src/orgrt/tool-fence.d.ts +7 -4
  296. package/dist/src/orgrt/tool-fence.d.ts.map +1 -1
  297. package/dist/src/orgrt/tool-fence.js +47 -6
  298. package/dist/src/orgrt/tool-fence.js.map +1 -1
  299. package/dist/src/orgrt/types.d.ts +57 -2
  300. package/dist/src/orgrt/types.d.ts.map +1 -1
  301. package/dist/src/orgrt/types.js +34 -3
  302. package/dist/src/orgrt/types.js.map +1 -1
  303. package/dist/src/routing/model-download.d.ts +49 -0
  304. package/dist/src/routing/model-download.d.ts.map +1 -0
  305. package/dist/src/routing/model-download.js +106 -0
  306. package/dist/src/routing/model-download.js.map +1 -0
  307. package/dist/src/services/crash-reporter.d.ts +5 -0
  308. package/dist/src/services/crash-reporter.d.ts.map +1 -1
  309. package/dist/src/services/crash-reporter.js +49 -0
  310. package/dist/src/services/crash-reporter.js.map +1 -1
  311. package/dist/src/transfer/anonymization/index.d.ts +18 -15
  312. package/dist/src/transfer/anonymization/index.d.ts.map +1 -1
  313. package/dist/src/transfer/anonymization/index.js +7 -119
  314. package/dist/src/transfer/anonymization/index.js.map +1 -1
  315. package/dist/src/ui/dashboard.html +606 -7
  316. package/dist/src/ui/orgs.html +7 -1
  317. package/dist/src/ui/routes-monograph.mjs +6 -0
  318. package/dist/src/ui/server.mjs +327 -7
  319. package/dist/src/update/checker.d.ts.map +1 -1
  320. package/dist/src/update/checker.js +2 -1
  321. package/dist/src/update/checker.js.map +1 -1
  322. package/dist/src/update/executor.d.ts.map +1 -1
  323. package/dist/src/update/executor.js +7 -3
  324. package/dist/src/update/executor.js.map +1 -1
  325. package/dist/src/update/index.d.ts +0 -1
  326. package/dist/src/update/index.d.ts.map +1 -1
  327. package/dist/src/update/index.js +5 -24
  328. package/dist/src/update/index.js.map +1 -1
  329. package/dist/src/utils/db-mutex.d.ts +11 -0
  330. package/dist/src/utils/db-mutex.d.ts.map +1 -0
  331. package/dist/src/utils/db-mutex.js +23 -0
  332. package/dist/src/utils/db-mutex.js.map +1 -0
  333. package/dist/src/utils/input-guards.d.ts +23 -0
  334. package/dist/src/utils/input-guards.d.ts.map +1 -1
  335. package/dist/src/utils/input-guards.js +72 -0
  336. package/dist/src/utils/input-guards.js.map +1 -1
  337. package/dist/src/utils/npm-command.d.ts +10 -0
  338. package/dist/src/utils/npm-command.d.ts.map +1 -0
  339. package/dist/src/utils/npm-command.js +12 -0
  340. package/dist/src/utils/npm-command.js.map +1 -0
  341. package/dist/src/utils/paths.d.ts +28 -0
  342. package/dist/src/utils/paths.d.ts.map +1 -0
  343. package/dist/src/utils/paths.js +108 -0
  344. package/dist/src/utils/paths.js.map +1 -0
  345. package/dist/tsconfig.tsbuildinfo +1 -1
  346. package/package.json +17 -17
  347. package/scripts/download-embedding-model.mjs +97 -0
  348. package/scripts/publish.sh +0 -0
  349. package/scripts/sync-claude-assets.sh +0 -0
  350. package/dist/src/production/circuit-breaker.d.ts +0 -121
  351. package/dist/src/production/circuit-breaker.d.ts.map +0 -1
  352. package/dist/src/production/circuit-breaker.js +0 -262
  353. package/dist/src/production/circuit-breaker.js.map +0 -1
  354. package/dist/src/production/error-handler.d.ts +0 -119
  355. package/dist/src/production/error-handler.d.ts.map +0 -1
  356. package/dist/src/production/error-handler.js +0 -324
  357. package/dist/src/production/error-handler.js.map +0 -1
  358. package/dist/src/production/index.d.ts +0 -6
  359. package/dist/src/production/index.d.ts.map +0 -1
  360. package/dist/src/production/index.js +0 -6
  361. package/dist/src/production/index.js.map +0 -1
  362. package/dist/src/production/monitoring.d.ts +0 -181
  363. package/dist/src/production/monitoring.d.ts.map +0 -1
  364. package/dist/src/production/monitoring.js +0 -375
  365. package/dist/src/production/monitoring.js.map +0 -1
  366. package/dist/src/production/rate-limiter.d.ts +0 -125
  367. package/dist/src/production/rate-limiter.d.ts.map +0 -1
  368. package/dist/src/production/rate-limiter.js +0 -218
  369. package/dist/src/production/rate-limiter.js.map +0 -1
  370. package/dist/src/production/retry.d.ts +0 -48
  371. package/dist/src/production/retry.d.ts.map +0 -1
  372. package/dist/src/production/retry.js +0 -189
  373. package/dist/src/production/retry.js.map +0 -1
  374. package/dist/src/transfer/types.d.ts +0 -245
  375. package/dist/src/transfer/types.d.ts.map +0 -1
  376. package/dist/src/transfer/types.js +0 -6
  377. package/dist/src/transfer/types.js.map +0 -1
@@ -11,6 +11,8 @@ import { safeParseEmbedding } from './memory-bridge.js';
11
11
  import { ensureSchemaColumns } from './memory-migrations.js';
12
12
  import { generateEmbedding } from './embedding-operations.js';
13
13
  import { addToHNSWIndex, rebuildSearchIndex } from './hnsw-operations.js';
14
+ import { withDbLock } from '../utils/db-mutex.js';
15
+ import { secureDbFilePermissions } from './file-permissions.js';
14
16
  // Re-export read operations so existing callers keep working without changes.
15
17
  export { searchEntries, listEntries, getEntry } from './memory-read.js';
16
18
  /** Maximum SQLite database file size accepted before read (256 MB). */
@@ -39,163 +41,166 @@ export async function verifyMemoryInit(dbPath, options) {
39
41
  const { verbose = false } = options || {};
40
42
  const tests = [];
41
43
  try {
42
- const initSqlJs = (await import('sql.js')).default;
43
- const SQL = await initSqlJs();
44
- const fs = await import('fs');
45
- // Guard against excessively large DB files to prevent OOM.
46
- const verifyStat = fs.statSync(dbPath);
47
- if (verifyStat.size > MAX_DB_FILE_BYTES) {
48
- return { success: false, tests: [{ name: 'Database access', passed: false, details: `File too large: ${verifyStat.size} bytes` }], summary: { passed: 0, failed: 1, total: 1 } };
49
- }
50
- // Load database
51
- const fileBuffer = fs.readFileSync(dbPath);
52
- const db = new SQL.Database(fileBuffer);
53
- // Test 1: Schema verification
54
- const schemaStart = Date.now();
55
- const tables = db.exec("SELECT name FROM sqlite_master WHERE type='table'");
56
- const tableNames = tables[0]?.values?.map(v => v[0]) || [];
57
- const expectedTables = ['memory_entries', 'patterns', 'metadata', 'vector_indexes'];
58
- const missingTables = expectedTables.filter(t => !tableNames.includes(t));
59
- tests.push({
60
- name: 'Schema verification',
61
- passed: missingTables.length === 0,
62
- details: missingTables.length > 0 ? `Missing: ${missingTables.join(', ')}` : `${tableNames.length} tables found`,
63
- duration: Date.now() - schemaStart
64
- });
65
- // Test 2: Write entry
66
- const writeStart = Date.now();
67
- const testId = `test_${Date.now()}`;
68
- const testKey = 'verification_test';
69
- const testValue = 'This is a verification test entry for memory initialization';
70
- try {
71
- db.run(`
44
+ return await withDbLock(dbPath, async () => {
45
+ const initSqlJs = (await import('sql.js')).default;
46
+ const SQL = await initSqlJs();
47
+ const fs = await import('fs');
48
+ // Guard against excessively large DB files to prevent OOM.
49
+ const verifyStat = fs.statSync(dbPath);
50
+ if (verifyStat.size > MAX_DB_FILE_BYTES) {
51
+ return { success: false, tests: [{ name: 'Database access', passed: false, details: `File too large: ${verifyStat.size} bytes` }], summary: { passed: 0, failed: 1, total: 1 } };
52
+ }
53
+ // Load database
54
+ const fileBuffer = fs.readFileSync(dbPath);
55
+ const db = new SQL.Database(fileBuffer);
56
+ // Test 1: Schema verification
57
+ const schemaStart = Date.now();
58
+ const tables = db.exec("SELECT name FROM sqlite_master WHERE type='table'");
59
+ const tableNames = tables[0]?.values?.map(v => v[0]) || [];
60
+ const expectedTables = ['memory_entries', 'patterns', 'metadata', 'vector_indexes'];
61
+ const missingTables = expectedTables.filter(t => !tableNames.includes(t));
62
+ tests.push({
63
+ name: 'Schema verification',
64
+ passed: missingTables.length === 0,
65
+ details: missingTables.length > 0 ? `Missing: ${missingTables.join(', ')}` : `${tableNames.length} tables found`,
66
+ duration: Date.now() - schemaStart
67
+ });
68
+ // Test 2: Write entry
69
+ const writeStart = Date.now();
70
+ const testId = `test_${Date.now()}`;
71
+ const testKey = 'verification_test';
72
+ const testValue = 'This is a verification test entry for memory initialization';
73
+ try {
74
+ db.run(`
72
75
  INSERT INTO memory_entries (id, key, namespace, content, type, created_at, updated_at)
73
76
  VALUES (?, ?, 'test', ?, 'semantic', ?, ?)
74
77
  `, [testId, testKey, testValue, Date.now(), Date.now()]);
75
- tests.push({
76
- name: 'Write entry',
77
- passed: true,
78
- details: 'Entry written successfully',
79
- duration: Date.now() - writeStart
80
- });
81
- }
82
- catch (e) {
83
- tests.push({
84
- name: 'Write entry',
85
- passed: false,
86
- details: e instanceof Error ? e.message : 'Write failed',
87
- duration: Date.now() - writeStart
88
- });
89
- }
90
- // Test 3: Read entry
91
- const readStart = Date.now();
92
- try {
93
- const result = db.exec(`SELECT content FROM memory_entries WHERE id = ?`, [testId]);
94
- const content = result[0]?.values[0]?.[0];
95
- tests.push({
96
- name: 'Read entry',
97
- passed: content === testValue,
98
- details: content === testValue ? 'Content matches' : 'Content mismatch',
99
- duration: Date.now() - readStart
100
- });
101
- }
102
- catch (e) {
103
- tests.push({
104
- name: 'Read entry',
105
- passed: false,
106
- details: e instanceof Error ? e.message : 'Read failed',
107
- duration: Date.now() - readStart
108
- });
109
- }
110
- // Test 4: Write with embedding
111
- const embeddingStart = Date.now();
112
- try {
113
- const { embedding, dimensions, model } = await generateEmbedding(testValue);
114
- const embeddingJson = JSON.stringify(embedding);
115
- db.run(`
78
+ tests.push({
79
+ name: 'Write entry',
80
+ passed: true,
81
+ details: 'Entry written successfully',
82
+ duration: Date.now() - writeStart
83
+ });
84
+ }
85
+ catch (e) {
86
+ tests.push({
87
+ name: 'Write entry',
88
+ passed: false,
89
+ details: e instanceof Error ? e.message : 'Write failed',
90
+ duration: Date.now() - writeStart
91
+ });
92
+ }
93
+ // Test 3: Read entry
94
+ const readStart = Date.now();
95
+ try {
96
+ const result = db.exec(`SELECT content FROM memory_entries WHERE id = ?`, [testId]);
97
+ const content = result[0]?.values[0]?.[0];
98
+ tests.push({
99
+ name: 'Read entry',
100
+ passed: content === testValue,
101
+ details: content === testValue ? 'Content matches' : 'Content mismatch',
102
+ duration: Date.now() - readStart
103
+ });
104
+ }
105
+ catch (e) {
106
+ tests.push({
107
+ name: 'Read entry',
108
+ passed: false,
109
+ details: e instanceof Error ? e.message : 'Read failed',
110
+ duration: Date.now() - readStart
111
+ });
112
+ }
113
+ // Test 4: Write with embedding
114
+ const embeddingStart = Date.now();
115
+ try {
116
+ const { embedding, dimensions, model } = await generateEmbedding(testValue);
117
+ const embeddingJson = JSON.stringify(embedding);
118
+ db.run(`
116
119
  UPDATE memory_entries
117
120
  SET embedding = ?, embedding_dimensions = ?, embedding_model = ?
118
121
  WHERE id = ?
119
122
  `, [embeddingJson, dimensions, model, testId]);
120
- tests.push({
121
- name: 'Generate embedding',
122
- passed: true,
123
- details: `${dimensions}-dim vector (${model})`,
124
- duration: Date.now() - embeddingStart
125
- });
126
- }
127
- catch (e) {
128
- tests.push({
129
- name: 'Generate embedding',
130
- passed: false,
131
- details: e instanceof Error ? e.message : 'Embedding failed',
132
- duration: Date.now() - embeddingStart
133
- });
134
- }
135
- // Test 5: Pattern storage
136
- const patternStart = Date.now();
137
- try {
138
- const patternId = `pattern_${Date.now()}`;
139
- db.run(`
123
+ tests.push({
124
+ name: 'Generate embedding',
125
+ passed: true,
126
+ details: `${dimensions}-dim vector (${model})`,
127
+ duration: Date.now() - embeddingStart
128
+ });
129
+ }
130
+ catch (e) {
131
+ tests.push({
132
+ name: 'Generate embedding',
133
+ passed: false,
134
+ details: e instanceof Error ? e.message : 'Embedding failed',
135
+ duration: Date.now() - embeddingStart
136
+ });
137
+ }
138
+ // Test 5: Pattern storage
139
+ const patternStart = Date.now();
140
+ try {
141
+ const patternId = `pattern_${Date.now()}`;
142
+ db.run(`
140
143
  INSERT INTO patterns (id, name, pattern_type, condition, action, confidence, created_at, updated_at)
141
144
  VALUES (?, 'test-pattern', 'task-routing', 'test condition', 'test action', 0.5, ?, ?)
142
145
  `, [patternId, Date.now(), Date.now()]);
143
- tests.push({
144
- name: 'Pattern storage',
145
- passed: true,
146
- details: 'Pattern stored with confidence scoring',
147
- duration: Date.now() - patternStart
148
- });
149
- // Cleanup test pattern
150
- db.run(`DELETE FROM patterns WHERE id = ?`, [patternId]);
151
- }
152
- catch (e) {
153
- tests.push({
154
- name: 'Pattern storage',
155
- passed: false,
156
- details: e instanceof Error ? e.message : 'Pattern storage failed',
157
- duration: Date.now() - patternStart
158
- });
159
- }
160
- // Test 6: Vector index configuration
161
- const indexStart = Date.now();
162
- try {
163
- const indexResult = db.exec(`SELECT name, dimensions, hnsw_m, hnsw_ef_construction FROM vector_indexes`);
164
- const indexes = indexResult[0]?.values || [];
165
- tests.push({
166
- name: 'Vector index config',
167
- passed: indexes.length > 0,
168
- details: `${indexes.length} indexes configured (HNSW M=16, ef=200)`,
169
- duration: Date.now() - indexStart
170
- });
171
- }
172
- catch (e) {
173
- tests.push({
174
- name: 'Vector index config',
175
- passed: false,
176
- details: e instanceof Error ? e.message : 'Index check failed',
177
- duration: Date.now() - indexStart
178
- });
179
- }
180
- // Cleanup test entry
181
- db.run(`DELETE FROM memory_entries WHERE id = ?`, [testId]);
182
- // Save changes atomically
183
- const data = db.export();
184
- const dbTmpHealth = dbPath + '.tmp';
185
- fs.writeFileSync(dbTmpHealth, Buffer.from(data));
186
- fs.renameSync(dbTmpHealth, dbPath);
187
- db.close();
188
- const passed = tests.filter(t => t.passed).length;
189
- const failed = tests.filter(t => !t.passed).length;
190
- return {
191
- success: failed === 0,
192
- tests,
193
- summary: {
194
- passed,
195
- failed,
196
- total: tests.length
146
+ tests.push({
147
+ name: 'Pattern storage',
148
+ passed: true,
149
+ details: 'Pattern stored with confidence scoring',
150
+ duration: Date.now() - patternStart
151
+ });
152
+ // Cleanup test pattern
153
+ db.run(`DELETE FROM patterns WHERE id = ?`, [patternId]);
197
154
  }
198
- };
155
+ catch (e) {
156
+ tests.push({
157
+ name: 'Pattern storage',
158
+ passed: false,
159
+ details: e instanceof Error ? e.message : 'Pattern storage failed',
160
+ duration: Date.now() - patternStart
161
+ });
162
+ }
163
+ // Test 6: Vector index configuration
164
+ const indexStart = Date.now();
165
+ try {
166
+ const indexResult = db.exec(`SELECT name, dimensions, hnsw_m, hnsw_ef_construction FROM vector_indexes`);
167
+ const indexes = indexResult[0]?.values || [];
168
+ tests.push({
169
+ name: 'Vector index config',
170
+ passed: indexes.length > 0,
171
+ details: `${indexes.length} indexes configured (HNSW M=16, ef=200)`,
172
+ duration: Date.now() - indexStart
173
+ });
174
+ }
175
+ catch (e) {
176
+ tests.push({
177
+ name: 'Vector index config',
178
+ passed: false,
179
+ details: e instanceof Error ? e.message : 'Index check failed',
180
+ duration: Date.now() - indexStart
181
+ });
182
+ }
183
+ // Cleanup test entry
184
+ db.run(`DELETE FROM memory_entries WHERE id = ?`, [testId]);
185
+ // Save changes atomically
186
+ const data = db.export();
187
+ const dbTmpHealth = dbPath + '.tmp';
188
+ fs.writeFileSync(dbTmpHealth, Buffer.from(data));
189
+ fs.renameSync(dbTmpHealth, dbPath);
190
+ secureDbFilePermissions(dbPath);
191
+ db.close();
192
+ const passed = tests.filter(t => t.passed).length;
193
+ const failed = tests.filter(t => !t.passed).length;
194
+ return {
195
+ success: failed === 0,
196
+ tests,
197
+ summary: {
198
+ passed,
199
+ failed,
200
+ total: tests.length
201
+ }
202
+ };
203
+ });
199
204
  }
200
205
  catch (error) {
201
206
  return {
@@ -230,97 +235,112 @@ export async function storeEntry(options) {
230
235
  return { success: false, id: '', error: 'Database not initialized. Run: monomind memory init' };
231
236
  }
232
237
  await ensureSchemaColumns(dbPath);
233
- const initSqlJs = (await import('sql.js')).default;
234
- const SQL = await initSqlJs();
235
- const storeStat = fs.statSync(dbPath);
236
- if (storeStat.size > MAX_DB_FILE_BYTES) {
237
- return { success: false, id: '', error: `Database file too large: ${storeStat.size} bytes` };
238
- }
239
- const fileBuffer = fs.readFileSync(dbPath);
240
- const db = new SQL.Database(fileBuffer);
241
- // memory_entries has no UNIQUE constraint on (key, namespace) — only
242
- // `id TEXT PRIMARY KEY`. `INSERT OR REPLACE` only replaces a row when
243
- // its PRIMARY KEY collides, so generating a fresh id on every call (as
244
- // this used to do unconditionally) meant upsert never actually matched
245
- // the existing row for a given key+namespace — it silently inserted a
246
- // duplicate instead of replacing it. When upserting, look up the
247
- // existing row's real id first and reuse it so the replace actually
248
- // collides; only mint a new id when no existing row is found.
249
- let id = `entry_${Date.now()}_${Math.random().toString(36).substring(7)}`;
250
- let existingCreatedAt = null;
251
- if (upsert) {
252
- // Only match active rows — a soft-deleted row's key+namespace should
253
- // not be resurrected by an unrelated upsert; that would both restore
254
- // history a delete intentionally cleared and mask the deletion.
255
- const existingIdResult = db.exec("SELECT id, created_at FROM memory_entries WHERE key = ? AND namespace = ? AND status = 'active' LIMIT 1", [key, namespace]);
256
- const existingRow = existingIdResult[0]?.values?.[0];
257
- const existingId = existingRow?.[0];
258
- if (typeof existingId === 'string') {
259
- id = existingId;
260
- const createdAt = existingRow?.[1];
261
- if (typeof createdAt === 'number')
262
- existingCreatedAt = createdAt;
238
+ return await withDbLock(dbPath, async () => {
239
+ const initSqlJs = (await import('sql.js')).default;
240
+ const SQL = await initSqlJs();
241
+ const storeStat = fs.statSync(dbPath);
242
+ if (storeStat.size > MAX_DB_FILE_BYTES) {
243
+ return { success: false, id: '', error: `Database file too large: ${storeStat.size} bytes` };
263
244
  }
264
- }
265
- const now = Date.now();
266
- const createdAt = existingCreatedAt ?? now;
267
- let embeddingJson = null;
268
- let embeddingDimensions = null;
269
- let embeddingModel = null;
270
- if (generateEmbeddingFlag && value.length > 0) {
271
- const embResult = await generateEmbedding(value);
272
- embeddingJson = JSON.stringify(embResult.embedding);
273
- embeddingDimensions = embResult.dimensions;
274
- embeddingModel = embResult.model;
275
- }
276
- const insertSql = upsert
277
- ? `INSERT OR REPLACE INTO memory_entries (
278
- id, key, namespace, content, type,
279
- embedding, embedding_dimensions, embedding_model,
280
- tags, metadata, created_at, updated_at, expires_at, status
281
- ) VALUES (?, ?, ?, ?, 'semantic', ?, ?, ?, ?, ?, ?, ?, ?, 'active')`
282
- : `INSERT INTO memory_entries (
245
+ const fileBuffer = fs.readFileSync(dbPath);
246
+ const db = new SQL.Database(fileBuffer);
247
+ let id = `entry_${Date.now()}_${Math.random().toString(36).substring(7)}`;
248
+ let existingCreatedAt = null;
249
+ let matchedExisting = false;
250
+ if (upsert) {
251
+ const existingIdResult = db.exec("SELECT id, created_at FROM memory_entries WHERE key = ? AND namespace = ? AND status = 'active' LIMIT 1", [key, namespace]);
252
+ const existingRow = existingIdResult[0]?.values?.[0];
253
+ const existingId = existingRow?.[0];
254
+ if (typeof existingId === 'string') {
255
+ id = existingId;
256
+ matchedExisting = true;
257
+ const createdAt = existingRow?.[1];
258
+ if (typeof createdAt === 'number')
259
+ existingCreatedAt = createdAt;
260
+ }
261
+ }
262
+ const now = Date.now();
263
+ const createdAt = existingCreatedAt ?? now;
264
+ let embeddingJson = null;
265
+ let embeddingDimensions = null;
266
+ let embeddingModel = null;
267
+ if (generateEmbeddingFlag && value.length > 0) {
268
+ const embResult = await generateEmbedding(value);
269
+ embeddingJson = JSON.stringify(embResult.embedding);
270
+ embeddingDimensions = embResult.dimensions;
271
+ embeddingModel = embResult.model;
272
+ }
273
+ const isUpdate = upsert && matchedExisting;
274
+ if (isUpdate) {
275
+ // #88: upsert against an existing row must UPDATE in place. The old
276
+ // INSERT OR REPLACE omitted access_count, confidence, importance_score,
277
+ // last_accessed_at, owner_id, agent_id, session_id and hardcoded
278
+ // metadata '{}' — every update silently wiped all learned stats.
279
+ db.run(`UPDATE memory_entries SET
280
+ content = ?,
281
+ embedding = ?,
282
+ embedding_dimensions = ?,
283
+ embedding_model = ?,
284
+ tags = ?,
285
+ updated_at = ?,
286
+ expires_at = ?
287
+ WHERE id = ?`, [
288
+ value,
289
+ embeddingJson,
290
+ embeddingDimensions,
291
+ embeddingModel,
292
+ tags.length > 0 ? JSON.stringify(tags) : null,
293
+ now,
294
+ ttl ? now + (ttl * 1000) : null,
295
+ id
296
+ ]);
297
+ }
298
+ else {
299
+ const insertSql = `INSERT INTO memory_entries (
283
300
  id, key, namespace, content, type,
284
301
  embedding, embedding_dimensions, embedding_model,
285
302
  tags, metadata, created_at, updated_at, expires_at, status
286
303
  ) VALUES (?, ?, ?, ?, 'semantic', ?, ?, ?, ?, ?, ?, ?, ?, 'active')`;
287
- db.run(insertSql, [
288
- id,
289
- key,
290
- namespace,
291
- value,
292
- embeddingJson,
293
- embeddingDimensions,
294
- embeddingModel,
295
- tags.length > 0 ? JSON.stringify(tags) : null,
296
- '{}',
297
- createdAt,
298
- now,
299
- ttl ? now + (ttl * 1000) : null
300
- ]);
301
- // Save atomically
302
- const data = db.export();
303
- const dbTmpStore = dbPath + '.tmp';
304
- fs.writeFileSync(dbTmpStore, Buffer.from(data));
305
- fs.renameSync(dbTmpStore, dbPath);
306
- db.close();
307
- // Add to HNSW index for faster future searches
308
- if (embeddingJson) {
309
- const embResult = safeParseEmbedding(embeddingJson);
310
- if (embResult) {
311
- await addToHNSWIndex(id, embResult, {
304
+ db.run(insertSql, [
312
305
  id,
313
306
  key,
314
307
  namespace,
315
- content: value
316
- });
308
+ value,
309
+ embeddingJson,
310
+ embeddingDimensions,
311
+ embeddingModel,
312
+ tags.length > 0 ? JSON.stringify(tags) : null,
313
+ '{}',
314
+ createdAt,
315
+ now,
316
+ ttl ? now + (ttl * 1000) : null
317
+ ]);
317
318
  }
318
- }
319
- return {
320
- success: true,
321
- id,
322
- embedding: embeddingJson ? { dimensions: embeddingDimensions, model: embeddingModel } : undefined
323
- };
319
+ // Save atomically
320
+ const data = db.export();
321
+ const dbTmpStore = dbPath + '.tmp';
322
+ fs.writeFileSync(dbTmpStore, Buffer.from(data));
323
+ fs.renameSync(dbTmpStore, dbPath);
324
+ secureDbFilePermissions(dbPath);
325
+ db.close();
326
+ // Add to HNSW index for faster future searches
327
+ if (embeddingJson) {
328
+ const embResult = safeParseEmbedding(embeddingJson);
329
+ if (embResult) {
330
+ await addToHNSWIndex(id, embResult, {
331
+ id,
332
+ key,
333
+ namespace,
334
+ content: value
335
+ });
336
+ }
337
+ }
338
+ return {
339
+ success: true,
340
+ id,
341
+ embedding: embeddingJson ? { dimensions: embeddingDimensions, model: embeddingModel } : undefined
342
+ };
343
+ });
324
344
  }
325
345
  catch (error) {
326
346
  return {
@@ -378,42 +398,43 @@ export async function deleteEntry(options) {
378
398
  };
379
399
  }
380
400
  await ensureSchemaColumns(dbPath);
381
- const initSqlJs = (await import('sql.js')).default;
382
- const SQL = await initSqlJs();
383
- const deleteStat = fs.statSync(dbPath);
384
- if (deleteStat.size > MAX_DB_FILE_BYTES) {
385
- return { success: false, deleted: false, key, namespace, remainingEntries: 0, error: `Database file too large: ${deleteStat.size} bytes` };
386
- }
387
- const fileBuffer = fs.readFileSync(dbPath);
388
- const db = new SQL.Database(fileBuffer);
389
- const checkStmt = db.prepare(`
401
+ return await withDbLock(dbPath, async () => {
402
+ const initSqlJs = (await import('sql.js')).default;
403
+ const SQL = await initSqlJs();
404
+ const deleteStat = fs.statSync(dbPath);
405
+ if (deleteStat.size > MAX_DB_FILE_BYTES) {
406
+ return { success: false, deleted: false, key, namespace, remainingEntries: 0, error: `Database file too large: ${deleteStat.size} bytes` };
407
+ }
408
+ const fileBuffer = fs.readFileSync(dbPath);
409
+ const db = new SQL.Database(fileBuffer);
410
+ const checkStmt = db.prepare(`
390
411
  SELECT id FROM memory_entries
391
412
  WHERE status = 'active'
392
413
  AND key = ?
393
414
  AND namespace = ?
394
415
  LIMIT 1
395
416
  `);
396
- checkStmt.bind([key, namespace]);
397
- const checkRows = [];
398
- while (checkStmt.step()) {
399
- checkRows.push(checkStmt.get());
400
- }
401
- checkStmt.free();
402
- const checkResult = checkRows.length > 0 ? [{ values: checkRows }] : [];
403
- if (!checkResult[0]?.values?.[0]) {
404
- const countResult = db.exec(`SELECT COUNT(*) FROM memory_entries WHERE status = 'active'`);
405
- const remainingEntries = countResult[0]?.values?.[0]?.[0] || 0;
406
- db.close();
407
- return {
408
- success: true,
409
- deleted: false,
410
- key,
411
- namespace,
412
- remainingEntries,
413
- error: `Key '${key}' not found in namespace '${namespace}'`
414
- };
415
- }
416
- db.run(`
417
+ checkStmt.bind([key, namespace]);
418
+ const checkRows = [];
419
+ while (checkStmt.step()) {
420
+ checkRows.push(checkStmt.get());
421
+ }
422
+ checkStmt.free();
423
+ const checkResult = checkRows.length > 0 ? [{ values: checkRows }] : [];
424
+ if (!checkResult[0]?.values?.[0]) {
425
+ const countResult = db.exec(`SELECT COUNT(*) FROM memory_entries WHERE status = 'active'`);
426
+ const remainingEntries = countResult[0]?.values?.[0]?.[0] || 0;
427
+ db.close();
428
+ return {
429
+ success: true,
430
+ deleted: false,
431
+ key,
432
+ namespace,
433
+ remainingEntries,
434
+ error: `Key '${key}' not found in namespace '${namespace}'`
435
+ };
436
+ }
437
+ db.run(`
417
438
  UPDATE memory_entries
418
439
  SET status = 'deleted',
419
440
  embedding = NULL,
@@ -422,23 +443,25 @@ export async function deleteEntry(options) {
422
443
  AND namespace = ?
423
444
  AND status = 'active'
424
445
  `, [key, namespace]);
425
- const countResult = db.exec(`SELECT COUNT(*) FROM memory_entries WHERE status = 'active'`);
426
- const remainingEntries = countResult[0]?.values?.[0]?.[0] || 0;
427
- // Save updated database atomically
428
- const data = db.export();
429
- const dbTmpDelete = dbPath + '.tmp';
430
- fs.writeFileSync(dbTmpDelete, Buffer.from(data));
431
- fs.renameSync(dbTmpDelete, dbPath);
432
- db.close();
433
- // Invalidate the HNSW index so it rebuilds from DB on next search.
434
- rebuildSearchIndex();
435
- return {
436
- success: true,
437
- deleted: true,
438
- key,
439
- namespace,
440
- remainingEntries
441
- };
446
+ const countResult = db.exec(`SELECT COUNT(*) FROM memory_entries WHERE status = 'active'`);
447
+ const remainingEntries = countResult[0]?.values?.[0]?.[0] || 0;
448
+ // Save updated database atomically
449
+ const data = db.export();
450
+ const dbTmpDelete = dbPath + '.tmp';
451
+ fs.writeFileSync(dbTmpDelete, Buffer.from(data));
452
+ fs.renameSync(dbTmpDelete, dbPath);
453
+ secureDbFilePermissions(dbPath);
454
+ db.close();
455
+ // Invalidate the HNSW index so it rebuilds from DB on next search.
456
+ rebuildSearchIndex();
457
+ return {
458
+ success: true,
459
+ deleted: true,
460
+ key,
461
+ namespace,
462
+ remainingEntries
463
+ };
464
+ });
442
465
  }
443
466
  catch (error) {
444
467
  return {