@remnic/core 9.26.0 → 9.28.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 (440) hide show
  1. package/dist/access-admin-ops-surface.d.ts +13 -10
  2. package/dist/access-admin-ops-surface.js +43 -38
  3. package/dist/access-audit.js +2 -2
  4. package/dist/access-authorization-probe.d.ts +13 -10
  5. package/dist/access-authorization-probe.js +44 -39
  6. package/dist/access-boundary.d.ts +13 -10
  7. package/dist/access-boundary.js +43 -38
  8. package/dist/access-cli.js +100 -94
  9. package/dist/access-cli.js.map +1 -1
  10. package/dist/access-health-types.d.ts +10 -1
  11. package/dist/access-http-lcm-compaction.d.ts +13 -10
  12. package/dist/access-http.d.ts +13 -10
  13. package/dist/access-http.js +53 -48
  14. package/dist/access-identity-continuity-surface.d.ts +9 -8
  15. package/dist/access-identity-continuity-surface.js +43 -38
  16. package/dist/access-lcm-surface.d.ts +13 -10
  17. package/dist/access-lcm-surface.js +43 -38
  18. package/dist/access-mcp.d.ts +13 -10
  19. package/dist/access-mcp.js +48 -43
  20. package/dist/access-memory-search-fanout.d.ts +2 -2
  21. package/dist/{access-namespace-preflight-wRSZEO5V.d.ts → access-namespace-preflight-BiQ_-iUJ.d.ts} +1 -1
  22. package/dist/access-namespace-preflight.d.ts +3 -3
  23. package/dist/access-namespace-preflight.js +43 -38
  24. package/dist/access-observe-write-surface.d.ts +13 -10
  25. package/dist/access-observe-write-surface.js +43 -38
  26. package/dist/access-operations-batch.js +45 -40
  27. package/dist/access-operations.d.ts +16 -13
  28. package/dist/access-operations.js +47 -42
  29. package/dist/access-recall-concurrency.d.ts +13 -10
  30. package/dist/access-recall-concurrency.js +43 -38
  31. package/dist/access-recall-response.d.ts +13 -10
  32. package/dist/access-recall-response.js +43 -38
  33. package/dist/access-recall-surface.d.ts +13 -10
  34. package/dist/access-recall-surface.js +43 -38
  35. package/dist/access-schema.d.ts +80 -80
  36. package/dist/access-schema.js +4 -4
  37. package/dist/{access-service-DL8FJnTj.d.ts → access-service-CXkIgcGh.d.ts} +12 -8
  38. package/dist/access-service.d.ts +13 -10
  39. package/dist/access-service.js +43 -38
  40. package/dist/access-surface-catalog.d.ts +13 -10
  41. package/dist/access-wearables-meetings-surface.d.ts +4 -3
  42. package/dist/action-confidence.d.ts +1 -1
  43. package/dist/active-memory-bridge.d.ts +1 -1
  44. package/dist/active-recall.d.ts +1 -1
  45. package/dist/active-recall.js +4 -2
  46. package/dist/active-recall.js.map +1 -1
  47. package/dist/adapters/index.js +7 -7
  48. package/dist/adapters/registry.js +3 -3
  49. package/dist/behavior-learner.d.ts +1 -1
  50. package/dist/behavior-signals.d.ts +1 -1
  51. package/dist/bootstrap.d.ts +9 -8
  52. package/dist/briefing.d.ts +3 -2
  53. package/dist/briefing.js +12 -10
  54. package/dist/buffer-surprise-report.d.ts +1 -1
  55. package/dist/buffer.d.ts +3 -2
  56. package/dist/bulk-import/index.d.ts +3 -3
  57. package/dist/calibration.d.ts +1 -1
  58. package/dist/capabilities.d.ts +1 -1
  59. package/dist/{capsule-crypto-YO5QJ6L3.js → capsule-crypto-7FJQINUR.js} +2 -2
  60. package/dist/{catalog-BLLxZ5L5.d.ts → catalog-Bouj8Gfg.d.ts} +1 -1
  61. package/dist/causal-behavior.d.ts +1 -1
  62. package/dist/causal-consolidation.d.ts +1 -1
  63. package/dist/causal-consolidation.js +13 -11
  64. package/dist/causal-consolidation.js.map +1 -1
  65. package/dist/causal-trajectory-graph.d.ts +1 -1
  66. package/dist/{chunk-7RZJWZ46.js → chunk-227UFSEQ.js} +5 -5
  67. package/dist/{chunk-VGEH3STZ.js → chunk-2BEJ4XCF.js} +2 -2
  68. package/dist/{chunk-LIIQPDFN.js → chunk-2FYNLDKJ.js} +24 -3
  69. package/dist/chunk-2FYNLDKJ.js.map +1 -0
  70. package/dist/{chunk-BXLOS5AJ.js → chunk-2NLLXCJG.js} +2 -2
  71. package/dist/{chunk-6NNNURLK.js → chunk-2PHX3I5C.js} +8 -8
  72. package/dist/{chunk-YN4AUGNF.js → chunk-2TQ2UFKH.js} +65 -60
  73. package/dist/chunk-2TQ2UFKH.js.map +1 -0
  74. package/dist/{chunk-XAAIUXJO.js → chunk-3BSJBIZ3.js} +2 -2
  75. package/dist/{chunk-JCVQV6QX.js → chunk-3UOSVTFR.js} +11 -11
  76. package/dist/{chunk-AJ7QCSIS.js → chunk-7CPOZH6Y.js} +2 -2
  77. package/dist/{chunk-EXM2Q555.js → chunk-AHFZXUZM.js} +7 -5
  78. package/dist/chunk-AHFZXUZM.js.map +1 -0
  79. package/dist/{chunk-M2KGXXTL.js → chunk-ALTP3MFS.js} +2 -2
  80. package/dist/{chunk-77CNV7DY.js → chunk-BLAKS3CP.js} +4 -4
  81. package/dist/{chunk-FE5FKTCI.js → chunk-BR4UFMLO.js} +2 -2
  82. package/dist/chunk-CVILPI77.js +432 -0
  83. package/dist/chunk-CVILPI77.js.map +1 -0
  84. package/dist/{chunk-H2PBM562.js → chunk-DKQM5Q6Q.js} +2 -2
  85. package/dist/{chunk-CSXHRAJJ.js → chunk-EG64LXKL.js} +3 -3
  86. package/dist/{chunk-PTN6UAUA.js → chunk-ES36HTSC.js} +4 -4
  87. package/dist/{chunk-WMDRLTNA.js → chunk-EZWWCN7I.js} +2 -2
  88. package/dist/{chunk-XKGPIWGI.js → chunk-FBZTWUK5.js} +5 -5
  89. package/dist/{chunk-GJJBPI6I.js → chunk-FOCEI3TN.js} +6 -3
  90. package/dist/chunk-FOCEI3TN.js.map +1 -0
  91. package/dist/{chunk-Y6E37WRG.js → chunk-GJPCP5CA.js} +2 -2
  92. package/dist/{chunk-IHMXPG4P.js → chunk-GQSMYXKL.js} +6 -4
  93. package/dist/{chunk-IHMXPG4P.js.map → chunk-GQSMYXKL.js.map} +1 -1
  94. package/dist/{chunk-TGQ2NTWH.js → chunk-IJ6WHMFB.js} +16 -2
  95. package/dist/{chunk-TGQ2NTWH.js.map → chunk-IJ6WHMFB.js.map} +1 -1
  96. package/dist/{chunk-VDX2J7OX.js → chunk-IPLYGWQF.js} +6 -6
  97. package/dist/{chunk-XNUBF6RF.js → chunk-IYT632D5.js} +3 -3
  98. package/dist/{chunk-2QSZNTDO.js → chunk-JBPKEARU.js} +7 -7
  99. package/dist/{chunk-67DSDRUB.js → chunk-JIF3VRKQ.js} +8 -8
  100. package/dist/{chunk-V25OWXAC.js → chunk-JQ7T5VDC.js} +1 -1
  101. package/dist/chunk-JQ7T5VDC.js.map +1 -0
  102. package/dist/{chunk-MIFF37NN.js → chunk-KKBTBUVT.js} +2 -2
  103. package/dist/{chunk-ZHP4SUPB.js → chunk-LIHC3T43.js} +2 -2
  104. package/dist/{chunk-PX7VDW7R.js → chunk-MJPV4LBH.js} +79 -79
  105. package/dist/{chunk-PX7VDW7R.js.map → chunk-MJPV4LBH.js.map} +1 -1
  106. package/dist/{chunk-UGH6VPPO.js → chunk-MWTMTW2T.js} +2 -2
  107. package/dist/{chunk-F6LSNPPB.js → chunk-MXJ3VP6S.js} +6 -6
  108. package/dist/{chunk-KPWLZBXZ.js → chunk-NBNDVNJ2.js} +186 -25
  109. package/dist/chunk-NBNDVNJ2.js.map +1 -0
  110. package/dist/{chunk-M5EPMNS4.js → chunk-P2CLYN6H.js} +2 -2
  111. package/dist/{chunk-7XXCIO6X.js → chunk-PXQM2HOG.js} +13 -6
  112. package/dist/{chunk-7XXCIO6X.js.map → chunk-PXQM2HOG.js.map} +1 -1
  113. package/dist/{chunk-UZK7VVPD.js → chunk-Q5VJUNXA.js} +1858 -272
  114. package/dist/chunk-Q5VJUNXA.js.map +1 -0
  115. package/dist/{chunk-KGTD2KZJ.js → chunk-Q6YJW6KE.js} +2 -2
  116. package/dist/{chunk-X3SQYAPP.js → chunk-R372P2EH.js} +2 -2
  117. package/dist/{chunk-HBVOJNV4.js → chunk-RKXZ7P4V.js} +3 -3
  118. package/dist/chunk-RMMVQQA6.js +70 -0
  119. package/dist/chunk-RMMVQQA6.js.map +1 -0
  120. package/dist/{chunk-E6EAB4J6.js → chunk-S24E4MBQ.js} +14 -14
  121. package/dist/chunk-S24E4MBQ.js.map +1 -0
  122. package/dist/{chunk-RYHWZ52A.js → chunk-S2BBISHU.js} +4 -4
  123. package/dist/{chunk-LLISELSY.js → chunk-TBMRQZDY.js} +2 -2
  124. package/dist/{chunk-FMLKOL2Z.js → chunk-TC3VNKGX.js} +4 -4
  125. package/dist/{chunk-7K5Q6COX.js → chunk-TVVEYCNW.js} +4 -4
  126. package/dist/{chunk-2XP3PWL3.js → chunk-UR5SIN7H.js} +53 -35
  127. package/dist/chunk-UR5SIN7H.js.map +1 -0
  128. package/dist/{chunk-NKDVXEFU.js → chunk-VFNI3RPT.js} +2 -2
  129. package/dist/chunk-VNA7W7QF.js +134 -0
  130. package/dist/chunk-VNA7W7QF.js.map +1 -0
  131. package/dist/{chunk-PQPSZICJ.js → chunk-VYYNBJXH.js} +5 -5
  132. package/dist/chunk-WNIUPHWV.js +152 -0
  133. package/dist/chunk-WNIUPHWV.js.map +1 -0
  134. package/dist/chunk-WRJVB3C2.js +118 -0
  135. package/dist/chunk-WRJVB3C2.js.map +1 -0
  136. package/dist/{chunk-SN3ZESWQ.js → chunk-WVVK2RFM.js} +6 -6
  137. package/dist/{chunk-DQEMWVMT.js → chunk-X7Y7WX73.js} +1 -1
  138. package/dist/{chunk-4KKV7W62.js → chunk-YOBNCD3Z.js} +6 -6
  139. package/dist/chunk-YXZG5TVN.js +40 -0
  140. package/dist/chunk-YXZG5TVN.js.map +1 -0
  141. package/dist/{chunk-4DJQYKMN.js → chunk-ZIKENA2C.js} +2 -2
  142. package/dist/chunk-ZIKENA2C.js.map +1 -0
  143. package/dist/{chunk-SK3EYPKC.js → chunk-ZN4UZWMT.js} +2 -2
  144. package/dist/{cli-BoouX6LX.d.ts → cli-DJbkaZBU.d.ts} +5 -5
  145. package/dist/cli.d.ts +14 -12
  146. package/dist/cli.js +79 -74
  147. package/dist/compounding/engine.d.ts +3 -2
  148. package/dist/compounding/engine.js +12 -10
  149. package/dist/compounding/preference-consolidator.d.ts +1 -1
  150. package/dist/compression-optimizer.d.ts +1 -1
  151. package/dist/config.d.ts +1 -1
  152. package/dist/config.js +4 -2
  153. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  154. package/dist/connectors/codex-materialize-runner.js +12 -10
  155. package/dist/connectors/codex-materialize.d.ts +1 -1
  156. package/dist/connectors/index.d.ts +1 -1
  157. package/dist/connectors/index.js +12 -10
  158. package/dist/consolidation-provenance-check.d.ts +3 -2
  159. package/dist/consolidation-undo.d.ts +3 -2
  160. package/dist/contradiction/index.d.ts +3 -2
  161. package/dist/conversation-index/backend.d.ts +1 -1
  162. package/dist/conversation-index/backend.js +2 -2
  163. package/dist/conversation-index/chunker.d.ts +1 -1
  164. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  165. package/dist/conversation-index/indexer.d.ts +1 -1
  166. package/dist/conversation-index/search.d.ts +1 -1
  167. package/dist/corpus-watermark.d.ts +15 -2
  168. package/dist/corpus-watermark.js +25 -21
  169. package/dist/day-summary.d.ts +1 -1
  170. package/dist/delinearize.d.ts +1 -1
  171. package/dist/direct-answer-wiring.d.ts +1 -1
  172. package/dist/direct-answer.d.ts +1 -1
  173. package/dist/embedding-fallback.d.ts +1 -1
  174. package/dist/enrichment/index.d.ts +1 -1
  175. package/dist/entity-id-normalization.d.ts +4 -0
  176. package/dist/entity-id-normalization.js +10 -0
  177. package/dist/entity-id-normalization.js.map +1 -0
  178. package/dist/entity-retrieval-boundaries.d.ts +3 -0
  179. package/dist/entity-retrieval-boundaries.js +8 -0
  180. package/dist/entity-retrieval-boundaries.js.map +1 -0
  181. package/dist/entity-retrieval.d.ts +3 -2
  182. package/dist/entity-retrieval.js +13 -10
  183. package/dist/entity-schema.d.ts +1 -1
  184. package/dist/entity-schema.js +1 -1
  185. package/dist/explicit-capture.d.ts +9 -8
  186. package/dist/extraction-error-classification.d.ts +1 -1
  187. package/dist/extraction-faithfulness.d.ts +1 -1
  188. package/dist/extraction-judge-telemetry.d.ts +1 -1
  189. package/dist/extraction-judge-training.d.ts +1 -1
  190. package/dist/extraction-judge.d.ts +1 -1
  191. package/dist/extraction-liveness.d.ts +1 -1
  192. package/dist/extraction.d.ts +1 -1
  193. package/dist/fallback-llm.d.ts +1 -1
  194. package/dist/{first-start-migration-LEXL3XYL.js → first-start-migration-BKNGOFED.js} +4 -4
  195. package/dist/graph-dashboard-diff.d.ts +1 -1
  196. package/dist/graph-dashboard-key.d.ts +1 -1
  197. package/dist/graph-dashboard-parser.d.ts +1 -1
  198. package/dist/graph-edge-reinforcement.d.ts +1 -1
  199. package/dist/graph-snapshot.d.ts +1 -1
  200. package/dist/graph.d.ts +1 -1
  201. package/dist/importance.d.ts +1 -1
  202. package/dist/importers/index.d.ts +1 -1
  203. package/dist/in-flight-reads.d.ts +1 -1
  204. package/dist/index.d.ts +409 -407
  205. package/dist/index.js +147 -141
  206. package/dist/intent.d.ts +1 -1
  207. package/dist/lcm/engine.d.ts +1 -1
  208. package/dist/lcm/engine.js +3 -3
  209. package/dist/lcm/index.d.ts +1 -1
  210. package/dist/lcm/index.js +9 -9
  211. package/dist/lcm/tools.d.ts +1 -1
  212. package/dist/lifecycle.d.ts +1 -1
  213. package/dist/live-connectors-runner.d.ts +1 -1
  214. package/dist/local-llm.d.ts +1 -1
  215. package/dist/local-model-endpoint.d.ts +1 -1
  216. package/dist/maintenance/memory-governance.d.ts +1 -1
  217. package/dist/maintenance/memory-governance.js +12 -10
  218. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +3 -2
  219. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +12 -10
  220. package/dist/maintenance/rebuild-memory-projection.d.ts +3 -2
  221. package/dist/maintenance/rebuild-memory-projection.js +13 -11
  222. package/dist/{maintenance-DD22oIx9.d.ts → maintenance-DveW6azo.d.ts} +3 -3
  223. package/dist/mcp-memory-inspector-app.d.ts +13 -10
  224. package/dist/memory-action-policy.d.ts +1 -1
  225. package/dist/memory-cache.d.ts +1 -1
  226. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  227. package/dist/memory-projection-mutations.d.ts +4 -0
  228. package/dist/memory-projection-mutations.js +15 -0
  229. package/dist/memory-projection-mutations.js.map +1 -0
  230. package/dist/memory-projection-store.d.ts +1 -1
  231. package/dist/memory-provenance.d.ts +1 -1
  232. package/dist/memory-worth-outcomes.d.ts +3 -2
  233. package/dist/models-json.d.ts +1 -1
  234. package/dist/namespaces/migrate.d.ts +4 -3
  235. package/dist/namespaces/migrate.js +22 -20
  236. package/dist/namespaces/principal.d.ts +1 -1
  237. package/dist/namespaces/search.d.ts +1 -1
  238. package/dist/namespaces/search.js +9 -9
  239. package/dist/namespaces/storage.d.ts +4 -3
  240. package/dist/namespaces/storage.js +12 -10
  241. package/dist/native-knowledge.d.ts +1 -1
  242. package/dist/offline-sync-impression-drain.d.ts +1 -1
  243. package/dist/offline-sync-impression-drain.js +3 -3
  244. package/dist/operator-doctor-corpus.d.ts +22 -3
  245. package/dist/operator-doctor-corpus.js +32 -22
  246. package/dist/operator-doctor-replica.d.ts +52 -0
  247. package/dist/operator-doctor-replica.js +15 -0
  248. package/dist/operator-doctor-replica.js.map +1 -0
  249. package/dist/operator-toolkit.d.ts +7 -3
  250. package/dist/operator-toolkit.js +33 -27
  251. package/dist/orchestration/compression-guideline-coordinator.d.ts +3 -2
  252. package/dist/orchestration/maintenance.d.ts +5 -4
  253. package/dist/orchestration/maintenance.js +17 -15
  254. package/dist/{orchestrator-CFJ_TG6D.d.ts → orchestrator-Cvlgpe6I.d.ts} +7 -7
  255. package/dist/orchestrator.d.ts +9 -8
  256. package/dist/orchestrator.js +99 -93
  257. package/dist/patterns-cli.d.ts +1 -1
  258. package/dist/{pipeline-Bq5zU6Bp.d.ts → pipeline-BveYVaz7.d.ts} +1 -1
  259. package/dist/policy-runtime.d.ts +1 -1
  260. package/dist/proactive-contention.d.ts +1 -1
  261. package/dist/provenance.d.ts +1 -1
  262. package/dist/{qmd-3ILJkC70.d.ts → qmd-CLWDsbYR.d.ts} +1 -1
  263. package/dist/qmd-preflight.d.ts +2 -2
  264. package/dist/qmd-recall-cache.d.ts +1 -1
  265. package/dist/qmd.d.ts +2 -2
  266. package/dist/recall-concurrency-config.d.ts +1 -1
  267. package/dist/recall-disclosure-escalation.d.ts +1 -1
  268. package/dist/recall-explain-renderer.d.ts +1 -1
  269. package/dist/recall-explain-renderer.js +3 -3
  270. package/dist/recall-memory-map.d.ts +1 -1
  271. package/dist/recall-planner-llm.d.ts +1 -1
  272. package/dist/recall-state.d.ts +1 -1
  273. package/dist/recall-state.js +2 -2
  274. package/dist/recall-tag-filter.d.ts +1 -1
  275. package/dist/recall-timings.d.ts +1 -1
  276. package/dist/recall-xray-cli.d.ts +1 -1
  277. package/dist/recall-xray-cli.js +4 -4
  278. package/dist/recall-xray-renderer.d.ts +1 -1
  279. package/dist/recall-xray-renderer.js +3 -3
  280. package/dist/recall-xray.d.ts +1 -1
  281. package/dist/recall-xray.js +2 -2
  282. package/dist/replay/normalizers/chatgpt.d.ts +1 -1
  283. package/dist/replay/normalizers/claude.d.ts +1 -1
  284. package/dist/replay/normalizers/openclaw.d.ts +1 -1
  285. package/dist/replay/normalizers/shared.d.ts +1 -1
  286. package/dist/replay/runner.d.ts +1 -1
  287. package/dist/replay/types.d.ts +1 -1
  288. package/dist/replica-divergence.d.ts +279 -0
  289. package/dist/replica-divergence.js +28 -0
  290. package/dist/replica-divergence.js.map +1 -0
  291. package/dist/replica-peers-config.d.ts +5 -0
  292. package/dist/replica-peers-config.js +13 -0
  293. package/dist/replica-peers-config.js.map +1 -0
  294. package/dist/resolve-auth-token.d.ts +21 -2
  295. package/dist/resolve-auth-token.js +5 -1
  296. package/dist/resume-bundles.js +5 -3
  297. package/dist/retrieval-agents.d.ts +2 -2
  298. package/dist/retrieval-tiers.d.ts +1 -1
  299. package/dist/routing/engine.d.ts +1 -1
  300. package/dist/routing/store.d.ts +1 -1
  301. package/dist/salvage-envelope.d.ts +1 -1
  302. package/dist/schemas.d.ts +76 -76
  303. package/dist/{scope-profiles-D0-ff4xT.d.ts → scope-profiles-BVf3DZ7z.d.ts} +1 -1
  304. package/dist/search/embed-helper.d.ts +1 -1
  305. package/dist/search/factory.d.ts +1 -1
  306. package/dist/search/factory.js +8 -8
  307. package/dist/search/index.d.ts +1 -1
  308. package/dist/search/index.js +13 -13
  309. package/dist/search/lancedb-backend.d.ts +1 -1
  310. package/dist/search/lancedb-backend.js +2 -2
  311. package/dist/search/meilisearch-backend.d.ts +1 -1
  312. package/dist/search/meilisearch-backend.js +2 -2
  313. package/dist/search/noop-backend.d.ts +1 -1
  314. package/dist/search/orama-backend.d.ts +1 -1
  315. package/dist/search/orama-backend.js +2 -2
  316. package/dist/search/port.d.ts +1 -1
  317. package/dist/search/remote-backend.d.ts +1 -1
  318. package/dist/{semantic-consolidation-4Tfh7c1g.d.ts → semantic-consolidation-DXLV47y2.d.ts} +1 -1
  319. package/dist/semantic-consolidation.d.ts +2 -2
  320. package/dist/semantic-consolidation.js +13 -11
  321. package/dist/semantic-rule-promotion.js +12 -10
  322. package/dist/semantic-rule-verifier.d.ts +1 -1
  323. package/dist/semantic-rule-verifier.js +12 -10
  324. package/dist/{service-Z8uzoAST.d.ts → service-DbgPTeMJ.d.ts} +2 -2
  325. package/dist/session-observer-bands.d.ts +1 -1
  326. package/dist/session-observer-state.d.ts +1 -1
  327. package/dist/shared-context/manager.d.ts +9 -9
  328. package/dist/signal.d.ts +1 -1
  329. package/dist/{storage-BZVMn8yJ.d.ts → storage-DOzTm8wG.d.ts} +13 -22
  330. package/dist/storage.d.ts +3 -2
  331. package/dist/storage.js +13 -10
  332. package/dist/summarizer.d.ts +1 -1
  333. package/dist/summary-snapshot.d.ts +1 -1
  334. package/dist/temporal-supersession.d.ts +3 -2
  335. package/dist/temporal-timeline-recall.d.ts +1 -1
  336. package/dist/temporal-validity.d.ts +1 -1
  337. package/dist/threading.d.ts +1 -1
  338. package/dist/tier-migration.d.ts +3 -2
  339. package/dist/tier-routing.d.ts +1 -1
  340. package/dist/topics.d.ts +1 -1
  341. package/dist/transcript.d.ts +1 -1
  342. package/dist/transfer/autodetect.js +1 -1
  343. package/dist/transfer/backup.js +2 -2
  344. package/dist/transfer/capsule-export.js +3 -3
  345. package/dist/transfer/capsule-import.js +2 -2
  346. package/dist/transfer/types.d.ts +66 -66
  347. package/dist/trust-score-stage.d.ts +1 -1
  348. package/dist/trust-score.d.ts +1 -1
  349. package/dist/{types-DHBxIF0s.d.ts → types-BA7W-_xy.d.ts} +53 -4
  350. package/dist/types.d.ts +1 -1
  351. package/dist/types.js +1 -1
  352. package/dist/utility-runtime.d.ts +1 -1
  353. package/dist/verified-recall.js +12 -10
  354. package/dist/write-envelope.d.ts +1 -1
  355. package/package.json +2 -2
  356. package/src/access-health-types.ts +8 -0
  357. package/src/access-http.test.ts +4 -0
  358. package/src/access-service-health.test.ts +23 -0
  359. package/src/access-service.ts +27 -4
  360. package/src/cli.ts +9 -7
  361. package/src/config.ts +2 -1
  362. package/src/corpus-watermark.test.ts +21 -0
  363. package/src/corpus-watermark.ts +25 -3
  364. package/src/entity-id-normalization.ts +55 -0
  365. package/src/entity-retrieval-boundaries.ts +134 -0
  366. package/src/entity-retrieval.ts +253 -27
  367. package/src/entity-schema.ts +2 -1
  368. package/src/memory-projection-mutations.ts +132 -0
  369. package/src/namespaces/storage.ts +5 -3
  370. package/src/operator-doctor-corpus.ts +41 -0
  371. package/src/operator-doctor-replica.test.ts +261 -0
  372. package/src/operator-doctor-replica.ts +129 -0
  373. package/src/operator-toolkit.ts +5 -4
  374. package/src/orchestration/orchestrator-init.ts +2 -2
  375. package/src/replica-divergence.test.ts +1475 -0
  376. package/src/replica-divergence.ts +910 -0
  377. package/src/replica-peers-config.ts +250 -0
  378. package/src/resolve-auth-token.ts +38 -0
  379. package/src/storage/entity-canonical-id-migration-adapter.ts +72 -0
  380. package/src/storage/entity-canonical-id-migration-runner.ts +68 -0
  381. package/src/storage/entity-canonical-id-migration.ts +904 -0
  382. package/src/storage/entity-store.ts +44 -0
  383. package/src/storage/memory-frontmatter-metadata.ts +17 -0
  384. package/src/storage/memory-migration-serialization.ts +37 -0
  385. package/src/storage/memory-read-store.ts +3 -2
  386. package/src/storage/profile-header.ts +898 -0
  387. package/src/storage-profile-timestamp.test.ts +3358 -0
  388. package/src/storage.ts +73 -77
  389. package/src/testing/subjects/profile-header-write.test.ts +71 -0
  390. package/src/types.ts +3 -3
  391. package/dist/chunk-2XP3PWL3.js.map +0 -1
  392. package/dist/chunk-4DJQYKMN.js.map +0 -1
  393. package/dist/chunk-E6EAB4J6.js.map +0 -1
  394. package/dist/chunk-EXM2Q555.js.map +0 -1
  395. package/dist/chunk-GJJBPI6I.js.map +0 -1
  396. package/dist/chunk-KPWLZBXZ.js.map +0 -1
  397. package/dist/chunk-LIIQPDFN.js.map +0 -1
  398. package/dist/chunk-UZK7VVPD.js.map +0 -1
  399. package/dist/chunk-V25OWXAC.js.map +0 -1
  400. package/dist/chunk-YN4AUGNF.js.map +0 -1
  401. /package/dist/{capsule-crypto-YO5QJ6L3.js.map → capsule-crypto-7FJQINUR.js.map} +0 -0
  402. /package/dist/{chunk-7RZJWZ46.js.map → chunk-227UFSEQ.js.map} +0 -0
  403. /package/dist/{chunk-VGEH3STZ.js.map → chunk-2BEJ4XCF.js.map} +0 -0
  404. /package/dist/{chunk-BXLOS5AJ.js.map → chunk-2NLLXCJG.js.map} +0 -0
  405. /package/dist/{chunk-6NNNURLK.js.map → chunk-2PHX3I5C.js.map} +0 -0
  406. /package/dist/{chunk-XAAIUXJO.js.map → chunk-3BSJBIZ3.js.map} +0 -0
  407. /package/dist/{chunk-JCVQV6QX.js.map → chunk-3UOSVTFR.js.map} +0 -0
  408. /package/dist/{chunk-AJ7QCSIS.js.map → chunk-7CPOZH6Y.js.map} +0 -0
  409. /package/dist/{chunk-M2KGXXTL.js.map → chunk-ALTP3MFS.js.map} +0 -0
  410. /package/dist/{chunk-77CNV7DY.js.map → chunk-BLAKS3CP.js.map} +0 -0
  411. /package/dist/{chunk-FE5FKTCI.js.map → chunk-BR4UFMLO.js.map} +0 -0
  412. /package/dist/{chunk-H2PBM562.js.map → chunk-DKQM5Q6Q.js.map} +0 -0
  413. /package/dist/{chunk-CSXHRAJJ.js.map → chunk-EG64LXKL.js.map} +0 -0
  414. /package/dist/{chunk-PTN6UAUA.js.map → chunk-ES36HTSC.js.map} +0 -0
  415. /package/dist/{chunk-WMDRLTNA.js.map → chunk-EZWWCN7I.js.map} +0 -0
  416. /package/dist/{chunk-XKGPIWGI.js.map → chunk-FBZTWUK5.js.map} +0 -0
  417. /package/dist/{chunk-Y6E37WRG.js.map → chunk-GJPCP5CA.js.map} +0 -0
  418. /package/dist/{chunk-VDX2J7OX.js.map → chunk-IPLYGWQF.js.map} +0 -0
  419. /package/dist/{chunk-XNUBF6RF.js.map → chunk-IYT632D5.js.map} +0 -0
  420. /package/dist/{chunk-2QSZNTDO.js.map → chunk-JBPKEARU.js.map} +0 -0
  421. /package/dist/{chunk-67DSDRUB.js.map → chunk-JIF3VRKQ.js.map} +0 -0
  422. /package/dist/{chunk-MIFF37NN.js.map → chunk-KKBTBUVT.js.map} +0 -0
  423. /package/dist/{chunk-ZHP4SUPB.js.map → chunk-LIHC3T43.js.map} +0 -0
  424. /package/dist/{chunk-UGH6VPPO.js.map → chunk-MWTMTW2T.js.map} +0 -0
  425. /package/dist/{chunk-F6LSNPPB.js.map → chunk-MXJ3VP6S.js.map} +0 -0
  426. /package/dist/{chunk-M5EPMNS4.js.map → chunk-P2CLYN6H.js.map} +0 -0
  427. /package/dist/{chunk-KGTD2KZJ.js.map → chunk-Q6YJW6KE.js.map} +0 -0
  428. /package/dist/{chunk-X3SQYAPP.js.map → chunk-R372P2EH.js.map} +0 -0
  429. /package/dist/{chunk-HBVOJNV4.js.map → chunk-RKXZ7P4V.js.map} +0 -0
  430. /package/dist/{chunk-RYHWZ52A.js.map → chunk-S2BBISHU.js.map} +0 -0
  431. /package/dist/{chunk-LLISELSY.js.map → chunk-TBMRQZDY.js.map} +0 -0
  432. /package/dist/{chunk-FMLKOL2Z.js.map → chunk-TC3VNKGX.js.map} +0 -0
  433. /package/dist/{chunk-7K5Q6COX.js.map → chunk-TVVEYCNW.js.map} +0 -0
  434. /package/dist/{chunk-NKDVXEFU.js.map → chunk-VFNI3RPT.js.map} +0 -0
  435. /package/dist/{chunk-PQPSZICJ.js.map → chunk-VYYNBJXH.js.map} +0 -0
  436. /package/dist/{chunk-SN3ZESWQ.js.map → chunk-WVVK2RFM.js.map} +0 -0
  437. /package/dist/{chunk-DQEMWVMT.js.map → chunk-X7Y7WX73.js.map} +0 -0
  438. /package/dist/{chunk-4KKV7W62.js.map → chunk-YOBNCD3Z.js.map} +0 -0
  439. /package/dist/{chunk-SK3EYPKC.js.map → chunk-ZN4UZWMT.js.map} +0 -0
  440. /package/dist/{first-start-migration-LEXL3XYL.js.map → first-start-migration-BKNGOFED.js.map} +0 -0
package/dist/types.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { aP as AccessTrackingEntry, Y as ActiveRecallChatType, a0 as ActiveRecallModelFallbackPolicy, _ as ActiveRecallPromptStyle, Z as ActiveRecallQueryMode, $ as ActiveRecallThinking, a8 as AgentAccessAuthToken, c5 as AgentAccessHttpConfig, c6 as AgentDefaultsConfig, c7 as AgentPersona, A as AgentPersonaModelConfig, c8 as BehaviorLoopAdjustment, r as BehaviorLoopPolicyState, c9 as BehaviorSignalDirection, a1 as BehaviorSignalEvent, ca as BehaviorSignalType, b8 as BootstrapOptions, b9 as BootstrapResult, g as BriefingActiveThread, cb as BriefingCalendarSourceError, bt as BriefingConfig, e as BriefingFocus, d as BriefingFollowup, bu as BriefingOpenCommitment, i as BriefingRecentEntity, h as BriefingResult, B as BriefingSections, bv as BriefingWindow, cc as BufferEntryState, aK as BufferState, a2 as BufferSurpriseEvent, j as BufferTurn, f as CalendarEvent, C as CalendarSource, cd as CaptureMode, ce as ChatConfig, m as Checkpoint, cf as CodexCliReasoningEffort, cg as CodexCompactionFlushMode, by as CodexCompatConfig, ch as CodexConnectorConfig, b5 as CodingContext, ci as CodingGraphLspConfig, bh as CodingKnowledgeConfig, bb as CodingModeConfig, cj as CompressionGuidelineActivationState, aa as CompressionGuidelineOptimizerActionSummary, a9 as CompressionGuidelineOptimizerEventCounts, ab as CompressionGuidelineOptimizerRuleUpdate, ck as CompressionGuidelineOptimizerSourceWindow, ae as CompressionGuidelineOptimizerState, cl as ConfidenceTier, cm as ConsolidationAction, cn as ConsolidationItem, ba as ConsolidationObservation, y as ConsolidationResult, co as ContradictionScanConfig, N as ConversationThread, cp as CronConversationRecallMode, cq as CronRecallMode, bz as DEFAULT_RECALL_DISCLOSURE, z as DaySummaryResult, cr as DreamingConfig, cs as DreamingNarrativePromptStyle, ct as DreamsDeepSleepConfig, cu as DreamsLightSleepConfig, D as DreamsPhase, cv as DreamsPhaseStatus, cw as DreamsPhasesConfig, cx as DreamsRemConfig, a as DreamsRunResult, b6 as DreamsStatusResult, cy as EngramTraceEvent, aO as EntityActivityEntry, E as EntityFile, af as EntityMention, aN as EntityRelationship, ag as EntitySchemaDefinition, ah as EntitySchemaSectionDefinition, ai as EntityStructuredSection, aI as EntityTimelineEntry, bB as ExtractedFact, cz as ExtractedProcedureStep, cA as ExtractedQuestion, cB as ExtractedReasoningTrace, cC as ExtractedReasoningTraceStep, cD as ExtractedRelationship, W as ExtractionFailureClass, cE as ExtractionPassSource, x as ExtractionResult, F as FaithfulnessFrontmatter, aM as FileHygieneConfig, G as GatewayConfig, cF as GitHubLiveConnectorConfig, cG as GmailLiveConnectorConfig, cH as GoogleDriveLiveConnectorConfig, cI as HeartbeatConfig, cJ as HeartbeatDetectionMode, H as HourlySummary, I as IdentityInjectionMode, X as ImportanceLevel, aj as ImportanceScore, O as LifecycleState, L as LiveConnectorsConfig, cK as LlmTraceCallback, cL as LlmTraceEvent, al as MemoryActionEligibilityContext, bK as MemoryActionEligibilitySource, ad as MemoryActionEvent, cM as MemoryActionOutcome, cN as MemoryActionPolicyDecision, am as MemoryActionPolicyResult, cO as MemoryActionStatus, ac as MemoryActionType, t as MemoryCategory, M as MemoryFile, l as MemoryFrontmatter, ak as MemoryIntent, w as MemoryLifecycleEvent, an as MemoryLifecycleEventType, ao as MemoryLifecycleStateSummary, aJ as MemoryLink, cP as MemoryLinkType, bL as MemoryObservation, cQ as MemoryOsPresetName, v as MemoryProjectionCurrentState, bM as MemoryScope, u as MemoryStatus, aQ as MemorySummary, aL as MetaState, cR as ModelApi, cS as ModelDefinitionConfig, cT as ModelProviderAuthMode, ap as ModelProviderConfig, cU as NamespacePolicy, aq as NativeKnowledgeConfig, cV as NativeKnowledgeFolderRuleConfig, cW as NativeKnowledgeObsidianVaultConfig, cX as NativeKnowledgeOpenClawWorkspaceConfig, cY as NotionLiveConnectorConfig, P as PluginConfig, U as PolicyClass, cZ as PrincipalFromSessionKeyMode, c_ as PrincipalRule, c$ as ProceduralConfig, at as ProvenanceConfig, J as ProvenanceSource, ax as QmdSearchExplain, Q as QmdSearchResult, d0 as QuestionEntry, bN as RECALL_DISCLOSURE_LEVELS, d1 as ReasoningEffort, b as RecallDisclosure, d2 as RecallPipelineConfig, R as RecallPlanMode, b7 as RecallSectionConfig, c as RecallTierExplain, d3 as RecallTraceEvent, d4 as RelevanceFeedback, au as RetrievalTier, d5 as SPECULATIVE_TTL_DAYS, d6 as ScopeProfileAutoPromoteConfig, o as ScopeProfileConfig, p as ScopeProfileLayerId, q as ScopeProfilePromotionTarget, d7 as ScopeProfileTeamProjectConfig, d8 as ScopeTeamConfig, d9 as ScoredEntity, a7 as SecretRef, da as SemanticChunkingConfigShape, S as SessionObserverBandConfig, db as SignalLevel, av as SignalScanResult, dc as SlotBehaviorConfig, dd as SlotMismatchMode, n as SourceConnectorProvenance, aw as TopicScore, T as TranscriptEntry, de as TriggerMode, K as TrustWeights, V as VerificationState, df as confidenceTier, bV as isRecallDisclosure } from './types-DHBxIF0s.js';
1
+ export { aR as AccessTrackingEntry, a0 as ActiveRecallChatType, a4 as ActiveRecallModelFallbackPolicy, a2 as ActiveRecallPromptStyle, a1 as ActiveRecallQueryMode, a3 as ActiveRecallThinking, t as AgentAccessAuthToken, c9 as AgentAccessHttpConfig, ca as AgentDefaultsConfig, cb as AgentPersona, A as AgentPersonaModelConfig, cc as BehaviorLoopAdjustment, r as BehaviorLoopPolicyState, cd as BehaviorSignalDirection, a5 as BehaviorSignalEvent, ce as BehaviorSignalType, ba as BootstrapOptions, bb as BootstrapResult, g as BriefingActiveThread, cf as BriefingCalendarSourceError, bv as BriefingConfig, e as BriefingFocus, d as BriefingFollowup, bw as BriefingOpenCommitment, i as BriefingRecentEntity, h as BriefingResult, B as BriefingSections, bx as BriefingWindow, cg as BufferEntryState, aM as BufferState, a6 as BufferSurpriseEvent, j as BufferTurn, f as CalendarEvent, C as CalendarSource, ch as CaptureMode, ci as ChatConfig, m as Checkpoint, cj as CodexCliReasoningEffort, ck as CodexCompactionFlushMode, bA as CodexCompatConfig, cl as CodexConnectorConfig, b7 as CodingContext, cm as CodingGraphLspConfig, bj as CodingKnowledgeConfig, bd as CodingModeConfig, cn as CompressionGuidelineActivationState, ac as CompressionGuidelineOptimizerActionSummary, ab as CompressionGuidelineOptimizerEventCounts, ad as CompressionGuidelineOptimizerRuleUpdate, co as CompressionGuidelineOptimizerSourceWindow, ag as CompressionGuidelineOptimizerState, cp as ConfidenceTier, cq as ConsolidationAction, cr as ConsolidationItem, bc as ConsolidationObservation, J as ConsolidationResult, cs as ContradictionScanConfig, U as ConversationThread, ct as CronConversationRecallMode, cu as CronRecallMode, bB as DEFAULT_RECALL_DISCLOSURE, K as DaySummaryResult, cv as DreamingConfig, cw as DreamingNarrativePromptStyle, cx as DreamsDeepSleepConfig, cy as DreamsLightSleepConfig, D as DreamsPhase, cz as DreamsPhaseStatus, cA as DreamsPhasesConfig, cB as DreamsRemConfig, a as DreamsRunResult, b8 as DreamsStatusResult, cC as EngramTraceEvent, aQ as EntityActivityEntry, E as EntityFile, ah as EntityMention, aP as EntityRelationship, ai as EntitySchemaDefinition, aj as EntitySchemaSectionDefinition, ak as EntityStructuredSection, aK as EntityTimelineEntry, bD as ExtractedFact, cD as ExtractedProcedureStep, cE as ExtractedQuestion, cF as ExtractedReasoningTrace, cG as ExtractedReasoningTraceStep, cH as ExtractedRelationship, _ as ExtractionFailureClass, cI as ExtractionPassSource, z as ExtractionResult, F as FaithfulnessFrontmatter, aO as FileHygieneConfig, G as GatewayConfig, cJ as GitHubLiveConnectorConfig, cK as GmailLiveConnectorConfig, cL as GoogleDriveLiveConnectorConfig, cM as HeartbeatConfig, cN as HeartbeatDetectionMode, H as HourlySummary, I as IdentityInjectionMode, $ as ImportanceLevel, al as ImportanceScore, V as LifecycleState, L as LiveConnectorsConfig, cO as LlmTraceCallback, cP as LlmTraceEvent, an as MemoryActionEligibilityContext, bM as MemoryActionEligibilitySource, af as MemoryActionEvent, cQ as MemoryActionOutcome, cR as MemoryActionPolicyDecision, ao as MemoryActionPolicyResult, cS as MemoryActionStatus, ae as MemoryActionType, v as MemoryCategory, M as MemoryFile, l as MemoryFrontmatter, am as MemoryIntent, y as MemoryLifecycleEvent, ap as MemoryLifecycleEventType, aq as MemoryLifecycleStateSummary, aL as MemoryLink, cT as MemoryLinkType, bN as MemoryObservation, cU as MemoryOsPresetName, x as MemoryProjectionCurrentState, bO as MemoryScope, w as MemoryStatus, aS as MemorySummary, aN as MetaState, cV as ModelApi, cW as ModelDefinitionConfig, cX as ModelProviderAuthMode, ar as ModelProviderConfig, cY as NamespacePolicy, as as NativeKnowledgeConfig, cZ as NativeKnowledgeFolderRuleConfig, c_ as NativeKnowledgeObsidianVaultConfig, c$ as NativeKnowledgeOpenClawWorkspaceConfig, d0 as NotionLiveConnectorConfig, P as PluginConfig, X as PolicyClass, d1 as PrincipalFromSessionKeyMode, d2 as PrincipalRule, d3 as ProceduralConfig, av as ProvenanceConfig, N as ProvenanceSource, az as QmdSearchExplain, Q as QmdSearchResult, d4 as QuestionEntry, bP as RECALL_DISCLOSURE_LEVELS, d5 as ReasoningEffort, b as RecallDisclosure, d6 as RecallPipelineConfig, R as RecallPlanMode, b9 as RecallSectionConfig, c as RecallTierExplain, d7 as RecallTraceEvent, d8 as RelevanceFeedback, aw as RetrievalTier, d9 as SPECULATIVE_TTL_DAYS, da as ScopeProfileAutoPromoteConfig, o as ScopeProfileConfig, p as ScopeProfileLayerId, q as ScopeProfilePromotionTarget, db as ScopeProfileTeamProjectConfig, dc as ScopeTeamConfig, dd as ScoredEntity, s as SecretRef, de as SemanticChunkingConfigShape, S as SessionObserverBandConfig, df as SignalLevel, ax as SignalScanResult, dg as SlotBehaviorConfig, dh as SlotMismatchMode, n as SourceConnectorProvenance, ay as TopicScore, T as TranscriptEntry, di as TriggerMode, O as TrustWeights, W as VerificationState, dj as confidenceTier, bX as isRecallDisclosure } from './types-BA7W-_xy.js';
2
2
  import './message-parts/index.js';
3
3
  import './bounded-jsonl-state.js';
4
4
  export { ContinuityImprovementLoop, ContinuityIncidentCloseInput, ContinuityIncidentOpenInput, ContinuityIncidentRecord, ContinuityIncidentState, ContinuityLoopCadence, ContinuityLoopReviewInput, ContinuityLoopStatus, ContinuityLoopUpsertInput } from './types-continuity.js';
package/dist/types.js CHANGED
@@ -4,7 +4,7 @@ import {
4
4
  SPECULATIVE_TTL_DAYS,
5
5
  confidenceTier,
6
6
  isRecallDisclosure
7
- } from "./chunk-V25OWXAC.js";
7
+ } from "./chunk-JQ7T5VDC.js";
8
8
  import "./chunk-PZ5AY32C.js";
9
9
  export {
10
10
  DEFAULT_RECALL_DISCLOSURE,
@@ -1,5 +1,5 @@
1
1
  import { TierRoutingPolicy } from './tier-routing.js';
2
- import './types-DHBxIF0s.js';
2
+ import './types-BA7W-_xy.js';
3
3
  import './message-parts/index.js';
4
4
  import './bounded-jsonl-state.js';
5
5
  import './operator-doctor-types.js';
@@ -1,32 +1,34 @@
1
1
  import {
2
2
  compareVerifiedEpisodeResults,
3
3
  searchVerifiedEpisodes
4
- } from "./chunk-VGEH3STZ.js";
4
+ } from "./chunk-2BEJ4XCF.js";
5
5
  import "./chunk-B7RWBZXW.js";
6
- import "./chunk-UZK7VVPD.js";
7
- import "./chunk-UHVXE24Y.js";
6
+ import "./chunk-Q5VJUNXA.js";
8
7
  import "./chunk-2QMKMVHH.js";
8
+ import "./chunk-UHVXE24Y.js";
9
9
  import "./chunk-DEBHXHJR.js";
10
10
  import "./chunk-DNHVPZOD.js";
11
11
  import "./chunk-6CIAGZ6X.js";
12
- import "./chunk-HKF5VASQ.js";
13
12
  import "./chunk-J6A3CX5N.js";
14
- import "./chunk-V25OWXAC.js";
15
- import "./chunk-XKGPIWGI.js";
13
+ import "./chunk-HKF5VASQ.js";
14
+ import "./chunk-JQ7T5VDC.js";
15
+ import "./chunk-FBZTWUK5.js";
16
16
  import "./chunk-EGGE52UU.js";
17
- import "./chunk-GCASGYIO.js";
18
17
  import "./chunk-WL5EBRDH.js";
19
18
  import "./chunk-ILGC6JH6.js";
20
19
  import "./chunk-SCU65EZI.js";
20
+ import "./chunk-WRJVB3C2.js";
21
+ import "./chunk-GCASGYIO.js";
21
22
  import "./chunk-3CSX3ETE.js";
22
23
  import "./chunk-RL6NEVXT.js";
23
24
  import "./chunk-DM2T26WE.js";
24
25
  import "./chunk-LDXUBPMO.js";
26
+ import "./chunk-JYIJNNN3.js";
27
+ import "./chunk-AAD2ZS6P.js";
25
28
  import "./chunk-CGASUJVP.js";
26
29
  import "./chunk-R3DJVOSM.js";
27
30
  import "./chunk-BT7NVCML.js";
28
- import "./chunk-JYIJNNN3.js";
29
- import "./chunk-AAD2ZS6P.js";
31
+ import "./chunk-YXZG5TVN.js";
30
32
  import "./chunk-5VQJBH2G.js";
31
33
  import "./chunk-AITCS2RC.js";
32
34
  import "./chunk-XMMESCPD.js";
@@ -41,8 +43,8 @@ import "./chunk-45GF7Y3V.js";
41
43
  import "./chunk-RGMVMVMF.js";
42
44
  import "./chunk-N7RWREIQ.js";
43
45
  import "./chunk-5I4M26Q7.js";
46
+ import "./chunk-ZIKENA2C.js";
44
47
  import "./chunk-5GKPFL3S.js";
45
- import "./chunk-4DJQYKMN.js";
46
48
  import "./chunk-PQVCH2AE.js";
47
49
  import "./chunk-EYIEWJNI.js";
48
50
  import "./chunk-JUC24CTX.js";
@@ -1,4 +1,4 @@
1
- import { t as MemoryCategory } from './types-DHBxIF0s.js';
1
+ import { v as MemoryCategory } from './types-BA7W-_xy.js';
2
2
  import './message-parts/index.js';
3
3
  import './bounded-jsonl-state.js';
4
4
  import './operator-doctor-types.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remnic/core",
3
- "version": "9.26.0",
3
+ "version": "9.28.0",
4
4
  "description": "Framework-agnostic Remnic memory engine — orchestrator, storage, extraction, search, trust zones",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -3076,7 +3076,7 @@
3076
3076
  "core"
3077
3077
  ],
3078
3078
  "peerDependencies": {
3079
- "@remnic/coding-graph": "^9.26.0"
3079
+ "@remnic/coding-graph": "^9.28.0"
3080
3080
  },
3081
3081
  "peerDependenciesMeta": {
3082
3082
  "@remnic/coding-graph": {
@@ -10,6 +10,7 @@
10
10
  */
11
11
  import type { ExtractionLivenessStatus } from "./extraction-liveness.js";
12
12
  import type { CorpusWatermark } from "./corpus-watermark.js";
13
+ import type { ReplicaDivergenceStatus } from "./replica-divergence.js";
13
14
 
14
15
  export interface EngramAccessHealthResponse {
15
16
  ok: true;
@@ -23,6 +24,13 @@ export interface EngramAccessHealthResponse {
23
24
  projectionAvailable: boolean;
24
25
  extraction: ExtractionLivenessStatus;
25
26
  corpus: CorpusWatermark[];
27
+ /**
28
+ * Whether `corpus` above is the COMPLETE census for this responder, from the
29
+ * same call that produced it. A polling peer must refuse to certify
30
+ * convergence against a partial array (issue #2149).
31
+ */
32
+ corpusComplete: boolean;
33
+ replica: ReplicaDivergenceStatus;
26
34
  }
27
35
 
28
36
  export type EngramAccessQmdCollectionState =
@@ -1870,6 +1870,8 @@ test("HTTP externalRequestHandler runs pre-auth, can end responses, and falls th
1870
1870
  watermarkScope: "root-store",
1871
1871
  },
1872
1872
  corpus: [],
1873
+ corpusComplete: true,
1874
+ replica: { enabled: false, pending: false, polledAt: null, peers: [] },
1873
1875
  }),
1874
1876
  } satisfies Pick<EngramAccessService, "health">;
1875
1877
  const service = healthStub as unknown as EngramAccessService;
@@ -1995,6 +1997,8 @@ test("HTTP authTokenEntriesGetter is authoritative: scope policy binds connector
1995
1997
  watermarkScope: "root-store",
1996
1998
  },
1997
1999
  corpus: [],
2000
+ corpusComplete: true,
2001
+ replica: { enabled: false, pending: false, polledAt: null, peers: [] },
1998
2002
  }),
1999
2003
  } satisfies Pick<EngramAccessService, "health">;
2000
2004
  const entries = [
@@ -108,6 +108,29 @@ test("health reports active QMD version and collection state", async () => {
108
108
  }
109
109
  });
110
110
 
111
+ test("health reports replica divergence disabled by default (no peers -> behaves as today)", async () => {
112
+ const memoryDir = await mkdtemp(path.join(os.tmpdir(), "remnic-health-replica-"));
113
+ try {
114
+ const config = parseConfig({ memoryDir });
115
+ const service = new EngramAccessService({
116
+ config,
117
+ qmd: makeQmd({}),
118
+ async getStorage() {
119
+ return { dir: memoryDir };
120
+ },
121
+ } as unknown as Orchestrator);
122
+
123
+ const health = await service.health();
124
+
125
+ assert.equal(health.replica.enabled, false);
126
+ assert.equal(health.replica.pending, false);
127
+ assert.equal(health.replica.polledAt, null);
128
+ assert.equal(health.replica.peers.length, 0);
129
+ } finally {
130
+ await rm(memoryDir, { recursive: true, force: true });
131
+ }
132
+ });
133
+
111
134
  test("health treats qmdEmbeddingBacklogThreshold 0 as backlog degradation disabled", async () => {
112
135
  const config = parseConfig({ qmdEnabled: true, qmdEmbeddingBacklogThreshold: 0 });
113
136
  const qmd = makeQmd({
@@ -19,7 +19,9 @@ import { resolveNamespaceCapabilities,
19
19
  resolveMemoryLifecycleCapabilities,
20
20
  resolveQmdCapabilities,
21
21
  resolveSecurityCapabilities, resolveObjectiveStateCapabilities, resolveCompressionCapabilities, resolveRecallAuxiliaryCapabilities } from "./capabilities.js";
22
- import { CorpusWatermarkCache, computeServiceCorpusWatermarks } from "./corpus-watermark.js";
22
+ import { CorpusWatermarkCache, computeServiceCorpusCensus } from "./corpus-watermark.js";
23
+ import { ReplicaDivergenceMonitor } from "./replica-divergence.js";
24
+ import type { ResolveSecretRefFn } from "./resolve-auth-token.js";
23
25
  import type {
24
26
  EngramAccessHealthResponse,
25
27
  EngramAccessQmdCollectionState,
@@ -1277,6 +1279,7 @@ export class EngramAccessService {
1277
1279
  private readonly budget: CrossNamespaceBudget;
1278
1280
  private readonly auditAdapter: AccessAuditAdapter | null;
1279
1281
  private readonly corpusWatermarkCache = new CorpusWatermarkCache();
1282
+ private readonly replicaDivergenceMonitor: ReplicaDivergenceMonitor;
1280
1283
 
1281
1284
  /** AccessObserveWriteSurface (access-service decomposition). Lazy; selfDeps live wiring. */
1282
1285
  private _accessObserveWriteSurface: AccessObserveWriteSurface | undefined;
@@ -1339,8 +1342,13 @@ export class EngramAccessService {
1339
1342
  }
1340
1343
  private readonly extractionLivenessWarn = new ExtractionLivenessWarnThrottle();
1341
1344
 
1342
- constructor(private readonly orchestrator: Orchestrator) {
1345
+ constructor(private readonly orchestrator: Orchestrator, options: { resolveSecretRef?: ResolveSecretRefFn | null } = {}) {
1343
1346
  this.idempotency = new AccessIdempotencyStore(orchestrator.config.memoryDir);
1347
+ // Peer SecretRef tokens resolve at poll time through the host resolver, the
1348
+ // same indirection as agentAccessHttp.authToken (review round 1). Absent a
1349
+ // resolver, string/${ENV} tokens still work and a SecretRef degrades to a
1350
+ // per-peer `unreachable` (never a throw).
1351
+ this.replicaDivergenceMonitor = new ReplicaDivergenceMonitor({ resolveSecretRef: options.resolveSecretRef });
1344
1352
  const accessCaps = resolveAccessSetupCapabilities(orchestrator.config); // #1566 Cluster B
1345
1353
  this.budget = new CrossNamespaceBudget({
1346
1354
  enabled: accessCaps.recallCrossNamespaceBudget,
@@ -2432,6 +2440,11 @@ export class EngramAccessService {
2432
2440
  const searchBackend = this.orchestrator.config.searchBackend ?? "qmd";
2433
2441
  const qmdEnabled = resolveQmdCapabilities(this.orchestrator.config).qmd === true;
2434
2442
  const extraction = await computeExtractionLivenessStatus(this.orchestrator, this.extractionLivenessWarn);
2443
+ // ONE call: the corpus array and the flag describing it must not come from
2444
+ // two independently-cached scans (round 8, codex P1).
2445
+ const caps = tokenCapabilityStore.getStore();
2446
+ const corpusCensus = await computeServiceCorpusCensus(this.orchestrator, {
2447
+ cache: this.corpusWatermarkCache, caps });
2435
2448
  let projectionAvailable = false;
2436
2449
  try {
2437
2450
  await stat(getMemoryProjectionPath(storage.dir));
@@ -2456,8 +2469,18 @@ export class EngramAccessService {
2456
2469
  nativeKnowledgeEnabled: this.orchestrator.config.nativeKnowledge?.enabled === true,
2457
2470
  projectionAvailable,
2458
2471
  extraction,
2459
- corpus: await computeServiceCorpusWatermarks(this.orchestrator, {
2460
- cache: this.corpusWatermarkCache, caps: tokenCapabilityStore.getStore() }),
2472
+ corpus: corpusCensus.watermarks,
2473
+ // Describes THIS response's array (round 8): a separate scan could report
2474
+ // complete while the shipped corpus was partial, and peers trust it.
2475
+ corpusComplete: corpusCensus.complete,
2476
+ replica: this.replicaDivergenceMonitor.getReport({
2477
+ config: this.orchestrator.config.replicaPeers,
2478
+ // Capability-INDEPENDENT: this poll is cached instance-wide, so a
2479
+ // restricted caller's filtered census must never seed it (round 9).
2480
+ computeLocalWatermarks: () => computeServiceCorpusCensus(this.orchestrator, {}),
2481
+ caps,
2482
+ localCensusComplete: corpusCensus.complete,
2483
+ }),
2461
2484
  };
2462
2485
  }
2463
2486
 
package/src/cli.ts CHANGED
@@ -115,6 +115,8 @@ import {
115
115
  renderActionConfidenceText,
116
116
  } from "./action-confidence.js";
117
117
  import {
118
+ hostSecretRefResolver,
119
+ loadHostSecretRefResolver,
118
120
  resolveAgentAccessAuthToken,
119
121
  type ResolveSecretRefFn,
120
122
  } from "./resolve-auth-token.js";
@@ -3797,7 +3799,8 @@ export function registerCli(
3797
3799
  .option("--json", "Emit machine-readable JSON only")
3798
3800
  .action(async (...args: unknown[]) => {
3799
3801
  const options = (args[0] ?? {}) as Record<string, unknown>;
3800
- const report = await runOperatorDoctor({ orchestrator });
3802
+ const resolveSecretRef = await loadHostSecretRefResolver(registerOptions);
3803
+ const report = await runOperatorDoctor({ orchestrator, resolveSecretRef });
3801
3804
  if (reportHasMachineReadableOutput(options)) {
3802
3805
  console.log(JSON.stringify(report, null, 2));
3803
3806
  } else {
@@ -6767,7 +6770,10 @@ export function registerCli(
6767
6770
  console.log("OK");
6768
6771
  });
6769
6772
 
6770
- const accessService = new EngramAccessService(orchestrator);
6773
+ // /health's replica monitor resolves peer-token SecretRefs at poll time (#2149).
6774
+ const accessService = new EngramAccessService(orchestrator, {
6775
+ resolveSecretRef: hostSecretRefResolver(registerOptions),
6776
+ });
6771
6777
  const accessCmd = cmd
6772
6778
  .command("access")
6773
6779
  .description("Manage Engram HTTP and MCP access surfaces");
@@ -6796,11 +6802,7 @@ export function registerCli(
6796
6802
  typeof options.token === "string" && options.token.trim().length > 0
6797
6803
  ? options.token
6798
6804
  : undefined;
6799
- const resolveSecretRef =
6800
- registerOptions.resolveSecretRef ??
6801
- (registerOptions.loadResolveSecretRef
6802
- ? await registerOptions.loadResolveSecretRef()
6803
- : null);
6805
+ const resolveSecretRef = await loadHostSecretRefResolver(registerOptions);
6804
6806
  const resolvedConfigAuthToken = cliTokenOverride
6805
6807
  ? undefined
6806
6808
  : await resolveAgentAccessAuthToken(
package/src/config.ts CHANGED
@@ -38,6 +38,7 @@ import { expandTildePath } from "./utils/path.js";
38
38
  import { coerceBool, coerceBooleanLike, coerceInstallExtension, coerceNumber } from "./connectors/coerce.js";
39
39
  import { parseRecallConcurrencyConfig } from "./recall-concurrency-config.js";
40
40
  import { parseExtractionLivenessConfig } from "./extraction-liveness.js";
41
+ import { parseReplicaPeersConfig } from "./replica-peers-config.js";
41
42
  import { hasLegacyConnectorEntries } from "./connectors/paths.js";
42
43
  import {
43
44
  parseQmdChunkStrategy,
@@ -2335,6 +2336,7 @@ export function parseConfig(
2335
2336
  dreamsPhases,
2336
2337
  procedural,
2337
2338
  extractionLiveness: parseExtractionLivenessConfig(cfg),
2339
+ replicaPeers: parseReplicaPeersConfig(cfg),
2338
2340
  wearables,
2339
2341
  meetings,
2340
2342
  activity,
@@ -2349,7 +2351,6 @@ export function parseConfig(
2349
2351
  codexCompat,
2350
2352
  codingKnowledge: parseCodingKnowledgeConfig(cfg.codingKnowledge),
2351
2353
  chat: parseChatConfig(cfg.chat),
2352
- // Hourly summaries
2353
2354
  hourlySummariesEnabled: cfg.hourlySummariesEnabled !== false, // default: true
2354
2355
  daySummaryEnabled: cfg.daySummaryEnabled !== false, // default: true
2355
2356
  hourlySummaryCronAutoRegister: cfg.hourlySummaryCronAutoRegister === true,
@@ -25,6 +25,7 @@ import {
25
25
  buildPartitionCensus,
26
26
  computeCorpusWatermark,
27
27
  computeCorpusWatermarks,
28
+ computeServiceCorpusCensus,
28
29
  computeServiceCorpusWatermarks,
29
30
  digestPartitionCensus,
30
31
  resolveCorpusNamespaceRoots,
@@ -838,3 +839,23 @@ test("finding round-10: a non-directory category root fails a strict census (nam
838
839
  await rm(memoryDir, { recursive: true, force: true });
839
840
  }
840
841
  });
842
+
843
+ test("round 6 (coderabbit): a failed namespace enumeration is an INCOMPLETE census, not an empty corpus", async () => {
844
+ // computeServiceCorpusCensus wraps resolveCorpusNamespaceRoots: when enumeration
845
+ // throws, the census must report complete:false (so a peer is never certified
846
+ // converged against it) rather than an empty set that reads as an empty deployment.
847
+ const throwingConfig = new Proxy({} as PluginConfig, {
848
+ get() {
849
+ throw new Error("namespace enumeration unavailable");
850
+ },
851
+ });
852
+ const host = {
853
+ config: throwingConfig,
854
+ getStorage: () => {
855
+ throw new Error("getStorage must not be reached once enumeration fails");
856
+ },
857
+ };
858
+ const census = await computeServiceCorpusCensus(host);
859
+ assert.equal(census.complete, false, "an enumeration failure is incomplete, never a certified empty census");
860
+ assert.deepEqual(census.watermarks, [], "and it yields no watermarks");
861
+ });
@@ -500,6 +500,22 @@ export async function computeServiceCorpusWatermarks(
500
500
  host: CorpusWatermarkHost,
501
501
  options: ServiceCorpusWatermarkOptions = {},
502
502
  ): Promise<CorpusWatermark[]> {
503
+ return (await computeServiceCorpusCensus(host, options)).watermarks;
504
+ }
505
+
506
+ /**
507
+ * Watermarks PLUS whether every configured namespace made it into the set.
508
+ *
509
+ * Completeness is returned ATOMICALLY with the data rather than stashed in a
510
+ * side channel: every early exit here (enumeration threw, roots still warming,
511
+ * a per-namespace scan failed, a cache entry not yet populated) yields an
512
+ * incomplete set, and a caller that certifies convergence against a partial
513
+ * census would hide the divergence of whatever was dropped (issue #2149).
514
+ */
515
+ export async function computeServiceCorpusCensus(
516
+ host: CorpusWatermarkHost,
517
+ options: ServiceCorpusWatermarkOptions = {},
518
+ ): Promise<{ watermarks: CorpusWatermark[]; complete: boolean }> {
503
519
  let roots: CorpusNamespaceRoot[] | undefined;
504
520
  if (options.cache) {
505
521
  roots = options.cache.getResolvedRoots(() => resolveCorpusNamespaceRoots({ config: host.config }));
@@ -507,25 +523,31 @@ export async function computeServiceCorpusWatermarks(
507
523
  try {
508
524
  roots = await resolveCorpusNamespaceRoots({ config: host.config });
509
525
  } catch {
510
- return [];
526
+ return { watermarks: [], complete: false }; // never enumerated — not an empty corpus
511
527
  }
512
528
  }
513
- if (!roots) return []; // enumeration still warming (cold) served on a later probe
529
+ // Enumeration still warming (cold): served on a later probe, and NOT complete.
530
+ if (!roots) return { watermarks: [], complete: false };
514
531
  const visible = roots.filter((root) => root.namespaces.some((ns) => capabilityAllowsNamespace(options.caps, ns)));
515
532
  const watermarks: CorpusWatermark[] = [];
533
+ let complete = true;
516
534
  for (const { namespace } of visible) {
517
535
  const compute = async (): Promise<CorpusWatermark> =>
518
536
  computeNamespaceWatermark(namespace, await host.getStorage(namespace), options.now);
519
537
  if (options.cache) {
520
538
  const cached = options.cache.get(namespace, compute);
521
539
  if (cached) watermarks.push(cached);
540
+ else complete = false; // still warming — the set is not the full census yet
522
541
  } else {
523
542
  try {
524
543
  watermarks.push(await compute());
525
544
  } catch {
526
545
  // One tenant's storage/scan failed — omit just that namespace.
546
+ complete = false;
527
547
  }
528
548
  }
529
549
  }
530
- return watermarks;
550
+ return { watermarks, complete };
531
551
  }
552
+
553
+
@@ -0,0 +1,55 @@
1
+ const BUILTIN_ALIASES: Record<string, string> = {
2
+ openclaw: "openclaw",
3
+ "open-claw": "openclaw",
4
+ };
5
+
6
+ function normalizeEntityNameWithPattern(
7
+ raw: string,
8
+ type: string,
9
+ aliases: Readonly<Record<string, string>> | undefined,
10
+ pattern: RegExp,
11
+ normalizeUnicode: boolean
12
+ ): string {
13
+ const rawStr = typeof raw === "string" ? raw : "";
14
+ const typeStr = typeof type === "string" && type.trim().length > 0 ? type : "entity";
15
+ const typePrefix = `${typeStr.toLowerCase()}-`;
16
+ let name = normalizeUnicode ? rawStr.normalize("NFC").toLowerCase().trim() : rawStr.toLowerCase().trim();
17
+ if (name.startsWith(typePrefix)) name = name.slice(typePrefix.length);
18
+
19
+ let normalized = name.replace(pattern, "-").replace(/-+/g, "-").replace(/^-|-$/g, "");
20
+ let legacyNormalized: string | undefined;
21
+ if (normalizeUnicode) {
22
+ let legacyName = rawStr.toLowerCase().trim();
23
+ if (legacyName.startsWith(typePrefix)) legacyName = legacyName.slice(typePrefix.length);
24
+ legacyNormalized = legacyName.replace(/[^a-z0-9]+/g, "-").replace(/-+/g, "-").replace(/^-|-$/g, "");
25
+ }
26
+ const unicodeAlias = aliases !== undefined && Object.hasOwn(aliases, normalized) ? aliases[normalized] : undefined;
27
+ const legacyAlias =
28
+ legacyNormalized !== undefined && legacyNormalized !== normalized && aliases !== undefined &&
29
+ Object.hasOwn(aliases, legacyNormalized)
30
+ ? aliases[legacyNormalized]
31
+ : undefined;
32
+ const userAlias =
33
+ typeof unicodeAlias === "string" && unicodeAlias.length > 0
34
+ ? unicodeAlias
35
+ : legacyAlias;
36
+ if (typeof userAlias === "string" && userAlias.length > 0) {
37
+ normalized = userAlias;
38
+ } else if (Object.hasOwn(BUILTIN_ALIASES, normalized)) {
39
+ normalized = BUILTIN_ALIASES[normalized];
40
+ }
41
+
42
+ return `${typeStr.toLowerCase()}-${normalized}`;
43
+ }
44
+
45
+ export function normalizeEntityName(raw: string, type: string, aliases?: Readonly<Record<string, string>>): string {
46
+ return normalizeEntityNameWithPattern(raw, type, aliases, /[^\p{L}\p{M}\p{N}]+/gu, true);
47
+ }
48
+
49
+ export function normalizeLegacyEntityName(
50
+ raw: string,
51
+ type: string,
52
+ aliases?: Readonly<Record<string, string>>
53
+ ): string {
54
+ return normalizeEntityNameWithPattern(raw, type, aliases, /[^a-z0-9]+/g, false);
55
+ }
@@ -0,0 +1,134 @@
1
+ const UNICODE_WORD_OR_NUMBER_RE = /[\p{L}\p{M}\p{N}]/u;
2
+
3
+ function firstUnicodeCharacter(value: string): string {
4
+ const codePoint = value.codePointAt(0);
5
+ return codePoint === undefined ? "" : String.fromCodePoint(codePoint);
6
+ }
7
+
8
+ function lastUnicodeCharacter(value: string): string {
9
+ const codePoint = [...value].at(-1);
10
+ return codePoint ?? "";
11
+ }
12
+
13
+ const JAPANESE_PARTICLE_RE = /^[のはがをにへともやかでだ]$/u;
14
+ const JAPANESE_MULTI_CHARACTER_PARTICLES = [
15
+ "について",
16
+ "にとって",
17
+ "によって",
18
+ "に関して",
19
+ "に対して",
20
+ "とは",
21
+ "では",
22
+ "には",
23
+ "にも",
24
+ "って",
25
+ ] as const;
26
+ const KOREAN_PARTICLES = [
27
+ "에서", "에게", "한테", "으로", "까지", "부터", "보다", "처럼", "같이",
28
+ "이나", "라도", "밖에", "마다", "조차", "이랑", "하고", "은", "는",
29
+ "이", "가", "을", "를", "의", "께", "와", "과", "도", "만", "든",
30
+ "에", "로", "나", "랑",
31
+ ] as const;
32
+ const KOREAN_UNSPACED_QUESTION_PARTICLES = ["은", "는", "이", "가"] as const;
33
+ const KOREAN_INTERROGATIVE_PREFIXES = [
34
+ "어디", "무엇", "뭐", "왜", "어떻게", "언제", "누구", "어느", "몇", "얼마",
35
+ ] as const;
36
+
37
+ const HANGUL_RUN_RE = /^[\p{Script=Hangul}]+/u;
38
+
39
+ const UNICODE_WORD_SEGMENTER =
40
+ typeof Intl.Segmenter === "function" ? new Intl.Segmenter(undefined, { granularity: "word" }) : null;
41
+ const KOREAN_WORD_SEGMENTER =
42
+ typeof Intl.Segmenter === "function" ? new Intl.Segmenter("ko", { granularity: "word" }) : null;
43
+
44
+ const JAPANESE_WORD_SEGMENTER =
45
+ typeof Intl.Segmenter === "function" ? new Intl.Segmenter("ja", { granularity: "word" }) : null;
46
+ const JAPANESE_KANA_RE = /[\p{Script=Hiragana}\p{Script=Katakana}]/u;
47
+
48
+ function isJapaneseParticleBoundary(suffix: string): boolean {
49
+ const firstSegment = JAPANESE_WORD_SEGMENTER?.segment(suffix).containing(0)?.segment;
50
+ if (firstSegment !== undefined) {
51
+ if (JAPANESE_MULTI_CHARACTER_PARTICLES.some((particle) => particle === firstSegment)) return true;
52
+ return JAPANESE_PARTICLE_RE.test(firstSegment);
53
+ }
54
+ const firstCharacter = firstUnicodeCharacter(suffix);
55
+ return (
56
+ JAPANESE_MULTI_CHARACTER_PARTICLES.some((particle) => suffix.startsWith(particle)) ||
57
+ (JAPANESE_PARTICLE_RE.test(firstCharacter) &&
58
+ !UNICODE_WORD_OR_NUMBER_RE.test(firstUnicodeCharacter(suffix.slice(firstCharacter.length))))
59
+ );
60
+ }
61
+
62
+ function isIntlWordBoundary(source: string, index: number): boolean {
63
+ if (index <= 0 || index >= source.length) return true;
64
+ return UNICODE_WORD_SEGMENTER?.segment(source).containing(index)?.index === index;
65
+ }
66
+
67
+ function isKoreanUnspacedQuestionBoundary(suffix: string): boolean {
68
+ return KOREAN_UNSPACED_QUESTION_PARTICLES.some((particle) =>
69
+ suffix.startsWith(particle) &&
70
+ KOREAN_INTERROGATIVE_PREFIXES.some((prefix) => suffix.startsWith(prefix, particle.length)),
71
+ );
72
+ }
73
+
74
+ function isKoreanParticleBoundary(suffix: string): boolean {
75
+ if (isKoreanUnspacedQuestionBoundary(suffix)) return true;
76
+ const firstSegment = KOREAN_WORD_SEGMENTER?.segment(suffix).containing(0)?.segment;
77
+ if (firstSegment !== undefined) {
78
+ return KOREAN_PARTICLES.some((particle) => particle === firstSegment);
79
+ }
80
+ const particleRun = suffix.match(HANGUL_RUN_RE)?.[0] ?? "";
81
+ const nextCharacter = firstUnicodeCharacter(suffix.slice(particleRun.length));
82
+ return (
83
+ KOREAN_PARTICLES.some((particle) => particle === particleRun) &&
84
+ (nextCharacter.length === 0 || !UNICODE_WORD_OR_NUMBER_RE.test(nextCharacter))
85
+ );
86
+ }
87
+
88
+ function isUnicodePhraseBoundary(
89
+ character: string,
90
+ suffix: string = "",
91
+ source: string = "",
92
+ boundaryIndex: number = -1,
93
+ strictUnicode = false,
94
+ allowLeadingParticle = false,
95
+ ): boolean {
96
+ return (
97
+ character.length === 0
98
+ || !UNICODE_WORD_OR_NUMBER_RE.test(character)
99
+ || (allowLeadingParticle && isJapaneseParticleBoundary(character))
100
+ || isJapaneseParticleBoundary(suffix)
101
+ || (!strictUnicode &&
102
+ boundaryIndex >= 0 &&
103
+ !JAPANESE_KANA_RE.test(suffix) &&
104
+ isIntlWordBoundary(source, boundaryIndex))
105
+ || (allowLeadingParticle && isKoreanParticleBoundary(character))
106
+ || isKoreanParticleBoundary(suffix)
107
+ );
108
+ }
109
+
110
+ export function containsPhrase(haystack: string, needle: string): boolean {
111
+ if (!needle) return false;
112
+ const caseInsensitive = /^[a-z0-9 ]+$/i.test(needle);
113
+ const searchHaystack = caseInsensitive ? haystack.toLowerCase() : haystack;
114
+ const searchNeedle = caseInsensitive ? needle.toLowerCase() : needle;
115
+ let offset = searchHaystack.indexOf(searchNeedle);
116
+ while (offset >= 0) {
117
+ const before = lastUnicodeCharacter(searchHaystack.slice(0, offset));
118
+ const after = searchHaystack.slice(offset + searchNeedle.length);
119
+ if (
120
+ isUnicodePhraseBoundary(before, "", searchHaystack, offset, caseInsensitive, true)
121
+ && isUnicodePhraseBoundary(
122
+ firstUnicodeCharacter(after),
123
+ after,
124
+ searchHaystack,
125
+ offset + searchNeedle.length,
126
+ caseInsensitive,
127
+ )
128
+ ) {
129
+ return true;
130
+ }
131
+ offset = searchHaystack.indexOf(searchNeedle, offset + searchNeedle.length);
132
+ }
133
+ return false;
134
+ }