@remnic/core 9.7.12 → 9.7.14

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 (285) hide show
  1. package/dist/access-admin-ops-surface.d.ts +6 -6
  2. package/dist/access-admin-ops-surface.js +7 -7
  3. package/dist/access-boundary.d.ts +6 -6
  4. package/dist/access-boundary.js +8 -8
  5. package/dist/access-cli.js +34 -34
  6. package/dist/access-http.d.ts +6 -6
  7. package/dist/access-http.js +12 -12
  8. package/dist/access-identity-continuity-surface.d.ts +5 -5
  9. package/dist/access-identity-continuity-surface.js +7 -7
  10. package/dist/access-lcm-surface.d.ts +6 -6
  11. package/dist/access-lcm-surface.js +7 -7
  12. package/dist/access-mcp.d.ts +6 -6
  13. package/dist/access-mcp.js +11 -11
  14. package/dist/access-observe-write-surface.d.ts +6 -6
  15. package/dist/access-observe-write-surface.js +7 -7
  16. package/dist/access-operations-batch.js +9 -9
  17. package/dist/access-operations.d.ts +6 -6
  18. package/dist/access-operations.js +10 -10
  19. package/dist/access-recall-surface.d.ts +6 -6
  20. package/dist/access-recall-surface.js +7 -7
  21. package/dist/{access-service-tHd3eQpd.d.ts → access-service-CPhSnLOH.d.ts} +4 -4
  22. package/dist/access-service.d.ts +6 -6
  23. package/dist/access-service.js +7 -7
  24. package/dist/access-surface-catalog.d.ts +6 -6
  25. package/dist/action-confidence.d.ts +1 -1
  26. package/dist/active-memory-bridge.d.ts +1 -1
  27. package/dist/active-recall.d.ts +1 -1
  28. package/dist/active-recall.js +1 -1
  29. package/dist/behavior-learner.d.ts +1 -1
  30. package/dist/behavior-signals.d.ts +1 -1
  31. package/dist/bootstrap.d.ts +5 -5
  32. package/dist/briefing.d.ts +2 -2
  33. package/dist/briefing.js +3 -3
  34. package/dist/buffer-surprise-report.d.ts +1 -1
  35. package/dist/buffer.d.ts +2 -2
  36. package/dist/bulk-import/index.d.ts +3 -3
  37. package/dist/calibration.d.ts +1 -1
  38. package/dist/capabilities.d.ts +1 -1
  39. package/dist/{catalog-DEMiw6HZ.d.ts → catalog-uX9sT9ws.d.ts} +1 -1
  40. package/dist/causal-behavior.d.ts +1 -1
  41. package/dist/causal-consolidation.d.ts +1 -1
  42. package/dist/causal-consolidation.js +4 -4
  43. package/dist/causal-trajectory-graph.d.ts +1 -1
  44. package/dist/{chunk-2RSL6YRA.js → chunk-2E6G7FCE.js} +2 -2
  45. package/dist/{chunk-JKLJ6A7W.js → chunk-3D6AFGQR.js} +2 -2
  46. package/dist/{chunk-BQTSGK5Y.js → chunk-4B4MUS5D.js} +2 -2
  47. package/dist/{chunk-NVXQTRBL.js → chunk-4LEF6XWJ.js} +2 -2
  48. package/dist/{chunk-TMGK6YE7.js → chunk-5UNWK7KU.js} +2 -2
  49. package/dist/{chunk-OIFZII6J.js → chunk-67ZCJLJY.js} +2 -2
  50. package/dist/{chunk-ZRXSHGXT.js → chunk-6CALL5VN.js} +2 -2
  51. package/dist/{chunk-TRH533CA.js → chunk-7ICYQUOL.js} +2 -2
  52. package/dist/{chunk-I3GKTDM2.js → chunk-7LFXDGLH.js} +3 -3
  53. package/dist/{chunk-OCY3CRPG.js → chunk-A7B4RMQG.js} +3 -3
  54. package/dist/{chunk-2ZPQUTMW.js → chunk-AD6AMF2N.js} +4 -4
  55. package/dist/{chunk-TITSEN2M.js → chunk-ANADNYWK.js} +19 -5
  56. package/dist/chunk-ANADNYWK.js.map +1 -0
  57. package/dist/{chunk-YI7XUXLX.js → chunk-ASKEM4AR.js} +18 -18
  58. package/dist/{chunk-G5PVJJRA.js → chunk-B3F4CWQR.js} +1 -1
  59. package/dist/chunk-B3F4CWQR.js.map +1 -0
  60. package/dist/{chunk-675YU5IK.js → chunk-DDGV7NAX.js} +2 -2
  61. package/dist/{chunk-CE3GMHT4.js → chunk-EEARRVZ2.js} +2 -2
  62. package/dist/{chunk-AOWPZ7TM.js → chunk-F7AU34FC.js} +17 -17
  63. package/dist/{chunk-T6U7HDIY.js → chunk-FBNWOMCE.js} +2 -2
  64. package/dist/{chunk-QPZCAVDC.js → chunk-GMSDQUCR.js} +7 -7
  65. package/dist/{chunk-6N7R7TR2.js → chunk-IFJ23BHU.js} +6 -1
  66. package/dist/chunk-IFJ23BHU.js.map +1 -0
  67. package/dist/{chunk-IQULRIZM.js → chunk-IKSELOIV.js} +2 -2
  68. package/dist/{chunk-ZC3HG22I.js → chunk-JMBVCAR4.js} +2 -2
  69. package/dist/{chunk-CLFY35ED.js → chunk-KGWXHWAH.js} +3 -3
  70. package/dist/{chunk-RT7IP3D3.js → chunk-KSNVDPDF.js} +2 -2
  71. package/dist/{chunk-TWGGNUWJ.js → chunk-MKDRQAA3.js} +2 -2
  72. package/dist/{chunk-ZASJ53ML.js → chunk-ND5M64JJ.js} +41 -9
  73. package/dist/chunk-ND5M64JJ.js.map +1 -0
  74. package/dist/{chunk-XUQUBZ7O.js → chunk-NUWYOKS6.js} +2 -2
  75. package/dist/{chunk-VY6LKKVN.js → chunk-NWTGD4AN.js} +6 -1
  76. package/dist/chunk-NWTGD4AN.js.map +1 -0
  77. package/dist/{chunk-D4TLWDYR.js → chunk-PK5XBDA6.js} +2 -2
  78. package/dist/{chunk-2AL7N3BH.js → chunk-RBQLJSJ7.js} +2 -2
  79. package/dist/{chunk-FUUF7FMX.js → chunk-TXVD7PLT.js} +2 -2
  80. package/dist/{chunk-UTZW3X2R.js → chunk-UN3CH3CO.js} +2 -2
  81. package/dist/{chunk-PA6DMYEK.js → chunk-VYOFVVNK.js} +6 -6
  82. package/dist/{chunk-3SIC3E65.js → chunk-W5NKDU24.js} +2 -2
  83. package/dist/{cli-D8Tsa4Sh.d.ts → cli-_Y2Bmt6A.d.ts} +5 -5
  84. package/dist/cli.d.ts +8 -8
  85. package/dist/cli.js +25 -25
  86. package/dist/compounding/engine.d.ts +2 -2
  87. package/dist/compounding/engine.js +3 -3
  88. package/dist/compounding/preference-consolidator.d.ts +1 -1
  89. package/dist/compression-optimizer.d.ts +1 -1
  90. package/dist/config.d.ts +1 -1
  91. package/dist/config.js +1 -1
  92. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  93. package/dist/connectors/codex-materialize-runner.js +3 -3
  94. package/dist/connectors/codex-materialize.d.ts +1 -1
  95. package/dist/connectors/index.d.ts +1 -1
  96. package/dist/connectors/index.js +3 -3
  97. package/dist/consolidation-provenance-check.d.ts +2 -2
  98. package/dist/consolidation-undo.d.ts +2 -2
  99. package/dist/contradiction/index.d.ts +2 -2
  100. package/dist/conversation-index/backend.d.ts +1 -1
  101. package/dist/conversation-index/chunker.d.ts +1 -1
  102. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  103. package/dist/conversation-index/indexer.d.ts +1 -1
  104. package/dist/conversation-index/search.d.ts +1 -1
  105. package/dist/day-summary.d.ts +1 -1
  106. package/dist/delinearize.d.ts +1 -1
  107. package/dist/direct-answer-wiring.d.ts +1 -1
  108. package/dist/direct-answer.d.ts +1 -1
  109. package/dist/embedding-fallback.d.ts +1 -1
  110. package/dist/enrichment/index.d.ts +1 -1
  111. package/dist/entity-retrieval.d.ts +2 -2
  112. package/dist/entity-retrieval.js +3 -3
  113. package/dist/entity-schema.d.ts +1 -1
  114. package/dist/explicit-capture.d.ts +5 -5
  115. package/dist/extraction-faithfulness.d.ts +1 -1
  116. package/dist/extraction-judge-telemetry.d.ts +1 -1
  117. package/dist/extraction-judge-training.d.ts +1 -1
  118. package/dist/extraction-judge.d.ts +1 -1
  119. package/dist/extraction.d.ts +1 -1
  120. package/dist/extraction.js +2 -2
  121. package/dist/fallback-llm.d.ts +1 -1
  122. package/dist/graph-dashboard-diff.d.ts +1 -1
  123. package/dist/graph-dashboard-key.d.ts +1 -1
  124. package/dist/graph-dashboard-parser.d.ts +1 -1
  125. package/dist/graph-edge-reinforcement.d.ts +1 -1
  126. package/dist/graph-snapshot.d.ts +1 -1
  127. package/dist/graph.d.ts +1 -1
  128. package/dist/identity-continuity.d.ts +1 -1
  129. package/dist/importance.d.ts +1 -1
  130. package/dist/importers/index.d.ts +1 -1
  131. package/dist/in-flight-reads.d.ts +1 -1
  132. package/dist/index.d.ts +14 -14
  133. package/dist/index.js +34 -34
  134. package/dist/intent.d.ts +1 -1
  135. package/dist/lcm/engine.d.ts +1 -1
  136. package/dist/lcm/index.d.ts +1 -1
  137. package/dist/lcm/tools.d.ts +1 -1
  138. package/dist/lifecycle.d.ts +1 -1
  139. package/dist/live-connectors-runner.d.ts +1 -1
  140. package/dist/local-llm.d.ts +1 -1
  141. package/dist/local-llm.js +1 -1
  142. package/dist/local-model-endpoint.d.ts +1 -1
  143. package/dist/maintenance/memory-governance.d.ts +1 -1
  144. package/dist/maintenance/memory-governance.js +3 -3
  145. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +3 -3
  146. package/dist/maintenance/rebuild-memory-projection.js +4 -4
  147. package/dist/mcp-memory-inspector-app.d.ts +6 -6
  148. package/dist/memory-action-policy.d.ts +1 -1
  149. package/dist/memory-cache.d.ts +1 -1
  150. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  151. package/dist/memory-projection-store.d.ts +1 -1
  152. package/dist/memory-provenance.d.ts +1 -1
  153. package/dist/memory-worth-outcomes.d.ts +2 -2
  154. package/dist/models-json.d.ts +1 -1
  155. package/dist/namespaces/migrate.d.ts +3 -3
  156. package/dist/namespaces/migrate.js +4 -4
  157. package/dist/namespaces/principal.d.ts +1 -1
  158. package/dist/namespaces/search.d.ts +1 -1
  159. package/dist/namespaces/storage.d.ts +3 -3
  160. package/dist/namespaces/storage.js +3 -3
  161. package/dist/native-knowledge.d.ts +1 -1
  162. package/dist/operator-toolkit.d.ts +2 -2
  163. package/dist/operator-toolkit.js +8 -8
  164. package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
  165. package/dist/orchestration/maintenance.d.ts +2 -2
  166. package/dist/orchestration/maintenance.js +5 -5
  167. package/dist/{orchestrator-B_WXBmuE.d.ts → orchestrator-BbZ_dQSU.d.ts} +4 -4
  168. package/dist/orchestrator.d.ts +5 -5
  169. package/dist/orchestrator.js +34 -34
  170. package/dist/patterns-cli.d.ts +1 -1
  171. package/dist/{pipeline-Dvtvt141.d.ts → pipeline-FRMDb1fn.d.ts} +1 -1
  172. package/dist/policy-runtime.d.ts +1 -1
  173. package/dist/provenance.d.ts +1 -1
  174. package/dist/qmd-preflight.d.ts +2 -2
  175. package/dist/qmd-recall-cache.d.ts +1 -1
  176. package/dist/{qmd-DwBLh_hl.d.ts → qmd-xJRrHFbA.d.ts} +1 -1
  177. package/dist/qmd.d.ts +2 -2
  178. package/dist/recall-disclosure-escalation.d.ts +1 -1
  179. package/dist/recall-explain-renderer.d.ts +1 -1
  180. package/dist/recall-explain-renderer.js +3 -3
  181. package/dist/recall-planner-llm.d.ts +1 -1
  182. package/dist/recall-state.d.ts +1 -1
  183. package/dist/recall-tag-filter.d.ts +1 -1
  184. package/dist/recall-timings.d.ts +1 -1
  185. package/dist/recall-xray-cli.d.ts +1 -1
  186. package/dist/recall-xray-cli.js +4 -4
  187. package/dist/recall-xray-renderer.d.ts +1 -1
  188. package/dist/recall-xray-renderer.js +3 -3
  189. package/dist/recall-xray.d.ts +1 -1
  190. package/dist/recall-xray.js +2 -2
  191. package/dist/replay/normalizers/chatgpt.d.ts +1 -1
  192. package/dist/replay/normalizers/claude.d.ts +1 -1
  193. package/dist/replay/normalizers/openclaw.d.ts +1 -1
  194. package/dist/replay/normalizers/shared.d.ts +1 -1
  195. package/dist/replay/runner.d.ts +1 -1
  196. package/dist/replay/types.d.ts +1 -1
  197. package/dist/resolve-auth-token.d.ts +1 -1
  198. package/dist/resume-bundles.js +2 -2
  199. package/dist/retrieval-agents.d.ts +2 -2
  200. package/dist/retrieval-tiers.d.ts +1 -1
  201. package/dist/routing/engine.d.ts +1 -1
  202. package/dist/routing/store.d.ts +1 -1
  203. package/dist/search/embed-helper.d.ts +1 -1
  204. package/dist/search/factory.d.ts +1 -1
  205. package/dist/search/index.d.ts +1 -1
  206. package/dist/search/lancedb-backend.d.ts +1 -1
  207. package/dist/search/meilisearch-backend.d.ts +1 -1
  208. package/dist/search/noop-backend.d.ts +1 -1
  209. package/dist/search/orama-backend.d.ts +1 -1
  210. package/dist/search/port.d.ts +1 -1
  211. package/dist/search/remote-backend.d.ts +1 -1
  212. package/dist/{semantic-consolidation-Dia_6FOn.d.ts → semantic-consolidation-fvdZRa5Z.d.ts} +1 -1
  213. package/dist/semantic-consolidation.d.ts +2 -2
  214. package/dist/semantic-consolidation.js +4 -4
  215. package/dist/semantic-rule-promotion.js +3 -3
  216. package/dist/semantic-rule-verifier.d.ts +1 -1
  217. package/dist/semantic-rule-verifier.js +3 -3
  218. package/dist/session-observer-bands.d.ts +1 -1
  219. package/dist/session-observer-state.d.ts +1 -1
  220. package/dist/shared-context/manager.d.ts +1 -1
  221. package/dist/signal.d.ts +1 -1
  222. package/dist/{storage-RshM7i8-.d.ts → storage-CrvzaM9C.d.ts} +1 -1
  223. package/dist/storage.d.ts +2 -2
  224. package/dist/storage.js +2 -2
  225. package/dist/summarizer.d.ts +1 -1
  226. package/dist/summarizer.js +2 -2
  227. package/dist/summary-snapshot.d.ts +1 -1
  228. package/dist/temporal-supersession.d.ts +2 -2
  229. package/dist/temporal-timeline-recall.d.ts +1 -1
  230. package/dist/temporal-validity.d.ts +1 -1
  231. package/dist/threading.d.ts +1 -1
  232. package/dist/tier-migration.d.ts +2 -2
  233. package/dist/tier-routing.d.ts +1 -1
  234. package/dist/topics.d.ts +1 -1
  235. package/dist/transcript.d.ts +1 -1
  236. package/dist/trust-score-stage.d.ts +1 -1
  237. package/dist/trust-score.d.ts +1 -1
  238. package/dist/{types-CHSXOq7s.d.ts → types-Bl4BWDM8.d.ts} +6 -0
  239. package/dist/types.d.ts +1 -1
  240. package/dist/types.js +1 -1
  241. package/dist/utility-runtime.d.ts +1 -1
  242. package/dist/verified-recall.js +3 -3
  243. package/package.json +2 -2
  244. package/src/access-http.ts +40 -2
  245. package/src/config.ts +9 -0
  246. package/src/local-llm-thinking.test.ts +55 -1
  247. package/src/local-llm.ts +14 -0
  248. package/src/relay/mission-access.test.ts +58 -3
  249. package/src/relay/mission-access.ts +17 -3
  250. package/src/relay/mission-ui.test.ts +90 -0
  251. package/src/types.ts +6 -0
  252. package/dist/chunk-6N7R7TR2.js.map +0 -1
  253. package/dist/chunk-G5PVJJRA.js.map +0 -1
  254. package/dist/chunk-TITSEN2M.js.map +0 -1
  255. package/dist/chunk-VY6LKKVN.js.map +0 -1
  256. package/dist/chunk-ZASJ53ML.js.map +0 -1
  257. /package/dist/{chunk-2RSL6YRA.js.map → chunk-2E6G7FCE.js.map} +0 -0
  258. /package/dist/{chunk-JKLJ6A7W.js.map → chunk-3D6AFGQR.js.map} +0 -0
  259. /package/dist/{chunk-BQTSGK5Y.js.map → chunk-4B4MUS5D.js.map} +0 -0
  260. /package/dist/{chunk-NVXQTRBL.js.map → chunk-4LEF6XWJ.js.map} +0 -0
  261. /package/dist/{chunk-TMGK6YE7.js.map → chunk-5UNWK7KU.js.map} +0 -0
  262. /package/dist/{chunk-OIFZII6J.js.map → chunk-67ZCJLJY.js.map} +0 -0
  263. /package/dist/{chunk-ZRXSHGXT.js.map → chunk-6CALL5VN.js.map} +0 -0
  264. /package/dist/{chunk-TRH533CA.js.map → chunk-7ICYQUOL.js.map} +0 -0
  265. /package/dist/{chunk-I3GKTDM2.js.map → chunk-7LFXDGLH.js.map} +0 -0
  266. /package/dist/{chunk-OCY3CRPG.js.map → chunk-A7B4RMQG.js.map} +0 -0
  267. /package/dist/{chunk-2ZPQUTMW.js.map → chunk-AD6AMF2N.js.map} +0 -0
  268. /package/dist/{chunk-YI7XUXLX.js.map → chunk-ASKEM4AR.js.map} +0 -0
  269. /package/dist/{chunk-675YU5IK.js.map → chunk-DDGV7NAX.js.map} +0 -0
  270. /package/dist/{chunk-CE3GMHT4.js.map → chunk-EEARRVZ2.js.map} +0 -0
  271. /package/dist/{chunk-AOWPZ7TM.js.map → chunk-F7AU34FC.js.map} +0 -0
  272. /package/dist/{chunk-T6U7HDIY.js.map → chunk-FBNWOMCE.js.map} +0 -0
  273. /package/dist/{chunk-QPZCAVDC.js.map → chunk-GMSDQUCR.js.map} +0 -0
  274. /package/dist/{chunk-IQULRIZM.js.map → chunk-IKSELOIV.js.map} +0 -0
  275. /package/dist/{chunk-ZC3HG22I.js.map → chunk-JMBVCAR4.js.map} +0 -0
  276. /package/dist/{chunk-CLFY35ED.js.map → chunk-KGWXHWAH.js.map} +0 -0
  277. /package/dist/{chunk-RT7IP3D3.js.map → chunk-KSNVDPDF.js.map} +0 -0
  278. /package/dist/{chunk-TWGGNUWJ.js.map → chunk-MKDRQAA3.js.map} +0 -0
  279. /package/dist/{chunk-XUQUBZ7O.js.map → chunk-NUWYOKS6.js.map} +0 -0
  280. /package/dist/{chunk-D4TLWDYR.js.map → chunk-PK5XBDA6.js.map} +0 -0
  281. /package/dist/{chunk-2AL7N3BH.js.map → chunk-RBQLJSJ7.js.map} +0 -0
  282. /package/dist/{chunk-FUUF7FMX.js.map → chunk-TXVD7PLT.js.map} +0 -0
  283. /package/dist/{chunk-UTZW3X2R.js.map → chunk-UN3CH3CO.js.map} +0 -0
  284. /package/dist/{chunk-PA6DMYEK.js.map → chunk-VYOFVVNK.js.map} +0 -0
  285. /package/dist/{chunk-3SIC3E65.js.map → chunk-W5NKDU24.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/access-operations.ts","../src/relay/mission-access.ts","../src/relay/mission.ts"],"sourcesContent":["/**\n * Pilot operation definitions for the access boundary (issue #1525).\n *\n * Three operations migrate through the registry in this PR — `memory_get`,\n * `memory_search`, and the `memory_store` write op — so the boundary's\n * normalization matrix (rules 17/28/36/48/51) and shared error mapping reach\n * MCP, HTTP, and CLI from one place. Domain-group migrations (memory ops →\n * connectors → namespaces …) land as follow-up PRs that add `defineOperation`\n * calls here and delete the surface-local validation they replace.\n *\n * Importing this module for its side effects registers the pilot operations;\n * surfaces then dispatch via {@link getOperation} from `./access-boundary.js`.\n */\n\nimport { z } from \"zod\";\n\nimport { defineOperation } from \"./access-boundary.js\";\nimport { memoryStoreRequestSchema, type MemoryStoreRequest } from \"./access-schema.js\";\nimport { EngramAccessInputError } from \"./access-service.js\";\nimport { CorrectionContractError } from \"./correction/correction-contract.js\";\nimport type {\n EngramAccessMemoryResponse,\n EngramAccessWriteResponse,\n} from \"./access-service.js\";\nimport {\n DECISION_SUBCOMMANDS,\n type DecisionSurfaceRequest,\n type DecisionSurfaceResponse,\n} from \"./coding/decision-surfaces.js\";\nimport {\n type ArchitectureSurfaceRequest,\n type ArchitectureSurfaceResponse,\n} from \"./coding/architecture-surfaces.js\";\nimport {\n type CodegraphSurfaceRequest,\n type CodegraphSurfaceResponse,\n isCodegraphToolName,\n} from \"./coding/codegraph-surfaces.js\";\nimport {\n DELTA_SUBCOMMANDS,\n type DeltaSurfaceRequest,\n type DeltaSurfaceResponse,\n} from \"./coding/session-delta-surfaces.js\";\n\n// ---------------------------------------------------------------------------\n// memory_get — fetch one memory by id\n// ---------------------------------------------------------------------------\n\n/**\n * `memoryId` is required and non-empty (rule 51: the MCP dispatcher previously\n * fell back to `typeof args.memoryId === \"string\" ? args.memoryId : \"\"`,\n * silently passing an empty id into the service). `namespace` is\n * `.nullable().optional()` because MCP clients send `null` (gotcha #2).\n * `namespace` has no `.min(1)` because the pre-boundary handlers forwarded\n * empty/whitespace strings, and `resolveNamespace` treats empty identically\n * to absent (both trim to falsy → default namespace). Rejecting empty would\n * break HTTP callers that send a bare `?namespace=` (Cursor review).\n */\nconst memoryGetSchema = z.object({\n memoryId: z.string().trim().min(1, \"memoryId is required\").max(512),\n // Issue #1582 — when memoryId is a `[m:xxxx]` handle, sessionKey scopes the\n // resolution to this session's recent recall history.\n sessionKey: z.string().trim().min(1).max(512).nullable().optional(),\n namespace: z.string().trim().max(256).nullable().optional(),\n});\n\nexport interface MemoryGetInput {\n readonly memoryId: string;\n readonly sessionKey?: string | null;\n readonly namespace?: string | null;\n}\n\nexport interface MemoryGetOutput {\n readonly result: EngramAccessMemoryResponse;\n}\n\nexport const memoryGetOperation = defineOperation<MemoryGetInput, MemoryGetOutput>({\n name: \"memory_get\",\n description: \"Fetch one memory by id.\",\n schema: memoryGetSchema,\n handler: async (input, ctx) => {\n const result = await ctx.service.memoryGet(\n input.memoryId,\n input.namespace ?? undefined,\n ctx.authenticatedPrincipal,\n input.sessionKey ?? undefined,\n );\n return { result };\n },\n});\n\n// ---------------------------------------------------------------------------\n// memory_search — semantic search across memories\n// ---------------------------------------------------------------------------\n\nconst memorySearchSchema = z.object({\n query: z.string().trim().min(1, \"query is required\").max(2048),\n namespace: z.string().trim().max(256).nullable().optional(),\n // No upper cap: the pre-boundary MCP handler forwarded any finite number to\n // memorySearch, and the QMD/search backends honor large limits. Capping at\n // 100 would reject existing clients that request larger result sets.\n maxResults: z.number().int().min(1).nullable().optional(),\n collection: z.string().trim().min(1).max(256).nullable().optional(),\n});\n\nexport interface MemorySearchInput {\n readonly query: string;\n readonly namespace?: string | null;\n readonly maxResults?: number | null;\n readonly collection?: string | null;\n}\n\nexport interface MemorySearchOutput {\n readonly result: {\n readonly query: string;\n readonly results: ReadonlyArray<{ path: string; score: number; snippet: string }>;\n readonly count: number;\n };\n}\n\nexport const memorySearchOperation = defineOperation<MemorySearchInput, MemorySearchOutput>({\n name: \"memory_search\",\n description: \"Search memories across readable namespaces.\",\n schema: memorySearchSchema,\n handler: async (input, ctx) => {\n const result = await ctx.service.memorySearch({\n query: input.query,\n namespace: input.namespace ?? undefined,\n maxResults: input.maxResults ?? undefined,\n collection: input.collection ?? undefined,\n principal: ctx.authenticatedPrincipal,\n });\n return { result };\n },\n});\n\n// ---------------------------------------------------------------------------\n// memory_store — the pilot WRITE op\n// ---------------------------------------------------------------------------\n\nexport type MemoryStoreInput = MemoryStoreRequest;\n\nexport interface MemoryStoreOutput {\n readonly result: EngramAccessWriteResponse;\n}\n\nexport const memoryStoreOperation = defineOperation<MemoryStoreInput, MemoryStoreOutput>({\n name: \"memory_store\",\n description: \"Store an explicit memory through the access layer.\",\n // Reuse the existing schema verbatim — the migration is behavior-preserving;\n // the schema's external contract is NOT changing in this PR (per the issue's\n // pitfall note).\n schema: memoryStoreRequestSchema,\n handler: async (input, ctx) => {\n const result = await ctx.service.memoryStore(\n {\n ...input,\n authenticatedPrincipal: ctx.authenticatedPrincipal,\n ...(ctx.sourceConnector ? { sourceConnector: ctx.sourceConnector } : {}),\n },\n // Forward transport-level hooks (e.g. HTTP's atomic write-quota gate)\n // so the hook still fires inside the service's idempotent-write lock —\n // never before, never on a replay (#1434 invariant preserved by the\n // boundary migration).\n\n ctx.hooks,\n );\n return { result };\n },\n});\n\n// ---------------------------------------------------------------------------\n// coding_decision — decision-record surfaces (issue #1548 Track A PR 2)\n// ---------------------------------------------------------------------------\n\n/**\n * The subcommand field is required and MUST be one of the four valid values\n * (rule 51 — reject loudly, list the options, never silently default). The\n * remaining fields are optional because each subcommand uses a different\n * subset; the handler validates subcommand-specific requirements after\n * routing.\n */\n/**\n * MCP clients send `null` for absent optional fields. Zod `.optional()`\n * rejects `null`, so strip nulls at the object level before the inner\n * schema validates (review: cursor null-field thread).\n */\nconst codingDecisionSchema = z.preprocess(\n (data) => {\n if (data && typeof data === \"object\" && !Array.isArray(data)) {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(data as Record<string, unknown>)) {\n if (v !== null) out[k] = v;\n }\n return out;\n }\n return data;\n },\n z.object({\n subcommand: z.enum(DECISION_SUBCOMMANDS),\n sessionKey: z.string().trim().max(512).optional(),\n namespace: z.string().trim().max(256).optional(),\n id: z.string().trim().max(512).optional(),\n title: z.string().trim().max(512).optional(),\n status: z.string().trim().max(64).optional(),\n context: z.string().trim().max(8192).optional(),\n decision: z.string().trim().max(8192).optional(),\n consequences: z.string().trim().max(8192).optional(),\n entityRefs: z.array(z.string().trim().min(1).max(256)).optional(),\n supersedesId: z.string().trim().max(512).optional(),\n }),\n);\n\nexport type CodingDecisionInput = DecisionSurfaceRequest;\nexport type CodingDecisionOutput = { result: DecisionSurfaceResponse };\n\nexport const codingDecisionOperation = defineOperation<\n CodingDecisionInput,\n CodingDecisionOutput\n>({\n name: \"coding_decision\",\n description:\n \"List, get, record, or supersede decision records in the session's coding namespace (issue #1548 Track A).\",\n schema: codingDecisionSchema as z.ZodType<CodingDecisionInput>,\n handler: async (input, ctx) => {\n const result = await ctx.service.codingDecision(input, ctx.authenticatedPrincipal, ctx.sourceConnector);\n return { result };\n },\n});\n\n// ---------------------------------------------------------------------------\n// coding_architecture — architecture-card surfaces (issue #1548 Track A PR 3)\n// ---------------------------------------------------------------------------\n\nconst codingArchitectureSchema = z.preprocess(\n (data) => {\n if (data !== null && typeof data === \"object\" && !Array.isArray(data)) {\n const obj = data as Record<string, unknown>;\n const cleaned: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (value !== null) cleaned[key] = value;\n }\n return cleaned;\n }\n return data;\n },\n z.object({\n subcommand: z.enum([\"get\", \"refresh\"]),\n sessionKey: z.string().optional(),\n namespace: z.string().optional(),\n }),\n);\n\nexport type CodingArchitectureInput = ArchitectureSurfaceRequest;\nexport type CodingArchitectureOutput = { result: ArchitectureSurfaceResponse };\n\nexport const codingArchitectureOperation = defineOperation<\n CodingArchitectureInput,\n CodingArchitectureOutput\n>({\n name: \"coding_architecture\",\n description:\n \"Get or refresh the architecture card for the session's coding namespace (issue #1548 Track A PR 3).\",\n schema: codingArchitectureSchema as z.ZodType<CodingArchitectureInput>,\n handler: async (input, ctx) => {\n const result = await ctx.service.codingArchitecture(input, ctx.authenticatedPrincipal, ctx.sourceConnector);\n return { result };\n },\n});\n\nconst codegraphSurfaceSchema = z.preprocess(\n (data) => {\n if (data !== null && typeof data === \"object\" && !Array.isArray(data)) {\n const obj = data as Record<string, unknown>;\n const cleaned: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (value !== null) cleaned[key] = value;\n }\n return cleaned;\n }\n return data;\n },\n z.object({\n tool: z.string().refine(isCodegraphToolName, {\n message: \"tool must be one of the codegraph tool names\",\n }),\n sessionKey: z.string().max(512).optional(),\n principal: z.string().max(256).optional(),\n project: z.string().max(256).optional(),\n query: z.string().max(2048).optional(),\n limit: z.number().int().positive().max(200).optional(),\n start: z.string().max(512).optional(),\n direction: z.string().max(64).optional(),\n depth: z.number().int().positive().max(10).optional(),\n qualifiedName: z.string().max(1024).optional(),\n path: z.string().max(2048).optional(),\n structuredQuery: z.record(z.string(), z.unknown()).optional(),\n head: z.string().max(256).optional(),\n repoRoot: z.string().max(2048).optional(),\n mode: z.string().max(64).optional(),\n confirm: z.boolean().optional(),\n subcommand: z.string().max(64).optional(),\n id: z.string().max(512).optional(),\n title: z.string().max(512).optional(),\n status: z.string().max(64).optional(),\n context: z.string().max(8192).optional(),\n decision: z.string().max(8192).optional(),\n consequences: z.string().max(8192).optional(),\n entityRefs: z.array(z.string().max(256)).optional(),\n supersedesId: z.string().max(512).optional(),\n traces: z.array(z.unknown()).optional(),\n }),\n) as z.ZodType<CodegraphSurfaceRequest>;\n\n// ---------------------------------------------------------------------------\n// coding_delta — session-delta surface (issue #1548 Track A PR 4)\n// ---------------------------------------------------------------------------\n\nconst codingDeltaSchema = z.preprocess(\n (data) => {\n if (data !== null && typeof data === \"object\" && !Array.isArray(data)) {\n const obj = data as Record<string, unknown>;\n const cleaned: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(obj)) {\n if (value !== null) cleaned[key] = value;\n }\n return cleaned;\n }\n return data;\n },\n z.object({\n subcommand: z.enum(DELTA_SUBCOMMANDS),\n sessionKey: z.string().trim().max(512).optional(),\n namespace: z.string().trim().max(256).optional(),\n }),\n);\n\nexport type CodingDeltaInput = DeltaSurfaceRequest;\nexport type CodingDeltaOutput = { result: DeltaSurfaceResponse };\n\nexport const codingDeltaOperation = defineOperation<\n CodingDeltaInput,\n CodingDeltaOutput\n>({\n name: \"coding_delta\",\n description:\n \"Get the session delta (commits + touched files since last seen) for the session's coding namespace (issue #1548 Track A PR 4).\",\n schema: codingDeltaSchema as z.ZodType<CodingDeltaInput>,\n handler: async (input, ctx) => {\n const result = await ctx.service.codingDelta(input, ctx.authenticatedPrincipal);\n return { result };\n },\n});\n\n// ---------------------------------------------------------------------------\n// memory_correct_plan / memory_correct_apply — Correction Contract (#1580)\n// ---------------------------------------------------------------------------\n//\n// One plan/apply pipeline for every memory correction (supersession,\n// invalidation, tombstone, edit, rescope, redaction). The MCP/HTTP/CLI\n// surfaces all dispatch through these two ops so the boundary's validation +\n// error mapping reach every correction path (rule 22 / 39).\n\nconst memoryCorrectPlanSchema = z.preprocess(\n (data) => {\n if (data && typeof data === \"object\" && !Array.isArray(data)) {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(data as Record<string, unknown>)) {\n if (v !== null) out[k] = v;\n }\n return out;\n }\n return data;\n },\n z.object({\n text: z.string().trim().min(1).max(10_000),\n targetIds: z.array(z.string().trim().min(1).max(512)).optional(),\n sessionKey: z.string().trim().max(512).optional(),\n namespace: z.string().trim().max(256).optional(),\n }),\n);\n\nexport interface MemoryCorrectPlanInput {\n text: string;\n targetIds?: string[];\n sessionKey?: string;\n namespace?: string;\n}\n\nexport interface MemoryCorrectPlanOutput {\n readonly result: unknown; // CorrectionPlan — opaque to the boundary\n}\n\nexport const memoryCorrectPlanOperation = defineOperation<\n MemoryCorrectPlanInput,\n MemoryCorrectPlanOutput\n>({\n name: \"memory_correct_plan\",\n description:\n \"Plan a memory correction from a plain-language statement (issue #1580). Returns a CorrectionPlan with a diff preview; apply via memory_correct_apply.\",\n schema: memoryCorrectPlanSchema as z.ZodType<MemoryCorrectPlanInput>,\n handler: async (input, ctx) => {\n try {\n const result = await ctx.service.correctionPlan({\n text: input.text,\n ...(input.targetIds ? { targetIds: input.targetIds } : {}),\n ...(input.sessionKey ? { sessionKey: input.sessionKey } : {}),\n ...(input.namespace ? { namespace: input.namespace } : {}),\n ...(ctx.authenticatedPrincipal ? { principal: ctx.authenticatedPrincipal } : {}),\n });\n return { result };\n } catch (err) {\n if (err instanceof CorrectionContractError) throw new EngramAccessInputError(err.message);\n throw err;\n }\n },\n});\n\nconst memoryCorrectApplySchema = z.preprocess(\n (data) => {\n if (data && typeof data === \"object\" && !Array.isArray(data)) {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(data as Record<string, unknown>)) {\n if (v !== null) out[k] = v;\n }\n return out;\n }\n return data;\n },\n z.object({\n planId: z.string().trim().min(1).max(512),\n confirm: z.boolean().optional(),\n sessionKey: z.string().trim().max(512).optional(),\n namespace: z.string().trim().max(256).optional(),\n }),\n);\n\nexport interface MemoryCorrectApplyInput {\n planId: string;\n confirm?: boolean;\n sessionKey?: string;\n namespace?: string;\n}\n\nexport interface MemoryCorrectApplyOutput {\n readonly result: unknown; // CorrectionOutcome — opaque to the boundary\n}\n\nexport const memoryCorrectApplyOperation = defineOperation<\n MemoryCorrectApplyInput,\n MemoryCorrectApplyOutput\n>({\n name: \"memory_correct_apply\",\n description:\n \"Apply a planned memory correction by planId (issue #1580). Requires confirm: true when correction.applyRequiresConfirm is on (default).\",\n schema: memoryCorrectApplySchema as z.ZodType<MemoryCorrectApplyInput>,\n handler: async (input, ctx) => {\n try {\n const result = await ctx.service.correctionApply(input.planId, {\n confirm: input.confirm === true,\n ...(input.sessionKey ? { sessionKey: input.sessionKey } : {}),\n ...(input.namespace ? { namespace: input.namespace } : {}),\n ...(ctx.authenticatedPrincipal ? { principal: ctx.authenticatedPrincipal } : {}),\n });\n return { result };\n } catch (err) {\n if (err instanceof CorrectionContractError) throw new EngramAccessInputError(err.message);\n throw err;\n }\n },\n});\n\n// ---------------------------------------------------------------------------\n// Surface registration map — what each transport calls the pilot ops\n// ---------------------------------------------------------------------------\n\n/**\n * The canonical short names (no `engram.`/`remnic.` prefix) of the operations\n * the boundary owns today. The fitness test treats this set as the migrated\n * set; everything else on a surface is unmigrated and counted by the ratchet.\n */\nexport const codegraphIndexOperation = defineOperation<\n CodegraphSurfaceRequest,\n { result: CodegraphSurfaceResponse }\n>({\n name: \"codegraph_index\",\n description:\n \"Codegraph parity tool (issue #1554): index. Delegates to the shared codegraph surface handler.\",\n schema: codegraphSurfaceSchema,\n handler: async (input, ctx) => {\n const result = await ctx.service.codegraphTool(input, ctx.authenticatedPrincipal, ctx.sourceConnector);\n return { result };\n },\n});\n\nexport const codegraphListProjectsOperation = defineOperation<\n CodegraphSurfaceRequest,\n { result: CodegraphSurfaceResponse }\n>({\n name: \"codegraph_list_projects\",\n description:\n \"Codegraph parity tool (issue #1554): list_projects. Delegates to the shared codegraph surface handler.\",\n schema: codegraphSurfaceSchema,\n handler: async (input, ctx) => {\n const result = await ctx.service.codegraphTool(input, ctx.authenticatedPrincipal, ctx.sourceConnector);\n return { result };\n },\n});\n\nexport const codegraphDeleteProjectOperation = defineOperation<\n CodegraphSurfaceRequest,\n { result: CodegraphSurfaceResponse }\n>({\n name: \"codegraph_delete_project\",\n description:\n \"Codegraph parity tool (issue #1554): delete_project. Delegates to the shared codegraph surface handler.\",\n schema: codegraphSurfaceSchema,\n handler: async (input, ctx) => {\n const result = await ctx.service.codegraphTool(input, ctx.authenticatedPrincipal, ctx.sourceConnector);\n return { result };\n },\n});\n\nexport const codegraphIndexStatusOperation = defineOperation<\n CodegraphSurfaceRequest,\n { result: CodegraphSurfaceResponse }\n>({\n name: \"codegraph_index_status\",\n description:\n \"Codegraph parity tool (issue #1554): index_status. Delegates to the shared codegraph surface handler.\",\n schema: codegraphSurfaceSchema,\n handler: async (input, ctx) => {\n const result = await ctx.service.codegraphTool(input, ctx.authenticatedPrincipal, ctx.sourceConnector);\n return { result };\n },\n});\n\nexport const codegraphSearchGraphOperation = defineOperation<\n CodegraphSurfaceRequest,\n { result: CodegraphSurfaceResponse }\n>({\n name: \"codegraph_search_graph\",\n description:\n \"Codegraph parity tool (issue #1554): search_graph. Delegates to the shared codegraph surface handler.\",\n schema: codegraphSurfaceSchema,\n handler: async (input, ctx) => {\n const result = await ctx.service.codegraphTool(input, ctx.authenticatedPrincipal, ctx.sourceConnector);\n return { result };\n },\n});\n\nexport const codegraphTracePathOperation = defineOperation<\n CodegraphSurfaceRequest,\n { result: CodegraphSurfaceResponse }\n>({\n name: \"codegraph_trace_path\",\n description:\n \"Codegraph parity tool (issue #1554): trace_path. Delegates to the shared codegraph surface handler.\",\n schema: codegraphSurfaceSchema,\n handler: async (input, ctx) => {\n const result = await ctx.service.codegraphTool(input, ctx.authenticatedPrincipal, ctx.sourceConnector);\n return { result };\n },\n});\n\nexport const codegraphDetectChangesOperation = defineOperation<\n CodegraphSurfaceRequest,\n { result: CodegraphSurfaceResponse }\n>({\n name: \"codegraph_detect_changes\",\n description:\n \"Codegraph parity tool (issue #1554): detect_changes. Delegates to the shared codegraph surface handler.\",\n schema: codegraphSurfaceSchema,\n handler: async (input, ctx) => {\n const result = await ctx.service.codegraphTool(input, ctx.authenticatedPrincipal, ctx.sourceConnector);\n return { result };\n },\n});\n\nexport const codegraphQueryGraphOperation = defineOperation<\n CodegraphSurfaceRequest,\n { result: CodegraphSurfaceResponse }\n>({\n name: \"codegraph_query_graph\",\n description:\n \"Codegraph parity tool (issue #1554): query_graph. Delegates to the shared codegraph surface handler.\",\n schema: codegraphSurfaceSchema,\n handler: async (input, ctx) => {\n const result = await ctx.service.codegraphTool(input, ctx.authenticatedPrincipal, ctx.sourceConnector);\n return { result };\n },\n});\n\nexport const codegraphGetSchemaOperation = defineOperation<\n CodegraphSurfaceRequest,\n { result: CodegraphSurfaceResponse }\n>({\n name: \"codegraph_get_schema\",\n description:\n \"Codegraph parity tool (issue #1554): get_schema. Delegates to the shared codegraph surface handler.\",\n schema: codegraphSurfaceSchema,\n handler: async (input, ctx) => {\n const result = await ctx.service.codegraphTool(input, ctx.authenticatedPrincipal, ctx.sourceConnector);\n return { result };\n },\n});\n\nexport const codegraphGetSnippetOperation = defineOperation<\n CodegraphSurfaceRequest,\n { result: CodegraphSurfaceResponse }\n>({\n name: \"codegraph_get_snippet\",\n description:\n \"Codegraph parity tool (issue #1554): get_snippet. Delegates to the shared codegraph surface handler.\",\n schema: codegraphSurfaceSchema,\n handler: async (input, ctx) => {\n const result = await ctx.service.codegraphTool(input, ctx.authenticatedPrincipal, ctx.sourceConnector);\n return { result };\n },\n});\n\nexport const codegraphGetArchitectureOperation = defineOperation<\n CodegraphSurfaceRequest,\n { result: CodegraphSurfaceResponse }\n>({\n name: \"codegraph_get_architecture\",\n description:\n \"Codegraph parity tool (issue #1554): get_architecture. Delegates to the shared codegraph surface handler.\",\n schema: codegraphSurfaceSchema,\n handler: async (input, ctx) => {\n const result = await ctx.service.codegraphTool(input, ctx.authenticatedPrincipal, ctx.sourceConnector);\n return { result };\n },\n});\n\nexport const codegraphSearchCodeOperation = defineOperation<\n CodegraphSurfaceRequest,\n { result: CodegraphSurfaceResponse }\n>({\n name: \"codegraph_search_code\",\n description:\n \"Codegraph parity tool (issue #1554): search_code. Delegates to the shared codegraph surface handler.\",\n schema: codegraphSurfaceSchema,\n handler: async (input, ctx) => {\n const result = await ctx.service.codegraphTool(input, ctx.authenticatedPrincipal, ctx.sourceConnector);\n return { result };\n },\n});\n\nexport const codegraphManageAdrOperation = defineOperation<\n CodegraphSurfaceRequest,\n { result: CodegraphSurfaceResponse }\n>({\n name: \"codegraph_manage_adr\",\n description:\n \"Codegraph parity tool (issue #1554): manage_adr. Delegates to the shared codegraph surface handler.\",\n schema: codegraphSurfaceSchema,\n handler: async (input, ctx) => {\n const result = await ctx.service.codegraphTool(input, ctx.authenticatedPrincipal, ctx.sourceConnector);\n return { result };\n },\n});\n\nexport const codegraphIngestTracesOperation = defineOperation<\n CodegraphSurfaceRequest,\n { result: CodegraphSurfaceResponse }\n>({\n name: \"codegraph_ingest_traces\",\n description:\n \"Codegraph parity tool (issue #1554): ingest_traces. Delegates to the shared codegraph surface handler.\",\n schema: codegraphSurfaceSchema,\n handler: async (input, ctx) => {\n const result = await ctx.service.codegraphTool(input, ctx.authenticatedPrincipal, ctx.sourceConnector);\n return { result };\n },\n});\n\n// Batch-migrated operations (issue #1525): registers all remaining\n// handlers through the boundary as a side effect of importing this module.\nimport \"./access-operations-batch.js\";\n// Remnic Relay mission evidence operations (issue #1966).\nimport \"./relay/mission-access.js\";\n\nexport const REGISTERED_OPERATIONS = [\n memoryGetOperation.spec.name,\n memorySearchOperation.spec.name,\n memoryStoreOperation.spec.name,\n codingDecisionOperation.spec.name,\n codingArchitectureOperation.spec.name,\n codegraphIndexOperation.spec.name,\n codegraphListProjectsOperation.spec.name,\n codegraphDeleteProjectOperation.spec.name,\n codegraphIndexStatusOperation.spec.name,\n codegraphSearchGraphOperation.spec.name,\n codegraphTracePathOperation.spec.name,\n codegraphDetectChangesOperation.spec.name,\n codegraphQueryGraphOperation.spec.name,\n codegraphGetSchemaOperation.spec.name,\n codegraphGetSnippetOperation.spec.name,\n codegraphGetArchitectureOperation.spec.name,\n codegraphSearchCodeOperation.spec.name,\n codegraphManageAdrOperation.spec.name,\n codegraphIngestTracesOperation.spec.name,\n codingDeltaOperation.spec.name,\n memoryCorrectPlanOperation.spec.name,\n memoryCorrectApplyOperation.spec.name,\n] as const;\n","import { z } from \"zod\";\n\nimport { type OperationContext, defineOperation } from \"../access-boundary.js\";\nimport type { EngramAccessService } from \"../access-service.js\";\nimport {\n RELAY_MISSION_MAX_EVENT_LIMIT,\n RelayIsoDateTimeSchema,\n type RelayMissionAppendResult,\n type RelayMissionEventInput,\n RelayMissionEventInputSchema,\n RelayMissionIdSchema,\n type RelayMissionReadOptions,\n RelayMissionReadOptionsSchema,\n type RelayMissionSnapshot,\n RelayMissionStore,\n} from \"./mission.js\";\n\nconst namespaceSchema = z.string().trim().min(1).max(128).nullable().optional();\n\nconst RelayMissionAppendAccessSchema = z\n .object({\n missionId: RelayMissionIdSchema,\n namespace: namespaceSchema,\n event: RelayMissionEventInputSchema,\n })\n .strict();\n\nconst optionalLimitSchema = z.preprocess((value) => {\n if (value === undefined || value === null) return undefined;\n if (typeof value === \"string\" && /^(?:0|[1-9]\\d*)$/.test(value)) return Number(value);\n return value;\n}, z.number().int().min(1).max(RELAY_MISSION_MAX_EVENT_LIMIT).optional());\n\nconst RelayMissionReadAccessSchema = z\n .object({\n missionId: RelayMissionIdSchema,\n namespace: namespaceSchema,\n since: RelayIsoDateTimeSchema.optional(),\n until: RelayIsoDateTimeSchema.optional(),\n limit: optionalLimitSchema,\n })\n .strict()\n .refine(\n (value) =>\n value.since === undefined || value.until === undefined || Date.parse(value.since) < Date.parse(value.until),\n { message: \"since must be earlier than until\", path: [\"until\"] }\n );\n\nexport interface RelayMissionAppendAccessInput {\n missionId: string;\n namespace?: string | null;\n event: RelayMissionEventInput;\n}\n\nexport interface RelayMissionReadAccessInput extends RelayMissionReadOptions {\n missionId: string;\n namespace?: string | null;\n}\n\nexport interface RelayMissionAppendAccessOutput {\n result: RelayMissionAppendResult;\n}\n\nexport interface RelayMissionReadAccessOutput {\n result: RelayMissionSnapshot;\n}\n\n/**\n * Shared service contract for transports that need to append Relay evidence.\n * Namespace resolution stays in the existing access service so the append\n * inherits the same tenancy and principal rules as every memory write.\n */\nexport async function appendRelayMissionEvent(\n service: EngramAccessService,\n input: RelayMissionAppendAccessInput,\n authenticatedPrincipal?: string,\n beforeAppend?: () => void | Promise<void>\n): Promise<RelayMissionAppendResult> {\n const resolved = await service.getWritableStorageForNamespace(input.namespace ?? undefined, authenticatedPrincipal);\n const store = new RelayMissionStore({\n rootDir: resolved.storage.dir,\n namespace: resolved.namespace,\n });\n return store.append(input.missionId, input.event, { authenticatedPrincipal, beforeAppend });\n}\n\n/** Namespace-authorized, bounded Relay snapshot read shared by HTTP and UI. */\nexport async function readRelayMission(\n service: EngramAccessService,\n input: RelayMissionReadAccessInput,\n authenticatedPrincipal?: string\n): Promise<RelayMissionSnapshot> {\n const resolved = await service.getReadableStorageForNamespace(input.namespace ?? undefined, authenticatedPrincipal);\n const store = new RelayMissionStore({\n rootDir: resolved.storage.dir,\n namespace: resolved.namespace,\n });\n const options = RelayMissionReadOptionsSchema.parse({\n ...(input.since === undefined ? {} : { since: input.since }),\n ...(input.until === undefined ? {} : { until: input.until }),\n ...(input.limit === undefined ? {} : { limit: input.limit }),\n });\n return store.read(input.missionId, options);\n}\n\nexport const relayMissionAppendOperation = defineOperation<\n RelayMissionAppendAccessInput,\n RelayMissionAppendAccessOutput\n>({\n name: \"relay_mission_append\",\n description: \"Append one evidence-backed event to an isolated Relay mission.\",\n schema: RelayMissionAppendAccessSchema as z.ZodType<RelayMissionAppendAccessInput>,\n handler: async (input, ctx: OperationContext) => ({\n result: await appendRelayMissionEvent(ctx.service, input, ctx.authenticatedPrincipal, ctx.hooks?.enforceWriteQuota),\n }),\n});\n\nexport const relayMissionReadOperation = defineOperation<RelayMissionReadAccessInput, RelayMissionReadAccessOutput>({\n name: \"relay_mission_read\",\n description: \"Read one bounded, browser-ready Relay mission receipt.\",\n schema: RelayMissionReadAccessSchema as z.ZodType<RelayMissionReadAccessInput>,\n handler: async (input, ctx: OperationContext) => ({\n result: await readRelayMission(ctx.service, input, ctx.authenticatedPrincipal),\n }),\n});\n","import { createHash, randomUUID } from \"node:crypto\";\nimport { promises as fs, constants as fsConstants } from \"node:fs\";\nimport path from \"node:path\";\nimport { z } from \"zod\";\n\nimport { serializeMutations, withHeldFileLock } from \"../utils/serialize-mutations.js\";\n\nexport const RELAY_MISSION_SCHEMA_VERSION = \"1\" as const;\nexport const RELAY_MISSION_MAX_FILE_BYTES = 4 * 1024 * 1024;\nexport const RELAY_MISSION_MAX_LINE_BYTES = 64 * 1024;\nexport const RELAY_MISSION_MAX_EVENTS = 2_000;\nexport const RELAY_MISSION_DEFAULT_EVENT_LIMIT = 200;\nexport const RELAY_MISSION_MAX_EVENT_LIMIT = 500;\n\nexport const RelayMissionIdSchema = z\n .string()\n .min(1)\n .max(64)\n .regex(/^[a-z0-9]+(?:-[a-z0-9]+)*$/, {\n message: \"must contain only lowercase letters, numbers, and single hyphens\",\n });\n\nconst identifierSchema = z\n .string()\n .min(1)\n .max(128)\n .regex(/^[A-Za-z0-9](?:[A-Za-z0-9._:@-]{0,126}[A-Za-z0-9])?$/, {\n message: \"must be a bounded identifier\",\n });\n\nconst namespaceSchema = z.string().trim().min(1).max(128);\nconst authenticatedPrincipalSchema = z.string().trim().min(1).max(256);\nconst shortTextSchema = z.string().trim().min(1).max(240);\nconst statementSchema = z.string().trim().min(1).max(4_000);\nconst uniqueIdentifierListSchema = (minimum: number, maximum: number) =>\n z\n .array(identifierSchema)\n .min(minimum)\n .max(maximum)\n .refine((values) => new Set(values).size === values.length, \"must not contain duplicate identifiers\");\n\nexport const RelayIsoDateTimeSchema = z\n .string()\n .datetime({ offset: true })\n .refine((value) => Number.isFinite(Date.parse(value)), \"must be a representable timestamp\");\n\nexport const RelayEvidenceRefSchema = z\n .object({\n kind: z.enum([\"memory\", \"recall_audit\", \"source\", \"test\", \"commit\", \"correction\", \"agent_output\", \"approval\"]),\n id: identifierSchema,\n label: shortTextSchema,\n locator: z.string().trim().min(1).max(2_048).optional(),\n capture: z.enum([\"at_action\", \"historical_lookup\", \"fixture\"]),\n })\n .strict();\n\nexport type RelayEvidenceRef = z.infer<typeof RelayEvidenceRefSchema>;\n\nconst evidenceListSchema = z.array(RelayEvidenceRefSchema).max(16);\nconst agentIdentityFields = {\n agentId: identifierSchema,\n sessionId: identifierSchema,\n} as const;\n\nconst RelayMissionPayloadUnionSchema = z.discriminatedUnion(\"kind\", [\n z\n .object({\n kind: z.literal(\"mission_started\"),\n title: shortTextSchema,\n objective: statementSchema,\n runMode: z.enum([\"live\", \"replay\", \"fixture\"]),\n evidence: evidenceListSchema.default([]),\n })\n .strict(),\n z\n .object({\n kind: z.literal(\"agent_status\"),\n ...agentIdentityFields,\n label: shortTextSchema,\n role: shortTextSchema,\n status: z.enum([\"idle\", \"working\", \"blocked\", \"complete\", \"failed\"]),\n detail: statementSchema.optional(),\n evidence: evidenceListSchema.default([]),\n })\n .strict(),\n z\n .object({\n kind: z.literal(\"agent_output\"),\n ...agentIdentityFields,\n outputId: identifierSchema,\n summary: statementSchema,\n evidence: evidenceListSchema.default([]),\n })\n .strict(),\n z\n .object({\n kind: z.literal(\"belief_observed\"),\n ...agentIdentityFields,\n beliefId: identifierSchema,\n decisionId: identifierSchema,\n statement: statementSchema,\n confidence: z.number().finite().min(0).max(1).optional(),\n evidence: evidenceListSchema.default([]),\n })\n .strict(),\n z\n .object({\n kind: z.literal(\"conflict_detected\"),\n conflictId: identifierSchema,\n decisionIds: uniqueIdentifierListSchema(2, 8),\n agentIds: uniqueIdentifierListSchema(2, 16),\n summary: statementSchema,\n evidence: evidenceListSchema.default([]),\n })\n .strict(),\n z\n .object({\n kind: z.literal(\"test_result\"),\n testId: identifierSchema,\n decisionId: identifierSchema,\n correctionId: identifierSchema.optional(),\n command: z.string().trim().min(1).max(1_000),\n status: z.enum([\"passed\", \"failed\", \"error\"]),\n summary: statementSchema,\n durationMs: z.number().int().nonnegative().max(3_600_000).optional(),\n evidence: evidenceListSchema.default([]),\n })\n .strict(),\n z\n .object({\n kind: z.literal(\"correction_proposed\"),\n correctionId: identifierSchema,\n conflictId: identifierSchema,\n proposedDecisionId: identifierSchema,\n supersedesDecisionIds: uniqueIdentifierListSchema(1, 8),\n statement: statementSchema,\n rationale: statementSchema,\n proposedBy: identifierSchema,\n evidence: evidenceListSchema.default([]),\n })\n .strict(),\n z\n .object({\n kind: z.literal(\"correction_approved\"),\n correctionId: identifierSchema,\n approvedBy: z\n .object({\n kind: z.enum([\"human\", \"agent\"]),\n id: identifierSchema,\n label: shortTextSchema,\n })\n .strict(),\n note: statementSchema.optional(),\n evidence: evidenceListSchema.default([]),\n })\n .strict(),\n z\n .object({\n kind: z.literal(\"decision_superseded\"),\n decisionId: identifierSchema,\n replacementDecisionId: identifierSchema,\n correctionId: identifierSchema,\n evidence: evidenceListSchema.default([]),\n })\n .strict(),\n z\n .object({\n kind: z.literal(\"recall_observed\"),\n ...agentIdentityFields,\n recallReceiptId: identifierSchema,\n decisionId: identifierSchema,\n query: statementSchema,\n capturedAtAction: z.boolean(),\n evidence: evidenceListSchema.default([]),\n })\n .strict(),\n z\n .object({\n kind: z.literal(\"propagation_verified\"),\n ...agentIdentityFields,\n correctionId: identifierSchema,\n decisionId: identifierSchema,\n recallReceiptId: identifierSchema,\n staleDecisionAbsent: z.boolean(),\n evidence: evidenceListSchema.default([]),\n })\n .strict(),\n z\n .object({\n kind: z.literal(\"mission_completed\"),\n outcome: z.enum([\"recovered\", \"failed\", \"inconclusive\"]),\n summary: statementSchema,\n evidence: evidenceListSchema.default([]),\n })\n .strict(),\n]);\n\nexport const RelayMissionPayloadSchema = RelayMissionPayloadUnionSchema.superRefine((value, ctx) => {\n if (value.kind === \"decision_superseded\" && value.decisionId === value.replacementDecisionId) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"a decision cannot supersede itself\",\n path: [\"replacementDecisionId\"],\n });\n }\n if (value.kind === \"correction_approved\" && !value.evidence.some((item) => item.kind === \"approval\")) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"correction approval requires approval evidence\",\n path: [\"evidence\"],\n });\n }\n if (\n value.kind === \"decision_superseded\" &&\n !value.evidence.some((item) => item.kind === \"correction\" && item.id === value.correctionId)\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"decision supersession requires matching correction evidence\",\n path: [\"evidence\"],\n });\n }\n if (value.kind !== \"recall_observed\" && value.kind !== \"propagation_verified\") return;\n const matchingRecallEvidence = value.evidence.find(\n (item) => item.kind === \"recall_audit\" && item.id === value.recallReceiptId\n );\n if (!matchingRecallEvidence) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"recall proof requires a matching recall-audit reference\",\n path: [\"evidence\"],\n });\n return;\n }\n if (value.kind === \"recall_observed\") {\n const expectedCapture = value.capturedAtAction ? \"at_action\" : \"historical_lookup\";\n if (matchingRecallEvidence.capture !== expectedCapture && matchingRecallEvidence.capture !== \"fixture\") {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `recall evidence must be labeled ${expectedCapture}`,\n path: [\"evidence\", value.evidence.indexOf(matchingRecallEvidence), \"capture\"],\n });\n }\n }\n});\n\nexport type RelayMissionPayload = z.infer<typeof RelayMissionPayloadSchema>;\n\nexport const RelayMissionEventInputSchema = z\n .object({\n occurredAt: RelayIsoDateTimeSchema.optional(),\n idempotencyKey: identifierSchema.optional(),\n payload: RelayMissionPayloadSchema,\n })\n .strict();\n\nexport type RelayMissionEventInput = z.infer<typeof RelayMissionEventInputSchema>;\n\nexport const RelayMissionEventSchema = z\n .object({\n schemaVersion: z.literal(RELAY_MISSION_SCHEMA_VERSION),\n eventId: identifierSchema,\n missionId: RelayMissionIdSchema,\n namespace: namespaceSchema,\n authenticatedPrincipal: authenticatedPrincipalSchema.optional(),\n recordedAt: RelayIsoDateTimeSchema,\n occurredAt: RelayIsoDateTimeSchema,\n idempotencyKey: identifierSchema.optional(),\n payload: RelayMissionPayloadSchema,\n })\n .strict();\n\nexport type RelayMissionEvent = z.infer<typeof RelayMissionEventSchema>;\n\nexport const RelayMissionReadOptionsSchema = z\n .object({\n since: RelayIsoDateTimeSchema.optional(),\n until: RelayIsoDateTimeSchema.optional(),\n limit: z.number().int().min(1).max(RELAY_MISSION_MAX_EVENT_LIMIT).default(RELAY_MISSION_DEFAULT_EVENT_LIMIT),\n })\n .strict()\n .refine(\n (value) =>\n value.since === undefined || value.until === undefined || Date.parse(value.since) < Date.parse(value.until),\n { message: \"since must be earlier than until\", path: [\"until\"] }\n );\n\nexport type RelayMissionReadOptions = z.input<typeof RelayMissionReadOptionsSchema>;\n\nexport type RelayMissionStatus =\n | \"not_started\"\n | \"active\"\n | \"awaiting_approval\"\n | \"correcting\"\n | \"verified\"\n | \"completed\"\n | \"failed\";\n\nexport interface RelayAgentOutputSnapshot {\n outputId: string;\n summary: string;\n occurredAt: string;\n evidence: RelayEvidenceRef[];\n}\n\nexport interface RelayRecallSnapshot {\n recallReceiptId: string;\n sessionId: string;\n decisionId: string;\n query: string;\n capturedAtAction: boolean;\n coldStart: boolean;\n occurredAt: string;\n evidence: RelayEvidenceRef[];\n}\n\nexport interface RelayAgentSnapshot {\n agentId: string;\n label: string;\n role: string;\n status: \"idle\" | \"working\" | \"blocked\" | \"complete\" | \"failed\";\n sessionIds: string[];\n outputs: RelayAgentOutputSnapshot[];\n recalls: RelayRecallSnapshot[];\n lastSeenAt: string;\n}\n\nexport interface RelayDecisionSnapshot {\n decisionId: string;\n statement: string;\n status: \"active\" | \"superseded\" | \"proposed\";\n heldByAgentIds: string[];\n beliefIds: string[];\n evidence: RelayEvidenceRef[];\n firstObservedAt: string;\n supersededAt?: string;\n supersededBy?: string;\n correctionId?: string;\n}\n\nexport interface RelayConflictSnapshot {\n conflictId: string;\n decisionIds: string[];\n agentIds: string[];\n summary: string;\n status: \"open\" | \"proposed\" | \"resolved\";\n correctionId?: string;\n occurredAt: string;\n evidence: RelayEvidenceRef[];\n}\n\nexport interface RelayCorrectionSnapshot {\n correctionId: string;\n conflictId: string;\n proposedDecisionId: string;\n supersedesDecisionIds: string[];\n statement: string;\n rationale: string;\n proposedBy: string;\n status: \"proposed\" | \"approved\" | \"applied\" | \"propagated\";\n proposedAt: string;\n approvedAt?: string;\n approvedBy?: { kind: \"human\" | \"agent\"; id: string; label: string };\n approvalNote?: string;\n approvalPrincipal?: string;\n appliedAt?: string;\n propagatedAt?: string;\n evidence: RelayEvidenceRef[];\n}\n\nexport interface RelayTestSnapshot {\n testId: string;\n decisionId: string;\n correctionId?: string;\n command: string;\n status: \"passed\" | \"failed\" | \"error\";\n summary: string;\n durationMs?: number;\n occurredAt: string;\n evidence: RelayEvidenceRef[];\n}\n\nexport interface RelayPropagationSnapshot {\n correctionId: string;\n agentId: string;\n sessionId: string;\n decisionId: string;\n recallReceiptId: string;\n staleDecisionAbsent: boolean;\n occurredAt: string;\n evidence: RelayEvidenceRef[];\n}\n\nexport interface RelayMissionSnapshot {\n schemaVersion: typeof RELAY_MISSION_SCHEMA_VERSION;\n missionId: string;\n namespace: string;\n found: boolean;\n readHealth: \"empty\" | \"ok\" | \"partial\";\n status: RelayMissionStatus;\n mission: {\n title: string | null;\n objective: string | null;\n runMode: \"live\" | \"replay\" | \"fixture\" | null;\n startedAt: string | null;\n completedAt: string | null;\n };\n agents: RelayAgentSnapshot[];\n decisions: RelayDecisionSnapshot[];\n conflicts: RelayConflictSnapshot[];\n corrections: RelayCorrectionSnapshot[];\n tests: RelayTestSnapshot[];\n propagation: RelayPropagationSnapshot[];\n outcome: {\n result: \"recovered\" | \"failed\" | \"inconclusive\";\n summary: string;\n occurredAt: string;\n evidence: RelayEvidenceRef[];\n } | null;\n receipt: {\n complete: boolean;\n missingEvidence: string[];\n activeDecisionIds: string[];\n supersededDecisionIds: string[];\n coldStartVerified: boolean;\n passingOutcomeVerified: boolean;\n };\n bounds: {\n totalEvents: number;\n returnedEvents: number;\n corruptLines: number;\n truncated: boolean;\n since: string | null;\n until: string | null;\n };\n events: RelayMissionEvent[];\n}\n\nexport type RelayMissionStoreErrorCode =\n | \"idempotency_conflict\"\n | \"limit_exceeded\"\n | \"lock_unavailable\"\n | \"read_failed\"\n | \"unsafe_path\"\n | \"write_failed\";\n\nexport class RelayMissionStoreError extends Error {\n constructor(\n public readonly code: RelayMissionStoreErrorCode,\n message: string,\n options?: ErrorOptions\n ) {\n super(message, options);\n this.name = \"RelayMissionStoreError\";\n }\n}\n\nexport interface RelayMissionStoreOptions {\n rootDir: string;\n namespace: string;\n now?: () => Date;\n createEventId?: () => string;\n maxFileBytes?: number;\n maxEvents?: number;\n lockMaxWaitMs?: number;\n}\n\ninterface MissionFileRead {\n exists: boolean;\n events: RelayMissionEvent[];\n corruptLines: number;\n rawBytes: number;\n}\n\ninterface PinnedMissionDirectory {\n logicalPath: string;\n accessPath: string;\n handle: import(\"node:fs/promises\").FileHandle;\n}\n\nexport interface RelayMissionAppendResult {\n appended: boolean;\n replayed: boolean;\n event: RelayMissionEvent;\n}\n\nexport class RelayMissionStore {\n private readonly rootDir: string;\n private readonly namespace: string;\n private readonly now: () => Date;\n private readonly createEventId: () => string;\n private readonly maxFileBytes: number;\n private readonly maxEvents: number;\n private readonly lockMaxWaitMs: number;\n\n constructor(options: RelayMissionStoreOptions) {\n if (typeof options.rootDir !== \"string\" || options.rootDir.trim().length === 0) {\n throw new TypeError(\"RelayMissionStore rootDir must be a non-empty string\");\n }\n this.rootDir = path.resolve(options.rootDir);\n this.namespace = namespaceSchema.parse(options.namespace);\n this.now = options.now ?? (() => new Date());\n this.createEventId = options.createEventId ?? (() => `relay-${randomUUID()}`);\n this.maxFileBytes = positiveIntegerOption(options.maxFileBytes, \"maxFileBytes\", RELAY_MISSION_MAX_FILE_BYTES);\n this.maxEvents = positiveIntegerOption(options.maxEvents, \"maxEvents\", RELAY_MISSION_MAX_EVENTS);\n this.lockMaxWaitMs = positiveIntegerOption(options.lockMaxWaitMs, \"lockMaxWaitMs\", 5_000);\n }\n\n async append(\n missionIdValue: string,\n inputValue: RelayMissionEventInput,\n hooks: { authenticatedPrincipal?: string; beforeAppend?: () => void | Promise<void> } = {}\n ): Promise<RelayMissionAppendResult> {\n const missionId = RelayMissionIdSchema.parse(missionIdValue);\n const input = RelayMissionEventInputSchema.parse(inputValue);\n const authenticatedPrincipal =\n hooks.authenticatedPrincipal === undefined\n ? undefined\n : authenticatedPrincipalSchema.parse(hooks.authenticatedPrincipal);\n const missionDir = await this.openMissionDirectory(true);\n const filePath = path.join(missionDir.accessPath, `${missionId}.jsonl`);\n const logicalFilePath = path.join(missionDir.logicalPath, `${missionId}.jsonl`);\n const lockPath = `${filePath}.lock`;\n\n try {\n return await serializeMutations(`relay-mission:${logicalFilePath}`, () =>\n withHeldFileLock(\n lockPath,\n { staleMs: 30_000, maxWaitMs: this.lockMaxWaitMs, heartbeatMs: 10_000 },\n async (acquired) => {\n if (!acquired) {\n throw new RelayMissionStoreError(\"lock_unavailable\", \"could not acquire Relay mission lock\");\n }\n\n const existing = await this.readFile(filePath, missionId);\n if (input.idempotencyKey) {\n const replay = existing.events.find((event) => event.idempotencyKey === input.idempotencyKey);\n if (replay) {\n if (!sameIdempotentInput(replay, input, authenticatedPrincipal)) {\n throw new RelayMissionStoreError(\n \"idempotency_conflict\",\n `idempotency key ${input.idempotencyKey} was already used for different input`\n );\n }\n return { appended: false, replayed: true, event: replay };\n }\n }\n\n if (existing.events.length >= this.maxEvents) {\n throw new RelayMissionStoreError(\n \"limit_exceeded\",\n `mission ${missionId} reached the ${this.maxEvents}-event limit`\n );\n }\n\n // Transport quotas run only after idempotency replay detection and\n // while this mission's mutation lock is held. A response-lost retry\n // remains replayable even when the original append used the final\n // quota slot.\n await hooks.beforeAppend?.();\n\n const recordedAt = validNow(this.now);\n const event = RelayMissionEventSchema.parse({\n schemaVersion: RELAY_MISSION_SCHEMA_VERSION,\n eventId: this.createEventId(),\n missionId,\n namespace: this.namespace,\n ...(authenticatedPrincipal === undefined ? {} : { authenticatedPrincipal }),\n recordedAt,\n occurredAt: input.occurredAt ?? recordedAt,\n ...(input.idempotencyKey ? { idempotencyKey: input.idempotencyKey } : {}),\n payload: input.payload,\n });\n const line = `${JSON.stringify(event)}\\n`;\n const lineBytes = Buffer.byteLength(line, \"utf8\");\n if (lineBytes > RELAY_MISSION_MAX_LINE_BYTES) {\n throw new RelayMissionStoreError(\n \"limit_exceeded\",\n `Relay mission event exceeds ${RELAY_MISSION_MAX_LINE_BYTES} bytes`\n );\n }\n if (existing.rawBytes + lineBytes > this.maxFileBytes) {\n throw new RelayMissionStoreError(\n \"limit_exceeded\",\n `mission ${missionId} would exceed the ${this.maxFileBytes}-byte limit`\n );\n }\n\n await this.appendFile(filePath, line);\n return { appended: true, replayed: false, event };\n }\n )\n );\n } finally {\n await missionDir.handle.close().catch(() => undefined);\n }\n }\n\n async read(missionIdValue: string, readOptions: RelayMissionReadOptions = {}): Promise<RelayMissionSnapshot> {\n const missionId = RelayMissionIdSchema.parse(missionIdValue);\n const options = RelayMissionReadOptionsSchema.parse(readOptions);\n const missionDir = await this.openMissionDirectory(false);\n if (missionDir === null) {\n return reduceRelayMission({\n missionId,\n namespace: this.namespace,\n events: [],\n fileExists: false,\n options,\n });\n }\n const filePath = path.join(missionDir.accessPath, `${missionId}.jsonl`);\n const logicalFilePath = path.join(missionDir.logicalPath, `${missionId}.jsonl`);\n\n try {\n // Coordinate with writers in this process without creating a lock file.\n // Cross-process appends are single bounded O_APPEND records; a torn or\n // malformed record remains explicit partial evidence rather than being\n // silently accepted.\n return await serializeMutations(`relay-mission:${logicalFilePath}`, async () => {\n const read = await this.readFile(filePath, missionId);\n return reduceRelayMission({\n missionId,\n namespace: this.namespace,\n events: read.events,\n corruptLines: read.corruptLines,\n fileExists: read.exists,\n options,\n });\n });\n } finally {\n await missionDir.handle.close().catch(() => undefined);\n }\n }\n\n private async openMissionDirectory(create: true): Promise<PinnedMissionDirectory>;\n private async openMissionDirectory(create: false): Promise<PinnedMissionDirectory | null>;\n private async openMissionDirectory(create: boolean): Promise<PinnedMissionDirectory | null> {\n let currentHandle: import(\"node:fs/promises\").FileHandle | undefined;\n try {\n currentHandle = await openVerifiedDirectory(this.rootDir, \"Relay root must be a real directory\");\n let logicalPath = this.rootDir;\n for (const segment of [\"state\", \"relay\", \"missions\"]) {\n let childHandle: import(\"node:fs/promises\").FileHandle;\n try {\n childHandle = create\n ? await openOrCreatePinnedChildDirectory(currentHandle, segment)\n : await openVerifiedDirectory(\n path.join(pinnedDirectoryPath(currentHandle), segment),\n \"Relay directory symlinks are rejected\"\n );\n } catch (error) {\n if (!create && (error as NodeJS.ErrnoException).code === \"ENOENT\") {\n await currentHandle.close();\n return null;\n }\n throw error;\n }\n await currentHandle.close();\n currentHandle = childHandle;\n logicalPath = path.join(logicalPath, segment);\n }\n return {\n logicalPath,\n accessPath: pinnedDirectoryPath(currentHandle),\n handle: currentHandle,\n };\n } catch (error) {\n await currentHandle?.close().catch(() => undefined);\n if (error instanceof RelayMissionStoreError) throw error;\n throw new RelayMissionStoreError(\"unsafe_path\", \"Relay mission directory is unavailable or unsafe\", {\n cause: error,\n });\n }\n }\n\n private async readFile(filePath: string, missionId: string): Promise<MissionFileRead> {\n let handle: import(\"node:fs/promises\").FileHandle | undefined;\n try {\n handle = await fs.open(filePath, fsConstants.O_RDONLY | fsConstants.O_NOFOLLOW);\n const info = await handle.stat();\n if (!info.isFile()) {\n throw new RelayMissionStoreError(\"unsafe_path\", \"Relay mission path is not a file\");\n }\n if (info.nlink !== 1) {\n throw new RelayMissionStoreError(\"unsafe_path\", \"Relay mission hard links are rejected\");\n }\n if (info.size > this.maxFileBytes) {\n throw new RelayMissionStoreError(\n \"limit_exceeded\",\n `mission ${missionId} exceeds the ${this.maxFileBytes}-byte read limit`\n );\n }\n const raw = await handle.readFile(\"utf8\");\n const parsed = parseMissionJsonl(raw, missionId, this.namespace, this.maxEvents);\n return { exists: true, rawBytes: Buffer.byteLength(raw, \"utf8\"), ...parsed };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return { exists: false, events: [], corruptLines: 0, rawBytes: 0 };\n }\n if (error instanceof RelayMissionStoreError) throw error;\n throw new RelayMissionStoreError(\"read_failed\", \"failed to read Relay mission\", {\n cause: error,\n });\n } finally {\n await handle?.close().catch(() => undefined);\n }\n }\n\n private async appendFile(filePath: string, line: string): Promise<void> {\n let handle: import(\"node:fs/promises\").FileHandle | undefined;\n try {\n handle = await fs.open(\n filePath,\n fsConstants.O_WRONLY | fsConstants.O_CREAT | fsConstants.O_APPEND | fsConstants.O_NOFOLLOW,\n 0o600\n );\n const info = await handle.stat();\n if (!info.isFile()) {\n throw new RelayMissionStoreError(\"unsafe_path\", \"Relay mission path is not a file\");\n }\n if (info.nlink !== 1) {\n throw new RelayMissionStoreError(\"unsafe_path\", \"Relay mission hard links are rejected\");\n }\n await handle.chmod(0o600);\n await handle.writeFile(line, \"utf8\");\n await handle.sync();\n } catch (error) {\n if (error instanceof RelayMissionStoreError) throw error;\n if ((error as NodeJS.ErrnoException).code === \"ELOOP\") {\n throw new RelayMissionStoreError(\"unsafe_path\", \"Relay mission symlink is rejected\", {\n cause: error,\n });\n }\n throw new RelayMissionStoreError(\"write_failed\", \"failed to append Relay mission\", {\n cause: error,\n });\n } finally {\n await handle?.close().catch(() => undefined);\n }\n }\n}\n\ninterface ReduceRelayMissionInput {\n missionId: string;\n namespace: string;\n events: RelayMissionEvent[];\n corruptLines?: number;\n fileExists?: boolean;\n options?: RelayMissionReadOptions;\n}\n\nexport function reduceRelayMission(input: ReduceRelayMissionInput): RelayMissionSnapshot {\n const missionId = RelayMissionIdSchema.parse(input.missionId);\n const namespace = namespaceSchema.parse(input.namespace);\n const options = RelayMissionReadOptionsSchema.parse(input.options ?? {});\n const corruptLines = input.corruptLines ?? 0;\n const sinceMs = options.since ? Date.parse(options.since) : undefined;\n const untilMs = options.until ? Date.parse(options.until) : undefined;\n const appendPositions = new Map(input.events.map((event, index) => [event, index] as const));\n const orderedEvents = [...input.events].sort(compareRelayEvents);\n const firstStartEvent = input.events.find((event) => event.payload.kind === \"mission_started\");\n const firstCompletionEvent = input.events.find((event) => event.payload.kind === \"mission_completed\");\n const firstStartPosition = firstStartEvent === undefined ? -1 : (appendPositions.get(firstStartEvent) ?? -1);\n const firstCompletionPosition =\n firstCompletionEvent === undefined ? -1 : (appendPositions.get(firstCompletionEvent) ?? -1);\n const filteredEvents = orderedEvents.filter((event) => {\n const occurredAt = Date.parse(event.occurredAt);\n return (sinceMs === undefined || occurredAt >= sinceMs) && (untilMs === undefined || occurredAt < untilMs);\n });\n\n const agents = new Map<string, RelayAgentSnapshot>();\n const decisions = new Map<string, RelayDecisionSnapshot>();\n const conflicts = new Map<string, RelayConflictSnapshot>();\n const corrections = new Map<string, RelayCorrectionSnapshot>();\n const tests: RelayTestSnapshot[] = [];\n const propagation: RelayPropagationSnapshot[] = [];\n const beliefAppendPositions = new Map<string, number>();\n const conflictAppendPositions = new Map<string, number>();\n const correctionProposalAppendPositions = new Map<string, number>();\n const correctionApprovalAppendPositions = new Map<string, number>();\n const correctionAppliedAppendPositions = new Map<string, number>();\n const recallAppendPositions = new Map<RelayRecallSnapshot, number>();\n const propagationAppendPositions = new Map<RelayPropagationSnapshot, number>();\n const testAppendPositions = new Map<RelayTestSnapshot, number>();\n const missingEvidence = new Set<string>();\n if (corruptLines > 0) missingEvidence.add(\"mission:corrupt-events\");\n const substantiveAgentIds = new Set<string>();\n const substantiveSessionIds = new Set<string>();\n const conflictDisagreementIds = new Set<string>();\n const groundedCorrectionIds = new Set<string>();\n let title: string | null = null;\n let objective: string | null = null;\n let runMode: \"live\" | \"replay\" | \"fixture\" | null = null;\n let startedAt: string | null = null;\n let completedAt: string | null = null;\n let status: RelayMissionStatus = \"not_started\";\n let outcome: RelayMissionSnapshot[\"outcome\"] = null;\n\n const ensureAgent = (agentId: string, sessionId: string, occurredAt: string): RelayAgentSnapshot => {\n const existing = agents.get(agentId);\n if (existing) {\n if (!existing.sessionIds.includes(sessionId)) existing.sessionIds.push(sessionId);\n existing.lastSeenAt = occurredAt;\n return existing;\n }\n const created: RelayAgentSnapshot = {\n agentId,\n label: agentId,\n role: \"Codex agent\",\n status: \"working\",\n sessionIds: [sessionId],\n outputs: [],\n recalls: [],\n lastSeenAt: occurredAt,\n };\n agents.set(agentId, created);\n return created;\n };\n\n const markSubstantiveParticipation = (agentId: string, sessionId?: string): void => {\n substantiveAgentIds.add(agentId);\n if (sessionId) substantiveSessionIds.add(sessionId);\n };\n\n for (const event of orderedEvents) {\n const payload = event.payload;\n const appendPosition = appendPositions.get(event) ?? -1;\n if (\n payload.kind !== \"mission_started\" &&\n firstStartEvent !== undefined &&\n (appendPosition < firstStartPosition || compareRelayEvents(event, firstStartEvent) < 0)\n ) {\n missingEvidence.add(`mission:event-before-start:${event.eventId}`);\n collectMissingEvidence(missingEvidence, event, payload.evidence);\n continue;\n }\n if (\n payload.kind !== \"mission_completed\" &&\n (outcome !== null || (firstCompletionPosition >= 0 && appendPosition > firstCompletionPosition))\n ) {\n missingEvidence.add(`mission:event-after-completion:${event.eventId}`);\n if (payload.kind === \"mission_started\") missingEvidence.add(\"mission:lifecycle-order\");\n collectMissingEvidence(missingEvidence, event, payload.evidence);\n continue;\n }\n switch (payload.kind) {\n case \"mission_started\":\n if (startedAt !== null) {\n missingEvidence.add(\"mission:duplicate-start\");\n collectMissingEvidence(missingEvidence, event, payload.evidence);\n break;\n }\n title = payload.title;\n objective = payload.objective;\n runMode = payload.runMode;\n startedAt = event.occurredAt;\n if (outcome === null) status = \"active\";\n collectMissingEvidence(missingEvidence, event, payload.evidence);\n break;\n case \"agent_status\": {\n const agent = ensureAgent(payload.agentId, payload.sessionId, event.occurredAt);\n markSubstantiveParticipation(payload.agentId, payload.sessionId);\n agent.label = payload.label;\n agent.role = payload.role;\n agent.status = payload.status;\n collectMissingEvidence(missingEvidence, event, payload.evidence);\n break;\n }\n case \"agent_output\": {\n const agent = ensureAgent(payload.agentId, payload.sessionId, event.occurredAt);\n markSubstantiveParticipation(payload.agentId, payload.sessionId);\n agent.outputs.push({\n outputId: payload.outputId,\n summary: payload.summary,\n occurredAt: event.occurredAt,\n evidence: payload.evidence,\n });\n collectMissingEvidence(missingEvidence, event, payload.evidence);\n break;\n }\n case \"belief_observed\": {\n ensureAgent(payload.agentId, payload.sessionId, event.occurredAt);\n markSubstantiveParticipation(payload.agentId, payload.sessionId);\n recordEarliestAppendPosition(\n beliefAppendPositions,\n beliefAppendPositionKey(payload.agentId, payload.decisionId),\n appendPosition\n );\n const existing = decisions.get(payload.decisionId);\n if (existing) {\n if (!decisionStatementsMatch(existing.statement, payload.statement)) {\n missingEvidence.add(`decision:${payload.decisionId}:statement-consistency`);\n }\n if (!existing.heldByAgentIds.includes(payload.agentId)) {\n existing.heldByAgentIds.push(payload.agentId);\n }\n if (!existing.beliefIds.includes(payload.beliefId)) existing.beliefIds.push(payload.beliefId);\n existing.evidence.push(...payload.evidence);\n } else {\n decisions.set(payload.decisionId, {\n decisionId: payload.decisionId,\n statement: payload.statement,\n status: \"active\",\n heldByAgentIds: [payload.agentId],\n beliefIds: [payload.beliefId],\n evidence: [...payload.evidence],\n firstObservedAt: event.occurredAt,\n });\n }\n collectMissingEvidence(missingEvidence, event, payload.evidence);\n break;\n }\n case \"conflict_detected\": {\n recordEarliestAppendPosition(conflictAppendPositions, payload.conflictId, appendPosition);\n const normalizedDecisionStatements = payload.decisionIds\n .map((decisionId) => decisions.get(decisionId)?.statement)\n .filter((statement): statement is string => statement !== undefined)\n .map(normalizeDecisionStatement);\n if (\n normalizedDecisionStatements.length !== payload.decisionIds.length ||\n new Set(normalizedDecisionStatements).size < 2\n ) {\n missingEvidence.add(`conflict:${payload.conflictId}:distinct-decision-statements`);\n } else {\n conflictDisagreementIds.add(payload.conflictId);\n }\n const participantHoldings = payload.agentIds.map((agentId) => ({\n agentId,\n decisionIds: uniqueSorted(\n payload.decisionIds.filter((decisionId) => decisions.get(decisionId)?.heldByAgentIds.includes(agentId))\n ),\n }));\n for (const participant of participantHoldings) {\n if (participant.decisionIds.length === 0) {\n missingEvidence.add(`conflict:${payload.conflictId}:participant:${participant.agentId}:decision-link`);\n }\n }\n for (const decisionId of payload.decisionIds) {\n if (!participantHoldings.some((participant) => participant.decisionIds.includes(decisionId))) {\n missingEvidence.add(`conflict:${payload.conflictId}:decision:${decisionId}:participant-link`);\n }\n if (\n !payload.agentIds.some(\n (agentId) =>\n (beliefAppendPositions.get(beliefAppendPositionKey(agentId, decisionId)) ?? Number.POSITIVE_INFINITY) <\n appendPosition\n )\n ) {\n missingEvidence.add(`conflict:${payload.conflictId}:decision:${decisionId}:append-order`);\n }\n }\n for (const agentId of payload.agentIds) {\n if (\n !payload.decisionIds.some(\n (decisionId) =>\n (beliefAppendPositions.get(beliefAppendPositionKey(agentId, decisionId)) ?? Number.POSITIVE_INFINITY) <\n appendPosition\n )\n ) {\n missingEvidence.add(`conflict:${payload.conflictId}:participant:${agentId}:append-order`);\n }\n }\n if (\n participantHoldings.every((participant) => participant.decisionIds.length > 0) &&\n new Set(participantHoldings.map((participant) => participant.decisionIds.join(\"\\0\"))).size < 2\n ) {\n missingEvidence.add(`conflict:${payload.conflictId}:distinct-participant-beliefs`);\n }\n if (conflicts.has(payload.conflictId)) {\n missingEvidence.add(`conflict:${payload.conflictId}:duplicate`);\n } else {\n conflicts.set(payload.conflictId, {\n conflictId: payload.conflictId,\n decisionIds: uniqueSorted(payload.decisionIds),\n agentIds: uniqueSorted(payload.agentIds),\n summary: payload.summary,\n status: \"open\",\n occurredAt: event.occurredAt,\n evidence: payload.evidence,\n });\n }\n for (const agentId of payload.agentIds) substantiveAgentIds.add(agentId);\n collectMissingEvidence(missingEvidence, event, payload.evidence);\n break;\n }\n case \"test_result\": {\n const testSnapshot: RelayTestSnapshot = {\n testId: payload.testId,\n decisionId: payload.decisionId,\n ...(payload.correctionId === undefined ? {} : { correctionId: payload.correctionId }),\n command: payload.command,\n status: payload.status,\n summary: payload.summary,\n ...(payload.durationMs === undefined ? {} : { durationMs: payload.durationMs }),\n occurredAt: event.occurredAt,\n evidence: payload.evidence,\n };\n tests.push(testSnapshot);\n testAppendPositions.set(testSnapshot, appendPosition);\n collectMissingEvidence(missingEvidence, event, payload.evidence);\n break;\n }\n case \"correction_proposed\": {\n if (corrections.has(payload.correctionId)) {\n missingEvidence.add(`correction:${payload.correctionId}:duplicate-proposal`);\n collectMissingEvidence(missingEvidence, event, payload.evidence);\n break;\n }\n substantiveAgentIds.add(payload.proposedBy);\n const correction: RelayCorrectionSnapshot = {\n correctionId: payload.correctionId,\n conflictId: payload.conflictId,\n proposedDecisionId: payload.proposedDecisionId,\n supersedesDecisionIds: uniqueSorted(payload.supersedesDecisionIds),\n statement: payload.statement,\n rationale: payload.rationale,\n proposedBy: payload.proposedBy,\n status: \"proposed\",\n proposedAt: event.occurredAt,\n evidence: [...payload.evidence],\n };\n corrections.set(payload.correctionId, correction);\n correctionProposalAppendPositions.set(payload.correctionId, appendPosition);\n const existingProposedDecision = decisions.get(payload.proposedDecisionId);\n const replacementStatementMatches =\n existingProposedDecision === undefined ||\n decisionStatementsMatch(existingProposedDecision.statement, payload.statement);\n if (!replacementStatementMatches) {\n missingEvidence.add(`correction:${payload.correctionId}:replacement-statement`);\n }\n if (existingProposedDecision === undefined) {\n decisions.set(payload.proposedDecisionId, {\n decisionId: payload.proposedDecisionId,\n statement: payload.statement,\n status: \"proposed\",\n heldByAgentIds: [],\n beliefIds: [],\n evidence: [...payload.evidence],\n firstObservedAt: event.occurredAt,\n });\n }\n const conflict = conflicts.get(payload.conflictId);\n const conflictAppendPosition = conflictAppendPositions.get(payload.conflictId);\n const conflictPredatesProposal =\n conflictAppendPosition !== undefined && conflictAppendPosition < appendPosition;\n if (!conflictPredatesProposal) {\n missingEvidence.add(`correction:${payload.correctionId}:conflict-append-order`);\n }\n const correctionSourceIds = sourceEvidenceIds(payload.evidence);\n if (correctionSourceIds.size === 0) {\n missingEvidence.add(`correction:${payload.correctionId}:source`);\n }\n if (conflict) {\n const conflictSourceIds = sourceEvidenceIds(conflict.evidence);\n if (conflictSourceIds.size === 0) {\n missingEvidence.add(`conflict:${payload.conflictId}:source`);\n }\n const sourceLinked = [...correctionSourceIds].some((sourceId) => conflictSourceIds.has(sourceId));\n if (!sourceLinked) {\n missingEvidence.add(`correction:${payload.correctionId}:source-link`);\n }\n if (!correctionCoversConflict(correction, conflict)) {\n missingEvidence.add(`conflict:${payload.conflictId}:decision-link`);\n } else if (\n sourceLinked &&\n conflictPredatesProposal &&\n conflictDisagreementIds.has(payload.conflictId) &&\n replacementStatementMatches\n ) {\n groundedCorrectionIds.add(payload.correctionId);\n conflict.status = \"proposed\";\n conflict.correctionId = payload.correctionId;\n }\n } else {\n missingEvidence.add(`conflict:${payload.conflictId}:observation`);\n }\n status = \"awaiting_approval\";\n collectMissingEvidence(missingEvidence, event, payload.evidence);\n break;\n }\n case \"correction_approved\": {\n if (payload.approvedBy.kind === \"agent\") substantiveAgentIds.add(payload.approvedBy.id);\n const correction = corrections.get(payload.correctionId);\n if (correction) {\n const proposalAppendPosition = correctionProposalAppendPositions.get(payload.correctionId);\n const proposalPredatesApproval =\n proposalAppendPosition !== undefined && proposalAppendPosition < appendPosition;\n const authenticatedHumanApproval =\n payload.approvedBy.kind !== \"human\" ||\n runMode !== \"live\" ||\n event.authenticatedPrincipal === payload.approvedBy.id;\n if (!proposalPredatesApproval) {\n missingEvidence.add(`correction:${payload.correctionId}:approval-append-order`);\n } else if (!authenticatedHumanApproval) {\n missingEvidence.add(`correction:${payload.correctionId}:authenticated-human-approval`);\n } else if (correction.approvedAt === undefined) {\n correction.approvedAt = event.occurredAt;\n correction.approvedBy = payload.approvedBy;\n correction.approvalNote = payload.note;\n if (event.authenticatedPrincipal !== undefined) {\n correction.approvalPrincipal = event.authenticatedPrincipal;\n }\n correctionApprovalAppendPositions.set(payload.correctionId, appendPosition);\n if (correction.status === \"proposed\") correction.status = \"approved\";\n status = \"correcting\";\n } else {\n missingEvidence.add(`correction:${payload.correctionId}:duplicate-approval`);\n }\n correction.evidence.push(...payload.evidence);\n } else {\n missingEvidence.add(`correction:${payload.correctionId}:proposal`);\n }\n collectMissingEvidence(missingEvidence, event, payload.evidence);\n break;\n }\n case \"decision_superseded\": {\n const correction = corrections.get(payload.correctionId);\n if (!correction) {\n missingEvidence.add(`correction:${payload.correctionId}:proposal`);\n collectMissingEvidence(missingEvidence, event, payload.evidence);\n break;\n }\n if (correction.approvedAt === undefined || correction.approvedBy === undefined) {\n missingEvidence.add(`correction:${payload.correctionId}:approval`);\n collectMissingEvidence(missingEvidence, event, payload.evidence);\n break;\n }\n const approvalAppendPosition = correctionApprovalAppendPositions.get(payload.correctionId);\n if (approvalAppendPosition === undefined || approvalAppendPosition >= appendPosition) {\n missingEvidence.add(`correction:${payload.correctionId}:approval-append-order`);\n collectMissingEvidence(missingEvidence, event, payload.evidence);\n break;\n }\n const conflict = conflicts.get(correction.conflictId);\n if (!conflict || !correctionCoversConflict(correction, conflict)) {\n missingEvidence.add(`conflict:${correction.conflictId}:decision-link`);\n collectMissingEvidence(missingEvidence, event, payload.evidence);\n break;\n }\n if (!groundedCorrectionIds.has(payload.correctionId)) {\n missingEvidence.add(`correction:${payload.correctionId}:source-link`);\n collectMissingEvidence(missingEvidence, event, payload.evidence);\n break;\n }\n if (\n !correction.supersedesDecisionIds.includes(payload.decisionId) ||\n correction.proposedDecisionId !== payload.replacementDecisionId\n ) {\n missingEvidence.add(`correction:${payload.correctionId}:supersession-link`);\n collectMissingEvidence(missingEvidence, event, payload.evidence);\n break;\n }\n\n const stale = decisions.get(payload.decisionId);\n const replacement = decisions.get(payload.replacementDecisionId);\n if (!stale) missingEvidence.add(`decision:${payload.decisionId}:observation`);\n if (!replacement) missingEvidence.add(`decision:${payload.replacementDecisionId}:replacement`);\n if (!stale || !replacement) {\n collectMissingEvidence(missingEvidence, event, payload.evidence);\n break;\n }\n\n stale.status = \"superseded\";\n stale.supersededAt = event.occurredAt;\n stale.supersededBy = payload.replacementDecisionId;\n stale.correctionId = payload.correctionId;\n stale.evidence.push(...payload.evidence);\n replacement.status = \"active\";\n replacement.evidence.push(...payload.evidence);\n correction.evidence.push(...payload.evidence);\n if (correctionSupersessionComplete(correction, decisions)) {\n correction.appliedAt ??= event.occurredAt;\n recordEarliestAppendPosition(correctionAppliedAppendPositions, payload.correctionId, appendPosition);\n if (correction.status !== \"propagated\") correction.status = \"applied\";\n conflict.status = \"resolved\";\n }\n collectMissingEvidence(missingEvidence, event, payload.evidence);\n break;\n }\n case \"recall_observed\": {\n const agent = ensureAgent(payload.agentId, payload.sessionId, event.occurredAt);\n const coldStart =\n !substantiveAgentIds.has(payload.agentId) &&\n !substantiveSessionIds.has(payload.sessionId) &&\n agent.recalls.length === 0;\n const recallSnapshot: RelayRecallSnapshot = {\n recallReceiptId: payload.recallReceiptId,\n sessionId: payload.sessionId,\n decisionId: payload.decisionId,\n query: payload.query,\n capturedAtAction: payload.capturedAtAction,\n coldStart,\n occurredAt: event.occurredAt,\n evidence: payload.evidence,\n };\n agent.recalls.push(recallSnapshot);\n recallAppendPositions.set(recallSnapshot, appendPosition);\n markSubstantiveParticipation(payload.agentId, payload.sessionId);\n const decision = decisions.get(payload.decisionId);\n if (decision && !decision.heldByAgentIds.includes(payload.agentId)) {\n decision.heldByAgentIds.push(payload.agentId);\n }\n if (!decision) missingEvidence.add(`decision:${payload.decisionId}:recall-target`);\n collectMissingEvidence(missingEvidence, event, payload.evidence);\n break;\n }\n case \"propagation_verified\": {\n const agent = ensureAgent(payload.agentId, payload.sessionId, event.occurredAt);\n const correction = corrections.get(payload.correctionId);\n if (!correction) {\n missingEvidence.add(`correction:${payload.correctionId}:proposal`);\n collectMissingEvidence(missingEvidence, event, payload.evidence);\n break;\n }\n if (correction.approvedAt === undefined || correction.approvedBy === undefined) {\n missingEvidence.add(`correction:${payload.correctionId}:approval`);\n collectMissingEvidence(missingEvidence, event, payload.evidence);\n break;\n }\n if (\n (correction.status !== \"applied\" && correction.status !== \"propagated\") ||\n correction.appliedAt === undefined ||\n correction.proposedDecisionId !== payload.decisionId\n ) {\n missingEvidence.add(`correction:${payload.correctionId}:supersession`);\n collectMissingEvidence(missingEvidence, event, payload.evidence);\n break;\n }\n const recalled = agent.recalls.find(\n (recall) =>\n recall.recallReceiptId === payload.recallReceiptId &&\n recall.sessionId === payload.sessionId &&\n recall.decisionId === payload.decisionId\n );\n if (!recalled) {\n missingEvidence.add(`recall:${payload.recallReceiptId}:observation`);\n collectMissingEvidence(missingEvidence, event, payload.evidence);\n break;\n }\n const appliedAppendPosition = correctionAppliedAppendPositions.get(payload.correctionId);\n const recallAppendPosition = recallAppendPositions.get(recalled);\n if (\n appliedAppendPosition === undefined ||\n recallAppendPosition === undefined ||\n appliedAppendPosition >= recallAppendPosition\n ) {\n missingEvidence.add(`recall:${payload.recallReceiptId}:post-application-append-order`);\n collectMissingEvidence(missingEvidence, event, payload.evidence);\n break;\n }\n if (recallAppendPosition >= appendPosition) {\n missingEvidence.add(`recall:${payload.recallReceiptId}:propagation-append-order`);\n collectMissingEvidence(missingEvidence, event, payload.evidence);\n break;\n }\n if (!recalled.capturedAtAction) {\n missingEvidence.add(`recall:${payload.recallReceiptId}:at-action`);\n collectMissingEvidence(missingEvidence, event, payload.evidence);\n break;\n }\n if (!recalled.coldStart) {\n missingEvidence.add(`recall:${payload.recallReceiptId}:cold-start`);\n collectMissingEvidence(missingEvidence, event, payload.evidence);\n break;\n }\n if (compareInstants(correction.appliedAt, recalled.occurredAt) >= 0) {\n missingEvidence.add(`recall:${payload.recallReceiptId}:post-application`);\n collectMissingEvidence(missingEvidence, event, payload.evidence);\n break;\n }\n if (compareInstants(recalled.occurredAt, event.occurredAt) >= 0) {\n missingEvidence.add(`recall:${payload.recallReceiptId}:propagation-order`);\n collectMissingEvidence(missingEvidence, event, payload.evidence);\n break;\n }\n\n const propagationSnapshot: RelayPropagationSnapshot = {\n correctionId: payload.correctionId,\n agentId: payload.agentId,\n sessionId: payload.sessionId,\n decisionId: payload.decisionId,\n recallReceiptId: payload.recallReceiptId,\n staleDecisionAbsent: payload.staleDecisionAbsent,\n occurredAt: event.occurredAt,\n evidence: payload.evidence,\n };\n propagation.push(propagationSnapshot);\n propagationAppendPositions.set(propagationSnapshot, appendPosition);\n correction.evidence.push(...payload.evidence);\n if (payload.staleDecisionAbsent) {\n correction.status = \"propagated\";\n correction.propagatedAt = event.occurredAt;\n }\n status = payload.staleDecisionAbsent ? \"verified\" : \"correcting\";\n collectMissingEvidence(missingEvidence, event, payload.evidence);\n break;\n }\n case \"mission_completed\":\n if (outcome !== null) {\n missingEvidence.add(\"mission:duplicate-completion\");\n collectMissingEvidence(missingEvidence, event, payload.evidence);\n break;\n }\n if (startedAt === null) missingEvidence.add(\"mission:start\");\n outcome = {\n result: payload.outcome,\n summary: payload.summary,\n occurredAt: event.occurredAt,\n evidence: payload.evidence,\n };\n completedAt = event.occurredAt;\n status = payload.outcome === \"failed\" ? \"failed\" : \"completed\";\n collectMissingEvidence(missingEvidence, event, payload.evidence);\n break;\n }\n }\n\n for (const conflict of conflicts.values()) {\n if (sourceEvidenceIds(conflict.evidence).size === 0) {\n missingEvidence.add(`conflict:${conflict.conflictId}:source`);\n }\n for (const decisionId of conflict.decisionIds) {\n if (!decisions.has(decisionId)) missingEvidence.add(`decision:${decisionId}:conflict-target`);\n }\n for (const agentId of conflict.agentIds) {\n if (!agents.has(agentId)) missingEvidence.add(`agent:${agentId}:conflict-participant`);\n }\n }\n for (const correction of corrections.values()) {\n if (sourceEvidenceIds(correction.evidence).size === 0) {\n missingEvidence.add(`correction:${correction.correctionId}:source`);\n }\n if (correction.approvedAt === undefined || correction.approvedBy === undefined) {\n missingEvidence.add(`correction:${correction.correctionId}:approval`);\n } else if (correction.approvedBy.kind !== \"human\") {\n missingEvidence.add(`correction:${correction.correctionId}:human-approval`);\n } else if (runMode === \"live\" && correction.approvalPrincipal !== correction.approvedBy.id) {\n missingEvidence.add(`correction:${correction.correctionId}:authenticated-human-approval`);\n }\n if (correction.status === \"approved\" || correction.status === \"proposed\") {\n missingEvidence.add(`correction:${correction.correctionId}:supersession`);\n }\n if (correction.status === \"applied\") {\n missingEvidence.add(`correction:${correction.correctionId}:propagation`);\n }\n }\n\n const liveFixtureEvidenceEventIds =\n runMode === \"live\"\n ? orderedEvents\n .filter((event) => event.payload.evidence.some((item) => item.capture === \"fixture\"))\n .map((event) => event.eventId)\n : [];\n for (const eventId of liveFixtureEvidenceEventIds) {\n missingEvidence.add(`mission:live-fixture-evidence:${eventId}`);\n }\n const captureTrustValid = liveFixtureEvidenceEventIds.length === 0;\n\n const sortedDecisions = [...decisions.values()]\n .map((decision) => ({\n ...decision,\n heldByAgentIds: uniqueSorted(decision.heldByAgentIds),\n beliefIds: uniqueSorted(decision.beliefIds),\n evidence: uniqueEvidence(decision.evidence),\n }))\n .sort((a, b) => compareText(a.decisionId, b.decisionId));\n const coldStartVerified = captureTrustValid && propagation.some((item) => item.staleDecisionAbsent);\n const passingOutcomeVerified =\n captureTrustValid &&\n outcome?.result === \"recovered\" &&\n tests.some((test) => {\n const testAppendPosition = testAppendPositions.get(test);\n if (\n test.status !== \"passed\" ||\n test.correctionId === undefined ||\n testAppendPosition === undefined ||\n firstCompletionPosition < 0 ||\n testAppendPosition >= firstCompletionPosition ||\n compareInstants(test.occurredAt, outcome.occurredAt) >= 0\n ) {\n return false;\n }\n const correction = corrections.get(test.correctionId);\n if (\n correction?.status !== \"propagated\" ||\n correction.proposedDecisionId !== test.decisionId ||\n !test.evidence.some((item) => item.kind === \"correction\" && item.id === correction.correctionId) ||\n !test.evidence.some((item) => item.kind === \"test\")\n ) {\n return false;\n }\n return propagation.some((item) => {\n const propagationAppendPosition = propagationAppendPositions.get(item);\n return (\n item.staleDecisionAbsent &&\n item.correctionId === correction.correctionId &&\n item.decisionId === test.decisionId &&\n propagationAppendPosition !== undefined &&\n propagationAppendPosition < testAppendPosition &&\n compareInstants(item.occurredAt, test.occurredAt) < 0\n );\n });\n });\n if (outcome && !passingOutcomeVerified) missingEvidence.add(\"outcome:passing-test\");\n if (outcome?.result === \"recovered\" && !coldStartVerified) {\n missingEvidence.add(\"outcome:cold-start-propagation\");\n }\n if (input.events.length > 0 && startedAt === null) missingEvidence.add(\"mission:start\");\n if (startedAt !== null && completedAt !== null && compareInstants(startedAt, completedAt) >= 0) {\n missingEvidence.add(\"mission:lifecycle-order\");\n }\n if (\n firstStartEvent !== undefined &&\n firstCompletionEvent !== undefined &&\n (firstStartPosition >= firstCompletionPosition || compareRelayEvents(firstStartEvent, firstCompletionEvent) >= 0)\n ) {\n missingEvidence.add(\"mission:lifecycle-order\");\n }\n\n const eventWindow = filteredEvents.slice(Math.max(0, filteredEvents.length - options.limit));\n // `found` describes whether the mission has any valid persisted evidence,\n // not whether the caller's optional time window happened to select an\n // event. A known mission with an empty [since, until) window is distinct\n // from a mission that has never existed.\n const found = input.events.length > 0;\n return {\n schemaVersion: RELAY_MISSION_SCHEMA_VERSION,\n missionId,\n namespace,\n found,\n readHealth: corruptLines > 0 ? \"partial\" : found || input.fileExists ? \"ok\" : \"empty\",\n status,\n mission: { title, objective, runMode, startedAt, completedAt },\n agents: [...agents.values()]\n .map((agent) => ({\n ...agent,\n sessionIds: uniqueSorted(agent.sessionIds),\n outputs: agent.outputs.sort((a, b) => compareTimedIds(a, b, \"outputId\")),\n recalls: agent.recalls.sort((a, b) => compareTimedIds(a, b, \"recallReceiptId\")),\n }))\n .sort((a, b) => compareText(a.agentId, b.agentId)),\n decisions: sortedDecisions,\n conflicts: [...conflicts.values()].sort((a, b) => compareText(a.conflictId, b.conflictId)),\n corrections: [...corrections.values()]\n .map((correction) => ({ ...correction, evidence: uniqueEvidence(correction.evidence) }))\n .sort((a, b) => compareText(a.correctionId, b.correctionId)),\n tests: tests.sort((a, b) => compareTimedIds(a, b, \"testId\")),\n propagation: propagation.sort((a, b) => {\n const byTime = compareInstants(a.occurredAt, b.occurredAt);\n if (byTime !== 0) return byTime;\n const byAgent = compareText(a.agentId, b.agentId);\n return byAgent !== 0 ? byAgent : compareText(a.recallReceiptId, b.recallReceiptId);\n }),\n outcome,\n receipt: {\n complete:\n status === \"completed\" &&\n outcome?.result === \"recovered\" &&\n passingOutcomeVerified &&\n coldStartVerified &&\n missingEvidence.size === 0,\n missingEvidence: [...missingEvidence].sort(compareText),\n activeDecisionIds: sortedDecisions\n .filter((decision) => decision.status === \"active\")\n .map((decision) => decision.decisionId),\n supersededDecisionIds: sortedDecisions\n .filter((decision) => decision.status === \"superseded\")\n .map((decision) => decision.decisionId),\n coldStartVerified,\n passingOutcomeVerified,\n },\n bounds: {\n totalEvents: filteredEvents.length,\n returnedEvents: eventWindow.length,\n corruptLines,\n truncated: filteredEvents.length > eventWindow.length,\n since: options.since ?? null,\n until: options.until ?? null,\n },\n events: eventWindow,\n };\n}\n\nexport function compareRelayEvents(a: RelayMissionEvent, b: RelayMissionEvent): number {\n const byOccurrence = compareInstants(a.occurredAt, b.occurredAt);\n if (byOccurrence !== 0) return byOccurrence;\n const byRecord = compareInstants(a.recordedAt, b.recordedAt);\n if (byRecord !== 0) return byRecord;\n return compareText(a.eventId, b.eventId);\n}\n\nfunction parseMissionJsonl(\n raw: string,\n missionId: string,\n namespace: string,\n maxEvents: number\n): Pick<MissionFileRead, \"events\" | \"corruptLines\"> {\n const events: RelayMissionEvent[] = [];\n let corruptLines = 0;\n for (const line of raw.split(\"\\n\")) {\n if (line.trim().length === 0) continue;\n if (Buffer.byteLength(line, \"utf8\") > RELAY_MISSION_MAX_LINE_BYTES) {\n corruptLines += 1;\n continue;\n }\n let candidate: unknown;\n try {\n candidate = JSON.parse(line);\n } catch {\n corruptLines += 1;\n continue;\n }\n const parsed = RelayMissionEventSchema.safeParse(candidate);\n if (!parsed.success || parsed.data.missionId !== missionId || parsed.data.namespace !== namespace) {\n corruptLines += 1;\n continue;\n }\n if (events.length >= maxEvents) {\n throw new RelayMissionStoreError(\n \"limit_exceeded\",\n `mission ${missionId} exceeds the ${maxEvents}-event read limit`\n );\n }\n events.push(parsed.data);\n }\n return { events, corruptLines };\n}\n\nfunction collectMissingEvidence(missing: Set<string>, event: RelayMissionEvent, evidence: RelayEvidenceRef[]): void {\n if (evidence.length === 0) missing.add(`event:${event.eventId}:evidence`);\n}\n\nfunction sameIdempotentInput(\n event: RelayMissionEvent,\n input: z.infer<typeof RelayMissionEventInputSchema>,\n authenticatedPrincipal: string | undefined\n): boolean {\n if (event.authenticatedPrincipal !== authenticatedPrincipal) return false;\n if (input.occurredAt !== undefined && event.occurredAt !== input.occurredAt) return false;\n return stableJson(event.payload) === stableJson(input.payload);\n}\n\nfunction stableJson(value: unknown): string {\n if (Array.isArray(value)) return `[${value.map(stableJson).join(\",\")}]`;\n if (value && typeof value === \"object\") {\n const entries = Object.entries(value as Record<string, unknown>)\n .sort(([a], [b]) => compareText(a, b))\n .map(([key, child]) => `${JSON.stringify(key)}:${stableJson(child)}`);\n return `{${entries.join(\",\")}}`;\n }\n return JSON.stringify(value) ?? \"null\";\n}\n\nfunction uniqueEvidence(evidence: RelayEvidenceRef[]): RelayEvidenceRef[] {\n const byKey = new Map<string, RelayEvidenceRef>();\n for (const item of evidence) byKey.set(`${item.kind}\\0${item.id}`, item);\n return [...byKey.values()].sort((a, b) => {\n const byKind = compareText(a.kind, b.kind);\n return byKind !== 0 ? byKind : compareText(a.id, b.id);\n });\n}\n\nfunction uniqueSorted(values: string[]): string[] {\n return [...new Set(values)].sort(compareText);\n}\n\nfunction compareText(a: string, b: string): number {\n if (a < b) return -1;\n if (a > b) return 1;\n return 0;\n}\n\nfunction compareInstants(a: string, b: string): number {\n const aMs = Date.parse(a);\n const bMs = Date.parse(b);\n if (aMs < bMs) return -1;\n if (aMs > bMs) return 1;\n return 0;\n}\n\nfunction compareTimedIds<T extends { occurredAt: string }, K extends keyof T>(a: T, b: T, idKey: K): number {\n const byTime = compareInstants(a.occurredAt, b.occurredAt);\n if (byTime !== 0) return byTime;\n return compareText(String(a[idKey]), String(b[idKey]));\n}\n\nfunction beliefAppendPositionKey(agentId: string, decisionId: string): string {\n return `${agentId}\\0${decisionId}`;\n}\n\nfunction normalizeDecisionStatement(statement: string): string {\n return statement\n .normalize(\"NFKC\")\n .trim()\n .toLowerCase()\n .replace(/\\s+/g, \" \")\n .replace(/[.!?]+$/, \"\");\n}\n\nfunction decisionStatementsMatch(left: string, right: string): boolean {\n return normalizeDecisionStatement(left) === normalizeDecisionStatement(right);\n}\n\nfunction recordEarliestAppendPosition(positions: Map<string, number>, key: string, position: number): void {\n const current = positions.get(key);\n if (current === undefined || position < current) positions.set(key, position);\n}\n\nfunction correctionSupersessionComplete(\n correction: RelayCorrectionSnapshot,\n decisions: ReadonlyMap<string, RelayDecisionSnapshot>\n): boolean {\n return correction.supersedesDecisionIds.every((decisionId) => {\n const decision = decisions.get(decisionId);\n return (\n decision?.status === \"superseded\" &&\n decision.supersededBy === correction.proposedDecisionId &&\n decision.correctionId === correction.correctionId\n );\n });\n}\n\nfunction correctionCoversConflict(\n correction: Pick<RelayCorrectionSnapshot, \"proposedDecisionId\" | \"supersedesDecisionIds\">,\n conflict: Pick<RelayConflictSnapshot, \"decisionIds\">\n): boolean {\n const expectedSuperseded = uniqueSorted(\n conflict.decisionIds.filter((decisionId) => decisionId !== correction.proposedDecisionId)\n );\n const declaredSuperseded = uniqueSorted(correction.supersedesDecisionIds);\n return (\n expectedSuperseded.length === declaredSuperseded.length &&\n expectedSuperseded.every((decisionId, index) => decisionId === declaredSuperseded[index])\n );\n}\n\nfunction sourceEvidenceIds(evidence: readonly RelayEvidenceRef[]): Set<string> {\n return new Set(evidence.filter((item) => item.kind === \"source\").map((item) => item.id));\n}\n\nfunction positiveIntegerOption(value: number | undefined, name: string, fallback: number): number {\n if (value === undefined) return fallback;\n if (!Number.isInteger(value) || value <= 0) {\n throw new TypeError(`RelayMissionStore ${name} must be a positive integer`);\n }\n return value;\n}\n\nfunction validNow(now: () => Date): string {\n const value = now();\n if (!(value instanceof Date) || !Number.isFinite(value.getTime())) {\n throw new TypeError(\"RelayMissionStore now() must return a valid Date\");\n }\n return value.toISOString();\n}\n\nasync function openOrCreatePinnedChildDirectory(\n parentHandle: import(\"node:fs/promises\").FileHandle,\n segment: string\n): Promise<import(\"node:fs/promises\").FileHandle> {\n const directory = path.join(pinnedDirectoryPath(parentHandle), segment);\n try {\n await fs.mkdir(directory, { mode: 0o700 });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"EEXIST\") throw error;\n }\n return openVerifiedDirectory(directory, \"Relay directory symlinks are rejected\");\n}\n\nasync function openVerifiedDirectory(\n directory: string,\n unsafeMessage: string\n): Promise<import(\"node:fs/promises\").FileHandle> {\n const before = await fs.lstat(directory);\n if (before.isSymbolicLink() || !before.isDirectory()) {\n throw new RelayMissionStoreError(\"unsafe_path\", unsafeMessage);\n }\n const handle = await fs.open(directory, fsConstants.O_RDONLY | fsConstants.O_DIRECTORY | fsConstants.O_NOFOLLOW);\n try {\n const openInfo = await handle.stat();\n const after = await fs.lstat(directory);\n if (\n after.isSymbolicLink() ||\n !after.isDirectory() ||\n before.dev !== openInfo.dev ||\n before.ino !== openInfo.ino ||\n after.dev !== openInfo.dev ||\n after.ino !== openInfo.ino\n ) {\n throw new RelayMissionStoreError(\"unsafe_path\", \"Relay directory changed during validation\");\n }\n return handle;\n } catch (error) {\n await handle.close().catch(() => undefined);\n throw error;\n }\n}\n\nfunction pinnedDirectoryPath(handle: import(\"node:fs/promises\").FileHandle): string {\n if (process.platform === \"linux\") return `/proc/self/fd/${handle.fd}`;\n if (process.platform === \"darwin\" || process.platform === \"freebsd\" || process.platform === \"openbsd\") {\n return `/dev/fd/${handle.fd}`;\n }\n throw new RelayMissionStoreError(\n \"unsafe_path\",\n `Relay pinned directory access is unsupported on ${process.platform}`\n );\n}\n\nexport function relayMissionReceiptDigest(snapshot: RelayMissionSnapshot): string {\n const receipt = {\n schemaVersion: snapshot.schemaVersion,\n missionId: snapshot.missionId,\n namespace: snapshot.namespace,\n status: snapshot.status,\n decisions: snapshot.decisions,\n corrections: snapshot.corrections,\n propagation: snapshot.propagation,\n tests: snapshot.tests,\n outcome: snapshot.outcome,\n receipt: snapshot.receipt,\n };\n return createHash(\"sha256\").update(stableJson(receipt)).digest(\"hex\");\n}\n"],"mappings":"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","names":["z","z","event","namespaceSchema","z","z"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/local-llm.ts"],"sourcesContent":["import { log } from \"./logger.js\";\nimport type { PluginConfig } from \"./types.js\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport type { ModelRegistry } from \"./model-registry.js\";\nimport { launchProcessSync } from \"./runtime/child-process.js\";\nimport { mergeEnv, readEnvVar } from \"./runtime/env.js\";\nimport { resolveLocalLlmCapabilities } from \"./capabilities.js\";\nimport { resolvePipelineProcessingCapabilities } from \"./capabilities.js\";\n\n/** Trim trailing slash characters without backtracking regex. */\nfunction trimTrailingSlashes(s: string): string {\n let end = s.length;\n while (end > 0 && s[end - 1] === \"/\") end--;\n return s.substring(0, end);\n}\n\nfunction stripTrailingV1Path(s: string): string {\n return s.endsWith(\"/v1\") ? s.slice(0, -3) : s;\n}\n\nfunction explicitPortFromUrl(s: string): number | null {\n try {\n const parsed = new URL(s);\n if (!parsed.port) return null;\n const port = Number(parsed.port);\n return Number.isInteger(port) ? port : null;\n } catch {\n return null;\n }\n}\n\nfunction isObjectRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nfunction isLlamaCppPropsResponse(value: unknown): boolean {\n return (\n isObjectRecord(value) &&\n isObjectRecord(value.default_generation_settings) &&\n typeof value.total_slots === \"number\" &&\n (\n typeof value.model_path === \"string\" ||\n typeof value.chat_template === \"string\" ||\n typeof value.build_info === \"string\"\n )\n );\n}\n\nfunction isLlamaCppModelsResponse(value: unknown): boolean {\n if (!isObjectRecord(value) || !Array.isArray(value.data)) {\n return false;\n }\n return value.data.some((entry) => {\n if (!isObjectRecord(entry)) return false;\n if (entry.owned_by === \"llamacpp\") return true;\n if (typeof entry.id === \"string\" && entry.id.endsWith(\".gguf\")) return true;\n const meta = entry.meta;\n return (\n isObjectRecord(meta) &&\n (\"n_ctx_train\" in meta || \"n_params\" in meta || \"vocab_type\" in meta)\n );\n });\n}\n\nfunction isLmStudioApiV1ModelsResponse(value: unknown): boolean {\n if (!isObjectRecord(value) || !Array.isArray(value.models)) {\n return false;\n }\n return value.models.some((entry) => {\n if (!isObjectRecord(entry)) return false;\n return (\n typeof entry.key === \"string\" &&\n typeof entry.display_name === \"string\" &&\n (\n typeof entry.format === \"string\" ||\n typeof entry.max_context_length === \"number\" ||\n Array.isArray(entry.loaded_instances)\n )\n );\n });\n}\n\nfunction isLmStudioApiV0ModelsResponse(value: unknown): boolean {\n if (!isObjectRecord(value) || !Array.isArray(value.data)) {\n return false;\n }\n return value.data.some((entry) => {\n if (!isObjectRecord(entry)) return false;\n return (\n typeof entry.id === \"string\" &&\n typeof entry.publisher === \"string\" &&\n (\n typeof entry.compatibility_type === \"string\" ||\n typeof entry.max_context_length === \"number\" ||\n typeof entry.state === \"string\"\n )\n );\n });\n}\n\nfunction isLmStudioNativeModelsResponse(value: unknown): boolean {\n return isLmStudioApiV1ModelsResponse(value) || isLmStudioApiV0ModelsResponse(value);\n}\n\n/**\n * Local LLM client for OpenAI-compatible endpoints (LM Studio, Ollama, MLX, etc.)\n *\n * Based on openclaw-tactician's provider detection patterns for consistency.\n * Provides privacy-preserving, cost-effective LLM operations with\n * graceful fallback to cloud providers when local LLM is unavailable.\n */\nexport type LocalLlmType = \"lmstudio\" | \"ollama\" | \"mlx\" | \"vllm\" | \"llamacpp\" | \"generic\";\n\n/**\n * Backends known to honor `chat_template_kwargs: { enable_thinking: false }`\n * on OpenAI-compatible `/v1/chat/completions`. LM Studio, vLLM, and\n * llama.cpp forward this field to the jinja chat template, where thinking-capable\n * models (Qwen 3.5, Gemma 4, DeepSeek) suppress reasoning tokens.\n *\n * Strict OpenAI-compatible backends (standard OpenAI, Azure OpenAI, some\n * proxies) reject unknown request fields with 400 — which trips the\n * `localLlm400*` cooldown path. `LocalLlmClient` therefore only injects\n * the kwarg when the detected backend is in this set; unknown / `generic`\n * / `ollama` / `mlx` fail open (no injection, no 400 risk). Issue #548.\n */\nconst THINKING_COMPATIBLE_BACKENDS: ReadonlySet<LocalLlmType> = new Set([\n \"lmstudio\",\n \"vllm\",\n \"llamacpp\",\n]);\n\nconst THINKING_SUPPRESSED_OPERATIONS: ReadonlySet<string> = new Set([\n \"extraction\",\n \"extraction-judge\",\n \"extraction-faithfulness\",\n \"contradiction-judge\",\n \"contradiction_verification\",\n \"link_suggestion\",\n \"memory_summarization\",\n \"proactive_extraction\",\n \"lcm-summarize\",\n \"day_summary\",\n \"hourly_summary\",\n \"hourly_summary_extended\",\n]);\n\ninterface LocalServerConfig {\n type: LocalLlmType;\n defaultPort: number;\n healthEndpoint: string;\n modelsEndpoint: string;\n detectFn: (response: unknown) => boolean;\n}\n\nconst LOCAL_SERVERS: LocalServerConfig[] = [\n {\n type: \"ollama\",\n defaultPort: 11434,\n healthEndpoint: \"/\",\n modelsEndpoint: \"/api/tags\",\n detectFn: (resp) => typeof resp === \"string\" && resp.includes(\"Ollama\"),\n },\n {\n type: \"llamacpp\",\n defaultPort: 8080,\n healthEndpoint: \"/health\",\n modelsEndpoint: \"/v1/models\",\n detectFn: (resp) => isObjectRecord(resp) && resp.status === \"ok\",\n },\n {\n type: \"mlx\",\n defaultPort: 8080,\n healthEndpoint: \"/v1/models\",\n modelsEndpoint: \"/v1/models\",\n detectFn: (resp) => isObjectRecord(resp) && Array.isArray(resp.data),\n },\n {\n type: \"lmstudio\",\n defaultPort: 1234,\n healthEndpoint: \"/v1/models\",\n modelsEndpoint: \"/v1/models\",\n detectFn: (resp) => isObjectRecord(resp) && Array.isArray(resp.data),\n },\n {\n type: \"vllm\",\n defaultPort: 8000,\n healthEndpoint: \"/health\",\n modelsEndpoint: \"/v1/models\",\n detectFn: (resp) => resp === \"\" || (isObjectRecord(resp) && !(\"status\" in resp)),\n },\n];\n\nfunction orderedLocalServers(configuredBaseUrl: string): LocalServerConfig[] {\n const configuredPort = explicitPortFromUrl(configuredBaseUrl);\n if (configuredPort === null) return LOCAL_SERVERS;\n const matching = LOCAL_SERVERS.filter(\n (serverConfig) => serverConfig.defaultPort === configuredPort,\n );\n if (matching.length === 0) return LOCAL_SERVERS;\n const matchingTypes = new Set(matching.map((serverConfig) => serverConfig.type));\n return [\n ...matching,\n ...LOCAL_SERVERS.filter((serverConfig) => !matchingTypes.has(serverConfig.type)),\n ];\n}\n\nexport interface LocalModelInfo {\n id: string;\n contextWindow?: number;\n maxTokens?: number;\n}\n\nexport type LocalLlmRequestPriority = \"recall-critical\" | \"background\";\n\ninterface LocalLlmChatCompletionOptions {\n temperature?: number;\n maxTokens?: number;\n responseFormat?: { type: string };\n timeoutMs?: number;\n operation?: string;\n forceDisableThinking?: boolean;\n priority?: LocalLlmRequestPriority;\n}\n\ninterface LocalLlmQueuedRequest {\n messages: Array<{ role: string; content: string }>;\n options: LocalLlmChatCompletionOptions;\n priority: LocalLlmRequestPriority;\n enqueuedAtMs: number;\n resolve: (value: LocalLlmChatCompletionResult | null) => void;\n}\n\ninterface LocalLlmChatCompletionResult {\n content: string;\n usage?: { promptTokens: number; completionTokens: number; totalTokens: number };\n}\n\nconst LOCAL_LLM_GLOBAL_BACKEND_STATE = \"__openclawEngramLocalLlmBackendState\";\n\ntype LocalLlmBackendState = {\n untilMs: number;\n reason: string;\n};\nexport class LocalLlmClient {\n private config: PluginConfig;\n private isAvailable: boolean | null = null;\n private lastHealthCheck: number = 0;\n private detectedType: LocalLlmType | null = null;\n private cachedModelInfo: LocalModelInfo | null = null;\n private cachedLmsContext: number | null = null;\n private lastLmsCheck: number = 0;\n private consecutive400s: number = 0;\n private cooldownUntilMs: number = 0;\n private modelRegistry?: ModelRegistry;\n private _disableThinking: boolean = false;\n private readonly requestQueues: Record<LocalLlmRequestPriority, LocalLlmQueuedRequest[]> = {\n \"recall-critical\": [],\n background: [],\n };\n private readonly queueProcessing = new Set<LocalLlmRequestPriority>();\n private queueDrainScheduled: boolean = false;\n private static readonly HEALTH_CHECK_INTERVAL_MS = 60000; // 1 minute\n private static readonly LMS_CACHE_INTERVAL_MS = 30000; // 30 seconds\n\n constructor(config: PluginConfig, modelRegistry?: ModelRegistry) {\n this.config = config;\n this.modelRegistry = modelRegistry;\n }\n\n /**\n * Request thinking/reasoning suppression on the next chat completion.\n *\n * When `true`, the client will inject\n * `chat_template_kwargs: { enable_thinking: false }` into the request\n * body — **but only when the detected backend is known to support it**\n * (LM Studio, vLLM; see `THINKING_COMPATIBLE_BACKENDS`). Strict\n * OpenAI-compat backends reject unknown fields with 400; on those the\n * client fails open (thinking runs normally). This is the safe\n * default for Remnic extraction-style operations: measurable latency\n * win on thinking-capable backends, zero risk on others. Consolidation\n * operations keep thinking enabled unless explicitly added to\n * `THINKING_SUPPRESSED_OPERATIONS`. Issues #548 and #979.\n */\n set disableThinking(value: boolean) {\n this._disableThinking = value;\n }\n\n private resolveHomeDir(): string {\n return this.config.localLlmHomeDir || readEnvVar(\"HOME\") || os.homedir();\n }\n\n private buildRequestHeaders(base: Record<string, string> = {}): Record<string, string> {\n const headers: Record<string, string> = {\n ...base,\n ...(this.config.localLlmHeaders ?? {}),\n };\n if (this.config.localLlmApiKey && this.config.localLlmAuthHeader !== false) {\n headers.Authorization = `Bearer ${this.config.localLlmApiKey}`;\n }\n return headers;\n }\n\n private isAbortError(err: unknown): boolean {\n if (!err || typeof err !== \"object\") return false;\n const maybe = err as { name?: string; message?: string };\n return (\n maybe.name === \"AbortError\" ||\n maybe.message === \"This operation was aborted\" ||\n maybe.message === \"The operation was aborted\"\n );\n }\n\n /**\n * Set the ModelRegistry for caching detected capabilities\n */\n setModelRegistry(registry: ModelRegistry): void {\n this.modelRegistry = registry;\n }\n\n /**\n * Get the detected server type (null if not detected)\n */\n getDetectedType(): LocalLlmType | null {\n return this.detectedType;\n }\n\n private getBackendKey(): string {\n return trimTrailingSlashes(\n this.config.localLlmUrl.replace(\"localhost\", \"127.0.0.1\"),\n ).replace(/\\/v1$/, \"\");\n }\n\n private getGlobalBackendState(): Map<string, LocalLlmBackendState> {\n const globalAny = globalThis as typeof globalThis & {\n [LOCAL_LLM_GLOBAL_BACKEND_STATE]?: Map<string, LocalLlmBackendState>;\n };\n if (!globalAny[LOCAL_LLM_GLOBAL_BACKEND_STATE]) {\n globalAny[LOCAL_LLM_GLOBAL_BACKEND_STATE] = new Map();\n }\n return globalAny[LOCAL_LLM_GLOBAL_BACKEND_STATE];\n }\n\n private getTrippedBackendState(now: number): LocalLlmBackendState | null {\n const state = this.getGlobalBackendState().get(this.getBackendKey()) ?? null;\n if (!state) return null;\n if (state.untilMs <= now) {\n this.getGlobalBackendState().delete(this.getBackendKey());\n this.lastHealthCheck = 0;\n return null;\n }\n return state;\n }\n\n private markBackendUnavailable(reason: string, durationMs: number): void {\n const normalizedReason = this.normalizeBackendTripReason(reason);\n if (durationMs > 0) {\n const untilMs = Date.now() + durationMs;\n this.getGlobalBackendState().set(this.getBackendKey(), { untilMs, reason: normalizedReason });\n } else {\n this.getGlobalBackendState().delete(this.getBackendKey());\n }\n this.isAvailable = false;\n this.lastHealthCheck = 0;\n log.warn(\n `local LLM backend unavailable for ${durationMs}ms: model=${this.config.localLlmModel} reason=${normalizedReason}`,\n );\n }\n\n private extractNonRecoverableBackendReason(reason: string): string | null {\n const match = reason.match(\n /Failed to load model|Library not loaded|different Team IDs|code signature|llm_engine_mlx_amphibian/i,\n );\n return match?.[0] ?? null;\n }\n\n private extractNonRecoverableBackendReasonFromErrorText(errorText: string): string | null {\n const directReason = this.extractNonRecoverableBackendReason(errorText);\n if (directReason) return directReason;\n try {\n const parsed = JSON.parse(errorText) as { error?: { message?: string } };\n return this.extractNonRecoverableBackendReason(parsed?.error?.message ?? \"\");\n } catch {\n return null;\n }\n }\n\n private normalizeBackendTripReason(reason: string): string {\n const cleaned = reason.replace(/\\s+/g, \" \").replace(/^[-:–—\\s]+/, \"\").trim();\n if (!cleaned) return \"unknown local backend failure\";\n return cleaned.length > 160 ? `${cleaned.slice(0, 157)}...` : cleaned;\n }\n\n /**\n * Fetch with timeout for health checks\n */\n private async fetchWithTimeout(\n url: string,\n timeoutMs: number = 2000,\n headers?: Record<string, string>,\n ): Promise<{ ok: boolean; data: unknown; status: number | null }> {\n const controller = new AbortController();\n const timeout = setTimeout(() => controller.abort(), timeoutMs);\n\n try {\n const response = await fetch(url, {\n signal: controller.signal,\n headers: this.buildRequestHeaders({ Accept: \"application/json\", ...(headers ?? {}) }),\n });\n clearTimeout(timeout);\n\n if (!response.ok) {\n return { ok: false, data: null, status: response.status };\n }\n\n const contentType = response.headers.get(\"content-type\");\n if (contentType?.includes(\"application/json\")) {\n return { ok: true, data: await response.json(), status: response.status };\n } else {\n return { ok: true, data: await response.text(), status: response.status };\n }\n } catch (err) {\n clearTimeout(timeout);\n return { ok: false, data: null, status: null };\n }\n }\n\n private async probeLmStudioNativeModels(\n probeBaseUrl: string,\n ): Promise<{ matched: boolean; unauthorized: boolean }> {\n let unauthorized = false;\n for (const endpoint of [\"/api/v1/models\", \"/api/v0/models\"]) {\n const probe = await this.fetchWithTimeout(`${probeBaseUrl}${endpoint}`);\n if (probe.ok && isLmStudioNativeModelsResponse(probe.data)) {\n return { matched: true, unauthorized };\n }\n if (probe.status === 401 || probe.status === 403) {\n unauthorized = true;\n }\n }\n return { matched: false, unauthorized };\n }\n\n /**\n * Check if local LLM is available\n * Uses 127.0.0.1 instead of localhost to avoid DNS issues (consistent with tactician)\n */\n async checkAvailability(): Promise<boolean> {\n // Cache health check results for 1 minute\n const now = Date.now();\n const trippedState = this.getTrippedBackendState(now);\n if (trippedState) {\n this.isAvailable = false;\n this.lastHealthCheck = 0;\n log.info(\n `local LLM availability: backend circuit open for ${Math.max(0, trippedState.untilMs - now)}ms (${trippedState.reason})`,\n );\n return false;\n }\n if (this.isAvailable !== null && now - this.lastHealthCheck < LocalLlmClient.HEALTH_CHECK_INTERVAL_MS) {\n return this.isAvailable;\n }\n\n // Normalize URL - replace localhost with 127.0.0.1, remove trailing slashes.\n // Probe server-native endpoints from the server root even when users configure\n // the OpenAI-compatible `/v1` base URL for chat completions.\n const configuredBaseUrl = trimTrailingSlashes(\n this.config.localLlmUrl.replace(\"localhost\", \"127.0.0.1\"),\n );\n const probeBaseUrl = stripTrailingV1Path(configuredBaseUrl);\n let sawUnauthorizedProbe = false;\n\n // Try to detect which server type is running\n for (const serverConfig of orderedLocalServers(configuredBaseUrl)) {\n const healthUrl = `${probeBaseUrl}${serverConfig.healthEndpoint}`;\n log.debug(`checking ${serverConfig.type} at ${healthUrl}`);\n\n const result = await this.fetchWithTimeout(healthUrl);\n if (result.ok && serverConfig.detectFn(result.data)) {\n if (serverConfig.type === \"mlx\") {\n const lmStudioProbe = await this.probeLmStudioNativeModels(probeBaseUrl);\n if (lmStudioProbe.unauthorized) {\n sawUnauthorizedProbe = true;\n }\n if (lmStudioProbe.matched) {\n this.isAvailable = true;\n this.detectedType = \"lmstudio\";\n this.lastHealthCheck = now;\n log.info(`detected lmstudio at ${configuredBaseUrl}`);\n return true;\n }\n }\n if (serverConfig.type === \"llamacpp\") {\n let sawLlamaCppSignal = false;\n const propsProbe = await this.fetchWithTimeout(`${probeBaseUrl}/props`);\n if (propsProbe.ok && isLlamaCppPropsResponse(propsProbe.data)) {\n sawLlamaCppSignal = true;\n }\n if (propsProbe.status === 401 || propsProbe.status === 403) {\n sawUnauthorizedProbe = true;\n }\n\n const modelsUrl = `${probeBaseUrl}${serverConfig.modelsEndpoint}`;\n const modelsProbe = await this.fetchWithTimeout(modelsUrl);\n if (modelsProbe.ok && isLlamaCppModelsResponse(modelsProbe.data)) {\n sawLlamaCppSignal = true;\n }\n if (modelsProbe.status === 401 || modelsProbe.status === 403) {\n sawUnauthorizedProbe = true;\n continue;\n }\n\n const authConfigured =\n Boolean(this.config.localLlmApiKey) &&\n this.config.localLlmAuthHeader !== false;\n if (!sawLlamaCppSignal || (authConfigured && !modelsProbe.ok)) {\n continue;\n }\n }\n this.isAvailable = true;\n this.detectedType = serverConfig.type;\n this.lastHealthCheck = now;\n log.info(`detected ${serverConfig.type} at ${configuredBaseUrl}`);\n return true;\n }\n if (result.status === 401 || result.status === 403) {\n sawUnauthorizedProbe = true;\n }\n }\n\n // Generic check if specific detection failed\n try {\n const modelsUrl = `${probeBaseUrl}/v1/models`;\n const result = await this.fetchWithTimeout(modelsUrl);\n if (result.ok) {\n this.isAvailable = true;\n this.detectedType = \"generic\";\n this.lastHealthCheck = now;\n log.info(`detected generic OpenAI-compatible server at ${configuredBaseUrl}`);\n return true;\n }\n if (result.status === 401 || result.status === 403) {\n sawUnauthorizedProbe = true;\n }\n } catch {\n // Fall through to unavailable\n }\n\n this.isAvailable = false;\n this.detectedType = null;\n this.lastHealthCheck = now;\n if (sawUnauthorizedProbe) {\n log.warn(\n `local LLM availability probe was unauthorized at ${configuredBaseUrl}; verify localLlmApiKey and localLlmAuthHeader settings`,\n );\n }\n log.debug(\"local LLM not available at\", configuredBaseUrl);\n return false;\n }\n\n /**\n * Try to get context window from LM Studio settings.json as fallback.\n * This reads the defaultContextLength setting which is what LM Studio uses\n * when loading models without explicit context configuration.\n */\n private getContextFromLmStudioSettings(): number | null {\n try {\n const homeDir = this.resolveHomeDir();\n const settingsPath = `${homeDir}/.cache/lm-studio/settings.json`;\n\n if (!fs.existsSync(settingsPath)) {\n log.debug(`LM Studio settings: file not found at ${settingsPath}`);\n return null;\n }\n\n const content = fs.readFileSync(settingsPath, \"utf-8\");\n const settings = JSON.parse(content) as {\n defaultContextLength?: {\n type?: string;\n value?: number;\n };\n };\n\n if (settings.defaultContextLength?.value) {\n const contextWindow = settings.defaultContextLength.value;\n log.debug(`LM Studio settings: found default context length: ${contextWindow}`);\n return contextWindow;\n }\n\n return null;\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n log.debug(`LM Studio settings: failed to read - ${errorMsg}`);\n return null;\n }\n }\n\n /**\n * Try to get context window from LMS CLI (LM Studio specific).\n * Uses --json flag for reliable parsing.\n * Returns null if LMS CLI is not available or model not found.\n */\n private getContextFromLmsCli(modelId: string): number | null {\n try {\n // Check if lms CLI exists in common locations.\n // HOME may be absent in launchd environments, so prefer the resolved helper.\n const homeDir = this.resolveHomeDir();\n const lmsPaths = [\n this.config.localLmsCliPath || \"\",\n `${homeDir}/.cache/lm-studio/bin/lms`,\n \"/usr/local/bin/lms\",\n \"/opt/homebrew/bin/lms\",\n ];\n\n const lmsPath = lmsPaths.find((p) => p.length > 0 && fs.existsSync(p));\n if (!lmsPath) {\n log.debug(`LMS CLI: not found in standard locations (checked: ${lmsPaths.join(\", \")})`);\n return null;\n }\n\n // Run lms ps --json to get loaded models with context\n // Use spawnSync with shell and explicit PATH to ensure lms can find its dependencies\n log.debug(`LMS CLI: running: ${lmsPath} ps --json`);\n const existingPath = readEnvVar(\"PATH\") || \"\";\n const result = launchProcessSync(lmsPath, [\"ps\", \"--json\"], {\n encoding: \"utf-8\",\n timeout: 5000,\n shell: false, // Don't use shell for JSON output - more reliable\n env: mergeEnv({\n PATH: `${this.config.localLmsBinDir || `${homeDir}/.cache/lm-studio/bin`}:/usr/local/bin:/opt/homebrew/bin:/usr/bin:/bin:${existingPath}`,\n HOME: homeDir,\n }),\n });\n\n if (result.error) {\n log.debug(`LMS CLI: spawn error - ${result.error.message}`);\n return null;\n }\n\n if (result.stderr && result.stderr.trim()) {\n log.debug(`LMS CLI: stderr - ${result.stderr.slice(0, 200)}`);\n }\n\n const output = result.stdout || \"\";\n if (!output.trim()) {\n log.debug(\"LMS CLI: empty output - LM Studio may not be running or no models loaded\");\n return null;\n }\n\n // Parse JSON output\n let models: Array<{\n identifier?: string;\n modelKey?: string;\n contextLength?: number;\n maxContextLength?: number;\n }>;\n\n try {\n models = JSON.parse(output) as typeof models;\n } catch (parseErr) {\n log.debug(`LMS CLI: JSON parse error - ${parseErr}`);\n return null;\n }\n\n if (!Array.isArray(models) || models.length === 0) {\n log.debug(\"LMS CLI: no models loaded\");\n return null;\n }\n\n // Find the model matching our configured model ID\n const model = models.find((m) =>\n m.identifier === modelId ||\n m.modelKey === modelId ||\n (m.identifier?.includes(modelId.replace(/@\\d+bit$/, \"\")))\n );\n\n if (!model) {\n log.debug(`LMS CLI: model \"${modelId}\" not found in loaded models: ${models.map(m => m.identifier).join(\", \")}`);\n return null;\n }\n\n // Use contextLength (actual configured) or fall back to maxContextLength (model max)\n const contextWindow = model.contextLength || model.maxContextLength;\n\n if (contextWindow) {\n log.info(`LMS CLI detected context window: ${contextWindow} for ${modelId} (max: ${model.maxContextLength})`);\n return contextWindow;\n }\n\n return null;\n } catch (err) {\n // LMS CLI not available or failed\n const errorMsg = err instanceof Error ? err.message : String(err);\n log.debug(`LMS CLI: failed - ${errorMsg}`);\n return null;\n }\n }\n\n /**\n * Get full model info from LMS CLI including context length and max context length.\n * Returns null if LMS CLI is unavailable or model not found.\n */\n private getLmsModelInfo(modelId: string): { contextLength: number; maxContextLength: number; identifier: string } | null {\n try {\n const result = launchProcessSync(\"lms\", [\"ps\", \"--json\"], {\n encoding: \"utf-8\",\n timeout: 5000,\n shell: false,\n });\n\n if (result.error) {\n return null;\n }\n\n const output = result.stdout || \"\";\n if (!output.trim()) {\n return null;\n }\n\n let models: Array<{\n identifier?: string;\n modelKey?: string;\n contextLength?: number;\n maxContextLength?: number;\n }>;\n\n try {\n models = JSON.parse(output) as typeof models;\n } catch {\n return null;\n }\n\n if (!Array.isArray(models) || models.length === 0) {\n return null;\n }\n\n const model = models.find((m) =>\n m.identifier === modelId ||\n m.modelKey === modelId ||\n (m.identifier?.includes(modelId.replace(/@\\d+bit$/, \"\")))\n );\n\n if (!model || !model.contextLength) {\n return null;\n }\n\n return {\n contextLength: model.contextLength,\n maxContextLength: model.maxContextLength || model.contextLength,\n identifier: model.identifier || modelId,\n };\n } catch {\n return null;\n }\n }\n\n /**\n * Get context window for the configured model, using cache if available.\n * This method caches the result to avoid repeated LMS CLI calls.\n * Order: ModelRegistry (persistent) -> memory cache -> LMS CLI -> settings.json\n */\n getCachedContextWindow(modelId: string): number | null {\n const now = Date.now();\n\n // 1. Check ModelRegistry for persisted context window\n if (this.modelRegistry) {\n const caps = this.modelRegistry.getCapabilities(modelId);\n if (caps.source === \"lmstudio\" && caps.contextWindow) {\n log.debug(`ModelRegistry: using persisted LM Studio context: ${caps.contextWindow}`);\n // Also update memory cache\n this.cachedLmsContext = caps.contextWindow;\n this.lastLmsCheck = now;\n return caps.contextWindow;\n }\n }\n\n // 2. Return in-memory cached value if still valid\n if (this.cachedLmsContext && now - this.lastLmsCheck < LocalLlmClient.LMS_CACHE_INTERVAL_MS) {\n log.debug(`LMS CLI: returning in-memory cached context: ${this.cachedLmsContext}`);\n return this.cachedLmsContext;\n }\n\n // 3. Try LMS CLI (authoritative source)\n const lmsInfo = this.getLmsModelInfo(modelId);\n if (lmsInfo?.contextLength) {\n this.cachedLmsContext = lmsInfo.contextLength;\n this.lastLmsCheck = now;\n // Calculate appropriate output tokens based on context size\n // Use 12.5% of context window, capped at 16K (generous but safe)\n const calculatedOutputTokens = Math.min(Math.floor(lmsInfo.contextLength / 8), 16384);\n const outputTokens = Math.max(calculatedOutputTokens, 4096); // Minimum 4K\n // Persist to ModelRegistry with detected capabilities\n if (this.modelRegistry) {\n this.modelRegistry.setCapabilities(modelId, {\n maxPositionEmbeddings: lmsInfo.maxContextLength || lmsInfo.contextLength,\n contextWindow: lmsInfo.contextLength,\n supportsExtendedContext: (lmsInfo.maxContextLength || lmsInfo.contextLength) > 65536,\n typicalOutputTokens: outputTokens,\n source: \"lmstudio\",\n });\n log.info(`LMS CLI: Stored capabilities for ${modelId}: ${lmsInfo.contextLength} context, ${outputTokens} output tokens`);\n }\n return lmsInfo.contextLength;\n }\n\n // Legacy: Try LMS CLI context only (fallback)\n const legacyContext = this.getContextFromLmsCli(modelId);\n if (legacyContext) {\n this.cachedLmsContext = legacyContext;\n this.lastLmsCheck = now;\n // Persist to ModelRegistry with calculated output tokens\n if (this.modelRegistry) {\n const calculatedOutputTokens = Math.min(Math.floor(legacyContext / 8), 16384);\n const outputTokens = Math.max(calculatedOutputTokens, 4096);\n this.modelRegistry.setCapabilities(modelId, {\n maxPositionEmbeddings: legacyContext,\n contextWindow: legacyContext,\n supportsExtendedContext: false,\n typicalOutputTokens: outputTokens,\n source: \"lmstudio\",\n });\n }\n return legacyContext;\n }\n\n // 4. Fall back to LM Studio settings.json\n const settingsContext = this.getContextFromLmStudioSettings();\n if (settingsContext) {\n log.info(`LM Studio settings: using default context: ${settingsContext}`);\n this.cachedLmsContext = settingsContext;\n this.lastLmsCheck = now;\n return settingsContext;\n }\n\n return null;\n }\n\n /**\n * Clear the LMS context cache. Call this when the model changes.\n */\n clearContextCache(): void {\n this.cachedLmsContext = null;\n this.lastLmsCheck = 0;\n log.debug(\"LMS CLI: context cache cleared\");\n }\n\n private remainingCooldownMs(now: number = Date.now()): number {\n return Math.max(0, this.cooldownUntilMs - now);\n }\n\n private scheduleQueueDrain(): void {\n if (this.queueDrainScheduled) return;\n this.queueDrainScheduled = true;\n\n queueMicrotask(() => {\n this.queueDrainScheduled = false;\n this.startAvailableQueuedRequests();\n });\n }\n\n private hasQueuedRequests(): boolean {\n return (\n this.requestQueues[\"recall-critical\"].length > 0 ||\n this.requestQueues.background.length > 0\n );\n }\n\n private dequeueQueuedRequest(priority: LocalLlmRequestPriority): LocalLlmQueuedRequest | null {\n const next = this.requestQueues[priority].shift();\n return next ?? null;\n }\n\n private failOpenQueuedRequestsForCooldown(): number {\n let dropped = 0;\n for (const priority of [\"recall-critical\", \"background\"] as const) {\n while (this.requestQueues[priority].length > 0) {\n const queued = this.requestQueues[priority].shift();\n queued?.resolve(null);\n dropped += 1;\n }\n }\n return dropped;\n }\n\n private startAvailableQueuedRequests(): void {\n if (!this.queueProcessing.has(\"recall-critical\")) {\n const nextCritical = this.dequeueQueuedRequest(\"recall-critical\");\n if (nextCritical) {\n this.queueProcessing.add(\"recall-critical\");\n void this.runQueuedRequest(nextCritical);\n }\n }\n\n if (!this.queueProcessing.has(\"background\")) {\n const nextBackground = this.dequeueQueuedRequest(\"background\");\n if (nextBackground) {\n this.queueProcessing.add(\"background\");\n void this.runQueuedRequest(nextBackground);\n }\n }\n }\n\n private async runQueuedRequest(next: LocalLlmQueuedRequest): Promise<void> {\n try {\n const remainingCooldownMs = this.remainingCooldownMs();\n if (remainingCooldownMs > 0) {\n const additionalDropped = this.failOpenQueuedRequestsForCooldown();\n log.warn(\n `local LLM: cooldown active (${remainingCooldownMs}ms remaining), dropping ${additionalDropped + 1} queued request(s) fail-open`,\n );\n next.resolve(null);\n return;\n }\n\n let result: LocalLlmChatCompletionResult | null = null;\n try {\n result = await this.runChatCompletionRequest(next.messages, next.options, {\n priority: next.priority,\n enqueuedAtMs: next.enqueuedAtMs,\n });\n } catch (err) {\n log.warn(`local LLM queue drain failed open: ${err instanceof Error ? err.message : String(err)}`);\n }\n next.resolve(result);\n } finally {\n this.queueProcessing.delete(next.priority);\n if (this.hasQueuedRequests()) {\n this.scheduleQueueDrain();\n }\n }\n }\n\n private async runChatCompletionRequest(\n messages: Array<{ role: string; content: string }>,\n options: LocalLlmChatCompletionOptions,\n queueMeta?: { priority: LocalLlmRequestPriority; enqueuedAtMs: number },\n ): Promise<LocalLlmChatCompletionResult | null> {\n log.debug(\n `local LLM chatCompletion: localLlmEnabled=${resolveLocalLlmCapabilities(this.config).localLlm}, model=${this.config.localLlmModel}`,\n );\n\n const operation = options.operation ?? \"unspecified\";\n const startedAtMs = Date.now();\n if (queueMeta) {\n log.debug(\n `local LLM queue start: priority=${queueMeta.priority} waitMs=${startedAtMs - queueMeta.enqueuedAtMs} op=${operation}`,\n );\n }\n\n try {\n const isAvailable = await this.checkAvailability();\n if (!isAvailable) {\n log.debug(\n `local LLM: checkAvailability returned false for ${this.config.localLlmUrl}`,\n );\n return null;\n }\n\n const promptChars = messages.reduce((sum, m) => sum + (m.content?.length ?? 0), 0);\n const requestBody: Record<string, unknown> = {\n model: this.config.localLlmModel,\n messages,\n temperature: options.temperature ?? 0.7,\n // Use max_tokens consistent with cloud models\n max_tokens: options.maxTokens ?? 4096,\n };\n\n // Skip response_format for local LLMs - they don't support json_object type\n // The prompts already instruct the model to output JSON\n // Only send if it's json_schema type which some local LLMs support\n if (options.responseFormat?.type === \"json_schema\") {\n requestBody.response_format = options.responseFormat;\n }\n\n // Suppress thinking/reasoning for operations that benefit from terse,\n // structured output. Thinking-capable models (Qwen 3.5, Gemma 4,\n // DeepSeek) default to thinking-on via their chat template; sending\n // `chat_template_kwargs: { enable_thinking: false }` tells the template\n // to skip reasoning tokens. Consolidation operations on the main client\n // intentionally keep thinking enabled so entity resolution and\n // deduplication can use the model's reasoning path. Fast-tier callers can\n // still force suppression per request to preserve their low-latency\n // contract.\n //\n // Gate the injection on detected backend support (issue #548,\n // Codex P1 on PR #550): `chat_template_kwargs` is an LM Studio /\n // vLLM / llama.cpp extension, not part of standard OpenAI chat\n // completions. Strict OpenAI-compatible backends reject\n // unknown fields with 400, which trips the 400-cooldown path and\n // can effectively disable local extraction. Fail open when the\n // backend hasn't been positively identified as thinking-capable.\n const shouldSuppressThinking =\n options.forceDisableThinking === true ||\n (this._disableThinking &&\n THINKING_SUPPRESSED_OPERATIONS.has(operation));\n if (\n shouldSuppressThinking &&\n this.detectedType !== null &&\n THINKING_COMPATIBLE_BACKENDS.has(this.detectedType)\n ) {\n requestBody.chat_template_kwargs = { enable_thinking: false };\n }\n\n // Normalize URL (use 127.0.0.1 instead of localhost)\n const baseUrl = trimTrailingSlashes(\n this.config.localLlmUrl.replace(\"localhost\", \"127.0.0.1\"),\n );\n const chatUrl = baseUrl.endsWith(\"/v1\")\n ? `${baseUrl}/chat/completions`\n : `${baseUrl}/v1/chat/completions`;\n\n const requestBodyJson = JSON.stringify(requestBody);\n log.debug(\n `local LLM: sending request to ${chatUrl} with model ${this.config.localLlmModel}`,\n );\n // Avoid logging request bodies by default (can contain sensitive user content).\n log.debug(`local LLM: request body length=${requestBodyJson.length}`);\n\n // Write request body to file for debugging\n if (this.config.debug) {\n try {\n const { writeFileSync } = await import(\"node:fs\");\n writeFileSync(\"/tmp/engram-last-request.json\", requestBodyJson);\n } catch {\n /* ignore */\n }\n }\n\n const effectiveTimeoutMs =\n typeof options.timeoutMs === \"number\"\n ? Math.min(this.config.localLlmTimeoutMs, options.timeoutMs)\n : this.config.localLlmTimeoutMs;\n const maxAttempts = 1 + Math.max(0, this.config.localLlmRetry5xxCount);\n let response: Response | null = null;\n let lastAbortError: Error | null = null;\n for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {\n const attemptAbort = new AbortController();\n const attemptTimeout = setTimeout(() => attemptAbort.abort(), effectiveTimeoutMs);\n try {\n response = await fetch(chatUrl, {\n method: \"POST\",\n headers: this.buildRequestHeaders({\n \"Content-Type\": \"application/json\",\n }),\n body: JSON.stringify(requestBody),\n signal: attemptAbort.signal,\n });\n } catch (err) {\n if (!this.isAbortError(err)) throw err;\n lastAbortError = err instanceof Error ? err : new Error(String(err));\n if (attempt < maxAttempts) {\n const backoffMs = this.config.localLlmRetryBackoffMs * attempt;\n log.warn(\n `local LLM request aborted: op=${operation} attempt=${attempt}/${maxAttempts} timeoutMs=${effectiveTimeoutMs} model=${this.config.localLlmModel}; retrying after ${backoffMs}ms`,\n );\n await new Promise((resolve) => setTimeout(resolve, backoffMs));\n continue;\n }\n break;\n } finally {\n clearTimeout(attemptTimeout);\n }\n\n if (response.ok) break;\n if (response.status >= 500 && attempt < maxAttempts) {\n try {\n const errorText = await response.clone().text();\n const nonRecoverableReason =\n this.extractNonRecoverableBackendReasonFromErrorText(errorText);\n if (nonRecoverableReason) {\n this.markBackendUnavailable(\n nonRecoverableReason,\n this.config.localLlm400CooldownMs,\n );\n this.consecutive400s = 0;\n return null;\n }\n } catch (e) {\n log.debug(`local LLM failed to inspect retryable error body: ${e}`);\n }\n }\n if (response.status < 500 || attempt >= maxAttempts) break;\n\n const backoffMs = this.config.localLlmRetryBackoffMs * attempt;\n log.warn(\n `local LLM request got ${response.status}; retrying (attempt ${attempt + 1}/${maxAttempts}) after ${backoffMs}ms`,\n );\n await new Promise((resolve) => setTimeout(resolve, backoffMs));\n }\n log.debug(\n `local LLM: received response, status=${response?.status}, ok=${response?.ok}`,\n );\n\n if (!response) {\n if (lastAbortError) {\n log.warn(\n `local LLM request aborted after ${maxAttempts} attempt(s): op=${operation} timeoutMs=${effectiveTimeoutMs} model=${this.config.localLlmModel} promptChars=${promptChars} durationMs=${Date.now() - startedAtMs}`,\n );\n } else {\n log.warn(\n `local LLM request failed: no response object (op=${operation} model=${this.config.localLlmModel} durationMs=${Date.now() - startedAtMs})`,\n );\n }\n return null;\n }\n\n if (!response.ok) {\n let reason = \"\";\n let errorText = \"\";\n try {\n errorText = await response.text();\n // Try to extract a stable error message without logging content.\n try {\n const parsed = JSON.parse(errorText) as { error?: { message?: string } };\n reason = parsed?.error?.message ? ` — ${parsed.error.message}` : \"\";\n } catch {\n // Keep a short preview in debug only.\n log.debug(`local LLM error body: ${errorText.slice(0, 500)}`);\n }\n } catch (e) {\n log.debug(`local LLM failed to read error body: ${e}`);\n }\n log.warn(\n `local LLM request failed: ${response.status} ${response.statusText}${reason} ` +\n `(op=${operation}, model=${this.config.localLlmModel}, url=${chatUrl}, promptChars=${promptChars}, maxTokens=${requestBody.max_tokens as number})`,\n );\n const nonRecoverableReason =\n this.extractNonRecoverableBackendReason(reason) ??\n this.extractNonRecoverableBackendReasonFromErrorText(errorText);\n if (nonRecoverableReason) {\n this.markBackendUnavailable(\n nonRecoverableReason,\n this.config.localLlm400CooldownMs,\n );\n this.consecutive400s = 0;\n return null;\n }\n if (response.status === 400) {\n this.consecutive400s += 1;\n if (this.consecutive400s >= this.config.localLlm400TripThreshold) {\n this.cooldownUntilMs = Date.now() + this.config.localLlm400CooldownMs;\n log.warn(\n `local LLM: entering cooldown for ${this.config.localLlm400CooldownMs}ms ` +\n `after ${this.consecutive400s} consecutive 400 responses`,\n );\n this.consecutive400s = 0;\n }\n } else {\n this.consecutive400s = 0;\n }\n return null;\n }\n this.consecutive400s = 0;\n\n const data = (await response.json()) as {\n choices?: Array<{\n message?: { content?: string; reasoning_content?: string };\n }>;\n usage?: {\n prompt_tokens?: number;\n completion_tokens?: number;\n total_tokens?: number;\n };\n };\n\n log.debug(\n `local LLM response: choices=${data.choices?.length}, usage=${JSON.stringify(data.usage)}`,\n );\n\n // Thinking models (e.g. Qwen 3.5) may put their response in\n // `reasoning_content` and leave `content` empty. Fall back to\n // reasoning_content so engram still gets a usable result.\n const msg = data.choices?.[0]?.message;\n const content = msg?.content || msg?.reasoning_content || \"\";\n if (!content) {\n log.warn(`local LLM returned empty content. choices=${JSON.stringify(data.choices)?.slice(0, 200)}`);\n return null;\n }\n\n // Estimate tokens if not provided by local LLM\n const usage = data.usage\n ? {\n promptTokens: data.usage.prompt_tokens ?? 0,\n completionTokens: data.usage.completion_tokens ?? 0,\n totalTokens: data.usage.total_tokens ?? 0,\n }\n : this.estimateTokens(messages, content);\n\n const durationMs = Date.now() - startedAtMs;\n if (resolvePipelineProcessingCapabilities(this.config).slowLog && durationMs >= this.config.slowLogThresholdMs) {\n const promptChars = messages.reduce((sum, m) => sum + (m.content?.length ?? 0), 0);\n const op = options.operation ? ` op=${options.operation}` : \"\";\n log.warn(\n `SLOW local LLM:${op} durationMs=${durationMs} model=${this.config.localLlmModel} url=${chatUrl} promptChars=${promptChars} outputTokens=${usage.completionTokens} totalTokens=${usage.totalTokens}`,\n );\n }\n\n log.debug(\"local LLM: request succeeded, tokens:\", usage.totalTokens);\n return { content, usage };\n } catch (err) {\n const errMsg = err instanceof Error ? err.message : String(err);\n const durationMs = Date.now() - startedAtMs;\n if (this.isAbortError(err)) {\n log.warn(\n `local LLM request aborted: op=${operation} timeoutMs=${options.timeoutMs ?? this.config.localLlmTimeoutMs} model=${this.config.localLlmModel} durationMs=${durationMs} error=${errMsg}`,\n );\n return null;\n }\n log.warn(`local LLM request error: op=${operation} error=${errMsg}`);\n this.isAvailable = false; // Mark as unavailable on non-abort errors\n const nonRecoverableReason = this.extractNonRecoverableBackendReason(errMsg);\n if (nonRecoverableReason) {\n this.markBackendUnavailable(\n nonRecoverableReason,\n this.config.localLlm400CooldownMs,\n );\n }\n return null;\n } finally {\n if (queueMeta) {\n const finishedAtMs = Date.now();\n const waitMs = startedAtMs - queueMeta.enqueuedAtMs;\n log.debug(\n `local LLM queue finish: priority=${queueMeta.priority} waitMs=${waitMs} runMs=${finishedAtMs - startedAtMs} totalMs=${finishedAtMs - queueMeta.enqueuedAtMs} op=${operation}`,\n );\n }\n }\n }\n\n /**\n * Query the local LLM server for loaded model information.\n * Returns null if unavailable or if the model is not found.\n */\n async getLoadedModelInfo(): Promise<LocalModelInfo | null> {\n const baseUrl = trimTrailingSlashes(\n this.config.localLlmUrl.replace(\"localhost\", \"127.0.0.1\"),\n );\n\n // Handle URL construction - localLlmUrl may already include /v1\n const modelsUrl = baseUrl.endsWith(\"/v1\")\n ? `${baseUrl}/models`\n : `${baseUrl}/v1/models`;\n log.debug(`Fetching model info from ${modelsUrl}`);\n\n try {\n const result = await this.fetchWithTimeout(modelsUrl, 3000);\n if (!result.ok) {\n if (result.status === 401 || result.status === 403) {\n log.warn(\n `Local LLM: unauthorized while fetching models from ${modelsUrl}; verify localLlmApiKey and localLlmAuthHeader settings`,\n );\n }\n log.warn(`Local LLM: Failed to fetch models from ${modelsUrl} - server returned error`);\n return null;\n }\n if (!result.data) {\n log.warn(`Local LLM: No data returned from ${modelsUrl}`);\n return null;\n }\n\n const data = result.data as {\n data?: Array<{\n id?: string;\n object?: string;\n owned_by?: string;\n // LM Studio specific fields\n max_context_length?: number;\n max_tokens?: number;\n // Ollama specific\n name?: string;\n details?: {\n parameter_size?: string;\n family?: string;\n };\n }>;\n };\n\n if (!Array.isArray(data.data) || data.data.length === 0) {\n log.warn(\"Local LLM returned no models\");\n return null;\n }\n\n // Verbose model listings are noisy on every gateway restart. Keep it debug-only.\n const modelIds = data.data.map((m) => m.id).filter(Boolean);\n log.debug(\n `Local LLM: Found ${modelIds.length} model(s). First 10: ${modelIds.slice(0, 10).join(\", \")}`,\n );\n\n // Find the model matching our configured model ID\n const configuredModel = this.config.localLlmModel;\n let model = data.data.find((m) => m.id === configuredModel);\n\n // If not found by exact match, try partial match (handle suffixes like @4bit)\n if (!model) {\n model = data.data.find((m) =>\n configuredModel.includes(m.id || \"\") ||\n (m.id || \"\").includes(configuredModel.replace(/@\\d+bit$/, \"\"))\n );\n }\n\n // If still not found, use the first loaded model and warn\n if (!model) {\n model = data.data[0];\n const availablePreview = data.data\n .map((m) => m.id)\n .filter(Boolean)\n .slice(0, 10)\n .join(\", \");\n log.warn(\n `Configured model \"${configuredModel}\" not found in local LLM. ` +\n `Using \"${model.id}\" instead. Available (first 10): ${availablePreview}`\n );\n }\n\n // Extract context window - try multiple field names\n let contextWindow = model.max_context_length || model.max_tokens;\n\n // If API doesn't report context window, try LMS CLI (LM Studio specific)\n if (!contextWindow) {\n log.info(\"Local LLM: API did not report context window, trying LMS CLI...\");\n const lmsContext = this.getCachedContextWindow(model.id || \"\");\n if (lmsContext) {\n contextWindow = lmsContext;\n }\n }\n\n this.cachedModelInfo = {\n id: model.id || \"unknown\",\n contextWindow: contextWindow,\n maxTokens: model.max_tokens,\n };\n\n log.info(\n `Local LLM model detected: ${this.cachedModelInfo.id}, ` +\n `context window: ${contextWindow?.toLocaleString() || \"unknown (may use default)\"}`\n );\n\n return this.cachedModelInfo;\n } catch (err) {\n log.warn(`Failed to fetch model info: ${err}`);\n return null;\n }\n }\n\n /**\n * Check if the configured model is available and get its actual context window.\n * Warns if there's a mismatch between expected and actual context.\n */\n async validateModelConfig(expectedContextWindow?: number): Promise<{\n available: boolean;\n actualContextWindow?: number;\n warnings: string[];\n }> {\n const warnings: string[] = [];\n\n const modelInfo = await this.getLoadedModelInfo();\n if (!modelInfo) {\n return { available: false, warnings: [\"Could not query local LLM for model info\"] };\n }\n\n // If we have expected context and the server reports one, check for mismatch\n if (expectedContextWindow && modelInfo.contextWindow) {\n if (modelInfo.contextWindow < expectedContextWindow) {\n warnings.push(\n `Context window mismatch: Model ${modelInfo.id} supports ${modelInfo.contextWindow.toLocaleString()} tokens, ` +\n `but engram is configured for ${expectedContextWindow.toLocaleString()}. ` +\n `Set localLlmMaxContext: ${modelInfo.contextWindow} in config to avoid errors.`\n );\n }\n }\n\n // Warn if server doesn't report context window (common with some local LLM setups)\n if (!modelInfo.contextWindow) {\n warnings.push(\n `Local LLM server did not report context window for ${modelInfo.id}. ` +\n `If you get \"context length exceeded\" errors, set localLlmMaxContext in config.`\n );\n }\n\n return {\n available: true,\n actualContextWindow: modelInfo.contextWindow,\n warnings,\n };\n }\n\n /**\n * Make a chat completion request to local LLM\n */\n async chatCompletion(\n messages: Array<{ role: string; content: string }>,\n options: LocalLlmChatCompletionOptions = {},\n ): Promise<LocalLlmChatCompletionResult | null> {\n if (!resolveLocalLlmCapabilities(this.config).localLlm) {\n log.debug(\"local LLM: disabled, returning null\");\n return null;\n }\n\n const remainingMs = this.remainingCooldownMs();\n if (remainingMs > 0) {\n log.debug(`local LLM: cooldown active (${remainingMs}ms remaining), skipping request`);\n return null;\n }\n if (options.priority) {\n const priority = options.priority;\n return await new Promise<LocalLlmChatCompletionResult | null>((resolve) => {\n this.requestQueues[priority].push({\n messages,\n options,\n priority,\n enqueuedAtMs: Date.now(),\n resolve,\n });\n this.scheduleQueueDrain();\n });\n }\n\n return await this.runChatCompletionRequest(messages, options);\n }\n\n /**\n * Estimate tokens when local LLM doesn't return usage stats\n * Rough estimate: 1 token ≈ 4 characters\n */\n private estimateTokens(\n messages: Array<{ role: string; content: string }>,\n response: string\n ): { promptTokens: number; completionTokens: number; totalTokens: number } {\n const promptChars = messages.reduce((sum, m) => sum + m.content.length, 0);\n const promptTokens = Math.ceil(promptChars / 4);\n const completionTokens = Math.ceil(response.length / 4);\n\n return {\n promptTokens,\n completionTokens,\n totalTokens: promptTokens + completionTokens,\n };\n }\n\n /**\n * Try local LLM first, fallback to cloud provider if configured\n */\n async withFallback<T>(\n localOperation: () => Promise<T | null>,\n fallbackOperation: () => Promise<T>,\n operationName: string\n ): Promise<T> {\n // Try local LLM first if enabled\n if (resolveLocalLlmCapabilities(this.config).localLlm) {\n const localResult = await localOperation();\n if (localResult !== null) {\n log.debug(`${operationName}: used local LLM`);\n return localResult;\n }\n\n // Local failed or unavailable\n if (this.config.localLlmFallback) {\n log.info(`${operationName}: local LLM unavailable, falling back to cloud`);\n } else {\n throw new Error(`${operationName}: local LLM unavailable and fallback disabled`);\n }\n }\n\n // Use fallback (cloud provider)\n return fallbackOperation();\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAEA,OAAO,QAAQ;AACf,OAAO,QAAQ;AAQf,SAAS,oBAAoB,GAAmB;AAC9C,MAAI,MAAM,EAAE;AACZ,SAAO,MAAM,KAAK,EAAE,MAAM,CAAC,MAAM,IAAK;AACtC,SAAO,EAAE,UAAU,GAAG,GAAG;AAC3B;AAEA,SAAS,oBAAoB,GAAmB;AAC9C,SAAO,EAAE,SAAS,KAAK,IAAI,EAAE,MAAM,GAAG,EAAE,IAAI;AAC9C;AAEA,SAAS,oBAAoB,GAA0B;AACrD,MAAI;AACF,UAAM,SAAS,IAAI,IAAI,CAAC;AACxB,QAAI,CAAC,OAAO,KAAM,QAAO;AACzB,UAAM,OAAO,OAAO,OAAO,IAAI;AAC/B,WAAO,OAAO,UAAU,IAAI,IAAI,OAAO;AAAA,EACzC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,eAAe,OAAkD;AACxE,SAAO,OAAO,UAAU,YAAY,UAAU;AAChD;AAEA,SAAS,wBAAwB,OAAyB;AACxD,SACE,eAAe,KAAK,KACpB,eAAe,MAAM,2BAA2B,KAChD,OAAO,MAAM,gBAAgB,aAE3B,OAAO,MAAM,eAAe,YAC5B,OAAO,MAAM,kBAAkB,YAC/B,OAAO,MAAM,eAAe;AAGlC;AAEA,SAAS,yBAAyB,OAAyB;AACzD,MAAI,CAAC,eAAe,KAAK,KAAK,CAAC,MAAM,QAAQ,MAAM,IAAI,GAAG;AACxD,WAAO;AAAA,EACT;AACA,SAAO,MAAM,KAAK,KAAK,CAAC,UAAU;AAChC,QAAI,CAAC,eAAe,KAAK,EAAG,QAAO;AACnC,QAAI,MAAM,aAAa,WAAY,QAAO;AAC1C,QAAI,OAAO,MAAM,OAAO,YAAY,MAAM,GAAG,SAAS,OAAO,EAAG,QAAO;AACvE,UAAM,OAAO,MAAM;AACnB,WACE,eAAe,IAAI,MAClB,iBAAiB,QAAQ,cAAc,QAAQ,gBAAgB;AAAA,EAEpE,CAAC;AACH;AAEA,SAAS,8BAA8B,OAAyB;AAC9D,MAAI,CAAC,eAAe,KAAK,KAAK,CAAC,MAAM,QAAQ,MAAM,MAAM,GAAG;AAC1D,WAAO;AAAA,EACT;AACA,SAAO,MAAM,OAAO,KAAK,CAAC,UAAU;AAClC,QAAI,CAAC,eAAe,KAAK,EAAG,QAAO;AACnC,WACE,OAAO,MAAM,QAAQ,YACrB,OAAO,MAAM,iBAAiB,aAE5B,OAAO,MAAM,WAAW,YACxB,OAAO,MAAM,uBAAuB,YACpC,MAAM,QAAQ,MAAM,gBAAgB;AAAA,EAG1C,CAAC;AACH;AAEA,SAAS,8BAA8B,OAAyB;AAC9D,MAAI,CAAC,eAAe,KAAK,KAAK,CAAC,MAAM,QAAQ,MAAM,IAAI,GAAG;AACxD,WAAO;AAAA,EACT;AACA,SAAO,MAAM,KAAK,KAAK,CAAC,UAAU;AAChC,QAAI,CAAC,eAAe,KAAK,EAAG,QAAO;AACnC,WACE,OAAO,MAAM,OAAO,YACpB,OAAO,MAAM,cAAc,aAEzB,OAAO,MAAM,uBAAuB,YACpC,OAAO,MAAM,uBAAuB,YACpC,OAAO,MAAM,UAAU;AAAA,EAG7B,CAAC;AACH;AAEA,SAAS,+BAA+B,OAAyB;AAC/D,SAAO,8BAA8B,KAAK,KAAK,8BAA8B,KAAK;AACpF;AAuBA,IAAM,+BAA0D,oBAAI,IAAI;AAAA,EACtE;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,iCAAsD,oBAAI,IAAI;AAAA,EAClE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAUD,IAAM,gBAAqC;AAAA,EACzC;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,UAAU,CAAC,SAAS,OAAO,SAAS,YAAY,KAAK,SAAS,QAAQ;AAAA,EACxE;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,UAAU,CAAC,SAAS,eAAe,IAAI,KAAK,KAAK,WAAW;AAAA,EAC9D;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,UAAU,CAAC,SAAS,eAAe,IAAI,KAAK,MAAM,QAAQ,KAAK,IAAI;AAAA,EACrE;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,UAAU,CAAC,SAAS,eAAe,IAAI,KAAK,MAAM,QAAQ,KAAK,IAAI;AAAA,EACrE;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,gBAAgB;AAAA,IAChB,gBAAgB;AAAA,IAChB,UAAU,CAAC,SAAS,SAAS,MAAO,eAAe,IAAI,KAAK,EAAE,YAAY;AAAA,EAC5E;AACF;AAEA,SAAS,oBAAoB,mBAAgD;AAC3E,QAAM,iBAAiB,oBAAoB,iBAAiB;AAC5D,MAAI,mBAAmB,KAAM,QAAO;AACpC,QAAM,WAAW,cAAc;AAAA,IAC7B,CAAC,iBAAiB,aAAa,gBAAgB;AAAA,EACjD;AACA,MAAI,SAAS,WAAW,EAAG,QAAO;AAClC,QAAM,gBAAgB,IAAI,IAAI,SAAS,IAAI,CAAC,iBAAiB,aAAa,IAAI,CAAC;AAC/E,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG,cAAc,OAAO,CAAC,iBAAiB,CAAC,cAAc,IAAI,aAAa,IAAI,CAAC;AAAA,EACjF;AACF;AAiCA,IAAM,iCAAiC;AAMhC,IAAM,iBAAN,MAAM,gBAAe;AAAA,EAClB;AAAA,EACA,cAA8B;AAAA,EAC9B,kBAA0B;AAAA,EAC1B,eAAoC;AAAA,EACpC,kBAAyC;AAAA,EACzC,mBAAkC;AAAA,EAClC,eAAuB;AAAA,EACvB,kBAA0B;AAAA,EAC1B,kBAA0B;AAAA,EAC1B;AAAA,EACA,mBAA4B;AAAA,EACnB,gBAA0E;AAAA,IACzF,mBAAmB,CAAC;AAAA,IACpB,YAAY,CAAC;AAAA,EACf;AAAA,EACiB,kBAAkB,oBAAI,IAA6B;AAAA,EAC5D,sBAA+B;AAAA,EACvC,OAAwB,2BAA2B;AAAA;AAAA,EACnD,OAAwB,wBAAwB;AAAA;AAAA,EAEhD,YAAY,QAAsB,eAA+B;AAC/D,SAAK,SAAS;AACd,SAAK,gBAAgB;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,IAAI,gBAAgB,OAAgB;AAClC,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEQ,iBAAyB;AAC/B,WAAO,KAAK,OAAO,mBAAmB,WAAW,MAAM,KAAK,GAAG,QAAQ;AAAA,EACzE;AAAA,EAEQ,oBAAoB,OAA+B,CAAC,GAA2B;AACrF,UAAM,UAAkC;AAAA,MACtC,GAAG;AAAA,MACH,GAAI,KAAK,OAAO,mBAAmB,CAAC;AAAA,IACtC;AACA,QAAI,KAAK,OAAO,kBAAkB,KAAK,OAAO,uBAAuB,OAAO;AAC1E,cAAQ,gBAAgB,UAAU,KAAK,OAAO,cAAc;AAAA,IAC9D;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,aAAa,KAAuB;AAC1C,QAAI,CAAC,OAAO,OAAO,QAAQ,SAAU,QAAO;AAC5C,UAAM,QAAQ;AACd,WACE,MAAM,SAAS,gBACf,MAAM,YAAY,gCAClB,MAAM,YAAY;AAAA,EAEtB;AAAA;AAAA;AAAA;AAAA,EAKA,iBAAiB,UAA+B;AAC9C,SAAK,gBAAgB;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAuC;AACrC,WAAO,KAAK;AAAA,EACd;AAAA,EAEQ,gBAAwB;AAC9B,WAAO;AAAA,MACL,KAAK,OAAO,YAAY,QAAQ,aAAa,WAAW;AAAA,IAC1D,EAAE,QAAQ,SAAS,EAAE;AAAA,EACvB;AAAA,EAEQ,wBAA2D;AACjE,UAAM,YAAY;AAGlB,QAAI,CAAC,UAAU,8BAA8B,GAAG;AAC9C,gBAAU,8BAA8B,IAAI,oBAAI,IAAI;AAAA,IACtD;AACA,WAAO,UAAU,8BAA8B;AAAA,EACjD;AAAA,EAEQ,uBAAuB,KAA0C;AACvE,UAAM,QAAQ,KAAK,sBAAsB,EAAE,IAAI,KAAK,cAAc,CAAC,KAAK;AACxE,QAAI,CAAC,MAAO,QAAO;AACnB,QAAI,MAAM,WAAW,KAAK;AACxB,WAAK,sBAAsB,EAAE,OAAO,KAAK,cAAc,CAAC;AACxD,WAAK,kBAAkB;AACvB,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,uBAAuB,QAAgB,YAA0B;AACvE,UAAM,mBAAmB,KAAK,2BAA2B,MAAM;AAC/D,QAAI,aAAa,GAAG;AAClB,YAAM,UAAU,KAAK,IAAI,IAAI;AAC7B,WAAK,sBAAsB,EAAE,IAAI,KAAK,cAAc,GAAG,EAAE,SAAS,QAAQ,iBAAiB,CAAC;AAAA,IAC9F,OAAO;AACL,WAAK,sBAAsB,EAAE,OAAO,KAAK,cAAc,CAAC;AAAA,IAC1D;AACA,SAAK,cAAc;AACnB,SAAK,kBAAkB;AACvB,QAAI;AAAA,MACF,qCAAqC,UAAU,aAAa,KAAK,OAAO,aAAa,WAAW,gBAAgB;AAAA,IAClH;AAAA,EACF;AAAA,EAEQ,mCAAmC,QAA+B;AACxE,UAAM,QAAQ,OAAO;AAAA,MACnB;AAAA,IACF;AACA,WAAO,QAAQ,CAAC,KAAK;AAAA,EACvB;AAAA,EAEQ,gDAAgD,WAAkC;AACxF,UAAM,eAAe,KAAK,mCAAmC,SAAS;AACtE,QAAI,aAAc,QAAO;AACzB,QAAI;AACF,YAAM,SAAS,KAAK,MAAM,SAAS;AACnC,aAAO,KAAK,mCAAmC,QAAQ,OAAO,WAAW,EAAE;AAAA,IAC7E,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,2BAA2B,QAAwB;AACzD,UAAM,UAAU,OAAO,QAAQ,QAAQ,GAAG,EAAE,QAAQ,cAAc,EAAE,EAAE,KAAK;AAC3E,QAAI,CAAC,QAAS,QAAO;AACrB,WAAO,QAAQ,SAAS,MAAM,GAAG,QAAQ,MAAM,GAAG,GAAG,CAAC,QAAQ;AAAA,EAChE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,iBACZ,KACA,YAAoB,KACpB,SACgE;AAChE,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,UAAU,WAAW,MAAM,WAAW,MAAM,GAAG,SAAS;AAE9D,QAAI;AACF,YAAM,WAAW,MAAM,MAAM,KAAK;AAAA,QAChC,QAAQ,WAAW;AAAA,QACnB,SAAS,KAAK,oBAAoB,EAAE,QAAQ,oBAAoB,GAAI,WAAW,CAAC,EAAG,CAAC;AAAA,MACtF,CAAC;AACD,mBAAa,OAAO;AAEpB,UAAI,CAAC,SAAS,IAAI;AAChB,eAAO,EAAE,IAAI,OAAO,MAAM,MAAM,QAAQ,SAAS,OAAO;AAAA,MAC1D;AAEA,YAAM,cAAc,SAAS,QAAQ,IAAI,cAAc;AACvD,UAAI,aAAa,SAAS,kBAAkB,GAAG;AAC7C,eAAO,EAAE,IAAI,MAAM,MAAM,MAAM,SAAS,KAAK,GAAG,QAAQ,SAAS,OAAO;AAAA,MAC1E,OAAO;AACL,eAAO,EAAE,IAAI,MAAM,MAAM,MAAM,SAAS,KAAK,GAAG,QAAQ,SAAS,OAAO;AAAA,MAC1E;AAAA,IACF,SAAS,KAAK;AACZ,mBAAa,OAAO;AACpB,aAAO,EAAE,IAAI,OAAO,MAAM,MAAM,QAAQ,KAAK;AAAA,IAC/C;AAAA,EACF;AAAA,EAEA,MAAc,0BACZ,cACsD;AACtD,QAAI,eAAe;AACnB,eAAW,YAAY,CAAC,kBAAkB,gBAAgB,GAAG;AAC3D,YAAM,QAAQ,MAAM,KAAK,iBAAiB,GAAG,YAAY,GAAG,QAAQ,EAAE;AACtE,UAAI,MAAM,MAAM,+BAA+B,MAAM,IAAI,GAAG;AAC1D,eAAO,EAAE,SAAS,MAAM,aAAa;AAAA,MACvC;AACA,UAAI,MAAM,WAAW,OAAO,MAAM,WAAW,KAAK;AAChD,uBAAe;AAAA,MACjB;AAAA,IACF;AACA,WAAO,EAAE,SAAS,OAAO,aAAa;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,oBAAsC;AAE1C,UAAM,MAAM,KAAK,IAAI;AACrB,UAAM,eAAe,KAAK,uBAAuB,GAAG;AACpD,QAAI,cAAc;AAChB,WAAK,cAAc;AACnB,WAAK,kBAAkB;AACvB,UAAI;AAAA,QACF,oDAAoD,KAAK,IAAI,GAAG,aAAa,UAAU,GAAG,CAAC,OAAO,aAAa,MAAM;AAAA,MACvH;AACA,aAAO;AAAA,IACT;AACA,QAAI,KAAK,gBAAgB,QAAQ,MAAM,KAAK,kBAAkB,gBAAe,0BAA0B;AACrG,aAAO,KAAK;AAAA,IACd;AAKA,UAAM,oBAAoB;AAAA,MACxB,KAAK,OAAO,YAAY,QAAQ,aAAa,WAAW;AAAA,IAC1D;AACA,UAAM,eAAe,oBAAoB,iBAAiB;AAC1D,QAAI,uBAAuB;AAG3B,eAAW,gBAAgB,oBAAoB,iBAAiB,GAAG;AACjE,YAAM,YAAY,GAAG,YAAY,GAAG,aAAa,cAAc;AAC/D,UAAI,MAAM,YAAY,aAAa,IAAI,OAAO,SAAS,EAAE;AAEzD,YAAM,SAAS,MAAM,KAAK,iBAAiB,SAAS;AACpD,UAAI,OAAO,MAAM,aAAa,SAAS,OAAO,IAAI,GAAG;AACnD,YAAI,aAAa,SAAS,OAAO;AAC/B,gBAAM,gBAAgB,MAAM,KAAK,0BAA0B,YAAY;AACvE,cAAI,cAAc,cAAc;AAC9B,mCAAuB;AAAA,UACzB;AACA,cAAI,cAAc,SAAS;AACzB,iBAAK,cAAc;AACnB,iBAAK,eAAe;AACpB,iBAAK,kBAAkB;AACvB,gBAAI,KAAK,wBAAwB,iBAAiB,EAAE;AACpD,mBAAO;AAAA,UACT;AAAA,QACF;AACA,YAAI,aAAa,SAAS,YAAY;AACpC,cAAI,oBAAoB;AACxB,gBAAM,aAAa,MAAM,KAAK,iBAAiB,GAAG,YAAY,QAAQ;AACtE,cAAI,WAAW,MAAM,wBAAwB,WAAW,IAAI,GAAG;AAC7D,gCAAoB;AAAA,UACtB;AACA,cAAI,WAAW,WAAW,OAAO,WAAW,WAAW,KAAK;AAC1D,mCAAuB;AAAA,UACzB;AAEA,gBAAM,YAAY,GAAG,YAAY,GAAG,aAAa,cAAc;AAC/D,gBAAM,cAAc,MAAM,KAAK,iBAAiB,SAAS;AACzD,cAAI,YAAY,MAAM,yBAAyB,YAAY,IAAI,GAAG;AAChE,gCAAoB;AAAA,UACtB;AACA,cAAI,YAAY,WAAW,OAAO,YAAY,WAAW,KAAK;AAC5D,mCAAuB;AACvB;AAAA,UACF;AAEA,gBAAM,iBACJ,QAAQ,KAAK,OAAO,cAAc,KAClC,KAAK,OAAO,uBAAuB;AACrC,cAAI,CAAC,qBAAsB,kBAAkB,CAAC,YAAY,IAAK;AAC7D;AAAA,UACF;AAAA,QACF;AACA,aAAK,cAAc;AACnB,aAAK,eAAe,aAAa;AACjC,aAAK,kBAAkB;AACvB,YAAI,KAAK,YAAY,aAAa,IAAI,OAAO,iBAAiB,EAAE;AAChE,eAAO;AAAA,MACT;AACA,UAAI,OAAO,WAAW,OAAO,OAAO,WAAW,KAAK;AAClD,+BAAuB;AAAA,MACzB;AAAA,IACF;AAGA,QAAI;AACF,YAAM,YAAY,GAAG,YAAY;AACjC,YAAM,SAAS,MAAM,KAAK,iBAAiB,SAAS;AACpD,UAAI,OAAO,IAAI;AACb,aAAK,cAAc;AACnB,aAAK,eAAe;AACpB,aAAK,kBAAkB;AACvB,YAAI,KAAK,gDAAgD,iBAAiB,EAAE;AAC5E,eAAO;AAAA,MACT;AACA,UAAI,OAAO,WAAW,OAAO,OAAO,WAAW,KAAK;AAClD,+BAAuB;AAAA,MACzB;AAAA,IACF,QAAQ;AAAA,IAER;AAEA,SAAK,cAAc;AACnB,SAAK,eAAe;AACpB,SAAK,kBAAkB;AACvB,QAAI,sBAAsB;AACxB,UAAI;AAAA,QACF,oDAAoD,iBAAiB;AAAA,MACvE;AAAA,IACF;AACA,QAAI,MAAM,8BAA8B,iBAAiB;AACzD,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,iCAAgD;AACtD,QAAI;AACF,YAAM,UAAU,KAAK,eAAe;AACpC,YAAM,eAAe,GAAG,OAAO;AAE/B,UAAI,CAAC,GAAG,WAAW,YAAY,GAAG;AAChC,YAAI,MAAM,yCAAyC,YAAY,EAAE;AACjE,eAAO;AAAA,MACT;AAEA,YAAM,UAAU,GAAG,aAAa,cAAc,OAAO;AACrD,YAAM,WAAW,KAAK,MAAM,OAAO;AAOnC,UAAI,SAAS,sBAAsB,OAAO;AACxC,cAAM,gBAAgB,SAAS,qBAAqB;AACpD,YAAI,MAAM,qDAAqD,aAAa,EAAE;AAC9E,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT,SAAS,KAAK;AACZ,YAAM,WAAW,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAChE,UAAI,MAAM,wCAAwC,QAAQ,EAAE;AAC5D,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,qBAAqB,SAAgC;AAC3D,QAAI;AAGF,YAAM,UAAU,KAAK,eAAe;AACpC,YAAM,WAAW;AAAA,QACf,KAAK,OAAO,mBAAmB;AAAA,QAC/B,GAAG,OAAO;AAAA,QACV;AAAA,QACA;AAAA,MACF;AAEA,YAAM,UAAU,SAAS,KAAK,CAAC,MAAM,EAAE,SAAS,KAAK,GAAG,WAAW,CAAC,CAAC;AACrE,UAAI,CAAC,SAAS;AACZ,YAAI,MAAM,sDAAsD,SAAS,KAAK,IAAI,CAAC,GAAG;AACtF,eAAO;AAAA,MACT;AAIA,UAAI,MAAM,qBAAqB,OAAO,YAAY;AAClD,YAAM,eAAe,WAAW,MAAM,KAAK;AAC3C,YAAM,SAAS,kBAAkB,SAAS,CAAC,MAAM,QAAQ,GAAG;AAAA,QAC1D,UAAU;AAAA,QACV,SAAS;AAAA,QACT,OAAO;AAAA;AAAA,QACP,KAAK,SAAS;AAAA,UACZ,MAAM,GAAG,KAAK,OAAO,kBAAkB,GAAG,OAAO,uBAAuB,mDAAmD,YAAY;AAAA,UACvI,MAAM;AAAA,QACR,CAAC;AAAA,MACH,CAAC;AAED,UAAI,OAAO,OAAO;AAChB,YAAI,MAAM,0BAA0B,OAAO,MAAM,OAAO,EAAE;AAC1D,eAAO;AAAA,MACT;AAEA,UAAI,OAAO,UAAU,OAAO,OAAO,KAAK,GAAG;AACzC,YAAI,MAAM,qBAAqB,OAAO,OAAO,MAAM,GAAG,GAAG,CAAC,EAAE;AAAA,MAC9D;AAEA,YAAM,SAAS,OAAO,UAAU;AAChC,UAAI,CAAC,OAAO,KAAK,GAAG;AAClB,YAAI,MAAM,0EAA0E;AACpF,eAAO;AAAA,MACT;AAGA,UAAI;AAOJ,UAAI;AACF,iBAAS,KAAK,MAAM,MAAM;AAAA,MAC5B,SAAS,UAAU;AACjB,YAAI,MAAM,+BAA+B,QAAQ,EAAE;AACnD,eAAO;AAAA,MACT;AAEA,UAAI,CAAC,MAAM,QAAQ,MAAM,KAAK,OAAO,WAAW,GAAG;AACjD,YAAI,MAAM,2BAA2B;AACrC,eAAO;AAAA,MACT;AAGA,YAAM,QAAQ,OAAO;AAAA,QAAK,CAAC,MACzB,EAAE,eAAe,WACjB,EAAE,aAAa,WACd,EAAE,YAAY,SAAS,QAAQ,QAAQ,YAAY,EAAE,CAAC;AAAA,MACzD;AAEA,UAAI,CAAC,OAAO;AACV,YAAI,MAAM,mBAAmB,OAAO,iCAAiC,OAAO,IAAI,OAAK,EAAE,UAAU,EAAE,KAAK,IAAI,CAAC,EAAE;AAC/G,eAAO;AAAA,MACT;AAGA,YAAM,gBAAgB,MAAM,iBAAiB,MAAM;AAEnD,UAAI,eAAe;AACjB,YAAI,KAAK,oCAAoC,aAAa,QAAQ,OAAO,UAAU,MAAM,gBAAgB,GAAG;AAC5G,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,IACT,SAAS,KAAK;AAEZ,YAAM,WAAW,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAChE,UAAI,MAAM,qBAAqB,QAAQ,EAAE;AACzC,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,gBAAgB,SAAiG;AACvH,QAAI;AACF,YAAM,SAAS,kBAAkB,OAAO,CAAC,MAAM,QAAQ,GAAG;AAAA,QACxD,UAAU;AAAA,QACV,SAAS;AAAA,QACT,OAAO;AAAA,MACT,CAAC;AAED,UAAI,OAAO,OAAO;AAChB,eAAO;AAAA,MACT;AAEA,YAAM,SAAS,OAAO,UAAU;AAChC,UAAI,CAAC,OAAO,KAAK,GAAG;AAClB,eAAO;AAAA,MACT;AAEA,UAAI;AAOJ,UAAI;AACF,iBAAS,KAAK,MAAM,MAAM;AAAA,MAC5B,QAAQ;AACN,eAAO;AAAA,MACT;AAEA,UAAI,CAAC,MAAM,QAAQ,MAAM,KAAK,OAAO,WAAW,GAAG;AACjD,eAAO;AAAA,MACT;AAEA,YAAM,QAAQ,OAAO;AAAA,QAAK,CAAC,MACzB,EAAE,eAAe,WACjB,EAAE,aAAa,WACd,EAAE,YAAY,SAAS,QAAQ,QAAQ,YAAY,EAAE,CAAC;AAAA,MACzD;AAEA,UAAI,CAAC,SAAS,CAAC,MAAM,eAAe;AAClC,eAAO;AAAA,MACT;AAEA,aAAO;AAAA,QACL,eAAe,MAAM;AAAA,QACrB,kBAAkB,MAAM,oBAAoB,MAAM;AAAA,QAClD,YAAY,MAAM,cAAc;AAAA,MAClC;AAAA,IACF,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,uBAAuB,SAAgC;AACrD,UAAM,MAAM,KAAK,IAAI;AAGrB,QAAI,KAAK,eAAe;AACtB,YAAM,OAAO,KAAK,cAAc,gBAAgB,OAAO;AACvD,UAAI,KAAK,WAAW,cAAc,KAAK,eAAe;AACpD,YAAI,MAAM,qDAAqD,KAAK,aAAa,EAAE;AAEnF,aAAK,mBAAmB,KAAK;AAC7B,aAAK,eAAe;AACpB,eAAO,KAAK;AAAA,MACd;AAAA,IACF;AAGA,QAAI,KAAK,oBAAoB,MAAM,KAAK,eAAe,gBAAe,uBAAuB;AAC3F,UAAI,MAAM,gDAAgD,KAAK,gBAAgB,EAAE;AACjF,aAAO,KAAK;AAAA,IACd;AAGA,UAAM,UAAU,KAAK,gBAAgB,OAAO;AAC5C,QAAI,SAAS,eAAe;AAC1B,WAAK,mBAAmB,QAAQ;AAChC,WAAK,eAAe;AAGpB,YAAM,yBAAyB,KAAK,IAAI,KAAK,MAAM,QAAQ,gBAAgB,CAAC,GAAG,KAAK;AACpF,YAAM,eAAe,KAAK,IAAI,wBAAwB,IAAI;AAE1D,UAAI,KAAK,eAAe;AACtB,aAAK,cAAc,gBAAgB,SAAS;AAAA,UAC1C,uBAAuB,QAAQ,oBAAoB,QAAQ;AAAA,UAC3D,eAAe,QAAQ;AAAA,UACvB,0BAA0B,QAAQ,oBAAoB,QAAQ,iBAAiB;AAAA,UAC/E,qBAAqB;AAAA,UACrB,QAAQ;AAAA,QACV,CAAC;AACD,YAAI,KAAK,oCAAoC,OAAO,KAAK,QAAQ,aAAa,aAAa,YAAY,gBAAgB;AAAA,MACzH;AACA,aAAO,QAAQ;AAAA,IACjB;AAGA,UAAM,gBAAgB,KAAK,qBAAqB,OAAO;AACvD,QAAI,eAAe;AACjB,WAAK,mBAAmB;AACxB,WAAK,eAAe;AAEpB,UAAI,KAAK,eAAe;AACtB,cAAM,yBAAyB,KAAK,IAAI,KAAK,MAAM,gBAAgB,CAAC,GAAG,KAAK;AAC5E,cAAM,eAAe,KAAK,IAAI,wBAAwB,IAAI;AAC1D,aAAK,cAAc,gBAAgB,SAAS;AAAA,UAC1C,uBAAuB;AAAA,UACvB,eAAe;AAAA,UACf,yBAAyB;AAAA,UACzB,qBAAqB;AAAA,UACrB,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AACA,aAAO;AAAA,IACT;AAGA,UAAM,kBAAkB,KAAK,+BAA+B;AAC5D,QAAI,iBAAiB;AACnB,UAAI,KAAK,8CAA8C,eAAe,EAAE;AACxE,WAAK,mBAAmB;AACxB,WAAK,eAAe;AACpB,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,oBAA0B;AACxB,SAAK,mBAAmB;AACxB,SAAK,eAAe;AACpB,QAAI,MAAM,gCAAgC;AAAA,EAC5C;AAAA,EAEQ,oBAAoB,MAAc,KAAK,IAAI,GAAW;AAC5D,WAAO,KAAK,IAAI,GAAG,KAAK,kBAAkB,GAAG;AAAA,EAC/C;AAAA,EAEQ,qBAA2B;AACjC,QAAI,KAAK,oBAAqB;AAC9B,SAAK,sBAAsB;AAE3B,mBAAe,MAAM;AACnB,WAAK,sBAAsB;AAC3B,WAAK,6BAA6B;AAAA,IACpC,CAAC;AAAA,EACH;AAAA,EAEQ,oBAA6B;AACnC,WACE,KAAK,cAAc,iBAAiB,EAAE,SAAS,KAC/C,KAAK,cAAc,WAAW,SAAS;AAAA,EAE3C;AAAA,EAEQ,qBAAqB,UAAiE;AAC5F,UAAM,OAAO,KAAK,cAAc,QAAQ,EAAE,MAAM;AAChD,WAAO,QAAQ;AAAA,EACjB;AAAA,EAEQ,oCAA4C;AAClD,QAAI,UAAU;AACd,eAAW,YAAY,CAAC,mBAAmB,YAAY,GAAY;AACjE,aAAO,KAAK,cAAc,QAAQ,EAAE,SAAS,GAAG;AAC9C,cAAM,SAAS,KAAK,cAAc,QAAQ,EAAE,MAAM;AAClD,gBAAQ,QAAQ,IAAI;AACpB,mBAAW;AAAA,MACb;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,+BAAqC;AAC3C,QAAI,CAAC,KAAK,gBAAgB,IAAI,iBAAiB,GAAG;AAChD,YAAM,eAAe,KAAK,qBAAqB,iBAAiB;AAChE,UAAI,cAAc;AAChB,aAAK,gBAAgB,IAAI,iBAAiB;AAC1C,aAAK,KAAK,iBAAiB,YAAY;AAAA,MACzC;AAAA,IACF;AAEA,QAAI,CAAC,KAAK,gBAAgB,IAAI,YAAY,GAAG;AAC3C,YAAM,iBAAiB,KAAK,qBAAqB,YAAY;AAC7D,UAAI,gBAAgB;AAClB,aAAK,gBAAgB,IAAI,YAAY;AACrC,aAAK,KAAK,iBAAiB,cAAc;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,iBAAiB,MAA4C;AACzE,QAAI;AACF,YAAM,sBAAsB,KAAK,oBAAoB;AACrD,UAAI,sBAAsB,GAAG;AAC3B,cAAM,oBAAoB,KAAK,kCAAkC;AACjE,YAAI;AAAA,UACF,+BAA+B,mBAAmB,2BAA2B,oBAAoB,CAAC;AAAA,QACpG;AACA,aAAK,QAAQ,IAAI;AACjB;AAAA,MACF;AAEA,UAAI,SAA8C;AAClD,UAAI;AACF,iBAAS,MAAM,KAAK,yBAAyB,KAAK,UAAU,KAAK,SAAS;AAAA,UACxE,UAAU,KAAK;AAAA,UACf,cAAc,KAAK;AAAA,QACrB,CAAC;AAAA,MACH,SAAS,KAAK;AACZ,YAAI,KAAK,sCAAsC,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AAAA,MACnG;AACA,WAAK,QAAQ,MAAM;AAAA,IACrB,UAAE;AACA,WAAK,gBAAgB,OAAO,KAAK,QAAQ;AACzC,UAAI,KAAK,kBAAkB,GAAG;AAC5B,aAAK,mBAAmB;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,yBACZ,UACA,SACA,WAC8C;AAC9C,QAAI;AAAA,MACF,6CAA6C,4BAA4B,KAAK,MAAM,EAAE,QAAQ,WAAW,KAAK,OAAO,aAAa;AAAA,IACpI;AAEA,UAAM,YAAY,QAAQ,aAAa;AACvC,UAAM,cAAc,KAAK,IAAI;AAC7B,QAAI,WAAW;AACX,UAAI;AAAA,QACF,mCAAmC,UAAU,QAAQ,WAAW,cAAc,UAAU,YAAY,OAAO,SAAS;AAAA,MACtH;AAAA,IACJ;AAEA,QAAI;AACF,YAAM,cAAc,MAAM,KAAK,kBAAkB;AACjD,UAAI,CAAC,aAAa;AAChB,YAAI;AAAA,UACF,mDAAmD,KAAK,OAAO,WAAW;AAAA,QAC5E;AACA,eAAO;AAAA,MACT;AAEA,YAAM,cAAc,SAAS,OAAO,CAAC,KAAK,MAAM,OAAO,EAAE,SAAS,UAAU,IAAI,CAAC;AACjF,YAAM,cAAuC;AAAA,QAC3C,OAAO,KAAK,OAAO;AAAA,QACnB;AAAA,QACA,aAAa,QAAQ,eAAe;AAAA;AAAA,QAEpC,YAAY,QAAQ,aAAa;AAAA,MACnC;AAKA,UAAI,QAAQ,gBAAgB,SAAS,eAAe;AAClD,oBAAY,kBAAkB,QAAQ;AAAA,MACxC;AAmBA,YAAM,yBACJ,QAAQ,yBAAyB,QAChC,KAAK,oBACJ,+BAA+B,IAAI,SAAS;AAChD,UACE,0BACA,KAAK,iBAAiB,QACtB,6BAA6B,IAAI,KAAK,YAAY,GAClD;AACA,oBAAY,uBAAuB,EAAE,iBAAiB,MAAM;AAAA,MAC9D;AAGA,YAAM,UAAU;AAAA,QACd,KAAK,OAAO,YAAY,QAAQ,aAAa,WAAW;AAAA,MAC1D;AACA,YAAM,UAAU,QAAQ,SAAS,KAAK,IAClC,GAAG,OAAO,sBACV,GAAG,OAAO;AAEd,YAAM,kBAAkB,KAAK,UAAU,WAAW;AAClD,UAAI;AAAA,QACF,iCAAiC,OAAO,eAAe,KAAK,OAAO,aAAa;AAAA,MAClF;AAEA,UAAI,MAAM,kCAAkC,gBAAgB,MAAM,EAAE;AAGpE,UAAI,KAAK,OAAO,OAAO;AACrB,YAAI;AACF,gBAAM,EAAE,cAAc,IAAI,MAAM,OAAO,IAAS;AAChD,wBAAc,iCAAiC,eAAe;AAAA,QAChE,QAAQ;AAAA,QAER;AAAA,MACF;AAEA,YAAM,qBACJ,OAAO,QAAQ,cAAc,WACzB,KAAK,IAAI,KAAK,OAAO,mBAAmB,QAAQ,SAAS,IACzD,KAAK,OAAO;AAClB,YAAM,cAAc,IAAI,KAAK,IAAI,GAAG,KAAK,OAAO,qBAAqB;AACrE,UAAI,WAA4B;AAChC,UAAI,iBAA+B;AACnC,eAAS,UAAU,GAAG,WAAW,aAAa,WAAW,GAAG;AAC1D,cAAM,eAAe,IAAI,gBAAgB;AACzC,cAAM,iBAAiB,WAAW,MAAM,aAAa,MAAM,GAAG,kBAAkB;AAChF,YAAI;AACF,qBAAW,MAAM,MAAM,SAAS;AAAA,YAC9B,QAAQ;AAAA,YACR,SAAS,KAAK,oBAAoB;AAAA,cAChC,gBAAgB;AAAA,YAClB,CAAC;AAAA,YACD,MAAM,KAAK,UAAU,WAAW;AAAA,YAChC,QAAQ,aAAa;AAAA,UACvB,CAAC;AAAA,QACH,SAAS,KAAK;AACZ,cAAI,CAAC,KAAK,aAAa,GAAG,EAAG,OAAM;AACnC,2BAAiB,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AACnE,cAAI,UAAU,aAAa;AACzB,kBAAMA,aAAY,KAAK,OAAO,yBAAyB;AACvD,gBAAI;AAAA,cACF,iCAAiC,SAAS,YAAY,OAAO,IAAI,WAAW,cAAc,kBAAkB,UAAU,KAAK,OAAO,aAAa,oBAAoBA,UAAS;AAAA,YAC9K;AACA,kBAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAASA,UAAS,CAAC;AAC7D;AAAA,UACF;AACA;AAAA,QACF,UAAE;AACA,uBAAa,cAAc;AAAA,QAC7B;AAEA,YAAI,SAAS,GAAI;AACjB,YAAI,SAAS,UAAU,OAAO,UAAU,aAAa;AACnD,cAAI;AACF,kBAAM,YAAY,MAAM,SAAS,MAAM,EAAE,KAAK;AAC9C,kBAAM,uBACJ,KAAK,gDAAgD,SAAS;AAChE,gBAAI,sBAAsB;AACxB,mBAAK;AAAA,gBACH;AAAA,gBACA,KAAK,OAAO;AAAA,cACd;AACA,mBAAK,kBAAkB;AACvB,qBAAO;AAAA,YACT;AAAA,UACF,SAAS,GAAG;AACV,gBAAI,MAAM,qDAAqD,CAAC,EAAE;AAAA,UACpE;AAAA,QACF;AACA,YAAI,SAAS,SAAS,OAAO,WAAW,YAAa;AAErD,cAAM,YAAY,KAAK,OAAO,yBAAyB;AACvD,YAAI;AAAA,UACF,yBAAyB,SAAS,MAAM,uBAAuB,UAAU,CAAC,IAAI,WAAW,WAAW,SAAS;AAAA,QAC/G;AACA,cAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,SAAS,CAAC;AAAA,MAC/D;AACA,UAAI;AAAA,QACF,wCAAwC,UAAU,MAAM,QAAQ,UAAU,EAAE;AAAA,MAC9E;AAEA,UAAI,CAAC,UAAU;AACb,YAAI,gBAAgB;AAClB,cAAI;AAAA,YACF,mCAAmC,WAAW,mBAAmB,SAAS,cAAc,kBAAkB,UAAU,KAAK,OAAO,aAAa,gBAAgB,WAAW,eAAe,KAAK,IAAI,IAAI,WAAW;AAAA,UACjN;AAAA,QACF,OAAO;AACL,cAAI;AAAA,YACF,oDAAoD,SAAS,UAAU,KAAK,OAAO,aAAa,eAAe,KAAK,IAAI,IAAI,WAAW;AAAA,UACzI;AAAA,QACF;AACA,eAAO;AAAA,MACT;AAEA,UAAI,CAAC,SAAS,IAAI;AAChB,YAAI,SAAS;AACb,YAAI,YAAY;AAChB,YAAI;AACF,sBAAY,MAAM,SAAS,KAAK;AAEhC,cAAI;AACF,kBAAM,SAAS,KAAK,MAAM,SAAS;AACnC,qBAAS,QAAQ,OAAO,UAAU,WAAM,OAAO,MAAM,OAAO,KAAK;AAAA,UACnE,QAAQ;AAEN,gBAAI,MAAM,yBAAyB,UAAU,MAAM,GAAG,GAAG,CAAC,EAAE;AAAA,UAC9D;AAAA,QACF,SAAS,GAAG;AACV,cAAI,MAAM,wCAAwC,CAAC,EAAE;AAAA,QACvD;AACA,YAAI;AAAA,UACF,6BAA6B,SAAS,MAAM,IAAI,SAAS,UAAU,GAAG,MAAM,QACrE,SAAS,WAAW,KAAK,OAAO,aAAa,SAAS,OAAO,iBAAiB,WAAW,eAAe,YAAY,UAAoB;AAAA,QACjJ;AACA,cAAM,uBACJ,KAAK,mCAAmC,MAAM,KAC9C,KAAK,gDAAgD,SAAS;AAChE,YAAI,sBAAsB;AACxB,eAAK;AAAA,YACH;AAAA,YACA,KAAK,OAAO;AAAA,UACd;AACA,eAAK,kBAAkB;AACvB,iBAAO;AAAA,QACT;AACA,YAAI,SAAS,WAAW,KAAK;AAC3B,eAAK,mBAAmB;AACxB,cAAI,KAAK,mBAAmB,KAAK,OAAO,0BAA0B;AAChE,iBAAK,kBAAkB,KAAK,IAAI,IAAI,KAAK,OAAO;AAChD,gBAAI;AAAA,cACF,oCAAoC,KAAK,OAAO,qBAAqB,YAC1D,KAAK,eAAe;AAAA,YACjC;AACA,iBAAK,kBAAkB;AAAA,UACzB;AAAA,QACF,OAAO;AACL,eAAK,kBAAkB;AAAA,QACzB;AACA,eAAO;AAAA,MACT;AACA,WAAK,kBAAkB;AAEvB,YAAM,OAAQ,MAAM,SAAS,KAAK;AAWlC,UAAI;AAAA,QACF,+BAA+B,KAAK,SAAS,MAAM,WAAW,KAAK,UAAU,KAAK,KAAK,CAAC;AAAA,MAC1F;AAKA,YAAM,MAAM,KAAK,UAAU,CAAC,GAAG;AAC/B,YAAM,UAAU,KAAK,WAAW,KAAK,qBAAqB;AAC1D,UAAI,CAAC,SAAS;AACZ,YAAI,KAAK,6CAA6C,KAAK,UAAU,KAAK,OAAO,GAAG,MAAM,GAAG,GAAG,CAAC,EAAE;AACnG,eAAO;AAAA,MACT;AAGA,YAAM,QAAQ,KAAK,QACf;AAAA,QACE,cAAc,KAAK,MAAM,iBAAiB;AAAA,QAC1C,kBAAkB,KAAK,MAAM,qBAAqB;AAAA,QAClD,aAAa,KAAK,MAAM,gBAAgB;AAAA,MAC1C,IACA,KAAK,eAAe,UAAU,OAAO;AAEzC,YAAM,aAAa,KAAK,IAAI,IAAI;AAChC,UAAI,sCAAsC,KAAK,MAAM,EAAE,WAAW,cAAc,KAAK,OAAO,oBAAoB;AAC9G,cAAMC,eAAc,SAAS,OAAO,CAAC,KAAK,MAAM,OAAO,EAAE,SAAS,UAAU,IAAI,CAAC;AACjF,cAAM,KAAK,QAAQ,YAAY,OAAO,QAAQ,SAAS,KAAK;AAC5D,YAAI;AAAA,UACF,kBAAkB,EAAE,eAAe,UAAU,UAAU,KAAK,OAAO,aAAa,QAAQ,OAAO,gBAAgBA,YAAW,iBAAiB,MAAM,gBAAgB,gBAAgB,MAAM,WAAW;AAAA,QACpM;AAAA,MACF;AAEA,UAAI,MAAM,yCAAyC,MAAM,WAAW;AACpE,aAAO,EAAE,SAAS,MAAM;AAAA,IAC1B,SAAS,KAAK;AACZ,YAAM,SAAS,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC9D,YAAM,aAAa,KAAK,IAAI,IAAI;AAChC,UAAI,KAAK,aAAa,GAAG,GAAG;AAC1B,YAAI;AAAA,UACF,iCAAiC,SAAS,cAAc,QAAQ,aAAa,KAAK,OAAO,iBAAiB,UAAU,KAAK,OAAO,aAAa,eAAe,UAAU,UAAU,MAAM;AAAA,QACxL;AACA,eAAO;AAAA,MACT;AACA,UAAI,KAAK,+BAA+B,SAAS,UAAU,MAAM,EAAE;AACnE,WAAK,cAAc;AACnB,YAAM,uBAAuB,KAAK,mCAAmC,MAAM;AAC3E,UAAI,sBAAsB;AACxB,aAAK;AAAA,UACH;AAAA,UACA,KAAK,OAAO;AAAA,QACd;AAAA,MACF;AACA,aAAO;AAAA,IACT,UAAE;AACA,UAAI,WAAW;AACb,cAAM,eAAe,KAAK,IAAI;AAC9B,cAAM,SAAS,cAAc,UAAU;AACvC,YAAI;AAAA,UACF,oCAAoC,UAAU,QAAQ,WAAW,MAAM,UAAU,eAAe,WAAW,YAAY,eAAe,UAAU,YAAY,OAAO,SAAS;AAAA,QAC9K;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,qBAAqD;AACzD,UAAM,UAAU;AAAA,MACd,KAAK,OAAO,YAAY,QAAQ,aAAa,WAAW;AAAA,IAC1D;AAGA,UAAM,YAAY,QAAQ,SAAS,KAAK,IACpC,GAAG,OAAO,YACV,GAAG,OAAO;AACd,QAAI,MAAM,4BAA4B,SAAS,EAAE;AAEjD,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,iBAAiB,WAAW,GAAI;AAC1D,UAAI,CAAC,OAAO,IAAI;AACd,YAAI,OAAO,WAAW,OAAO,OAAO,WAAW,KAAK;AAClD,cAAI;AAAA,YACF,sDAAsD,SAAS;AAAA,UACjE;AAAA,QACF;AACA,YAAI,KAAK,0CAA0C,SAAS,0BAA0B;AACtF,eAAO;AAAA,MACT;AACA,UAAI,CAAC,OAAO,MAAM;AAChB,YAAI,KAAK,oCAAoC,SAAS,EAAE;AACxD,eAAO;AAAA,MACT;AAEA,YAAM,OAAO,OAAO;AAiBpB,UAAI,CAAC,MAAM,QAAQ,KAAK,IAAI,KAAK,KAAK,KAAK,WAAW,GAAG;AACvD,YAAI,KAAK,8BAA8B;AACvC,eAAO;AAAA,MACT;AAGA,YAAM,WAAW,KAAK,KAAK,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,OAAO,OAAO;AAC1D,UAAI;AAAA,QACF,oBAAoB,SAAS,MAAM,wBAAwB,SAAS,MAAM,GAAG,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,MAC7F;AAGA,YAAM,kBAAkB,KAAK,OAAO;AACpC,UAAI,QAAQ,KAAK,KAAK,KAAK,CAAC,MAAM,EAAE,OAAO,eAAe;AAG1D,UAAI,CAAC,OAAO;AACV,gBAAQ,KAAK,KAAK;AAAA,UAAK,CAAC,MACtB,gBAAgB,SAAS,EAAE,MAAM,EAAE,MAClC,EAAE,MAAM,IAAI,SAAS,gBAAgB,QAAQ,YAAY,EAAE,CAAC;AAAA,QAC/D;AAAA,MACF;AAGA,UAAI,CAAC,OAAO;AACV,gBAAQ,KAAK,KAAK,CAAC;AACnB,cAAM,mBAAmB,KAAK,KAC3B,IAAI,CAAC,MAAM,EAAE,EAAE,EACf,OAAO,OAAO,EACd,MAAM,GAAG,EAAE,EACX,KAAK,IAAI;AACZ,YAAI;AAAA,UACF,qBAAqB,eAAe,oCAC1B,MAAM,EAAE,oCAAoC,gBAAgB;AAAA,QACxE;AAAA,MACF;AAGA,UAAI,gBAAgB,MAAM,sBAAsB,MAAM;AAGtD,UAAI,CAAC,eAAe;AAClB,YAAI,KAAK,iEAAiE;AAC1E,cAAM,aAAa,KAAK,uBAAuB,MAAM,MAAM,EAAE;AAC7D,YAAI,YAAY;AACd,0BAAgB;AAAA,QAClB;AAAA,MACF;AAEA,WAAK,kBAAkB;AAAA,QACrB,IAAI,MAAM,MAAM;AAAA,QAChB;AAAA,QACA,WAAW,MAAM;AAAA,MACnB;AAEA,UAAI;AAAA,QACF,6BAA6B,KAAK,gBAAgB,EAAE,qBACjC,eAAe,eAAe,KAAK,2BAA2B;AAAA,MACnF;AAEA,aAAO,KAAK;AAAA,IACd,SAAS,KAAK;AACZ,UAAI,KAAK,+BAA+B,GAAG,EAAE;AAC7C,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,oBAAoB,uBAIvB;AACD,UAAM,WAAqB,CAAC;AAE5B,UAAM,YAAY,MAAM,KAAK,mBAAmB;AAChD,QAAI,CAAC,WAAW;AACd,aAAO,EAAE,WAAW,OAAO,UAAU,CAAC,0CAA0C,EAAE;AAAA,IACpF;AAGA,QAAI,yBAAyB,UAAU,eAAe;AACpD,UAAI,UAAU,gBAAgB,uBAAuB;AACnD,iBAAS;AAAA,UACP,kCAAkC,UAAU,EAAE,aAAa,UAAU,cAAc,eAAe,CAAC,yCACnE,sBAAsB,eAAe,CAAC,6BAC3C,UAAU,aAAa;AAAA,QACpD;AAAA,MACF;AAAA,IACF;AAGA,QAAI,CAAC,UAAU,eAAe;AAC5B,eAAS;AAAA,QACP,sDAAsD,UAAU,EAAE;AAAA,MAEpE;AAAA,IACF;AAEA,WAAO;AAAA,MACL,WAAW;AAAA,MACX,qBAAqB,UAAU;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eACJ,UACA,UAAyC,CAAC,GACI;AAC9C,QAAI,CAAC,4BAA4B,KAAK,MAAM,EAAE,UAAU;AACtD,UAAI,MAAM,qCAAqC;AAC/C,aAAO;AAAA,IACT;AAEA,UAAM,cAAc,KAAK,oBAAoB;AAC7C,QAAI,cAAc,GAAG;AACnB,UAAI,MAAM,+BAA+B,WAAW,iCAAiC;AACrF,aAAO;AAAA,IACT;AACA,QAAI,QAAQ,UAAU;AACpB,YAAM,WAAW,QAAQ;AACzB,aAAO,MAAM,IAAI,QAA6C,CAAC,YAAY;AACzE,aAAK,cAAc,QAAQ,EAAE,KAAK;AAAA,UAChC;AAAA,UACA;AAAA,UACA;AAAA,UACA,cAAc,KAAK,IAAI;AAAA,UACvB;AAAA,QACF,CAAC;AACD,aAAK,mBAAmB;AAAA,MAC1B,CAAC;AAAA,IACH;AAEA,WAAO,MAAM,KAAK,yBAAyB,UAAU,OAAO;AAAA,EAC9D;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,eACN,UACA,UACyE;AACzE,UAAM,cAAc,SAAS,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,QAAQ,QAAQ,CAAC;AACzE,UAAM,eAAe,KAAK,KAAK,cAAc,CAAC;AAC9C,UAAM,mBAAmB,KAAK,KAAK,SAAS,SAAS,CAAC;AAEtD,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA,aAAa,eAAe;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aACJ,gBACA,mBACA,eACY;AAEZ,QAAI,4BAA4B,KAAK,MAAM,EAAE,UAAU;AACrD,YAAM,cAAc,MAAM,eAAe;AACzC,UAAI,gBAAgB,MAAM;AACxB,YAAI,MAAM,GAAG,aAAa,kBAAkB;AAC5C,eAAO;AAAA,MACT;AAGA,UAAI,KAAK,OAAO,kBAAkB;AAChC,YAAI,KAAK,GAAG,aAAa,gDAAgD;AAAA,MAC3E,OAAO;AACL,cAAM,IAAI,MAAM,GAAG,aAAa,+CAA+C;AAAA,MACjF;AAAA,IACF;AAGA,WAAO,kBAAkB;AAAA,EAC3B;AACF;","names":["backoffMs","promptChars"]}