@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,34 @@
1
+ //#region src/engine/shared/utils.d.ts
2
+ /**
3
+ * Clamps integer options into the configured range before they reach storage or ranking code.
4
+ */
5
+ declare function clampInt(value: number, min: number, max: number): number;
6
+ /** Clamps score-like values to the 0..1 range while honoring a caller-provided fallback. */
7
+ declare function clamp01(value: number, fallback?: number): number;
8
+ /** Redacts markup-sensitive characters before memory text is embedded in prompt context. */
9
+ declare function sanitizeForContext(text: string, maxChars?: number, newlineReplacement?: string): string;
10
+ /** Escapes SQLite FTS operators so user queries cannot break MATCH syntax. */
11
+ declare function sanitizeFtsQuery(rawQuery: string): string;
12
+ /** Builds a conjunctive FTS predicate from validated structured aggregation terms. */
13
+ declare function sanitizeFtsConjunctiveQuery(terms: readonly string[]): string;
14
+ /** Serializes Float32 vectors into little-endian bytes for SQLite vector storage. */
15
+ declare function f32ToBytes(f32: Float32Array): Uint8Array;
16
+ /** Rehydrates SQLite vector bytes into Float32 values and rejects malformed payloads. */
17
+ declare function bytesToF32(bytes: Uint8Array): Float32Array;
18
+ /** Produces the stable content hash used for deduplication and idempotent writes. */
19
+ declare function stableHash(text: string): string;
20
+ /**
21
+ * Return a short, secret-redacted, whitespace-collapsed preview of `text` for
22
+ * debug audit logs when explicitly enabled. Off-by-default
23
+ * and passes the text through `redactSecrets` first because previews persist
24
+ * in audit.jsonl on disk. Enable for bench investigations only.
25
+ */
26
+ declare function debugContentPreview(text: string | undefined, enabled: boolean, maxChars?: number): string | undefined;
27
+ /**
28
+ * Read the tail of a text file (up to `maxBytes`).
29
+ * Returns the file content from the tail. If the file is smaller than `maxBytes`,
30
+ * returns the entire file. The first partial line is dropped (it was likely truncated).
31
+ */
32
+ declare function readFileTail(filePath: string, maxBytes?: number): Promise<string>;
33
+ //#endregion
34
+ export { f32ToBytes as a, sanitizeFtsConjunctiveQuery as c, debugContentPreview as i, sanitizeFtsQuery as l, clamp01 as n, readFileTail as o, clampInt as r, sanitizeForContext as s, bytesToF32 as t, stableHash as u };
@@ -0,0 +1,10 @@
1
+ CREATE TABLE IF NOT EXISTS nodix_memories (
2
+ id TEXT PRIMARY KEY,
3
+ text TEXT NOT NULL,
4
+ category TEXT NOT NULL,
5
+ project_id TEXT NOT NULL,
6
+ importance REAL NOT NULL DEFAULT 0.7,
7
+ timestamp INTEGER NOT NULL,
8
+ metadata TEXT DEFAULT '{}',
9
+ content_hash TEXT NOT NULL
10
+ );
@@ -0,0 +1,34 @@
1
+ CREATE VIRTUAL TABLE IF NOT EXISTS nodix_memories_fts
2
+ USING fts5(
3
+ text,
4
+ content='nodix_memories',
5
+ content_rowid='rowid',
6
+ tokenize='porter unicode61'
7
+ );
8
+ --> statement-breakpoint
9
+ CREATE TRIGGER IF NOT EXISTS nodix_memories_ai
10
+ AFTER INSERT ON nodix_memories BEGIN
11
+ INSERT INTO nodix_memories_fts(rowid, text)
12
+ VALUES (new.rowid, new.text);
13
+ END;
14
+ --> statement-breakpoint
15
+ CREATE TRIGGER IF NOT EXISTS nodix_memories_ad
16
+ AFTER DELETE ON nodix_memories BEGIN
17
+ INSERT INTO nodix_memories_fts(nodix_memories_fts, rowid, text)
18
+ VALUES ('delete', old.rowid, old.text);
19
+ END;
20
+ --> statement-breakpoint
21
+ CREATE TRIGGER IF NOT EXISTS nodix_memories_au
22
+ AFTER UPDATE ON nodix_memories BEGIN
23
+ INSERT INTO nodix_memories_fts(nodix_memories_fts, rowid, text)
24
+ VALUES ('delete', old.rowid, old.text);
25
+ INSERT INTO nodix_memories_fts(rowid, text)
26
+ VALUES (new.rowid, new.text);
27
+ END;
28
+ --> statement-breakpoint
29
+ CREATE VIRTUAL TABLE IF NOT EXISTS nodix_memory_vectors
30
+ USING vec0(
31
+ id TEXT PRIMARY KEY,
32
+ -- Keep this aligned with VECTOR_DIMENSION_DEFAULT (1024).
33
+ embedding float[1024]
34
+ );
@@ -0,0 +1,11 @@
1
+ CREATE UNIQUE INDEX IF NOT EXISTS nodix_idx_memories_project_content_hash
2
+ ON nodix_memories (project_id, content_hash);
3
+ --> statement-breakpoint
4
+ CREATE INDEX IF NOT EXISTS nodix_idx_memories_project
5
+ ON nodix_memories (project_id);
6
+ --> statement-breakpoint
7
+ CREATE INDEX IF NOT EXISTS nodix_idx_memories_category
8
+ ON nodix_memories (category);
9
+ --> statement-breakpoint
10
+ CREATE INDEX IF NOT EXISTS nodix_idx_memories_project_timestamp
11
+ ON nodix_memories (project_id, timestamp DESC);
@@ -0,0 +1,2 @@
1
+ CREATE INDEX IF NOT EXISTS nodix_idx_memories_content_hash
2
+ ON nodix_memories (content_hash);
@@ -0,0 +1,60 @@
1
+ -- Hand-rolled migration; do NOT run `npm run db:generate` against this file.
2
+ CREATE TABLE IF NOT EXISTS nodix_memory_chunks (
3
+ chunk_id TEXT PRIMARY KEY,
4
+ memory_id TEXT NOT NULL,
5
+ chunk_index INTEGER NOT NULL,
6
+ chunk_text TEXT NOT NULL,
7
+ dense_payload TEXT NOT NULL,
8
+ summary TEXT,
9
+ entities TEXT,
10
+ tags TEXT,
11
+ source TEXT,
12
+ start_offset INTEGER NOT NULL,
13
+ end_offset INTEGER NOT NULL,
14
+ token_count INTEGER NOT NULL,
15
+ content_type TEXT NOT NULL CHECK (content_type IN ('conversation', 'prose', 'code')),
16
+ chunking_version TEXT NOT NULL,
17
+ embedder_provider TEXT NOT NULL,
18
+ embedder_model TEXT NOT NULL,
19
+ embedder_dim INTEGER NOT NULL,
20
+ created_at INTEGER NOT NULL,
21
+ updated_at INTEGER NOT NULL,
22
+ FOREIGN KEY (memory_id) REFERENCES nodix_memories(id) ON DELETE CASCADE
23
+ );
24
+ --> statement-breakpoint
25
+ CREATE UNIQUE INDEX IF NOT EXISTS nodix_idx_memory_chunks_memory ON nodix_memory_chunks(memory_id, chunk_index);
26
+ --> statement-breakpoint
27
+ CREATE INDEX IF NOT EXISTS nodix_idx_memory_chunks_memory_id ON nodix_memory_chunks(memory_id);
28
+ --> statement-breakpoint
29
+ CREATE VIRTUAL TABLE IF NOT EXISTS nodix_memory_chunk_vectors USING vec0(
30
+ id TEXT PRIMARY KEY,
31
+ -- Placeholder dim; runtime ensureChunkVecTable recreates at the configured dim.
32
+ embedding float[1024]
33
+ );
34
+ --> statement-breakpoint
35
+ CREATE VIRTUAL TABLE IF NOT EXISTS nodix_memory_chunks_fts USING fts5(
36
+ dense_payload,
37
+ content='nodix_memory_chunks',
38
+ content_rowid='rowid',
39
+ tokenize='porter unicode61'
40
+ );
41
+ --> statement-breakpoint
42
+ CREATE TRIGGER IF NOT EXISTS nodix_memory_chunks_ai
43
+ AFTER INSERT ON nodix_memory_chunks BEGIN
44
+ INSERT INTO nodix_memory_chunks_fts(rowid, dense_payload)
45
+ VALUES (new.rowid, new.dense_payload);
46
+ END;
47
+ --> statement-breakpoint
48
+ CREATE TRIGGER IF NOT EXISTS nodix_memory_chunks_ad
49
+ AFTER DELETE ON nodix_memory_chunks BEGIN
50
+ INSERT INTO nodix_memory_chunks_fts(nodix_memory_chunks_fts, rowid, dense_payload)
51
+ VALUES ('delete', old.rowid, old.dense_payload);
52
+ END;
53
+ --> statement-breakpoint
54
+ CREATE TRIGGER IF NOT EXISTS nodix_memory_chunks_au
55
+ AFTER UPDATE ON nodix_memory_chunks BEGIN
56
+ INSERT INTO nodix_memory_chunks_fts(nodix_memory_chunks_fts, rowid, dense_payload)
57
+ VALUES ('delete', old.rowid, old.dense_payload);
58
+ INSERT INTO nodix_memory_chunks_fts(rowid, dense_payload)
59
+ VALUES (new.rowid, new.dense_payload);
60
+ END;
@@ -0,0 +1,10 @@
1
+ -- Drop parent-level FTS/vector objects superseded by 0004_chunk_swap.
2
+ DROP TRIGGER IF EXISTS nodix_memories_ai;
3
+ --> statement-breakpoint
4
+ DROP TRIGGER IF EXISTS nodix_memories_ad;
5
+ --> statement-breakpoint
6
+ DROP TRIGGER IF EXISTS nodix_memories_au;
7
+ --> statement-breakpoint
8
+ DROP TABLE IF EXISTS nodix_memories_fts;
9
+ --> statement-breakpoint
10
+ DROP TABLE IF EXISTS nodix_memory_vectors;
@@ -0,0 +1,45 @@
1
+ -- Hand-rolled migration; do NOT run `npm run db:generate` against this file.
2
+ -- Swap nodix_memory_chunks_fts tokenizer from `porter unicode61` (char-level on CJK)
3
+ -- to `simple 0` (jieba word-level via wangfenjin/simple extension).
4
+ -- Schema, triggers, and downstream MATCH queries stay identical — only the
5
+ -- tokenize= clause changes.
6
+ DROP TRIGGER IF EXISTS nodix_memory_chunks_ai;
7
+ --> statement-breakpoint
8
+ DROP TRIGGER IF EXISTS nodix_memory_chunks_ad;
9
+ --> statement-breakpoint
10
+ DROP TRIGGER IF EXISTS nodix_memory_chunks_au;
11
+ --> statement-breakpoint
12
+ DROP TABLE IF EXISTS nodix_memory_chunks_fts;
13
+ --> statement-breakpoint
14
+ CREATE VIRTUAL TABLE nodix_memory_chunks_fts USING fts5(
15
+ dense_payload,
16
+ content='nodix_memory_chunks',
17
+ content_rowid='rowid',
18
+ tokenize='simple 0'
19
+ );
20
+ --> statement-breakpoint
21
+ CREATE TRIGGER IF NOT EXISTS nodix_memory_chunks_ai
22
+ AFTER INSERT ON nodix_memory_chunks BEGIN
23
+ INSERT INTO nodix_memory_chunks_fts(rowid, dense_payload)
24
+ VALUES (new.rowid, new.dense_payload);
25
+ END;
26
+ --> statement-breakpoint
27
+ CREATE TRIGGER IF NOT EXISTS nodix_memory_chunks_ad
28
+ AFTER DELETE ON nodix_memory_chunks BEGIN
29
+ INSERT INTO nodix_memory_chunks_fts(nodix_memory_chunks_fts, rowid, dense_payload)
30
+ VALUES ('delete', old.rowid, old.dense_payload);
31
+ END;
32
+ --> statement-breakpoint
33
+ CREATE TRIGGER IF NOT EXISTS nodix_memory_chunks_au
34
+ AFTER UPDATE ON nodix_memory_chunks BEGIN
35
+ INSERT INTO nodix_memory_chunks_fts(nodix_memory_chunks_fts, rowid, dense_payload)
36
+ VALUES ('delete', old.rowid, old.dense_payload);
37
+ INSERT INTO nodix_memory_chunks_fts(rowid, dense_payload)
38
+ VALUES (new.rowid, new.dense_payload);
39
+ END;
40
+ --> statement-breakpoint
41
+ -- Rebuild is synchronous; run this migration during a maintenance window for
42
+ -- large existing databases rather than during latency-sensitive startup.
43
+ INSERT INTO nodix_memory_chunks_fts(nodix_memory_chunks_fts)
44
+ SELECT 'rebuild'
45
+ WHERE EXISTS (SELECT 1 FROM nodix_memory_chunks LIMIT 1);
@@ -0,0 +1,40 @@
1
+ -- Restore nodix_memory_chunks_fts to the wangfenjin/simple tokenizer after the
2
+ -- temporary 0006 rollback to porter unicode61.
3
+ DROP TRIGGER IF EXISTS nodix_memory_chunks_ai;
4
+ --> statement-breakpoint
5
+ DROP TRIGGER IF EXISTS nodix_memory_chunks_ad;
6
+ --> statement-breakpoint
7
+ DROP TRIGGER IF EXISTS nodix_memory_chunks_au;
8
+ --> statement-breakpoint
9
+ DROP TABLE IF EXISTS nodix_memory_chunks_fts;
10
+ --> statement-breakpoint
11
+ CREATE VIRTUAL TABLE nodix_memory_chunks_fts USING fts5(
12
+ dense_payload,
13
+ content='nodix_memory_chunks',
14
+ content_rowid='rowid',
15
+ tokenize='simple 0'
16
+ );
17
+ --> statement-breakpoint
18
+ CREATE TRIGGER IF NOT EXISTS nodix_memory_chunks_ai
19
+ AFTER INSERT ON nodix_memory_chunks BEGIN
20
+ INSERT INTO nodix_memory_chunks_fts(rowid, dense_payload)
21
+ VALUES (new.rowid, new.dense_payload);
22
+ END;
23
+ --> statement-breakpoint
24
+ CREATE TRIGGER IF NOT EXISTS nodix_memory_chunks_ad
25
+ AFTER DELETE ON nodix_memory_chunks BEGIN
26
+ INSERT INTO nodix_memory_chunks_fts(nodix_memory_chunks_fts, rowid, dense_payload)
27
+ VALUES ('delete', old.rowid, old.dense_payload);
28
+ END;
29
+ --> statement-breakpoint
30
+ CREATE TRIGGER IF NOT EXISTS nodix_memory_chunks_au
31
+ AFTER UPDATE ON nodix_memory_chunks BEGIN
32
+ INSERT INTO nodix_memory_chunks_fts(nodix_memory_chunks_fts, rowid, dense_payload)
33
+ VALUES ('delete', old.rowid, old.dense_payload);
34
+ INSERT INTO nodix_memory_chunks_fts(rowid, dense_payload)
35
+ VALUES (new.rowid, new.dense_payload);
36
+ END;
37
+ --> statement-breakpoint
38
+ INSERT INTO nodix_memory_chunks_fts(nodix_memory_chunks_fts)
39
+ SELECT 'rebuild'
40
+ WHERE EXISTS (SELECT 1 FROM nodix_memory_chunks LIMIT 1);
@@ -0,0 +1,4 @@
1
+ DROP INDEX IF EXISTS nodix_idx_memories_project_content_hash;
2
+ --> statement-breakpoint
3
+ CREATE UNIQUE INDEX IF NOT EXISTS nodix_idx_memories_project_content_hash
4
+ ON nodix_memories (project_id, content_hash, category);
@@ -0,0 +1,109 @@
1
+ ALTER TABLE nodix_memories ADD COLUMN fact_id TEXT;
2
+ --> statement-breakpoint
3
+ UPDATE nodix_memories SET fact_id = id WHERE fact_id IS NULL;
4
+ --> statement-breakpoint
5
+ ALTER TABLE nodix_memories ADD COLUMN derived_from TEXT;
6
+ --> statement-breakpoint
7
+ ALTER TABLE nodix_memories ADD COLUMN consolidation_epoch_id TEXT;
8
+ --> statement-breakpoint
9
+ ALTER TABLE nodix_memories ADD COLUMN confidence_source TEXT;
10
+ --> statement-breakpoint
11
+ CREATE TRIGGER IF NOT EXISTS nodix_memories_fact_id_insert_guard
12
+ BEFORE INSERT ON nodix_memories
13
+ WHEN NEW.fact_id IS NULL
14
+ BEGIN SELECT RAISE(ABORT, 'nodix_memories.fact_id is required'); END;
15
+ --> statement-breakpoint
16
+ CREATE TRIGGER IF NOT EXISTS nodix_memories_fact_id_update_guard
17
+ BEFORE UPDATE ON nodix_memories
18
+ WHEN NEW.fact_id IS NULL
19
+ BEGIN SELECT RAISE(ABORT, 'nodix_memories.fact_id is required'); END;
20
+ --> statement-breakpoint
21
+ CREATE TABLE IF NOT EXISTS nodix_memory_events (
22
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
23
+ event_type TEXT NOT NULL,
24
+ fact_id TEXT,
25
+ memory_kind TEXT,
26
+ timestamp_ms INTEGER NOT NULL,
27
+ session_uuid TEXT,
28
+ turn_id TEXT,
29
+ agent_id TEXT NOT NULL,
30
+ project_id TEXT,
31
+ tenant_id TEXT,
32
+
33
+ source_event_id INTEGER,
34
+ derived_from TEXT,
35
+
36
+ consolidation_epoch_id TEXT,
37
+
38
+ content_hash TEXT,
39
+ receipt_hmac TEXT,
40
+ key_version INTEGER,
41
+
42
+ retrieval_rank INTEGER,
43
+ retrieval_score REAL,
44
+
45
+ query_tenant_id TEXT,
46
+ result_tenant_id TEXT,
47
+
48
+ metadata_json TEXT,
49
+
50
+ CHECK (event_type IN (
51
+ 'create',
52
+ 'update',
53
+ 'recall',
54
+ 'supersede',
55
+ 'delete',
56
+ 'inject',
57
+ 'epoch_boundary',
58
+ 'purge'
59
+ )),
60
+ CHECK (event_type = 'epoch_boundary' OR fact_id IS NOT NULL)
61
+ );
62
+ --> statement-breakpoint
63
+ CREATE INDEX nodix_idx_memory_events_fact ON nodix_memory_events(fact_id);
64
+ --> statement-breakpoint
65
+ CREATE INDEX nodix_idx_memory_events_type ON nodix_memory_events(event_type);
66
+ --> statement-breakpoint
67
+ CREATE INDEX nodix_idx_memory_events_epoch ON nodix_memory_events(consolidation_epoch_id);
68
+ --> statement-breakpoint
69
+ CREATE INDEX nodix_idx_memory_events_session ON nodix_memory_events(session_uuid);
70
+ --> statement-breakpoint
71
+ CREATE INDEX nodix_idx_memory_events_tenant ON nodix_memory_events(tenant_id, timestamp_ms);
72
+ --> statement-breakpoint
73
+ CREATE INDEX nodix_idx_memory_events_kind ON nodix_memory_events(memory_kind, timestamp_ms);
74
+ --> statement-breakpoint
75
+ CREATE INDEX nodix_idx_memory_events_project ON nodix_memory_events(project_id, event_type, timestamp_ms);
76
+ --> statement-breakpoint
77
+ CREATE INDEX nodix_idx_memory_events_turn ON nodix_memory_events(turn_id);
78
+ --> statement-breakpoint
79
+ CREATE TRIGGER memory_events_no_update BEFORE UPDATE ON nodix_memory_events
80
+ BEGIN SELECT RAISE(ABORT, 'nodix_memory_events is append-only'); END;
81
+ --> statement-breakpoint
82
+ CREATE TRIGGER memory_events_no_delete BEFORE DELETE ON nodix_memory_events
83
+ BEGIN SELECT RAISE(ABORT, 'nodix_memory_events is append-only'); END;
84
+ --> statement-breakpoint
85
+ CREATE TABLE IF NOT EXISTS nodix_memory_usage_outbox (
86
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
87
+ event_type TEXT NOT NULL CHECK (event_type IN ('recall', 'inject')),
88
+ payload_json TEXT NOT NULL,
89
+ accepted_at_ms INTEGER NOT NULL,
90
+ status TEXT NOT NULL CHECK (status IN ('pending', 'failed', 'flushing', 'quarantined')),
91
+ attempt_count INTEGER NOT NULL DEFAULT 0,
92
+ last_error TEXT,
93
+ next_attempt_ms INTEGER
94
+ );
95
+ --> statement-breakpoint
96
+ CREATE TABLE IF NOT EXISTS nodix_memory_telemetry_incidents (
97
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
98
+ incident_type TEXT NOT NULL,
99
+ severity TEXT NOT NULL CHECK (severity IN ('warning', 'error')),
100
+ message TEXT NOT NULL,
101
+ payload_json TEXT,
102
+ created_at_ms INTEGER NOT NULL
103
+ );
104
+ --> statement-breakpoint
105
+ CREATE TABLE IF NOT EXISTS nodix_memory_telemetry_sync_state (
106
+ sink TEXT PRIMARY KEY,
107
+ last_event_id INTEGER NOT NULL DEFAULT 0,
108
+ updated_at_ms INTEGER NOT NULL
109
+ );
@@ -0,0 +1,27 @@
1
+ CREATE TABLE IF NOT EXISTS nodix_provider_project_mappings (
2
+ user_id TEXT NOT NULL,
3
+ external_system TEXT NOT NULL,
4
+ external_project_key TEXT NOT NULL,
5
+ project_id TEXT NOT NULL,
6
+ created_at_ms INTEGER NOT NULL,
7
+ PRIMARY KEY (user_id, external_system, external_project_key),
8
+ UNIQUE (project_id)
9
+ );
10
+ --> statement-breakpoint
11
+ CREATE TABLE IF NOT EXISTS nodix_provider_agent_mappings (
12
+ user_id TEXT NOT NULL,
13
+ external_system TEXT NOT NULL,
14
+ external_agent_key TEXT NOT NULL,
15
+ agent_id TEXT NOT NULL,
16
+ created_at_ms INTEGER NOT NULL,
17
+ PRIMARY KEY (user_id, external_system, external_agent_key),
18
+ UNIQUE (agent_id)
19
+ );
20
+ --> statement-breakpoint
21
+ CREATE TABLE IF NOT EXISTS nodix_provider_project_agents (
22
+ user_id TEXT NOT NULL,
23
+ project_id TEXT NOT NULL,
24
+ agent_id TEXT NOT NULL,
25
+ created_at_ms INTEGER NOT NULL,
26
+ PRIMARY KEY (user_id, project_id, agent_id)
27
+ );
@@ -0,0 +1,82 @@
1
+ -- Hand-rolled migration; do NOT run `npm run db:generate` against this file.
2
+ -- DB-optimization pass (2026-07): missing indexes for real query shapes, removal of
3
+ -- redundant/unused indexes to cut write amplification, and retention enablement for
4
+ -- usage events. Complete DDL for the pass lives in this single migration.
5
+
6
+ -- fact_id lookups (purge cascade deleteFacts/readAffectedEpochIds/readPurgeEventAnchor,
7
+ -- telemetry readCurrentContentHash) currently full-scan the memories table.
8
+ CREATE INDEX IF NOT EXISTS nodix_idx_memories_fact_id ON nodix_memories(fact_id);
9
+ --> statement-breakpoint
10
+ -- Outbox flush-candidate reads and pending scans filter on status (+ next_attempt_ms);
11
+ -- the table previously had no non-PK index at all.
12
+ CREATE INDEX IF NOT EXISTS nodix_idx_memory_usage_outbox_status_next
13
+ ON nodix_memory_usage_outbox(status, next_attempt_ms);
14
+ --> statement-breakpoint
15
+ CREATE INDEX IF NOT EXISTS nodix_idx_memory_telemetry_incidents_created
16
+ ON nodix_memory_telemetry_incidents(created_at_ms);
17
+ --> statement-breakpoint
18
+ -- listReflectionItems full-scans + JSON-parses every row today. The partial predicate
19
+ -- restricts index content to reflection rows only, so even a project-filtered query is
20
+ -- bounded by the total number of reflection rows; timestamp keying serves the
21
+ -- unfiltered ORDER BY timestamp DESC LIMIT shape in index order.
22
+ CREATE INDEX IF NOT EXISTS nodix_idx_memories_reflection_items
23
+ ON nodix_memories(timestamp DESC)
24
+ WHERE json_valid(metadata) AND json_extract(metadata, '$.type') = 'memory-reflection-item';
25
+ --> statement-breakpoint
26
+ -- findByExtractionIdempotencyKey and the createEventAndSupersede duplicate probe
27
+ -- full-scan on json_extract today. Non-unique on purpose: uniqueness stays enforced by
28
+ -- the existing code guard, so pre-existing duplicate rows cannot break this migration.
29
+ CREATE INDEX IF NOT EXISTS nodix_idx_memories_idempotency_key
30
+ ON nodix_memories(project_id, json_extract(metadata, '$.idempotency_key'))
31
+ WHERE json_valid(metadata) AND json_extract(metadata, '$.idempotency_key') IS NOT NULL;
32
+ --> statement-breakpoint
33
+ -- Redundant left-prefix indexes: (project_id) is a prefix of
34
+ -- nodix_idx_memories_project_timestamp and of the UNIQUE
35
+ -- (project_id, content_hash, category); chunks(memory_id) is a prefix of the UNIQUE
36
+ -- (memory_id, chunk_index). Every write pays for them; no query needs them.
37
+ DROP INDEX IF EXISTS nodix_idx_memories_project;
38
+ --> statement-breakpoint
39
+ DROP INDEX IF EXISTS nodix_idx_memory_chunks_memory_id;
40
+ --> statement-breakpoint
41
+ -- nodix_memory_events index trim. Every memory write inserts an event inside the same
42
+ -- transaction, so each secondary index is per-write amplification. Verified by
43
+ -- repo-wide query sweep (2026-07-12): tenant_id and memory_kind are never queried;
44
+ -- session_uuid is only ever queried together with turn_id; bare event_type predicates
45
+ -- always pair with an indexed fact_id.
46
+ DROP INDEX IF EXISTS nodix_idx_memory_events_type;
47
+ --> statement-breakpoint
48
+ -- The hourly usage-event retention query filters
49
+ -- event_type IN ('recall','inject') AND timestamp_ms < cutoff — a partial index shaped
50
+ -- exactly for that scan, near-free for lifecycle inserts (outside the predicate).
51
+ CREATE INDEX IF NOT EXISTS nodix_idx_memory_events_usage_retention
52
+ ON nodix_memory_events(timestamp_ms)
53
+ WHERE event_type IN ('recall', 'inject');
54
+ --> statement-breakpoint
55
+ DROP INDEX IF EXISTS nodix_idx_memory_events_tenant;
56
+ --> statement-breakpoint
57
+ DROP INDEX IF EXISTS nodix_idx_memory_events_kind;
58
+ --> statement-breakpoint
59
+ DROP INDEX IF EXISTS nodix_idx_memory_events_session;
60
+ --> statement-breakpoint
61
+ DROP INDEX IF EXISTS nodix_idx_memory_events_epoch;
62
+ --> statement-breakpoint
63
+ CREATE INDEX IF NOT EXISTS nodix_idx_memory_events_epoch ON nodix_memory_events(consolidation_epoch_id)
64
+ WHERE consolidation_epoch_id IS NOT NULL;
65
+ --> statement-breakpoint
66
+ DROP INDEX IF EXISTS nodix_idx_memory_events_turn;
67
+ --> statement-breakpoint
68
+ CREATE INDEX IF NOT EXISTS nodix_idx_memory_events_turn ON nodix_memory_events(turn_id)
69
+ WHERE turn_id IS NOT NULL;
70
+ --> statement-breakpoint
71
+ -- Retention enablement. The blanket no-delete trigger is replaced by a GUARDED trigger:
72
+ -- only high-volume usage events ('recall','inject') may ever be deleted; receipt and
73
+ -- lineage events (create/update/supersede/delete/purge/epoch_boundary) stay
74
+ -- database-protected forever. Age policy (90d) lives in code; the schema enforces the
75
+ -- event-class boundary. Fail-safe order: the guarded trigger is created BEFORE the
76
+ -- blanket trigger is dropped, so an interrupted migration leaves BOTH triggers active
77
+ -- (deletes over-protected), never a window where lifecycle rows are deletable.
78
+ CREATE TRIGGER IF NOT EXISTS memory_events_lifecycle_delete_guard BEFORE DELETE ON nodix_memory_events
79
+ WHEN OLD.event_type NOT IN ('recall', 'inject')
80
+ BEGIN SELECT RAISE(ABORT, 'nodix_memory_events lifecycle rows are append-only'); END;
81
+ --> statement-breakpoint
82
+ DROP TRIGGER IF EXISTS memory_events_no_delete;
@@ -0,0 +1,9 @@
1
+ ALTER TABLE `nodix_memories` ADD `lane` text DEFAULT 'active' NOT NULL CHECK (`lane` IN ('active', 'parked', 'quarantined'));
2
+ --> statement-breakpoint
3
+ ALTER TABLE `nodix_memories` ADD `raw_candidate_json` text;
4
+ --> statement-breakpoint
5
+ ALTER TABLE `nodix_memories` ADD `disposition_reason` text;
6
+ --> statement-breakpoint
7
+ ALTER TABLE `nodix_memories` ADD `dispositioned_at_ms` integer;
8
+ --> statement-breakpoint
9
+ CREATE INDEX `nodix_idx_memories_lane_project` ON `nodix_memories` (`lane`,`project_id`);
@@ -0,0 +1,6 @@
1
+ CREATE TABLE IF NOT EXISTS `nodix_memory_extraction_timestamps` (
2
+ `project_id` text NOT NULL,
3
+ `replay_key` text NOT NULL,
4
+ `resolved_at_ms` integer NOT NULL,
5
+ PRIMARY KEY (`project_id`, `replay_key`)
6
+ ) WITHOUT ROWID;
@@ -0,0 +1,3 @@
1
+ ALTER TABLE `nodix_memory_extraction_timestamps`
2
+ ADD COLUMN `time_source` text
3
+ CHECK (`time_source` IN ('event_at', 'session_time', 'first_resolution'));
@@ -0,0 +1,101 @@
1
+ CREATE TABLE `nodix_task_lifecycle_commands` (
2
+ `project_id` text NOT NULL,
3
+ `command_id` text NOT NULL,
4
+ `canonical_tuple_json` text,
5
+ `identity_json` text NOT NULL,
6
+ `action` text NOT NULL CHECK (`action` IN ('open_or_refine', 'complete', 'remove')),
7
+ `source_assertion_json` text NOT NULL,
8
+ `effective_at_ms` integer NOT NULL,
9
+ `time_source` text NOT NULL CHECK (`time_source` IN ('event_at', 'session_time', 'first_resolution')),
10
+ `result` text NOT NULL CHECK (`result` IN (
11
+ 'created_instance',
12
+ 'created_unresolved_instance',
13
+ 'refined',
14
+ 'evidence_only',
15
+ 'completed',
16
+ 'removed',
17
+ 'terminal_evidence_only',
18
+ 'none',
19
+ 'uncertain'
20
+ )),
21
+ `active_task_id` text,
22
+ `active_task_revision_id` text,
23
+ `diagnostics_json` text NOT NULL,
24
+ `created_at_ms` integer NOT NULL,
25
+ PRIMARY KEY (`project_id`, `command_id`)
26
+ ) WITHOUT ROWID;
27
+ --> statement-breakpoint
28
+ CREATE TABLE `nodix_active_task_instances` (
29
+ `project_id` text NOT NULL,
30
+ `active_task_id` text NOT NULL,
31
+ `opening_command_id` text NOT NULL,
32
+ `canonical_tuple_json` text NOT NULL,
33
+ `identity_state` text NOT NULL CHECK (`identity_state` IN ('normal', 'unresolved')),
34
+ `status` text NOT NULL CHECK (`status` IN ('active', 'completed', 'removed')),
35
+ `created_at_ms` integer NOT NULL,
36
+ `terminal_at_ms` integer,
37
+ PRIMARY KEY (`project_id`, `active_task_id`),
38
+ UNIQUE (`project_id`, `opening_command_id`),
39
+ FOREIGN KEY (`project_id`, `opening_command_id`)
40
+ REFERENCES `nodix_task_lifecycle_commands` (`project_id`, `command_id`)
41
+ ) WITHOUT ROWID;
42
+ --> statement-breakpoint
43
+ CREATE TABLE `nodix_active_task_revisions` (
44
+ `project_id` text NOT NULL,
45
+ `active_task_revision_id` text NOT NULL,
46
+ `active_task_id` text NOT NULL,
47
+ `creating_command_id` text NOT NULL,
48
+ `canonical_tuple_json` text NOT NULL,
49
+ `description` text NOT NULL,
50
+ `occurrence_anchors_json` text NOT NULL,
51
+ `revision_details_json` text NOT NULL,
52
+ `created_at_ms` integer NOT NULL,
53
+ `is_current` integer NOT NULL CHECK (`is_current` IN (0, 1)),
54
+ PRIMARY KEY (`project_id`, `active_task_revision_id`),
55
+ UNIQUE (`project_id`, `active_task_id`, `creating_command_id`),
56
+ FOREIGN KEY (`project_id`, `active_task_id`)
57
+ REFERENCES `nodix_active_task_instances` (`project_id`, `active_task_id`),
58
+ FOREIGN KEY (`project_id`, `creating_command_id`)
59
+ REFERENCES `nodix_task_lifecycle_commands` (`project_id`, `command_id`)
60
+ ) WITHOUT ROWID;
61
+ --> statement-breakpoint
62
+ CREATE UNIQUE INDEX `nodix_idx_active_task_current_revision`
63
+ ON `nodix_active_task_revisions` (`project_id`, `active_task_id`)
64
+ WHERE `is_current` = 1;
65
+ --> statement-breakpoint
66
+ CREATE TABLE `nodix_active_task_transitions` (
67
+ `project_id` text NOT NULL,
68
+ `command_id` text NOT NULL,
69
+ `active_task_id` text NOT NULL,
70
+ `transition_kind` text NOT NULL CHECK (`transition_kind` IN ('open', 'refine', 'complete', 'remove')),
71
+ `from_status` text CHECK (`from_status` IS NULL OR `from_status` IN ('active', 'completed', 'removed')),
72
+ `to_status` text NOT NULL CHECK (`to_status` IN ('active', 'completed', 'removed')),
73
+ `effective_at_ms` integer NOT NULL,
74
+ PRIMARY KEY (`project_id`, `command_id`),
75
+ FOREIGN KEY (`project_id`, `command_id`)
76
+ REFERENCES `nodix_task_lifecycle_commands` (`project_id`, `command_id`),
77
+ FOREIGN KEY (`project_id`, `active_task_id`)
78
+ REFERENCES `nodix_active_task_instances` (`project_id`, `active_task_id`)
79
+ ) WITHOUT ROWID;
80
+ --> statement-breakpoint
81
+ CREATE TABLE `nodix_active_task_evidence` (
82
+ `project_id` text NOT NULL,
83
+ `command_id` text NOT NULL,
84
+ `active_task_id` text,
85
+ `evidence_memory_id` text,
86
+ `source_assertion_json` text NOT NULL,
87
+ `outcome` text NOT NULL,
88
+ `diagnostics_json` text NOT NULL,
89
+ `linked_at_ms` integer NOT NULL,
90
+ PRIMARY KEY (`project_id`, `command_id`),
91
+ FOREIGN KEY (`project_id`, `command_id`)
92
+ REFERENCES `nodix_task_lifecycle_commands` (`project_id`, `command_id`),
93
+ FOREIGN KEY (`project_id`, `active_task_id`)
94
+ REFERENCES `nodix_active_task_instances` (`project_id`, `active_task_id`)
95
+ ) WITHOUT ROWID;
96
+ --> statement-breakpoint
97
+ CREATE INDEX `nodix_idx_active_task_instances_projection`
98
+ ON `nodix_active_task_instances` (`project_id`, `status`, `created_at_ms`, `active_task_id`);
99
+ --> statement-breakpoint
100
+ CREATE INDEX `nodix_idx_active_task_evidence_instance`
101
+ ON `nodix_active_task_evidence` (`project_id`, `active_task_id`);