@saihm/shm 0.0.0-stage → 0.38.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (672) hide show
  1. package/LICENSE +97 -0
  2. package/NOTICE +12 -0
  3. package/README.md +114 -2
  4. package/dist/adapter/epoch.d.ts +4 -0
  5. package/dist/adapter/epoch.d.ts.map +1 -0
  6. package/dist/adapter/epoch.js +16 -0
  7. package/dist/adapter/epoch.js.map +1 -0
  8. package/dist/adapter/frontmatter.d.ts +19 -0
  9. package/dist/adapter/frontmatter.d.ts.map +1 -0
  10. package/dist/adapter/frontmatter.js +95 -0
  11. package/dist/adapter/frontmatter.js.map +1 -0
  12. package/dist/adapter/index.d.ts +4 -0
  13. package/dist/adapter/index.d.ts.map +1 -0
  14. package/dist/adapter/index.js +4 -0
  15. package/dist/adapter/index.js.map +1 -0
  16. package/dist/adapter/markdown_dir_port.d.ts +48 -0
  17. package/dist/adapter/markdown_dir_port.d.ts.map +1 -0
  18. package/dist/adapter/markdown_dir_port.js +175 -0
  19. package/dist/adapter/markdown_dir_port.js.map +1 -0
  20. package/dist/aggregate/document_aggregation.d.ts +40 -0
  21. package/dist/aggregate/document_aggregation.d.ts.map +1 -0
  22. package/dist/aggregate/document_aggregation.js +101 -0
  23. package/dist/aggregate/document_aggregation.js.map +1 -0
  24. package/dist/aggregate/index.d.ts +2 -0
  25. package/dist/aggregate/index.d.ts.map +1 -0
  26. package/dist/aggregate/index.js +2 -0
  27. package/dist/aggregate/index.js.map +1 -0
  28. package/dist/answer/answer_layer.d.ts +33 -0
  29. package/dist/answer/answer_layer.d.ts.map +1 -0
  30. package/dist/answer/answer_layer.js +75 -0
  31. package/dist/answer/answer_layer.js.map +1 -0
  32. package/dist/answer/caching_body_source.d.ts +42 -0
  33. package/dist/answer/caching_body_source.d.ts.map +1 -0
  34. package/dist/answer/caching_body_source.js +120 -0
  35. package/dist/answer/caching_body_source.js.map +1 -0
  36. package/dist/answer/claude_cli_backend.d.ts +10 -0
  37. package/dist/answer/claude_cli_backend.d.ts.map +1 -0
  38. package/dist/answer/claude_cli_backend.js +60 -0
  39. package/dist/answer/claude_cli_backend.js.map +1 -0
  40. package/dist/answer/context.d.ts +6 -0
  41. package/dist/answer/context.d.ts.map +1 -0
  42. package/dist/answer/context.js +83 -0
  43. package/dist/answer/context.js.map +1 -0
  44. package/dist/answer/corpus_warmer.d.ts +44 -0
  45. package/dist/answer/corpus_warmer.d.ts.map +1 -0
  46. package/dist/answer/corpus_warmer.js +80 -0
  47. package/dist/answer/corpus_warmer.js.map +1 -0
  48. package/dist/answer/gate.d.ts +3 -0
  49. package/dist/answer/gate.d.ts.map +1 -0
  50. package/dist/answer/gate.js +35 -0
  51. package/dist/answer/gate.js.map +1 -0
  52. package/dist/answer/index.d.ts +20 -0
  53. package/dist/answer/index.d.ts.map +1 -0
  54. package/dist/answer/index.js +11 -0
  55. package/dist/answer/index.js.map +1 -0
  56. package/dist/answer/own_cell_body_source.d.ts +34 -0
  57. package/dist/answer/own_cell_body_source.d.ts.map +1 -0
  58. package/dist/answer/own_cell_body_source.js +66 -0
  59. package/dist/answer/own_cell_body_source.js.map +1 -0
  60. package/dist/answer/persistent_body_source.d.ts +50 -0
  61. package/dist/answer/persistent_body_source.d.ts.map +1 -0
  62. package/dist/answer/persistent_body_source.js +173 -0
  63. package/dist/answer/persistent_body_source.js.map +1 -0
  64. package/dist/answer/saihm_body_source.d.ts +27 -0
  65. package/dist/answer/saihm_body_source.d.ts.map +1 -0
  66. package/dist/answer/saihm_body_source.js +88 -0
  67. package/dist/answer/saihm_body_source.js.map +1 -0
  68. package/dist/answer/structured_answerer.d.ts +23 -0
  69. package/dist/answer/structured_answerer.d.ts.map +1 -0
  70. package/dist/answer/structured_answerer.js +103 -0
  71. package/dist/answer/structured_answerer.js.map +1 -0
  72. package/dist/answer/supersede.d.ts +12 -0
  73. package/dist/answer/supersede.d.ts.map +1 -0
  74. package/dist/answer/supersede.js +27 -0
  75. package/dist/answer/supersede.js.map +1 -0
  76. package/dist/answer/types.d.ts +53 -0
  77. package/dist/answer/types.d.ts.map +1 -0
  78. package/dist/answer/types.js +2 -0
  79. package/dist/answer/types.js.map +1 -0
  80. package/dist/assemble/brief.d.ts +83 -0
  81. package/dist/assemble/brief.d.ts.map +1 -0
  82. package/dist/assemble/brief.js +312 -0
  83. package/dist/assemble/brief.js.map +1 -0
  84. package/dist/assemble/index.d.ts +4 -0
  85. package/dist/assemble/index.d.ts.map +1 -0
  86. package/dist/assemble/index.js +4 -0
  87. package/dist/assemble/index.js.map +1 -0
  88. package/dist/assemble/posture.d.ts +23 -0
  89. package/dist/assemble/posture.d.ts.map +1 -0
  90. package/dist/assemble/posture.js +68 -0
  91. package/dist/assemble/posture.js.map +1 -0
  92. package/dist/assemble/thread.d.ts +53 -0
  93. package/dist/assemble/thread.d.ts.map +1 -0
  94. package/dist/assemble/thread.js +122 -0
  95. package/dist/assemble/thread.js.map +1 -0
  96. package/dist/attention/index.d.ts +5 -0
  97. package/dist/attention/index.d.ts.map +1 -0
  98. package/dist/attention/index.js +3 -0
  99. package/dist/attention/index.js.map +1 -0
  100. package/dist/attention/obligations.d.ts +23 -0
  101. package/dist/attention/obligations.d.ts.map +1 -0
  102. package/dist/attention/obligations.js +110 -0
  103. package/dist/attention/obligations.js.map +1 -0
  104. package/dist/attention/queue.d.ts +38 -0
  105. package/dist/attention/queue.d.ts.map +1 -0
  106. package/dist/attention/queue.js +102 -0
  107. package/dist/attention/queue.js.map +1 -0
  108. package/dist/claim/index.d.ts +23 -0
  109. package/dist/claim/index.d.ts.map +1 -0
  110. package/dist/claim/index.js +57 -0
  111. package/dist/claim/index.js.map +1 -0
  112. package/dist/claim/withdrawn.d.ts +17 -0
  113. package/dist/claim/withdrawn.d.ts.map +1 -0
  114. package/dist/claim/withdrawn.js +41 -0
  115. package/dist/claim/withdrawn.js.map +1 -0
  116. package/dist/compliance/index.d.ts +3 -0
  117. package/dist/compliance/index.d.ts.map +1 -0
  118. package/dist/compliance/index.js +3 -0
  119. package/dist/compliance/index.js.map +1 -0
  120. package/dist/compliance/report.d.ts +123 -0
  121. package/dist/compliance/report.d.ts.map +1 -0
  122. package/dist/compliance/report.js +295 -0
  123. package/dist/compliance/report.js.map +1 -0
  124. package/dist/compliance/trail.d.ts +180 -0
  125. package/dist/compliance/trail.d.ts.map +1 -0
  126. package/dist/compliance/trail.js +130 -0
  127. package/dist/compliance/trail.js.map +1 -0
  128. package/dist/consolidate/body_redundancy.d.ts +54 -0
  129. package/dist/consolidate/body_redundancy.d.ts.map +1 -0
  130. package/dist/consolidate/body_redundancy.js +150 -0
  131. package/dist/consolidate/body_redundancy.js.map +1 -0
  132. package/dist/consolidate/consolidator.d.ts +62 -0
  133. package/dist/consolidate/consolidator.d.ts.map +1 -0
  134. package/dist/consolidate/consolidator.js +260 -0
  135. package/dist/consolidate/consolidator.js.map +1 -0
  136. package/dist/consolidate/index.d.ts +4 -0
  137. package/dist/consolidate/index.d.ts.map +1 -0
  138. package/dist/consolidate/index.js +4 -0
  139. package/dist/consolidate/index.js.map +1 -0
  140. package/dist/consolidate/index_guard.d.ts +63 -0
  141. package/dist/consolidate/index_guard.d.ts.map +1 -0
  142. package/dist/consolidate/index_guard.js +212 -0
  143. package/dist/consolidate/index_guard.js.map +1 -0
  144. package/dist/coordination/identity.d.ts +39 -0
  145. package/dist/coordination/identity.d.ts.map +1 -0
  146. package/dist/coordination/identity.js +97 -0
  147. package/dist/coordination/identity.js.map +1 -0
  148. package/dist/coordination/inbound.d.ts +41 -0
  149. package/dist/coordination/inbound.d.ts.map +1 -0
  150. package/dist/coordination/inbound.js +119 -0
  151. package/dist/coordination/inbound.js.map +1 -0
  152. package/dist/coordination/index.d.ts +12 -0
  153. package/dist/coordination/index.d.ts.map +1 -0
  154. package/dist/coordination/index.js +7 -0
  155. package/dist/coordination/index.js.map +1 -0
  156. package/dist/coordination/note_lineage.d.ts +50 -0
  157. package/dist/coordination/note_lineage.d.ts.map +1 -0
  158. package/dist/coordination/note_lineage.js +132 -0
  159. package/dist/coordination/note_lineage.js.map +1 -0
  160. package/dist/coordination/outbound.d.ts +33 -0
  161. package/dist/coordination/outbound.d.ts.map +1 -0
  162. package/dist/coordination/outbound.js +69 -0
  163. package/dist/coordination/outbound.js.map +1 -0
  164. package/dist/coordination/share_states.d.ts +178 -0
  165. package/dist/coordination/share_states.d.ts.map +1 -0
  166. package/dist/coordination/share_states.js +864 -0
  167. package/dist/coordination/share_states.js.map +1 -0
  168. package/dist/coordination/untrusted_text.d.ts +3 -0
  169. package/dist/coordination/untrusted_text.d.ts.map +1 -0
  170. package/dist/coordination/untrusted_text.js +21 -0
  171. package/dist/coordination/untrusted_text.js.map +1 -0
  172. package/dist/deref/dereference.d.ts +68 -0
  173. package/dist/deref/dereference.d.ts.map +1 -0
  174. package/dist/deref/dereference.js +199 -0
  175. package/dist/deref/dereference.js.map +1 -0
  176. package/dist/deref/index.d.ts +3 -0
  177. package/dist/deref/index.d.ts.map +1 -0
  178. package/dist/deref/index.js +3 -0
  179. package/dist/deref/index.js.map +1 -0
  180. package/dist/deref/policy.d.ts +76 -0
  181. package/dist/deref/policy.d.ts.map +1 -0
  182. package/dist/deref/policy.js +281 -0
  183. package/dist/deref/policy.js.map +1 -0
  184. package/dist/derived/checkpoint.d.ts +22 -0
  185. package/dist/derived/checkpoint.d.ts.map +1 -0
  186. package/dist/derived/checkpoint.js +92 -0
  187. package/dist/derived/checkpoint.js.map +1 -0
  188. package/dist/derived/codec.d.ts +26 -0
  189. package/dist/derived/codec.d.ts.map +1 -0
  190. package/dist/derived/codec.js +116 -0
  191. package/dist/derived/codec.js.map +1 -0
  192. package/dist/derived/cycle.d.ts +96 -0
  193. package/dist/derived/cycle.d.ts.map +1 -0
  194. package/dist/derived/cycle.js +199 -0
  195. package/dist/derived/cycle.js.map +1 -0
  196. package/dist/derived/index.d.ts +7 -0
  197. package/dist/derived/index.d.ts.map +1 -0
  198. package/dist/derived/index.js +7 -0
  199. package/dist/derived/index.js.map +1 -0
  200. package/dist/derived/ledger.d.ts +54 -0
  201. package/dist/derived/ledger.d.ts.map +1 -0
  202. package/dist/derived/ledger.js +123 -0
  203. package/dist/derived/ledger.js.map +1 -0
  204. package/dist/derived/lineage_index.d.ts +17 -0
  205. package/dist/derived/lineage_index.d.ts.map +1 -0
  206. package/dist/derived/lineage_index.js +51 -0
  207. package/dist/derived/lineage_index.js.map +1 -0
  208. package/dist/derived/store.d.ts +92 -0
  209. package/dist/derived/store.d.ts.map +1 -0
  210. package/dist/derived/store.js +230 -0
  211. package/dist/derived/store.js.map +1 -0
  212. package/dist/embed/index.d.ts +5 -0
  213. package/dist/embed/index.d.ts.map +1 -0
  214. package/dist/embed/index.js +4 -0
  215. package/dist/embed/index.js.map +1 -0
  216. package/dist/embed/local_minilm.d.ts +9 -0
  217. package/dist/embed/local_minilm.d.ts.map +1 -0
  218. package/dist/embed/local_minilm.js +31 -0
  219. package/dist/embed/local_minilm.js.map +1 -0
  220. package/dist/embed/remote_http.d.ts +26 -0
  221. package/dist/embed/remote_http.d.ts.map +1 -0
  222. package/dist/embed/remote_http.js +40 -0
  223. package/dist/embed/remote_http.js.map +1 -0
  224. package/dist/embed/router.d.ts +16 -0
  225. package/dist/embed/router.d.ts.map +1 -0
  226. package/dist/embed/router.js +47 -0
  227. package/dist/embed/router.js.map +1 -0
  228. package/dist/embed/types.d.ts +23 -0
  229. package/dist/embed/types.d.ts.map +1 -0
  230. package/dist/embed/types.js +2 -0
  231. package/dist/embed/types.js.map +1 -0
  232. package/dist/entitlement/entitlement.d.ts +24 -0
  233. package/dist/entitlement/entitlement.d.ts.map +1 -0
  234. package/dist/entitlement/entitlement.js +78 -0
  235. package/dist/entitlement/entitlement.js.map +1 -0
  236. package/dist/entitlement/index.d.ts +2 -0
  237. package/dist/entitlement/index.d.ts.map +1 -0
  238. package/dist/entitlement/index.js +2 -0
  239. package/dist/entitlement/index.js.map +1 -0
  240. package/dist/erasure/bus.d.ts +18 -0
  241. package/dist/erasure/bus.d.ts.map +1 -0
  242. package/dist/erasure/bus.js +56 -0
  243. package/dist/erasure/bus.js.map +1 -0
  244. package/dist/erasure/changes_feed.d.ts +125 -0
  245. package/dist/erasure/changes_feed.d.ts.map +1 -0
  246. package/dist/erasure/changes_feed.js +252 -0
  247. package/dist/erasure/changes_feed.js.map +1 -0
  248. package/dist/erasure/changes_reader.d.ts +44 -0
  249. package/dist/erasure/changes_reader.d.ts.map +1 -0
  250. package/dist/erasure/changes_reader.js +184 -0
  251. package/dist/erasure/changes_reader.js.map +1 -0
  252. package/dist/erasure/feed_watcher.d.ts +140 -0
  253. package/dist/erasure/feed_watcher.d.ts.map +1 -0
  254. package/dist/erasure/feed_watcher.js +418 -0
  255. package/dist/erasure/feed_watcher.js.map +1 -0
  256. package/dist/erasure/index.d.ts +15 -0
  257. package/dist/erasure/index.d.ts.map +1 -0
  258. package/dist/erasure/index.js +8 -0
  259. package/dist/erasure/index.js.map +1 -0
  260. package/dist/erasure/index_watcher.d.ts +28 -0
  261. package/dist/erasure/index_watcher.d.ts.map +1 -0
  262. package/dist/erasure/index_watcher.js +87 -0
  263. package/dist/erasure/index_watcher.js.map +1 -0
  264. package/dist/erasure/reconcile.d.ts +72 -0
  265. package/dist/erasure/reconcile.d.ts.map +1 -0
  266. package/dist/erasure/reconcile.js +125 -0
  267. package/dist/erasure/reconcile.js.map +1 -0
  268. package/dist/erasure/withheld_store.d.ts +30 -0
  269. package/dist/erasure/withheld_store.d.ts.map +1 -0
  270. package/dist/erasure/withheld_store.js +91 -0
  271. package/dist/erasure/withheld_store.js.map +1 -0
  272. package/dist/fleet/index.d.ts +2 -0
  273. package/dist/fleet/index.d.ts.map +1 -0
  274. package/dist/fleet/index.js +2 -0
  275. package/dist/fleet/index.js.map +1 -0
  276. package/dist/fleet/knowledge.d.ts +74 -0
  277. package/dist/fleet/knowledge.d.ts.map +1 -0
  278. package/dist/fleet/knowledge.js +178 -0
  279. package/dist/fleet/knowledge.js.map +1 -0
  280. package/dist/gate/index.d.ts +5 -0
  281. package/dist/gate/index.d.ts.map +1 -0
  282. package/dist/gate/index.js +3 -0
  283. package/dist/gate/index.js.map +1 -0
  284. package/dist/gate/scope.d.ts +21 -0
  285. package/dist/gate/scope.d.ts.map +1 -0
  286. package/dist/gate/scope.js +40 -0
  287. package/dist/gate/scope.js.map +1 -0
  288. package/dist/gate/symmetry.d.ts +55 -0
  289. package/dist/gate/symmetry.d.ts.map +1 -0
  290. package/dist/gate/symmetry.js +162 -0
  291. package/dist/gate/symmetry.js.map +1 -0
  292. package/dist/history/answerable.d.ts +51 -0
  293. package/dist/history/answerable.d.ts.map +1 -0
  294. package/dist/history/answerable.js +112 -0
  295. package/dist/history/answerable.js.map +1 -0
  296. package/dist/history/index.d.ts +2 -0
  297. package/dist/history/index.d.ts.map +1 -0
  298. package/dist/history/index.js +2 -0
  299. package/dist/history/index.js.map +1 -0
  300. package/dist/host/adapter.d.ts +69 -0
  301. package/dist/host/adapter.d.ts.map +1 -0
  302. package/dist/host/adapter.js +159 -0
  303. package/dist/host/adapter.js.map +1 -0
  304. package/dist/host/cli.d.ts +3 -0
  305. package/dist/host/cli.d.ts.map +1 -0
  306. package/dist/host/cli.js +44 -0
  307. package/dist/host/cli.js.map +1 -0
  308. package/dist/host/client.d.ts +22 -0
  309. package/dist/host/client.d.ts.map +1 -0
  310. package/dist/host/client.js +135 -0
  311. package/dist/host/client.js.map +1 -0
  312. package/dist/host/compaction.d.ts +16 -0
  313. package/dist/host/compaction.d.ts.map +1 -0
  314. package/dist/host/compaction.js +89 -0
  315. package/dist/host/compaction.js.map +1 -0
  316. package/dist/host/event.d.ts +22 -0
  317. package/dist/host/event.d.ts.map +1 -0
  318. package/dist/host/event.js +47 -0
  319. package/dist/host/event.js.map +1 -0
  320. package/dist/host/index.d.ts +10 -0
  321. package/dist/host/index.d.ts.map +1 -0
  322. package/dist/host/index.js +10 -0
  323. package/dist/host/index.js.map +1 -0
  324. package/dist/host/reply.d.ts +11 -0
  325. package/dist/host/reply.d.ts.map +1 -0
  326. package/dist/host/reply.js +24 -0
  327. package/dist/host/reply.js.map +1 -0
  328. package/dist/host/session_brief.d.ts +80 -0
  329. package/dist/host/session_brief.d.ts.map +1 -0
  330. package/dist/host/session_brief.js +294 -0
  331. package/dist/host/session_brief.js.map +1 -0
  332. package/dist/host/session_start_event.d.ts +12 -0
  333. package/dist/host/session_start_event.d.ts.map +1 -0
  334. package/dist/host/session_start_event.js +35 -0
  335. package/dist/host/session_start_event.js.map +1 -0
  336. package/dist/host/sessions.d.ts +8 -0
  337. package/dist/host/sessions.d.ts.map +1 -0
  338. package/dist/host/sessions.js +32 -0
  339. package/dist/host/sessions.js.map +1 -0
  340. package/dist/host/socket_path.d.ts +3 -0
  341. package/dist/host/socket_path.d.ts.map +1 -0
  342. package/dist/host/socket_path.js +14 -0
  343. package/dist/host/socket_path.js.map +1 -0
  344. package/dist/inbound/index.d.ts +8 -0
  345. package/dist/inbound/index.d.ts.map +1 -0
  346. package/dist/inbound/index.js +5 -0
  347. package/dist/inbound/index.js.map +1 -0
  348. package/dist/index.d.ts +108 -0
  349. package/dist/index.d.ts.map +1 -0
  350. package/dist/index.js +55 -0
  351. package/dist/index.js.map +1 -0
  352. package/dist/ingest/index.d.ts +13 -0
  353. package/dist/ingest/index.d.ts.map +1 -0
  354. package/dist/ingest/index.js +146 -0
  355. package/dist/ingest/index.js.map +1 -0
  356. package/dist/ingest/parse.d.ts +20 -0
  357. package/dist/ingest/parse.d.ts.map +1 -0
  358. package/dist/ingest/parse.js +141 -0
  359. package/dist/ingest/parse.js.map +1 -0
  360. package/dist/ingest/resolve_prefix.d.ts +19 -0
  361. package/dist/ingest/resolve_prefix.d.ts.map +1 -0
  362. package/dist/ingest/resolve_prefix.js +63 -0
  363. package/dist/ingest/resolve_prefix.js.map +1 -0
  364. package/dist/ingest/types.d.ts +47 -0
  365. package/dist/ingest/types.d.ts.map +1 -0
  366. package/dist/ingest/types.js +2 -0
  367. package/dist/ingest/types.js.map +1 -0
  368. package/dist/inject/action_cue.d.ts +11 -0
  369. package/dist/inject/action_cue.d.ts.map +1 -0
  370. package/dist/inject/action_cue.js +49 -0
  371. package/dist/inject/action_cue.js.map +1 -0
  372. package/dist/inject/index.d.ts +11 -0
  373. package/dist/inject/index.d.ts.map +1 -0
  374. package/dist/inject/index.js +6 -0
  375. package/dist/inject/index.js.map +1 -0
  376. package/dist/inject/novelty.d.ts +19 -0
  377. package/dist/inject/novelty.d.ts.map +1 -0
  378. package/dist/inject/novelty.js +34 -0
  379. package/dist/inject/novelty.js.map +1 -0
  380. package/dist/inject/outcome.d.ts +20 -0
  381. package/dist/inject/outcome.d.ts.map +1 -0
  382. package/dist/inject/outcome.js +26 -0
  383. package/dist/inject/outcome.js.map +1 -0
  384. package/dist/inject/population.d.ts +6 -0
  385. package/dist/inject/population.d.ts.map +1 -0
  386. package/dist/inject/population.js +23 -0
  387. package/dist/inject/population.js.map +1 -0
  388. package/dist/inject/proactive_injector.d.ts +56 -0
  389. package/dist/inject/proactive_injector.d.ts.map +1 -0
  390. package/dist/inject/proactive_injector.js +153 -0
  391. package/dist/inject/proactive_injector.js.map +1 -0
  392. package/dist/inject/token_estimate.d.ts +3 -0
  393. package/dist/inject/token_estimate.d.ts.map +1 -0
  394. package/dist/inject/token_estimate.js +2 -0
  395. package/dist/inject/token_estimate.js.map +1 -0
  396. package/dist/inject/window.d.ts +6 -0
  397. package/dist/inject/window.d.ts.map +1 -0
  398. package/dist/inject/window.js +10 -0
  399. package/dist/inject/window.js.map +1 -0
  400. package/dist/modes/behaviour_modes.d.ts +21 -0
  401. package/dist/modes/behaviour_modes.d.ts.map +1 -0
  402. package/dist/modes/behaviour_modes.js +137 -0
  403. package/dist/modes/behaviour_modes.js.map +1 -0
  404. package/dist/policy/index.d.ts +2 -0
  405. package/dist/policy/index.d.ts.map +1 -0
  406. package/dist/policy/index.js +2 -0
  407. package/dist/policy/index.js.map +1 -0
  408. package/dist/policy/store_policy.d.ts +47 -0
  409. package/dist/policy/store_policy.d.ts.map +1 -0
  410. package/dist/policy/store_policy.js +125 -0
  411. package/dist/policy/store_policy.js.map +1 -0
  412. package/dist/profile/index.d.ts +5 -0
  413. package/dist/profile/index.d.ts.map +1 -0
  414. package/dist/profile/index.js +3 -0
  415. package/dist/profile/index.js.map +1 -0
  416. package/dist/profile/lever_profile.d.ts +27 -0
  417. package/dist/profile/lever_profile.d.ts.map +1 -0
  418. package/dist/profile/lever_profile.js +55 -0
  419. package/dist/profile/lever_profile.js.map +1 -0
  420. package/dist/profile/production.d.ts +12 -0
  421. package/dist/profile/production.d.ts.map +1 -0
  422. package/dist/profile/production.js +13 -0
  423. package/dist/profile/production.js.map +1 -0
  424. package/dist/provenance/build_fingerprint.d.ts +9 -0
  425. package/dist/provenance/build_fingerprint.d.ts.map +1 -0
  426. package/dist/provenance/build_fingerprint.js +47 -0
  427. package/dist/provenance/build_fingerprint.js.map +1 -0
  428. package/dist/provenance/derived_number.d.ts +33 -0
  429. package/dist/provenance/derived_number.d.ts.map +1 -0
  430. package/dist/provenance/derived_number.js +52 -0
  431. package/dist/provenance/derived_number.js.map +1 -0
  432. package/dist/provenance/index.d.ts +7 -0
  433. package/dist/provenance/index.d.ts.map +1 -0
  434. package/dist/provenance/index.js +4 -0
  435. package/dist/provenance/index.js.map +1 -0
  436. package/dist/provenance/live_state.d.ts +49 -0
  437. package/dist/provenance/live_state.d.ts.map +1 -0
  438. package/dist/provenance/live_state.js +141 -0
  439. package/dist/provenance/live_state.js.map +1 -0
  440. package/dist/rerank/cross_encoder.d.ts +14 -0
  441. package/dist/rerank/cross_encoder.d.ts.map +1 -0
  442. package/dist/rerank/cross_encoder.js +40 -0
  443. package/dist/rerank/cross_encoder.js.map +1 -0
  444. package/dist/rerank/identity.d.ts +6 -0
  445. package/dist/rerank/identity.d.ts.map +1 -0
  446. package/dist/rerank/identity.js +7 -0
  447. package/dist/rerank/identity.js.map +1 -0
  448. package/dist/rerank/index.d.ts +8 -0
  449. package/dist/rerank/index.d.ts.map +1 -0
  450. package/dist/rerank/index.js +5 -0
  451. package/dist/rerank/index.js.map +1 -0
  452. package/dist/rerank/reranking_retriever.d.ts +20 -0
  453. package/dist/rerank/reranking_retriever.d.ts.map +1 -0
  454. package/dist/rerank/reranking_retriever.js +38 -0
  455. package/dist/rerank/reranking_retriever.js.map +1 -0
  456. package/dist/rerank/reranking_select.d.ts +33 -0
  457. package/dist/rerank/reranking_select.d.ts.map +1 -0
  458. package/dist/rerank/reranking_select.js +116 -0
  459. package/dist/rerank/reranking_select.js.map +1 -0
  460. package/dist/rerank/types.d.ts +9 -0
  461. package/dist/rerank/types.d.ts.map +1 -0
  462. package/dist/rerank/types.js +2 -0
  463. package/dist/rerank/types.js.map +1 -0
  464. package/dist/resume/index.d.ts +3 -0
  465. package/dist/resume/index.d.ts.map +1 -0
  466. package/dist/resume/index.js +2 -0
  467. package/dist/resume/index.js.map +1 -0
  468. package/dist/resume/resume.d.ts +33 -0
  469. package/dist/resume/resume.d.ts.map +1 -0
  470. package/dist/resume/resume.js +86 -0
  471. package/dist/resume/resume.js.map +1 -0
  472. package/dist/retrieval/hnsw_store.d.ts +37 -0
  473. package/dist/retrieval/hnsw_store.d.ts.map +1 -0
  474. package/dist/retrieval/hnsw_store.js +284 -0
  475. package/dist/retrieval/hnsw_store.js.map +1 -0
  476. package/dist/retrieval/label_text.d.ts +2 -0
  477. package/dist/retrieval/label_text.d.ts.map +1 -0
  478. package/dist/retrieval/label_text.js +7 -0
  479. package/dist/retrieval/label_text.js.map +1 -0
  480. package/dist/retrieval/link_graph.d.ts +38 -0
  481. package/dist/retrieval/link_graph.d.ts.map +1 -0
  482. package/dist/retrieval/link_graph.js +118 -0
  483. package/dist/retrieval/link_graph.js.map +1 -0
  484. package/dist/retrieval/query_expansion.d.ts +18 -0
  485. package/dist/retrieval/query_expansion.d.ts.map +1 -0
  486. package/dist/retrieval/query_expansion.js +55 -0
  487. package/dist/retrieval/query_expansion.js.map +1 -0
  488. package/dist/retrieval/scope.d.ts +36 -0
  489. package/dist/retrieval/scope.d.ts.map +1 -0
  490. package/dist/retrieval/scope.js +120 -0
  491. package/dist/retrieval/scope.js.map +1 -0
  492. package/dist/retrieval/semantic.d.ts +136 -0
  493. package/dist/retrieval/semantic.d.ts.map +1 -0
  494. package/dist/retrieval/semantic.js +490 -0
  495. package/dist/retrieval/semantic.js.map +1 -0
  496. package/dist/retrieval/session_closed.d.ts +5 -0
  497. package/dist/retrieval/session_closed.d.ts.map +1 -0
  498. package/dist/retrieval/session_closed.js +8 -0
  499. package/dist/retrieval/session_closed.js.map +1 -0
  500. package/dist/retrieval/thread_lifecycle.d.ts +68 -0
  501. package/dist/retrieval/thread_lifecycle.d.ts.map +1 -0
  502. package/dist/retrieval/thread_lifecycle.js +201 -0
  503. package/dist/retrieval/thread_lifecycle.js.map +1 -0
  504. package/dist/retrieval/vector_store.d.ts +22 -0
  505. package/dist/retrieval/vector_store.d.ts.map +1 -0
  506. package/dist/retrieval/vector_store.js +41 -0
  507. package/dist/retrieval/vector_store.js.map +1 -0
  508. package/dist/retrieval/version_supersession.d.ts +13 -0
  509. package/dist/retrieval/version_supersession.d.ts.map +1 -0
  510. package/dist/retrieval/version_supersession.js +97 -0
  511. package/dist/retrieval/version_supersession.js.map +1 -0
  512. package/dist/saihm_client/federated_port.d.ts +30 -0
  513. package/dist/saihm_client/federated_port.d.ts.map +1 -0
  514. package/dist/saihm_client/federated_port.js +99 -0
  515. package/dist/saihm_client/federated_port.js.map +1 -0
  516. package/dist/saihm_client/in_memory_port.d.ts +35 -0
  517. package/dist/saihm_client/in_memory_port.d.ts.map +1 -0
  518. package/dist/saihm_client/in_memory_port.js +100 -0
  519. package/dist/saihm_client/in_memory_port.js.map +1 -0
  520. package/dist/saihm_client/index.d.ts +12 -0
  521. package/dist/saihm_client/index.d.ts.map +1 -0
  522. package/dist/saihm_client/index.js +8 -0
  523. package/dist/saihm_client/index.js.map +1 -0
  524. package/dist/saihm_client/mcp_client.d.ts +38 -0
  525. package/dist/saihm_client/mcp_client.d.ts.map +1 -0
  526. package/dist/saihm_client/mcp_client.js +266 -0
  527. package/dist/saihm_client/mcp_client.js.map +1 -0
  528. package/dist/saihm_client/server_features.d.ts +112 -0
  529. package/dist/saihm_client/server_features.d.ts.map +1 -0
  530. package/dist/saihm_client/server_features.js +415 -0
  531. package/dist/saihm_client/server_features.js.map +1 -0
  532. package/dist/saihm_client/share_guard.d.ts +9 -0
  533. package/dist/saihm_client/share_guard.d.ts.map +1 -0
  534. package/dist/saihm_client/share_guard.js +53 -0
  535. package/dist/saihm_client/share_guard.js.map +1 -0
  536. package/dist/saihm_client/timing.d.ts +100 -0
  537. package/dist/saihm_client/timing.d.ts.map +1 -0
  538. package/dist/saihm_client/timing.js +250 -0
  539. package/dist/saihm_client/timing.js.map +1 -0
  540. package/dist/saihm_client/types.d.ts +108 -0
  541. package/dist/saihm_client/types.d.ts.map +1 -0
  542. package/dist/saihm_client/types.js +19 -0
  543. package/dist/saihm_client/types.js.map +1 -0
  544. package/dist/service/handlers.d.ts +91 -0
  545. package/dist/service/handlers.d.ts.map +1 -0
  546. package/dist/service/handlers.js +173 -0
  547. package/dist/service/handlers.js.map +1 -0
  548. package/dist/service/http.d.ts +27 -0
  549. package/dist/service/http.d.ts.map +1 -0
  550. package/dist/service/http.js +261 -0
  551. package/dist/service/http.js.map +1 -0
  552. package/dist/service/index.d.ts +5 -0
  553. package/dist/service/index.d.ts.map +1 -0
  554. package/dist/service/index.js +5 -0
  555. package/dist/service/index.js.map +1 -0
  556. package/dist/service/resident.d.ts +50 -0
  557. package/dist/service/resident.d.ts.map +1 -0
  558. package/dist/service/resident.js +162 -0
  559. package/dist/service/resident.js.map +1 -0
  560. package/dist/service/service_level.d.ts +36 -0
  561. package/dist/service/service_level.d.ts.map +1 -0
  562. package/dist/service/service_level.js +65 -0
  563. package/dist/service/service_level.js.map +1 -0
  564. package/dist/session/change_feed.d.ts +82 -0
  565. package/dist/session/change_feed.d.ts.map +1 -0
  566. package/dist/session/change_feed.js +203 -0
  567. package/dist/session/change_feed.js.map +1 -0
  568. package/dist/session/index.d.ts +6 -0
  569. package/dist/session/index.d.ts.map +1 -0
  570. package/dist/session/index.js +4 -0
  571. package/dist/session/index.js.map +1 -0
  572. package/dist/session/memory_session.d.ts +426 -0
  573. package/dist/session/memory_session.d.ts.map +1 -0
  574. package/dist/session/memory_session.js +1183 -0
  575. package/dist/session/memory_session.js.map +1 -0
  576. package/dist/standing/content_fingerprint.d.ts +28 -0
  577. package/dist/standing/content_fingerprint.d.ts.map +1 -0
  578. package/dist/standing/content_fingerprint.js +95 -0
  579. package/dist/standing/content_fingerprint.js.map +1 -0
  580. package/dist/standing/standing_answers.d.ts +44 -0
  581. package/dist/standing/standing_answers.d.ts.map +1 -0
  582. package/dist/standing/standing_answers.js +72 -0
  583. package/dist/standing/standing_answers.js.map +1 -0
  584. package/dist/standing/standing_store.d.ts +44 -0
  585. package/dist/standing/standing_store.d.ts.map +1 -0
  586. package/dist/standing/standing_store.js +238 -0
  587. package/dist/standing/standing_store.js.map +1 -0
  588. package/dist/standing/surface.d.ts +20 -0
  589. package/dist/standing/surface.d.ts.map +1 -0
  590. package/dist/standing/surface.js +74 -0
  591. package/dist/standing/surface.js.map +1 -0
  592. package/dist/store/atomic_write.d.ts +7 -0
  593. package/dist/store/atomic_write.d.ts.map +1 -0
  594. package/dist/store/atomic_write.js +23 -0
  595. package/dist/store/atomic_write.js.map +1 -0
  596. package/dist/store/body_store.d.ts +42 -0
  597. package/dist/store/body_store.d.ts.map +1 -0
  598. package/dist/store/body_store.js +252 -0
  599. package/dist/store/body_store.js.map +1 -0
  600. package/dist/store/encrypted_store.d.ts +21 -0
  601. package/dist/store/encrypted_store.d.ts.map +1 -0
  602. package/dist/store/encrypted_store.js +266 -0
  603. package/dist/store/encrypted_store.js.map +1 -0
  604. package/dist/store/index.d.ts +21 -0
  605. package/dist/store/index.d.ts.map +1 -0
  606. package/dist/store/index.js +11 -0
  607. package/dist/store/index.js.map +1 -0
  608. package/dist/store/index_snapshot.d.ts +15 -0
  609. package/dist/store/index_snapshot.d.ts.map +1 -0
  610. package/dist/store/index_snapshot.js +126 -0
  611. package/dist/store/index_snapshot.js.map +1 -0
  612. package/dist/store/mcp_warm_start.d.ts +93 -0
  613. package/dist/store/mcp_warm_start.d.ts.map +1 -0
  614. package/dist/store/mcp_warm_start.js +406 -0
  615. package/dist/store/mcp_warm_start.js.map +1 -0
  616. package/dist/store/require_dir.d.ts +2 -0
  617. package/dist/store/require_dir.d.ts.map +1 -0
  618. package/dist/store/require_dir.js +9 -0
  619. package/dist/store/require_dir.js.map +1 -0
  620. package/dist/store/snapshot_format.d.ts +43 -0
  621. package/dist/store/snapshot_format.d.ts.map +1 -0
  622. package/dist/store/snapshot_format.js +119 -0
  623. package/dist/store/snapshot_format.js.map +1 -0
  624. package/dist/store/state_dir.d.ts +19 -0
  625. package/dist/store/state_dir.d.ts.map +1 -0
  626. package/dist/store/state_dir.js +42 -0
  627. package/dist/store/state_dir.js.map +1 -0
  628. package/dist/store/types.d.ts +37 -0
  629. package/dist/store/types.d.ts.map +1 -0
  630. package/dist/store/types.js +11 -0
  631. package/dist/store/types.js.map +1 -0
  632. package/dist/store/warm_index.d.ts +68 -0
  633. package/dist/store/warm_index.d.ts.map +1 -0
  634. package/dist/store/warm_index.js +279 -0
  635. package/dist/store/warm_index.js.map +1 -0
  636. package/dist/store/warm_start.d.ts +57 -0
  637. package/dist/store/warm_start.d.ts.map +1 -0
  638. package/dist/store/warm_start.js +68 -0
  639. package/dist/store/warm_start.js.map +1 -0
  640. package/dist/store/writer_lock.d.ts +34 -0
  641. package/dist/store/writer_lock.d.ts.map +1 -0
  642. package/dist/store/writer_lock.js +169 -0
  643. package/dist/store/writer_lock.js.map +1 -0
  644. package/dist/tiers/index.d.ts +2 -0
  645. package/dist/tiers/index.d.ts.map +1 -0
  646. package/dist/tiers/index.js +2 -0
  647. package/dist/tiers/index.js.map +1 -0
  648. package/dist/tiers/membership.d.ts +48 -0
  649. package/dist/tiers/membership.d.ts.map +1 -0
  650. package/dist/tiers/membership.js +85 -0
  651. package/dist/tiers/membership.js.map +1 -0
  652. package/dist/tuning/holdout.d.ts +54 -0
  653. package/dist/tuning/holdout.d.ts.map +1 -0
  654. package/dist/tuning/holdout.js +231 -0
  655. package/dist/tuning/holdout.js.map +1 -0
  656. package/dist/tuning/index.d.ts +7 -0
  657. package/dist/tuning/index.d.ts.map +1 -0
  658. package/dist/tuning/index.js +4 -0
  659. package/dist/tuning/index.js.map +1 -0
  660. package/dist/tuning/lever_stack.d.ts +27 -0
  661. package/dist/tuning/lever_stack.d.ts.map +1 -0
  662. package/dist/tuning/lever_stack.js +76 -0
  663. package/dist/tuning/lever_stack.js.map +1 -0
  664. package/dist/tuning/paired.d.ts +22 -0
  665. package/dist/tuning/paired.d.ts.map +1 -0
  666. package/dist/tuning/paired.js +74 -0
  667. package/dist/tuning/paired.js.map +1 -0
  668. package/dist/util/concurrency.d.ts +2 -0
  669. package/dist/util/concurrency.d.ts.map +1 -0
  670. package/dist/util/concurrency.js +19 -0
  671. package/dist/util/concurrency.js.map +1 -0
  672. package/package.json +140 -4
@@ -0,0 +1,1183 @@
1
+ import { checkEntitlement } from "../entitlement/entitlement.js";
2
+ import { buildWarmIndex } from "../store/warm_index.js";
3
+ import { SaihmBodySource } from "../answer/saihm_body_source.js";
4
+ import { CachingBodySource, DEFAULT_CACHE_CONFIG } from "../answer/caching_body_source.js";
5
+ import { PersistentBodySource } from "../answer/persistent_body_source.js";
6
+ import { OwnCellBodySource } from "../answer/own_cell_body_source.js";
7
+ import { restoreOrCold, takeSnapshot } from "../store/warm_start.js";
8
+ import { decodeIndexPart, encodeIndexPart, IndexPartError, INDEX_PART_NAME } from "../store/index_snapshot.js";
9
+ import { CorpusWarmer } from "../answer/corpus_warmer.js";
10
+ import { composeLeverStack } from "../tuning/lever_stack.js";
11
+ import { parseLifecycle, } from "../retrieval/thread_lifecycle.js";
12
+ import { ProactiveInjector } from "../inject/proactive_injector.js";
13
+ import { ErasureBus, ErasureDetector } from "../erasure/bus.js";
14
+ import { IndexWatcher } from "../erasure/index_watcher.js";
15
+ import { FeedWatcher, FileFeedCursorStore, resolveFeedPath } from "../erasure/feed_watcher.js";
16
+ import { FileWithheldStore, MemoryWithheldStore } from "../erasure/withheld_store.js";
17
+ import { acquireWriterLock, canonicalLockDir } from "../store/writer_lock.js";
18
+ import { collectListing, decideFromIndex, decideFromListing, decideFromProbe, summarize } from "../erasure/reconcile.js";
19
+ import { resolveChangesPath } from "../erasure/changes_feed.js";
20
+ import { ChangeFeedFollower } from "./change_feed.js";
21
+ import { parseServerFeatures } from "../saihm_client/server_features.js";
22
+ import { FederatedReadPort } from "../saihm_client/federated_port.js";
23
+ import { homedir } from "node:os";
24
+ import { dirname, join as joinPath } from "node:path";
25
+ import { ContentFingerprintIndex } from "../standing/content_fingerprint.js";
26
+ import { surfaceStanding } from "../standing/surface.js";
27
+ import { parseLabel } from "../ingest/parse.js";
28
+ import { scopeFrom, withLineage, composeScopes } from "../retrieval/scope.js";
29
+ import { isDerivedLabel } from "../derived/codec.js";
30
+ import { assembleThread } from "../assemble/thread.js";
31
+ import { assembleHistory, epochsFromHits } from "../history/answerable.js";
32
+ import { assembleFleetReport } from "../fleet/knowledge.js";
33
+ import { assembleComplianceReport } from "../compliance/report.js";
34
+ import { planTiers } from "../tiers/membership.js";
35
+ import { Consolidator } from "../consolidate/consolidator.js";
36
+ import { verifyResume } from "../resume/resume.js";
37
+ export class MemorySession {
38
+ retriever;
39
+ bodies;
40
+ answerRetriever;
41
+ bus;
42
+ detector;
43
+ warm;
44
+ port;
45
+ persistent;
46
+ bodyStore;
47
+ rerankRetriever;
48
+ threadRetriever;
49
+ standingWiring;
50
+ labelMap;
51
+ stampLookup;
52
+ lineageLookup;
53
+ embedder;
54
+ audit;
55
+ feedWatcher;
56
+ feedUnwired;
57
+ reconcileCfg;
58
+ reconcileUnwired;
59
+ watcher;
60
+ withheldNow = new Set();
61
+ lastReconcile;
62
+ reconcileChain = Promise.resolve();
63
+ withheldFault;
64
+ withheldLoadFaultOnce;
65
+ withheldLoadNote;
66
+ withheldForeign;
67
+ withheldLoadFault;
68
+ changeFollower;
69
+ changeUnwired;
70
+ ownReads;
71
+ ownReadsOff = "not wired";
72
+ warmStartWiring;
73
+ warmStartOff = "not requested — pass warmStart (a snapshot client) to restore and take snapshots";
74
+ lastWarmTake = null;
75
+ writerLocks;
76
+ writerLocksReleased;
77
+ closed = false;
78
+ withheldSaves = new Set();
79
+ withheldGuard;
80
+ constructor(retriever, bodies, answerRetriever, bus, detector, warm, port, persistent, bodyStore, rerankRetriever, threadRetriever, standingWiring, labelMap, stampLookup, lineageLookup, embedder, audit, feedWatcher, feedUnwired, reconcileCfg, reconcileUnwired) {
81
+ this.retriever = retriever;
82
+ this.bodies = bodies;
83
+ this.answerRetriever = answerRetriever;
84
+ this.bus = bus;
85
+ this.detector = detector;
86
+ this.warm = warm;
87
+ this.port = port;
88
+ this.persistent = persistent;
89
+ this.bodyStore = bodyStore;
90
+ this.rerankRetriever = rerankRetriever;
91
+ this.threadRetriever = threadRetriever;
92
+ this.standingWiring = standingWiring;
93
+ this.labelMap = labelMap;
94
+ this.stampLookup = stampLookup;
95
+ this.lineageLookup = lineageLookup;
96
+ this.embedder = embedder;
97
+ this.audit = audit;
98
+ this.feedWatcher = feedWatcher;
99
+ this.feedUnwired = feedUnwired;
100
+ this.reconcileCfg = reconcileCfg;
101
+ this.reconcileUnwired = reconcileUnwired;
102
+ }
103
+ static _create(retriever, bodies, answerRetriever, bus, detector, warm, port, persistent, bodyStore, rerankRetriever, threadRetriever, standingWiring, labelMap, stampLookup, lineageLookup, embedder, audit, feedWatcher, feedUnwired, reconcileCfg, reconcileUnwired) {
104
+ return new MemorySession(retriever, bodies, answerRetriever, bus, detector, warm, port, persistent, bodyStore, rerankRetriever, threadRetriever, standingWiring, labelMap, stampLookup, lineageLookup, embedder, audit, feedWatcher, feedUnwired, reconcileCfg, reconcileUnwired);
105
+ }
106
+ scope(spec) {
107
+ const base = scopeFrom(spec, {
108
+ stampOf: this.stampLookup,
109
+ namespaceOf: (id) => {
110
+ const label = this.labelMap.get(id);
111
+ return label === undefined ? undefined : parseLabel(label).namespace;
112
+ },
113
+ });
114
+ return withLineage(base, {
115
+ isDerived: (id) => isDerivedLabel(this.labelMap.get(id) ?? ""),
116
+ lineageOf: this.lineageLookup,
117
+ });
118
+ }
119
+ census(scope) {
120
+ return this.retriever.census(scope);
121
+ }
122
+ threads(opts = {}) {
123
+ const out = new Map();
124
+ for (const row of this.retriever.enumerate(opts.scope ?? composeScopes())) {
125
+ const t = this.stampLookup(row.cellId).thread;
126
+ if (t !== undefined)
127
+ out.set(t, (out.get(t) ?? 0) + 1);
128
+ }
129
+ return out;
130
+ }
131
+ thread(slug, opts = {}) {
132
+ const threadScope = this.scope({ threads: [slug] });
133
+ const scope = opts.scope === undefined ? threadScope : composeScopes(threadScope, opts.scope);
134
+ const asOf = opts.asOfEpoch !== undefined ? { asOfEpoch: opts.asOfEpoch } : undefined;
135
+ const rows = this.retriever.enumerate(scope, asOf);
136
+ const scoped = opts.scope === undefined ? undefined
137
+ : { name: opts.scope.name, notAdmitted: this.retriever.enumerate(threadScope, asOf).length - rows.length };
138
+ const anyThread = { name: "any-thread", admits: (id) => this.stampLookup(id).thread !== undefined };
139
+ const corpusHasThreadStamps = this.retriever.census(anyThread).admitted > 0;
140
+ const account = assembleThread(slug, rows, {
141
+ stampOf: this.stampLookup,
142
+ corpusHasThreadStamps,
143
+ labelOf: (id) => this.labelMap.get(id),
144
+ ...(opts.freshnessOf !== undefined ? { freshnessOf: opts.freshnessOf } : {}),
145
+ ...(opts.nowEpoch !== undefined ? { nowEpoch: opts.nowEpoch } : {}),
146
+ ...(opts.staleAfterHours !== undefined ? { staleAfterHours: opts.staleAfterHours } : {}),
147
+ });
148
+ const described = scoped === undefined ? account : { ...account, scoped };
149
+ if (opts.resume === undefined)
150
+ return described;
151
+ const report = verifyResume(opts.resume.claims, opts.resume.probes, opts.resume.here !== undefined ? { here: opts.resume.here } : {});
152
+ return { ...described, resume: report };
153
+ }
154
+ async history(query, opts = {}) {
155
+ const queryVector = await this.retriever.embedQuery(query);
156
+ const base = {
157
+ ...(opts.maxK !== undefined ? { maxK: opts.maxK } : {}),
158
+ ...(opts.scope !== undefined ? { scope: opts.scope } : {}),
159
+ queryVector,
160
+ };
161
+ const current = await this.retriever.selectDetailed(query, base);
162
+ const epochs = opts.at !== undefined ? [...new Set(opts.at)] : epochsFromHits(current);
163
+ const maxViews = Number.isInteger(opts.maxViews) && opts.maxViews >= 0 ? opts.maxViews : 32;
164
+ if (epochs.length > maxViews) {
165
+ throw new Error(`history: ${epochs.length} as-of views exceed maxViews=${maxViews} — refusing to truncate a timeline; raise maxViews or pass fewer epochs`);
166
+ }
167
+ const views = [];
168
+ for (const asOfEpoch of epochs)
169
+ views.push({ asOfEpoch, hits: await this.retriever.selectDetailed(query, { ...base, asOfEpoch }) });
170
+ const scopeOpt = opts.scope !== undefined ? { scope: opts.scope } : {};
171
+ return assembleHistory({
172
+ query,
173
+ current,
174
+ views,
175
+ reason: opts.at !== undefined ? "caller" : "arrival",
176
+ knowableAt: (cellId, asOfEpoch) => this.retriever.vetCandidates([cellId], { asOfEpoch, ...scopeOpt }).length === 1,
177
+ labelOf: (id) => this.labelMap.get(id),
178
+ threadOf: (id) => this.stampLookup(id).thread,
179
+ });
180
+ }
181
+ async fleet(opts = {}) {
182
+ const rows = this.retriever.enumerate(opts.scope ?? composeScopes());
183
+ const epochOf = new Map();
184
+ for (const r of rows)
185
+ if (r.ingestEpoch > 0)
186
+ epochOf.set(r.cellId, r.ingestEpoch);
187
+ const fleetRows = rows.map((r) => {
188
+ const label = this.labelMap.get(r.cellId);
189
+ const thread = this.stampLookup(r.cellId).thread;
190
+ return {
191
+ cellId: r.cellId,
192
+ ...(r.ingestEpoch > 0 ? { ingestEpoch: r.ingestEpoch } : {}),
193
+ namespace: label === undefined ? "unknown" : parseLabel(label).namespace,
194
+ ...(thread !== undefined ? { thread } : {}),
195
+ ...(r.supersededBy !== undefined ? { supersededBy: r.supersededBy } : {}),
196
+ ...(r.retiredBy !== undefined ? { retiredBy: r.retiredBy } : {}),
197
+ ...(r.derived === true ? { derived: true } : {}),
198
+ };
199
+ });
200
+ let clusters;
201
+ if (opts.clusters !== false) {
202
+ const entries = rows.map((r) => ({ cellId: r.cellId, label: this.labelMap.get(r.cellId) ?? "", epoch: r.ingestEpoch, byteSize: 0, tier: "index", forgotten: false }));
203
+ clusters = (await Consolidator.build(entries, this.embedder)).redundancyClusters();
204
+ }
205
+ const policy = {
206
+ ...(opts.thinBelow !== undefined ? { thinBelow: opts.thinBelow } : {}),
207
+ ...(opts.staleAfterHours !== undefined ? { staleAfterHours: opts.staleAfterHours } : {}),
208
+ ...(opts.driftWindowHours !== undefined ? { driftWindowHours: opts.driftWindowHours } : {}),
209
+ };
210
+ return assembleFleetReport({
211
+ rows: fleetRows,
212
+ ...(clusters !== undefined ? { clusters } : {}),
213
+ ...(opts.nowEpoch !== undefined ? { nowEpoch: opts.nowEpoch } : {}),
214
+ policy,
215
+ epochOf: (id) => epochOf.get(id),
216
+ });
217
+ }
218
+ async standing(question, retrievedCellIds, nowEpochMs, cfg = {}) {
219
+ if (!this.standingWiring) {
220
+ throw new Error("standing() requires a `standingStore` at openMemorySession. Without one there is no store " +
221
+ "to audit against and no erasure subscription for the answers it would write, so an empty " +
222
+ "result here would be indistinguishable from 'nothing matched'.");
223
+ }
224
+ const { store, index } = this.standingWiring;
225
+ return surfaceStanding(question, retrievedCellIds, { store, index }, nowEpochMs, cfg);
226
+ }
227
+ get standingStats() {
228
+ if (!this.standingWiring) {
229
+ return { enabled: false, refreshes: 0, bodyFailures: 0, fingerprintScope: "label" };
230
+ }
231
+ const { refreshes, bodyFailures } = this.standingWiring.index.stats;
232
+ return { enabled: true, refreshes, bodyFailures, fingerprintScope: this.standingWiring.scope };
233
+ }
234
+ async warmBodies(opts = {}) {
235
+ if (!this.persistent || !this.bodyStore) {
236
+ return {
237
+ scanned: 0, alreadyWarm: 0, ineligible: 0, targeted: 0, consumed: 0,
238
+ filled: 0, skippedPartial: 0, errors: 0,
239
+ remaining: 0, stoppedReason: "complete", elapsedMs: 0,
240
+ };
241
+ }
242
+ return new CorpusWarmer(this.port, this.bodyStore, this.persistent).warm(opts);
243
+ }
244
+ proactiveInjector(cfg = {}) {
245
+ const audit = this.audit;
246
+ const onResult = audit === undefined
247
+ ? cfg.onResult
248
+ : (result) => {
249
+ audit.recordInjection(result);
250
+ cfg.onResult?.(result);
251
+ };
252
+ return new ProactiveInjector(this.answerRetriever, this.bodies, { ...cfg, ...(onResult !== undefined ? { onResult } : {}) });
253
+ }
254
+ get auditTrail() {
255
+ return this.audit;
256
+ }
257
+ compliance(opts = {}) {
258
+ if (this.audit === undefined)
259
+ throw new Error("compliance: no audit trail configured — pass `audit: new AuditTrail(...)` at open");
260
+ const feed = this.erasureFeed;
261
+ const feedNotes = feed.mode === "watching" ? [] : [`erasure feed ${feed.mode}${feed.mode === "not-wired" ? `: ${feed.reason}` : ""} — protocol forgets reach this session only through checkErasures()/watch() or session.bus.publish()`];
262
+ const recon = this.reconciliation;
263
+ if (recon.mode !== "configured")
264
+ feedNotes.push(`reconciliation ${recon.mode}${recon.mode === "not-wired" ? `: ${recon.reason}` : ""} — a copied row outlives the cell it copies when the substrate's client fails to write a line`);
265
+ return assembleComplianceReport(this.audit.events(), { ...opts, dropped: this.audit.dropped, wired: { erasure: true, injection: true, paging: true, feed: this.feedWatcher !== undefined, reconciliation: this.reconcileCfg !== undefined }, feedWiring: feed.mode, notes: feedNotes });
266
+ }
267
+ async tiers(policy, opts) {
268
+ if (opts.apply === true && this.audit === undefined)
269
+ throw new Error("tiers: apply requires an audit trail — no audit trail configured, and paging nobody can observe is silent state");
270
+ const rows = this.retriever.enumerate(opts.scope ?? composeScopes());
271
+ const accesses = new Map();
272
+ if (this.audit !== undefined) {
273
+ for (const e of this.audit.events()) {
274
+ if (e.kind !== "injection")
275
+ continue;
276
+ for (const id of e.injected) {
277
+ const cur = accesses.get(id) ?? { count: 0 };
278
+ const last = e.atEpoch !== undefined && (cur.lastEpoch === undefined || e.atEpoch > cur.lastEpoch) ? e.atEpoch : cur.lastEpoch;
279
+ accesses.set(id, { count: cur.count + 1, ...(last !== undefined ? { lastEpoch: last } : {}) });
280
+ }
281
+ }
282
+ }
283
+ const signals = rows.map((r) => {
284
+ const label = this.labelMap.get(r.cellId);
285
+ const parsed = label === undefined ? undefined : parseLabel(label);
286
+ return {
287
+ cellId: r.cellId,
288
+ ...(r.ingestEpoch > 0 ? { ingestEpoch: r.ingestEpoch } : {}),
289
+ salient: parsed !== undefined && (parsed.salienceFloor || parsed.decayExempt),
290
+ ...(this.audit !== undefined ? { accesses: accesses.get(r.cellId) ?? { count: 0 } } : {}),
291
+ };
292
+ });
293
+ let warm = new Set();
294
+ const extraNotes = [];
295
+ if (this.bodyStore !== undefined) {
296
+ try {
297
+ warm = new Set(await this.bodyStore.list());
298
+ }
299
+ catch (e) {
300
+ extraNotes.push(`at-rest store could not be listed (${e.message}): warm membership read as empty`);
301
+ }
302
+ }
303
+ else {
304
+ extraNotes.push("no body store: the warm tier is not configured; promotions to warm cannot be applied");
305
+ }
306
+ const hot = new Set(rows.filter((r) => this.bodies.has(r.cellId)).map((r) => r.cellId));
307
+ const base = planTiers(signals, { hot, warm }, policy, opts.nowEpoch, this.audit !== undefined);
308
+ const plan = extraNotes.length > 0 ? { ...base, notes: [...base.notes, ...extraNotes] } : base;
309
+ if (opts.apply !== true)
310
+ return plan;
311
+ const audit = this.audit;
312
+ let promoted = 0;
313
+ let evicted = 0;
314
+ let failed = 0;
315
+ const presence = async (id) => (this.bodyStore === undefined ? "absent" : await this.bodyStore.presence(id));
316
+ for (const a of plan.promotions) {
317
+ let ok = false;
318
+ try {
319
+ if (a.to === "hot")
320
+ ok = (await this.bodies.fetchByIds([a.cellId])).length === 1 && this.bodies.has(a.cellId);
321
+ else if (this.persistent !== undefined)
322
+ ok = (await this.persistent.fetchByIds([a.cellId])).length === 1 && (await presence(a.cellId)) === "present";
323
+ }
324
+ catch {
325
+ ok = false;
326
+ }
327
+ audit.recordPaging(a, ok ? "applied" : "failed", opts.nowEpoch);
328
+ if (ok)
329
+ promoted++;
330
+ else
331
+ failed++;
332
+ }
333
+ for (const a of plan.evictions) {
334
+ let ok = false;
335
+ try {
336
+ let before = await presence(a.cellId);
337
+ if (a.to === "warm" && a.from === "hot" && before === "absent" && this.persistent !== undefined) {
338
+ const since = this.persistent.stamp();
339
+ const resident = this.bodies.peek(a.cellId);
340
+ if (resident !== undefined && (await this.persistent.persist(resident, since)) === "filled")
341
+ before = await presence(a.cellId);
342
+ }
343
+ if (!(a.to === "warm" && before !== "present") && !(a.to === "cold" && before === "unknown")) {
344
+ if (a.from === "hot")
345
+ this.bodies.evict(a.cellId);
346
+ if (a.to === "cold" && before === "present")
347
+ await this.bodyStore?.delete(a.cellId);
348
+ const after = await presence(a.cellId);
349
+ ok = !this.bodies.has(a.cellId) && after === (a.to === "cold" ? "absent" : "present");
350
+ }
351
+ }
352
+ catch {
353
+ ok = false;
354
+ }
355
+ audit.recordPaging(a, ok ? "applied" : "failed", opts.nowEpoch);
356
+ if (ok)
357
+ evicted++;
358
+ else
359
+ failed++;
360
+ }
361
+ return { ...plan, applied: { promoted, evicted, failed } };
362
+ }
363
+ get bodyStats() {
364
+ const ram = this.bodies.stats;
365
+ if (this.persistent === undefined || this.bodyStore === undefined)
366
+ return { ram };
367
+ const store = this.bodyStore;
368
+ let ineligible = 0;
369
+ for (const id of this.labelMap.keys())
370
+ if (!store.accepts(id))
371
+ ineligible++;
372
+ return { ram, atRest: { ...this.persistent.stats, ineligible, live: this.labelMap.size } };
373
+ }
374
+ get buildStats() {
375
+ return this.warm.stats;
376
+ }
377
+ get rerankStats() {
378
+ return this.rerankRetriever
379
+ ? { enabled: true, ...this.rerankRetriever.stats }
380
+ : { enabled: false, attempts: 0, fallbacks: 0 };
381
+ }
382
+ get threadStats() {
383
+ return this.threadRetriever
384
+ ? { enabled: true, ...this.threadRetriever.stats }
385
+ : { enabled: false, attempts: 0, threadsJoined: 0, demoted: 0, stampsResolved: 0, config: null };
386
+ }
387
+ async checkErasures() {
388
+ const all = [];
389
+ const MAX_PASSES = 32;
390
+ for (let pass = 0; pass < MAX_PASSES; pass++) {
391
+ const erased = await this.detector.checkOnce();
392
+ if (erased.length === 0)
393
+ return all;
394
+ all.push(...erased);
395
+ }
396
+ throw new Error(`checkErasures: still detecting erasures after ${MAX_PASSES} passes (${all.length} so far) — a listener keeps erasing; refusing to report a non-quiescent index as checked`);
397
+ }
398
+ watch(opts) {
399
+ this.watcher?.close();
400
+ const cfg = { dir: opts.dir };
401
+ if (opts.filename !== undefined)
402
+ cfg.filename = opts.filename;
403
+ if (opts.debounceMs !== undefined)
404
+ cfg.debounceMs = opts.debounceMs;
405
+ if (opts.pollMs !== undefined)
406
+ cfg.pollMs = opts.pollMs;
407
+ if (opts.onError !== undefined)
408
+ cfg.onError = opts.onError;
409
+ this.watcher = new IndexWatcher(cfg, () => this.checkErasures());
410
+ this.watcher.start();
411
+ }
412
+ _attachChangeFeed(follower, unwired) {
413
+ this.changeFollower = follower;
414
+ this.changeUnwired = unwired;
415
+ }
416
+ _attachOwnReads(own, off) {
417
+ this.ownReads = own;
418
+ this.ownReadsOff = off;
419
+ }
420
+ _attachWarmStart(wiring, off) {
421
+ this.warmStartWiring = wiring;
422
+ this.warmStartOff = off;
423
+ }
424
+ get warmStart() {
425
+ const w = this.warmStartWiring;
426
+ return w === undefined ? { mode: "not-wired", reason: this.warmStartOff } : { mode: "wired", restore: w.restore, lastTake: this.lastWarmTake };
427
+ }
428
+ async takeWarmStart() {
429
+ const w = this.warmStartWiring;
430
+ if (w === undefined)
431
+ return { ok: false, reason: `warm start is not wired: ${this.warmStartOff}` };
432
+ if (this.closed)
433
+ return { ok: false, reason: "the session is closed" };
434
+ const coversThrough = this.changeFollower?.appliedCursor() ?? null;
435
+ let bytes;
436
+ try {
437
+ bytes = encodeIndexPart(this.warm.currentRows(), this.warm.embeddingSpace);
438
+ }
439
+ catch (e) {
440
+ return { ok: false, reason: e instanceof IndexPartError ? `the index part could not be built: ${e.message}` : "the index part could not be built" };
441
+ }
442
+ const out = await takeSnapshot(w.client, { agentIdHash: w.identity, coversThrough, createdAt: new Date().toISOString(), parts: [{ name: INDEX_PART_NAME, bytes }] });
443
+ this.lastWarmTake = out;
444
+ return out;
445
+ }
446
+ get changeFeed() {
447
+ if (this.changeFollower === undefined)
448
+ return this.changeUnwired ?? { mode: "not-wired", reason: "no change feed follower" };
449
+ const by = this.ownReads?.stats;
450
+ const ownReads = by === undefined ? { mode: "by-label", reason: this.ownReadsOff } : by.stopped !== null ? { mode: "by-label", reason: by.stopped } : { mode: "by-id", ...by };
451
+ return { mode: "following", ownReads, ...this.changeFollower.status };
452
+ }
453
+ async syncChanges() {
454
+ if (this.changeFollower === undefined) {
455
+ const st = this.changeFeed;
456
+ throw new Error(`syncChanges: the change feed is ${st.mode}${st.mode === "not-wired" ? `: ${st.reason}` : ""}`);
457
+ }
458
+ await this.changeFollower.pull();
459
+ }
460
+ noteOwnWrite(receipt) {
461
+ this.changeFollower?.noteOwnWrite(receipt);
462
+ }
463
+ async _dropCachedBody(cellId, seq) {
464
+ this.ownReads?.supersede(cellId);
465
+ this.bodies.supersede(cellId, seq);
466
+ await this.persistent?.supersede(cellId, seq);
467
+ }
468
+ _attachWriterLocks(locks) {
469
+ this.writerLocks = locks;
470
+ if (locks !== undefined && this.reconcileCfg?.persisted === true) {
471
+ this.withheldGuard = locks.stateDirs.find((s) => s.holds.includes("withheld set"))?.lock ?? locks.index;
472
+ }
473
+ }
474
+ get writerLock() {
475
+ const l = this.writerLocks;
476
+ if (l !== undefined) {
477
+ const i = l.index;
478
+ return {
479
+ mode: "held", path: i.path, pid: i.holder.pid, host: i.holder.host, startedAt: i.holder.startedAt, sharedInProcess: i.sharedInProcess,
480
+ ...(l.stateDirs.length > 0 ? { stateDirs: l.stateDirs.map((s) => ({ path: s.lock.path, holds: s.holds, sharedInProcess: s.lock.sharedInProcess })) } : {}),
481
+ };
482
+ }
483
+ return this.writerLocksReleased ?? { mode: "opted-out" };
484
+ }
485
+ get erasureFeed() {
486
+ if (this.feedWatcher === undefined)
487
+ return this.feedUnwired ?? { mode: "not-wired", reason: "no feed watcher" };
488
+ return { mode: "watching", ...this.feedWatcher.status };
489
+ }
490
+ async checkFeed() {
491
+ if (this.feedWatcher === undefined) {
492
+ const st = this.erasureFeed;
493
+ throw new Error(`checkFeed: the erasure feed is ${st.mode}${st.mode === "not-wired" ? `: ${st.reason}` : ""}`);
494
+ }
495
+ return this.feedWatcher.runOnce();
496
+ }
497
+ get ingestStats() {
498
+ return this.warm.ingest;
499
+ }
500
+ get reconciliation() {
501
+ if (this.reconcileCfg === undefined)
502
+ return this.reconcileUnwired ?? { mode: "not-wired", reason: "no reconciliation configured" };
503
+ return {
504
+ mode: "configured", last: this.lastReconcile, withheld: [...this.withheldNow].sort(), persisted: this.reconcileCfg.persisted,
505
+ ...(this.withheldFault !== undefined ? { storeFault: this.withheldFault } : {}),
506
+ ...(this.withheldLoadFault !== undefined ? { loadFault: this.withheldLoadFault } : {}),
507
+ ...(this.withheldForeign !== undefined ? { foreignState: this.withheldForeign } : {}),
508
+ };
509
+ }
510
+ async release(cellId, reason) {
511
+ if (typeof cellId !== "string" || cellId.length === 0)
512
+ throw new TypeError("release: a cell id is required");
513
+ if (typeof reason !== "string" || reason.trim().length === 0)
514
+ throw new TypeError("release: a reason is required — the trail records who lifted a doubt and why");
515
+ if (this.reconcileCfg === undefined) {
516
+ const st = this.reconciliation;
517
+ throw new Error(`release: reconciliation is ${st.mode}${st.mode === "not-wired" ? `: ${st.reason}` : ""}`);
518
+ }
519
+ const run = this.reconcileChain.then(() => this.runRelease(cellId, reason.trim()));
520
+ this.reconcileChain = run.catch(() => { });
521
+ return run;
522
+ }
523
+ async runRelease(cellId, reason) {
524
+ if (!this.withheldNow.has(cellId)) {
525
+ this.audit?.recordRelease({ cellId, reason, outcome: "not-withheld" });
526
+ return { cellId, reason, outcome: "not-withheld" };
527
+ }
528
+ this.withheldNow.delete(cellId);
529
+ this.retriever.setWithheld(this.withheldNow);
530
+ const persisted = await this.persistWithheld();
531
+ const fault = this.withheldFault;
532
+ this.audit?.recordRelease({ cellId, reason, outcome: "released", persisted, ...(fault !== undefined ? { storeFault: fault } : {}) });
533
+ return { cellId, reason, outcome: "released", persisted, ...(fault !== undefined ? { fault } : {}) };
534
+ }
535
+ async persistWithheld() {
536
+ const cfg = this.reconcileCfg;
537
+ if (cfg === undefined)
538
+ return false;
539
+ if (this.closed) {
540
+ this.withheldFault = "the session is closed: no write lands after its writer locks go — this change is in memory only";
541
+ return false;
542
+ }
543
+ if (this.withheldGuard !== undefined && !this.withheldGuard.newestInProcess) {
544
+ this.withheldFault = "a newer session on this index holds the withheld set (the hot swap): this change is in memory only — make it on the newer session";
545
+ return false;
546
+ }
547
+ try {
548
+ const save = cfg.withheld.save([...this.withheldNow].sort());
549
+ this.withheldSaves.add(save);
550
+ try {
551
+ await save;
552
+ }
553
+ finally {
554
+ this.withheldSaves.delete(save);
555
+ }
556
+ this.withheldFault = undefined;
557
+ return cfg.persisted;
558
+ }
559
+ catch (e) {
560
+ this.withheldFault = `withheld store write failed: ${e instanceof Error ? e.message : String(e)} — doubts are per process until a write succeeds`;
561
+ return false;
562
+ }
563
+ }
564
+ async _loadWithheld() {
565
+ const cfg = this.reconcileCfg;
566
+ if (cfg === undefined)
567
+ return;
568
+ const file = cfg.withheld instanceof FileWithheldStore ? cfg.withheld : undefined;
569
+ if (file !== undefined && this.writerLocks === undefined) {
570
+ try {
571
+ await file.probeWritable();
572
+ }
573
+ catch (pe) {
574
+ this.withheldFault = `withheld store directory not writable at open: ${pe instanceof Error ? pe.message : String(pe)} — doubts are per process until a write succeeds`;
575
+ }
576
+ }
577
+ try {
578
+ const ids = await cfg.withheld.load();
579
+ const writtenBy = file?.lastLoadedOwner;
580
+ const self = file?.opts.owner;
581
+ const foreign = typeof writtenBy === "string" && self !== undefined && writtenBy !== self ? writtenBy : undefined;
582
+ const held = (ids ?? []).filter((id) => this.retriever.holds(id));
583
+ const dropped = (ids ?? []).length - held.length;
584
+ if (foreign !== undefined)
585
+ this.withheldForeign = { writtenBy: foreign, adopted: held.length, dropped };
586
+ if (ids !== undefined && ids.length > 0) {
587
+ this.withheldNow = new Set(held);
588
+ this.retriever.setWithheld(this.withheldNow);
589
+ if (dropped > 0) {
590
+ this.withheldLoadNote =
591
+ foreign !== undefined
592
+ ? `${dropped} persisted doubt(s) were written by another index (${foreign}) and name rows this index does not hold: dropped — they were that index's doubts, not rows this index held; a state directory belongs to one deployment`
593
+ : file !== undefined && writtenBy === null
594
+ ? `${dropped} persisted doubt(s) name rows this index does not hold: dropped — the file names no owner (written by a previous release), so they may have been another index's doubts rather than this index's stale rows`
595
+ : file === undefined
596
+ ? `${dropped} persisted doubt(s) name rows this index does not hold: dropped — the store records no writer, so whose doubts they were is unknown`
597
+ : `${dropped} persisted doubt(s) named rows this index no longer holds: dropped`;
598
+ }
599
+ }
600
+ }
601
+ catch (e) {
602
+ const why = e instanceof Error ? e.message : String(e);
603
+ let quarantined;
604
+ try {
605
+ quarantined = await cfg.withheld.quarantine?.();
606
+ }
607
+ catch (qe) {
608
+ quarantined = undefined;
609
+ this.withheldFault = `withheld store: the unreadable file could not be quarantined: ${qe instanceof Error ? qe.message : String(qe)}`;
610
+ }
611
+ this.withheldLoadFault = `withheld store unreadable at open: ${why} — every doubt held before this open is LOST${quarantined !== undefined ? ` (file moved to ${quarantined})` : ""}; every candidate is re-checked, and evidence re-raises a doubt only for a row still named as a candidate`;
612
+ this.withheldLoadFaultOnce = this.withheldLoadFault;
613
+ this.audit?.recordWithheldLost({ reason: this.withheldLoadFault, ...(quarantined !== undefined ? { quarantined } : {}) });
614
+ }
615
+ }
616
+ _onWithheldErased = async (cellId) => {
617
+ if (!this.withheldNow.delete(cellId))
618
+ return;
619
+ this.retriever.setWithheld(this.withheldNow);
620
+ const persisted = await this.persistWithheld();
621
+ this.audit?.recordWithheldErased({ cellId, persisted, ...(this.withheldFault !== undefined ? { storeFault: this.withheldFault } : {}) });
622
+ };
623
+ async reconcile() {
624
+ if (this.reconcileCfg === undefined) {
625
+ const st = this.reconciliation;
626
+ throw new Error(`reconcile: reconciliation is ${st.mode}${st.mode === "not-wired" ? `: ${st.reason}` : ""}`);
627
+ }
628
+ const cfg = this.reconcileCfg;
629
+ const run = this.reconcileChain.then(() => this.runReconcile(cfg));
630
+ this.reconcileChain = run.catch(() => { });
631
+ return run;
632
+ }
633
+ async runReconcile(cfg) {
634
+ const listedCandidates = await cfg.candidates();
635
+ const seenIds = new Set();
636
+ const all = listedCandidates.filter((c) => (seenIds.has(c.cellId) ? false : (seenIds.add(c.cellId), true)));
637
+ const held = all.filter((c) => this.retriever.holds(c.cellId));
638
+ const notes = [];
639
+ if (all.length < listedCandidates.length)
640
+ notes.push(`${listedCandidates.length - all.length} duplicate candidate(s) ignored (first occurrence kept)`);
641
+ if (held.length < all.length)
642
+ notes.push(`${all.length - held.length} candidate(s) name rows this index does not hold: skipped`);
643
+ let method = "none";
644
+ const decisions = [];
645
+ let deferred = 0;
646
+ let entries;
647
+ try {
648
+ const listed = await cfg.substrate.readIndex();
649
+ entries = new Map(listed.map((e) => [e.cellId.toLowerCase(), e]));
650
+ }
651
+ catch {
652
+ entries = undefined;
653
+ }
654
+ let listingComplete = false;
655
+ if (entries === undefined && cfg.listing && cfg.substrate.listVersionsPage !== undefined) {
656
+ const substrate = cfg.substrate;
657
+ const listing = await collectListing((after) => substrate.listVersionsPage(after));
658
+ if (listing.complete) {
659
+ listingComplete = true;
660
+ method = "listing";
661
+ for (const c of held)
662
+ decisions.push(decideFromListing(c, listing));
663
+ }
664
+ else {
665
+ notes.push(`the version listing was incomplete (${listing.incompleteReason ?? "no reason given"}): probed instead; it ends nothing`);
666
+ }
667
+ }
668
+ if (entries !== undefined) {
669
+ method = "index";
670
+ for (const c of held)
671
+ decisions.push(decideFromIndex(c, entries));
672
+ }
673
+ else if (!listingComplete) {
674
+ method = "recall";
675
+ const probed = held.slice(0, Math.max(0, cfg.maxProbes));
676
+ deferred = held.length - probed.length;
677
+ for (const c of probed) {
678
+ if (c.probe === undefined || c.probe.trim().length === 0) {
679
+ decisions.push(decideFromProbe(c, undefined));
680
+ continue;
681
+ }
682
+ let r;
683
+ try {
684
+ if (cfg.substrate.recallByQueryWithMeta !== undefined) {
685
+ const a = await cfg.substrate.recallByQueryWithMeta(c.probe);
686
+ r = { ok: true, bodies: a.bodies, cap: cfg.recallCap, ...(a.servedBy !== undefined ? { servedBy: a.servedBy } : {}) };
687
+ }
688
+ else {
689
+ r = { ok: true, bodies: await cfg.substrate.recallByQuery(c.probe), cap: cfg.recallCap };
690
+ }
691
+ }
692
+ catch (e) {
693
+ r = { ok: false, reason: e instanceof Error ? e.message : String(e) };
694
+ }
695
+ decisions.push(decideFromProbe(c, r));
696
+ }
697
+ }
698
+ const erased = decisions.filter((d) => d.verdict === "erased").map((d) => d.cellId);
699
+ const suspect = decisions.filter((d) => d.verdict === "suspect").map((d) => d.cellId);
700
+ const live = decisions.filter((d) => d.verdict === "live").map((d) => d.cellId);
701
+ const restored = live.filter((id) => this.withheldNow.has(id));
702
+ const next = new Set(this.withheldNow);
703
+ for (const id of live)
704
+ next.delete(id);
705
+ for (const id of erased)
706
+ next.delete(id);
707
+ for (const id of suspect)
708
+ next.add(id);
709
+ this.withheldNow = next;
710
+ this.retriever.setWithheld(next);
711
+ const persisted = await this.persistWithheld();
712
+ if (erased.length > 0)
713
+ await this.bus.publish(erased);
714
+ if (restored.length > 0)
715
+ notes.push(`${restored.length} withheld row(s) RESTORED: found again on the substrate`);
716
+ let loadFault;
717
+ let loadNote;
718
+ if (this.withheldLoadFaultOnce !== undefined) {
719
+ loadFault = this.withheldLoadFaultOnce;
720
+ notes.push(loadFault);
721
+ this.withheldLoadFaultOnce = undefined;
722
+ }
723
+ if (this.withheldLoadNote !== undefined) {
724
+ loadNote = this.withheldLoadNote;
725
+ notes.push(loadNote);
726
+ this.withheldLoadNote = undefined;
727
+ }
728
+ const storeFault = this.withheldFault;
729
+ if (!persisted && cfg.persisted && storeFault !== undefined)
730
+ notes.push(storeFault);
731
+ const summary = summarize(method, decisions, deferred, notes);
732
+ this.audit?.recordReconcile({ method, checked: summary.checked, live: summary.live, erased, suspect, restored, unverifiable: summary.unverifiable, deferred, withheld: [...this.withheldNow].sort(), persisted, ...(storeFault !== undefined ? { storeFault } : {}), ...(loadFault !== undefined ? { loadFault } : {}), ...(loadNote !== undefined ? { loadNote } : {}) });
733
+ this.lastReconcile = summary;
734
+ return summary;
735
+ }
736
+ async flush() {
737
+ await this.warm.flush();
738
+ }
739
+ async close() {
740
+ this.retriever.fence();
741
+ this.bodies.fence();
742
+ const indexWatcher = this.watcher;
743
+ indexWatcher?.close();
744
+ this.watcher = undefined;
745
+ this.feedWatcher?.close();
746
+ this.changeFollower?.close();
747
+ await this.changeFollower?.settled();
748
+ await this.feedWatcher?.settled();
749
+ await indexWatcher?.settled();
750
+ for (let chain = this.reconcileChain;; chain = this.reconcileChain) {
751
+ await chain;
752
+ if (chain === this.reconcileChain)
753
+ break;
754
+ }
755
+ this.closed = true;
756
+ await Promise.allSettled([...this.withheldSaves]);
757
+ await this.warm.flush();
758
+ const l = this.writerLocks;
759
+ if (l !== undefined) {
760
+ this.writerLocks = undefined;
761
+ this.writerLocksReleased = { mode: "released", path: l.index.path, ...(l.stateDirs.length > 0 ? { stateDirs: l.stateDirs.map((s) => ({ path: s.lock.path, holds: s.holds })) } : {}) };
762
+ await releaseLocks(l);
763
+ }
764
+ }
765
+ }
766
+ export async function openMemorySession(opts) {
767
+ const entitlement = await checkEntitlement(entitlementSource(opts), opts.entitlementTimeoutMs !== undefined ? { timeoutMs: opts.entitlementTimeoutMs } : {});
768
+ const plan = planStateFiles(opts);
769
+ if (opts.writerLock === false)
770
+ return openMemorySessionLocked(opts, plan, undefined, entitlement);
771
+ const indexDir = await canonicalLockDir(opts.store.dir);
772
+ const locks = { index: await acquireWriterLock(opts.store.dir, { owner: indexDir }), stateDirs: [] };
773
+ try {
774
+ for (const g of await stateDirsOutside(plan, indexDir))
775
+ locks.stateDirs.push({ lock: await acquireWriterLock(g.dir, { owner: indexDir }), holds: g.holds });
776
+ return await openMemorySessionLocked(opts, plan, locks, entitlement);
777
+ }
778
+ catch (e) {
779
+ await releaseLocks(locks);
780
+ throw e;
781
+ }
782
+ }
783
+ function entitlementSource(opts) {
784
+ if (opts.entitlement !== undefined)
785
+ return opts.entitlement;
786
+ const port = opts.port;
787
+ return typeof port.status === "function" ? opts.port : undefined;
788
+ }
789
+ async function releaseLocks(l) {
790
+ for (const s of [...l.stateDirs].reverse())
791
+ await s.lock.release();
792
+ await l.index.release();
793
+ }
794
+ function ownCellEventsAdvertised(entitlement) {
795
+ const events = parseServerFeatures(entitlement.status ?? {}).events;
796
+ return events.kind === "available" && events.value.ownCellEvents;
797
+ }
798
+ function ownReadsPlan(opts, entitlement) {
799
+ const cf = opts.changeFeed;
800
+ if (cf === undefined || cf === false)
801
+ return { reason: "no change feed: only a cell the feed announces is read by id" };
802
+ if (cf.ownReads === false)
803
+ return { reason: "opted out (changeFeed.ownReads: false)" };
804
+ const port = opts.port;
805
+ if (port.recallOwn === undefined)
806
+ return { reason: "the port offers no read by id (recallOwn)" };
807
+ if (cf.ownReads !== true && !ownCellEventsAdvertised(entitlement)) {
808
+ return { reason: "own-cell events are not advertised: reads by id run only where the server advertises them" };
809
+ }
810
+ return { reader: { recallOwn: (cellId) => port.recallOwn(cellId) } };
811
+ }
812
+ async function restoreIndexRows(ws, store, space, identity) {
813
+ let local;
814
+ try {
815
+ local = await store.load(space);
816
+ }
817
+ catch {
818
+ return { outcome: "cold", reason: "the local index could not be read (its key): the build decides" };
819
+ }
820
+ if (local.state === "loaded")
821
+ return { outcome: "skipped", reason: "a local index for this embedding space is present" };
822
+ const r = await restoreOrCold(ws, { agentIdHash: identity });
823
+ if (r.mode === "cold")
824
+ return { outcome: "cold", reason: r.reason };
825
+ const part = r.parts.get(INDEX_PART_NAME);
826
+ if (part === undefined)
827
+ return { outcome: "cold", reason: `the snapshot carries no ${INDEX_PART_NAME} part` };
828
+ const d = decodeIndexPart(part, space);
829
+ if (!d.ok)
830
+ return { outcome: "cold", reason: `the snapshot's index part did not verify: ${d.reason}` };
831
+ try {
832
+ await store.save(d.rows, space);
833
+ }
834
+ catch {
835
+ return { outcome: "cold", reason: "the restored rows could not be written to the local index" };
836
+ }
837
+ return { outcome: "restored", snapshotId: r.snapshotId, coversThrough: r.coversThrough, rows: d.rows.length };
838
+ }
839
+ function reconcileSubstrate(r, port) {
840
+ const substrate = r.substrate ?? (port instanceof FederatedReadPort ? undefined : port);
841
+ if (substrate === undefined)
842
+ return { reason: "the session's port is a federation (tagged ids, a union index) — pass reconcile.substrate: the raw substrate port" };
843
+ if (substrate instanceof FederatedReadPort)
844
+ return { reason: "reconcile.substrate is a FederatedReadPort — its ids are tagged and its index is a union, so neither speaks for the substrate; pass the raw substrate port" };
845
+ return { substrate };
846
+ }
847
+ function planStateFiles(opts) {
848
+ const tenantId = opts.tenantId ?? opts.store.tenantId;
849
+ let feedCursor;
850
+ if (opts.erasureFeed !== false) {
851
+ const fo = opts.erasureFeed ?? {};
852
+ if (fo.path !== undefined || (opts.agentIdHash ?? opts.port.agentIdHash) !== undefined) {
853
+ feedCursor = joinPath(fo.stateDir ?? opts.store.dir, `erasure-feed.cursor.${tenantId}.json`);
854
+ }
855
+ }
856
+ let withheld;
857
+ if (opts.reconcile !== undefined && opts.reconcile !== false && opts.reconcile.withheld === undefined && "substrate" in reconcileSubstrate(opts.reconcile, opts.port)) {
858
+ withheld = joinPath(opts.reconcile.stateDir ?? opts.store.dir, `reconcile.withheld.${tenantId}.json`);
859
+ }
860
+ return { ...(feedCursor !== undefined ? { feedCursor } : {}), ...(withheld !== undefined ? { withheld } : {}) };
861
+ }
862
+ async function stateDirsOutside(plan, indexDir) {
863
+ const out = [];
864
+ const roles = [["erasure-feed cursor", plan.feedCursor], ["withheld set", plan.withheld]];
865
+ for (const [role, file] of roles) {
866
+ if (file === undefined)
867
+ continue;
868
+ const dir = await canonicalLockDir(dirname(file));
869
+ if (dir === indexDir)
870
+ continue;
871
+ const same = out.find((g) => g.dir === dir);
872
+ if (same !== undefined)
873
+ same.holds.push(role);
874
+ else
875
+ out.push({ dir, holds: [role] });
876
+ }
877
+ return out;
878
+ }
879
+ function planned(path, what) {
880
+ if (path === undefined)
881
+ throw new Error(`openMemorySession: internal — the lock plan does not cover the ${what} this wiring is about to write`);
882
+ return path;
883
+ }
884
+ async function openMemorySessionLocked(opts, plan, locks, entitlement) {
885
+ const tenantId = opts.tenantId ?? opts.store.tenantId;
886
+ const raw = await opts.port.readIndex();
887
+ const exclude = new Set(opts.excludeNamespaces ?? []);
888
+ const entries = exclude.size === 0 ? raw : raw.filter((e) => !exclude.has(parseLabel(e.label).namespace));
889
+ const warmOpts = { tenantId };
890
+ if (opts.rrf !== undefined)
891
+ warmOpts.rrf = opts.rrf;
892
+ if (opts.port instanceof FederatedReadPort)
893
+ warmOpts.namespaceSeparator = opts.port.separator;
894
+ const warmStartIdentity = opts.agentIdHash ?? opts.port.agentIdHash;
895
+ const warmStartPlan = opts.warmStart === undefined
896
+ ? { reason: "not requested — pass warmStart (a snapshot client) to restore and take snapshots" }
897
+ : warmStartIdentity === undefined || !/^[0-9a-f]{64}$/.test(warmStartIdentity)
898
+ ? { reason: "identity unknown — pass agentIdHash (or a port that carries it): a snapshot belongs to one identity" }
899
+ : { identity: warmStartIdentity, restore: await restoreIndexRows(opts.warmStart, opts.store, { modelId: opts.embedder.modelId, dim: opts.embedder.dim }, warmStartIdentity) };
900
+ const warm = await buildWarmIndex(entries, opts.embedder, opts.store, warmOpts);
901
+ const source = new SaihmBodySource(opts.port, opts.bodyConfig ?? {});
902
+ const ownPlan = ownReadsPlan(opts, entitlement);
903
+ const byId = "reader" in ownPlan ? new OwnCellBodySource(source, ownPlan.reader) : undefined;
904
+ const live = byId ?? source;
905
+ const tierLatency = opts.tierLatency;
906
+ const record = (tier, ms) => tierLatency?.record(tier, ms);
907
+ const persistent = opts.bodyStore
908
+ ? new PersistentBodySource(live, opts.bodyStore, tierLatency !== undefined ? { onServed: (step, ms) => record(step === "own" ? "warm" : "cold", ms) } : {})
909
+ : undefined;
910
+ const auditTrail = opts.audit;
911
+ const bodies = new CachingBodySource(persistent ?? live, {
912
+ ...DEFAULT_CACHE_CONFIG,
913
+ ...(tierLatency !== undefined
914
+ ? {
915
+ onServed: (step, ms) => {
916
+ if (step === "own")
917
+ record("hot", ms);
918
+ else if (persistent === undefined)
919
+ record("cold", ms);
920
+ },
921
+ }
922
+ : {}),
923
+ ...(auditTrail !== undefined
924
+ ? {
925
+ onEvict: (cellId) => {
926
+ const at = opts.bodyStore?.presenceSync(cellId) ?? "absent";
927
+ auditTrail.recordPaging({
928
+ cellId,
929
+ from: "hot",
930
+ to: at === "present" ? "warm" : "cold",
931
+ reason: at === "unknown" ? "RAM cache capacity (LRU); the at-rest copy could not be checked" : "RAM cache capacity (LRU)",
932
+ }, "applied");
933
+ },
934
+ }
935
+ : {}),
936
+ });
937
+ if (opts.bodyStore && persistent) {
938
+ const live = new Set(entries.filter((e) => !e.forgotten).map((e) => e.cellId));
939
+ let stored = [];
940
+ try {
941
+ stored = await opts.bodyStore.list();
942
+ }
943
+ catch {
944
+ stored = [];
945
+ }
946
+ for (const id of stored) {
947
+ if (live.has(id))
948
+ continue;
949
+ try {
950
+ await persistent.forget(id);
951
+ }
952
+ catch {
953
+ }
954
+ }
955
+ }
956
+ const bus = new ErasureBus();
957
+ bus.subscribe((cellId) => warm.onErased(cellId));
958
+ bus.subscribe(async (cellId) => {
959
+ await bodies.forget(cellId);
960
+ if (persistent)
961
+ await persistent.forget(cellId);
962
+ await source.forget(cellId);
963
+ byId?.forget(cellId);
964
+ });
965
+ const detector = new ErasureDetector(opts.port, bus);
966
+ detector.prime(entries);
967
+ let answerRetriever = warm.retriever;
968
+ const labelOf = new Map(entries.filter((e) => !e.forgotten).map((e) => [e.cellId, e.label]));
969
+ {
970
+ bus.subscribe((cellId) => {
971
+ labelOf.delete(cellId);
972
+ });
973
+ }
974
+ let stampOf;
975
+ if (opts.stampOf) {
976
+ stampOf = opts.stampOf;
977
+ }
978
+ else {
979
+ const stampMemo = new Map();
980
+ bus.subscribe((cellId) => {
981
+ stampMemo.delete(cellId);
982
+ });
983
+ stampOf = (id) => {
984
+ const hit = stampMemo.get(id);
985
+ if (hit !== undefined)
986
+ return hit;
987
+ const label = labelOf.get(id);
988
+ const stamp = label === undefined ? {} : parseLifecycle(label);
989
+ if (label !== undefined)
990
+ stampMemo.set(id, stamp);
991
+ return stamp;
992
+ };
993
+ }
994
+ const stackDeps = {
995
+ base: answerRetriever,
996
+ labelOf: (id) => labelOf.get(id),
997
+ bodies,
998
+ ...(opts.reranker !== undefined ? { reranker: opts.reranker } : {}),
999
+ stampOf,
1000
+ ...(opts.onRerankFallback !== undefined ? { onRerankFallback: opts.onRerankFallback } : {}),
1001
+ };
1002
+ const stack = composeLeverStack(stackDeps, opts);
1003
+ answerRetriever = stack.retriever;
1004
+ const rerankRetriever = stack.rerankRetriever;
1005
+ const threadRetriever = stack.threadRetriever;
1006
+ let standingWiring;
1007
+ if (opts.standingStore) {
1008
+ const standingLabelOf = opts.standingLabelOf ?? ((id) => labelOf.get(id));
1009
+ const index = new ContentFingerprintIndex(standingLabelOf, opts.standingBodies ? { bodies: opts.standingBodies } : {});
1010
+ const store = opts.standingStore;
1011
+ bus.subscribe(store.purge);
1012
+ bus.subscribe((cellId) => index.forget(cellId));
1013
+ standingWiring = { store, index, scope: opts.standingBodies ? "label+body" : "label" };
1014
+ }
1015
+ if (opts.derivedStore) {
1016
+ const ds = opts.derivedStore;
1017
+ const cascade = ds.cascade;
1018
+ if (cascade !== undefined) {
1019
+ bus.subscribe(async (cellId) => {
1020
+ const report = await cascade(cellId);
1021
+ if (report.forgotten.length > 0)
1022
+ await bus.publish(report.forgotten);
1023
+ });
1024
+ }
1025
+ else
1026
+ bus.subscribe(ds.onSourceErased);
1027
+ }
1028
+ if (opts.audit)
1029
+ bus.subscribe(opts.audit.erasureListener());
1030
+ const shared = opts.derivedLineage;
1031
+ if (shared?.forget)
1032
+ bus.subscribe((cellId) => shared.forget(cellId));
1033
+ const own = opts.derivedStore;
1034
+ const lineageLookup = (cellId) => own?.lineageOf?.(cellId) ?? shared?.lineageOf(cellId);
1035
+ if (own?.retirements) {
1036
+ const apply = () => warm.retriever.setRetirements(own.retirements());
1037
+ apply();
1038
+ bus.subscribe(() => apply());
1039
+ }
1040
+ if (opts.onErased !== undefined)
1041
+ bus.subscribe(opts.onErased);
1042
+ let feed;
1043
+ let feedUnwired;
1044
+ let feedPathWired;
1045
+ let follower;
1046
+ let lastFeedPoint;
1047
+ if (opts.erasureFeed === false) {
1048
+ feedUnwired = { mode: "opted-out" };
1049
+ }
1050
+ else {
1051
+ const fo = opts.erasureFeed ?? {};
1052
+ const identity = opts.agentIdHash ?? opts.port.agentIdHash;
1053
+ if (identity !== undefined && !/^[0-9a-f]{64}$/.test(identity))
1054
+ throw new Error("openMemorySession: agentIdHash must be a 64-hex agentIdHash");
1055
+ let feedPath = fo.path;
1056
+ if (feedPath === undefined) {
1057
+ if (identity === undefined) {
1058
+ feedUnwired = { mode: "not-wired", reason: "identity unknown — pass agentIdHash (or a port that carries it; a FederatedReadPort forwards the one identity its sources agree on) so the per-identity feed can be located, or erasureFeed: false to opt out explicitly" };
1059
+ }
1060
+ else {
1061
+ feedPath = resolveFeedPath({ identity, env: fo.env ?? process.env, homeDir: fo.homeDir ?? homedir() });
1062
+ }
1063
+ }
1064
+ if (feedPath !== undefined) {
1065
+ const trail = auditTrail;
1066
+ const map = fo.mapCellId ?? ((id) => [id]);
1067
+ feedPathWired = feedPath;
1068
+ const sink = {
1069
+ consume: async (batch) => {
1070
+ const ids = [...new Set(batch.flatMap((b) => map(b.line.cellId)))];
1071
+ if (ids.length > 0)
1072
+ await bus.publish(ids);
1073
+ if (trail !== undefined)
1074
+ for (const b of batch)
1075
+ trail.recordFeed(b);
1076
+ if (follower !== undefined)
1077
+ for (const b of batch)
1078
+ follower.erased(b.line.cellId);
1079
+ },
1080
+ progressed: (point) => {
1081
+ lastFeedPoint = point;
1082
+ follower?.erasureProgress(point);
1083
+ },
1084
+ ...(trail !== undefined ? { fault: (f) => trail.recordFeedFault(f) } : {}),
1085
+ };
1086
+ feed = new FeedWatcher({
1087
+ path: feedPath,
1088
+ ...(identity !== undefined ? { agentIdHash: identity } : {}),
1089
+ cursor: new FileFeedCursorStore(planned(plan.feedCursor, "erasure-feed cursor")),
1090
+ ...(fo.pollMs !== undefined ? { pollMs: fo.pollMs } : {}),
1091
+ ...(fo.onError !== undefined ? { onError: fo.onError } : {}),
1092
+ ...(fo.now !== undefined ? { now: fo.now } : {}),
1093
+ ...(fo.watch !== undefined ? { watch: fo.watch } : {}),
1094
+ }, sink);
1095
+ await feed.load();
1096
+ const consumedBefore = trail !== undefined ? await feed.consumedLines() : [];
1097
+ await feed.start();
1098
+ if (trail !== undefined) {
1099
+ const live = new Set(entries.filter((e) => !e.forgotten).map((e) => e.cellId));
1100
+ for (const l of consumedBefore)
1101
+ if (map(l.cellId).some((id) => live.has(id)))
1102
+ trail.recordFeedLive(l.cellId);
1103
+ }
1104
+ }
1105
+ }
1106
+ let reconcileCfg;
1107
+ let reconcileUnwired;
1108
+ if (opts.reconcile === false) {
1109
+ reconcileUnwired = { mode: "opted-out" };
1110
+ }
1111
+ else if (opts.reconcile === undefined) {
1112
+ reconcileUnwired = { mode: "not-wired", reason: "no candidates named — pass reconcile: { candidates, substrate } to reconcile copied rows against the substrate, or reconcile: false to opt out explicitly" };
1113
+ }
1114
+ else {
1115
+ const wiring = reconcileSubstrate(opts.reconcile, opts.port);
1116
+ if (!("substrate" in wiring)) {
1117
+ reconcileUnwired = { mode: "not-wired", reason: wiring.reason };
1118
+ }
1119
+ else {
1120
+ const substrate = wiring.substrate;
1121
+ const withheld = opts.reconcile.withheld ?? new FileWithheldStore(planned(plan.withheld, "withheld set"), { owner: locks?.index.dir ?? (await canonicalLockDir(opts.store.dir)) });
1122
+ reconcileCfg = {
1123
+ candidates: opts.reconcile.candidates, substrate, atOpen: opts.reconcile.atOpen ?? true, maxProbes: opts.reconcile.maxProbes ?? 25, recallCap: opts.reconcile.recallCap ?? 200,
1124
+ listing: opts.reconcile.listing ?? (substrate.listVersionsPage !== undefined && ownCellEventsAdvertised(entitlement)),
1125
+ withheld, persisted: !(withheld instanceof MemoryWithheldStore),
1126
+ };
1127
+ }
1128
+ }
1129
+ const session = MemorySession._create(warm.retriever, bodies, answerRetriever, bus, detector, warm, opts.port, persistent, opts.bodyStore, rerankRetriever, threadRetriever, standingWiring, labelOf, stampOf, lineageLookup, opts.embedder, opts.audit, feed, feedUnwired, reconcileCfg, reconcileUnwired);
1130
+ session._attachWriterLocks(locks);
1131
+ session._attachOwnReads(byId, "reason" in ownPlan ? ownPlan.reason : "");
1132
+ session._attachWarmStart(opts.warmStart !== undefined && "identity" in warmStartPlan ? { client: opts.warmStart, ...warmStartPlan } : undefined, "reason" in warmStartPlan ? warmStartPlan.reason : "");
1133
+ const changeIdentity = opts.agentIdHash ?? opts.port.agentIdHash;
1134
+ if (opts.changeFeed === undefined || opts.changeFeed === false) {
1135
+ session._attachChangeFeed(undefined, { mode: "not-wired", reason: opts.changeFeed === false ? "opted out" : "not requested — pass changeFeed: {} to follow the identity's change feed" });
1136
+ }
1137
+ else if (changeIdentity === undefined || !/^[0-9a-f]{64}$/.test(changeIdentity)) {
1138
+ session._attachChangeFeed(undefined, { mode: "not-wired", reason: "identity unknown — pass agentIdHash (or a port that carries it) so the per-identity change feed can be located" });
1139
+ }
1140
+ else {
1141
+ const co = opts.changeFeed;
1142
+ const changesPath = co.path ?? resolveChangesPath({ identity: changeIdentity, env: co.env ?? process.env, homeDir: co.homeDir ?? homedir() });
1143
+ const map = (opts.erasureFeed !== false ? opts.erasureFeed?.mapCellId : undefined) ?? ((id) => [id]);
1144
+ follower = new ChangeFeedFollower({
1145
+ path: changesPath,
1146
+ erasurePath: feedPathWired ?? joinPath(dirname(changesPath), "erasures.ndjson"),
1147
+ agentIdHash: changeIdentity,
1148
+ ...(co.pollMs !== undefined ? { pollMs: co.pollMs } : {}),
1149
+ ...(co.livenessMs !== undefined ? { livenessMs: co.livenessMs } : {}),
1150
+ ...(co.reconcileRetryMs !== undefined ? { reconcileRetryMs: co.reconcileRetryMs } : {}),
1151
+ ...(co.now !== undefined ? { now: co.now } : {}),
1152
+ ...(co.onError !== undefined ? { onError: co.onError } : {}),
1153
+ ...(co.timer !== undefined ? { timer: co.timer } : {}),
1154
+ }, {
1155
+ invalidate: async (cellId, version) => {
1156
+ for (const id of map(cellId))
1157
+ await session._dropCachedBody(id, version.seq);
1158
+ },
1159
+ ...(co.onChanged !== undefined ? { onChanged: co.onChanged } : {}),
1160
+ ...(reconcileCfg !== undefined ? { reconcileByListing: async () => (await session.reconcile()).method === "listing" } : {}),
1161
+ });
1162
+ session._attachChangeFeed(follower, undefined);
1163
+ if (lastFeedPoint !== undefined)
1164
+ follower.erasureProgress(lastFeedPoint);
1165
+ }
1166
+ if (reconcileCfg !== undefined) {
1167
+ bus.subscribe(session._onWithheldErased);
1168
+ await session._loadWithheld();
1169
+ if (reconcileCfg.atOpen && follower === undefined)
1170
+ await session.reconcile();
1171
+ }
1172
+ if (follower !== undefined) {
1173
+ try {
1174
+ await follower.start();
1175
+ }
1176
+ catch (e) {
1177
+ await session.close();
1178
+ throw e;
1179
+ }
1180
+ }
1181
+ return session;
1182
+ }
1183
+ //# sourceMappingURL=memory_session.js.map