@remnic/core 9.42.0 → 9.44.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 (216) hide show
  1. package/dist/access-admin-ops-surface.d.ts +2 -2
  2. package/dist/access-admin-ops-surface.js +40 -40
  3. package/dist/access-authorization-probe.d.ts +2 -2
  4. package/dist/access-authorization-probe.js +41 -41
  5. package/dist/access-boundary.d.ts +2 -2
  6. package/dist/access-boundary.js +40 -40
  7. package/dist/access-cli.js +101 -99
  8. package/dist/access-cli.js.map +1 -1
  9. package/dist/access-extraction-force-flush.d.ts +2 -2
  10. package/dist/access-extraction-force-flush.js +40 -40
  11. package/dist/access-http-lcm-compaction.d.ts +2 -2
  12. package/dist/access-http-lifecycle-flush.d.ts +2 -2
  13. package/dist/access-http-query.d.ts +8 -0
  14. package/dist/access-http-query.js +179 -0
  15. package/dist/access-http.d.ts +2 -2
  16. package/dist/access-http.js +48 -47
  17. package/dist/access-identity-continuity-surface.d.ts +1 -1
  18. package/dist/access-identity-continuity-surface.js +40 -40
  19. package/dist/access-lcm-surface.d.ts +2 -2
  20. package/dist/access-lcm-surface.js +40 -40
  21. package/dist/access-mcp.d.ts +2 -2
  22. package/dist/access-mcp.js +44 -44
  23. package/dist/access-namespace-preflight.js +40 -40
  24. package/dist/access-observe-write-surface.d.ts +2 -2
  25. package/dist/access-observe-write-surface.js +40 -40
  26. package/dist/access-operations-batch.js +42 -42
  27. package/dist/access-operations.d.ts +2 -2
  28. package/dist/access-operations.js +43 -43
  29. package/dist/access-recall-concurrency.d.ts +2 -2
  30. package/dist/access-recall-concurrency.js +40 -40
  31. package/dist/access-recall-response.d.ts +2 -2
  32. package/dist/access-recall-response.js +40 -40
  33. package/dist/access-recall-surface.d.ts +2 -2
  34. package/dist/access-recall-surface.js +40 -40
  35. package/dist/{access-service-D1BkxwSf.d.ts → access-service-BCZJbX0f.d.ts} +12 -2
  36. package/dist/access-service-helpers.d.ts +2 -2
  37. package/dist/access-service.d.ts +2 -2
  38. package/dist/access-service.js +40 -40
  39. package/dist/access-surface-catalog.d.ts +2 -2
  40. package/dist/access-surface-catalog.js +5 -0
  41. package/dist/access-surface-catalog.js.map +1 -1
  42. package/dist/{auto-sync-UPTUVE4X.js → auto-sync-5OE5QOZB.js} +3 -3
  43. package/dist/bootstrap.d.ts +1 -1
  44. package/dist/briefing.js +8 -8
  45. package/dist/buffer.js +6 -6
  46. package/dist/causal-behavior.js +2 -2
  47. package/dist/causal-chain.js +2 -2
  48. package/dist/causal-consolidation.js +12 -12
  49. package/dist/causal-retrieval.js +2 -2
  50. package/dist/causal-trajectory-graph.js +2 -2
  51. package/dist/causal-trajectory.js +1 -1
  52. package/dist/{chunk-LEPOP46W.js → chunk-227UFSEQ.js} +4 -4
  53. package/dist/{chunk-BEQOZOYZ.js → chunk-2FTRRQKZ.js} +5 -5
  54. package/dist/{chunk-CMENJQ6I.js → chunk-2QR2RRH6.js} +2 -2
  55. package/dist/{chunk-3C2TGBDB.js → chunk-35IC3EVP.js} +2 -2
  56. package/dist/{chunk-L2DPF4DF.js → chunk-3SHB4YAW.js} +4 -4
  57. package/dist/{chunk-UV72DEZD.js → chunk-4B77XSG5.js} +5 -5
  58. package/dist/{chunk-GUQYMOPU.js → chunk-4LMA77JH.js} +5 -5
  59. package/dist/{chunk-AX2J2LC4.js → chunk-5ZE7QHTK.js} +2 -2
  60. package/dist/{chunk-YFHMW37V.js → chunk-6CZPDBJS.js} +5 -5
  61. package/dist/chunk-6ZYQ36IB.js +30 -0
  62. package/dist/chunk-6ZYQ36IB.js.map +1 -0
  63. package/dist/{chunk-QY66HJ4X.js → chunk-7PLHD7EO.js} +5 -5
  64. package/dist/{chunk-NRV4Y3PM.js → chunk-CAGPP5NB.js} +1 -1
  65. package/dist/{chunk-5TOV3D6U.js → chunk-CH2WTP6R.js} +6 -6
  66. package/dist/{chunk-AXUU7SG3.js → chunk-E6JYVPBK.js} +2 -2
  67. package/dist/{chunk-NF3U3MPG.js → chunk-ECK75GDJ.js} +2 -2
  68. package/dist/{chunk-NHRNYJPJ.js → chunk-EMC5GT4H.js} +7 -7
  69. package/dist/{chunk-Q4XL7LJW.js → chunk-EUVPB5TA.js} +55 -37
  70. package/dist/chunk-EUVPB5TA.js.map +1 -0
  71. package/dist/{chunk-PWKZV4A3.js → chunk-G24HJJ67.js} +4 -4
  72. package/dist/{chunk-OEXKYYVH.js → chunk-HGFILS2Q.js} +6 -6
  73. package/dist/{chunk-IOQFPVGY.js → chunk-HLPD7B7P.js} +2 -2
  74. package/dist/{chunk-CWPDM66T.js → chunk-HXTUA7QM.js} +28 -28
  75. package/dist/chunk-HXTUA7QM.js.map +1 -0
  76. package/dist/{chunk-WGCTFGLW.js → chunk-I22U5YYD.js} +3 -3
  77. package/dist/{chunk-MSXWUXFE.js → chunk-IADUAH35.js} +2 -2
  78. package/dist/{chunk-FHEJ22B7.js → chunk-IXFI6E3Q.js} +3 -3
  79. package/dist/{chunk-6I2C3EOH.js → chunk-J43XN7N3.js} +90 -88
  80. package/dist/chunk-J43XN7N3.js.map +1 -0
  81. package/dist/{chunk-F2KMAFEB.js → chunk-JDDTNK5P.js} +2 -2
  82. package/dist/{chunk-UGCUVLOL.js → chunk-MUKLQDJP.js} +50 -50
  83. package/dist/{chunk-5N26WBPQ.js → chunk-MYFFOPO2.js} +5 -5
  84. package/dist/{chunk-Q53RLEW7.js → chunk-N7LPS4Z3.js} +2 -2
  85. package/dist/{chunk-UZQCNOPS.js → chunk-NVRYW264.js} +12 -12
  86. package/dist/{chunk-MVW234LO.js → chunk-O4BADU6R.js} +2 -2
  87. package/dist/{chunk-ZERSIPFC.js → chunk-OHLNFI6Z.js} +17 -17
  88. package/dist/{chunk-KXGN6G2Y.js → chunk-OPVOUBHT.js} +2 -2
  89. package/dist/{chunk-JDXDA5OO.js → chunk-OZL7KB6B.js} +2 -2
  90. package/dist/{chunk-XRWVXPEM.js → chunk-PJUHQC4T.js} +2 -2
  91. package/dist/{chunk-CQ5MR2HQ.js → chunk-PLQCPMJA.js} +14 -14
  92. package/dist/{chunk-MU7ZHSZE.js → chunk-PO5LSKQO.js} +2 -2
  93. package/dist/{chunk-LRGSLV7M.js → chunk-PYHOAXTI.js} +4 -4
  94. package/dist/{chunk-ONHRRJZM.js → chunk-QJAQNXWI.js} +6 -6
  95. package/dist/{chunk-UQVGDEAJ.js → chunk-TRBIJS2T.js} +2 -2
  96. package/dist/{chunk-6GIMMNVK.js → chunk-U5SX74DV.js} +4 -4
  97. package/dist/{chunk-KPJQTSRJ.js → chunk-UUQLB2HJ.js} +2 -2
  98. package/dist/{chunk-JYIFGGEM.js → chunk-UZGJFIIG.js} +2 -2
  99. package/dist/{chunk-HNZKVLAN.js → chunk-W6ROK2KU.js} +2 -2
  100. package/dist/{chunk-7VIB7PAE.js → chunk-WMHO3WLC.js} +2 -2
  101. package/dist/{chunk-OYFDEJZB.js → chunk-WUDWRUGK.js} +2 -2
  102. package/dist/{chunk-4VXGRIH6.js → chunk-WUNIWKY4.js} +5 -5
  103. package/dist/{chunk-BI6RE2ZS.js → chunk-WX6KOVVK.js} +2 -2
  104. package/dist/chunk-YUOKZ3LJ.js +24 -0
  105. package/dist/chunk-YUOKZ3LJ.js.map +1 -0
  106. package/dist/{cli-IUhV-lmk.d.ts → cli-U30A3jyx.d.ts} +2 -2
  107. package/dist/cli.d.ts +3 -3
  108. package/dist/cli.js +70 -69
  109. package/dist/compounding/engine.js +8 -8
  110. package/dist/connectors/codex-materialize-runner.js +8 -8
  111. package/dist/connectors/index.js +8 -8
  112. package/dist/convergence-refresh.d.ts +24 -0
  113. package/dist/convergence-refresh.js +74 -0
  114. package/dist/convergence-refresh.js.map +1 -0
  115. package/dist/conversation-index/backend.js +2 -2
  116. package/dist/corpus-watermark.js +20 -20
  117. package/dist/entity-retrieval.js +8 -8
  118. package/dist/explicit-capture.d.ts +1 -1
  119. package/dist/explicit-capture.js +3 -3
  120. package/dist/extraction.js +14 -14
  121. package/dist/{graph-edge-decay-Z6ENALU2.js → graph-edge-decay-GF3ZSGSP.js} +4 -4
  122. package/dist/graph-edge-decay-GF3ZSGSP.js.map +1 -0
  123. package/dist/graph-snapshot.js +3 -3
  124. package/dist/graph.js +2 -2
  125. package/dist/index.d.ts +4 -4
  126. package/dist/index.js +161 -159
  127. package/dist/lcm/index.js +3 -3
  128. package/dist/maintenance/memory-governance.js +9 -9
  129. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +8 -8
  130. package/dist/maintenance/rebuild-memory-projection.js +10 -10
  131. package/dist/mcp-memory-inspector-app.d.ts +2 -2
  132. package/dist/namespaces/migrate.js +19 -19
  133. package/dist/namespaces/search.js +10 -10
  134. package/dist/namespaces/storage.js +8 -8
  135. package/dist/offline-sync-impression-drain.js +4 -4
  136. package/dist/operator-doctor-corpus.js +21 -21
  137. package/dist/operator-toolkit.js +30 -30
  138. package/dist/orchestration/maintenance.js +15 -15
  139. package/dist/{orchestrator-fYTncnLy.d.ts → orchestrator-DUxbhhqO.d.ts} +1 -1
  140. package/dist/orchestrator.d.ts +1 -1
  141. package/dist/orchestrator.js +102 -100
  142. package/dist/qmd.js +4 -4
  143. package/dist/reconcile/cursor.d.ts +21 -0
  144. package/dist/reconcile/cursor.js +104 -0
  145. package/dist/reconcile/cursor.js.map +1 -0
  146. package/dist/resume-bundles.js +1 -1
  147. package/dist/search/factory.js +9 -9
  148. package/dist/search/index.js +17 -17
  149. package/dist/semantic-consolidation.js +10 -10
  150. package/dist/semantic-rule-promotion.js +8 -8
  151. package/dist/semantic-rule-verifier.js +9 -9
  152. package/dist/source-agent-qualifier.js +13 -13
  153. package/dist/storage.js +7 -7
  154. package/dist/transfer/import-sqlite.js +2 -2
  155. package/dist/verified-recall.js +9 -9
  156. package/package.json +12 -2
  157. package/src/access-http-query.ts +25 -0
  158. package/src/access-http.test.ts +136 -0
  159. package/src/access-http.ts +26 -26
  160. package/src/access-service-offline-file-content.test.ts +40 -0
  161. package/src/access-service.ts +34 -0
  162. package/src/access-surface-catalog.ts +5 -0
  163. package/src/convergence-refresh.ts +28 -0
  164. package/src/orchestrator-convergence-refresh.test.ts +114 -0
  165. package/src/orchestrator.ts +5 -4
  166. package/src/reconcile/cursor.test.ts +123 -0
  167. package/src/reconcile/cursor.ts +130 -0
  168. package/dist/chunk-6I2C3EOH.js.map +0 -1
  169. package/dist/chunk-CWPDM66T.js.map +0 -1
  170. package/dist/chunk-Q4XL7LJW.js.map +0 -1
  171. /package/dist/{graph-edge-decay-Z6ENALU2.js.map → access-http-query.js.map} +0 -0
  172. /package/dist/{auto-sync-UPTUVE4X.js.map → auto-sync-5OE5QOZB.js.map} +0 -0
  173. /package/dist/{chunk-LEPOP46W.js.map → chunk-227UFSEQ.js.map} +0 -0
  174. /package/dist/{chunk-BEQOZOYZ.js.map → chunk-2FTRRQKZ.js.map} +0 -0
  175. /package/dist/{chunk-CMENJQ6I.js.map → chunk-2QR2RRH6.js.map} +0 -0
  176. /package/dist/{chunk-3C2TGBDB.js.map → chunk-35IC3EVP.js.map} +0 -0
  177. /package/dist/{chunk-L2DPF4DF.js.map → chunk-3SHB4YAW.js.map} +0 -0
  178. /package/dist/{chunk-UV72DEZD.js.map → chunk-4B77XSG5.js.map} +0 -0
  179. /package/dist/{chunk-GUQYMOPU.js.map → chunk-4LMA77JH.js.map} +0 -0
  180. /package/dist/{chunk-AX2J2LC4.js.map → chunk-5ZE7QHTK.js.map} +0 -0
  181. /package/dist/{chunk-YFHMW37V.js.map → chunk-6CZPDBJS.js.map} +0 -0
  182. /package/dist/{chunk-QY66HJ4X.js.map → chunk-7PLHD7EO.js.map} +0 -0
  183. /package/dist/{chunk-NRV4Y3PM.js.map → chunk-CAGPP5NB.js.map} +0 -0
  184. /package/dist/{chunk-5TOV3D6U.js.map → chunk-CH2WTP6R.js.map} +0 -0
  185. /package/dist/{chunk-AXUU7SG3.js.map → chunk-E6JYVPBK.js.map} +0 -0
  186. /package/dist/{chunk-NF3U3MPG.js.map → chunk-ECK75GDJ.js.map} +0 -0
  187. /package/dist/{chunk-NHRNYJPJ.js.map → chunk-EMC5GT4H.js.map} +0 -0
  188. /package/dist/{chunk-PWKZV4A3.js.map → chunk-G24HJJ67.js.map} +0 -0
  189. /package/dist/{chunk-OEXKYYVH.js.map → chunk-HGFILS2Q.js.map} +0 -0
  190. /package/dist/{chunk-IOQFPVGY.js.map → chunk-HLPD7B7P.js.map} +0 -0
  191. /package/dist/{chunk-WGCTFGLW.js.map → chunk-I22U5YYD.js.map} +0 -0
  192. /package/dist/{chunk-MSXWUXFE.js.map → chunk-IADUAH35.js.map} +0 -0
  193. /package/dist/{chunk-FHEJ22B7.js.map → chunk-IXFI6E3Q.js.map} +0 -0
  194. /package/dist/{chunk-F2KMAFEB.js.map → chunk-JDDTNK5P.js.map} +0 -0
  195. /package/dist/{chunk-UGCUVLOL.js.map → chunk-MUKLQDJP.js.map} +0 -0
  196. /package/dist/{chunk-5N26WBPQ.js.map → chunk-MYFFOPO2.js.map} +0 -0
  197. /package/dist/{chunk-Q53RLEW7.js.map → chunk-N7LPS4Z3.js.map} +0 -0
  198. /package/dist/{chunk-UZQCNOPS.js.map → chunk-NVRYW264.js.map} +0 -0
  199. /package/dist/{chunk-MVW234LO.js.map → chunk-O4BADU6R.js.map} +0 -0
  200. /package/dist/{chunk-ZERSIPFC.js.map → chunk-OHLNFI6Z.js.map} +0 -0
  201. /package/dist/{chunk-KXGN6G2Y.js.map → chunk-OPVOUBHT.js.map} +0 -0
  202. /package/dist/{chunk-JDXDA5OO.js.map → chunk-OZL7KB6B.js.map} +0 -0
  203. /package/dist/{chunk-XRWVXPEM.js.map → chunk-PJUHQC4T.js.map} +0 -0
  204. /package/dist/{chunk-CQ5MR2HQ.js.map → chunk-PLQCPMJA.js.map} +0 -0
  205. /package/dist/{chunk-MU7ZHSZE.js.map → chunk-PO5LSKQO.js.map} +0 -0
  206. /package/dist/{chunk-LRGSLV7M.js.map → chunk-PYHOAXTI.js.map} +0 -0
  207. /package/dist/{chunk-ONHRRJZM.js.map → chunk-QJAQNXWI.js.map} +0 -0
  208. /package/dist/{chunk-UQVGDEAJ.js.map → chunk-TRBIJS2T.js.map} +0 -0
  209. /package/dist/{chunk-6GIMMNVK.js.map → chunk-U5SX74DV.js.map} +0 -0
  210. /package/dist/{chunk-KPJQTSRJ.js.map → chunk-UUQLB2HJ.js.map} +0 -0
  211. /package/dist/{chunk-JYIFGGEM.js.map → chunk-UZGJFIIG.js.map} +0 -0
  212. /package/dist/{chunk-HNZKVLAN.js.map → chunk-W6ROK2KU.js.map} +0 -0
  213. /package/dist/{chunk-7VIB7PAE.js.map → chunk-WMHO3WLC.js.map} +0 -0
  214. /package/dist/{chunk-OYFDEJZB.js.map → chunk-WUDWRUGK.js.map} +0 -0
  215. /package/dist/{chunk-4VXGRIH6.js.map → chunk-WUNIWKY4.js.map} +0 -0
  216. /package/dist/{chunk-BI6RE2ZS.js.map → chunk-WX6KOVVK.js.map} +0 -0
@@ -2,24 +2,24 @@ import {
2
2
  createConversationIndexRuntime,
3
3
  createConversationSearchBackend,
4
4
  createSearchBackend
5
- } from "../chunk-UZQCNOPS.js";
6
- import "../chunk-ES36HTSC.js";
7
- import "../chunk-3Y224NYC.js";
8
- import "../chunk-H24WNPA2.js";
5
+ } from "../chunk-NVRYW264.js";
9
6
  import "../chunk-BLAKS3CP.js";
10
7
  import "../chunk-S2BBISHU.js";
8
+ import "../chunk-CYEPCZN5.js";
9
+ import "../chunk-ES36HTSC.js";
10
+ import "../chunk-3Y224NYC.js";
11
11
  import "../chunk-W7IGLX4G.js";
12
+ import "../chunk-H24WNPA2.js";
12
13
  import "../chunk-CINZGPSJ.js";
13
- import "../chunk-CYEPCZN5.js";
14
- import "../chunk-LEPOP46W.js";
14
+ import "../chunk-227UFSEQ.js";
15
+ import "../chunk-ET356KSB.js";
15
16
  import "../chunk-72A4L5JJ.js";
16
17
  import "../chunk-A7Q43EUZ.js";
17
- import "../chunk-ET356KSB.js";
18
18
  import "../chunk-3ONXXHQO.js";
19
- import "../chunk-ONHRRJZM.js";
19
+ import "../chunk-QJAQNXWI.js";
20
20
  import "../chunk-YV32N67O.js";
21
- import "../chunk-IUM3VSHI.js";
22
21
  import "../chunk-64UDOIMI.js";
22
+ import "../chunk-IUM3VSHI.js";
23
23
  import "../chunk-O75CRYGF.js";
24
24
  import "../chunk-GCASGYIO.js";
25
25
  import "../chunk-XMMESCPD.js";
@@ -2,38 +2,38 @@ import {
2
2
  createConversationIndexRuntime,
3
3
  createConversationSearchBackend,
4
4
  createSearchBackend
5
- } from "../chunk-UZQCNOPS.js";
6
- import {
7
- OramaBackend
8
- } from "../chunk-ES36HTSC.js";
9
- import {
10
- RemoteSearchBackend
11
- } from "../chunk-3Y224NYC.js";
12
- import {
13
- EmbedHelper
14
- } from "../chunk-H24WNPA2.js";
5
+ } from "../chunk-NVRYW264.js";
15
6
  import {
16
7
  LanceDbBackend
17
8
  } from "../chunk-BLAKS3CP.js";
18
9
  import {
19
10
  MeilisearchBackend
20
11
  } from "../chunk-S2BBISHU.js";
12
+ import {
13
+ NoopSearchBackend
14
+ } from "../chunk-CYEPCZN5.js";
15
+ import {
16
+ OramaBackend
17
+ } from "../chunk-ES36HTSC.js";
18
+ import {
19
+ RemoteSearchBackend
20
+ } from "../chunk-3Y224NYC.js";
21
21
  import {
22
22
  scanMemoryDir
23
23
  } from "../chunk-W7IGLX4G.js";
24
- import "../chunk-CINZGPSJ.js";
25
24
  import {
26
- NoopSearchBackend
27
- } from "../chunk-CYEPCZN5.js";
28
- import "../chunk-LEPOP46W.js";
25
+ EmbedHelper
26
+ } from "../chunk-H24WNPA2.js";
27
+ import "../chunk-CINZGPSJ.js";
28
+ import "../chunk-227UFSEQ.js";
29
+ import "../chunk-ET356KSB.js";
29
30
  import "../chunk-72A4L5JJ.js";
30
31
  import "../chunk-A7Q43EUZ.js";
31
- import "../chunk-ET356KSB.js";
32
32
  import "../chunk-3ONXXHQO.js";
33
- import "../chunk-ONHRRJZM.js";
33
+ import "../chunk-QJAQNXWI.js";
34
34
  import "../chunk-YV32N67O.js";
35
- import "../chunk-IUM3VSHI.js";
36
35
  import "../chunk-64UDOIMI.js";
36
+ import "../chunk-IUM3VSHI.js";
37
37
  import "../chunk-O75CRYGF.js";
38
38
  import "../chunk-GCASGYIO.js";
39
39
  import "../chunk-XMMESCPD.js";
@@ -7,28 +7,29 @@ import {
7
7
  materializeAfterSemanticConsolidation,
8
8
  parseConsolidationResponse,
9
9
  parseOperatorAwareConsolidationResponse
10
- } from "./chunk-QY66HJ4X.js";
10
+ } from "./chunk-7PLHD7EO.js";
11
11
  import {
12
12
  resolveExtensionsRoot
13
13
  } from "./chunk-JLNBQWZ2.js";
14
- import "./chunk-KPJQTSRJ.js";
14
+ import "./chunk-UUQLB2HJ.js";
15
15
  import "./chunk-KSXJOC4F.js";
16
- import "./chunk-ZERSIPFC.js";
17
- import "./chunk-UHVXE24Y.js";
16
+ import "./chunk-ZBJMUXZH.js";
17
+ import "./chunk-OHLNFI6Z.js";
18
18
  import "./chunk-ENTCVTQR.js";
19
+ import "./chunk-UHVXE24Y.js";
19
20
  import "./chunk-WIPEXG6R.js";
20
21
  import "./chunk-J6A3CX5N.js";
21
22
  import "./chunk-GSL47NPM.js";
22
- import "./chunk-4VXGRIH6.js";
23
+ import "./chunk-WUNIWKY4.js";
23
24
  import "./chunk-EGGE52UU.js";
24
25
  import "./chunk-ZA53AZND.js";
25
- import "./chunk-7RJUVTVF.js";
26
- import "./chunk-SCU65EZI.js";
27
26
  import "./chunk-WRJVB3C2.js";
28
27
  import "./chunk-GCASGYIO.js";
28
+ import "./chunk-7RJUVTVF.js";
29
+ import "./chunk-SCU65EZI.js";
29
30
  import "./chunk-DM2T26WE.js";
30
31
  import "./chunk-LDXUBPMO.js";
31
- import "./chunk-BEQOZOYZ.js";
32
+ import "./chunk-2FTRRQKZ.js";
32
33
  import "./chunk-CGASUJVP.js";
33
34
  import "./chunk-R3DJVOSM.js";
34
35
  import "./chunk-BT7NVCML.js";
@@ -37,6 +38,7 @@ import "./chunk-RL6NEVXT.js";
37
38
  import "./chunk-JYIJNNN3.js";
38
39
  import "./chunk-AAD2ZS6P.js";
39
40
  import "./chunk-YXZG5TVN.js";
41
+ import "./chunk-W5H6ZRPT.js";
40
42
  import {
41
43
  CONSOLIDATION_OPERATORS,
42
44
  isConsolidationOperator,
@@ -50,7 +52,6 @@ import "./chunk-4J7G5SY4.js";
50
52
  import "./chunk-DNHVPZOD.js";
51
53
  import "./chunk-6CIAGZ6X.js";
52
54
  import "./chunk-FFAZ2XFU.js";
53
- import "./chunk-W5H6ZRPT.js";
54
55
  import "./chunk-XMMESCPD.js";
55
56
  import "./chunk-42JKGUFJ.js";
56
57
  import "./chunk-C23BYTJV.js";
@@ -67,7 +68,6 @@ import "./chunk-EYIEWJNI.js";
67
68
  import "./chunk-JUC24CTX.js";
68
69
  import "./chunk-6MKAMLQL.js";
69
70
  import "./chunk-JAKIDQB2.js";
70
- import "./chunk-ZBJMUXZH.js";
71
71
  import "./chunk-BJMBJZ2Y.js";
72
72
  import "./chunk-UKJAGEXH.js";
73
73
  import "./chunk-FP2373TW.js";
@@ -1,23 +1,23 @@
1
1
  import {
2
2
  promoteSemanticRuleFromMemory,
3
3
  setSemanticRulePromotionTestHooks
4
- } from "./chunk-MVW234LO.js";
5
- import "./chunk-ZERSIPFC.js";
6
- import "./chunk-UHVXE24Y.js";
4
+ } from "./chunk-O4BADU6R.js";
5
+ import "./chunk-OHLNFI6Z.js";
7
6
  import "./chunk-ENTCVTQR.js";
7
+ import "./chunk-UHVXE24Y.js";
8
8
  import "./chunk-WIPEXG6R.js";
9
9
  import "./chunk-J6A3CX5N.js";
10
10
  import "./chunk-GSL47NPM.js";
11
- import "./chunk-4VXGRIH6.js";
11
+ import "./chunk-WUNIWKY4.js";
12
12
  import "./chunk-EGGE52UU.js";
13
13
  import "./chunk-ZA53AZND.js";
14
- import "./chunk-7RJUVTVF.js";
15
- import "./chunk-SCU65EZI.js";
16
14
  import "./chunk-WRJVB3C2.js";
17
15
  import "./chunk-GCASGYIO.js";
16
+ import "./chunk-7RJUVTVF.js";
17
+ import "./chunk-SCU65EZI.js";
18
18
  import "./chunk-DM2T26WE.js";
19
19
  import "./chunk-LDXUBPMO.js";
20
- import "./chunk-BEQOZOYZ.js";
20
+ import "./chunk-2FTRRQKZ.js";
21
21
  import "./chunk-CGASUJVP.js";
22
22
  import "./chunk-R3DJVOSM.js";
23
23
  import "./chunk-BT7NVCML.js";
@@ -26,6 +26,7 @@ import "./chunk-RL6NEVXT.js";
26
26
  import "./chunk-JYIJNNN3.js";
27
27
  import "./chunk-AAD2ZS6P.js";
28
28
  import "./chunk-YXZG5TVN.js";
29
+ import "./chunk-W5H6ZRPT.js";
29
30
  import "./chunk-G7D6GZ5J.js";
30
31
  import "./chunk-DLVPUX7U.js";
31
32
  import "./chunk-IJ7HK452.js";
@@ -34,7 +35,6 @@ import "./chunk-4J7G5SY4.js";
34
35
  import "./chunk-DNHVPZOD.js";
35
36
  import "./chunk-6CIAGZ6X.js";
36
37
  import "./chunk-FFAZ2XFU.js";
37
- import "./chunk-W5H6ZRPT.js";
38
38
  import "./chunk-XMMESCPD.js";
39
39
  import "./chunk-42JKGUFJ.js";
40
40
  import "./chunk-C23BYTJV.js";
@@ -1,23 +1,24 @@
1
1
  import {
2
2
  compareVerifiedSemanticRuleResults,
3
3
  searchVerifiedSemanticRules
4
- } from "./chunk-5TOV3D6U.js";
5
- import "./chunk-ZERSIPFC.js";
6
- import "./chunk-UHVXE24Y.js";
4
+ } from "./chunk-CH2WTP6R.js";
5
+ import "./chunk-ZBJMUXZH.js";
6
+ import "./chunk-OHLNFI6Z.js";
7
7
  import "./chunk-ENTCVTQR.js";
8
+ import "./chunk-UHVXE24Y.js";
8
9
  import "./chunk-WIPEXG6R.js";
9
10
  import "./chunk-J6A3CX5N.js";
10
11
  import "./chunk-GSL47NPM.js";
11
- import "./chunk-4VXGRIH6.js";
12
+ import "./chunk-WUNIWKY4.js";
12
13
  import "./chunk-EGGE52UU.js";
13
14
  import "./chunk-ZA53AZND.js";
14
- import "./chunk-7RJUVTVF.js";
15
- import "./chunk-SCU65EZI.js";
16
15
  import "./chunk-WRJVB3C2.js";
17
16
  import "./chunk-GCASGYIO.js";
17
+ import "./chunk-7RJUVTVF.js";
18
+ import "./chunk-SCU65EZI.js";
18
19
  import "./chunk-DM2T26WE.js";
19
20
  import "./chunk-LDXUBPMO.js";
20
- import "./chunk-BEQOZOYZ.js";
21
+ import "./chunk-2FTRRQKZ.js";
21
22
  import "./chunk-CGASUJVP.js";
22
23
  import "./chunk-R3DJVOSM.js";
23
24
  import "./chunk-BT7NVCML.js";
@@ -26,6 +27,7 @@ import "./chunk-RL6NEVXT.js";
26
27
  import "./chunk-JYIJNNN3.js";
27
28
  import "./chunk-AAD2ZS6P.js";
28
29
  import "./chunk-YXZG5TVN.js";
30
+ import "./chunk-W5H6ZRPT.js";
29
31
  import "./chunk-G7D6GZ5J.js";
30
32
  import "./chunk-DLVPUX7U.js";
31
33
  import "./chunk-IJ7HK452.js";
@@ -34,7 +36,6 @@ import "./chunk-4J7G5SY4.js";
34
36
  import "./chunk-DNHVPZOD.js";
35
37
  import "./chunk-6CIAGZ6X.js";
36
38
  import "./chunk-FFAZ2XFU.js";
37
- import "./chunk-W5H6ZRPT.js";
38
39
  import "./chunk-XMMESCPD.js";
39
40
  import "./chunk-42JKGUFJ.js";
40
41
  import "./chunk-C23BYTJV.js";
@@ -51,7 +52,6 @@ import "./chunk-EYIEWJNI.js";
51
52
  import "./chunk-JUC24CTX.js";
52
53
  import "./chunk-6MKAMLQL.js";
53
54
  import "./chunk-JAKIDQB2.js";
54
- import "./chunk-ZBJMUXZH.js";
55
55
  import "./chunk-BJMBJZ2Y.js";
56
56
  import "./chunk-UKJAGEXH.js";
57
57
  import "./chunk-FP2373TW.js";
@@ -3,7 +3,7 @@ import {
3
3
  headerConnector,
4
4
  renderExtractionConversation,
5
5
  resolveSourceConnector
6
- } from "./chunk-AX2J2LC4.js";
6
+ } from "./chunk-5ZE7QHTK.js";
7
7
  import "./chunk-YIAA2X3D.js";
8
8
  import "./chunk-WOCNN776.js";
9
9
  import "./chunk-P2BM76KT.js";
@@ -11,33 +11,34 @@ import "./chunk-VEWZZM3H.js";
11
11
  import "./chunk-T2TTP3KU.js";
12
12
  import "./chunk-7TWUCYER.js";
13
13
  import "./chunk-EMDLM3LW.js";
14
- import "./chunk-NF3U3MPG.js";
14
+ import "./chunk-ECK75GDJ.js";
15
15
  import "./chunk-BUE5E2HL.js";
16
16
  import "./chunk-PD6O7AXF.js";
17
- import "./chunk-ONHRRJZM.js";
17
+ import "./chunk-QJAQNXWI.js";
18
18
  import "./chunk-YV32N67O.js";
19
- import "./chunk-IUM3VSHI.js";
20
19
  import "./chunk-64UDOIMI.js";
20
+ import "./chunk-IUM3VSHI.js";
21
21
  import "./chunk-O75CRYGF.js";
22
22
  import "./chunk-OD4FM2U7.js";
23
- import "./chunk-KPJQTSRJ.js";
23
+ import "./chunk-UUQLB2HJ.js";
24
24
  import "./chunk-KSXJOC4F.js";
25
- import "./chunk-ZERSIPFC.js";
26
- import "./chunk-UHVXE24Y.js";
25
+ import "./chunk-TBBDFYXW.js";
26
+ import "./chunk-OHLNFI6Z.js";
27
27
  import "./chunk-ENTCVTQR.js";
28
+ import "./chunk-UHVXE24Y.js";
28
29
  import "./chunk-WIPEXG6R.js";
29
30
  import "./chunk-J6A3CX5N.js";
30
31
  import "./chunk-GSL47NPM.js";
31
- import "./chunk-4VXGRIH6.js";
32
+ import "./chunk-WUNIWKY4.js";
32
33
  import "./chunk-EGGE52UU.js";
33
34
  import "./chunk-ZA53AZND.js";
34
- import "./chunk-7RJUVTVF.js";
35
- import "./chunk-SCU65EZI.js";
36
35
  import "./chunk-WRJVB3C2.js";
37
36
  import "./chunk-GCASGYIO.js";
37
+ import "./chunk-7RJUVTVF.js";
38
+ import "./chunk-SCU65EZI.js";
38
39
  import "./chunk-DM2T26WE.js";
39
40
  import "./chunk-LDXUBPMO.js";
40
- import "./chunk-BEQOZOYZ.js";
41
+ import "./chunk-2FTRRQKZ.js";
41
42
  import "./chunk-CGASUJVP.js";
42
43
  import "./chunk-R3DJVOSM.js";
43
44
  import "./chunk-BT7NVCML.js";
@@ -46,6 +47,7 @@ import "./chunk-RL6NEVXT.js";
46
47
  import "./chunk-JYIJNNN3.js";
47
48
  import "./chunk-AAD2ZS6P.js";
48
49
  import "./chunk-YXZG5TVN.js";
50
+ import "./chunk-W5H6ZRPT.js";
49
51
  import "./chunk-G7D6GZ5J.js";
50
52
  import "./chunk-DLVPUX7U.js";
51
53
  import "./chunk-IJ7HK452.js";
@@ -54,7 +56,6 @@ import "./chunk-4J7G5SY4.js";
54
56
  import "./chunk-DNHVPZOD.js";
55
57
  import "./chunk-6CIAGZ6X.js";
56
58
  import "./chunk-FFAZ2XFU.js";
57
- import "./chunk-W5H6ZRPT.js";
58
59
  import "./chunk-XMMESCPD.js";
59
60
  import "./chunk-42JKGUFJ.js";
60
61
  import "./chunk-C23BYTJV.js";
@@ -73,7 +74,6 @@ import "./chunk-EYIEWJNI.js";
73
74
  import "./chunk-JUC24CTX.js";
74
75
  import "./chunk-6MKAMLQL.js";
75
76
  import "./chunk-JAKIDQB2.js";
76
- import "./chunk-TBBDFYXW.js";
77
77
  import "./chunk-BJMBJZ2Y.js";
78
78
  import "./chunk-UKJAGEXH.js";
79
79
  import "./chunk-FP2373TW.js";
package/dist/storage.js CHANGED
@@ -13,25 +13,25 @@ import {
13
13
  parseFrontmatter,
14
14
  parseFrontmatterStringValue,
15
15
  serializeEntityFile
16
- } from "./chunk-ZERSIPFC.js";
17
- import "./chunk-UHVXE24Y.js";
16
+ } from "./chunk-OHLNFI6Z.js";
18
17
  import "./chunk-ENTCVTQR.js";
18
+ import "./chunk-UHVXE24Y.js";
19
19
  import "./chunk-WIPEXG6R.js";
20
20
  import "./chunk-J6A3CX5N.js";
21
21
  import "./chunk-GSL47NPM.js";
22
- import "./chunk-4VXGRIH6.js";
22
+ import "./chunk-WUNIWKY4.js";
23
23
  import "./chunk-EGGE52UU.js";
24
24
  import "./chunk-ZA53AZND.js";
25
- import "./chunk-7RJUVTVF.js";
26
- import "./chunk-SCU65EZI.js";
27
25
  import "./chunk-WRJVB3C2.js";
28
26
  import "./chunk-GCASGYIO.js";
27
+ import "./chunk-7RJUVTVF.js";
28
+ import "./chunk-SCU65EZI.js";
29
29
  import "./chunk-DM2T26WE.js";
30
30
  import "./chunk-LDXUBPMO.js";
31
31
  import {
32
32
  ContentHashIndex,
33
33
  FactHashIndexNotAuthoritativeError
34
- } from "./chunk-BEQOZOYZ.js";
34
+ } from "./chunk-2FTRRQKZ.js";
35
35
  import "./chunk-CGASUJVP.js";
36
36
  import {
37
37
  normalizeAttributePairs,
@@ -45,6 +45,7 @@ import "./chunk-AAD2ZS6P.js";
45
45
  import {
46
46
  normalizeEntityName
47
47
  } from "./chunk-YXZG5TVN.js";
48
+ import "./chunk-W5H6ZRPT.js";
48
49
  import "./chunk-G7D6GZ5J.js";
49
50
  import "./chunk-DLVPUX7U.js";
50
51
  import "./chunk-IJ7HK452.js";
@@ -53,7 +54,6 @@ import "./chunk-4J7G5SY4.js";
53
54
  import "./chunk-DNHVPZOD.js";
54
55
  import "./chunk-6CIAGZ6X.js";
55
56
  import "./chunk-FFAZ2XFU.js";
56
- import "./chunk-W5H6ZRPT.js";
57
57
  import "./chunk-XMMESCPD.js";
58
58
  import "./chunk-42JKGUFJ.js";
59
59
  import "./chunk-C23BYTJV.js";
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  importSqlite
3
- } from "../chunk-LRGSLV7M.js";
4
- import "../chunk-G4IAEX6D.js";
3
+ } from "../chunk-PYHOAXTI.js";
5
4
  import "../chunk-Z734BLO3.js";
5
+ import "../chunk-G4IAEX6D.js";
6
6
  import "../chunk-RL6NEVXT.js";
7
7
  import "../chunk-GCGJW34D.js";
8
8
  import "../chunk-PZ5AY32C.js";
@@ -1,24 +1,25 @@
1
1
  import {
2
2
  compareVerifiedEpisodeResults,
3
3
  searchVerifiedEpisodes
4
- } from "./chunk-OEXKYYVH.js";
4
+ } from "./chunk-HGFILS2Q.js";
5
5
  import "./chunk-B7RWBZXW.js";
6
- import "./chunk-ZERSIPFC.js";
7
- import "./chunk-UHVXE24Y.js";
6
+ import "./chunk-ZBJMUXZH.js";
7
+ import "./chunk-OHLNFI6Z.js";
8
8
  import "./chunk-ENTCVTQR.js";
9
+ import "./chunk-UHVXE24Y.js";
9
10
  import "./chunk-WIPEXG6R.js";
10
11
  import "./chunk-J6A3CX5N.js";
11
12
  import "./chunk-GSL47NPM.js";
12
- import "./chunk-4VXGRIH6.js";
13
+ import "./chunk-WUNIWKY4.js";
13
14
  import "./chunk-EGGE52UU.js";
14
15
  import "./chunk-ZA53AZND.js";
15
- import "./chunk-7RJUVTVF.js";
16
- import "./chunk-SCU65EZI.js";
17
16
  import "./chunk-WRJVB3C2.js";
18
17
  import "./chunk-GCASGYIO.js";
18
+ import "./chunk-7RJUVTVF.js";
19
+ import "./chunk-SCU65EZI.js";
19
20
  import "./chunk-DM2T26WE.js";
20
21
  import "./chunk-LDXUBPMO.js";
21
- import "./chunk-BEQOZOYZ.js";
22
+ import "./chunk-2FTRRQKZ.js";
22
23
  import "./chunk-CGASUJVP.js";
23
24
  import "./chunk-R3DJVOSM.js";
24
25
  import "./chunk-BT7NVCML.js";
@@ -27,6 +28,7 @@ import "./chunk-RL6NEVXT.js";
27
28
  import "./chunk-JYIJNNN3.js";
28
29
  import "./chunk-AAD2ZS6P.js";
29
30
  import "./chunk-YXZG5TVN.js";
31
+ import "./chunk-W5H6ZRPT.js";
30
32
  import "./chunk-G7D6GZ5J.js";
31
33
  import "./chunk-DLVPUX7U.js";
32
34
  import "./chunk-IJ7HK452.js";
@@ -35,7 +37,6 @@ import "./chunk-4J7G5SY4.js";
35
37
  import "./chunk-DNHVPZOD.js";
36
38
  import "./chunk-6CIAGZ6X.js";
37
39
  import "./chunk-FFAZ2XFU.js";
38
- import "./chunk-W5H6ZRPT.js";
39
40
  import "./chunk-XMMESCPD.js";
40
41
  import "./chunk-42JKGUFJ.js";
41
42
  import "./chunk-C23BYTJV.js";
@@ -52,7 +53,6 @@ import "./chunk-EYIEWJNI.js";
52
53
  import "./chunk-JUC24CTX.js";
53
54
  import "./chunk-6MKAMLQL.js";
54
55
  import "./chunk-JAKIDQB2.js";
55
- import "./chunk-ZBJMUXZH.js";
56
56
  import "./chunk-BJMBJZ2Y.js";
57
57
  import "./chunk-UKJAGEXH.js";
58
58
  import "./chunk-FP2373TW.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remnic/core",
3
- "version": "9.42.0",
3
+ "version": "9.44.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",
@@ -166,6 +166,16 @@
166
166
  "remnic-source": "./src/reconcile/plan.ts",
167
167
  "import": "./dist/reconcile/plan.js"
168
168
  },
169
+ "./reconcile/cursor": {
170
+ "types": "./dist/reconcile/cursor.d.ts",
171
+ "remnic-source": "./src/reconcile/cursor.ts",
172
+ "import": "./dist/reconcile/cursor.js"
173
+ },
174
+ "./reconcile/cursor.js": {
175
+ "types": "./dist/reconcile/cursor.d.ts",
176
+ "remnic-source": "./src/reconcile/cursor.ts",
177
+ "import": "./dist/reconcile/cursor.js"
178
+ },
169
179
  "./adapters/codex": {
170
180
  "types": "./dist/adapters/codex.d.ts",
171
181
  "remnic-source": "./src/adapters/codex.ts",
@@ -3086,7 +3096,7 @@
3086
3096
  "core"
3087
3097
  ],
3088
3098
  "peerDependencies": {
3089
- "@remnic/coding-graph": "^9.42.0"
3099
+ "@remnic/coding-graph": "^9.44.0"
3090
3100
  },
3091
3101
  "peerDependenciesMeta": {
3092
3102
  "@remnic/coding-graph": {
@@ -0,0 +1,25 @@
1
+ import { EngramAccessInputError } from "./access-service.js";
2
+
3
+ /** Optional string field from a JSON body: absent/null/"" → undefined. */
4
+ export function optionalQueryString(value: unknown, label: string): string | undefined {
5
+ if (value === undefined || value === null || value === "") return undefined;
6
+ if (typeof value !== "string") {
7
+ throw new EngramAccessInputError(`${label} must be a string (got ${JSON.stringify(value)})`);
8
+ }
9
+ return value;
10
+ }
11
+
12
+ /** Optional non-empty query param: null/"" → undefined. */
13
+ export function nonEmptyQueryParam(value: string | null): string | undefined {
14
+ return value !== null && value.length > 0 ? value : undefined;
15
+ }
16
+
17
+ /** Optional positive-integer query param; rejects invalid values. */
18
+ export function positiveIntQueryParam(value: string | null, label: string): number | undefined {
19
+ if (value === null || value.length === 0) return undefined;
20
+ const parsed = Number(value);
21
+ if (!Number.isFinite(parsed) || parsed <= 0 || !Number.isInteger(parsed)) {
22
+ throw new EngramAccessInputError(`${label} expects a positive integer`);
23
+ }
24
+ return parsed;
25
+ }
@@ -3648,3 +3648,139 @@ test("HTTP authorization probe verifies requested operation grants without invok
3648
3648
  await server.stop();
3649
3649
  }
3650
3650
  });
3651
+
3652
+ test("HTTP convergence completion forwards one authenticated namespace batch refresh", async () => {
3653
+ const calls: Array<{ namespaces: string[]; principal?: string; sourceId: string }> = [];
3654
+ const service = {
3655
+ offlineSyncFinalizeConvergence: async (options: {
3656
+ namespaces: string[];
3657
+ principal?: string;
3658
+ sourceId: string;
3659
+ }) => {
3660
+ calls.push(options);
3661
+ return { namespaces: options.namespaces, refreshed: true as const };
3662
+ },
3663
+ } as unknown as EngramAccessService;
3664
+ const server = new EngramAccessHttpServer({
3665
+ service,
3666
+ port: 0,
3667
+ authToken: "test-token",
3668
+ principal: "writer",
3669
+ adminConsoleEnabled: false,
3670
+ });
3671
+ const route = "/remnic/v1/offline-sync/convergence-complete?namespace=team&namespace=shared";
3672
+
3673
+ const status = await server.start();
3674
+ try {
3675
+ const denied = await fetch(`http://127.0.0.1:${status.port}${route}`, {
3676
+ method: "POST",
3677
+ headers: { "x-remnic-source-id": encodeURIComponent("remnic-converge") },
3678
+ });
3679
+ assert.equal(denied.status, 401);
3680
+
3681
+ const response = await fetch(`http://127.0.0.1:${status.port}${route}`, {
3682
+ method: "POST",
3683
+ headers: {
3684
+ authorization: "Bearer test-token",
3685
+ "x-remnic-source-id": encodeURIComponent("remnic-converge"),
3686
+ },
3687
+ });
3688
+
3689
+ assert.equal(response.status, 200);
3690
+ assert.deepEqual(await response.json(), {
3691
+ namespaces: ["team", "shared"],
3692
+ refreshed: true,
3693
+ });
3694
+ assert.deepEqual(calls, [{
3695
+ namespaces: ["team", "shared"],
3696
+ principal: "writer",
3697
+ sourceId: "remnic-converge",
3698
+ }]);
3699
+ } finally {
3700
+ await server.stop();
3701
+ }
3702
+ });
3703
+
3704
+ test("HTTP convergence completion enforces the per-principal write rate limit", async () => {
3705
+ let completions = 0;
3706
+ const service = {
3707
+ offlineSyncFinalizeConvergence: async () => {
3708
+ completions += 1;
3709
+ return { namespaces: ["team"], refreshed: true as const };
3710
+ },
3711
+ } as unknown as EngramAccessService;
3712
+ const server = new EngramAccessHttpServer({
3713
+ service,
3714
+ port: 0,
3715
+ authToken: "test-token",
3716
+ adminConsoleEnabled: false,
3717
+ writeRateLimitMaxRequests: 1,
3718
+ });
3719
+ const status = await server.start();
3720
+ const route = `http://127.0.0.1:${status.port}/remnic/v1/offline-sync/convergence-complete?namespace=team`;
3721
+ const requestOptions: RequestInit = {
3722
+ method: "POST",
3723
+ headers: {
3724
+ authorization: "Bearer test-token",
3725
+ "x-remnic-source-id": encodeURIComponent("remnic-converge"),
3726
+ },
3727
+ };
3728
+
3729
+ try {
3730
+ const first = await fetch(route, requestOptions);
3731
+ assert.equal(first.status, 200);
3732
+ await first.text();
3733
+
3734
+ const second = await fetch(route, requestOptions);
3735
+ assert.equal(second.status, 429);
3736
+ const rateLimited: unknown = await second.json();
3737
+ assert.ok(rateLimited && typeof rateLimited === "object" && "code" in rateLimited);
3738
+ assert.equal(rateLimited.code, "write_rate_limited");
3739
+ assert.equal(completions, 1, "the rate-limited completion must not reach the service");
3740
+ } finally {
3741
+ await server.stop();
3742
+ }
3743
+ });
3744
+
3745
+ test("HTTP convergence completion denies scoped tokens that omit the namespace", async () => {
3746
+ let completions = 0;
3747
+ const service = {
3748
+ configRef: parseConfig({
3749
+ memoryDir: "/tmp/remnic-http-convergence-completion-namespace",
3750
+ namespacesEnabled: true,
3751
+ defaultNamespace: "default",
3752
+ }),
3753
+ offlineSyncFinalizeConvergence: async () => {
3754
+ completions += 1;
3755
+ return { namespaces: ["default"], refreshed: true as const };
3756
+ },
3757
+ } as unknown as EngramAccessService;
3758
+ const server = new EngramAccessHttpServer({
3759
+ service,
3760
+ port: 0,
3761
+ authTokenEntriesGetter: () => [
3762
+ { token: "scoped-token", capabilities: { version: 1, namespaces: ["team"] } },
3763
+ ],
3764
+ adminConsoleEnabled: false,
3765
+ });
3766
+ const status = await server.start();
3767
+
3768
+ try {
3769
+ const response = await fetch(
3770
+ `http://127.0.0.1:${status.port}/remnic/v1/offline-sync/convergence-complete`,
3771
+ {
3772
+ method: "POST",
3773
+ headers: {
3774
+ authorization: "Bearer scoped-token",
3775
+ "x-remnic-source-id": encodeURIComponent("remnic-converge"),
3776
+ },
3777
+ },
3778
+ );
3779
+
3780
+ assert.equal(response.status, 403);
3781
+ await response.text();
3782
+ assert.equal(completions, 0, "the denied completion must not reach the service");
3783
+ } finally {
3784
+ await server.stop();
3785
+ }
3786
+ });