@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,729 @@
1
+ import { $ as appendAuditEntryStrict, r as enumerateRemCandidateScopes, tt as getAuditPath } from "./rem-batch-executor-Cbm5gfSe.js";
2
+ import { f as getRemDiscoveryPath, l as REM_SIDECAR_TOKEN_HEADER, o as REM_RUN_PATH, r as REM_CORRELATION_ID_HEADER, s as REM_SIDECAR_HOST } from "./config-tSrvLXgV.js";
3
+ import { createLogger } from "@snoai/utils/logger";
4
+ import path from "node:path";
5
+ import { z } from "zod";
6
+ import { createHash, randomUUID } from "node:crypto";
7
+ import { mkdir, open, readFile, rename, rm } from "node:fs/promises";
8
+ import { withLogContext as withLogContext$1 } from "@snoai/utils/log-context";
9
+ //#region src/contract/error.ts
10
+ const DEGRADED_REASONS = [
11
+ "sidecar-unreachable",
12
+ "sidecar-unresponsive",
13
+ "principal-mismatch",
14
+ "store-mismatch",
15
+ "no-agent-endpoint",
16
+ "invalid-input",
17
+ "timeout",
18
+ "storage-unavailable",
19
+ "engine-failed"
20
+ ];
21
+ var ContractError = class extends Error {
22
+ reason;
23
+ degraded = true;
24
+ constructor(reason, message = reason) {
25
+ super(message);
26
+ this.reason = reason;
27
+ this.name = "ContractError";
28
+ }
29
+ };
30
+ //#endregion
31
+ //#region src/sidecar/rem-trigger-state.ts
32
+ /** @file rem-trigger-state.ts
33
+ * @purpose Persists the automatic REM scheduler's strict per-scope state.
34
+ * @boundary One atomically replaced JSON file under the sno-station-mem state directory.
35
+ */
36
+ const remTriggerScopeStateSchema = z.object({
37
+ last_pass_at: z.string().datetime(),
38
+ schedule_zone: z.string().min(1).refine(isValidScheduleZone, "invalid IANA time zone"),
39
+ last_covered_count: z.number().int().nonnegative(),
40
+ last_volume_pass_date: z.string().regex(/^\d{4}-\d{2}-\d{2}$/u).nullable(),
41
+ missed_window: z.object({
42
+ due_at: z.string().datetime(),
43
+ trigger: z.enum(["daily", "volume"]),
44
+ recorded_at: z.string().datetime()
45
+ }).strict().nullable().default(null),
46
+ attempts: z.object({
47
+ identity: z.string().min(1).nullable(),
48
+ count: z.number().int().min(0).max(3)
49
+ }).strict()
50
+ }).strict();
51
+ const remTriggerStateDocumentSchema = z.object({
52
+ version: z.literal(1),
53
+ scopes: z.record(z.string().min(1), remTriggerScopeStateSchema)
54
+ }).strict();
55
+ var RemTriggerStateError = class extends Error {
56
+ statePath;
57
+ constructor(statePath, cause) {
58
+ super(`REM trigger state at ${statePath} is invalid or unreadable: ${errorMessage$1(cause)}`, { cause: cause instanceof Error ? cause : void 0 });
59
+ this.statePath = statePath;
60
+ this.name = "RemTriggerStateError";
61
+ }
62
+ };
63
+ function remTriggerStatePath(stateDir) {
64
+ return path.join(stateDir, "rem-trigger-state.json");
65
+ }
66
+ async function loadRemTriggerState(stateDir) {
67
+ const statePath = remTriggerStatePath(stateDir);
68
+ let raw;
69
+ try {
70
+ raw = await readFile(statePath, "utf8");
71
+ } catch (error) {
72
+ if (isNodeError$1(error) && error.code === "ENOENT") return {
73
+ version: 1,
74
+ scopes: {}
75
+ };
76
+ throw new RemTriggerStateError(statePath, error);
77
+ }
78
+ try {
79
+ return remTriggerStateDocumentSchema.parse(JSON.parse(raw));
80
+ } catch (error) {
81
+ throw new RemTriggerStateError(statePath, error);
82
+ }
83
+ }
84
+ function ensureRemTriggerScope(state, input) {
85
+ const existing = state.scopes[input.scope];
86
+ if (existing !== void 0) return {
87
+ state,
88
+ scopeState: existing,
89
+ initialized: false
90
+ };
91
+ if (input.scope.trim().length === 0) throw new Error("REM trigger scope is required");
92
+ if (!Number.isInteger(input.candidateCount) || input.candidateCount < 0) throw new Error("REM trigger candidate count must be a nonnegative integer");
93
+ if (Number.isNaN(input.now.getTime())) throw new Error("REM trigger initialization time is invalid");
94
+ const scheduleZone = (input.resolveScheduleZone ?? resolveHostScheduleZone)();
95
+ if (!isValidScheduleZone(scheduleZone)) throw new Error(`invalid REM schedule zone: ${scheduleZone}`);
96
+ const scopeState = {
97
+ last_pass_at: input.now.toISOString(),
98
+ schedule_zone: scheduleZone,
99
+ last_covered_count: input.candidateCount,
100
+ last_volume_pass_date: null,
101
+ missed_window: null,
102
+ attempts: {
103
+ identity: null,
104
+ count: 0
105
+ }
106
+ };
107
+ return {
108
+ state: {
109
+ version: 1,
110
+ scopes: {
111
+ ...state.scopes,
112
+ [input.scope]: scopeState
113
+ }
114
+ },
115
+ scopeState,
116
+ initialized: true
117
+ };
118
+ }
119
+ async function writeRemTriggerStateAtomic$1(stateDir, state) {
120
+ const validated = remTriggerStateDocumentSchema.parse(state);
121
+ await mkdir(stateDir, {
122
+ recursive: true,
123
+ mode: 448
124
+ });
125
+ const statePath = remTriggerStatePath(stateDir);
126
+ const temporaryPath = `${statePath}.${process.pid}.${randomUUID()}.tmp`;
127
+ try {
128
+ const handle = await open(temporaryPath, "wx", 384);
129
+ try {
130
+ await handle.writeFile(JSON.stringify(validated), "utf8");
131
+ await handle.sync();
132
+ } finally {
133
+ await handle.close();
134
+ }
135
+ await rename(temporaryPath, statePath);
136
+ await syncDirectory(stateDir);
137
+ } catch (error) {
138
+ await rm(temporaryPath, { force: true });
139
+ throw error;
140
+ }
141
+ }
142
+ function resolveHostScheduleZone() {
143
+ return Intl.DateTimeFormat().resolvedOptions().timeZone;
144
+ }
145
+ function isValidScheduleZone(value) {
146
+ if (value.trim().length === 0) return false;
147
+ try {
148
+ new Intl.DateTimeFormat("en-US", { timeZone: value }).format(0);
149
+ return true;
150
+ } catch {
151
+ return false;
152
+ }
153
+ }
154
+ async function syncDirectory(directory) {
155
+ if (process.platform === "win32") return;
156
+ const handle = await open(directory, "r");
157
+ try {
158
+ await handle.sync();
159
+ } finally {
160
+ await handle.close();
161
+ }
162
+ }
163
+ function isNodeError$1(error) {
164
+ return error instanceof Error && "code" in error;
165
+ }
166
+ function errorMessage$1(error) {
167
+ return error instanceof Error ? error.message : String(error);
168
+ }
169
+ const REM_COMPLETION_AUDIT_TAIL_BYTES = 16777216;
170
+ const log = createLogger("sno-station-mem:rem-trigger");
171
+ function remNeedsHost(mode, modelCalls) {
172
+ return Object.keys(modelCalls).some((id) => id.startsWith("REM") && modelCalls[id][mode] === "host");
173
+ }
174
+ const discoverySchema = z.object({
175
+ pid: z.number().int().positive(),
176
+ port: z.number().int().min(1).max(65535),
177
+ token: z.string().min(1)
178
+ }).strict();
179
+ const idleEvaluations = /* @__PURE__ */ new Map();
180
+ async function evaluateRemAutomaticTriggers(input) {
181
+ const now = input.now ?? /* @__PURE__ */ new Date();
182
+ if (!Number.isInteger(input.volumeThreshold ?? 100) || (input.volumeThreshold ?? 100) < 1) throw new Error("REM volume threshold must be a positive integer");
183
+ const auditStateDir = input.auditStateDir ?? input.stateDir;
184
+ if (Number.isNaN(now.getTime())) throw new Error("REM trigger evaluation time is invalid");
185
+ if (input.requestedOperations.length === 0) {
186
+ await recordDecision(auditStateDir, void 0, "skipped", {
187
+ row: "automatic-trigger-skipped",
188
+ reason: "product-mode-disabled"
189
+ });
190
+ return {
191
+ evaluations: 0,
192
+ dispatches: 0
193
+ };
194
+ }
195
+ if (input.mode && remNeedsHost(input.mode, input.modelCalls) && !input.hasConnectedHost?.()) {
196
+ await recordDecision(auditStateDir, void 0, "skipped", {
197
+ row: "automatic-trigger-skipped",
198
+ reason: "skipped: no host model connected"
199
+ });
200
+ return {
201
+ evaluations: 0,
202
+ dispatches: 0
203
+ };
204
+ }
205
+ let scopes;
206
+ try {
207
+ scopes = enumerateRemCandidateScopes(input.database);
208
+ } catch (error) {
209
+ await recordDecision(auditStateDir, void 0, "error", {
210
+ row: "enumeration-failed",
211
+ cause: errorMessage(error)
212
+ });
213
+ return {
214
+ evaluations: 1,
215
+ dispatches: 0
216
+ };
217
+ }
218
+ if (scopes.length === 0) {
219
+ await recordDecision(auditStateDir, void 0, "ok", { row: "no-scopes" });
220
+ return {
221
+ evaluations: 1,
222
+ dispatches: 0
223
+ };
224
+ }
225
+ let state;
226
+ let lostState = false;
227
+ try {
228
+ state = await loadRemTriggerState(input.stateDir);
229
+ } catch (error) {
230
+ for (const { scope, candidateCount } of scopes) {
231
+ const consecutiveIdle = (idleEvaluations.get(scope) ?? 0) + 1;
232
+ idleEvaluations.set(scope, consecutiveIdle);
233
+ await recordDecision(auditStateDir, scope, "error", {
234
+ row: "state-unreadable",
235
+ candidate_count: candidateCount,
236
+ cause: errorMessage(error),
237
+ consecutive_idle: consecutiveIdle
238
+ });
239
+ }
240
+ log.error("REM trigger state unavailable; continuing with due work", { cause: errorMessage(error) }, {
241
+ event_name: "memory.rem.trigger.state.unavailable",
242
+ file: "packages/memory/src/sidecar/rem-trigger.ts",
243
+ function: "evaluateRemAutomaticTriggers",
244
+ site_id: "memory.rem.trigger.state.unavailable"
245
+ });
246
+ state = {
247
+ version: 1,
248
+ scopes: {}
249
+ };
250
+ lostState = true;
251
+ }
252
+ state = await applyCompletedBaselines(auditStateDir, input.stateDir, state);
253
+ let dispatches = 0;
254
+ for (const { scope, candidateCount } of scopes) try {
255
+ const ensured = ensureRemTriggerScope(state, {
256
+ scope,
257
+ now: lostState ? previousDay(now) : now,
258
+ candidateCount,
259
+ resolveScheduleZone: input.resolveScheduleZone
260
+ });
261
+ state = ensured.state;
262
+ if (ensured.initialized) await writeRemTriggerStateAtomic(input.stateDir, state);
263
+ const scopeResult = await evaluateScope(input, auditStateDir, state, scope, candidateCount, now);
264
+ state = scopeResult.state;
265
+ dispatches += scopeResult.dispatched ? 1 : 0;
266
+ } catch (error) {
267
+ log.error("REM automatic scope evaluation failed", {
268
+ scope,
269
+ error
270
+ }, {
271
+ event_name: "sno_station_mem.rem-trigger.rem.automatic.scope.evaluation.failed",
272
+ file: "packages/memory/src/sidecar/rem-trigger.ts",
273
+ function: "evaluateRemAutomaticTriggers",
274
+ site_id: "rem-trigger.evaluateRemAutomaticTriggers.1d59077a5c"
275
+ });
276
+ try {
277
+ await recordDecision(auditStateDir, scope, "error", {
278
+ row: "scope-evaluation-failed",
279
+ cause: errorMessage(error)
280
+ });
281
+ } catch (auditError) {
282
+ log.warn("REM automatic scope failure audit failed", {
283
+ scope,
284
+ error: auditError
285
+ }, {
286
+ event_name: "sno_station_mem.rem-trigger.rem.automatic.scope.failure.audit.failed",
287
+ file: "packages/memory/src/sidecar/rem-trigger.ts",
288
+ function: "evaluateRemAutomaticTriggers",
289
+ site_id: "rem-trigger.evaluateRemAutomaticTriggers.ebe1cdd204"
290
+ });
291
+ }
292
+ try {
293
+ state = await loadRemTriggerState(input.stateDir);
294
+ } catch (stateError) {
295
+ log.warn("REM automatic trigger state reload failed", {
296
+ scope,
297
+ error: stateError
298
+ }, {
299
+ event_name: "sno_station_mem.rem-trigger.rem.automatic.trigger.state.reload.failed",
300
+ file: "packages/memory/src/sidecar/rem-trigger.ts",
301
+ function: "evaluateRemAutomaticTriggers",
302
+ site_id: "rem-trigger.evaluateRemAutomaticTriggers.46669e66ff"
303
+ });
304
+ break;
305
+ }
306
+ }
307
+ return {
308
+ evaluations: scopes.length,
309
+ dispatches
310
+ };
311
+ }
312
+ function previousDay(now) {
313
+ const day = new Date(now);
314
+ day.setUTCDate(day.getUTCDate() - 1);
315
+ return day;
316
+ }
317
+ async function writeRemTriggerStateAtomic(stateDir, state) {
318
+ try {
319
+ await writeRemTriggerStateAtomic$1(stateDir, state);
320
+ } catch (error) {
321
+ log.error("REM trigger state write failed; continuing dispatch", { cause: errorMessage(error) }, {
322
+ event_name: "memory.rem.trigger.state.write.failed",
323
+ file: "packages/memory/src/sidecar/rem-trigger.ts",
324
+ function: "evaluateRemAutomaticTriggers",
325
+ site_id: "memory.rem.trigger.state.write.failed"
326
+ });
327
+ }
328
+ }
329
+ async function evaluateScope(input, auditStateDir, state, scope, candidateCount, now) {
330
+ const scopeState = requiredScopeState(state, scope);
331
+ const zone = scopeState.schedule_zone;
332
+ const nextDue = nextDailyDue(scopeState);
333
+ const localDate = localDateAt(now, zone);
334
+ const growth = candidateCount - scopeState.last_covered_count;
335
+ const scheduledDue = computeRemDailyDue(scopeState.last_pass_at, zone);
336
+ const pendingVolumeToday = scopeState.attempts.identity === remAutomaticCorrelationId("volume", scope, localDate);
337
+ const pendingDailyToday = localDateAt(scheduledDue, zone) === localDate && scopeState.attempts.identity === remAutomaticCorrelationId("daily", scope, scheduledDue.toISOString());
338
+ const dailyDue = now.getTime() >= nextDue.getTime() && !pendingVolumeToday;
339
+ const volumeDue = growth >= (input.volumeThreshold ?? 100) && scopeState.last_volume_pass_date !== localDate && !pendingDailyToday;
340
+ if (!dailyDue && !volumeDue) {
341
+ const consecutiveIdle = (idleEvaluations.get(scope) ?? 0) + 1;
342
+ idleEvaluations.set(scope, consecutiveIdle);
343
+ await recordDecision(auditStateDir, scope, "ok", {
344
+ row: "waiting-for-schedule",
345
+ next_due: nextDue.toISOString(),
346
+ milliseconds_until_due: Math.max(0, nextDue.getTime() - now.getTime()),
347
+ growth: growthDetails(candidateCount, scopeState.last_covered_count, input.volumeThreshold ?? 100),
348
+ consecutive_idle: consecutiveIdle
349
+ });
350
+ return {
351
+ state,
352
+ dispatched: false
353
+ };
354
+ }
355
+ const trigger = dailyDue ? "daily" : "volume";
356
+ if (input.tickEnabled === false) {
357
+ const nextState = replaceScopeState(state, scope, {
358
+ ...scopeState,
359
+ missed_window: {
360
+ due_at: dailyDue ? nextDue.toISOString() : now.toISOString(),
361
+ trigger,
362
+ recorded_at: now.toISOString()
363
+ }
364
+ });
365
+ await writeRemTriggerStateAtomic(input.stateDir, nextState);
366
+ return {
367
+ state: nextState,
368
+ dispatched: false
369
+ };
370
+ }
371
+ const correlationId = remAutomaticCorrelationId(trigger, scope, trigger === "daily" ? nextDue.toISOString() : localDate);
372
+ const priorAttempts = scopeState.attempts.identity === correlationId ? scopeState.attempts.count : 0;
373
+ await recordDecision(auditStateDir, scope, "ok", {
374
+ row: "dispatch",
375
+ trigger,
376
+ next_due: nextDue.toISOString(),
377
+ pass_at: now.toISOString(),
378
+ local_date: localDate,
379
+ growth: growthDetails(candidateCount, scopeState.last_covered_count, input.volumeThreshold ?? 100),
380
+ correlation_id: correlationId,
381
+ consecutive_idle: 0
382
+ });
383
+ idleEvaluations.set(scope, 0);
384
+ let nextState = replaceScopeState(state, scope, {
385
+ ...scopeState,
386
+ attempts: {
387
+ identity: correlationId,
388
+ count: Math.min(priorAttempts + 1, 3)
389
+ }
390
+ });
391
+ await writeRemTriggerStateAtomic(input.stateDir, nextState);
392
+ let cause;
393
+ try {
394
+ await dispatchRemWave(input, scope, correlationId);
395
+ } catch (error) {
396
+ cause = errorMessage(error);
397
+ }
398
+ if (cause === void 0) {
399
+ nextState = replaceScopeState(nextState, scope, {
400
+ ...requiredScopeState(nextState, scope),
401
+ missed_window: null
402
+ });
403
+ await writeRemTriggerStateAtomic(input.stateDir, nextState);
404
+ return {
405
+ state: nextState,
406
+ dispatched: true
407
+ };
408
+ }
409
+ await appendAuditEntryStrict(auditStateDir, {
410
+ event: "rem_failed",
411
+ resultStatus: "error",
412
+ scope,
413
+ details: {
414
+ outcome: "dispatch-failed",
415
+ cause,
416
+ correlation_id: correlationId,
417
+ source: "gateway-trigger"
418
+ }
419
+ });
420
+ return {
421
+ state: nextState,
422
+ dispatched: true
423
+ };
424
+ }
425
+ async function dispatchRemWave(input, scope, correlationId) {
426
+ const started = performance.now();
427
+ const discovery = discoverySchema.parse(JSON.parse(await readFile(input.discoveryPath ?? getRemDiscoveryPath(), "utf8")));
428
+ const response = await fetch(`http://${REM_SIDECAR_HOST}:${discovery.port}${REM_RUN_PATH}`, {
429
+ method: "POST",
430
+ headers: {
431
+ "content-type": "application/json",
432
+ [REM_SIDECAR_TOKEN_HEADER]: discovery.token,
433
+ [REM_CORRELATION_ID_HEADER]: correlationId
434
+ },
435
+ body: JSON.stringify({
436
+ types: input.requestedOperations,
437
+ scope
438
+ }),
439
+ signal: AbortSignal.timeout(input.dispatchTimeoutMs ?? 1e4)
440
+ });
441
+ if (response.status !== 202) throw new Error(`REM sidecar returned HTTP ${response.status}`);
442
+ const body = z.object({
443
+ job_id: z.string().min(1),
444
+ waveId: z.string().min(1)
445
+ }).passthrough().parse(await response.json());
446
+ if (body.job_id !== body.waveId) throw new Error("REM sidecar confirmation identities disagree");
447
+ withLogContext$1({
448
+ operation_id: body.job_id,
449
+ job_id: body.job_id,
450
+ session_reference: scope,
451
+ external_reference: correlationId
452
+ }, () => {
453
+ log.info("REM dispatch accepted", {
454
+ outcome: "success",
455
+ job_id: body.job_id,
456
+ status: response.status,
457
+ duration_ms: performance.now() - started
458
+ }, {
459
+ event_name: "sidecar.trigger.dispatch.accepted",
460
+ file: "packages/memory/src/sidecar/rem-trigger.ts",
461
+ function: "dispatchRemWave",
462
+ site_id: "sidecar.trigger.dispatch.accepted"
463
+ });
464
+ });
465
+ }
466
+ async function applyCompletedBaselines(auditStateDir, triggerStateDir, state) {
467
+ let content;
468
+ try {
469
+ content = await readAuditTail(getAuditPath(auditStateDir));
470
+ } catch (error) {
471
+ if (isNodeError(error) && error.code === "ENOENT") return state;
472
+ log.warn("REM completion audit could not be read", {
473
+ error,
474
+ outcome: "skipped",
475
+ reason_code: "audit_read_failed"
476
+ }, {
477
+ event_name: "sidecar.trigger.audit_read.failed",
478
+ file: "packages/memory/src/sidecar/rem-trigger.ts",
479
+ function: "applyCompletedBaselines",
480
+ site_id: "sidecar.trigger.audit_read.failed"
481
+ });
482
+ return state;
483
+ }
484
+ const dispatched = /* @__PURE__ */ new Map();
485
+ let nextState = state;
486
+ let malformedCount = 0;
487
+ for (const line of content.split("\n")) {
488
+ if (line.trim() === "") continue;
489
+ try {
490
+ const entry = JSON.parse(line);
491
+ const details = asRecord(entry["details"]);
492
+ const correlationId = details?.["correlation_id"];
493
+ const scope = entry["scope"];
494
+ if (entry["event"] === "rem_trigger_evaluated" && details?.["row"] === "dispatch" && typeof correlationId === "string" && typeof scope === "string") {
495
+ const trigger = details["trigger"];
496
+ const passAt = details["pass_at"];
497
+ const localDate = details["local_date"];
498
+ dispatched.set(correlationId, {
499
+ scope,
500
+ ...trigger === "daily" || trigger === "volume" ? { trigger } : {},
501
+ ...typeof passAt === "string" ? { passAt } : {},
502
+ ...typeof localDate === "string" ? { localDate } : {}
503
+ });
504
+ continue;
505
+ }
506
+ if (entry["event"] === "rem_skipped" && typeof correlationId === "string") {
507
+ const skipped = dispatched.get(correlationId);
508
+ if (skipped && nextState.scopes[skipped.scope]?.attempts.identity === correlationId) nextState = replaceScopeState(nextState, skipped.scope, {
509
+ ...requiredScopeState(nextState, skipped.scope),
510
+ attempts: {
511
+ identity: null,
512
+ count: 0
513
+ }
514
+ });
515
+ continue;
516
+ }
517
+ if (entry["event"] !== "rem_completed" || typeof correlationId !== "string") continue;
518
+ const dispatch = dispatched.get(correlationId);
519
+ if (dispatch === void 0 || state.scopes[dispatch.scope] === void 0 || entry["scope"] !== dispatch.scope) continue;
520
+ const currentScopeState = requiredScopeState(nextState, dispatch.scope);
521
+ let completedScopeState = {
522
+ ...currentScopeState,
523
+ ...dispatch.trigger === "daily" && isValidInstant(dispatch.passAt) ? { last_pass_at: dispatch.passAt } : {},
524
+ ...dispatch.trigger === "daily" && isLocalDate(dispatch.localDate) ? { last_volume_pass_date: dispatch.localDate } : {},
525
+ ...dispatch.trigger === "volume" && isLocalDate(dispatch.localDate) ? { last_volume_pass_date: dispatch.localDate } : {},
526
+ ...currentScopeState.attempts.identity === correlationId ? { attempts: {
527
+ identity: null,
528
+ count: 0
529
+ } } : {}
530
+ };
531
+ const measured = asRecord(asRecord(details?.["stats"])?.["measured"]);
532
+ const rowsConsidered = measured?.["rows_considered"];
533
+ if (measured?.["pair_cap_binding"] === false && Number.isInteger(rowsConsidered) && Number(rowsConsidered) >= 0) completedScopeState = {
534
+ ...completedScopeState,
535
+ last_covered_count: Number(rowsConsidered)
536
+ };
537
+ if (JSON.stringify(completedScopeState) === JSON.stringify(currentScopeState)) continue;
538
+ nextState = replaceScopeState(nextState, dispatch.scope, completedScopeState);
539
+ } catch {
540
+ malformedCount += 1;
541
+ }
542
+ }
543
+ if (malformedCount > 0) log.warn("Malformed REM audit records skipped", {
544
+ malformed_count: malformedCount,
545
+ outcome: "partial"
546
+ }, {
547
+ event_name: "sidecar.trigger.audit_records.skipped",
548
+ file: "packages/memory/src/sidecar/rem-trigger.ts",
549
+ function: "applyCompletedBaselines",
550
+ site_id: "sidecar.trigger.audit_records.skipped"
551
+ });
552
+ if (nextState !== state) await writeRemTriggerStateAtomic(triggerStateDir, nextState);
553
+ return nextState;
554
+ }
555
+ async function readAuditTail(auditPath) {
556
+ const handle = await open(auditPath, "r");
557
+ try {
558
+ const size = (await handle.stat()).size;
559
+ const bytesToRead = Math.min(size, REM_COMPLETION_AUDIT_TAIL_BYTES);
560
+ if (bytesToRead === 0) return "";
561
+ const buffer = Buffer.alloc(bytesToRead);
562
+ const { bytesRead } = await handle.read(buffer, 0, bytesToRead, size - bytesToRead);
563
+ let content = buffer.subarray(0, bytesRead).toString("utf8");
564
+ if (size > bytesToRead) {
565
+ const firstLineEnd = content.indexOf("\n");
566
+ content = firstLineEnd === -1 ? "" : content.slice(firstLineEnd + 1);
567
+ }
568
+ return content;
569
+ } finally {
570
+ await handle.close();
571
+ }
572
+ }
573
+ function remAutomaticCorrelationId(trigger, scope, triggerKey) {
574
+ return `rem-auto-${trigger}-${createHash("sha256").update(JSON.stringify([
575
+ "rem-automatic-v1",
576
+ trigger,
577
+ scope,
578
+ triggerKey
579
+ ])).digest("hex")}`;
580
+ }
581
+ /** The daily due time, pushed to the schedule after the last used-up local day. */
582
+ function nextDailyDue(scopeState) {
583
+ const scheduled = computeRemDailyDue(scopeState.last_pass_at, scopeState.schedule_zone);
584
+ const volumeDate = scopeState.last_volume_pass_date;
585
+ if (volumeDate === null) return scheduled;
586
+ const parsed = /^(\d{4})-(\d{2})-(\d{2})$/u.exec(volumeDate);
587
+ if (parsed === null) return scheduled;
588
+ const following = addCalendarDays({
589
+ year: Number(parsed[1]),
590
+ month: Number(parsed[2]),
591
+ day: Number(parsed[3])
592
+ }, 1);
593
+ const afterVolume = zonedInstant(scopeState.schedule_zone, following.year, following.month, following.day);
594
+ return afterVolume.getTime() > scheduled.getTime() ? afterVolume : scheduled;
595
+ }
596
+ function computeRemDailyDue(lastPassAt, scheduleZone) {
597
+ const lastPass = new Date(lastPassAt);
598
+ if (Number.isNaN(lastPass.getTime())) throw new Error("REM last pass time is invalid");
599
+ const localDate = localDateParts(lastPass, scheduleZone);
600
+ let due = zonedInstant(scheduleZone, localDate.year, localDate.month, localDate.day);
601
+ if (due.getTime() <= lastPass.getTime()) {
602
+ const nextDate = addCalendarDays(localDate, 1);
603
+ due = zonedInstant(scheduleZone, nextDate.year, nextDate.month, nextDate.day);
604
+ }
605
+ return due;
606
+ }
607
+ function zonedInstant(zone, year, month, day) {
608
+ const target = Date.UTC(year, month - 1, day, 3, 0, 0, 0);
609
+ let instant = target;
610
+ let firstExistingAfter;
611
+ for (let iteration = 0; iteration < 5; iteration++) {
612
+ const parts = zonedDateTimeParts(new Date(instant), zone);
613
+ const represented = Date.UTC(parts.year, parts.month - 1, parts.day, parts.hour, parts.minute, parts.second);
614
+ const adjustment = target - represented;
615
+ if (adjustment === 0) return new Date(instant);
616
+ if (represented > target && represented < (firstExistingAfter?.represented ?? Number.POSITIVE_INFINITY)) firstExistingAfter = {
617
+ instant,
618
+ represented
619
+ };
620
+ instant += adjustment;
621
+ }
622
+ if (firstExistingAfter !== void 0) return new Date(firstExistingAfter.instant);
623
+ throw new Error(`REM scheduled instant cannot be resolved in zone ${zone}`);
624
+ }
625
+ function localDateAt(instant, zone) {
626
+ const parts = localDateParts(instant, zone);
627
+ return `${parts.year.toString().padStart(4, "0")}-${parts.month.toString().padStart(2, "0")}-${parts.day.toString().padStart(2, "0")}`;
628
+ }
629
+ function localDateParts(instant, zone) {
630
+ const parts = zonedDateTimeParts(instant, zone);
631
+ return {
632
+ year: parts.year,
633
+ month: parts.month,
634
+ day: parts.day
635
+ };
636
+ }
637
+ function zonedDateTimeParts(instant, zone) {
638
+ const values = {};
639
+ const formatter = new Intl.DateTimeFormat("en-CA", {
640
+ timeZone: zone,
641
+ year: "numeric",
642
+ month: "2-digit",
643
+ day: "2-digit",
644
+ hour: "2-digit",
645
+ minute: "2-digit",
646
+ second: "2-digit",
647
+ hourCycle: "h23"
648
+ });
649
+ for (const part of formatter.formatToParts(instant)) if (part.type !== "literal") values[part.type] = Number(part.value);
650
+ const year = values["year"];
651
+ const month = values["month"];
652
+ const day = values["day"];
653
+ const hour = values["hour"];
654
+ const minute = values["minute"];
655
+ const second = values["second"];
656
+ if ([
657
+ year,
658
+ month,
659
+ day,
660
+ hour,
661
+ minute,
662
+ second
663
+ ].some((value) => value === void 0)) throw new Error(`REM schedule zone ${zone} did not produce complete date parts`);
664
+ return {
665
+ year: Number(year),
666
+ month: Number(month),
667
+ day: Number(day),
668
+ hour: Number(hour),
669
+ minute: Number(minute),
670
+ second: Number(second)
671
+ };
672
+ }
673
+ function addCalendarDays(date, days) {
674
+ const instant = new Date(Date.UTC(date.year, date.month - 1, date.day + days));
675
+ return {
676
+ year: instant.getUTCFullYear(),
677
+ month: instant.getUTCMonth() + 1,
678
+ day: instant.getUTCDate()
679
+ };
680
+ }
681
+ function growthDetails(candidateCount, coveredCount, threshold) {
682
+ const growth = candidateCount - coveredCount;
683
+ return {
684
+ candidate_count: candidateCount,
685
+ last_covered_count: coveredCount,
686
+ delta: growth,
687
+ threshold,
688
+ remaining: Math.max(0, threshold - growth)
689
+ };
690
+ }
691
+ async function recordDecision(stateDir, scope, resultStatus, details) {
692
+ await appendAuditEntryStrict(stateDir, {
693
+ event: "rem_trigger_evaluated",
694
+ resultStatus,
695
+ ...scope === void 0 ? {} : { scope },
696
+ details
697
+ });
698
+ }
699
+ function requiredScopeState(state, scope) {
700
+ const scopeState = state.scopes[scope];
701
+ if (scopeState === void 0) throw new Error(`REM trigger state missing scope ${scope}`);
702
+ return scopeState;
703
+ }
704
+ function replaceScopeState(state, scope, scopeState) {
705
+ return {
706
+ version: 1,
707
+ scopes: {
708
+ ...state.scopes,
709
+ [scope]: scopeState
710
+ }
711
+ };
712
+ }
713
+ function asRecord(value) {
714
+ return typeof value === "object" && value !== null && !Array.isArray(value) ? value : void 0;
715
+ }
716
+ function isValidInstant(value) {
717
+ return value !== void 0 && !Number.isNaN(new Date(value).getTime());
718
+ }
719
+ function isLocalDate(value) {
720
+ return value !== void 0 && /^\d{4}-\d{2}-\d{2}$/u.test(value);
721
+ }
722
+ function isNodeError(error) {
723
+ return error instanceof Error && "code" in error;
724
+ }
725
+ function errorMessage(error) {
726
+ return error instanceof Error ? error.message : String(error);
727
+ }
728
+ //#endregion
729
+ export { DEGRADED_REASONS as i, remNeedsHost as n, ContractError as r, evaluateRemAutomaticTriggers as t };