@remnic/core 9.69.75 → 9.69.77

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 (324) hide show
  1. package/dist/access-admin-ops-surface.js +45 -45
  2. package/dist/access-authorization-probe.js +46 -46
  3. package/dist/access-boundary.js +45 -45
  4. package/dist/access-cli.js +113 -113
  5. package/dist/access-extraction-force-flush.js +45 -45
  6. package/dist/access-http-briefing.js +46 -46
  7. package/dist/access-http-query.js +47 -47
  8. package/dist/access-http.js +65 -65
  9. package/dist/access-identity-continuity-surface.js +45 -45
  10. package/dist/access-lcm-surface.js +45 -45
  11. package/dist/access-mcp.js +55 -55
  12. package/dist/access-namespace-preflight.js +45 -45
  13. package/dist/access-observe-write-category.js +8 -8
  14. package/dist/access-observe-write-surface.js +45 -45
  15. package/dist/access-offline-manifest.js +5 -5
  16. package/dist/access-operations-batch.js +46 -46
  17. package/dist/access-operations.js +53 -53
  18. package/dist/access-recall-concurrency.js +45 -45
  19. package/dist/access-recall-diagnostics.js +2 -2
  20. package/dist/access-recall-response.js +45 -45
  21. package/dist/access-recall-surface.js +45 -45
  22. package/dist/access-schema.js +5 -5
  23. package/dist/access-service.js +45 -45
  24. package/dist/access-surface-catalog.js +47 -47
  25. package/dist/active-recall.js +15 -14
  26. package/dist/active-recall.js.map +1 -1
  27. package/dist/adapters/index.js +4 -4
  28. package/dist/adapters/registry.js +2 -2
  29. package/dist/{auto-sync-QJNIKZHV.js → auto-sync-WEUDMXUW.js} +4 -4
  30. package/dist/briefing-followup-timeout.d.ts +3 -0
  31. package/dist/briefing-followup-timeout.d.ts.map +1 -0
  32. package/dist/briefing-followup-timeout.js +10 -0
  33. package/dist/briefing.d.ts.map +1 -1
  34. package/dist/briefing.js +12 -10
  35. package/dist/buffer.js +6 -6
  36. package/dist/{capsule-crypto-YO5QJ6L3.js → capsule-crypto-GWVG7LGC.js} +2 -2
  37. package/dist/capsule-crypto-GWVG7LGC.js.map +1 -0
  38. package/dist/causal-consolidation.js +12 -11
  39. package/dist/causal-consolidation.js.map +1 -1
  40. package/dist/{chunk-O4QH33GV.js → chunk-2CH6MMO2.js} +6 -6
  41. package/dist/{chunk-VXNWOHOR.js → chunk-2GKLHU2D.js} +2 -2
  42. package/dist/{chunk-MB3HMRXM.js → chunk-2I6VHX6Q.js} +2 -2
  43. package/dist/{chunk-LVFI5LG7.js → chunk-2L5FSNPC.js} +5 -5
  44. package/dist/{chunk-U3NBO4IX.js → chunk-345MEMRU.js} +132 -37
  45. package/dist/chunk-345MEMRU.js.map +1 -0
  46. package/dist/{chunk-6BSPRNFF.js → chunk-3AGCSD42.js} +2 -2
  47. package/dist/{chunk-IGSVMAPQ.js → chunk-3K3PITOE.js} +2 -2
  48. package/dist/{chunk-ZUT4FK5W.js → chunk-5ELENZTA.js} +2 -2
  49. package/dist/{chunk-NF6LF76X.js → chunk-5X7ZTLFS.js} +2 -2
  50. package/dist/{chunk-S52VKUUW.js → chunk-6DTJBTHL.js} +3 -3
  51. package/dist/{chunk-LH6UP5SR.js → chunk-6MJGDUC7.js} +3 -3
  52. package/dist/{chunk-YYRMOMX3.js → chunk-7DZHRPCO.js} +2 -2
  53. package/dist/{chunk-SB4ZWVKI.js → chunk-7G6WUOLB.js} +4 -6
  54. package/dist/{chunk-SB4ZWVKI.js.map → chunk-7G6WUOLB.js.map} +1 -1
  55. package/dist/{chunk-LDOURFFA.js → chunk-7QXTCONH.js} +2 -2
  56. package/dist/{chunk-HPK66ZM5.js → chunk-7WO66MKJ.js} +2 -2
  57. package/dist/{chunk-ODP62HIA.js → chunk-A2XDQ3JW.js} +2 -2
  58. package/dist/{chunk-TY5JOP2W.js → chunk-ALOMLIRC.js} +84 -69
  59. package/dist/chunk-ALOMLIRC.js.map +1 -0
  60. package/dist/{chunk-MSRNAAWW.js → chunk-AVO2CBIL.js} +2 -2
  61. package/dist/{chunk-B5EZWPSM.js → chunk-AZ2X5LNA.js} +2 -2
  62. package/dist/{chunk-3NTVCMDD.js → chunk-B3OFQP5Y.js} +2 -2
  63. package/dist/chunk-B3OFQP5Y.js.map +1 -0
  64. package/dist/{chunk-IGEZE6QB.js → chunk-BMYZTZ5D.js} +4 -4
  65. package/dist/{chunk-XDOXR3U6.js → chunk-BNPLDVM6.js} +2 -2
  66. package/dist/{chunk-7JFQI6DQ.js → chunk-BOUFVFV2.js} +2 -2
  67. package/dist/{chunk-VDX2J7OX.js → chunk-BUKK5SWA.js} +2 -2
  68. package/dist/{chunk-KMHE76A2.js → chunk-CDEI5S5W.js} +2 -2
  69. package/dist/{chunk-UJX4I26O.js → chunk-CLSYE5OZ.js} +2 -2
  70. package/dist/{chunk-WDBKDYK2.js → chunk-CYCE3L2I.js} +46 -46
  71. package/dist/{chunk-GZBNEZIU.js → chunk-DBYAY6UW.js} +3 -3
  72. package/dist/{chunk-HZDOLAZV.js → chunk-DCPAAAIC.js} +2 -2
  73. package/dist/{chunk-6JA22L5X.js → chunk-DSQWTXHP.js} +8 -8
  74. package/dist/{chunk-WQC54W25.js → chunk-EJPF6XDQ.js} +2 -2
  75. package/dist/{chunk-CGO3A7SR.js → chunk-EVBI7S4J.js} +3 -3
  76. package/dist/{chunk-OB2YI57R.js → chunk-FMT52ROU.js} +43 -43
  77. package/dist/{chunk-62AE2EUZ.js → chunk-FVK5NQ3V.js} +2 -2
  78. package/dist/{chunk-3SL52JKD.js → chunk-FZVROZKC.js} +5 -5
  79. package/dist/{chunk-ZVTG7JTG.js → chunk-GARVFCV6.js} +2 -2
  80. package/dist/{chunk-Y52T5Y6B.js → chunk-GATQP7CE.js} +2 -2
  81. package/dist/{chunk-7COBZFUF.js → chunk-GXQ5GDUH.js} +2 -2
  82. package/dist/chunk-GZFKCLRC.js +17 -0
  83. package/dist/chunk-GZFKCLRC.js.map +1 -0
  84. package/dist/{chunk-VVX5PZFS.js → chunk-H36X4NRH.js} +2 -2
  85. package/dist/{chunk-2VH2JWYN.js → chunk-I4G4UWQA.js} +2 -2
  86. package/dist/{chunk-6OACG7JV.js → chunk-IBGEHKQ6.js} +3 -3
  87. package/dist/{chunk-BXCZPPRO.js → chunk-IILMR37Z.js} +16 -16
  88. package/dist/{chunk-X2PBZOYZ.js → chunk-IP5VLSLO.js} +2 -2
  89. package/dist/{chunk-IXLHREAB.js → chunk-IVH7INFM.js} +3 -3
  90. package/dist/{chunk-D4SPMHEW.js → chunk-JLPNONPH.js} +2 -2
  91. package/dist/{chunk-AEGQ5PJ7.js → chunk-JX6USXZR.js} +2 -2
  92. package/dist/{chunk-SA2JMMMS.js → chunk-K2SXIWEV.js} +2 -2
  93. package/dist/{chunk-VEBYLZQQ.js → chunk-KN6CIN7I.js} +2 -2
  94. package/dist/{chunk-WZKKI6S2.js → chunk-LEP46X5Y.js} +2 -2
  95. package/dist/{chunk-5UBH37SL.js → chunk-LI76ESJL.js} +4 -4
  96. package/dist/{chunk-AQJBFLUA.js → chunk-LZLJK2IA.js} +5 -5
  97. package/dist/{chunk-5LWVTSF7.js → chunk-MOQPEFLN.js} +4 -4
  98. package/dist/{chunk-6BFW7SGF.js → chunk-MQQPONTM.js} +2 -2
  99. package/dist/{chunk-5KNEOYTF.js → chunk-NGFRFDSK.js} +2 -2
  100. package/dist/{chunk-B6PY25JB.js → chunk-NHV6WCM5.js} +1 -1
  101. package/dist/{chunk-S5FWSNLI.js → chunk-NYZRJW5X.js} +2 -2
  102. package/dist/{chunk-JOMGKV72.js → chunk-OHRIBMSS.js} +2 -2
  103. package/dist/{chunk-YMSPN4W4.js → chunk-OJ3TV57W.js} +12 -7
  104. package/dist/chunk-OJ3TV57W.js.map +1 -0
  105. package/dist/{chunk-BXLOS5AJ.js → chunk-OWHERGF2.js} +2 -2
  106. package/dist/{chunk-F5O6WEDO.js → chunk-PWF4JXKD.js} +1 -1
  107. package/dist/chunk-PWF4JXKD.js.map +1 -0
  108. package/dist/{chunk-KPSJA45G.js → chunk-QIDMGBUY.js} +2 -2
  109. package/dist/{chunk-MKNENZCK.js → chunk-QJAGDPY7.js} +3 -3
  110. package/dist/{chunk-VIRTAUJO.js → chunk-RDUM6BKQ.js} +2 -2
  111. package/dist/{chunk-I6Y6QKWF.js → chunk-RGX4DGOG.js} +2 -2
  112. package/dist/{chunk-OMYCECTS.js → chunk-RJLV4BKR.js} +2 -2
  113. package/dist/{chunk-LBL77UXO.js → chunk-RKTT72XV.js} +4 -4
  114. package/dist/{chunk-AWEMJYN2.js → chunk-RMG22TH2.js} +2 -2
  115. package/dist/{chunk-GH5YSAAI.js → chunk-RRMIACBG.js} +11 -10
  116. package/dist/chunk-RRMIACBG.js.map +1 -0
  117. package/dist/{chunk-4GPI3GVE.js → chunk-SLEAJ67D.js} +5 -5
  118. package/dist/{chunk-YR6A6ZK7.js → chunk-SSUDD72S.js} +2 -2
  119. package/dist/{chunk-WDP7CJZQ.js → chunk-SUSMEKBE.js} +4 -4
  120. package/dist/{chunk-YZENVZWY.js → chunk-TY446V34.js} +2 -2
  121. package/dist/{chunk-PIG4WJFQ.js → chunk-UHESJ6TQ.js} +2 -2
  122. package/dist/{chunk-PIG4WJFQ.js.map → chunk-UHESJ6TQ.js.map} +1 -1
  123. package/dist/{chunk-YCYFXA6P.js → chunk-UKB7ZDKK.js} +2 -2
  124. package/dist/{chunk-DQEMWVMT.js → chunk-UVYI6VIX.js} +1 -1
  125. package/dist/{chunk-YF3JERFZ.js → chunk-VL4X7ZHC.js} +2 -2
  126. package/dist/{chunk-COHJUEBQ.js → chunk-WGXWZE3K.js} +2 -2
  127. package/dist/{chunk-ZHOXXHT5.js → chunk-WQZZDN5M.js} +4 -4
  128. package/dist/{chunk-25LKLNSJ.js → chunk-X33QB7LW.js} +2 -2
  129. package/dist/{chunk-JDES3G7T.js → chunk-X3NZ2HAO.js} +2 -2
  130. package/dist/{chunk-Q4AUIFUA.js → chunk-XAITGGX5.js} +4 -4
  131. package/dist/{chunk-5HP5F2SQ.js → chunk-XNYTMLPS.js} +3 -3
  132. package/dist/{chunk-UFBHEMNR.js → chunk-YL273SOF.js} +2 -2
  133. package/dist/{chunk-ZPED47SP.js → chunk-YUAOU2B2.js} +19 -25
  134. package/dist/chunk-YUAOU2B2.js.map +1 -0
  135. package/dist/{chunk-GFD7TWAZ.js → chunk-ZWWF7PI5.js} +4 -4
  136. package/dist/{chunk-5LPDXYU3.js → chunk-ZYBLNHUB.js} +5 -5
  137. package/dist/cli.js +85 -85
  138. package/dist/coding/export-okf-codegraph.js +11 -10
  139. package/dist/coding/export-okf-codegraph.js.map +1 -1
  140. package/dist/compounding/engine.js +11 -10
  141. package/dist/config-qmd.js +1 -1
  142. package/dist/config.d.ts.map +1 -1
  143. package/dist/config.js +15 -14
  144. package/dist/connectors/codex-materialize-runner.js +11 -10
  145. package/dist/connectors/index.js +11 -10
  146. package/dist/convergence-refresh.js +13 -13
  147. package/dist/corpus-watermark.js +13 -12
  148. package/dist/deep-recall-http-glue.js +6 -6
  149. package/dist/directory-sidecars.d.ts +3 -0
  150. package/dist/directory-sidecars.d.ts.map +1 -1
  151. package/dist/directory-sidecars.js +7 -4
  152. package/dist/entity-retrieval.js +11 -10
  153. package/dist/external-wiki-access.js +46 -46
  154. package/dist/extraction-span-materialize.js +2 -2
  155. package/dist/extraction.js +19 -19
  156. package/dist/{first-start-migration-7OATHJKB.js → first-start-migration-GAT7G733.js} +4 -4
  157. package/dist/harmonic-retrieval.js +1 -1
  158. package/dist/index.js +171 -171
  159. package/dist/lcm/engine.js +2 -2
  160. package/dist/lcm/index.js +5 -5
  161. package/dist/location/index.js +14 -14
  162. package/dist/maintenance/memory-governance.js +11 -10
  163. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +11 -11
  164. package/dist/maintenance/rebuild-memory-projection.js +12 -12
  165. package/dist/memory-browse-operations.js +46 -46
  166. package/dist/memory-browse.js +5 -6
  167. package/dist/namespaces/migrate.js +12 -11
  168. package/dist/namespaces/search.js +5 -5
  169. package/dist/namespaces/storage.js +11 -10
  170. package/dist/offline-sync-impression-drain.js +2 -2
  171. package/dist/offline-sync.js +2 -2
  172. package/dist/operator-doctor-corpus.js +14 -13
  173. package/dist/operator-toolkit.js +24 -23
  174. package/dist/orchestration/maintenance.js +20 -20
  175. package/dist/orchestration/recall-recognition-search.d.ts +1 -0
  176. package/dist/orchestration/recall-recognition-search.d.ts.map +1 -1
  177. package/dist/orchestration/recall-search-pipeline.d.ts.map +1 -1
  178. package/dist/orchestrator.d.ts.map +1 -1
  179. package/dist/orchestrator.js +114 -114
  180. package/dist/qmd.d.ts +1 -1
  181. package/dist/qmd.d.ts.map +1 -1
  182. package/dist/qmd.js +1 -1
  183. package/dist/recall-explain-renderer.js +3 -3
  184. package/dist/recall-navigate-access.js +2 -2
  185. package/dist/recall-navigate-disclosure.js +2 -2
  186. package/dist/recall-navigate.js +2 -2
  187. package/dist/recall-navigation-operations.js +46 -46
  188. package/dist/recall-navigation.js +45 -45
  189. package/dist/recall-state-view-admission.js +5 -6
  190. package/dist/recall-state.js +2 -2
  191. package/dist/recall-why-service.js +5 -6
  192. package/dist/recall-xray-cli.js +4 -4
  193. package/dist/recall-xray-renderer.js +3 -3
  194. package/dist/recall-xray.js +2 -2
  195. package/dist/resume-bundles.js +16 -15
  196. package/dist/search/factory.js +4 -4
  197. package/dist/search/index.js +8 -8
  198. package/dist/semantic-consolidation.js +12 -11
  199. package/dist/semantic-rule-promotion.js +11 -10
  200. package/dist/semantic-rule-verifier.js +11 -10
  201. package/dist/source-agent-qualifier.js +15 -15
  202. package/dist/standup/build.js +11 -10
  203. package/dist/storage.d.ts +1 -19
  204. package/dist/storage.d.ts.map +1 -1
  205. package/dist/storage.js +10 -9
  206. package/dist/support-passport/index.js +48 -48
  207. package/dist/transfer/backup.js +2 -2
  208. package/dist/transfer/capsule-export.js +2 -2
  209. package/dist/transfer/capsule-import.js +2 -2
  210. package/dist/transfer/export-okf.js +12 -11
  211. package/dist/types.d.ts +3 -3
  212. package/dist/types.d.ts.map +1 -1
  213. package/dist/types.js +1 -1
  214. package/dist/verified-recall.js +11 -10
  215. package/dist/who-knows-cli.js +12 -11
  216. package/dist/who-knows.js +11 -10
  217. package/package.json +2 -2
  218. package/src/briefing-followup-timeout.test.ts +15 -0
  219. package/src/briefing-followup-timeout.ts +14 -0
  220. package/src/briefing.ts +8 -9
  221. package/src/config-qmd.ts +1 -1
  222. package/src/config.test.ts +2 -2
  223. package/src/config.ts +3 -4
  224. package/src/directory-sidecars-config.test.ts +34 -0
  225. package/src/directory-sidecars.test.ts +36 -1
  226. package/src/directory-sidecars.ts +41 -7
  227. package/src/orchestration/recall-internal.ts +1 -1
  228. package/src/orchestration/recall-recognition-search.test.ts +8 -0
  229. package/src/orchestration/recall-recognition-search.ts +5 -1
  230. package/src/orchestration/recall-search-pipeline.ts +5 -7
  231. package/src/orchestrator.ts +8 -0
  232. package/src/qmd.ts +4 -4
  233. package/src/recall-budget-config.test.ts +1 -1
  234. package/src/storage.ts +13 -22
  235. package/src/types.ts +3 -3
  236. package/dist/chunk-3NTVCMDD.js.map +0 -1
  237. package/dist/chunk-F5O6WEDO.js.map +0 -1
  238. package/dist/chunk-GH5YSAAI.js.map +0 -1
  239. package/dist/chunk-PCEYGOSL.js +0 -66
  240. package/dist/chunk-PCEYGOSL.js.map +0 -1
  241. package/dist/chunk-TY5JOP2W.js.map +0 -1
  242. package/dist/chunk-U3NBO4IX.js.map +0 -1
  243. package/dist/chunk-YMSPN4W4.js.map +0 -1
  244. package/dist/chunk-ZPED47SP.js.map +0 -1
  245. /package/dist/{auto-sync-QJNIKZHV.js.map → auto-sync-WEUDMXUW.js.map} +0 -0
  246. /package/dist/{capsule-crypto-YO5QJ6L3.js.map → briefing-followup-timeout.js.map} +0 -0
  247. /package/dist/{chunk-O4QH33GV.js.map → chunk-2CH6MMO2.js.map} +0 -0
  248. /package/dist/{chunk-VXNWOHOR.js.map → chunk-2GKLHU2D.js.map} +0 -0
  249. /package/dist/{chunk-MB3HMRXM.js.map → chunk-2I6VHX6Q.js.map} +0 -0
  250. /package/dist/{chunk-LVFI5LG7.js.map → chunk-2L5FSNPC.js.map} +0 -0
  251. /package/dist/{chunk-6BSPRNFF.js.map → chunk-3AGCSD42.js.map} +0 -0
  252. /package/dist/{chunk-IGSVMAPQ.js.map → chunk-3K3PITOE.js.map} +0 -0
  253. /package/dist/{chunk-ZUT4FK5W.js.map → chunk-5ELENZTA.js.map} +0 -0
  254. /package/dist/{chunk-NF6LF76X.js.map → chunk-5X7ZTLFS.js.map} +0 -0
  255. /package/dist/{chunk-S52VKUUW.js.map → chunk-6DTJBTHL.js.map} +0 -0
  256. /package/dist/{chunk-LH6UP5SR.js.map → chunk-6MJGDUC7.js.map} +0 -0
  257. /package/dist/{chunk-YYRMOMX3.js.map → chunk-7DZHRPCO.js.map} +0 -0
  258. /package/dist/{chunk-LDOURFFA.js.map → chunk-7QXTCONH.js.map} +0 -0
  259. /package/dist/{chunk-HPK66ZM5.js.map → chunk-7WO66MKJ.js.map} +0 -0
  260. /package/dist/{chunk-ODP62HIA.js.map → chunk-A2XDQ3JW.js.map} +0 -0
  261. /package/dist/{chunk-MSRNAAWW.js.map → chunk-AVO2CBIL.js.map} +0 -0
  262. /package/dist/{chunk-B5EZWPSM.js.map → chunk-AZ2X5LNA.js.map} +0 -0
  263. /package/dist/{chunk-IGEZE6QB.js.map → chunk-BMYZTZ5D.js.map} +0 -0
  264. /package/dist/{chunk-XDOXR3U6.js.map → chunk-BNPLDVM6.js.map} +0 -0
  265. /package/dist/{chunk-7JFQI6DQ.js.map → chunk-BOUFVFV2.js.map} +0 -0
  266. /package/dist/{chunk-VDX2J7OX.js.map → chunk-BUKK5SWA.js.map} +0 -0
  267. /package/dist/{chunk-KMHE76A2.js.map → chunk-CDEI5S5W.js.map} +0 -0
  268. /package/dist/{chunk-UJX4I26O.js.map → chunk-CLSYE5OZ.js.map} +0 -0
  269. /package/dist/{chunk-WDBKDYK2.js.map → chunk-CYCE3L2I.js.map} +0 -0
  270. /package/dist/{chunk-GZBNEZIU.js.map → chunk-DBYAY6UW.js.map} +0 -0
  271. /package/dist/{chunk-HZDOLAZV.js.map → chunk-DCPAAAIC.js.map} +0 -0
  272. /package/dist/{chunk-6JA22L5X.js.map → chunk-DSQWTXHP.js.map} +0 -0
  273. /package/dist/{chunk-WQC54W25.js.map → chunk-EJPF6XDQ.js.map} +0 -0
  274. /package/dist/{chunk-CGO3A7SR.js.map → chunk-EVBI7S4J.js.map} +0 -0
  275. /package/dist/{chunk-OB2YI57R.js.map → chunk-FMT52ROU.js.map} +0 -0
  276. /package/dist/{chunk-62AE2EUZ.js.map → chunk-FVK5NQ3V.js.map} +0 -0
  277. /package/dist/{chunk-3SL52JKD.js.map → chunk-FZVROZKC.js.map} +0 -0
  278. /package/dist/{chunk-ZVTG7JTG.js.map → chunk-GARVFCV6.js.map} +0 -0
  279. /package/dist/{chunk-Y52T5Y6B.js.map → chunk-GATQP7CE.js.map} +0 -0
  280. /package/dist/{chunk-7COBZFUF.js.map → chunk-GXQ5GDUH.js.map} +0 -0
  281. /package/dist/{chunk-VVX5PZFS.js.map → chunk-H36X4NRH.js.map} +0 -0
  282. /package/dist/{chunk-2VH2JWYN.js.map → chunk-I4G4UWQA.js.map} +0 -0
  283. /package/dist/{chunk-6OACG7JV.js.map → chunk-IBGEHKQ6.js.map} +0 -0
  284. /package/dist/{chunk-BXCZPPRO.js.map → chunk-IILMR37Z.js.map} +0 -0
  285. /package/dist/{chunk-X2PBZOYZ.js.map → chunk-IP5VLSLO.js.map} +0 -0
  286. /package/dist/{chunk-IXLHREAB.js.map → chunk-IVH7INFM.js.map} +0 -0
  287. /package/dist/{chunk-D4SPMHEW.js.map → chunk-JLPNONPH.js.map} +0 -0
  288. /package/dist/{chunk-AEGQ5PJ7.js.map → chunk-JX6USXZR.js.map} +0 -0
  289. /package/dist/{chunk-SA2JMMMS.js.map → chunk-K2SXIWEV.js.map} +0 -0
  290. /package/dist/{chunk-VEBYLZQQ.js.map → chunk-KN6CIN7I.js.map} +0 -0
  291. /package/dist/{chunk-WZKKI6S2.js.map → chunk-LEP46X5Y.js.map} +0 -0
  292. /package/dist/{chunk-5UBH37SL.js.map → chunk-LI76ESJL.js.map} +0 -0
  293. /package/dist/{chunk-AQJBFLUA.js.map → chunk-LZLJK2IA.js.map} +0 -0
  294. /package/dist/{chunk-5LWVTSF7.js.map → chunk-MOQPEFLN.js.map} +0 -0
  295. /package/dist/{chunk-6BFW7SGF.js.map → chunk-MQQPONTM.js.map} +0 -0
  296. /package/dist/{chunk-5KNEOYTF.js.map → chunk-NGFRFDSK.js.map} +0 -0
  297. /package/dist/{chunk-B6PY25JB.js.map → chunk-NHV6WCM5.js.map} +0 -0
  298. /package/dist/{chunk-S5FWSNLI.js.map → chunk-NYZRJW5X.js.map} +0 -0
  299. /package/dist/{chunk-JOMGKV72.js.map → chunk-OHRIBMSS.js.map} +0 -0
  300. /package/dist/{chunk-BXLOS5AJ.js.map → chunk-OWHERGF2.js.map} +0 -0
  301. /package/dist/{chunk-KPSJA45G.js.map → chunk-QIDMGBUY.js.map} +0 -0
  302. /package/dist/{chunk-MKNENZCK.js.map → chunk-QJAGDPY7.js.map} +0 -0
  303. /package/dist/{chunk-VIRTAUJO.js.map → chunk-RDUM6BKQ.js.map} +0 -0
  304. /package/dist/{chunk-I6Y6QKWF.js.map → chunk-RGX4DGOG.js.map} +0 -0
  305. /package/dist/{chunk-OMYCECTS.js.map → chunk-RJLV4BKR.js.map} +0 -0
  306. /package/dist/{chunk-LBL77UXO.js.map → chunk-RKTT72XV.js.map} +0 -0
  307. /package/dist/{chunk-AWEMJYN2.js.map → chunk-RMG22TH2.js.map} +0 -0
  308. /package/dist/{chunk-4GPI3GVE.js.map → chunk-SLEAJ67D.js.map} +0 -0
  309. /package/dist/{chunk-YR6A6ZK7.js.map → chunk-SSUDD72S.js.map} +0 -0
  310. /package/dist/{chunk-WDP7CJZQ.js.map → chunk-SUSMEKBE.js.map} +0 -0
  311. /package/dist/{chunk-YZENVZWY.js.map → chunk-TY446V34.js.map} +0 -0
  312. /package/dist/{chunk-YCYFXA6P.js.map → chunk-UKB7ZDKK.js.map} +0 -0
  313. /package/dist/{chunk-DQEMWVMT.js.map → chunk-UVYI6VIX.js.map} +0 -0
  314. /package/dist/{chunk-YF3JERFZ.js.map → chunk-VL4X7ZHC.js.map} +0 -0
  315. /package/dist/{chunk-COHJUEBQ.js.map → chunk-WGXWZE3K.js.map} +0 -0
  316. /package/dist/{chunk-ZHOXXHT5.js.map → chunk-WQZZDN5M.js.map} +0 -0
  317. /package/dist/{chunk-25LKLNSJ.js.map → chunk-X33QB7LW.js.map} +0 -0
  318. /package/dist/{chunk-JDES3G7T.js.map → chunk-X3NZ2HAO.js.map} +0 -0
  319. /package/dist/{chunk-Q4AUIFUA.js.map → chunk-XAITGGX5.js.map} +0 -0
  320. /package/dist/{chunk-5HP5F2SQ.js.map → chunk-XNYTMLPS.js.map} +0 -0
  321. /package/dist/{chunk-UFBHEMNR.js.map → chunk-YL273SOF.js.map} +0 -0
  322. /package/dist/{chunk-GFD7TWAZ.js.map → chunk-ZWWF7PI5.js.map} +0 -0
  323. /package/dist/{chunk-5LPDXYU3.js.map → chunk-ZYBLNHUB.js.map} +0 -0
  324. /package/dist/{first-start-migration-7OATHJKB.js.map → first-start-migration-GAT7G733.js.map} +0 -0
package/src/config.ts CHANGED
@@ -43,6 +43,7 @@ import {
43
43
  parseStandingBlockFreshDays,
44
44
  parseStandingBlockMaxChars,
45
45
  } from "./standing-memory-block.js";
46
+ import { parseDirectorySidecarsEnabled } from "./directory-sidecars.js";
46
47
  import { parseRecognitionIndexMaxEntries, parseRecallRecognitionTier } from "./recall-recognition-tier.js";
47
48
  import { parseRecallConcurrencyConfig } from "./recall-concurrency-config.js";
48
49
  import { parseExtractionFields } from "./extraction-span-config.js";
@@ -1962,12 +1963,10 @@ export function parseConfig(
1962
1963
  // Recall state views (issue #1952). Default false; exact false/0/"false"
1963
1964
  // disable (parseRecallStateViews → coerceBooleanLike).
1964
1965
  recallStateViews: parseRecallStateViews(cfg.recallStateViews),
1965
- // Prefix-cache-stable standing memory block (issue #2971). Default
1966
- // false, and nothing on the recall path reads these keys until the
1967
- // server wiring slice lands — pre-wiring behavior is byte-identical.
1968
1966
  recallStandingBlock: parseRecallStandingBlock(cfg.recallStandingBlock),
1969
1967
  standingBlockFreshDays: parseStandingBlockFreshDays(cfg.standingBlockFreshDays),
1970
1968
  standingBlockMaxChars: parseStandingBlockMaxChars(cfg.standingBlockMaxChars),
1969
+ directorySidecarsEnabled: parseDirectorySidecarsEnabled(cfg.directorySidecarsEnabled),
1971
1970
  // Full-index recognition tier (issue #2975). Default false; nothing on the
1972
1971
  // recall path reads these keys until the wiring slice lands.
1973
1972
  recallRecognitionTier: parseRecallRecognitionTier(cfg.recallRecognitionTier),
@@ -3128,7 +3127,7 @@ export function parseConfig(
3128
3127
  recallEnrichmentDeadlineMs:
3129
3128
  typeof cfg.recallEnrichmentDeadlineMs === "number"
3130
3129
  ? Math.max(0, Math.floor(cfg.recallEnrichmentDeadlineMs))
3131
- : 25_000,
3130
+ : 60_000,
3132
3131
  recallPipeline: recallPipelineConfig.pipeline,
3133
3132
  recallMmrEnabled: cfg.recallMmrEnabled !== false,
3134
3133
  recallMmrLambda:
@@ -0,0 +1,34 @@
1
+ import assert from "node:assert/strict";
2
+ import test from "node:test";
3
+
4
+ import { parseConfig } from "./config.js";
5
+ import {
6
+ applyDirectorySidecarDrillDown,
7
+ isDirectorySidecarsEnabledForDir,
8
+ setDirectorySidecarsEnabledForDir,
9
+ } from "./directory-sidecars.js";
10
+
11
+ test("#3088 parseConfig directorySidecarsEnabled is off by default and opt-in only", () => {
12
+ assert.equal(parseConfig({}).directorySidecarsEnabled, false);
13
+ assert.equal(parseConfig({ directorySidecarsEnabled: "false" }).directorySidecarsEnabled, false);
14
+ assert.equal(parseConfig({ directorySidecarsEnabled: true }).directorySidecarsEnabled, true);
15
+ });
16
+
17
+ test("#3088 sidecar enable walks up from namespace storage roots", () => {
18
+ const root = "/tmp/remnic-sidecar-root";
19
+ const nested = `${root}/namespaces/team-a`;
20
+ setDirectorySidecarsEnabledForDir(root, true);
21
+ assert.equal(isDirectorySidecarsEnabledForDir(nested), true);
22
+ setDirectorySidecarsEnabledForDir(nested, false);
23
+ assert.equal(isDirectorySidecarsEnabledForDir(nested), false);
24
+ assert.equal(isDirectorySidecarsEnabledForDir("/tmp/other-memory"), false);
25
+ });
26
+
27
+ test("#3088 drill-down skips when authorized namespace set is empty", async () => {
28
+ const hits = [{ path: "facts/a.md", snippet: "hello", score: 1 }];
29
+ const out = await applyDirectorySidecarDrillDown("/tmp/memory", "hello", hits, {
30
+ enabled: true,
31
+ namespaces: [],
32
+ });
33
+ assert.deepEqual(out, hits);
34
+ });
@@ -1,5 +1,5 @@
1
1
  import assert from "node:assert/strict";
2
- import { chmodSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
2
+ import { chmodSync, existsSync, mkdtempSync, mkdirSync, rmSync, symlinkSync, writeFileSync } from "node:fs";
3
3
  import { mkdir, readdir, readFile, stat } from "node:fs/promises";
4
4
  import os from "node:os";
5
5
  import path from "node:path";
@@ -10,6 +10,7 @@ import {
10
10
  DIRECTORY_SIDECAR_MARKER,
11
11
  NEIGHBORHOOD_ABSTRACT_LABEL,
12
12
  applyDirectorySidecarDrillDown,
13
+ directorySidecarAncestry,
13
14
  findDirectorySidecarsForQuery,
14
15
  loadDirectorySidecar,
15
16
  parseDirectorySidecarsEnabled,
@@ -498,3 +499,37 @@ test("drill-down prefers the most specific matching directory", async () => {
498
499
  rmSync(root, { recursive: true, force: true });
499
500
  }
500
501
  });
502
+
503
+ test("#3007 sidecar ancestry refuses a symlinked memory root", () => {
504
+ const root = store();
505
+ try {
506
+ const facts = path.join(root, "facts");
507
+ mkdirSync(facts);
508
+ const linked = path.join(root, "linked-root");
509
+ symlinkSync(root, linked);
510
+ assert.deepEqual(directorySidecarAncestry(linked, "facts/2026-01-01/fact.md"), []);
511
+ } finally {
512
+ rmSync(root, { recursive: true, force: true });
513
+ }
514
+ });
515
+
516
+ test("#3090 sidecar ancestry refuses a symlink above the category root", async () => {
517
+ const root = store();
518
+ try {
519
+ const outside = path.join(root, "outside");
520
+ mkdirSync(path.join(outside, "alpha", "facts", "2026-01-01"), { recursive: true });
521
+ writeFileSync(path.join(outside, "alpha", "facts", "2026-01-01", "fact.md"), "x");
522
+ mkdirSync(path.join(root, "namespaces"));
523
+ symlinkSync(outside, path.join(root, "namespaces", "alpha"));
524
+ const report = await refreshDirectorySidecarsAfterWrite(
525
+ root,
526
+ "namespaces/alpha/facts/2026-01-01/fact.md",
527
+ true,
528
+ );
529
+ assert.deepEqual(report, { written: [], removed: [] });
530
+ assert.equal(existsSync(path.join(outside, "alpha", "facts", "overview.md")), false);
531
+ assert.equal(existsSync(path.join(outside, "alpha", "facts", "2026-01-01", "overview.md")), false);
532
+ } finally {
533
+ rmSync(root, { recursive: true, force: true });
534
+ }
535
+ });
@@ -70,6 +70,22 @@ export function parseDirectorySidecarsEnabled(raw: unknown): boolean {
70
70
  return coerceBooleanLike(raw, "directorySidecarsEnabled") === true;
71
71
  }
72
72
 
73
+ const sidecarEnabledByDir = new Map<string, boolean>();
74
+
75
+ export function setDirectorySidecarsEnabledForDir(memoryDir: string, enabled: boolean): void {
76
+ sidecarEnabledByDir.set(path.resolve(memoryDir), enabled === true);
77
+ }
78
+
79
+ export function isDirectorySidecarsEnabledForDir(memoryDir: string): boolean {
80
+ let dir = path.resolve(memoryDir);
81
+ for (;;) {
82
+ if (sidecarEnabledByDir.has(dir)) return sidecarEnabledByDir.get(dir) === true;
83
+ const parent = path.dirname(dir);
84
+ if (parent === dir) return false;
85
+ dir = parent;
86
+ }
87
+ }
88
+
73
89
  /** Basenames never treated as child memories (ours plus OKF's reserved ones). */
74
90
  const RESERVED_CHILD_BASENAMES: Readonly<Record<string, true>> = Object.freeze({
75
91
  ...OKF_RESERVED_BASENAMES,
@@ -321,10 +337,21 @@ function childAbstractsFromDisk(dir: string): Map<string, string> {
321
337
  */
322
338
  export function directorySidecarAncestry(memoryDir: string, changedPath: string): string[] {
323
339
  const root = path.resolve(memoryDir);
340
+ if (!isRealDirectory(root)) return [];
324
341
  const abs = path.isAbsolute(changedPath) ? path.resolve(changedPath) : path.resolve(root, changedPath);
325
342
  const rel = path.relative(root, abs);
326
343
  if (rel.startsWith("..") || path.isAbsolute(rel)) return [];
327
344
  const parts = rel.split(path.sep).filter(Boolean);
345
+ let cursor = root;
346
+ for (let i = 0; i < parts.length; i++) {
347
+ cursor = path.join(cursor, parts[i] ?? "");
348
+ try {
349
+ if (lstatSync(cursor).isSymbolicLink()) return [];
350
+ } catch {
351
+ if (i === parts.length - 1) break;
352
+ return [];
353
+ }
354
+ }
328
355
  const dirParts = isRealDirectory(abs) ? parts : parts.slice(0, -1);
329
356
  let categoryAt = -1;
330
357
  if (dirParts[0] === "namespaces" && dirParts.length >= 3 && CATEGORY_ROOTS.has(dirParts[2] ?? "")) {
@@ -335,7 +362,9 @@ export function directorySidecarAncestry(memoryDir: string, changedPath: string)
335
362
  if (categoryAt === -1) return [];
336
363
  const dirs: string[] = [];
337
364
  for (let i = dirParts.length; i > categoryAt; i--) {
338
- dirs.push(path.join(root, ...dirParts.slice(0, i)));
365
+ const dir = path.join(root, ...dirParts.slice(0, i));
366
+ if (!isRealDirectory(dir)) return [];
367
+ dirs.push(dir);
339
368
  }
340
369
  return dirs;
341
370
  }
@@ -512,13 +541,18 @@ export async function applyDirectorySidecarDrillDown<T extends DirectorySidecarH
512
541
  memoryDir: string,
513
542
  query: string,
514
543
  hits: readonly T[],
515
- options: { enabled?: boolean; namespace?: string } = {},
544
+ options: { enabled?: boolean; namespace?: string; namespaces?: readonly string[] } = {},
516
545
  ): Promise<T[]> {
517
- if (options.enabled !== true) return [...hits];
518
- const matches = await findDirectorySidecarsForQuery(memoryDir, query, {
519
- namespace: options.namespace,
520
- refresh: false,
521
- });
546
+ if (options.enabled !== true) return hits as T[];
547
+ const namespaces = options.namespaces;
548
+ if (namespaces !== undefined && namespaces.length === 0) return hits as T[];
549
+ const scopes = namespaces && namespaces.length > 0 ? namespaces : [options.namespace];
550
+ const matchLists = await Promise.all(
551
+ scopes.map((namespace) =>
552
+ findDirectorySidecarsForQuery(memoryDir, query, { namespace, refresh: false }),
553
+ ),
554
+ );
555
+ const matches = matchLists.flat();
522
556
  const fresh = matches.filter((match) => match.fresh && match.abstract.length > 0);
523
557
  if (fresh.length === 0) return [...hits];
524
558
  return hits.map((hit) => {
@@ -165,7 +165,7 @@ export class RecallInternalCoordinator {
165
165
  const recallSectionDeadlineMs = this.deps.config.recallCoreDeadlineMs ?? 75_000;
166
166
  const recallOuterTimeoutMs = this.deps.config.recallOuterTimeoutMs ?? 75_000;
167
167
  const enrichmentSectionDeadlineMs =
168
- this.deps.config.recallEnrichmentDeadlineMs ?? 25_000;
168
+ this.deps.config.recallEnrichmentDeadlineMs ?? 60_000;
169
169
  // Wrap entire recall body in try/finally so profiling trace is always closed,
170
170
  // even on unexpected exceptions (e.g., throwIfRecallAborted, phase-1 errors).
171
171
  try {
@@ -15,6 +15,7 @@ import test from "node:test";
15
15
  import { saveRecognitionIndex, type RecognitionIndex } from "../recall-recognition-tier.js";
16
16
  import {
17
17
  fetchQmdMemoryResultsWithRecognitionSwap,
18
+ recognitionHitScore,
18
19
  type RecognitionSearchDeps,
19
20
  } from "./recall-recognition-search.js";
20
21
  import type { QmdSearchResult } from "../types.js";
@@ -30,6 +31,13 @@ function indexOf(ids: string[]): RecognitionIndex {
30
31
  };
31
32
  }
32
33
 
34
+ test("#3117 recognition hit scores stay on the retrieval 0-1 scale", () => {
35
+ assert.equal(recognitionHitScore(0), 1);
36
+ assert.ok(recognitionHitScore(1) < 1);
37
+ assert.ok(recognitionHitScore(1) > recognitionHitScore(2));
38
+ assert.ok(recognitionHitScore(99) > 0);
39
+ });
40
+
33
41
  async function tmpDir(): Promise<string> {
34
42
  return mkdtemp(path.join(os.tmpdir(), "remnic-recognition-search-"));
35
43
  }
@@ -133,6 +133,10 @@ export async function fetchQmdMemoryResultsWithRecognitionSwap(
133
133
  );
134
134
  }
135
135
 
136
+ export function recognitionHitScore(rankOffset: number): number {
137
+ return 1 / (1 + rankOffset);
138
+ }
139
+
136
140
  async function hitsFromIds(
137
141
  namespace: string,
138
142
  storage: RecognitionStorage,
@@ -152,7 +156,7 @@ async function hitsFromIds(
152
156
  docid: `${namespace}:${rel}`,
153
157
  namespace,
154
158
  path: rel,
155
- score: ids.length - offset,
159
+ score: recognitionHitScore(offset),
156
160
  snippet: descriptionById.get(id) ?? id,
157
161
  });
158
162
  }
@@ -22,6 +22,7 @@ import { abortError } from "../abort-error.js";
22
22
  import { type CapabilitySet, type GraphConstructionCapabilitySet, resolveCapabilities, resolveConversationContextCapabilities, resolveGraphConstructionCapabilities, resolveIndexingCapabilities, resolveMemoryLifecycleCapabilities, resolveNamespaceCapabilities, resolvePipelineProcessingCapabilities, resolveQmdCapabilities, resolveRecallEnhancementCapabilities } from "../capabilities.js";
23
23
  import { EmbeddingFallback } from "../embedding-fallback.js";
24
24
  import { StorageManager } from "../index.js";
25
+ import { applyDirectorySidecarDrillDown, isDirectorySidecarsEnabledForDir } from "../directory-sidecars.js";
25
26
  import { inferIntentFromText, intentCompatibilityScore } from "../intent.js";
26
27
  import { log } from "../logger.js";
27
28
  import { NamespaceStorageRouter } from "../namespaces/storage.js";
@@ -314,7 +315,7 @@ export class RecallSearchPipelineCoordinator {
314
315
  320,
315
316
  Math.max(fetchLimit, qmdFetchLimit * 5),
316
317
  );
317
- const qmdRecallBudgetMs = this.deps.config.recallEnrichmentDeadlineMs ?? 25_000;
318
+ const qmdRecallBudgetMs = this.deps.config.recallEnrichmentDeadlineMs ?? 60_000;
318
319
  const qmdRecallBudgetEnabled = qmdRecallBudgetMs > 0;
319
320
  const startedAtMs = Date.now();
320
321
  let lastPrimaryResultCount = 0;
@@ -342,9 +343,6 @@ export class RecallSearchPipelineCoordinator {
342
343
  const debugSearchOptions = backendHonorsQmdSearchSignals
343
344
  ? resolvedSearchOptions
344
345
  : undefined;
345
- // Cross-lingual recall (#2197): lexical tiers cannot match a query whose
346
- // dominant script differs from the corpus's, whatever the page fill.
347
- // Supplement with the embedding-fallback tier ONCE, before widening.
348
346
  const crossScriptVectorHits = options.crossScript
349
347
  ? await this.searchEmbeddingFallback(prompt, fetchLimit)
350
348
  : [];
@@ -517,7 +515,7 @@ export class RecallSearchPipelineCoordinator {
517
515
  if (filteredResults.length >= qmdFetchLimit) {
518
516
  const capped = filteredResults.slice(0, qmdFetchLimit);
519
517
  await emitDebugSnapshot(capped, fetchLimit);
520
- return capped;
518
+ return await applyDirectorySidecarDrillDown(this.deps.storage?.dir ?? "", prompt, capped, { enabled: Boolean(this.deps.storage?.dir) && isDirectorySidecarsEnabledForDir(this.deps.storage.dir), namespaces: options.namespacesEnabled ? options.recallNamespaces ?? [] : undefined });
521
519
  }
522
520
  if (filteredResults.length > bestFiltered.length) {
523
521
  bestFiltered = filteredResults;
@@ -526,7 +524,7 @@ export class RecallSearchPipelineCoordinator {
526
524
  // hits). Keep widening until the backend itself underfills the page.
527
525
  if (primaryResults.length < fetchLimit) {
528
526
  await emitDebugSnapshot(filteredResults, fetchLimit);
529
- return filteredResults;
527
+ return await applyDirectorySidecarDrillDown(this.deps.storage?.dir ?? "", prompt, filteredResults, { enabled: Boolean(this.deps.storage?.dir) && isDirectorySidecarsEnabledForDir(this.deps.storage.dir), namespaces: options.namespacesEnabled ? options.recallNamespaces ?? [] : undefined });
530
528
  }
531
529
  if (fetchLimit >= maxFetchLimit) {
532
530
  break;
@@ -538,7 +536,7 @@ export class RecallSearchPipelineCoordinator {
538
536
 
539
537
  const capped = bestFiltered.slice(0, qmdFetchLimit);
540
538
  await emitDebugSnapshot(capped, fetchLimit);
541
- return capped;
539
+ return await applyDirectorySidecarDrillDown(this.deps.storage?.dir ?? "", prompt, capped, { enabled: Boolean(this.deps.storage?.dir) && isDirectorySidecarsEnabledForDir(this.deps.storage.dir), namespaces: options.namespacesEnabled ? options.recallNamespaces ?? [] : undefined });
542
540
  }
543
541
 
544
542
  async searchEmbeddingFallback(
@@ -143,6 +143,7 @@ import { WorkspaceOpsCoordinator } from "./orchestration/workspace-ops.js";
143
143
  import { NamespaceReadFanoutCoordinator } from "./orchestration/namespace-read-fanout.js";
144
144
  import { selfDeps } from "./orchestration/self-deps.js";
145
145
  import { RecallEntryCoordinator } from "./orchestration/recall-entry.js";
146
+ import { setDirectorySidecarsEnabledForDir } from "./directory-sidecars.js";
146
147
  import { SessionContextCoordinator, type SessionFlushOptions } from "./orchestration/session-context.js";
147
148
  import { drainRecallWrites, trackRecallWrite } from "./orchestration/recall-background-writes.js";
148
149
  import { XrayCaptureQueue } from "./orchestration/xray-capture-queue.js";
@@ -1971,6 +1972,13 @@ export class Orchestrator {
1971
1972
  async initialize(): Promise<void> {
1972
1973
  this.extractionQueueCoordinator.resumeAccepting();
1973
1974
  await this.orchestratorInitCoordinator.initialize();
1975
+ {
1976
+ const memoryDir = this.storage?.dir;
1977
+ if (typeof memoryDir === "string" && memoryDir.length > 0) {
1978
+ const { directorySidecarsEnabled } = this.config;
1979
+ setDirectorySidecarsEnabledForDir(memoryDir, directorySidecarsEnabled);
1980
+ }
1981
+ }
1974
1982
  if (isDependencyPropagationEnabled(this.config)) {
1975
1983
  this._dependencyPropagationRecovery = this.dependencyPropagationDelivery
1976
1984
  .recover()
package/src/qmd.ts CHANGED
@@ -70,7 +70,7 @@ export interface QmdClientOptions {
70
70
  qmdSubprocessStrategy?: QmdSubprocessStrategy;
71
71
  /** Override automatic qmd fallback probes; defaults to known install paths. */
72
72
  qmdFallbackPaths?: string[];
73
- /** Per-call daemon search timeout in ms; default 8000. Issue #1335. */
73
+ /** Per-call daemon search timeout in ms; default 60000. Issue #1335/#3098. */
74
74
  qmdDaemonTimeoutMs?: number;
75
75
  }
76
76
 
@@ -152,9 +152,9 @@ export type { QmdStatusReport } from "./qmd-status.js";
152
152
 
153
153
  const QMD_TIMEOUT_MS = 30_000;
154
154
  // Daemon timeout for search calls. Keep under RECALL_TIMEOUT_MS (75s) so a slow
155
- // daemon fails fast. Default only — override via `qmdDaemonTimeoutMs` (#1335).
156
- // Keep ≥ 5s for normal post-load searches to complete reliably.
157
- const QMD_DAEMON_TIMEOUT_MS = 8_000;
155
+ // daemon fails fast. Default only — override via `qmdDaemonTimeoutMs` (#1335/#3098).
156
+ // 60s covers multi-GB cold indexes that 8s missed; operators can still set 8s.
157
+ const QMD_DAEMON_TIMEOUT_MS = 60_000;
158
158
  const QMD_UPDATE_BACKOFF_MS = 15 * 60 * 1000; // 15m
159
159
  const QMD_EMBED_BACKOFF_MS = 60 * 60 * 1000; // 60m
160
160
  const QMD_CLI_WARN_THROTTLE_MS = 15 * 60 * 1000; // 15m
@@ -8,7 +8,7 @@ test("parseConfig applies recall timeout and qmd recall cache defaults", () => {
8
8
 
9
9
  assert.equal(config.recallOuterTimeoutMs, 75_000);
10
10
  assert.equal(config.recallCoreDeadlineMs, 75_000);
11
- assert.equal(config.recallEnrichmentDeadlineMs, 25_000);
11
+ assert.equal(config.recallEnrichmentDeadlineMs, 60_000);
12
12
  assert.equal(config.qmdRecallCacheTtlMs, 60_000);
13
13
  assert.equal(config.qmdRecallCacheStaleTtlMs, 10 * 60_000);
14
14
  assert.equal(config.qmdRecallCacheMaxEntries, 128);
package/src/storage.ts CHANGED
@@ -248,8 +248,7 @@ import {
248
248
  sealedWriteToLegacyArgs,
249
249
  type SealedMemoryEnvelope,
250
250
  } from "./write-envelope.js";
251
- // stripCitation import removed: legacy rebuild fallback was replaced by a
252
- // skip-with-warning strategy (Finding 1 — Uhol). See ensureFactHashIndexAuthoritative.
251
+ import { isDirectorySidecarsEnabledForDir, refreshDirectorySidecarsAfterWrite } from "./directory-sidecars.js";
253
252
  type SharedVersionKind = "memory-status" | "artifact-write" | "cold-write" | "memory-corpus" | "entity-mutation";
254
253
 
255
254
  type OfflineSyncDigestCacheEntry = {
@@ -3973,25 +3972,7 @@ export class StorageManager extends TombstoneBlockedCaptureIndexHost {
3973
3972
  return { id, tombstoneBlocked, ...(fm.blockedBy ? { blockedBy: fm.blockedBy } : {}), memory: { path: filePath, frontmatter: fm, content: sanitized.text } };
3974
3973
  }
3975
3974
 
3976
- /**
3977
- * Sealed-envelope write entry point (issue #1989 PR2).
3978
- *
3979
- * Byte-identity with `writeMemory` is BY DELEGATION: the envelope-owned
3980
- * fields are unpacked into the exact `writeMemory` arguments a legacy
3981
- * caller would have passed, so the persisted output is produced by the
3982
- * same code path. The composer's `persistedBody` was assembled with the
3983
- * same `assemblePersistedBody` helper `writeMemory` uses, so fingerprints
3984
- * derived from the envelope match the stored body (§13).
3985
- *
3986
- * Differences from a raw `writeMemory` call are REJECTIONS, not silent
3987
- * changes: the composer enforces tag/attribute caps, strict validAt, and
3988
- * plain-object attributes that the legacy path never validated.
3989
- *
3990
- * `envelope.ttl` maps to `expiresAt` verbatim; converting duration
3991
- * expressions (`"90d"`) to instants remains the access layer's job (PR3).
3992
- * `envelope.sourceReason` is access-layer metadata with no frontmatter
3993
- * field and is deliberately not persisted here.
3994
- */
3975
+ /** Sealed-envelope write entry point (issue #1989 PR2). */
3995
3976
  async writeSealedMemory(envelope: SealedMemoryEnvelope, extras: SealedWriteExtras = {}) {
3996
3977
  if (!isSealedMemoryEnvelope(envelope)) {
3997
3978
  throw new Error(
@@ -3999,7 +3980,17 @@ export class StorageManager extends TombstoneBlockedCaptureIndexHost {
3999
3980
  );
4000
3981
  }
4001
3982
  const { category, content, options } = sealedWriteToLegacyArgs(envelope, extras);
4002
- return this.writeMemory(category, content, options as WriteMemoryOptions);
3983
+ const result = await this.writeMemory(category, content, options as WriteMemoryOptions);
3984
+ try {
3985
+ await refreshDirectorySidecarsAfterWrite(
3986
+ this.dir,
3987
+ result.memory?.path ?? "",
3988
+ isDirectorySidecarsEnabledForDir(this.dir),
3989
+ );
3990
+ } catch (err) {
3991
+ log.warn(`directory sidecar refresh failed after write: ${err}`);
3992
+ }
3993
+ return result;
4003
3994
  }
4004
3995
 
4005
3996
  async hasFactContentHash(content: string): Promise<boolean> {
package/src/types.ts CHANGED
@@ -996,12 +996,12 @@ export interface PluginConfig
996
996
  recallDirectAnswerEnabled: boolean;
997
997
  /** Recall state views (issue #1952): label current/historical/transition on change-intent queries. Default false. */
998
998
  recallStateViews: boolean;
999
- /** Standing memory block (issue #2971): byte-stable pinned-memory index injected before per-turn recall; parsed now, injection lands in a later slice. Default false. */
999
+ /** Standing memory block (issue #2971). Default false. */
1000
1000
  recallStandingBlock: boolean;
1001
- /** Days a memory stays in the standing block's full-text fresh band. Default 14. */
1002
1001
  standingBlockFreshDays: number;
1003
- /** Hard character budget for the standing memory block. Default 2048. */
1004
1002
  standingBlockMaxChars: number;
1003
+ /** Directory sidecars (issue #3088). Default false. */
1004
+ directorySidecarsEnabled: boolean;
1005
1005
  /**
1006
1006
  * Disclosure auto-escalation policy (issue #677 PR 4/4). `"auto"`
1007
1007
  * escalates chunk → section when top-K confidence falls below