@snoai/memory 0.0.0-stage → 1.0.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 (478) hide show
  1. package/LICENSE +176 -0
  2. package/README.md +7 -2
  3. package/config/b-profile-section-registry.json +118 -0
  4. package/config/llm/compiled/2026-05-19T230932Z/manifest.json +25 -0
  5. package/config/llm/compiled/2026-05-19T230932Z/registry-root.json +67 -0
  6. package/config/llm/compiled/2026-05-19T230932Z/resolved/mem_claw/openai_gpt_5_nano.json +5 -0
  7. package/config/llm/compiled/2026-05-19T230932Z/resolved/mem_claw/openrouter_auto.json +5 -0
  8. package/config/llm/compiled/2026-05-19T230932Z/resolved/mem_claw/sno_ai_extract.json +5 -0
  9. package/config/llm/compiled/2026-05-19T230932Z/source/mem_claw/openai_gpt_5_nano.mda +24 -0
  10. package/config/llm/compiled/2026-05-19T230932Z/source/mem_claw/openrouter_auto.mda +24 -0
  11. package/config/llm/compiled/2026-05-19T230932Z/source/mem_claw/sno_ai_extract.mda +24 -0
  12. package/config/llm/compiled/2026-07-21T001311Z/manifest.json +43 -0
  13. package/config/llm/compiled/2026-07-21T001311Z/registry-root.json +97 -0
  14. package/config/llm/compiled/2026-07-21T001311Z/resolved/mem_claw/openai_gpt_5_nano.json +5 -0
  15. package/config/llm/compiled/2026-07-21T001311Z/resolved/mem_claw/openrouter_auto.json +5 -0
  16. package/config/llm/compiled/2026-07-21T001311Z/resolved/mem_claw/sno_ai_extract.json +5 -0
  17. package/config/llm/compiled/2026-07-21T001311Z/resolved/mem_claw/sno_conflict_verdict.json +10 -0
  18. package/config/llm/compiled/2026-07-21T001311Z/resolved/mem_claw/sno_extract_chat.json +10 -0
  19. package/config/llm/compiled/2026-07-21T001311Z/resolved/mem_claw/sno_extract_profile.json +10 -0
  20. package/config/llm/compiled/2026-07-21T001311Z/source/mem_claw/openai_gpt_5_nano.mda +24 -0
  21. package/config/llm/compiled/2026-07-21T001311Z/source/mem_claw/openrouter_auto.mda +24 -0
  22. package/config/llm/compiled/2026-07-21T001311Z/source/mem_claw/sno_ai_extract.mda +24 -0
  23. package/config/llm/compiled/2026-07-21T001311Z/source/mem_claw/sno_conflict_verdict.mda +27 -0
  24. package/config/llm/compiled/2026-07-21T001311Z/source/mem_claw/sno_extract_chat.mda +27 -0
  25. package/config/llm/compiled/2026-07-21T001311Z/source/mem_claw/sno_extract_profile.mda +27 -0
  26. package/config/llm/compiled/2026-08-29T060335Z/manifest.json +43 -0
  27. package/config/llm/compiled/2026-08-29T060335Z/registry-root.json +97 -0
  28. package/config/llm/compiled/2026-08-29T060335Z/resolved/mem_claw/openai_gpt_5_nano.json +5 -0
  29. package/config/llm/compiled/2026-08-29T060335Z/resolved/mem_claw/openrouter_auto.json +5 -0
  30. package/config/llm/compiled/2026-08-29T060335Z/resolved/mem_claw/sno_ai_extract.json +5 -0
  31. package/config/llm/compiled/2026-08-29T060335Z/resolved/mem_claw/sno_conflict_verdict.json +10 -0
  32. package/config/llm/compiled/2026-08-29T060335Z/resolved/mem_claw/sno_extract_chat.json +10 -0
  33. package/config/llm/compiled/2026-08-29T060335Z/resolved/mem_claw/sno_extract_profile.json +10 -0
  34. package/config/llm/compiled/2026-08-29T060335Z/source/mem_claw/openai_gpt_5_nano.mda +24 -0
  35. package/config/llm/compiled/2026-08-29T060335Z/source/mem_claw/openrouter_auto.mda +24 -0
  36. package/config/llm/compiled/2026-08-29T060335Z/source/mem_claw/sno_ai_extract.mda +24 -0
  37. package/config/llm/compiled/2026-08-29T060335Z/source/mem_claw/sno_conflict_verdict.mda +27 -0
  38. package/config/llm/compiled/2026-08-29T060335Z/source/mem_claw/sno_extract_chat.mda +27 -0
  39. package/config/llm/compiled/2026-08-29T060335Z/source/mem_claw/sno_extract_profile.mda +27 -0
  40. package/config/llm/compiled/2026-09-04T004828Z/manifest.json +43 -0
  41. package/config/llm/compiled/2026-09-04T004828Z/registry-root.json +97 -0
  42. package/config/llm/compiled/2026-09-04T004828Z/resolved/mem_claw/openai_gpt_5_nano.json +5 -0
  43. package/config/llm/compiled/2026-09-04T004828Z/resolved/mem_claw/openrouter_auto.json +5 -0
  44. package/config/llm/compiled/2026-09-04T004828Z/resolved/mem_claw/sno_ai_extract.json +5 -0
  45. package/config/llm/compiled/2026-09-04T004828Z/resolved/mem_claw/sno_conflict_verdict.json +10 -0
  46. package/config/llm/compiled/2026-09-04T004828Z/resolved/mem_claw/sno_extract_chat.json +10 -0
  47. package/config/llm/compiled/2026-09-04T004828Z/resolved/mem_claw/sno_extract_profile.json +10 -0
  48. package/config/llm/compiled/2026-09-04T004828Z/source/mem_claw/openai_gpt_5_nano.mda +24 -0
  49. package/config/llm/compiled/2026-09-04T004828Z/source/mem_claw/openrouter_auto.mda +24 -0
  50. package/config/llm/compiled/2026-09-04T004828Z/source/mem_claw/sno_ai_extract.mda +24 -0
  51. package/config/llm/compiled/2026-09-04T004828Z/source/mem_claw/sno_conflict_verdict.mda +27 -0
  52. package/config/llm/compiled/2026-09-04T004828Z/source/mem_claw/sno_extract_chat.mda +27 -0
  53. package/config/llm/compiled/2026-09-04T004828Z/source/mem_claw/sno_extract_profile.mda +27 -0
  54. package/config/llm/current.json +4 -0
  55. package/config/llm/source/mem_claw/openai_gpt_5_nano.mda +24 -0
  56. package/config/llm/source/mem_claw/openrouter_auto.mda +24 -0
  57. package/config/llm/source/mem_claw/sno_ai_extract.mda +24 -0
  58. package/config/llm/source/mem_claw/sno_conflict_verdict.mda +27 -0
  59. package/config/llm/source/mem_claw/sno_extract_chat.mda +27 -0
  60. package/config/llm/source/mem_claw/sno_extract_profile.mda +27 -0
  61. package/config/llm.trust.json +37 -0
  62. package/dist/_types-CUKHSRkS.d.ts +103 -0
  63. package/dist/access-tracker-CSc21GtV.d.ts +110 -0
  64. package/dist/adapter-DMEmCTKo.d.ts +69 -0
  65. package/dist/adapter-XaRHZWZ2.js +333 -0
  66. package/dist/agent-llm-port-5oXgBpzJ.d.ts +53 -0
  67. package/dist/all-resources-BQK2ugjB.js +6379 -0
  68. package/dist/all-resources-Dij6l5h0.d.ts +18 -0
  69. package/dist/ambient-learning-text-normalizer-CxjATmMp.js +170 -0
  70. package/dist/ambient-learning-text-normalizer-_fH3LeuK.d.ts +10 -0
  71. package/dist/atomic-extraction-reply-BJ9XV_9s.js +863 -0
  72. package/dist/atomic-extraction-skill-CcXmuCqL.js +56 -0
  73. package/dist/atomic-memory-extraction-BpOUWPJM.d.ts +327 -0
  74. package/dist/atomic-memory-extraction-sdNf1-B1.js +3605 -0
  75. package/dist/b-profile-section-dictionary-provider-BHkoNqgk.js +1812 -0
  76. package/dist/b-profile-section-dictionary-provider-BxbksLj3.d.ts +62 -0
  77. package/dist/best-effort-BPZSzKk0.d.ts +9 -0
  78. package/dist/calendar-instruction-CzqZbAPG.js +194 -0
  79. package/dist/capture-policy-detector-CHz5GOPA.d.ts +53 -0
  80. package/dist/capture-policy-detector-DaMfy9CZ.js +357 -0
  81. package/dist/classifier-C96uH9OF.d.ts +272 -0
  82. package/dist/client.d.ts +34 -0
  83. package/dist/client.js +305 -0
  84. package/dist/coding-skin.d.ts +51 -0
  85. package/dist/coding-skin.js +55 -0
  86. package/dist/config-tSrvLXgV.js +2577 -0
  87. package/dist/connection-DAbzki8K.d.ts +391 -0
  88. package/dist/connection-DliCOBB2.js +297 -0
  89. package/dist/daily-log-generator-CH_KuWHs.js +469 -0
  90. package/dist/daily-log-generator-CsQPHl4A.d.ts +73 -0
  91. package/dist/daily-spend-estimator-DiwzBlo1.d.ts +8 -0
  92. package/dist/data-bootstrap-CYniFp8b.js +172 -0
  93. package/dist/data-bootstrap-CcJUwkqf.d.ts +30 -0
  94. package/dist/data-paths-C7sNdqvP.d.ts +22 -0
  95. package/dist/derived-suppression-cache-C7bGARc0.d.ts +36 -0
  96. package/dist/diagnostic-encoder.d.ts +6 -0
  97. package/dist/diagnostic-encoder.js +29 -0
  98. package/dist/embedding-provider-client-Q_hJonK9.js +294 -0
  99. package/dist/embedding-provider-client-vynZMuit.d.ts +94 -0
  100. package/dist/entry-metadata-parser-BIVSMCIk.js +20 -0
  101. package/dist/error-D-wb-rZw.js +23 -0
  102. package/dist/error-signals-D8_3vYu4.d.ts +28 -0
  103. package/dist/error-signals-lMH2uAdV.js +134 -0
  104. package/dist/errors-CeVRxf9V.d.ts +49 -0
  105. package/dist/extraction-text-sanitizer-B_AhIecT.d.ts +32 -0
  106. package/dist/i18n-text-DbD6Qify.d.ts +13 -0
  107. package/dist/index-BsMap4It.d.ts +650 -0
  108. package/dist/index-DL8AVj0Z.d.ts +571 -0
  109. package/dist/index-DQ7VL6d3.d.ts +350 -0
  110. package/dist/index.d.ts +65 -0
  111. package/dist/index.js +1201 -0
  112. package/dist/intent-analyzer-B5XVrWwe.d.ts +28 -0
  113. package/dist/internal/config/index.d.ts +2 -0
  114. package/dist/internal/config/index.js +581 -0
  115. package/dist/internal/config/plugin-config-schema.d.ts +2 -0
  116. package/dist/internal/config/plugin-config-schema.js +2 -0
  117. package/dist/internal/config/product-mode.d.ts +2 -0
  118. package/dist/internal/config/product-mode.js +36 -0
  119. package/dist/internal/config/settings.d.ts +2 -0
  120. package/dist/internal/config/settings.js +265 -0
  121. package/dist/internal/config/skill-categories.d.ts +4 -0
  122. package/dist/internal/config/skill-categories.js +68 -0
  123. package/dist/internal/config/skin-defaults.d.ts +6 -0
  124. package/dist/internal/config/skin-defaults.js +6 -0
  125. package/dist/internal/contract/discovery.d.ts +10 -0
  126. package/dist/internal/contract/discovery.js +53 -0
  127. package/dist/internal/contract/profile.d.ts +2 -0
  128. package/dist/internal/contract/profile.js +44 -0
  129. package/dist/internal/contract/routes.d.ts +2 -0
  130. package/dist/internal/contract/routes.js +61 -0
  131. package/dist/internal/engine/bindings/memory-cli-shared.d.ts +47 -0
  132. package/dist/internal/engine/bindings/memory-cli-shared.js +84 -0
  133. package/dist/internal/engine/bindings/memory-forget-tool.d.ts +5 -0
  134. package/dist/internal/engine/bindings/memory-forget-tool.js +66 -0
  135. package/dist/internal/engine/bindings/memory-list-tool.d.ts +5 -0
  136. package/dist/internal/engine/bindings/memory-list-tool.js +57 -0
  137. package/dist/internal/engine/bindings/memory-recall-tool.d.ts +10 -0
  138. package/dist/internal/engine/bindings/memory-recall-tool.js +283 -0
  139. package/dist/internal/engine/bindings/memory-reflection-resolve-tool.d.ts +5 -0
  140. package/dist/internal/engine/bindings/memory-reflection-resolve-tool.js +150 -0
  141. package/dist/internal/engine/bindings/memory-stats-tool.d.ts +5 -0
  142. package/dist/internal/engine/bindings/memory-stats-tool.js +43 -0
  143. package/dist/internal/engine/bindings/memory-store-tool.d.ts +5 -0
  144. package/dist/internal/engine/bindings/memory-store-tool.js +165 -0
  145. package/dist/internal/engine/bindings/memory-tool-access.d.ts +16 -0
  146. package/dist/internal/engine/bindings/memory-tool-access.js +46 -0
  147. package/dist/internal/engine/bindings/memory-tool-formatting.d.ts +62 -0
  148. package/dist/internal/engine/bindings/memory-tool-formatting.js +106 -0
  149. package/dist/internal/engine/bindings/memory-tool-results.d.ts +8 -0
  150. package/dist/internal/engine/bindings/memory-tool-results.js +41 -0
  151. package/dist/internal/engine/bindings/memory-tool-schemas.d.ts +109 -0
  152. package/dist/internal/engine/bindings/memory-tool-schemas.js +75 -0
  153. package/dist/internal/engine/bindings/memory-update-tool.d.ts +5 -0
  154. package/dist/internal/engine/bindings/memory-update-tool.js +127 -0
  155. package/dist/internal/engine/bindings/sno-station-mem-ambient-learning-hook.d.ts +14 -0
  156. package/dist/internal/engine/bindings/sno-station-mem-ambient-learning-hook.js +248 -0
  157. package/dist/internal/engine/bindings/sno-station-mem-auto-recall-hook.d.ts +12 -0
  158. package/dist/internal/engine/bindings/sno-station-mem-auto-recall-hook.js +324 -0
  159. package/dist/internal/engine/bindings/sno-station-mem-hook-types.d.ts +56 -0
  160. package/dist/internal/engine/bindings/sno-station-mem-hook-types.js +1 -0
  161. package/dist/internal/engine/bindings/sno-station-mem-insight-distill-factory.d.ts +14 -0
  162. package/dist/internal/engine/bindings/sno-station-mem-insight-distill-factory.js +119 -0
  163. package/dist/internal/engine/bindings/sno-station-mem-message-transcript.d.ts +52 -0
  164. package/dist/internal/engine/bindings/sno-station-mem-message-transcript.js +145 -0
  165. package/dist/internal/engine/bindings/sno-station-mem-reset-hook.d.ts +10 -0
  166. package/dist/internal/engine/bindings/sno-station-mem-reset-hook.js +9 -0
  167. package/dist/internal/engine/bindings/sno-station-mem-runtime-mode.d.ts +37 -0
  168. package/dist/internal/engine/bindings/sno-station-mem-runtime-mode.js +105 -0
  169. package/dist/internal/engine/bindings/sno-station-mem-session-state.d.ts +10 -0
  170. package/dist/internal/engine/bindings/sno-station-mem-session-state.js +27 -0
  171. package/dist/internal/engine/eval/trace.d.ts +2 -0
  172. package/dist/internal/engine/eval/trace.js +151 -0
  173. package/dist/internal/engine/extraction/ambient-learning-text-normalizer.d.ts +2 -0
  174. package/dist/internal/engine/extraction/ambient-learning-text-normalizer.js +2 -0
  175. package/dist/internal/engine/extraction/atomic-memory-extraction.d.ts +2 -0
  176. package/dist/internal/engine/extraction/atomic-memory-extraction.js +2 -0
  177. package/dist/internal/engine/extraction/b-profile-section-dictionary-provider.d.ts +2 -0
  178. package/dist/internal/engine/extraction/b-profile-section-dictionary-provider.js +2 -0
  179. package/dist/internal/engine/extraction/b-profile-section-rekey.d.ts +49 -0
  180. package/dist/internal/engine/extraction/b-profile-section-rekey.js +730 -0
  181. package/dist/internal/engine/extraction/capture-policy-detector.d.ts +2 -0
  182. package/dist/internal/engine/extraction/capture-policy-detector.js +2 -0
  183. package/dist/internal/engine/extraction/embedding-provider-client.d.ts +2 -0
  184. package/dist/internal/engine/extraction/embedding-provider-client.js +2 -0
  185. package/dist/internal/engine/extraction/extraction-text-sanitizer.d.ts +2 -0
  186. package/dist/internal/engine/extraction/extraction-text-sanitizer.js +114 -0
  187. package/dist/internal/engine/extraction/memory-metadata-codec.d.ts +3 -0
  188. package/dist/internal/engine/extraction/memory-metadata-codec.js +2 -0
  189. package/dist/internal/engine/extraction/memory-temporality-classifier.d.ts +2 -0
  190. package/dist/internal/engine/extraction/memory-temporality-classifier.js +2 -0
  191. package/dist/internal/engine/i18n/all-resources.d.ts +2 -0
  192. package/dist/internal/engine/i18n/all-resources.js +2 -0
  193. package/dist/internal/engine/i18n/locales.d.ts +2 -0
  194. package/dist/internal/engine/i18n/locales.js +19 -0
  195. package/dist/internal/engine/i18n/res/_types.d.ts +2 -0
  196. package/dist/internal/engine/i18n/res/_types.js +11 -0
  197. package/dist/internal/engine/observability/adapter.d.ts +2 -0
  198. package/dist/internal/engine/observability/adapter.js +2 -0
  199. package/dist/internal/engine/observability/best-effort.d.ts +2 -0
  200. package/dist/internal/engine/observability/best-effort.js +41 -0
  201. package/dist/internal/engine/observability/early-diagnostics.js +2 -0
  202. package/dist/internal/engine/observability/memory-snapshot.d.ts +2 -0
  203. package/dist/internal/engine/observability/memory-snapshot.js +44 -0
  204. package/dist/internal/engine/observability/observable-embedder.d.ts +2 -0
  205. package/dist/internal/engine/observability/observable-embedder.js +43 -0
  206. package/dist/internal/engine/observability/observable-llm-client.d.ts +2 -0
  207. package/dist/internal/engine/observability/observable-llm-client.js +98 -0
  208. package/dist/internal/engine/observability/observable-memory-store.d.ts +2 -0
  209. package/dist/internal/engine/observability/observable-memory-store.js +701 -0
  210. package/dist/internal/engine/observability/observable-retriever.d.ts +2 -0
  211. package/dist/internal/engine/observability/observable-retriever.js +95 -0
  212. package/dist/internal/engine/observability/runtime-diagnostics.d.ts +13 -0
  213. package/dist/internal/engine/observability/runtime-diagnostics.js +96 -0
  214. package/dist/internal/engine/observability/session-registry.d.ts +2 -0
  215. package/dist/internal/engine/observability/session-registry.js +58 -0
  216. package/dist/internal/engine/observability/version-metadata.d.ts +7 -0
  217. package/dist/internal/engine/observability/version-metadata.js +59 -0
  218. package/dist/internal/engine/operations/daily-spend-estimator.d.ts +2 -0
  219. package/dist/internal/engine/operations/daily-spend-estimator.js +97 -0
  220. package/dist/internal/engine/operations/learning-file-maintenance.d.ts +2 -0
  221. package/dist/internal/engine/operations/learning-file-maintenance.js +255 -0
  222. package/dist/internal/engine/operations/memory-tier-promoter.d.ts +2 -0
  223. package/dist/internal/engine/operations/memory-tier-promoter.js +95 -0
  224. package/dist/internal/engine/operations/runtime-audit-log.d.ts +3 -0
  225. package/dist/internal/engine/operations/runtime-audit-log.js +3 -0
  226. package/dist/internal/engine/provider/canonical-memory-corpus.d.ts +38 -0
  227. package/dist/internal/engine/provider/canonical-memory-corpus.js +253 -0
  228. package/dist/internal/engine/provider/provider-registration.d.ts +39 -0
  229. package/dist/internal/engine/provider/provider-registration.js +2 -0
  230. package/dist/internal/engine/provider/provider-row-renderer.d.ts +7 -0
  231. package/dist/internal/engine/provider/provider-row-renderer.js +53 -0
  232. package/dist/internal/engine/provider/provider-types.d.ts +2 -0
  233. package/dist/internal/engine/provider/provider-types.js +1 -0
  234. package/dist/internal/engine/reflection/daily-log-generator.d.ts +2 -0
  235. package/dist/internal/engine/reflection/daily-log-generator.js +2 -0
  236. package/dist/internal/engine/reflection/reflection-command-hooks.d.ts +2 -0
  237. package/dist/internal/engine/reflection/reflection-command-hooks.js +2 -0
  238. package/dist/internal/engine/reflection/reflection-deps.d.ts +2 -0
  239. package/dist/internal/engine/reflection/reflection-deps.js +1 -0
  240. package/dist/internal/engine/reflection/reflection-embedded-generator.d.ts +2 -0
  241. package/dist/internal/engine/reflection/reflection-embedded-generator.js +2 -0
  242. package/dist/internal/engine/reflection/reflection-injection-hooks.d.ts +2 -0
  243. package/dist/internal/engine/reflection/reflection-injection-hooks.js +219 -0
  244. package/dist/internal/engine/reflection/reflection-lifecycle-hooks.d.ts +2 -0
  245. package/dist/internal/engine/reflection/reflection-lifecycle-hooks.js +63 -0
  246. package/dist/internal/engine/reflection/strategy-hook-runner.d.ts +4 -0
  247. package/dist/internal/engine/reflection/strategy-hook-runner.js +3 -0
  248. package/dist/internal/engine/rem/classifier.d.ts +2 -0
  249. package/dist/internal/engine/rem/classifier.js +180 -0
  250. package/dist/internal/engine/rem/index.d.ts +4 -0
  251. package/dist/internal/engine/rem/index.js +2551 -0
  252. package/dist/internal/engine/rem/types.d.ts +2 -0
  253. package/dist/internal/engine/rem/types.js +40 -0
  254. package/dist/internal/engine/retrieval/access-tracker.d.ts +2 -0
  255. package/dist/internal/engine/retrieval/access-tracker.js +314 -0
  256. package/dist/internal/engine/retrieval/intent-analyzer.d.ts +2 -0
  257. package/dist/internal/engine/retrieval/intent-analyzer.js +27 -0
  258. package/dist/internal/engine/retrieval/retrieval-gate.d.ts +2 -0
  259. package/dist/internal/engine/retrieval/retrieval-gate.js +47 -0
  260. package/dist/internal/engine/retrieval/retriever.d.ts +2 -0
  261. package/dist/internal/engine/retrieval/retriever.js +2 -0
  262. package/dist/internal/engine/security/memory-scope-policy.d.ts +2 -0
  263. package/dist/internal/engine/security/memory-scope-policy.js +2 -0
  264. package/dist/internal/engine/security/redact.d.ts +2 -0
  265. package/dist/internal/engine/security/redact.js +34 -0
  266. package/dist/internal/engine/security/scopes.d.ts +3 -0
  267. package/dist/internal/engine/security/scopes.js +3 -0
  268. package/dist/internal/engine/shared/errors.d.ts +2 -0
  269. package/dist/internal/engine/shared/errors.js +66 -0
  270. package/dist/internal/engine/shared/i18n-text.d.ts +2 -0
  271. package/dist/internal/engine/shared/i18n-text.js +58 -0
  272. package/dist/internal/engine/shared/iso-date-time.d.ts +16 -0
  273. package/dist/internal/engine/shared/iso-date-time.js +40 -0
  274. package/dist/internal/engine/shared/lru.d.ts +2 -0
  275. package/dist/internal/engine/shared/lru.js +30 -0
  276. package/dist/internal/engine/shared/memory-kind-policy.d.ts +2 -0
  277. package/dist/internal/engine/shared/memory-kind-policy.js +64 -0
  278. package/dist/internal/engine/shared/paths.d.ts +3 -0
  279. package/dist/internal/engine/shared/paths.js +2 -0
  280. package/dist/internal/engine/shared/types.d.ts +3 -0
  281. package/dist/internal/engine/shared/types.js +25 -0
  282. package/dist/internal/engine/shared/utils.d.ts +2 -0
  283. package/dist/internal/engine/shared/utils.js +175 -0
  284. package/dist/internal/engine/telemetry/memory-telemetry-api.d.ts +134 -0
  285. package/dist/internal/engine/telemetry/memory-telemetry-api.js +730 -0
  286. package/dist/internal/engine/telemetry/memory-telemetry-observability.d.ts +24 -0
  287. package/dist/internal/engine/telemetry/memory-telemetry-observability.js +133 -0
  288. package/dist/internal/engine/telemetry/memory-telemetry-outbox.d.ts +2 -0
  289. package/dist/internal/engine/telemetry/memory-telemetry-outbox.js +443 -0
  290. package/dist/internal/engine/telemetry/memory-telemetry-types.d.ts +2 -0
  291. package/dist/internal/engine/telemetry/memory-telemetry-types.js +21 -0
  292. package/dist/internal/engine/telemetry/observe-ledger.d.ts +30 -0
  293. package/dist/internal/engine/telemetry/observe-ledger.js +111 -0
  294. package/dist/internal/model/agent-llm-port.d.ts +2 -0
  295. package/dist/internal/model/agent-llm-port.js +1 -0
  296. package/dist/internal/model/llm-client.d.ts +3 -0
  297. package/dist/internal/model/llm-client.js +3 -0
  298. package/dist/internal/model/llm-failure.d.ts +26 -0
  299. package/dist/internal/model/llm-failure.js +63 -0
  300. package/dist/internal/model/llm-mode-routing.d.ts +22 -0
  301. package/dist/internal/model/llm-mode-routing.js +37 -0
  302. package/dist/internal/store/atomic-memory-cutover-sql.d.ts +13 -0
  303. package/dist/internal/store/atomic-memory-cutover-sql.js +237 -0
  304. package/dist/internal/store/connection.d.ts +2 -0
  305. package/dist/internal/store/connection.js +2 -0
  306. package/dist/internal/store/data-bootstrap.d.ts +2 -0
  307. package/dist/internal/store/data-bootstrap.js +2 -0
  308. package/dist/internal/store/data-paths.d.ts +2 -0
  309. package/dist/internal/store/data-paths.js +65 -0
  310. package/dist/internal/store/maintenance.d.ts +75 -0
  311. package/dist/internal/store/maintenance.js +1401 -0
  312. package/dist/internal/store/memory-kinds-cutover-migrator.d.ts +28 -0
  313. package/dist/internal/store/memory-kinds-cutover-migrator.js +415 -0
  314. package/dist/internal/store/migrations.d.ts +27 -0
  315. package/dist/internal/store/migrations.js +201 -0
  316. package/dist/internal/store/sqlite-runtime.d.ts +2 -0
  317. package/dist/internal/store/sqlite-runtime.js +109 -0
  318. package/dist/internal/store/store.d.ts +3 -0
  319. package/dist/internal/store/store.js +2 -0
  320. package/dist/learning-file-maintenance-9b-Ut6Kv.d.ts +30 -0
  321. package/dist/llm-client-B7Xoxqou.js +1378 -0
  322. package/dist/llm-client-DOTSGzhe.d.ts +51 -0
  323. package/dist/locales-JxGmkG6t.d.ts +7 -0
  324. package/dist/log-site-catalog.generated-B9WYdnAM.js +2321 -0
  325. package/dist/log-site-catalog.json +1 -0
  326. package/dist/lru-DyoaTyIs.d.ts +14 -0
  327. package/dist/memdump.d.ts +52 -0
  328. package/dist/memdump.js +163 -0
  329. package/dist/memory-entry-projector-DHo8jH10.js +1015 -0
  330. package/dist/memory-kind-policy-LKt0u3gy.d.ts +23 -0
  331. package/dist/memory-metadata-codec-C3oQd47V.d.ts +68 -0
  332. package/dist/memory-metadata-codec-DL1sbJiN.js +577 -0
  333. package/dist/memory-runtime-BZtREuwW.js +19459 -0
  334. package/dist/memory-scope-policy-1gg5QlWZ.d.ts +67 -0
  335. package/dist/memory-scope-policy-DICSCURA.js +283 -0
  336. package/dist/memory-snapshot-3e44ND2i.d.ts +16 -0
  337. package/dist/memory-source-order-BtrIxaIt.js +134 -0
  338. package/dist/memory-store-base-XRA4S9Xl.d.ts +1095 -0
  339. package/dist/memory-store-shared-DeIDkhLj.js +158 -0
  340. package/dist/memory-store-write-validation-B_hDG2zf.js +243 -0
  341. package/dist/memory-telemetry-incidents-BWA9kcZx.js +8 -0
  342. package/dist/memory-telemetry-metadata-CA7W8tK6.js +77 -0
  343. package/dist/memory-telemetry-outbox-ddTdImt7.d.ts +74 -0
  344. package/dist/memory-telemetry-receipts-MAJecvXQ.d.ts +34 -0
  345. package/dist/memory-telemetry-receipts-YsxbwOAf.js +91 -0
  346. package/dist/memory-telemetry-types-CufVmrCs.d.ts +14 -0
  347. package/dist/memory-temporality-classifier-CEdRTN5J.d.ts +43 -0
  348. package/dist/memory-temporality-classifier-CKiTAHXe.js +184 -0
  349. package/dist/memory-tier-promoter-DbTpahkP.d.ts +43 -0
  350. package/dist/memory-tool-dependencies-CLODycUw.js +19 -0
  351. package/dist/memory-tool-dependencies-N69chrQc.d.ts +14 -0
  352. package/dist/model-call-table-CspopkBg.js +563 -0
  353. package/dist/model-reply-text-CKopStP2.js +334 -0
  354. package/dist/observable-embedder-DQnNgf9O.d.ts +17 -0
  355. package/dist/observable-llm-client-uwqPADpN.d.ts +21 -0
  356. package/dist/observable-memory-store-BaZKbhgq.d.ts +73 -0
  357. package/dist/observable-retriever-Dt_NUxAA.d.ts +23 -0
  358. package/dist/operation-cancellation-CTKWwNHk.js +81 -0
  359. package/dist/paths-qVF-5uBq.d.ts +1 -0
  360. package/dist/plugin-config-schema-C0UUbOmG.d.ts +413 -0
  361. package/dist/plugin-config-schema-YJLyIIcJ.js +361 -0
  362. package/dist/profile-TWPJ_myr.d.ts +13 -0
  363. package/dist/profile-section-writer-hIphqpUY.js +2149 -0
  364. package/dist/provider-registration-CF1tg8Xy.js +721 -0
  365. package/dist/provider-runtime-types-DFhtdA6d.d.ts +134 -0
  366. package/dist/provider-types-CZGm6v88.d.ts +23 -0
  367. package/dist/redact-BTIZcHQL.d.ts +5 -0
  368. package/dist/reflection-command-hooks-BeQiJI9-.js +644 -0
  369. package/dist/reflection-command-hooks-C1Vxgb-O.d.ts +32 -0
  370. package/dist/reflection-deps-RpLPFrSc.d.ts +19 -0
  371. package/dist/reflection-embedded-generator-CDUhgV96.js +130 -0
  372. package/dist/reflection-embedded-generator-CxOex5xK.d.ts +14 -0
  373. package/dist/reflection-injection-hooks-DfUgqu8f.d.ts +43 -0
  374. package/dist/reflection-lifecycle-hooks-Ct5HBdSG.d.ts +27 -0
  375. package/dist/relation-dictionary-Cev1kyLe.js +4248 -0
  376. package/dist/release-download.d.ts +8 -0
  377. package/dist/release-download.js +32 -0
  378. package/dist/relevant-memories-context-m8nuFZcM.js +23 -0
  379. package/dist/rem-batch-executor-Cbm5gfSe.js +31644 -0
  380. package/dist/rem-batch-executor-bc0IFlp2.js +2 -0
  381. package/dist/rem-consumer-retrieval-CRpvG8KS.js +246 -0
  382. package/dist/rem-trigger-BTxkcjgT.js +729 -0
  383. package/dist/resolver-Dy-hnjCR.js +103 -0
  384. package/dist/results-C3ZLroMb.js +140 -0
  385. package/dist/retrieval-gate-Bx2Zg7jD.d.ts +31 -0
  386. package/dist/retriever-CygHBazG.js +1757 -0
  387. package/dist/retriever-Ruk3zp7_.d.ts +469 -0
  388. package/dist/rolldown-runtime-D7D4PA-g.js +13 -0
  389. package/dist/routes-Ce7SQKec.js +59 -0
  390. package/dist/runtime-audit-log-BCeujlEp.js +430 -0
  391. package/dist/runtime-audit-log-zpQiR9HT.d.ts +149 -0
  392. package/dist/scopes-CSOn6zdd.js +71 -0
  393. package/dist/scopes-CtrY-YQ3.d.ts +23 -0
  394. package/dist/server-BPAY4NTG.js +1410 -0
  395. package/dist/session-registry-DBoE7AvZ.d.ts +14 -0
  396. package/dist/sidecar/main.d.ts +1 -0
  397. package/dist/sidecar/main.js +56 -0
  398. package/dist/signed-registry-constants-Bv0fgZ8Q.d.ts +12 -0
  399. package/dist/signed-registry-constants-yq3DlG3B.js +82 -0
  400. package/dist/sno-station-mem-runtime-dependencies-Bu-MiqPX.d.ts +31 -0
  401. package/dist/sno-station-mem-runtime-dependencies-DjLOhB45.js +30 -0
  402. package/dist/sqlite-runtime-L_ywirTm.d.ts +58 -0
  403. package/dist/store-2pM0-dZg.d.ts +27 -0
  404. package/dist/store-DzpZBMEm.js +5830 -0
  405. package/dist/strategy-hook-runner-gBtU47tX.d.ts +16 -0
  406. package/dist/strategy-hook-runner-zmdIYOmQ.js +110 -0
  407. package/dist/token-counter-BD1f48Km.js +73 -0
  408. package/dist/trace-1t1n_wUm.d.ts +86 -0
  409. package/dist/types-DxKqU60b.d.ts +477 -0
  410. package/dist/types-pVomjzqR.d.ts +132 -0
  411. package/dist/unplaced-candidate-migration-CbQHzcEM.js +940 -0
  412. package/dist/utils-Ctb9aevJ.d.ts +34 -0
  413. package/drizzle/0000_initial.sql +10 -0
  414. package/drizzle/0001_virtual_tables.sql +34 -0
  415. package/drizzle/0002_add_indexes.sql +11 -0
  416. package/drizzle/0003_content_hash_lookup_index.sql +2 -0
  417. package/drizzle/0004_chunk_swap.sql +60 -0
  418. package/drizzle/0005_drop_legacy_vec_fts.sql +10 -0
  419. package/drizzle/0006_fts_simple.sql +45 -0
  420. package/drizzle/0007_restore_simple_fts.sql +40 -0
  421. package/drizzle/0008_widen_memory_hash_unique_index.sql +4 -0
  422. package/drizzle/0009_memory_telemetry.sql +109 -0
  423. package/drizzle/0010_provider_mappings.sql +27 -0
  424. package/drizzle/0011_db_optimization.sql +82 -0
  425. package/drizzle/0012_b_profile_lanes.sql +9 -0
  426. package/drizzle/0013_extraction_timestamps.sql +6 -0
  427. package/drizzle/0014_extraction_timestamp_source.sql +3 -0
  428. package/drizzle/0015_task_lifecycle_state.sql +101 -0
  429. package/drizzle/0016_task_lifecycle_legacy_migration.sql +144 -0
  430. package/drizzle/0017_unplaced_candidates.sql +15 -0
  431. package/drizzle/0018_rem_batch_chassis.sql +71 -0
  432. package/drizzle/0019_profile_recovery_entries.sql +17 -0
  433. package/drizzle/0020_rem_scan_retry_progress.down.sql +14 -0
  434. package/drizzle/0020_rem_scan_retry_progress.sql +24 -0
  435. package/drizzle/0021_rem_two_facet_storage.down.sql +14 -0
  436. package/drizzle/0021_rem_two_facet_storage.sql +42 -0
  437. package/drizzle/0022_rem_facet_chunk_versions.down.sql +4 -0
  438. package/drizzle/0022_rem_facet_chunk_versions.sql +4 -0
  439. package/drizzle/0023_rem_defect_ledger.sql +40 -0
  440. package/drizzle/0024_rem_unbuilt_foundations.down.sql +13 -0
  441. package/drizzle/0024_rem_unbuilt_foundations.sql +65 -0
  442. package/drizzle/0025_rem_journal_operation_constraint.sql +28 -0
  443. package/drizzle/0026_rem_journal_detail.sql +1 -0
  444. package/drizzle/0027_legacy_nodix_namespace.sql +3 -0
  445. package/drizzle/0028_memory_timezone.sql +23 -0
  446. package/drizzle/0029_rem_write_hash_symmetry.sql +17 -0
  447. package/drizzle/0030_atomic_memory_additive.sql +105 -0
  448. package/drizzle/0031_atomic_extraction_ledger.sql +23 -0
  449. package/drizzle/0032_atomic_memory_entities.sql +12 -0
  450. package/drizzle/0033_todo_own_store.sql +99 -0
  451. package/drizzle/meta/0000_snapshot.json +87 -0
  452. package/drizzle/meta/_journal.json +244 -0
  453. package/generated/rem-operations.json +1 -0
  454. package/package.json +126 -4
  455. package/scripts/download-simple-tokenizer.mjs +254 -0
  456. package/settings.default.json +243 -0
  457. package/skills/extract-atomic-memory/SKILL.md +298 -0
  458. package/skills/extract-atomic-memory/references/account-for-turns.md +9 -0
  459. package/skills/extract-atomic-memory/references/calendar-meaning.md +64 -0
  460. package/skills/extract-atomic-memory/references/capture.md +120 -0
  461. package/skills/extract-atomic-memory/references/enrichment.md +92 -0
  462. package/skills/extract-atomic-memory/references/missing-durable-half.md +6 -0
  463. package/skills/extract-atomic-memory/references/progress-classification.md +21 -0
  464. package/skills/extract-atomic-memory/references/resolve-subject.md +19 -0
  465. package/skills/extract-atomic-memory/references/surrounding-context.md +10 -0
  466. package/skills/extract-atomic-memory/references/user-subject-guard.md +29 -0
  467. package/skills/judge-group-closure/SKILL.md +25 -0
  468. package/skills/judge-rem-memory-updates/SKILL.md +56 -0
  469. package/skills/judge-rem-memory-updates/agents/openai.yaml +4 -0
  470. package/skills/judge-retired-position/SKILL.md +25 -0
  471. package/skills/judge-task-lifecycle/SKILL.md +45 -0
  472. package/skills/key-state-attribute/SKILL.md +16 -0
  473. package/skills/resolve-entity-identity/SKILL.md +24 -0
  474. package/skills/resolve-relative-time/SKILL.md +22 -0
  475. package/sqlite-extensions/LICENSE-simple-tokenizer +28 -0
  476. package/sqlite-extensions/LICENSE-sqlite-vec +21 -0
  477. package/sqlite-extensions/linux-arm64/vec0.so +0 -0
  478. package/sqlite-extensions/linux-x64/vec0.so +0 -0
@@ -0,0 +1,940 @@
1
+ import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.js";
2
+ import { DEFAULT_IMPORTANCE } from "./internal/config/index.js";
3
+ import { A as FIXED_MEMORY_ACTIVE_TASK_REVISIONS, B as FIXED_MEMORY_EXTRACTION_TIMESTAMPS, C as FIXED_IDX_MEMORY_MEMORIES_PROJECT_FACT_KEY_ACTIVE, D as FIXED_MEMORY_ACTIVE_TASK_INSTANCES, E as FIXED_MEMORY_ACTIVE_TASK_EVIDENCE, F as FIXED_MEMORY_CHUNKS_AU, G as FIXED_MEMORY_PROFILE_RECOVERY_ENTRIES, H as FIXED_MEMORY_MEMORIES_FACT_ID_INSERT_GUARD, I as FIXED_MEMORY_CHUNKS_FTS, J as FIXED_MEMORY_PROVIDER_PROJECT_MAPPINGS, K as FIXED_MEMORY_PROVIDER_AGENT_MAPPINGS, L as FIXED_MEMORY_CHUNKS_MEMORY_ID_IDX, M as FIXED_MEMORY_CHUNKS, N as FIXED_MEMORY_CHUNKS_AD, O as FIXED_MEMORY_ACTIVE_TASK_MIGRATION_EVIDENCE, P as FIXED_MEMORY_CHUNKS_AI, R as FIXED_MEMORY_CHUNKS_MEM_FACET_IDX, S as FIXED_IDX_MEMORY_MEMORIES_PROJECT_CONTENT_HASH, T as FIXED_MEMORY, U as FIXED_MEMORY_MEMORIES_FACT_ID_UPDATE_GUARD, V as FIXED_MEMORY_MEMORIES, W as FIXED_MEMORY_MIGRATION_MARKERS, _ as FIXED_IDX_MEMORY_MEMORIES_CATEGORY, a as FIXED_EXTERNAL_VALUE_54, b as FIXED_IDX_MEMORY_MEMORIES_LANE_PROJECT, bt as FIXED_VEC_MEMORY_CHUNKS, c as FIXED_EXTERNAL_VALUE_57, et as FIXED_MEMORY_TASK_LIFECYCLE_COMMANDS, g as FIXED_IDX_MEMORY_ACTIVE_TASK_INSTANCES_PROJECTION, h as FIXED_IDX_MEMORY_ACTIVE_TASK_EVIDENCE_INSTANCE, i as FIXED_EXTERNAL_VALUE_53, j as FIXED_MEMORY_ACTIVE_TASK_TRANSITIONS, k as FIXED_MEMORY_ACTIVE_TASK_MIGRATION_MANIFESTS, l as FIXED_EXTERNAL_VALUE_58, m as FIXED_IDX_MEMORY_ACTIVE_TASK_CURRENT_REVISION, n as FIXED_EXTERNAL_VALUE_51, o as FIXED_EXTERNAL_VALUE_55, p as FIXED_IDX_MEMORY, q as FIXED_MEMORY_PROVIDER_PROJECT_AGENTS, r as FIXED_EXTERNAL_VALUE_52, s as FIXED_EXTERNAL_VALUE_56, t as FIXED_EXTERNAL_VALUE_49, tt as FIXED_MEMORY_UNPLACED_CANDIDATES, u as FIXED_EXTERNAL_VALUE_62, v as FIXED_IDX_MEMORY_MEMORIES_CONTENT_HASH, w as FIXED_IDX_MEMORY_MEMORIES_PROJECT_TIMESTAMP, x as FIXED_IDX_MEMORY_MEMORIES_PROJECT, xt as PERSISTED_CANDIDATE_HASH_V1, y as FIXED_IDX_MEMORY_MEMORIES_FACT_ID, yt as FIXED_VEC_MEMORY, z as FIXED_MEMORY_CHUNKS_MEM_IDX } from "./signed-registry-constants-yq3DlG3B.js";
4
+ import { StorageError } from "./internal/engine/shared/errors.js";
5
+ import { stableHash } from "./internal/engine/shared/utils.js";
6
+ import { createLogger } from "@snoai/utils/logger";
7
+ import { dirname, join, resolve } from "node:path";
8
+ import { randomUUID } from "node:crypto";
9
+ import { existsSync } from "node:fs";
10
+ import { fileURLToPath } from "node:url";
11
+ import { arch, platform } from "node:os";
12
+ import { index, integer, primaryKey, real, sqliteTable, text } from "drizzle-orm/sqlite-core";
13
+ import { arch as arch$1, platform as platform$1 } from "node:process";
14
+ import { getLoadablePath } from "sqlite-vec";
15
+ //#region src/store/entity-name-key-migration.ts
16
+ /** @file entity-name-key-migration.ts
17
+ * @purpose Re-keys entity names so several names can identify one entity.
18
+ * @boundary Idempotent SQLite table rebuild only; no identity judgment.
19
+ */
20
+ function isEntityNameKeyMigrationResult(value) {
21
+ if (typeof value !== "object" || value === null || !("status" in value)) return false;
22
+ return value.status === "migrated" || value.status === "noop";
23
+ }
24
+ const CREATE_ENTITY_TABLE_SQL = `
25
+ CREATE TABLE nodix_memory_entities_cutover (
26
+ project_id TEXT NOT NULL,
27
+ entity_id TEXT NOT NULL,
28
+ display_name TEXT NOT NULL,
29
+ normalized_name TEXT NOT NULL,
30
+ created_at INTEGER NOT NULL,
31
+ PRIMARY KEY(project_id, normalized_name)
32
+ ) WITHOUT ROWID;
33
+ `;
34
+ const CREATE_ENTITY_INDEXES_SQL = `
35
+ CREATE INDEX IF NOT EXISTS nodix_idx_memory_entities_display_name
36
+ ON nodix_memory_entities(project_id, display_name);
37
+ CREATE INDEX IF NOT EXISTS nodix_idx_memory_entities_entity_id
38
+ ON nodix_memory_entities(project_id, entity_id);
39
+ `;
40
+ function migrationApplied(database) {
41
+ const columns = database.prepare("PRAGMA table_info(nodix_memory_entities)").all();
42
+ if (columns.length === 0) throw new StorageError("entity name key migration requires nodix_memory_entities");
43
+ const primaryKey = columns.filter((column) => column.pk > 0).sort((left, right) => left.pk - right.pk).map((column) => column.name);
44
+ return primaryKey[0] === "project_id" && primaryKey[1] === "normalized_name";
45
+ }
46
+ function applyEntityNameKeyMigration(database) {
47
+ if (migrationApplied(database)) {
48
+ database.exec(CREATE_ENTITY_INDEXES_SQL);
49
+ return { status: "noop" };
50
+ }
51
+ database.exec("PRAGMA foreign_keys = OFF");
52
+ try {
53
+ const result = database.transaction(() => {
54
+ if (migrationApplied(database)) return { status: "noop" };
55
+ database.exec(CREATE_ENTITY_TABLE_SQL);
56
+ database.exec(`
57
+ INSERT INTO nodix_memory_entities_cutover(
58
+ project_id, entity_id, display_name, normalized_name, created_at
59
+ )
60
+ SELECT project_id, entity_id, display_name, normalized_name, created_at
61
+ FROM nodix_memory_entities;
62
+ `);
63
+ database.exec("DROP TABLE nodix_memory_entities");
64
+ database.exec("ALTER TABLE nodix_memory_entities_cutover RENAME TO nodix_memory_entities");
65
+ database.exec(CREATE_ENTITY_INDEXES_SQL);
66
+ return { status: "migrated" };
67
+ }).immediate();
68
+ if (!isEntityNameKeyMigrationResult(result)) throw new StorageError("entity name key migration returned an invalid result");
69
+ return result;
70
+ } finally {
71
+ database.exec("PRAGMA foreign_keys = ON");
72
+ }
73
+ }
74
+ //#endregion
75
+ //#region src/store/schema.ts
76
+ /** @file schema.ts
77
+ * @purpose Defines SQLite tables, indexes, and typed schema contracts for plugin storage.
78
+ * @boundary Drizzle schema, migrations, and store query assumptions.
79
+ * @see connection.ts, store.ts, memory-entry-projector.ts.
80
+ */
81
+ var schema_exports = /* @__PURE__ */ __exportAll({
82
+ memoryEvents: () => memoryEvents,
83
+ memoryTelemetryIncidents: () => memoryTelemetryIncidents,
84
+ memoryTelemetrySyncState: () => memoryTelemetrySyncState,
85
+ memoryUsageOutbox: () => memoryUsageOutbox,
86
+ nodixAtomicExtractionLedger: () => nodixAtomicExtractionLedger,
87
+ nodixMemories: () => nodixMemories,
88
+ nodixMemoryEntities: () => nodixMemoryEntities,
89
+ nodixMemoryExtractionTimestamps: () => nodixMemoryExtractionTimestamps,
90
+ nodixMemoryRelations: () => nodixMemoryRelations,
91
+ nodixMemorySuppressions: () => nodixMemorySuppressions,
92
+ nodixProfileRecoveryEntries: () => nodixProfileRecoveryEntries,
93
+ nodixProviderAgentMappings: () => nodixProviderAgentMappings,
94
+ nodixProviderProjectAgents: () => nodixProviderProjectAgents,
95
+ nodixProviderProjectMappings: () => nodixProviderProjectMappings,
96
+ nodixTodoMigrationReceipts: () => nodixTodoMigrationReceipts,
97
+ nodixTodos: () => nodixTodos,
98
+ nodixUnplacedMemoryCandidates: () => nodixUnplacedMemoryCandidates
99
+ });
100
+ const nodixMemories = sqliteTable("nodix_memories", {
101
+ id: text("id").primaryKey(),
102
+ text: text("text").notNull(),
103
+ category: text("category").notNull(),
104
+ projectId: text("project_id").notNull(),
105
+ importance: real("importance").notNull().default(DEFAULT_IMPORTANCE),
106
+ timestamp: integer("timestamp").notNull(),
107
+ timezone: text("timezone").notNull(),
108
+ metadata: text("metadata").default("{}"),
109
+ contentHash: text("content_hash").notNull(),
110
+ factId: text("fact_id"),
111
+ derivedFrom: text("derived_from"),
112
+ consolidationEpochId: text("consolidation_epoch_id"),
113
+ confidenceSource: text("confidence_source"),
114
+ lane: text("lane", { enum: [
115
+ "active",
116
+ "parked",
117
+ "quarantined"
118
+ ] }).notNull().default("active"),
119
+ rawCandidateJson: text("raw_candidate_json"),
120
+ dispositionReason: text("disposition_reason"),
121
+ dispositionedAtMs: integer("dispositioned_at_ms"),
122
+ subject: text("subject"),
123
+ attribute: text("attribute"),
124
+ validFrom: integer("valid_from"),
125
+ validUntil: integer("valid_until"),
126
+ maturity: text("maturity"),
127
+ source: text("source"),
128
+ extractorVersion: text("extractor_version")
129
+ });
130
+ const nodixMemoryExtractionTimestamps = sqliteTable("nodix_memory_extraction_timestamps", {
131
+ projectId: text("project_id").notNull(),
132
+ replayKey: text("replay_key").notNull(),
133
+ resolvedAtMs: integer("resolved_at_ms").notNull(),
134
+ timeSource: text("time_source", { enum: [
135
+ "event_at",
136
+ "session_time",
137
+ "first_resolution"
138
+ ] })
139
+ });
140
+ const nodixMemoryRelations = sqliteTable("nodix_memory_relations", {
141
+ sourceCardId: text("source_card_id").notNull().references(() => nodixMemories.id, { onDelete: "cascade" }),
142
+ subject: text("subject").notNull(),
143
+ predicate: text("predicate", { enum: [
144
+ "IS_A",
145
+ "WORKS_ON",
146
+ "NEEDS",
147
+ "PREFERS",
148
+ "FORBIDS",
149
+ "USES",
150
+ "DEPENDS_ON",
151
+ "CAUSED",
152
+ "FIXED_BY",
153
+ "DECIDED",
154
+ "SUPERSEDES",
155
+ "GOVERNED_BY",
156
+ "OWNED_BY",
157
+ "MEMBER_OF",
158
+ "LOCATED_AT",
159
+ "HAS_SKILL",
160
+ "INTERESTED_IN",
161
+ "HAS_ACCOUNT",
162
+ "HAS_OCCUPATION",
163
+ "HAS_METRIC",
164
+ "WORKS_AT",
165
+ "ATTENDED",
166
+ "MENTIONS"
167
+ ] }).notNull(),
168
+ object: text("object").notNull(),
169
+ createdAt: integer("created_at").notNull()
170
+ });
171
+ const nodixMemorySuppressions = sqliteTable("nodix_memory_suppressions", {
172
+ projectId: text("project_id").notNull(),
173
+ subject: text("subject"),
174
+ attribute: text("attribute"),
175
+ contentHash: text("content_hash"),
176
+ createdAt: integer("created_at").notNull()
177
+ });
178
+ const nodixTodos = sqliteTable("nodix_todos", {
179
+ projectId: text("project_id").notNull(),
180
+ activeTaskId: text("active_task_id").notNull(),
181
+ description: text("description").notNull(),
182
+ status: text("status", { enum: [
183
+ "open",
184
+ "done",
185
+ "removed"
186
+ ] }).notNull(),
187
+ openedAt: integer("opened_at").notNull(),
188
+ transitionedAt: integer("transitioned_at").notNull(),
189
+ closedAt: integer("closed_at"),
190
+ closeReason: text("close_reason"),
191
+ sourceSession: text("source_session").notNull(),
192
+ extractionPath: text("extraction_path").notNull()
193
+ }, (table) => [primaryKey({ columns: [table.projectId, table.activeTaskId] })]);
194
+ const nodixTodoMigrationReceipts = sqliteTable("nodix_todo_migration_receipts", {
195
+ migrationId: text("migration_id").primaryKey(),
196
+ beforeCount: integer("before_count").notNull(),
197
+ afterCount: integer("after_count").notNull(),
198
+ migratedAt: integer("migrated_at").notNull()
199
+ });
200
+ const nodixMemoryEntities = sqliteTable("nodix_memory_entities", {
201
+ projectId: text("project_id").notNull(),
202
+ entityId: text("entity_id").notNull(),
203
+ displayName: text("display_name").notNull(),
204
+ normalizedName: text("normalized_name").notNull(),
205
+ createdAt: integer("created_at").notNull()
206
+ }, (table) => [
207
+ primaryKey({ columns: [table.projectId, table.normalizedName] }),
208
+ index("nodix_idx_memory_entities_display_name").on(table.projectId, table.displayName),
209
+ index("nodix_idx_memory_entities_entity_id").on(table.projectId, table.entityId)
210
+ ]);
211
+ const nodixAtomicExtractionLedger = sqliteTable("nodix_atomic_extraction_ledger", {
212
+ conversationId: text("conversation_id").notNull(),
213
+ chunkHash: text("chunk_hash").notNull(),
214
+ pipelineVersion: text("pipeline_version").notNull(),
215
+ state: text("state", { enum: [
216
+ "open",
217
+ "calls_recorded",
218
+ "complete",
219
+ "pending_reprocess"
220
+ ] }).notNull(),
221
+ rawChunk: text("raw_chunk").notNull(),
222
+ routingSnapshotId: text("routing_snapshot_id").notNull(),
223
+ runParametersJson: text("run_parameters_json").notNull(),
224
+ reprocessReason: text("reprocess_reason", { enum: [
225
+ "input-overflow",
226
+ "truncation-exhaustion",
227
+ "parse-exhaustion"
228
+ ] }),
229
+ reprocessAttemptCount: integer("reprocess_attempt_count").notNull().default(0),
230
+ failedReply: text("failed_reply"),
231
+ createdAt: integer("created_at").notNull(),
232
+ updatedAt: integer("updated_at").notNull()
233
+ }, (table) => [primaryKey({ columns: [
234
+ table.conversationId,
235
+ table.chunkHash,
236
+ table.pipelineVersion
237
+ ] })]);
238
+ const nodixProviderProjectMappings = sqliteTable("nodix_provider_project_mappings", {
239
+ userId: text("user_id").notNull(),
240
+ externalSystem: text("external_system").notNull(),
241
+ externalProjectKey: text("external_project_key").notNull(),
242
+ projectId: text("project_id").notNull().unique(),
243
+ createdAtMs: integer("created_at_ms").notNull()
244
+ });
245
+ const nodixProviderAgentMappings = sqliteTable("nodix_provider_agent_mappings", {
246
+ userId: text("user_id").notNull(),
247
+ externalSystem: text("external_system").notNull(),
248
+ externalAgentKey: text("external_agent_key").notNull(),
249
+ agentId: text("agent_id").notNull().unique(),
250
+ createdAtMs: integer("created_at_ms").notNull()
251
+ });
252
+ const nodixProviderProjectAgents = sqliteTable("nodix_provider_project_agents", {
253
+ userId: text("user_id").notNull(),
254
+ projectId: text("project_id").notNull(),
255
+ agentId: text("agent_id").notNull(),
256
+ createdAtMs: integer("created_at_ms").notNull()
257
+ });
258
+ const memoryEvents = sqliteTable("nodix_memory_events", {
259
+ id: integer("id").primaryKey({ autoIncrement: true }),
260
+ eventType: text("event_type").notNull(),
261
+ factId: text("fact_id"),
262
+ memoryKind: text("memory_kind"),
263
+ timestampMs: integer("timestamp_ms").notNull(),
264
+ sessionUuid: text("session_uuid"),
265
+ turnId: text("turn_id"),
266
+ agentId: text("agent_id").notNull(),
267
+ projectId: text("project_id"),
268
+ tenantId: text("tenant_id"),
269
+ sourceEventId: integer("source_event_id"),
270
+ derivedFrom: text("derived_from"),
271
+ consolidationEpochId: text("consolidation_epoch_id"),
272
+ contentHash: text("content_hash"),
273
+ receiptHmac: text("receipt_hmac"),
274
+ keyVersion: integer("key_version"),
275
+ retrievalRank: integer("retrieval_rank"),
276
+ retrievalScore: real("retrieval_score"),
277
+ queryTenantId: text("query_tenant_id"),
278
+ resultTenantId: text("result_tenant_id"),
279
+ metadataJson: text("metadata_json")
280
+ });
281
+ const memoryUsageOutbox = sqliteTable("nodix_memory_usage_outbox", {
282
+ id: integer("id").primaryKey({ autoIncrement: true }),
283
+ eventType: text("event_type").notNull(),
284
+ payloadJson: text("payload_json").notNull(),
285
+ acceptedAtMs: integer("accepted_at_ms").notNull(),
286
+ status: text("status").notNull(),
287
+ attemptCount: integer("attempt_count").notNull().default(0),
288
+ lastError: text("last_error"),
289
+ nextAttemptMs: integer("next_attempt_ms")
290
+ });
291
+ const memoryTelemetryIncidents = sqliteTable("nodix_memory_telemetry_incidents", {
292
+ id: integer("id").primaryKey({ autoIncrement: true }),
293
+ incidentType: text("incident_type").notNull(),
294
+ severity: text("severity").notNull(),
295
+ message: text("message").notNull(),
296
+ payloadJson: text("payload_json"),
297
+ createdAtMs: integer("created_at_ms").notNull()
298
+ });
299
+ const memoryTelemetrySyncState = sqliteTable("nodix_memory_telemetry_sync_state", {
300
+ sink: text("sink").primaryKey(),
301
+ lastEventId: integer("last_event_id").notNull().default(0),
302
+ updatedAtMs: integer("updated_at_ms").notNull()
303
+ });
304
+ /**
305
+ * Write attempts the extraction path could not place. A rejected candidate is
306
+ * preserved here with the raw model output that produced it, so a failed write
307
+ * costs retrievability and never the content. Rows here are NOT memories: no
308
+ * retrieval path reads this table.
309
+ */
310
+ const nodixUnplacedMemoryCandidates = sqliteTable("nodix_unplaced_memory_candidates", {
311
+ id: text("id").primaryKey(),
312
+ projectId: text("project_id").notNull(),
313
+ category: text("category").notNull(),
314
+ text: text("text").notNull(),
315
+ rawCandidateJson: text("raw_candidate_json").notNull(),
316
+ dispositionReason: text("disposition_reason").notNull(),
317
+ dispositionedAtMs: integer("dispositioned_at_ms").notNull(),
318
+ sessionKey: text("session_key"),
319
+ dedupeHash: text("dedupe_hash").notNull()
320
+ });
321
+ const nodixProfileRecoveryEntries = sqliteTable("nodix_profile_recovery_entries", {
322
+ entryId: text("entry_id").primaryKey(),
323
+ mutationAttemptId: text("mutation_attempt_id").notNull(),
324
+ removedRowId: text("removed_row_id").notNull().references(() => nodixMemories.id, { onDelete: "cascade" }),
325
+ projectId: text("project_id").notNull(),
326
+ profileFactId: text("profile_fact_id").notNull(),
327
+ sectionName: text("section_name").notNull(),
328
+ removedValue: text("removed_value").notNull(),
329
+ removedAtMs: integer("removed_at_ms").notNull()
330
+ });
331
+ //#endregion
332
+ //#region src/store/legacy-database-namespace-migration.ts
333
+ const TABLE_RENAMES = [
334
+ {
335
+ legacy: FIXED_MEMORY_MEMORIES,
336
+ current: "nodix_memories"
337
+ },
338
+ {
339
+ legacy: FIXED_MEMORY_CHUNKS,
340
+ current: "nodix_memory_chunks"
341
+ },
342
+ {
343
+ legacy: FIXED_MEMORY_EXTRACTION_TIMESTAMPS,
344
+ current: "nodix_memory_extraction_timestamps"
345
+ },
346
+ {
347
+ legacy: FIXED_MEMORY_PROVIDER_PROJECT_MAPPINGS,
348
+ current: "nodix_provider_project_mappings"
349
+ },
350
+ {
351
+ legacy: FIXED_MEMORY_PROVIDER_AGENT_MAPPINGS,
352
+ current: "nodix_provider_agent_mappings"
353
+ },
354
+ {
355
+ legacy: FIXED_MEMORY_PROVIDER_PROJECT_AGENTS,
356
+ current: "nodix_provider_project_agents"
357
+ },
358
+ {
359
+ legacy: FIXED_MEMORY_TASK_LIFECYCLE_COMMANDS,
360
+ current: "nodix_task_lifecycle_commands"
361
+ },
362
+ {
363
+ legacy: FIXED_MEMORY_ACTIVE_TASK_INSTANCES,
364
+ current: "nodix_active_task_instances"
365
+ },
366
+ {
367
+ legacy: FIXED_MEMORY_ACTIVE_TASK_REVISIONS,
368
+ current: "nodix_active_task_revisions"
369
+ },
370
+ {
371
+ legacy: FIXED_MEMORY_ACTIVE_TASK_TRANSITIONS,
372
+ current: "nodix_active_task_transitions"
373
+ },
374
+ {
375
+ legacy: FIXED_MEMORY_ACTIVE_TASK_EVIDENCE,
376
+ current: "nodix_active_task_evidence"
377
+ },
378
+ {
379
+ legacy: FIXED_MEMORY_ACTIVE_TASK_MIGRATION_EVIDENCE,
380
+ current: "nodix_active_task_migration_evidence"
381
+ },
382
+ {
383
+ legacy: FIXED_MEMORY_ACTIVE_TASK_MIGRATION_MANIFESTS,
384
+ current: "nodix_active_task_migration_manifests"
385
+ },
386
+ {
387
+ legacy: FIXED_MEMORY_UNPLACED_CANDIDATES,
388
+ current: "nodix_unplaced_memory_candidates"
389
+ },
390
+ {
391
+ legacy: FIXED_MEMORY_PROFILE_RECOVERY_ENTRIES,
392
+ current: "nodix_profile_recovery_entries"
393
+ },
394
+ {
395
+ legacy: FIXED_MEMORY_MIGRATION_MARKERS,
396
+ current: "nodix_memory_migration_markers"
397
+ },
398
+ {
399
+ legacy: "memory_events",
400
+ current: "nodix_memory_events"
401
+ },
402
+ {
403
+ legacy: "memory_usage_outbox",
404
+ current: "nodix_memory_usage_outbox"
405
+ },
406
+ {
407
+ legacy: "memory_telemetry_incidents",
408
+ current: "nodix_memory_telemetry_incidents"
409
+ },
410
+ {
411
+ legacy: "memory_telemetry_sync_state",
412
+ current: "nodix_memory_telemetry_sync_state"
413
+ },
414
+ {
415
+ legacy: "rem_relation_ledger",
416
+ current: "nodix_rem_relation_ledger"
417
+ },
418
+ {
419
+ legacy: "rem_row_claims",
420
+ current: "nodix_rem_row_claims"
421
+ },
422
+ {
423
+ legacy: "rem_scan_generations",
424
+ current: "nodix_rem_scan_generations"
425
+ },
426
+ {
427
+ legacy: "rem_scan_pairs",
428
+ current: "nodix_rem_scan_pairs"
429
+ },
430
+ {
431
+ legacy: "rem_scan_invocations",
432
+ current: "nodix_rem_scan_invocations"
433
+ },
434
+ {
435
+ legacy: "rem_pair_stage_budgets",
436
+ current: "nodix_rem_pair_stage_budgets"
437
+ },
438
+ {
439
+ legacy: "rem_pair_claims",
440
+ current: "nodix_rem_pair_claims"
441
+ },
442
+ {
443
+ legacy: "rem_journal",
444
+ current: "nodix_rem_journal"
445
+ },
446
+ {
447
+ legacy: "rem_recovery_history",
448
+ current: "nodix_rem_recovery_history"
449
+ },
450
+ {
451
+ legacy: "rem_memory_facets",
452
+ current: "nodix_rem_memory_facets"
453
+ },
454
+ {
455
+ legacy: "rem_facet_recovery",
456
+ current: "nodix_rem_facet_recovery"
457
+ },
458
+ {
459
+ legacy: "rem_write_verdicts",
460
+ current: "nodix_rem_write_verdicts"
461
+ },
462
+ {
463
+ legacy: "rem_write_attempts",
464
+ current: "nodix_rem_write_attempts"
465
+ },
466
+ {
467
+ legacy: "rem_census_rows",
468
+ current: "nodix_rem_census_rows"
469
+ },
470
+ {
471
+ legacy: "rem_generation_transitions",
472
+ current: "nodix_rem_generation_transitions"
473
+ },
474
+ {
475
+ legacy: "rem_batch_summaries",
476
+ current: "nodix_rem_batch_summaries"
477
+ },
478
+ {
479
+ legacy: "rem_verdict_observations",
480
+ current: "nodix_rem_verdict_observations"
481
+ }
482
+ ];
483
+ const INDEX_RENAMES = [
484
+ {
485
+ legacy: FIXED_IDX_MEMORY_MEMORIES_PROJECT_CONTENT_HASH,
486
+ current: "nodix_idx_memories_project_content_hash"
487
+ },
488
+ {
489
+ legacy: FIXED_IDX_MEMORY_MEMORIES_PROJECT,
490
+ current: "nodix_idx_memories_project"
491
+ },
492
+ {
493
+ legacy: FIXED_IDX_MEMORY_MEMORIES_CATEGORY,
494
+ current: "nodix_idx_memories_category"
495
+ },
496
+ {
497
+ legacy: FIXED_IDX_MEMORY_MEMORIES_PROJECT_TIMESTAMP,
498
+ current: "nodix_idx_memories_project_timestamp"
499
+ },
500
+ {
501
+ legacy: FIXED_IDX_MEMORY_MEMORIES_CONTENT_HASH,
502
+ current: "nodix_idx_memories_content_hash"
503
+ },
504
+ {
505
+ legacy: FIXED_IDX_MEMORY_MEMORIES_FACT_ID,
506
+ current: "nodix_idx_memories_fact_id"
507
+ },
508
+ {
509
+ legacy: "idx_mcm_reflection_items",
510
+ current: "nodix_idx_memories_reflection_items"
511
+ },
512
+ {
513
+ legacy: "idx_mcm_idempotency_key",
514
+ current: "nodix_idx_memories_idempotency_key"
515
+ },
516
+ {
517
+ legacy: FIXED_IDX_MEMORY_MEMORIES_LANE_PROJECT,
518
+ current: "nodix_idx_memories_lane_project"
519
+ },
520
+ {
521
+ legacy: FIXED_IDX_MEMORY_MEMORIES_PROJECT_FACT_KEY_ACTIVE,
522
+ current: "nodix_idx_memories_project_fact_key_active"
523
+ },
524
+ {
525
+ legacy: FIXED_MEMORY_CHUNKS_MEM_IDX,
526
+ current: "nodix_idx_memory_chunks_memory"
527
+ },
528
+ {
529
+ legacy: FIXED_MEMORY_CHUNKS_MEMORY_ID_IDX,
530
+ current: "nodix_idx_memory_chunks_memory_id"
531
+ },
532
+ {
533
+ legacy: FIXED_MEMORY_CHUNKS_MEM_FACET_IDX,
534
+ current: "nodix_idx_memory_chunks_memory_facet"
535
+ },
536
+ {
537
+ legacy: FIXED_IDX_MEMORY_ACTIVE_TASK_CURRENT_REVISION,
538
+ current: "nodix_idx_active_task_current_revision"
539
+ },
540
+ {
541
+ legacy: FIXED_IDX_MEMORY_ACTIVE_TASK_INSTANCES_PROJECTION,
542
+ current: "nodix_idx_active_task_instances_projection"
543
+ },
544
+ {
545
+ legacy: FIXED_IDX_MEMORY_ACTIVE_TASK_EVIDENCE_INSTANCE,
546
+ current: "nodix_idx_active_task_evidence_instance"
547
+ },
548
+ {
549
+ legacy: "idx_unplaced_project_reason",
550
+ current: "nodix_idx_unplaced_project_reason"
551
+ },
552
+ {
553
+ legacy: "idx_unplaced_dedupe",
554
+ current: "nodix_idx_unplaced_dedupe"
555
+ },
556
+ {
557
+ legacy: "idx_profile_recovery_lineage",
558
+ current: "nodix_idx_profile_recovery_lineage"
559
+ },
560
+ {
561
+ legacy: "idx_profile_recovery_attempt",
562
+ current: "nodix_idx_profile_recovery_attempt"
563
+ },
564
+ {
565
+ legacy: "idx_me_fact",
566
+ current: "nodix_idx_memory_events_fact"
567
+ },
568
+ {
569
+ legacy: "idx_me_type",
570
+ current: "nodix_idx_memory_events_type"
571
+ },
572
+ {
573
+ legacy: "idx_me_epoch",
574
+ current: "nodix_idx_memory_events_epoch"
575
+ },
576
+ {
577
+ legacy: "idx_me_session",
578
+ current: "nodix_idx_memory_events_session"
579
+ },
580
+ {
581
+ legacy: "idx_me_tenant",
582
+ current: "nodix_idx_memory_events_tenant"
583
+ },
584
+ {
585
+ legacy: "idx_me_kind",
586
+ current: "nodix_idx_memory_events_kind"
587
+ },
588
+ {
589
+ legacy: "idx_me_project",
590
+ current: "nodix_idx_memory_events_project"
591
+ },
592
+ {
593
+ legacy: "idx_me_turn",
594
+ current: "nodix_idx_memory_events_turn"
595
+ },
596
+ {
597
+ legacy: "idx_me_usage_retention",
598
+ current: "nodix_idx_memory_events_usage_retention"
599
+ },
600
+ {
601
+ legacy: "idx_muo_status_next",
602
+ current: "nodix_idx_memory_usage_outbox_status_next"
603
+ },
604
+ {
605
+ legacy: "idx_mti_created",
606
+ current: "nodix_idx_memory_telemetry_incidents_created"
607
+ }
608
+ ];
609
+ const LEGACY_TRIGGER_NAMES = [
610
+ FIXED_MEMORY_CHUNKS_AI,
611
+ FIXED_MEMORY_CHUNKS_AD,
612
+ FIXED_MEMORY_CHUNKS_AU,
613
+ FIXED_MEMORY_MEMORIES_FACT_ID_INSERT_GUARD,
614
+ FIXED_MEMORY_MEMORIES_FACT_ID_UPDATE_GUARD
615
+ ];
616
+ const LEGACY_MEMORY_GUARD_TRIGGER_NAMES = [FIXED_MEMORY_MEMORIES_FACT_ID_INSERT_GUARD, FIXED_MEMORY_MEMORIES_FACT_ID_UPDATE_GUARD];
617
+ const KNOWN_LEGACY_OBJECT_NAMES = /* @__PURE__ */ new Set([
618
+ ...TABLE_RENAMES.map(({ legacy }) => legacy),
619
+ ...INDEX_RENAMES.map(({ legacy }) => legacy),
620
+ ...LEGACY_TRIGGER_NAMES,
621
+ FIXED_VEC_MEMORY_CHUNKS
622
+ ]);
623
+ const LEGACY_OBJECT_PREFIXES = [
624
+ FIXED_MEMORY,
625
+ FIXED_VEC_MEMORY,
626
+ FIXED_IDX_MEMORY
627
+ ];
628
+ function migrateLegacyDatabaseNamespace(database, configuredVectorDim) {
629
+ const hasLegacySchema = tableExists(database, FIXED_MEMORY_MEMORIES);
630
+ const hasCurrentSchema = tableExists(database, "nodix_memories");
631
+ if (hasLegacySchema && hasCurrentSchema) throw new Error(FIXED_EXTERNAL_VALUE_49);
632
+ if (!hasLegacySchema) {
633
+ assertLegacyObjectsRemoved(database);
634
+ return hasCurrentSchema ? "current" : "empty";
635
+ }
636
+ assertLegacyBoundarySupported(database);
637
+ if (configuredVectorDim !== void 0) assertLegacyVectorDimensionSupported(database, configuredVectorDim);
638
+ const hadLegacyChunkSearch = tableExists(database, FIXED_MEMORY_CHUNKS_FTS);
639
+ const hadLegacyMemoryGuards = LEGACY_MEMORY_GUARD_TRIGGER_NAMES.some((name) => readSchemaSql(database, "trigger", name) !== void 0);
640
+ database.transaction(() => {
641
+ const rowCounts = readLegacyRowCounts(database);
642
+ const vectorCount = readTableRowCount(database, FIXED_VEC_MEMORY_CHUNKS);
643
+ dropLegacyTriggers(database);
644
+ dropLegacyFts(database);
645
+ renameTables(database);
646
+ migrateLegacyVectors(database);
647
+ renameIndexes(database);
648
+ if (hadLegacyChunkSearch) {
649
+ createCurrentFts(database);
650
+ createChunkTriggers(database);
651
+ }
652
+ if (hadLegacyMemoryGuards) createMemoryGuardTriggers(database);
653
+ assertRowCounts(database, rowCounts);
654
+ assertTableRowCount(database, "nodix_memory_chunk_vectors", vectorCount);
655
+ assertLegacyObjectsRemoved(database);
656
+ }).immediate();
657
+ return "migrated";
658
+ }
659
+ function assertLegacyBoundarySupported(database) {
660
+ const rows = database.prepare(FIXED_EXTERNAL_VALUE_51).all();
661
+ const columnNames = new Set(rows.map(({ name }) => name).filter((name) => !!name));
662
+ const legacyBoundaryColumn = [
663
+ "s",
664
+ "c",
665
+ "o",
666
+ "p",
667
+ "e"
668
+ ].join("");
669
+ if (columnNames.has(legacyBoundaryColumn) && !columnNames.has("project_id")) throw new Error("legacy boundary schema is unsupported for provider v1");
670
+ }
671
+ function assertLegacyVectorDimensionSupported(database, configuredVectorDim) {
672
+ const legacySql = readSchemaSql(database, "table", FIXED_VEC_MEMORY_CHUNKS);
673
+ if (legacySql === void 0) return;
674
+ const dimensionToken = legacySql.match(/embedding\s+float\[(\d+)\]/i)?.[1];
675
+ if (dimensionToken === void 0) throw new Error(FIXED_EXTERNAL_VALUE_52);
676
+ const dimension = Number.parseInt(dimensionToken, 10);
677
+ if ((readTableRowCount(database, "vec_mem_claw_chunks") ?? 0) > 0 && dimension !== configuredVectorDim) throw new Error(`${FIXED_EXTERNAL_VALUE_53}${configuredVectorDim}, found dim ${dimension}); database left unchanged; wipe or re-import vectors before continuing`);
678
+ }
679
+ function readLegacyRowCounts(database) {
680
+ const counts = /* @__PURE__ */ new Map();
681
+ for (const { legacy, current } of TABLE_RENAMES) {
682
+ if (!tableExists(database, legacy)) continue;
683
+ const row = database.prepare(`SELECT COUNT(*) AS count FROM ${quoteIdentifier(legacy)}`).get();
684
+ counts.set(current, Number(row.count));
685
+ }
686
+ return counts;
687
+ }
688
+ function readTableRowCount(database, tableName) {
689
+ if (!tableExists(database, tableName)) return void 0;
690
+ const row = database.prepare(`SELECT COUNT(*) AS count FROM ${quoteIdentifier(tableName)}`).get();
691
+ return Number(row.count);
692
+ }
693
+ function dropLegacyTriggers(database) {
694
+ for (const name of LEGACY_TRIGGER_NAMES) database.exec(`DROP TRIGGER IF EXISTS ${quoteIdentifier(name)}`);
695
+ }
696
+ function dropLegacyFts(database) {
697
+ if (tableExists(database, "mem_claw_chunks_fts")) database.exec(FIXED_EXTERNAL_VALUE_54);
698
+ }
699
+ function renameTables(database) {
700
+ for (const { legacy, current } of TABLE_RENAMES) {
701
+ const legacyExists = tableExists(database, legacy);
702
+ const currentExists = tableExists(database, current);
703
+ if (legacyExists && currentExists) throw new Error(`database contains both ${legacy} and ${current}`);
704
+ if (legacyExists) database.exec(`ALTER TABLE ${quoteIdentifier(legacy)} RENAME TO ${quoteIdentifier(current)}`);
705
+ }
706
+ }
707
+ function migrateLegacyVectors(database) {
708
+ const legacySql = readSchemaSql(database, "table", FIXED_VEC_MEMORY_CHUNKS);
709
+ if (legacySql === void 0) return;
710
+ if (tableExists(database, "nodix_memory_chunk_vectors")) throw new Error(FIXED_EXTERNAL_VALUE_55);
711
+ const dimension = legacySql.match(/embedding\s+float\[(\d+)\]/i)?.[1];
712
+ if (dimension === void 0) throw new Error(FIXED_EXTERNAL_VALUE_52);
713
+ const copyVectors = /partition\s+key/i.test(legacySql) ? FIXED_EXTERNAL_VALUE_56 : `${FIXED_EXTERNAL_VALUE_57}`;
714
+ database.exec(`
715
+ CREATE VIRTUAL TABLE nodix_memory_chunk_vectors USING vec0(
716
+ id TEXT PRIMARY KEY,
717
+ project_id TEXT PARTITION KEY,
718
+ embedding float[${dimension}]
719
+ );
720
+ ${copyVectors}${FIXED_EXTERNAL_VALUE_58}`);
721
+ }
722
+ function renameIndexes(database) {
723
+ for (const { legacy, current } of INDEX_RENAMES) {
724
+ const legacySql = readSchemaSql(database, "index", legacy);
725
+ if (legacySql === void 0) continue;
726
+ if (readSchemaSql(database, "index", current) !== void 0) throw new Error(`database contains both index ${legacy} and ${current}`);
727
+ const onClause = legacySql.match(/\sON\s[\s\S]+$/i)?.[0];
728
+ if (onClause === void 0) throw new Error(`cannot parse index definition for ${legacy}`);
729
+ const unique = /^CREATE\s+UNIQUE\s+INDEX/i.test(legacySql) ? "UNIQUE " : "";
730
+ database.exec(`CREATE ${unique}INDEX ${quoteIdentifier(current)}${onClause}`);
731
+ database.exec(`DROP INDEX ${quoteIdentifier(legacy)}`);
732
+ }
733
+ }
734
+ function createCurrentFts(database) {
735
+ if (!tableExists(database, "nodix_memory_chunks")) return;
736
+ database.exec(`
737
+ CREATE VIRTUAL TABLE nodix_memory_chunks_fts USING fts5(
738
+ dense_payload,
739
+ content='nodix_memory_chunks',
740
+ content_rowid='rowid',
741
+ tokenize='simple 0'
742
+ );
743
+ INSERT INTO nodix_memory_chunks_fts(nodix_memory_chunks_fts) VALUES('rebuild');
744
+ `);
745
+ }
746
+ function createChunkTriggers(database) {
747
+ database.exec(`
748
+ CREATE TRIGGER nodix_memory_chunks_ai AFTER INSERT ON nodix_memory_chunks BEGIN
749
+ INSERT INTO nodix_memory_chunks_fts(rowid, dense_payload)
750
+ VALUES (new.rowid, new.dense_payload);
751
+ END;
752
+ CREATE TRIGGER nodix_memory_chunks_ad AFTER DELETE ON nodix_memory_chunks BEGIN
753
+ INSERT INTO nodix_memory_chunks_fts(nodix_memory_chunks_fts, rowid, dense_payload)
754
+ VALUES ('delete', old.rowid, old.dense_payload);
755
+ END;
756
+ CREATE TRIGGER nodix_memory_chunks_au AFTER UPDATE ON nodix_memory_chunks BEGIN
757
+ INSERT INTO nodix_memory_chunks_fts(nodix_memory_chunks_fts, rowid, dense_payload)
758
+ VALUES ('delete', old.rowid, old.dense_payload);
759
+ INSERT INTO nodix_memory_chunks_fts(rowid, dense_payload)
760
+ VALUES (new.rowid, new.dense_payload);
761
+ END;
762
+ `);
763
+ }
764
+ function createMemoryGuardTriggers(database) {
765
+ database.exec(`
766
+ CREATE TRIGGER nodix_memories_fact_id_insert_guard
767
+ BEFORE INSERT ON nodix_memories WHEN NEW.fact_id IS NULL
768
+ BEGIN SELECT RAISE(ABORT, 'nodix_memories.fact_id is required'); END;
769
+ CREATE TRIGGER nodix_memories_fact_id_update_guard
770
+ BEFORE UPDATE ON nodix_memories WHEN NEW.fact_id IS NULL
771
+ BEGIN SELECT RAISE(ABORT, 'nodix_memories.fact_id is required'); END;
772
+ `);
773
+ }
774
+ function assertRowCounts(database, expected) {
775
+ for (const [tableName, expectedCount] of expected) {
776
+ const row = database.prepare(`SELECT COUNT(*) AS count FROM ${quoteIdentifier(tableName)}`).get();
777
+ if (Number(row.count) !== expectedCount) throw new Error(`row count changed for ${tableName}: ${expectedCount} -> ${String(row.count)}`);
778
+ }
779
+ }
780
+ function assertTableRowCount(database, tableName, expectedCount) {
781
+ if (expectedCount === void 0) return;
782
+ const actualCount = readTableRowCount(database, tableName);
783
+ if (actualCount !== expectedCount) throw new Error(`row count changed for ${tableName}: ${expectedCount} -> ${String(actualCount)}`);
784
+ }
785
+ function assertLegacyObjectsRemoved(database) {
786
+ const legacyNames = database.prepare("SELECT name FROM sqlite_master WHERE name NOT LIKE 'sqlite_%' ORDER BY name").all().map(({ name }) => name).filter((name) => name !== void 0 && (KNOWN_LEGACY_OBJECT_NAMES.has(name) || LEGACY_OBJECT_PREFIXES.some((prefix) => name.startsWith(prefix))));
787
+ if (legacyNames.length > 0) throw new Error(`legacy database objects remain: ${legacyNames.join(", ")}`);
788
+ }
789
+ function tableExists(database, name) {
790
+ return readSchemaSql(database, "table", name) !== void 0;
791
+ }
792
+ function readSchemaSql(database, type, name) {
793
+ return database.prepare("SELECT sql FROM sqlite_master WHERE type = ? AND name = ?").get(type, name)?.sql ?? void 0;
794
+ }
795
+ function quoteIdentifier(identifier) {
796
+ return `"${identifier.replaceAll("\"", "\"\"")}"`;
797
+ }
798
+ //#endregion
799
+ //#region src/store/simple-tokenizer-path.ts
800
+ /** @file simple-tokenizer-path.ts
801
+ * @purpose Resolve the bundled `simple-tokenizer` SQLite extension binary +
802
+ * jieba dictionary path for the current platform.
803
+ * @boundary Path resolution only; loading happens in `connection.ts`.
804
+ *
805
+ * Layout produced by `scripts/download-simple-tokenizer.ts`:
806
+ *
807
+ * <plugin>/sqlite-extensions/<platform>/libsimple.{so,dylib}
808
+ * <plugin>/sqlite-extensions/<platform>/dict/...
809
+ *
810
+ * `<platform>` is one of: `linux-x64`, `linux-arm64`, `darwin-arm64`,
811
+ * `darwin-x64`. Other platforms throw a typed error so deploys fail fast
812
+ * instead of silently falling back to the unicode61 tokenizer.
813
+ *
814
+ * Both source-tree (`src/storage/simple-tokenizer-path.ts`) and bundled
815
+ * (`lib/index.js`) call sites must resolve correctly. The bundled output lives
816
+ * at `<plugin>/lib/index.js`, so the candidates list probes both
817
+ * relative locations — same pattern as `MIGRATIONS_DIR` in `connection.ts`.
818
+ */
819
+ const HERE$1 = dirname(fileURLToPath(import.meta.url));
820
+ const PLATFORM_KEY$1 = `${platform()}-${arch()}`;
821
+ const PLATFORM_BINARY = {
822
+ "linux-x64": "libsimple.so",
823
+ "linux-arm64": "libsimple.so",
824
+ "darwin-arm64": "libsimple.dylib",
825
+ "darwin-x64": "libsimple.dylib"
826
+ };
827
+ /**
828
+ * Resolve the on-disk paths the loader should pass to
829
+ * `db.loadExtension(...)` and `SELECT jieba_dict(...)`. Returns an absolute
830
+ * path under the plugin's `sqlite-extensions/<platform>/` directory.
831
+ *
832
+ * Throws if the platform is unsupported or the binary directory is missing
833
+ * (postinstall didn't run, rsync excluded the directory, etc.). The error
834
+ * names what to install/fetch so a fresh dev box doesn't need archaeology.
835
+ */
836
+ function resolveSimpleTokenizerPath() {
837
+ const binary = PLATFORM_BINARY[PLATFORM_KEY$1];
838
+ if (!binary) throw new Error(`simple-tokenizer: unsupported platform "${PLATFORM_KEY$1}". Supported: ${Object.keys(PLATFORM_BINARY).join(", ")}. Build from upstream wangfenjin/simple if you need another target.`);
839
+ const candidates = [
840
+ join(HERE$1, "..", "..", "sqlite-extensions", PLATFORM_KEY$1),
841
+ join(HERE$1, "..", "sqlite-extensions", PLATFORM_KEY$1),
842
+ join(HERE$1, "..", "..", "..", "sqlite-extensions", PLATFORM_KEY$1)
843
+ ];
844
+ for (const root of candidates) {
845
+ const extensionPath = resolve(root, binary);
846
+ const dictPath = resolve(root, "dict");
847
+ if (existsSync(extensionPath) && existsSync(dictPath)) return {
848
+ platform: PLATFORM_KEY$1,
849
+ extensionPath,
850
+ dictPath
851
+ };
852
+ }
853
+ throw new Error(`simple-tokenizer binary missing for ${PLATFORM_KEY$1}. Looked under: ${candidates.join(", ")}. Run \`node scripts/download-simple-tokenizer.mjs\` from the plugin directory, or rsync the \`sqlite-extensions/\` folder onto this host.`);
854
+ }
855
+ //#endregion
856
+ //#region src/store/sqlite-vec-path.ts
857
+ /** @file sqlite-vec-path.ts
858
+ * @purpose Resolves and loads the symbol-isolated sqlite-vec extension shipped with sno-station-mem.
859
+ * @boundary Path selection only; Linux x64 and arm64 must use the bundled binary.
860
+ */
861
+ const HERE = dirname(fileURLToPath(import.meta.url));
862
+ const PLATFORM_KEY = `${platform$1}-${arch$1}`;
863
+ const BUNDLED_PLATFORMS = /* @__PURE__ */ new Set(["linux-x64", "linux-arm64"]);
864
+ function resolveSqliteVecPath() {
865
+ if (!BUNDLED_PLATFORMS.has(PLATFORM_KEY)) return resolve(getLoadablePath());
866
+ const candidates = [
867
+ join(HERE, "..", "..", "sqlite-extensions", PLATFORM_KEY, "vec0.so"),
868
+ join(HERE, "..", "sqlite-extensions", PLATFORM_KEY, "vec0.so"),
869
+ join(HERE, "..", "..", "..", "sqlite-extensions", PLATFORM_KEY, "vec0.so")
870
+ ];
871
+ for (const candidate of candidates) {
872
+ const extensionPath = resolve(candidate);
873
+ if (existsSync(extensionPath)) return extensionPath;
874
+ }
875
+ throw new Error(`Symbol-isolated sqlite-vec binary missing for ${PLATFORM_KEY}. Looked under: ${candidates.join(", ")}. Run scripts/build-sqlite-vec.sh from the plugin directory.`);
876
+ }
877
+ function loadSqliteVecExtension(database) {
878
+ database.loadExtension(resolveSqliteVecPath());
879
+ }
880
+ //#endregion
881
+ //#region src/store/unplaced-candidate-migration.ts
882
+ /** @file unplaced-candidate-migration.ts
883
+ * @purpose One-time data move: relocate every non-active memory row into
884
+ * `nodix_unplaced_memory_candidates`. Runs after the drizzle DDL migration and is
885
+ * idempotent, so an interrupted move simply completes on the next boot.
886
+ * @boundary Reads and writes only those two tables through the caller's handle.
887
+ */
888
+ const log = createLogger("unplaced-candidate-migration");
889
+ /**
890
+ * Legacy rows are keyed on their own row id, not on the live writer's basis.
891
+ * Two legacy rows can carry byte-identical payloads and reasons and still be
892
+ * distinct occurrences, and many of them have no session key to tell apart — so
893
+ * the only identity that provably cannot collapse two of them is the id they
894
+ * already have. The cost is that a migrated failure and a later identical live
895
+ * failure both persist; that is a duplicate, and duplicates are the safe
896
+ * direction.
897
+ */
898
+ function legacyDedupeHash(legacyRowId) {
899
+ return stableHash(JSON.stringify([PERSISTED_CANDIDATE_HASH_V1, legacyRowId]));
900
+ }
901
+ /**
902
+ * Relocate non-active rows. The no-loss property is structural rather than
903
+ * asserted: a row is deleted only after its own insert has succeeded inside the
904
+ * same transaction, so it can never be removed without having been copied, and
905
+ * any failure rolls the whole move back. A row missing the fields a replay needs
906
+ * aborts the move rather than being moved lossily or deleted.
907
+ */
908
+ function migrateUnplacedCandidates(sqlite) {
909
+ const rows = sqlite.prepare("SELECT id, project_id AS projectId, category, text, raw_candidate_json AS rawCandidateJson, disposition_reason AS dispositionReason, dispositioned_at_ms AS dispositionedAtMs, json_extract(metadata, '$.source_session') AS sessionKey FROM nodix_memories WHERE lane <> 'active'").all();
910
+ if (rows.length === 0) return 0;
911
+ const incomplete = rows.filter((row) => !row.rawCandidateJson || !row.dispositionReason || row.dispositionedAtMs === null || !Number.isFinite(row.dispositionedAtMs));
912
+ if (incomplete.length > 0) throw new Error(`unplaced-candidate migration aborted: ${incomplete.length} non-active row(s) lack the fields a replay needs; ids: ${incomplete.slice(0, 5).map((row) => row.id).join(", ")}`);
913
+ const insert = sqlite.prepare("INSERT OR IGNORE INTO nodix_unplaced_memory_candidates (id, project_id, category, text, raw_candidate_json, disposition_reason, dispositioned_at_ms, session_key, dedupe_hash) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)");
914
+ const exists = sqlite.prepare("SELECT 1 AS present FROM nodix_unplaced_memory_candidates WHERE project_id = ? AND dedupe_hash = ? LIMIT 1");
915
+ const removeChunks = sqlite.prepare("DELETE FROM nodix_memory_chunks WHERE memory_id = ?");
916
+ const remove = sqlite.prepare("DELETE FROM nodix_memories WHERE id = ?");
917
+ const moved = sqlite.transaction(() => {
918
+ let moved = 0;
919
+ for (const row of rows) {
920
+ const reason = String(row.dispositionReason);
921
+ const raw = String(row.rawCandidateJson);
922
+ const hash = legacyDedupeHash(row.id);
923
+ insert.run(randomUUID(), row.projectId, row.category, row.text, raw, reason, Number(row.dispositionedAtMs), row.sessionKey, hash);
924
+ if (!exists.get(row.projectId, hash)) throw new Error(`unplaced-candidate migration aborted: ${row.id} was not preserved before delete`);
925
+ removeChunks.run(row.id);
926
+ remove.run(row.id);
927
+ moved += 1;
928
+ }
929
+ return moved;
930
+ })();
931
+ log.warn("relocated non-active memory rows into the unplaced-candidate table", { moved }, {
932
+ event_name: FIXED_EXTERNAL_VALUE_62,
933
+ file: "packages/memory/src/store/unplaced-candidate-migration.ts",
934
+ function: "migrateUnplacedCandidates",
935
+ site_id: "unplaced-candidate-migration.migrateUnplacedCandidates.c87865ef90"
936
+ });
937
+ return moved;
938
+ }
939
+ //#endregion
940
+ export { schema_exports as a, migrateLegacyDatabaseNamespace as i, loadSqliteVecExtension as n, applyEntityNameKeyMigration as o, resolveSimpleTokenizerPath as r, migrateUnplacedCandidates as t };