@remnic/core 9.7.8 → 9.7.10

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 (406) hide show
  1. package/dist/access-admin-ops-surface.d.ts +6 -6
  2. package/dist/access-admin-ops-surface.js +32 -30
  3. package/dist/access-audit.js +2 -2
  4. package/dist/access-boundary.d.ts +6 -6
  5. package/dist/access-boundary.js +33 -31
  6. package/dist/access-cli.js +92 -90
  7. package/dist/access-cli.js.map +1 -1
  8. package/dist/access-http.d.ts +6 -6
  9. package/dist/access-http.js +40 -38
  10. package/dist/access-identity-continuity-surface.d.ts +5 -5
  11. package/dist/access-identity-continuity-surface.js +32 -30
  12. package/dist/access-lcm-surface.d.ts +6 -6
  13. package/dist/access-lcm-surface.js +32 -30
  14. package/dist/access-mcp.d.ts +6 -6
  15. package/dist/access-mcp.js +37 -35
  16. package/dist/access-observe-write-surface.d.ts +6 -6
  17. package/dist/access-observe-write-surface.js +32 -30
  18. package/dist/access-operations-batch.js +35 -33
  19. package/dist/access-operations.d.ts +9 -9
  20. package/dist/access-operations.js +36 -34
  21. package/dist/access-recall-surface.d.ts +6 -6
  22. package/dist/access-recall-surface.js +32 -30
  23. package/dist/access-schema.d.ts +64 -64
  24. package/dist/{access-service-CxDZXTKt.d.ts → access-service-DSuzikHQ.d.ts} +4 -4
  25. package/dist/access-service.d.ts +6 -6
  26. package/dist/access-service.js +32 -30
  27. package/dist/access-surface-catalog.d.ts +6 -6
  28. package/dist/action-confidence.d.ts +1 -1
  29. package/dist/active-memory-bridge.d.ts +1 -1
  30. package/dist/active-recall.d.ts +1 -1
  31. package/dist/active-recall.js +1 -1
  32. package/dist/adapters/index.js +4 -4
  33. package/dist/adapters/registry.js +2 -2
  34. package/dist/{auto-sync-676N6N6Y.js → auto-sync-AAMTVZMK.js} +5 -5
  35. package/dist/behavior-learner.d.ts +1 -1
  36. package/dist/behavior-signals.d.ts +1 -1
  37. package/dist/bootstrap.d.ts +5 -5
  38. package/dist/briefing.d.ts +2 -2
  39. package/dist/briefing.js +15 -13
  40. package/dist/buffer-surprise-report.d.ts +1 -1
  41. package/dist/buffer.d.ts +2 -2
  42. package/dist/bulk-import/index.d.ts +3 -3
  43. package/dist/calibration.d.ts +1 -1
  44. package/dist/calibration.js +2 -2
  45. package/dist/capabilities.d.ts +1 -1
  46. package/dist/{capsule-merge-GK5E647P.js → capsule-merge-Z2HUO6IK.js} +10 -2
  47. package/dist/capsule-merge-Z2HUO6IK.js.map +1 -0
  48. package/dist/{catalog-DzU9HowE.d.ts → catalog-BNwjACa5.d.ts} +1 -1
  49. package/dist/causal-behavior.d.ts +1 -1
  50. package/dist/causal-consolidation.d.ts +1 -1
  51. package/dist/causal-consolidation.js +16 -14
  52. package/dist/causal-consolidation.js.map +1 -1
  53. package/dist/causal-trajectory-graph.d.ts +1 -1
  54. package/dist/{chunk-HHAA35A3.js → chunk-2VN4JAX7.js} +548 -161
  55. package/dist/chunk-2VN4JAX7.js.map +1 -0
  56. package/dist/{chunk-CNWC274T.js → chunk-3OQ4IZJN.js} +28 -28
  57. package/dist/{chunk-JO5AT6QT.js → chunk-3ZVFLMFQ.js} +1 -1
  58. package/dist/chunk-3ZVFLMFQ.js.map +1 -0
  59. package/dist/{chunk-7XH7VJN4.js → chunk-5S7Z5SHA.js} +2 -2
  60. package/dist/{chunk-WKE4VXSZ.js → chunk-673NPXE3.js} +2 -2
  61. package/dist/{chunk-Q6JPMCPO.js → chunk-7CKS4AXY.js} +63 -58
  62. package/dist/chunk-7CKS4AXY.js.map +1 -0
  63. package/dist/{chunk-UHGHTOR5.js → chunk-7EX4YOKH.js} +7 -7
  64. package/dist/{chunk-TVVEYCNW.js → chunk-7K5Q6COX.js} +4 -4
  65. package/dist/{chunk-EJCVMPIM.js → chunk-7LMEY5KZ.js} +15 -1
  66. package/dist/chunk-7LMEY5KZ.js.map +1 -0
  67. package/dist/{chunk-3F4N4WDH.js → chunk-AHLPZ2SF.js} +2 -2
  68. package/dist/{chunk-6C35R7P4.js → chunk-DJCKXI4M.js} +2 -2
  69. package/dist/{chunk-AD2KK5MT.js → chunk-DLWYAN6A.js} +9 -3
  70. package/dist/chunk-DLWYAN6A.js.map +1 -0
  71. package/dist/{chunk-TVRPRFUB.js → chunk-EQF5763Z.js} +9 -7
  72. package/dist/chunk-EQF5763Z.js.map +1 -0
  73. package/dist/{chunk-FYKIEOG6.js → chunk-FNJX2O6G.js} +3 -3
  74. package/dist/{chunk-DQPPRXFO.js → chunk-HQ7QZJM5.js} +2 -2
  75. package/dist/{chunk-RKNJBZ55.js → chunk-JBPKEARU.js} +4 -4
  76. package/dist/{chunk-KIPLG7S7.js → chunk-JKLJ6A7W.js} +2 -2
  77. package/dist/{chunk-O3BZ6PFY.js → chunk-JZM5QUTE.js} +2 -2
  78. package/dist/{chunk-KTOH7EJE.js → chunk-KXLRMM35.js} +312 -48
  79. package/dist/chunk-KXLRMM35.js.map +1 -0
  80. package/dist/{chunk-ZUFJ7ZTR.js → chunk-L4H6MQ7I.js} +6 -2
  81. package/dist/chunk-L4H6MQ7I.js.map +1 -0
  82. package/dist/{chunk-SYNYI4ZM.js → chunk-L5HJQC36.js} +2 -2
  83. package/dist/{chunk-VXMWDXIJ.js → chunk-LC7OODWZ.js} +2 -2
  84. package/dist/{chunk-ZW6OKHVX.js → chunk-LQKITFGB.js} +2 -2
  85. package/dist/{chunk-TZJVTH3F.js → chunk-MXRMNKSY.js} +14 -14
  86. package/dist/{chunk-GL3SMLMZ.js → chunk-N3LWQJ6Y.js} +150 -119
  87. package/dist/chunk-N3LWQJ6Y.js.map +1 -0
  88. package/dist/{chunk-M5QKGHCR.js → chunk-OC35KQIN.js} +6 -2
  89. package/dist/chunk-OC35KQIN.js.map +1 -0
  90. package/dist/chunk-OKUEZOGW.js +27 -0
  91. package/dist/chunk-OKUEZOGW.js.map +1 -0
  92. package/dist/{chunk-PKGWJFNR.js → chunk-OVMS3DCB.js} +2 -2
  93. package/dist/chunk-PDJTHRAW.js +36 -0
  94. package/dist/chunk-PDJTHRAW.js.map +1 -0
  95. package/dist/{chunk-LRGSLV7M.js → chunk-PYHOAXTI.js} +4 -4
  96. package/dist/{chunk-NMMKRVUF.js → chunk-QVALQE4P.js} +6 -6
  97. package/dist/{chunk-FXGC5UUH.js → chunk-RT7IP3D3.js} +2 -2
  98. package/dist/{chunk-AH3M6F4X.js → chunk-SBFDL2EQ.js} +2 -2
  99. package/dist/{chunk-UYZUJ4EB.js → chunk-SECMZACR.js} +2 -2
  100. package/dist/{chunk-HXDKC3BI.js → chunk-TGBJ2OMK.js} +2 -2
  101. package/dist/{chunk-DE6ENYLG.js → chunk-TXLGHDHS.js} +2 -2
  102. package/dist/{chunk-74MJH7I3.js → chunk-U4KHQTJ6.js} +12 -3
  103. package/dist/chunk-U4KHQTJ6.js.map +1 -0
  104. package/dist/{chunk-CRFTLUWT.js → chunk-UTDA43TB.js} +2 -2
  105. package/dist/{chunk-GKCCHHZK.js → chunk-UXKMMNJD.js} +4 -4
  106. package/dist/{chunk-57INMZ6F.js → chunk-UZRIKUFS.js} +2 -2
  107. package/dist/{chunk-2FSHROYK.js → chunk-V53GJUSL.js} +8 -8
  108. package/dist/{chunk-LKT755LP.js → chunk-VA4WSW54.js} +2 -2
  109. package/dist/{chunk-ZHKD4EZM.js → chunk-VCEH5UYS.js} +3 -3
  110. package/dist/{chunk-CHVU4RE5.js → chunk-VDLMAJXS.js} +3 -3
  111. package/dist/{chunk-XFTPUXCE.js → chunk-VRAD2FGO.js} +10 -10
  112. package/dist/{chunk-VF4XKTX3.js → chunk-VZ5OJE4X.js} +10 -2
  113. package/dist/chunk-VZ5OJE4X.js.map +1 -0
  114. package/dist/{chunk-UVIQHSS7.js → chunk-WUDBMLC6.js} +9 -3
  115. package/dist/chunk-WUDBMLC6.js.map +1 -0
  116. package/dist/{chunk-AWJ2FHCF.js → chunk-X47LWMKA.js} +49 -21
  117. package/dist/chunk-X47LWMKA.js.map +1 -0
  118. package/dist/{chunk-VMGMY2AI.js → chunk-XF4KOVDK.js} +8 -8
  119. package/dist/{chunk-VMGMY2AI.js.map → chunk-XF4KOVDK.js.map} +1 -1
  120. package/dist/{chunk-T7VNN3ZM.js → chunk-XVLEGMJI.js} +2 -2
  121. package/dist/{chunk-R2SJDIPO.js → chunk-YLTG6BO4.js} +9 -7
  122. package/dist/chunk-YLTG6BO4.js.map +1 -0
  123. package/dist/{chunk-QDCJNRKK.js → chunk-YXOAQAH2.js} +3 -3
  124. package/dist/{cli-BqyGVyOe.d.ts → cli-DACyuK8-.d.ts} +5 -5
  125. package/dist/cli.d.ts +8 -8
  126. package/dist/cli.js +66 -64
  127. package/dist/compounding/engine.d.ts +2 -2
  128. package/dist/compounding/engine.js +15 -13
  129. package/dist/compounding/preference-consolidator.d.ts +1 -1
  130. package/dist/compression-optimizer.d.ts +1 -1
  131. package/dist/config.d.ts +1 -1
  132. package/dist/config.js +1 -1
  133. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  134. package/dist/connectors/codex-materialize-runner.js +15 -13
  135. package/dist/connectors/codex-materialize.d.ts +1 -1
  136. package/dist/connectors/index.d.ts +1 -1
  137. package/dist/connectors/index.js +15 -13
  138. package/dist/consolidation-provenance-check.d.ts +2 -2
  139. package/dist/consolidation-provenance-check.js +6 -2
  140. package/dist/consolidation-undo.d.ts +2 -2
  141. package/dist/consolidation-undo.js +8 -1
  142. package/dist/consolidation-undo.js.map +1 -1
  143. package/dist/contradiction/index.d.ts +2 -2
  144. package/dist/conversation-index/backend.d.ts +1 -1
  145. package/dist/conversation-index/chunker.d.ts +1 -1
  146. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  147. package/dist/conversation-index/indexer.d.ts +1 -1
  148. package/dist/conversation-index/search.d.ts +1 -1
  149. package/dist/day-summary.d.ts +1 -1
  150. package/dist/delinearize.d.ts +1 -1
  151. package/dist/direct-answer-wiring.d.ts +1 -1
  152. package/dist/direct-answer.d.ts +1 -1
  153. package/dist/embedding-fallback.d.ts +1 -1
  154. package/dist/enrichment/index.d.ts +1 -1
  155. package/dist/entity-retrieval.d.ts +2 -2
  156. package/dist/entity-retrieval.js +15 -13
  157. package/dist/entity-schema.d.ts +1 -1
  158. package/dist/explicit-capture.d.ts +5 -5
  159. package/dist/extraction-faithfulness.d.ts +1 -1
  160. package/dist/extraction-faithfulness.js +3 -3
  161. package/dist/extraction-judge-telemetry.d.ts +1 -1
  162. package/dist/extraction-judge-training.d.ts +1 -1
  163. package/dist/extraction-judge.d.ts +1 -1
  164. package/dist/extraction-judge.js +3 -3
  165. package/dist/extraction.d.ts +1 -1
  166. package/dist/extraction.js +3 -3
  167. package/dist/fallback-llm.d.ts +1 -1
  168. package/dist/fallback-llm.js +2 -2
  169. package/dist/{forget-KHF7A44H.js → forget-CQCLB5LB.js} +2 -2
  170. package/dist/graph-dashboard-diff.d.ts +1 -1
  171. package/dist/graph-dashboard-key.d.ts +1 -1
  172. package/dist/graph-dashboard-parser.d.ts +1 -1
  173. package/dist/graph-edge-reinforcement.d.ts +1 -1
  174. package/dist/graph-snapshot.d.ts +1 -1
  175. package/dist/graph.d.ts +1 -1
  176. package/dist/identity-continuity.d.ts +1 -1
  177. package/dist/importance.d.ts +1 -1
  178. package/dist/importers/index.d.ts +1 -1
  179. package/dist/in-flight-reads.d.ts +19 -0
  180. package/dist/in-flight-reads.js +16 -0
  181. package/dist/in-flight-reads.js.map +1 -0
  182. package/dist/index.d.ts +13 -13
  183. package/dist/index.js +116 -114
  184. package/dist/intent.d.ts +1 -1
  185. package/dist/lcm/engine.d.ts +1 -1
  186. package/dist/lcm/engine.js +4 -4
  187. package/dist/lcm/index.d.ts +1 -1
  188. package/dist/lcm/index.js +13 -13
  189. package/dist/lcm/tools.d.ts +1 -1
  190. package/dist/lifecycle.d.ts +1 -1
  191. package/dist/live-connectors-runner.d.ts +1 -1
  192. package/dist/local-llm.d.ts +1 -1
  193. package/dist/local-model-endpoint.d.ts +1 -1
  194. package/dist/maintenance/memory-governance.d.ts +1 -1
  195. package/dist/maintenance/memory-governance.js +15 -13
  196. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +15 -13
  197. package/dist/maintenance/rebuild-memory-projection.js +16 -14
  198. package/dist/mcp-memory-inspector-app.d.ts +6 -6
  199. package/dist/memory-action-policy.d.ts +1 -1
  200. package/dist/memory-cache.d.ts +24 -13
  201. package/dist/memory-cache.js +3 -1
  202. package/dist/memory-corpus-version.d.ts +19 -0
  203. package/dist/memory-corpus-version.js +13 -0
  204. package/dist/memory-corpus-version.js.map +1 -0
  205. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  206. package/dist/memory-projection-store.d.ts +1 -1
  207. package/dist/memory-provenance.d.ts +1 -1
  208. package/dist/memory-worth-outcomes.d.ts +2 -2
  209. package/dist/models-json.d.ts +1 -1
  210. package/dist/namespaces/migrate.d.ts +3 -3
  211. package/dist/namespaces/migrate.js +22 -20
  212. package/dist/namespaces/principal.d.ts +1 -1
  213. package/dist/namespaces/search.d.ts +1 -1
  214. package/dist/namespaces/search.js +7 -7
  215. package/dist/namespaces/storage.d.ts +3 -3
  216. package/dist/namespaces/storage.js +15 -13
  217. package/dist/native-knowledge.d.ts +1 -1
  218. package/dist/operator-toolkit.d.ts +2 -2
  219. package/dist/operator-toolkit.js +27 -25
  220. package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
  221. package/dist/orchestration/maintenance.d.ts +2 -2
  222. package/dist/orchestration/maintenance.js +17 -15
  223. package/dist/{orchestrator-37Cx7yyw.d.ts → orchestrator-D83AvrPf.d.ts} +4 -4
  224. package/dist/orchestrator.d.ts +5 -5
  225. package/dist/orchestrator.js +92 -90
  226. package/dist/page-versioning.js +5 -1
  227. package/dist/patterns-cli.d.ts +1 -1
  228. package/dist/{pipeline-C6onljHc.d.ts → pipeline-BSqGpYl1.d.ts} +1 -1
  229. package/dist/policy-runtime.d.ts +1 -1
  230. package/dist/provenance.d.ts +1 -1
  231. package/dist/{qmd-J08G7MEm.d.ts → qmd-CutnpRVe.d.ts} +1 -1
  232. package/dist/qmd-preflight.d.ts +2 -2
  233. package/dist/qmd-recall-cache.d.ts +1 -1
  234. package/dist/qmd.d.ts +2 -2
  235. package/dist/qmd.js +2 -2
  236. package/dist/recall-disclosure-escalation.d.ts +1 -1
  237. package/dist/recall-explain-renderer.d.ts +1 -1
  238. package/dist/recall-explain-renderer.js +3 -3
  239. package/dist/recall-planner-llm.d.ts +1 -1
  240. package/dist/recall-planner-llm.js +2 -2
  241. package/dist/recall-state.d.ts +1 -1
  242. package/dist/recall-tag-filter.d.ts +1 -1
  243. package/dist/recall-timings.d.ts +1 -1
  244. package/dist/recall-xray-cli.d.ts +1 -1
  245. package/dist/recall-xray-cli.js +4 -4
  246. package/dist/recall-xray-renderer.d.ts +1 -1
  247. package/dist/recall-xray-renderer.js +3 -3
  248. package/dist/recall-xray.d.ts +1 -1
  249. package/dist/recall-xray.js +2 -2
  250. package/dist/replay/normalizers/chatgpt.d.ts +1 -1
  251. package/dist/replay/normalizers/claude.d.ts +1 -1
  252. package/dist/replay/normalizers/openclaw.d.ts +1 -1
  253. package/dist/replay/normalizers/shared.d.ts +1 -1
  254. package/dist/replay/runner.d.ts +1 -1
  255. package/dist/replay/types.d.ts +1 -1
  256. package/dist/resolve-auth-token.d.ts +1 -1
  257. package/dist/resume-bundles.js +2 -2
  258. package/dist/retrieval-agents.d.ts +2 -2
  259. package/dist/retrieval-agents.js +2 -2
  260. package/dist/retrieval-tiers.d.ts +1 -1
  261. package/dist/routing/engine.d.ts +1 -1
  262. package/dist/routing/store.d.ts +1 -1
  263. package/dist/schemas.d.ts +52 -52
  264. package/dist/search/embed-helper.d.ts +1 -1
  265. package/dist/search/factory.d.ts +1 -1
  266. package/dist/search/factory.js +6 -6
  267. package/dist/search/index.d.ts +1 -1
  268. package/dist/search/index.js +12 -12
  269. package/dist/search/lancedb-backend.d.ts +1 -1
  270. package/dist/search/meilisearch-backend.d.ts +1 -1
  271. package/dist/search/noop-backend.d.ts +1 -1
  272. package/dist/search/orama-backend.d.ts +1 -1
  273. package/dist/search/port.d.ts +1 -1
  274. package/dist/search/remote-backend.d.ts +1 -1
  275. package/dist/{semantic-consolidation-BFtoVosl.d.ts → semantic-consolidation-btIVRC4l.d.ts} +1 -1
  276. package/dist/semantic-consolidation.d.ts +2 -2
  277. package/dist/semantic-consolidation.js +16 -14
  278. package/dist/semantic-rule-promotion.js +15 -13
  279. package/dist/semantic-rule-verifier.d.ts +5 -1
  280. package/dist/semantic-rule-verifier.js +15 -13
  281. package/dist/session-observer-bands.d.ts +1 -1
  282. package/dist/session-observer-state.d.ts +1 -1
  283. package/dist/shared-context/manager.d.ts +9 -9
  284. package/dist/signal.d.ts +1 -1
  285. package/dist/{storage-CXjwBr69.d.ts → storage-BVv_Mqa0.d.ts} +133 -3
  286. package/dist/storage.d.ts +2 -2
  287. package/dist/storage.js +14 -12
  288. package/dist/summarizer.d.ts +1 -1
  289. package/dist/summarizer.js +3 -3
  290. package/dist/summary-snapshot.d.ts +1 -1
  291. package/dist/temporal-index-compat.d.ts +1 -0
  292. package/dist/temporal-index-compat.js +16 -0
  293. package/dist/temporal-index-compat.js.map +1 -0
  294. package/dist/temporal-index.d.ts +58 -7
  295. package/dist/temporal-index.js +23 -3
  296. package/dist/temporal-supersession.d.ts +2 -2
  297. package/dist/temporal-timeline-recall.d.ts +1 -1
  298. package/dist/temporal-validity.d.ts +1 -1
  299. package/dist/threading.d.ts +1 -1
  300. package/dist/tier-migration.d.ts +2 -2
  301. package/dist/tier-routing.d.ts +1 -1
  302. package/dist/topics.d.ts +1 -1
  303. package/dist/transcript.d.ts +1 -1
  304. package/dist/transfer/capsule-import.js +6 -2
  305. package/dist/transfer/import-sqlite.js +2 -2
  306. package/dist/transfer/types.d.ts +66 -66
  307. package/dist/trust-score-stage.d.ts +1 -1
  308. package/dist/trust-score.d.ts +1 -1
  309. package/dist/{types-DpxqC8dI.d.ts → types-Cmkz7csa.d.ts} +27 -0
  310. package/dist/types.d.ts +1 -1
  311. package/dist/types.js +1 -1
  312. package/dist/utility-runtime.d.ts +1 -1
  313. package/dist/verified-recall.d.ts +4 -0
  314. package/dist/verified-recall.js +15 -13
  315. package/package.json +12 -2
  316. package/src/binary-lifecycle/pipeline.ts +22 -0
  317. package/src/cli.ts +8 -0
  318. package/src/compounding/engine.ts +9 -1
  319. package/src/config.ts +14 -0
  320. package/src/consolidation-undo.ts +8 -0
  321. package/src/curation/index.ts +9 -0
  322. package/src/in-flight-reads.ts +63 -0
  323. package/src/maintenance/memory-governance.ts +6 -0
  324. package/src/memory-cache-hot.test.ts +131 -0
  325. package/src/memory-cache.ts +146 -22
  326. package/src/memory-corpus-version.ts +45 -0
  327. package/src/namespaces/storage.ts +20 -1
  328. package/src/operator-toolkit.ts +7 -1
  329. package/src/orchestration/consolidation-run.ts +5 -5
  330. package/src/orchestration/contradiction-linking-coordinator.ts +2 -2
  331. package/src/orchestration/lifecycle-policy-coordinator.ts +2 -2
  332. package/src/orchestration/persistence-index.ts +6 -6
  333. package/src/orchestration/recall-internal.ts +6 -3
  334. package/src/orchestration/recall-search-pipeline.ts +36 -21
  335. package/src/orchestration/semantic-consolidation-coordinator.ts +2 -2
  336. package/src/orchestrator.ts +25 -5
  337. package/src/page-versioning.ts +14 -1
  338. package/src/provenance-frontmatter.test.ts +6 -0
  339. package/src/review/index.ts +16 -8
  340. package/src/semantic-rule-promotion.ts +9 -1
  341. package/src/semantic-rule-verifier.ts +19 -6
  342. package/src/spaces/index.ts +10 -0
  343. package/src/storage/memory-read-store.ts +9 -2
  344. package/src/storage-contract/cache-coherence.test.ts +242 -0
  345. package/src/storage-contract/namespace-routing.test.ts +26 -1
  346. package/src/storage.ts +513 -31
  347. package/src/temporal-index-compat.ts +311 -0
  348. package/src/temporal-index.test.ts +273 -22
  349. package/src/temporal-index.ts +427 -178
  350. package/src/transfer/capsule-cache-coherence.test.ts +107 -0
  351. package/src/transfer/capsule-import.ts +8 -0
  352. package/src/transfer/capsule-merge.ts +7 -0
  353. package/src/types.ts +27 -0
  354. package/src/verified-recall.ts +20 -6
  355. package/dist/capsule-merge-GK5E647P.js.map +0 -1
  356. package/dist/chunk-74MJH7I3.js.map +0 -1
  357. package/dist/chunk-AD2KK5MT.js.map +0 -1
  358. package/dist/chunk-AWJ2FHCF.js.map +0 -1
  359. package/dist/chunk-EJCVMPIM.js.map +0 -1
  360. package/dist/chunk-GL3SMLMZ.js.map +0 -1
  361. package/dist/chunk-HHAA35A3.js.map +0 -1
  362. package/dist/chunk-JO5AT6QT.js.map +0 -1
  363. package/dist/chunk-KTOH7EJE.js.map +0 -1
  364. package/dist/chunk-M5QKGHCR.js.map +0 -1
  365. package/dist/chunk-Q6JPMCPO.js.map +0 -1
  366. package/dist/chunk-R2SJDIPO.js.map +0 -1
  367. package/dist/chunk-TVRPRFUB.js.map +0 -1
  368. package/dist/chunk-UVIQHSS7.js.map +0 -1
  369. package/dist/chunk-VF4XKTX3.js.map +0 -1
  370. package/dist/chunk-ZUFJ7ZTR.js.map +0 -1
  371. /package/dist/{auto-sync-676N6N6Y.js.map → auto-sync-AAMTVZMK.js.map} +0 -0
  372. /package/dist/{chunk-CNWC274T.js.map → chunk-3OQ4IZJN.js.map} +0 -0
  373. /package/dist/{chunk-7XH7VJN4.js.map → chunk-5S7Z5SHA.js.map} +0 -0
  374. /package/dist/{chunk-WKE4VXSZ.js.map → chunk-673NPXE3.js.map} +0 -0
  375. /package/dist/{chunk-UHGHTOR5.js.map → chunk-7EX4YOKH.js.map} +0 -0
  376. /package/dist/{chunk-TVVEYCNW.js.map → chunk-7K5Q6COX.js.map} +0 -0
  377. /package/dist/{chunk-3F4N4WDH.js.map → chunk-AHLPZ2SF.js.map} +0 -0
  378. /package/dist/{chunk-6C35R7P4.js.map → chunk-DJCKXI4M.js.map} +0 -0
  379. /package/dist/{chunk-FYKIEOG6.js.map → chunk-FNJX2O6G.js.map} +0 -0
  380. /package/dist/{chunk-DQPPRXFO.js.map → chunk-HQ7QZJM5.js.map} +0 -0
  381. /package/dist/{chunk-RKNJBZ55.js.map → chunk-JBPKEARU.js.map} +0 -0
  382. /package/dist/{chunk-KIPLG7S7.js.map → chunk-JKLJ6A7W.js.map} +0 -0
  383. /package/dist/{chunk-O3BZ6PFY.js.map → chunk-JZM5QUTE.js.map} +0 -0
  384. /package/dist/{chunk-SYNYI4ZM.js.map → chunk-L5HJQC36.js.map} +0 -0
  385. /package/dist/{chunk-VXMWDXIJ.js.map → chunk-LC7OODWZ.js.map} +0 -0
  386. /package/dist/{chunk-ZW6OKHVX.js.map → chunk-LQKITFGB.js.map} +0 -0
  387. /package/dist/{chunk-TZJVTH3F.js.map → chunk-MXRMNKSY.js.map} +0 -0
  388. /package/dist/{chunk-PKGWJFNR.js.map → chunk-OVMS3DCB.js.map} +0 -0
  389. /package/dist/{chunk-LRGSLV7M.js.map → chunk-PYHOAXTI.js.map} +0 -0
  390. /package/dist/{chunk-NMMKRVUF.js.map → chunk-QVALQE4P.js.map} +0 -0
  391. /package/dist/{chunk-FXGC5UUH.js.map → chunk-RT7IP3D3.js.map} +0 -0
  392. /package/dist/{chunk-AH3M6F4X.js.map → chunk-SBFDL2EQ.js.map} +0 -0
  393. /package/dist/{chunk-UYZUJ4EB.js.map → chunk-SECMZACR.js.map} +0 -0
  394. /package/dist/{chunk-HXDKC3BI.js.map → chunk-TGBJ2OMK.js.map} +0 -0
  395. /package/dist/{chunk-DE6ENYLG.js.map → chunk-TXLGHDHS.js.map} +0 -0
  396. /package/dist/{chunk-CRFTLUWT.js.map → chunk-UTDA43TB.js.map} +0 -0
  397. /package/dist/{chunk-GKCCHHZK.js.map → chunk-UXKMMNJD.js.map} +0 -0
  398. /package/dist/{chunk-57INMZ6F.js.map → chunk-UZRIKUFS.js.map} +0 -0
  399. /package/dist/{chunk-2FSHROYK.js.map → chunk-V53GJUSL.js.map} +0 -0
  400. /package/dist/{chunk-LKT755LP.js.map → chunk-VA4WSW54.js.map} +0 -0
  401. /package/dist/{chunk-ZHKD4EZM.js.map → chunk-VCEH5UYS.js.map} +0 -0
  402. /package/dist/{chunk-CHVU4RE5.js.map → chunk-VDLMAJXS.js.map} +0 -0
  403. /package/dist/{chunk-XFTPUXCE.js.map → chunk-VRAD2FGO.js.map} +0 -0
  404. /package/dist/{chunk-T7VNN3ZM.js.map → chunk-XVLEGMJI.js.map} +0 -0
  405. /package/dist/{chunk-QDCJNRKK.js.map → chunk-YXOAQAH2.js.map} +0 -0
  406. /package/dist/{forget-KHF7A44H.js.map → forget-CQCLB5LB.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/temporal-index-compat.ts","../src/temporal-index.ts"],"sourcesContent":["/**\n * Synchronous compatibility surface for the historical temporal-index API.\n *\n * New runtime code must use the explicit `*Async` exports from temporal-index.\n * These wrappers preserve return timing and boolean truthiness for published\n * JavaScript consumers that predate the async index implementation.\n */\n\nimport { execFileSync } from \"node:child_process\";\nimport * as crypto from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nimport {\n applyTagIndexCompatibilityMutation,\n applyTemporalIndexCompatibilityMutation,\n hasCurrentTemporalIndexSchemaForCompatibility,\n type TemporalIndexCompatibilityMutation,\n type TemporalIndexEntry,\n} from \"./temporal-index.js\";\n\nconst TEMPORAL_INDEX_FILE = \"index_time.json\";\nconst TAG_INDEX_FILE = \"index_tags.json\";\nconst INDEX_LOCK_STALE_MS = 60_000;\n// Bounded blocking-wait cap for the sync per-file lock (issue #1911, Cursor\n// Medium): the sync waiter blocks the Node event loop with sleepSync, so if a\n// lock is held by an in-flight async write (awaited I/O) it can't be released\n// until the loop runs again. Cap the stall at this bound and fail open rather\n// than deadlock or stall for INDEX_LOCK_STALE_MS. 1.5s tolerates a slow disk\n// write while bounding the worst-case event-loop freeze.\nconst SYNC_INDEX_LOCK_BOUND_MS = 1_500;\nconst INDEX_LOCK_POLL_MS = 10;\nconst INDEX_PROCESS_START_TOLERANCE_MS = 2_000;\nconst INDEX_LOCK_SLEEP = new Int32Array(new SharedArrayBuffer(4));\nconst INDEX_PROCESS_STARTED_AT_MS = Date.now() - process.uptime() * 1000;\n\ninterface IndexLockOwner {\n pid: number;\n createdAt?: string;\n processStartedAtMs?: number;\n}\n\ntype IndexLockCleanupResult = \"removed\" | \"wait\" | \"blocked\";\n\nfunction stateDir(memoryDir: string): string {\n return path.join(memoryDir, \"state\");\n}\n\nfunction temporalIndexPath(memoryDir: string): string {\n return path.join(stateDir(memoryDir), TEMPORAL_INDEX_FILE);\n}\n\nfunction tagIndexPath(memoryDir: string): string {\n return path.join(stateDir(memoryDir), TAG_INDEX_FILE);\n}\n\nfunction sleepSync(ms: number): void {\n Atomics.wait(INDEX_LOCK_SLEEP, 0, 0, ms);\n}\n\nfunction uniqueTempPath(filePath: string): string {\n const nonce = crypto.randomBytes(6).toString(\"hex\");\n return path.join(\n path.dirname(filePath),\n `.${path.basename(filePath)}.${process.pid}.${Date.now()}.${nonce}.tmp`,\n );\n}\n\nfunction lockOwnerPath(lockDir: string): string {\n return path.join(lockDir, \"owner.json\");\n}\n\nfunction writeIndexLockOwner(lockDir: string): void {\n try {\n fs.writeFileSync(\n lockOwnerPath(lockDir),\n JSON.stringify({\n pid: process.pid,\n createdAt: new Date().toISOString(),\n processStartedAtMs: INDEX_PROCESS_STARTED_AT_MS,\n }),\n { encoding: \"utf8\", flag: \"wx\" },\n );\n } catch {\n // The directory remains the serialization primitive.\n }\n}\n\nfunction readIndexLockOwner(lockDir: string): IndexLockOwner | null {\n try {\n const parsed = JSON.parse(fs.readFileSync(lockOwnerPath(lockDir), \"utf8\")) as Record<string, unknown>;\n if (!(typeof parsed.pid === \"number\" && Number.isInteger(parsed.pid) && parsed.pid > 0)) return null;\n return {\n pid: parsed.pid,\n ...(typeof parsed.createdAt === \"string\" && parsed.createdAt.length > 0\n ? { createdAt: parsed.createdAt }\n : {}),\n ...(typeof parsed.processStartedAtMs === \"number\" &&\n Number.isFinite(parsed.processStartedAtMs) &&\n parsed.processStartedAtMs > 0\n ? { processStartedAtMs: parsed.processStartedAtMs }\n : {}),\n };\n } catch {\n return null;\n }\n}\n\nfunction processIsAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n return (error as NodeJS.ErrnoException)?.code === \"EPERM\";\n }\n}\n\nfunction readProcessStartedAtMs(pid: number): number | null {\n try {\n const output = execFileSync(\"ps\", [\"-p\", String(pid), \"-o\", \"lstart=\"], {\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"ignore\"],\n timeout: 1_000,\n }).trim();\n if (!output) return null;\n const startedAtMs = Date.parse(output);\n return Number.isFinite(startedAtMs) ? startedAtMs : null;\n } catch {\n return null;\n }\n}\n\nfunction lockOwnerIsRunning(owner: IndexLockOwner): boolean {\n if (!processIsAlive(owner.pid)) return false;\n if (owner.processStartedAtMs === undefined) return true;\n const runningStartedAtMs = readProcessStartedAtMs(owner.pid);\n if (runningStartedAtMs === null) return true;\n return runningStartedAtMs <= owner.processStartedAtMs + INDEX_PROCESS_START_TOLERANCE_MS;\n}\n\nfunction lockIsFresh(lockInfo: fs.Stats, owner: IndexLockOwner | null): boolean {\n const ownerCreatedAtMs = owner?.createdAt ? Date.parse(owner.createdAt) : Number.NaN;\n const referenceMs = Number.isFinite(ownerCreatedAtMs) ? ownerCreatedAtMs : lockInfo.mtimeMs;\n return Date.now() - referenceMs < INDEX_LOCK_STALE_MS;\n}\n\nfunction removeAbandonedIndexLock(lockDir: string): IndexLockCleanupResult {\n try {\n const info = fs.lstatSync(lockDir);\n if (info.isSymbolicLink()) return \"blocked\";\n if (!info.isDirectory()) {\n fs.rmSync(lockDir, { force: true });\n return \"removed\";\n }\n const owner = readIndexLockOwner(lockDir);\n if (owner && lockOwnerIsRunning(owner)) return \"wait\";\n if (!owner && lockIsFresh(info, null)) return \"wait\";\n fs.rmSync(lockDir, { recursive: true, force: true });\n return \"removed\";\n } catch (error) {\n return (error as NodeJS.ErrnoException)?.code === \"ENOENT\" ? \"removed\" : \"blocked\";\n }\n}\n\nfunction withIndexFileLock(filePath: string, update: () => void): void {\n const lockDir = `${filePath}.lock.d`;\n // Bound the acquisition (issue #1911, Codex Medium). sleepSync() blocks the\n // Node event loop, so an UNBOUNDED wait here would stall the whole process if\n const maxAttempts = Math.max(1, Math.ceil(SYNC_INDEX_LOCK_BOUND_MS / INDEX_LOCK_POLL_MS));\n // (advisory indexes) rather than risk starving the loop — e.g. a lock held by\n // in-flight async work that needs the very loop this call is blocking.\n let acquired = false;\n for (let attempt = 0; attempt < maxAttempts; attempt += 1) {\n try {\n fs.mkdirSync(lockDir);\n writeIndexLockOwner(lockDir);\n acquired = true;\n break;\n } catch (error) {\n const code = (error as NodeJS.ErrnoException)?.code;\n if (code === \"ENOENT\") {\n try {\n fs.mkdirSync(path.dirname(lockDir), { recursive: true });\n } catch {\n return;\n }\n sleepSync(INDEX_LOCK_POLL_MS);\n continue;\n }\n if (code !== \"EEXIST\") return;\n if (removeAbandonedIndexLock(lockDir) === \"blocked\") return;\n sleepSync(INDEX_LOCK_POLL_MS);\n }\n }\n if (!acquired) return; // fail open — could not acquire within the bound\n\n try {\n update();\n } finally {\n try {\n fs.rmSync(lockDir, { recursive: true, force: true });\n } catch {\n // Advisory indexes fail open.\n }\n }\n}\n\nfunction readJson(filePath: string): unknown {\n try {\n return JSON.parse(fs.readFileSync(filePath, \"utf8\")) as unknown;\n } catch {\n return null;\n }\n}\n\nfunction writeJsonAtomic(filePath: string, value: unknown): void {\n const payload = JSON.stringify(value);\n for (let attempt = 0; attempt < 3; attempt += 1) {\n const tempPath = uniqueTempPath(filePath);\n try {\n fs.writeFileSync(tempPath, payload, \"utf8\");\n fs.renameSync(tempPath, filePath);\n return;\n } catch {\n try {\n fs.unlinkSync(tempPath);\n } catch {\n // Advisory indexes fail open.\n }\n sleepSync(INDEX_LOCK_POLL_MS);\n }\n }\n}\n\nfunction applyMutation(memoryDir: string, mutation: TemporalIndexCompatibilityMutation): void {\n try {\n fs.mkdirSync(stateDir(memoryDir), { recursive: true });\n // Coordinate with the ASYNC surface by acquiring the SAME per-file lockdirs\n // (issue #1911, Cursor Medium) — `<temporal>.lock.d` then `<tag>.lock.d`,\n // nested in a fixed order (no deadlock: the async surface acquires them one\n // at a time, never both). The acquisition is BOUNDED + fail-open\n // (withIndexFileLock), so an event-loop-blocking sync waiter can never stall\n // the loop waiting on a lock held across an async await — if the async write\n // doesn't release in the bound, sync gives up (advisory indexes fail open).\n // Holding both locks together makes the paired write atomic vs. both surfaces.\n const temporalPath = temporalIndexPath(memoryDir);\n const tagPath = tagIndexPath(memoryDir);\n withIndexFileLock(temporalPath, () => {\n withIndexFileLock(tagPath, () => {\n writeJsonAtomic(\n temporalPath,\n applyTemporalIndexCompatibilityMutation(readJson(temporalPath), mutation),\n );\n writeJsonAtomic(\n tagPath,\n applyTagIndexCompatibilityMutation(readJson(tagPath), mutation),\n );\n });\n });\n } catch {\n // Advisory indexes fail open.\n }\n}\n\n/** @deprecated Use `indexMemoryAsync` in new code. */\nexport function indexMemory(\n memoryDir: string,\n memoryPath: string,\n createdAt: string,\n tags: string[],\n temporal: Omit<Partial<TemporalIndexEntry>, \"path\" | \"createdAt\" | \"tags\"> = {},\n): void {\n applyMutation(memoryDir, {\n kind: \"index\",\n entries: [{ path: memoryPath, createdAt, tags, ...temporal }],\n });\n}\n\n/** @deprecated Use `deindexMemoryAsync` in new code. */\nexport function deindexMemory(\n memoryDir: string,\n memoryPath: string,\n createdAt: string,\n tags: string[],\n): void {\n applyMutation(memoryDir, {\n kind: \"deindex\",\n entries: [{ path: memoryPath, createdAt, tags }],\n });\n}\n\n/** @deprecated Use `clearIndexesAsync` in new code. */\nexport function clearIndexes(memoryDir: string): void {\n applyMutation(memoryDir, { kind: \"clear\" });\n}\n\n/** @deprecated Use `indexesExistAsync` in new code. */\nexport function indexesExist(memoryDir: string): boolean {\n try {\n if (!fs.existsSync(tagIndexPath(memoryDir))) return false;\n return hasCurrentTemporalIndexSchemaForCompatibility(readJson(temporalIndexPath(memoryDir)));\n } catch {\n return false;\n }\n}\n\n/** @deprecated Use `indexMemoriesBatchAsync` in new code. */\nexport function indexMemoriesBatch(memoryDir: string, entries: TemporalIndexEntry[]): void {\n if (entries.length === 0) return;\n applyMutation(memoryDir, { kind: \"index\", entries });\n}\n","/**\n * Temporal and Tag Indexes (v8.1 — SwiftMem-inspired)\n *\n * Maintains two fast on-disk lookup structures in `state/`:\n * index_time.json — maps YYYY-MM-DD date buckets to memory file paths\n * index_tags.json — maps tag strings to memory file paths\n *\n * Used as an optional prefilter in the retrieval pipeline:\n * given a time range or a set of tags, narrow the candidate set\n * before the QMD hybrid search so we can pass a smaller pool to scoring.\n *\n * Design constraints:\n * - Must be fail-open (any error returns empty / unfiltered)\n * - Reads/writes are batched per extraction run\n * - Both indexes are plain JSON; no external dependencies\n */\n\nimport { execFile } from \"node:child_process\";\nimport * as crypto from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport { promisify } from \"node:util\";\n\nconst execFileAsync = promisify(execFile);\n\nexport {\n clearIndexes,\n deindexMemory,\n indexMemoriesBatch,\n indexMemory,\n indexesExist,\n} from \"./temporal-index-compat.js\";\n\nexport interface TemporalIndex {\n /** version bumped when schema changes */\n version: number;\n /** Last full rebuild timestamp (ISO string) */\n lastRebuildAt?: string;\n /** Map from YYYY-MM-DD → array of memory paths */\n dates: Record<string, string[]>;\n /**\n * Per-memory event-time rows used to reconstruct one chronology across\n * source sessions. Keyed by path so an update replaces the prior row.\n */\n events: Record<string, TemporalIndexEvent>;\n}\n\nexport interface TemporalIndexEvent {\n path: string;\n /** Event/valid time used for chronology. */\n eventAt: string;\n /** Ingest/source-observation time, when known. */\n observedAt?: string;\n /** Source session provenance, when the extractor recorded it. */\n sessionKey?: string;\n /** Exclusive validity end, when the event is bounded. */\n validUntil?: string;\n /** SHA-256 lexical fingerprints for bounded query-aware candidate selection. */\n searchTokenHashes?: string[];\n}\n\nexport interface TemporalIndexEntry {\n path: string;\n createdAt: string;\n tags: string[];\n validAt?: string;\n observedAt?: string;\n sessionKey?: string;\n validUntil?: string;\n /** Used only to derive token hashes; raw text is never persisted in the index. */\n searchText?: string;\n}\n\nexport interface TagIndex {\n version: number;\n lastRebuildAt?: string;\n /** Map from canonical tag string → node metadata */\n tags: Record<string, TagNode | string[]>;\n /** Map from alias string → canonical tags */\n aliases?: Record<string, string[]>;\n}\n\nexport interface TagNode {\n paths: string[];\n aliases?: string[];\n parents?: string[];\n}\n\nconst INDEX_VERSION = 2;\nconst TEMPORAL_INDEX_FILE = \"index_time.json\";\nconst TAG_INDEX_FILE = \"index_tags.json\";\nconst TAG_INDEX_VERSION = 2;\nconst INDEX_LOCK_STALE_MS = 60_000;\nconst INDEX_LOCK_POLL_MS = 10;\nconst INDEX_PROCESS_START_TOLERANCE_MS = 2_000;\nconst INDEX_PROCESS_STARTED_AT_MS = Date.now() - process.uptime() * 1000;\n\ninterface IndexFileIdentity {\n size: number;\n mtimeMs: number;\n ctimeMs: number;\n ino: number;\n}\n\ninterface CachedIndex<T> {\n identity: IndexFileIdentity;\n index: T;\n currentSchema: boolean;\n}\n\ntype IndexLoadResult<T> =\n | { kind: \"ok\"; index: T; currentSchema: boolean }\n | { kind: \"missing\" }\n | { kind: \"invalid\" };\n\nconst parsedIndexCache = new Map<string, CachedIndex<unknown>>();\nconst writeChains = new Map<string, Promise<void>>();\n// Operation-level serialization keyed by memoryDir (issue #1911, Codex Medium):\n// a single logical index mutation touches TWO files (temporal + tag), each with\n// its own per-file writeChain. Without an outer lock, two overlapping\n// indexMemoryAsync calls could interleave so the temporal half of one commits\n// with the tag half of the other. This chain makes each public mutator's paired\n// writes atomic relative to other mutators on the same memoryDir.\nconst opChains = new Map<string, Promise<void>>();\nlet indexReadObserverForTest: (() => void) | undefined;\n\n/** Test-only observer for asserting cache read/parse behavior. */\nexport function setIndexReadObserverForTest(observer?: () => void): void {\n indexReadObserverForTest = observer;\n}\n\ninterface IndexLockOwner {\n pid: number;\n createdAt?: string;\n processStartedAtMs?: number;\n}\n\ntype IndexLockCleanupResult = \"removed\" | \"wait\" | \"blocked\";\n\nfunction stateDir(memoryDir: string): string {\n return path.join(memoryDir, \"state\");\n}\n\nfunction temporalIndexPath(memoryDir: string): string {\n return path.join(stateDir(memoryDir), TEMPORAL_INDEX_FILE);\n}\n\nfunction tagIndexPath(memoryDir: string): string {\n return path.join(stateDir(memoryDir), TAG_INDEX_FILE);\n}\n\nasync function ensureStateDir(memoryDir: string): Promise<void> {\n await fs.promises.mkdir(stateDir(memoryDir), { recursive: true });\n}\n\nfunction identityFromStat(stat: fs.Stats): IndexFileIdentity {\n return {\n size: stat.size,\n mtimeMs: stat.mtimeMs,\n ctimeMs: stat.ctimeMs,\n ino: stat.ino,\n };\n}\n\nfunction identityEquals(left: IndexFileIdentity, right: IndexFileIdentity): boolean {\n return left.size === right.size &&\n left.mtimeMs === right.mtimeMs &&\n left.ctimeMs === right.ctimeMs &&\n left.ino === right.ino;\n}\n\nasync function loadIndexCached<T>(\n filePath: string,\n normalize: (raw: unknown) => T,\n hasCurrentSchema: (raw: unknown) => boolean,\n): Promise<IndexLoadResult<T>> {\n let handle: fs.promises.FileHandle;\n try {\n handle = await fs.promises.open(filePath, \"r\");\n } catch (error) {\n return (error as NodeJS.ErrnoException)?.code === \"ENOENT\"\n ? { kind: \"missing\" }\n : { kind: \"invalid\" };\n }\n\n try {\n const identity = identityFromStat(await handle.stat());\n const cached = parsedIndexCache.get(filePath) as CachedIndex<T> | undefined;\n if (cached && identityEquals(cached.identity, identity)) {\n return { kind: \"ok\", index: cached.index, currentSchema: cached.currentSchema };\n }\n indexReadObserverForTest?.();\n const parsed = JSON.parse(await handle.readFile(\"utf8\")) as unknown;\n const index = normalize(parsed);\n const currentSchema = hasCurrentSchema(parsed);\n parsedIndexCache.set(filePath, { identity, index, currentSchema });\n return { kind: \"ok\", index, currentSchema };\n } catch {\n parsedIndexCache.delete(filePath);\n return { kind: \"invalid\" };\n } finally {\n await handle.close().catch(() => undefined);\n }\n}\n\nfunction withPathMutex<T>(filePath: string, update: () => Promise<T>): Promise<T> {\n const previous = writeChains.get(filePath) ?? Promise.resolve();\n const run = previous.then(update, update);\n const tail = run.then(() => undefined, () => undefined);\n writeChains.set(filePath, tail);\n void tail.then(() => {\n if (writeChains.get(filePath) === tail) writeChains.delete(filePath);\n });\n return run;\n}\n\n/**\n * Operation-level mutex keyed by memoryDir (issue #1911, Codex Medium). Wraps a\n * whole logical index mutation (which writes BOTH the temporal and tag index\n * files) so overlapping mutators on the same memoryDir cannot interleave their\n * per-file writes and commit mismatched halves. The inner per-file writeChains\n * still protect each file; this outer chain just orders complete operations.\n */\nfunction withMemoryDirMutex<T>(memoryDir: string, op: () => Promise<T>): Promise<T> {\n const previous = opChains.get(memoryDir) ?? Promise.resolve();\n const run = previous.then(op, op);\n const tail = run.then(() => undefined, () => undefined);\n opChains.set(memoryDir, tail);\n void tail.then(() => {\n if (opChains.get(memoryDir) === tail) opChains.delete(memoryDir);\n });\n return run;\n}\nasync function primeCacheAfterWrite(\n filePath: string,\n index: unknown,\n isCurrentSchema: () => boolean,\n): Promise<void> {\n try {\n const identity = identityFromStat(await fs.promises.stat(filePath));\n // Derive currentSchema from the ACTUAL written index (issue #1911, Codex):\n // hardcoding true let deindexMemoryAsync (which does not bump version) cache\n // an old-schema index as current, so indexesExistAsync then skipped a\n // needed rebuild. The tag index is always current (no version gate); the\n // temporal index is current only when hasCurrentTemporalIndexSchema holds.\n parsedIndexCache.set(filePath, { identity, index, currentSchema: isCurrentSchema() });\n } catch {\n parsedIndexCache.delete(filePath);\n }\n}\n\nfunction uniqueTempPath(filePath: string): string {\n const dir = path.dirname(filePath);\n const base = path.basename(filePath);\n const nonce = crypto.randomBytes(6).toString(\"hex\");\n return path.join(dir, `.${base}.${process.pid}.${Date.now()}.${nonce}.tmp`);\n}\n\nfunction lockOwnerPath(lockDir: string): string {\n return path.join(lockDir, \"owner.json\");\n}\n\nasync function writeIndexLockOwner(lockDir: string): Promise<void> {\n try {\n await fs.promises.writeFile(\n lockOwnerPath(lockDir),\n JSON.stringify({\n pid: process.pid,\n createdAt: new Date().toISOString(),\n processStartedAtMs: INDEX_PROCESS_STARTED_AT_MS,\n }),\n {\n encoding: \"utf8\",\n flag: \"wx\",\n }\n );\n } catch {\n // Fail silently — the directory lock is still the serialization primitive.\n }\n}\n\nasync function readIndexLockOwner(lockDir: string): Promise<IndexLockOwner | null> {\n try {\n const parsed = JSON.parse(await fs.promises.readFile(lockOwnerPath(lockDir), \"utf8\")) as { pid?: unknown };\n if (!(typeof parsed.pid === \"number\" && Number.isInteger(parsed.pid) && parsed.pid > 0)) return null;\n const owner: IndexLockOwner = { pid: parsed.pid };\n if (\n \"createdAt\" in parsed &&\n typeof (parsed as { createdAt?: unknown }).createdAt === \"string\" &&\n (parsed as { createdAt: string }).createdAt.length > 0\n ) {\n owner.createdAt = (parsed as { createdAt: string }).createdAt;\n }\n const processStartedAtMs = (parsed as { processStartedAtMs?: unknown }).processStartedAtMs;\n if (typeof processStartedAtMs === \"number\" && Number.isFinite(processStartedAtMs) && processStartedAtMs > 0) {\n owner.processStartedAtMs = processStartedAtMs;\n }\n return owner;\n } catch {\n return null;\n }\n}\n\nfunction processIsAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n const code = (error as NodeJS.ErrnoException)?.code;\n return code === \"EPERM\";\n }\n}\n\nasync function readProcessStartedAtMs(pid: number): Promise<number | null> {\n try {\n const { stdout } = await execFileAsync(\"ps\", [\"-p\", String(pid), \"-o\", \"lstart=\"], {\n encoding: \"utf8\",\n timeout: 1_000,\n });\n const output = stdout.trim();\n if (!output) return null;\n const startedAtMs = Date.parse(output);\n return Number.isFinite(startedAtMs) ? startedAtMs : null;\n } catch {\n return null;\n }\n}\n\nasync function lockOwnerIsRunning(owner: IndexLockOwner): Promise<boolean> {\n if (!processIsAlive(owner.pid)) return false;\n if (owner.processStartedAtMs === undefined) return true;\n const runningStartedAtMs = await readProcessStartedAtMs(owner.pid);\n if (runningStartedAtMs === null) return true;\n return runningStartedAtMs <= owner.processStartedAtMs + INDEX_PROCESS_START_TOLERANCE_MS;\n}\n\nfunction lockIsFresh(lockInfo: fs.Stats, owner: IndexLockOwner | null): boolean {\n const ownerCreatedAtMs =\n typeof owner?.createdAt === \"string\" && owner.createdAt.length > 0 ? Date.parse(owner.createdAt) : Number.NaN;\n const referenceMs = Number.isFinite(ownerCreatedAtMs) ? ownerCreatedAtMs : lockInfo.mtimeMs;\n return Date.now() - referenceMs < INDEX_LOCK_STALE_MS;\n}\n\nasync function removeAbandonedIndexLock(lockDir: string): Promise<IndexLockCleanupResult> {\n try {\n const info = await fs.promises.lstat(lockDir);\n if (info.isSymbolicLink()) return \"blocked\";\n if (!info.isDirectory()) {\n await fs.promises.rm(lockDir, { force: true });\n return \"removed\";\n }\n const owner = await readIndexLockOwner(lockDir);\n if (owner !== null) {\n if (await lockOwnerIsRunning(owner)) return \"wait\";\n }\n if (owner === null && lockIsFresh(info, null)) return \"wait\";\n await fs.promises.rm(lockDir, { recursive: true, force: true });\n return \"removed\";\n } catch (error) {\n if ((error as NodeJS.ErrnoException)?.code === \"ENOENT\") return \"removed\";\n // Fail silently — indexes are advisory only\n return \"blocked\";\n }\n}\n\nasync function withIndexFileLock<T>(filePath: string, update: () => Promise<T>): Promise<T | undefined> {\n const lockDir = `${filePath}.lock.d`;\n let acquired = false;\n\n while (!acquired) {\n try {\n await fs.promises.mkdir(lockDir);\n await writeIndexLockOwner(lockDir);\n acquired = true;\n } catch (error) {\n const code = (error as NodeJS.ErrnoException)?.code;\n if (code === \"ENOENT\") {\n try {\n await fs.promises.mkdir(path.dirname(lockDir), { recursive: true });\n } catch {\n return undefined;\n }\n await delay(INDEX_LOCK_POLL_MS);\n continue;\n }\n if (code !== \"EEXIST\") return undefined;\n const cleanupResult = await removeAbandonedIndexLock(lockDir);\n if (cleanupResult === \"blocked\") return undefined;\n await delay(INDEX_LOCK_POLL_MS);\n }\n }\n\n let result: T;\n try {\n result = await update();\n } finally {\n try {\n await fs.promises.rm(lockDir, { recursive: true, force: true });\n } catch {\n // Fail silently — indexes are advisory only\n }\n }\n return result;\n}\n\n/**\n * Atomic write: write to a unique `.tmp` sibling then rename so readers never\n * observe a partially-written file.\n */\nasync function writeJsonAtomic(filePath: string, data: unknown): Promise<boolean> {\n const payload = JSON.stringify(data);\n for (let attempt = 0; attempt < 3; attempt += 1) {\n const tmp = uniqueTempPath(filePath);\n try {\n await fs.promises.writeFile(tmp, payload, \"utf8\");\n await fs.promises.rename(tmp, filePath);\n return true;\n } catch {\n try {\n await fs.promises.unlink(tmp);\n } catch {\n // Fail silently — indexes are advisory only\n }\n await delay(INDEX_LOCK_POLL_MS);\n }\n }\n return false;\n}\n\nfunction emptyTemporalIndex(): TemporalIndex {\n return { version: INDEX_VERSION, dates: {}, events: {} };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction normalizeTemporalIndex(raw: TemporalIndex | null | undefined): TemporalIndex {\n if (!isRecord(raw)) return emptyTemporalIndex();\n return {\n version: typeof raw.version === \"number\" ? raw.version : 0,\n dates: isRecord(raw.dates) ? raw.dates as Record<string, string[]> : {},\n events: isRecord(raw.events) ? raw.events as Record<string, TemporalIndexEvent> : {},\n ...(typeof raw.lastRebuildAt === \"string\" ? { lastRebuildAt: raw.lastRebuildAt } : {}),\n };\n}\n\nfunction hasCurrentTemporalIndexSchema(raw: unknown): boolean {\n return isRecord(raw) &&\n raw.version === INDEX_VERSION &&\n isRecord(raw.dates) &&\n isRecord(raw.events);\n}\n\nasync function updateTemporalIndex(memoryDir: string, update: (index: TemporalIndex) => void): Promise<boolean> {\n const indexPath = temporalIndexPath(memoryDir);\n return withPathMutex(indexPath, async () => {\n const ok = await withIndexFileLock(indexPath, async () => {\n const loaded = await loadIndexCached(\n indexPath,\n (raw) => normalizeTemporalIndex(raw as TemporalIndex),\n hasCurrentTemporalIndexSchema,\n );\n const index = structuredClone(loaded.kind === \"ok\" ? loaded.index : emptyTemporalIndex());\n update(index);\n if (await writeJsonAtomic(indexPath, index)) {\n await primeCacheAfterWrite(indexPath, index, () => hasCurrentTemporalIndexSchema(index));\n return true;\n }\n parsedIndexCache.delete(indexPath);\n return false;\n });\n return ok === true;\n });\n}\n\nasync function updateTagIndex(memoryDir: string, update: (index: TagIndex) => void): Promise<void> {\n const indexPath = tagIndexPath(memoryDir);\n await withPathMutex(indexPath, async () => {\n await withIndexFileLock(indexPath, async () => {\n const loaded = await loadIndexCached(\n indexPath,\n (raw) => normalizeTagIndex(raw as TagIndex),\n () => true,\n );\n const index = structuredClone(\n loaded.kind === \"ok\"\n ? loaded.index\n : { version: TAG_INDEX_VERSION, tags: {}, aliases: {} },\n );\n update(index);\n if (await writeJsonAtomic(indexPath, index)) {\n await primeCacheAfterWrite(indexPath, index, () => true);\n } else {\n parsedIndexCache.delete(indexPath);\n }\n });\n });\n}\n\nfunction isoDateFromTimestamp(isoString: string): string {\n if (typeof isoString !== \"string\" || isoString.length < 10) {\n // Malformed frontmatter — fall back to today so the memory is still indexed.\n // Log a warning to surface data-quality issues without aborting the write.\n console.warn(`[engram] temporal-index: malformed timestamp \"${isoString}\", falling back to today`);\n return new Date().toISOString().slice(0, 10);\n }\n return isoString.slice(0, 10); // YYYY-MM-DD\n}\n\nfunction normalizedIsoTimestamp(value: string | undefined): string | undefined {\n if (typeof value !== \"string\" || value.trim().length === 0) return undefined;\n const ms = Date.parse(value);\n if (!Number.isFinite(ms)) return undefined;\n try {\n return new Date(ms).toISOString();\n } catch {\n return undefined;\n }\n}\n\nfunction temporalEventFromEntry(entry: TemporalIndexEntry): TemporalIndexEvent {\n const createdAt = normalizedIsoTimestamp(entry.createdAt) ?? new Date(0).toISOString();\n const eventAt = normalizedIsoTimestamp(entry.validAt) ?? createdAt;\n const observedAt = normalizedIsoTimestamp(entry.observedAt);\n const validUntil = normalizedIsoTimestamp(entry.validUntil);\n const sessionKey = typeof entry.sessionKey === \"string\" && entry.sessionKey.trim().length > 0\n ? entry.sessionKey.replace(/[\\u0000-\\u001f\\u007f]+/g, \" \").trim()\n : undefined;\n const searchTokenHashes = temporalSearchTokenHashes(entry.searchText);\n return {\n path: entry.path,\n eventAt,\n ...(observedAt ? { observedAt } : {}),\n ...(sessionKey ? { sessionKey } : {}),\n ...(validUntil ? { validUntil } : {}),\n ...(searchTokenHashes.length > 0 ? { searchTokenHashes } : {}),\n };\n}\n\nfunction temporalSearchTokens(value: string | undefined): string[] {\n if (!value) return [];\n const tokens = value\n .toLowerCase()\n .match(/[\\p{L}\\p{N}][\\p{L}\\p{N}'_-]*/gu)\n ?.filter((token) => token.length > 1) ?? [];\n return [...new Set(tokens)].slice(0, 128);\n}\n\nfunction temporalSearchTokenHashes(value: string | undefined): string[] {\n return temporalSearchTokens(value).map((token) =>\n crypto.createHash(\"sha256\").update(token).digest(\"hex\"),\n );\n}\n\nfunction compareTemporalIndexEvents(\n left: TemporalIndexEvent,\n right: TemporalIndexEvent,\n): number {\n const byEvent = left.eventAt.localeCompare(right.eventAt);\n if (byEvent !== 0) return byEvent;\n const byObservation = (left.observedAt ?? \"\").localeCompare(right.observedAt ?? \"\");\n if (byObservation !== 0) return byObservation;\n return left.path.localeCompare(right.path);\n}\n\nfunction addPathToSet(record: Record<string, string[]>, key: string, p: string): void {\n if (!record[key]) {\n record[key] = [];\n }\n if (!record[key].includes(p)) {\n record[key].push(p);\n }\n}\n\nfunction removePathFromSet(record: Record<string, string[]>, key: string, p: string): void {\n if (!record[key]) return;\n record[key] = record[key].filter((x) => x !== p);\n if (record[key].length === 0) {\n delete record[key];\n }\n}\n\nfunction removePathFromAllSets(record: Record<string, string[]>, p: string): void {\n for (const key of Object.keys(record)) {\n removePathFromSet(record, key, p);\n }\n}\n\nfunction normalizeTagSegment(segment: string): string {\n return segment\n .trim()\n .toLowerCase()\n .replace(/[_\\s]+/g, \"-\")\n .replace(/[^a-z0-9-]/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n}\n\nfunction normalizeCanonicalTag(tag: string): string {\n return tag\n .trim()\n .toLowerCase()\n .replace(/\\s*[>:|.]+\\s*/g, \"/\")\n .replace(/\\s*\\/\\s*/g, \"/\")\n .split(\"/\")\n .map(normalizeTagSegment)\n .filter(Boolean)\n .join(\"/\");\n}\n\nfunction normalizeAliasKey(tag: string): string {\n return tag\n .trim()\n .toLowerCase()\n .replace(/[\\/_.:-]+/g, \" \")\n .replace(/[-]+/g, \" \")\n .replace(/[^a-z0-9\\s]+/g, \" \")\n .replace(/\\s+/g, \" \")\n .trim();\n}\n\nfunction singularizeAlias(alias: string): string | null {\n if (!alias.endsWith(\"s\") || alias.length <= 3) return null;\n return alias.slice(0, -1);\n}\n\nfunction deriveParentTags(canonical: string): string[] {\n const parts = canonical.split(\"/\").filter(Boolean);\n const parents: string[] = [];\n for (let i = parts.length - 1; i > 0; i -= 1) {\n parents.push(parts.slice(0, i).join(\"/\"));\n }\n return parents;\n}\n\nfunction deriveTagAliases(rawTag: string, canonical: string): string[] {\n const aliases = new Set<string>();\n const canonicalAlias = normalizeAliasKey(canonical);\n const rawAlias = normalizeAliasKey(rawTag);\n const leaf = canonical.split(\"/\").at(-1) ?? canonical;\n const leafAlias = normalizeAliasKey(leaf);\n\n for (const candidate of [canonicalAlias, rawAlias, leafAlias]) {\n if (!candidate) continue;\n aliases.add(candidate);\n const singular = singularizeAlias(candidate);\n if (singular) aliases.add(singular);\n }\n\n return Array.from(aliases);\n}\n\nfunction normalizeTagIndex(raw: TagIndex | null | undefined): TagIndex {\n const normalized: TagIndex = {\n version: TAG_INDEX_VERSION,\n tags: {},\n aliases: {},\n };\n\n if (!raw || typeof raw !== \"object\") {\n return normalized;\n }\n\n const sourceTags = raw.tags ?? {};\n for (const [rawCanonical, nodeOrPaths] of Object.entries(sourceTags)) {\n const canonical = normalizeCanonicalTag(rawCanonical);\n if (!canonical) continue;\n const node: TagNode = Array.isArray(nodeOrPaths)\n ? { paths: [...new Set(nodeOrPaths)] }\n : {\n paths: Array.isArray(nodeOrPaths?.paths) ? [...new Set(nodeOrPaths.paths)] : [],\n aliases: Array.isArray(nodeOrPaths?.aliases) ? [...new Set(nodeOrPaths.aliases)] : [],\n parents: Array.isArray(nodeOrPaths?.parents) ? [...new Set(nodeOrPaths.parents)] : [],\n };\n const existingNode = normalized.tags[canonical];\n if (existingNode && !Array.isArray(existingNode)) {\n existingNode.paths = [...new Set([...existingNode.paths, ...node.paths])];\n existingNode.aliases = [...new Set([...(existingNode.aliases ?? []), ...(node.aliases ?? [])])];\n existingNode.parents = [...new Set([...(existingNode.parents ?? []), ...(node.parents ?? [])])];\n } else if (Array.isArray(existingNode)) {\n normalized.tags[canonical] = {\n paths: [...new Set([...existingNode, ...node.paths])],\n aliases: [...new Set(node.aliases ?? [])],\n parents: [...new Set(node.parents ?? deriveParentTags(canonical))],\n };\n } else {\n normalized.tags[canonical] = node;\n }\n for (const alias of deriveTagAliases(canonical, canonical)) {\n const list = normalized.aliases![alias] ?? [];\n if (!list.includes(canonical)) list.push(canonical);\n normalized.aliases![alias] = list;\n }\n for (const alias of node.aliases ?? []) {\n const aliasKey = normalizeAliasKey(alias);\n if (!aliasKey) continue;\n const list = normalized.aliases![aliasKey] ?? [];\n if (!list.includes(canonical)) list.push(canonical);\n normalized.aliases![aliasKey] = list;\n }\n const mergedNode = normalized.tags[canonical];\n if (mergedNode && !Array.isArray(mergedNode)) {\n mergedNode.parents = [...new Set(mergedNode.parents ?? deriveParentTags(canonical))];\n }\n }\n\n for (const [alias, canonicals] of Object.entries(raw.aliases ?? {})) {\n const aliasKey = normalizeAliasKey(alias);\n if (!aliasKey) continue;\n const list = normalized.aliases![aliasKey] ?? [];\n for (const canonical of canonicals ?? []) {\n const normalizedCanonical = normalizeCanonicalTag(canonical);\n if (normalizedCanonical && !list.includes(normalizedCanonical)) {\n list.push(normalizedCanonical);\n }\n }\n normalized.aliases![aliasKey] = list;\n }\n\n return normalized;\n}\n\nfunction ensureTagNode(index: TagIndex, canonical: string): TagNode {\n const existing = index.tags[canonical];\n if (existing && !Array.isArray(existing)) {\n return existing;\n }\n const created: TagNode = {\n paths: Array.isArray(existing) ? [...new Set(existing)] : [],\n aliases: [],\n parents: deriveParentTags(canonical),\n };\n index.tags[canonical] = created;\n return created;\n}\n\nfunction addTagGraphEntry(index: TagIndex, rawTag: string, memoryPath: string): void {\n const canonical = normalizeCanonicalTag(rawTag);\n if (!canonical) return;\n const node = ensureTagNode(index, canonical);\n if (!node.paths.includes(memoryPath)) {\n node.paths.push(memoryPath);\n }\n\n for (const alias of deriveTagAliases(rawTag, canonical)) {\n const aliasKey = normalizeAliasKey(alias);\n if (!aliasKey) continue;\n if (!node.aliases?.includes(aliasKey)) {\n node.aliases = [...new Set([...(node.aliases ?? []), aliasKey])];\n }\n const list = index.aliases?.[aliasKey] ?? [];\n if (!list.includes(canonical)) {\n index.aliases![aliasKey] = [...list, canonical];\n }\n }\n}\n\nfunction removeTagGraphEntry(index: TagIndex, rawTag: string, memoryPath: string): void {\n const canonical = normalizeCanonicalTag(rawTag);\n if (!canonical) return;\n const node = index.tags[canonical];\n if (!node || Array.isArray(node)) return;\n node.paths = node.paths.filter((value) => value !== memoryPath);\n if (node.paths.length === 0) {\n delete index.tags[canonical];\n pruneTagAliases(index);\n }\n}\n\nfunction removePathFromAllTagEntries(index: TagIndex, memoryPath: string): void {\n for (const [canonical, nodeOrPaths] of Object.entries(index.tags)) {\n if (Array.isArray(nodeOrPaths)) {\n const paths = nodeOrPaths.filter((value) => value !== memoryPath);\n if (paths.length === 0) {\n delete index.tags[canonical];\n } else {\n index.tags[canonical] = paths;\n }\n continue;\n }\n\n nodeOrPaths.paths = nodeOrPaths.paths.filter((value) => value !== memoryPath);\n if (nodeOrPaths.paths.length === 0) {\n delete index.tags[canonical];\n }\n }\n pruneTagAliases(index);\n}\n\nfunction pruneTagAliases(index: TagIndex): void {\n if (!index.aliases) return;\n for (const [alias, canonicals] of Object.entries(index.aliases)) {\n const filtered = [...new Set(canonicals.map(normalizeCanonicalTag))].filter(\n (canonical) => canonical.length > 0 && index.tags[canonical] !== undefined\n );\n if (filtered.length === 0) {\n delete index.aliases[alias];\n } else {\n index.aliases[alias] = filtered;\n }\n }\n}\n\nfunction expandCanonicalTags(index: TagIndex, rawTags: string[]): string[] {\n const canonicals = new Set<string>();\n for (const rawTag of rawTags) {\n const canonical = normalizeCanonicalTag(rawTag);\n if (canonical && index.tags[canonical]) {\n canonicals.add(canonical);\n }\n const aliasKey = normalizeAliasKey(rawTag);\n for (const resolved of index.aliases?.[aliasKey] ?? []) {\n canonicals.add(resolved);\n }\n }\n\n const expanded = new Set<string>();\n for (const canonical of canonicals) {\n expanded.add(canonical);\n const node = index.tags[canonical];\n if (node && !Array.isArray(node)) {\n for (const parent of node.parents ?? []) {\n expanded.add(parent);\n }\n }\n }\n return Array.from(expanded);\n}\n\nfunction aliasPhrase(alias: string): string {\n return alias.replace(/\\//g, \" \").replace(/-/g, \" \").replace(/\\s+/g, \" \").trim();\n}\n\nexport type TemporalIndexCompatibilityMutation =\n | { kind: \"index\"; entries: TemporalIndexEntry[] }\n | { kind: \"deindex\"; entries: TemporalIndexEntry[] }\n | { kind: \"clear\" };\n\n/** @internal Pure model shared by the deprecated synchronous compatibility surface. */\nexport function applyTemporalIndexCompatibilityMutation(\n raw: unknown,\n mutation: TemporalIndexCompatibilityMutation,\n): TemporalIndex {\n const index = structuredClone(normalizeTemporalIndex(raw as TemporalIndex));\n if (mutation.kind === \"clear\") {\n return emptyTemporalIndex();\n }\n if (mutation.kind === \"index\") index.version = INDEX_VERSION;\n for (const entry of mutation.entries) {\n const dateKey = isoDateFromTimestamp(entry.createdAt);\n if (mutation.kind === \"index\") {\n removePathFromAllSets(index.dates, entry.path);\n addPathToSet(index.dates, dateKey, entry.path);\n index.events[entry.path] = temporalEventFromEntry(entry);\n } else {\n removePathFromSet(index.dates, dateKey, entry.path);\n delete index.events[entry.path];\n }\n }\n return index;\n}\n\n/** @internal Pure model shared by the deprecated synchronous compatibility surface. */\nexport function applyTagIndexCompatibilityMutation(\n raw: unknown,\n mutation: TemporalIndexCompatibilityMutation,\n): TagIndex {\n const index = structuredClone(normalizeTagIndex(raw as TagIndex));\n if (mutation.kind === \"clear\") {\n return { version: TAG_INDEX_VERSION, tags: {}, aliases: {} };\n }\n for (const entry of mutation.entries) {\n if (mutation.kind === \"index\") {\n removePathFromAllTagEntries(index, entry.path);\n for (const tag of entry.tags) {\n if (tag && typeof tag === \"string\") addTagGraphEntry(index, tag, entry.path);\n }\n } else {\n for (const tag of entry.tags) {\n if (tag && typeof tag === \"string\") removeTagGraphEntry(index, tag, entry.path);\n }\n }\n }\n return index;\n}\n\n/** @internal Schema check shared by the deprecated synchronous compatibility surface. */\nexport function hasCurrentTemporalIndexSchemaForCompatibility(raw: unknown): boolean {\n return hasCurrentTemporalIndexSchema(raw);\n}\n\n// ─── Public API ────────────────────────────────────────────────────────────────\n\n/**\n * Add (or update) a memory file in both indexes.\n *\n * @param memoryDir Root memory directory\n * @param memoryPath Absolute path to the memory file\n * @param createdAt ISO timestamp of the memory's creation date\n * @param tags Array of tag strings from the memory's frontmatter\n */\nexport async function indexMemoryAsync(\n memoryDir: string,\n memoryPath: string,\n createdAt: string,\n tags: string[],\n temporal: Omit<Partial<TemporalIndexEntry>, \"path\" | \"createdAt\" | \"tags\"> = {},\n): Promise<void> {\n try {\n await ensureStateDir(memoryDir);\n\n const dateKey = isoDateFromTimestamp(createdAt);\n await withMemoryDirMutex(memoryDir, async () => {\n // Write the temporal half first; if its atomic write FAILS, do NOT commit\n // the tag half (issue #1911, Cursor Medium) — committing tags while\n // temporal stays unchanged leaves a durable mismatch until a later index.\n const temporalOk = await updateTemporalIndex(memoryDir, (index) => {\n index.version = INDEX_VERSION;\n removePathFromAllSets(index.dates, memoryPath);\n addPathToSet(index.dates, dateKey, memoryPath);\n index.events[memoryPath] = temporalEventFromEntry({\n path: memoryPath,\n createdAt,\n tags,\n ...temporal,\n });\n });\n if (temporalOk) {\n await updateTagIndex(memoryDir, (index) => {\n removePathFromAllTagEntries(index, memoryPath);\n for (const tag of tags) {\n if (tag && typeof tag === \"string\") {\n addTagGraphEntry(index, tag, memoryPath);\n }\n }\n });\n }\n });\n } catch {\n // Fail silently\n }\n}\n\n/**\n * Remove a memory file from both indexes (called on deletion/archival).\n */\nexport async function deindexMemoryAsync(\n memoryDir: string,\n memoryPath: string,\n createdAt: string,\n tags: string[],\n): Promise<void> {\n try {\n await ensureStateDir(memoryDir);\n\n const dateKey = isoDateFromTimestamp(createdAt);\n await withMemoryDirMutex(memoryDir, async () => {\n const temporalOk = await updateTemporalIndex(memoryDir, (index) => {\n removePathFromSet(index.dates, dateKey, memoryPath);\n delete index.events[memoryPath];\n });\n if (temporalOk) {\n await updateTagIndex(memoryDir, (index) => {\n for (const tag of tags) {\n if (tag && typeof tag === \"string\") {\n removeTagGraphEntry(index, tag, memoryPath);\n }\n }\n });\n }\n });\n } catch {\n // Fail silently\n }\n}\n\n/**\n * Reset both index files to empty state.\n * Called before a full-corpus rebuild so stale paths in any surviving index\n * file do not persist after the rebuild completes.\n */\nexport async function clearIndexesAsync(memoryDir: string): Promise<void> {\n try {\n await ensureStateDir(memoryDir);\n await withMemoryDirMutex(memoryDir, async () => {\n const temporalOk = await updateTemporalIndex(memoryDir, (index) => {\n index.version = INDEX_VERSION;\n index.lastRebuildAt = undefined;\n index.dates = {};\n index.events = {};\n });\n if (temporalOk) {\n await updateTagIndex(memoryDir, (index) => {\n index.version = TAG_INDEX_VERSION;\n index.lastRebuildAt = undefined;\n index.tags = {};\n index.aliases = {};\n });\n }\n });\n } catch {\n // Fail silently — indexes are advisory only\n }\n}\n\n/**\n * Returns true when both index files exist on disk.\n * Used to detect first-time enablement so callers can trigger a full rebuild.\n */\nexport async function indexesExistAsync(memoryDir: string): Promise<boolean> {\n try {\n await fs.promises.access(tagIndexPath(memoryDir));\n const loaded = await loadIndexCached(\n temporalIndexPath(memoryDir),\n (raw) => normalizeTemporalIndex(raw as TemporalIndex),\n hasCurrentTemporalIndexSchema,\n );\n return loaded.kind === \"ok\" && loaded.currentSchema;\n } catch {\n return false;\n }\n}\n\n/**\n * Batch-add multiple memories to both indexes in a single read-modify-write cycle.\n * More efficient than calling indexMemoryAsync() per file when adding many at once.\n */\nexport async function indexMemoriesBatchAsync(\n memoryDir: string,\n entries: TemporalIndexEntry[]\n): Promise<void> {\n if (entries.length === 0) return;\n try {\n await ensureStateDir(memoryDir);\n\n await withMemoryDirMutex(memoryDir, async () => {\n const temporalOk = await updateTemporalIndex(memoryDir, (index) => {\n index.version = INDEX_VERSION;\n for (const entry of entries) {\n const dateKey = isoDateFromTimestamp(entry.createdAt);\n removePathFromAllSets(index.dates, entry.path);\n addPathToSet(index.dates, dateKey, entry.path);\n index.events[entry.path] = temporalEventFromEntry(entry);\n }\n });\n if (temporalOk) {\n await updateTagIndex(memoryDir, (index) => {\n for (const entry of entries) {\n removePathFromAllTagEntries(index, entry.path);\n for (const tag of entry.tags) {\n if (tag && typeof tag === \"string\") {\n addTagGraphEntry(index, tag, entry.path);\n }\n }\n }\n });\n }\n });\n } catch {\n // Fail silently\n }\n}\n\n/**\n * Return the set of memory paths whose index date falls in [fromDate, toDate).\n *\n * Boundary semantics (exclusive upper bound):\n * - `fromDate` is INCLUSIVE — entries on this date ARE returned.\n * - `toDate` is EXCLUSIVE — entries on this date are NOT returned.\n * Pass `recencyWindowBoundsFromPrompt(query).toDate` to get the correct\n * exclusive boundary; do NOT add +1 day yourself.\n * - Default `toDate` = tomorrow, so omitting it includes all of today.\n *\n * @param memoryDir - root memory directory (contains state/index_time.json)\n * @param fromDate - inclusive start date, YYYY-MM-DD\n * @param toDate - exclusive end date, YYYY-MM-DD (default: tomorrow)\n * @returns Set of matching file paths, or null if the index is unavailable.\n */\nexport async function queryByDateRangeAsync(\n memoryDir: string,\n fromDate: string,\n toDate?: string\n): Promise<Set<string> | null> {\n try {\n const tPath = temporalIndexPath(memoryDir);\n const loaded = await loadIndexCached(\n tPath,\n (raw) => normalizeTemporalIndex(raw as TemporalIndex),\n hasCurrentTemporalIndexSchema,\n );\n if (loaded.kind === \"missing\") return null;\n const tIndex = loaded.kind === \"ok\" ? loaded.index : emptyTemporalIndex();\n // toDate is exclusive (first day NOT included). Default: tomorrow so \"all of today\" is included.\n const end = toDate ?? new Date(Date.now() + 86_400_000).toISOString().slice(0, 10);\n\n const results = new Set<string>();\n for (const [date, paths] of Object.entries(tIndex.dates)) {\n if (date >= fromDate && date < end) {\n for (const p of paths) {\n results.add(p);\n }\n }\n }\n return results;\n } catch {\n return null;\n }\n}\n\n/**\n * Return the persisted event-time rows as one deterministic cross-session\n * chronology. Equal event times are ordered by observation time, then path.\n * Returns `null` when the index is missing, corrupt, or from an older schema;\n * callers can then fail open to the pre-index recall path.\n */\nexport async function queryTemporalTimelineAsync(\n memoryDir: string,\n options: { query?: string; limit?: number } = {},\n): Promise<TemporalIndexEvent[] | null> {\n try {\n const loaded = await loadIndexCached(\n temporalIndexPath(memoryDir),\n (raw) => normalizeTemporalIndex(raw as TemporalIndex),\n hasCurrentTemporalIndexSchema,\n );\n if (loaded.kind !== \"ok\" || !loaded.currentSchema) return null;\n const index = loaded.index;\n const chronology = Object.values(index.events)\n .filter((event) =>\n typeof event?.path === \"string\" &&\n event.path.length > 0 &&\n normalizedIsoTimestamp(event.eventAt) !== undefined\n )\n .map((event) => ({\n path: event.path,\n eventAt: normalizedIsoTimestamp(event.eventAt)!,\n ...(normalizedIsoTimestamp(event.observedAt)\n ? { observedAt: normalizedIsoTimestamp(event.observedAt) }\n : {}),\n ...(typeof event.sessionKey === \"string\" && event.sessionKey.trim().length > 0\n ? { sessionKey: event.sessionKey.trim() }\n : {}),\n ...(normalizedIsoTimestamp(event.validUntil)\n ? { validUntil: normalizedIsoTimestamp(event.validUntil) }\n : {}),\n ...(Array.isArray(event.searchTokenHashes)\n ? { searchTokenHashes: event.searchTokenHashes.filter((hash) => typeof hash === \"string\") }\n : {}),\n }))\n .sort(compareTemporalIndexEvents);\n const requestedLimit = typeof options.limit === \"number\" && Number.isFinite(options.limit)\n ? Math.max(0, Math.floor(options.limit))\n : chronology.length;\n if (requestedLimit === 0) return [];\n if (chronology.length <= requestedLimit) return chronology;\n\n const queryHashes = new Set(temporalSearchTokenHashes(options.query));\n const scored = chronology.map((event) => ({\n event,\n score: (event.searchTokenHashes ?? []).reduce(\n (sum, hash) => sum + (queryHashes.has(hash) ? 1 : 0),\n 0,\n ),\n }));\n if (scored.some(({ score }) => score > 0)) {\n return scored\n .filter(({ score }) => score > 0)\n .sort((left, right) => right.score - left.score || compareTemporalIndexEvents(left.event, right.event))\n .slice(0, requestedLimit)\n .map(({ event }) => event)\n .sort(compareTemporalIndexEvents);\n }\n\n // No lexical match (legacy rows or generic \"first/last\" query): retain\n // both chronology edges so earliest and latest questions remain answerable.\n const earlyCount = Math.ceil(requestedLimit / 2);\n const lateCount = requestedLimit - earlyCount;\n const selected = [\n ...chronology.slice(0, earlyCount),\n ...(lateCount > 0 ? chronology.slice(-lateCount) : []),\n ];\n return selected.sort(compareTemporalIndexEvents);\n } catch {\n return null;\n }\n}\n\n/**\n * Async version of queryByTags — uses non-blocking fs.promises.readFile\n * to avoid blocking the Node.js event loop.\n */\nexport async function queryByTagsAsync(memoryDir: string, tags: string[]): Promise<Set<string> | null> {\n if (tags.length === 0) return null;\n try {\n const gPath = tagIndexPath(memoryDir);\n const loaded = await loadIndexCached(\n gPath,\n (raw) => normalizeTagIndex(raw as TagIndex),\n () => true,\n );\n if (loaded.kind !== \"ok\") return null;\n return queryByTagsFromIndex(loaded.index, tags);\n } catch {\n return null;\n }\n}\n\nfunction queryByTagsFromIndex(index: TagIndex, tags: string[]): Set<string> {\n const expandedTags = expandCanonicalTags(index, tags);\n const results = new Set<string>();\n for (const canonical of expandedTags) {\n const nodeOrPaths = index.tags[canonical];\n const paths = Array.isArray(nodeOrPaths) ? nodeOrPaths : (nodeOrPaths?.paths ?? []);\n for (const pathValue of paths) {\n results.add(pathValue);\n }\n }\n return results;\n}\n\n/**\n * Extract tags from a prompt for tag-based prefiltering.\n * Looks for hashtag-style tokens (#foo).\n * Returns lowercase, deduplicated list.\n */\nexport function extractTagsFromPrompt(prompt: string): string[] {\n const found = new Set<string>();\n\n // Match #tag style tokens\n const hashMatches = prompt.matchAll(/#([a-zA-Z][\\w-]{1,30})/g);\n for (const m of hashMatches) {\n const canonical = normalizeCanonicalTag(m[1]);\n if (canonical) found.add(canonical);\n }\n\n return Array.from(found);\n}\n\nexport async function resolvePromptTagPrefilterAsync(\n memoryDir: string,\n prompt: string\n): Promise<{\n matchedTags: string[];\n expandedTags: string[];\n paths: Set<string> | null;\n}> {\n const explicitTags = extractTagsFromPrompt(prompt);\n try {\n const loaded = await loadIndexCached(\n tagIndexPath(memoryDir),\n (raw) => normalizeTagIndex(raw as TagIndex),\n () => true,\n );\n if (loaded.kind !== \"ok\") {\n return { matchedTags: explicitTags, expandedTags: explicitTags, paths: null };\n }\n const tagIndex = loaded.index;\n const matched = new Set<string>(explicitTags);\n const normalizedPrompt = ` ${normalizeAliasKey(prompt)} `;\n const containsAlias = (alias: string): boolean => {\n const phrase = aliasPhrase(alias);\n return phrase.length > 0 && normalizedPrompt.includes(` ${phrase} `);\n };\n\n for (const canonical of Object.keys(tagIndex.tags)) {\n if (containsAlias(canonical)) {\n matched.add(canonical);\n }\n }\n for (const [alias, canonicals] of Object.entries(tagIndex.aliases ?? {})) {\n if (!containsAlias(alias)) continue;\n for (const canonical of canonicals) {\n matched.add(canonical);\n }\n }\n if (matched.size === 0) {\n return {\n matchedTags: [],\n expandedTags: [],\n paths: null,\n };\n }\n\n const expandedTags = expandCanonicalTags(tagIndex, Array.from(matched));\n const paths = queryByTagsFromIndex(tagIndex, expandedTags);\n return {\n matchedTags: Array.from(matched),\n expandedTags,\n paths,\n };\n } catch {\n return { matchedTags: explicitTags, expandedTags: explicitTags, paths: null };\n }\n}\n\n/**\n * Run a group of index reads as ONE consistent snapshot (issue #1911, Codex\n * Medium). The `read` callback executes inside a single withMemoryDirMutex\n * acquisition — the same in-memory op-lock every async mutator holds across its\n * paired temporal+tag writes — so no mutation can land between the reads inside\n * it. A recall that reads the temporal and tag indexes together therefore never\n * observes a half-updated state (e.g. a new temporal row with a not-yet-written\n * tag membership) that would let prefiltering drop the current memory. The\n * genuine-tag-miss contract is preserved: a truly absent tag still yields an\n * empty set, only now never as a transient artifact of an in-flight write.\n * Index reads are cache-backed (microseconds), so ordering them on the op-chain\n * is negligible beside the multi-second QMD phase.\n */\nexport function readIndexSnapshotAsync<T>(\n memoryDir: string,\n read: () => Promise<T>,\n): Promise<T> {\n return withMemoryDirMutex(memoryDir, read);\n}\n\n/**\n * Detect if a prompt is time-sensitive (mentions specific time references).\n * Used to decide whether to activate the temporal prefilter.\n */\nexport function isTemporalQuery(prompt: string): boolean {\n return /\\b(today|yesterday|this week|last week|this month|last month|recent(?:ly)?|lately|just now|earlier today|this morning|last night|last year|this year|\\d+ days? ago|\\d+ hours? ago|\\d+ weeks? ago|\\d+ months? ago|(?:in |on |during |since |before |after )?(?:january|february|march|april|may|june|july|august|september|october|november|december)(?:\\s+\\d{1,4})?|\\d{4}-\\d{2}-\\d{2}|\\d{1,2}\\/\\d{1,2}\\/\\d{2,4}|(?:spring|summer|fall|autumn|winter)\\s+\\d{4}|on the \\d{1,2}(?:st|nd|rd|th)?|last (?:monday|tuesday|wednesday|thursday|friday|saturday|sunday))\\b/i.test(\n prompt\n );\n}\n\n/**\n * Compute a \"from date\" string (YYYY-MM-DD) for a recency-based temporal query.\n * For \"recent\" / \"lately\" returns 7 days ago; for today/yesterday the obvious window.\n */\nexport function recencyWindowFromPrompt(prompt: string, nowMs: number = Date.now()): string {\n const p = prompt.toLowerCase();\n const now = new Date(nowMs);\n let daysBack = 7; // default\n\n if (/\\btoday\\b/.test(p) || /\\bthis morning\\b/.test(p) || /\\bjust now\\b/.test(p) || /\\bearlier today\\b/.test(p)) {\n daysBack = 0; // fromDate = today → window [today, today]\n } else if (/\\byesterday\\b/.test(p) || /\\blast night\\b/.test(p)) {\n daysBack = 1; // fromDate = yesterday → window [yesterday, today]\n } else if (/\\bthis week\\b/.test(p)) {\n daysBack = 7;\n } else if (/\\blast week\\b/.test(p)) {\n daysBack = 14;\n } else if (/\\bthis month\\b/.test(p)) {\n daysBack = 31;\n } else if (/\\blast month\\b/.test(p)) {\n daysBack = 62;\n } else if (/\\bthis year\\b/.test(p)) {\n // From Jan 1 of current year\n const jan1 = new Date(now.getFullYear(), 0, 1);\n return jan1.toISOString().slice(0, 10);\n } else if (/\\blast year\\b/.test(p)) {\n const jan1LastYear = new Date(now.getFullYear() - 1, 0, 1);\n return jan1LastYear.toISOString().slice(0, 10);\n } else {\n // Try specific month references: \"in March\", \"during January\", \"since February\"\n const monthNames = [\n \"january\",\n \"february\",\n \"march\",\n \"april\",\n \"may\",\n \"june\",\n \"july\",\n \"august\",\n \"september\",\n \"october\",\n \"november\",\n \"december\",\n ];\n const monthMatch = p.match(\n /\\b(january|february|march|april|may|june|july|august|september|october|november|december)(?:\\s+(\\d{4}))?\\b/\n );\n if (monthMatch) {\n const monthIdx = monthNames.indexOf(monthMatch[1]);\n const year = monthMatch[2] ? Number.parseInt(monthMatch[2], 10) : now.getFullYear();\n // \"before <month>\" means everything prior to that month: use 2-year lookback\n // as fromDate so the window isn't unbounded. toDate is set to the month start\n // in recencyWindowBoundsFromPrompt.\n // IMPORTANT: when an explicit year is given, anchor the lookback to the named\n // month start (not to today). \"before January 2024\" should produce\n // fromDate ≈ 2022-01 — not today-730 days, which could land after 2024-01 and\n // invert the window for any explicitly past month within the 730-day horizon.\n if (/\\bbefore\\b/.test(p)) {\n if (monthMatch[2]) {\n // Explicit year: anchor fromDate 730 days before the named month start.\n const monthStart = new Date(year, monthIdx, 1);\n return new Date(monthStart.getTime() - 730 * 86_400_000).toISOString().slice(0, 10);\n }\n daysBack = 730;\n } else {\n const monthStart = new Date(year, monthIdx, 1);\n return monthStart.toISOString().slice(0, 10);\n }\n }\n\n // Try \"N weeks ago\"\n const weekMatch = p.match(/(\\d{1,5})\\s*weeks?\\s*ago/);\n if (weekMatch) {\n daysBack = Math.min(365, Number.parseInt(weekMatch[1], 10) * 7);\n } else {\n // Try \"N months ago\"\n const monthsAgoMatch = p.match(/(\\d{1,5})\\s*months?\\s*ago/);\n if (monthsAgoMatch) {\n daysBack = Math.min(730, Number.parseInt(monthsAgoMatch[1], 10) * 31);\n } else {\n const numMatch = p.match(/(\\d{1,5})\\s*days?\\s*ago/);\n if (numMatch) {\n daysBack = Math.min(365, Number.parseInt(numMatch[1], 10)); // no off-by-one: \"3 days ago\" → 3\n } else {\n const hrMatch = p.match(/(\\d{1,5})\\s*hours?\\s*ago/);\n if (hrMatch) {\n // Convert hours to days (ceiling); at least 1 day window\n daysBack = Math.max(1, Math.ceil(Number.parseInt(hrMatch[1], 10) / 24));\n }\n }\n }\n }\n\n // Try explicit date patterns: YYYY-MM-DD or MM/DD/YYYY\n const isoMatch = p.match(/(\\d{4})-(\\d{2})-(\\d{2})/);\n if (isoMatch) {\n return `${isoMatch[1]}-${isoMatch[2]}-${isoMatch[3]}`;\n }\n const usMatch = p.match(/(\\d{1,2})\\/(\\d{1,2})\\/(\\d{2,4})/);\n if (usMatch) {\n const year = usMatch[3].length === 2 ? 2000 + Number.parseInt(usMatch[3], 10) : Number.parseInt(usMatch[3], 10);\n return `${year}-${usMatch[1].padStart(2, \"0\")}-${usMatch[2].padStart(2, \"0\")}`;\n }\n\n // Try \"last Monday/Tuesday/etc\"\n const dayOfWeekMatch = p.match(/\\blast\\s+(monday|tuesday|wednesday|thursday|friday|saturday|sunday)\\b/);\n if (dayOfWeekMatch) {\n const dayNames = [\"sunday\", \"monday\", \"tuesday\", \"wednesday\", \"thursday\", \"friday\", \"saturday\"];\n const targetDay = dayNames.indexOf(dayOfWeekMatch[1]);\n const currentDay = now.getDay();\n daysBack = (currentDay - targetDay + 7) % 7 || 7; // at least 7 days back\n }\n }\n\n const from = new Date(nowMs - daysBack * 24 * 60 * 60 * 1000);\n return from.toISOString().slice(0, 10);\n}\n\n/**\n * Returns both the start and end of the temporal window implied by the prompt.\n *\n * `fromDate` is computed by delegating to `recencyWindowFromPrompt`, so the two\n * functions cannot diverge on the lower bound. `toDate` is computed independently\n * here using the same pattern-priority ordering, because the upper-bound arithmetic\n * differs (exclusive end vs. inclusive start) and would not be expressible as a\n * simple wrapper.\n *\n * Known divergence to be aware of: for \"N hours ago\", `recencyWindowFromPrompt`\n * uses `Math.max(1, Math.ceil(hours/24))` days back, so `fromDate` = yesterday for\n * sub-24h values. `toDate` here is always `tomorrow` when no explicit date is\n * specified (see the `toDaysBack === 0` branch), giving a 2-day window. This is\n * intentional — the window must cover both yesterday and today for recent hour-level\n * queries. Any fix to the hours formula in `recencyWindowFromPrompt` must be\n * manually reflected here.\n *\n * - `fromDate`: first day of the implied window (same as `recencyWindowFromPrompt`)\n * - `toDate`: first day NOT in the window (exclusive upper bound), so callers\n * should filter with `date >= fromDate && date < toDate`.\n */\nexport function recencyWindowBoundsFromPrompt(\n prompt: string,\n nowMs: number = Date.now()\n): { fromDate: string; toDate: string } {\n const fromDate = recencyWindowFromPrompt(prompt, nowMs);\n const p = prompt.toLowerCase();\n const now = new Date(nowMs);\n const today = now.toISOString().slice(0, 10);\n const tomorrow = new Date(nowMs + 86_400_000).toISOString().slice(0, 10);\n\n let toDate: string;\n\n if (/\\btoday\\b|\\bthis morning\\b|\\bjust now\\b|\\bearlier today\\b/.test(p)) {\n toDate = tomorrow; // exclusive: include all of today\n } else if (/\\byesterday\\b|\\blast night\\b/.test(p)) {\n toDate = today; // exclusive: include all of yesterday, stop before today\n } else if (/\\bthis week\\b|\\bthis month\\b|\\bthis year\\b/.test(p)) {\n toDate = tomorrow; // exclusive: include all of today\n } else if (/\\blast week\\b/.test(p)) {\n toDate = new Date(nowMs - 7 * 86_400_000).toISOString().slice(0, 10); // already exclusive\n } else if (/\\blast month\\b/.test(p)) {\n toDate = new Date(nowMs - 31 * 86_400_000).toISOString().slice(0, 10); // approximately exclusive\n } else if (/\\blast year\\b/.test(p)) {\n toDate = `${now.getFullYear()}-01-01`; // exclusive: stop at Jan 1 of current year\n } else {\n // Mirror the structure of recencyWindowFromPrompt's else branch:\n // month name → early set (highest priority), then ago patterns set a\n // working offset, then ISO/US/weekday patterns run AFTER ago patterns\n // and can override them — matching the priority ordering in recencyWindowFromPrompt.\n\n const monthNames = [\n \"january\",\n \"february\",\n \"march\",\n \"april\",\n \"may\",\n \"june\",\n \"july\",\n \"august\",\n \"september\",\n \"october\",\n \"november\",\n \"december\",\n ];\n const monthMatch = p.match(\n /\\b(january|february|march|april|may|june|july|august|september|october|november|december)(?:\\s+(\\d{4}))?\\b/\n );\n if (monthMatch) {\n // \"since <month>\" / \"after <month>\" — open-ended: everything from that month to now.\n // \"before <month>\" — closed upper bound: everything before that month starts.\n // Plain \"<month>\" — just that calendar month.\n const monthIdx = monthNames.indexOf(monthMatch[1]);\n const year = monthMatch[2] ? Number.parseInt(monthMatch[2], 10) : now.getFullYear();\n const isSinceOrAfter = /\\b(since|after)\\b/.test(p);\n const isBefore = /\\bbefore\\b/.test(p);\n if (isSinceOrAfter) {\n toDate = tomorrow;\n } else if (isBefore) {\n // \"before <month>\" means everything prior to that month.\n // toDate = first day of that month (exclusive upper bound).\n toDate = new Date(year, monthIdx, 1).toISOString().slice(0, 10);\n } else {\n // Closed window: first day of the NEXT month is the exclusive upper bound.\n toDate = new Date(year, monthIdx + 1, 1).toISOString().slice(0, 10);\n }\n } else {\n // Ago patterns set a working offset (recent edge of the N-ago window).\n // Same nesting order as recencyWindowFromPrompt.\n // Sentinel -1 means \"no ago pattern matched\" → toDate falls back to tomorrow.\n let toDaysBack = -1;\n const weekMatch = p.match(/(\\d{1,5})\\s*weeks?\\s*ago/);\n if (weekMatch) {\n toDaysBack = Math.max(0, Math.min(52, Number.parseInt(weekMatch[1], 10)) - 1) * 7;\n } else {\n const monthsAgoMatch = p.match(/(\\d{1,5})\\s*months?\\s*ago/);\n if (monthsAgoMatch) {\n toDaysBack = Math.max(0, Math.min(24, Number.parseInt(monthsAgoMatch[1], 10)) - 1) * 31;\n } else {\n const numMatch = p.match(/(\\d{1,5})\\s*days?\\s*ago/);\n if (numMatch) {\n // (N-1) mirrors the weeks/months ago formula: \"3 days ago\" → window [today-3, today-2]\n // N=1 → toDaysBack=0 → toDate=today (exclusive) → window [yesterday, today) = 1 day. ✓\n toDaysBack = Math.max(0, Math.min(365, Number.parseInt(numMatch[1], 10)) - 1);\n } else {\n const hrMatch = p.match(/(\\d{1,5})\\s*hours?\\s*ago/);\n if (hrMatch) {\n // Sub-day precision: keep sentinel -1 so toDate falls back to tomorrow,\n // which includes today. fromDate = yesterday (recencyWindowFromPrompt uses ceiling).\n toDaysBack = -1;\n }\n }\n }\n }\n\n // Explicit date/weekday patterns run AFTER ago patterns (same as recencyWindowFromPrompt)\n // and override the ago-derived offset when present.\n const isoMatch = p.match(/(\\d{4})-(\\d{2})-(\\d{2})/);\n if (isoMatch) {\n // +1 day: exclusive upper bound includes the named date\n const d = new Date(`${isoMatch[1]}-${isoMatch[2]}-${isoMatch[3]}T00:00:00Z`);\n toDate = new Date(d.getTime() + 86_400_000).toISOString().slice(0, 10);\n } else {\n const usMatch = p.match(/(\\d{1,2})\\/(\\d{1,2})\\/(\\d{2,4})/);\n if (usMatch) {\n const year =\n usMatch[3].length === 2 ? 2000 + Number.parseInt(usMatch[3], 10) : Number.parseInt(usMatch[3], 10);\n // +1 day: exclusive upper bound includes the named date\n const d = new Date(`${year}-${usMatch[1].padStart(2, \"0\")}-${usMatch[2].padStart(2, \"0\")}T00:00:00Z`);\n toDate = new Date(d.getTime() + 86_400_000).toISOString().slice(0, 10);\n } else {\n const dayOfWeekMatch = p.match(/\\blast\\s+(monday|tuesday|wednesday|thursday|friday|saturday|sunday)\\b/);\n if (dayOfWeekMatch) {\n const dayNames = [\"sunday\", \"monday\", \"tuesday\", \"wednesday\", \"thursday\", \"friday\", \"saturday\"];\n const targetDay = dayNames.indexOf(dayOfWeekMatch[1]);\n const currentDay = now.getDay();\n const daysBack = (currentDay - targetDay + 7) % 7 || 7;\n // +1 day: exclusive upper bound includes the named weekday\n toDate = new Date(nowMs - (daysBack - 1) * 86_400_000).toISOString().slice(0, 10);\n } else {\n // Use the ago-derived offset.\n // toDaysBack=-1 means no pattern matched (or hours-ago): use tomorrow so today\n // is included in the window. toDaysBack=0 means N=1 ago (e.g. \"1 day ago\"):\n // toDate = today (exclusive) correctly creates a 1-day window [yesterday, today).\n toDate = toDaysBack < 0 ? tomorrow : new Date(nowMs - toDaysBack * 86_400_000).toISOString().slice(0, 10);\n }\n }\n }\n }\n }\n\n // Guard: if toDate would precede fromDate (inverted window from conflicting keywords),\n // fall back to tomorrow (exclusive upper bound that covers today) so we never produce\n // an empty window. Using `today` is insufficient because `date < today` excludes today.\n if (toDate <= fromDate) toDate = tomorrow;\n\n return { fromDate, toDate };\n}\n"],"mappings":";AAQA,SAAS,oBAAoB;AAC7B,YAAYA,aAAY;AACxB,YAAYC,SAAQ;AACpB,YAAYC,WAAU;;;ACMtB,SAAS,gBAAgB;AACzB,YAAY,YAAY;AACxB,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB,SAAS,cAAc,aAAa;AACpC,SAAS,iBAAiB;AAE1B,IAAM,gBAAgB,UAAU,QAAQ;AAiExC,IAAM,gBAAgB;AACtB,IAAM,sBAAsB;AAC5B,IAAM,iBAAiB;AACvB,IAAM,oBAAoB;AAC1B,IAAM,sBAAsB;AAC5B,IAAM,qBAAqB;AAC3B,IAAM,mCAAmC;AACzC,IAAM,8BAA8B,KAAK,IAAI,IAAI,QAAQ,OAAO,IAAI;AAoBpE,IAAM,mBAAmB,oBAAI,IAAkC;AAC/D,IAAM,cAAc,oBAAI,IAA2B;AAOnD,IAAM,WAAW,oBAAI,IAA2B;AAChD,IAAI;AAGG,SAAS,4BAA4B,UAA6B;AACvE,6BAA2B;AAC7B;AAUA,SAAS,SAAS,WAA2B;AAC3C,SAAY,UAAK,WAAW,OAAO;AACrC;AAEA,SAAS,kBAAkB,WAA2B;AACpD,SAAY,UAAK,SAAS,SAAS,GAAG,mBAAmB;AAC3D;AAEA,SAAS,aAAa,WAA2B;AAC/C,SAAY,UAAK,SAAS,SAAS,GAAG,cAAc;AACtD;AAEA,eAAe,eAAe,WAAkC;AAC9D,QAAS,YAAS,MAAM,SAAS,SAAS,GAAG,EAAE,WAAW,KAAK,CAAC;AAClE;AAEA,SAAS,iBAAiB,MAAmC;AAC3D,SAAO;AAAA,IACL,MAAM,KAAK;AAAA,IACX,SAAS,KAAK;AAAA,IACd,SAAS,KAAK;AAAA,IACd,KAAK,KAAK;AAAA,EACZ;AACF;AAEA,SAAS,eAAe,MAAyB,OAAmC;AAClF,SAAO,KAAK,SAAS,MAAM,QACzB,KAAK,YAAY,MAAM,WACvB,KAAK,YAAY,MAAM,WACvB,KAAK,QAAQ,MAAM;AACvB;AAEA,eAAe,gBACb,UACA,WACA,kBAC6B;AAC7B,MAAI;AACJ,MAAI;AACF,aAAS,MAAS,YAAS,KAAK,UAAU,GAAG;AAAA,EAC/C,SAAS,OAAO;AACd,WAAQ,OAAiC,SAAS,WAC9C,EAAE,MAAM,UAAU,IAClB,EAAE,MAAM,UAAU;AAAA,EACxB;AAEA,MAAI;AACF,UAAM,WAAW,iBAAiB,MAAM,OAAO,KAAK,CAAC;AACrD,UAAM,SAAS,iBAAiB,IAAI,QAAQ;AAC5C,QAAI,UAAU,eAAe,OAAO,UAAU,QAAQ,GAAG;AACvD,aAAO,EAAE,MAAM,MAAM,OAAO,OAAO,OAAO,eAAe,OAAO,cAAc;AAAA,IAChF;AACA,+BAA2B;AAC3B,UAAM,SAAS,KAAK,MAAM,MAAM,OAAO,SAAS,MAAM,CAAC;AACvD,UAAM,QAAQ,UAAU,MAAM;AAC9B,UAAM,gBAAgB,iBAAiB,MAAM;AAC7C,qBAAiB,IAAI,UAAU,EAAE,UAAU,OAAO,cAAc,CAAC;AACjE,WAAO,EAAE,MAAM,MAAM,OAAO,cAAc;AAAA,EAC5C,QAAQ;AACN,qBAAiB,OAAO,QAAQ;AAChC,WAAO,EAAE,MAAM,UAAU;AAAA,EAC3B,UAAE;AACA,UAAM,OAAO,MAAM,EAAE,MAAM,MAAM,MAAS;AAAA,EAC5C;AACF;AAEA,SAAS,cAAiB,UAAkB,QAAsC;AAChF,QAAM,WAAW,YAAY,IAAI,QAAQ,KAAK,QAAQ,QAAQ;AAC9D,QAAM,MAAM,SAAS,KAAK,QAAQ,MAAM;AACxC,QAAM,OAAO,IAAI,KAAK,MAAM,QAAW,MAAM,MAAS;AACtD,cAAY,IAAI,UAAU,IAAI;AAC9B,OAAK,KAAK,KAAK,MAAM;AACnB,QAAI,YAAY,IAAI,QAAQ,MAAM,KAAM,aAAY,OAAO,QAAQ;AAAA,EACrE,CAAC;AACD,SAAO;AACT;AASA,SAAS,mBAAsB,WAAmB,IAAkC;AAClF,QAAM,WAAW,SAAS,IAAI,SAAS,KAAK,QAAQ,QAAQ;AAC5D,QAAM,MAAM,SAAS,KAAK,IAAI,EAAE;AAChC,QAAM,OAAO,IAAI,KAAK,MAAM,QAAW,MAAM,MAAS;AACtD,WAAS,IAAI,WAAW,IAAI;AAC5B,OAAK,KAAK,KAAK,MAAM;AACnB,QAAI,SAAS,IAAI,SAAS,MAAM,KAAM,UAAS,OAAO,SAAS;AAAA,EACjE,CAAC;AACD,SAAO;AACT;AACA,eAAe,qBACb,UACA,OACA,iBACe;AACf,MAAI;AACF,UAAM,WAAW,iBAAiB,MAAS,YAAS,KAAK,QAAQ,CAAC;AAMlE,qBAAiB,IAAI,UAAU,EAAE,UAAU,OAAO,eAAe,gBAAgB,EAAE,CAAC;AAAA,EACtF,QAAQ;AACN,qBAAiB,OAAO,QAAQ;AAAA,EAClC;AACF;AAEA,SAAS,eAAe,UAA0B;AAChD,QAAM,MAAW,aAAQ,QAAQ;AACjC,QAAM,OAAY,cAAS,QAAQ;AACnC,QAAM,QAAe,mBAAY,CAAC,EAAE,SAAS,KAAK;AAClD,SAAY,UAAK,KAAK,IAAI,IAAI,IAAI,QAAQ,GAAG,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,MAAM;AAC5E;AAEA,SAAS,cAAc,SAAyB;AAC9C,SAAY,UAAK,SAAS,YAAY;AACxC;AAEA,eAAe,oBAAoB,SAAgC;AACjE,MAAI;AACF,UAAS,YAAS;AAAA,MAChB,cAAc,OAAO;AAAA,MACrB,KAAK,UAAU;AAAA,QACb,KAAK,QAAQ;AAAA,QACb,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QAClC,oBAAoB;AAAA,MACtB,CAAC;AAAA,MACD;AAAA,QACE,UAAU;AAAA,QACV,MAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF,QAAQ;AAAA,EAER;AACF;AAEA,eAAe,mBAAmB,SAAiD;AACjF,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,MAAS,YAAS,SAAS,cAAc,OAAO,GAAG,MAAM,CAAC;AACpF,QAAI,EAAE,OAAO,OAAO,QAAQ,YAAY,OAAO,UAAU,OAAO,GAAG,KAAK,OAAO,MAAM,GAAI,QAAO;AAChG,UAAM,QAAwB,EAAE,KAAK,OAAO,IAAI;AAChD,QACE,eAAe,UACf,OAAQ,OAAmC,cAAc,YACxD,OAAiC,UAAU,SAAS,GACrD;AACA,YAAM,YAAa,OAAiC;AAAA,IACtD;AACA,UAAM,qBAAsB,OAA4C;AACxE,QAAI,OAAO,uBAAuB,YAAY,OAAO,SAAS,kBAAkB,KAAK,qBAAqB,GAAG;AAC3G,YAAM,qBAAqB;AAAA,IAC7B;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,eAAe,KAAsB;AAC5C,MAAI;AACF,YAAQ,KAAK,KAAK,CAAC;AACnB,WAAO;AAAA,EACT,SAAS,OAAO;AACd,UAAM,OAAQ,OAAiC;AAC/C,WAAO,SAAS;AAAA,EAClB;AACF;AAEA,eAAe,uBAAuB,KAAqC;AACzE,MAAI;AACF,UAAM,EAAE,OAAO,IAAI,MAAM,cAAc,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,MAAM,SAAS,GAAG;AAAA,MACjF,UAAU;AAAA,MACV,SAAS;AAAA,IACX,CAAC;AACD,UAAM,SAAS,OAAO,KAAK;AAC3B,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,cAAc,KAAK,MAAM,MAAM;AACrC,WAAO,OAAO,SAAS,WAAW,IAAI,cAAc;AAAA,EACtD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,eAAe,mBAAmB,OAAyC;AACzE,MAAI,CAAC,eAAe,MAAM,GAAG,EAAG,QAAO;AACvC,MAAI,MAAM,uBAAuB,OAAW,QAAO;AACnD,QAAM,qBAAqB,MAAM,uBAAuB,MAAM,GAAG;AACjE,MAAI,uBAAuB,KAAM,QAAO;AACxC,SAAO,sBAAsB,MAAM,qBAAqB;AAC1D;AAEA,SAAS,YAAY,UAAoB,OAAuC;AAC9E,QAAM,mBACJ,OAAO,OAAO,cAAc,YAAY,MAAM,UAAU,SAAS,IAAI,KAAK,MAAM,MAAM,SAAS,IAAI,OAAO;AAC5G,QAAM,cAAc,OAAO,SAAS,gBAAgB,IAAI,mBAAmB,SAAS;AACpF,SAAO,KAAK,IAAI,IAAI,cAAc;AACpC;AAEA,eAAe,yBAAyB,SAAkD;AACxF,MAAI;AACF,UAAM,OAAO,MAAS,YAAS,MAAM,OAAO;AAC5C,QAAI,KAAK,eAAe,EAAG,QAAO;AAClC,QAAI,CAAC,KAAK,YAAY,GAAG;AACvB,YAAS,YAAS,GAAG,SAAS,EAAE,OAAO,KAAK,CAAC;AAC7C,aAAO;AAAA,IACT;AACA,UAAM,QAAQ,MAAM,mBAAmB,OAAO;AAC9C,QAAI,UAAU,MAAM;AAClB,UAAI,MAAM,mBAAmB,KAAK,EAAG,QAAO;AAAA,IAC9C;AACA,QAAI,UAAU,QAAQ,YAAY,MAAM,IAAI,EAAG,QAAO;AACtD,UAAS,YAAS,GAAG,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAC9D,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAK,OAAiC,SAAS,SAAU,QAAO;AAEhE,WAAO;AAAA,EACT;AACF;AAEA,eAAe,kBAAqB,UAAkB,QAAkD;AACtG,QAAM,UAAU,GAAG,QAAQ;AAC3B,MAAI,WAAW;AAEf,SAAO,CAAC,UAAU;AAChB,QAAI;AACF,YAAS,YAAS,MAAM,OAAO;AAC/B,YAAM,oBAAoB,OAAO;AACjC,iBAAW;AAAA,IACb,SAAS,OAAO;AACd,YAAM,OAAQ,OAAiC;AAC/C,UAAI,SAAS,UAAU;AACrB,YAAI;AACF,gBAAS,YAAS,MAAW,aAAQ,OAAO,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,QACpE,QAAQ;AACN,iBAAO;AAAA,QACT;AACA,cAAM,MAAM,kBAAkB;AAC9B;AAAA,MACF;AACA,UAAI,SAAS,SAAU,QAAO;AAC9B,YAAM,gBAAgB,MAAM,yBAAyB,OAAO;AAC5D,UAAI,kBAAkB,UAAW,QAAO;AACxC,YAAM,MAAM,kBAAkB;AAAA,IAChC;AAAA,EACF;AAEA,MAAI;AACJ,MAAI;AACF,aAAS,MAAM,OAAO;AAAA,EACxB,UAAE;AACA,QAAI;AACF,YAAS,YAAS,GAAG,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IAChE,QAAQ;AAAA,IAER;AAAA,EACF;AACA,SAAO;AACT;AAMA,eAAe,gBAAgB,UAAkB,MAAiC;AAChF,QAAM,UAAU,KAAK,UAAU,IAAI;AACnC,WAAS,UAAU,GAAG,UAAU,GAAG,WAAW,GAAG;AAC/C,UAAM,MAAM,eAAe,QAAQ;AACnC,QAAI;AACF,YAAS,YAAS,UAAU,KAAK,SAAS,MAAM;AAChD,YAAS,YAAS,OAAO,KAAK,QAAQ;AACtC,aAAO;AAAA,IACT,QAAQ;AACN,UAAI;AACF,cAAS,YAAS,OAAO,GAAG;AAAA,MAC9B,QAAQ;AAAA,MAER;AACA,YAAM,MAAM,kBAAkB;AAAA,IAChC;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,qBAAoC;AAC3C,SAAO,EAAE,SAAS,eAAe,OAAO,CAAC,GAAG,QAAQ,CAAC,EAAE;AACzD;AAEA,SAAS,SAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,uBAAuB,KAAsD;AACpF,MAAI,CAAC,SAAS,GAAG,EAAG,QAAO,mBAAmB;AAC9C,SAAO;AAAA,IACL,SAAS,OAAO,IAAI,YAAY,WAAW,IAAI,UAAU;AAAA,IACzD,OAAO,SAAS,IAAI,KAAK,IAAI,IAAI,QAAoC,CAAC;AAAA,IACtE,QAAQ,SAAS,IAAI,MAAM,IAAI,IAAI,SAA+C,CAAC;AAAA,IACnF,GAAI,OAAO,IAAI,kBAAkB,WAAW,EAAE,eAAe,IAAI,cAAc,IAAI,CAAC;AAAA,EACtF;AACF;AAEA,SAAS,8BAA8B,KAAuB;AAC5D,SAAO,SAAS,GAAG,KACjB,IAAI,YAAY,iBAChB,SAAS,IAAI,KAAK,KAClB,SAAS,IAAI,MAAM;AACvB;AAEA,eAAe,oBAAoB,WAAmB,QAA0D;AAC9G,QAAM,YAAY,kBAAkB,SAAS;AAC7C,SAAO,cAAc,WAAW,YAAY;AAC1C,UAAM,KAAK,MAAM,kBAAkB,WAAW,YAAY;AACxD,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,QACA,CAAC,QAAQ,uBAAuB,GAAoB;AAAA,QACpD;AAAA,MACF;AACA,YAAM,QAAQ,gBAAgB,OAAO,SAAS,OAAO,OAAO,QAAQ,mBAAmB,CAAC;AACxF,aAAO,KAAK;AACZ,UAAI,MAAM,gBAAgB,WAAW,KAAK,GAAG;AAC3C,cAAM,qBAAqB,WAAW,OAAO,MAAM,8BAA8B,KAAK,CAAC;AACvF,eAAO;AAAA,MACT;AACA,uBAAiB,OAAO,SAAS;AACjC,aAAO;AAAA,IACT,CAAC;AACD,WAAO,OAAO;AAAA,EAChB,CAAC;AACH;AAEA,eAAe,eAAe,WAAmB,QAAkD;AACjG,QAAM,YAAY,aAAa,SAAS;AACxC,QAAM,cAAc,WAAW,YAAY;AACzC,UAAM,kBAAkB,WAAW,YAAY;AAC7C,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,QACA,CAAC,QAAQ,kBAAkB,GAAe;AAAA,QAC1C,MAAM;AAAA,MACR;AACA,YAAM,QAAQ;AAAA,QACZ,OAAO,SAAS,OACZ,OAAO,QACP,EAAE,SAAS,mBAAmB,MAAM,CAAC,GAAG,SAAS,CAAC,EAAE;AAAA,MAC1D;AACA,aAAO,KAAK;AACZ,UAAI,MAAM,gBAAgB,WAAW,KAAK,GAAG;AAC3C,cAAM,qBAAqB,WAAW,OAAO,MAAM,IAAI;AAAA,MACzD,OAAO;AACL,yBAAiB,OAAO,SAAS;AAAA,MACnC;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;AAEA,SAAS,qBAAqB,WAA2B;AACvD,MAAI,OAAO,cAAc,YAAY,UAAU,SAAS,IAAI;AAG1D,YAAQ,KAAK,iDAAiD,SAAS,0BAA0B;AACjG,YAAO,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAAA,EAC7C;AACA,SAAO,UAAU,MAAM,GAAG,EAAE;AAC9B;AAEA,SAAS,uBAAuB,OAA+C;AAC7E,MAAI,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,WAAW,EAAG,QAAO;AACnE,QAAM,KAAK,KAAK,MAAM,KAAK;AAC3B,MAAI,CAAC,OAAO,SAAS,EAAE,EAAG,QAAO;AACjC,MAAI;AACF,WAAO,IAAI,KAAK,EAAE,EAAE,YAAY;AAAA,EAClC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,uBAAuB,OAA+C;AAC7E,QAAM,YAAY,uBAAuB,MAAM,SAAS,MAAK,oBAAI,KAAK,CAAC,GAAE,YAAY;AACrF,QAAM,UAAU,uBAAuB,MAAM,OAAO,KAAK;AACzD,QAAM,aAAa,uBAAuB,MAAM,UAAU;AAC1D,QAAM,aAAa,uBAAuB,MAAM,UAAU;AAC1D,QAAM,aAAa,OAAO,MAAM,eAAe,YAAY,MAAM,WAAW,KAAK,EAAE,SAAS,IACxF,MAAM,WAAW,QAAQ,2BAA2B,GAAG,EAAE,KAAK,IAC9D;AACJ,QAAM,oBAAoB,0BAA0B,MAAM,UAAU;AACpE,SAAO;AAAA,IACL,MAAM,MAAM;AAAA,IACZ;AAAA,IACA,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;AAAA,IACnC,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;AAAA,IACnC,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;AAAA,IACnC,GAAI,kBAAkB,SAAS,IAAI,EAAE,kBAAkB,IAAI,CAAC;AAAA,EAC9D;AACF;AAEA,SAAS,qBAAqB,OAAqC;AACjE,MAAI,CAAC,MAAO,QAAO,CAAC;AACpB,QAAM,SAAS,MACZ,YAAY,EACZ,MAAM,gCAAgC,GACrC,OAAO,CAAC,UAAU,MAAM,SAAS,CAAC,KAAK,CAAC;AAC5C,SAAO,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC,EAAE,MAAM,GAAG,GAAG;AAC1C;AAEA,SAAS,0BAA0B,OAAqC;AACtE,SAAO,qBAAqB,KAAK,EAAE;AAAA,IAAI,CAAC,UAC/B,kBAAW,QAAQ,EAAE,OAAO,KAAK,EAAE,OAAO,KAAK;AAAA,EACxD;AACF;AAEA,SAAS,2BACP,MACA,OACQ;AACR,QAAM,UAAU,KAAK,QAAQ,cAAc,MAAM,OAAO;AACxD,MAAI,YAAY,EAAG,QAAO;AAC1B,QAAM,iBAAiB,KAAK,cAAc,IAAI,cAAc,MAAM,cAAc,EAAE;AAClF,MAAI,kBAAkB,EAAG,QAAO;AAChC,SAAO,KAAK,KAAK,cAAc,MAAM,IAAI;AAC3C;AAEA,SAAS,aAAa,QAAkC,KAAa,GAAiB;AACpF,MAAI,CAAC,OAAO,GAAG,GAAG;AAChB,WAAO,GAAG,IAAI,CAAC;AAAA,EACjB;AACA,MAAI,CAAC,OAAO,GAAG,EAAE,SAAS,CAAC,GAAG;AAC5B,WAAO,GAAG,EAAE,KAAK,CAAC;AAAA,EACpB;AACF;AAEA,SAAS,kBAAkB,QAAkC,KAAa,GAAiB;AACzF,MAAI,CAAC,OAAO,GAAG,EAAG;AAClB,SAAO,GAAG,IAAI,OAAO,GAAG,EAAE,OAAO,CAAC,MAAM,MAAM,CAAC;AAC/C,MAAI,OAAO,GAAG,EAAE,WAAW,GAAG;AAC5B,WAAO,OAAO,GAAG;AAAA,EACnB;AACF;AAEA,SAAS,sBAAsB,QAAkC,GAAiB;AAChF,aAAW,OAAO,OAAO,KAAK,MAAM,GAAG;AACrC,sBAAkB,QAAQ,KAAK,CAAC;AAAA,EAClC;AACF;AAEA,SAAS,oBAAoB,SAAyB;AACpD,SAAO,QACJ,KAAK,EACL,YAAY,EACZ,QAAQ,WAAW,GAAG,EACtB,QAAQ,eAAe,GAAG,EAC1B,QAAQ,OAAO,GAAG,EAClB,QAAQ,UAAU,EAAE;AACzB;AAEA,SAAS,sBAAsB,KAAqB;AAClD,SAAO,IACJ,KAAK,EACL,YAAY,EACZ,QAAQ,kBAAkB,GAAG,EAC7B,QAAQ,aAAa,GAAG,EACxB,MAAM,GAAG,EACT,IAAI,mBAAmB,EACvB,OAAO,OAAO,EACd,KAAK,GAAG;AACb;AAEA,SAAS,kBAAkB,KAAqB;AAC9C,SAAO,IACJ,KAAK,EACL,YAAY,EACZ,QAAQ,cAAc,GAAG,EACzB,QAAQ,SAAS,GAAG,EACpB,QAAQ,iBAAiB,GAAG,EAC5B,QAAQ,QAAQ,GAAG,EACnB,KAAK;AACV;AAEA,SAAS,iBAAiB,OAA8B;AACtD,MAAI,CAAC,MAAM,SAAS,GAAG,KAAK,MAAM,UAAU,EAAG,QAAO;AACtD,SAAO,MAAM,MAAM,GAAG,EAAE;AAC1B;AAEA,SAAS,iBAAiB,WAA6B;AACrD,QAAM,QAAQ,UAAU,MAAM,GAAG,EAAE,OAAO,OAAO;AACjD,QAAM,UAAoB,CAAC;AAC3B,WAAS,IAAI,MAAM,SAAS,GAAG,IAAI,GAAG,KAAK,GAAG;AAC5C,YAAQ,KAAK,MAAM,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC;AAAA,EAC1C;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,QAAgB,WAA6B;AACrE,QAAM,UAAU,oBAAI,IAAY;AAChC,QAAM,iBAAiB,kBAAkB,SAAS;AAClD,QAAM,WAAW,kBAAkB,MAAM;AACzC,QAAM,OAAO,UAAU,MAAM,GAAG,EAAE,GAAG,EAAE,KAAK;AAC5C,QAAM,YAAY,kBAAkB,IAAI;AAExC,aAAW,aAAa,CAAC,gBAAgB,UAAU,SAAS,GAAG;AAC7D,QAAI,CAAC,UAAW;AAChB,YAAQ,IAAI,SAAS;AACrB,UAAM,WAAW,iBAAiB,SAAS;AAC3C,QAAI,SAAU,SAAQ,IAAI,QAAQ;AAAA,EACpC;AAEA,SAAO,MAAM,KAAK,OAAO;AAC3B;AAEA,SAAS,kBAAkB,KAA4C;AACrE,QAAM,aAAuB;AAAA,IAC3B,SAAS;AAAA,IACT,MAAM,CAAC;AAAA,IACP,SAAS,CAAC;AAAA,EACZ;AAEA,MAAI,CAAC,OAAO,OAAO,QAAQ,UAAU;AACnC,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,IAAI,QAAQ,CAAC;AAChC,aAAW,CAAC,cAAc,WAAW,KAAK,OAAO,QAAQ,UAAU,GAAG;AACpE,UAAM,YAAY,sBAAsB,YAAY;AACpD,QAAI,CAAC,UAAW;AAChB,UAAM,OAAgB,MAAM,QAAQ,WAAW,IAC3C,EAAE,OAAO,CAAC,GAAG,IAAI,IAAI,WAAW,CAAC,EAAE,IACnC;AAAA,MACE,OAAO,MAAM,QAAQ,aAAa,KAAK,IAAI,CAAC,GAAG,IAAI,IAAI,YAAY,KAAK,CAAC,IAAI,CAAC;AAAA,MAC9E,SAAS,MAAM,QAAQ,aAAa,OAAO,IAAI,CAAC,GAAG,IAAI,IAAI,YAAY,OAAO,CAAC,IAAI,CAAC;AAAA,MACpF,SAAS,MAAM,QAAQ,aAAa,OAAO,IAAI,CAAC,GAAG,IAAI,IAAI,YAAY,OAAO,CAAC,IAAI,CAAC;AAAA,IACtF;AACJ,UAAM,eAAe,WAAW,KAAK,SAAS;AAC9C,QAAI,gBAAgB,CAAC,MAAM,QAAQ,YAAY,GAAG;AAChD,mBAAa,QAAQ,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,aAAa,OAAO,GAAG,KAAK,KAAK,CAAC,CAAC;AACxE,mBAAa,UAAU,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAI,aAAa,WAAW,CAAC,GAAI,GAAI,KAAK,WAAW,CAAC,CAAE,CAAC,CAAC;AAC9F,mBAAa,UAAU,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAI,aAAa,WAAW,CAAC,GAAI,GAAI,KAAK,WAAW,CAAC,CAAE,CAAC,CAAC;AAAA,IAChG,WAAW,MAAM,QAAQ,YAAY,GAAG;AACtC,iBAAW,KAAK,SAAS,IAAI;AAAA,QAC3B,OAAO,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,cAAc,GAAG,KAAK,KAAK,CAAC,CAAC;AAAA,QACpD,SAAS,CAAC,GAAG,IAAI,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC;AAAA,QACxC,SAAS,CAAC,GAAG,IAAI,IAAI,KAAK,WAAW,iBAAiB,SAAS,CAAC,CAAC;AAAA,MACnE;AAAA,IACF,OAAO;AACL,iBAAW,KAAK,SAAS,IAAI;AAAA,IAC/B;AACA,eAAW,SAAS,iBAAiB,WAAW,SAAS,GAAG;AAC1D,YAAM,OAAO,WAAW,QAAS,KAAK,KAAK,CAAC;AAC5C,UAAI,CAAC,KAAK,SAAS,SAAS,EAAG,MAAK,KAAK,SAAS;AAClD,iBAAW,QAAS,KAAK,IAAI;AAAA,IAC/B;AACA,eAAW,SAAS,KAAK,WAAW,CAAC,GAAG;AACtC,YAAM,WAAW,kBAAkB,KAAK;AACxC,UAAI,CAAC,SAAU;AACf,YAAM,OAAO,WAAW,QAAS,QAAQ,KAAK,CAAC;AAC/C,UAAI,CAAC,KAAK,SAAS,SAAS,EAAG,MAAK,KAAK,SAAS;AAClD,iBAAW,QAAS,QAAQ,IAAI;AAAA,IAClC;AACA,UAAM,aAAa,WAAW,KAAK,SAAS;AAC5C,QAAI,cAAc,CAAC,MAAM,QAAQ,UAAU,GAAG;AAC5C,iBAAW,UAAU,CAAC,GAAG,IAAI,IAAI,WAAW,WAAW,iBAAiB,SAAS,CAAC,CAAC;AAAA,IACrF;AAAA,EACF;AAEA,aAAW,CAAC,OAAO,UAAU,KAAK,OAAO,QAAQ,IAAI,WAAW,CAAC,CAAC,GAAG;AACnE,UAAM,WAAW,kBAAkB,KAAK;AACxC,QAAI,CAAC,SAAU;AACf,UAAM,OAAO,WAAW,QAAS,QAAQ,KAAK,CAAC;AAC/C,eAAW,aAAa,cAAc,CAAC,GAAG;AACxC,YAAM,sBAAsB,sBAAsB,SAAS;AAC3D,UAAI,uBAAuB,CAAC,KAAK,SAAS,mBAAmB,GAAG;AAC9D,aAAK,KAAK,mBAAmB;AAAA,MAC/B;AAAA,IACF;AACA,eAAW,QAAS,QAAQ,IAAI;AAAA,EAClC;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,OAAiB,WAA4B;AAClE,QAAM,WAAW,MAAM,KAAK,SAAS;AACrC,MAAI,YAAY,CAAC,MAAM,QAAQ,QAAQ,GAAG;AACxC,WAAO;AAAA,EACT;AACA,QAAM,UAAmB;AAAA,IACvB,OAAO,MAAM,QAAQ,QAAQ,IAAI,CAAC,GAAG,IAAI,IAAI,QAAQ,CAAC,IAAI,CAAC;AAAA,IAC3D,SAAS,CAAC;AAAA,IACV,SAAS,iBAAiB,SAAS;AAAA,EACrC;AACA,QAAM,KAAK,SAAS,IAAI;AACxB,SAAO;AACT;AAEA,SAAS,iBAAiB,OAAiB,QAAgB,YAA0B;AACnF,QAAM,YAAY,sBAAsB,MAAM;AAC9C,MAAI,CAAC,UAAW;AAChB,QAAM,OAAO,cAAc,OAAO,SAAS;AAC3C,MAAI,CAAC,KAAK,MAAM,SAAS,UAAU,GAAG;AACpC,SAAK,MAAM,KAAK,UAAU;AAAA,EAC5B;AAEA,aAAW,SAAS,iBAAiB,QAAQ,SAAS,GAAG;AACvD,UAAM,WAAW,kBAAkB,KAAK;AACxC,QAAI,CAAC,SAAU;AACf,QAAI,CAAC,KAAK,SAAS,SAAS,QAAQ,GAAG;AACrC,WAAK,UAAU,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAI,KAAK,WAAW,CAAC,GAAI,QAAQ,CAAC,CAAC;AAAA,IACjE;AACA,UAAM,OAAO,MAAM,UAAU,QAAQ,KAAK,CAAC;AAC3C,QAAI,CAAC,KAAK,SAAS,SAAS,GAAG;AAC7B,YAAM,QAAS,QAAQ,IAAI,CAAC,GAAG,MAAM,SAAS;AAAA,IAChD;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,OAAiB,QAAgB,YAA0B;AACtF,QAAM,YAAY,sBAAsB,MAAM;AAC9C,MAAI,CAAC,UAAW;AAChB,QAAM,OAAO,MAAM,KAAK,SAAS;AACjC,MAAI,CAAC,QAAQ,MAAM,QAAQ,IAAI,EAAG;AAClC,OAAK,QAAQ,KAAK,MAAM,OAAO,CAAC,UAAU,UAAU,UAAU;AAC9D,MAAI,KAAK,MAAM,WAAW,GAAG;AAC3B,WAAO,MAAM,KAAK,SAAS;AAC3B,oBAAgB,KAAK;AAAA,EACvB;AACF;AAEA,SAAS,4BAA4B,OAAiB,YAA0B;AAC9E,aAAW,CAAC,WAAW,WAAW,KAAK,OAAO,QAAQ,MAAM,IAAI,GAAG;AACjE,QAAI,MAAM,QAAQ,WAAW,GAAG;AAC9B,YAAM,QAAQ,YAAY,OAAO,CAAC,UAAU,UAAU,UAAU;AAChE,UAAI,MAAM,WAAW,GAAG;AACtB,eAAO,MAAM,KAAK,SAAS;AAAA,MAC7B,OAAO;AACL,cAAM,KAAK,SAAS,IAAI;AAAA,MAC1B;AACA;AAAA,IACF;AAEA,gBAAY,QAAQ,YAAY,MAAM,OAAO,CAAC,UAAU,UAAU,UAAU;AAC5E,QAAI,YAAY,MAAM,WAAW,GAAG;AAClC,aAAO,MAAM,KAAK,SAAS;AAAA,IAC7B;AAAA,EACF;AACA,kBAAgB,KAAK;AACvB;AAEA,SAAS,gBAAgB,OAAuB;AAC9C,MAAI,CAAC,MAAM,QAAS;AACpB,aAAW,CAAC,OAAO,UAAU,KAAK,OAAO,QAAQ,MAAM,OAAO,GAAG;AAC/D,UAAM,WAAW,CAAC,GAAG,IAAI,IAAI,WAAW,IAAI,qBAAqB,CAAC,CAAC,EAAE;AAAA,MACnE,CAAC,cAAc,UAAU,SAAS,KAAK,MAAM,KAAK,SAAS,MAAM;AAAA,IACnE;AACA,QAAI,SAAS,WAAW,GAAG;AACzB,aAAO,MAAM,QAAQ,KAAK;AAAA,IAC5B,OAAO;AACL,YAAM,QAAQ,KAAK,IAAI;AAAA,IACzB;AAAA,EACF;AACF;AAEA,SAAS,oBAAoB,OAAiB,SAA6B;AACzE,QAAM,aAAa,oBAAI,IAAY;AACnC,aAAW,UAAU,SAAS;AAC5B,UAAM,YAAY,sBAAsB,MAAM;AAC9C,QAAI,aAAa,MAAM,KAAK,SAAS,GAAG;AACtC,iBAAW,IAAI,SAAS;AAAA,IAC1B;AACA,UAAM,WAAW,kBAAkB,MAAM;AACzC,eAAW,YAAY,MAAM,UAAU,QAAQ,KAAK,CAAC,GAAG;AACtD,iBAAW,IAAI,QAAQ;AAAA,IACzB;AAAA,EACF;AAEA,QAAM,WAAW,oBAAI,IAAY;AACjC,aAAW,aAAa,YAAY;AAClC,aAAS,IAAI,SAAS;AACtB,UAAM,OAAO,MAAM,KAAK,SAAS;AACjC,QAAI,QAAQ,CAAC,MAAM,QAAQ,IAAI,GAAG;AAChC,iBAAW,UAAU,KAAK,WAAW,CAAC,GAAG;AACvC,iBAAS,IAAI,MAAM;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AACA,SAAO,MAAM,KAAK,QAAQ;AAC5B;AAEA,SAAS,YAAY,OAAuB;AAC1C,SAAO,MAAM,QAAQ,OAAO,GAAG,EAAE,QAAQ,MAAM,GAAG,EAAE,QAAQ,QAAQ,GAAG,EAAE,KAAK;AAChF;AAQO,SAAS,wCACd,KACA,UACe;AACf,QAAM,QAAQ,gBAAgB,uBAAuB,GAAoB,CAAC;AAC1E,MAAI,SAAS,SAAS,SAAS;AAC7B,WAAO,mBAAmB;AAAA,EAC5B;AACA,MAAI,SAAS,SAAS,QAAS,OAAM,UAAU;AAC/C,aAAW,SAAS,SAAS,SAAS;AACpC,UAAM,UAAU,qBAAqB,MAAM,SAAS;AACpD,QAAI,SAAS,SAAS,SAAS;AAC7B,4BAAsB,MAAM,OAAO,MAAM,IAAI;AAC7C,mBAAa,MAAM,OAAO,SAAS,MAAM,IAAI;AAC7C,YAAM,OAAO,MAAM,IAAI,IAAI,uBAAuB,KAAK;AAAA,IACzD,OAAO;AACL,wBAAkB,MAAM,OAAO,SAAS,MAAM,IAAI;AAClD,aAAO,MAAM,OAAO,MAAM,IAAI;AAAA,IAChC;AAAA,EACF;AACA,SAAO;AACT;AAGO,SAAS,mCACd,KACA,UACU;AACV,QAAM,QAAQ,gBAAgB,kBAAkB,GAAe,CAAC;AAChE,MAAI,SAAS,SAAS,SAAS;AAC7B,WAAO,EAAE,SAAS,mBAAmB,MAAM,CAAC,GAAG,SAAS,CAAC,EAAE;AAAA,EAC7D;AACA,aAAW,SAAS,SAAS,SAAS;AACpC,QAAI,SAAS,SAAS,SAAS;AAC7B,kCAA4B,OAAO,MAAM,IAAI;AAC7C,iBAAW,OAAO,MAAM,MAAM;AAC5B,YAAI,OAAO,OAAO,QAAQ,SAAU,kBAAiB,OAAO,KAAK,MAAM,IAAI;AAAA,MAC7E;AAAA,IACF,OAAO;AACL,iBAAW,OAAO,MAAM,MAAM;AAC5B,YAAI,OAAO,OAAO,QAAQ,SAAU,qBAAoB,OAAO,KAAK,MAAM,IAAI;AAAA,MAChF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAGO,SAAS,8CAA8C,KAAuB;AACnF,SAAO,8BAA8B,GAAG;AAC1C;AAYA,eAAsB,iBACpB,WACA,YACA,WACA,MACA,WAA6E,CAAC,GAC/D;AACf,MAAI;AACF,UAAM,eAAe,SAAS;AAE9B,UAAM,UAAU,qBAAqB,SAAS;AAC9C,UAAM,mBAAmB,WAAW,YAAY;AAI9C,YAAM,aAAa,MAAM,oBAAoB,WAAW,CAAC,UAAU;AACjE,cAAM,UAAU;AAChB,8BAAsB,MAAM,OAAO,UAAU;AAC7C,qBAAa,MAAM,OAAO,SAAS,UAAU;AAC7C,cAAM,OAAO,UAAU,IAAI,uBAAuB;AAAA,UAChD,MAAM;AAAA,UACN;AAAA,UACA;AAAA,UACA,GAAG;AAAA,QACL,CAAC;AAAA,MACH,CAAC;AACD,UAAI,YAAY;AACd,cAAM,eAAe,WAAW,CAAC,UAAU;AACzC,sCAA4B,OAAO,UAAU;AAC7C,qBAAW,OAAO,MAAM;AACtB,gBAAI,OAAO,OAAO,QAAQ,UAAU;AAClC,+BAAiB,OAAO,KAAK,UAAU;AAAA,YACzC;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH,QAAQ;AAAA,EAER;AACF;AAKA,eAAsB,mBACpB,WACA,YACA,WACA,MACe;AACf,MAAI;AACF,UAAM,eAAe,SAAS;AAE9B,UAAM,UAAU,qBAAqB,SAAS;AAC9C,UAAM,mBAAmB,WAAW,YAAY;AAC9C,YAAM,aAAa,MAAM,oBAAoB,WAAW,CAAC,UAAU;AACjE,0BAAkB,MAAM,OAAO,SAAS,UAAU;AAClD,eAAO,MAAM,OAAO,UAAU;AAAA,MAChC,CAAC;AACD,UAAI,YAAY;AACd,cAAM,eAAe,WAAW,CAAC,UAAU;AACzC,qBAAW,OAAO,MAAM;AACtB,gBAAI,OAAO,OAAO,QAAQ,UAAU;AAClC,kCAAoB,OAAO,KAAK,UAAU;AAAA,YAC5C;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH,QAAQ;AAAA,EAER;AACF;AAOA,eAAsB,kBAAkB,WAAkC;AACxE,MAAI;AACF,UAAM,eAAe,SAAS;AAC9B,UAAM,mBAAmB,WAAW,YAAY;AAC9C,YAAM,aAAa,MAAM,oBAAoB,WAAW,CAAC,UAAU;AACjE,cAAM,UAAU;AAChB,cAAM,gBAAgB;AACtB,cAAM,QAAQ,CAAC;AACf,cAAM,SAAS,CAAC;AAAA,MAClB,CAAC;AACD,UAAI,YAAY;AACd,cAAM,eAAe,WAAW,CAAC,UAAU;AACzC,gBAAM,UAAU;AAChB,gBAAM,gBAAgB;AACtB,gBAAM,OAAO,CAAC;AACd,gBAAM,UAAU,CAAC;AAAA,QACnB,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH,QAAQ;AAAA,EAER;AACF;AAMA,eAAsB,kBAAkB,WAAqC;AAC3E,MAAI;AACF,UAAS,YAAS,OAAO,aAAa,SAAS,CAAC;AAChD,UAAM,SAAS,MAAM;AAAA,MACnB,kBAAkB,SAAS;AAAA,MAC3B,CAAC,QAAQ,uBAAuB,GAAoB;AAAA,MACpD;AAAA,IACF;AACA,WAAO,OAAO,SAAS,QAAQ,OAAO;AAAA,EACxC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAMA,eAAsB,wBACpB,WACA,SACe;AACf,MAAI,QAAQ,WAAW,EAAG;AAC1B,MAAI;AACF,UAAM,eAAe,SAAS;AAE9B,UAAM,mBAAmB,WAAW,YAAY;AAC9C,YAAM,aAAa,MAAM,oBAAoB,WAAW,CAAC,UAAU;AACjE,cAAM,UAAU;AAChB,mBAAW,SAAS,SAAS;AAC3B,gBAAM,UAAU,qBAAqB,MAAM,SAAS;AACpD,gCAAsB,MAAM,OAAO,MAAM,IAAI;AAC7C,uBAAa,MAAM,OAAO,SAAS,MAAM,IAAI;AAC7C,gBAAM,OAAO,MAAM,IAAI,IAAI,uBAAuB,KAAK;AAAA,QACzD;AAAA,MACF,CAAC;AACD,UAAI,YAAY;AACd,cAAM,eAAe,WAAW,CAAC,UAAU;AACzC,qBAAW,SAAS,SAAS;AAC3B,wCAA4B,OAAO,MAAM,IAAI;AAC7C,uBAAW,OAAO,MAAM,MAAM;AAC5B,kBAAI,OAAO,OAAO,QAAQ,UAAU;AAClC,iCAAiB,OAAO,KAAK,MAAM,IAAI;AAAA,cACzC;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH,QAAQ;AAAA,EAER;AACF;AAiBA,eAAsB,sBACpB,WACA,UACA,QAC6B;AAC7B,MAAI;AACF,UAAM,QAAQ,kBAAkB,SAAS;AACzC,UAAM,SAAS,MAAM;AAAA,MACnB;AAAA,MACA,CAAC,QAAQ,uBAAuB,GAAoB;AAAA,MACpD;AAAA,IACF;AACA,QAAI,OAAO,SAAS,UAAW,QAAO;AACtC,UAAM,SAAS,OAAO,SAAS,OAAO,OAAO,QAAQ,mBAAmB;AAExE,UAAM,MAAM,UAAU,IAAI,KAAK,KAAK,IAAI,IAAI,KAAU,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAEjF,UAAM,UAAU,oBAAI,IAAY;AAChC,eAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,OAAO,KAAK,GAAG;AACxD,UAAI,QAAQ,YAAY,OAAO,KAAK;AAClC,mBAAW,KAAK,OAAO;AACrB,kBAAQ,IAAI,CAAC;AAAA,QACf;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAQA,eAAsB,2BACpB,WACA,UAA8C,CAAC,GACT;AACtC,MAAI;AACF,UAAM,SAAS,MAAM;AAAA,MACnB,kBAAkB,SAAS;AAAA,MAC3B,CAAC,QAAQ,uBAAuB,GAAoB;AAAA,MACpD;AAAA,IACF;AACA,QAAI,OAAO,SAAS,QAAQ,CAAC,OAAO,cAAe,QAAO;AAC1D,UAAM,QAAQ,OAAO;AACrB,UAAM,aAAa,OAAO,OAAO,MAAM,MAAM,EAC1C;AAAA,MAAO,CAAC,UACP,OAAO,OAAO,SAAS,YACvB,MAAM,KAAK,SAAS,KACpB,uBAAuB,MAAM,OAAO,MAAM;AAAA,IAC5C,EACC,IAAI,CAAC,WAAW;AAAA,MACf,MAAM,MAAM;AAAA,MACZ,SAAS,uBAAuB,MAAM,OAAO;AAAA,MAC7C,GAAI,uBAAuB,MAAM,UAAU,IACvC,EAAE,YAAY,uBAAuB,MAAM,UAAU,EAAE,IACvD,CAAC;AAAA,MACL,GAAI,OAAO,MAAM,eAAe,YAAY,MAAM,WAAW,KAAK,EAAE,SAAS,IACzE,EAAE,YAAY,MAAM,WAAW,KAAK,EAAE,IACtC,CAAC;AAAA,MACL,GAAI,uBAAuB,MAAM,UAAU,IACvC,EAAE,YAAY,uBAAuB,MAAM,UAAU,EAAE,IACvD,CAAC;AAAA,MACL,GAAI,MAAM,QAAQ,MAAM,iBAAiB,IACrC,EAAE,mBAAmB,MAAM,kBAAkB,OAAO,CAAC,SAAS,OAAO,SAAS,QAAQ,EAAE,IACxF,CAAC;AAAA,IACP,EAAE,EACD,KAAK,0BAA0B;AAClC,UAAM,iBAAiB,OAAO,QAAQ,UAAU,YAAY,OAAO,SAAS,QAAQ,KAAK,IACrF,KAAK,IAAI,GAAG,KAAK,MAAM,QAAQ,KAAK,CAAC,IACrC,WAAW;AACf,QAAI,mBAAmB,EAAG,QAAO,CAAC;AAClC,QAAI,WAAW,UAAU,eAAgB,QAAO;AAEhD,UAAM,cAAc,IAAI,IAAI,0BAA0B,QAAQ,KAAK,CAAC;AACpE,UAAM,SAAS,WAAW,IAAI,CAAC,WAAW;AAAA,MACxC;AAAA,MACA,QAAQ,MAAM,qBAAqB,CAAC,GAAG;AAAA,QACrC,CAAC,KAAK,SAAS,OAAO,YAAY,IAAI,IAAI,IAAI,IAAI;AAAA,QAClD;AAAA,MACF;AAAA,IACF,EAAE;AACF,QAAI,OAAO,KAAK,CAAC,EAAE,MAAM,MAAM,QAAQ,CAAC,GAAG;AACzC,aAAO,OACJ,OAAO,CAAC,EAAE,MAAM,MAAM,QAAQ,CAAC,EAC/B,KAAK,CAAC,MAAM,UAAU,MAAM,QAAQ,KAAK,SAAS,2BAA2B,KAAK,OAAO,MAAM,KAAK,CAAC,EACrG,MAAM,GAAG,cAAc,EACvB,IAAI,CAAC,EAAE,MAAM,MAAM,KAAK,EACxB,KAAK,0BAA0B;AAAA,IACpC;AAIA,UAAM,aAAa,KAAK,KAAK,iBAAiB,CAAC;AAC/C,UAAM,YAAY,iBAAiB;AACnC,UAAM,WAAW;AAAA,MACf,GAAG,WAAW,MAAM,GAAG,UAAU;AAAA,MACjC,GAAI,YAAY,IAAI,WAAW,MAAM,CAAC,SAAS,IAAI,CAAC;AAAA,IACtD;AACA,WAAO,SAAS,KAAK,0BAA0B;AAAA,EACjD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAMA,eAAsB,iBAAiB,WAAmB,MAA6C;AACrG,MAAI,KAAK,WAAW,EAAG,QAAO;AAC9B,MAAI;AACF,UAAM,QAAQ,aAAa,SAAS;AACpC,UAAM,SAAS,MAAM;AAAA,MACnB;AAAA,MACA,CAAC,QAAQ,kBAAkB,GAAe;AAAA,MAC1C,MAAM;AAAA,IACR;AACA,QAAI,OAAO,SAAS,KAAM,QAAO;AACjC,WAAO,qBAAqB,OAAO,OAAO,IAAI;AAAA,EAChD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,qBAAqB,OAAiB,MAA6B;AAC1E,QAAM,eAAe,oBAAoB,OAAO,IAAI;AACpD,QAAM,UAAU,oBAAI,IAAY;AAChC,aAAW,aAAa,cAAc;AACpC,UAAM,cAAc,MAAM,KAAK,SAAS;AACxC,UAAM,QAAQ,MAAM,QAAQ,WAAW,IAAI,cAAe,aAAa,SAAS,CAAC;AACjF,eAAW,aAAa,OAAO;AAC7B,cAAQ,IAAI,SAAS;AAAA,IACvB;AAAA,EACF;AACA,SAAO;AACT;AAOO,SAAS,sBAAsB,QAA0B;AAC9D,QAAM,QAAQ,oBAAI,IAAY;AAG9B,QAAM,cAAc,OAAO,SAAS,yBAAyB;AAC7D,aAAW,KAAK,aAAa;AAC3B,UAAM,YAAY,sBAAsB,EAAE,CAAC,CAAC;AAC5C,QAAI,UAAW,OAAM,IAAI,SAAS;AAAA,EACpC;AAEA,SAAO,MAAM,KAAK,KAAK;AACzB;AAEA,eAAsB,+BACpB,WACA,QAKC;AACD,QAAM,eAAe,sBAAsB,MAAM;AACjD,MAAI;AACF,UAAM,SAAS,MAAM;AAAA,MACnB,aAAa,SAAS;AAAA,MACtB,CAAC,QAAQ,kBAAkB,GAAe;AAAA,MAC1C,MAAM;AAAA,IACR;AACA,QAAI,OAAO,SAAS,MAAM;AACxB,aAAO,EAAE,aAAa,cAAc,cAAc,cAAc,OAAO,KAAK;AAAA,IAC9E;AACA,UAAM,WAAW,OAAO;AACxB,UAAM,UAAU,IAAI,IAAY,YAAY;AAC5C,UAAM,mBAAmB,IAAI,kBAAkB,MAAM,CAAC;AACtD,UAAM,gBAAgB,CAAC,UAA2B;AAChD,YAAM,SAAS,YAAY,KAAK;AAChC,aAAO,OAAO,SAAS,KAAK,iBAAiB,SAAS,IAAI,MAAM,GAAG;AAAA,IACrE;AAEA,eAAW,aAAa,OAAO,KAAK,SAAS,IAAI,GAAG;AAClD,UAAI,cAAc,SAAS,GAAG;AAC5B,gBAAQ,IAAI,SAAS;AAAA,MACvB;AAAA,IACF;AACA,eAAW,CAAC,OAAO,UAAU,KAAK,OAAO,QAAQ,SAAS,WAAW,CAAC,CAAC,GAAG;AACxE,UAAI,CAAC,cAAc,KAAK,EAAG;AAC3B,iBAAW,aAAa,YAAY;AAClC,gBAAQ,IAAI,SAAS;AAAA,MACvB;AAAA,IACF;AACA,QAAI,QAAQ,SAAS,GAAG;AACtB,aAAO;AAAA,QACL,aAAa,CAAC;AAAA,QACd,cAAc,CAAC;AAAA,QACf,OAAO;AAAA,MACT;AAAA,IACF;AAEA,UAAM,eAAe,oBAAoB,UAAU,MAAM,KAAK,OAAO,CAAC;AACtE,UAAM,QAAQ,qBAAqB,UAAU,YAAY;AACzD,WAAO;AAAA,MACL,aAAa,MAAM,KAAK,OAAO;AAAA,MAC/B;AAAA,MACA;AAAA,IACF;AAAA,EACF,QAAQ;AACN,WAAO,EAAE,aAAa,cAAc,cAAc,cAAc,OAAO,KAAK;AAAA,EAC9E;AACF;AAeO,SAAS,uBACd,WACA,MACY;AACZ,SAAO,mBAAmB,WAAW,IAAI;AAC3C;AAMO,SAAS,gBAAgB,QAAyB;AACvD,SAAO,oiBAAoiB;AAAA,IACziB;AAAA,EACF;AACF;AAMO,SAAS,wBAAwB,QAAgB,QAAgB,KAAK,IAAI,GAAW;AAC1F,QAAM,IAAI,OAAO,YAAY;AAC7B,QAAM,MAAM,IAAI,KAAK,KAAK;AAC1B,MAAI,WAAW;AAEf,MAAI,YAAY,KAAK,CAAC,KAAK,mBAAmB,KAAK,CAAC,KAAK,eAAe,KAAK,CAAC,KAAK,oBAAoB,KAAK,CAAC,GAAG;AAC9G,eAAW;AAAA,EACb,WAAW,gBAAgB,KAAK,CAAC,KAAK,iBAAiB,KAAK,CAAC,GAAG;AAC9D,eAAW;AAAA,EACb,WAAW,gBAAgB,KAAK,CAAC,GAAG;AAClC,eAAW;AAAA,EACb,WAAW,gBAAgB,KAAK,CAAC,GAAG;AAClC,eAAW;AAAA,EACb,WAAW,iBAAiB,KAAK,CAAC,GAAG;AACnC,eAAW;AAAA,EACb,WAAW,iBAAiB,KAAK,CAAC,GAAG;AACnC,eAAW;AAAA,EACb,WAAW,gBAAgB,KAAK,CAAC,GAAG;AAElC,UAAM,OAAO,IAAI,KAAK,IAAI,YAAY,GAAG,GAAG,CAAC;AAC7C,WAAO,KAAK,YAAY,EAAE,MAAM,GAAG,EAAE;AAAA,EACvC,WAAW,gBAAgB,KAAK,CAAC,GAAG;AAClC,UAAM,eAAe,IAAI,KAAK,IAAI,YAAY,IAAI,GAAG,GAAG,CAAC;AACzD,WAAO,aAAa,YAAY,EAAE,MAAM,GAAG,EAAE;AAAA,EAC/C,OAAO;AAEL,UAAM,aAAa;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,UAAM,aAAa,EAAE;AAAA,MACnB;AAAA,IACF;AACA,QAAI,YAAY;AACd,YAAM,WAAW,WAAW,QAAQ,WAAW,CAAC,CAAC;AACjD,YAAM,OAAO,WAAW,CAAC,IAAI,OAAO,SAAS,WAAW,CAAC,GAAG,EAAE,IAAI,IAAI,YAAY;AAQlF,UAAI,aAAa,KAAK,CAAC,GAAG;AACxB,YAAI,WAAW,CAAC,GAAG;AAEjB,gBAAM,aAAa,IAAI,KAAK,MAAM,UAAU,CAAC;AAC7C,iBAAO,IAAI,KAAK,WAAW,QAAQ,IAAI,MAAM,KAAU,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAAA,QACpF;AACA,mBAAW;AAAA,MACb,OAAO;AACL,cAAM,aAAa,IAAI,KAAK,MAAM,UAAU,CAAC;AAC7C,eAAO,WAAW,YAAY,EAAE,MAAM,GAAG,EAAE;AAAA,MAC7C;AAAA,IACF;AAGA,UAAM,YAAY,EAAE,MAAM,0BAA0B;AACpD,QAAI,WAAW;AACb,iBAAW,KAAK,IAAI,KAAK,OAAO,SAAS,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC;AAAA,IAChE,OAAO;AAEL,YAAM,iBAAiB,EAAE,MAAM,2BAA2B;AAC1D,UAAI,gBAAgB;AAClB,mBAAW,KAAK,IAAI,KAAK,OAAO,SAAS,eAAe,CAAC,GAAG,EAAE,IAAI,EAAE;AAAA,MACtE,OAAO;AACL,cAAM,WAAW,EAAE,MAAM,yBAAyB;AAClD,YAAI,UAAU;AACZ,qBAAW,KAAK,IAAI,KAAK,OAAO,SAAS,SAAS,CAAC,GAAG,EAAE,CAAC;AAAA,QAC3D,OAAO;AACL,gBAAM,UAAU,EAAE,MAAM,0BAA0B;AAClD,cAAI,SAAS;AAEX,uBAAW,KAAK,IAAI,GAAG,KAAK,KAAK,OAAO,SAAS,QAAQ,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;AAAA,UACxE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,UAAM,WAAW,EAAE,MAAM,yBAAyB;AAClD,QAAI,UAAU;AACZ,aAAO,GAAG,SAAS,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC;AAAA,IACrD;AACA,UAAM,UAAU,EAAE,MAAM,iCAAiC;AACzD,QAAI,SAAS;AACX,YAAM,OAAO,QAAQ,CAAC,EAAE,WAAW,IAAI,MAAO,OAAO,SAAS,QAAQ,CAAC,GAAG,EAAE,IAAI,OAAO,SAAS,QAAQ,CAAC,GAAG,EAAE;AAC9G,aAAO,GAAG,IAAI,IAAI,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC;AAAA,IAC9E;AAGA,UAAM,iBAAiB,EAAE,MAAM,uEAAuE;AACtG,QAAI,gBAAgB;AAClB,YAAM,WAAW,CAAC,UAAU,UAAU,WAAW,aAAa,YAAY,UAAU,UAAU;AAC9F,YAAM,YAAY,SAAS,QAAQ,eAAe,CAAC,CAAC;AACpD,YAAM,aAAa,IAAI,OAAO;AAC9B,kBAAY,aAAa,YAAY,KAAK,KAAK;AAAA,IACjD;AAAA,EACF;AAEA,QAAM,OAAO,IAAI,KAAK,QAAQ,WAAW,KAAK,KAAK,KAAK,GAAI;AAC5D,SAAO,KAAK,YAAY,EAAE,MAAM,GAAG,EAAE;AACvC;AAuBO,SAAS,8BACd,QACA,QAAgB,KAAK,IAAI,GACa;AACtC,QAAM,WAAW,wBAAwB,QAAQ,KAAK;AACtD,QAAM,IAAI,OAAO,YAAY;AAC7B,QAAM,MAAM,IAAI,KAAK,KAAK;AAC1B,QAAM,QAAQ,IAAI,YAAY,EAAE,MAAM,GAAG,EAAE;AAC3C,QAAM,WAAW,IAAI,KAAK,QAAQ,KAAU,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAEvE,MAAI;AAEJ,MAAI,4DAA4D,KAAK,CAAC,GAAG;AACvE,aAAS;AAAA,EACX,WAAW,+BAA+B,KAAK,CAAC,GAAG;AACjD,aAAS;AAAA,EACX,WAAW,6CAA6C,KAAK,CAAC,GAAG;AAC/D,aAAS;AAAA,EACX,WAAW,gBAAgB,KAAK,CAAC,GAAG;AAClC,aAAS,IAAI,KAAK,QAAQ,IAAI,KAAU,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAAA,EACrE,WAAW,iBAAiB,KAAK,CAAC,GAAG;AACnC,aAAS,IAAI,KAAK,QAAQ,KAAK,KAAU,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAAA,EACtE,WAAW,gBAAgB,KAAK,CAAC,GAAG;AAClC,aAAS,GAAG,IAAI,YAAY,CAAC;AAAA,EAC/B,OAAO;AAML,UAAM,aAAa;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,UAAM,aAAa,EAAE;AAAA,MACnB;AAAA,IACF;AACA,QAAI,YAAY;AAId,YAAM,WAAW,WAAW,QAAQ,WAAW,CAAC,CAAC;AACjD,YAAM,OAAO,WAAW,CAAC,IAAI,OAAO,SAAS,WAAW,CAAC,GAAG,EAAE,IAAI,IAAI,YAAY;AAClF,YAAM,iBAAiB,oBAAoB,KAAK,CAAC;AACjD,YAAM,WAAW,aAAa,KAAK,CAAC;AACpC,UAAI,gBAAgB;AAClB,iBAAS;AAAA,MACX,WAAW,UAAU;AAGnB,iBAAS,IAAI,KAAK,MAAM,UAAU,CAAC,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAAA,MAChE,OAAO;AAEL,iBAAS,IAAI,KAAK,MAAM,WAAW,GAAG,CAAC,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAAA,MACpE;AAAA,IACF,OAAO;AAIL,UAAI,aAAa;AACjB,YAAM,YAAY,EAAE,MAAM,0BAA0B;AACpD,UAAI,WAAW;AACb,qBAAa,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,SAAS,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI;AAAA,MAClF,OAAO;AACL,cAAM,iBAAiB,EAAE,MAAM,2BAA2B;AAC1D,YAAI,gBAAgB;AAClB,uBAAa,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,SAAS,eAAe,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI;AAAA,QACvF,OAAO;AACL,gBAAM,WAAW,EAAE,MAAM,yBAAyB;AAClD,cAAI,UAAU;AAGZ,yBAAa,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,OAAO,SAAS,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;AAAA,UAC9E,OAAO;AACL,kBAAM,UAAU,EAAE,MAAM,0BAA0B;AAClD,gBAAI,SAAS;AAGX,2BAAa;AAAA,YACf;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAIA,YAAM,WAAW,EAAE,MAAM,yBAAyB;AAClD,UAAI,UAAU;AAEZ,cAAM,IAAI,oBAAI,KAAK,GAAG,SAAS,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,YAAY;AAC3E,iBAAS,IAAI,KAAK,EAAE,QAAQ,IAAI,KAAU,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAAA,MACvE,OAAO;AACL,cAAM,UAAU,EAAE,MAAM,iCAAiC;AACzD,YAAI,SAAS;AACX,gBAAM,OACJ,QAAQ,CAAC,EAAE,WAAW,IAAI,MAAO,OAAO,SAAS,QAAQ,CAAC,GAAG,EAAE,IAAI,OAAO,SAAS,QAAQ,CAAC,GAAG,EAAE;AAEnG,gBAAM,IAAI,oBAAI,KAAK,GAAG,IAAI,IAAI,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG,CAAC,YAAY;AACpG,mBAAS,IAAI,KAAK,EAAE,QAAQ,IAAI,KAAU,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAAA,QACvE,OAAO;AACL,gBAAM,iBAAiB,EAAE,MAAM,uEAAuE;AACtG,cAAI,gBAAgB;AAClB,kBAAM,WAAW,CAAC,UAAU,UAAU,WAAW,aAAa,YAAY,UAAU,UAAU;AAC9F,kBAAM,YAAY,SAAS,QAAQ,eAAe,CAAC,CAAC;AACpD,kBAAM,aAAa,IAAI,OAAO;AAC9B,kBAAM,YAAY,aAAa,YAAY,KAAK,KAAK;AAErD,qBAAS,IAAI,KAAK,SAAS,WAAW,KAAK,KAAU,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAAA,UAClF,OAAO;AAKL,qBAAS,aAAa,IAAI,WAAW,IAAI,KAAK,QAAQ,aAAa,KAAU,EAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AAAA,UAC1G;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAKA,MAAI,UAAU,SAAU,UAAS;AAEjC,SAAO,EAAE,UAAU,OAAO;AAC5B;;;AD7iDA,IAAMC,uBAAsB;AAC5B,IAAMC,kBAAiB;AACvB,IAAMC,uBAAsB;AAO5B,IAAM,2BAA2B;AACjC,IAAMC,sBAAqB;AAC3B,IAAMC,oCAAmC;AACzC,IAAM,mBAAmB,IAAI,WAAW,IAAI,kBAAkB,CAAC,CAAC;AAChE,IAAMC,+BAA8B,KAAK,IAAI,IAAI,QAAQ,OAAO,IAAI;AAUpE,SAASC,UAAS,WAA2B;AAC3C,SAAY,WAAK,WAAW,OAAO;AACrC;AAEA,SAASC,mBAAkB,WAA2B;AACpD,SAAY,WAAKD,UAAS,SAAS,GAAGN,oBAAmB;AAC3D;AAEA,SAASQ,cAAa,WAA2B;AAC/C,SAAY,WAAKF,UAAS,SAAS,GAAGL,eAAc;AACtD;AAEA,SAAS,UAAU,IAAkB;AACnC,UAAQ,KAAK,kBAAkB,GAAG,GAAG,EAAE;AACzC;AAEA,SAASQ,gBAAe,UAA0B;AAChD,QAAM,QAAe,oBAAY,CAAC,EAAE,SAAS,KAAK;AAClD,SAAY;AAAA,IACL,cAAQ,QAAQ;AAAA,IACrB,IAAS,eAAS,QAAQ,CAAC,IAAI,QAAQ,GAAG,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK;AAAA,EACnE;AACF;AAEA,SAASC,eAAc,SAAyB;AAC9C,SAAY,WAAK,SAAS,YAAY;AACxC;AAEA,SAASC,qBAAoB,SAAuB;AAClD,MAAI;AACF,IAAG;AAAA,MACDD,eAAc,OAAO;AAAA,MACrB,KAAK,UAAU;AAAA,QACb,KAAK,QAAQ;AAAA,QACb,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,QAClC,oBAAoBL;AAAA,MACtB,CAAC;AAAA,MACD,EAAE,UAAU,QAAQ,MAAM,KAAK;AAAA,IACjC;AAAA,EACF,QAAQ;AAAA,EAER;AACF;AAEA,SAASO,oBAAmB,SAAwC;AAClE,MAAI;AACF,UAAM,SAAS,KAAK,MAAS,iBAAaF,eAAc,OAAO,GAAG,MAAM,CAAC;AACzE,QAAI,EAAE,OAAO,OAAO,QAAQ,YAAY,OAAO,UAAU,OAAO,GAAG,KAAK,OAAO,MAAM,GAAI,QAAO;AAChG,WAAO;AAAA,MACL,KAAK,OAAO;AAAA,MACZ,GAAI,OAAO,OAAO,cAAc,YAAY,OAAO,UAAU,SAAS,IAClE,EAAE,WAAW,OAAO,UAAU,IAC9B,CAAC;AAAA,MACL,GAAI,OAAO,OAAO,uBAAuB,YACzC,OAAO,SAAS,OAAO,kBAAkB,KACzC,OAAO,qBAAqB,IACxB,EAAE,oBAAoB,OAAO,mBAAmB,IAChD,CAAC;AAAA,IACP;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAASG,gBAAe,KAAsB;AAC5C,MAAI;AACF,YAAQ,KAAK,KAAK,CAAC;AACnB,WAAO;AAAA,EACT,SAAS,OAAO;AACd,WAAQ,OAAiC,SAAS;AAAA,EACpD;AACF;AAEA,SAASC,wBAAuB,KAA4B;AAC1D,MAAI;AACF,UAAM,SAAS,aAAa,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,MAAM,SAAS,GAAG;AAAA,MACtE,UAAU;AAAA,MACV,OAAO,CAAC,UAAU,QAAQ,QAAQ;AAAA,MAClC,SAAS;AAAA,IACX,CAAC,EAAE,KAAK;AACR,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,cAAc,KAAK,MAAM,MAAM;AACrC,WAAO,OAAO,SAAS,WAAW,IAAI,cAAc;AAAA,EACtD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAASC,oBAAmB,OAAgC;AAC1D,MAAI,CAACF,gBAAe,MAAM,GAAG,EAAG,QAAO;AACvC,MAAI,MAAM,uBAAuB,OAAW,QAAO;AACnD,QAAM,qBAAqBC,wBAAuB,MAAM,GAAG;AAC3D,MAAI,uBAAuB,KAAM,QAAO;AACxC,SAAO,sBAAsB,MAAM,qBAAqBV;AAC1D;AAEA,SAASY,aAAY,UAAoB,OAAuC;AAC9E,QAAM,mBAAmB,OAAO,YAAY,KAAK,MAAM,MAAM,SAAS,IAAI,OAAO;AACjF,QAAM,cAAc,OAAO,SAAS,gBAAgB,IAAI,mBAAmB,SAAS;AACpF,SAAO,KAAK,IAAI,IAAI,cAAcd;AACpC;AAEA,SAASe,0BAAyB,SAAyC;AACzE,MAAI;AACF,UAAM,OAAU,cAAU,OAAO;AACjC,QAAI,KAAK,eAAe,EAAG,QAAO;AAClC,QAAI,CAAC,KAAK,YAAY,GAAG;AACvB,MAAG,WAAO,SAAS,EAAE,OAAO,KAAK,CAAC;AAClC,aAAO;AAAA,IACT;AACA,UAAM,QAAQL,oBAAmB,OAAO;AACxC,QAAI,SAASG,oBAAmB,KAAK,EAAG,QAAO;AAC/C,QAAI,CAAC,SAASC,aAAY,MAAM,IAAI,EAAG,QAAO;AAC9C,IAAG,WAAO,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AACnD,WAAO;AAAA,EACT,SAAS,OAAO;AACd,WAAQ,OAAiC,SAAS,WAAW,YAAY;AAAA,EAC3E;AACF;AAEA,SAASE,mBAAkB,UAAkB,QAA0B;AACrE,QAAM,UAAU,GAAG,QAAQ;AAG3B,QAAM,cAAc,KAAK,IAAI,GAAG,KAAK,KAAK,2BAA2Bf,mBAAkB,CAAC;AAGxF,MAAI,WAAW;AACf,WAAS,UAAU,GAAG,UAAU,aAAa,WAAW,GAAG;AACzD,QAAI;AACF,MAAG,cAAU,OAAO;AACpB,MAAAQ,qBAAoB,OAAO;AAC3B,iBAAW;AACX;AAAA,IACF,SAAS,OAAO;AACd,YAAM,OAAQ,OAAiC;AAC/C,UAAI,SAAS,UAAU;AACrB,YAAI;AACF,UAAG,cAAe,cAAQ,OAAO,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,QACzD,QAAQ;AACN;AAAA,QACF;AACA,kBAAUR,mBAAkB;AAC5B;AAAA,MACF;AACA,UAAI,SAAS,SAAU;AACvB,UAAIc,0BAAyB,OAAO,MAAM,UAAW;AACrD,gBAAUd,mBAAkB;AAAA,IAC9B;AAAA,EACF;AACA,MAAI,CAAC,SAAU;AAEf,MAAI;AACF,WAAO;AAAA,EACT,UAAE;AACA,QAAI;AACF,MAAG,WAAO,SAAS,EAAE,WAAW,MAAM,OAAO,KAAK,CAAC;AAAA,IACrD,QAAQ;AAAA,IAER;AAAA,EACF;AACF;AAEA,SAAS,SAAS,UAA2B;AAC3C,MAAI;AACF,WAAO,KAAK,MAAS,iBAAa,UAAU,MAAM,CAAC;AAAA,EACrD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAASgB,iBAAgB,UAAkB,OAAsB;AAC/D,QAAM,UAAU,KAAK,UAAU,KAAK;AACpC,WAAS,UAAU,GAAG,UAAU,GAAG,WAAW,GAAG;AAC/C,UAAM,WAAWV,gBAAe,QAAQ;AACxC,QAAI;AACF,MAAG,kBAAc,UAAU,SAAS,MAAM;AAC1C,MAAG,eAAW,UAAU,QAAQ;AAChC;AAAA,IACF,QAAQ;AACN,UAAI;AACF,QAAG,eAAW,QAAQ;AAAA,MACxB,QAAQ;AAAA,MAER;AACA,gBAAUN,mBAAkB;AAAA,IAC9B;AAAA,EACF;AACF;AAEA,SAAS,cAAc,WAAmB,UAAoD;AAC5F,MAAI;AACF,IAAG,cAAUG,UAAS,SAAS,GAAG,EAAE,WAAW,KAAK,CAAC;AASrD,UAAM,eAAeC,mBAAkB,SAAS;AAChD,UAAM,UAAUC,cAAa,SAAS;AACtC,IAAAU,mBAAkB,cAAc,MAAM;AACpC,MAAAA,mBAAkB,SAAS,MAAM;AAC/B,QAAAC;AAAA,UACE;AAAA,UACA,wCAAwC,SAAS,YAAY,GAAG,QAAQ;AAAA,QAC1E;AACA,QAAAA;AAAA,UACE;AAAA,UACA,mCAAmC,SAAS,OAAO,GAAG,QAAQ;AAAA,QAChE;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACH,QAAQ;AAAA,EAER;AACF;AAGO,SAAS,YACd,WACA,YACA,WACA,MACA,WAA6E,CAAC,GACxE;AACN,gBAAc,WAAW;AAAA,IACvB,MAAM;AAAA,IACN,SAAS,CAAC,EAAE,MAAM,YAAY,WAAW,MAAM,GAAG,SAAS,CAAC;AAAA,EAC9D,CAAC;AACH;AAGO,SAAS,cACd,WACA,YACA,WACA,MACM;AACN,gBAAc,WAAW;AAAA,IACvB,MAAM;AAAA,IACN,SAAS,CAAC,EAAE,MAAM,YAAY,WAAW,KAAK,CAAC;AAAA,EACjD,CAAC;AACH;AAGO,SAAS,aAAa,WAAyB;AACpD,gBAAc,WAAW,EAAE,MAAM,QAAQ,CAAC;AAC5C;AAGO,SAAS,aAAa,WAA4B;AACvD,MAAI;AACF,QAAI,CAAI,eAAWX,cAAa,SAAS,CAAC,EAAG,QAAO;AACpD,WAAO,8CAA8C,SAASD,mBAAkB,SAAS,CAAC,CAAC;AAAA,EAC7F,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGO,SAAS,mBAAmB,WAAmB,SAAqC;AACzF,MAAI,QAAQ,WAAW,EAAG;AAC1B,gBAAc,WAAW,EAAE,MAAM,SAAS,QAAQ,CAAC;AACrD;","names":["crypto","fs","path","TEMPORAL_INDEX_FILE","TAG_INDEX_FILE","INDEX_LOCK_STALE_MS","INDEX_LOCK_POLL_MS","INDEX_PROCESS_START_TOLERANCE_MS","INDEX_PROCESS_STARTED_AT_MS","stateDir","temporalIndexPath","tagIndexPath","uniqueTempPath","lockOwnerPath","writeIndexLockOwner","readIndexLockOwner","processIsAlive","readProcessStartedAtMs","lockOwnerIsRunning","lockIsFresh","removeAbandonedIndexLock","withIndexFileLock","writeJsonAtomic"]}
@@ -8,7 +8,7 @@ import {
8
8
  } from "./chunk-GDB4J2H3.js";
9
9
  import {
10
10
  importCapsule
11
- } from "./chunk-M5QKGHCR.js";
11
+ } from "./chunk-OC35KQIN.js";
12
12
  import {
13
13
  getTrustZoneStoreStatus,
14
14
  isTrustZoneName,
@@ -29,21 +29,15 @@ import {
29
29
  normalizeTags,
30
30
  parseTagMatch
31
31
  } from "./chunk-BT7NVCML.js";
32
- import {
33
- toRecallExplainJson
34
- } from "./chunk-PKGWJFNR.js";
35
- import {
36
- estimateRecallTokens
37
- } from "./chunk-DQPPRXFO.js";
38
32
  import {
39
33
  decideDisclosureEscalation
40
34
  } from "./chunk-H7XKCNR6.js";
41
35
  import {
42
- recordObjectiveStateSnapshotsFromObservedMessages
43
- } from "./chunk-ICP53SKG.js";
36
+ toRecallExplainJson
37
+ } from "./chunk-OVMS3DCB.js";
44
38
  import {
45
- objectiveStateStoreOverrideForNamespace
46
- } from "./chunk-6HMYUWXR.js";
39
+ estimateRecallTokens
40
+ } from "./chunk-HQ7QZJM5.js";
47
41
  import {
48
42
  combineNamespaces,
49
43
  defaultGitInvoker,
@@ -59,7 +53,7 @@ import {
59
53
  } from "./chunk-7PND4PUC.js";
60
54
  import {
61
55
  namespaceCollectionName
62
- } from "./chunk-T7VNN3ZM.js";
56
+ } from "./chunk-XVLEGMJI.js";
63
57
  import {
64
58
  namespaceIdentityFromToken
65
59
  } from "./chunk-EGGE52UU.js";
@@ -70,7 +64,13 @@ import {
70
64
  listMemoryGovernanceRuns,
71
65
  readMemoryGovernanceRunArtifact,
72
66
  runMemoryGovernance
73
- } from "./chunk-ZUFJ7ZTR.js";
67
+ } from "./chunk-L4H6MQ7I.js";
68
+ import {
69
+ recordObjectiveStateSnapshotsFromObservedMessages
70
+ } from "./chunk-ICP53SKG.js";
71
+ import {
72
+ objectiveStateStoreOverrideForNamespace
73
+ } from "./chunk-6HMYUWXR.js";
74
74
  import {
75
75
  recordMemoryOutcome
76
76
  } from "./chunk-EIR5VLIH.js";
@@ -111,30 +111,24 @@ import {
111
111
  enqueuePassiveCorrectionNotification,
112
112
  parseBriefingFocus,
113
113
  parseBriefingWindow
114
- } from "./chunk-CRFTLUWT.js";
114
+ } from "./chunk-UTDA43TB.js";
115
115
  import {
116
116
  parseEntityFile,
117
117
  selfDeps
118
- } from "./chunk-KTOH7EJE.js";
118
+ } from "./chunk-KXLRMM35.js";
119
+ import {
120
+ serializeMutations
121
+ } from "./chunk-LTJAMRGI.js";
119
122
  import {
120
123
  supersessionKeysForFact
121
124
  } from "./chunk-EHK6KZHK.js";
122
125
  import {
123
126
  stripAttributesSuffix
124
127
  } from "./chunk-SVOZFLIQ.js";
125
- import {
126
- serializeMutations
127
- } from "./chunk-LTJAMRGI.js";
128
128
  import {
129
129
  DEFAULT_RECALL_DISCLOSURE,
130
130
  isRecallDisclosure
131
- } from "./chunk-JO5AT6QT.js";
132
- import {
133
- getMemoryProjectionPath
134
- } from "./chunk-RHOZ5LLO.js";
135
- import {
136
- displayErrorDetail
137
- } from "./chunk-RL6NEVXT.js";
131
+ } from "./chunk-3ZVFLMFQ.js";
138
132
  import {
139
133
  inferMemoryStatus,
140
134
  toMemoryPathRel
@@ -143,9 +137,15 @@ import {
143
137
  normalizeProjectionPreview,
144
138
  normalizeProjectionTags
145
139
  } from "./chunk-SCU65EZI.js";
140
+ import {
141
+ getMemoryProjectionPath
142
+ } from "./chunk-RHOZ5LLO.js";
143
+ import {
144
+ displayErrorDetail
145
+ } from "./chunk-RL6NEVXT.js";
146
146
  import {
147
147
  createVersion
148
- } from "./chunk-VF4XKTX3.js";
148
+ } from "./chunk-VZ5OJE4X.js";
149
149
  import {
150
150
  computeContentHash
151
151
  } from "./chunk-W5H6ZRPT.js";
@@ -212,7 +212,7 @@ import {
212
212
  } from "./chunk-PVGDJXVK.js";
213
213
  import {
214
214
  AccessAuditAdapter
215
- } from "./chunk-TVVEYCNW.js";
215
+ } from "./chunk-7K5Q6COX.js";
216
216
 
217
217
  // src/access-observe-write-surface.ts
218
218
  import { createHash as createHash6 } from "crypto";
@@ -11250,4 +11250,4 @@ export {
11250
11250
  EngramAccessService,
11251
11251
  AccessAdminOpsSurface
11252
11252
  };
11253
- //# sourceMappingURL=chunk-CNWC274T.js.map
11253
+ //# sourceMappingURL=chunk-3OQ4IZJN.js.map
@@ -23,4 +23,4 @@ export {
23
23
  confidenceTier,
24
24
  SPECULATIVE_TTL_DAYS
25
25
  };
26
- //# sourceMappingURL=chunk-JO5AT6QT.js.map
26
+ //# sourceMappingURL=chunk-3ZVFLMFQ.js.map