@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,24 @@
1
+ import { r as SqliteDatabaseLike } from "../../../sqlite-runtime-L_ywirTm.js";
2
+ import { JsonObject } from "@snoai/observability";
3
+ //#region src/engine/telemetry/memory-telemetry-observability.d.ts
4
+ export interface MemoryTelemetryObserveEmitInput {
5
+ eventType: "memory.telemetry";
6
+ payload: JsonObject;
7
+ }
8
+ export interface MemoryTelemetryObserveSink {
9
+ tryEmit(input: MemoryTelemetryObserveEmitInput): boolean | Promise<boolean>;
10
+ }
11
+ export interface ForwardMemoryTelemetryToObserveOptions {
12
+ sqlite: SqliteDatabaseLike;
13
+ observe: MemoryTelemetryObserveSink;
14
+ sink?: string;
15
+ batchSize?: number;
16
+ nowMs?: number;
17
+ }
18
+ export interface MemoryTelemetryObserveForwardResult {
19
+ status: "idle" | "forwarded" | "failed";
20
+ forwarded: number;
21
+ lastEventId: number;
22
+ }
23
+ export declare function forwardMemoryTelemetryToObserve(options: ForwardMemoryTelemetryToObserveOptions): Promise<MemoryTelemetryObserveForwardResult>;
24
+ //#endregion
@@ -0,0 +1,133 @@
1
+ import { isMemoryTelemetryEventType } from "./memory-telemetry-types.js";
2
+ //#region src/engine/telemetry/memory-telemetry-observability.ts
3
+ const DEFAULT_SINK = "sno-observe";
4
+ const MAX_BATCH_SIZE = 50;
5
+ async function forwardMemoryTelemetryToObserve(options) {
6
+ const sink = normalizeSink(options.sink);
7
+ const lastEventId = readWatermark(options.sqlite, sink);
8
+ const rows = readRows(options.sqlite, lastEventId, normalizeBatchSize(options.batchSize));
9
+ if (rows.length === 0) return {
10
+ status: "idle",
11
+ forwarded: 0,
12
+ lastEventId
13
+ };
14
+ const firstRow = rows[0];
15
+ const lastRow = rows[rows.length - 1];
16
+ if (!firstRow || !lastRow) return {
17
+ status: "idle",
18
+ forwarded: 0,
19
+ lastEventId
20
+ };
21
+ const nextEventId = lastRow.id;
22
+ const payload = buildPayload(rows, firstRow.id, nextEventId);
23
+ try {
24
+ if (!await options.observe.tryEmit({
25
+ eventType: "memory.telemetry",
26
+ payload
27
+ })) return {
28
+ status: "failed",
29
+ forwarded: 0,
30
+ lastEventId
31
+ };
32
+ writeWatermark(options.sqlite, sink, nextEventId, options.nowMs ?? Date.now());
33
+ return {
34
+ status: "forwarded",
35
+ forwarded: rows.length,
36
+ lastEventId: nextEventId
37
+ };
38
+ } catch {
39
+ return {
40
+ status: "failed",
41
+ forwarded: 0,
42
+ lastEventId
43
+ };
44
+ }
45
+ }
46
+ function readWatermark(sqlite, sink) {
47
+ const row = sqlite.prepare("SELECT last_event_id FROM nodix_memory_telemetry_sync_state WHERE sink = ?").get(sink);
48
+ return typeof row?.last_event_id === "number" ? row.last_event_id : 0;
49
+ }
50
+ function readRows(sqlite, lastEventId, batchSize) {
51
+ return sqlite.prepare(`SELECT id, event_type, fact_id, memory_kind, timestamp_ms, session_uuid, turn_id,
52
+ agent_id, project_id, content_hash, retrieval_rank, retrieval_score,
53
+ consolidation_epoch_id, metadata_json
54
+ FROM nodix_memory_events
55
+ WHERE id > ?
56
+ ORDER BY id ASC
57
+ LIMIT ?`).all(lastEventId, batchSize);
58
+ }
59
+ function buildPayload(rows, firstEventId, lastEventId) {
60
+ const eventTypes = {};
61
+ const events = rows.map((row) => {
62
+ const eventType = parseEventType(row.event_type);
63
+ eventTypes[eventType] = typeof eventTypes[eventType] === "number" ? eventTypes[eventType] + 1 : 1;
64
+ return sanitizeEvent(row, eventType);
65
+ });
66
+ return {
67
+ sync_kind: "memory_events",
68
+ first_event_id: firstEventId,
69
+ last_event_id: lastEventId,
70
+ event_count: events.length,
71
+ event_types: eventTypes,
72
+ events
73
+ };
74
+ }
75
+ function sanitizeEvent(row, eventType) {
76
+ const event = {
77
+ event_id: row.id,
78
+ event_type: eventType,
79
+ timestamp_ms: row.timestamp_ms,
80
+ agent_id: row.agent_id
81
+ };
82
+ addString(event, "fact_id", row.fact_id);
83
+ addString(event, "memory_kind", row.memory_kind);
84
+ addString(event, "session_uuid", row.session_uuid);
85
+ addString(event, "turn_id", row.turn_id);
86
+ addString(event, "project_id", row.project_id);
87
+ addString(event, "content_hash", row.content_hash);
88
+ addNumber(event, "retrieval_rank", row.retrieval_rank);
89
+ addNumber(event, "retrieval_score", row.retrieval_score);
90
+ addString(event, "consolidation_epoch_id", row.consolidation_epoch_id);
91
+ addString(event, "status", readMetadataString(row.metadata_json, "status"));
92
+ if (eventType === "inject") addString(event, "source_agent_id", readMetadataString(row.metadata_json, "source_agent_id"));
93
+ return event;
94
+ }
95
+ function readMetadataString(metadataJson, key) {
96
+ if (!metadataJson) return null;
97
+ try {
98
+ const parsed = JSON.parse(metadataJson);
99
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) return null;
100
+ const value = parsed[key];
101
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
102
+ } catch {
103
+ return null;
104
+ }
105
+ }
106
+ function writeWatermark(sqlite, sink, lastEventId, updatedAtMs) {
107
+ sqlite.prepare(`INSERT INTO nodix_memory_telemetry_sync_state (sink, last_event_id, updated_at_ms)
108
+ VALUES (?, ?, ?)
109
+ ON CONFLICT(sink) DO UPDATE SET
110
+ last_event_id = excluded.last_event_id,
111
+ updated_at_ms = excluded.updated_at_ms
112
+ WHERE excluded.last_event_id > nodix_memory_telemetry_sync_state.last_event_id`).run(sink, lastEventId, updatedAtMs);
113
+ }
114
+ function parseEventType(value) {
115
+ if (isMemoryTelemetryEventType(value)) return value;
116
+ throw new Error(`unknown memory telemetry event type: ${value}`);
117
+ }
118
+ function normalizeSink(value) {
119
+ if (typeof value === "string" && value.trim().length > 0) return value.trim();
120
+ return DEFAULT_SINK;
121
+ }
122
+ function normalizeBatchSize(value) {
123
+ if (!Number.isFinite(value)) return MAX_BATCH_SIZE;
124
+ return Math.max(1, Math.min(MAX_BATCH_SIZE, Math.floor(Number(value))));
125
+ }
126
+ function addString(target, key, value) {
127
+ if (typeof value === "string" && value.trim().length > 0) target[key] = value.trim();
128
+ }
129
+ function addNumber(target, key, value) {
130
+ if (typeof value === "number" && Number.isFinite(value)) target[key] = value;
131
+ }
132
+ //#endregion
133
+ export { forwardMemoryTelemetryToObserve };
@@ -0,0 +1,2 @@
1
+ import { a as MemoryTelemetryUsageSummary, i as MemoryTelemetryUsageOutboxOptions, n as MemoryTelemetryUsageInput, r as MemoryTelemetryUsageOutbox, t as MemoryTelemetryFlushResult } from "../../../memory-telemetry-outbox-ddTdImt7.js";
2
+ export { MemoryTelemetryFlushResult, MemoryTelemetryUsageInput, MemoryTelemetryUsageOutbox, MemoryTelemetryUsageOutboxOptions, MemoryTelemetryUsageSummary };
@@ -0,0 +1,443 @@
1
+ import "../../../signed-registry-constants-yq3DlG3B.js";
2
+ import { t as validateMemoryTelemetryMetadata } from "../../../memory-telemetry-metadata-CA7W8tK6.js";
3
+ import { t as recordMemoryTelemetryIncident } from "../../../memory-telemetry-incidents-BWA9kcZx.js";
4
+ import { createLogger, privateLogReference } from "@snoai/utils/logger";
5
+ //#region src/engine/telemetry/memory-telemetry-outbox.ts
6
+ const DEFAULT_USAGE_OUTBOX_BATCH_SIZE = 50;
7
+ const USAGE_OUTBOX_CLAIM_LEASE_MS = 6e4;
8
+ const activeFlushes = /* @__PURE__ */ new Map();
9
+ const log = createLogger("sno-station-mem:usage-outbox");
10
+ var MemoryTelemetryUsageOutbox = class {
11
+ sqlite;
12
+ dbPath;
13
+ agentId;
14
+ batchSize;
15
+ insertUsageStatement;
16
+ constructor(options) {
17
+ this.sqlite = options.sqlite;
18
+ this.dbPath = options.dbPath;
19
+ this.agentId = options.agentId ?? "sno-mem-claw";
20
+ this.batchSize = options.batchSize ?? DEFAULT_USAGE_OUTBOX_BATCH_SIZE;
21
+ this.insertUsageStatement = this.sqlite.prepare(`INSERT INTO nodix_memory_usage_outbox
22
+ (event_type, payload_json, accepted_at_ms, status, attempt_count)
23
+ VALUES (?, ?, ?, 'pending', 0)`);
24
+ }
25
+ acceptUsage(input) {
26
+ const payload = normalizeUsageInput(input, this.agentId);
27
+ this.insertUsageStatement.run(payload.event_type, JSON.stringify(payload), Date.now());
28
+ }
29
+ tryAcceptUsage(input) {
30
+ try {
31
+ this.acceptUsage(input);
32
+ return true;
33
+ } catch (error) {
34
+ let incidentPersisted = false;
35
+ try {
36
+ recordMemoryTelemetryIncident(this.sqlite, {
37
+ incidentType: "memory_usage_outbox_accept_failed",
38
+ severity: "error",
39
+ message: "memory telemetry usage accept failed",
40
+ payload: {
41
+ event_type: input.eventType,
42
+ fact_id: input.factId,
43
+ error_code: "usage_accept_failed",
44
+ retry_state: "not_counted"
45
+ }
46
+ });
47
+ incidentPersisted = true;
48
+ } catch {}
49
+ log.warn("Memory usage queue acceptance failed", {
50
+ outcome: "failed",
51
+ error,
52
+ accepted_count: 0,
53
+ incident_persisted: incidentPersisted,
54
+ memory_id: input.factId,
55
+ operation: input.eventType,
56
+ store_reference: privateLogReference(this.dbPath)
57
+ }, {
58
+ event_name: "memory.usage.accept.failed",
59
+ file: "packages/memory/src/engine/telemetry/memory-telemetry-outbox.ts",
60
+ function: "MemoryTelemetryUsageOutbox.tryAcceptUsage",
61
+ site_id: "memory.usage.accept.failed"
62
+ });
63
+ return false;
64
+ }
65
+ }
66
+ usageSummary(factId) {
67
+ const committedRecall = this.countCommitted(factId, "recall");
68
+ const committedInject = this.countCommitted(factId, "inject");
69
+ const pendingRecall = this.countPending(factId, "recall");
70
+ const pendingInject = this.countPending(factId, "inject");
71
+ return {
72
+ recall: committedRecall + pendingRecall,
73
+ inject: committedInject + pendingInject,
74
+ pendingRecall,
75
+ pendingInject,
76
+ committedRecall,
77
+ committedInject
78
+ };
79
+ }
80
+ flushPending(batchSize = this.batchSize) {
81
+ const started = performance.now();
82
+ let rows;
83
+ try {
84
+ rows = this.claimFlushRows(batchSize);
85
+ } catch (error) {
86
+ log.warn("Memory usage queue claim failed", {
87
+ error,
88
+ outcome: "failed",
89
+ committed_count: 0,
90
+ duration_ms: performance.now() - started,
91
+ store_reference: privateLogReference(this.dbPath)
92
+ }, {
93
+ event_name: "memory.usage.flush.failed",
94
+ file: "packages/memory/src/engine/telemetry/memory-telemetry-outbox.ts",
95
+ function: "MemoryTelemetryUsageOutbox.flushPending",
96
+ site_id: "memory.usage.flush.claim_failed"
97
+ });
98
+ throw error;
99
+ }
100
+ if (rows.length === 0) {
101
+ log.debug("Memory usage queue has no pending rows", {
102
+ outcome: "empty_success",
103
+ selected_count: 0,
104
+ committed_count: 0,
105
+ duration_ms: performance.now() - started
106
+ }, {
107
+ event_name: "memory.usage.flush.completed",
108
+ file: "packages/memory/src/engine/telemetry/memory-telemetry-outbox.ts",
109
+ function: "MemoryTelemetryUsageOutbox.flushPending",
110
+ site_id: "memory.usage.flush.empty"
111
+ });
112
+ return {
113
+ selected: 0,
114
+ inserted: 0,
115
+ deleted: 0,
116
+ failed: 0
117
+ };
118
+ }
119
+ let inserted = 0;
120
+ let deleted = 0;
121
+ let failed = 0;
122
+ const quarantined = [];
123
+ let failingRow;
124
+ try {
125
+ this.sqlite.transaction(() => {
126
+ for (const row of rows) try {
127
+ const payload = this.parseValidatedPayload(row);
128
+ if (this.deleteClaimedRow(row) !== 1) continue;
129
+ this.insertEvent(row, payload);
130
+ deleted += 1;
131
+ inserted += 1;
132
+ } catch (error) {
133
+ if (error instanceof PermanentUsageOutboxRowError) {
134
+ const message = safeErrorMessage(error);
135
+ if (this.quarantineClaimedRow(row, message) === 1) {
136
+ failed += 1;
137
+ quarantined.push({
138
+ row,
139
+ message
140
+ });
141
+ }
142
+ continue;
143
+ }
144
+ failingRow = row;
145
+ throw error;
146
+ }
147
+ }).immediate();
148
+ } catch (error) {
149
+ inserted = 0;
150
+ deleted = 0;
151
+ failed = 0;
152
+ log.warn("Memory usage queue flush rolled back", {
153
+ error,
154
+ outcome: "failed",
155
+ selected_count: rows.length,
156
+ committed_count: 0,
157
+ deleted_count: 0,
158
+ quarantined_count: 0,
159
+ duration_ms: performance.now() - started,
160
+ store_reference: privateLogReference(this.dbPath)
161
+ }, {
162
+ event_name: "memory.usage.flush.failed",
163
+ file: "packages/memory/src/engine/telemetry/memory-telemetry-outbox.ts",
164
+ function: "MemoryTelemetryUsageOutbox.flushPending",
165
+ site_id: "memory.usage.flush.rollback"
166
+ });
167
+ if (failingRow) this.markRowsFailed([failingRow], safeErrorMessage(error));
168
+ throw error;
169
+ }
170
+ for (const entry of quarantined) this.recordQuarantineIncident(entry.row, entry.message);
171
+ log.info("Memory usage queue flush completed", {
172
+ outcome: failed > 0 ? "partial" : "success",
173
+ selected_count: rows.length,
174
+ committed_count: inserted,
175
+ deleted_count: deleted,
176
+ quarantined_count: failed,
177
+ duration_ms: performance.now() - started,
178
+ store_reference: privateLogReference(this.dbPath)
179
+ }, {
180
+ event_name: "memory.usage.flush.completed",
181
+ file: "packages/memory/src/engine/telemetry/memory-telemetry-outbox.ts",
182
+ function: "MemoryTelemetryUsageOutbox.flushPending",
183
+ site_id: "memory.usage.flush.completed"
184
+ });
185
+ return {
186
+ selected: rows.length,
187
+ inserted,
188
+ deleted,
189
+ failed
190
+ };
191
+ }
192
+ /**
193
+ * Bounded catch-up drain: flush batches until a pass claims zero rows or the
194
+ * time budget is exhausted. Used by the hourly maintenance tick and shutdown so
195
+ * a historical backlog drains across passes without monopolizing the writer.
196
+ */
197
+ drainPending(budgetMs = 3e4) {
198
+ const startedAt = Date.now();
199
+ const totals = {
200
+ selected: 0,
201
+ inserted: 0,
202
+ deleted: 0,
203
+ failed: 0
204
+ };
205
+ while (Date.now() - startedAt < budgetMs) {
206
+ const pass = this.flushPending();
207
+ totals.selected += pass.selected;
208
+ totals.inserted += pass.inserted;
209
+ totals.deleted += pass.deleted;
210
+ totals.failed += pass.failed;
211
+ if (pass.selected === 0) break;
212
+ }
213
+ return totals;
214
+ }
215
+ /**
216
+ * Deletes quarantined rows older than the cutoff. Portable batched shape
217
+ * (`DELETE ... LIMIT` is a compile-option extension — never assume it).
218
+ */
219
+ pruneQuarantined(cutoffMs) {
220
+ let pruned = 0;
221
+ while (true) {
222
+ const changes = this.sqlite.prepare(`DELETE FROM nodix_memory_usage_outbox
223
+ WHERE id IN (
224
+ SELECT id FROM nodix_memory_usage_outbox
225
+ WHERE status = 'quarantined' AND accepted_at_ms < ?
226
+ LIMIT 5000
227
+ )`).run(cutoffMs).changes ?? 0;
228
+ pruned += changes;
229
+ if (changes === 0) break;
230
+ }
231
+ return pruned;
232
+ }
233
+ flushPendingAsync(batchSize = this.batchSize) {
234
+ const active = activeFlushes.get(this.dbPath);
235
+ if (active) return active;
236
+ const promise = Promise.resolve().then(() => this.flushPending(batchSize)).finally(() => {
237
+ if (activeFlushes.get(this.dbPath) === promise) activeFlushes.delete(this.dbPath);
238
+ });
239
+ activeFlushes.set(this.dbPath, promise);
240
+ return promise;
241
+ }
242
+ countCommitted(factId, eventType) {
243
+ return this.sqlite.prepare("SELECT COUNT(*) AS count FROM nodix_memory_events WHERE fact_id = ? AND event_type = ?").get(factId, eventType).count;
244
+ }
245
+ countPending(factId, eventType) {
246
+ return this.sqlite.prepare(`SELECT COUNT(*) AS count
247
+ FROM nodix_memory_usage_outbox
248
+ WHERE event_type = ?
249
+ AND status IN ('pending', 'failed', 'flushing')
250
+ AND json_extract(payload_json, '$.fact_id') = ?`).get(eventType, factId).count;
251
+ }
252
+ claimFlushRows(batchSize) {
253
+ const now = Date.now();
254
+ const claimExpiresAt = now + USAGE_OUTBOX_CLAIM_LEASE_MS;
255
+ return this.sqlite.transaction(() => {
256
+ const candidates = this.readFlushCandidates(batchSize, now);
257
+ const claimed = [];
258
+ for (const row of candidates) if (this.claimRow(row.id, now, claimExpiresAt) === 1) claimed.push({
259
+ ...row,
260
+ claim_expires_at_ms: claimExpiresAt
261
+ });
262
+ return claimed;
263
+ }).immediate();
264
+ }
265
+ readFlushCandidates(batchSize, now) {
266
+ return this.sqlite.prepare(`SELECT id, event_type, payload_json, accepted_at_ms, status
267
+ FROM nodix_memory_usage_outbox
268
+ WHERE (
269
+ status IN ('pending', 'failed')
270
+ AND (next_attempt_ms IS NULL OR next_attempt_ms <= ?)
271
+ )
272
+ OR (
273
+ status = 'flushing'
274
+ AND next_attempt_ms IS NOT NULL
275
+ AND next_attempt_ms <= ?
276
+ )
277
+ ORDER BY id ASC
278
+ LIMIT ?`).all(now, now, batchSize);
279
+ }
280
+ claimRow(id, now, claimExpiresAt) {
281
+ return this.sqlite.prepare(`UPDATE nodix_memory_usage_outbox
282
+ SET status = 'flushing',
283
+ last_error = NULL,
284
+ next_attempt_ms = ?
285
+ WHERE id = ?
286
+ AND (
287
+ (
288
+ status IN ('pending', 'failed')
289
+ AND (next_attempt_ms IS NULL OR next_attempt_ms <= ?)
290
+ )
291
+ OR (
292
+ status = 'flushing'
293
+ AND next_attempt_ms IS NOT NULL
294
+ AND next_attempt_ms <= ?
295
+ )
296
+ )`).run(claimExpiresAt, id, now, now).changes ?? 0;
297
+ }
298
+ /** Parses and validates a claimed row; throws PermanentUsageOutboxRowError on bad payloads. */
299
+ parseValidatedPayload(row) {
300
+ const payload = parseUsagePayload(row);
301
+ try {
302
+ return {
303
+ ...payload,
304
+ metadata_json: validateMemoryTelemetryMetadata(payload.event_type, payload.metadata_json)
305
+ };
306
+ } catch (error) {
307
+ if (error instanceof PermanentUsageOutboxRowError) throw error;
308
+ throw new PermanentUsageOutboxRowError(`nodix_memory_usage_outbox row ${row.id} has invalid metadata_json: ${safeErrorMessage(error)}`);
309
+ }
310
+ }
311
+ insertEvent(row, payload) {
312
+ const metadata = payload.metadata_json;
313
+ this.sqlite.prepare(`INSERT INTO nodix_memory_events
314
+ (event_type, fact_id, memory_kind, timestamp_ms, agent_id, project_id,
315
+ session_uuid, turn_id, retrieval_rank, retrieval_score, metadata_json)
316
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(payload.event_type, payload.fact_id, payload.memory_kind, row.accepted_at_ms, payload.agent_id ?? this.agentId, payload.project_id, payload.session_uuid, payload.turn_id, payload.retrieval_rank, payload.retrieval_score, JSON.stringify(metadata));
317
+ }
318
+ deleteClaimedRow(row) {
319
+ return this.sqlite.prepare(`DELETE FROM nodix_memory_usage_outbox
320
+ WHERE id = ?
321
+ AND status = 'flushing'
322
+ AND next_attempt_ms = ?`).run(row.id, row.claim_expires_at_ms).changes ?? 0;
323
+ }
324
+ markRowsFailed(rows, lastError) {
325
+ let changed = 0;
326
+ for (const row of rows) {
327
+ const result = this.sqlite.prepare(`UPDATE nodix_memory_usage_outbox
328
+ SET status = 'failed',
329
+ attempt_count = attempt_count + 1,
330
+ last_error = ?,
331
+ next_attempt_ms = NULL
332
+ WHERE id = ?
333
+ AND status = 'flushing'
334
+ AND next_attempt_ms = ?`).run(lastError, row.id, row.claim_expires_at_ms);
335
+ changed += result.changes ?? 0;
336
+ }
337
+ return changed;
338
+ }
339
+ quarantineClaimedRow(row, lastError) {
340
+ return this.sqlite.prepare(`UPDATE nodix_memory_usage_outbox
341
+ SET status = 'quarantined',
342
+ attempt_count = attempt_count + 1,
343
+ last_error = ?,
344
+ next_attempt_ms = NULL
345
+ WHERE id = ?
346
+ AND status = 'flushing'
347
+ AND next_attempt_ms = ?`).run(lastError, row.id, row.claim_expires_at_ms).changes ?? 0;
348
+ }
349
+ recordQuarantineIncident(row, lastError) {
350
+ try {
351
+ recordMemoryTelemetryIncident(this.sqlite, {
352
+ incidentType: "memory_usage_outbox_quarantined",
353
+ severity: "error",
354
+ message: "memory telemetry usage outbox row quarantined",
355
+ payload: {
356
+ row_id: row.id,
357
+ event_type: row.event_type,
358
+ error_code: "usage_outbox_invalid_payload",
359
+ retry_state: "quarantined",
360
+ last_error: lastError
361
+ }
362
+ });
363
+ } catch {}
364
+ }
365
+ };
366
+ function normalizeUsageInput(input, defaultAgentId) {
367
+ if (input.eventType !== "recall" && input.eventType !== "inject") throw new Error(`Unsupported memory telemetry usage event type: ${String(input.eventType)}`);
368
+ if (input.factId.trim().length === 0) throw new Error("memory telemetry usage requires factId");
369
+ if (input.memoryKind.trim().length === 0) throw new Error("memory telemetry usage requires memoryKind");
370
+ if (input.projectId.trim().length === 0) throw new Error("memory telemetry usage requires projectId");
371
+ const metadata = validateMemoryTelemetryMetadata(input.eventType, input.metadata);
372
+ return {
373
+ event_type: input.eventType,
374
+ fact_id: input.factId,
375
+ memory_kind: input.memoryKind,
376
+ project_id: input.projectId,
377
+ agent_id: input.agentId ?? defaultAgentId,
378
+ session_uuid: input.sessionUuid ?? null,
379
+ turn_id: input.turnId ?? null,
380
+ retrieval_rank: input.retrievalRank ?? null,
381
+ retrieval_score: input.retrievalScore ?? null,
382
+ metadata_json: metadata
383
+ };
384
+ }
385
+ function parseUsagePayload(row) {
386
+ let parsed;
387
+ try {
388
+ parsed = JSON.parse(row.payload_json);
389
+ } catch (error) {
390
+ throw new PermanentUsageOutboxRowError(`nodix_memory_usage_outbox row ${row.id} has invalid payload_json: ${safeErrorMessage(error)}`);
391
+ }
392
+ if (!isRecord(parsed)) throw new PermanentUsageOutboxRowError(`nodix_memory_usage_outbox row ${row.id} has invalid payload`);
393
+ if (parsed.event_type !== row.event_type) throw new PermanentUsageOutboxRowError(`nodix_memory_usage_outbox row ${row.id} event type drifted`);
394
+ return {
395
+ event_type: parseUsageEventType(parsed.event_type, row.id),
396
+ fact_id: parseRequiredString(parsed.fact_id, "fact_id", row.id),
397
+ memory_kind: parseRequiredString(parsed.memory_kind, "memory_kind", row.id),
398
+ project_id: parseRequiredString(parsed.project_id, "project_id", row.id),
399
+ agent_id: parseNullableString(parsed.agent_id, "agent_id", row.id),
400
+ session_uuid: parseNullableString(parsed.session_uuid, "session_uuid", row.id),
401
+ turn_id: parseNullableString(parsed.turn_id, "turn_id", row.id),
402
+ retrieval_rank: parseNullableNumber(parsed.retrieval_rank, "retrieval_rank", row.id),
403
+ retrieval_score: parseNullableNumber(parsed.retrieval_score, "retrieval_score", row.id),
404
+ metadata_json: parseMetadata(parsed.metadata_json, row.id)
405
+ };
406
+ }
407
+ function parseUsageEventType(value, rowId) {
408
+ if (value === "recall" || value === "inject") return value;
409
+ throw new PermanentUsageOutboxRowError(`nodix_memory_usage_outbox row ${rowId} has invalid event_type`);
410
+ }
411
+ function parseRequiredString(value, field, rowId) {
412
+ if (typeof value === "string" && value.trim().length > 0) return value;
413
+ throw new PermanentUsageOutboxRowError(`nodix_memory_usage_outbox row ${rowId} has invalid ${field}`);
414
+ }
415
+ function parseNullableString(value, field, rowId) {
416
+ if (value === null) return null;
417
+ if (typeof value === "string") return value;
418
+ throw new PermanentUsageOutboxRowError(`nodix_memory_usage_outbox row ${rowId} has invalid ${field}`);
419
+ }
420
+ function parseNullableNumber(value, field, rowId) {
421
+ if (value === null) return null;
422
+ if (typeof value === "number" && Number.isFinite(value)) return value;
423
+ throw new PermanentUsageOutboxRowError(`nodix_memory_usage_outbox row ${rowId} has invalid ${field}`);
424
+ }
425
+ function parseMetadata(value, rowId) {
426
+ if (isRecord(value)) return value;
427
+ throw new PermanentUsageOutboxRowError(`nodix_memory_usage_outbox row ${rowId} has invalid metadata_json`);
428
+ }
429
+ var PermanentUsageOutboxRowError = class extends Error {
430
+ constructor(message) {
431
+ super(message);
432
+ this.name = "PermanentUsageOutboxRowError";
433
+ }
434
+ };
435
+ function isRecord(value) {
436
+ return typeof value === "object" && value !== null && !Array.isArray(value);
437
+ }
438
+ function safeErrorMessage(error) {
439
+ if (error instanceof Error && error.message.trim().length > 0) return error.message.slice(0, 500);
440
+ return "memory telemetry usage flush failed";
441
+ }
442
+ //#endregion
443
+ export { MemoryTelemetryUsageOutbox };
@@ -0,0 +1,2 @@
1
+ import { a as MemoryTelemetryMetadata, i as MemoryTelemetryEventType, n as MEMORY_TELEMETRY_EVENT_TYPES, o as MemoryTelemetryReceiptStatus, r as MemoryTelemetryDeleteReason, s as isMemoryTelemetryEventType, t as MEMORY_TELEMETRY_DELETE_REASONS } from "../../../memory-telemetry-types-CufVmrCs.js";
2
+ export { MEMORY_TELEMETRY_DELETE_REASONS, MEMORY_TELEMETRY_EVENT_TYPES, MemoryTelemetryDeleteReason, MemoryTelemetryEventType, MemoryTelemetryMetadata, MemoryTelemetryReceiptStatus, isMemoryTelemetryEventType };
@@ -0,0 +1,21 @@
1
+ //#region src/engine/telemetry/memory-telemetry-types.ts
2
+ const MEMORY_TELEMETRY_EVENT_TYPES = [
3
+ "create",
4
+ "update",
5
+ "recall",
6
+ "supersede",
7
+ "delete",
8
+ "inject",
9
+ "epoch_boundary",
10
+ "purge"
11
+ ];
12
+ const MEMORY_TELEMETRY_DELETE_REASONS = {
13
+ admin: "admin_delete",
14
+ cli: "cli_delete",
15
+ memoryForget: "memory_forget"
16
+ };
17
+ function isMemoryTelemetryEventType(value) {
18
+ return typeof value === "string" && MEMORY_TELEMETRY_EVENT_TYPES.includes(value);
19
+ }
20
+ //#endregion
21
+ export { MEMORY_TELEMETRY_DELETE_REASONS, MEMORY_TELEMETRY_EVENT_TYPES, isMemoryTelemetryEventType };
@@ -0,0 +1,30 @@
1
+ import { t as ObserveLogger } from "../../../best-effort-BPZSzKk0.js";
2
+ import { t as EmitInput } from "../../../adapter-DMEmCTKo.js";
3
+ import { EventLane, EventType, JsonObject } from "@snoai/observability";
4
+ //#region src/engine/telemetry/observe-ledger.d.ts
5
+ export interface ObserveLedgerRow {
6
+ ts_ms: number;
7
+ event_type: EventType;
8
+ lane: EventLane;
9
+ project_id?: string;
10
+ payload: JsonObject;
11
+ }
12
+ interface LedgerObserve {
13
+ tryEmit(input: EmitInput): boolean | Promise<boolean>;
14
+ emitError?(kind: string, error: unknown): void | Promise<void>;
15
+ readonly logger?: ObserveLogger | undefined;
16
+ }
17
+ interface ForwardResult {
18
+ status: "idle" | "forwarded" | "failed";
19
+ forwarded: number;
20
+ offset: number;
21
+ }
22
+ export declare function observeLedgerPath(profileDir: string): string;
23
+ export declare function observeLedgerSyncedPath(profileDir: string): string;
24
+ export declare function appendObserveLedgerRows(profileDir: string, rows: readonly ObserveLedgerRow[]): void;
25
+ export declare function forwardObserveLedger(options: {
26
+ profileDir: string;
27
+ observe: LedgerObserve;
28
+ batchSize?: number;
29
+ }): Promise<ForwardResult>;
30
+ //#endregion