@remnic/core 9.45.3 → 9.45.4

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 (747) hide show
  1. package/dist/abort-error.d.ts +2 -1
  2. package/dist/abort-error.js +3 -1
  3. package/dist/access-admin-ops-surface.d.ts +14 -10
  4. package/dist/access-admin-ops-surface.js +84 -76
  5. package/dist/access-audit.js +2 -2
  6. package/dist/access-authorization-probe.d.ts +14 -10
  7. package/dist/access-authorization-probe.js +85 -77
  8. package/dist/access-boundary.d.ts +15 -11
  9. package/dist/access-boundary.js +84 -76
  10. package/dist/access-citation-namespace.js +2 -2
  11. package/dist/access-cli.js +193 -181
  12. package/dist/access-cli.js.map +1 -1
  13. package/dist/access-coding-context-resolution.d.ts +16 -0
  14. package/dist/access-coding-context-resolution.js +13 -0
  15. package/dist/access-coding-context-resolution.js.map +1 -0
  16. package/dist/access-extraction-force-flush.d.ts +14 -10
  17. package/dist/access-extraction-force-flush.js +84 -76
  18. package/dist/access-health-types.d.ts +2 -1
  19. package/dist/access-http-lcm-compaction.d.ts +16 -12
  20. package/dist/access-http-lcm-compaction.js +3 -3
  21. package/dist/access-http-lifecycle-flush.d.ts +14 -10
  22. package/dist/access-http-lifecycle-flush.js +2 -2
  23. package/dist/access-http-offline-stream.d.ts +123 -0
  24. package/dist/access-http-offline-stream.js +10 -0
  25. package/dist/access-http-offline-stream.js.map +1 -0
  26. package/dist/access-http-query.js +84 -76
  27. package/dist/access-http.d.ts +15 -10
  28. package/dist/access-http.js +105 -92
  29. package/dist/access-identity-continuity-surface.d.ts +9 -8
  30. package/dist/access-identity-continuity-surface.js +84 -76
  31. package/dist/access-lcm-surface.d.ts +14 -10
  32. package/dist/access-lcm-surface.js +84 -76
  33. package/dist/access-mcp-output-schemas.js +1 -1
  34. package/dist/access-mcp.d.ts +14 -10
  35. package/dist/access-mcp.js +95 -83
  36. package/dist/access-memory-search-fanout.d.ts +3 -2
  37. package/dist/{access-namespace-preflight-5yZ4g6F8.d.ts → access-namespace-preflight-CWUDwB4M.d.ts} +1 -1
  38. package/dist/access-namespace-preflight.d.ts +4 -3
  39. package/dist/access-namespace-preflight.js +84 -76
  40. package/dist/access-observe-helpers.d.ts +1 -0
  41. package/dist/access-observe-helpers.js +1 -1
  42. package/dist/access-observe-write-surface.d.ts +16 -10
  43. package/dist/access-observe-write-surface.js +84 -76
  44. package/dist/access-offline-manifest.d.ts +104 -0
  45. package/dist/access-offline-manifest.js +45 -0
  46. package/dist/access-offline-manifest.js.map +1 -0
  47. package/dist/access-operations-batch.js +86 -78
  48. package/dist/access-operations.d.ts +15 -11
  49. package/dist/access-operations.js +91 -80
  50. package/dist/access-recall-concurrency.d.ts +16 -26
  51. package/dist/access-recall-concurrency.js +86 -77
  52. package/dist/access-recall-response.d.ts +18 -14
  53. package/dist/access-recall-response.js +84 -76
  54. package/dist/access-recall-surface.d.ts +29 -24
  55. package/dist/access-recall-surface.js +84 -76
  56. package/dist/access-schema.js +3 -3
  57. package/dist/{access-service-CiJRsgAB.d.ts → access-service-CsU-ljFD.d.ts} +25 -16
  58. package/dist/access-service-helpers.d.ts +14 -10
  59. package/dist/access-service.d.ts +14 -10
  60. package/dist/access-service.js +84 -76
  61. package/dist/access-surface-catalog.d.ts +14 -10
  62. package/dist/access-surface-catalog.js +4 -0
  63. package/dist/access-surface-catalog.js.map +1 -1
  64. package/dist/access-wearables-meetings-surface.d.ts +4 -3
  65. package/dist/action-confidence.d.ts +2 -1
  66. package/dist/active-memory-bridge.d.ts +2 -1
  67. package/dist/active-recall.d.ts +2 -1
  68. package/dist/active-recall.js +10 -8
  69. package/dist/active-recall.js.map +1 -1
  70. package/dist/adapters/index.js +7 -7
  71. package/dist/adapters/registry.js +3 -3
  72. package/dist/{auto-sync-5OE5QOZB.js → auto-sync-UPTUVE4X.js} +6 -6
  73. package/dist/behavior-learner.d.ts +2 -1
  74. package/dist/behavior-learner.js +1 -1
  75. package/dist/behavior-signals.d.ts +2 -1
  76. package/dist/bootstrap.d.ts +9 -8
  77. package/dist/briefing.d.ts +3 -2
  78. package/dist/briefing.js +23 -22
  79. package/dist/buffer-surprise-report.d.ts +2 -1
  80. package/dist/buffer-turn-helpers.d.ts +2 -1
  81. package/dist/buffer.d.ts +3 -2
  82. package/dist/buffer.js +12 -11
  83. package/dist/bulk-import/index.d.ts +4 -3
  84. package/dist/calibration.d.ts +2 -1
  85. package/dist/capabilities.d.ts +2 -1
  86. package/dist/{capsule-merge-IDWJPCWK.js → capsule-merge-Q6AR3XL7.js} +67 -54
  87. package/dist/capsule-merge-Q6AR3XL7.js.map +1 -0
  88. package/dist/{catalog-scBmy0sO.d.ts → catalog-bctMURhN.d.ts} +1 -1
  89. package/dist/causal-behavior.d.ts +2 -1
  90. package/dist/causal-behavior.js +2 -2
  91. package/dist/causal-chain.js +2 -2
  92. package/dist/causal-consolidation.d.ts +2 -1
  93. package/dist/causal-consolidation.js +27 -26
  94. package/dist/causal-consolidation.js.map +1 -1
  95. package/dist/causal-retrieval.js +2 -2
  96. package/dist/causal-trajectory-graph.d.ts +2 -1
  97. package/dist/causal-trajectory.js +1 -1
  98. package/dist/{chunk-VUPTKTDV.js → chunk-2MRHJNWL.js} +3 -3
  99. package/dist/{chunk-JBPKEARU.js → chunk-2QSZNTDO.js} +7 -7
  100. package/dist/{chunk-5IVLTFOV.js → chunk-44N6ESJ4.js} +2 -2
  101. package/dist/{chunk-WOCNN776.js → chunk-4POAMKV6.js} +100 -41
  102. package/dist/chunk-4POAMKV6.js.map +1 -0
  103. package/dist/{chunk-HO3QBJEY.js → chunk-5546W5SI.js} +2 -2
  104. package/dist/{chunk-U7GW7NE7.js → chunk-5CEECY6P.js} +10 -10
  105. package/dist/{chunk-4UH4BTGK.js → chunk-5SNZSWWR.js} +82 -82
  106. package/dist/{chunk-6CZPDBJS.js → chunk-5U7ID3EZ.js} +3 -3
  107. package/dist/{chunk-GF22HWS2.js → chunk-6NNNURLK.js} +7 -7
  108. package/dist/chunk-773TRRGT.js +36 -0
  109. package/dist/chunk-773TRRGT.js.map +1 -0
  110. package/dist/chunk-7CITSYSH.js +242 -0
  111. package/dist/chunk-7CITSYSH.js.map +1 -0
  112. package/dist/{chunk-227UFSEQ.js → chunk-7RZJWZ46.js} +5 -5
  113. package/dist/{chunk-E5UK4VPE.js → chunk-7SHJHPTY.js} +5 -5
  114. package/dist/{chunk-UVIKWC7M.js → chunk-7YERSTN7.js} +17 -17
  115. package/dist/{chunk-DLVPUX7U.js → chunk-7YKVM5H3.js} +8 -6
  116. package/dist/chunk-7YKVM5H3.js.map +1 -0
  117. package/dist/{chunk-3CE77VAP.js → chunk-A4JMGKCD.js} +87 -74
  118. package/dist/chunk-A4JMGKCD.js.map +1 -0
  119. package/dist/chunk-A5KNZSNA.js +26 -0
  120. package/dist/chunk-A5KNZSNA.js.map +1 -0
  121. package/dist/{chunk-S2NCTZGJ.js → chunk-AJQ57VV3.js} +15 -15
  122. package/dist/chunk-AJQ57VV3.js.map +1 -0
  123. package/dist/{chunk-CUM2BBPN.js → chunk-AUMWZSE7.js} +19 -10
  124. package/dist/chunk-AUMWZSE7.js.map +1 -0
  125. package/dist/{chunk-XYTOI63Z.js → chunk-BGHFOD5A.js} +19 -11
  126. package/dist/chunk-BGHFOD5A.js.map +1 -0
  127. package/dist/{chunk-BUE5E2HL.js → chunk-BGLY7EEM.js} +5 -314
  128. package/dist/chunk-BGLY7EEM.js.map +1 -0
  129. package/dist/chunk-BIPBQQFI.js +44 -0
  130. package/dist/chunk-BIPBQQFI.js.map +1 -0
  131. package/dist/{chunk-S5SLVSVY.js → chunk-BQIFZ2MP.js} +5 -5
  132. package/dist/chunk-BTTPKDIL.js +34 -0
  133. package/dist/{chunk-PVGDJXVK.js.map → chunk-BTTPKDIL.js.map} +1 -1
  134. package/dist/{chunk-E53DSZEN.js → chunk-C26TE27X.js} +3 -3
  135. package/dist/{chunk-LZ4LDKHZ.js → chunk-CLB32OHM.js} +6 -6
  136. package/dist/{chunk-Q6IP2ARR.js → chunk-CSOYVTRX.js} +2 -2
  137. package/dist/{chunk-XOQSEF7X.js → chunk-CVILPI77.js} +6 -6
  138. package/dist/chunk-D3I2MCN7.js +29 -0
  139. package/dist/chunk-D3I2MCN7.js.map +1 -0
  140. package/dist/{chunk-A5OJCXZL.js → chunk-DSUAAZZX.js} +15 -4
  141. package/dist/chunk-DSUAAZZX.js.map +1 -0
  142. package/dist/{chunk-HREE4JHI.js → chunk-DYVMXPCF.js} +486 -287
  143. package/dist/chunk-DYVMXPCF.js.map +1 -0
  144. package/dist/{chunk-J7VGGECD.js → chunk-DZPFMQZ7.js} +1 -1
  145. package/dist/chunk-DZPFMQZ7.js.map +1 -0
  146. package/dist/{chunk-PDLBLTOK.js → chunk-EITZHSX6.js} +9 -9
  147. package/dist/{chunk-D3J5SLQK.js → chunk-EJHEWCGQ.js} +81 -20
  148. package/dist/chunk-EJHEWCGQ.js.map +1 -0
  149. package/dist/{chunk-WUNIWKY4.js → chunk-ELIL2A37.js} +6 -6
  150. package/dist/{chunk-E6PNLPGJ.js → chunk-FZP32336.js} +806 -470
  151. package/dist/chunk-FZP32336.js.map +1 -0
  152. package/dist/{chunk-HZFHQ4AQ.js → chunk-G7A5HLUS.js} +23 -17
  153. package/dist/chunk-G7A5HLUS.js.map +1 -0
  154. package/dist/{chunk-CINZGPSJ.js → chunk-GUMZC2BO.js} +2 -2
  155. package/dist/{chunk-H24WNPA2.js → chunk-GWFSVJ4P.js} +3 -3
  156. package/dist/{chunk-7XC2HX75.js → chunk-GYPQL6XN.js} +157 -16
  157. package/dist/chunk-GYPQL6XN.js.map +1 -0
  158. package/dist/{chunk-TSH56VPU.js → chunk-HAYSYUAB.js} +2 -2
  159. package/dist/{chunk-TDHTVMPG.js → chunk-HFPASSFV.js} +7 -2
  160. package/dist/chunk-HFPASSFV.js.map +1 -0
  161. package/dist/chunk-J2WC5LF4.js +395 -0
  162. package/dist/chunk-J2WC5LF4.js.map +1 -0
  163. package/dist/{chunk-PKNLM44P.js → chunk-JH6BPLOP.js} +9 -9
  164. package/dist/{chunk-KXB4VXHY.js → chunk-JIYDRBVZ.js} +2 -2
  165. package/dist/chunk-JV3C2MNQ.js +74 -0
  166. package/dist/chunk-JV3C2MNQ.js.map +1 -0
  167. package/dist/{chunk-AV5ZEH4M.js → chunk-KVJRXN2E.js} +2 -2
  168. package/dist/{chunk-JVLCVFQ4.js → chunk-KXEFRMCF.js} +3 -3
  169. package/dist/{chunk-WFTIGIIS.js → chunk-L6CQ7WIW.js} +5 -5
  170. package/dist/{chunk-EJUEXZHX.js → chunk-LLJMAULE.js} +2 -2
  171. package/dist/{chunk-N5Z4EVOR.js → chunk-LNEWDF2A.js} +36 -11
  172. package/dist/chunk-LNEWDF2A.js.map +1 -0
  173. package/dist/{chunk-AS7YMSL6.js → chunk-M23RF3LJ.js} +4 -4
  174. package/dist/{chunk-UYLMNVY6.js → chunk-MDISBSYA.js} +16 -9
  175. package/dist/chunk-MDISBSYA.js.map +1 -0
  176. package/dist/{chunk-3F2LKUMU.js → chunk-NIS256NW.js} +2 -2
  177. package/dist/{chunk-YIAA2X3D.js → chunk-NK5RGJ65.js} +3 -3
  178. package/dist/chunk-NLDVVWCL.js +84 -0
  179. package/dist/chunk-NLDVVWCL.js.map +1 -0
  180. package/dist/{chunk-OQ5PRDDS.js → chunk-NTOIP2E6.js} +6 -6
  181. package/dist/{chunk-HLPD7B7P.js → chunk-NUEQKLNB.js} +2 -2
  182. package/dist/{chunk-4J7G5SY4.js → chunk-NZBZ7IS2.js} +72 -24
  183. package/dist/chunk-NZBZ7IS2.js.map +1 -0
  184. package/dist/{chunk-3TBLDMJA.js → chunk-O4KMGRXE.js} +5 -2
  185. package/dist/chunk-O4KMGRXE.js.map +1 -0
  186. package/dist/{chunk-33PLLLL7.js → chunk-P7NGM24P.js} +6 -6
  187. package/dist/{chunk-7TWUCYER.js → chunk-PNRA7FAD.js} +7 -7
  188. package/dist/{chunk-5I4M26Q7.js → chunk-QBSFOKY6.js} +4 -4
  189. package/dist/{chunk-QJAQNXWI.js → chunk-QCECHYZL.js} +76 -79
  190. package/dist/chunk-QCECHYZL.js.map +1 -0
  191. package/dist/{chunk-P4DRWEYC.js → chunk-QVSBTCVP.js} +2 -2
  192. package/dist/{chunk-AAIUERNB.js → chunk-R5RFK3CB.js} +6 -6
  193. package/dist/{chunk-WDISJRMG.js → chunk-RMMVQQA6.js} +2 -2
  194. package/dist/{chunk-KWMXR7XS.js → chunk-S2V7RUCL.js} +8 -1
  195. package/dist/{chunk-KWMXR7XS.js.map → chunk-S2V7RUCL.js.map} +1 -1
  196. package/dist/{chunk-5SM35XZR.js → chunk-S5NZBKKQ.js} +2 -2
  197. package/dist/{chunk-VNA7W7QF.js → chunk-SVH57F5Z.js} +12 -4
  198. package/dist/chunk-SVH57F5Z.js.map +1 -0
  199. package/dist/{chunk-WIPEXG6R.js → chunk-SXIMQLGV.js} +2 -2
  200. package/dist/{chunk-RVLJEII5.js → chunk-SYUBB3WM.js} +256 -187
  201. package/dist/chunk-SYUBB3WM.js.map +1 -0
  202. package/dist/{chunk-OAEQLRCY.js → chunk-TN76AKO3.js} +5 -5
  203. package/dist/{chunk-QN25OCUF.js → chunk-TQ4GD737.js} +5 -5
  204. package/dist/{chunk-VCD4PSK2.js → chunk-TQZ4DVBC.js} +7 -4
  205. package/dist/chunk-TQZ4DVBC.js.map +1 -0
  206. package/dist/{chunk-7K5Q6COX.js → chunk-TVVEYCNW.js} +4 -4
  207. package/dist/{chunk-DNWXFTLD.js → chunk-TYISDI6B.js} +2 -2
  208. package/dist/{chunk-4LMA77JH.js → chunk-U2VLVBBH.js} +3 -3
  209. package/dist/{chunk-5ZE7QHTK.js → chunk-ULVR5KG7.js} +5 -5
  210. package/dist/{chunk-NVRYW264.js → chunk-UQWIKLQK.js} +18 -15
  211. package/dist/chunk-UQWIKLQK.js.map +1 -0
  212. package/dist/{chunk-YV32N67O.js → chunk-URS5GSM7.js} +1 -1
  213. package/dist/chunk-URS5GSM7.js.map +1 -0
  214. package/dist/{chunk-4B77XSG5.js → chunk-UV72DEZD.js} +5 -5
  215. package/dist/{chunk-S2BBISHU.js → chunk-VANZKHTN.js} +3 -3
  216. package/dist/chunk-VHFXP27N.js +250 -0
  217. package/dist/chunk-VHFXP27N.js.map +1 -0
  218. package/dist/{chunk-3Y224NYC.js → chunk-VYISFWVX.js} +2 -2
  219. package/dist/{chunk-TIHMZFIV.js → chunk-W3IC7QOY.js} +3 -3
  220. package/dist/{chunk-NRV4Y3PM.js → chunk-W4FBGYGK.js} +1 -1
  221. package/dist/{chunk-P2BM76KT.js → chunk-WAS4HV46.js} +174 -43
  222. package/dist/chunk-WAS4HV46.js.map +1 -0
  223. package/dist/{chunk-57QKLRBV.js → chunk-WB7JSQCP.js} +2 -1
  224. package/dist/chunk-WB7JSQCP.js.map +1 -0
  225. package/dist/chunk-WGP57SR3.js +68 -0
  226. package/dist/chunk-WGP57SR3.js.map +1 -0
  227. package/dist/{chunk-ECK75GDJ.js → chunk-WQIHRA5F.js} +43 -24
  228. package/dist/chunk-WQIHRA5F.js.map +1 -0
  229. package/dist/{chunk-MU7ZHSZE.js → chunk-WZFAPHIK.js} +2 -2
  230. package/dist/{chunk-T2TTP3KU.js → chunk-X4IDNPOS.js} +2 -2
  231. package/dist/{chunk-BLAKS3CP.js → chunk-XL3TATMJ.js} +3 -3
  232. package/dist/{chunk-W4XJFLAL.js → chunk-XPRJSHNI.js} +2 -2
  233. package/dist/{chunk-5TFP4CUL.js → chunk-XQ3HXAQH.js} +14 -11
  234. package/dist/chunk-XQ3HXAQH.js.map +1 -0
  235. package/dist/{chunk-VWAXN2BN.js → chunk-XSFHWBQO.js} +93 -31
  236. package/dist/chunk-XSFHWBQO.js.map +1 -0
  237. package/dist/{chunk-DL7ZD3JH.js → chunk-XTAUXTDO.js} +14 -9
  238. package/dist/chunk-XTAUXTDO.js.map +1 -0
  239. package/dist/{chunk-JE7EK33X.js → chunk-Y7HRYCNW.js} +2 -2
  240. package/dist/{chunk-E6EE5B67.js → chunk-YK6BDDHP.js} +4 -4
  241. package/dist/{chunk-ES36HTSC.js → chunk-YLHM5BQQ.js} +3 -3
  242. package/dist/{chunk-RN7DY3FC.js → chunk-YMAQDHQM.js} +31 -12
  243. package/dist/chunk-YMAQDHQM.js.map +1 -0
  244. package/dist/{chunk-ULARSG5Z.js → chunk-YN6ASZUG.js} +10 -8
  245. package/dist/{chunk-ULARSG5Z.js.map → chunk-YN6ASZUG.js.map} +1 -1
  246. package/dist/{chunk-IKKWIPYN.js → chunk-YYQAKIDJ.js} +37 -1
  247. package/dist/chunk-YYQAKIDJ.js.map +1 -0
  248. package/dist/{chunk-BJKPPZ6Z.js → chunk-ZFGZ6PZ2.js} +2 -2
  249. package/dist/{chunk-CJ2ZR7UA.js → chunk-ZI32MKDW.js} +267 -214
  250. package/dist/chunk-ZI32MKDW.js.map +1 -0
  251. package/dist/{chunk-64UDOIMI.js → chunk-ZLQ37WJX.js} +2 -2
  252. package/dist/chunk-ZMAYKGPN.js +351 -0
  253. package/dist/chunk-ZMAYKGPN.js.map +1 -0
  254. package/dist/{cli-BUGN3d6_.d.ts → cli-BBHDtG36.d.ts} +5 -5
  255. package/dist/cli.d.ts +16 -12
  256. package/dist/cli.js +138 -124
  257. package/dist/compounding/engine.d.ts +3 -2
  258. package/dist/compounding/engine.js +24 -23
  259. package/dist/compounding/preference-consolidator.d.ts +2 -1
  260. package/dist/compression-optimizer.d.ts +2 -1
  261. package/dist/config.d.ts +2 -1
  262. package/dist/config.js +10 -8
  263. package/dist/connectors/codex-materialize-runner.d.ts +2 -1
  264. package/dist/connectors/codex-materialize-runner.js +23 -22
  265. package/dist/connectors/codex-materialize.d.ts +2 -1
  266. package/dist/connectors/index.d.ts +2 -1
  267. package/dist/connectors/index.js +26 -25
  268. package/dist/consolidation-provenance-check.d.ts +3 -2
  269. package/dist/consolidation-provenance-check.js +4 -4
  270. package/dist/consolidation-undo.d.ts +3 -2
  271. package/dist/consolidation-undo.js +10 -7
  272. package/dist/consolidation-undo.js.map +1 -1
  273. package/dist/contradiction/index.d.ts +3 -2
  274. package/dist/converge-config.d.ts +2 -1
  275. package/dist/convergence-refresh.d.ts +4 -3
  276. package/dist/convergence-refresh.js +27 -26
  277. package/dist/conversation-index/backend.d.ts +2 -1
  278. package/dist/conversation-index/backend.js +2 -2
  279. package/dist/conversation-index/chunker.d.ts +2 -1
  280. package/dist/conversation-index/faiss-adapter.d.ts +2 -1
  281. package/dist/conversation-index/indexer.d.ts +2 -1
  282. package/dist/conversation-index/search.d.ts +2 -1
  283. package/dist/corpus-watermark.d.ts +2 -1
  284. package/dist/corpus-watermark.js +42 -41
  285. package/dist/day-summary.d.ts +2 -1
  286. package/dist/delinearize.d.ts +2 -1
  287. package/dist/direct-answer-wiring.d.ts +2 -1
  288. package/dist/direct-answer-wiring.js +2 -2
  289. package/dist/direct-answer.d.ts +2 -1
  290. package/dist/embedding-fallback.d.ts +2 -1
  291. package/dist/embedding-fallback.js +2 -2
  292. package/dist/enrichment/index.d.ts +2 -1
  293. package/dist/entity-retrieval-boundaries.js +1 -1
  294. package/dist/entity-retrieval.d.ts +3 -2
  295. package/dist/entity-retrieval.js +24 -23
  296. package/dist/entity-schema.d.ts +2 -1
  297. package/dist/explicit-capture.d.ts +9 -8
  298. package/dist/explicit-capture.js +11 -9
  299. package/dist/external-wiki-access.d.ts +127 -0
  300. package/dist/external-wiki-access.js +186 -0
  301. package/dist/external-wiki-access.js.map +1 -0
  302. package/dist/external-wiki-cli.d.ts +13 -0
  303. package/dist/external-wiki-cli.js +96 -0
  304. package/dist/external-wiki-cli.js.map +1 -0
  305. package/dist/external-wiki-collection-registration.d.ts +39 -0
  306. package/dist/external-wiki-collection-registration.js +79 -0
  307. package/dist/external-wiki-collection-registration.js.map +1 -0
  308. package/dist/external-wiki-collection.d.ts +50 -0
  309. package/dist/external-wiki-collection.js +387 -0
  310. package/dist/external-wiki-collection.js.map +1 -0
  311. package/dist/external-wiki-config.d.ts +13 -0
  312. package/dist/external-wiki-config.js +13 -0
  313. package/dist/external-wiki-config.js.map +1 -0
  314. package/dist/external-wiki-guard.d.ts +11 -0
  315. package/dist/external-wiki-guard.js +18 -0
  316. package/dist/external-wiki-guard.js.map +1 -0
  317. package/dist/external-wiki-mcp-tools.d.ts +123 -0
  318. package/dist/external-wiki-mcp-tools.js +8 -0
  319. package/dist/external-wiki-mcp-tools.js.map +1 -0
  320. package/dist/external-wiki-search.d.ts +42 -0
  321. package/dist/external-wiki-search.js +11 -0
  322. package/dist/external-wiki-search.js.map +1 -0
  323. package/dist/external-wiki.d.ts +43 -0
  324. package/dist/external-wiki.js +16 -0
  325. package/dist/external-wiki.js.map +1 -0
  326. package/dist/extraction-error-classification.d.ts +2 -1
  327. package/dist/extraction-faithfulness.d.ts +2 -1
  328. package/dist/extraction-judge-telemetry.d.ts +2 -1
  329. package/dist/extraction-judge-training.d.ts +2 -1
  330. package/dist/extraction-judge.d.ts +2 -1
  331. package/dist/extraction-liveness.d.ts +2 -1
  332. package/dist/extraction-source-grounding-helpers.d.ts +5 -3
  333. package/dist/extraction-source-grounding-helpers.js +1 -1
  334. package/dist/extraction-source-grounding-rules.d.ts +2 -1
  335. package/dist/extraction-source-grounding-rules.js +2 -2
  336. package/dist/extraction-source-grounding.d.ts +2 -1
  337. package/dist/extraction-source-grounding.js +5 -5
  338. package/dist/extraction.d.ts +2 -1
  339. package/dist/extraction.js +45 -43
  340. package/dist/fallback-llm.d.ts +2 -1
  341. package/dist/graph-dashboard-diff.d.ts +2 -1
  342. package/dist/graph-dashboard-key.d.ts +2 -1
  343. package/dist/graph-dashboard-parser.d.ts +2 -1
  344. package/dist/graph-edge-reinforcement.d.ts +2 -1
  345. package/dist/graph-snapshot.d.ts +2 -1
  346. package/dist/graph.d.ts +2 -1
  347. package/dist/harmonic-retrieval.js +2 -2
  348. package/dist/importance.d.ts +2 -1
  349. package/dist/importers/index.d.ts +2 -1
  350. package/dist/in-flight-reads.d.ts +2 -1
  351. package/dist/index.d.ts +362 -350
  352. package/dist/index.js +291 -259
  353. package/dist/intent.d.ts +2 -1
  354. package/dist/lcm/engine.d.ts +2 -1
  355. package/dist/lcm/engine.js +3 -3
  356. package/dist/lcm/index.d.ts +2 -1
  357. package/dist/lcm/index.js +8 -8
  358. package/dist/lcm/tools.d.ts +2 -1
  359. package/dist/lifecycle.d.ts +2 -1
  360. package/dist/live-connectors-runner.d.ts +2 -1
  361. package/dist/local-llm.d.ts +2 -1
  362. package/dist/local-llm.js +2 -2
  363. package/dist/local-model-endpoint.d.ts +2 -1
  364. package/dist/maintenance/memory-governance.d.ts +2 -1
  365. package/dist/maintenance/memory-governance.js +24 -23
  366. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +3 -2
  367. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +24 -23
  368. package/dist/maintenance/rebuild-memory-projection.d.ts +3 -2
  369. package/dist/maintenance/rebuild-memory-projection.js +26 -25
  370. package/dist/{maintenance-LbuS2rUA.d.ts → maintenance-D2mveyCd.d.ts} +3 -3
  371. package/dist/mcp-memory-inspector-app.d.ts +14 -10
  372. package/dist/mcp-read-only-tools.js +1 -1
  373. package/dist/memory-action-policy.d.ts +2 -1
  374. package/dist/memory-cache.d.ts +2 -1
  375. package/dist/memory-lifecycle-ledger-utils.d.ts +2 -1
  376. package/dist/memory-projection-store.d.ts +2 -1
  377. package/dist/memory-provenance.d.ts +2 -1
  378. package/dist/memory-worth-outcomes.d.ts +3 -2
  379. package/dist/models-json.d.ts +2 -1
  380. package/dist/namespaces/migrate.d.ts +4 -3
  381. package/dist/namespaces/migrate.js +40 -39
  382. package/dist/namespaces/principal.d.ts +2 -1
  383. package/dist/namespaces/search.d.ts +2 -1
  384. package/dist/namespaces/search.js +18 -18
  385. package/dist/namespaces/storage.d.ts +4 -3
  386. package/dist/namespaces/storage.js +23 -22
  387. package/dist/native-knowledge.d.ts +2 -1
  388. package/dist/offline-sync-impression-drain.d.ts +2 -1
  389. package/dist/offline-sync-impression-drain.js +11 -9
  390. package/dist/offline-sync.d.ts +29 -3
  391. package/dist/offline-sync.js +6 -2
  392. package/dist/operator-doctor-corpus.d.ts +2 -1
  393. package/dist/operator-doctor-corpus.js +45 -44
  394. package/dist/operator-doctor-replica.d.ts +2 -1
  395. package/dist/operator-doctor-replica.js +3 -3
  396. package/dist/operator-toolkit.d.ts +4 -3
  397. package/dist/operator-toolkit.js +59 -55
  398. package/dist/orchestration/compression-guideline-coordinator.d.ts +3 -2
  399. package/dist/orchestration/maintenance.d.ts +5 -4
  400. package/dist/orchestration/maintenance.js +36 -33
  401. package/dist/{orchestrator-rHiWt32X.d.ts → orchestrator-DJYlwiUv.d.ts} +14 -7
  402. package/dist/orchestrator.d.ts +9 -8
  403. package/dist/orchestrator.js +201 -189
  404. package/dist/page-versioning.js +3 -3
  405. package/dist/patterns-cli.d.ts +2 -1
  406. package/dist/{pipeline-W_97O8BV.d.ts → pipeline-CNjY4wk3.d.ts} +1 -1
  407. package/dist/policy-runtime.d.ts +2 -1
  408. package/dist/policy-runtime.js +1 -1
  409. package/dist/proactive-contention.d.ts +2 -1
  410. package/dist/provenance.d.ts +2 -1
  411. package/dist/provenance.js +2 -2
  412. package/dist/{qmd-LWtMofAf.d.ts → qmd-C0UDZidt.d.ts} +9 -7
  413. package/dist/qmd-preflight.d.ts +5 -4
  414. package/dist/qmd-preflight.js +2 -2
  415. package/dist/qmd-recall-cache.d.ts +2 -1
  416. package/dist/qmd.d.ts +4 -3
  417. package/dist/qmd.js +5 -5
  418. package/dist/recall-concurrency-config.d.ts +2 -1
  419. package/dist/recall-disclosure-escalation.d.ts +2 -1
  420. package/dist/recall-explain-renderer.d.ts +2 -1
  421. package/dist/recall-explain-renderer.js +3 -3
  422. package/dist/recall-memory-map.d.ts +2 -1
  423. package/dist/recall-planner-llm.d.ts +2 -1
  424. package/dist/recall-state.d.ts +2 -1
  425. package/dist/recall-tag-filter.d.ts +2 -1
  426. package/dist/recall-timings.d.ts +2 -1
  427. package/dist/recall-xray-cli.d.ts +2 -1
  428. package/dist/recall-xray-cli.js +4 -4
  429. package/dist/recall-xray-renderer.d.ts +2 -1
  430. package/dist/recall-xray-renderer.js +3 -3
  431. package/dist/recall-xray.d.ts +8 -1
  432. package/dist/recall-xray.js +2 -2
  433. package/dist/reconcile/cursor.d.ts +12 -2
  434. package/dist/reconcile/cursor.js +46 -7
  435. package/dist/reconcile/cursor.js.map +1 -1
  436. package/dist/reconcile/manifest.d.ts +9 -2
  437. package/dist/reconcile/manifest.js +15 -268
  438. package/dist/reconcile/manifest.js.map +1 -1
  439. package/dist/reconcile/plan.d.ts +4 -1
  440. package/dist/reconcile/plan.js +4 -4
  441. package/dist/replay/normalizers/chatgpt.d.ts +2 -1
  442. package/dist/replay/normalizers/claude.d.ts +2 -1
  443. package/dist/replay/normalizers/openclaw.d.ts +2 -1
  444. package/dist/replay/normalizers/shared.d.ts +2 -1
  445. package/dist/replay/runner.d.ts +2 -1
  446. package/dist/replay/types.d.ts +2 -1
  447. package/dist/replica-divergence.d.ts +2 -1
  448. package/dist/replica-divergence.js +2 -2
  449. package/dist/replica-peers-config.d.ts +2 -1
  450. package/dist/resolve-auth-token.d.ts +2 -1
  451. package/dist/resume-bundles.js +12 -10
  452. package/dist/retrieval-agents.d.ts +4 -3
  453. package/dist/retrieval-agents.js +2 -2
  454. package/dist/retrieval-tiers.d.ts +2 -1
  455. package/dist/routing/engine.d.ts +2 -1
  456. package/dist/routing/store.d.ts +2 -1
  457. package/dist/salvage-envelope.d.ts +2 -1
  458. package/dist/schemas.d.ts +32 -32
  459. package/dist/{scope-profiles-BiQKOE-p.d.ts → scope-profiles-BJzp2F5A.d.ts} +1 -1
  460. package/dist/search/embed-helper.d.ts +2 -1
  461. package/dist/search/embed-helper.js +3 -3
  462. package/dist/search/factory.d.ts +4 -2
  463. package/dist/search/factory.js +20 -18
  464. package/dist/search/index.d.ts +2 -1
  465. package/dist/search/index.js +22 -22
  466. package/dist/search/lancedb-backend.d.ts +2 -1
  467. package/dist/search/lancedb-backend.js +4 -4
  468. package/dist/search/meilisearch-backend.d.ts +2 -1
  469. package/dist/search/meilisearch-backend.js +4 -4
  470. package/dist/search/noop-backend.d.ts +2 -1
  471. package/dist/search/orama-backend.d.ts +2 -1
  472. package/dist/search/orama-backend.js +4 -4
  473. package/dist/search/port.d.ts +18 -1
  474. package/dist/search/port.js +1 -1
  475. package/dist/search/remote-backend.d.ts +2 -1
  476. package/dist/search/remote-backend.js +2 -2
  477. package/dist/secure-store/index.js +2 -2
  478. package/dist/{semantic-consolidation-dHYCyqgh.d.ts → semantic-consolidation-D4KAZO2G.d.ts} +1 -1
  479. package/dist/semantic-consolidation.d.ts +3 -2
  480. package/dist/semantic-consolidation.js +25 -24
  481. package/dist/semantic-rule-promotion.js +23 -22
  482. package/dist/semantic-rule-verifier.d.ts +2 -1
  483. package/dist/semantic-rule-verifier.js +24 -23
  484. package/dist/{service-DJG3KCQ4.d.ts → service-BeDxSqE-.d.ts} +2 -2
  485. package/dist/session-observer-bands.d.ts +2 -1
  486. package/dist/session-observer-state.d.ts +2 -1
  487. package/dist/shared-context/manager.d.ts +2 -1
  488. package/dist/shared-context/manager.js +2 -2
  489. package/dist/signal.d.ts +2 -1
  490. package/dist/source-agent-qualifier.d.ts +2 -1
  491. package/dist/source-agent-qualifier.js +42 -40
  492. package/dist/{storage-F9FVh-w9.d.ts → storage-DfjxusTE.d.ts} +24 -12
  493. package/dist/storage.d.ts +3 -2
  494. package/dist/storage.js +25 -24
  495. package/dist/summarizer.d.ts +2 -1
  496. package/dist/summarizer.js +5 -5
  497. package/dist/summary-snapshot.d.ts +2 -1
  498. package/dist/temporal-supersession.d.ts +3 -2
  499. package/dist/temporal-timeline-recall.d.ts +2 -1
  500. package/dist/temporal-validity.d.ts +2 -1
  501. package/dist/threading.d.ts +2 -1
  502. package/dist/tier-migration.d.ts +3 -2
  503. package/dist/tier-routing.d.ts +2 -1
  504. package/dist/tool-scoped-memory.d.ts +5 -1
  505. package/dist/tool-scoped-memory.js +3 -1
  506. package/dist/topics.d.ts +2 -1
  507. package/dist/transcript.d.ts +2 -1
  508. package/dist/transfer/capsule-import.js +4 -4
  509. package/dist/transfer/types.d.ts +12 -12
  510. package/dist/trust-score-stage.d.ts +2 -1
  511. package/dist/trust-score.d.ts +2 -1
  512. package/dist/{types-rEwubvim.d.ts → types-yX_FwERf.d.ts} +8 -1
  513. package/dist/types.d.ts +2 -1
  514. package/dist/types.js +1 -1
  515. package/dist/utility-runtime.d.ts +2 -1
  516. package/dist/verified-recall.js +24 -23
  517. package/dist/write-envelope.d.ts +2 -1
  518. package/package.json +2 -2
  519. package/src/abort-error.ts +17 -0
  520. package/src/access-admin-ops-surface.ts +1 -0
  521. package/src/access-boundary.ts +1 -0
  522. package/src/access-coding-context-resolution.ts +42 -0
  523. package/src/access-extraction-force-flush.ts +38 -2
  524. package/src/access-http-lcm-compaction.ts +5 -2
  525. package/src/access-http-offline-stream.ts +79 -0
  526. package/src/access-http.test.ts +310 -3
  527. package/src/access-http.ts +85 -21
  528. package/src/access-mcp-output-schemas.ts +36 -0
  529. package/src/access-mcp.test.ts +95 -1
  530. package/src/access-mcp.ts +7 -9
  531. package/src/access-observe-helpers.ts +64 -22
  532. package/src/access-observe-write-surface.ts +8 -0
  533. package/src/access-offline-manifest.ts +54 -0
  534. package/src/access-operations-batch.ts +3 -3
  535. package/src/access-operations.ts +13 -7
  536. package/src/access-recall-concurrency.ts +3 -27
  537. package/src/access-recall-surface.ts +3 -0
  538. package/src/access-service-health.test.ts +32 -7
  539. package/src/access-service-namespace.test.ts +55 -0
  540. package/src/access-service-observe-idempotency.test.ts +34 -2
  541. package/src/access-service-observe-lcm-parity.test.ts +138 -3
  542. package/src/access-service-observe-scope.test.ts +160 -1
  543. package/src/access-service-offline-file-content.test.ts +345 -1
  544. package/src/access-service.ts +86 -59
  545. package/src/access-surface-catalog.ts +4 -0
  546. package/src/admin/admin-surfaces.ts +2 -0
  547. package/src/binary-lifecycle/pipeline.test.ts +106 -1
  548. package/src/binary-lifecycle/pipeline.ts +3 -0
  549. package/src/coding/git-context.test.ts +47 -0
  550. package/src/coding/git-context.ts +129 -27
  551. package/src/config.test.ts +24 -0
  552. package/src/config.ts +9 -12
  553. package/src/connector-provenance.test.ts +101 -0
  554. package/src/consolidation-undo.ts +3 -0
  555. package/src/convergence-refresh.ts +14 -2
  556. package/src/correction/correction-access-wiring.ts +9 -7
  557. package/src/correction/correction-executor.test.ts +206 -2
  558. package/src/correction/correction-executor.ts +29 -20
  559. package/src/correction/correction-planner.test.ts +36 -0
  560. package/src/correction/correction-planner.ts +9 -15
  561. package/src/correction/correction-service.ts +3 -1
  562. package/src/correction/correction-storage-integration.test.ts +77 -0
  563. package/src/correction/correction-surfaces.test.ts +41 -28
  564. package/src/correction/passive-capture.test.ts +59 -0
  565. package/src/correction/passive-capture.ts +4 -1
  566. package/src/entity-retrieval-boundaries.ts +17 -4
  567. package/src/entity-retrieval.ts +27 -6
  568. package/src/external-wiki-access.test.ts +65 -0
  569. package/src/external-wiki-access.ts +31 -0
  570. package/src/external-wiki-cli.ts +92 -0
  571. package/src/external-wiki-collection-registration.test.ts +163 -0
  572. package/src/external-wiki-collection-registration.ts +101 -0
  573. package/src/external-wiki-collection.test.ts +502 -0
  574. package/src/external-wiki-collection.ts +503 -0
  575. package/src/external-wiki-config.test.ts +135 -0
  576. package/src/external-wiki-config.ts +100 -0
  577. package/src/external-wiki-guard.ts +83 -0
  578. package/src/external-wiki-mcp-tools.ts +23 -0
  579. package/src/external-wiki-search.test.ts +301 -0
  580. package/src/external-wiki-search.ts +362 -0
  581. package/src/external-wiki.test.ts +240 -0
  582. package/src/external-wiki.ts +453 -0
  583. package/src/extraction-scope-source-agent.test.ts +21 -0
  584. package/src/extraction-source-grounding-helpers.ts +243 -53
  585. package/src/extraction-source-grounding-rules.ts +133 -39
  586. package/src/extraction-source-grounding.test.ts +363 -33
  587. package/src/extraction-timeout.test.ts +1 -0
  588. package/src/extraction-watermark.test.ts +150 -7
  589. package/src/extraction.ts +8 -1
  590. package/src/index.ts +8 -0
  591. package/src/mcp-read-only-tools.ts +1 -0
  592. package/src/offline-sync.test.ts +194 -0
  593. package/src/offline-sync.ts +217 -13
  594. package/src/orchestration/external-wiki-recall-guard.test.ts +94 -0
  595. package/src/orchestration/extraction-persist.ts +19 -2
  596. package/src/orchestration/extraction-run-helpers.ts +37 -19
  597. package/src/orchestration/extraction-run.test.ts +171 -2
  598. package/src/orchestration/extraction-run.ts +11 -13
  599. package/src/orchestration/extraction-watermark.ts +106 -17
  600. package/src/orchestration/generic-recall-paths.ts +14 -0
  601. package/src/orchestration/orchestrator-helpers.ts +2 -0
  602. package/src/orchestration/orchestrator-init.ts +9 -0
  603. package/src/orchestration/recall-internal-deps.ts +6 -0
  604. package/src/orchestration/recall-internal.ts +154 -33
  605. package/src/orchestration/recall-rerank-coordinator.ts +60 -25
  606. package/src/orchestration/recall-search-pipeline.test.ts +75 -1
  607. package/src/orchestration/recall-search-pipeline.ts +50 -10
  608. package/src/orchestrator-convergence-refresh.test.ts +36 -2
  609. package/src/orchestrator.ts +13 -3
  610. package/src/page-versioning.ts +5 -19
  611. package/src/procedural/procedure-recall.ts +5 -1
  612. package/src/provenance-surfaces.test.ts +3 -0
  613. package/src/qmd-client.test.ts +78 -17
  614. package/src/qmd.test.ts +24 -0
  615. package/src/qmd.ts +224 -315
  616. package/src/recall-explain-renderer.ts +3 -0
  617. package/src/recall-rerank-coordinator.test.ts +61 -0
  618. package/src/recall-xray-renderer.test.ts +6 -0
  619. package/src/recall-xray.test.ts +88 -1
  620. package/src/recall-xray.ts +15 -0
  621. package/src/reconcile/cursor.test.ts +48 -0
  622. package/src/reconcile/cursor.ts +58 -11
  623. package/src/reconcile/manifest.test.ts +4 -0
  624. package/src/reconcile/manifest.ts +41 -51
  625. package/src/reconcile/plan.test.ts +4 -0
  626. package/src/reconcile/plan.ts +28 -16
  627. package/src/search/factory.ts +6 -6
  628. package/src/search/port.ts +25 -9
  629. package/src/secure-store/secure-fs.ts +20 -12
  630. package/src/secure-store/secure-store.test.ts +41 -2
  631. package/src/spaces/index.test.ts +61 -2
  632. package/src/spaces/index.ts +44 -18
  633. package/src/storage/entity-alias-config.ts +97 -0
  634. package/src/storage/entity-canonical-id-lock.ts +53 -23
  635. package/src/storage/entity-canonical-id-migration.ts +53 -22
  636. package/src/storage/entity-canonical-id-references.ts +3 -0
  637. package/src/storage/entity-id-safety.ts +7 -0
  638. package/src/storage/entity-store.ts +6 -2
  639. package/src/storage/memory-frontmatter-metadata.ts +4 -9
  640. package/src/storage/memory-migration-serialization.ts +10 -15
  641. package/src/storage/tombstone-blocked-capture-mutation.ts +52 -64
  642. package/src/storage/tombstone-blocked-capture-sync.ts +244 -199
  643. package/src/storage-deletion-revisions.test.ts +91 -0
  644. package/src/storage-fact-hash-index-defer.test.ts +446 -163
  645. package/src/storage.ts +534 -245
  646. package/src/tool-scoped-memory.ts +10 -0
  647. package/src/transfer/capsule-import.ts +13 -0
  648. package/src/transfer/capsule-merge.ts +13 -0
  649. package/src/trust-score-recall-paths.test.ts +75 -1
  650. package/src/types.ts +7 -3
  651. package/dist/capsule-merge-IDWJPCWK.js.map +0 -1
  652. package/dist/chunk-3CE77VAP.js.map +0 -1
  653. package/dist/chunk-3TBLDMJA.js.map +0 -1
  654. package/dist/chunk-4J7G5SY4.js.map +0 -1
  655. package/dist/chunk-57QKLRBV.js.map +0 -1
  656. package/dist/chunk-5TFP4CUL.js.map +0 -1
  657. package/dist/chunk-7XC2HX75.js.map +0 -1
  658. package/dist/chunk-A5OJCXZL.js.map +0 -1
  659. package/dist/chunk-BUE5E2HL.js.map +0 -1
  660. package/dist/chunk-CJ2ZR7UA.js.map +0 -1
  661. package/dist/chunk-CUM2BBPN.js.map +0 -1
  662. package/dist/chunk-D3J5SLQK.js.map +0 -1
  663. package/dist/chunk-DL7ZD3JH.js.map +0 -1
  664. package/dist/chunk-DLVPUX7U.js.map +0 -1
  665. package/dist/chunk-E6PNLPGJ.js.map +0 -1
  666. package/dist/chunk-ECK75GDJ.js.map +0 -1
  667. package/dist/chunk-HREE4JHI.js.map +0 -1
  668. package/dist/chunk-HZFHQ4AQ.js.map +0 -1
  669. package/dist/chunk-IKKWIPYN.js.map +0 -1
  670. package/dist/chunk-J7VGGECD.js.map +0 -1
  671. package/dist/chunk-N5Z4EVOR.js.map +0 -1
  672. package/dist/chunk-NVRYW264.js.map +0 -1
  673. package/dist/chunk-P2BM76KT.js.map +0 -1
  674. package/dist/chunk-PVGDJXVK.js +0 -21
  675. package/dist/chunk-QJAQNXWI.js.map +0 -1
  676. package/dist/chunk-RN7DY3FC.js.map +0 -1
  677. package/dist/chunk-RVLJEII5.js.map +0 -1
  678. package/dist/chunk-S2NCTZGJ.js.map +0 -1
  679. package/dist/chunk-TDHTVMPG.js.map +0 -1
  680. package/dist/chunk-UYLMNVY6.js.map +0 -1
  681. package/dist/chunk-VCD4PSK2.js.map +0 -1
  682. package/dist/chunk-VNA7W7QF.js.map +0 -1
  683. package/dist/chunk-VWAXN2BN.js.map +0 -1
  684. package/dist/chunk-WOCNN776.js.map +0 -1
  685. package/dist/chunk-XYTOI63Z.js.map +0 -1
  686. package/dist/chunk-YV32N67O.js.map +0 -1
  687. /package/dist/{auto-sync-5OE5QOZB.js.map → auto-sync-UPTUVE4X.js.map} +0 -0
  688. /package/dist/{chunk-VUPTKTDV.js.map → chunk-2MRHJNWL.js.map} +0 -0
  689. /package/dist/{chunk-JBPKEARU.js.map → chunk-2QSZNTDO.js.map} +0 -0
  690. /package/dist/{chunk-5IVLTFOV.js.map → chunk-44N6ESJ4.js.map} +0 -0
  691. /package/dist/{chunk-HO3QBJEY.js.map → chunk-5546W5SI.js.map} +0 -0
  692. /package/dist/{chunk-U7GW7NE7.js.map → chunk-5CEECY6P.js.map} +0 -0
  693. /package/dist/{chunk-4UH4BTGK.js.map → chunk-5SNZSWWR.js.map} +0 -0
  694. /package/dist/{chunk-6CZPDBJS.js.map → chunk-5U7ID3EZ.js.map} +0 -0
  695. /package/dist/{chunk-GF22HWS2.js.map → chunk-6NNNURLK.js.map} +0 -0
  696. /package/dist/{chunk-227UFSEQ.js.map → chunk-7RZJWZ46.js.map} +0 -0
  697. /package/dist/{chunk-E5UK4VPE.js.map → chunk-7SHJHPTY.js.map} +0 -0
  698. /package/dist/{chunk-UVIKWC7M.js.map → chunk-7YERSTN7.js.map} +0 -0
  699. /package/dist/{chunk-S5SLVSVY.js.map → chunk-BQIFZ2MP.js.map} +0 -0
  700. /package/dist/{chunk-E53DSZEN.js.map → chunk-C26TE27X.js.map} +0 -0
  701. /package/dist/{chunk-LZ4LDKHZ.js.map → chunk-CLB32OHM.js.map} +0 -0
  702. /package/dist/{chunk-Q6IP2ARR.js.map → chunk-CSOYVTRX.js.map} +0 -0
  703. /package/dist/{chunk-XOQSEF7X.js.map → chunk-CVILPI77.js.map} +0 -0
  704. /package/dist/{chunk-PDLBLTOK.js.map → chunk-EITZHSX6.js.map} +0 -0
  705. /package/dist/{chunk-WUNIWKY4.js.map → chunk-ELIL2A37.js.map} +0 -0
  706. /package/dist/{chunk-CINZGPSJ.js.map → chunk-GUMZC2BO.js.map} +0 -0
  707. /package/dist/{chunk-H24WNPA2.js.map → chunk-GWFSVJ4P.js.map} +0 -0
  708. /package/dist/{chunk-TSH56VPU.js.map → chunk-HAYSYUAB.js.map} +0 -0
  709. /package/dist/{chunk-PKNLM44P.js.map → chunk-JH6BPLOP.js.map} +0 -0
  710. /package/dist/{chunk-KXB4VXHY.js.map → chunk-JIYDRBVZ.js.map} +0 -0
  711. /package/dist/{chunk-AV5ZEH4M.js.map → chunk-KVJRXN2E.js.map} +0 -0
  712. /package/dist/{chunk-JVLCVFQ4.js.map → chunk-KXEFRMCF.js.map} +0 -0
  713. /package/dist/{chunk-WFTIGIIS.js.map → chunk-L6CQ7WIW.js.map} +0 -0
  714. /package/dist/{chunk-EJUEXZHX.js.map → chunk-LLJMAULE.js.map} +0 -0
  715. /package/dist/{chunk-AS7YMSL6.js.map → chunk-M23RF3LJ.js.map} +0 -0
  716. /package/dist/{chunk-3F2LKUMU.js.map → chunk-NIS256NW.js.map} +0 -0
  717. /package/dist/{chunk-YIAA2X3D.js.map → chunk-NK5RGJ65.js.map} +0 -0
  718. /package/dist/{chunk-OQ5PRDDS.js.map → chunk-NTOIP2E6.js.map} +0 -0
  719. /package/dist/{chunk-HLPD7B7P.js.map → chunk-NUEQKLNB.js.map} +0 -0
  720. /package/dist/{chunk-33PLLLL7.js.map → chunk-P7NGM24P.js.map} +0 -0
  721. /package/dist/{chunk-7TWUCYER.js.map → chunk-PNRA7FAD.js.map} +0 -0
  722. /package/dist/{chunk-5I4M26Q7.js.map → chunk-QBSFOKY6.js.map} +0 -0
  723. /package/dist/{chunk-P4DRWEYC.js.map → chunk-QVSBTCVP.js.map} +0 -0
  724. /package/dist/{chunk-AAIUERNB.js.map → chunk-R5RFK3CB.js.map} +0 -0
  725. /package/dist/{chunk-WDISJRMG.js.map → chunk-RMMVQQA6.js.map} +0 -0
  726. /package/dist/{chunk-5SM35XZR.js.map → chunk-S5NZBKKQ.js.map} +0 -0
  727. /package/dist/{chunk-WIPEXG6R.js.map → chunk-SXIMQLGV.js.map} +0 -0
  728. /package/dist/{chunk-OAEQLRCY.js.map → chunk-TN76AKO3.js.map} +0 -0
  729. /package/dist/{chunk-QN25OCUF.js.map → chunk-TQ4GD737.js.map} +0 -0
  730. /package/dist/{chunk-7K5Q6COX.js.map → chunk-TVVEYCNW.js.map} +0 -0
  731. /package/dist/{chunk-DNWXFTLD.js.map → chunk-TYISDI6B.js.map} +0 -0
  732. /package/dist/{chunk-4LMA77JH.js.map → chunk-U2VLVBBH.js.map} +0 -0
  733. /package/dist/{chunk-5ZE7QHTK.js.map → chunk-ULVR5KG7.js.map} +0 -0
  734. /package/dist/{chunk-4B77XSG5.js.map → chunk-UV72DEZD.js.map} +0 -0
  735. /package/dist/{chunk-S2BBISHU.js.map → chunk-VANZKHTN.js.map} +0 -0
  736. /package/dist/{chunk-3Y224NYC.js.map → chunk-VYISFWVX.js.map} +0 -0
  737. /package/dist/{chunk-TIHMZFIV.js.map → chunk-W3IC7QOY.js.map} +0 -0
  738. /package/dist/{chunk-NRV4Y3PM.js.map → chunk-W4FBGYGK.js.map} +0 -0
  739. /package/dist/{chunk-MU7ZHSZE.js.map → chunk-WZFAPHIK.js.map} +0 -0
  740. /package/dist/{chunk-T2TTP3KU.js.map → chunk-X4IDNPOS.js.map} +0 -0
  741. /package/dist/{chunk-BLAKS3CP.js.map → chunk-XL3TATMJ.js.map} +0 -0
  742. /package/dist/{chunk-W4XJFLAL.js.map → chunk-XPRJSHNI.js.map} +0 -0
  743. /package/dist/{chunk-JE7EK33X.js.map → chunk-Y7HRYCNW.js.map} +0 -0
  744. /package/dist/{chunk-E6EE5B67.js.map → chunk-YK6BDDHP.js.map} +0 -0
  745. /package/dist/{chunk-ES36HTSC.js.map → chunk-YLHM5BQQ.js.map} +0 -0
  746. /package/dist/{chunk-BJKPPZ6Z.js.map → chunk-ZFGZ6PZ2.js.map} +0 -0
  747. /package/dist/{chunk-64UDOIMI.js.map → chunk-ZLQ37WJX.js.map} +0 -0
@@ -0,0 +1,503 @@
1
+ import { createHash } from "node:crypto";
2
+ import { createReadStream } from "node:fs";
3
+ import { readdir, realpath } from "node:fs/promises";
4
+ import path from "node:path";
5
+ import type { SearchBackend, SearchExecutionOptions, SearchResult } from "./search/port.js";
6
+
7
+ const COLLECTION_PREFIX = "external-wiki-";
8
+
9
+ export interface ExternalWikiCollectionRoot {
10
+ id: string;
11
+ rootDir: string;
12
+ enabled?: boolean;
13
+ pagesDir?: string;
14
+ indexInQmd?: boolean;
15
+ }
16
+
17
+ export type ExternalWikiCollectionBackend = Pick<
18
+ SearchBackend,
19
+ | "updateCollectionStrict"
20
+ | "updateCollectionFromDir"
21
+ | "embedCollection"
22
+ | "embedCollectionStrict"
23
+ | "hybridSearch"
24
+ | "collectionStatus"
25
+ > & {
26
+ ensureCollection(
27
+ rootDir: string,
28
+ collection: string,
29
+ execution?: SearchExecutionOptions
30
+ ): Promise<"present" | "missing" | "unknown" | "skipped">;
31
+ } & Required<
32
+ Pick<
33
+ SearchBackend,
34
+ | "supportsAdditionalCollections"
35
+ | "excludeCollectionFromGlobalSearch"
36
+ | "deleteCollection"
37
+ | "collectionRoot"
38
+ >
39
+ >;
40
+
41
+ export type ExternalWikiCollectionState = "disabled" | "healthy" | "error";
42
+
43
+ export interface ExternalWikiCollectionStatus {
44
+ wikiId: string;
45
+ collection: string;
46
+ state: ExternalWikiCollectionState;
47
+ documentCount: number | null;
48
+ lastIndexedAt: string | null;
49
+ lastError: string | null;
50
+ }
51
+
52
+ interface ManagedWikiCollection {
53
+ status: ExternalWikiCollectionStatus;
54
+ pagesDir: string | null;
55
+ fingerprint: string | null;
56
+ managed: boolean;
57
+ }
58
+
59
+ interface PagesFingerprint {
60
+ fingerprint: string;
61
+ documentCount: number;
62
+ }
63
+
64
+ export function externalWikiCollectionName(wikiId: string): string {
65
+ const slug = wikiId
66
+ .normalize("NFKD")
67
+ .toLowerCase()
68
+ .replace(/[^a-z0-9]+/g, "-")
69
+ .replace(/^-+|-+$/g, "");
70
+ if (!slug) {
71
+ throw new Error("External wiki id must contain usable characters for a collection name");
72
+ }
73
+ return `${COLLECTION_PREFIX}${slug}`;
74
+ }
75
+
76
+ export function supportsExternalWikiCollections(
77
+ backend: SearchBackend | ExternalWikiCollectionBackend
78
+ ): backend is ExternalWikiCollectionBackend {
79
+ return (
80
+ backend.supportsAdditionalCollections?.() === true &&
81
+ typeof backend.excludeCollectionFromGlobalSearch === "function" &&
82
+ typeof backend.deleteCollection === "function" &&
83
+ typeof backend.collectionRoot === "function"
84
+ );
85
+ }
86
+
87
+ export class ExternalWikiCollectionManager {
88
+ private readonly managedByWikiId = new Map<string, ManagedWikiCollection>();
89
+ private operationTail: Promise<void> = Promise.resolve();
90
+
91
+ constructor(
92
+ private readonly backend: SearchBackend | ExternalWikiCollectionBackend,
93
+ private readonly defaultCollection: string,
94
+ private readonly now: () => Date = () => new Date()
95
+ ) {}
96
+
97
+ statuses(): ExternalWikiCollectionStatus[] {
98
+ return [...this.managedByWikiId.values()].map(({ status }) => ({ ...status }));
99
+ }
100
+
101
+ refresh(
102
+ roots: readonly ExternalWikiCollectionRoot[],
103
+ execution?: SearchExecutionOptions
104
+ ): Promise<ExternalWikiCollectionStatus[]> {
105
+ const snapshot = roots.map((root) => ({ ...root }));
106
+ return this.enqueueOperation(() => this.refreshSerial(snapshot, execution));
107
+ }
108
+
109
+ private async refreshSerial(
110
+ roots: readonly ExternalWikiCollectionRoot[],
111
+ execution?: SearchExecutionOptions
112
+ ): Promise<ExternalWikiCollectionStatus[]> {
113
+ const configuredWikiIds = new Set(roots.map((root) => root.id));
114
+ for (const [wikiId, managed] of this.managedByWikiId) {
115
+ if (!configuredWikiIds.has(wikiId)) {
116
+ if (!managed.managed) {
117
+ this.managedByWikiId.delete(wikiId);
118
+ continue;
119
+ }
120
+ try {
121
+ await this.removeManagedCollection(wikiId, managed, execution);
122
+ this.managedByWikiId.delete(wikiId);
123
+ } catch (error) {
124
+ this.rememberError(
125
+ wikiId,
126
+ managed.status.collection,
127
+ safeBackendError("External wiki collection removal failed", error)
128
+ );
129
+ }
130
+ }
131
+ }
132
+
133
+ const collectionOwnerByName = new Map<string, string>();
134
+ const collidingWikiIds = new Set<string>();
135
+ for (const root of roots) {
136
+ if (root.enabled === false || root.indexInQmd !== true) continue;
137
+ try {
138
+ const collection = externalWikiCollectionName(root.id);
139
+ const owner = collectionOwnerByName.get(collection);
140
+ if (owner) {
141
+ collidingWikiIds.add(owner);
142
+ collidingWikiIds.add(root.id);
143
+ } else {
144
+ collectionOwnerByName.set(collection, root.id);
145
+ }
146
+ } catch {
147
+ continue;
148
+ }
149
+ }
150
+
151
+ const statuses: ExternalWikiCollectionStatus[] = [];
152
+ for (const root of roots) {
153
+ if (collidingWikiIds.has(root.id)) {
154
+ statuses.push(
155
+ this.rememberError(
156
+ root.id,
157
+ externalWikiCollectionName(root.id),
158
+ "External wiki ids must not resolve to the same dedicated collection"
159
+ )
160
+ );
161
+ continue;
162
+ }
163
+ statuses.push(await this.refreshRoot(root, execution));
164
+ }
165
+ return statuses;
166
+ }
167
+
168
+ async search(
169
+ wikiId: string,
170
+ query: string,
171
+ limit: number,
172
+ execution?: SearchExecutionOptions
173
+ ): Promise<SearchResult[] | null> {
174
+ const managed = this.managedByWikiId.get(wikiId);
175
+ if (!managed || managed.status.state !== "healthy" || !managed.pagesDir) return null;
176
+
177
+ let degradationCode: string | null = null;
178
+ try {
179
+ const results = await this.backend.hybridSearch(query, managed.status.collection, limit, {
180
+ ...execution,
181
+ onDegradation: (detail) => {
182
+ degradationCode = detail.code;
183
+ execution?.onDegradation?.(detail);
184
+ },
185
+ });
186
+ if (degradationCode) {
187
+ managed.status = {
188
+ ...managed.status,
189
+ state: "error",
190
+ lastError: `External wiki collection search degraded (${degradationCode})`,
191
+ };
192
+ return null;
193
+ }
194
+ return results.filter((result) => isPageResult(result.path, managed.pagesDir!, managed.status.collection));
195
+ } catch (error) {
196
+ managed.status = {
197
+ ...managed.status,
198
+ state: "error",
199
+ lastError: safeBackendError("External wiki collection search failed", error),
200
+ };
201
+ return null;
202
+ }
203
+ }
204
+
205
+ purge(wikiId: string, execution?: SearchExecutionOptions): Promise<boolean> {
206
+ return this.enqueueOperation(async () => {
207
+ const collection = externalWikiCollectionName(wikiId);
208
+ this.assertDedicatedCollection(collection);
209
+ if (!this.backend.deleteCollection) return false;
210
+ const removed = await this.backend.deleteCollection(collection, execution);
211
+ this.managedByWikiId.delete(wikiId);
212
+ return removed;
213
+ });
214
+ }
215
+
216
+ private enqueueOperation<T>(operation: () => Promise<T>): Promise<T> {
217
+ const running = this.operationTail.then(operation);
218
+ this.operationTail = running.then(
219
+ () => undefined,
220
+ () => undefined
221
+ );
222
+ return running;
223
+ }
224
+
225
+ private async refreshRoot(
226
+ root: ExternalWikiCollectionRoot,
227
+ execution?: SearchExecutionOptions
228
+ ): Promise<ExternalWikiCollectionStatus> {
229
+ let collection: string;
230
+ try {
231
+ collection = externalWikiCollectionName(root.id);
232
+ this.assertDedicatedCollection(collection);
233
+ } catch (error) {
234
+ return this.rememberError(root.id, `${COLLECTION_PREFIX}invalid`, configError(error));
235
+ }
236
+
237
+ const prior = this.managedByWikiId.get(root.id);
238
+ if (root.enabled === false || root.indexInQmd !== true) {
239
+ if (prior?.managed) {
240
+ try {
241
+ await this.removeManagedCollection(root.id, prior, execution);
242
+ } catch (error) {
243
+ return this.rememberError(
244
+ root.id,
245
+ collection,
246
+ safeBackendError("External wiki collection removal failed", error)
247
+ );
248
+ }
249
+ }
250
+ return this.rememberDisabled(root.id, collection);
251
+ }
252
+
253
+ const dedicatedBackend = supportsExternalWikiCollections(this.backend) ? this.backend : null;
254
+ if (!dedicatedBackend) {
255
+ return this.rememberError(
256
+ root.id,
257
+ collection,
258
+ "Active search backend does not support dedicated external wiki collections"
259
+ );
260
+ }
261
+
262
+ let pagesDir: string;
263
+ let pages: PagesFingerprint;
264
+ try {
265
+ pagesDir = await resolvePagesDir(root);
266
+ pages = await fingerprintMarkdownPages(pagesDir);
267
+ } catch (error) {
268
+ return this.rememberError(root.id, collection, configError(error));
269
+ }
270
+
271
+ if (
272
+ prior?.managed &&
273
+ prior.status.state === "healthy" &&
274
+ prior.pagesDir === pagesDir &&
275
+ prior.fingerprint === pages.fingerprint
276
+ ) {
277
+ return { ...prior.status };
278
+ }
279
+
280
+ let rollbackCollection = false;
281
+ let managedAfterFailure = prior?.managed ?? false;
282
+ try {
283
+ let collectionState = await dedicatedBackend.ensureCollection(pagesDir, collection, execution);
284
+ if (collectionState !== "present") {
285
+ throw new Error(`Dedicated collection could not be prepared (${collectionState})`);
286
+ }
287
+ rollbackCollection = true;
288
+ managedAfterFailure = true;
289
+ let boundRoot = await dedicatedBackend.collectionRoot(collection, execution);
290
+ if (!boundRoot) {
291
+ throw new Error("Dedicated collection source root could not be verified");
292
+ }
293
+ if ((await realpath(boundRoot)) !== pagesDir) {
294
+ await dedicatedBackend.deleteCollection(collection, execution);
295
+ rollbackCollection = false;
296
+ managedAfterFailure = false;
297
+ collectionState = await dedicatedBackend.ensureCollection(pagesDir, collection, execution);
298
+ if (collectionState !== "present") {
299
+ throw new Error(`Dedicated collection could not be rebound (${collectionState})`);
300
+ }
301
+ rollbackCollection = true;
302
+ managedAfterFailure = true;
303
+ boundRoot = await dedicatedBackend.collectionRoot(collection, execution);
304
+ if (!boundRoot || (await realpath(boundRoot)) !== pagesDir) {
305
+ throw new Error("Dedicated collection source root did not match the configured pagesDir");
306
+ }
307
+ }
308
+ await dedicatedBackend.excludeCollectionFromGlobalSearch(collection, execution);
309
+ if (dedicatedBackend.updateCollectionFromDir) {
310
+ await dedicatedBackend.updateCollectionFromDir(collection, pagesDir, execution);
311
+ } else if (dedicatedBackend.updateCollectionStrict) {
312
+ await dedicatedBackend.updateCollectionStrict(collection, execution);
313
+ } else {
314
+ throw new Error("Active search backend cannot refresh a dedicated collection");
315
+ }
316
+ if (dedicatedBackend.embedCollectionStrict) {
317
+ await dedicatedBackend.embedCollectionStrict(collection);
318
+ } else {
319
+ await dedicatedBackend.embedCollection(collection);
320
+ }
321
+ const backendStatus = await dedicatedBackend.collectionStatus?.(collection);
322
+ const status: ExternalWikiCollectionStatus = {
323
+ wikiId: root.id,
324
+ collection,
325
+ state: "healthy",
326
+ documentCount: backendStatus?.totalFiles ?? pages.documentCount,
327
+ lastIndexedAt: this.now().toISOString(),
328
+ lastError: null,
329
+ };
330
+ this.managedByWikiId.set(root.id, {
331
+ status,
332
+ pagesDir,
333
+ fingerprint: pages.fingerprint,
334
+ managed: true,
335
+ });
336
+ return { ...status };
337
+ } catch (error) {
338
+ let cleanupError: unknown;
339
+ if (rollbackCollection) {
340
+ try {
341
+ await dedicatedBackend.deleteCollection(collection, execution);
342
+ managedAfterFailure = false;
343
+ } catch (rollbackError) {
344
+ cleanupError = rollbackError;
345
+ managedAfterFailure = true;
346
+ }
347
+ }
348
+ const refreshError = safeBackendError("External wiki collection refresh failed", error);
349
+ const lastError = cleanupError
350
+ ? `${refreshError}; ${safeBackendError("collection rollback failed", cleanupError)}`
351
+ : refreshError;
352
+ const status = this.rememberError(root.id, collection, lastError);
353
+ const failed = this.managedByWikiId.get(root.id);
354
+ if (failed) {
355
+ this.managedByWikiId.set(root.id, {
356
+ ...failed,
357
+ pagesDir: managedAfterFailure ? (prior?.pagesDir ?? pagesDir) : null,
358
+ fingerprint: managedAfterFailure ? prior?.fingerprint ?? null : null,
359
+ managed: managedAfterFailure,
360
+ });
361
+ }
362
+ return status;
363
+ }
364
+ }
365
+
366
+ private assertDedicatedCollection(collection: string): void {
367
+ if (collection === this.defaultCollection || !collection.startsWith(COLLECTION_PREFIX)) {
368
+ throw new Error("External wiki collection must not target the default memory collection");
369
+ }
370
+ }
371
+
372
+ private rememberDisabled(wikiId: string, collection: string): ExternalWikiCollectionStatus {
373
+ const status: ExternalWikiCollectionStatus = {
374
+ wikiId,
375
+ collection,
376
+ state: "disabled",
377
+ documentCount: null,
378
+ lastIndexedAt: null,
379
+ lastError: null,
380
+ };
381
+ this.managedByWikiId.set(wikiId, { status, pagesDir: null, fingerprint: null, managed: false });
382
+ return { ...status };
383
+ }
384
+
385
+ private rememberError(wikiId: string, collection: string, lastError: string): ExternalWikiCollectionStatus {
386
+ const prior = this.managedByWikiId.get(wikiId);
387
+ const status: ExternalWikiCollectionStatus = {
388
+ wikiId,
389
+ collection,
390
+ state: "error",
391
+ documentCount: prior?.status.documentCount ?? null,
392
+ lastIndexedAt: prior?.status.lastIndexedAt ?? null,
393
+ lastError,
394
+ };
395
+ this.managedByWikiId.set(wikiId, {
396
+ status,
397
+ pagesDir: prior?.pagesDir ?? null,
398
+ fingerprint: prior?.fingerprint ?? null,
399
+ managed: prior?.managed ?? false,
400
+ });
401
+ return { ...status };
402
+ }
403
+
404
+ private async removeManagedCollection(
405
+ wikiId: string,
406
+ managed: ManagedWikiCollection,
407
+ execution?: SearchExecutionOptions
408
+ ): Promise<void> {
409
+ if (!this.backend.deleteCollection) {
410
+ throw new Error("Active search backend cannot delete a dedicated collection; use a backend purge command");
411
+ }
412
+ await this.backend.deleteCollection(managed.status.collection, execution);
413
+ this.managedByWikiId.set(wikiId, {
414
+ status: managed.status,
415
+ pagesDir: null,
416
+ fingerprint: null,
417
+ managed: false,
418
+ });
419
+ }
420
+ }
421
+
422
+ async function resolvePagesDir(root: ExternalWikiCollectionRoot): Promise<string> {
423
+ const lexicalRootDir = path.resolve(root.rootDir);
424
+ const lexicalPagesDir = path.resolve(lexicalRootDir, root.pagesDir ?? "wiki");
425
+ const lexicalRelative = path.relative(lexicalRootDir, lexicalPagesDir);
426
+ if (!lexicalRelative || lexicalRelative.startsWith("..") || path.isAbsolute(lexicalRelative)) {
427
+ throw new Error("External wiki pagesDir must stay inside the configured rootDir");
428
+ }
429
+ const [rootDir, pagesDir] = await Promise.all([realpath(lexicalRootDir), realpath(lexicalPagesDir)]);
430
+ const canonicalRelative = path.relative(rootDir, pagesDir);
431
+ if (!canonicalRelative || canonicalRelative.startsWith("..") || path.isAbsolute(canonicalRelative)) {
432
+ throw new Error("External wiki pagesDir must stay inside the configured rootDir");
433
+ }
434
+ return pagesDir;
435
+ }
436
+
437
+ async function fingerprintMarkdownPages(pagesDir: string): Promise<PagesFingerprint> {
438
+ const markdownPaths: string[] = [];
439
+ const pending = [pagesDir];
440
+ while (pending.length > 0) {
441
+ const directory = pending.pop()!;
442
+ const entries = await readdir(directory, { withFileTypes: true });
443
+ for (const entry of entries) {
444
+ const entryPath = path.join(directory, entry.name);
445
+ if (entry.isDirectory()) {
446
+ pending.push(entryPath);
447
+ } else if (entry.isSymbolicLink()) {
448
+ throw new Error("External wiki pagesDir must not contain symbolic links");
449
+ } else if (entry.isFile() && entry.name.toLowerCase().endsWith(".md")) {
450
+ markdownPaths.push(entryPath);
451
+ }
452
+ }
453
+ }
454
+ markdownPaths.sort();
455
+ const fingerprint = createHash("sha256");
456
+ for (const markdownPath of markdownPaths) {
457
+ fingerprint.update(path.relative(pagesDir, markdownPath));
458
+ fingerprint.update("\0");
459
+ for await (const chunk of createReadStream(markdownPath)) {
460
+ fingerprint.update(chunk);
461
+ }
462
+ fingerprint.update("\0");
463
+ }
464
+ return {
465
+ fingerprint: fingerprint.digest("hex"),
466
+ documentCount: markdownPaths.length,
467
+ };
468
+ }
469
+
470
+ function isPageResult(resultPath: string, pagesDir: string, collection: string): boolean {
471
+ let candidate = resultPath;
472
+ const qmdPrefix = `qmd://${collection}/`;
473
+ if (candidate.startsWith(qmdPrefix)) candidate = candidate.slice(qmdPrefix.length);
474
+ const resolved = path.isAbsolute(candidate) ? path.resolve(candidate) : path.resolve(pagesDir, candidate);
475
+ const relative = path.relative(pagesDir, resolved);
476
+ return (
477
+ Boolean(relative) &&
478
+ !relative.startsWith("..") &&
479
+ !path.isAbsolute(relative) &&
480
+ resolved.toLowerCase().endsWith(".md")
481
+ );
482
+ }
483
+
484
+ function configError(error: unknown): string {
485
+ if (error instanceof Error && error.message.startsWith("External wiki")) {
486
+ return error.message;
487
+ }
488
+ const code = typeof error === "object" && error !== null && "code" in error ? String(error.code) : null;
489
+ return code
490
+ ? `External wiki pages directory could not be scanned (${code})`
491
+ : "Invalid external wiki collection configuration";
492
+ }
493
+
494
+ function safeBackendError(prefix: string, error: unknown): string {
495
+ if (error instanceof Error && error.message.startsWith("Dedicated collection")) {
496
+ return error.message;
497
+ }
498
+ if (error instanceof Error && error.message.startsWith("Active search backend")) {
499
+ return error.message;
500
+ }
501
+ const name = error instanceof Error && error.name ? error.name : "Error";
502
+ return `${prefix} (${name})`;
503
+ }
@@ -0,0 +1,135 @@
1
+ import assert from "node:assert/strict";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import test from "node:test";
5
+ import { parseConfig } from "./config.js";
6
+
7
+ test("externalWikis applies safe read-only defaults and expands the root directory", () => {
8
+ const config = parseConfig({
9
+ externalWikis: [{ id: "reading", rootDir: "~/knowledge" }],
10
+ });
11
+
12
+ assert.deepEqual(config.externalWikis, [
13
+ {
14
+ id: "reading",
15
+ rootDir: path.join(os.homedir(), "knowledge"),
16
+ enabled: true,
17
+ pagesDir: "wiki",
18
+ indexFile: "INDEX.md",
19
+ indexInQmd: false,
20
+ includeInDefaultRecall: false,
21
+ },
22
+ ]);
23
+ });
24
+
25
+ test("externalWikis preserves explicit labels, paths, and opt-in indexing", () => {
26
+ const config = parseConfig({
27
+ externalWikis: [
28
+ {
29
+ id: "operations",
30
+ rootDir: "/srv/operations-wiki",
31
+ enabled: false,
32
+ label: "Operations handbook",
33
+ pagesDir: "pages",
34
+ indexFile: "CATALOG.md",
35
+ indexInQmd: true,
36
+ },
37
+ ],
38
+ });
39
+
40
+ assert.deepEqual(config.externalWikis, [
41
+ {
42
+ id: "operations",
43
+ rootDir: "/srv/operations-wiki",
44
+ enabled: false,
45
+ label: "Operations handbook",
46
+ pagesDir: "pages",
47
+ indexFile: "CATALOG.md",
48
+ indexInQmd: true,
49
+ includeInDefaultRecall: false,
50
+ },
51
+ ]);
52
+ });
53
+
54
+ test("externalWikis rejects default-recall inclusion", () => {
55
+ assert.throws(
56
+ () =>
57
+ parseConfig({
58
+ externalWikis: [
59
+ {
60
+ id: "reading",
61
+ rootDir: "/srv/reading-wiki",
62
+ includeInDefaultRecall: true,
63
+ },
64
+ ],
65
+ }),
66
+ /externalWikis\[0\]\.includeInDefaultRecall=true is not supported/
67
+ );
68
+ });
69
+
70
+ test("externalWikis rejects ambiguous or escaping layouts", () => {
71
+ assert.throws(
72
+ () => parseConfig({ externalWikis: [{ id: "reading", rootDir: "relative/wiki" }] }),
73
+ /rootDir must be an absolute path or start with ~\//
74
+ );
75
+ assert.throws(
76
+ () =>
77
+ parseConfig({
78
+ externalWikis: [{ id: "reading", rootDir: "/srv/wiki", pagesDir: "../other" }],
79
+ }),
80
+ /pagesDir must be a relative path within rootDir/
81
+ );
82
+ assert.throws(
83
+ () =>
84
+ parseConfig({
85
+ externalWikis: [
86
+ { id: "reading", rootDir: "/srv/a" },
87
+ { id: "reading", rootDir: "/srv/b" },
88
+ ],
89
+ }),
90
+ /duplicate id "reading"/
91
+ );
92
+ });
93
+
94
+ test("externalWikis rejects malformed values and non-portable relative paths", () => {
95
+ assert.throws(() => parseConfig({ externalWikis: {} }), /externalWikis must be an array/);
96
+ assert.throws(
97
+ () =>
98
+ parseConfig({
99
+ externalWikis: [{ id: "Reading Wiki", rootDir: "/srv/wiki" }],
100
+ }),
101
+ /externalWikis\[0\]\.id must match/
102
+ );
103
+ assert.throws(
104
+ () =>
105
+ parseConfig({
106
+ externalWikis: [{ id: "reading", rootDir: "/srv/wiki", enabled: "false" }],
107
+ }),
108
+ /externalWikis\[0\]\.enabled must be a boolean/
109
+ );
110
+ assert.throws(
111
+ () =>
112
+ parseConfig({
113
+ externalWikis: [{ id: "reading", rootDir: "/srv/wiki", pagesDir: "nested\\wiki" }],
114
+ }),
115
+ /pagesDir must use POSIX separators/
116
+ );
117
+ assert.throws(
118
+ () =>
119
+ parseConfig({
120
+ externalWikis: [{ id: "reading", rootDir: "/srv/wiki", indexFile: "/tmp/INDEX.md" }],
121
+ }),
122
+ /indexFile must be a relative path within rootDir/
123
+ );
124
+ });
125
+
126
+ test("externalWikis rejects roots inside the primary memory directory", () => {
127
+ assert.throws(
128
+ () =>
129
+ parseConfig({
130
+ memoryDir: "/srv/remnic/memory",
131
+ externalWikis: [{ id: "reading", rootDir: "/srv/remnic/memory/external/reading" }],
132
+ }),
133
+ /rootDir must be outside memoryDir/
134
+ );
135
+ });