@vibgrate/cli 2026.818.2 → 2026.819.2

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 (187) hide show
  1. package/DOCS.md +3 -3
  2. package/dist/agent-ZJRWCMR6.js +30 -0
  3. package/dist/{agent-X6VYCE63.js.map → agent-ZJRWCMR6.js.map} +1 -1
  4. package/dist/{approvals-TPQFQSWG.js → approvals-YTUXBZWQ.js} +7 -7
  5. package/dist/{approvals-TPQFQSWG.js.map → approvals-YTUXBZWQ.js.map} +1 -1
  6. package/dist/attach-WOA25VNH.js +10 -0
  7. package/dist/{attach-G5JUIWIT.js.map → attach-WOA25VNH.js.map} +1 -1
  8. package/dist/baseline-TVRRUZGA.js +9 -0
  9. package/dist/{baseline-DXI64VLW.js.map → baseline-TVRRUZGA.js.map} +1 -1
  10. package/dist/{chunk-V6WONSIK.js → chunk-24HKTTFV.js} +5 -5
  11. package/dist/{chunk-V6WONSIK.js.map → chunk-24HKTTFV.js.map} +1 -1
  12. package/dist/{chunk-VMAIDM4K.js → chunk-2C4QT5D7.js} +5 -5
  13. package/dist/{chunk-VMAIDM4K.js.map → chunk-2C4QT5D7.js.map} +1 -1
  14. package/dist/{chunk-JGA63RGF.js → chunk-2ZBLZ2S3.js} +13 -13
  15. package/dist/{chunk-JGA63RGF.js.map → chunk-2ZBLZ2S3.js.map} +1 -1
  16. package/dist/{chunk-OV4KGXPD.js → chunk-57ZRSCHY.js} +3 -3
  17. package/dist/{chunk-OV4KGXPD.js.map → chunk-57ZRSCHY.js.map} +1 -1
  18. package/dist/{chunk-NDNNOAS6.js → chunk-6H2QV5DR.js} +3 -3
  19. package/dist/{chunk-NDNNOAS6.js.map → chunk-6H2QV5DR.js.map} +1 -1
  20. package/dist/{chunk-2C33WR5O.js → chunk-7BSUPHX6.js} +3 -3
  21. package/dist/{chunk-2C33WR5O.js.map → chunk-7BSUPHX6.js.map} +1 -1
  22. package/dist/{chunk-LJSJX6U4.js → chunk-A3WWRW7U.js} +3 -3
  23. package/dist/{chunk-LJSJX6U4.js.map → chunk-A3WWRW7U.js.map} +1 -1
  24. package/dist/{chunk-X2MQ7UFL.js → chunk-AP3JN33O.js} +12 -12
  25. package/dist/{chunk-X2MQ7UFL.js.map → chunk-AP3JN33O.js.map} +1 -1
  26. package/dist/{chunk-O5IJDMTB.js → chunk-AQZYDFEK.js} +4 -4
  27. package/dist/{chunk-O5IJDMTB.js.map → chunk-AQZYDFEK.js.map} +1 -1
  28. package/dist/{chunk-VQ5KMHW6.js → chunk-BQ6NTRRK.js} +44 -15
  29. package/dist/chunk-BQ6NTRRK.js.map +1 -0
  30. package/dist/{chunk-HF6R73UC.js → chunk-C2EZIAA3.js} +27 -13
  31. package/dist/chunk-C2EZIAA3.js.map +1 -0
  32. package/dist/{chunk-MRZHNUN7.js → chunk-CA4YQBA7.js} +4 -4
  33. package/dist/{chunk-MRZHNUN7.js.map → chunk-CA4YQBA7.js.map} +1 -1
  34. package/dist/{chunk-YF54UMOU.js → chunk-CBL3VY7J.js} +3 -3
  35. package/dist/{chunk-YF54UMOU.js.map → chunk-CBL3VY7J.js.map} +1 -1
  36. package/dist/{chunk-PRHH4DVO.js → chunk-FCMWHSQ6.js} +3 -3
  37. package/dist/{chunk-PRHH4DVO.js.map → chunk-FCMWHSQ6.js.map} +1 -1
  38. package/dist/{chunk-V2UGRUTL.js → chunk-GBXOAO5V.js} +176 -37
  39. package/dist/chunk-GBXOAO5V.js.map +1 -0
  40. package/dist/{chunk-JFE7XCAE.js → chunk-IASO2HCI.js} +3 -3
  41. package/dist/{chunk-JFE7XCAE.js.map → chunk-IASO2HCI.js.map} +1 -1
  42. package/dist/{chunk-ZUOBPKVK.js → chunk-IMI2VHHZ.js} +3 -3
  43. package/dist/{chunk-ZUOBPKVK.js.map → chunk-IMI2VHHZ.js.map} +1 -1
  44. package/dist/{chunk-NKLYDSB7.js → chunk-JPOYXG7Z.js} +10 -10
  45. package/dist/{chunk-NKLYDSB7.js.map → chunk-JPOYXG7Z.js.map} +1 -1
  46. package/dist/{chunk-L2OS4WHT.js → chunk-MMJFHEZ4.js} +4 -4
  47. package/dist/{chunk-L2OS4WHT.js.map → chunk-MMJFHEZ4.js.map} +1 -1
  48. package/dist/{chunk-E3O5UKNA.js → chunk-NKKOGJ63.js} +35 -17
  49. package/dist/chunk-NKKOGJ63.js.map +1 -0
  50. package/dist/{chunk-7AVYKZEM.js → chunk-NV7XNBX4.js} +4 -4
  51. package/dist/{chunk-7AVYKZEM.js.map → chunk-NV7XNBX4.js.map} +1 -1
  52. package/dist/{chunk-NJQZRM55.js → chunk-OGFOJG4H.js} +6 -6
  53. package/dist/{chunk-NJQZRM55.js.map → chunk-OGFOJG4H.js.map} +1 -1
  54. package/dist/{chunk-NZELMYT4.js → chunk-OLIMW4PQ.js} +8 -56
  55. package/dist/chunk-OLIMW4PQ.js.map +1 -0
  56. package/dist/{chunk-B4EXD5LK.js → chunk-PJRPSYFQ.js} +9 -7
  57. package/dist/chunk-PJRPSYFQ.js.map +1 -0
  58. package/dist/{chunk-NG4KIJW6.js → chunk-PVNALGTG.js} +10 -6
  59. package/dist/chunk-PVNALGTG.js.map +1 -0
  60. package/dist/{chunk-BMOFJIMG.js → chunk-QE6F62FR.js} +3 -3
  61. package/dist/{chunk-BMOFJIMG.js.map → chunk-QE6F62FR.js.map} +1 -1
  62. package/dist/{chunk-6ABMV74F.js → chunk-R5TQBIR6.js} +4 -4
  63. package/dist/{chunk-6ABMV74F.js.map → chunk-R5TQBIR6.js.map} +1 -1
  64. package/dist/{chunk-5I4VSBWQ.js → chunk-RTURQXQL.js} +372 -113
  65. package/dist/chunk-RTURQXQL.js.map +1 -0
  66. package/dist/{chunk-74UBGF4P.js → chunk-SHD5TCZ5.js} +3 -3
  67. package/dist/{chunk-74UBGF4P.js.map → chunk-SHD5TCZ5.js.map} +1 -1
  68. package/dist/{chunk-KU7FI5EV.js → chunk-USPMMVNH.js} +3 -3
  69. package/dist/{chunk-KU7FI5EV.js.map → chunk-USPMMVNH.js.map} +1 -1
  70. package/dist/{chunk-E53WBVUQ.js → chunk-VHRSG6CF.js} +3 -3
  71. package/dist/{chunk-E53WBVUQ.js.map → chunk-VHRSG6CF.js.map} +1 -1
  72. package/dist/{chunk-I5LP55B6.js → chunk-W44THEXF.js} +3 -3
  73. package/dist/{chunk-I5LP55B6.js.map → chunk-W44THEXF.js.map} +1 -1
  74. package/dist/{chunk-AEJYA6HZ.js → chunk-W6ASIMG5.js} +7 -7
  75. package/dist/{chunk-AEJYA6HZ.js.map → chunk-W6ASIMG5.js.map} +1 -1
  76. package/dist/{chunk-CQDUBAQY.js → chunk-WNKGRXUA.js} +3 -3
  77. package/dist/{chunk-CQDUBAQY.js.map → chunk-WNKGRXUA.js.map} +1 -1
  78. package/dist/{chunk-RHKOUPWT.js → chunk-WPLOEFZU.js} +7 -5
  79. package/dist/chunk-WPLOEFZU.js.map +1 -0
  80. package/dist/{chunk-FJG5AXKZ.js → chunk-WUFIXAEJ.js} +22 -6
  81. package/dist/chunk-WUFIXAEJ.js.map +1 -0
  82. package/dist/{chunk-6PFHDHOL.js → chunk-XLQ4YHS3.js} +16 -14
  83. package/dist/chunk-XLQ4YHS3.js.map +1 -0
  84. package/dist/{chunk-BWPBB45M.js → chunk-XP6UUCZZ.js} +3 -3
  85. package/dist/{chunk-BWPBB45M.js.map → chunk-XP6UUCZZ.js.map} +1 -1
  86. package/dist/{chunk-BPF3YX2U.js → chunk-XQNKCA2J.js} +6 -3
  87. package/dist/chunk-XQNKCA2J.js.map +1 -0
  88. package/dist/{chunk-FFXGWFAE.js → chunk-XW2XQM3C.js} +7 -7
  89. package/dist/{chunk-FFXGWFAE.js.map → chunk-XW2XQM3C.js.map} +1 -1
  90. package/dist/{chunk-7N4Y3E47.js → chunk-YJYEPYB2.js} +13 -18
  91. package/dist/chunk-YJYEPYB2.js.map +1 -0
  92. package/dist/chunk-ZUZHYAJK.js +6 -0
  93. package/dist/{chunk-4NTNMT6T.js.map → chunk-ZUZHYAJK.js.map} +1 -1
  94. package/dist/cli.js +112 -108
  95. package/dist/cli.js.map +1 -1
  96. package/dist/client-P5XSRFV4.js +8 -0
  97. package/dist/{client-UQIELEEZ.js.map → client-P5XSRFV4.js.map} +1 -1
  98. package/dist/daemon-YKOEP3XA.js +30 -0
  99. package/dist/{daemon-GUMWMKCA.js.map → daemon-YKOEP3XA.js.map} +1 -1
  100. package/dist/embed-worker-main.js +5 -5
  101. package/dist/ensure-map-BLRJDO2Y.js +40 -0
  102. package/dist/{ensure-map-FHDJTO7Y.js.map → ensure-map-BLRJDO2Y.js.map} +1 -1
  103. package/dist/federation-M4ZNXOPX.js +8 -0
  104. package/dist/{federation-MDQPO3PW.js.map → federation-M4ZNXOPX.js.map} +1 -1
  105. package/dist/fs-FO3NQHPT.js +4 -0
  106. package/dist/fs-FO3NQHPT.js.map +1 -0
  107. package/dist/git-ref-LMT3EXYY.js +4 -0
  108. package/dist/{git-ref-RSRAN4OH.js.map → git-ref-LMT3EXYY.js.map} +1 -1
  109. package/dist/graph-backend-NTYONTWW.js +16 -0
  110. package/dist/{graph-backend-W2D3HRRD.js.map → graph-backend-NTYONTWW.js.map} +1 -1
  111. package/dist/index.d.ts +1 -1
  112. package/dist/index.js +24 -25
  113. package/dist/index.js.map +1 -1
  114. package/dist/{interactive-2MK4TLRD.js → interactive-B3WTC7LB.js} +41 -42
  115. package/dist/interactive-B3WTC7LB.js.map +1 -0
  116. package/dist/{llm-host-XFYFOAAX.js → llm-host-QVTJJVER.js} +5 -5
  117. package/dist/{llm-host-XFYFOAAX.js.map → llm-host-QVTJJVER.js.map} +1 -1
  118. package/dist/load-AJROS77R.js +11 -0
  119. package/dist/{load-4R4HYMBB.js.map → load-AJROS77R.js.map} +1 -1
  120. package/dist/local-runtime-GA43KYS5.js +6 -0
  121. package/dist/{local-runtime-6SNWKSA7.js.map → local-runtime-GA43KYS5.js.map} +1 -1
  122. package/dist/model-manager-6H3TMZKK.js +10 -0
  123. package/dist/{model-manager-SXHZ5VD4.js.map → model-manager-6H3TMZKK.js.map} +1 -1
  124. package/dist/{model-orchestrator-LHYPJBFH.js → model-orchestrator-X3NE3Y2G.js} +6 -6
  125. package/dist/{model-orchestrator-LHYPJBFH.js.map → model-orchestrator-X3NE3Y2G.js.map} +1 -1
  126. package/dist/parse-worker.js +2 -2
  127. package/dist/{paths-62AKTFSR.js → paths-RVK6FKRN.js} +4 -4
  128. package/dist/{paths-62AKTFSR.js.map → paths-RVK6FKRN.js.map} +1 -1
  129. package/dist/publish-27S66NOW.js +9 -0
  130. package/dist/{publish-7YHRTBRA.js.map → publish-27S66NOW.js.map} +1 -1
  131. package/dist/resolve-gguf-WVKVDN45.js +9 -0
  132. package/dist/{resolve-gguf-SDIYGGI6.js.map → resolve-gguf-WVKVDN45.js.map} +1 -1
  133. package/dist/{run-outcome-H5GVDDZJ.js → run-outcome-SBBSTSH3.js} +7 -7
  134. package/dist/{run-outcome-H5GVDDZJ.js.map → run-outcome-SBBSTSH3.js.map} +1 -1
  135. package/dist/runtime-session-JYYKQVDX.js +26 -0
  136. package/dist/{runtime-session-JBIHHH5N.js.map → runtime-session-JYYKQVDX.js.map} +1 -1
  137. package/dist/session-2ZMHZ2O6.js +17 -0
  138. package/dist/{session-N5IU4K5Q.js.map → session-2ZMHZ2O6.js.map} +1 -1
  139. package/dist/{slot-subscription-25GOARW5.js → slot-subscription-C2ZUJED6.js} +5 -5
  140. package/dist/{slot-subscription-25GOARW5.js.map → slot-subscription-C2ZUJED6.js.map} +1 -1
  141. package/dist/{stream-json-4WLSUF6I.js → stream-json-ZWGB4C47.js} +17 -17
  142. package/dist/{stream-json-4WLSUF6I.js.map → stream-json-ZWGB4C47.js.map} +1 -1
  143. package/dist/version-5QIEUXU6.js +4 -0
  144. package/dist/{version-DTEU3SQD.js.map → version-5QIEUXU6.js.map} +1 -1
  145. package/dist/{vg-mcp-bridge-KDVYIMFX.js → vg-mcp-bridge-4FETMJ6M.js} +16 -15
  146. package/dist/vg-mcp-bridge-4FETMJ6M.js.map +1 -0
  147. package/dist/{vgd-M7UOPWLB.js → vgd-R524P5BJ.js} +13 -14
  148. package/dist/vgd-R524P5BJ.js.map +1 -0
  149. package/package.json +1 -1
  150. package/dist/agent-X6VYCE63.js +0 -30
  151. package/dist/attach-G5JUIWIT.js +0 -10
  152. package/dist/baseline-DXI64VLW.js +0 -9
  153. package/dist/chunk-4NTNMT6T.js +0 -6
  154. package/dist/chunk-5I4VSBWQ.js.map +0 -1
  155. package/dist/chunk-6PFHDHOL.js.map +0 -1
  156. package/dist/chunk-7N4Y3E47.js.map +0 -1
  157. package/dist/chunk-B4EXD5LK.js.map +0 -1
  158. package/dist/chunk-BPF3YX2U.js.map +0 -1
  159. package/dist/chunk-E3O5UKNA.js.map +0 -1
  160. package/dist/chunk-FJG5AXKZ.js.map +0 -1
  161. package/dist/chunk-HF6R73UC.js.map +0 -1
  162. package/dist/chunk-NG4KIJW6.js.map +0 -1
  163. package/dist/chunk-NZELMYT4.js.map +0 -1
  164. package/dist/chunk-POOL355F.js +0 -237
  165. package/dist/chunk-POOL355F.js.map +0 -1
  166. package/dist/chunk-RHKOUPWT.js.map +0 -1
  167. package/dist/chunk-V2UGRUTL.js.map +0 -1
  168. package/dist/chunk-VQ5KMHW6.js.map +0 -1
  169. package/dist/client-UQIELEEZ.js +0 -8
  170. package/dist/daemon-GUMWMKCA.js +0 -31
  171. package/dist/ensure-map-FHDJTO7Y.js +0 -41
  172. package/dist/federation-MDQPO3PW.js +0 -7
  173. package/dist/fs-TLPOWC2D.js +0 -4
  174. package/dist/fs-TLPOWC2D.js.map +0 -1
  175. package/dist/git-ref-RSRAN4OH.js +0 -4
  176. package/dist/graph-backend-W2D3HRRD.js +0 -16
  177. package/dist/interactive-2MK4TLRD.js.map +0 -1
  178. package/dist/load-4R4HYMBB.js +0 -11
  179. package/dist/local-runtime-6SNWKSA7.js +0 -6
  180. package/dist/model-manager-SXHZ5VD4.js +0 -10
  181. package/dist/publish-7YHRTBRA.js +0 -9
  182. package/dist/resolve-gguf-SDIYGGI6.js +0 -9
  183. package/dist/runtime-session-JBIHHH5N.js +0 -27
  184. package/dist/session-N5IU4K5Q.js +0 -17
  185. package/dist/version-DTEU3SQD.js +0 -4
  186. package/dist/vg-mcp-bridge-KDVYIMFX.js.map +0 -1
  187. package/dist/vgd-M7UOPWLB.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/code/stream-json.ts"],"names":[],"mappings":"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","file":"stream-json-4WLSUF6I.js","sourcesContent":["/**\n * Machine-readable event protocol for `vg code --stream-json` (VG-CLI-CODE §18).\n *\n * A host UI (the VS Code VG Code panel) can't drive the agent through the human\n * TTY renderer, so this exposes the agent as a line protocol: every\n * {@link AgentEvent} is emitted as one NDJSON object on stdout, and each\n * approval / user question is a round-trip — an event out, a decision/answer\n * line in. This keeps the governance gate intact across the process boundary\n * (the host's Approve/Reject and question UI fulfil the same contracts the CLI\n * would — no quick-apply back-door), while the host stays a pure relay.\n *\n * Pure over an injected `emit` + the decision channel, so the protocol is\n * unit-tested without a process, model, or socket.\n */\n\nimport { runAgent, type AgentEvent, type AgentOptions, type AgentResult } from './agent.js';\nimport type { AskUserRequest, MutatingAction } from './tools.js';\nimport { sanitizeAttachments, type SessionAttachment } from './session-store.js';\nimport type { ImageAttachment, ReasoningEffort } from './types.js';\n\n/**\n * Version of this NDJSON protocol, carried on `session-start`. Hosts use it to\n * fail closed (e.g. disable features that need a newer engine) instead of\n * silently assuming the engine honours frames it may not know. Bump when a\n * frame is added or its meaning changes.\n *\n * - 1 (implicit): the original protocol; `session-start` had no version field.\n * - 2: `session-start` reports sessionDir/engineVersion/protocolVersion/\n * provider/model; `--continue` accepts an explicit session id; checkpoint\n * restore is available out-of-band via `vg code --restore-checkpoint`.\n * - 3: approvals accept `always: true` (persist a standing allow rule from\n * `.vibgrate/code-approvals.json`); a completed plan turn emits\n * `plan-ready` before `idle` so hosts can offer Approve plan / Keep\n * planning; read-only commands auto-approve engine-side.\n * - 4: `inject` steers the running turn (content lands at the next step\n * boundary, announced by an `injected` event); `rename` titles the live\n * session; the session store keeps an `index.json` (list without parsing\n * every session) and supports rename/delete/fork/rewind out-of-band;\n * `session-start` reports `worktree` when the run is rooted in one.\n * - 5: reasoning models are visible — a `thinking` event streams the model's\n * reasoning channel separately from its answer, and `submit` carries an\n * optional `reasoningEffort`. The `usage` event reports\n * `cachedPromptTokens` when the provider says how much of the prompt it\n * served from cache, so a host can price a turn instead of guessing.\n * `submit` also carries `attachments` metadata, so a restored chat can\n * show what was attached to a turn (names and sizes, never the bytes).\n */\nexport const STREAM_JSON_PROTOCOL_VERSION = 5;\n\n/** Environment facts a `session-start` frame reports to the host (all optional for older callers). */\nexport interface SessionStartInfo {\n /** Absolute directory session files live in — the single source of truth for history UIs. */\n sessionDir?: string;\n /** Engine (CLI) version string, for host version reports. */\n engineVersion?: string;\n protocolVersion?: number;\n provider?: string;\n model?: string;\n /** v4: set when this session runs inside an isolated git worktree. */\n worktree?: { path: string; base: string };\n}\n\n/** Per-turn approval posture a host can send with `submit` (session mode). */\nexport type TurnAgentMode = 'agent' | 'plan' | 'auto';\n\n/** One queued task from the host: instruction plus optional mode/attachments. */\nexport interface TurnRequest {\n instruction: string;\n /** Overrides the spawn-time posture for this turn only (plan blocks writes engine-side). */\n agentMode?: TurnAgentMode;\n /** Images attached to this turn (multimodal providers encode them). */\n images?: ImageAttachment[];\n /** v5: reasoning budget for this turn (ignored by models without the knob). */\n reasoningEffort?: ReasoningEffort;\n /**\n * v5: what the user attached, as metadata only (name/kind/size). The bytes\n * travel separately on `images` (or already folded into the instruction for\n * text); this exists so the stored session can show a restored chat what was\n * attached without carrying the payload.\n */\n attachments?: SessionAttachment[];\n}\n\n/** A single line written to the host. Discriminated by `event`. */\nexport type StreamJsonOut =\n | ({ event: 'event' } & AgentEvent)\n | { event: 'approve-request'; id: number; action: MutatingAction }\n /** Clarifying question for the human — host shows a prompt and answers via stdin. */\n | { event: 'user-question'; id: number; question: string; options?: string[] }\n | { event: 'done'; result: AgentResult }\n | { event: 'error'; message: string }\n /** Session mode only: the process is up and owns this session id. */\n | ({ event: 'session-start'; sessionId: string; resumed: boolean } & SessionStartInfo)\n /** Session mode only: the turn ended; send another `submit` or `end`. */\n | { event: 'idle'; turns: number }\n /**\n * Session mode only (v3): a plan-mode turn just completed. Emitted before\n * `idle` so a host can paint an Approve plan / Keep planning affordance;\n * hosts that don't know the frame ignore it and see `idle` as before.\n */\n | { event: 'plan-ready'; turns: number }\n /** Outcome of a checkpoint restore the host asked for. */\n | {\n event: 'checkpoint-restored';\n commit: string;\n restored: string[];\n removed: string[];\n failed: string[];\n };\n\n/**\n * A line read from the host. Approvals and answers fulfil an open round-trip;\n * `submit` starts the next turn in a session; `cancel` stops the running turn\n * without killing the process; `end` closes the session.\n */\nexport type HostMessage =\n | { kind: 'approve'; id: number; approve: boolean; always?: boolean }\n | { kind: 'answer'; id: number; answer: string }\n | {\n kind: 'submit';\n instruction: string;\n agentMode?: TurnAgentMode;\n images?: ImageAttachment[];\n /** v5: reasoning budget for this turn (ignored by models without the knob). */\n reasoningEffort?: ReasoningEffort;\n /** v5: attachment metadata for the session record (never the bytes). */\n attachments?: SessionAttachment[];\n }\n | { kind: 'restore'; commit: string; files: string[] }\n /** Manual compaction: condense the stored session so the recap shrinks. */\n | { kind: 'compact' }\n /**\n * v4 steer: mid-turn user content for the *running* turn, applied at the next\n * step boundary (unlike `submit`, which queues a whole next turn). Buffered —\n * an inject racing the turn's end is delivered at the start of the next turn\n * rather than dropped.\n */\n | { kind: 'inject'; text: string }\n /** v4: title the live session (empty text clears back to the derived name). */\n | { kind: 'rename'; title: string }\n | { kind: 'cancel' }\n | { kind: 'end' };\n\n/**\n * Parse one host line. Returns null for malformed input or an unknown shape, so\n * a garbled line is ignored rather than taking the session down.\n */\nexport function parseHostMessage(raw: string): HostMessage | null {\n let msg: Record<string, unknown>;\n try {\n msg = JSON.parse(raw) as Record<string, unknown>;\n } catch {\n return null;\n }\n if (!msg || typeof msg !== 'object') return null;\n if (typeof msg.approveId === 'number') {\n // v3: `always: true` on an approval asks the engine to persist a standing\n // allow rule for this action shape. Only meaningful with approve: true.\n return {\n kind: 'approve',\n id: msg.approveId,\n approve: !!msg.approve,\n ...(msg.always === true && msg.approve ? { always: true } : {}),\n };\n }\n if (typeof msg.answerId === 'number') {\n return { kind: 'answer', id: msg.answerId, answer: String(msg.answer ?? '') };\n }\n if (typeof msg.submit === 'string' && msg.submit.trim()) {\n const agentMode =\n msg.agentMode === 'plan' || msg.agentMode === 'auto' || msg.agentMode === 'agent'\n ? msg.agentMode\n : undefined;\n const images = Array.isArray(msg.images)\n ? (msg.images as unknown[])\n .filter(\n (a): a is ImageAttachment =>\n !!a &&\n typeof a === 'object' &&\n typeof (a as ImageAttachment).name === 'string' &&\n typeof (a as ImageAttachment).mediaType === 'string' &&\n typeof (a as ImageAttachment).dataBase64 === 'string',\n )\n .slice(0, 8)\n : undefined;\n const reasoningEffort =\n msg.reasoningEffort === 'low' || msg.reasoningEffort === 'medium' || msg.reasoningEffort === 'high'\n ? msg.reasoningEffort\n : undefined;\n const attachments = sanitizeAttachments(msg.attachments);\n return {\n kind: 'submit',\n instruction: msg.submit.trim(),\n ...(agentMode ? { agentMode } : {}),\n ...(images?.length ? { images } : {}),\n ...(reasoningEffort ? { reasoningEffort } : {}),\n ...(attachments.length ? { attachments } : {}),\n };\n }\n if (\n msg.restore &&\n typeof msg.restore === 'object' &&\n typeof (msg.restore as Record<string, unknown>).commit === 'string'\n ) {\n const r = msg.restore as { commit: string; files?: unknown };\n const files = Array.isArray(r.files) ? r.files.filter((f): f is string => typeof f === 'string') : [];\n if (files.length) return { kind: 'restore', commit: r.commit, files };\n return null;\n }\n if (msg.compactSession === true) return { kind: 'compact' };\n if (typeof msg.inject === 'string' && msg.inject.trim()) {\n return { kind: 'inject', text: msg.inject.trim() };\n }\n if (typeof msg.renameSession === 'string') {\n return { kind: 'rename', title: msg.renameSession.trim() };\n }\n if (msg.cancel === true) return { kind: 'cancel' };\n if (msg.end === true) return { kind: 'end' };\n return null;\n}\n\n/**\n * Owns the NDJSON protocol for one run: serializes agent events, and turns each\n * approval / user question into a host round-trip via {@link submitDecision} /\n * {@link submitAnswer}. Under `auto`, approvals resolve true immediately (still\n * announced, for the log); user questions get a default \"proceed\" answer.\n */\nexport class StreamJsonSession {\n private nextId = 1;\n private readonly pendingApprove = new Map<\n number,\n { resolve: (approve: boolean) => void; action: MutatingAction }\n >();\n private readonly pendingAnswer = new Map<number, (answer: string) => void>();\n /** Cancellation for the turn currently running (session mode). */\n private turnSignal: { aborted: boolean } = { aborted: false };\n /**\n * v4 steer: user content injected mid-turn, drained by the agent loop at its\n * next step boundary. Deliberately NOT cleared between turns — an inject that\n * races the turn's end should land at the start of the next turn, not vanish.\n */\n private injected: string[] = [];\n /**\n * v3: called when the host approved with `always: true` — the owner persists\n * a standing rule derived from the approved action. Injected (not imported)\n * so this protocol class stays free of filesystem concerns.\n */\n onAlwaysRule?: (action: MutatingAction) => void;\n\n constructor(\n private readonly emit: (line: StreamJsonOut) => void,\n private auto = false,\n ) {}\n\n /**\n * Per-turn approval posture (session mode): a host `submit` can flip auto on\n * or off for the coming turn without respawning the process.\n */\n setAuto(auto: boolean): void {\n this.auto = auto;\n }\n\n /** The agent's onEvent → one NDJSON line per event. */\n readonly onEvent = (e: AgentEvent): void => {\n this.emit({ event: 'event', ...e });\n };\n\n /** The agent's approval gate → an approve-request the host answers. */\n readonly approve = (action: MutatingAction): Promise<boolean> => {\n const id = this.nextId++;\n if (this.auto) {\n this.emit({ event: 'approve-request', id, action });\n return Promise.resolve(true);\n }\n return new Promise<boolean>((resolve) => {\n this.pendingApprove.set(id, { resolve, action });\n this.emit({ event: 'approve-request', id, action });\n });\n };\n\n /** Clarifying question → user-question the host answers with free text. */\n readonly askUser = (req: AskUserRequest): Promise<string> => {\n const id = this.nextId++;\n const question = req.question.trim();\n const options = req.options?.filter(Boolean);\n if (this.auto) {\n this.emit({ event: 'user-question', id, question, options });\n return Promise.resolve(\n 'Autonomous mode: no human. Proceed with safest defaults and state assumptions.',\n );\n }\n return new Promise<string>((resolve) => {\n this.pendingAnswer.set(id, resolve);\n this.emit({ event: 'user-question', id, question, options });\n });\n };\n\n /** Host → agent: resolve a pending approval. Unknown ids are ignored. */\n submitDecision(id: number, approve: boolean, always = false): void {\n const pending = this.pendingApprove.get(id);\n if (pending) {\n this.pendingApprove.delete(id);\n // Persist the standing rule before resolving, so the rule exists by the\n // time the approved action (and any follow-up like it) executes.\n if (approve && always) this.onAlwaysRule?.(pending.action);\n pending.resolve(approve);\n }\n }\n\n /** Host → agent: resolve a pending user-question. Unknown ids are ignored. */\n submitAnswer(id: number, answer: string): void {\n const resolve = this.pendingAnswer.get(id);\n if (resolve) {\n this.pendingAnswer.delete(id);\n resolve(answer ?? '');\n }\n }\n\n /** Host → agent (v4): steer the running turn with more user content. */\n inject(text: string): void {\n const t = text.trim();\n if (t) this.injected.push(t);\n }\n\n /**\n * Drain pending steer content (joined, oldest first) for the agent loop's\n * next step. Null when nothing is pending.\n */\n drainInjected(): string | null {\n if (!this.injected.length) return null;\n const text = this.injected.join('\\n\\n');\n this.injected = [];\n return text;\n }\n\n /** Start a turn: fresh cancellation signal, handed to the agent loop. */\n beginTurn(): { aborted: boolean } {\n this.turnSignal = { aborted: false };\n return this.turnSignal;\n }\n\n /**\n * Host → agent: stop the running turn. Sets the cooperative signal *and*\n * rejects anything the turn is blocked on, so a turn waiting at an approval\n * gate unblocks instead of hanging until the process dies.\n */\n cancelTurn(): void {\n this.turnSignal.aborted = true;\n this.cancelPending();\n }\n\n /** Reject any still-pending approvals/questions (e.g. the host disconnected). */\n cancelPending(): void {\n for (const pending of this.pendingApprove.values()) pending.resolve(false);\n this.pendingApprove.clear();\n for (const resolve of this.pendingAnswer.values()) resolve('');\n this.pendingAnswer.clear();\n }\n}\n\nexport interface StreamJsonOptions extends Omit<AgentOptions, 'approve' | 'onEvent' | 'askUser'> {\n emit: (line: StreamJsonOut) => void;\n /** Register the stdin decision reader; the returned session accepts decisions. */\n bindDecisions?: (session: StreamJsonSession) => void;\n}\n\n/** One turn of a session: what the host asked, and how it ended. */\nexport interface StreamJsonTurn {\n instruction: string;\n result: AgentResult | null;\n}\n\nexport interface StreamJsonSessionRunOptions {\n emit: (line: StreamJsonOut) => void;\n /** Bound once for the whole session, not per turn. */\n bindDecisions?: (session: StreamJsonSession) => void;\n auto?: boolean;\n sessionId: string;\n /** True when this session was reloaded from disk (`--continue`). */\n resumed: boolean;\n /** Environment facts to report on `session-start` (dir, versions, model). */\n sessionInfo?: SessionStartInfo;\n /** Instruction for the first turn. Omit to wait for the host's first `submit`. */\n instruction?: string;\n /** Spawn-time approval posture; per-turn `agentMode` on `submit` overrides it. */\n spawnAuto?: boolean;\n /** Await the host's next task; resolve null to end the session. */\n nextTurn: () => Promise<TurnRequest | null>;\n /**\n * Run one turn. Injected so the heavy agent wiring (graph, providers, MCP,\n * sandbox) is built once by the caller and reused across turns — the whole\n * point of session mode.\n */\n runTurn: (turn: {\n instruction: string;\n priorSummary?: string;\n signal: { aborted: boolean };\n session: StreamJsonSession;\n /** Per-turn posture from the host (plan blocks writes engine-side). */\n agentMode?: TurnAgentMode;\n /** Effective auto for this turn (spawn flag overridden by agentMode). */\n auto: boolean;\n images?: ImageAttachment[];\n /** v5: per-turn reasoning budget, straight from the host's `submit`. */\n reasoningEffort?: ReasoningEffort;\n /** v5: attachment metadata for the session record (never the bytes). */\n attachments?: SessionAttachment[];\n }) => Promise<AgentResult>;\n /**\n * Record a finished turn. Returns the recap to seed the next turn, so\n * continuity is the caller's policy (session store, summarizer) not ours.\n */\n onTurnEnd?: (turn: StreamJsonTurn) => string | undefined;\n}\n\n/**\n * Session mode for `vg code --stream-json --session`: hold the process open and\n * run turn after turn against warm state, instead of paying a cold start (graph\n * load, overlay rebuild, MCP connect, model warm-up) on every message.\n *\n * Each turn still emits exactly the frames a single-shot run does, so a host\n * that already speaks the one-shot protocol only needs to learn `idle`. A turn\n * that throws is reported and the session stays up — one bad task should not\n * cost the user their conversation.\n */\nexport async function runCodeStreamJsonSession(\n options: StreamJsonSessionRunOptions,\n): Promise<StreamJsonTurn[]> {\n const { emit, bindDecisions, auto, sessionId, resumed, nextTurn, runTurn, onTurnEnd } = options;\n const spawnAuto = options.spawnAuto ?? !!auto;\n const session = new StreamJsonSession(emit, spawnAuto);\n bindDecisions?.(session);\n emit({ event: 'session-start', sessionId, resumed, ...(options.sessionInfo ?? {}) });\n\n const turns: StreamJsonTurn[] = [];\n let priorSummary: string | undefined;\n const first = options.instruction?.trim();\n let request: TurnRequest | null = first ? { instruction: first } : await nextTurn();\n\n while (request) {\n const signal = session.beginTurn();\n // Per-turn posture: an explicit agentMode overrides the spawn flag; plan\n // never auto-approves. First turn without a mode keeps the spawn posture.\n const turnAuto = request.agentMode ? request.agentMode === 'auto' : spawnAuto;\n session.setAuto(turnAuto && request.agentMode !== 'plan');\n const instruction = request.instruction;\n let turn: StreamJsonTurn;\n try {\n const result = await runTurn({\n instruction,\n priorSummary,\n signal,\n session,\n agentMode: request.agentMode,\n auto: turnAuto && request.agentMode !== 'plan',\n images: request.images,\n reasoningEffort: request.reasoningEffort,\n attachments: request.attachments,\n });\n emit({ event: 'done', result });\n turn = { instruction, result };\n } catch (e) {\n emit({ event: 'error', message: (e as Error).message });\n turn = { instruction, result: null };\n } finally {\n session.cancelPending();\n }\n turns.push(turn);\n priorSummary = onTurnEnd?.(turn) ?? priorSummary;\n // v3: a completed plan turn announces itself so hosts can offer\n // Approve plan / Keep planning. A failed turn is not a ready plan.\n if (request.agentMode === 'plan' && turn.result) {\n emit({ event: 'plan-ready', turns: turns.length });\n }\n emit({ event: 'idle', turns: turns.length });\n request = await nextTurn();\n }\n return turns;\n}\n\n/** Run the agent under the NDJSON protocol; always emits a terminal `done`/`error`. */\nexport async function runCodeStreamJson(options: StreamJsonOptions): Promise<AgentResult | null> {\n const { emit, bindDecisions, auto, ...agentOptions } = options;\n const session = new StreamJsonSession(emit, !!auto);\n bindDecisions?.(session);\n try {\n const result = await runAgent({\n ...agentOptions,\n auto,\n approve: session.approve,\n askUser: session.askUser,\n onEvent: session.onEvent,\n });\n emit({ event: 'done', result });\n return result;\n } catch (e) {\n emit({ event: 'error', message: (e as Error).message });\n return null;\n } finally {\n session.cancelPending();\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/code/stream-json.ts"],"names":[],"mappings":"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","file":"stream-json-ZWGB4C47.js","sourcesContent":["/**\n * Machine-readable event protocol for `vg code --stream-json` (VG-CLI-CODE §18).\n *\n * A host UI (the VS Code VG Code panel) can't drive the agent through the human\n * TTY renderer, so this exposes the agent as a line protocol: every\n * {@link AgentEvent} is emitted as one NDJSON object on stdout, and each\n * approval / user question is a round-trip — an event out, a decision/answer\n * line in. This keeps the governance gate intact across the process boundary\n * (the host's Approve/Reject and question UI fulfil the same contracts the CLI\n * would — no quick-apply back-door), while the host stays a pure relay.\n *\n * Pure over an injected `emit` + the decision channel, so the protocol is\n * unit-tested without a process, model, or socket.\n */\n\nimport { runAgent, type AgentEvent, type AgentOptions, type AgentResult } from './agent.js';\nimport type { AskUserRequest, MutatingAction } from './tools.js';\nimport { sanitizeAttachments, type SessionAttachment } from './session-store.js';\nimport type { ImageAttachment, ReasoningEffort } from './types.js';\n\n/**\n * Version of this NDJSON protocol, carried on `session-start`. Hosts use it to\n * fail closed (e.g. disable features that need a newer engine) instead of\n * silently assuming the engine honours frames it may not know. Bump when a\n * frame is added or its meaning changes.\n *\n * - 1 (implicit): the original protocol; `session-start` had no version field.\n * - 2: `session-start` reports sessionDir/engineVersion/protocolVersion/\n * provider/model; `--continue` accepts an explicit session id; checkpoint\n * restore is available out-of-band via `vg code --restore-checkpoint`.\n * - 3: approvals accept `always: true` (persist a standing allow rule from\n * `.vibgrate/code-approvals.json`); a completed plan turn emits\n * `plan-ready` before `idle` so hosts can offer Approve plan / Keep\n * planning; read-only commands auto-approve engine-side.\n * - 4: `inject` steers the running turn (content lands at the next step\n * boundary, announced by an `injected` event); `rename` titles the live\n * session; the session store keeps an `index.json` (list without parsing\n * every session) and supports rename/delete/fork/rewind out-of-band;\n * `session-start` reports `worktree` when the run is rooted in one.\n * - 5: reasoning models are visible — a `thinking` event streams the model's\n * reasoning channel separately from its answer, and `submit` carries an\n * optional `reasoningEffort`. The `usage` event reports\n * `cachedPromptTokens` when the provider says how much of the prompt it\n * served from cache, so a host can price a turn instead of guessing.\n * `submit` also carries `attachments` metadata, so a restored chat can\n * show what was attached to a turn (names and sizes, never the bytes).\n */\nexport const STREAM_JSON_PROTOCOL_VERSION = 5;\n\n/** Environment facts a `session-start` frame reports to the host (all optional for older callers). */\nexport interface SessionStartInfo {\n /** Absolute directory session files live in — the single source of truth for history UIs. */\n sessionDir?: string;\n /** Engine (CLI) version string, for host version reports. */\n engineVersion?: string;\n protocolVersion?: number;\n provider?: string;\n model?: string;\n /** v4: set when this session runs inside an isolated git worktree. */\n worktree?: { path: string; base: string };\n}\n\n/** Per-turn approval posture a host can send with `submit` (session mode). */\nexport type TurnAgentMode = 'agent' | 'plan' | 'auto';\n\n/** One queued task from the host: instruction plus optional mode/attachments. */\nexport interface TurnRequest {\n instruction: string;\n /** Overrides the spawn-time posture for this turn only (plan blocks writes engine-side). */\n agentMode?: TurnAgentMode;\n /** Images attached to this turn (multimodal providers encode them). */\n images?: ImageAttachment[];\n /** v5: reasoning budget for this turn (ignored by models without the knob). */\n reasoningEffort?: ReasoningEffort;\n /**\n * v5: what the user attached, as metadata only (name/kind/size). The bytes\n * travel separately on `images` (or already folded into the instruction for\n * text); this exists so the stored session can show a restored chat what was\n * attached without carrying the payload.\n */\n attachments?: SessionAttachment[];\n}\n\n/** A single line written to the host. Discriminated by `event`. */\nexport type StreamJsonOut =\n | ({ event: 'event' } & AgentEvent)\n | { event: 'approve-request'; id: number; action: MutatingAction }\n /** Clarifying question for the human — host shows a prompt and answers via stdin. */\n | { event: 'user-question'; id: number; question: string; options?: string[] }\n | { event: 'done'; result: AgentResult }\n | { event: 'error'; message: string }\n /** Session mode only: the process is up and owns this session id. */\n | ({ event: 'session-start'; sessionId: string; resumed: boolean } & SessionStartInfo)\n /** Session mode only: the turn ended; send another `submit` or `end`. */\n | { event: 'idle'; turns: number }\n /**\n * Session mode only (v3): a plan-mode turn just completed. Emitted before\n * `idle` so a host can paint an Approve plan / Keep planning affordance;\n * hosts that don't know the frame ignore it and see `idle` as before.\n */\n | { event: 'plan-ready'; turns: number }\n /** Outcome of a checkpoint restore the host asked for. */\n | {\n event: 'checkpoint-restored';\n commit: string;\n restored: string[];\n removed: string[];\n failed: string[];\n };\n\n/**\n * A line read from the host. Approvals and answers fulfil an open round-trip;\n * `submit` starts the next turn in a session; `cancel` stops the running turn\n * without killing the process; `end` closes the session.\n */\nexport type HostMessage =\n | { kind: 'approve'; id: number; approve: boolean; always?: boolean }\n | { kind: 'answer'; id: number; answer: string }\n | {\n kind: 'submit';\n instruction: string;\n agentMode?: TurnAgentMode;\n images?: ImageAttachment[];\n /** v5: reasoning budget for this turn (ignored by models without the knob). */\n reasoningEffort?: ReasoningEffort;\n /** v5: attachment metadata for the session record (never the bytes). */\n attachments?: SessionAttachment[];\n }\n | { kind: 'restore'; commit: string; files: string[] }\n /** Manual compaction: condense the stored session so the recap shrinks. */\n | { kind: 'compact' }\n /**\n * v4 steer: mid-turn user content for the *running* turn, applied at the next\n * step boundary (unlike `submit`, which queues a whole next turn). Buffered —\n * an inject racing the turn's end is delivered at the start of the next turn\n * rather than dropped.\n */\n | { kind: 'inject'; text: string }\n /** v4: title the live session (empty text clears back to the derived name). */\n | { kind: 'rename'; title: string }\n | { kind: 'cancel' }\n | { kind: 'end' };\n\n/**\n * Parse one host line. Returns null for malformed input or an unknown shape, so\n * a garbled line is ignored rather than taking the session down.\n */\nexport function parseHostMessage(raw: string): HostMessage | null {\n let msg: Record<string, unknown>;\n try {\n msg = JSON.parse(raw) as Record<string, unknown>;\n } catch {\n return null;\n }\n if (!msg || typeof msg !== 'object') return null;\n if (typeof msg.approveId === 'number') {\n // v3: `always: true` on an approval asks the engine to persist a standing\n // allow rule for this action shape. Only meaningful with approve: true.\n return {\n kind: 'approve',\n id: msg.approveId,\n approve: !!msg.approve,\n ...(msg.always === true && msg.approve ? { always: true } : {}),\n };\n }\n if (typeof msg.answerId === 'number') {\n return { kind: 'answer', id: msg.answerId, answer: String(msg.answer ?? '') };\n }\n if (typeof msg.submit === 'string' && msg.submit.trim()) {\n const agentMode =\n msg.agentMode === 'plan' || msg.agentMode === 'auto' || msg.agentMode === 'agent'\n ? msg.agentMode\n : undefined;\n const images = Array.isArray(msg.images)\n ? (msg.images as unknown[])\n .filter(\n (a): a is ImageAttachment =>\n !!a &&\n typeof a === 'object' &&\n typeof (a as ImageAttachment).name === 'string' &&\n typeof (a as ImageAttachment).mediaType === 'string' &&\n typeof (a as ImageAttachment).dataBase64 === 'string',\n )\n .slice(0, 8)\n : undefined;\n const reasoningEffort =\n msg.reasoningEffort === 'low' || msg.reasoningEffort === 'medium' || msg.reasoningEffort === 'high'\n ? msg.reasoningEffort\n : undefined;\n const attachments = sanitizeAttachments(msg.attachments);\n return {\n kind: 'submit',\n instruction: msg.submit.trim(),\n ...(agentMode ? { agentMode } : {}),\n ...(images?.length ? { images } : {}),\n ...(reasoningEffort ? { reasoningEffort } : {}),\n ...(attachments.length ? { attachments } : {}),\n };\n }\n if (\n msg.restore &&\n typeof msg.restore === 'object' &&\n typeof (msg.restore as Record<string, unknown>).commit === 'string'\n ) {\n const r = msg.restore as { commit: string; files?: unknown };\n const files = Array.isArray(r.files) ? r.files.filter((f): f is string => typeof f === 'string') : [];\n if (files.length) return { kind: 'restore', commit: r.commit, files };\n return null;\n }\n if (msg.compactSession === true) return { kind: 'compact' };\n if (typeof msg.inject === 'string' && msg.inject.trim()) {\n return { kind: 'inject', text: msg.inject.trim() };\n }\n if (typeof msg.renameSession === 'string') {\n return { kind: 'rename', title: msg.renameSession.trim() };\n }\n if (msg.cancel === true) return { kind: 'cancel' };\n if (msg.end === true) return { kind: 'end' };\n return null;\n}\n\n/**\n * Owns the NDJSON protocol for one run: serializes agent events, and turns each\n * approval / user question into a host round-trip via {@link submitDecision} /\n * {@link submitAnswer}. Under `auto`, approvals resolve true immediately (still\n * announced, for the log); user questions get a default \"proceed\" answer.\n */\nexport class StreamJsonSession {\n private nextId = 1;\n private readonly pendingApprove = new Map<\n number,\n { resolve: (approve: boolean) => void; action: MutatingAction }\n >();\n private readonly pendingAnswer = new Map<number, (answer: string) => void>();\n /** Cancellation for the turn currently running (session mode). */\n private turnSignal: { aborted: boolean } = { aborted: false };\n /**\n * v4 steer: user content injected mid-turn, drained by the agent loop at its\n * next step boundary. Deliberately NOT cleared between turns — an inject that\n * races the turn's end should land at the start of the next turn, not vanish.\n */\n private injected: string[] = [];\n /**\n * v3: called when the host approved with `always: true` — the owner persists\n * a standing rule derived from the approved action. Injected (not imported)\n * so this protocol class stays free of filesystem concerns.\n */\n onAlwaysRule?: (action: MutatingAction) => void;\n\n constructor(\n private readonly emit: (line: StreamJsonOut) => void,\n private auto = false,\n ) {}\n\n /**\n * Per-turn approval posture (session mode): a host `submit` can flip auto on\n * or off for the coming turn without respawning the process.\n */\n setAuto(auto: boolean): void {\n this.auto = auto;\n }\n\n /** The agent's onEvent → one NDJSON line per event. */\n readonly onEvent = (e: AgentEvent): void => {\n this.emit({ event: 'event', ...e });\n };\n\n /** The agent's approval gate → an approve-request the host answers. */\n readonly approve = (action: MutatingAction): Promise<boolean> => {\n const id = this.nextId++;\n if (this.auto) {\n this.emit({ event: 'approve-request', id, action });\n return Promise.resolve(true);\n }\n return new Promise<boolean>((resolve) => {\n this.pendingApprove.set(id, { resolve, action });\n this.emit({ event: 'approve-request', id, action });\n });\n };\n\n /** Clarifying question → user-question the host answers with free text. */\n readonly askUser = (req: AskUserRequest): Promise<string> => {\n const id = this.nextId++;\n const question = req.question.trim();\n const options = req.options?.filter(Boolean);\n if (this.auto) {\n this.emit({ event: 'user-question', id, question, options });\n return Promise.resolve(\n 'Autonomous mode: no human. Proceed with safest defaults and state assumptions.',\n );\n }\n return new Promise<string>((resolve) => {\n this.pendingAnswer.set(id, resolve);\n this.emit({ event: 'user-question', id, question, options });\n });\n };\n\n /** Host → agent: resolve a pending approval. Unknown ids are ignored. */\n submitDecision(id: number, approve: boolean, always = false): void {\n const pending = this.pendingApprove.get(id);\n if (pending) {\n this.pendingApprove.delete(id);\n // Persist the standing rule before resolving, so the rule exists by the\n // time the approved action (and any follow-up like it) executes.\n if (approve && always) this.onAlwaysRule?.(pending.action);\n pending.resolve(approve);\n }\n }\n\n /** Host → agent: resolve a pending user-question. Unknown ids are ignored. */\n submitAnswer(id: number, answer: string): void {\n const resolve = this.pendingAnswer.get(id);\n if (resolve) {\n this.pendingAnswer.delete(id);\n resolve(answer ?? '');\n }\n }\n\n /** Host → agent (v4): steer the running turn with more user content. */\n inject(text: string): void {\n const t = text.trim();\n if (t) this.injected.push(t);\n }\n\n /**\n * Drain pending steer content (joined, oldest first) for the agent loop's\n * next step. Null when nothing is pending.\n */\n drainInjected(): string | null {\n if (!this.injected.length) return null;\n const text = this.injected.join('\\n\\n');\n this.injected = [];\n return text;\n }\n\n /** Start a turn: fresh cancellation signal, handed to the agent loop. */\n beginTurn(): { aborted: boolean } {\n this.turnSignal = { aborted: false };\n return this.turnSignal;\n }\n\n /**\n * Host → agent: stop the running turn. Sets the cooperative signal *and*\n * rejects anything the turn is blocked on, so a turn waiting at an approval\n * gate unblocks instead of hanging until the process dies.\n */\n cancelTurn(): void {\n this.turnSignal.aborted = true;\n this.cancelPending();\n }\n\n /** Reject any still-pending approvals/questions (e.g. the host disconnected). */\n cancelPending(): void {\n for (const pending of this.pendingApprove.values()) pending.resolve(false);\n this.pendingApprove.clear();\n for (const resolve of this.pendingAnswer.values()) resolve('');\n this.pendingAnswer.clear();\n }\n}\n\nexport interface StreamJsonOptions extends Omit<AgentOptions, 'approve' | 'onEvent' | 'askUser'> {\n emit: (line: StreamJsonOut) => void;\n /** Register the stdin decision reader; the returned session accepts decisions. */\n bindDecisions?: (session: StreamJsonSession) => void;\n}\n\n/** One turn of a session: what the host asked, and how it ended. */\nexport interface StreamJsonTurn {\n instruction: string;\n result: AgentResult | null;\n}\n\nexport interface StreamJsonSessionRunOptions {\n emit: (line: StreamJsonOut) => void;\n /** Bound once for the whole session, not per turn. */\n bindDecisions?: (session: StreamJsonSession) => void;\n auto?: boolean;\n sessionId: string;\n /** True when this session was reloaded from disk (`--continue`). */\n resumed: boolean;\n /** Environment facts to report on `session-start` (dir, versions, model). */\n sessionInfo?: SessionStartInfo;\n /** Instruction for the first turn. Omit to wait for the host's first `submit`. */\n instruction?: string;\n /** Spawn-time approval posture; per-turn `agentMode` on `submit` overrides it. */\n spawnAuto?: boolean;\n /** Await the host's next task; resolve null to end the session. */\n nextTurn: () => Promise<TurnRequest | null>;\n /**\n * Run one turn. Injected so the heavy agent wiring (graph, providers, MCP,\n * sandbox) is built once by the caller and reused across turns — the whole\n * point of session mode.\n */\n runTurn: (turn: {\n instruction: string;\n priorSummary?: string;\n signal: { aborted: boolean };\n session: StreamJsonSession;\n /** Per-turn posture from the host (plan blocks writes engine-side). */\n agentMode?: TurnAgentMode;\n /** Effective auto for this turn (spawn flag overridden by agentMode). */\n auto: boolean;\n images?: ImageAttachment[];\n /** v5: per-turn reasoning budget, straight from the host's `submit`. */\n reasoningEffort?: ReasoningEffort;\n /** v5: attachment metadata for the session record (never the bytes). */\n attachments?: SessionAttachment[];\n }) => Promise<AgentResult>;\n /**\n * Record a finished turn. Returns the recap to seed the next turn, so\n * continuity is the caller's policy (session store, summarizer) not ours.\n */\n onTurnEnd?: (turn: StreamJsonTurn) => string | undefined;\n}\n\n/**\n * Session mode for `vg code --stream-json --session`: hold the process open and\n * run turn after turn against warm state, instead of paying a cold start (graph\n * load, overlay rebuild, MCP connect, model warm-up) on every message.\n *\n * Each turn still emits exactly the frames a single-shot run does, so a host\n * that already speaks the one-shot protocol only needs to learn `idle`. A turn\n * that throws is reported and the session stays up — one bad task should not\n * cost the user their conversation.\n */\nexport async function runCodeStreamJsonSession(\n options: StreamJsonSessionRunOptions,\n): Promise<StreamJsonTurn[]> {\n const { emit, bindDecisions, auto, sessionId, resumed, nextTurn, runTurn, onTurnEnd } = options;\n const spawnAuto = options.spawnAuto ?? !!auto;\n const session = new StreamJsonSession(emit, spawnAuto);\n bindDecisions?.(session);\n emit({ event: 'session-start', sessionId, resumed, ...(options.sessionInfo ?? {}) });\n\n const turns: StreamJsonTurn[] = [];\n let priorSummary: string | undefined;\n const first = options.instruction?.trim();\n let request: TurnRequest | null = first ? { instruction: first } : await nextTurn();\n\n while (request) {\n const signal = session.beginTurn();\n // Per-turn posture: an explicit agentMode overrides the spawn flag; plan\n // never auto-approves. First turn without a mode keeps the spawn posture.\n const turnAuto = request.agentMode ? request.agentMode === 'auto' : spawnAuto;\n session.setAuto(turnAuto && request.agentMode !== 'plan');\n const instruction = request.instruction;\n let turn: StreamJsonTurn;\n try {\n const result = await runTurn({\n instruction,\n priorSummary,\n signal,\n session,\n agentMode: request.agentMode,\n auto: turnAuto && request.agentMode !== 'plan',\n images: request.images,\n reasoningEffort: request.reasoningEffort,\n attachments: request.attachments,\n });\n emit({ event: 'done', result });\n turn = { instruction, result };\n } catch (e) {\n emit({ event: 'error', message: (e as Error).message });\n turn = { instruction, result: null };\n } finally {\n session.cancelPending();\n }\n turns.push(turn);\n priorSummary = onTurnEnd?.(turn) ?? priorSummary;\n // v3: a completed plan turn announces itself so hosts can offer\n // Approve plan / Keep planning. A failed turn is not a ready plan.\n if (request.agentMode === 'plan' && turn.result) {\n emit({ event: 'plan-ready', turns: turns.length });\n }\n emit({ event: 'idle', turns: turns.length });\n request = await nextTurn();\n }\n return turns;\n}\n\n/** Run the agent under the NDJSON protocol; always emits a terminal `done`/`error`. */\nexport async function runCodeStreamJson(options: StreamJsonOptions): Promise<AgentResult | null> {\n const { emit, bindDecisions, auto, ...agentOptions } = options;\n const session = new StreamJsonSession(emit, !!auto);\n bindDecisions?.(session);\n try {\n const result = await runAgent({\n ...agentOptions,\n auto,\n approve: session.approve,\n askUser: session.askUser,\n onEvent: session.onEvent,\n });\n emit({ event: 'done', result });\n return result;\n } catch (e) {\n emit({ event: 'error', message: (e as Error).message });\n return null;\n } finally {\n session.cancelPending();\n }\n}\n"]}
@@ -0,0 +1,4 @@
1
+ export { VERSION } from './chunk-ZUZHYAJK.js';
2
+ import './chunk-Z6ZWNWWR.js';
3
+ //# sourceMappingURL=version-5QIEUXU6.js.map
4
+ //# sourceMappingURL=version-5QIEUXU6.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":[],"names":[],"mappings":"","file":"version-DTEU3SQD.js"}
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"version-5QIEUXU6.js"}
@@ -1,24 +1,25 @@
1
- import { TOOLS } from './chunk-NKLYDSB7.js';
1
+ import { TOOLS } from './chunk-JPOYXG7Z.js';
2
2
  import './chunk-HTLDXEHW.js';
3
- import './chunk-V2UGRUTL.js';
4
- import './chunk-RHKOUPWT.js';
5
- import './chunk-CQDUBAQY.js';
6
- import './chunk-OV4KGXPD.js';
7
- import './chunk-NG4KIJW6.js';
3
+ import './chunk-GBXOAO5V.js';
4
+ import './chunk-WPLOEFZU.js';
5
+ import './chunk-WNKGRXUA.js';
6
+ import './chunk-57ZRSCHY.js';
7
+ import './chunk-PVNALGTG.js';
8
8
  import './chunk-CRAMOEBE.js';
9
9
  import './chunk-6BEBJCK4.js';
10
10
  import './chunk-J7LKEB2R.js';
11
- import './chunk-MRZHNUN7.js';
12
- import './chunk-5I4VSBWQ.js';
11
+ import './chunk-CA4YQBA7.js';
12
+ import './chunk-RTURQXQL.js';
13
13
  import './chunk-T7RSQ5WD.js';
14
- import './chunk-2C33WR5O.js';
15
- import './chunk-VMAIDM4K.js';
14
+ import './chunk-6WRG7VDO.js';
15
+ import './chunk-7BSUPHX6.js';
16
+ import './chunk-2C4QT5D7.js';
16
17
  import './chunk-MVPRPSXU.js';
17
18
  import './chunk-O3LABX6I.js';
18
- import './chunk-4NTNMT6T.js';
19
- import './chunk-BWPBB45M.js';
19
+ import './chunk-ZUZHYAJK.js';
20
+ import './chunk-XP6UUCZZ.js';
20
21
  import './chunk-JFGYT6BI.js';
21
- import './chunk-BPF3YX2U.js';
22
+ import './chunk-XQNKCA2J.js';
22
23
  import './chunk-Z6ZWNWWR.js';
23
24
 
24
25
  // src/code/vg-mcp-bridge.ts
@@ -78,5 +79,5 @@ function vgMcpToolNames() {
78
79
  }
79
80
 
80
81
  export { VG_MCP_SERVER_ID, createVgBuiltinMcpTools, mergeExternalToolsets, vgMcpToolNames };
81
- //# sourceMappingURL=vg-mcp-bridge-KDVYIMFX.js.map
82
- //# sourceMappingURL=vg-mcp-bridge-KDVYIMFX.js.map
82
+ //# sourceMappingURL=vg-mcp-bridge-4FETMJ6M.js.map
83
+ //# sourceMappingURL=vg-mcp-bridge-4FETMJ6M.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/code/vg-mcp-bridge.ts"],"names":[],"mappings":"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","file":"vg-mcp-bridge-4FETMJ6M.js","sourcesContent":["/**\n * Always-on bridge from local `vg serve` (Vibgrate AI Context) tools into the\n * VG Code agent tool list.\n *\n * External project MCP servers (`.mcp.json`, etc.) remain optional. The tools\n * shipped by the installed `vg` CLI — `search_symbols`, `query_graph`,\n * `impact_of`, `library_docs`, … — are available on every run without spawning\n * a separate MCP process: same handlers as stdio `vg serve`, in-process over\n * the session graph.\n *\n * Namespaced as `mcp__vibgrate__<tool>` so they sit next to third-party\n * `mcp__<server>__*` tools without collisions.\n */\n\nimport { TOOLS, type VgTool } from '../mcp/tools.js';\nimport type { VgGraph } from '../schema.js';\nimport type { ToolCall, ToolSpec } from './types.js';\nimport type { ToolResult } from './tools.js';\n\nexport const VG_MCP_SERVER_ID = 'vibgrate' as const;\nconst NS = `mcp__${VG_MCP_SERVER_ID}__`;\n\nexport type ExternalToolset = {\n specs: ToolSpec[];\n owns: (name: string) => boolean;\n execute: (call: ToolCall, live?: { graph: VgGraph }) => Promise<ToolResult>;\n};\n\nexport interface VgBuiltinMcpOptions {\n /** Live graph accessor (session overlay may refresh symbols mid-run). */\n getGraph: () => VgGraph;\n root: string;\n /** Air-gap: no network in library/docs/embedder paths. */\n local?: boolean;\n}\n\n/** In-process toolset matching the local `vg serve` MCP surface. */\nexport function createVgBuiltinMcpTools(opts: VgBuiltinMcpOptions): ExternalToolset {\n const byName = new Map<string, VgTool>();\n for (const t of TOOLS) byName.set(`${NS}${t.name}`, t);\n\n const specs: ToolSpec[] = TOOLS.map((t) => ({\n name: `${NS}${t.name}`,\n description: `[${VG_MCP_SERVER_ID}] ${t.description}`,\n parameters: t.inputSchema && typeof t.inputSchema === 'object' ? t.inputSchema : { type: 'object', properties: {} },\n })).sort((a, b) => a.name.localeCompare(b.name));\n\n return {\n specs,\n owns: (name) => byName.has(name),\n async execute(call, live) {\n const tool = byName.get(call.name);\n if (!tool) return { content: `unknown MCP tool ${call.name}`, mutated: false };\n try {\n const graph = live?.graph ?? opts.getGraph();\n const raw = await tool.handler(graph, call.arguments ?? {}, {\n root: opts.root,\n local: opts.local,\n dedup: false,\n });\n const text = typeof raw === 'string' ? raw : JSON.stringify(raw, null, 2);\n return { content: text.slice(0, 12_000), mutated: false };\n } catch (e) {\n return { content: `MCP tool ${call.name} failed: ${(e as Error).message}`, mutated: false };\n }\n },\n };\n}\n\n/** Merge toolsets; later sets win on name clashes. */\nexport function mergeExternalToolsets(...sets: Array<ExternalToolset | undefined | null>): ExternalToolset | undefined {\n const active = sets.filter((s): s is ExternalToolset => !!s && s.specs.length > 0);\n if (active.length === 0) return undefined;\n if (active.length === 1) return active[0];\n\n const byName = new Map<string, { set: ExternalToolset; spec: ToolSpec }>();\n for (const set of active) {\n for (const spec of set.specs) byName.set(spec.name, { set, spec });\n }\n const specs = [...byName.values()].map((v) => v.spec).sort((a, b) => a.name.localeCompare(b.name));\n return {\n specs,\n owns: (name) => active.some((s) => s.owns(name)),\n async execute(call, live) {\n for (let i = active.length - 1; i >= 0; i--) {\n if (active[i]!.owns(call.name)) return active[i]!.execute(call, live);\n }\n return { content: `unknown external tool ${call.name}`, mutated: false };\n },\n };\n}\n\n/** Namespaced vibgrate tool names for tests / prompts. */\nexport function vgMcpToolNames(): string[] {\n return TOOLS.map((t) => `${NS}${t.name}`);\n}\n"]}
@@ -1,26 +1,25 @@
1
- export { ActiveGraphCache, BranchGraphSession, DEFAULT_ACTIVE_GRAPH_IDLE_MS, VGD_PROTOCOL_VERSION, WorkspaceRegistry, parseRequest, startVgdServer } from './chunk-VQ5KMHW6.js';
1
+ export { ActiveGraphCache, BranchGraphSession, DEFAULT_ACTIVE_GRAPH_IDLE_MS, VGD_PROTOCOL_VERSION, WorkspaceRegistry, parseRequest, startVgdServer } from './chunk-BQ6NTRRK.js';
2
2
  import './chunk-3LOWJSAF.js';
3
3
  import './chunk-5HYCB55P.js';
4
4
  export { createHostExecutionEnv, detectSandboxCapabilities, detectSecurityCapabilities, firejailArgv, resolveExecutionEnv, selectSandboxBackend } from './chunk-IS7VTH2Q.js';
5
5
  export { MODEL_EXECUTION_PROFILE_SCHEMA_VERSION, defaultModelExecutionProfile, mergeModelExecutionProfile, resolveModelExecutionProfile } from './chunk-IZDH67DX.js';
6
6
  import './chunk-DBX3DL27.js';
7
- import './chunk-POOL355F.js';
8
7
  import './chunk-6BEBJCK4.js';
9
8
  import './chunk-J7LKEB2R.js';
10
- import './chunk-MRZHNUN7.js';
11
- import './chunk-KU7FI5EV.js';
12
- export { vgdIsRunning, vgdRequest } from './chunk-E53WBVUQ.js';
13
- export { vgdPidPath, vgdSocketPath } from './chunk-NDNNOAS6.js';
14
- export { FEDERATION_SCHEMA_VERSION, federationFromWorkspaceRoots, federationPath, highConfidenceBridges, loadFederation, loadOrDiscoverFederation, writeFederationFile } from './chunk-5I4VSBWQ.js';
9
+ import './chunk-CA4YQBA7.js';
10
+ import './chunk-USPMMVNH.js';
11
+ export { vgdIsRunning, vgdRequest } from './chunk-VHRSG6CF.js';
12
+ export { vgdPidPath, vgdSocketPath } from './chunk-6H2QV5DR.js';
13
+ export { FEDERATION_SCHEMA_VERSION, federationFromWorkspaceRoots, federationPath, highConfidenceBridges, loadFederation, loadOrDiscoverFederation, writeFederationFile } from './chunk-RTURQXQL.js';
15
14
  import './chunk-6WRG7VDO.js';
16
- import './chunk-2C33WR5O.js';
17
- import './chunk-VMAIDM4K.js';
15
+ import './chunk-7BSUPHX6.js';
16
+ import './chunk-2C4QT5D7.js';
18
17
  import './chunk-MVPRPSXU.js';
19
18
  import './chunk-O3LABX6I.js';
20
- import './chunk-4NTNMT6T.js';
21
- import './chunk-BWPBB45M.js';
19
+ import './chunk-ZUZHYAJK.js';
20
+ import './chunk-XP6UUCZZ.js';
22
21
  import './chunk-JFGYT6BI.js';
23
- export { activeGraphSlotKey, branchGraphSnapshotId, detectGitRef } from './chunk-BPF3YX2U.js';
22
+ export { activeGraphSlotKey, branchGraphSnapshotId, detectGitRef } from './chunk-XQNKCA2J.js';
24
23
  import './chunk-Z6ZWNWWR.js';
25
- //# sourceMappingURL=vgd-M7UOPWLB.js.map
26
- //# sourceMappingURL=vgd-M7UOPWLB.js.map
24
+ //# sourceMappingURL=vgd-R524P5BJ.js.map
25
+ //# sourceMappingURL=vgd-R524P5BJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"vgd-R524P5BJ.js"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibgrate/cli",
3
- "version": "2026.818.2",
3
+ "version": "2026.819.2",
4
4
  "description": "vg — local codebase intelligence CLI + MCP server for AI coding agents: deterministic code graph, drift reporting, and version-correct library docs (Apache-2.0)",
5
5
  "//mcpName": "Official MCP registry ownership proof: the registry fetches the published npm package and requires this field to match the com.vibgrate/ai-context server entry (see docs/marketing/mcp-registry/README.md). Must ship in the published @vibgrate/cli package.json.",
6
6
  "mcpName": "com.vibgrate/ai-context",
@@ -1,30 +0,0 @@
1
- export { CONTEXT_POLICY_VERSION, DISCOVERY_TOOLS, MUTATION_TOOLS, compact, compactWithModel, runAgent } from './chunk-JGA63RGF.js';
2
- import './chunk-543E6WDJ.js';
3
- import './chunk-ZUOBPKVK.js';
4
- import './chunk-O5IJDMTB.js';
5
- import './chunk-74UBGF4P.js';
6
- import './chunk-3HNPVXUK.js';
7
- import './chunk-5HYCB55P.js';
8
- import './chunk-VIWZ4QT7.js';
9
- import './chunk-RHKOUPWT.js';
10
- export { summarizeCapsule } from './chunk-YF54UMOU.js';
11
- import './chunk-EZ7UC5Y5.js';
12
- import './chunk-6BEBJCK4.js';
13
- import './chunk-J7LKEB2R.js';
14
- import './chunk-MRZHNUN7.js';
15
- import './chunk-E53WBVUQ.js';
16
- import './chunk-NDNNOAS6.js';
17
- import './chunk-PRHH4DVO.js';
18
- import './chunk-T7RSQ5WD.js';
19
- import './chunk-6WRG7VDO.js';
20
- import './chunk-2C33WR5O.js';
21
- import './chunk-VMAIDM4K.js';
22
- import './chunk-MVPRPSXU.js';
23
- import './chunk-O3LABX6I.js';
24
- import './chunk-4NTNMT6T.js';
25
- import './chunk-BWPBB45M.js';
26
- import './chunk-JFGYT6BI.js';
27
- import './chunk-BPF3YX2U.js';
28
- import './chunk-Z6ZWNWWR.js';
29
- //# sourceMappingURL=agent-X6VYCE63.js.map
30
- //# sourceMappingURL=agent-X6VYCE63.js.map
@@ -1,10 +0,0 @@
1
- export { attachVgd, daemonDisabledReason } from './chunk-NJQZRM55.js';
2
- import './chunk-LJSJX6U4.js';
3
- import './chunk-E53WBVUQ.js';
4
- import './chunk-NDNNOAS6.js';
5
- import './chunk-BWPBB45M.js';
6
- import './chunk-JFGYT6BI.js';
7
- import './chunk-BPF3YX2U.js';
8
- import './chunk-Z6ZWNWWR.js';
9
- //# sourceMappingURL=attach-G5JUIWIT.js.map
10
- //# sourceMappingURL=attach-G5JUIWIT.js.map
@@ -1,9 +0,0 @@
1
- export { baselineCommand, runBaseline } from './chunk-6ABMV74F.js';
2
- import './chunk-V2UGRUTL.js';
3
- import './chunk-NG4KIJW6.js';
4
- import './chunk-CRAMOEBE.js';
5
- import './chunk-T7RSQ5WD.js';
6
- import './chunk-4NTNMT6T.js';
7
- import './chunk-Z6ZWNWWR.js';
8
- //# sourceMappingURL=baseline-DXI64VLW.js.map
9
- //# sourceMappingURL=baseline-DXI64VLW.js.map
@@ -1,6 +0,0 @@
1
- // src/version.ts
2
- var VERSION = "2026.818.2";
3
-
4
- export { VERSION };
5
- //# sourceMappingURL=chunk-4NTNMT6T.js.map
6
- //# sourceMappingURL=chunk-4NTNMT6T.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/engine/workspace-roots.ts","../src/runtime/bridge-edges.ts","../src/runtime/interface-bridges.ts","../src/runtime/discover-workspaces.ts","../src/runtime/federation.ts"],"names":["path","path2","fs","path3","path4","abs","nodeFs"],"mappings":";;;;;AA2BO,SAAS,uBAAA,CAAwB,KAAA,EAAiB,IAAA,GAAe,OAAA,CAAQ,KAAI,EAAoB;AACtG,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,MAAM,MAAuB,EAAC;AAC9B,EAAA,MAAM,OAAA,GAAeA,cAAQ,IAAI,CAAA;AACjC,EAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,IAAA,IAAI,OAAO,CAAA,KAAM,QAAA,IAAY,CAAC,CAAA,CAAE,MAAK,EAAG;AACxC,IAAA,MAAM,GAAA,GAAWA,KAAA,CAAA,OAAA,CAAQ,OAAA,EAAS,CAAA,CAAE,MAAM,CAAA;AAC1C,IAAA,MAAM,EAAA,GAAK,qBAAqB,GAAG,CAAA;AACnC,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,EAAG;AAClB,IAAA,IAAA,CAAK,IAAI,EAAE,CAAA;AACX,IAAA,GAAA,CAAI,IAAA,CAAK;AAAA,MACP,IAAA,EAAM,GAAA;AAAA,MACN,EAAA;AAAA,MACA,KAAA,EAAYA,KAAA,CAAA,QAAA,CAAS,GAAG,CAAA,IAAK;AAAA,KAC9B,CAAA;AAAA,EACH;AACA,EAAA,OAAO,GAAA,CAAI,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,IAAA,CAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAC,CAAA;AACxD;AC9BO,IAAM,0BAAA,GAA6B,eAAA;AA0CnC,SAAS,mBAAA,CACd,OAAA,EACA,eAAA,EACA,OAAA,GAAsC,EAAC,EACzB;AACd,EAAA,MAAM,GAAA,GAAM,QAAQ,aAAA,IAAiB,CAAA;AACrC,EAAA,MAAM,QAAA,uBAAe,GAAA,EAAkE;AAEvF,EAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,IAAA,MAAM,IAAA,GAAYC,KAAA,CAAA,OAAA,CAAQ,CAAA,CAAE,IAAI,CAAA;AAChC,IAAA,MAAM,GAAA,GAAM,gBAAgB,IAAI,CAAA;AAChC,IAAA,MAAM,IAAA,GAAO,OAAO,GAAA,EAAK,IAAA,KAAS,WAAW,GAAA,CAAI,IAAA,CAAK,MAAK,GAAI,EAAA;AAC/D,IAAA,IAAI,CAAC,IAAA,EAAM;AACX,IAAA,MAAM,YAAA,GAAe,CAAA,CAAE,YAAA,IAAgB,oBAAA,CAAqB,IAAI,CAAA;AAChE,IAAA,QAAA,CAAS,IAAI,IAAA,EAAM,EAAE,IAAA,EAAM,YAAA,EAAc,MAAM,CAAA;AAAA,EACjD;AAEA,EAAA,MAAM,QAAsB,EAAC;AAC7B,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAE7B,EAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,IAAA,MAAM,QAAA,GAAgBA,KAAA,CAAA,OAAA,CAAQ,CAAA,CAAE,IAAI,CAAA;AACpC,IAAA,MAAM,MAAA,GAAS,CAAA,CAAE,YAAA,IAAgB,oBAAA,CAAqB,QAAQ,CAAA;AAC9D,IAAA,MAAM,GAAA,GAAM,gBAAgB,QAAQ,CAAA;AACpC,IAAA,IAAI,CAAC,GAAA,EAAK;AAEV,IAAA,MAAM,IAAA,GAAO,YAAY,GAAG,CAAA;AAC5B,IAAA,KAAA,MAAW,CAAC,OAAA,EAAS,KAAK,CAAA,IAAK,IAAA,EAAM;AACnC,MAAA,MAAM,MAAA,GAAS,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA;AACnC,MAAA,IAAI,CAAC,MAAA,EAAQ;AACb,MAAA,IAAI,MAAA,CAAO,SAAS,QAAA,EAAU;AAE9B,MAAA,MAAM,EAAE,MAAM,UAAA,EAAW,GAAI,mBAAmB,KAAA,EAAO,QAAA,EAAU,OAAO,IAAI,CAAA;AAC5E,MAAA,IAAI,aAAa,GAAA,EAAK;AAEtB,MAAA,MAAM,MAAM,CAAA,EAAG,MAAM,KAAK,MAAA,CAAO,YAAY,IAAI,OAAO,CAAA,CAAA;AACxD,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AACnB,MAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AAEZ,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,aAAA,EAAe,0BAAA;AAAA,QACf,gBAAA,EAAkB,MAAA;AAAA,QAClB,gBAAgB,MAAA,CAAO,YAAA;AAAA,QACvB,QAAA;AAAA,QACA,QAAQ,MAAA,CAAO,IAAA;AAAA,QACf,IAAA;AAAA,QACA,UAAA;AAAA,QACA,QAAA,EAAU,GAAQA,KAAA,CAAA,QAAA,CAAS,QAAQ,CAAC,CAAA,YAAA,EAAe,OAAO,KAAK,KAAK,CAAA,CAAA,CAAA;AAAA,QACpE,WAAA,EAAa;AAAA,OACd,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,IAAA;AAAA,IACX,CAAC,GAAG,CAAA,KACF,CAAA,CAAE,SAAS,aAAA,CAAc,CAAA,CAAE,QAAQ,CAAA,IACnC,CAAA,CAAE,OAAO,aAAA,CAAc,CAAA,CAAE,MAAM,CAAA,IAAA,CAC9B,CAAA,CAAE,eAAe,EAAA,EAAI,aAAA,CAAc,CAAA,CAAE,WAAA,IAAe,EAAE;AAAA,GAC3D;AACF;AAGO,SAAS,sBAAsB,KAAA,EAAmC;AACvE,EAAA,OAAO,MAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,cAAc,GAAG,CAAA;AAChD;AAEA,SAAS,YAAY,GAAA,EAA+C;AAClE,EAAA,MAAM,MAA+B,EAAC;AACtC,EAAA,KAAA,MAAW,SAAS,CAAC,cAAA,EAAgB,iBAAA,EAAmB,sBAAA,EAAwB,kBAAkB,CAAA,EAAY;AAC5G,IAAA,MAAM,KAAA,GAAQ,IAAI,KAAK,CAAA;AACvB,IAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,QAAA,EAAU;AACzC,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,EAAG;AACjD,MAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,OAAO,KAAA,KAAU,QAAA,EAAU,GAAA,CAAI,IAAA,CAAK,CAAC,IAAA,EAAM,KAAK,CAAC,CAAA;AAAA,IACnF;AAAA,EACF;AAEA,EAAA,OAAO,GAAA,CAAI,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,CAAC,EAAE,aAAA,CAAc,CAAA,CAAE,CAAC,CAAC,CAAA,IAAK,EAAE,CAAC,CAAA,CAAE,cAAc,CAAA,CAAE,CAAC,CAAC,CAAC,CAAA;AAChF;AAEA,SAAS,kBAAA,CACP,KAAA,EACA,QAAA,EACA,MAAA,EAC0C;AAC1C,EAAA,MAAM,CAAA,GAAI,MAAM,IAAA,EAAK;AACrB,EAAA,IAAI,EAAE,UAAA,CAAW,YAAY,KAAK,CAAA,CAAE,UAAA,CAAW,OAAO,CAAA,EAAG;AACvD,IAAA,OAAO,EAAE,IAAA,EAAM,mBAAA,EAAqB,UAAA,EAAY,IAAA,EAAK;AAAA,EACvD;AACA,EAAA,IAAI,CAAA,CAAE,UAAA,CAAW,OAAO,CAAA,EAAG;AAEzB,IAAA,MAAM,MAAM,CAAA,CAAE,KAAA,CAAM,OAAA,CAAQ,MAAM,EAAE,IAAA,EAAK;AACzC,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAgBA,KAAA,CAAA,OAAA,CAAQ,QAAA,EAAU,GAAG,CAAA;AAC3C,MAAA,IAASA,KAAA,CAAA,OAAA,CAAQ,QAAQ,CAAA,KAAWA,KAAA,CAAA,OAAA,CAAQ,MAAM,CAAA,EAAG;AACnD,QAAA,OAAO,EAAE,IAAA,EAAM,iBAAA,EAAmB,UAAA,EAAY,GAAA,EAAI;AAAA,MACpD;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AACA,IAAA,OAAO,EAAE,IAAA,EAAM,iBAAA,EAAmB,UAAA,EAAY,IAAA,EAAK;AAAA,EACrD;AAEA,EAAA,OAAO,EAAE,IAAA,EAAM,mBAAA,EAAqB,UAAA,EAAY,IAAA,EAAK;AACvD;AAGO,SAAS,qBAAqB,GAAA,EAAqC;AACxE,EAAA,IAAI;AACF,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AACxB,IAAA,IAAI,CAAC,CAAA,IAAK,OAAO,CAAA,KAAM,UAAU,OAAO,IAAA;AACxC,IAAA,OAAO,CAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;ACrIO,SAAS,wBAAA,CACd,OAAA,EACAC,GAAAA,EACA,OAAA,GAAkE,EAAC,EACrD;AACd,EAAA,MAAM,GAAA,GAAM,QAAQ,aAAA,IAAiB,CAAA;AACrC,EAAA,MAAM,QAAA,GAAW,QAAQ,iBAAA,IAAqB,EAAA;AAC9C,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,IACnC,IAAA,EAAWC,KAAA,CAAA,OAAA,CAAQ,CAAA,CAAE,IAAI,CAAA;AAAA,IACzB,YAAA,EAAc,CAAA,CAAE,YAAA,IAAgB,oBAAA,CAAqB,EAAE,IAAI;AAAA,GAC7D,CAAE,CAAA;AAEF,EAAA,MAAM,QAAsB,EAAC;AAC7B,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAE7B,EAAA,MAAM,IAAA,GAAO,CAAC,IAAA,KAA2B;AACvC,IAAA,IAAI,IAAA,CAAK,aAAa,GAAA,EAAK;AAC3B,IAAA,IAAI,IAAA,CAAK,QAAA,KAAa,IAAA,CAAK,MAAA,EAAQ;AACnC,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,IAAA,CAAK,gBAAgB,CAAA,EAAA,EAAK,IAAA,CAAK,cAAc,CAAA,CAAA,EAAI,IAAA,CAAK,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,QAAQ,CAAA,CAAA;AAC1F,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AACnB,IAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,IAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACjB,CAAA;AAEA,EAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC3B,IAAA,MAAM,KAAA,GAAQ,kBAAA,CAAmB,IAAA,CAAK,IAAA,EAAMD,KAAI,QAAQ,CAAA;AACxD,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,GAAA,GAAWC,eAAS,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA,CAAE,OAAA,CAAQ,OAAO,GAAG,CAAA;AAC7D,MAAA,MAAM,GAAA,GAAMD,GAAAA,CAAG,QAAA,CAAS,IAAI,CAAA;AAC5B,MAAA,IAAI,CAAC,GAAA,EAAK;AAEV,MAAA,IAAI,kBAAA,CAAmB,GAAA,EAAK,GAAG,CAAA,EAAG;AAChC,QAAA,KAAA,MAAW,OAAA,IAAW,kBAAA,CAAmB,GAAG,CAAA,EAAG;AAC7C,UAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,IAAA,CAAK,IAAA,EAAM,SAAS,QAAQ,CAAA;AAC/D,UAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,IAAA,KAAS,KAAK,IAAA,EAAM;AAC1C,UAAA,IAAA,CAAK;AAAA,YACH,aAAA,EAAe,0BAAA;AAAA,YACf,kBAAkB,IAAA,CAAK,YAAA;AAAA,YACvB,gBAAgB,MAAA,CAAO,YAAA;AAAA,YACvB,UAAU,IAAA,CAAK,IAAA;AAAA,YACf,QAAQ,MAAA,CAAO,IAAA;AAAA,YACf,IAAA,EAAM,aAAA;AAAA,YACN,UAAA,EAAY,GAAA;AAAA,YACZ,QAAA,EAAU,CAAA,gBAAA,EAAmB,GAAG,CAAA,QAAA,EAAM,OAAO,CAAA;AAAA,WAC9C,CAAA;AAAA,QACH;AAAA,MACF;AAEA,MAAA,IAAI,kBAAA,CAAmB,GAAG,CAAA,EAAG;AAC3B,QAAA,KAAA,MAAW,GAAA,IAAO,2BAAA,CAA4B,GAAG,CAAA,EAAG;AAClD,UAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,IAAA,CAAK,IAAA,EAAM,KAAK,QAAQ,CAAA;AAC3D,UAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,IAAA,KAAS,KAAK,IAAA,EAAM;AAC1C,UAAA,IAAA,CAAK;AAAA,YACH,aAAA,EAAe,0BAAA;AAAA,YACf,kBAAkB,IAAA,CAAK,YAAA;AAAA,YACvB,gBAAgB,MAAA,CAAO,YAAA;AAAA,YACvB,UAAU,IAAA,CAAK,IAAA;AAAA,YACf,QAAQ,MAAA,CAAO,IAAA;AAAA,YACf,IAAA,EAAM,iBAAA;AAAA,YACN,UAAA,EAAY,IAAA;AAAA,YACZ,QAAA,EAAU,CAAA,yBAAA,EAA4B,GAAG,CAAA,QAAA,EAAM,GAAG,CAAA;AAAA,WACnD,CAAA;AAAA,QACH;AAAA,MACF;AAEA,MAAA,IAAI,gBAAA,CAAiB,GAAG,CAAA,EAAG;AACzB,QAAA,KAAA,MAAW,GAAA,IAAO,mBAAA,CAAoB,GAAG,CAAA,EAAG;AAC1C,UAAA,MAAM,SAAS,0BAAA,CAA2B,IAAA,CAAK,IAAA,EAAM,GAAA,EAAK,UAAUA,GAAE,CAAA;AACtE,UAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,IAAA,KAAS,KAAK,IAAA,EAAM;AAC1C,UAAA,IAAA,CAAK;AAAA,YACH,aAAA,EAAe,0BAAA;AAAA,YACf,kBAAkB,IAAA,CAAK,YAAA;AAAA,YACvB,gBAAgB,MAAA,CAAO,YAAA;AAAA,YACvB,UAAU,IAAA,CAAK,IAAA;AAAA,YACf,QAAQ,MAAA,CAAO,IAAA;AAAA,YACf,IAAA,EAAM,iBAAA;AAAA,YACN,UAAA,EAAY,IAAA;AAAA,YACZ,QAAA,EAAU,CAAA,mBAAA,EAAsB,GAAG,CAAA,QAAA,EAAM,GAAG,CAAA;AAAA,WAC7C,CAAA;AAAA,QACH;AAAA,MACF;AAEA,MAAA,IAAI,kBAAA,CAAmB,GAAA,EAAK,GAAG,CAAA,EAAG;AAChC,QAAA,KAAA,MAAW,OAAA,IAAW,kBAAA,CAAmB,GAAG,CAAA,EAAG;AAC7C,UAAA,MAAM,MAAA,GAAS,mBAAA,CAAoB,IAAA,CAAK,IAAA,EAAM,SAAS,QAAQ,CAAA;AAC/D,UAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,IAAA,KAAS,KAAK,IAAA,EAAM;AAC1C,UAAA,IAAA,CAAK;AAAA,YACH,aAAA,EAAe,0BAAA;AAAA,YACf,kBAAkB,IAAA,CAAK,YAAA;AAAA,YACvB,gBAAgB,MAAA,CAAO,YAAA;AAAA,YACvB,UAAU,IAAA,CAAK,IAAA;AAAA,YACf,QAAQ,MAAA,CAAO,IAAA;AAAA,YACf,IAAA,EAAM,aAAA;AAAA,YACN,UAAA,EAAY,IAAA;AAAA,YACZ,QAAA,EAAU,CAAA,kBAAA,EAAqB,GAAG,CAAA,QAAA,EAAM,OAAO,CAAA;AAAA,WAChD,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,IAAA;AAAA,IACX,CAAC,CAAA,EAAG,CAAA,KACF,CAAA,CAAE,QAAA,CAAS,cAAc,CAAA,CAAE,QAAQ,CAAA,IACnC,CAAA,CAAE,MAAA,CAAO,aAAA,CAAc,EAAE,MAAM,CAAA,IAC/B,CAAA,CAAE,IAAA,CAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,IAC3B,CAAA,CAAE,QAAA,CAAS,aAAA,CAAc,CAAA,CAAE,QAAQ;AAAA,GACvC;AACF;AAIA,SAAS,kBAAA,CAAmB,IAAA,EAAcA,GAAAA,EAAuB,QAAA,EAA4B;AAC3F,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,MAAM,IAAA,GAAO,CAAC,GAAA,EAAa,KAAA,KAAwB;AACjD,IAAA,IAAI,GAAA,CAAI,MAAA,IAAU,QAAA,IAAY,KAAA,GAAQ,CAAA,EAAG;AACzC,IAAA,IAAI,KAAA;AACJ,IAAA,IAAI;AACF,MAAA,KAAA,GAAQA,GAAAA,CAAG,QAAQ,GAAG,CAAA;AAAA,IACxB,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AACA,IAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,aAAA,CAAc,CAAC,CAAC,CAAA,EAAG;AAC3D,MAAA,IAAI,GAAA,CAAI,UAAU,QAAA,EAAU;AAC5B,MAAA,IACE,IAAA,KAAS,cAAA,IACT,IAAA,KAAS,MAAA,IACT,IAAA,KAAS,MAAA,IACT,IAAA,KAAS,OAAA,IACT,IAAA,KAAS,UAAA,IACT,IAAA,KAAS,OAAA,EACT;AACA,QAAA;AAAA,MACF;AACA,MAAA,MAAM,GAAA,GAAWC,KAAA,CAAA,IAAA,CAAK,GAAA,EAAK,IAAI,CAAA;AAC/B,MAAA,IAAID,GAAAA,CAAG,WAAA,CAAY,GAAG,CAAA,EAAG;AACvB,QAAA,IAAA,CAAK,GAAA,EAAK,QAAQ,CAAC,CAAA;AACnB,QAAA;AAAA,MACF;AACA,MAAA,MAAM,KAAA,GAAQ,KAAK,WAAA,EAAY;AAC/B,MAAA,IACE,KAAA,CAAM,QAAA,CAAS,QAAQ,CAAA,IACvB,MAAM,QAAA,CAAS,UAAU,CAAA,IACzB,KAAA,CAAM,SAAS,MAAM,CAAA,IACrB,KAAA,CAAM,QAAA,CAAS,OAAO,CAAA,IACtB,KAAA,CAAM,QAAA,CAAS,MAAM,KACrB,KAAA,CAAM,QAAA,CAAS,OAAO,CAAA,IACtB,MAAM,QAAA,CAAS,SAAS,CAAA,IACxB,KAAA,CAAM,SAAS,SAAS,CAAA,IACxB,KAAA,CAAM,QAAA,CAAS,SAAS,CAAA,EACxB;AACA,QAAA,GAAA,CAAI,KAAK,GAAG,CAAA;AAAA,MACd;AAAA,IACF;AAAA,EACF,CAAA;AACA,EAAA,IAAA,CAAK,MAAM,CAAC,CAAA;AACZ,EAAA,OAAO,GAAA,CAAI,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,aAAA,CAAc,CAAC,CAAC,CAAA;AAC9C;AAIA,SAAS,kBAAA,CAAmB,KAAa,GAAA,EAAsB;AAC7D,EAAA,MAAM,KAAA,GAAQ,IAAI,WAAA,EAAY;AAC9B,EAAA,IAAI,KAAA,CAAM,SAAS,SAAS,CAAA,IAAK,MAAM,QAAA,CAAS,SAAS,GAAG,OAAO,IAAA;AACnE,EAAA,IAAI,eAAA,CAAgB,KAAK,GAAG,CAAA,IAAK,qBAAqB,IAAA,CAAK,GAAG,GAAG,OAAO,IAAA;AACxE,EAAA,IAAI,eAAA,CAAgB,KAAK,GAAG,CAAA,IAAK,qBAAqB,IAAA,CAAK,GAAG,GAAG,OAAO,IAAA;AACxE,EAAA,OAAO,KAAA;AACT;AAGO,SAAS,mBAAmB,GAAA,EAAuB;AACxD,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAY;AAE5B,EAAA,MAAM,OAAA,GAAU,+BAAA;AAChB,EAAA,IAAI,CAAA;AACJ,EAAA,OAAA,CAAQ,CAAA,GAAI,OAAA,CAAQ,IAAA,CAAK,GAAG,OAAO,IAAA,EAAM;AACvC,IAAA,IAAI,CAAA,CAAE,CAAC,CAAA,IAAK,CAAC,EAAE,CAAC,CAAA,CAAE,UAAA,CAAW,MAAM,CAAA,EAAG,GAAA,CAAI,GAAA,CAAI,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,EACpD;AAEA,EAAA,MAAM,OAAA,GAAU,mCAAA;AAChB,EAAA,OAAA,CAAQ,CAAA,GAAI,OAAA,CAAQ,IAAA,CAAK,GAAG,OAAO,IAAA,EAAM;AACvC,IAAA,IAAI,CAAA,CAAE,CAAC,CAAA,IAAK,CAAC,EAAE,CAAC,CAAA,CAAE,WAAW,MAAM,CAAA,IAAK,CAAC,CAAA,CAAE,CAAC,EAAE,UAAA,CAAW,GAAG,GAAG,GAAA,CAAI,GAAA,CAAI,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,EAC7E;AACA,EAAA,OAAO,CAAC,GAAG,GAAG,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,aAAA,CAAc,CAAC,CAAC,CAAA;AACnD;AAIA,SAAS,mBAAmB,GAAA,EAAsB;AAChD,EAAA,MAAM,IAAA,GAAYC,KAAA,CAAA,QAAA,CAAS,GAAG,CAAA,CAAE,WAAA,EAAY;AAC5C,EAAA,OACE,IAAA,KAAS,oBAAA,IACT,IAAA,KAAS,qBAAA,IACT,IAAA,KAAS,iBACT,IAAA,KAAS,cAAA,IACT,IAAA,CAAK,QAAA,CAAS,gBAAgB,CAAA;AAElC;AAMO,SAAS,4BAA4B,GAAA,EAAuB;AACjE,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAY;AAC5B,EAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA;AAC/B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA;AAEzB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,uDAAuD,CAAA;AACjF,IAAA,IAAI,SAAS,CAAC,CAAA,IAAK,CAAC,MAAA,CAAO,CAAC,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,IAAK,CAAC,OAAA,CAAQ,IAAA,CAAK,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG;AACzE,MAAA,MAAM,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA,CAAE,IAAA,EAAK;AACzB,MAAA,IAAI,CAAA,IAAK,CAAA,KAAM,MAAA,IAAU,CAAC,CAAA,CAAE,SAAS,GAAG,CAAA,EAAG,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA;AACpD,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,iBAAiB,IAAA,CAAK,IAAI,KAAK,qBAAA,CAAsB,IAAA,CAAK,IAAI,CAAA,EAAG;AACnE,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,CAAA,EAAG,KAAA,CAAM,MAAM,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1D,QAAA,MAAM,OAAO,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA,EAAI,MAAM,yDAAyD,CAAA;AAC5F,QAAA,IAAI,GAAA,GAAM,CAAC,CAAA,EAAG;AACZ,UAAA,GAAA,CAAI,GAAA,CAAI,GAAA,CAAI,CAAC,CAAA,CAAE,MAAM,CAAA;AACrB,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,IAAK,EAAE,CAAA,IAAK,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,IAAK,EAAE,CAAA,EAAG;AAEnE,UAAA,IAAA,CAAK,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA,EAAI,MAAM,YAAY,CAAA,IAAK,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,IAAK,EAAA,EAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AAAA,QAClF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,EAAA,OAAO,CAAC,GAAG,GAAG,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,aAAA,CAAc,CAAC,CAAC,CAAA;AACnD;AAIA,SAAS,iBAAiB,GAAA,EAAsB;AAC9C,EAAA,OAAO,GAAA,CAAI,WAAA,EAAY,CAAE,QAAA,CAAS,QAAQ,CAAA;AAC5C;AAIA,SAAS,kBAAA,CAAmB,KAAa,GAAA,EAAsB;AAC7D,EAAA,MAAM,KAAA,GAAQ,IAAI,WAAA,EAAY;AAC9B,EAAA,IAAI,KAAA,CAAM,SAAS,UAAU,CAAA,IAAK,MAAM,QAAA,CAAS,MAAM,GAAG,OAAO,IAAA;AACjE,EAAA,IAAI,KAAA,CAAM,SAAS,QAAQ,CAAA,IAAK,eAAe,IAAA,CAAK,GAAG,GAAG,OAAO,IAAA;AACjE,EAAA,OAAO,KAAA;AACT;AAKO,SAAS,mBAAmB,GAAA,EAAuB;AACxD,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAY;AAC5B,EAAA,MAAM,EAAA,GAAK,iDAAA;AACX,EAAA,IAAI,CAAA;AACJ,EAAA,OAAA,CAAQ,CAAA,GAAI,EAAA,CAAG,IAAA,CAAK,GAAG,OAAO,IAAA,EAAM;AAClC,IAAA,IAAI,CAAA,CAAE,CAAC,CAAA,IAAK,CAAC,EAAE,CAAC,CAAA,CAAE,UAAA,CAAW,MAAM,CAAA,EAAG,GAAA,CAAI,GAAA,CAAI,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,EACpD;AACA,EAAA,OAAO,CAAC,GAAG,GAAG,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,aAAA,CAAc,CAAC,CAAC,CAAA;AACnD;AAGO,SAAS,oBAAoB,GAAA,EAAuB;AACzD,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAY;AAC5B,EAAA,MAAM,EAAA,GAAK,2DAAA;AACX,EAAA,IAAI,CAAA;AACJ,EAAA,OAAA,CAAQ,CAAA,GAAI,EAAA,CAAG,IAAA,CAAK,GAAG,OAAO,IAAA,EAAM;AAClC,IAAA,IAAI,CAAA,CAAE,CAAC,CAAA,IAAK,CAAC,EAAE,CAAC,CAAA,CAAE,UAAA,CAAW,kBAAkB,CAAA,EAAG,GAAA,CAAI,GAAA,CAAI,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,EAChE;AACA,EAAA,OAAO,CAAC,GAAG,GAAG,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,aAAA,CAAc,CAAC,CAAC,CAAA;AACnD;AAIA,SAAS,mBAAA,CACP,QAAA,EACA,QAAA,EACA,OAAA,EAC+C;AAC/C,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAWA,KAAA,CAAA,UAAA,CAAW,QAAQ,CAAA,GAASA,KAAA,CAAA,OAAA,CAAQ,QAAQ,CAAA,GAASA,KAAA,CAAA,OAAA,CAAQ,UAAU,QAAQ,CAAA;AAAA,EAC5F,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,IAAA,GAAsD,IAAA;AAC1D,EAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,IAAA,IAAI,GAAA,KAAQ,EAAE,IAAA,IAAQ,GAAA,CAAI,WAAW,CAAA,CAAE,IAAA,GAAYA,SAAG,CAAA,EAAG;AACvD,MAAA,IAAI,CAAC,QAAQ,CAAA,CAAE,IAAA,CAAK,SAAS,IAAA,CAAK,IAAA,CAAK,QAAQ,IAAA,GAAO,CAAA;AAAA,IACxD;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,0BAAA,CACP,QAAA,EACA,UAAA,EACA,OAAA,EACAD,GAAAA,EAC+C;AAE/C,EAAA,MAAM,UAAA,GAAa;AAAA,IACZC,KAAA,CAAA,OAAA,CAAQ,UAAU,UAAU,CAAA;AAAA,IACjC,GAAG,QAAQ,GAAA,CAAI,CAAC,MAAWA,KAAA,CAAA,OAAA,CAAQ,CAAA,CAAE,IAAA,EAAM,UAAU,CAAC;AAAA,GACxD;AACA,EAAA,KAAA,MAAW,OAAO,UAAA,EAAY;AAC5B,IAAA,MAAM,GAAA,GAAM,mBAAA,CAAoB,QAAA,EAAU,GAAA,EAAK,OAAO,CAAA;AACtD,IAAA,IAAI,CAAC,GAAA,EAAK;AAEV,IAAA,IAAID,GAAAA,CAAG,SAAS,GAAG,CAAA,KAAM,QAAQ,WAAA,CAAY,GAAA,EAAK,GAAA,CAAI,IAAI,CAAA,EAAG;AAC3D,MAAA,IAAI,GAAA,CAAI,IAAA,KAAcC,KAAA,CAAA,OAAA,CAAQ,QAAQ,GAAG,OAAO,GAAA;AAAA,IAClD;AAAA,EACF;AAEA,EAAA,MAAM,QAAQ,UAAA,CAAW,OAAA,CAAQ,OAAO,GAAG,CAAA,CAAE,MAAM,GAAG,CAAA;AACtD,EAAA,IAAI,KAAA,CAAM,UAAU,CAAA,EAAG;AACrB,IAAA,MAAM,MAAA,GAAS,MAAM,CAAC,CAAA;AACtB,IAAA,KAAA,MAAW,KAAK,OAAA,EAAS;AACvB,MAAA,IAASA,KAAA,CAAA,QAAA,CAAS,CAAA,CAAE,IAAI,CAAA,KAAM,MAAA,IAAU,EAAE,IAAA,KAAcA,KAAA,CAAA,OAAA,CAAQ,QAAQ,CAAA,EAAG,OAAO,CAAA;AAAA,IACpF;AAAA,EACF;AACA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,WAAA,CAAY,OAAe,MAAA,EAAyB;AAC3D,EAAA,MAAM,MAAWA,KAAA,CAAA,QAAA,CAAcA,KAAA,CAAA,OAAA,CAAQ,MAAM,CAAA,EAAQA,KAAA,CAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AACnE,EAAA,OAAO,GAAA,KAAQ,MAAO,CAAC,GAAA,CAAI,WAAW,IAAI,CAAA,IAAK,CAAMA,KAAA,CAAA,UAAA,CAAW,GAAG,CAAA;AACrE;AC/VO,IAAM,2BAAA,GAA8B,uBAAA;AAkCpC,SAAS,sBAAA,CACd,WAAA,EACAD,GAAAA,EACA,OAAA,GAAoD,EAAC,EAC3B;AAC1B,EAAA,MAAM,OAAA,GAAeE,cAAQ,WAAW,CAAA;AACxC,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,CAAA;AACrC,EAAA,MAAM,QAAA,GAAW,QAAQ,QAAA,IAAY,EAAA;AACrC,EAAA,MAAM,MAAA,uBAAa,GAAA,EAA4B;AAE/C,EAAA,MAAM,GAAA,GAAM,CAAC,GAAA,EAAa,MAAA,EAAwB,KAAA,KAAyB;AACzE,IAAA,MAAM,IAAA,GAAYA,cAAQ,GAAG,CAAA;AAC7B,IAAA,IAAI,MAAA,CAAO,GAAA,CAAI,IAAI,CAAA,EAAG;AAEpB,MAAA;AAAA,IACF;AACA,IAAA,IAAI,MAAA,CAAO,QAAQ,QAAA,EAAU;AAC7B,IAAA,MAAA,CAAO,IAAI,IAAA,EAAM;AAAA,MACf,IAAA;AAAA,MACA,KAAA,EAAO,KAAA,KAAeA,KAAA,CAAA,QAAA,CAAS,IAAI,CAAA,IAAK,IAAA,CAAA;AAAA,MACxC;AAAA,KACD,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,GAAA,CAAI,OAAA,EAAS,UAAA,EAAiBA,KAAA,CAAA,QAAA,CAAS,OAAO,KAAK,OAAO,CAAA;AAG1D,EAAA,KAAA,MAAW,GAAA,IAAO,uBAAA,CAAwB,OAAA,EAASF,GAAAA,EAAI,QAAQ,CAAA,EAAG;AAChE,IAAA,GAAA,CAAI,KAAK,oBAAoB,CAAA;AAAA,EAC/B;AAGA,EAAA,KAAA,MAAW,GAAA,IAAO,mBAAA,CAAoB,OAAA,EAASA,GAAAA,EAAI,QAAQ,CAAA,EAAG;AAC5D,IAAA,GAAA,CAAI,KAAK,gBAAgB,CAAA;AAAA,EAC3B;AAGA,EAAA,KAAA,MAAW,GAAA,IAAO,mBAAA,CAAoB,OAAA,EAASA,GAAE,CAAA,EAAG;AAClD,IAAA,GAAA,CAAI,KAAK,eAAe,CAAA;AAAA,EAC1B;AAGA,EAAA,KAAA,MAAW,GAAA,IAAO,mBAAA,CAAoB,OAAA,EAASA,GAAE,CAAA,EAAG;AAClD,IAAA,GAAA,CAAI,KAAK,gBAAgB,CAAA;AAAA,EAC3B;AAEA,EAAA,MAAM,QAAQ,CAAC,GAAG,MAAA,CAAO,MAAA,EAAQ,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,IAAA,CAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAC,CAAA;AAC9E,EAAA,OAAO;AAAA,IACL,aAAA,EAAe,2BAAA;AAAA,IACf,WAAA,EAAa,OAAA;AAAA,IACb;AAAA,GACF;AACF;AAYA,SAAS,uBAAA,CAAwB,OAAA,EAAiBA,GAAAA,EAAgB,QAAA,EAA4B;AAC5F,EAAA,MAAM,OAAA,GAAeE,KAAA,CAAA,IAAA,CAAK,OAAA,EAAS,cAAc,CAAA;AACjD,EAAA,MAAM,GAAA,GAAMF,GAAAA,CAAG,QAAA,CAAS,OAAO,CAAA;AAC/B,EAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAC;AAClB,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,EACtB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACA,EAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,GAAA,CAAI,UAAU,CAAA;AACjD,EAAA,OAAO,kBAAA,CAAmB,OAAA,EAAS,QAAA,EAAUA,GAAAA,EAAI,QAAQ,CAAA;AAC3D;AAEA,SAAS,kBAAkB,UAAA,EAA+B;AACxD,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAA,EAAG;AAC7B,IAAA,OAAO,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,KAAmB,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,CAAE,IAAA,EAAK,CAAE,MAAA,GAAS,CAAC,CAAA;AAAA,EAC3F;AACA,EAAA,IAAI,UAAA,IAAc,OAAO,UAAA,KAAe,QAAA,IAAY,MAAM,OAAA,CAAS,UAAA,CAAsC,QAAQ,CAAA,EAAG;AAClH,IAAA,OAAS,WAAuC,QAAA,CAAU,MAAA;AAAA,MACxD,CAAC,MAAmB,OAAO,CAAA,KAAM,YAAY,CAAA,CAAE,IAAA,GAAO,MAAA,GAAS;AAAA,KACjE;AAAA,EACF;AACA,EAAA,OAAO,EAAC;AACV;AAEA,SAAS,mBAAA,CAAoB,OAAA,EAAiBA,GAAAA,EAAgB,QAAA,EAA4B;AACxF,EAAA,MAAM,MAAMA,GAAAA,CAAG,QAAA,CAAcE,KAAA,CAAA,IAAA,CAAK,OAAA,EAAS,qBAAqB,CAAC,CAAA;AACjE,EAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAC;AAClB,EAAA,MAAM,WAAqB,EAAC;AAE5B,EAAA,IAAI,UAAA,GAAa,KAAA;AACjB,EAAA,KAAA,MAAW,IAAA,IAAQ,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,EAAG;AACrC,IAAA,IAAI,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAA,EAAG;AAC9B,MAAA,UAAA,GAAa,IAAA;AACb,MAAA;AAAA,IACF;AACA,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,IAAI,KAAA,CAAM,KAAK,IAAI,CAAA,IAAK,CAAC,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,EAAG;AAC3C,MAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,gCAAgC,CAAA;AACrD,MAAA,IAAI,CAAA,GAAI,CAAC,CAAA,EAAG,QAAA,CAAS,KAAK,CAAA,CAAE,CAAC,CAAA,CAAE,IAAA,EAAM,CAAA;AAAA,IACvC;AAAA,EACF;AACA,EAAA,OAAO,kBAAA,CAAmB,OAAA,EAAS,QAAA,EAAUF,GAAAA,EAAI,QAAQ,CAAA;AAC3D;AAEA,SAAS,mBAAA,CAAoB,SAAiBA,GAAAA,EAA0B;AACtE,EAAA,MAAM,MAAMA,GAAAA,CAAG,QAAA,CAAcE,KAAA,CAAA,IAAA,CAAK,OAAA,EAAS,aAAa,CAAC,CAAA;AACzD,EAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAC;AAClB,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,KAAA,MAAW,IAAA,IAAQ,GAAA,CAAI,KAAA,CAAM,OAAO,CAAA,EAAG;AACrC,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,yBAAyB,CAAA;AAC9C,IAAA,IAAI,CAAC,CAAA,GAAI,CAAC,CAAA,EAAG;AACb,IAAA,MAAM,MAAWA,KAAA,CAAA,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAC,CAAA,CAAE,MAAM,CAAA;AAC7C,IAAA,IAAIF,GAAAA,CAAG,MAAA,CAAO,GAAG,CAAA,IAAKA,GAAAA,CAAG,YAAY,GAAG,CAAA,EAAG,GAAA,CAAI,IAAA,CAAK,GAAG,CAAA;AAAA,EACzD;AACA,EAAA,OAAO,GAAA,CAAI,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,aAAA,CAAc,CAAC,CAAC,CAAA;AAC9C;AAEA,SAAS,mBAAA,CAAoB,SAAiBA,GAAAA,EAA0B;AACtE,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,GAAGA,GAAAA,CAAG,OAAA,CAAQ,OAAO,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,iBAAiB,CAAC,EAAE,GAAA,CAAI,CAAC,MAAWE,KAAA,CAAA,IAAA,CAAK,OAAA,EAAS,CAAC,CAAC;AAAA,GACtG;AAEA,EAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,IAAA,MAAM,GAAA,GAAMF,GAAAA,CAAG,QAAA,CAAS,IAAI,CAAA;AAC5B,IAAA,IAAI,CAAC,GAAA,EAAK;AACV,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI;AACF,MAAA,GAAA,GAAM,IAAA,CAAK,MAAM,GAAG,CAAA;AAAA,IACtB,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAYE,cAAQ,IAAI,CAAA;AAC9B,IAAA,KAAA,MAAW,MAAA,IAAU,GAAA,CAAI,OAAA,IAAW,EAAC,EAAG;AACtC,MAAA,IAAI,OAAO,OAAO,IAAA,KAAS,QAAA,IAAY,CAAC,MAAA,CAAO,IAAA,CAAK,MAAK,EAAG;AAC5D,MAAA,MAAM,MAAWA,KAAA,CAAA,OAAA,CAAQ,IAAA,EAAM,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AACjD,MAAA,IAAIF,GAAAA,CAAG,MAAA,CAAO,GAAG,CAAA,IAAKA,GAAAA,CAAG,YAAY,GAAG,CAAA,EAAG,GAAA,CAAI,IAAA,CAAK,GAAG,CAAA;AAAA,IACzD;AAAA,EACF;AACA,EAAA,OAAO,GAAA,CAAI,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,aAAA,CAAc,CAAC,CAAC,CAAA;AAC9C;AAMA,SAAS,kBAAA,CACP,OAAA,EACA,QAAA,EACAA,GAAAA,EACA,QAAA,EACU;AACV,EAAA,MAAM,GAAA,uBAAU,GAAA,EAAY;AAC5B,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAM,CAAA,GAAI,QAAQ,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA,CAAE,OAAA,CAAQ,SAAS,EAAE,CAAA;AACzD,IAAA,IAAI,CAAC,CAAA,IAAK,CAAA,CAAE,UAAA,CAAW,IAAI,CAAA,EAAG;AAC9B,IAAA,IAAI,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA,EAAG;AACnB,MAAA,KAAA,MAAW,OAAO,gBAAA,CAAiB,OAAA,EAAS,CAAA,EAAGA,GAAAA,EAAI,QAAQ,CAAA,EAAG;AAC5D,QAAA,IAAI,qBAAqB,GAAA,EAAKA,GAAE,CAAA,EAAG,GAAA,CAAI,IAAI,GAAG,CAAA;AAAA,MAChD;AAAA,IACF,CAAA,MAAO;AACL,MAAA,MAAM,GAAA,GAAWE,KAAA,CAAA,OAAA,CAAQ,OAAA,EAAS,CAAC,CAAA;AACnC,MAAA,IAAIF,GAAAA,CAAG,MAAA,CAAO,GAAG,CAAA,IAAKA,IAAG,WAAA,CAAY,GAAG,CAAA,IAAK,oBAAA,CAAqB,GAAA,EAAKA,GAAE,CAAA,EAAG,GAAA,CAAI,IAAI,GAAG,CAAA;AAAA,IACzF;AAAA,EACF;AACA,EAAA,OAAO,CAAC,GAAG,GAAG,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,aAAA,CAAc,CAAC,CAAC,CAAA;AACnD;AAEA,SAAS,gBAAA,CAAiB,OAAA,EAAiB,OAAA,EAAiBA,GAAAA,EAAgB,QAAA,EAA4B;AAEtG,EAAA,MAAM,QAAQ,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,OAAO,OAAO,CAAA;AAC/C,EAAA,IAAI,QAAA,GAAW,CAAC,OAAO,CAAA;AACvB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,IAAA,MAAM,OAAiB,EAAC;AACxB,IAAA,MAAM,MAAA,GAAS,CAAA,KAAM,KAAA,CAAM,MAAA,GAAS,CAAA;AACpC,IAAA,KAAA,MAAW,OAAO,QAAA,EAAU;AAC1B,MAAA,IAAI,SAAS,IAAA,EAAM;AAEjB,QAAA,KAAA,MAAW,CAAA,IAAK,QAAA,CAAS,GAAA,EAAKA,GAAAA,EAAI,IAAA,CAAK,GAAA,CAAI,QAAA,EAAU,CAAC,CAAC,CAAA,EAAG,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA;AACrE,QAAA;AAAA,MACF;AACA,MAAA,IAAI,SAAS,GAAA,EAAK;AAChB,QAAA,KAAA,MAAW,IAAA,IAAQA,GAAAA,CAAG,OAAA,CAAQ,GAAG,CAAA,EAAG;AAClC,UAAA,MAAMG,IAAAA,GAAWD,KAAA,CAAA,IAAA,CAAK,GAAA,EAAK,IAAI,CAAA;AAC/B,UAAA,IAAIF,IAAG,WAAA,CAAYG,IAAG,CAAA,EAAG,IAAA,CAAK,KAAKA,IAAG,CAAA;AAAA,QACxC;AACA,QAAA;AAAA,MACF;AACA,MAAA,MAAM,GAAA,GAAWD,KAAA,CAAA,IAAA,CAAK,GAAA,EAAK,IAAI,CAAA;AAC/B,MAAA,IAAIF,IAAG,MAAA,CAAO,GAAG,CAAA,KAAM,MAAA,GAASA,IAAG,WAAA,CAAY,GAAG,CAAA,IAAKA,GAAAA,CAAG,OAAO,GAAG,CAAA,GAAIA,GAAAA,CAAG,WAAA,CAAY,GAAG,CAAA,CAAA,EAAI;AAC5F,QAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,MACf;AAAA,IACF;AACA,IAAA,QAAA,GAAW,IAAA;AACX,IAAA,IAAI,CAAC,SAAS,MAAA,EAAQ;AAAA,EACxB;AACA,EAAA,OAAO,SAAS,MAAA,CAAO,CAAC,MAAMA,GAAAA,CAAG,WAAA,CAAY,CAAC,CAAC,CAAA;AACjD;AAEA,SAAS,QAAA,CAAS,IAAA,EAAcA,GAAAA,EAAgB,KAAA,EAAyB;AACvE,EAAA,IAAI,KAAA,IAAS,CAAA,EAAG,OAAO,EAAC;AACxB,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,KAAA,MAAW,IAAA,IAAQA,GAAAA,CAAG,OAAA,CAAQ,IAAI,CAAA,EAAG;AACnC,IAAA,IAAI,SAAS,cAAA,IAAkB,IAAA,KAAS,UAAU,IAAA,KAAS,MAAA,IAAU,SAAS,OAAA,EAAS;AACvF,IAAA,MAAM,GAAA,GAAWE,KAAA,CAAA,IAAA,CAAK,IAAA,EAAM,IAAI,CAAA;AAChC,IAAA,IAAI,CAACF,GAAAA,CAAG,WAAA,CAAY,GAAG,CAAA,EAAG;AAC1B,IAAA,GAAA,CAAI,KAAK,GAAG,CAAA;AACZ,IAAA,GAAA,CAAI,KAAK,GAAG,QAAA,CAAS,KAAKA,GAAAA,EAAI,KAAA,GAAQ,CAAC,CAAC,CAAA;AAAA,EAC1C;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,oBAAA,CAAqB,KAAaA,GAAAA,EAAyB;AAClE,EAAA,OAAOA,GAAAA,CAAG,MAAA,CAAYE,KAAA,CAAA,IAAA,CAAK,GAAA,EAAK,cAAc,CAAC,CAAA;AACjD;AAGO,SAAS,cAAA,GAA6B;AAC3C,EAAA,OAAO;AAAA,IACL,SAAS,OAAA,EAAS;AAChB,MAAA,IAAI;AACF,QAAA,OAAcE,EAAA,CAAA,YAAA,CAAa,SAAS,MAAM,CAAA;AAAA,MAC5C,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF,CAAA;AAAA,IACA,QAAQ,OAAA,EAAS;AACf,MAAA,IAAI;AACF,QAAA,OAAcA,EAAA,CAAA,WAAA,CAAY,OAAO,CAAA,CAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,aAAA,CAAc,CAAC,CAAC,CAAA;AAAA,MACtE,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,EAAC;AAAA,MACV;AAAA,IACF,CAAA;AAAA,IACA,YAAY,OAAA,EAAS;AACnB,MAAA,IAAI;AACF,QAAA,OAAcA,EAAA,CAAA,QAAA,CAAS,OAAO,CAAA,CAAE,WAAA,EAAY;AAAA,MAC9C,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF,CAAA;AAAA,IACA,OAAO,OAAA,EAAS;AACd,MAAA,IAAI;AACF,QAAA,OAAcA,cAAW,OAAO,CAAA;AAAA,MAClC,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF;AAAA,GACF;AACF;;;ACtRO,IAAM,yBAAA,GAA4B;AAoClC,SAAS,cAAA,CAAe,WAAA,EAAqB,OAAA,GAAqC,EAAC,EAA8B;AACtH,EAAA,MAAM,OAAA,GAAe,cAAQ,WAAW,CAAA;AACxC,EAAA,MAAM,IAAA,GAAO,eAAe,OAAO,CAAA;AACnC,EAAA,IAAI,CAAI,EAAA,CAAA,UAAA,CAAW,IAAI,CAAA,EAAG;AACxB,IAAA,IAAI,OAAA,CAAQ,aAAa,OAAO,IAAA;AAChC,IAAA,OAAO,uBAAuB,OAAO,CAAA;AAAA,EACvC;AACA,EAAA,IAAI,GAAA;AACJ,EAAA,IAAI;AACF,IAAA,GAAA,GAAM,IAAA,CAAK,KAAA,CAAS,EAAA,CAAA,YAAA,CAAa,IAAA,EAAM,MAAM,CAAC,CAAA;AAAA,EAChD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAO,mBAAA,CAAoB,SAAS,GAAG,CAAA;AACzC;AAOO,SAAS,wBAAA,CACd,WAAA,EACA,OAAA,GAAqE,EAAC,EAClD;AACpB,EAAA,MAAM,OAAA,GAAe,cAAQ,WAAW,CAAA;AACxC,EAAA,MAAM,WAAW,cAAA,CAAe,OAAA,EAAS,EAAE,WAAA,EAAa,MAAM,CAAA;AAC9D,EAAA,IAAI,QAAA,EAAU;AAEZ,IAAA,IAAI,CAAC,QAAA,CAAS,OAAA,EAAS,MAAA,EAAQ;AAC7B,MAAA,QAAA,CAAS,OAAA,GAAU,iBAAA,CAAkB,QAAA,CAAS,OAAA,EAAS,QAAQ,mBAAmB,CAAA;AAAA,IACpF;AACA,IAAA,OAAO,QAAA;AAAA,EACT;AAEA,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,UAAA,IAAc,cAAA,EAAe;AACjD,EAAA,MAAM,UAAA,GAAa,sBAAA,CAAuB,OAAA,EAAS,GAAG,CAAA;AACtD,EAAA,MAAM,QAAQ,UAAA,CAAW,KAAA,CAAM,IAAI,CAAC,CAAA,KAAM,EAAE,IAAI,CAAA;AAChD,EAAA,MAAM,MAAM,4BAAA,CAA6B,KAAA,EAAO,EAAE,gBAAA,EAAkB,SAAS,CAAA;AAC7E,EAAA,GAAA,CAAI,OAAA,GAAU,iBAAA,CAAkB,GAAA,CAAI,OAAA,EAAS,QAAQ,mBAAmB,CAAA;AACxE,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,iBAAA,CAAkB,OAAA,EAA6B,aAAA,GAAgB,GAAA,EAAmB;AACzF,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,YAAA,EAAc,CAAA,CAAE,YAAA,EAAa,CAAE,CAAA;AACtF,EAAA,MAAM,QAAA,GAAW,mBAAA;AAAA,IACf,UAAA;AAAA,IACA,CAAC,IAAA,KAAS;AACR,MAAA,IAAI;AACF,QAAA,MAAM,MAAS,EAAA,CAAA,YAAA,CAAkB,KAAA,CAAA,IAAA,CAAK,IAAA,EAAM,cAAc,GAAG,MAAM,CAAA;AACnE,QAAA,OAAO,qBAAqB,GAAG,CAAA;AAAA,MACjC,CAAA,CAAA,MAAQ;AACN,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF,CAAA;AAAA,IACA,EAAE,aAAA;AAAc,GAClB;AACA,EAAA,MAAM,UAAA,GAAa,wBAAA;AAAA,IACjB,UAAA;AAAA,IACA;AAAA,MACE,SAAS,OAAA,EAAS;AAChB,QAAA,IAAI;AACF,UAAA,OAAU,EAAA,CAAA,YAAA,CAAa,SAAS,MAAM,CAAA;AAAA,QACxC,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO,IAAA;AAAA,QACT;AAAA,MACF,CAAA;AAAA,MACA,QAAQ,OAAA,EAAS;AACf,QAAA,IAAI;AACF,UAAA,OAAU,EAAA,CAAA,WAAA,CAAY,OAAO,CAAA,CAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,aAAA,CAAc,CAAC,CAAC,CAAA;AAAA,QAClE,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO,EAAC;AAAA,QACV;AAAA,MACF,CAAA;AAAA,MACA,YAAY,OAAA,EAAS;AACnB,QAAA,IAAI;AACF,UAAA,OAAU,EAAA,CAAA,QAAA,CAAS,OAAO,CAAA,CAAE,WAAA,EAAY;AAAA,QAC1C,CAAA,CAAA,MAAQ;AACN,UAAA,OAAO,KAAA;AAAA,QACT;AAAA,MACF;AAAA,KACF;AAAA,IACA,EAAE,aAAA;AAAc,GAClB;AAEA,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,MAAM,MAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,KAAK,CAAC,GAAG,QAAA,EAAU,GAAG,UAAU,CAAA,CAAE,IAAA;AAAA,IAC3C,CAAC,CAAA,EAAG,CAAA,KACF,CAAA,CAAE,QAAA,CAAS,cAAc,CAAA,CAAE,QAAQ,CAAA,IACnC,CAAA,CAAE,MAAA,CAAO,aAAA,CAAc,EAAE,MAAM,CAAA,IAC/B,CAAA,CAAE,IAAA,CAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA,IAC3B,CAAA,CAAE,QAAA,CAAS,aAAA,CAAc,CAAA,CAAE,QAAQ;AAAA,GACvC,EAAG;AACD,IAAA,MAAM,GAAA,GAAM,CAAA,EAAG,CAAA,CAAE,gBAAgB,CAAA,CAAA,EAAI,CAAA,CAAE,cAAc,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,QAAQ,CAAA,CAAA;AAC7E,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,EAAG;AACnB,IAAA,IAAA,CAAK,IAAI,GAAG,CAAA;AACZ,IAAA,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,EACZ;AACA,EAAA,OAAO,GAAA;AACT;AAIO,SAAS,eAAe,WAAA,EAA6B;AAC1D,EAAA,OAAY,KAAA,CAAA,IAAA,CAAU,KAAA,CAAA,OAAA,CAAQ,WAAW,CAAA,EAAG,aAAa,iBAAiB,CAAA;AAC5E;AAEO,SAAS,uBAAuB,WAAA,EAAyC;AAC9E,EAAA,MAAM,OAAA,GAAe,cAAQ,WAAW,CAAA;AACxC,EAAA,MAAM,CAAC,EAAE,CAAA,GAAI,wBAAwB,CAAC,OAAO,GAAG,OAAO,CAAA;AACvD,EAAA,OAAO;AAAA,IACL,aAAA,EAAe,yBAAA;AAAA,IACf,WAAA,EAAa,OAAA;AAAA,IACb,OAAA,EAAS;AAAA,MACP,cAAA,CAAe,EAAA,EAAI,IAAA,IAAQ,OAAA,EAAS,SAAA,EAAW,IAAI,KAAA,KAAe,KAAA,CAAA,QAAA,CAAS,OAAO,CAAA,IAAK,OAAA,CAAQ;AAAA;AACjG,GACF;AACF;AAEO,SAAS,mBAAA,CAAoB,aAAqB,GAAA,EAAgD;AACvG,EAAA,MAAM,OAAA,GAAe,cAAQ,WAAW,CAAA;AACxC,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,UAAU,OAAO,IAAA;AAC5C,EAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,GAAI,GAAA,CAAI,UAAU,EAAC;AACzD,EAAA,IAAI,CAAC,IAAA,CAAK,MAAA,EAAQ,OAAO,uBAAuB,OAAO,CAAA;AAEvD,EAAA,MAAM,UAA8B,EAAC;AACrC,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,IAAI,UAAA,GAAa,KAAA;AAEjB,EAAA,KAAA,MAAW,SAAS,IAAA,EAAM;AACxB,IAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,CAAM,IAAA,KAAS,YAAY,CAAC,KAAA,CAAM,IAAA,CAAK,IAAA,EAAK,EAAG;AACpE,IAAA,MAAM,MAAW,KAAA,CAAA,OAAA,CAAQ,OAAA,EAAS,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA;AACnD,IAAA,MAAM,EAAA,GAAK,qBAAqB,GAAG,CAAA;AACnC,IAAA,IAAI,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,EAAG;AAClB,IAAA,IAAA,CAAK,IAAI,EAAE,CAAA;AACX,IAAA,MAAM,OAA6B,KAAA,CAAM,IAAA,KAAS,SAAA,IAAa,GAAA,KAAQ,UAAU,SAAA,GAAY,QAAA;AAC7F,IAAA,IAAI,IAAA,KAAS,WAAW,UAAA,GAAa,IAAA;AACrC,IAAA,OAAA,CAAQ,IAAA,CAAK,eAAe,GAAA,EAAK,IAAA,EAAM,OAAO,KAAA,CAAM,KAAA,KAAU,YAAY,KAAA,CAAM,KAAA,CAAM,MAAK,GAAI,KAAA,CAAM,MAAM,IAAA,EAAK,GAAS,eAAS,GAAG,CAAA,IAAK,GAAG,CAAC,CAAA;AAAA,EAChJ;AAEA,EAAA,IAAI,CAAC,OAAA,CAAQ,MAAA,EAAQ,OAAO,uBAAuB,OAAO,CAAA;AAC1D,EAAA,IAAI,CAAC,UAAA,EAAY;AAEf,IAAA,MAAM,EAAA,GAAK,qBAAqB,OAAO,CAAA;AACvC,IAAA,IAAI,CAAC,IAAA,CAAK,GAAA,CAAI,EAAE,CAAA,EAAG;AACjB,MAAA,OAAA,CAAQ,OAAA,CAAQ,eAAe,OAAA,EAAS,SAAA,EAAgB,eAAS,OAAO,CAAA,IAAK,OAAO,CAAC,CAAA;AAAA,IACvF,CAAA,MAAO;AACL,MAAA,MAAM,WAAW,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,iBAAiB,EAAE,CAAA;AAC1D,MAAA,IAAI,QAAA,WAAmB,IAAA,GAAO,SAAA;AAAA,IAChC;AAAA,EACF;AAEA,EAAA,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACrB,IAAA,IAAI,CAAA,CAAE,SAAS,CAAA,CAAE,IAAA,SAAa,CAAA,CAAE,IAAA,KAAS,YAAY,EAAA,GAAK,CAAA;AAC1D,IAAA,OAAO,CAAA,CAAE,IAAA,CAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA;AAAA,EACpC,CAAC,CAAA;AAED,EAAA,MAAM,GAAA,GAA0B;AAAA,IAC9B,aAAA,EAAe,yBAAA;AAAA,IACf,WAAA,EAAa,OAAA;AAAA,IACb;AAAA,GACF;AACA,EAAA,IAAI,MAAM,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA,IAAK,GAAA,CAAI,QAAQ,MAAA,EAAQ;AACpD,IAAA,GAAA,CAAI,OAAA,GAAU,IAAI,OAAA,CACf,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,IAAK,OAAO,CAAA,KAAM,QAAA,IAAY,OAAO,CAAA,CAAE,QAAA,KAAa,YAAY,OAAO,CAAA,CAAE,WAAW,QAAQ,CAAA,CAC1G,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACX,GAAG,CAAA;AAAA,MACH,QAAA,EAAe,KAAA,CAAA,OAAA,CAAQ,OAAA,EAAS,CAAA,CAAE,QAAQ,CAAA;AAAA,MAC1C,MAAA,EAAa,KAAA,CAAA,OAAA,CAAQ,OAAA,EAAS,CAAA,CAAE,MAAM;AAAA,KACxC,CAAE,CAAA;AAAA,EACN;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,cAAA,CAAe,IAAA,EAAc,IAAA,EAA4B,KAAA,EAAiC;AACjG,EAAA,MAAM,GAAA,GAAM,aAAa,IAAI,CAAA;AAC7B,EAAA,MAAM,SAAA,GAAY,GAAA,CAAI,IAAA,KAAS,MAAA,IAAU,GAAA,CAAI,GAAA,GAAM,qBAAA,CAAsB,IAAA,EAAM,GAAA,CAAI,GAAG,CAAA,GAAI,eAAA,CAAgB,IAAI,CAAA;AAC9G,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA;AAAA,IACA,YAAA,EAAc,qBAAqB,IAAI,CAAA;AAAA,IACvC;AAAA,GACF;AACF;AAOO,SAAS,4BAAA,CACd,KAAA,EACA,OAAA,GAAyC,EAAC,EACtB;AACpB,EAAA,MAAM,UAAA,GAAa,uBAAA,CAAwB,KAAA,EAAO,OAAA,CAAQ,gBAAA,IAAoB,MAAM,CAAC,CAAA,IAAK,OAAA,CAAQ,GAAA,EAAK,CAAA;AACvG,EAAA,IAAI,CAAC,WAAW,MAAA,EAAQ;AACtB,IAAA,MAAM,WAAgB,KAAA,CAAA,OAAA,CAAQ,OAAA,CAAQ,gBAAA,IAAoB,OAAA,CAAQ,KAAK,CAAA;AACvE,IAAA,OAAO,uBAAuB,QAAQ,CAAA;AAAA,EACxC;AACA,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,gBAAA,EAAkB,IAAA,EAAK,GACxC,KAAA,CAAA,OAAA,CAAQ,OAAA,CAAQ,gBAAA,CAAiB,IAAA,EAAM,CAAA,GAC5C,UAAA,CAAW,CAAC,CAAA,CAAG,IAAA;AACnB,EAAA,MAAM,UAAA,GACJ,WAAW,IAAA,CAAK,CAAC,MAAM,CAAA,CAAE,IAAA,KAAS,SAAS,CAAA,IAC3C,UAAA,CAAW,KAAK,CAAC,CAAA,KAAM,EAAE,EAAA,KAAO,oBAAA,CAAqB,SAAS,CAAC,CAAA,IAC/D,WAAW,CAAC,CAAA;AACd,EAAA,MAAM,cAAc,UAAA,CAAW,IAAA;AAC/B,EAAA,MAAM,UAA8B,UAAA,CAAW,GAAA;AAAA,IAAI,CAAC,EAAA,KAClD,cAAA,CAAe,EAAA,CAAG,IAAA,EAAM,EAAA,CAAG,IAAA,KAAS,WAAA,GAAc,SAAA,GAAY,QAAA,EAAU,EAAA,CAAG,KAAK;AAAA,GAClF;AACA,EAAA,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACrB,IAAA,IAAI,CAAA,CAAE,SAAS,CAAA,CAAE,IAAA,SAAa,CAAA,CAAE,IAAA,KAAS,YAAY,EAAA,GAAK,CAAA;AAC1D,IAAA,OAAO,CAAA,CAAE,IAAA,CAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA;AAAA,EACpC,CAAC,CAAA;AACD,EAAA,OAAO;AAAA,IACL,aAAA,EAAe,yBAAA;AAAA,IACf,WAAA;AAAA,IACA;AAAA,GACF;AACF;AAMO,SAAS,mBAAA,CAAoB,aAAqB,UAAA,EAAwC;AAC/F,EAAA,MAAM,OAAA,GAAe,cAAQ,WAAW,CAAA;AACxC,EAAA,MAAM,IAAA,GAAO,eAAe,OAAO,CAAA;AACnC,EAAG,aAAe,KAAA,CAAA,OAAA,CAAQ,IAAI,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AACpD,EAAA,MAAM,IAAA,GAAuB;AAAA,IAC3B,aAAA,EAAe,yBAAA;AAAA,IACf,OAAA,EAAS,UAAA,CAAW,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA;AAAA,MAEtC,IAAA,EAAW,KAAA,CAAA,QAAA,CAAS,OAAA,EAAS,CAAA,CAAE,IAAI,CAAA,IAAK,GAAA;AAAA,MACxC,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,MAAM,CAAA,CAAE;AAAA,KACV,CAAE;AAAA,GACJ;AACA,EAAA,IAAI,UAAA,CAAW,SAAS,MAAA,EAAQ;AAE9B,IAAA,IAAA,CAAK,OAAA,GAAU,UAAA,CAAW,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MAC5C,GAAG,CAAA;AAAA,MACH,QAAA,EAAe,KAAA,CAAA,QAAA,CAAS,OAAA,EAAS,CAAA,CAAE,QAAQ,CAAA,IAAK,GAAA;AAAA,MAChD,MAAA,EAAa,KAAA,CAAA,QAAA,CAAS,OAAA,EAAS,CAAA,CAAE,MAAM,CAAA,IAAK;AAAA,KAC9C,CAAE,CAAA;AAAA,EACJ;AACA,EAAG,EAAA,CAAA,aAAA,CAAc,MAAM,CAAA,EAAG,IAAA,CAAK,UAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAC;AAAA,CAAA,EAAM,MAAM,CAAA;AACnE,EAAA,OAAO,IAAA;AACT","file":"chunk-5I4VSBWQ.js","sourcesContent":["/**\n * Pure workspace-roots helpers (Fusion Runtime / federation).\n *\n * Stream S owns the long-term pure library design; this module is the F-side\n * implementation used by federation + vgd until S lands a shared package.\n * No daemon I/O — path math only.\n *\n * @see docs/plans/coordination/FUSION-HANDOFF.md\n * @see src/runtime/federation.ts\n */\n\nimport * as path from 'node:path';\nimport { repositoryIdFromRoot } from '../runtime/paths.js';\n\nexport interface WorkspaceRoot {\n /** Absolute normalized path */\n root: string;\n /** Stable id (same as global store repository id) */\n id: string;\n /** Basename label */\n label: string;\n}\n\n/**\n * Normalize a list of roots (absolute or relative to `base`) into unique\n * WorkspaceRoot records. Deterministic order: sorted by absolute root path.\n */\nexport function normalizeWorkspaceRoots(roots: string[], base: string = process.cwd()): WorkspaceRoot[] {\n const seen = new Set<string>();\n const out: WorkspaceRoot[] = [];\n const baseAbs = path.resolve(base);\n for (const r of roots) {\n if (typeof r !== 'string' || !r.trim()) continue;\n const abs = path.resolve(baseAbs, r.trim());\n const id = repositoryIdFromRoot(abs);\n if (seen.has(id)) continue;\n seen.add(id);\n out.push({\n root: abs,\n id,\n label: path.basename(abs) || abs,\n });\n }\n return out.sort((a, b) => a.root.localeCompare(b.root));\n}\n\n/** True if `child` is equal to or nested under `parent` (path-safe). */\nexport function isPathInside(child: string, parent: string): boolean {\n const rel = path.relative(path.resolve(parent), path.resolve(child));\n return rel === '' || (!rel.startsWith('..') && !path.isAbsolute(rel));\n}\n\n/**\n * Pick the primary root: explicit `preferred` if present in the set, else the\n * first after sort (deterministic).\n */\nexport function selectPrimaryRoot(roots: WorkspaceRoot[], preferred?: string): WorkspaceRoot | null {\n if (!roots.length) return null;\n if (preferred?.trim()) {\n const abs = path.resolve(preferred.trim());\n const hit = roots.find((r) => r.root === abs || r.id === repositoryIdFromRoot(abs));\n if (hit) return hit;\n }\n return roots[0] ?? null;\n}\n","/**\n * Cross-workspace bridge edges (Fusion Runtime Phase 6).\n *\n * schemaVersion: bridge-edge/0\n *\n * Conservative edges between federation members when one package.json\n * depends on another member's package name (workspace:*, link:, file:, or\n * exact version). Low-confidence edges are marked so high-stakes capsules\n * can exclude them. Pure over injected package.json readers.\n */\n\nimport * as path from 'node:path';\nimport { repositoryIdFromRoot } from './paths.js';\n\nexport const BRIDGE_EDGE_SCHEMA_VERSION = 'bridge-edge/0' as const;\n\nexport type BridgeKind =\n | 'workspace-package'\n | 'path-dependency'\n | 'git-submodule'\n | 'openapi-ref'\n | 'compose-service'\n | 'protobuf-import'\n | 'graphql-ref';\n\nexport interface BridgeEdge {\n schemaVersion: typeof BRIDGE_EDGE_SCHEMA_VERSION;\n fromRepositoryId: string;\n toRepositoryId: string;\n fromRoot: string;\n toRoot: string;\n kind: BridgeKind;\n /** 0..1 — workspace:* is high; bare version match is medium. */\n confidence: number;\n /** Short, secret-free evidence string for transparency UIs. */\n evidence: string;\n packageName?: string;\n}\n\nexport interface BridgeMember {\n root: string;\n repositoryId?: string;\n}\n\nexport interface PackageManifest {\n name?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n optionalDependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n}\n\n/**\n * Build bridge edges among `members` by reading each member's package.json.\n * Deterministic: sorted by (fromRoot, toRoot, packageName).\n */\nexport function discoverBridgeEdges(\n members: BridgeMember[],\n readPackageJson: (root: string) => PackageManifest | null,\n options: { minConfidence?: number } = {},\n): BridgeEdge[] {\n const min = options.minConfidence ?? 0;\n const packages = new Map<string, { root: string; repositoryId: string; name: string }>();\n\n for (const m of members) {\n const root = path.resolve(m.root);\n const pkg = readPackageJson(root);\n const name = typeof pkg?.name === 'string' ? pkg.name.trim() : '';\n if (!name) continue;\n const repositoryId = m.repositoryId ?? repositoryIdFromRoot(root);\n packages.set(name, { root, repositoryId, name });\n }\n\n const edges: BridgeEdge[] = [];\n const seen = new Set<string>();\n\n for (const m of members) {\n const fromRoot = path.resolve(m.root);\n const fromId = m.repositoryId ?? repositoryIdFromRoot(fromRoot);\n const pkg = readPackageJson(fromRoot);\n if (!pkg) continue;\n\n const deps = collectDeps(pkg);\n for (const [depName, range] of deps) {\n const target = packages.get(depName);\n if (!target) continue;\n if (target.root === fromRoot) continue;\n\n const { kind, confidence } = classifyDependency(range, fromRoot, target.root);\n if (confidence < min) continue;\n\n const key = `${fromId}->${target.repositoryId}:${depName}`;\n if (seen.has(key)) continue;\n seen.add(key);\n\n edges.push({\n schemaVersion: BRIDGE_EDGE_SCHEMA_VERSION,\n fromRepositoryId: fromId,\n toRepositoryId: target.repositoryId,\n fromRoot,\n toRoot: target.root,\n kind,\n confidence,\n evidence: `${path.basename(fromRoot)} depends on ${depName} (${range})`,\n packageName: depName,\n });\n }\n }\n\n return edges.sort(\n (a, b) =>\n a.fromRoot.localeCompare(b.fromRoot) ||\n a.toRoot.localeCompare(b.toRoot) ||\n (a.packageName ?? '').localeCompare(b.packageName ?? ''),\n );\n}\n\n/** High-confidence bridges only (workspace:/link:/file: or confidence ≥ 0.8). */\nexport function highConfidenceBridges(edges: BridgeEdge[]): BridgeEdge[] {\n return edges.filter((e) => e.confidence >= 0.8);\n}\n\nfunction collectDeps(pkg: PackageManifest): Array<[string, string]> {\n const out: Array<[string, string]> = [];\n for (const field of ['dependencies', 'devDependencies', 'optionalDependencies', 'peerDependencies'] as const) {\n const block = pkg[field];\n if (!block || typeof block !== 'object') continue;\n for (const [name, range] of Object.entries(block)) {\n if (typeof name === 'string' && typeof range === 'string') out.push([name, range]);\n }\n }\n // Stable order for determinism.\n return out.sort((a, b) => a[0].localeCompare(b[0]) || a[1].localeCompare(b[1]));\n}\n\nfunction classifyDependency(\n range: string,\n fromRoot: string,\n toRoot: string,\n): { kind: BridgeKind; confidence: number } {\n const r = range.trim();\n if (r.startsWith('workspace:') || r.startsWith('link:')) {\n return { kind: 'workspace-package', confidence: 0.95 };\n }\n if (r.startsWith('file:')) {\n // Confirm the file: path resolves under the target when possible.\n const rel = r.slice('file:'.length).trim();\n try {\n const resolved = path.resolve(fromRoot, rel);\n if (path.resolve(resolved) === path.resolve(toRoot)) {\n return { kind: 'path-dependency', confidence: 0.9 };\n }\n } catch {\n /* ignore */\n }\n return { kind: 'path-dependency', confidence: 0.75 };\n }\n // Same monorepo package name without workspace protocol — medium confidence.\n return { kind: 'workspace-package', confidence: 0.55 };\n}\n\n/** Parse package.json text into a manifest (or null). */\nexport function parsePackageManifest(raw: string): PackageManifest | null {\n try {\n const o = JSON.parse(raw) as PackageManifest;\n if (!o || typeof o !== 'object') return null;\n return o;\n } catch {\n return null;\n }\n}\n","/**\n * Interface / service bridge edges (Fusion Runtime Phase 6).\n *\n * Conservative cross-member links from OpenAPI `$ref` paths, Docker Compose\n * `build` contexts, protobuf `import` statements, and GraphQL schema\n * `#import` / path references. Pure over injected file readers — no network.\n * Confidence stays modest so high-stakes capsules can filter via\n * high-confidence package edges.\n */\n\nimport * as path from 'node:path';\nimport {\n BRIDGE_EDGE_SCHEMA_VERSION,\n type BridgeEdge,\n type BridgeMember,\n} from './bridge-edges.js';\nimport { repositoryIdFromRoot } from './paths.js';\n\nexport type InterfaceBridgeKind =\n | 'openapi-ref'\n | 'compose-service'\n | 'protobuf-import'\n | 'graphql-ref';\n\nexport interface InterfaceBridgeFs {\n /** Read UTF-8 text or null if missing. */\n readFile(absPath: string): string | null;\n /** List file basenames under a directory (non-recursive). */\n readdir(absPath: string): string[];\n /** True when path is a directory. */\n isDirectory(absPath: string): boolean;\n}\n\n/**\n * Discover OpenAPI / Compose / protobuf / GraphQL bridges among federation members.\n * Deterministic sort: fromRoot, toRoot, kind, evidence.\n */\nexport function discoverInterfaceBridges(\n members: BridgeMember[],\n fs: InterfaceBridgeFs,\n options: { minConfidence?: number; maxFilesPerMember?: number } = {},\n): BridgeEdge[] {\n const min = options.minConfidence ?? 0;\n const maxFiles = options.maxFilesPerMember ?? 40;\n const resolved = members.map((m) => ({\n root: path.resolve(m.root),\n repositoryId: m.repositoryId ?? repositoryIdFromRoot(m.root),\n }));\n\n const edges: BridgeEdge[] = [];\n const seen = new Set<string>();\n\n const push = (edge: BridgeEdge): void => {\n if (edge.confidence < min) return;\n if (edge.fromRoot === edge.toRoot) return;\n const key = `${edge.fromRepositoryId}->${edge.toRepositoryId}:${edge.kind}:${edge.evidence}`;\n if (seen.has(key)) return;\n seen.add(key);\n edges.push(edge);\n };\n\n for (const from of resolved) {\n const files = listCandidateFiles(from.root, fs, maxFiles);\n for (const file of files) {\n const rel = path.relative(from.root, file).replace(/\\\\/g, '/');\n const raw = fs.readFile(file);\n if (!raw) continue;\n\n if (isOpenApiCandidate(rel, raw)) {\n for (const refPath of extractOpenApiRefs(raw)) {\n const target = resolvePathToMember(from.root, refPath, resolved);\n if (!target || target.root === from.root) continue;\n push({\n schemaVersion: BRIDGE_EDGE_SCHEMA_VERSION,\n fromRepositoryId: from.repositoryId,\n toRepositoryId: target.repositoryId,\n fromRoot: from.root,\n toRoot: target.root,\n kind: 'openapi-ref',\n confidence: 0.7,\n evidence: `openapi $ref in ${rel} → ${refPath}`,\n });\n }\n }\n\n if (isComposeCandidate(rel)) {\n for (const ctx of extractComposeBuildContexts(raw)) {\n const target = resolvePathToMember(from.root, ctx, resolved);\n if (!target || target.root === from.root) continue;\n push({\n schemaVersion: BRIDGE_EDGE_SCHEMA_VERSION,\n fromRepositoryId: from.repositoryId,\n toRepositoryId: target.repositoryId,\n fromRoot: from.root,\n toRoot: target.root,\n kind: 'compose-service',\n confidence: 0.75,\n evidence: `compose build context in ${rel} → ${ctx}`,\n });\n }\n }\n\n if (isProtoCandidate(rel)) {\n for (const imp of extractProtoImports(raw)) {\n const target = resolveProtoImportToMember(from.root, imp, resolved, fs);\n if (!target || target.root === from.root) continue;\n push({\n schemaVersion: BRIDGE_EDGE_SCHEMA_VERSION,\n fromRepositoryId: from.repositoryId,\n toRepositoryId: target.repositoryId,\n fromRoot: from.root,\n toRoot: target.root,\n kind: 'protobuf-import',\n confidence: 0.72,\n evidence: `protobuf import in ${rel} → ${imp}`,\n });\n }\n }\n\n if (isGraphqlCandidate(rel, raw)) {\n for (const refPath of extractGraphqlRefs(raw)) {\n const target = resolvePathToMember(from.root, refPath, resolved);\n if (!target || target.root === from.root) continue;\n push({\n schemaVersion: BRIDGE_EDGE_SCHEMA_VERSION,\n fromRepositoryId: from.repositoryId,\n toRepositoryId: target.repositoryId,\n fromRoot: from.root,\n toRoot: target.root,\n kind: 'graphql-ref',\n confidence: 0.68,\n evidence: `graphql import in ${rel} → ${refPath}`,\n });\n }\n }\n }\n }\n\n return edges.sort(\n (a, b) =>\n a.fromRoot.localeCompare(b.fromRoot) ||\n a.toRoot.localeCompare(b.toRoot) ||\n a.kind.localeCompare(b.kind) ||\n a.evidence.localeCompare(b.evidence),\n );\n}\n\n// ── file discovery ─────────────────────────────────────────────────────────\n\nfunction listCandidateFiles(root: string, fs: InterfaceBridgeFs, maxFiles: number): string[] {\n const out: string[] = [];\n const walk = (dir: string, depth: number): void => {\n if (out.length >= maxFiles || depth > 4) return;\n let names: string[];\n try {\n names = fs.readdir(dir);\n } catch {\n return;\n }\n for (const name of names.sort((a, b) => a.localeCompare(b))) {\n if (out.length >= maxFiles) return;\n if (\n name === 'node_modules' ||\n name === '.git' ||\n name === 'dist' ||\n name === 'build' ||\n name === 'coverage' ||\n name === '.next'\n ) {\n continue;\n }\n const abs = path.join(dir, name);\n if (fs.isDirectory(abs)) {\n walk(abs, depth + 1);\n continue;\n }\n const lower = name.toLowerCase();\n if (\n lower.endsWith('.proto') ||\n lower.endsWith('.graphql') ||\n lower.endsWith('.gql') ||\n lower.endsWith('.yaml') ||\n lower.endsWith('.yml') ||\n lower.endsWith('.json') ||\n lower.includes('openapi') ||\n lower.includes('swagger') ||\n lower.includes('compose')\n ) {\n out.push(abs);\n }\n }\n };\n walk(root, 0);\n return out.sort((a, b) => a.localeCompare(b));\n}\n\n// ── OpenAPI ────────────────────────────────────────────────────────────────\n\nfunction isOpenApiCandidate(rel: string, raw: string): boolean {\n const lower = rel.toLowerCase();\n if (lower.includes('openapi') || lower.includes('swagger')) return true;\n if (/\"openapi\"\\s*:/.test(raw) || /openapi:\\s*['\"]?\\d/.test(raw)) return true;\n if (/\"swagger\"\\s*:/.test(raw) || /swagger:\\s*['\"]?\\d/.test(raw)) return true;\n return false;\n}\n\n/** Extract relative $ref / $refs that look like file paths (not #/components). */\nexport function extractOpenApiRefs(raw: string): string[] {\n const out = new Set<string>();\n // JSON: \"$ref\": \"../other/foo.yaml\"\n const jsonRef = /\"\\$ref\"\\s*:\\s*\"([^\"#][^\"]*)\"/g;\n let m: RegExpExecArray | null;\n while ((m = jsonRef.exec(raw)) !== null) {\n if (m[1] && !m[1].startsWith('http')) out.add(m[1]);\n }\n // YAML: $ref: ../other/foo.yaml or $ref: '../other/foo.yaml'\n const yamlRef = /\\$ref:\\s*['\"]?([^'\"#\\s][^'\"\\s]*)/g;\n while ((m = yamlRef.exec(raw)) !== null) {\n if (m[1] && !m[1].startsWith('http') && !m[1].startsWith('#')) out.add(m[1]);\n }\n return [...out].sort((a, b) => a.localeCompare(b));\n}\n\n// ── Compose ────────────────────────────────────────────────────────────────\n\nfunction isComposeCandidate(rel: string): boolean {\n const base = path.basename(rel).toLowerCase();\n return (\n base === 'docker-compose.yml' ||\n base === 'docker-compose.yaml' ||\n base === 'compose.yml' ||\n base === 'compose.yaml' ||\n base.includes('docker-compose')\n );\n}\n\n/**\n * Pull `build: <path>` and `build:\\n context: <path>` from compose-ish YAML.\n * Minimal parser — no full YAML dependency.\n */\nexport function extractComposeBuildContexts(raw: string): string[] {\n const out = new Set<string>();\n const lines = raw.split(/\\r?\\n/);\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i] ?? '';\n // build: ./services/api\n const simple = line.match(/^\\s*build:\\s*['\"]?([^'\"#\\s][^'\"#]*?)['\"]?\\s*(?:#.*)?$/);\n if (simple?.[1] && !simple[1].startsWith('{') && !/^\\s*$/.test(simple[1])) {\n const v = simple[1].trim();\n if (v && v !== 'null' && !v.includes(':')) out.add(v);\n continue;\n }\n // build:\n // context: ../lib\n if (/^\\s*build:\\s*$/.test(line) || /^\\s*build:\\s*\\{\\s*$/.test(line)) {\n for (let j = i + 1; j < Math.min(i + 8, lines.length); j++) {\n const ctx = (lines[j] ?? '').match(/^\\s*context:\\s*['\"]?([^'\"#\\s][^'\"#]*?)['\"]?\\s*(?:#.*)?$/);\n if (ctx?.[1]) {\n out.add(ctx[1].trim());\n break;\n }\n // left the build block\n if (/^\\S/.test(lines[j] ?? '') || /^\\s{0,2}\\w/.test(lines[j] ?? '')) {\n // allow nested keys with more indent\n if ((lines[j] ?? '').match(/^\\s{0,2}\\S/) && !(lines[j] ?? '').match(/^\\s{4,}/)) break;\n }\n }\n }\n }\n return [...out].sort((a, b) => a.localeCompare(b));\n}\n\n// ── Protobuf ───────────────────────────────────────────────────────────────\n\nfunction isProtoCandidate(rel: string): boolean {\n return rel.toLowerCase().endsWith('.proto');\n}\n\n// ── GraphQL ────────────────────────────────────────────────────────────────\n\nfunction isGraphqlCandidate(rel: string, raw: string): boolean {\n const lower = rel.toLowerCase();\n if (lower.endsWith('.graphql') || lower.endsWith('.gql')) return true;\n if (lower.includes('schema') && /#\\s*import\\b/.test(raw)) return true;\n return false;\n}\n\n/**\n * GraphQL import forms: `#import \"./user.graphql\"`, `#import * from \"../shared/x.graphql\"`.\n */\nexport function extractGraphqlRefs(raw: string): string[] {\n const out = new Set<string>();\n const re = /#\\s*import\\s+(?:\\*\\s+from\\s+)?[\"']([^\"']+)[\"']/g;\n let m: RegExpExecArray | null;\n while ((m = re.exec(raw)) !== null) {\n if (m[1] && !m[1].startsWith('http')) out.add(m[1]);\n }\n return [...out].sort((a, b) => a.localeCompare(b));\n}\n\n/** `import \"foo/bar.proto\";` and `import public \"…\"`. */\nexport function extractProtoImports(raw: string): string[] {\n const out = new Set<string>();\n const re = /^\\s*import\\s+(?:public\\s+|weak\\s+)?[\"']([^\"']+)[\"']\\s*;/gm;\n let m: RegExpExecArray | null;\n while ((m = re.exec(raw)) !== null) {\n if (m[1] && !m[1].startsWith('google/protobuf/')) out.add(m[1]);\n }\n return [...out].sort((a, b) => a.localeCompare(b));\n}\n\n// ── path → member ──────────────────────────────────────────────────────────\n\nfunction resolvePathToMember(\n fromRoot: string,\n relOrAbs: string,\n members: Array<{ root: string; repositoryId: string }>,\n): { root: string; repositoryId: string } | null {\n let abs: string;\n try {\n abs = path.isAbsolute(relOrAbs) ? path.resolve(relOrAbs) : path.resolve(fromRoot, relOrAbs);\n } catch {\n return null;\n }\n // Prefer the most specific (longest) member root containing the path.\n let best: { root: string; repositoryId: string } | null = null;\n for (const m of members) {\n if (abs === m.root || abs.startsWith(m.root + path.sep)) {\n if (!best || m.root.length > best.root.length) best = m;\n }\n }\n return best;\n}\n\nfunction resolveProtoImportToMember(\n fromRoot: string,\n importPath: string,\n members: Array<{ root: string; repositoryId: string }>,\n fs: InterfaceBridgeFs,\n): { root: string; repositoryId: string } | null {\n // Try relative to the importing package, then each member root as include path.\n const candidates = [\n path.resolve(fromRoot, importPath),\n ...members.map((m) => path.resolve(m.root, importPath)),\n ];\n for (const abs of candidates) {\n const hit = resolvePathToMember(fromRoot, abs, members);\n if (!hit) continue;\n // Prefer hits where the file exists under another member.\n if (fs.readFile(abs) !== null || pathIsUnder(abs, hit.root)) {\n if (hit.root !== path.resolve(fromRoot)) return hit;\n }\n }\n // Soft match: import path prefix equals a member basename (e.g. services/api/…)\n const parts = importPath.replace(/\\\\/g, '/').split('/');\n if (parts.length >= 2) {\n const prefix = parts[0]!;\n for (const m of members) {\n if (path.basename(m.root) === prefix && m.root !== path.resolve(fromRoot)) return m;\n }\n }\n return null;\n}\n\nfunction pathIsUnder(child: string, parent: string): boolean {\n const rel = path.relative(path.resolve(parent), path.resolve(child));\n return rel === '' || (!rel.startsWith('..') && !path.isAbsolute(rel));\n}\n","/**\n * Automatic workspace discovery (Fusion Runtime Phase 6).\n *\n * Finds additional package roots under a primary project without inventing\n * product names — package.json workspaces, pnpm-workspace.yaml, git\n * submodules, and VS Code `.code-workspace` folders. Pure over an injected\n * filesystem so unit tests never touch the real disk layout of the monorepo.\n *\n * Conservative: only returns paths that look like package roots (have\n * package.json or are listed explicitly). No network.\n */\n\nimport * as nodeFs from 'node:fs';\nimport * as path from 'node:path';\nimport { normalizeWorkspaceRoots, type WorkspaceRoot } from '../engine/workspace-roots.js';\n\nexport const DISCOVER_WORKSPACES_VERSION = 'discover-workspaces/0' as const;\n\nexport interface DiscoverFs {\n readFile(absPath: string): string | null;\n /** Directory entries (names only). Missing dir → []. */\n readdir(absPath: string): string[];\n isDirectory(absPath: string): boolean;\n exists(absPath: string): boolean;\n}\n\nexport type DiscoverSource =\n | 'package-workspaces'\n | 'pnpm-workspace'\n | 'git-submodule'\n | 'code-workspace'\n | 'explicit';\n\nexport interface DiscoveredRoot {\n root: string;\n label: string;\n source: DiscoverSource;\n}\n\nexport interface DiscoverWorkspacesResult {\n schemaVersion: typeof DISCOVER_WORKSPACES_VERSION;\n primaryRoot: string;\n /** Unique absolute roots including the primary. Sorted by path. */\n roots: DiscoveredRoot[];\n}\n\n/**\n * Discover workspace package roots under `primaryRoot`. Always includes the\n * primary itself as `source: 'explicit'`.\n */\nexport function discoverWorkspaceRoots(\n primaryRoot: string,\n fs: DiscoverFs,\n options: { maxDepth?: number; maxRoots?: number } = {},\n): DiscoverWorkspacesResult {\n const primary = path.resolve(primaryRoot);\n const maxDepth = options.maxDepth ?? 4;\n const maxRoots = options.maxRoots ?? 64;\n const byRoot = new Map<string, DiscoveredRoot>();\n\n const add = (abs: string, source: DiscoverSource, label?: string): void => {\n const root = path.resolve(abs);\n if (byRoot.has(root)) {\n // Prefer a more specific source label if we already have explicit.\n return;\n }\n if (byRoot.size >= maxRoots) return;\n byRoot.set(root, {\n root,\n label: label ?? (path.basename(root) || root),\n source,\n });\n };\n\n add(primary, 'explicit', path.basename(primary) || primary);\n\n // package.json \"workspaces\"\n for (const dir of expandPackageWorkspaces(primary, fs, maxDepth)) {\n add(dir, 'package-workspaces');\n }\n\n // pnpm-workspace.yaml\n for (const dir of expandPnpmWorkspace(primary, fs, maxDepth)) {\n add(dir, 'pnpm-workspace');\n }\n\n // .gitmodules\n for (const dir of expandGitSubmodules(primary, fs)) {\n add(dir, 'git-submodule');\n }\n\n // *.code-workspace next to primary or inside it\n for (const dir of expandCodeWorkspace(primary, fs)) {\n add(dir, 'code-workspace');\n }\n\n const roots = [...byRoot.values()].sort((a, b) => a.root.localeCompare(b.root));\n return {\n schemaVersion: DISCOVER_WORKSPACES_VERSION,\n primaryRoot: primary,\n roots,\n };\n}\n\n/** Convert discovery result into normalizeWorkspaceRoots-compatible paths. */\nexport function discoveredToWorkspaceRoots(result: DiscoverWorkspacesResult): WorkspaceRoot[] {\n return normalizeWorkspaceRoots(\n result.roots.map((r) => r.root),\n result.primaryRoot,\n );\n}\n\n// ── expanders ──────────────────────────────────────────────────────────────\n\nfunction expandPackageWorkspaces(primary: string, fs: DiscoverFs, maxDepth: number): string[] {\n const pkgPath = path.join(primary, 'package.json');\n const raw = fs.readFile(pkgPath);\n if (!raw) return [];\n let pkg: { workspaces?: unknown };\n try {\n pkg = JSON.parse(raw) as { workspaces?: unknown };\n } catch {\n return [];\n }\n const patterns = workspacePatterns(pkg.workspaces);\n return expandGlobPatterns(primary, patterns, fs, maxDepth);\n}\n\nfunction workspacePatterns(workspaces: unknown): string[] {\n if (Array.isArray(workspaces)) {\n return workspaces.filter((p): p is string => typeof p === 'string' && p.trim().length > 0);\n }\n if (workspaces && typeof workspaces === 'object' && Array.isArray((workspaces as { packages?: unknown }).packages)) {\n return ((workspaces as { packages: unknown[] }).packages).filter(\n (p): p is string => typeof p === 'string' && p.trim().length > 0,\n );\n }\n return [];\n}\n\nfunction expandPnpmWorkspace(primary: string, fs: DiscoverFs, maxDepth: number): string[] {\n const raw = fs.readFile(path.join(primary, 'pnpm-workspace.yaml'));\n if (!raw) return [];\n const patterns: string[] = [];\n // Minimal YAML: lines under `packages:` that look like ` - 'packages/*'`\n let inPackages = false;\n for (const line of raw.split(/\\r?\\n/)) {\n if (/^packages\\s*:/.test(line)) {\n inPackages = true;\n continue;\n }\n if (inPackages) {\n if (/^\\S/.test(line) && !/^\\s/.test(line)) break; // next top-level key\n const m = line.match(/^\\s*-\\s*['\"]?([^'\"]+)['\"]?\\s*$/);\n if (m?.[1]) patterns.push(m[1].trim());\n }\n }\n return expandGlobPatterns(primary, patterns, fs, maxDepth);\n}\n\nfunction expandGitSubmodules(primary: string, fs: DiscoverFs): string[] {\n const raw = fs.readFile(path.join(primary, '.gitmodules'));\n if (!raw) return [];\n const out: string[] = [];\n for (const line of raw.split(/\\r?\\n/)) {\n const m = line.match(/^\\s*path\\s*=\\s*(.+)\\s*$/);\n if (!m?.[1]) continue;\n const abs = path.resolve(primary, m[1].trim());\n if (fs.exists(abs) && fs.isDirectory(abs)) out.push(abs);\n }\n return out.sort((a, b) => a.localeCompare(b));\n}\n\nfunction expandCodeWorkspace(primary: string, fs: DiscoverFs): string[] {\n const out: string[] = [];\n const candidates = [\n ...fs.readdir(primary).filter((n) => n.endsWith('.code-workspace')).map((n) => path.join(primary, n)),\n ];\n // Also accept a single workspace file named after the folder.\n for (const file of candidates) {\n const raw = fs.readFile(file);\n if (!raw) continue;\n let doc: { folders?: Array<{ path?: string; name?: string }> };\n try {\n doc = JSON.parse(raw) as { folders?: Array<{ path?: string; name?: string }> };\n } catch {\n continue;\n }\n const base = path.dirname(file);\n for (const folder of doc.folders ?? []) {\n if (typeof folder.path !== 'string' || !folder.path.trim()) continue;\n const abs = path.resolve(base, folder.path.trim());\n if (fs.exists(abs) && fs.isDirectory(abs)) out.push(abs);\n }\n }\n return out.sort((a, b) => a.localeCompare(b));\n}\n\n/**\n * Expand simple workspace globs (star segments, double-star walk, or exact\n * relative paths). No full micromatch — keep deterministic and dependency-free.\n */\nfunction expandGlobPatterns(\n primary: string,\n patterns: string[],\n fs: DiscoverFs,\n maxDepth: number,\n): string[] {\n const out = new Set<string>();\n for (const pattern of patterns) {\n const p = pattern.replace(/\\\\/g, '/').replace(/^\\.\\//, '');\n if (!p || p.startsWith('..')) continue; // never climb out via pattern\n if (p.includes('*')) {\n for (const hit of expandSimpleGlob(primary, p, fs, maxDepth)) {\n if (looksLikePackageRoot(hit, fs)) out.add(hit);\n }\n } else {\n const abs = path.resolve(primary, p);\n if (fs.exists(abs) && fs.isDirectory(abs) && looksLikePackageRoot(abs, fs)) out.add(abs);\n }\n }\n return [...out].sort((a, b) => a.localeCompare(b));\n}\n\nfunction expandSimpleGlob(primary: string, pattern: string, fs: DiscoverFs, maxDepth: number): string[] {\n // Support: packages/*, packages/*/*, apps/**\n const parts = pattern.split('/').filter(Boolean);\n let currents = [primary];\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i]!;\n const next: string[] = [];\n const isLast = i === parts.length - 1;\n for (const cur of currents) {\n if (part === '**') {\n // One-level recursive: all dirs up to maxDepth from cur.\n for (const d of walkDirs(cur, fs, Math.min(maxDepth, 3))) next.push(d);\n continue;\n }\n if (part === '*') {\n for (const name of fs.readdir(cur)) {\n const abs = path.join(cur, name);\n if (fs.isDirectory(abs)) next.push(abs);\n }\n continue;\n }\n const abs = path.join(cur, part);\n if (fs.exists(abs) && (isLast ? fs.isDirectory(abs) || fs.exists(abs) : fs.isDirectory(abs))) {\n next.push(abs);\n }\n }\n currents = next;\n if (!currents.length) break;\n }\n return currents.filter((d) => fs.isDirectory(d));\n}\n\nfunction walkDirs(root: string, fs: DiscoverFs, depth: number): string[] {\n if (depth <= 0) return [];\n const out: string[] = [];\n for (const name of fs.readdir(root)) {\n if (name === 'node_modules' || name === '.git' || name === 'dist' || name === 'build') continue;\n const abs = path.join(root, name);\n if (!fs.isDirectory(abs)) continue;\n out.push(abs);\n out.push(...walkDirs(abs, fs, depth - 1));\n }\n return out;\n}\n\nfunction looksLikePackageRoot(dir: string, fs: DiscoverFs): boolean {\n return fs.exists(path.join(dir, 'package.json'));\n}\n\n/** Node fs adapter for production callers. */\nexport function nodeDiscoverFs(): DiscoverFs {\n return {\n readFile(absPath) {\n try {\n return nodeFs.readFileSync(absPath, 'utf8');\n } catch {\n return null;\n }\n },\n readdir(absPath) {\n try {\n return nodeFs.readdirSync(absPath).sort((a, b) => a.localeCompare(b));\n } catch {\n return [];\n }\n },\n isDirectory(absPath) {\n try {\n return nodeFs.statSync(absPath).isDirectory();\n } catch {\n return false;\n }\n },\n exists(absPath) {\n try {\n return nodeFs.existsSync(absPath);\n } catch {\n return false;\n }\n },\n };\n}\n","/**\n * Federated workspaces (Fusion Runtime Phase 6 foundation).\n *\n * A federation is a primary repository plus zero or more member roots that\n * share a local vgd session. Layout is declared in `.vibgrate/federation.json`\n * so multi-repo monorepos and sibling packages can register together without\n * inventing product names. When no file exists, {@link loadOrDiscoverFederation}\n * auto-discovers package workspaces / pnpm / submodules / `.code-workspace`\n * and attaches conservative package-dependency bridge edges.\n *\n * Schema: federation/0\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { repositoryIdFromRoot, globalGraphPath, globalGraphPathForRef } from './paths.js';\nimport { detectGitRef } from './git-ref.js';\nimport { normalizeWorkspaceRoots } from '../engine/workspace-roots.js';\nimport {\n discoverBridgeEdges,\n highConfidenceBridges,\n parsePackageManifest,\n type BridgeEdge,\n} from './bridge-edges.js';\nimport { discoverInterfaceBridges } from './interface-bridges.js';\nimport { discoverWorkspaceRoots, nodeDiscoverFs, type DiscoverFs } from './discover-workspaces.js';\n\nexport const FEDERATION_SCHEMA_VERSION = 'federation/0' as const;\n\nexport type FederationMemberRole = 'primary' | 'member';\n\nexport interface FederationMember {\n /** Absolute root path. */\n root: string;\n /** Optional human label (folder name by default). */\n label: string;\n role: FederationMemberRole;\n repositoryId: string;\n graphPath: string;\n}\n\nexport interface FederatedWorkspace {\n schemaVersion: typeof FEDERATION_SCHEMA_VERSION;\n /** Absolute path of the primary root (where the federation file lives). */\n primaryRoot: string;\n members: FederationMember[];\n /**\n * Cross-member package dependency bridges (optional). High-stakes capsules\n * should prefer {@link highConfidenceBridges} only.\n */\n bridges?: BridgeEdge[];\n}\n\nexport interface FederationFile {\n schemaVersion?: string;\n members?: Array<{ root?: string; label?: string; role?: string }>;\n bridges?: BridgeEdge[];\n}\n\n/**\n * Load `.vibgrate/federation.json` under `primaryRoot`, or synthesize a\n * single-member federation for the primary alone.\n */\nexport function loadFederation(primaryRoot: string, options: { requireFile?: boolean } = {}): FederatedWorkspace | null {\n const primary = path.resolve(primaryRoot);\n const file = federationPath(primary);\n if (!fs.existsSync(file)) {\n if (options.requireFile) return null;\n return singleMemberFederation(primary);\n }\n let raw: FederationFile;\n try {\n raw = JSON.parse(fs.readFileSync(file, 'utf8')) as FederationFile;\n } catch {\n return null;\n }\n return parseFederationFile(primary, raw);\n}\n\n/**\n * Load federation.json when present; otherwise auto-discover workspace package\n * roots and package-dependency bridges. Prefer this for host UIs / `vg code`\n * session start so monorepos work without a hand-written federation file.\n */\nexport function loadOrDiscoverFederation(\n primaryRoot: string,\n options: { discoverFs?: DiscoverFs; minBridgeConfidence?: number } = {},\n): FederatedWorkspace {\n const primary = path.resolve(primaryRoot);\n const existing = loadFederation(primary, { requireFile: true });\n if (existing) {\n // File wins for membership; still compute bridges if absent.\n if (!existing.bridges?.length) {\n existing.bridges = bridgesForMembers(existing.members, options.minBridgeConfidence);\n }\n return existing;\n }\n\n const dfs = options.discoverFs ?? nodeDiscoverFs();\n const discovered = discoverWorkspaceRoots(primary, dfs);\n const roots = discovered.roots.map((r) => r.root);\n const fed = federationFromWorkspaceRoots(roots, { preferredPrimary: primary });\n fed.bridges = bridgesForMembers(fed.members, options.minBridgeConfidence);\n return fed;\n}\n\nfunction bridgesForMembers(members: FederationMember[], minConfidence = 0.5): BridgeEdge[] {\n const memberRefs = members.map((m) => ({ root: m.root, repositoryId: m.repositoryId }));\n const pkgEdges = discoverBridgeEdges(\n memberRefs,\n (root) => {\n try {\n const raw = fs.readFileSync(path.join(root, 'package.json'), 'utf8');\n return parsePackageManifest(raw);\n } catch {\n return null;\n }\n },\n { minConfidence },\n );\n const ifaceEdges = discoverInterfaceBridges(\n memberRefs,\n {\n readFile(absPath) {\n try {\n return fs.readFileSync(absPath, 'utf8');\n } catch {\n return null;\n }\n },\n readdir(absPath) {\n try {\n return fs.readdirSync(absPath).sort((a, b) => a.localeCompare(b));\n } catch {\n return [];\n }\n },\n isDirectory(absPath) {\n try {\n return fs.statSync(absPath).isDirectory();\n } catch {\n return false;\n }\n },\n },\n { minConfidence },\n );\n // Merge package + interface bridges; stable unique by from/to/kind/evidence.\n const seen = new Set<string>();\n const out: BridgeEdge[] = [];\n for (const e of [...pkgEdges, ...ifaceEdges].sort(\n (a, b) =>\n a.fromRoot.localeCompare(b.fromRoot) ||\n a.toRoot.localeCompare(b.toRoot) ||\n a.kind.localeCompare(b.kind) ||\n a.evidence.localeCompare(b.evidence),\n )) {\n const key = `${e.fromRepositoryId}|${e.toRepositoryId}|${e.kind}|${e.evidence}`;\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(e);\n }\n return out;\n}\n\nexport { highConfidenceBridges, type BridgeEdge };\n\nexport function federationPath(primaryRoot: string): string {\n return path.join(path.resolve(primaryRoot), '.vibgrate', 'federation.json');\n}\n\nexport function singleMemberFederation(primaryRoot: string): FederatedWorkspace {\n const primary = path.resolve(primaryRoot);\n const [ws] = normalizeWorkspaceRoots([primary], primary);\n return {\n schemaVersion: FEDERATION_SCHEMA_VERSION,\n primaryRoot: primary,\n members: [\n memberFromRoot(ws?.root ?? primary, 'primary', ws?.label ?? (path.basename(primary) || primary)),\n ],\n };\n}\n\nexport function parseFederationFile(primaryRoot: string, raw: FederationFile): FederatedWorkspace | null {\n const primary = path.resolve(primaryRoot);\n if (!raw || typeof raw !== 'object') return null;\n const list = Array.isArray(raw.members) ? raw.members : [];\n if (!list.length) return singleMemberFederation(primary);\n\n const members: FederationMember[] = [];\n const seen = new Set<string>();\n let hasPrimary = false;\n\n for (const entry of list) {\n if (!entry || typeof entry.root !== 'string' || !entry.root.trim()) continue;\n const abs = path.resolve(primary, entry.root.trim());\n const id = repositoryIdFromRoot(abs);\n if (seen.has(id)) continue;\n seen.add(id);\n const role: FederationMemberRole = entry.role === 'primary' || abs === primary ? 'primary' : 'member';\n if (role === 'primary') hasPrimary = true;\n members.push(memberFromRoot(abs, role, typeof entry.label === 'string' && entry.label.trim() ? entry.label.trim() : path.basename(abs) || abs));\n }\n\n if (!members.length) return singleMemberFederation(primary);\n if (!hasPrimary) {\n // Ensure the primary root is present and marked primary.\n const id = repositoryIdFromRoot(primary);\n if (!seen.has(id)) {\n members.unshift(memberFromRoot(primary, 'primary', path.basename(primary) || primary));\n } else {\n const existing = members.find((m) => m.repositoryId === id);\n if (existing) existing.role = 'primary';\n }\n }\n\n members.sort((a, b) => {\n if (a.role !== b.role) return a.role === 'primary' ? -1 : 1;\n return a.root.localeCompare(b.root);\n });\n\n const fed: FederatedWorkspace = {\n schemaVersion: FEDERATION_SCHEMA_VERSION,\n primaryRoot: primary,\n members,\n };\n if (Array.isArray(raw.bridges) && raw.bridges.length) {\n fed.bridges = raw.bridges\n .filter((b) => b && typeof b === 'object' && typeof b.fromRoot === 'string' && typeof b.toRoot === 'string')\n .map((b) => ({\n ...b,\n fromRoot: path.resolve(primary, b.fromRoot),\n toRoot: path.resolve(primary, b.toRoot),\n }));\n }\n return fed;\n}\n\nfunction memberFromRoot(root: string, role: FederationMemberRole, label: string): FederationMember {\n const git = detectGitRef(root);\n const graphPath = git.kind !== 'none' && git.ref ? globalGraphPathForRef(root, git.ref) : globalGraphPath(root);\n return {\n root,\n label,\n role,\n repositoryId: repositoryIdFromRoot(root),\n graphPath,\n };\n}\n\n/**\n * Build a federation from an explicit list of workspace folder paths (e.g. VS\n * Code multi-root `workspaceFolders`). First root (or `preferredPrimary`) is\n * primary; remaining roots are members. Pure over path math + git-ref detect.\n */\nexport function federationFromWorkspaceRoots(\n roots: string[],\n options: { preferredPrimary?: string } = {},\n): FederatedWorkspace {\n const normalized = normalizeWorkspaceRoots(roots, options.preferredPrimary ?? roots[0] ?? process.cwd());\n if (!normalized.length) {\n const fallback = path.resolve(options.preferredPrimary ?? process.cwd());\n return singleMemberFederation(fallback);\n }\n const preferred = options.preferredPrimary?.trim()\n ? path.resolve(options.preferredPrimary.trim())\n : normalized[0]!.root;\n const primaryHit =\n normalized.find((r) => r.root === preferred) ??\n normalized.find((r) => r.id === repositoryIdFromRoot(preferred)) ??\n normalized[0]!;\n const primaryRoot = primaryHit.root;\n const members: FederationMember[] = normalized.map((ws) =>\n memberFromRoot(ws.root, ws.root === primaryRoot ? 'primary' : 'member', ws.label),\n );\n members.sort((a, b) => {\n if (a.role !== b.role) return a.role === 'primary' ? -1 : 1;\n return a.root.localeCompare(b.root);\n });\n return {\n schemaVersion: FEDERATION_SCHEMA_VERSION,\n primaryRoot,\n members,\n };\n}\n\n/**\n * Persist a federation under `primaryRoot/.vibgrate/federation.json`.\n * Returns the absolute path written. Creates `.vibgrate/` as needed.\n */\nexport function writeFederationFile(primaryRoot: string, federation: FederatedWorkspace): string {\n const primary = path.resolve(primaryRoot);\n const file = federationPath(primary);\n fs.mkdirSync(path.dirname(file), { recursive: true });\n const body: FederationFile = {\n schemaVersion: FEDERATION_SCHEMA_VERSION,\n members: federation.members.map((m) => ({\n // Prefer path relative to primary when possible so the file is portable.\n root: path.relative(primary, m.root) || '.',\n label: m.label,\n role: m.role,\n })),\n };\n if (federation.bridges?.length) {\n // Persist portable roots for bridges (relative to primary when possible).\n body.bridges = federation.bridges.map((b) => ({\n ...b,\n fromRoot: path.relative(primary, b.fromRoot) || '.',\n toRoot: path.relative(primary, b.toRoot) || '.',\n }));\n }\n fs.writeFileSync(file, `${JSON.stringify(body, null, 2)}\\n`, 'utf8');\n return file;\n}\n"]}