@remnic/core 9.69.86 → 9.69.88

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 (513) hide show
  1. package/dist/access-admin-ops-surface.js +74 -67
  2. package/dist/access-authorization-probe.js +75 -68
  3. package/dist/access-boundary.js +74 -67
  4. package/dist/access-citation-namespace.js +2 -2
  5. package/dist/access-cli.js +158 -151
  6. package/dist/access-cli.js.map +1 -1
  7. package/dist/access-extraction-force-flush.d.ts.map +1 -1
  8. package/dist/access-extraction-force-flush.js +74 -67
  9. package/dist/access-http-briefing.js +75 -68
  10. package/dist/access-http-offline-stream.d.ts.map +1 -1
  11. package/dist/access-http-offline-stream.js +1 -1
  12. package/dist/access-http-query.js +76 -69
  13. package/dist/access-http.js +100 -93
  14. package/dist/access-identity-continuity-surface.js +74 -67
  15. package/dist/access-lcm-surface.js +74 -67
  16. package/dist/access-mcp-output-schemas.d.ts.map +1 -1
  17. package/dist/access-mcp-output-schemas.js +1 -1
  18. package/dist/access-mcp.d.ts.map +1 -1
  19. package/dist/access-mcp.js +89 -82
  20. package/dist/access-namespace-preflight.js +74 -67
  21. package/dist/access-observe-write-category.js +19 -13
  22. package/dist/access-observe-write-surface.js +74 -67
  23. package/dist/access-offline-manifest.js +15 -10
  24. package/dist/access-operations-batch.js +78 -71
  25. package/dist/access-operations.js +85 -78
  26. package/dist/access-recall-concurrency.js +74 -67
  27. package/dist/access-recall-diagnostics.js +4 -4
  28. package/dist/access-recall-response.js +74 -67
  29. package/dist/access-recall-surface.js +74 -67
  30. package/dist/access-schema.js +15 -7
  31. package/dist/access-service-helpers.d.ts +1 -0
  32. package/dist/access-service-helpers.d.ts.map +1 -1
  33. package/dist/access-service-helpers.js +1 -1
  34. package/dist/access-service.d.ts.map +1 -1
  35. package/dist/access-service.js +74 -67
  36. package/dist/access-surface-catalog.js +76 -69
  37. package/dist/access-surface-catalog.js.map +1 -1
  38. package/dist/active-recall.js +34 -28
  39. package/dist/active-recall.js.map +1 -1
  40. package/dist/adapters/index.js +4 -4
  41. package/dist/adapters/registry.js +2 -2
  42. package/dist/{auto-sync-WEUDMXUW.js → auto-sync-U5N3CB5Y.js} +10 -10
  43. package/dist/background-generation.js +2 -2
  44. package/dist/briefing.js +18 -18
  45. package/dist/buffer.js +9 -8
  46. package/dist/calibration.js +2 -2
  47. package/dist/{capsule-crypto-GWVG7LGC.js → capsule-crypto-YO5QJ6L3.js} +2 -2
  48. package/dist/{capsule-merge-3MNURAQ3.js → capsule-merge-ZCXUPLNJ.js} +2 -2
  49. package/dist/causal-behavior.js +2 -2
  50. package/dist/causal-chain.js +2 -2
  51. package/dist/causal-consolidation.js +21 -21
  52. package/dist/causal-retrieval.js +2 -2
  53. package/dist/causal-trajectory-graph.js +3 -3
  54. package/dist/causal-trajectory.js +1 -1
  55. package/dist/{chunk-JE334SIA.js → chunk-22DYJLFN.js} +2 -2
  56. package/dist/{chunk-DGAWEJVI.js → chunk-2DLWLNO4.js} +3 -3
  57. package/dist/{chunk-J3IWHCMF.js → chunk-2DT7PIDZ.js} +3 -3
  58. package/dist/{chunk-NKFLHW7J.js → chunk-2NAD4YCI.js} +2 -2
  59. package/dist/{chunk-SV72F4DS.js → chunk-2WLMWP2T.js} +2 -2
  60. package/dist/{chunk-IVH7INFM.js → chunk-3O5BB45T.js} +7 -7
  61. package/dist/{chunk-RDEUG2M2.js → chunk-3SGTV7RD.js} +6 -6
  62. package/dist/{chunk-QOPB6KE3.js → chunk-3TB2XQ3C.js} +2 -2
  63. package/dist/{chunk-C7JAUNFC.js → chunk-4KN2JLQV.js} +2 -2
  64. package/dist/{chunk-TIQZNDZ5.js → chunk-4MP7XR5J.js} +2 -2
  65. package/dist/chunk-4NSLQ7EU.js +137 -0
  66. package/dist/chunk-4NSLQ7EU.js.map +1 -0
  67. package/dist/{chunk-7DE2NOON.js → chunk-4O4XCBOS.js} +3 -3
  68. package/dist/{chunk-SLEAJ67D.js → chunk-4OQET73E.js} +4 -4
  69. package/dist/{chunk-Q3THVX75.js → chunk-4RL3JOB3.js} +2 -2
  70. package/dist/{chunk-GDYU6VF4.js → chunk-5AYUHSAU.js} +2 -2
  71. package/dist/{chunk-B47OHVFT.js → chunk-5E6RYRYW.js} +7 -7
  72. package/dist/{chunk-2U3R3DDH.js → chunk-5FAGCOZD.js} +9 -9
  73. package/dist/{chunk-CRKWSSS4.js → chunk-5MNUBT7T.js} +2 -2
  74. package/dist/{chunk-CK5KOVHW.js → chunk-5R627MYY.js} +3 -2
  75. package/dist/{chunk-CK5KOVHW.js.map → chunk-5R627MYY.js.map} +1 -1
  76. package/dist/chunk-5X4MXNEU.js +64 -0
  77. package/dist/chunk-5X4MXNEU.js.map +1 -0
  78. package/dist/{chunk-52II7PB6.js → chunk-645WOU5I.js} +4 -4
  79. package/dist/{chunk-7G6WUOLB.js → chunk-66DKTOBY.js} +2 -2
  80. package/dist/{chunk-AZ2X5LNA.js → chunk-6LYAEM54.js} +2 -2
  81. package/dist/{chunk-DUJYRVUD.js → chunk-6O2VUWV6.js} +3 -3
  82. package/dist/{chunk-IMAP236M.js → chunk-6UQFJULG.js} +2 -2
  83. package/dist/chunk-75PT4N7Q.js +75 -0
  84. package/dist/chunk-75PT4N7Q.js.map +1 -0
  85. package/dist/{chunk-2I6VHX6Q.js → chunk-76M5OK7V.js} +2 -2
  86. package/dist/{chunk-OEBLZZKK.js → chunk-7XG7KMIW.js} +2 -2
  87. package/dist/{chunk-FYAU4S6E.js → chunk-A4VSOUCB.js} +3 -3
  88. package/dist/{chunk-GEX5NI36.js → chunk-AE5U5NMS.js} +2 -2
  89. package/dist/{chunk-UNJOB4DY.js → chunk-AEHVZY3X.js} +2 -2
  90. package/dist/{chunk-ML2MVAEZ.js → chunk-AEU4EQGV.js} +1 -1
  91. package/dist/{chunk-3SG4FGDV.js → chunk-AWD36R4D.js} +5 -2
  92. package/dist/chunk-AWD36R4D.js.map +1 -0
  93. package/dist/{chunk-JVY556FW.js → chunk-AWG3TIAY.js} +2 -2
  94. package/dist/{chunk-JX6USXZR.js → chunk-AXC4WSF3.js} +4 -4
  95. package/dist/{chunk-BOUFVFV2.js → chunk-AZSGSRIM.js} +2 -2
  96. package/dist/{chunk-VZBW6CDG.js → chunk-B3O3IRZN.js} +1 -1
  97. package/dist/{chunk-4V44AA7O.js → chunk-BGI4NUAO.js} +2 -2
  98. package/dist/{chunk-BNPLDVM6.js → chunk-BJVO4H5C.js} +2 -2
  99. package/dist/{chunk-S42HZILI.js → chunk-BLVR4WYU.js} +3 -3
  100. package/dist/{chunk-JXMECXMF.js → chunk-BOZJD5PK.js} +2 -2
  101. package/dist/{chunk-6DTJBTHL.js → chunk-BUQKSQXL.js} +15 -3
  102. package/dist/chunk-BUQKSQXL.js.map +1 -0
  103. package/dist/{chunk-OWHERGF2.js → chunk-BXLOS5AJ.js} +2 -2
  104. package/dist/{chunk-EVBI7S4J.js → chunk-C6U57KG4.js} +4 -4
  105. package/dist/{chunk-RB776UH3.js → chunk-C7V3KPKJ.js} +235 -93
  106. package/dist/chunk-C7V3KPKJ.js.map +1 -0
  107. package/dist/{chunk-T4BE5KJM.js → chunk-C7ZDKWPS.js} +4 -4
  108. package/dist/{chunk-HKFJ3PF3.js → chunk-CRXRZA3G.js} +2 -2
  109. package/dist/{chunk-NMBX4D7P.js → chunk-CZJA2EQE.js} +2 -2
  110. package/dist/{chunk-BJX3VQWZ.js → chunk-D5BSQR63.js} +2 -2
  111. package/dist/{chunk-MFZACYZ6.js → chunk-DGS34QSY.js} +2 -2
  112. package/dist/{chunk-UVYI6VIX.js → chunk-DQEMWVMT.js} +1 -1
  113. package/dist/{chunk-DQISIT63.js → chunk-DZ42MDZE.js} +3 -3
  114. package/dist/{chunk-5ELENZTA.js → chunk-EDIH6X2P.js} +2 -2
  115. package/dist/{chunk-3BTFBQLO.js → chunk-EFHNFTWB.js} +49 -3
  116. package/dist/chunk-EFHNFTWB.js.map +1 -0
  117. package/dist/{chunk-C3QXITIP.js → chunk-EQUD7FP4.js} +2 -2
  118. package/dist/chunk-ETUZFFPU.js +218 -0
  119. package/dist/chunk-ETUZFFPU.js.map +1 -0
  120. package/dist/{chunk-YNDLCWXS.js → chunk-EZ25VE3G.js} +4 -4
  121. package/dist/{chunk-IA3X2Y4K.js → chunk-FJLQXMTU.js} +3 -3
  122. package/dist/{chunk-TY446V34.js → chunk-FKD656D2.js} +2 -2
  123. package/dist/{chunk-CLXTDOKV.js → chunk-FUNBJQYR.js} +2 -2
  124. package/dist/{chunk-CLSYE5OZ.js → chunk-G2STTRYB.js} +2 -2
  125. package/dist/{chunk-SQDKX4RW.js → chunk-GWM6T5EQ.js} +2 -2
  126. package/dist/{chunk-AXDOF4VI.js → chunk-GZDTVYK2.js} +2 -2
  127. package/dist/{chunk-55FCXCXJ.js → chunk-H56VY4BY.js} +7 -7
  128. package/dist/{chunk-OM5BIPBR.js → chunk-H5BJWPUI.js} +4 -4
  129. package/dist/{chunk-7QK5TUTW.js → chunk-HLB7GKGG.js} +2 -2
  130. package/dist/{chunk-CHDGJJV6.js → chunk-HWLIMQE2.js} +2 -2
  131. package/dist/{chunk-QB75LKQQ.js → chunk-IOSZHHJC.js} +34 -15
  132. package/dist/chunk-IOSZHHJC.js.map +1 -0
  133. package/dist/{chunk-NAFPHFDM.js → chunk-JNLEJE4A.js} +2 -2
  134. package/dist/{chunk-7UUKRS3J.js → chunk-JVPWRNHA.js} +3 -3
  135. package/dist/{chunk-6ET2VII7.js → chunk-JYG2334B.js} +2 -2
  136. package/dist/chunk-K6T33R4Q.js +535 -0
  137. package/dist/chunk-K6T33R4Q.js.map +1 -0
  138. package/dist/{chunk-2QG4SLZI.js → chunk-KF7PQ7G2.js} +2 -2
  139. package/dist/{chunk-WIKO4SCR.js → chunk-LHRQBMJN.js} +2 -2
  140. package/dist/{chunk-IFCKHPY4.js → chunk-LO4UKPKX.js} +2 -2
  141. package/dist/{chunk-TEV2JGU5.js → chunk-LU7E2MXE.js} +19 -19
  142. package/dist/{chunk-RJLV4BKR.js → chunk-LV5H6FTN.js} +2 -2
  143. package/dist/{chunk-IBGEHKQ6.js → chunk-LW3HKRL7.js} +3 -3
  144. package/dist/{chunk-3XQYM4RE.js → chunk-M6C7SOR6.js} +2 -2
  145. package/dist/{chunk-JN72EPOE.js → chunk-MAAL6OZV.js} +7 -7
  146. package/dist/chunk-MAAL6OZV.js.map +1 -0
  147. package/dist/{chunk-MY2PLXSM.js → chunk-MCTM4YPL.js} +2 -1
  148. package/dist/{chunk-MY2PLXSM.js.map → chunk-MCTM4YPL.js.map} +1 -1
  149. package/dist/{chunk-T4QGUXCV.js → chunk-MXCAJKMA.js} +9 -9
  150. package/dist/{chunk-BMYZTZ5D.js → chunk-MY7B3HYC.js} +2 -2
  151. package/dist/{chunk-NB3LRY4T.js → chunk-N4PYB235.js} +2 -2
  152. package/dist/{chunk-S3YM4SZQ.js → chunk-N7QV3CMX.js} +2 -2
  153. package/dist/{chunk-3GN2PEOT.js → chunk-NYKIUQL6.js} +2 -2
  154. package/dist/{chunk-WQZZDN5M.js → chunk-OCFXVDBZ.js} +322 -376
  155. package/dist/chunk-OCFXVDBZ.js.map +1 -0
  156. package/dist/{chunk-L2LBMKSI.js → chunk-OK52IY3W.js} +10 -10
  157. package/dist/{chunk-WB2I2EQK.js → chunk-P2ODTYOF.js} +2 -2
  158. package/dist/{chunk-RIEX7NOZ.js → chunk-PEBHPCX2.js} +2 -2
  159. package/dist/{chunk-VYCOJKSX.js → chunk-PO7NXNGC.js} +2 -2
  160. package/dist/{chunk-G6SVZWPB.js → chunk-PZX3AQLF.js} +44 -1
  161. package/dist/chunk-PZX3AQLF.js.map +1 -0
  162. package/dist/{chunk-XAITGGX5.js → chunk-Q4AUIFUA.js} +4 -4
  163. package/dist/{chunk-EU3N5MK3.js → chunk-QAW55ZHJ.js} +4 -4
  164. package/dist/{chunk-SVZWVZ7E.js → chunk-QB57WIS6.js} +101 -93
  165. package/dist/chunk-QB57WIS6.js.map +1 -0
  166. package/dist/{chunk-I4G4UWQA.js → chunk-QI2E6ISQ.js} +1 -1
  167. package/dist/{chunk-CK5U7JGH.js → chunk-QI7K7BZ5.js} +2 -2
  168. package/dist/{chunk-VTPASHTO.js → chunk-R3X2T2LP.js} +3 -3
  169. package/dist/{chunk-I53NAHZ4.js → chunk-RBITPCMK.js} +10 -9
  170. package/dist/chunk-RBITPCMK.js.map +1 -0
  171. package/dist/{chunk-EJPF6XDQ.js → chunk-RDJ6C7NZ.js} +3 -3
  172. package/dist/{chunk-C2WWQ4OR.js → chunk-RMMA44HE.js} +1 -1
  173. package/dist/chunk-RMMA44HE.js.map +1 -0
  174. package/dist/{chunk-QC56VZXC.js → chunk-S2GE2K36.js} +85 -82
  175. package/dist/{chunk-QC56VZXC.js.map → chunk-S2GE2K36.js.map} +1 -1
  176. package/dist/{chunk-2UPTRDGM.js → chunk-SCXURCVT.js} +3 -3
  177. package/dist/{chunk-S55WTPFJ.js → chunk-STEOT4DI.js} +20 -20
  178. package/dist/chunk-STEOT4DI.js.map +1 -0
  179. package/dist/{chunk-N3MNDVJO.js → chunk-SWBC3UER.js} +2 -2
  180. package/dist/{chunk-ZTHGFTMW.js → chunk-TKC5LZ43.js} +2 -2
  181. package/dist/chunk-TYT4TEQV.js +45 -0
  182. package/dist/chunk-TYT4TEQV.js.map +1 -0
  183. package/dist/{chunk-YRLHEEQT.js → chunk-U6VC6RP3.js} +2 -2
  184. package/dist/chunk-UCPGOUDZ.js +726 -0
  185. package/dist/chunk-UCPGOUDZ.js.map +1 -0
  186. package/dist/{chunk-MOQPEFLN.js → chunk-UP75KL3L.js} +2 -2
  187. package/dist/{chunk-D5F7TKMH.js → chunk-V4JZCTMK.js} +2 -2
  188. package/dist/{chunk-NAYBHNGN.js → chunk-VALKBYBN.js} +2 -2
  189. package/dist/{chunk-BUKK5SWA.js → chunk-VDX2J7OX.js} +2 -2
  190. package/dist/{chunk-H36X4NRH.js → chunk-VVX5PZFS.js} +2 -2
  191. package/dist/{chunk-RCQKAOOB.js → chunk-W3XXFPRI.js} +52 -52
  192. package/dist/{chunk-W75BBBSY.js → chunk-WKY7N3L7.js} +11 -11
  193. package/dist/{chunk-GZAGLCQH.js → chunk-X5SHE2O3.js} +3 -3
  194. package/dist/{chunk-OAOBL6OY.js → chunk-XOV7NRY5.js} +5 -5
  195. package/dist/{chunk-FZVROZKC.js → chunk-XVZA6VXC.js} +4 -4
  196. package/dist/{chunk-RGMVMVMF.js → chunk-YBA52OKG.js} +2 -1
  197. package/dist/chunk-YBA52OKG.js.map +1 -0
  198. package/dist/{chunk-IP5VLSLO.js → chunk-YJ7MW627.js} +2 -2
  199. package/dist/{chunk-HS75MCQF.js → chunk-YRULQW5J.js} +2 -2
  200. package/dist/{chunk-DINRT75P.js → chunk-YSBL7VPO.js} +2 -2
  201. package/dist/{chunk-QWUJWBZ5.js → chunk-Z3O53WZR.js} +2 -2
  202. package/dist/{chunk-KERNN6BC.js → chunk-Z5LP6ILP.js} +2 -2
  203. package/dist/{chunk-5FNZ3G6X.js → chunk-Z6EZCN6Z.js} +5 -5
  204. package/dist/chunk-ZJP66Q4I.js +48 -0
  205. package/dist/chunk-ZJP66Q4I.js.map +1 -0
  206. package/dist/{chunk-JS3S2HVG.js → chunk-ZZZ4I455.js} +2 -2
  207. package/dist/cli.js +122 -115
  208. package/dist/coding/export-okf-codegraph.js +19 -19
  209. package/dist/coding/pre-action-gate.js +2 -2
  210. package/dist/compounding/engine.js +19 -19
  211. package/dist/config.js +34 -28
  212. package/dist/connectors/codex-materialize-runner.js +18 -18
  213. package/dist/connectors/index.js +18 -18
  214. package/dist/console/state.d.ts +30 -0
  215. package/dist/console/state.d.ts.map +1 -1
  216. package/dist/contradiction/index.js +7 -7
  217. package/dist/{contradiction-scan-5EJYRKD3.js → contradiction-scan-TAGMOUQ2.js} +3 -3
  218. package/dist/convergence-refresh.js +20 -20
  219. package/dist/corpus-watermark.js +20 -20
  220. package/dist/correction/correction-access-wiring.d.ts.map +1 -1
  221. package/dist/dashboard-runtime.js +2 -2
  222. package/dist/deep-recall-http-glue.js +15 -8
  223. package/dist/deep-recall-policy-llm.js +3 -3
  224. package/dist/deep-recall.js +2 -2
  225. package/dist/embedding-fallback.d.ts +41 -31
  226. package/dist/embedding-fallback.d.ts.map +1 -1
  227. package/dist/embedding-fallback.js +9 -1
  228. package/dist/embedding-generation-lock.d.ts +49 -0
  229. package/dist/embedding-generation-lock.d.ts.map +1 -0
  230. package/dist/embedding-generation-lock.js +19 -0
  231. package/dist/embedding-index-storage.d.ts +276 -0
  232. package/dist/embedding-index-storage.d.ts.map +1 -0
  233. package/dist/embedding-index-storage.js +28 -0
  234. package/dist/entity-retrieval.js +19 -19
  235. package/dist/event-order-recall.js +3 -3
  236. package/dist/explicit-capture.js +6 -6
  237. package/dist/external-wiki-access.js +75 -68
  238. package/dist/extraction-faithfulness.js +3 -3
  239. package/dist/extraction-judge.js +3 -3
  240. package/dist/extraction-liveness.d.ts +9 -0
  241. package/dist/extraction-liveness.d.ts.map +1 -1
  242. package/dist/extraction-liveness.js +2 -1
  243. package/dist/extraction-llm-health.d.ts +32 -0
  244. package/dist/extraction-llm-health.d.ts.map +1 -0
  245. package/dist/extraction-llm-health.js +17 -0
  246. package/dist/extraction-span-config.js +3 -2
  247. package/dist/extraction-span-materialize.js +2 -2
  248. package/dist/extraction.js +29 -28
  249. package/dist/fallback-llm.js +2 -2
  250. package/dist/{first-start-migration-GAT7G733.js → first-start-migration-7OATHJKB.js} +4 -4
  251. package/dist/{graph-edge-decay-PVKDKLQK.js → graph-edge-decay-MKIRZ762.js} +6 -6
  252. package/dist/graph-jsonl.js +4 -4
  253. package/dist/graph-snapshot.js +4 -4
  254. package/dist/graph.js +5 -5
  255. package/dist/harmonic-retrieval.js +1 -1
  256. package/dist/index.d.ts +2 -0
  257. package/dist/index.d.ts.map +1 -1
  258. package/dist/index.js +237 -206
  259. package/dist/json-extract.d.ts.map +1 -1
  260. package/dist/json-extract.js +1 -1
  261. package/dist/lcm/engine.js +2 -2
  262. package/dist/lcm/index.js +5 -5
  263. package/dist/local-llm.d.ts.map +1 -1
  264. package/dist/local-llm.js +2 -2
  265. package/dist/location/index.js +21 -21
  266. package/dist/maintenance/memory-governance.js +18 -18
  267. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +18 -18
  268. package/dist/maintenance/rebuild-memory-projection.js +19 -19
  269. package/dist/memory-browse-operations.js +75 -68
  270. package/dist/memory-browse.js +3 -3
  271. package/dist/memory-subject.js +3 -3
  272. package/dist/namespaces/migrate.js +19 -19
  273. package/dist/namespaces/search.js +4 -4
  274. package/dist/namespaces/storage.js +18 -18
  275. package/dist/offline-sync-embedding-generation.d.ts +207 -0
  276. package/dist/offline-sync-embedding-generation.d.ts.map +1 -0
  277. package/dist/offline-sync-embedding-generation.js +42 -0
  278. package/dist/offline-sync-embedding-generation.js.map +1 -0
  279. package/dist/offline-sync-exclude-globs.d.ts +15 -0
  280. package/dist/offline-sync-exclude-globs.d.ts.map +1 -1
  281. package/dist/offline-sync-exclude-globs.js +11 -3
  282. package/dist/offline-sync-file-io.d.ts +7 -0
  283. package/dist/offline-sync-file-io.d.ts.map +1 -1
  284. package/dist/offline-sync-file-io.js +14 -2
  285. package/dist/offline-sync-impression-drain.js +3 -3
  286. package/dist/offline-sync-runtime-state.d.ts +5 -0
  287. package/dist/offline-sync-runtime-state.d.ts.map +1 -0
  288. package/dist/offline-sync-runtime-state.js +14 -0
  289. package/dist/offline-sync-runtime-state.js.map +1 -0
  290. package/dist/offline-sync-snapshot-stream.d.ts +26 -0
  291. package/dist/offline-sync-snapshot-stream.d.ts.map +1 -0
  292. package/dist/offline-sync-snapshot-stream.js +28 -0
  293. package/dist/offline-sync-snapshot-stream.js.map +1 -0
  294. package/dist/offline-sync-upload-staging.d.ts +34 -0
  295. package/dist/offline-sync-upload-staging.d.ts.map +1 -0
  296. package/dist/offline-sync-upload-staging.js +26 -0
  297. package/dist/offline-sync-upload-staging.js.map +1 -0
  298. package/dist/offline-sync.d.ts +46 -27
  299. package/dist/offline-sync.d.ts.map +1 -1
  300. package/dist/offline-sync.js +21 -8
  301. package/dist/operator-doctor-corpus.js +21 -21
  302. package/dist/operator-toolkit.js +46 -40
  303. package/dist/orchestration/extraction-run.d.ts.map +1 -1
  304. package/dist/orchestration/maintenance.js +30 -30
  305. package/dist/orchestrator.d.ts.map +1 -1
  306. package/dist/orchestrator.js +159 -152
  307. package/dist/recall-navigation-operations.js +75 -68
  308. package/dist/recall-navigation.js +74 -67
  309. package/dist/recall-planner-llm.js +2 -2
  310. package/dist/recall-state-view-admission.js +3 -3
  311. package/dist/recall-why-service.js +6 -6
  312. package/dist/recall-why.js +3 -3
  313. package/dist/reconcile/manifest.js +4 -4
  314. package/dist/{resolution-UYJU5JUA.js → resolution-K4A3VPKZ.js} +8 -8
  315. package/dist/resolution-K4A3VPKZ.js.map +1 -0
  316. package/dist/resume-bundles.js +35 -29
  317. package/dist/salvage-envelope.js +5 -5
  318. package/dist/search/factory.js +3 -3
  319. package/dist/search/index.js +7 -7
  320. package/dist/secure-store/index.js +2 -2
  321. package/dist/secure-store/secure-fs.d.ts +14 -1
  322. package/dist/secure-store/secure-fs.d.ts.map +1 -1
  323. package/dist/semantic-consolidation.js +19 -19
  324. package/dist/semantic-rule-promotion.js +18 -18
  325. package/dist/semantic-rule-verifier.js +18 -18
  326. package/dist/source-agent-qualifier.js +23 -22
  327. package/dist/standup/build.js +18 -18
  328. package/dist/{state-ITXJKXRE.js → state-JB47KHYV.js} +2 -2
  329. package/dist/state-JB47KHYV.js.map +1 -0
  330. package/dist/storage.d.ts +9 -3
  331. package/dist/storage.d.ts.map +1 -1
  332. package/dist/storage.js +17 -17
  333. package/dist/subject-config.js +4 -4
  334. package/dist/summarizer.js +6 -6
  335. package/dist/support-passport/index.js +77 -70
  336. package/dist/{trace-ZFVRH4GO.js → trace-LXXCMZJA.js} +3 -3
  337. package/dist/transfer/backup.js +2 -2
  338. package/dist/transfer/capsule-export.js +2 -2
  339. package/dist/transfer/capsule-import.js +3 -3
  340. package/dist/transfer/export-okf.js +19 -19
  341. package/dist/{tui-55UJMJX7.js → tui-2Z5WOV7L.js} +3 -3
  342. package/dist/tui-2Z5WOV7L.js.map +1 -0
  343. package/dist/verified-recall.js +18 -18
  344. package/dist/who-knows-cli.js +19 -19
  345. package/dist/who-knows.js +18 -18
  346. package/dist/write-envelope.js +4 -4
  347. package/package.json +2 -2
  348. package/src/access-extraction-force-flush.ts +15 -7
  349. package/src/access-http-offline-stream.ts +3 -0
  350. package/src/access-mcp-output-schemas.ts +1 -0
  351. package/src/access-mcp.ts +90 -28
  352. package/src/access-service-health.test.ts +41 -5
  353. package/src/access-service-helpers.ts +1 -0
  354. package/src/access-service-observe-lcm-parity.test.ts +56 -24
  355. package/src/access-service.ts +7 -18
  356. package/src/console/state.test.ts +56 -0
  357. package/src/console/state.ts +83 -0
  358. package/src/correction/correction-access-wiring.ts +36 -8
  359. package/src/correction/correction-classify-parse.test.ts +178 -0
  360. package/src/embedding-fallback.ts +325 -141
  361. package/src/embedding-generation-lock.ts +141 -0
  362. package/src/embedding-index-storage.test.ts +245 -0
  363. package/src/embedding-index-storage.ts +1068 -0
  364. package/src/extraction-liveness.ts +13 -1
  365. package/src/extraction-llm-health.test.ts +103 -0
  366. package/src/extraction-llm-health.ts +71 -0
  367. package/src/index.ts +3 -3
  368. package/src/json-extract.ts +6 -0
  369. package/src/local-llm-thinking.test.ts +12 -0
  370. package/src/local-llm.ts +1 -0
  371. package/src/offline-sync-embedding-generation.test.ts +2173 -0
  372. package/src/offline-sync-embedding-generation.ts +885 -0
  373. package/src/offline-sync-exclude-globs.ts +112 -0
  374. package/src/offline-sync-file-io.ts +48 -0
  375. package/src/offline-sync-runtime-state.ts +48 -0
  376. package/src/offline-sync-snapshot-stream.ts +99 -0
  377. package/src/offline-sync-upload-staging.ts +291 -0
  378. package/src/offline-sync.test.ts +164 -1
  379. package/src/offline-sync.ts +458 -453
  380. package/src/orchestration/extraction-run.test.ts +55 -1
  381. package/src/orchestration/extraction-run.ts +13 -0
  382. package/src/orchestrator.ts +2 -1
  383. package/src/secure-store/secure-fs.ts +26 -6
  384. package/src/storage.ts +11 -6
  385. package/dist/chunk-3BTFBQLO.js.map +0 -1
  386. package/dist/chunk-3SG4FGDV.js.map +0 -1
  387. package/dist/chunk-6DTJBTHL.js.map +0 -1
  388. package/dist/chunk-AREGMX2J.js +0 -50
  389. package/dist/chunk-AREGMX2J.js.map +0 -1
  390. package/dist/chunk-C2WWQ4OR.js.map +0 -1
  391. package/dist/chunk-G6SVZWPB.js.map +0 -1
  392. package/dist/chunk-I53NAHZ4.js.map +0 -1
  393. package/dist/chunk-JN72EPOE.js.map +0 -1
  394. package/dist/chunk-QB75LKQQ.js.map +0 -1
  395. package/dist/chunk-RB776UH3.js.map +0 -1
  396. package/dist/chunk-RGMVMVMF.js.map +0 -1
  397. package/dist/chunk-S55WTPFJ.js.map +0 -1
  398. package/dist/chunk-SVZWVZ7E.js.map +0 -1
  399. package/dist/chunk-WQZZDN5M.js.map +0 -1
  400. /package/dist/{auto-sync-WEUDMXUW.js.map → auto-sync-U5N3CB5Y.js.map} +0 -0
  401. /package/dist/{capsule-crypto-GWVG7LGC.js.map → capsule-crypto-YO5QJ6L3.js.map} +0 -0
  402. /package/dist/{capsule-merge-3MNURAQ3.js.map → capsule-merge-ZCXUPLNJ.js.map} +0 -0
  403. /package/dist/{chunk-JE334SIA.js.map → chunk-22DYJLFN.js.map} +0 -0
  404. /package/dist/{chunk-DGAWEJVI.js.map → chunk-2DLWLNO4.js.map} +0 -0
  405. /package/dist/{chunk-J3IWHCMF.js.map → chunk-2DT7PIDZ.js.map} +0 -0
  406. /package/dist/{chunk-NKFLHW7J.js.map → chunk-2NAD4YCI.js.map} +0 -0
  407. /package/dist/{chunk-SV72F4DS.js.map → chunk-2WLMWP2T.js.map} +0 -0
  408. /package/dist/{chunk-IVH7INFM.js.map → chunk-3O5BB45T.js.map} +0 -0
  409. /package/dist/{chunk-RDEUG2M2.js.map → chunk-3SGTV7RD.js.map} +0 -0
  410. /package/dist/{chunk-QOPB6KE3.js.map → chunk-3TB2XQ3C.js.map} +0 -0
  411. /package/dist/{chunk-C7JAUNFC.js.map → chunk-4KN2JLQV.js.map} +0 -0
  412. /package/dist/{chunk-TIQZNDZ5.js.map → chunk-4MP7XR5J.js.map} +0 -0
  413. /package/dist/{chunk-7DE2NOON.js.map → chunk-4O4XCBOS.js.map} +0 -0
  414. /package/dist/{chunk-SLEAJ67D.js.map → chunk-4OQET73E.js.map} +0 -0
  415. /package/dist/{chunk-Q3THVX75.js.map → chunk-4RL3JOB3.js.map} +0 -0
  416. /package/dist/{chunk-GDYU6VF4.js.map → chunk-5AYUHSAU.js.map} +0 -0
  417. /package/dist/{chunk-B47OHVFT.js.map → chunk-5E6RYRYW.js.map} +0 -0
  418. /package/dist/{chunk-2U3R3DDH.js.map → chunk-5FAGCOZD.js.map} +0 -0
  419. /package/dist/{chunk-CRKWSSS4.js.map → chunk-5MNUBT7T.js.map} +0 -0
  420. /package/dist/{chunk-52II7PB6.js.map → chunk-645WOU5I.js.map} +0 -0
  421. /package/dist/{chunk-7G6WUOLB.js.map → chunk-66DKTOBY.js.map} +0 -0
  422. /package/dist/{chunk-AZ2X5LNA.js.map → chunk-6LYAEM54.js.map} +0 -0
  423. /package/dist/{chunk-DUJYRVUD.js.map → chunk-6O2VUWV6.js.map} +0 -0
  424. /package/dist/{chunk-IMAP236M.js.map → chunk-6UQFJULG.js.map} +0 -0
  425. /package/dist/{chunk-2I6VHX6Q.js.map → chunk-76M5OK7V.js.map} +0 -0
  426. /package/dist/{chunk-OEBLZZKK.js.map → chunk-7XG7KMIW.js.map} +0 -0
  427. /package/dist/{chunk-FYAU4S6E.js.map → chunk-A4VSOUCB.js.map} +0 -0
  428. /package/dist/{chunk-GEX5NI36.js.map → chunk-AE5U5NMS.js.map} +0 -0
  429. /package/dist/{chunk-UNJOB4DY.js.map → chunk-AEHVZY3X.js.map} +0 -0
  430. /package/dist/{chunk-ML2MVAEZ.js.map → chunk-AEU4EQGV.js.map} +0 -0
  431. /package/dist/{chunk-JVY556FW.js.map → chunk-AWG3TIAY.js.map} +0 -0
  432. /package/dist/{chunk-JX6USXZR.js.map → chunk-AXC4WSF3.js.map} +0 -0
  433. /package/dist/{chunk-BOUFVFV2.js.map → chunk-AZSGSRIM.js.map} +0 -0
  434. /package/dist/{chunk-VZBW6CDG.js.map → chunk-B3O3IRZN.js.map} +0 -0
  435. /package/dist/{chunk-4V44AA7O.js.map → chunk-BGI4NUAO.js.map} +0 -0
  436. /package/dist/{chunk-BNPLDVM6.js.map → chunk-BJVO4H5C.js.map} +0 -0
  437. /package/dist/{chunk-S42HZILI.js.map → chunk-BLVR4WYU.js.map} +0 -0
  438. /package/dist/{chunk-JXMECXMF.js.map → chunk-BOZJD5PK.js.map} +0 -0
  439. /package/dist/{chunk-OWHERGF2.js.map → chunk-BXLOS5AJ.js.map} +0 -0
  440. /package/dist/{chunk-EVBI7S4J.js.map → chunk-C6U57KG4.js.map} +0 -0
  441. /package/dist/{chunk-T4BE5KJM.js.map → chunk-C7ZDKWPS.js.map} +0 -0
  442. /package/dist/{chunk-HKFJ3PF3.js.map → chunk-CRXRZA3G.js.map} +0 -0
  443. /package/dist/{chunk-NMBX4D7P.js.map → chunk-CZJA2EQE.js.map} +0 -0
  444. /package/dist/{chunk-BJX3VQWZ.js.map → chunk-D5BSQR63.js.map} +0 -0
  445. /package/dist/{chunk-MFZACYZ6.js.map → chunk-DGS34QSY.js.map} +0 -0
  446. /package/dist/{chunk-UVYI6VIX.js.map → chunk-DQEMWVMT.js.map} +0 -0
  447. /package/dist/{chunk-DQISIT63.js.map → chunk-DZ42MDZE.js.map} +0 -0
  448. /package/dist/{chunk-5ELENZTA.js.map → chunk-EDIH6X2P.js.map} +0 -0
  449. /package/dist/{chunk-C3QXITIP.js.map → chunk-EQUD7FP4.js.map} +0 -0
  450. /package/dist/{chunk-YNDLCWXS.js.map → chunk-EZ25VE3G.js.map} +0 -0
  451. /package/dist/{chunk-IA3X2Y4K.js.map → chunk-FJLQXMTU.js.map} +0 -0
  452. /package/dist/{chunk-TY446V34.js.map → chunk-FKD656D2.js.map} +0 -0
  453. /package/dist/{chunk-CLXTDOKV.js.map → chunk-FUNBJQYR.js.map} +0 -0
  454. /package/dist/{chunk-CLSYE5OZ.js.map → chunk-G2STTRYB.js.map} +0 -0
  455. /package/dist/{chunk-SQDKX4RW.js.map → chunk-GWM6T5EQ.js.map} +0 -0
  456. /package/dist/{chunk-AXDOF4VI.js.map → chunk-GZDTVYK2.js.map} +0 -0
  457. /package/dist/{chunk-55FCXCXJ.js.map → chunk-H56VY4BY.js.map} +0 -0
  458. /package/dist/{chunk-OM5BIPBR.js.map → chunk-H5BJWPUI.js.map} +0 -0
  459. /package/dist/{chunk-7QK5TUTW.js.map → chunk-HLB7GKGG.js.map} +0 -0
  460. /package/dist/{chunk-CHDGJJV6.js.map → chunk-HWLIMQE2.js.map} +0 -0
  461. /package/dist/{chunk-NAFPHFDM.js.map → chunk-JNLEJE4A.js.map} +0 -0
  462. /package/dist/{chunk-7UUKRS3J.js.map → chunk-JVPWRNHA.js.map} +0 -0
  463. /package/dist/{chunk-6ET2VII7.js.map → chunk-JYG2334B.js.map} +0 -0
  464. /package/dist/{chunk-2QG4SLZI.js.map → chunk-KF7PQ7G2.js.map} +0 -0
  465. /package/dist/{chunk-WIKO4SCR.js.map → chunk-LHRQBMJN.js.map} +0 -0
  466. /package/dist/{chunk-IFCKHPY4.js.map → chunk-LO4UKPKX.js.map} +0 -0
  467. /package/dist/{chunk-TEV2JGU5.js.map → chunk-LU7E2MXE.js.map} +0 -0
  468. /package/dist/{chunk-RJLV4BKR.js.map → chunk-LV5H6FTN.js.map} +0 -0
  469. /package/dist/{chunk-IBGEHKQ6.js.map → chunk-LW3HKRL7.js.map} +0 -0
  470. /package/dist/{chunk-3XQYM4RE.js.map → chunk-M6C7SOR6.js.map} +0 -0
  471. /package/dist/{chunk-T4QGUXCV.js.map → chunk-MXCAJKMA.js.map} +0 -0
  472. /package/dist/{chunk-BMYZTZ5D.js.map → chunk-MY7B3HYC.js.map} +0 -0
  473. /package/dist/{chunk-NB3LRY4T.js.map → chunk-N4PYB235.js.map} +0 -0
  474. /package/dist/{chunk-S3YM4SZQ.js.map → chunk-N7QV3CMX.js.map} +0 -0
  475. /package/dist/{chunk-3GN2PEOT.js.map → chunk-NYKIUQL6.js.map} +0 -0
  476. /package/dist/{chunk-L2LBMKSI.js.map → chunk-OK52IY3W.js.map} +0 -0
  477. /package/dist/{chunk-WB2I2EQK.js.map → chunk-P2ODTYOF.js.map} +0 -0
  478. /package/dist/{chunk-RIEX7NOZ.js.map → chunk-PEBHPCX2.js.map} +0 -0
  479. /package/dist/{chunk-VYCOJKSX.js.map → chunk-PO7NXNGC.js.map} +0 -0
  480. /package/dist/{chunk-XAITGGX5.js.map → chunk-Q4AUIFUA.js.map} +0 -0
  481. /package/dist/{chunk-EU3N5MK3.js.map → chunk-QAW55ZHJ.js.map} +0 -0
  482. /package/dist/{chunk-I4G4UWQA.js.map → chunk-QI2E6ISQ.js.map} +0 -0
  483. /package/dist/{chunk-CK5U7JGH.js.map → chunk-QI7K7BZ5.js.map} +0 -0
  484. /package/dist/{chunk-VTPASHTO.js.map → chunk-R3X2T2LP.js.map} +0 -0
  485. /package/dist/{chunk-EJPF6XDQ.js.map → chunk-RDJ6C7NZ.js.map} +0 -0
  486. /package/dist/{chunk-2UPTRDGM.js.map → chunk-SCXURCVT.js.map} +0 -0
  487. /package/dist/{chunk-N3MNDVJO.js.map → chunk-SWBC3UER.js.map} +0 -0
  488. /package/dist/{chunk-ZTHGFTMW.js.map → chunk-TKC5LZ43.js.map} +0 -0
  489. /package/dist/{chunk-YRLHEEQT.js.map → chunk-U6VC6RP3.js.map} +0 -0
  490. /package/dist/{chunk-MOQPEFLN.js.map → chunk-UP75KL3L.js.map} +0 -0
  491. /package/dist/{chunk-D5F7TKMH.js.map → chunk-V4JZCTMK.js.map} +0 -0
  492. /package/dist/{chunk-NAYBHNGN.js.map → chunk-VALKBYBN.js.map} +0 -0
  493. /package/dist/{chunk-BUKK5SWA.js.map → chunk-VDX2J7OX.js.map} +0 -0
  494. /package/dist/{chunk-H36X4NRH.js.map → chunk-VVX5PZFS.js.map} +0 -0
  495. /package/dist/{chunk-RCQKAOOB.js.map → chunk-W3XXFPRI.js.map} +0 -0
  496. /package/dist/{chunk-W75BBBSY.js.map → chunk-WKY7N3L7.js.map} +0 -0
  497. /package/dist/{chunk-GZAGLCQH.js.map → chunk-X5SHE2O3.js.map} +0 -0
  498. /package/dist/{chunk-OAOBL6OY.js.map → chunk-XOV7NRY5.js.map} +0 -0
  499. /package/dist/{chunk-FZVROZKC.js.map → chunk-XVZA6VXC.js.map} +0 -0
  500. /package/dist/{chunk-IP5VLSLO.js.map → chunk-YJ7MW627.js.map} +0 -0
  501. /package/dist/{chunk-HS75MCQF.js.map → chunk-YRULQW5J.js.map} +0 -0
  502. /package/dist/{chunk-DINRT75P.js.map → chunk-YSBL7VPO.js.map} +0 -0
  503. /package/dist/{chunk-QWUJWBZ5.js.map → chunk-Z3O53WZR.js.map} +0 -0
  504. /package/dist/{chunk-KERNN6BC.js.map → chunk-Z5LP6ILP.js.map} +0 -0
  505. /package/dist/{chunk-5FNZ3G6X.js.map → chunk-Z6EZCN6Z.js.map} +0 -0
  506. /package/dist/{chunk-JS3S2HVG.js.map → chunk-ZZZ4I455.js.map} +0 -0
  507. /package/dist/{contradiction-scan-5EJYRKD3.js.map → contradiction-scan-TAGMOUQ2.js.map} +0 -0
  508. /package/dist/{graph-edge-decay-PVKDKLQK.js.map → embedding-generation-lock.js.map} +0 -0
  509. /package/dist/{resolution-UYJU5JUA.js.map → embedding-index-storage.js.map} +0 -0
  510. /package/dist/{state-ITXJKXRE.js.map → extraction-llm-health.js.map} +0 -0
  511. /package/dist/{first-start-migration-GAT7G733.js.map → first-start-migration-7OATHJKB.js.map} +0 -0
  512. /package/dist/{tui-55UJMJX7.js.map → graph-edge-decay-MKIRZ762.js.map} +0 -0
  513. /package/dist/{trace-ZFVRH4GO.js.map → trace-LXXCMZJA.js.map} +0 -0
@@ -19,6 +19,7 @@
19
19
  * the verdict never diverges across code paths.
20
20
  */
21
21
  import { coerceBool, coerceNumber } from "./connectors/coerce.js";
22
+ import { getExtractionLlmHealth } from "./extraction-llm-health.js";
22
23
  import { log } from "./logger.js";
23
24
  import type { OperatorDoctorCheck } from "./operator-doctor-types.js";
24
25
  import type { PluginConfig } from "./types.js";
@@ -121,6 +122,15 @@ export interface ExtractionLivenessStatus {
121
122
  degradedReason: string | null;
122
123
  watermarkPending?: boolean;
123
124
  watermarkScope: "aggregate";
125
+ /**
126
+ * Extraction-LLM availability (issue #3140): outcome of the last extraction
127
+ * attempt. `lastFailureReason` is non-null exactly while `llmReachable` is
128
+ * false. Populated by the daemon-wide status readers (`/health`, doctor,
129
+ * stats), not by the pure evaluators below.
130
+ */
131
+ llmReachable?: boolean;
132
+ lastFailureReason?: string | null;
133
+ lastFailureAt?: string | null;
124
134
  }
125
135
 
126
136
  interface ExtractionLivenessOrchestratorLike {
@@ -380,7 +390,9 @@ export async function computeExtractionLivenessStatus(
380
390
  nowMs,
381
391
  });
382
392
  throttle?.maybeWarn(status, config.staleWindowMs, nowMs);
383
- return status;
393
+ // Extraction-LLM availability (#3140): a silent no_models / LLM-unreachable
394
+ // outage must be visible on /health (and doctor/stats) without debug logs.
395
+ return { ...status, ...getExtractionLlmHealth() };
384
396
  }
385
397
 
386
398
  /**
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Extraction-LLM health surfacing (issue #3140).
3
+ *
4
+ * Covers the three #3140 surfaces:
5
+ * 1. the singleton tracker that `/health.extraction` reads for LLM
6
+ * availability + last failure reason,
7
+ * 2. the ERROR-level, per-reason-deduplicated failure event emitted by the
8
+ * extraction run instead of debug-only lines,
9
+ * 3. the runExtraction integration recording failures/successes.
10
+ */
11
+
12
+ import assert from "node:assert/strict";
13
+ import test from "node:test";
14
+
15
+ import {
16
+ emitExtractionLlmFailureError,
17
+ getExtractionLlmHealth,
18
+ recordExtractionLlmFailure,
19
+ recordExtractionLlmSuccess,
20
+ resetExtractionLlmHealthForTests,
21
+ } from "./extraction-llm-health.js";
22
+ import { log } from "./logger.js";
23
+
24
+ test("tracker: starts reachable with no failure recorded", () => {
25
+ resetExtractionLlmHealthForTests();
26
+ try {
27
+ assert.deepEqual(getExtractionLlmHealth(), {
28
+ llmReachable: true,
29
+ lastFailureReason: null,
30
+ lastFailureAt: null,
31
+ });
32
+ } finally {
33
+ resetExtractionLlmHealthForTests();
34
+ }
35
+ });
36
+
37
+ test("tracker: a failure marks the extractor unavailable with the last reason (health payload, non-debug)", () => {
38
+ resetExtractionLlmHealthForTests();
39
+ try {
40
+ recordExtractionLlmFailure("no_models", 1_000);
41
+ const health = getExtractionLlmHealth();
42
+ assert.equal(health.llmReachable, false);
43
+ assert.equal(health.lastFailureReason, "no_models");
44
+ assert.equal(health.lastFailureAt, new Date(1_000).toISOString());
45
+
46
+ recordExtractionLlmFailure("local_llm_unavailable", 2_000);
47
+ assert.equal(getExtractionLlmHealth().lastFailureReason, "local_llm_unavailable");
48
+ } finally {
49
+ resetExtractionLlmHealthForTests();
50
+ }
51
+ });
52
+
53
+ test("tracker: a later success clears the failure so llmReachable and the reason agree", () => {
54
+ resetExtractionLlmHealthForTests();
55
+ try {
56
+ recordExtractionLlmFailure("no_models");
57
+ recordExtractionLlmSuccess();
58
+ assert.deepEqual(getExtractionLlmHealth(), {
59
+ llmReachable: true,
60
+ lastFailureReason: null,
61
+ lastFailureAt: null,
62
+ });
63
+ } finally {
64
+ resetExtractionLlmHealthForTests();
65
+ }
66
+ });
67
+
68
+ test("dedup: the first failure of a reason logs at ERROR level, repeats are suppressed", () => {
69
+ resetExtractionLlmHealthForTests();
70
+ const errors: string[] = [];
71
+ const debugs: string[] = [];
72
+ const originalError = log.error;
73
+ const originalDebug = log.debug;
74
+ log.error = (message: unknown) => {
75
+ errors.push(String(message));
76
+ };
77
+ log.debug = (message: unknown) => {
78
+ debugs.push(String(message));
79
+ };
80
+ try {
81
+ assert.equal(emitExtractionLlmFailureError("no_models", "auth_config", 0), true);
82
+ assert.equal(errors.length, 1);
83
+ assert.match(errors[0] ?? "", /no_models/);
84
+
85
+ // Same reason inside the window: suppressed to debug, no second ERROR.
86
+ assert.equal(emitExtractionLlmFailureError("no_models", "auth_config", 60_000), false);
87
+ assert.equal(errors.length, 1);
88
+ assert.equal(debugs.length, 1);
89
+
90
+ // A different reason emits its own first ERROR.
91
+ assert.equal(emitExtractionLlmFailureError("local_llm_unavailable", undefined, 60_000), true);
92
+ assert.equal(errors.length, 2);
93
+ assert.match(errors[1] ?? "", /local_llm_unavailable/);
94
+
95
+ // Outside the window the same reason emits again.
96
+ assert.equal(emitExtractionLlmFailureError("no_models", undefined, 3_600_000), true);
97
+ assert.equal(errors.length, 3);
98
+ } finally {
99
+ log.error = originalError;
100
+ log.debug = originalDebug;
101
+ resetExtractionLlmHealthForTests();
102
+ }
103
+ });
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Extraction-LLM availability tracking surfaced on `/health` (issue #3140).
3
+ *
4
+ * A failing extraction LLM (unreachable endpoint, gateway with no models)
5
+ * used to surface only as debug-level lines while extraction silently skipped
6
+ * persistence and the buffer grew for days. The extraction run records every
7
+ * attempt outcome here; the access `/health` payload reads the last outcome so
8
+ * an unavailable extractor is visible without debug logs, and each distinct
9
+ * failure reason logs at ERROR level at most once per window instead of once
10
+ * per failed flush.
11
+ */
12
+
13
+ import { log } from "./logger.js";
14
+
15
+ export interface ExtractionLlmHealth {
16
+ /** Whether the LAST extraction attempt completed without a failure marker. */
17
+ llmReachable: boolean;
18
+ /** `failureReason` of the last failed attempt; null while reachable. */
19
+ lastFailureReason: string | null;
20
+ /** ISO timestamp of the last failed attempt; null while reachable. */
21
+ lastFailureAt: string | null;
22
+ }
23
+
24
+ /** One ERROR line per distinct reason per window; repeats stay at debug. */
25
+ const DEDUP_WINDOW_MS = 3_600_000;
26
+
27
+ let lastFailureReason: string | null = null;
28
+ let lastFailureAtMs: number | null = null;
29
+ const lastErrorEmitByReason = new Map<string, number>();
30
+
31
+ export function recordExtractionLlmSuccess(): void {
32
+ lastFailureReason = null;
33
+ lastFailureAtMs = null;
34
+ }
35
+
36
+ export function recordExtractionLlmFailure(reason: string, atMs: number = Date.now()): void {
37
+ lastFailureReason = reason;
38
+ lastFailureAtMs = atMs;
39
+ }
40
+
41
+ export function getExtractionLlmHealth(): ExtractionLlmHealth {
42
+ return {
43
+ llmReachable: lastFailureReason === null,
44
+ lastFailureReason,
45
+ lastFailureAt: lastFailureAtMs === null ? null : new Date(lastFailureAtMs).toISOString(),
46
+ };
47
+ }
48
+
49
+ /**
50
+ * ERROR-level, deduplicated failure event (issue #3140): the first failure of
51
+ * a given reason inside the window logs at error level; repeats inside the
52
+ * window log at debug so the backoff retry loop cannot flood the transcript
53
+ * while the outage stays visible. Returns whether the error line was emitted.
54
+ */
55
+ export function emitExtractionLlmFailureError(reason: string, detail?: string, nowMs: number = Date.now()): boolean {
56
+ const suffix = detail ? `: ${detail}` : "";
57
+ const last = lastErrorEmitByReason.get(reason);
58
+ if (last !== undefined && nowMs - last < DEDUP_WINDOW_MS) {
59
+ log.debug(`extraction failure repeat suppressed for ${DEDUP_WINDOW_MS / 60_000}m: ${reason}${suffix}`);
60
+ return false;
61
+ }
62
+ lastErrorEmitByReason.set(reason, nowMs);
63
+ log.error(`extraction failed with no durable outputs (buffer retained for retry): ${reason}${suffix}`);
64
+ return true;
65
+ }
66
+
67
+ /** Test seam: restore pristine singleton state. */
68
+ export function resetExtractionLlmHealthForTests(): void {
69
+ recordExtractionLlmSuccess();
70
+ lastErrorEmitByReason.clear();
71
+ }
package/src/index.ts CHANGED
@@ -876,12 +876,12 @@ export {
876
876
  type OfflineSyncFileRecord,
877
877
  type OfflineSyncFileContentChunk,
878
878
  type OfflineSyncRecordDeletionRevision,
879
- type OfflineSyncFileState,
880
- type OfflineSyncFileTarget,
881
- type OfflineSyncFileWriteTarget,
879
+ type OfflineSyncFileState, type OfflineSyncFileTarget, type OfflineSyncFileWriteTarget,
882
880
  type OfflineSyncSnapshot,
883
881
  type OfflineSyncState,
884
882
  } from "./offline-sync.js";
883
+ export { embeddingGenerationMembership, divergedEmbeddingGenerationDeferrals } from "./offline-sync-embedding-generation.js";
884
+ export { EmbeddingIndexCapacityError, EmbeddingIndexFileStore, EmbeddingIndexStorageError, parseEmbeddingIndexDocument, serializeEmbeddingShard, shardEntriesForIndex, shardIndexOf, validateShardMembership } from "./embedding-index-storage.js";
885
885
 
886
886
  // ---------------------------------------------------------------------------
887
887
  // Memory Extension Host (#382)
@@ -21,6 +21,12 @@ export function extractJsonCandidates(text: string): string[] {
21
21
  const cleaned = stripCodeFences(trimmed);
22
22
  const candidates: string[] = [];
23
23
 
24
+ // Verbatim balanced blocks FIRST: stripCodeFences rewrites every ``` pair, so
25
+ // a stripped candidate can parse while carrying altered content (e.g. a
26
+ // patch value that embeds an inner code block). A string-aware balanced scan
27
+ // of the unstripped text yields the payload unmodified; stripped candidates
28
+ // remain as later fallbacks for shapes the raw scan cannot cut.
29
+ candidates.push(...scanBalancedJsonBlocks(trimmed));
24
30
  if (cleaned.length > 0) candidates.push(cleaned);
25
31
  candidates.push(...scanBalancedJsonBlocks(cleaned));
26
32
 
@@ -356,3 +356,15 @@ test("request-level thinking override leaves short extraction thinking enabled (
356
356
  }
357
357
  assert.equal("reasoning_effort" in (bodies[0] ?? {}), false);
358
358
  });
359
+
360
+ test("disableThinking injects chat_template_kwargs for correction classify (#3134)", async () => {
361
+ const client = new LocalLlmClient(createConfig());
362
+ primeClient(client, { thinking: true, detected: "lmstudio" });
363
+ const { restore, bodies } = captureFetchBodies();
364
+ try {
365
+ await runOneChatCompletion(client, "correction-classify");
366
+ } finally {
367
+ restore();
368
+ }
369
+ assert.deepEqual(bodies[0]?.chat_template_kwargs, { enable_thinking: false });
370
+ });
package/src/local-llm.ts CHANGED
@@ -141,6 +141,7 @@ const THINKING_SUPPRESSED_OPERATIONS: ReadonlySet<string> = new Set([
141
141
  "day_summary",
142
142
  "hourly_summary",
143
143
  "hourly_summary_extended",
144
+ "correction-classify",
144
145
  ]);
145
146
 
146
147
  export interface LocalModelInfo {