@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,1812 @@
1
+ import { SUPPORTED_LOCALES } from "./internal/engine/i18n/locales.js";
2
+ import { getSnoStationMemDataDir } from "./internal/store/data-paths.js";
3
+ import { z } from "zod";
4
+ import { createLogger } from "@snoai/utils/logger";
5
+ import { dirname, join } from "node:path";
6
+ import { mkdir, open, readFile, rename, unlink } from "node:fs/promises";
7
+ import { createHash, randomUUID } from "node:crypto";
8
+ //#region config/b-profile-section-registry.json
9
+ var b_profile_section_registry_default = {
10
+ schema_version: 3,
11
+ frozen_at: "2026-07-27T09:50:00+00:00",
12
+ domains: [
13
+ "identity",
14
+ "communication",
15
+ "work_style",
16
+ "collaboration",
17
+ "productivity",
18
+ "technology",
19
+ "media",
20
+ "food",
21
+ "travel",
22
+ "lifestyle",
23
+ "values",
24
+ "entities"
25
+ ],
26
+ gate_prompt: {
27
+ "instructions": "Classify every candidate in one pass. Decide whether the fact is about the user—what they own, work on, are responsible for, participate in, prefer, choose, or are—rather than about a third party. Determine the subject and profile_kind only from evidence_text. projected_content is synthetic and must never be used to infer the subject or profile_kind. A statement such as 'my manager prefers email' has subject_is_user=false even if projected_content says 'The user likes email'. A manager's task, third-party task, third-party preference, or assistant preference has subject_is_user=false. Storage addresses are code-owned; return a profile kind, never an address. Do not omit any candidate.",
28
+ "registry_header": "GROUPED SECTION REGISTRY:",
29
+ "candidates_header": "CANDIDATES:",
30
+ "output_contract": "Return strict JSON only: {\"verdicts\":[{\"candidate_index\":0,\"subject_is_user\":true,\"reason\":\"short reason\",\"section_name\":\"preferences.music\"}]}. Use null for section_name when no section pick is needed."
31
+ },
32
+ active_task_shape: {
33
+ "projection_max_items": 25,
34
+ "projection_title_max_tokens": 128
35
+ },
36
+ sections: [
37
+ {
38
+ "name": "identity",
39
+ "domain": "identity",
40
+ "synonyms": {
41
+ "de": ["Identität"],
42
+ "en": ["identity", "personal identity"],
43
+ "es": ["identidad"],
44
+ "fr": ["identité"],
45
+ "ja": ["個人の身元"],
46
+ "ko": ["개인 정체성"],
47
+ "ru": ["личность"],
48
+ "zh": ["个人身份"],
49
+ "zh-Hant": ["個人身分"]
50
+ }
51
+ },
52
+ {
53
+ "name": "preferences.answer_length",
54
+ "domain": "communication",
55
+ "synonyms": {
56
+ "de": ["kurze Antworten"],
57
+ "en": [
58
+ "answer length",
59
+ "response length",
60
+ "reply length",
61
+ "concise answers",
62
+ "short answers",
63
+ "brief responses"
64
+ ],
65
+ "es": ["respuestas breves"],
66
+ "fr": ["réponses brèves"],
67
+ "ja": ["短い回答"],
68
+ "ko": ["짧은 답변"],
69
+ "ru": ["краткие ответы"],
70
+ "zh": ["简短回答"],
71
+ "zh-Hant": ["簡短回答"]
72
+ }
73
+ },
74
+ {
75
+ "name": "preferences.status_updates",
76
+ "domain": "communication",
77
+ "synonyms": {
78
+ "de": ["Statusmeldungen"],
79
+ "en": [
80
+ "status updates",
81
+ "project updates",
82
+ "progress updates",
83
+ "standup updates"
84
+ ],
85
+ "es": ["actualizaciones de estado"],
86
+ "fr": ["mises à jour de statut"],
87
+ "ja": ["進捗報告"],
88
+ "ko": ["상태 업데이트"],
89
+ "ru": ["обновления статуса"],
90
+ "zh": ["状态更新"],
91
+ "zh-Hant": ["狀態更新"]
92
+ }
93
+ },
94
+ {
95
+ "name": "preferences.feedback_style",
96
+ "domain": "communication",
97
+ "synonyms": {
98
+ "de": ["Feedbackstil"],
99
+ "en": [
100
+ "feedback style",
101
+ "critique style",
102
+ "direct feedback",
103
+ "open feedback"
104
+ ],
105
+ "es": ["estilo de comentarios"],
106
+ "fr": ["style de retour"],
107
+ "ja": ["フィードバック方法"],
108
+ "ko": ["피드백 방식"],
109
+ "ru": ["стиль обратной связи"],
110
+ "zh": ["反馈方式"],
111
+ "zh-Hant": ["回饋方式"]
112
+ }
113
+ },
114
+ {
115
+ "name": "preferences.communication_channel",
116
+ "domain": "communication",
117
+ "synonyms": {
118
+ "de": ["Kommunikationskanal"],
119
+ "en": [
120
+ "communication channel",
121
+ "async communication",
122
+ "chat messages",
123
+ "email updates"
124
+ ],
125
+ "es": ["canal de comunicación"],
126
+ "fr": ["canal de communication"],
127
+ "ja": ["連絡手段"],
128
+ "ko": ["소통 채널"],
129
+ "ru": ["канал связи"],
130
+ "zh": ["沟通渠道"],
131
+ "zh-Hant": ["溝通管道"]
132
+ }
133
+ },
134
+ {
135
+ "name": "preferences.tone",
136
+ "domain": "communication",
137
+ "synonyms": {
138
+ "de": ["Kommunikationston"],
139
+ "en": [
140
+ "communication tone",
141
+ "writing tone",
142
+ "tone preference"
143
+ ],
144
+ "es": ["tono de comunicación"],
145
+ "fr": ["ton de communication"],
146
+ "ja": ["会話の口調"],
147
+ "ko": ["대화 어조"],
148
+ "ru": ["тон общения"],
149
+ "zh": ["沟通语气"],
150
+ "zh-Hant": ["溝通語氣"]
151
+ }
152
+ },
153
+ {
154
+ "name": "preferences.language",
155
+ "domain": "communication",
156
+ "synonyms": {
157
+ "de": ["Sprachpräferenz"],
158
+ "en": [
159
+ "language preference",
160
+ "spoken language",
161
+ "written language"
162
+ ],
163
+ "es": ["idioma preferido"],
164
+ "fr": ["langue préférée"],
165
+ "ja": ["使用言語"],
166
+ "ko": ["선호 언어"],
167
+ "ru": ["предпочитаемый язык"],
168
+ "zh": ["语言偏好"],
169
+ "zh-Hant": ["語言偏好"]
170
+ }
171
+ },
172
+ {
173
+ "name": "preferences.meeting_style",
174
+ "domain": "work_style",
175
+ "synonyms": {
176
+ "de": ["Besprechungsstil"],
177
+ "en": [
178
+ "meeting style",
179
+ "standups",
180
+ "one on one meetings",
181
+ "sync meetings"
182
+ ],
183
+ "es": ["estilo de reuniones"],
184
+ "fr": ["style de réunion"],
185
+ "ja": ["会議スタイル"],
186
+ "ko": ["회의 방식"],
187
+ "ru": ["стиль встреч"],
188
+ "zh": ["会议方式"],
189
+ "zh-Hant": ["會議方式"]
190
+ }
191
+ },
192
+ {
193
+ "name": "preferences.design_review",
194
+ "domain": "work_style",
195
+ "synonyms": {
196
+ "de": ["Entwurfsprüfung"],
197
+ "en": [
198
+ "design review",
199
+ "asynchronous design review",
200
+ "code review",
201
+ "review timing"
202
+ ],
203
+ "es": ["revisión de diseño"],
204
+ "fr": ["revue de conception"],
205
+ "ja": ["設計レビュー"],
206
+ "ko": ["설계 검토"],
207
+ "ru": ["проверка дизайна"],
208
+ "zh": ["设计评审"],
209
+ "zh-Hant": ["設計審查"]
210
+ }
211
+ },
212
+ {
213
+ "name": "preferences.work_planning",
214
+ "domain": "work_style",
215
+ "synonyms": {
216
+ "de": ["Arbeitsplanung"],
217
+ "en": [
218
+ "work planning",
219
+ "task planning",
220
+ "prioritization",
221
+ "decision making"
222
+ ],
223
+ "es": ["planificación del trabajo"],
224
+ "fr": ["planification du travail"],
225
+ "ja": ["作業計画"],
226
+ "ko": ["업무 계획"],
227
+ "ru": ["планирование работы"],
228
+ "zh": ["工作规划"],
229
+ "zh-Hant": ["工作規劃"]
230
+ }
231
+ },
232
+ {
233
+ "name": "preferences.work_schedule",
234
+ "domain": "work_style",
235
+ "synonyms": {
236
+ "de": ["Arbeitszeit"],
237
+ "en": [
238
+ "work schedule",
239
+ "working hours",
240
+ "focus time",
241
+ "deep work"
242
+ ],
243
+ "es": ["horario laboral"],
244
+ "fr": ["horaire de travail"],
245
+ "ja": ["勤務時間"],
246
+ "ko": ["근무 일정"],
247
+ "ru": ["рабочий график"],
248
+ "zh": ["工作时间"],
249
+ "zh-Hant": ["工作時間"]
250
+ }
251
+ },
252
+ {
253
+ "name": "preferences.work_environment",
254
+ "domain": "work_style",
255
+ "synonyms": {
256
+ "de": ["Arbeitsumgebung"],
257
+ "en": [
258
+ "work environment",
259
+ "office setup",
260
+ "remote work"
261
+ ],
262
+ "es": ["entorno de trabajo"],
263
+ "fr": ["environnement de travail"],
264
+ "ja": ["作業環境"],
265
+ "ko": ["업무 환경"],
266
+ "ru": ["рабочая среда"],
267
+ "zh": ["工作环境"],
268
+ "zh-Hant": ["工作環境"]
269
+ }
270
+ },
271
+ {
272
+ "name": "preferences.documentation",
273
+ "domain": "work_style",
274
+ "synonyms": {
275
+ "de": ["Dokumentationsstil"],
276
+ "en": [
277
+ "documentation style",
278
+ "written documentation",
279
+ "technical documentation"
280
+ ],
281
+ "es": ["estilo de documentación"],
282
+ "fr": ["style de documentation"],
283
+ "ja": ["文書化方針"],
284
+ "ko": ["문서화 방식"],
285
+ "ru": ["стиль документации"],
286
+ "zh": ["文档方式"],
287
+ "zh-Hant": ["文件方式"]
288
+ }
289
+ },
290
+ {
291
+ "name": "preferences.collaboration_mode",
292
+ "domain": "collaboration",
293
+ "synonyms": {
294
+ "de": ["Zusammenarbeitsform"],
295
+ "en": [
296
+ "collaboration mode",
297
+ "pairing style",
298
+ "team collaboration"
299
+ ],
300
+ "es": ["modo de colaboración"],
301
+ "fr": ["mode de collaboration"],
302
+ "ja": ["協働スタイル"],
303
+ "ko": ["협업 방식"],
304
+ "ru": ["формат сотрудничества"],
305
+ "zh": ["协作方式"],
306
+ "zh-Hant": ["協作方式"]
307
+ }
308
+ },
309
+ {
310
+ "name": "preferences.delegation",
311
+ "domain": "collaboration",
312
+ "synonyms": {
313
+ "de": ["Delegationsstil"],
314
+ "en": [
315
+ "delegation style",
316
+ "task ownership",
317
+ "delegation"
318
+ ],
319
+ "es": ["estilo de delegación"],
320
+ "fr": ["style de délégation"],
321
+ "ja": ["委任方法"],
322
+ "ko": ["위임 방식"],
323
+ "ru": ["стиль делегирования"],
324
+ "zh": ["委派方式"],
325
+ "zh-Hant": ["委派方式"]
326
+ }
327
+ },
328
+ {
329
+ "name": "preferences.decision_process",
330
+ "domain": "collaboration",
331
+ "synonyms": {
332
+ "de": ["Entscheidungsprozess"],
333
+ "en": [
334
+ "decision process",
335
+ "consensus style",
336
+ "decision ownership"
337
+ ],
338
+ "es": ["proceso de decisión"],
339
+ "fr": ["processus de décision"],
340
+ "ja": ["意思決定方法"],
341
+ "ko": ["의사 결정 과정"],
342
+ "ru": ["процесс принятия решений"],
343
+ "zh": ["决策流程"],
344
+ "zh-Hant": ["決策流程"]
345
+ }
346
+ },
347
+ {
348
+ "name": "preferences.conflict_style",
349
+ "domain": "collaboration",
350
+ "synonyms": {
351
+ "de": ["Konfliktstil"],
352
+ "en": [
353
+ "conflict style",
354
+ "disagreement style",
355
+ "conflict resolution"
356
+ ],
357
+ "es": ["estilo de conflicto"],
358
+ "fr": ["style de conflit"],
359
+ "ja": ["対立解決方法"],
360
+ "ko": ["갈등 해결 방식"],
361
+ "ru": ["стиль разрешения конфликтов"],
362
+ "zh": ["冲突处理方式"],
363
+ "zh-Hant": ["衝突處理方式"]
364
+ }
365
+ },
366
+ {
367
+ "name": "preferences.mentoring",
368
+ "domain": "collaboration",
369
+ "synonyms": {
370
+ "de": ["Mentoringstil"],
371
+ "en": [
372
+ "mentoring style",
373
+ "coaching preference",
374
+ "learning support"
375
+ ],
376
+ "es": ["estilo de mentoría"],
377
+ "fr": ["style de mentorat"],
378
+ "ja": ["指導スタイル"],
379
+ "ko": ["멘토링 방식"],
380
+ "ru": ["стиль наставничества"],
381
+ "zh": ["指导方式"],
382
+ "zh-Hant": ["指導方式"]
383
+ }
384
+ },
385
+ {
386
+ "name": "preferences.task_management",
387
+ "domain": "productivity",
388
+ "synonyms": {
389
+ "de": ["Aufgabenverwaltung"],
390
+ "en": [
391
+ "task management",
392
+ "todo system",
393
+ "task tracking"
394
+ ],
395
+ "es": ["gestión de tareas"],
396
+ "fr": ["gestion des tâches"],
397
+ "ja": ["タスク管理"],
398
+ "ko": ["작업 관리"],
399
+ "ru": ["управление задачами"],
400
+ "zh": ["任务管理"],
401
+ "zh-Hant": ["任務管理"]
402
+ }
403
+ },
404
+ {
405
+ "name": "preferences.focus_pattern",
406
+ "domain": "productivity",
407
+ "synonyms": {
408
+ "de": ["Fokusmuster"],
409
+ "en": [
410
+ "focus pattern",
411
+ "concentration style",
412
+ "focus sessions"
413
+ ],
414
+ "es": ["patrón de concentración"],
415
+ "fr": ["mode de concentration"],
416
+ "ja": ["集中方法"],
417
+ "ko": ["집중 방식"],
418
+ "ru": ["режим концентрации"],
419
+ "zh": ["专注方式"],
420
+ "zh-Hant": ["專注方式"]
421
+ }
422
+ },
423
+ {
424
+ "name": "preferences.break_pattern",
425
+ "domain": "productivity",
426
+ "synonyms": {
427
+ "de": ["Pausenmuster"],
428
+ "en": [
429
+ "break pattern",
430
+ "rest breaks",
431
+ "pomodoro"
432
+ ],
433
+ "es": ["patrón de descansos"],
434
+ "fr": ["rythme des pauses"],
435
+ "ja": ["休憩方法"],
436
+ "ko": ["휴식 방식"],
437
+ "ru": ["режим перерывов"],
438
+ "zh": ["休息方式"],
439
+ "zh-Hant": ["休息方式"]
440
+ }
441
+ },
442
+ {
443
+ "name": "preferences.notification_style",
444
+ "domain": "productivity",
445
+ "synonyms": {
446
+ "de": ["Benachrichtigungsstil"],
447
+ "en": [
448
+ "notification style",
449
+ "alert preference",
450
+ "notification preference"
451
+ ],
452
+ "es": ["estilo de notificaciones"],
453
+ "fr": ["style de notification"],
454
+ "ja": ["通知設定"],
455
+ "ko": ["알림 방식"],
456
+ "ru": ["стиль уведомлений"],
457
+ "zh": ["通知偏好"],
458
+ "zh-Hant": ["通知偏好"]
459
+ }
460
+ },
461
+ {
462
+ "name": "preferences.deadline_style",
463
+ "domain": "productivity",
464
+ "synonyms": {
465
+ "de": ["Fristenplanung"],
466
+ "en": [
467
+ "deadline style",
468
+ "due date preference",
469
+ "deadline planning"
470
+ ],
471
+ "es": ["planificación de plazos"],
472
+ "fr": ["gestion des échéances"],
473
+ "ja": ["締切管理"],
474
+ "ko": ["마감 관리"],
475
+ "ru": ["планирование сроков"],
476
+ "zh": ["截止日期规划"],
477
+ "zh-Hant": ["截止日期規劃"]
478
+ }
479
+ },
480
+ {
481
+ "name": "preferences.tooling_workflow",
482
+ "domain": "productivity",
483
+ "synonyms": {
484
+ "de": ["Werkzeugablauf"],
485
+ "en": [
486
+ "workflow tools",
487
+ "productivity tools",
488
+ "tooling workflow"
489
+ ],
490
+ "es": ["flujo de herramientas"],
491
+ "fr": ["flux d'outils"],
492
+ "ja": ["ツール運用"],
493
+ "ko": ["도구 작업 흐름"],
494
+ "ru": ["рабочий процесс инструментов"],
495
+ "zh": ["工具工作流"],
496
+ "zh-Hant": ["工具工作流程"]
497
+ }
498
+ },
499
+ {
500
+ "name": "preferences.productivity_method",
501
+ "domain": "productivity",
502
+ "synonyms": {
503
+ "de": ["Produktivitätsmethode"],
504
+ "en": [
505
+ "productivity",
506
+ "productivity methods",
507
+ "productivity strategies",
508
+ "time management"
509
+ ],
510
+ "es": ["método de productividad"],
511
+ "fr": ["méthode de productivité"],
512
+ "ja": ["生産性向上法"],
513
+ "ko": ["생산성 향상 방법"],
514
+ "ru": ["метод продуктивности"],
515
+ "zh": ["效率方法"],
516
+ "zh-Hant": ["效率方法"]
517
+ }
518
+ },
519
+ {
520
+ "name": "preferences.programming_language",
521
+ "domain": "technology",
522
+ "synonyms": {
523
+ "de": ["Programmiersprache"],
524
+ "en": [
525
+ "programming language",
526
+ "coding language",
527
+ "language stack"
528
+ ],
529
+ "es": ["lenguaje de programación"],
530
+ "fr": ["langage de programmation"],
531
+ "ja": ["プログラミング言語"],
532
+ "ko": ["프로그래밍 언어"],
533
+ "ru": ["язык программирования"],
534
+ "zh": ["编程语言"],
535
+ "zh-Hant": ["程式語言"]
536
+ }
537
+ },
538
+ {
539
+ "name": "preferences.framework",
540
+ "domain": "technology",
541
+ "synonyms": {
542
+ "de": ["Software-Framework"],
543
+ "en": [
544
+ "framework preference",
545
+ "software framework",
546
+ "application framework"
547
+ ],
548
+ "es": ["marco de software"],
549
+ "fr": ["cadre logiciel"],
550
+ "ja": ["ソフトウェアフレームワーク"],
551
+ "ko": ["소프트웨어 프레임워크"],
552
+ "ru": ["программный фреймворк"],
553
+ "zh": ["软件框架"],
554
+ "zh-Hant": ["軟體框架"]
555
+ }
556
+ },
557
+ {
558
+ "name": "preferences.editor",
559
+ "domain": "technology",
560
+ "synonyms": {
561
+ "de": ["Code-Editor"],
562
+ "en": [
563
+ "editor preference",
564
+ "code editor",
565
+ "development editor"
566
+ ],
567
+ "es": ["editor de código"],
568
+ "fr": ["éditeur de code"],
569
+ "ja": ["コードエディタ"],
570
+ "ko": ["코드 편집기"],
571
+ "ru": ["редактор кода"],
572
+ "zh": ["代码编辑器"],
573
+ "zh-Hant": ["程式碼編輯器"]
574
+ }
575
+ },
576
+ {
577
+ "name": "preferences.operating_system",
578
+ "domain": "technology",
579
+ "synonyms": {
580
+ "de": ["Betriebssystem"],
581
+ "en": [
582
+ "operating system",
583
+ "desktop platform",
584
+ "computer platform"
585
+ ],
586
+ "es": ["sistema operativo"],
587
+ "fr": ["système d'exploitation"],
588
+ "ja": ["オペレーティングシステム"],
589
+ "ko": ["운영 체제"],
590
+ "ru": ["операционная система"],
591
+ "zh": ["操作系统"],
592
+ "zh-Hant": ["作業系統"]
593
+ }
594
+ },
595
+ {
596
+ "name": "preferences.device",
597
+ "domain": "technology",
598
+ "synonyms": {
599
+ "de": ["Gerätepräferenz"],
600
+ "en": [
601
+ "device preference",
602
+ "computer hardware",
603
+ "mobile device"
604
+ ],
605
+ "es": ["dispositivo preferido"],
606
+ "fr": ["appareil préféré"],
607
+ "ja": ["端末の好み"],
608
+ "ko": ["기기 선호"],
609
+ "ru": ["предпочитаемое устройство"],
610
+ "zh": ["设备偏好"],
611
+ "zh-Hant": ["裝置偏好"]
612
+ }
613
+ },
614
+ {
615
+ "name": "preferences.ai_tools",
616
+ "domain": "technology",
617
+ "synonyms": {
618
+ "de": ["KI-Werkzeuge"],
619
+ "en": [
620
+ "ai tools",
621
+ "assistant tools",
622
+ "coding assistant"
623
+ ],
624
+ "es": ["herramientas de IA"],
625
+ "fr": ["outils d'IA"],
626
+ "ja": ["AIツール"],
627
+ "ko": ["인공지능 도구"],
628
+ "ru": ["инструменты ИИ"],
629
+ "zh": ["人工智能工具"],
630
+ "zh-Hant": ["人工智慧工具"]
631
+ }
632
+ },
633
+ {
634
+ "name": "preferences.ai_interests",
635
+ "domain": "technology",
636
+ "synonyms": {
637
+ "de": ["KI-Interessen"],
638
+ "en": [
639
+ "ai interests",
640
+ "ai ethics",
641
+ "ai applications",
642
+ "machine learning interests",
643
+ "neural networks"
644
+ ],
645
+ "es": ["intereses en inteligencia artificial"],
646
+ "fr": ["intérêts en intelligence artificielle"],
647
+ "ja": ["AIへの関心"],
648
+ "ko": ["인공지능 관심사"],
649
+ "ru": ["интересы в ИИ"],
650
+ "zh": ["人工智能兴趣"],
651
+ "zh-Hant": ["人工智慧興趣"]
652
+ }
653
+ },
654
+ {
655
+ "name": "preferences.science_interests",
656
+ "domain": "technology",
657
+ "synonyms": {
658
+ "de": ["Wissenschaftsinteressen"],
659
+ "en": [
660
+ "science interests",
661
+ "science and technology interests",
662
+ "science learning",
663
+ "quantum computing"
664
+ ],
665
+ "es": ["intereses científicos"],
666
+ "fr": ["intérêts scientifiques"],
667
+ "ja": ["科学への関心"],
668
+ "ko": ["과학 관심사"],
669
+ "ru": ["научные интересы"],
670
+ "zh": ["科学兴趣"],
671
+ "zh-Hant": ["科學興趣"]
672
+ }
673
+ },
674
+ {
675
+ "name": "preferences.renewable_energy",
676
+ "domain": "technology",
677
+ "synonyms": {
678
+ "de": ["erneuerbare Energie"],
679
+ "en": [
680
+ "renewable energy",
681
+ "renewable-energy interests",
682
+ "sustainable technology"
683
+ ],
684
+ "es": ["energía renovable"],
685
+ "fr": ["énergie renouvelable"],
686
+ "ja": ["再生可能エネルギー"],
687
+ "ko": ["재생 에너지"],
688
+ "ru": ["возобновляемая энергия"],
689
+ "zh": ["可再生能源"],
690
+ "zh-Hant": ["再生能源"]
691
+ }
692
+ },
693
+ {
694
+ "name": "preferences.music",
695
+ "domain": "media",
696
+ "synonyms": {
697
+ "de": ["Musikgeschmack"],
698
+ "en": [
699
+ "music",
700
+ "music taste",
701
+ "personal music taste",
702
+ "favorite music"
703
+ ],
704
+ "es": ["gusto musical"],
705
+ "fr": ["goûts musicaux"],
706
+ "ja": ["音楽の好み"],
707
+ "ko": ["음악 취향"],
708
+ "ru": ["музыкальные предпочтения"],
709
+ "zh": ["音乐偏好"],
710
+ "zh-Hant": ["音樂偏好"]
711
+ }
712
+ },
713
+ {
714
+ "name": "preferences.books",
715
+ "domain": "media",
716
+ "synonyms": {
717
+ "de": ["Buchgeschmack"],
718
+ "en": [
719
+ "books",
720
+ "reading taste",
721
+ "book preference"
722
+ ],
723
+ "es": ["preferencias de libros"],
724
+ "fr": ["préférences de lecture"],
725
+ "ja": ["本の好み", "読書"],
726
+ "ko": ["책 취향", "독서"],
727
+ "ru": ["книжные предпочтения"],
728
+ "zh": ["书籍偏好", "看书"],
729
+ "zh-Hant": ["書籍偏好", "看書"]
730
+ }
731
+ },
732
+ {
733
+ "name": "preferences.movies",
734
+ "domain": "media",
735
+ "synonyms": {
736
+ "de": ["Filmgeschmack"],
737
+ "en": [
738
+ "movies",
739
+ "film taste",
740
+ "movie preference"
741
+ ],
742
+ "es": ["gusto cinematográfico"],
743
+ "fr": ["goûts cinématographiques"],
744
+ "ja": ["映画の好み"],
745
+ "ko": ["영화 취향"],
746
+ "ru": ["предпочтения в кино"],
747
+ "zh": ["电影偏好"],
748
+ "zh-Hant": ["電影偏好"]
749
+ }
750
+ },
751
+ {
752
+ "name": "preferences.film_directors",
753
+ "domain": "media",
754
+ "synonyms": {
755
+ "de": ["Filmregisseure"],
756
+ "en": [
757
+ "film directors",
758
+ "movie directors",
759
+ "director preferences"
760
+ ],
761
+ "es": ["directores de cine"],
762
+ "fr": ["réalisateurs de cinéma"],
763
+ "ja": ["映画監督"],
764
+ "ko": ["영화 감독"],
765
+ "ru": ["кинорежиссёры"],
766
+ "zh": ["电影导演"],
767
+ "zh-Hant": ["電影導演"]
768
+ }
769
+ },
770
+ {
771
+ "name": "preferences.screen_performers",
772
+ "domain": "media",
773
+ "synonyms": {
774
+ "de": ["Filmschauspieler"],
775
+ "en": [
776
+ "actors",
777
+ "acting performances",
778
+ "movie actors",
779
+ "film actors",
780
+ "celebrities"
781
+ ],
782
+ "es": ["actores de cine"],
783
+ "fr": ["acteurs de cinéma"],
784
+ "ja": ["映画俳優"],
785
+ "ko": ["영화 배우"],
786
+ "ru": ["киноактёры"],
787
+ "zh": ["影视演员"],
788
+ "zh-Hant": ["影視演員"]
789
+ }
790
+ },
791
+ {
792
+ "name": "preferences.history",
793
+ "domain": "media",
794
+ "synonyms": {
795
+ "de": ["Geschichtsinteressen"],
796
+ "en": [
797
+ "history interests",
798
+ "history analysis",
799
+ "history and technology",
800
+ "history and systems thinking"
801
+ ],
802
+ "es": ["intereses históricos"],
803
+ "fr": ["intérêts historiques"],
804
+ "ja": ["歴史への関心"],
805
+ "ko": ["역사 관심사"],
806
+ "ru": ["исторические интересы"],
807
+ "zh": ["历史兴趣"],
808
+ "zh-Hant": ["歷史興趣"]
809
+ }
810
+ },
811
+ {
812
+ "name": "preferences.television",
813
+ "domain": "media",
814
+ "synonyms": {
815
+ "de": ["Fernsehserien"],
816
+ "en": [
817
+ "television",
818
+ "tv shows",
819
+ "series preference"
820
+ ],
821
+ "es": ["series de televisión"],
822
+ "fr": ["séries télévisées"],
823
+ "ja": ["テレビ番組"],
824
+ "ko": ["텔레비전 프로그램"],
825
+ "ru": ["телевизионные сериалы"],
826
+ "zh": ["电视节目"],
827
+ "zh-Hant": ["電視節目"]
828
+ }
829
+ },
830
+ {
831
+ "name": "preferences.games",
832
+ "domain": "media",
833
+ "synonyms": {
834
+ "de": ["Spielegeschmack"],
835
+ "en": [
836
+ "games",
837
+ "video games",
838
+ "gaming taste"
839
+ ],
840
+ "es": ["preferencias de juegos"],
841
+ "fr": ["préférences de jeux"],
842
+ "ja": ["ゲームの好み"],
843
+ "ko": ["게임 취향"],
844
+ "ru": ["игровые предпочтения"],
845
+ "zh": ["游戏偏好"],
846
+ "zh-Hant": ["遊戲偏好"]
847
+ }
848
+ },
849
+ {
850
+ "name": "preferences.cuisine",
851
+ "domain": "food",
852
+ "synonyms": {
853
+ "de": ["Küchenvorliebe"],
854
+ "en": [
855
+ "cuisine",
856
+ "food preference",
857
+ "favorite food"
858
+ ],
859
+ "es": ["preferencia culinaria"],
860
+ "fr": ["préférence culinaire"],
861
+ "ja": ["料理の好み"],
862
+ "ko": ["요리 취향"],
863
+ "ru": ["кулинарные предпочтения"],
864
+ "zh": ["菜系偏好"],
865
+ "zh-Hant": ["菜系偏好"]
866
+ }
867
+ },
868
+ {
869
+ "name": "preferences.diet",
870
+ "domain": "food",
871
+ "synonyms": {
872
+ "de": ["Ernährungsweise"],
873
+ "en": [
874
+ "diet",
875
+ "dietary preference",
876
+ "eating pattern"
877
+ ],
878
+ "es": ["preferencia dietética"],
879
+ "fr": ["préférence alimentaire"],
880
+ "ja": ["食事方針"],
881
+ "ko": ["식단 선호"],
882
+ "ru": ["пищевые предпочтения"],
883
+ "zh": ["饮食偏好"],
884
+ "zh-Hant": ["飲食偏好"]
885
+ }
886
+ },
887
+ {
888
+ "name": "preferences.drinks",
889
+ "domain": "food",
890
+ "synonyms": {
891
+ "de": ["Getränkevorliebe"],
892
+ "en": [
893
+ "drinks",
894
+ "beverage preference",
895
+ "favorite drink"
896
+ ],
897
+ "es": ["bebida preferida"],
898
+ "fr": ["boisson préférée"],
899
+ "ja": ["飲み物の好み"],
900
+ "ko": ["음료 취향"],
901
+ "ru": ["предпочтения в напитках"],
902
+ "zh": ["饮品偏好"],
903
+ "zh-Hant": ["飲品偏好"]
904
+ }
905
+ },
906
+ {
907
+ "name": "preferences.coffee_budget",
908
+ "domain": "food",
909
+ "synonyms": {
910
+ "de": ["Kaffeebudget"],
911
+ "en": [
912
+ "coffee budget",
913
+ "coffee price budget",
914
+ "coffee spending"
915
+ ],
916
+ "es": ["presupuesto de café"],
917
+ "fr": ["budget café"],
918
+ "ja": ["コーヒーの予算"],
919
+ "ko": ["커피 예산"],
920
+ "ru": ["бюджет на кофе"],
921
+ "zh": ["咖啡预算"],
922
+ "zh-Hant": ["咖啡預算"]
923
+ }
924
+ },
925
+ {
926
+ "name": "preferences.food_budget",
927
+ "domain": "food",
928
+ "synonyms": {
929
+ "de": ["Essensbudget"],
930
+ "en": [
931
+ "food budget",
932
+ "breakfast budget",
933
+ "lunch budget",
934
+ "dinner budget",
935
+ "grocery budget"
936
+ ],
937
+ "es": ["presupuesto de comida"],
938
+ "fr": ["budget alimentaire"],
939
+ "ja": ["食費の予算"],
940
+ "ko": ["식비 예산"],
941
+ "ru": ["бюджет на питание"],
942
+ "zh": ["餐饮预算"],
943
+ "zh-Hant": ["餐飲預算"]
944
+ }
945
+ },
946
+ {
947
+ "name": "preferences.restaurants",
948
+ "domain": "food",
949
+ "synonyms": {
950
+ "de": ["Restaurantvorlieben"],
951
+ "en": [
952
+ "restaurants",
953
+ "dining preference",
954
+ "restaurant style"
955
+ ],
956
+ "es": ["preferencias de restaurantes"],
957
+ "fr": ["préférences de restaurants"],
958
+ "ja": ["飲食店の好み"],
959
+ "ko": ["식당 취향"],
960
+ "ru": ["предпочтения ресторанов"],
961
+ "zh": ["餐厅偏好"],
962
+ "zh-Hant": ["餐廳偏好"]
963
+ }
964
+ },
965
+ {
966
+ "name": "preferences.cooking",
967
+ "domain": "food",
968
+ "synonyms": {
969
+ "de": ["Kochvorliebe"],
970
+ "en": [
971
+ "cooking",
972
+ "cooking preference",
973
+ "meal preparation"
974
+ ],
975
+ "es": ["preferencia de cocina"],
976
+ "fr": ["préférence de cuisine"],
977
+ "ja": ["調理の好み"],
978
+ "ko": ["조리 취향"],
979
+ "ru": ["предпочтения в готовке"],
980
+ "zh": ["烹饪偏好"],
981
+ "zh-Hant": ["烹飪偏好"]
982
+ }
983
+ },
984
+ {
985
+ "name": "preferences.destination",
986
+ "domain": "travel",
987
+ "synonyms": {
988
+ "de": ["Reiseziel"],
989
+ "en": [
990
+ "travel destination",
991
+ "destination preference",
992
+ "places to visit"
993
+ ],
994
+ "es": ["destino de viaje"],
995
+ "fr": ["destination de voyage"],
996
+ "ja": ["旅行先"],
997
+ "ko": ["여행 목적지"],
998
+ "ru": ["место путешествия"],
999
+ "zh": ["旅行目的地"],
1000
+ "zh-Hant": ["旅行目的地"]
1001
+ }
1002
+ },
1003
+ {
1004
+ "name": "preferences.travel_climate",
1005
+ "domain": "travel",
1006
+ "synonyms": {
1007
+ "de": ["Reiseklima"],
1008
+ "en": [
1009
+ "travel climate",
1010
+ "vacation weather",
1011
+ "warm climate",
1012
+ "cool climate"
1013
+ ],
1014
+ "es": ["clima de viaje"],
1015
+ "fr": ["climat de voyage"],
1016
+ "ja": ["旅行の気候"],
1017
+ "ko": ["여행 기후"],
1018
+ "ru": ["климат для путешествий"],
1019
+ "zh": ["旅行气候", "温暖气候"],
1020
+ "zh-Hant": ["旅行氣候", "溫暖氣候"]
1021
+ }
1022
+ },
1023
+ {
1024
+ "name": "preferences.transport",
1025
+ "domain": "travel",
1026
+ "synonyms": {
1027
+ "de": ["Reiseverkehrsmittel"],
1028
+ "en": [
1029
+ "travel transport",
1030
+ "transportation preference",
1031
+ "getting around"
1032
+ ],
1033
+ "es": ["transporte de viaje"],
1034
+ "fr": ["transport de voyage"],
1035
+ "ja": ["旅行の移動手段"],
1036
+ "ko": ["여행 교통수단"],
1037
+ "ru": ["транспорт в путешествии"],
1038
+ "zh": ["旅行交通方式"],
1039
+ "zh-Hant": ["旅行交通方式"]
1040
+ }
1041
+ },
1042
+ {
1043
+ "name": "preferences.accommodation",
1044
+ "domain": "travel",
1045
+ "synonyms": {
1046
+ "de": ["Unterkunftsvorliebe"],
1047
+ "en": [
1048
+ "accommodation",
1049
+ "lodging preference",
1050
+ "hotel preference"
1051
+ ],
1052
+ "es": ["preferencia de alojamiento"],
1053
+ "fr": ["préférence d'hébergement"],
1054
+ "ja": ["宿泊先の好み"],
1055
+ "ko": ["숙박 선호"],
1056
+ "ru": ["предпочтения по жилью"],
1057
+ "zh": ["住宿偏好"],
1058
+ "zh-Hant": ["住宿偏好"]
1059
+ }
1060
+ },
1061
+ {
1062
+ "name": "preferences.trip_pace",
1063
+ "domain": "travel",
1064
+ "synonyms": {
1065
+ "de": ["Reisetempo"],
1066
+ "en": [
1067
+ "trip pace",
1068
+ "travel pace",
1069
+ "itinerary pace"
1070
+ ],
1071
+ "es": ["ritmo de viaje"],
1072
+ "fr": ["rythme de voyage"],
1073
+ "ja": ["旅行のペース"],
1074
+ "ko": ["여행 속도"],
1075
+ "ru": ["темп путешествия"],
1076
+ "zh": ["旅行节奏"],
1077
+ "zh-Hant": ["旅行節奏"]
1078
+ }
1079
+ },
1080
+ {
1081
+ "name": "preferences.travel_company",
1082
+ "domain": "travel",
1083
+ "synonyms": {
1084
+ "de": ["Reisebegleitung"],
1085
+ "en": [
1086
+ "travel company",
1087
+ "solo travel",
1088
+ "group travel"
1089
+ ],
1090
+ "es": ["compañía de viaje"],
1091
+ "fr": ["compagnie de voyage"],
1092
+ "ja": ["旅行の同行者"],
1093
+ "ko": ["여행 동행"],
1094
+ "ru": ["компания в путешествии"],
1095
+ "zh": ["旅行同伴"],
1096
+ "zh-Hant": ["旅行同伴"]
1097
+ }
1098
+ },
1099
+ {
1100
+ "name": "preferences.exercise",
1101
+ "domain": "lifestyle",
1102
+ "synonyms": {
1103
+ "de": ["Trainingsvorliebe"],
1104
+ "en": [
1105
+ "exercise",
1106
+ "fitness preference",
1107
+ "workout style"
1108
+ ],
1109
+ "es": ["preferencia de ejercicio"],
1110
+ "fr": ["préférence d'exercice"],
1111
+ "ja": ["運動の好み"],
1112
+ "ko": ["운동 취향"],
1113
+ "ru": ["предпочтения в тренировках"],
1114
+ "zh": ["运动偏好"],
1115
+ "zh-Hant": ["運動偏好"]
1116
+ }
1117
+ },
1118
+ {
1119
+ "name": "preferences.sleep",
1120
+ "domain": "lifestyle",
1121
+ "synonyms": {
1122
+ "de": ["Schlafrhythmus"],
1123
+ "en": [
1124
+ "sleep",
1125
+ "sleep schedule",
1126
+ "bedtime preference"
1127
+ ],
1128
+ "es": ["horario de sueño"],
1129
+ "fr": ["rythme de sommeil"],
1130
+ "ja": ["睡眠習慣"],
1131
+ "ko": ["수면 습관"],
1132
+ "ru": ["режим сна"],
1133
+ "zh": ["睡眠习惯"],
1134
+ "zh-Hant": ["睡眠習慣"]
1135
+ }
1136
+ },
1137
+ {
1138
+ "name": "preferences.hobbies",
1139
+ "domain": "lifestyle",
1140
+ "synonyms": {
1141
+ "de": ["Hobbys"],
1142
+ "en": [
1143
+ "hobbies",
1144
+ "leisure activities",
1145
+ "pastimes"
1146
+ ],
1147
+ "es": ["aficiones"],
1148
+ "fr": ["loisirs"],
1149
+ "ja": ["趣味活動"],
1150
+ "ko": ["취미 활동"],
1151
+ "ru": ["увлечения"],
1152
+ "zh": ["兴趣爱好"],
1153
+ "zh-Hant": ["興趣愛好"]
1154
+ }
1155
+ },
1156
+ {
1157
+ "name": "preferences.fashion",
1158
+ "domain": "lifestyle",
1159
+ "synonyms": {
1160
+ "de": ["Modestil"],
1161
+ "en": [
1162
+ "fashion",
1163
+ "clothing style",
1164
+ "style preference"
1165
+ ],
1166
+ "es": ["estilo de moda"],
1167
+ "fr": ["style vestimentaire"],
1168
+ "ja": ["服装の好み"],
1169
+ "ko": ["패션 취향"],
1170
+ "ru": ["стиль одежды"],
1171
+ "zh": ["穿衣风格"],
1172
+ "zh-Hant": ["穿衣風格"]
1173
+ }
1174
+ },
1175
+ {
1176
+ "name": "preferences.home",
1177
+ "domain": "lifestyle",
1178
+ "synonyms": {
1179
+ "de": ["Wohnstil"],
1180
+ "en": [
1181
+ "home preference",
1182
+ "living space",
1183
+ "home style"
1184
+ ],
1185
+ "es": ["estilo del hogar"],
1186
+ "fr": ["style de maison"],
1187
+ "ja": ["住まいの好み"],
1188
+ "ko": ["주거 취향"],
1189
+ "ru": ["стиль дома"],
1190
+ "zh": ["居家偏好"],
1191
+ "zh-Hant": ["居家偏好"]
1192
+ }
1193
+ },
1194
+ {
1195
+ "name": "preferences.priorities",
1196
+ "domain": "values",
1197
+ "synonyms": {
1198
+ "de": ["persönliche Prioritäten"],
1199
+ "en": [
1200
+ "personal priorities",
1201
+ "priority preference",
1202
+ "what matters"
1203
+ ],
1204
+ "es": ["prioridades personales"],
1205
+ "fr": ["priorités personnelles"],
1206
+ "ja": ["個人の優先事項"],
1207
+ "ko": ["개인 우선순위"],
1208
+ "ru": ["личные приоритеты"],
1209
+ "zh": ["个人优先事项"],
1210
+ "zh-Hant": ["個人優先事項"]
1211
+ }
1212
+ },
1213
+ {
1214
+ "name": "preferences.risk_tolerance",
1215
+ "domain": "values",
1216
+ "synonyms": {
1217
+ "de": ["Risikotoleranz"],
1218
+ "en": [
1219
+ "risk tolerance",
1220
+ "risk preference",
1221
+ "risk appetite"
1222
+ ],
1223
+ "es": ["tolerancia al riesgo"],
1224
+ "fr": ["tolérance au risque"],
1225
+ "ja": ["リスク許容度"],
1226
+ "ko": ["위험 감수 성향"],
1227
+ "ru": ["терпимость к риску"],
1228
+ "zh": ["风险承受度"],
1229
+ "zh-Hant": ["風險承受度"]
1230
+ }
1231
+ },
1232
+ {
1233
+ "name": "preferences.privacy",
1234
+ "domain": "values",
1235
+ "synonyms": {
1236
+ "de": ["Datenschutzpräferenz"],
1237
+ "en": [
1238
+ "privacy preference",
1239
+ "data privacy",
1240
+ "personal privacy"
1241
+ ],
1242
+ "es": ["preferencia de privacidad"],
1243
+ "fr": ["préférence de confidentialité"],
1244
+ "ja": ["プライバシー方針"],
1245
+ "ko": ["개인정보 선호"],
1246
+ "ru": ["предпочтения конфиденциальности"],
1247
+ "zh": ["隐私偏好"],
1248
+ "zh-Hant": ["隱私偏好"]
1249
+ }
1250
+ },
1251
+ {
1252
+ "name": "preferences.sustainability",
1253
+ "domain": "values",
1254
+ "synonyms": {
1255
+ "de": ["Nachhaltigkeit"],
1256
+ "en": [
1257
+ "sustainability",
1258
+ "environmental preference",
1259
+ "eco friendly"
1260
+ ],
1261
+ "es": ["sostenibilidad"],
1262
+ "fr": ["durabilité"],
1263
+ "ja": ["持続可能性"],
1264
+ "ko": ["지속 가능성"],
1265
+ "ru": ["устойчивое развитие"],
1266
+ "zh": ["可持续性"],
1267
+ "zh-Hant": ["永續性"]
1268
+ }
1269
+ },
1270
+ {
1271
+ "name": "preferences.consciousness",
1272
+ "domain": "values",
1273
+ "synonyms": {
1274
+ "de": ["Bewusstseinstheorien"],
1275
+ "en": [
1276
+ "consciousness",
1277
+ "consciousness theories",
1278
+ "neuroscience and consciousness"
1279
+ ],
1280
+ "es": ["teorías de la conciencia"],
1281
+ "fr": ["théories de la conscience"],
1282
+ "ja": ["意識の理論"],
1283
+ "ko": ["의식 이론"],
1284
+ "ru": ["теории сознания"],
1285
+ "zh": ["意识理论"],
1286
+ "zh-Hant": ["意識理論"]
1287
+ }
1288
+ },
1289
+ {
1290
+ "name": "preferences.general",
1291
+ "domain": "values",
1292
+ "synonyms": {
1293
+ "de": ["allgemeine Präferenz"],
1294
+ "en": [
1295
+ "general preference",
1296
+ "other preference",
1297
+ "lifestyle"
1298
+ ],
1299
+ "es": ["preferencia general"],
1300
+ "fr": ["préférence générale"],
1301
+ "ja": ["一般的な好み"],
1302
+ "ko": ["일반 선호"],
1303
+ "ru": ["общие предпочтения"],
1304
+ "zh": ["一般偏好"],
1305
+ "zh-Hant": ["一般偏好"]
1306
+ }
1307
+ },
1308
+ {
1309
+ "name": "entities.person",
1310
+ "domain": "entities",
1311
+ "synonyms": {
1312
+ "de": ["Person"],
1313
+ "en": [
1314
+ "person",
1315
+ "manager",
1316
+ "teammate"
1317
+ ],
1318
+ "es": ["persona"],
1319
+ "fr": ["personne"],
1320
+ "ja": ["人物"],
1321
+ "ko": ["인물"],
1322
+ "ru": ["человек"],
1323
+ "zh": ["人物实体"],
1324
+ "zh-Hant": ["人物實體"]
1325
+ }
1326
+ },
1327
+ {
1328
+ "name": "entities.project",
1329
+ "domain": "entities",
1330
+ "synonyms": {
1331
+ "de": ["Projekt"],
1332
+ "en": ["project", "project scope"],
1333
+ "es": ["proyecto"],
1334
+ "fr": ["projet"],
1335
+ "ja": ["プロジェクト"],
1336
+ "ko": ["프로젝트"],
1337
+ "ru": ["проект"],
1338
+ "zh": ["项目实体"],
1339
+ "zh-Hant": ["專案實體"]
1340
+ }
1341
+ },
1342
+ {
1343
+ "name": "entities.team",
1344
+ "domain": "entities",
1345
+ "synonyms": {
1346
+ "de": ["Arbeitsteam"],
1347
+ "en": ["team", "working group"],
1348
+ "es": ["equipo de trabajo"],
1349
+ "fr": ["équipe de travail"],
1350
+ "ja": ["作業チーム"],
1351
+ "ko": ["업무 팀"],
1352
+ "ru": ["рабочая команда"],
1353
+ "zh": ["团队实体"],
1354
+ "zh-Hant": ["團隊實體"]
1355
+ }
1356
+ },
1357
+ {
1358
+ "name": "entities.organization",
1359
+ "domain": "entities",
1360
+ "synonyms": {
1361
+ "de": ["Organisation"],
1362
+ "en": [
1363
+ "organization",
1364
+ "company",
1365
+ "vendor"
1366
+ ],
1367
+ "es": ["organización"],
1368
+ "fr": ["organisation"],
1369
+ "ja": ["組織"],
1370
+ "ko": ["조직"],
1371
+ "ru": ["организация"],
1372
+ "zh": ["组织实体"],
1373
+ "zh-Hant": ["組織實體"]
1374
+ }
1375
+ },
1376
+ {
1377
+ "name": "entities.place",
1378
+ "domain": "entities",
1379
+ "synonyms": {
1380
+ "de": ["Ort"],
1381
+ "en": [
1382
+ "place",
1383
+ "location",
1384
+ "venue"
1385
+ ],
1386
+ "es": ["lugar"],
1387
+ "fr": ["lieu"],
1388
+ "ja": ["場所"],
1389
+ "ko": ["장소"],
1390
+ "ru": ["место"],
1391
+ "zh": ["地点实体"],
1392
+ "zh-Hant": ["地點實體"]
1393
+ }
1394
+ },
1395
+ {
1396
+ "name": "entities.product",
1397
+ "domain": "entities",
1398
+ "synonyms": {
1399
+ "de": ["Produkt"],
1400
+ "en": [
1401
+ "product",
1402
+ "service",
1403
+ "application"
1404
+ ],
1405
+ "es": ["producto"],
1406
+ "fr": ["produit"],
1407
+ "ja": ["製品"],
1408
+ "ko": ["제품"],
1409
+ "ru": ["продукт"],
1410
+ "zh": ["产品实体"],
1411
+ "zh-Hant": ["產品實體"]
1412
+ }
1413
+ },
1414
+ {
1415
+ "name": "entities.pet",
1416
+ "domain": "entities",
1417
+ "synonyms": {
1418
+ "de": ["Haustier"],
1419
+ "en": ["pet", "animal companion"],
1420
+ "es": ["mascota"],
1421
+ "fr": ["animal de compagnie"],
1422
+ "ja": ["ペット"],
1423
+ "ko": ["반려동물"],
1424
+ "ru": ["домашнее животное"],
1425
+ "zh": ["宠物实体"],
1426
+ "zh-Hant": ["寵物實體"]
1427
+ }
1428
+ },
1429
+ {
1430
+ "name": "entities.business",
1431
+ "domain": "entities",
1432
+ "synonyms": {
1433
+ "de": ["Geschäft"],
1434
+ "en": [
1435
+ "business",
1436
+ "store",
1437
+ "restaurant"
1438
+ ],
1439
+ "es": ["negocio"],
1440
+ "fr": ["commerce"],
1441
+ "ja": ["事業者"],
1442
+ "ko": ["사업체"],
1443
+ "ru": ["предприятие"],
1444
+ "zh": ["商家实体"],
1445
+ "zh-Hant": ["商家實體"]
1446
+ }
1447
+ },
1448
+ {
1449
+ "name": "entities.event",
1450
+ "domain": "entities",
1451
+ "synonyms": {
1452
+ "de": ["Veranstaltung"],
1453
+ "en": [
1454
+ "event",
1455
+ "conference",
1456
+ "appointment"
1457
+ ],
1458
+ "es": ["evento"],
1459
+ "fr": ["événement"],
1460
+ "ja": ["行事"],
1461
+ "ko": ["행사"],
1462
+ "ru": ["событие"],
1463
+ "zh": ["事件实体"],
1464
+ "zh-Hant": ["事件實體"]
1465
+ }
1466
+ }
1467
+ ],
1468
+ section_registry_sha256: "b3da09c82eb9c3892c73ccb0c1623f22dc787a15aaefac7511767b1c010ce1b1",
1469
+ source_git_rev: "dfc5e40194c6d8087c1a0c329856e177061ecf43"
1470
+ };
1471
+ //#endregion
1472
+ //#region src/engine/extraction/b-profile-section-registry.ts
1473
+ /** @file b-profile-section-registry.ts
1474
+ * @purpose Exposes the bundled B-profile section resource and pure topic normalization.
1475
+ * @boundary Matching code consumes registry data; taxonomy strings live in the JSON resource.
1476
+ */
1477
+ const B_PROFILE_SECTION_REGISTRY = b_profile_section_registry_default;
1478
+ function buildSynonymIndex(registry) {
1479
+ const index = /* @__PURE__ */ new Map();
1480
+ for (const section of registry.sections) {
1481
+ index.set(normalizeRegistryTerm$1(section.name), section.name);
1482
+ for (const synonym of section.synonyms.en) index.set(normalizeRegistryTerm$1(synonym), section.name);
1483
+ }
1484
+ return index;
1485
+ }
1486
+ function normalizeTopicToSectionName$1(topic, registry = B_PROFILE_SECTION_REGISTRY) {
1487
+ const synonymIndex = buildSynonymIndex(registry);
1488
+ const key = normalizeRegistryTerm$1(topic);
1489
+ const exact = synonymIndex.get(key);
1490
+ if (exact) return exact;
1491
+ const keyTokens = tokenizeTopic(key);
1492
+ const phrases = [...synonymIndex.keys()].sort((left, right) => right.length - left.length);
1493
+ for (const phrase of phrases) if (containsTokenRun(keyTokens, tokenizeTopic(phrase))) return synonymIndex.get(phrase) ?? "preferences.general";
1494
+ return "preferences.general";
1495
+ }
1496
+ function normalizeRegistryTerm$1(value) {
1497
+ return value.normalize("NFKC").trim().toLowerCase();
1498
+ }
1499
+ function tokenizeTopic(value) {
1500
+ return value.split(/[^a-z0-9]+/).filter(Boolean);
1501
+ }
1502
+ function containsTokenRun(haystack, needle) {
1503
+ if (needle.length === 0 || needle.length > haystack.length) return false;
1504
+ for (let start = 0; start + needle.length <= haystack.length; start++) {
1505
+ let matched = true;
1506
+ for (let offset = 0; offset < needle.length; offset++) if (haystack[start + offset] !== needle[offset]) {
1507
+ matched = false;
1508
+ break;
1509
+ }
1510
+ if (matched) return true;
1511
+ }
1512
+ return false;
1513
+ }
1514
+ //#endregion
1515
+ //#region src/engine/extraction/b-profile-section-dictionary-provider.ts
1516
+ /** @file b-profile-section-dictionary-provider.ts
1517
+ * @purpose Loads, validates, caches, and atomically activates the B-profile section dictionary.
1518
+ * @boundary Fetch transport is injected; this module owns no URL, HTTP client, or retry policy.
1519
+ */
1520
+ const log = createLogger("sno-station-mem:b-profile-section-dictionary");
1521
+ const CACHE_FILE_NAME = "b-profile-section-dictionary.json";
1522
+ const localeTermMapSchema = z.object({
1523
+ de: z.array(z.string().min(1)).min(1),
1524
+ en: z.array(z.string().min(1)).min(1),
1525
+ es: z.array(z.string().min(1)).min(1),
1526
+ fr: z.array(z.string().min(1)).min(1),
1527
+ ja: z.array(z.string().min(1)).min(1),
1528
+ ko: z.array(z.string().min(1)).min(1),
1529
+ ru: z.array(z.string().min(1)).min(1),
1530
+ zh: z.array(z.string().min(1)).min(1),
1531
+ "zh-Hant": z.array(z.string().min(1)).min(1)
1532
+ }).strict();
1533
+ const bProfileSectionRegistrySchema = z.object({
1534
+ schema_version: z.number().int().positive(),
1535
+ frozen_at: z.string().min(1),
1536
+ domains: z.array(z.string().min(1)).min(1),
1537
+ gate_prompt: z.object({
1538
+ instructions: z.string().min(1),
1539
+ registry_header: z.string().min(1),
1540
+ candidates_header: z.string().min(1),
1541
+ output_contract: z.string().min(1)
1542
+ }).strict(),
1543
+ active_task_shape: z.object({
1544
+ projection_max_items: z.number().int().positive(),
1545
+ projection_title_max_tokens: z.number().int().positive()
1546
+ }).strict(),
1547
+ sections: z.array(z.object({
1548
+ name: z.string().min(1),
1549
+ domain: z.string().min(1),
1550
+ synonyms: localeTermMapSchema
1551
+ }).strict()).min(1).max(128),
1552
+ section_registry_sha256: z.string().regex(/^[a-f0-9]{64}$/i),
1553
+ source_git_rev: z.string().min(1)
1554
+ }).strict().superRefine((registry, context) => {
1555
+ const sectionNames = /* @__PURE__ */ new Set();
1556
+ const termOwners = /* @__PURE__ */ new Map();
1557
+ const declaredDomains = new Set(registry.domains);
1558
+ if (declaredDomains.size !== registry.domains.length) context.addIssue({
1559
+ code: z.ZodIssueCode.custom,
1560
+ message: "domains must be unique",
1561
+ path: ["domains"]
1562
+ });
1563
+ for (const [index, section] of registry.sections.entries()) {
1564
+ const normalized = normalizeRegistryTerm(section.name);
1565
+ if (sectionNames.has(normalized)) {
1566
+ context.addIssue({
1567
+ code: z.ZodIssueCode.custom,
1568
+ message: "section names must be unique after normalization",
1569
+ path: [
1570
+ "sections",
1571
+ index,
1572
+ "name"
1573
+ ]
1574
+ });
1575
+ continue;
1576
+ }
1577
+ sectionNames.add(normalized);
1578
+ termOwners.set(normalized, section.name);
1579
+ if (!declaredDomains.has(section.domain)) context.addIssue({
1580
+ code: z.ZodIssueCode.custom,
1581
+ message: "section domain must reference a declared domain",
1582
+ path: [
1583
+ "sections",
1584
+ index,
1585
+ "domain"
1586
+ ]
1587
+ });
1588
+ for (const locale of SUPPORTED_LOCALES) for (const synonym of section.synonyms[locale]) {
1589
+ const normalized = normalizeRegistryTerm(synonym);
1590
+ const owner = termOwners.get(normalized);
1591
+ if (owner !== void 0 && owner !== section.name) {
1592
+ context.addIssue({
1593
+ code: z.ZodIssueCode.custom,
1594
+ message: "normalized synonyms must map to exactly one section_name",
1595
+ path: [
1596
+ "sections",
1597
+ index,
1598
+ "synonyms",
1599
+ locale
1600
+ ]
1601
+ });
1602
+ continue;
1603
+ }
1604
+ termOwners.set(normalized, section.name);
1605
+ }
1606
+ }
1607
+ if (computeSectionRegistryHash(registry) !== registry.section_registry_sha256) context.addIssue({
1608
+ code: z.ZodIssueCode.custom,
1609
+ message: "section_registry_sha256 must cover the runtime section dictionary",
1610
+ path: ["section_registry_sha256"]
1611
+ });
1612
+ });
1613
+ function computeSectionRegistryHash(registry) {
1614
+ return createHash("sha256").update(canonicalJson({
1615
+ schema_version: registry.schema_version,
1616
+ domains: registry.domains,
1617
+ gate_prompt: registry.gate_prompt,
1618
+ active_task_shape: registry.active_task_shape,
1619
+ sections: registry.sections
1620
+ })).digest("hex");
1621
+ }
1622
+ const sectionDictionaryCacheStateSchema = z.object({
1623
+ activeRegistry: bProfileSectionRegistrySchema,
1624
+ fetchedForPluginVersion: z.string().min(1).optional(),
1625
+ appliedSchemaVersion: z.number().int().positive().optional(),
1626
+ canonicalFormRepairVersion: z.number().int().positive().optional()
1627
+ }).strict();
1628
+ let activeRegistry = B_PROFILE_SECTION_REGISTRY;
1629
+ let loadQueue = Promise.resolve();
1630
+ var SectionDictionaryFileCache = class {
1631
+ filePath;
1632
+ constructor(stateDir) {
1633
+ this.filePath = join(stateDir, CACHE_FILE_NAME);
1634
+ }
1635
+ async read() {
1636
+ let raw;
1637
+ try {
1638
+ raw = await readFile(this.filePath, "utf8");
1639
+ } catch (error) {
1640
+ if (isNodeError(error) && error.code === "ENOENT") return void 0;
1641
+ throw error;
1642
+ }
1643
+ const parsedJson = JSON.parse(raw);
1644
+ return sectionDictionaryCacheStateSchema.parse(parsedJson);
1645
+ }
1646
+ async write(state) {
1647
+ const validated = sectionDictionaryCacheStateSchema.parse(state);
1648
+ const stateDir = dirname(this.filePath);
1649
+ await mkdir(stateDir, { recursive: true });
1650
+ const tempPath = `${this.filePath}.${process.pid}.${randomUUID()}.tmp`;
1651
+ let handle;
1652
+ try {
1653
+ handle = await open(tempPath, "wx", 384);
1654
+ await handle.writeFile(`${JSON.stringify(validated)}\n`, "utf8");
1655
+ await handle.sync();
1656
+ await handle.close();
1657
+ handle = void 0;
1658
+ await rename(tempPath, this.filePath);
1659
+ const directoryHandle = await open(stateDir, "r");
1660
+ try {
1661
+ await directoryHandle.sync();
1662
+ } finally {
1663
+ await directoryHandle.close();
1664
+ }
1665
+ } catch (error) {
1666
+ await handle?.close().catch(() => void 0);
1667
+ await unlink(tempPath).catch(() => void 0);
1668
+ throw error;
1669
+ }
1670
+ }
1671
+ };
1672
+ function createSectionDictionaryCache(stateDir = getSnoStationMemDataDir()) {
1673
+ return new SectionDictionaryFileCache(stateDir);
1674
+ }
1675
+ function getActiveSectionRegistry() {
1676
+ return activeRegistry;
1677
+ }
1678
+ function normalizeTopicToSectionName(topic, registry = activeRegistry) {
1679
+ return normalizeTopicToSectionName$1(topic, registry);
1680
+ }
1681
+ async function restoreCachedSectionDictionary(args) {
1682
+ if (args.mode === "local-first") {
1683
+ activeRegistry = B_PROFILE_SECTION_REGISTRY;
1684
+ return activeRegistry;
1685
+ }
1686
+ try {
1687
+ const cached = await args.cache.read();
1688
+ activeRegistry = cached ? bProfileSectionRegistrySchema.parse(cached.activeRegistry) : B_PROFILE_SECTION_REGISTRY;
1689
+ } catch (error) {
1690
+ activeRegistry = B_PROFILE_SECTION_REGISTRY;
1691
+ log.warn("section dictionary cache rejected; using bundled snapshot", { error }, {
1692
+ event_name: "sno_station_mem.b-profile-section-dictionary-provider.section.dictionary.cache.rejected.using.bundled.snapshot",
1693
+ file: "packages/memory/src/engine/extraction/b-profile-section-dictionary-provider.ts",
1694
+ function: "restoreCachedSectionDictionary",
1695
+ site_id: "b-profile-section-dictionary-provider.restoreCachedSectionDictionary.a4518aedd5"
1696
+ });
1697
+ }
1698
+ return activeRegistry;
1699
+ }
1700
+ function loadSectionDictionary(args) {
1701
+ if (args.mode === "local-first") {
1702
+ activeRegistry = B_PROFILE_SECTION_REGISTRY;
1703
+ return Promise.resolve({
1704
+ registry: activeRegistry,
1705
+ fetched: false
1706
+ });
1707
+ }
1708
+ const result = loadQueue.then(() => loadRemoteSectionDictionary(args));
1709
+ loadQueue = result.then(() => void 0, () => void 0);
1710
+ return result;
1711
+ }
1712
+ async function loadRemoteSectionDictionary(args) {
1713
+ let cached;
1714
+ try {
1715
+ const candidate = await args.cache.read();
1716
+ cached = candidate === void 0 ? void 0 : sectionDictionaryCacheStateSchema.parse(candidate);
1717
+ } catch (error) {
1718
+ log.warn("section dictionary cache rejected; using bundled snapshot", { error }, {
1719
+ event_name: "sno_station_mem.b-profile-section-dictionary-provider.section.dictionary.cache.rejected.using.bundled.snapshot",
1720
+ file: "packages/memory/src/engine/extraction/b-profile-section-dictionary-provider.ts",
1721
+ function: "loadRemoteSectionDictionary",
1722
+ site_id: "b-profile-section-dictionary-provider.loadRemoteSectionDictionary.ac5ddcab10"
1723
+ });
1724
+ }
1725
+ const fallbackRegistry = cached?.activeRegistry ?? B_PROFILE_SECTION_REGISTRY;
1726
+ activeRegistry = fallbackRegistry;
1727
+ if (cached?.fetchedForPluginVersion === args.pluginVersion) return {
1728
+ registry: activeRegistry,
1729
+ fetched: false
1730
+ };
1731
+ const attemptState = {
1732
+ activeRegistry: fallbackRegistry,
1733
+ fetchedForPluginVersion: args.pluginVersion,
1734
+ ...cached?.appliedSchemaVersion === void 0 ? {} : { appliedSchemaVersion: cached.appliedSchemaVersion },
1735
+ ...cached?.canonicalFormRepairVersion === void 0 ? {} : { canonicalFormRepairVersion: cached.canonicalFormRepairVersion }
1736
+ };
1737
+ try {
1738
+ await args.cache.write(sectionDictionaryCacheStateSchema.parse(attemptState));
1739
+ } catch (error) {
1740
+ log.warn("section dictionary fetch marker could not be persisted; fetch skipped", {
1741
+ version: args.pluginVersion,
1742
+ error
1743
+ }, {
1744
+ event_name: "sno_station_mem.b-profile-section-dictionary-provider.section.dictionary.fetch.marker.could.not.be.persisted.fetch.skipped",
1745
+ file: "packages/memory/src/engine/extraction/b-profile-section-dictionary-provider.ts",
1746
+ function: "loadRemoteSectionDictionary",
1747
+ site_id: "b-profile-section-dictionary-provider.loadRemoteSectionDictionary.a8ecb1a4f2"
1748
+ });
1749
+ return {
1750
+ registry: activeRegistry,
1751
+ fetched: false
1752
+ };
1753
+ }
1754
+ try {
1755
+ const payload = await args.fetchFn();
1756
+ const registry = bProfileSectionRegistrySchema.parse(payload);
1757
+ assertAdditiveSectionNames(fallbackRegistry, registry);
1758
+ assertStableSynonymOwners(fallbackRegistry, registry);
1759
+ await args.cache.write(sectionDictionaryCacheStateSchema.parse({
1760
+ ...attemptState,
1761
+ activeRegistry: registry
1762
+ }));
1763
+ activeRegistry = registry;
1764
+ return {
1765
+ registry: activeRegistry,
1766
+ fetched: true
1767
+ };
1768
+ } catch (error) {
1769
+ log.warn("section dictionary fetch rejected; keeping last good registry", {
1770
+ version: args.pluginVersion,
1771
+ error
1772
+ }, {
1773
+ event_name: "sno_station_mem.b-profile-section-dictionary-provider.section.dictionary.fetch.rejected.keeping.last.good.registry",
1774
+ file: "packages/memory/src/engine/extraction/b-profile-section-dictionary-provider.ts",
1775
+ function: "loadRemoteSectionDictionary",
1776
+ site_id: "b-profile-section-dictionary-provider.loadRemoteSectionDictionary.15ee874f33"
1777
+ });
1778
+ return {
1779
+ registry: activeRegistry,
1780
+ fetched: true
1781
+ };
1782
+ }
1783
+ }
1784
+ function assertStableSynonymOwners(previous, next) {
1785
+ const nextOwners = /* @__PURE__ */ new Map();
1786
+ for (const section of next.sections) {
1787
+ nextOwners.set(normalizeRegistryTerm(section.name), section.name);
1788
+ for (const locale of SUPPORTED_LOCALES) for (const synonym of section.synonyms[locale]) nextOwners.set(normalizeRegistryTerm(synonym), section.name);
1789
+ }
1790
+ for (const section of previous.sections) for (const locale of SUPPORTED_LOCALES) for (const synonym of section.synonyms[locale]) if (nextOwners.get(normalizeRegistryTerm(synonym)) !== section.name) throw new Error(`section dictionary cannot delete or reassign synonym '${synonym}' from '${section.name}'`);
1791
+ }
1792
+ function assertAdditiveSectionNames(previous, next) {
1793
+ const nextSectionNames = new Set(next.sections.map((section) => section.name));
1794
+ const removedSectionNames = previous.sections.map((section) => section.name).filter((sectionName) => !nextSectionNames.has(sectionName));
1795
+ if (removedSectionNames.length > 0) throw new Error(`section dictionary cannot rename or delete section names: ${removedSectionNames.join(", ")}`);
1796
+ }
1797
+ function normalizeRegistryTerm(term) {
1798
+ return term.normalize("NFKC").trim().toLowerCase();
1799
+ }
1800
+ function canonicalJson(value) {
1801
+ if (Array.isArray(value)) return `[${value.map(canonicalJson).join(",")}]`;
1802
+ if (value && typeof value === "object") {
1803
+ const record = value;
1804
+ return `{${Object.keys(record).sort().map((key) => `${JSON.stringify(key)}:${canonicalJson(record[key])}`).join(",")}}`;
1805
+ }
1806
+ return JSON.stringify(value) ?? "null";
1807
+ }
1808
+ function isNodeError(error) {
1809
+ return error instanceof Error && "code" in error;
1810
+ }
1811
+ //#endregion
1812
+ export { loadSectionDictionary as a, b_profile_section_registry_default as c, getActiveSectionRegistry as i, computeSectionRegistryHash as n, normalizeTopicToSectionName as o, createSectionDictionaryCache as r, restoreCachedSectionDictionary as s, bProfileSectionRegistrySchema as t };