@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,730 @@
1
+ import "../../../signed-registry-constants-yq3DlG3B.js";
2
+ import { u as runWithMemoryAuditSync } from "../../../runtime-audit-log-BCeujlEp.js";
3
+ import { getSnoStationMemStateDir } from "../../contract/profile.js";
4
+ import { n as loadMemoryTelemetryKeySet, t as createMemoryTelemetryReceiptService } from "../../../memory-telemetry-receipts-YsxbwOAf.js";
5
+ import { t as validateMemoryTelemetryMetadata } from "../../../memory-telemetry-metadata-CA7W8tK6.js";
6
+ //#region src/engine/telemetry/memory-telemetry-purge.ts
7
+ const DELETE_BATCH_SIZE = 500;
8
+ function createMemoryTelemetryPurgeService(options) {
9
+ return new DefaultMemoryTelemetryPurgeService(options.sqlite, options.agentId ?? "sno-mem-claw", options.canDeleteFact ?? (() => true));
10
+ }
11
+ var DefaultMemoryTelemetryPurgeService = class {
12
+ sqlite;
13
+ agentId;
14
+ canDeleteFact;
15
+ constructor(sqlite, agentId, canDeleteFact) {
16
+ this.sqlite = sqlite;
17
+ this.agentId = agentId;
18
+ this.canDeleteFact = canDeleteFact;
19
+ }
20
+ previewImpact(factId, _options = {}) {
21
+ return runWithMemoryAuditSync({
22
+ stateDir: getSnoStationMemStateDir(),
23
+ event: "memory_read",
24
+ operation: "previewImpact",
25
+ startedDetails: {
26
+ requested_fact_id: factId,
27
+ fact_ids: [factId],
28
+ requested_count: 1
29
+ },
30
+ run: () => this.buildPreview(normalizeRequired$1(factId, "fact_id")),
31
+ completedDetails: (preview) => ({
32
+ requested_fact_id: factId,
33
+ resolved_fact_id: preview.targetFactId,
34
+ fact_ids: preview.affectedFactIds,
35
+ requested_count: 1,
36
+ result_count: preview.affectedFactCount
37
+ })
38
+ });
39
+ }
40
+ confirmPurge(input) {
41
+ return runWithMemoryAuditSync({
42
+ stateDir: getSnoStationMemStateDir(),
43
+ event: "memory_purged",
44
+ operation: "confirmPurge",
45
+ startedDetails: { target_fact_id: input.factId },
46
+ run: () => this.confirmPurgeUnaudited(input),
47
+ completedDetails: (result) => ({
48
+ target_fact_id: result.targetFactId,
49
+ purged_fact_ids: result.purgedFactIds,
50
+ failed_fact_ids: result.failedFactIds,
51
+ status: result.status,
52
+ ...result.blockedReason ? { blocked_reason: result.blockedReason } : {}
53
+ })
54
+ });
55
+ }
56
+ confirmPurgeUnaudited(input) {
57
+ const targetFactId = normalizeRequired$1(input.factId, "fact_id");
58
+ if (input.actor !== "operator") throw new Error("cascade purge confirmation requires an operator actor");
59
+ const expectedToken = `PURGE ${targetFactId}`;
60
+ if (input.confirmationToken !== expectedToken) throw new Error(`cascade purge confirmation token must equal '${expectedToken}'`);
61
+ return this.sqlite.transaction(() => {
62
+ const preview = this.buildPreview(targetFactId);
63
+ const anchor = this.readPurgeEventAnchor(targetFactId);
64
+ if (preview.blocked) {
65
+ const result = {
66
+ targetFactId,
67
+ status: "blocked",
68
+ purgedFactIds: [],
69
+ failedFactIds: preview.affectedFactIds,
70
+ blockedReason: "cycle_detected"
71
+ };
72
+ this.insertPurgeEvent(targetFactId, result, preview, anchor);
73
+ return result;
74
+ }
75
+ if (this.readRecentRecallCount(preview.affectedFactIds) > 0) {
76
+ const result = {
77
+ targetFactId,
78
+ status: "blocked",
79
+ purgedFactIds: [],
80
+ failedFactIds: preview.affectedFactIds,
81
+ blockedReason: "recent_recall"
82
+ };
83
+ this.insertPurgeEvent(targetFactId, result, preview, anchor);
84
+ return result;
85
+ }
86
+ const deletionCandidates = preview.affectedFactIds.filter((fact) => this.canDeleteFact(fact));
87
+ const purgedFactIds = this.deleteFacts(deletionCandidates);
88
+ const purgedFactIdSet = new Set(purgedFactIds);
89
+ const failedFactIds = preview.affectedFactIds.filter((fact) => !purgedFactIdSet.has(fact));
90
+ const result = {
91
+ targetFactId,
92
+ status: failedFactIds.length === 0 ? "complete" : "partial",
93
+ purgedFactIds,
94
+ failedFactIds
95
+ };
96
+ this.insertPurgeEvent(targetFactId, result, preview, anchor);
97
+ return result;
98
+ }).immediate();
99
+ }
100
+ buildPreview(targetFactId) {
101
+ const graph = this.buildForwardGraph();
102
+ if (!graph.knownFactIds.has(targetFactId)) throw new Error(`missing fact: fact_id=${targetFactId}`);
103
+ const traversal = traverseDownstream(targetFactId, graph.edges);
104
+ return {
105
+ targetFactId,
106
+ affectedFactIds: traversal.affectedFactIds,
107
+ downstreamFactIds: traversal.affectedFactIds.slice(1),
108
+ affectedFactCount: traversal.affectedFactIds.length,
109
+ recentRecallCount: this.readRecentRecallCount([targetFactId]),
110
+ affectedEpochIds: this.readAffectedEpochIds(traversal.affectedFactIds),
111
+ blocked: traversal.blocked,
112
+ ...traversal.blocked ? { blockedReason: "cycle_detected" } : {}
113
+ };
114
+ }
115
+ buildForwardGraph() {
116
+ const memoryRows = this.sqlite.prepare("SELECT id, fact_id, category, project_id, derived_from FROM nodix_memories").all();
117
+ const graph = /* @__PURE__ */ new Map();
118
+ const knownFactIds = /* @__PURE__ */ new Set();
119
+ for (const row of memoryRows) {
120
+ const factId = row.fact_id ?? row.id;
121
+ knownFactIds.add(factId);
122
+ for (const parentFactId of parseFactIdArray(row.derived_from)) addEdge(graph, parentFactId, factId);
123
+ if (!graph.has(factId)) graph.set(factId, graph.get(factId) ?? []);
124
+ }
125
+ const eventRows = this.sqlite.prepare(`SELECT fact_id, memory_kind, project_id, derived_from
126
+ FROM nodix_memory_events
127
+ WHERE fact_id IS NOT NULL
128
+ AND derived_from IS NOT NULL
129
+ ORDER BY id ASC`).all();
130
+ for (const row of eventRows) {
131
+ if (!row.fact_id) continue;
132
+ knownFactIds.add(row.fact_id);
133
+ for (const parentFactId of parseFactIdArray(row.derived_from)) addEdge(graph, parentFactId, row.fact_id);
134
+ if (!graph.has(row.fact_id)) graph.set(row.fact_id, graph.get(row.fact_id) ?? []);
135
+ }
136
+ return {
137
+ edges: graph,
138
+ knownFactIds
139
+ };
140
+ }
141
+ deleteFacts(factIds) {
142
+ const purgedFactIds = [];
143
+ for (let i = 0; i < factIds.length; i += DELETE_BATCH_SIZE) {
144
+ const batchFactIds = factIds.slice(i, i + DELETE_BATCH_SIZE);
145
+ const batch = JSON.stringify(batchFactIds);
146
+ const memoryIds = this.sqlite.prepare("SELECT id FROM nodix_memories WHERE fact_id IN (SELECT value FROM json_each(?))").all(batch).map((row) => row.id);
147
+ this.deleteChunksByMemoryIds(memoryIds);
148
+ const deletedRows = this.sqlite.prepare(`DELETE FROM nodix_memories
149
+ WHERE fact_id IN (SELECT value FROM json_each(?))
150
+ RETURNING fact_id`).all(batch);
151
+ const deletedFactIds = new Set(deletedRows.flatMap((row) => row.fact_id === null ? [] : [row.fact_id]));
152
+ purgedFactIds.push(...batchFactIds.filter((factId) => deletedFactIds.has(factId)));
153
+ }
154
+ return purgedFactIds;
155
+ }
156
+ deleteChunksByMemoryIds(memoryIds) {
157
+ if (memoryIds.length === 0) return;
158
+ for (let i = 0; i < memoryIds.length; i += DELETE_BATCH_SIZE) {
159
+ const batch = JSON.stringify(memoryIds.slice(i, i + DELETE_BATCH_SIZE));
160
+ const chunkIds = this.sqlite.prepare("SELECT chunk_id FROM nodix_memory_chunks WHERE memory_id IN (SELECT value FROM json_each(?))").all(batch).map((row) => row.chunk_id);
161
+ for (let j = 0; j < chunkIds.length; j += DELETE_BATCH_SIZE) {
162
+ const chunkBatch = JSON.stringify(chunkIds.slice(j, j + DELETE_BATCH_SIZE));
163
+ this.sqlite.prepare("DELETE FROM nodix_memory_chunk_vectors WHERE id IN (SELECT value FROM json_each(?))").run(chunkBatch);
164
+ }
165
+ this.sqlite.prepare("DELETE FROM nodix_memory_chunks WHERE memory_id IN (SELECT value FROM json_each(?))").run(batch);
166
+ }
167
+ }
168
+ readRecentRecallCount(factIds) {
169
+ if (factIds.length === 0) return 0;
170
+ const batch = JSON.stringify(factIds);
171
+ return this.sqlite.prepare(`SELECT COUNT(*) AS count
172
+ FROM nodix_memory_events
173
+ WHERE event_type = 'recall'
174
+ AND fact_id IN (SELECT value FROM json_each(?))
175
+ AND timestamp_ms >= ?`).get(batch, Date.now() - 2592e6)?.count ?? 0;
176
+ }
177
+ readAffectedEpochIds(factIds) {
178
+ if (factIds.length === 0) return [];
179
+ const epochIds = [];
180
+ const seen = /* @__PURE__ */ new Set();
181
+ for (let i = 0; i < factIds.length; i += DELETE_BATCH_SIZE) {
182
+ const batch = JSON.stringify(factIds.slice(i, i + DELETE_BATCH_SIZE));
183
+ const memoryRows = this.sqlite.prepare(`SELECT consolidation_epoch_id
184
+ FROM nodix_memories
185
+ WHERE fact_id IN (SELECT value FROM json_each(?))
186
+ AND consolidation_epoch_id IS NOT NULL
187
+ ORDER BY id ASC`).all(batch);
188
+ const eventRows = this.sqlite.prepare(`SELECT consolidation_epoch_id
189
+ FROM nodix_memory_events
190
+ WHERE fact_id IN (SELECT value FROM json_each(?))
191
+ AND consolidation_epoch_id IS NOT NULL
192
+ ORDER BY id ASC`).all(batch);
193
+ for (const row of [...memoryRows, ...eventRows]) {
194
+ if (!row.consolidation_epoch_id || seen.has(row.consolidation_epoch_id)) continue;
195
+ seen.add(row.consolidation_epoch_id);
196
+ epochIds.push(row.consolidation_epoch_id);
197
+ }
198
+ }
199
+ return epochIds;
200
+ }
201
+ insertPurgeEvent(targetFactId, result, preview, anchor) {
202
+ const metadata = validateMemoryTelemetryMetadata("purge", {
203
+ status: result.status,
204
+ affected_fact_count: preview.affectedFactCount,
205
+ purged_fact_ids: result.purgedFactIds,
206
+ failed_fact_ids: result.failedFactIds,
207
+ ...result.blockedReason ? { blocked_reason: result.blockedReason } : {}
208
+ });
209
+ this.sqlite.prepare(`INSERT INTO nodix_memory_events
210
+ (event_type, fact_id, memory_kind, timestamp_ms, agent_id, project_id, metadata_json)
211
+ VALUES (?, ?, ?, ?, ?, ?, ?)`).run("purge", targetFactId, anchor.memoryKind, Date.now(), this.agentId, anchor.projectId, JSON.stringify(metadata));
212
+ }
213
+ readPurgeEventAnchor(targetFactId) {
214
+ const primary = this.sqlite.prepare("SELECT id, fact_id, category, project_id FROM nodix_memories WHERE fact_id = ? ORDER BY id ASC LIMIT 1").get(targetFactId);
215
+ if (primary) return {
216
+ memoryKind: primary.category,
217
+ projectId: primary.project_id
218
+ };
219
+ const event = this.sqlite.prepare(`SELECT memory_kind, project_id
220
+ FROM nodix_memory_events
221
+ WHERE fact_id = ?
222
+ ORDER BY id DESC
223
+ LIMIT 1`).get(targetFactId);
224
+ return {
225
+ memoryKind: event?.memory_kind ?? null,
226
+ projectId: event?.project_id ?? null
227
+ };
228
+ }
229
+ };
230
+ function addEdge(graph, parentFactId, childFactId) {
231
+ const children = graph.get(parentFactId) ?? [];
232
+ if (!children.includes(childFactId)) children.push(childFactId);
233
+ graph.set(parentFactId, children);
234
+ }
235
+ function traverseDownstream(targetFactId, graph) {
236
+ const affectedFactIds = [];
237
+ const visited = /* @__PURE__ */ new Set();
238
+ const active = /* @__PURE__ */ new Set();
239
+ let blocked = false;
240
+ function visit(factId) {
241
+ if (active.has(factId)) {
242
+ blocked = true;
243
+ return;
244
+ }
245
+ if (visited.has(factId)) return;
246
+ visited.add(factId);
247
+ active.add(factId);
248
+ affectedFactIds.push(factId);
249
+ const children = graph.get(factId) ?? [];
250
+ for (const child of children) visit(child);
251
+ active.delete(factId);
252
+ }
253
+ visit(targetFactId);
254
+ return {
255
+ affectedFactIds,
256
+ blocked
257
+ };
258
+ }
259
+ function parseFactIdArray(value) {
260
+ if (!value) return [];
261
+ try {
262
+ const parsed = JSON.parse(value);
263
+ if (!Array.isArray(parsed)) return [];
264
+ return parsed.filter((item) => typeof item === "string" && item.length > 0);
265
+ } catch {
266
+ return [];
267
+ }
268
+ }
269
+ function normalizeRequired$1(value, label) {
270
+ const normalized = value?.trim();
271
+ if (!normalized) throw new Error(`${label} is required`);
272
+ return normalized;
273
+ }
274
+ //#endregion
275
+ //#region src/engine/telemetry/memory-telemetry-api.ts
276
+ function createMemoryTelemetryApi(options) {
277
+ const receiptService = options.receiptService ?? createMemoryTelemetryReceiptService(options.keySet ?? loadMemoryTelemetryKeySet({
278
+ enabled: true,
279
+ key: options.key ?? "",
280
+ historicKeys: options.historicKeys ?? []
281
+ }));
282
+ const purgeService = createMemoryTelemetryPurgeService({
283
+ sqlite: options.sqlite,
284
+ agentId: options.agentId
285
+ });
286
+ return new DefaultMemoryTelemetryApi(options.sqlite, receiptService, purgeService);
287
+ }
288
+ var DefaultMemoryTelemetryApi = class {
289
+ sqlite;
290
+ receiptService;
291
+ purgeService;
292
+ constructor(sqlite, receiptService, purgeService) {
293
+ this.sqlite = sqlite;
294
+ this.receiptService = receiptService;
295
+ this.purgeService = purgeService;
296
+ }
297
+ verifyReceipt(factId) {
298
+ return runWithMemoryAuditSync({
299
+ stateDir: getSnoStationMemStateDir(),
300
+ event: "memory_read",
301
+ operation: "verifyReceipt",
302
+ startedDetails: {
303
+ requested_fact_id: factId,
304
+ fact_ids: [factId],
305
+ requested_count: 1
306
+ },
307
+ run: () => this.verifyReceiptUnaudited(factId),
308
+ completedDetails: (result) => ({
309
+ requested_fact_id: result.requestedFactId,
310
+ resolved_fact_id: result.terminalFactId,
311
+ fact_ids: [result.terminalFactId],
312
+ requested_count: 1,
313
+ result_count: 1,
314
+ outcome: result.status
315
+ })
316
+ });
317
+ }
318
+ verifyReceiptUnaudited(factId) {
319
+ const requestedFactId = normalizeRequired(factId, "fact_id");
320
+ const terminalFactId = this.resolveTerminalFactId(requestedFactId);
321
+ const receiptRows = this.readReceiptRows(terminalFactId);
322
+ if (receiptRows.length === 0) throw new Error(`missing fact receipt for fact_id=${requestedFactId}`);
323
+ const historicalReceipts = receiptRows.map((row) => this.verifyReceiptRow(row));
324
+ const latestReceipt = historicalReceipts[historicalReceipts.length - 1];
325
+ if (!latestReceipt) throw new Error(`missing fact receipt for fact_id=${requestedFactId}`);
326
+ const currentHash = this.readCurrentContentHash(terminalFactId);
327
+ const status = latestReceipt.status === "valid" && currentHash && currentHash !== latestReceipt.contentHash ? "tampered" : latestReceipt.status;
328
+ return {
329
+ status,
330
+ requestedFactId,
331
+ terminalFactId,
332
+ latestReceipt: {
333
+ ...latestReceipt,
334
+ status
335
+ },
336
+ historicalReceipts
337
+ };
338
+ }
339
+ provenanceChain(factId, depth = 100) {
340
+ const normalizedFactId = normalizeRequired(factId, "fact_id");
341
+ const nodes = this.sqlite.prepare(`SELECT *
342
+ FROM nodix_memory_events
343
+ WHERE fact_id = ?
344
+ ORDER BY id ASC
345
+ LIMIT ?`).all(normalizedFactId, normalizeLimit(depth)).map((row) => ({
346
+ eventId: row.id,
347
+ eventType: parseEventType(row.event_type),
348
+ factId: row.fact_id,
349
+ timestampMs: row.timestamp_ms,
350
+ sourceEventId: row.source_event_id,
351
+ derivedFrom: parseStringArray(row.derived_from)
352
+ }));
353
+ return {
354
+ factId: normalizedFactId,
355
+ currentState: currentState(nodes),
356
+ nodes
357
+ };
358
+ }
359
+ editImpactPreview(factId, options) {
360
+ return this.purgeService.previewImpact(factId, options);
361
+ }
362
+ confirmPurge(input) {
363
+ return this.purgeService.confirmPurge(input);
364
+ }
365
+ usageSummary(input) {
366
+ if (!input.factId && !input.agentId) throw new Error("usage_summary requires fact_id or agent_id");
367
+ const committed = this.readCommittedUsage(input);
368
+ const pending = this.readPendingUsage(input);
369
+ return {
370
+ ...input.factId ? { factId: input.factId } : {},
371
+ ...input.agentId ? { agentId: input.agentId } : {},
372
+ recallCount: committed.recallCount + pending.recallCount,
373
+ injectionCount: committed.injectionCount + pending.injectionCount,
374
+ lastRecalledAt: maxNullable(committed.lastRecalledAt, pending.lastRecalledAt),
375
+ lastInjectedAt: maxNullable(committed.lastInjectedAt, pending.lastInjectedAt),
376
+ source: "local",
377
+ cloudForwarding: "ignored",
378
+ tenantBoundary: {
379
+ status: "unavailable",
380
+ queryTenantId: null,
381
+ resultTenantId: null
382
+ }
383
+ };
384
+ }
385
+ recallTrace(input) {
386
+ const sessionUuid = normalizeRequired(input.sessionUuid, "session_uuid");
387
+ const turnId = normalizeRequired(input.turnId, "turn_id");
388
+ const committed = this.sqlite.prepare(`SELECT *
389
+ FROM nodix_memory_events
390
+ WHERE event_type = 'recall'
391
+ AND session_uuid = ?
392
+ AND turn_id = ?
393
+ ORDER BY timestamp_ms ASC, id ASC`).all(sessionUuid, turnId);
394
+ const pending = this.readPendingUsageRows({
395
+ sessionUuid,
396
+ turnId,
397
+ eventType: "recall"
398
+ });
399
+ return {
400
+ sessionUuid,
401
+ turnId,
402
+ events: [...committed.map((row) => ({
403
+ eventId: row.id,
404
+ factId: row.fact_id ?? "",
405
+ timestampMs: row.timestamp_ms,
406
+ rank: row.retrieval_rank,
407
+ score: row.retrieval_score,
408
+ agentId: row.agent_id,
409
+ projectId: row.project_id,
410
+ source: "nodix_memory_events"
411
+ })), ...pending.map((row) => ({
412
+ eventId: null,
413
+ factId: row.payload.fact_id,
414
+ timestampMs: row.acceptedAtMs,
415
+ rank: row.payload.retrieval_rank,
416
+ score: row.payload.retrieval_score,
417
+ agentId: row.payload.agent_id,
418
+ projectId: row.payload.project_id,
419
+ source: "nodix_memory_usage_outbox"
420
+ }))].sort((a, b) => a.timestampMs - b.timestampMs)
421
+ };
422
+ }
423
+ epochReport(epochId) {
424
+ const normalizedEpochId = normalizeRequired(epochId, "epoch_id");
425
+ const rows = this.sqlite.prepare(`SELECT *
426
+ FROM nodix_memory_events
427
+ WHERE consolidation_epoch_id = ?
428
+ ORDER BY id ASC`).all(normalizedEpochId);
429
+ if (rows.length === 0) return {
430
+ epochId: normalizedEpochId,
431
+ status: "unavailable",
432
+ boundaryEvents: [],
433
+ createdFactIds: [],
434
+ supersededFactIds: []
435
+ };
436
+ const boundaryRows = rows.filter((row) => row.event_type === "epoch_boundary");
437
+ return {
438
+ epochId: normalizedEpochId,
439
+ status: boundaryRows.some((row) => readMetadata(row).subtype === "synthetic") ? "synthetic" : "real",
440
+ boundaryEvents: boundaryRows.map((row) => row.id),
441
+ createdFactIds: factIdsFor(rows, "create"),
442
+ supersededFactIds: factIdsFor(rows, "supersede")
443
+ };
444
+ }
445
+ resolveTerminalFactId(factId) {
446
+ const seen = /* @__PURE__ */ new Set();
447
+ let current = factId;
448
+ while (!seen.has(current)) {
449
+ seen.add(current);
450
+ const row = this.sqlite.prepare(`SELECT metadata_json
451
+ FROM nodix_memory_events
452
+ WHERE fact_id = ? AND event_type = 'supersede'
453
+ ORDER BY id DESC
454
+ LIMIT 1`).get(current);
455
+ const nextRowId = row ? readMetadata(row).superseded_by : void 0;
456
+ if (typeof nextRowId !== "string" || nextRowId.trim().length === 0) return current;
457
+ const nextFact = this.sqlite.prepare("SELECT fact_id FROM nodix_memories WHERE id = ? LIMIT 1").get(nextRowId);
458
+ if (!nextFact?.fact_id || nextFact.fact_id === current) return current;
459
+ current = nextFact.fact_id;
460
+ }
461
+ return current;
462
+ }
463
+ readReceiptRows(factId) {
464
+ return this.sqlite.prepare(`SELECT *
465
+ FROM nodix_memory_events
466
+ WHERE fact_id = ?
467
+ AND event_type IN ('create', 'update')
468
+ AND content_hash IS NOT NULL
469
+ AND receipt_hmac IS NOT NULL
470
+ AND key_version IS NOT NULL
471
+ ORDER BY id ASC`).all(factId);
472
+ }
473
+ verifyReceiptRow(row) {
474
+ const factId = row.fact_id ?? "";
475
+ const contentHash = row.content_hash ?? "";
476
+ const timestampMs = row.timestamp_ms;
477
+ const receiptHmac = row.receipt_hmac ?? "";
478
+ const keyVersion = row.key_version ?? 0;
479
+ const verification = this.receiptService.verify({
480
+ factId,
481
+ contentHash,
482
+ timestampMs,
483
+ receiptHmac,
484
+ keyVersion
485
+ });
486
+ return {
487
+ eventId: row.id,
488
+ factId,
489
+ memoryRowId: this.readMemoryRowId(factId, contentHash),
490
+ contentHash,
491
+ timestampMs,
492
+ receiptHmac,
493
+ keyVersion,
494
+ status: verification.status
495
+ };
496
+ }
497
+ readMemoryRowId(factId, contentHash) {
498
+ return this.sqlite.prepare(`SELECT id
499
+ FROM nodix_memories
500
+ WHERE fact_id = ? AND content_hash = ?
501
+ ORDER BY timestamp DESC
502
+ LIMIT 1`).get(factId, contentHash)?.id ?? null;
503
+ }
504
+ readCurrentContentHash(factId) {
505
+ return this.sqlite.prepare(`SELECT id, fact_id, content_hash, timestamp
506
+ FROM nodix_memories
507
+ WHERE fact_id = ?
508
+ ORDER BY timestamp DESC
509
+ LIMIT 1`).get(factId)?.content_hash ?? null;
510
+ }
511
+ readCommittedUsage(input) {
512
+ const clauses = ["event_type IN ('recall', 'inject')"];
513
+ const params = [];
514
+ if (input.factId) {
515
+ clauses.push("fact_id = ?");
516
+ params.push(input.factId);
517
+ }
518
+ if (input.agentId) {
519
+ clauses.push("agent_id = ?");
520
+ params.push(input.agentId);
521
+ }
522
+ if (input.projectId) {
523
+ clauses.push("project_id = ?");
524
+ params.push(input.projectId);
525
+ }
526
+ addWindowClauses(clauses, params, "timestamp_ms", input.window);
527
+ return aggregateUsageRows(this.sqlite.prepare(`SELECT event_type, timestamp_ms
528
+ FROM nodix_memory_events
529
+ WHERE ${clauses.join(" AND ")}`).all(...params).map((row) => ({
530
+ eventType: row.event_type,
531
+ timestampMs: row.timestamp_ms
532
+ })));
533
+ }
534
+ readPendingUsage(input) {
535
+ return aggregateUsageRows(this.readPendingUsageRows({
536
+ factId: input.factId,
537
+ agentId: input.agentId,
538
+ projectId: input.projectId,
539
+ window: input.window
540
+ }).map((row) => ({
541
+ eventType: row.payload.event_type,
542
+ timestampMs: row.acceptedAtMs
543
+ })));
544
+ }
545
+ readPendingUsageRows(filter) {
546
+ const clauses = ["status IN ('pending', 'failed', 'flushing')"];
547
+ const params = [];
548
+ if (filter.eventType) {
549
+ clauses.push("event_type = ?");
550
+ params.push(filter.eventType);
551
+ }
552
+ addWindowClauses(clauses, params, "accepted_at_ms", filter.window);
553
+ return this.sqlite.prepare(`SELECT id, event_type, payload_json, accepted_at_ms
554
+ FROM nodix_memory_usage_outbox
555
+ WHERE ${clauses.join(" AND ")}
556
+ ORDER BY accepted_at_ms ASC, id ASC`).all(...params).flatMap((row) => {
557
+ const payload = parseUsagePayload(row.payload_json);
558
+ if (!payload) return [];
559
+ if (this.hasCommittedUsage(payload, row.accepted_at_ms)) return [];
560
+ if (filter.factId && payload.fact_id !== filter.factId) return [];
561
+ if (filter.agentId && payload.agent_id !== filter.agentId) return [];
562
+ if (filter.projectId && payload.project_id !== filter.projectId) return [];
563
+ if (filter.sessionUuid && payload.session_uuid !== filter.sessionUuid) return [];
564
+ if (filter.turnId && payload.turn_id !== filter.turnId) return [];
565
+ return [{
566
+ id: row.id,
567
+ acceptedAtMs: row.accepted_at_ms,
568
+ payload
569
+ }];
570
+ });
571
+ }
572
+ hasCommittedUsage(payload, acceptedAtMs) {
573
+ const clauses = [
574
+ "event_type = ?",
575
+ "fact_id = ?",
576
+ "timestamp_ms = ?"
577
+ ];
578
+ const params = [
579
+ payload.event_type,
580
+ payload.fact_id,
581
+ acceptedAtMs
582
+ ];
583
+ addNullableMatchClause(clauses, params, "memory_kind", payload.memory_kind);
584
+ addNullableMatchClause(clauses, params, "agent_id", payload.agent_id);
585
+ addNullableMatchClause(clauses, params, "project_id", payload.project_id);
586
+ addNullableMatchClause(clauses, params, "session_uuid", payload.session_uuid);
587
+ addNullableMatchClause(clauses, params, "turn_id", payload.turn_id);
588
+ addNullableMatchClause(clauses, params, "retrieval_rank", payload.retrieval_rank);
589
+ addNullableMatchClause(clauses, params, "retrieval_score", payload.retrieval_score);
590
+ return this.sqlite.prepare(`SELECT COUNT(*) AS count FROM nodix_memory_events WHERE ${clauses.join(" AND ")}`).get(...params).count > 0;
591
+ }
592
+ };
593
+ function normalizeRequired(value, field) {
594
+ if (typeof value === "string" && value.trim().length > 0) return value.trim();
595
+ throw new Error(`${field} is required`);
596
+ }
597
+ function normalizeLimit(value) {
598
+ if (!Number.isFinite(value)) return 100;
599
+ return Math.max(1, Math.min(500, Math.floor(value)));
600
+ }
601
+ function parseEventType(value) {
602
+ switch (value) {
603
+ case "create":
604
+ case "update":
605
+ case "recall":
606
+ case "supersede":
607
+ case "delete":
608
+ case "inject":
609
+ case "epoch_boundary":
610
+ case "purge": return value;
611
+ default: throw new Error(`unknown memory telemetry event type: ${value}`);
612
+ }
613
+ }
614
+ function parseStringArray(value) {
615
+ if (!value) return [];
616
+ try {
617
+ const parsed = JSON.parse(value);
618
+ if (!Array.isArray(parsed)) return [];
619
+ return parsed.filter((item) => typeof item === "string");
620
+ } catch {
621
+ return [];
622
+ }
623
+ }
624
+ function readMetadata(row) {
625
+ if (!row.metadata_json) return {};
626
+ try {
627
+ const parsed = JSON.parse(row.metadata_json);
628
+ if (typeof parsed === "object" && parsed !== null && !Array.isArray(parsed)) return parsed;
629
+ return {};
630
+ } catch {
631
+ return {};
632
+ }
633
+ }
634
+ function currentState(nodes) {
635
+ const last = nodes[nodes.length - 1];
636
+ if (!last) return "missing";
637
+ if (last.eventType === "supersede") return "superseded";
638
+ if (last.eventType === "delete") return "deleted";
639
+ if (last.eventType === "purge") return "purged";
640
+ return "active";
641
+ }
642
+ function addWindowClauses(clauses, params, column, window) {
643
+ if (!window) return;
644
+ if (Number.isFinite(window.sinceMs)) {
645
+ clauses.push(`${column} >= ?`);
646
+ params.push(Number(window.sinceMs));
647
+ }
648
+ if (Number.isFinite(window.untilMs)) {
649
+ clauses.push(`${column} <= ?`);
650
+ params.push(Number(window.untilMs));
651
+ }
652
+ }
653
+ function addNullableMatchClause(clauses, params, column, value) {
654
+ if (value === null) {
655
+ clauses.push(`${column} IS NULL`);
656
+ return;
657
+ }
658
+ clauses.push(`${column} = ?`);
659
+ params.push(value);
660
+ }
661
+ function aggregateUsageRows(rows) {
662
+ let recallCount = 0;
663
+ let injectionCount = 0;
664
+ let lastRecalledAt = null;
665
+ let lastInjectedAt = null;
666
+ for (const row of rows) {
667
+ if (row.eventType === "recall") {
668
+ recallCount += 1;
669
+ lastRecalledAt = maxNullable(lastRecalledAt, row.timestampMs);
670
+ }
671
+ if (row.eventType === "inject") {
672
+ injectionCount += 1;
673
+ lastInjectedAt = maxNullable(lastInjectedAt, row.timestampMs);
674
+ }
675
+ }
676
+ return {
677
+ recallCount,
678
+ injectionCount,
679
+ lastRecalledAt,
680
+ lastInjectedAt
681
+ };
682
+ }
683
+ function maxNullable(left, right) {
684
+ if (left === null) return right;
685
+ if (right === null) return left;
686
+ return Math.max(left, right);
687
+ }
688
+ function parseUsagePayload(payloadJson) {
689
+ try {
690
+ const parsed = JSON.parse(payloadJson);
691
+ if (!isRecord(parsed)) return null;
692
+ if (parsed.event_type !== "recall" && parsed.event_type !== "inject") return null;
693
+ const factId = requiredString(parsed.fact_id);
694
+ const memoryKind = requiredString(parsed.memory_kind);
695
+ if (!factId || !memoryKind) return null;
696
+ return {
697
+ event_type: parsed.event_type,
698
+ fact_id: factId,
699
+ memory_kind: memoryKind,
700
+ project_id: nullableString(parsed.project_id),
701
+ agent_id: nullableString(parsed.agent_id),
702
+ session_uuid: nullableString(parsed.session_uuid),
703
+ turn_id: nullableString(parsed.turn_id),
704
+ retrieval_rank: nullableNumber(parsed.retrieval_rank),
705
+ retrieval_score: nullableNumber(parsed.retrieval_score)
706
+ };
707
+ } catch {
708
+ return null;
709
+ }
710
+ }
711
+ function factIdsFor(rows, eventType) {
712
+ return rows.flatMap((row) => row.event_type === eventType && row.fact_id ? [row.fact_id] : []);
713
+ }
714
+ function requiredString(value) {
715
+ if (typeof value === "string" && value.trim().length > 0) return value;
716
+ return null;
717
+ }
718
+ function nullableString(value) {
719
+ if (value === null || value === void 0) return null;
720
+ return typeof value === "string" ? value : null;
721
+ }
722
+ function nullableNumber(value) {
723
+ if (value === null || value === void 0) return null;
724
+ return typeof value === "number" && Number.isFinite(value) ? value : null;
725
+ }
726
+ function isRecord(value) {
727
+ return typeof value === "object" && value !== null && !Array.isArray(value);
728
+ }
729
+ //#endregion
730
+ export { createMemoryTelemetryApi };