@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,28 @@
1
+ import { r as SqliteDatabaseLike } from "../../sqlite-runtime-L_ywirTm.js";
2
+ //#region src/store/memory-kinds-cutover-migrator.d.ts
3
+ export declare const MEMORY_KINDS_FOUNDATION_MARKER = "nodix_memory_kinds_foundation_v1";
4
+ export interface MemoryKindsCutoverResult {
5
+ status: "migrated" | "noop";
6
+ rewrittenRows: number;
7
+ checkedRows: number;
8
+ }
9
+ export interface ResetMemoryKindsCutoverDatabaseOptions {
10
+ dbPath: string;
11
+ projectId: string;
12
+ args: string[];
13
+ timestamp?: number;
14
+ log?: (record: Record<string, unknown>) => void;
15
+ }
16
+ export interface ResetMemoryKindsCutoverDatabaseResult {
17
+ removedFiles: number;
18
+ dbPath: string;
19
+ projectId: string;
20
+ timestamp: number;
21
+ }
22
+ export declare function assertMemoryKindsCutoverStartupGuard(db: SqliteDatabaseLike): void;
23
+ export declare function runMemoryKindsCutoverMigration(args: {
24
+ dbPath: string;
25
+ now?: number;
26
+ }): MemoryKindsCutoverResult;
27
+ export declare function resetMemoryKindsCutoverDatabase(options: ResetMemoryKindsCutoverDatabaseOptions): ResetMemoryKindsCutoverDatabaseResult;
28
+ //#endregion
@@ -0,0 +1,415 @@
1
+ import { St as PERSISTED_CONTENT_HASH_V1 } from "../../signed-registry-constants-yq3DlG3B.js";
2
+ import { MEMORY_CATEGORIES } from "../engine/shared/types.js";
3
+ import { StorageError } from "../engine/shared/errors.js";
4
+ import { a as buildInsightMetadata, c as stringifyInsightMetadata, s as parseInsightMetadata } from "../../memory-metadata-codec-DL1sbJiN.js";
5
+ import { stableHash } from "../engine/shared/utils.js";
6
+ import { u as runWithMemoryAuditSync } from "../../runtime-audit-log-BCeujlEp.js";
7
+ import { getSnoStationMemStateDir } from "../contract/profile.js";
8
+ import { openSqliteDatabase } from "./sqlite-runtime.js";
9
+ import { resolve } from "node:path";
10
+ import { existsSync, mkdirSync, renameSync, rmSync, writeFileSync } from "node:fs";
11
+ import { readManifestIfPresent, resolveConfigPaths } from "@snoai/sqlite-crypto";
12
+ //#region src/store/memory-kinds-cutover-migrator.ts
13
+ /** @file memory-kinds-cutover-migrator.ts
14
+ * @purpose Offline one-time memory-kind cutover and startup invariants.
15
+ * @boundary Raw SQLite migration path only; runtime startup may call the guard.
16
+ */
17
+ const MEMORY_KINDS_FOUNDATION_MARKER = "nodix_memory_kinds_foundation_v1";
18
+ const OLD_MEMORY_CATEGORIES = [
19
+ "identity",
20
+ "preference",
21
+ "entity",
22
+ "event"
23
+ ];
24
+ const FOUNDATION_CATEGORY_SET = new Set(MEMORY_CATEGORIES);
25
+ const OLD_CATEGORY_SET = new Set(OLD_MEMORY_CATEGORIES);
26
+ const MIGRATABLE_SOURCES = /* @__PURE__ */ new Set([
27
+ "manual",
28
+ "ambient-learning",
29
+ "reflection",
30
+ "session-summary"
31
+ ]);
32
+ function createMarkerTable(db) {
33
+ db.exec("CREATE TABLE IF NOT EXISTS nodix_memory_migration_markers (name TEXT PRIMARY KEY, applied_at INTEGER NOT NULL, payload TEXT NOT NULL)");
34
+ }
35
+ function markerExists(db) {
36
+ if (!db.prepare("SELECT name FROM sqlite_master WHERE type = 'table' AND name = ? LIMIT 1").get("nodix_memory_migration_markers")) return false;
37
+ return db.prepare("SELECT name FROM nodix_memory_migration_markers WHERE name = ? LIMIT 1").get(MEMORY_KINDS_FOUNDATION_MARKER) !== void 0;
38
+ }
39
+ function readRows(db) {
40
+ return db.prepare("SELECT id, text, category, project_id AS projectId, importance, timestamp, metadata, content_hash FROM nodix_memories ORDER BY id ASC").all();
41
+ }
42
+ function parseJsonObject(raw) {
43
+ if (!raw) return {};
44
+ try {
45
+ const parsed = JSON.parse(raw);
46
+ return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : {};
47
+ } catch {
48
+ return {};
49
+ }
50
+ }
51
+ function metadataWithoutCategoryFields(metadata) {
52
+ const sanitized = { ...metadata };
53
+ delete sanitized.kind;
54
+ delete sanitized.memory_category;
55
+ delete sanitized.category;
56
+ return sanitized;
57
+ }
58
+ function safeTimestamp(value, fallback) {
59
+ const n = typeof value === "number" ? value : Number(value);
60
+ return Number.isFinite(n) && n > 0 ? Math.floor(n) : fallback;
61
+ }
62
+ function optionalString(value) {
63
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : void 0;
64
+ }
65
+ function isMigratableSource(value) {
66
+ return MIGRATABLE_SOURCES.has(value);
67
+ }
68
+ function migratableSource(value) {
69
+ const source = optionalString(value);
70
+ if (!source || source === "legacy") return "ambient-learning";
71
+ return isMigratableSource(source) ? source : "ambient-learning";
72
+ }
73
+ function numericOr(value, fallback) {
74
+ const n = typeof value === "number" ? value : Number(value);
75
+ return Number.isFinite(n) ? n : fallback;
76
+ }
77
+ function countOr(value, fallback) {
78
+ const n = numericOr(value, fallback);
79
+ return n >= 0 ? Math.floor(n) : fallback;
80
+ }
81
+ function slugSectionToken(value) {
82
+ return value.trim().toLowerCase().replace(/[^a-z0-9._-]+/g, "-").replace(/^-+|-+$/g, "");
83
+ }
84
+ function stripPrefix(value, prefix) {
85
+ return value.startsWith(prefix) ? value.slice(prefix.length) : void 0;
86
+ }
87
+ function resolvePreferenceSection(metadata) {
88
+ const sectionName = optionalString(metadata.section_name);
89
+ if (sectionName?.startsWith("preferences.")) return sectionName;
90
+ const topic = optionalString(metadata.topic ?? metadata.preference_topic ?? metadata.preferenceTopic);
91
+ if (topic) {
92
+ const slug = slugSectionToken(topic);
93
+ return slug ? `preferences.${slug}` : void 0;
94
+ }
95
+ const factKey = optionalString(metadata.fact_key);
96
+ if (factKey) {
97
+ const profileSection = stripPrefix(factKey, "profile:");
98
+ if (profileSection?.startsWith("preferences.")) return profileSection;
99
+ const preferenceTopic = stripPrefix(factKey, "preference:");
100
+ if (preferenceTopic) {
101
+ const slug = slugSectionToken(preferenceTopic);
102
+ return slug ? `preferences.${slug}` : void 0;
103
+ }
104
+ }
105
+ }
106
+ function resolveEntitySection(metadata) {
107
+ const sectionName = optionalString(metadata.section_name);
108
+ if (sectionName?.startsWith("entities.")) return sectionName;
109
+ const factKey = optionalString(metadata.fact_key);
110
+ if (factKey) {
111
+ const profileSection = stripPrefix(factKey, "profile:");
112
+ if (profileSection?.startsWith("entities.")) return profileSection;
113
+ const entityFactKey = stripPrefix(factKey, "entity:");
114
+ if (entityFactKey) {
115
+ const slug = slugSectionToken(entityFactKey);
116
+ return slug ? `entities.${slug}` : void 0;
117
+ }
118
+ }
119
+ for (const key of [
120
+ "entity_id",
121
+ "entityId",
122
+ "canonical_id",
123
+ "entity_name",
124
+ "entityName",
125
+ "name"
126
+ ]) {
127
+ const value = optionalString(metadata[key]);
128
+ if (!value) continue;
129
+ const slug = slugSectionToken(value);
130
+ if (slug) return `entities.${slug}`;
131
+ }
132
+ }
133
+ function resolveLessonSignature(metadata) {
134
+ const signature = optionalString(metadata.anti_pattern_signature);
135
+ if (signature) return signature;
136
+ const factKey = optionalString(metadata.fact_key);
137
+ return optionalString(factKey ? stripPrefix(factKey, "lesson:") : void 0);
138
+ }
139
+ function mapRowCategory(row, metadata) {
140
+ if (FOUNDATION_CATEGORY_SET.has(row.category)) return {
141
+ category: row.category,
142
+ variantPatch: {},
143
+ changed: false
144
+ };
145
+ if (!OLD_CATEGORY_SET.has(row.category)) throw new StorageError(`memory-kinds-foundation offline migrator cannot map row ${row.id}: unknown category "${row.category}"`);
146
+ const oldCategory = row.category;
147
+ if (oldCategory === "identity") return {
148
+ category: "profile",
149
+ variantPatch: { section_name: "identity" },
150
+ changed: true
151
+ };
152
+ if (oldCategory === "preference") {
153
+ const sectionName = resolvePreferenceSection(metadata);
154
+ if (!sectionName) throw new StorageError(`memory-kinds-foundation offline migrator cannot map row ${row.id}: missing preference topic/section_name`);
155
+ return {
156
+ category: "profile",
157
+ variantPatch: { section_name: sectionName },
158
+ changed: true
159
+ };
160
+ }
161
+ if (oldCategory === "entity") {
162
+ const sectionName = resolveEntitySection(metadata);
163
+ if (sectionName) return {
164
+ category: "profile",
165
+ variantPatch: { section_name: sectionName },
166
+ changed: true
167
+ };
168
+ return {
169
+ category: "episodic",
170
+ variantPatch: { entity_kind: optionalString(metadata.entity_kind) },
171
+ changed: true
172
+ };
173
+ }
174
+ if (oldCategory === "event") return {
175
+ category: "episodic",
176
+ variantPatch: { event_at: metadata.event_at },
177
+ changed: true
178
+ };
179
+ throw new StorageError(`memory-kinds-foundation offline migrator cannot map row ${row.id}: unsupported category "${row.category}"`);
180
+ }
181
+ function buildBasePatch(row, metadata, category, migrationStartTime) {
182
+ const rowTimestamp = safeTimestamp(row.timestamp, migrationStartTime);
183
+ const source = optionalString(metadata.source);
184
+ const patch = {
185
+ kind: category,
186
+ memory_category: category,
187
+ l0_abstract: optionalString(metadata.l0_abstract) ?? row.text,
188
+ l1_overview: optionalString(metadata.l1_overview) ?? `- ${row.text}`,
189
+ l2_content: optionalString(metadata.l2_content) ?? row.text,
190
+ tier: "core",
191
+ access_count: countOr(metadata.access_count ?? metadata.accessCount, 0),
192
+ confidence: numericOr(metadata.confidence, .5),
193
+ last_accessed_at: rowTimestamp,
194
+ asserted_at: rowTimestamp,
195
+ valid_from: rowTimestamp,
196
+ state: "confirmed",
197
+ source: migratableSource(metadata.source),
198
+ injected_count: countOr(metadata.injected_count, 0),
199
+ bad_recall_count: countOr(metadata.bad_recall_count, 0),
200
+ suppressed_until_turn: countOr(metadata.suppressed_until_turn, 0)
201
+ };
202
+ if (source === "legacy") patch.migrated_from_source = "legacy";
203
+ return patch;
204
+ }
205
+ function buildMigratedRow(row, migrationStartTime) {
206
+ const parsedMetadata = parseJsonObject(row.metadata);
207
+ const mapped = mapRowCategory(row, parsedMetadata);
208
+ const patch = {
209
+ ...buildBasePatch(row, parsedMetadata, mapped.category, migrationStartTime),
210
+ ...mapped.variantPatch
211
+ };
212
+ if (mapped.category === "lesson") {
213
+ const antiPatternSignature = resolveLessonSignature(parsedMetadata) ?? optionalString(mapped.variantPatch.anti_pattern_signature);
214
+ if (!antiPatternSignature) throw new StorageError(`memory-kinds-foundation offline migrator cannot map row ${row.id}: missing anti_pattern_signature`);
215
+ patch.anti_pattern_signature = antiPatternSignature;
216
+ }
217
+ const timestamp = safeTimestamp(row.timestamp, migrationStartTime);
218
+ let metadata;
219
+ try {
220
+ const sanitizedMetadata = metadataWithoutCategoryFields(parsedMetadata);
221
+ metadata = buildInsightMetadata({
222
+ text: row.text,
223
+ category: mapped.category,
224
+ timestamp,
225
+ metadata: JSON.stringify(sanitizedMetadata)
226
+ }, patch);
227
+ } catch (error) {
228
+ throw new StorageError(`memory-kinds-foundation offline migrator failed row ${row.id}: ${error.message}`, error);
229
+ }
230
+ const serialized = stringifyInsightMetadata(metadata);
231
+ return {
232
+ category: mapped.category,
233
+ metadata: serialized,
234
+ contentHash: stableHash(hashInputForMigratedEntry(row.text, serialized)),
235
+ changed: mapped.changed || row.metadata !== serialized || row.content_hash !== stableHash(hashInputForMigratedEntry(row.text, serialized))
236
+ };
237
+ }
238
+ function hashInputForMigratedEntry(text, metadata) {
239
+ const parsed = parseJsonObject(metadata);
240
+ const mergeLineage = Array.isArray(parsed.merge_lineage) ? parsed.merge_lineage.filter((item) => typeof item === "string") : [];
241
+ if (mergeLineage.length > 0) return JSON.stringify([
242
+ PERSISTED_CONTENT_HASH_V1,
243
+ text,
244
+ { merge_lineage: mergeLineage }
245
+ ]);
246
+ const mappedKind = parsed.mappedKind;
247
+ if (typeof mappedKind === "string" && mappedKind.length > 0) return JSON.stringify([
248
+ PERSISTED_CONTENT_HASH_V1,
249
+ text,
250
+ mappedKind
251
+ ]);
252
+ return text;
253
+ }
254
+ function validateFoundationInvariants(db) {
255
+ const rows = readRows(db);
256
+ for (const row of rows) {
257
+ if (!FOUNDATION_CATEGORY_SET.has(row.category)) throw new StorageError(`memory-kinds-foundation startup guard failed row ${row.id}: category "${row.category}" is not a foundation kind; run the offline migrator`);
258
+ try {
259
+ parseInsightMetadata(row.metadata ?? void 0, {
260
+ text: row.text,
261
+ category: row.category,
262
+ timestamp: row.timestamp
263
+ });
264
+ } catch (error) {
265
+ throw new StorageError(`memory-kinds-foundation startup guard failed row ${row.id}: ${error.message}; run the offline migrator`, error);
266
+ }
267
+ }
268
+ return rows.length;
269
+ }
270
+ function countNonFoundationRows(db) {
271
+ const rawCount = db.prepare(`SELECT COUNT(*) AS count FROM nodix_memories WHERE category NOT IN (${MEMORY_CATEGORIES.map(() => "?").join(", ")})`).get(...MEMORY_CATEGORIES)?.count ?? 0;
272
+ return typeof rawCount === "bigint" ? Number(rawCount) : Number(rawCount);
273
+ }
274
+ function assertMemoryKindsCutoverStartupGuard(db) {
275
+ if (markerExists(db)) return;
276
+ const nonFoundationRows = countNonFoundationRows(db);
277
+ if (nonFoundationRows > 0) throw new StorageError(`memory-kinds-foundation startup guard found ${nonFoundationRows} old/unknown category row(s) without marker ${MEMORY_KINDS_FOUNDATION_MARKER}; run the offline migrator before starting the runtime`);
278
+ }
279
+ function runMemoryKindsCutoverMigration(args) {
280
+ return runWithMemoryAuditSync({
281
+ stateDir: getSnoStationMemStateDir(),
282
+ event: "memory_updated",
283
+ operation: "runMemoryKindsCutoverMigration",
284
+ run: () => runMemoryKindsCutoverMigrationUnaudited(args),
285
+ completedDetails: (result) => ({
286
+ migration_status: result.status,
287
+ rewritten_rows: result.rewrittenRows,
288
+ checked_rows: result.checkedRows
289
+ })
290
+ });
291
+ }
292
+ function runMemoryKindsCutoverMigrationUnaudited(args) {
293
+ const migrationStartTime = args.now ?? Date.now();
294
+ const sqlite = openSqliteDatabase(args.dbPath);
295
+ try {
296
+ return sqlite.db.transaction(() => {
297
+ createMarkerTable(sqlite.db);
298
+ if (markerExists(sqlite.db)) return {
299
+ status: "noop",
300
+ rewrittenRows: 0,
301
+ checkedRows: validateFoundationInvariants(sqlite.db)
302
+ };
303
+ const rows = readRows(sqlite.db);
304
+ let rewrittenRows = 0;
305
+ for (const row of rows) {
306
+ const migrated = buildMigratedRow(row, migrationStartTime);
307
+ if (migrated.changed) rewrittenRows += 1;
308
+ sqlite.db.prepare("UPDATE nodix_memories SET category = ?, metadata = ?, content_hash = ? WHERE id = ?").run(migrated.category, migrated.metadata, migrated.contentHash, row.id);
309
+ }
310
+ sqlite.db.prepare("INSERT INTO nodix_memory_migration_markers (name, applied_at, payload) VALUES (?, ?, ?)").run(MEMORY_KINDS_FOUNDATION_MARKER, migrationStartTime, JSON.stringify({
311
+ rewrittenRows,
312
+ checkedRows: rows.length
313
+ }));
314
+ const checkedRows = validateFoundationInvariants(sqlite.db);
315
+ return {
316
+ status: "migrated",
317
+ rewrittenRows,
318
+ checkedRows
319
+ };
320
+ }).immediate();
321
+ } finally {
322
+ sqlite.db.close();
323
+ }
324
+ }
325
+ function removeDbManifestEntry(dbPath) {
326
+ const manifest = readManifestIfPresent();
327
+ if (!manifest) return;
328
+ const normalizedDbPath = resolve(dbPath);
329
+ const nextDbs = manifest.dbs.filter((entry) => entry.path !== normalizedDbPath);
330
+ if (nextDbs.length === manifest.dbs.length) return;
331
+ const { manifestFile, configDir } = resolveConfigPaths();
332
+ mkdirSync(configDir, {
333
+ recursive: true,
334
+ mode: 448
335
+ });
336
+ const tmp = `${manifestFile}.tmp-${process.pid}-${Date.now().toString(36)}`;
337
+ writeFileSync(tmp, JSON.stringify({
338
+ schemaVersion: manifest.schemaVersion,
339
+ createdAt: manifest.createdAt,
340
+ dbs: nextDbs
341
+ }));
342
+ renameSync(tmp, manifestFile);
343
+ }
344
+ function resetMemoryKindsCutoverDatabase(options) {
345
+ let memoryCount;
346
+ return runWithMemoryAuditSync({
347
+ stateDir: getSnoStationMemStateDir(),
348
+ event: "memory_deleted",
349
+ operation: "resetMemoryKindsCutoverDatabase",
350
+ scope: options.projectId,
351
+ startedDetails: {
352
+ scope: options.projectId,
353
+ delete_reason: "memory_kinds_cutover_reset"
354
+ },
355
+ run: () => {
356
+ memoryCount = readResetMemoryCount(options.dbPath);
357
+ return resetMemoryKindsCutoverDatabaseUnaudited(options);
358
+ },
359
+ completedDetails: (result) => {
360
+ const outcome = result.removedFiles > 0 ? "deleted" : "noop";
361
+ return {
362
+ scope: options.projectId,
363
+ delete_reason: "memory_kinds_cutover_reset",
364
+ outcome,
365
+ removed_files: result.removedFiles,
366
+ ...memoryCount === void 0 ? {} : { count: memoryCount }
367
+ };
368
+ }
369
+ });
370
+ }
371
+ function readResetMemoryCount(dbPath) {
372
+ if (!existsSync(dbPath)) return 0;
373
+ let sqlite;
374
+ try {
375
+ sqlite = openSqliteDatabase(dbPath);
376
+ const count = sqlite.db.prepare("SELECT COUNT(*) AS count FROM nodix_memories").get()?.count;
377
+ if (typeof count === "bigint") return Number(count);
378
+ return typeof count === "number" ? count : void 0;
379
+ } catch {
380
+ return;
381
+ } finally {
382
+ sqlite?.db.close();
383
+ }
384
+ }
385
+ function resetMemoryKindsCutoverDatabaseUnaudited(options) {
386
+ const timestamp = options.timestamp ?? Date.now();
387
+ const record = {
388
+ event: "memory_kinds_foundation_destructive_reset",
389
+ dbPath: options.dbPath,
390
+ projectId: options.projectId,
391
+ timestamp,
392
+ args: options.args
393
+ };
394
+ options.log?.(record);
395
+ removeDbManifestEntry(options.dbPath);
396
+ let removedFiles = 0;
397
+ for (const suffix of [
398
+ "",
399
+ "-shm",
400
+ "-wal"
401
+ ]) {
402
+ const target = `${options.dbPath}${suffix}`;
403
+ if (!existsSync(target)) continue;
404
+ rmSync(target);
405
+ removedFiles += 1;
406
+ }
407
+ return {
408
+ removedFiles,
409
+ dbPath: options.dbPath,
410
+ projectId: options.projectId,
411
+ timestamp
412
+ };
413
+ }
414
+ //#endregion
415
+ export { MEMORY_KINDS_FOUNDATION_MARKER, assertMemoryKindsCutoverStartupGuard, resetMemoryKindsCutoverDatabase, runMemoryKindsCutoverMigration };
@@ -0,0 +1,27 @@
1
+ import { u as RemDatabaseLike } from "../../types-pVomjzqR.js";
2
+ //#region src/store/migrations.d.ts
3
+ type RemMigrationDecision = {
4
+ decision: "allow";
5
+ reasonCode: null;
6
+ } | {
7
+ decision: "refuse";
8
+ reasonCode: "post_migration_writes";
9
+ };
10
+ /**
11
+ * Apply drizzle migrations against the encrypted DB at `dbPath`. Idempotent —
12
+ * drizzle's `__drizzle_migrations` table tracks applied migrations by hash, so
13
+ * a second call is a no-op. The self-upgrade smoke test calls this against a
14
+ * new ephemeral database; the plugin runtime opens its configured database
15
+ * through `initDb()` instead.
16
+ *
17
+ * The key comes from settings. Caller is responsible for closing nothing; this
18
+ * function opens its own connection and closes it on exit.
19
+ */
20
+ export declare function runMigrations(dbPath: string): void;
21
+ export declare function applyRemTwoFacetMigration(input: {
22
+ database: RemDatabaseLike;
23
+ }): void;
24
+ export declare function rollbackRemTwoFacetMigration(input: {
25
+ database: RemDatabaseLike;
26
+ }): RemMigrationDecision;
27
+ //#endregion
@@ -0,0 +1,201 @@
1
+ import { readSettings } from "../contract/profile.js";
2
+ import { installRemSchema } from "../engine/rem/index.js";
3
+ import { a as schema_exports, i as migrateLegacyDatabaseNamespace, n as loadSqliteVecExtension, o as applyEntityNameKeyMigration, r as resolveSimpleTokenizerPath, t as migrateUnplacedCandidates } from "../../unplaced-candidate-migration-CbQHzcEM.js";
4
+ import { initSqliteRuntime, openSqliteDatabase } from "./sqlite-runtime.js";
5
+ import { dirname, join } from "node:path";
6
+ import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from "node:fs";
7
+ import { fileURLToPath } from "node:url";
8
+ import { drizzle } from "drizzle-orm/better-sqlite3";
9
+ import { migrate } from "drizzle-orm/better-sqlite3/migrator";
10
+ //#region src/store/migrations.ts
11
+ /** @file migrations.ts
12
+ * @purpose Public, idempotent migration entry point used by the self-upgrade
13
+ * smoke test. Walks the SQLCipher chokepoint, loads
14
+ * sqlite-vec + simple-tokenizer, then applies drizzle migrations.
15
+ * @boundary Standalone — does not depend on the rest of the storage runtime
16
+ * beyond the chokepoint and migrations directory resolution.
17
+ */
18
+ const remTwoFacetBaselines = /* @__PURE__ */ new WeakMap();
19
+ const MIGRATIONS_DIR = resolveMigrationsDir();
20
+ /**
21
+ * Apply drizzle migrations against the encrypted DB at `dbPath`. Idempotent —
22
+ * drizzle's `__drizzle_migrations` table tracks applied migrations by hash, so
23
+ * a second call is a no-op. The self-upgrade smoke test calls this against a
24
+ * new ephemeral database; the plugin runtime opens its configured database
25
+ * through `initDb()` instead.
26
+ *
27
+ * The key comes from settings. Caller is responsible for closing nothing; this
28
+ * function opens its own connection and closes it on exit.
29
+ */
30
+ function runMigrations(dbPath) {
31
+ initSqliteRuntime(readSettings().store.encryptionKey);
32
+ mkdirSync(dirname(dbPath), { recursive: true });
33
+ const sqlite = openSqliteDatabase(dbPath);
34
+ try {
35
+ loadSqliteVecExtension(sqlite.raw);
36
+ const { extensionPath, dictPath } = resolveSimpleTokenizerPath();
37
+ sqlite.db.loadExtension(extensionPath);
38
+ sqlite.db.prepare("SELECT jieba_dict(?)").get(dictPath);
39
+ sqlite.db.exec("PRAGMA journal_mode=WAL;");
40
+ sqlite.db.exec("PRAGMA busy_timeout=5000;");
41
+ sqlite.db.exec("PRAGMA foreign_keys=ON;");
42
+ migrateLegacyDatabaseNamespace(sqlite.db);
43
+ const db = drizzle(sqlite.raw, { schema: schema_exports });
44
+ migrate(db, { migrationsFolder: MIGRATIONS_DIR });
45
+ applyEntityNameKeyMigration(sqlite.db);
46
+ migrateUnplacedCandidates(sqlite.db);
47
+ installRemSchema(sqlite.db);
48
+ } finally {
49
+ try {
50
+ sqlite.db.close();
51
+ } catch {}
52
+ }
53
+ }
54
+ function applyRemTwoFacetMigration(input) {
55
+ const facetTableMissing = !tableExists(input.database, "nodix_rem_memory_facets");
56
+ const facetRecoveryMissing = !tableExists(input.database, "nodix_rem_facet_recovery");
57
+ const chunkFacetMissing = !columnExists(input.database, "nodix_memory_chunks", "facet");
58
+ const facetIndexMissing = !indexExists(input.database, "rem_memory_facets_by_facet");
59
+ const chunkFacetIndexMissing = !indexExists(input.database, "nodix_idx_memory_chunks_memory_facet");
60
+ const oldChunkIndexPresent = indexExists(input.database, "nodix_idx_memory_chunks_memory");
61
+ const insertTriggerMissing = !triggerExists(input.database, "rem_memory_facets_after_insert");
62
+ const updateTriggerMissing = !triggerExists(input.database, "rem_memory_facets_after_text_update");
63
+ const changed = facetTableMissing || facetRecoveryMissing || chunkFacetMissing || facetIndexMissing || chunkFacetIndexMissing || oldChunkIndexPresent || insertTriggerMissing || updateTriggerMissing;
64
+ const databasePath = changed ? readDatabasePath(input.database) : void 0;
65
+ const databaseBytes = databasePath === void 0 ? void 0 : readFileSync(databasePath);
66
+ const walBytes = readOptionalFile(databasePath === void 0 ? void 0 : `${databasePath}-wal`);
67
+ const shmBytes = readOptionalFile(databasePath === void 0 ? void 0 : `${databasePath}-shm`);
68
+ if (changed) input.database.transaction(() => {
69
+ if (facetTableMissing) input.database.exec(`
70
+ CREATE TABLE nodix_rem_memory_facets (
71
+ memory_id TEXT NOT NULL,
72
+ facet TEXT NOT NULL CHECK (facet IN ('current', 'history')),
73
+ text TEXT NOT NULL,
74
+ updated_at_ms INTEGER NOT NULL,
75
+ PRIMARY KEY (memory_id, facet),
76
+ FOREIGN KEY (memory_id) REFERENCES nodix_memories(id) ON DELETE CASCADE
77
+ );
78
+ INSERT INTO nodix_rem_memory_facets(memory_id, facet, text, updated_at_ms)
79
+ SELECT id, 'current', text, timestamp FROM nodix_memories;
80
+ `);
81
+ if (facetIndexMissing) input.database.exec("CREATE INDEX rem_memory_facets_by_facet ON nodix_rem_memory_facets(facet, memory_id)");
82
+ if (insertTriggerMissing) input.database.exec(`
83
+ CREATE TRIGGER rem_memory_facets_after_insert
84
+ AFTER INSERT ON nodix_memories BEGIN
85
+ INSERT INTO nodix_rem_memory_facets(memory_id, facet, text, updated_at_ms)
86
+ VALUES (NEW.id, 'current', NEW.text, NEW.timestamp);
87
+ END
88
+ `);
89
+ if (updateTriggerMissing) input.database.exec(`
90
+ CREATE TRIGGER rem_memory_facets_after_text_update
91
+ AFTER UPDATE OF text ON nodix_memories BEGIN
92
+ INSERT INTO nodix_rem_memory_facets(memory_id, facet, text, updated_at_ms)
93
+ VALUES (NEW.id, 'current', NEW.text, NEW.timestamp)
94
+ ON CONFLICT(memory_id, facet) DO UPDATE SET
95
+ text = excluded.text, updated_at_ms = excluded.updated_at_ms;
96
+ END
97
+ `);
98
+ if (chunkFacetMissing) input.database.exec("ALTER TABLE nodix_memory_chunks ADD COLUMN facet TEXT NOT NULL DEFAULT 'current' CHECK (facet IN ('current', 'history'))");
99
+ if (oldChunkIndexPresent) input.database.exec("DROP INDEX nodix_idx_memory_chunks_memory");
100
+ if (chunkFacetIndexMissing) input.database.exec("CREATE UNIQUE INDEX nodix_idx_memory_chunks_memory_facet ON nodix_memory_chunks(memory_id, facet, chunk_index)");
101
+ if (facetRecoveryMissing) input.database.exec(`
102
+ CREATE TABLE nodix_rem_facet_recovery (
103
+ recovery_handle TEXT PRIMARY KEY,
104
+ prior_facets_json TEXT NOT NULL,
105
+ prior_chunk_facets_json TEXT NOT NULL,
106
+ expected_facets_json TEXT NOT NULL,
107
+ expected_chunk_facets_json TEXT NOT NULL,
108
+ FOREIGN KEY (recovery_handle)
109
+ REFERENCES nodix_rem_recovery_history(recovery_handle)
110
+ )
111
+ `);
112
+ }).immediate();
113
+ remTwoFacetBaselines.set(input.database, {
114
+ ...readConnectionVersion(input.database),
115
+ changed,
116
+ databasePath,
117
+ databaseBytes,
118
+ walBytes,
119
+ shmBytes
120
+ });
121
+ }
122
+ function rollbackRemTwoFacetMigration(input) {
123
+ const baseline = remTwoFacetBaselines.get(input.database);
124
+ if (baseline === void 0) return {
125
+ decision: "refuse",
126
+ reasonCode: "post_migration_writes"
127
+ };
128
+ const current = readConnectionVersion(input.database);
129
+ if (current.dataVersion !== baseline.dataVersion || current.totalChanges !== baseline.totalChanges) return {
130
+ decision: "refuse",
131
+ reasonCode: "post_migration_writes"
132
+ };
133
+ if (baseline.changed) {
134
+ if (baseline.databasePath === void 0 || baseline.databaseBytes === void 0) return {
135
+ decision: "refuse",
136
+ reasonCode: "post_migration_writes"
137
+ };
138
+ input.database.close?.();
139
+ restoreFile(baseline.databasePath, baseline.databaseBytes);
140
+ restoreOptionalFile(`${baseline.databasePath}-wal`, baseline.walBytes);
141
+ restoreOptionalFile(`${baseline.databasePath}-shm`, baseline.shmBytes);
142
+ }
143
+ remTwoFacetBaselines.delete(input.database);
144
+ return {
145
+ decision: "allow",
146
+ reasonCode: null
147
+ };
148
+ }
149
+ function readDatabasePath(database) {
150
+ const main = database.prepare("PRAGMA database_list").all().find(({ name }) => name === "main");
151
+ return main?.file === void 0 || main.file.length === 0 ? void 0 : main.file;
152
+ }
153
+ function readOptionalFile(path) {
154
+ return path !== void 0 && existsSync(path) ? readFileSync(path) : void 0;
155
+ }
156
+ function restoreFile(path, bytes) {
157
+ writeFileSync(path, bytes);
158
+ }
159
+ function restoreOptionalFile(path, bytes) {
160
+ if (bytes === void 0) {
161
+ if (existsSync(path)) unlinkSync(path);
162
+ return;
163
+ }
164
+ writeFileSync(path, bytes);
165
+ }
166
+ function tableExists(database, tableName) {
167
+ return database.prepare("SELECT 1 AS present FROM sqlite_master WHERE type = 'table' AND name = ?").get(tableName) !== void 0;
168
+ }
169
+ function columnExists(database, tableName, columnName) {
170
+ if (!tableExists(database, tableName)) return false;
171
+ return database.prepare(`PRAGMA table_info(${tableName})`).all().some(({ name }) => name === columnName);
172
+ }
173
+ function indexExists(database, indexName) {
174
+ return schemaObjectExists(database, "index", indexName);
175
+ }
176
+ function triggerExists(database, triggerName) {
177
+ return schemaObjectExists(database, "trigger", triggerName);
178
+ }
179
+ function schemaObjectExists(database, type, name) {
180
+ return database.prepare("SELECT 1 FROM sqlite_master WHERE type = ? AND name = ?").get(type, name) !== void 0;
181
+ }
182
+ function readConnectionVersion(database) {
183
+ const dataVersion = database.prepare("PRAGMA data_version").get();
184
+ const totalChanges = database.prepare("SELECT total_changes() AS total_changes").get();
185
+ return {
186
+ dataVersion: dataVersion.data_version,
187
+ totalChanges: totalChanges.total_changes
188
+ };
189
+ }
190
+ function resolveMigrationsDir() {
191
+ const moduleDir = dirname(fileURLToPath(import.meta.url));
192
+ const candidates = [
193
+ join(moduleDir, "../../drizzle"),
194
+ join(moduleDir, "../drizzle"),
195
+ join(moduleDir, "../../../drizzle")
196
+ ];
197
+ for (const dir of candidates) if (existsSync(join(dir, "meta/_journal.json"))) return dir;
198
+ throw new Error(`drizzle migrations folder not found; checked: ${candidates.join(", ")}`);
199
+ }
200
+ //#endregion
201
+ export { applyRemTwoFacetMigration, rollbackRemTwoFacetMigration, runMigrations };
@@ -0,0 +1,2 @@
1
+ import { a as SqliteOpenOptions, c as SqliteTransactionLike, d as openSqliteDatabase, f as openSqliteDatabaseReadonly, i as SqliteFileMissingError, l as _resetSqliteRuntimeForTest, n as RuntimeNotInitialized, o as SqliteRuntimeHandle, r as SqliteDatabaseLike, s as SqliteStatementLike, t as RawSqliteDatabase, u as initSqliteRuntime } from "../../sqlite-runtime-L_ywirTm.js";
2
+ export { RawSqliteDatabase, RuntimeNotInitialized, SqliteDatabaseLike, SqliteFileMissingError, SqliteOpenOptions, SqliteRuntimeHandle, SqliteStatementLike, SqliteTransactionLike, _resetSqliteRuntimeForTest, initSqliteRuntime, openSqliteDatabase, openSqliteDatabaseReadonly };