@opengeni/react 3.1.0 → 3.1.3-canary.38890816741001
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.
- package/README.md +769 -22
- package/dist/accounts.js +89 -11
- package/dist/accounts.js.map +1 -1
- package/dist/approvals.d.ts +2 -1
- package/dist/artifacts-document.js +5 -3
- package/dist/artifacts-presentation.js +5 -3
- package/dist/artifacts-spreadsheet.d.ts +1 -1
- package/dist/artifacts-spreadsheet.js +5 -3
- package/dist/artifacts.d.ts +5 -1
- package/dist/artifacts.js +536 -42
- package/dist/artifacts.js.map +1 -1
- package/dist/browser-viewer-ZWR6MWJ7.js +19 -0
- package/dist/capability-catalog-row.d.ts +20 -0
- package/dist/capability-logo-fallback.d.ts +3 -0
- package/dist/chat-interactive-block-BO2IWXVK.js +14 -0
- package/dist/chunk-2DDJ6YH6.js +41 -0
- package/dist/chunk-2DDJ6YH6.js.map +1 -0
- package/dist/chunk-2HVLQ26H.js +183 -0
- package/dist/chunk-2HVLQ26H.js.map +1 -0
- package/dist/{chunk-RGALCTWO.js → chunk-2I6R3GCZ.js} +4285 -3980
- package/dist/chunk-2I6R3GCZ.js.map +1 -0
- package/dist/{chunk-D3UIAJKY.js → chunk-2SFFYIH3.js} +1179 -166
- package/dist/chunk-2SFFYIH3.js.map +1 -0
- package/dist/chunk-3PVDYTTB.js +24 -0
- package/dist/chunk-3PVDYTTB.js.map +1 -0
- package/dist/chunk-3UZCWK46.js +298 -0
- package/dist/chunk-3UZCWK46.js.map +1 -0
- package/dist/chunk-47CKUXTW.js +293 -0
- package/dist/chunk-47CKUXTW.js.map +1 -0
- package/dist/chunk-4QYP6QUI.js +109 -0
- package/dist/chunk-4QYP6QUI.js.map +1 -0
- package/dist/chunk-5EY26VZ7.js +1053 -0
- package/dist/chunk-5EY26VZ7.js.map +1 -0
- package/dist/chunk-5I4VRWBB.js +56 -0
- package/dist/chunk-5I4VRWBB.js.map +1 -0
- package/dist/chunk-5WOR7UCL.js +191 -0
- package/dist/chunk-5WOR7UCL.js.map +1 -0
- package/dist/chunk-5YJLGOM5.js +51 -0
- package/dist/chunk-5YJLGOM5.js.map +1 -0
- package/dist/chunk-6JFN3OWG.js +386 -0
- package/dist/chunk-6JFN3OWG.js.map +1 -0
- package/dist/chunk-7QJT5O4S.js +35 -0
- package/dist/chunk-7QJT5O4S.js.map +1 -0
- package/dist/chunk-A55KV72M.js +402 -0
- package/dist/chunk-A55KV72M.js.map +1 -0
- package/dist/chunk-ADWCLI4G.js +2028 -0
- package/dist/chunk-ADWCLI4G.js.map +1 -0
- package/dist/chunk-B27E3V37.js +29 -0
- package/dist/chunk-B27E3V37.js.map +1 -0
- package/dist/chunk-B7TC2A33.js +83 -0
- package/dist/chunk-B7TC2A33.js.map +1 -0
- package/dist/chunk-BLL56F7R.js +385 -0
- package/dist/chunk-BLL56F7R.js.map +1 -0
- package/dist/chunk-BOFEQC6K.js +162 -0
- package/dist/chunk-BOFEQC6K.js.map +1 -0
- package/dist/chunk-CM7LVUKC.js +35 -0
- package/dist/chunk-CM7LVUKC.js.map +1 -0
- package/dist/chunk-CORUP6JB.js +122 -0
- package/dist/chunk-CORUP6JB.js.map +1 -0
- package/dist/chunk-CSX5FFKZ.js +35 -0
- package/dist/chunk-CSX5FFKZ.js.map +1 -0
- package/dist/chunk-EGVHJKGJ.js +3125 -0
- package/dist/chunk-EGVHJKGJ.js.map +1 -0
- package/dist/{chunk-NEXLLTP4.js → chunk-G76LSA76.js} +6 -5
- package/dist/chunk-G76LSA76.js.map +1 -0
- package/dist/{chunk-PEI6RANI.js → chunk-GQMRL52F.js} +311 -75
- package/dist/chunk-GQMRL52F.js.map +1 -0
- package/dist/{chunk-ELIYWBZR.js → chunk-GUUXOISA.js} +1113 -457
- package/dist/chunk-GUUXOISA.js.map +1 -0
- package/dist/{chunk-HUIKIDM5.js → chunk-I7X2P4FU.js} +225 -116
- package/dist/chunk-I7X2P4FU.js.map +1 -0
- package/dist/chunk-IGFZFLI2.js +1390 -0
- package/dist/chunk-IGFZFLI2.js.map +1 -0
- package/dist/{chunk-4MDLEHXL.js → chunk-IMSUVYQB.js} +26 -13
- package/dist/chunk-IMSUVYQB.js.map +1 -0
- package/dist/chunk-IOYHDEP3.js +38 -0
- package/dist/chunk-IOYHDEP3.js.map +1 -0
- package/dist/chunk-IZV5FTJC.js +55 -0
- package/dist/chunk-IZV5FTJC.js.map +1 -0
- package/dist/chunk-KF33GTWN.js +343 -0
- package/dist/chunk-KF33GTWN.js.map +1 -0
- package/dist/chunk-KSGQ5ODA.js +457 -0
- package/dist/chunk-KSGQ5ODA.js.map +1 -0
- package/dist/{chunk-OAM4WAAM.js → chunk-KZC6QRNR.js} +1513 -697
- package/dist/chunk-KZC6QRNR.js.map +1 -0
- package/dist/chunk-LJUMYUBO.js +218 -0
- package/dist/chunk-LJUMYUBO.js.map +1 -0
- package/dist/chunk-LSW2OJVV.js +380 -0
- package/dist/chunk-LSW2OJVV.js.map +1 -0
- package/dist/chunk-M357MHH3.js +2 -0
- package/dist/chunk-M357MHH3.js.map +1 -0
- package/dist/chunk-MK2TQO4Y.js +24 -0
- package/dist/chunk-MK2TQO4Y.js.map +1 -0
- package/dist/chunk-N7S72EXK.js +25 -0
- package/dist/chunk-N7S72EXK.js.map +1 -0
- package/dist/{chunk-XXWH2JLC.js → chunk-NKMYZFHA.js} +616 -621
- package/dist/chunk-NKMYZFHA.js.map +1 -0
- package/dist/chunk-NX4ADH73.js +14 -0
- package/dist/chunk-NX4ADH73.js.map +1 -0
- package/dist/chunk-O7F6UJO4.js +71 -0
- package/dist/chunk-O7F6UJO4.js.map +1 -0
- package/dist/chunk-OVB5WIG5.js +14064 -0
- package/dist/chunk-OVB5WIG5.js.map +1 -0
- package/dist/chunk-OYQQJL3J.js +16 -0
- package/dist/chunk-OYQQJL3J.js.map +1 -0
- package/dist/{chunk-H5YGYNXS.js → chunk-P4BNUO57.js} +60 -17
- package/dist/chunk-P4BNUO57.js.map +1 -0
- package/dist/{chunk-JVYQRRC4.js → chunk-PEHTX3V7.js} +21 -1
- package/dist/chunk-PEHTX3V7.js.map +1 -0
- package/dist/chunk-PMV53IMM.js +26 -0
- package/dist/chunk-PMV53IMM.js.map +1 -0
- package/dist/{chunk-KCGXPP5V.js → chunk-PYEOPA4M.js} +13 -7
- package/dist/chunk-PYEOPA4M.js.map +1 -0
- package/dist/{chunk-KZ73RL76.js → chunk-QHUE7E4N.js} +8 -3
- package/dist/chunk-QHUE7E4N.js.map +1 -0
- package/dist/chunk-QV3DJVRZ.js +11 -0
- package/dist/chunk-QV3DJVRZ.js.map +1 -0
- package/dist/chunk-R5SBNG7S.js +810 -0
- package/dist/chunk-R5SBNG7S.js.map +1 -0
- package/dist/chunk-RI42H5IU.js +326 -0
- package/dist/chunk-RI42H5IU.js.map +1 -0
- package/dist/chunk-S2QH6EZ5.js +211 -0
- package/dist/chunk-S2QH6EZ5.js.map +1 -0
- package/dist/chunk-SHLZMAJN.js +304 -0
- package/dist/chunk-SHLZMAJN.js.map +1 -0
- package/dist/chunk-TGXK4BAZ.js +293 -0
- package/dist/chunk-TGXK4BAZ.js.map +1 -0
- package/dist/{chunk-5YK2ZDIG.js → chunk-TNEZNMSN.js} +4 -10
- package/dist/chunk-TNEZNMSN.js.map +1 -0
- package/dist/{chunk-22KP6LR5.js → chunk-TXS65BB2.js} +3 -1
- package/dist/{chunk-22KP6LR5.js.map → chunk-TXS65BB2.js.map} +1 -1
- package/dist/chunk-UNJPZGNK.js +63 -0
- package/dist/chunk-UNJPZGNK.js.map +1 -0
- package/dist/{chunk-MZ2G2XBA.js → chunk-V5ZUJT2T.js} +205 -45
- package/dist/chunk-V5ZUJT2T.js.map +1 -0
- package/dist/chunk-VIUEOHXY.js +394 -0
- package/dist/chunk-VIUEOHXY.js.map +1 -0
- package/dist/chunk-WIUKB3LD.js +1911 -0
- package/dist/chunk-WIUKB3LD.js.map +1 -0
- package/dist/{chunk-ICA6R6TW.js → chunk-WNN7NO2N.js} +1451 -355
- package/dist/chunk-WNN7NO2N.js.map +1 -0
- package/dist/{chunk-YJFGAFBD.js → chunk-X5UVUIMF.js} +1892 -1223
- package/dist/chunk-X5UVUIMF.js.map +1 -0
- package/dist/chunk-XDA5QJE7.js +402 -0
- package/dist/chunk-XDA5QJE7.js.map +1 -0
- package/dist/{chunk-VZTQ73XT.js → chunk-XEA5BCMA.js} +3 -1
- package/dist/{chunk-VZTQ73XT.js.map → chunk-XEA5BCMA.js.map} +1 -1
- package/dist/chunk-XHF7OYAN.js +1150 -0
- package/dist/chunk-XHF7OYAN.js.map +1 -0
- package/dist/chunk-YSRBFJMQ.js +43 -0
- package/dist/chunk-YSRBFJMQ.js.map +1 -0
- package/dist/chunk-ZOZAPAUO.js +174 -0
- package/dist/chunk-ZOZAPAUO.js.map +1 -0
- package/dist/chunk-ZQV5W7YC.js +809 -0
- package/dist/chunk-ZQV5W7YC.js.map +1 -0
- package/dist/chunk-ZUWF4NF7.js +13 -0
- package/dist/chunk-ZUWF4NF7.js.map +1 -0
- package/dist/client.d.ts +16 -7
- package/dist/clipboard.js +3 -1
- package/dist/commands/types.d.ts +2 -0
- package/dist/components/anthropic-mark.d.ts +3 -0
- package/dist/components/approval-surface.d.ts +19 -6
- package/dist/components/artifacts/artifact-chrome.d.ts +120 -0
- package/dist/components/artifacts/artifact-sandbox.d.ts +30 -0
- package/dist/components/artifacts/artifact-surface.d.ts +4 -2
- package/dist/components/artifacts/chat-interactive-block.d.ts +29 -0
- package/dist/components/artifacts/deferred-chat-media.d.ts +15 -0
- package/dist/components/artifacts/document-editor.d.ts +4 -2
- package/dist/components/artifacts/editable-artifact-ui.d.ts +2 -1
- package/dist/components/artifacts/editable-artifact-view.d.ts +48 -0
- package/dist/components/artifacts/editable-document.d.ts +1 -1
- package/dist/components/artifacts/editable-presentation.d.ts +2 -2
- package/dist/components/artifacts/editable-spreadsheet.d.ts +8 -3
- package/dist/components/artifacts/index.d.ts +9 -2
- package/dist/components/artifacts/inline-html-document.d.ts +2 -0
- package/dist/components/artifacts/latest-task-runner.d.ts +15 -0
- package/dist/components/artifacts/presentation-editor.d.ts +6 -2
- package/dist/components/artifacts/published-html-artifact-frame.d.ts +23 -3
- package/dist/components/artifacts/session-artifact-viewer.d.ts +39 -0
- package/dist/components/artifacts/site-view.d.ts +26 -0
- package/dist/components/artifacts/spreadsheet-command-queue.d.ts +20 -0
- package/dist/components/artifacts/spreadsheet-download.d.ts +7 -0
- package/dist/components/artifacts/spreadsheet-general-display.d.ts +24 -0
- package/dist/components/artifacts/spreadsheet-grid.d.ts +10 -3
- package/dist/components/artifacts/spreadsheet-resize.d.ts +50 -0
- package/dist/components/artifacts/spreadsheet-submissions.d.ts +9 -0
- package/dist/components/artifacts/visualization-assets.gen.d.ts +2 -0
- package/dist/components/browser-select-control.d.ts +16 -0
- package/dist/components/browser-viewer.d.ts +11 -2
- package/dist/components/chat-composer.d.ts +21 -3
- package/dist/components/child-session-link.d.ts +9 -0
- package/dist/components/claude-mark.d.ts +3 -0
- package/dist/components/code-editor.d.ts +1 -4
- package/dist/components/composer-transcription-control.d.ts +7 -0
- package/dist/components/composer.d.ts +34 -67
- package/dist/components/computer-viewer.d.ts +1 -1
- package/dist/components/copy-button.d.ts +3 -1
- package/dist/components/desktop-viewer.d.ts +1 -1
- package/dist/components/fleet-tile.d.ts +2 -2
- package/dist/components/grok-mark.d.ts +26 -0
- package/dist/components/human-input-form.d.ts +28 -32
- package/dist/components/human-input-surface.d.ts +7 -2
- package/dist/components/linkified-text.d.ts +18 -0
- package/dist/components/machine-input-display.d.ts +22 -1
- package/dist/components/machines/agent-status-icon.d.ts +6 -0
- package/dist/components/machines/machine-detail.d.ts +7 -1
- package/dist/components/machines/machine-status.d.ts +48 -0
- package/dist/components/markdown-table-layout.d.ts +18 -0
- package/dist/components/markdown.d.ts +37 -4
- package/dist/components/message-timeline.d.ts +86 -7
- package/dist/components/model-mark.d.ts +29 -0
- package/dist/components/model-policy-picker-menu.d.ts +9 -0
- package/dist/components/model-policy-picker.d.ts +41 -25
- package/dist/components/new-conversation.d.ts +32 -0
- package/dist/components/open-geni-chat.d.ts +73 -0
- package/dist/components/open-geni-links.d.ts +68 -0
- package/dist/components/openrouter-mark.d.ts +6 -0
- package/dist/components/opper-mark.d.ts +7 -0
- package/dist/components/preview-loading.d.ts +2 -0
- package/dist/components/provider-recovery-notice.d.ts +16 -0
- package/dist/components/queue-item-content.d.ts +9 -0
- package/dist/components/rehype-secret-refs.d.ts +23 -0
- package/dist/components/remark-soft-line-breaks.d.ts +38 -0
- package/dist/components/sandbox-files.d.ts +3 -1
- package/dist/components/sandbox-workspace.d.ts +18 -0
- package/dist/components/secret-question-field.d.ts +31 -0
- package/dist/components/secret-ref-chip.d.ts +35 -0
- package/dist/components/session-capability-frame.d.ts +37 -0
- package/dist/components/session-chrome.d.ts +57 -8
- package/dist/components/session-commands-panel.d.ts +6 -0
- package/dist/components/session-commands.d.ts +6 -0
- package/dist/components/session-connection-request.d.ts +8 -0
- package/dist/components/session-conversation.d.ts +157 -0
- package/dist/components/session-list.d.ts +39 -0
- package/dist/components/session-mcp-capability-card.d.ts +41 -0
- package/dist/components/session-proxy-scope.d.ts +35 -0
- package/dist/components/session-status.d.ts +4 -1
- package/dist/components/session-usage-limit-notice.d.ts +39 -0
- package/dist/components/timeline-anchor.d.ts +24 -0
- package/dist/components/timeline-annotation-chrome.d.ts +25 -0
- package/dist/components/timeline-annotation-layout.d.ts +42 -0
- package/dist/components/timeline-annotation-markers.d.ts +8 -0
- package/dist/components/timeline-annotation-reveal-context.d.ts +4 -0
- package/dist/components/timeline-annotation-shared.d.ts +31 -0
- package/dist/components/timeline-annotations-dialog.d.ts +3 -2
- package/dist/components/timeline-annotations.d.ts +13 -3
- package/dist/components/timeline-reading-progress.d.ts +11 -0
- package/dist/components/timeline-search.d.ts +34 -0
- package/dist/components/timeline-settlement.d.ts +16 -0
- package/dist/components/tip-follow.d.ts +16 -0
- package/dist/components/tool-action-review.d.ts +47 -0
- package/dist/components/tool-review-history.d.ts +25 -0
- package/dist/components/usage-limit-notice.d.ts +49 -0
- package/dist/components/usage-member-list.d.ts +91 -0
- package/dist/components/usage-meter.d.ts +73 -0
- package/dist/components/use-viewer-menu-dismiss.d.ts +2 -0
- package/dist/components/user-message-body.d.ts +10 -1
- package/dist/composer-messages.d.ts +74 -0
- package/dist/composer-messages.js +9 -0
- package/dist/composer-messages.js.map +1 -0
- package/dist/composer-voice-events.d.ts +8 -0
- package/dist/composer.d.ts +5 -4
- package/dist/composer.js +26 -13
- package/dist/computer-viewer-GMLDXPON.js +20 -0
- package/dist/computer-viewer-GMLDXPON.js.map +1 -0
- package/dist/connect-account-identity.d.ts +8 -0
- package/dist/connect-accounts.d.ts +15 -0
- package/dist/connect-chooser.d.ts +18 -0
- package/dist/connect-panel.d.ts +18 -0
- package/dist/connect-setup.d.ts +18 -0
- package/dist/connect.d.ts +21 -0
- package/dist/connect.js +2149 -0
- package/dist/connect.js.map +1 -0
- package/dist/connection-catalog.d.ts +38 -0
- package/dist/connection-discovery.d.ts +12 -0
- package/dist/connection-installed.d.ts +17 -0
- package/dist/connection-logo.d.ts +9 -0
- package/dist/connection-service-logo.d.ts +8 -0
- package/dist/connection-service-presentation.d.ts +13 -0
- package/dist/connection-skeleton.d.ts +5 -0
- package/dist/connection-type-picker.d.ts +6 -0
- package/dist/conversation-timeline.d.ts +5 -0
- package/dist/desktop.d.ts +7 -0
- package/dist/desktop.js +27 -0
- package/dist/desktop.js.map +1 -0
- package/dist/device-authorization.d.ts +23 -0
- package/dist/diffs.d.ts +8 -0
- package/dist/diffs.js +15 -0
- package/dist/diffs.js.map +1 -0
- package/dist/discovery-cache.d.ts +5 -0
- package/dist/editor.d.ts +7 -0
- package/dist/editor.js +22 -0
- package/dist/editor.js.map +1 -0
- package/dist/embedded-new-voice-OCRNT6U5.js +18 -0
- package/dist/embedded-new-voice-OCRNT6U5.js.map +1 -0
- package/dist/embedded-voice-RPHPYVBT.js +18 -0
- package/dist/embedded-voice-RPHPYVBT.js.map +1 -0
- package/dist/{fleet-decision-row-GGCAT4E4.js → fleet-decision-row-SI63O5V4.js} +4 -1
- package/dist/fleet-decision-row-SI63O5V4.js.map +1 -0
- package/dist/hooks/latest-question.d.ts +25 -0
- package/dist/hooks/shared-machines-list.d.ts +4 -0
- package/dist/hooks/shared-query.d.ts +113 -0
- package/dist/hooks/use-attached-browsers.d.ts +1 -1
- package/dist/hooks/use-auth-runs.d.ts +1 -4
- package/dist/hooks/use-available-models.d.ts +1 -1
- package/dist/hooks/use-browser-frame-stream.d.ts +1 -1
- package/dist/hooks/use-browser-session.d.ts +12 -1
- package/dist/hooks/use-client-config-flags.d.ts +49 -0
- package/dist/hooks/use-codex-accounts.d.ts +59 -10
- package/dist/hooks/use-composer.d.ts +24 -2
- package/dist/hooks/use-computer-frame-stream.d.ts +1 -1
- package/dist/hooks/use-computer-input-posture.d.ts +13 -0
- package/dist/hooks/use-computer-session.d.ts +4 -0
- package/dist/hooks/use-connect.d.ts +23 -0
- package/dist/hooks/use-desktop-stream.d.ts +1 -1
- package/dist/hooks/use-file-attachments.d.ts +12 -0
- package/dist/hooks/use-goal.d.ts +2 -1
- package/dist/hooks/use-last-started-turn-policy.d.ts +5 -1
- package/dist/hooks/use-new-conversation.d.ts +56 -0
- package/dist/hooks/use-new-session-draft.d.ts +74 -0
- package/dist/hooks/use-realtime-voice-models.d.ts +7 -0
- package/dist/hooks/use-sandbox-files.d.ts +4 -1
- package/dist/hooks/use-session-conversation.d.ts +49 -0
- package/dist/hooks/use-session-events.d.ts +28 -7
- package/dist/hooks/use-session-mcp-approval-policy.d.ts +2 -2
- package/dist/hooks/use-session-model-account.d.ts +48 -0
- package/dist/hooks/use-supergrok-accounts.d.ts +7 -1
- package/dist/hooks/use-terminal-stream.d.ts +11 -5
- package/dist/hooks/use-usage.d.ts +40 -0
- package/dist/hooks/use-vaults.d.ts +53 -0
- package/dist/hooks/use-voice-input.d.ts +8 -1
- package/dist/hooks/use-workspace-edit.d.ts +4 -0
- package/dist/hooks/use-workspace-sessions.d.ts +22 -5
- package/dist/human-input-model.d.ts +122 -0
- package/dist/identity-link-accounts.d.ts +11 -0
- package/dist/identity-link-consent.d.ts +18 -0
- package/dist/index.d.ts +82 -20
- package/dist/index.js +2350 -6605
- package/dist/index.js.map +1 -1
- package/dist/interaction.d.ts +1 -1
- package/dist/interaction.js +14 -24
- package/dist/interaction.js.map +1 -1
- package/dist/latest-question-R77KWSUP.js +118 -0
- package/dist/latest-question-R77KWSUP.js.map +1 -0
- package/dist/lib/clipboard.d.ts +7 -0
- package/dist/lib/error-message.d.ts +7 -0
- package/dist/lib/format.d.ts +58 -4
- package/dist/lib/host-theme.d.ts +77 -0
- package/dist/lib/interaction-errors.d.ts +3 -0
- package/dist/lib/menu-styles.d.ts +22 -0
- package/dist/lib/notify-observer.d.ts +2 -0
- package/dist/lib/pierre-diffs-loader.d.ts +20 -0
- package/dist/lib/provider-recovery.d.ts +55 -0
- package/dist/lib/scrollbars.d.ts +11 -0
- package/dist/lib/terminal-input-readiness.d.ts +11 -0
- package/dist/lib/transient-retry.d.ts +25 -0
- package/dist/lib/workbench-peers.d.ts +36 -0
- package/dist/lib/xterm-theme.d.ts +7 -5
- package/dist/machines.js +9 -5
- package/dist/markdown-table-layout-3PV2UAAH.js +113 -0
- package/dist/markdown-table-layout-3PV2UAAH.js.map +1 -0
- package/dist/mcp-connection-status.d.ts +14 -0
- package/dist/model-mark-paths.d.ts +34 -0
- package/dist/model-mark-paths.js +16 -0
- package/dist/model-mark-paths.js.map +1 -0
- package/dist/model-picker-model.d.ts +111 -0
- package/dist/model-picker-model.js +25 -0
- package/dist/model-picker-model.js.map +1 -0
- package/dist/model-policy-picker-menu-7GJ5URPR.js +17 -0
- package/dist/model-policy-picker-menu-7GJ5URPR.js.map +1 -0
- package/dist/model-policy.d.ts +30 -3
- package/dist/model-policy.js +14 -1
- package/dist/native-previews.d.ts +28 -0
- package/dist/native-previews.js +82 -0
- package/dist/native-previews.js.map +1 -0
- package/dist/new-session-draft.d.ts +7 -0
- package/dist/new-session-draft.js +639 -0
- package/dist/new-session-draft.js.map +1 -0
- package/dist/notification-text.d.ts +27 -0
- package/dist/{noto-sans-arabic-loader-IA2T4X2A.js → noto-sans-arabic-loader-XSH2KYWJ.js} +3 -1
- package/dist/{noto-sans-arabic-loader-IA2T4X2A.js.map → noto-sans-arabic-loader-XSH2KYWJ.js.map} +1 -1
- package/dist/{noto-sans-jp-loader.generated-HFGLYBR3.js → noto-sans-jp-loader.generated-MR5L6V7K.js} +3 -1
- package/dist/{noto-sans-jp-loader.generated-HFGLYBR3.js.map → noto-sans-jp-loader.generated-MR5L6V7K.js.map} +1 -1
- package/dist/older-history.d.ts +3 -2
- package/dist/organization-model.d.ts +32 -0
- package/dist/organization-model.js +65 -0
- package/dist/organization-model.js.map +1 -0
- package/dist/{platform-activity-row-BJHUHXAT.js → platform-activity-row-5OCKOQWZ.js} +16 -78
- package/dist/platform-activity-row-5OCKOQWZ.js.map +1 -0
- package/dist/plugin-details.d.ts +14 -0
- package/dist/plugin-discovery.d.ts +25 -0
- package/dist/preview-loading-paint.d.ts +20 -0
- package/dist/provider.d.ts +25 -2
- package/dist/queue-presentation-model.d.ts +72 -0
- package/dist/queue-presentation-model.js +38 -0
- package/dist/queue-presentation-model.js.map +1 -0
- package/dist/{queue-surface-implementation-BSKUWHRI.js → queue-surface-implementation-GJBH7NKO.js} +65 -265
- package/dist/queue-surface-implementation-GJBH7NKO.js.map +1 -0
- package/dist/realtime/embedded-new-voice.d.ts +1 -0
- package/dist/realtime/embedded-voice.d.ts +1 -0
- package/dist/realtime/realtime-control.d.ts +4 -65
- package/dist/realtime/session-realtime.d.ts +78 -0
- package/dist/realtime.js +25 -1294
- package/dist/realtime.js.map +1 -1
- package/dist/sandbox-files-O27IPOZW.js +21 -0
- package/dist/sandbox-files-O27IPOZW.js.map +1 -0
- package/dist/sandbox-label-model.d.ts +30 -0
- package/dist/sandbox-label-model.js +20 -0
- package/dist/sandbox-label-model.js.map +1 -0
- package/dist/scrollbars.d.ts +1 -0
- package/dist/scrollbars.js +10 -0
- package/dist/scrollbars.js.map +1 -0
- package/dist/secret-reference-label.d.ts +14 -0
- package/dist/secrets-ui.d.ts +57 -0
- package/dist/session-agents-model.d.ts +10 -0
- package/dist/session-agents-model.js +25 -0
- package/dist/session-agents-model.js.map +1 -0
- package/dist/session-attention-model.d.ts +8 -0
- package/dist/session-attention-model.js +47 -0
- package/dist/session-attention-model.js.map +1 -0
- package/dist/session-auth-recommendation.d.ts +5 -0
- package/dist/session-capability-policy.d.ts +31 -0
- package/dist/session-feedback-model.d.ts +20 -0
- package/dist/session-feedback-model.js +56 -0
- package/dist/session-feedback-model.js.map +1 -0
- package/dist/session-list-model.d.ts +138 -0
- package/dist/session-list-model.js +274 -0
- package/dist/session-list-model.js.map +1 -0
- package/dist/session-realtime-7DJOIHQW.js +21 -0
- package/dist/session-realtime-7DJOIHQW.js.map +1 -0
- package/dist/session-realtime.d.ts +7 -0
- package/dist/session-realtime.js +19 -0
- package/dist/session-realtime.js.map +1 -0
- package/dist/session-status-model.d.ts +36 -0
- package/dist/session-ui.d.ts +39 -1
- package/dist/session-ui.js +126 -12
- package/dist/session-ui.js.map +1 -1
- package/dist/session.d.ts +8 -2
- package/dist/session.js +35 -20
- package/dist/site-snapshot.d.ts +14 -0
- package/dist/sites-ui.d.ts +24 -0
- package/dist/sites.d.ts +3 -0
- package/dist/sites.js +14 -0
- package/dist/sites.js.map +1 -0
- package/dist/skill-discovery.d.ts +47 -0
- package/dist/terminal.d.ts +8 -0
- package/dist/terminal.js +32 -0
- package/dist/terminal.js.map +1 -0
- package/dist/testing/session-scenarios.d.ts +10 -0
- package/dist/testing/session-scenarios.js +367 -0
- package/dist/testing/session-scenarios.js.map +1 -0
- package/dist/timeline/activity-rail.d.ts +11 -2
- package/dist/timeline/agent-identity.d.ts +30 -0
- package/dist/timeline/agent-row.d.ts +31 -0
- package/dist/timeline/allowance-exhausted-row.d.ts +24 -0
- package/dist/timeline/compaction-copy.d.ts +46 -0
- package/dist/timeline/entrance.d.ts +13 -1
- package/dist/timeline/focus-sequence.d.ts +9 -0
- package/dist/timeline/genie-copy.d.ts +3 -0
- package/dist/timeline/genie-loading.d.ts +47 -0
- package/dist/timeline/index.d.ts +10 -5
- package/dist/timeline/knowledge-receipt.d.ts +17 -0
- package/dist/timeline/message-sender.d.ts +19 -0
- package/dist/timeline/notice-presentation.d.ts +13 -0
- package/dist/timeline/parsers.d.ts +11 -0
- package/dist/timeline/patch-apply-command.d.ts +18 -0
- package/dist/timeline/platform-activity-presentation.d.ts +21 -0
- package/dist/timeline/platform-activity-row.d.ts +1 -2
- package/dist/timeline/presented-image.d.ts +11 -0
- package/dist/timeline/projection.d.ts +31 -2
- package/dist/timeline/provider-logo.d.ts +15 -0
- package/dist/timeline/question-nav-model.d.ts +23 -0
- package/dist/timeline/registry.d.ts +12 -1
- package/dist/timeline/retained-image.d.ts +18 -0
- package/dist/timeline/retained-loaders.d.ts +27 -0
- package/dist/timeline/rolling-activity.d.ts +11 -0
- package/dist/timeline/screenshot-lightbox.d.ts +23 -1
- package/dist/timeline/session-usage-limit-row.d.ts +11 -0
- package/dist/timeline/shared.d.ts +4 -1
- package/dist/timeline/startup-dispatch-details.d.ts +5 -0
- package/dist/timeline/startup-preference.d.ts +3 -0
- package/dist/timeline/startup-timings.d.ts +4 -0
- package/dist/timeline/tool-display-name.d.ts +5 -2
- package/dist/timeline/tool-presentation.d.ts +172 -0
- package/dist/timeline/turn-summary-model.d.ts +95 -0
- package/dist/timeline/turn-summary.d.ts +20 -54
- package/dist/timeline/types.d.ts +179 -7
- package/dist/timeline/work-presentation.d.ts +60 -0
- package/dist/timeline-annotation-markers-U3G66KUD.js +166 -0
- package/dist/timeline-annotation-markers-U3G66KUD.js.map +1 -0
- package/dist/timeline-annotation-selection-BI7QTPTZ.js +242 -0
- package/dist/timeline-annotation-selection-BI7QTPTZ.js.map +1 -0
- package/dist/timeline-annotations-dialog-FOMHSDTE.js +274 -0
- package/dist/timeline-annotations-dialog-FOMHSDTE.js.map +1 -0
- package/dist/timeline-model.d.ts +29 -0
- package/dist/timeline-model.js +254 -0
- package/dist/timeline-model.js.map +1 -0
- package/dist/usage/allowance-copy.d.ts +25 -0
- package/dist/usage/session-usage-limit.d.ts +88 -0
- package/dist/usage/summary.d.ts +35 -0
- package/dist/usage.d.ts +17 -0
- package/dist/usage.js +1187 -0
- package/dist/usage.js.map +1 -0
- package/dist/voice-recording-owner.d.ts +7 -0
- package/package.json +107 -7
- package/src/accounts.tsx +116 -14
- package/src/approvals.ts +8 -1
- package/src/artifacts-spreadsheet.ts +1 -0
- package/src/artifacts.ts +44 -0
- package/src/assets/README.md +8 -0
- package/src/assets/gmail.ico +0 -0
- package/src/assets/outlook.ico +0 -0
- package/src/capability-catalog-row.tsx +94 -0
- package/src/capability-logo-fallback.ts +22 -0
- package/src/client.ts +20 -31
- package/src/commands/registry.ts +18 -15
- package/src/commands/types.ts +2 -0
- package/src/components/anthropic-mark.tsx +10 -0
- package/src/components/approval-surface.tsx +401 -138
- package/src/components/artifacts/artifact-chrome.tsx +413 -0
- package/src/components/artifacts/artifact-sandbox.tsx +189 -0
- package/src/components/artifacts/artifact-surface.tsx +40 -20
- package/src/components/artifacts/chat-interactive-block.tsx +260 -0
- package/src/components/artifacts/deferred-chat-media.tsx +67 -0
- package/src/components/artifacts/document-editor.tsx +141 -16
- package/src/components/artifacts/editable-artifact-ui.tsx +4 -2
- package/src/components/artifacts/editable-artifact-view.tsx +197 -0
- package/src/components/artifacts/editable-artifact-workbench.tsx +5 -2
- package/src/components/artifacts/editable-document.tsx +37 -36
- package/src/components/artifacts/editable-presentation.tsx +36 -18
- package/src/components/artifacts/editable-spreadsheet.tsx +543 -103
- package/src/components/artifacts/index.ts +45 -0
- package/src/components/artifacts/inline-html-document.ts +24 -0
- package/src/components/artifacts/latest-task-runner.ts +49 -0
- package/src/components/artifacts/presentation-editor.tsx +323 -67
- package/src/components/artifacts/published-html-artifact-frame.tsx +122 -5
- package/src/components/artifacts/session-artifact-viewer.tsx +378 -0
- package/src/components/artifacts/site-view.tsx +121 -0
- package/src/components/artifacts/spreadsheet-canvas.ts +5 -10
- package/src/components/artifacts/spreadsheet-command-queue.ts +184 -0
- package/src/components/artifacts/spreadsheet-download.tsx +109 -0
- package/src/components/artifacts/spreadsheet-general-display.ts +43 -0
- package/src/components/artifacts/spreadsheet-grid.tsx +344 -144
- package/src/components/artifacts/spreadsheet-resize.tsx +421 -0
- package/src/components/artifacts/spreadsheet-submissions.tsx +46 -0
- package/src/components/artifacts/visualization-assets/base.css +1015 -0
- package/src/components/artifacts/visualization-assets/helpers.html +349 -0
- package/src/components/artifacts/visualization-assets.gen.ts +3 -0
- package/src/components/browser-select-control.tsx +312 -0
- package/src/components/browser-viewer.tsx +778 -318
- package/src/components/chat-composer.tsx +47 -5
- package/src/components/child-session-link.tsx +36 -0
- package/src/components/claude-mark.tsx +11 -0
- package/src/components/code-editor.tsx +13 -16
- package/src/components/composer-transcription-control.tsx +128 -30
- package/src/components/composer.tsx +404 -195
- package/src/components/computer-viewer.tsx +880 -253
- package/src/components/copy-button.tsx +13 -5
- package/src/components/desktop-viewer.tsx +1 -1
- package/src/components/enrollment-consent.tsx +1 -1
- package/src/components/enrollment-device-flow.tsx +1 -1
- package/src/components/file-browser.tsx +10 -14
- package/src/components/fleet-tile.tsx +9 -18
- package/src/components/generated-video-player.tsx +4 -2
- package/src/components/grok-mark.tsx +34 -0
- package/src/components/human-input-form.tsx +590 -283
- package/src/components/human-input-surface.tsx +11 -0
- package/src/components/interaction-intervention-banner.tsx +2 -2
- package/src/components/linkified-text.tsx +79 -0
- package/src/components/machine-card.tsx +35 -78
- package/src/components/machine-dock-bar.tsx +1 -1
- package/src/components/machine-input-display.ts +197 -3
- package/src/components/machines/agent-status-icon.tsx +31 -0
- package/src/components/machines/machine-detail.tsx +200 -31
- package/src/components/machines/machine-operation-policy.tsx +1 -1
- package/src/components/machines/machine-status.ts +241 -0
- package/src/components/machines-dashboard.tsx +2 -17
- package/src/components/markdown-table-layout.ts +143 -0
- package/src/components/markdown.tsx +466 -129
- package/src/components/message-timeline.tsx +2567 -728
- package/src/components/model-mark.tsx +102 -0
- package/src/components/model-picker.tsx +15 -4
- package/src/components/model-policy-picker-menu.tsx +371 -0
- package/src/components/model-policy-picker.tsx +256 -412
- package/src/components/new-conversation.tsx +221 -0
- package/src/components/open-geni-chat.tsx +309 -0
- package/src/components/open-geni-links.tsx +179 -0
- package/src/components/openrouter-mark.tsx +13 -0
- package/src/components/opper-mark.tsx +18 -0
- package/src/components/pierre-diff.tsx +41 -16
- package/src/components/pierre-file.tsx +35 -10
- package/src/components/preview-loading.tsx +109 -0
- package/src/components/provider-recovery-notice.tsx +49 -0
- package/src/components/queue-item-content.ts +14 -0
- package/src/components/queue-surface-implementation.tsx +51 -356
- package/src/components/queue-surface-state.tsx +3 -1
- package/src/components/rehype-secret-refs.ts +98 -0
- package/src/components/remark-soft-line-breaks.ts +166 -0
- package/src/components/sandbox-files.tsx +91 -15
- package/src/components/sandbox-terminal.tsx +84 -13
- package/src/components/sandbox-workspace.tsx +147 -51
- package/src/components/secret-question-field.tsx +324 -0
- package/src/components/secret-ref-chip.tsx +185 -0
- package/src/components/session-capability-frame.tsx +197 -0
- package/src/components/session-chrome.tsx +842 -251
- package/src/components/session-commands-panel.tsx +126 -0
- package/src/components/session-commands.tsx +18 -0
- package/src/components/session-connection-request.tsx +97 -0
- package/src/components/session-conversation.tsx +876 -0
- package/src/components/session-list.tsx +257 -0
- package/src/components/session-mcp-capability-card.tsx +680 -0
- package/src/components/session-proxy-scope.tsx +153 -0
- package/src/components/session-status.tsx +26 -17
- package/src/components/session-usage-limit-notice.tsx +174 -0
- package/src/components/timeline-anchor.tsx +119 -0
- package/src/components/timeline-annotation-chrome.tsx +196 -0
- package/src/components/timeline-annotation-layout.ts +268 -0
- package/src/components/timeline-annotation-markers.tsx +185 -0
- package/src/components/timeline-annotation-reveal-context.ts +9 -0
- package/src/components/timeline-annotation-selection.tsx +106 -54
- package/src/components/timeline-annotation-shared.ts +245 -0
- package/src/components/timeline-annotations-dialog.tsx +185 -128
- package/src/components/timeline-annotations.tsx +189 -45
- package/src/components/timeline-reading-progress.ts +80 -0
- package/src/components/timeline-search.tsx +168 -0
- package/src/components/timeline-settlement.ts +60 -0
- package/src/components/tip-follow.ts +52 -0
- package/src/components/tool-action-review.tsx +650 -0
- package/src/components/tool-review-history.tsx +88 -0
- package/src/components/tooltip.tsx +38 -5
- package/src/components/usage-limit-notice.tsx +179 -0
- package/src/components/usage-member-list.tsx +792 -0
- package/src/components/usage-meter.tsx +382 -0
- package/src/components/use-viewer-menu-dismiss.ts +33 -0
- package/src/components/user-message-body.tsx +27 -2
- package/src/components/workspace-dock.tsx +18 -1
- package/src/composer-messages.ts +150 -0
- package/src/composer-voice-events.ts +12 -0
- package/src/composer.ts +6 -1
- package/src/connect-account-identity.tsx +34 -0
- package/src/connect-accounts.tsx +233 -0
- package/src/connect-chooser.tsx +336 -0
- package/src/connect-panel.tsx +99 -0
- package/src/connect-setup.tsx +355 -0
- package/src/connect.ts +60 -0
- package/src/connection-assets.d.ts +4 -0
- package/src/connection-catalog.tsx +162 -0
- package/src/connection-discovery.tsx +238 -0
- package/src/connection-installed.tsx +51 -0
- package/src/connection-logo.tsx +37 -0
- package/src/connection-service-logo.tsx +55 -0
- package/src/connection-service-presentation.ts +46 -0
- package/src/connection-skeleton.tsx +16 -0
- package/src/connection-type-picker.tsx +36 -0
- package/src/conversation-timeline.ts +92 -0
- package/src/desktop.ts +24 -0
- package/src/device-authorization.tsx +98 -0
- package/src/diffs.ts +16 -0
- package/src/discovery-cache.ts +42 -0
- package/src/editor.ts +13 -0
- package/src/hooks/internal.ts +3 -2
- package/src/hooks/latest-question.ts +164 -0
- package/src/hooks/shared-machines-list.ts +34 -1
- package/src/hooks/shared-query.ts +721 -0
- package/src/hooks/use-attached-browsers.ts +1 -1
- package/src/hooks/use-auth-runs.ts +0 -27
- package/src/hooks/use-available-models.ts +21 -15
- package/src/hooks/use-browser-frame-stream.ts +19 -2
- package/src/hooks/use-browser-session.ts +680 -205
- package/src/hooks/use-browser-sessions.ts +32 -1
- package/src/hooks/use-client-config-flags.ts +118 -0
- package/src/hooks/use-codex-accounts.ts +247 -47
- package/src/hooks/use-composer.ts +276 -47
- package/src/hooks/use-computer-frame-stream.ts +25 -7
- package/src/hooks/use-computer-input-posture.ts +94 -0
- package/src/hooks/use-computer-session.ts +409 -95
- package/src/hooks/use-connect.ts +23 -0
- package/src/hooks/use-desktop-stream.ts +19 -28
- package/src/hooks/use-file-attachments.ts +80 -4
- package/src/hooks/use-goal.ts +107 -13
- package/src/hooks/use-last-started-turn-policy.ts +46 -14
- package/src/hooks/use-machines.ts +4 -0
- package/src/hooks/use-new-conversation.ts +374 -0
- package/src/hooks/use-new-session-draft.ts +813 -0
- package/src/hooks/use-realtime-voice-models.ts +46 -0
- package/src/hooks/use-sandbox-files.ts +68 -20
- package/src/hooks/use-session-background-commands.ts +22 -11
- package/src/hooks/use-session-capabilities.ts +3 -2
- package/src/hooks/use-session-conversation.ts +150 -0
- package/src/hooks/use-session-events.ts +703 -382
- package/src/hooks/use-session-lineage.ts +20 -16
- package/src/hooks/use-session-mcp-approval-policy.ts +13 -5
- package/src/hooks/use-session-model-account.ts +174 -0
- package/src/hooks/use-session.ts +53 -21
- package/src/hooks/use-slash-commands.ts +6 -11
- package/src/hooks/use-supergrok-accounts.ts +22 -8
- package/src/hooks/use-terminal-stream.ts +153 -27
- package/src/hooks/use-transcription.ts +6 -0
- package/src/hooks/use-turn-queue.ts +2 -1
- package/src/hooks/use-usage.ts +100 -0
- package/src/hooks/use-vaults.ts +153 -0
- package/src/hooks/use-video-artifact-playback.ts +1 -1
- package/src/hooks/use-voice-input.ts +127 -19
- package/src/hooks/use-workspace-capture.ts +3 -2
- package/src/hooks/use-workspace-edit.ts +23 -5
- package/src/hooks/use-workspace-sessions.ts +97 -32
- package/src/human-input-model.ts +359 -0
- package/src/identity-link-accounts.tsx +148 -0
- package/src/identity-link-consent.tsx +192 -0
- package/src/index.ts +262 -16
- package/src/interaction.ts +1 -0
- package/src/lib/clipboard.ts +29 -0
- package/src/lib/error-message.ts +37 -0
- package/src/lib/format.ts +213 -16
- package/src/lib/host-theme.ts +529 -0
- package/src/lib/interaction-errors.ts +15 -0
- package/src/lib/menu-styles.ts +44 -0
- package/src/lib/notify-observer.ts +15 -0
- package/src/lib/pierre-diffs-loader.ts +53 -0
- package/src/lib/provider-recovery.ts +243 -0
- package/src/lib/scrollbars.ts +30 -0
- package/src/lib/terminal-input-readiness.ts +51 -0
- package/src/lib/transient-retry.ts +99 -0
- package/src/lib/workbench-peers.ts +62 -0
- package/src/lib/xterm-theme.ts +23 -21
- package/src/mcp-connection-status.ts +35 -0
- package/src/model-mark-paths.ts +53 -0
- package/src/model-picker-model.ts +330 -0
- package/src/model-policy.ts +299 -74
- package/src/native-previews.ts +100 -0
- package/src/new-session-draft.ts +22 -0
- package/src/notification-text.ts +81 -0
- package/src/older-history.ts +22 -4
- package/src/organization-model.ts +118 -0
- package/src/plugin-details.tsx +185 -0
- package/src/plugin-discovery.tsx +196 -0
- package/src/preview-loading-paint.ts +68 -0
- package/src/provider.tsx +74 -15
- package/src/queue-presentation-model.ts +464 -0
- package/src/realtime/dropdown-menu.tsx +19 -12
- package/src/realtime/embedded-new-voice.tsx +1 -0
- package/src/realtime/embedded-voice.tsx +3 -0
- package/src/realtime/realtime-control.tsx +138 -501
- package/src/realtime/session-realtime.ts +566 -0
- package/src/sandbox-label-model.ts +53 -0
- package/src/scrollbars.ts +3 -0
- package/src/secret-reference-label.ts +43 -0
- package/src/secrets-ui.tsx +59 -0
- package/src/session-agents-model.ts +33 -0
- package/src/session-attention-model.ts +62 -0
- package/src/session-auth-recommendation.ts +48 -0
- package/src/session-capability-policy.ts +196 -0
- package/src/session-context.ts +3 -4
- package/src/session-feedback-model.ts +95 -0
- package/src/session-list-model.ts +434 -0
- package/src/session-realtime.ts +18 -0
- package/src/session-status-model.ts +99 -0
- package/src/session-ui.ts +98 -1
- package/src/session.ts +17 -1
- package/src/site-snapshot.ts +74 -0
- package/src/sites-ui.tsx +348 -0
- package/src/sites.ts +3 -0
- package/src/skill-discovery.tsx +208 -0
- package/src/terminal.ts +26 -0
- package/src/testing/session-scenarios.ts +404 -0
- package/src/timeline/activity-rail.tsx +242 -101
- package/src/timeline/agent-identity.tsx +84 -0
- package/src/timeline/agent-row.tsx +231 -0
- package/src/timeline/allowance-exhausted-row.tsx +86 -0
- package/src/timeline/compaction-copy.ts +115 -0
- package/src/timeline/entrance.tsx +28 -3
- package/src/timeline/fleet-decision-projection.ts +2 -1
- package/src/timeline/fleet-decision-row.tsx +1 -0
- package/src/timeline/focus-sequence.ts +44 -0
- package/src/timeline/genie-copy.ts +19 -0
- package/src/timeline/genie-loading.tsx +143 -0
- package/src/timeline/index.ts +30 -2
- package/src/timeline/knowledge-receipt.tsx +100 -0
- package/src/timeline/message-sender.tsx +71 -0
- package/src/timeline/notice-presentation.ts +48 -0
- package/src/timeline/parsers.ts +42 -2
- package/src/timeline/patch-apply-command.tsx +135 -0
- package/src/timeline/platform-activity-presentation.ts +166 -0
- package/src/timeline/platform-activity-row.tsx +15 -90
- package/src/timeline/presented-image.ts +63 -0
- package/src/timeline/projection.ts +1746 -76
- package/src/timeline/provider-logo.tsx +53 -0
- package/src/timeline/question-nav-model.ts +28 -0
- package/src/timeline/registry.ts +26 -4
- package/src/timeline/retained-image.ts +97 -0
- package/src/timeline/retained-loaders.ts +91 -0
- package/src/timeline/rolling-activity.tsx +80 -0
- package/src/timeline/screenshot-lightbox.tsx +228 -5
- package/src/timeline/session-usage-limit-row.tsx +42 -0
- package/src/timeline/shared.tsx +42 -15
- package/src/timeline/startup-dispatch-details.tsx +36 -0
- package/src/timeline/startup-preference.ts +33 -0
- package/src/timeline/startup-timings.tsx +145 -0
- package/src/timeline/tool-display-name.ts +19 -7
- package/src/timeline/tool-presentation.ts +1316 -0
- package/src/timeline/tool-renderers.tsx +835 -1138
- package/src/timeline/turn-summary-model.ts +343 -0
- package/src/timeline/turn-summary.tsx +272 -365
- package/src/timeline/types.ts +189 -6
- package/src/timeline/work-presentation.ts +189 -0
- package/src/timeline-model.ts +143 -0
- package/src/usage/allowance-copy.ts +64 -0
- package/src/usage/session-usage-limit.ts +266 -0
- package/src/usage/summary.ts +93 -0
- package/src/usage.ts +70 -0
- package/src/voice-recording-owner.ts +22 -0
- package/styles/compiled.css +2319 -748
- package/styles/connect.css +290 -0
- package/styles/connect.d.ts +1 -0
- package/styles/effective-tokens.css +1 -0
- package/styles/index.css +309 -9
- package/styles/responsive.css +99 -7
- package/styles/session-capability.css +44 -0
- package/styles/tokens.css +134 -66
- package/dist/browser-viewer-AEFHUYZK.js +0 -14
- package/dist/chunk-4MDLEHXL.js.map +0 -1
- package/dist/chunk-5YK2ZDIG.js.map +0 -1
- package/dist/chunk-D3UIAJKY.js.map +0 -1
- package/dist/chunk-ELIYWBZR.js.map +0 -1
- package/dist/chunk-H5YGYNXS.js.map +0 -1
- package/dist/chunk-HQVCKCLG.js +0 -9458
- package/dist/chunk-HQVCKCLG.js.map +0 -1
- package/dist/chunk-HUIKIDM5.js.map +0 -1
- package/dist/chunk-ICA6R6TW.js.map +0 -1
- package/dist/chunk-JVYQRRC4.js.map +0 -1
- package/dist/chunk-KCGXPP5V.js.map +0 -1
- package/dist/chunk-KZ73RL76.js.map +0 -1
- package/dist/chunk-LAKLF4PA.js +0 -141
- package/dist/chunk-LAKLF4PA.js.map +0 -1
- package/dist/chunk-MZ2G2XBA.js.map +0 -1
- package/dist/chunk-NEXLLTP4.js.map +0 -1
- package/dist/chunk-OAM4WAAM.js.map +0 -1
- package/dist/chunk-PEI6RANI.js.map +0 -1
- package/dist/chunk-RGALCTWO.js.map +0 -1
- package/dist/chunk-W6NFJXSA.js +0 -454
- package/dist/chunk-W6NFJXSA.js.map +0 -1
- package/dist/chunk-WSK7G5LE.js +0 -170
- package/dist/chunk-WSK7G5LE.js.map +0 -1
- package/dist/chunk-X4A66EWZ.js +0 -223
- package/dist/chunk-X4A66EWZ.js.map +0 -1
- package/dist/chunk-XXWH2JLC.js.map +0 -1
- package/dist/chunk-YFKJ7VZH.js +0 -268
- package/dist/chunk-YFKJ7VZH.js.map +0 -1
- package/dist/chunk-YJFGAFBD.js.map +0 -1
- package/dist/computer-viewer-FWEZISW4.js +0 -16
- package/dist/fleet-decision-row-GGCAT4E4.js.map +0 -1
- package/dist/hooks/use-environments.d.ts +0 -41
- package/dist/hooks/use-packs.d.ts +0 -32
- package/dist/platform-activity-row-BJHUHXAT.js.map +0 -1
- package/dist/queue-surface-implementation-BSKUWHRI.js.map +0 -1
- package/dist/timeline-annotation-selection-3L7LHGG2.js +0 -187
- package/dist/timeline-annotation-selection-3L7LHGG2.js.map +0 -1
- package/dist/timeline-annotations-dialog-U7EVLR75.js +0 -196
- package/dist/timeline-annotations-dialog-U7EVLR75.js.map +0 -1
- package/src/hooks/use-environments.ts +0 -182
- package/src/hooks/use-packs.ts +0 -157
- /package/dist/{browser-viewer-AEFHUYZK.js.map → browser-viewer-ZWR6MWJ7.js.map} +0 -0
- /package/dist/{computer-viewer-FWEZISW4.js.map → chat-interactive-block-BO2IWXVK.js.map} +0 -0
package/dist/chunk-LAKLF4PA.js
DELETED
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
// src/lib/format.ts
|
|
2
|
-
import { OpenGeniApiError } from "@opengeni/sdk";
|
|
3
|
-
function formatClockTime(iso) {
|
|
4
|
-
const then = new Date(iso);
|
|
5
|
-
if (Number.isNaN(then.getTime())) {
|
|
6
|
-
return "";
|
|
7
|
-
}
|
|
8
|
-
return then.toLocaleString(void 0, {
|
|
9
|
-
month: "short",
|
|
10
|
-
day: "numeric",
|
|
11
|
-
hour: "numeric",
|
|
12
|
-
minute: "2-digit"
|
|
13
|
-
});
|
|
14
|
-
}
|
|
15
|
-
function formatRelativeTime(iso, now = /* @__PURE__ */ new Date()) {
|
|
16
|
-
const then = new Date(iso).getTime();
|
|
17
|
-
if (Number.isNaN(then)) {
|
|
18
|
-
return "";
|
|
19
|
-
}
|
|
20
|
-
const seconds = Math.max(0, Math.floor((now.getTime() - then) / 1e3));
|
|
21
|
-
if (seconds < 10) {
|
|
22
|
-
return "now";
|
|
23
|
-
}
|
|
24
|
-
if (seconds < 60) {
|
|
25
|
-
return `${seconds}s`;
|
|
26
|
-
}
|
|
27
|
-
const minutes = Math.floor(seconds / 60);
|
|
28
|
-
if (minutes < 60) {
|
|
29
|
-
return `${minutes}m`;
|
|
30
|
-
}
|
|
31
|
-
const hours = Math.floor(minutes / 60);
|
|
32
|
-
if (hours < 24) {
|
|
33
|
-
return `${hours}h`;
|
|
34
|
-
}
|
|
35
|
-
const days = Math.floor(hours / 24);
|
|
36
|
-
if (days < 14) {
|
|
37
|
-
return `${days}d`;
|
|
38
|
-
}
|
|
39
|
-
return new Date(iso).toLocaleDateString();
|
|
40
|
-
}
|
|
41
|
-
function formatBytes(bytes) {
|
|
42
|
-
if (bytes < 1024) {
|
|
43
|
-
return `${bytes} B`;
|
|
44
|
-
}
|
|
45
|
-
const units = ["KB", "MB", "GB"];
|
|
46
|
-
let value = bytes / 1024;
|
|
47
|
-
for (const unit of units) {
|
|
48
|
-
if (value < 1024 || unit === "GB") {
|
|
49
|
-
return `${value.toFixed(value < 10 ? 1 : 0)} ${unit}`;
|
|
50
|
-
}
|
|
51
|
-
value /= 1024;
|
|
52
|
-
}
|
|
53
|
-
return `${bytes} B`;
|
|
54
|
-
}
|
|
55
|
-
function truncate(text, maxLength) {
|
|
56
|
-
const collapsed = text.replace(/\s+/g, " ").trim();
|
|
57
|
-
if (collapsed.length <= maxLength) {
|
|
58
|
-
return collapsed;
|
|
59
|
-
}
|
|
60
|
-
return `${collapsed.slice(0, Math.max(0, maxLength - 1)).trimEnd()}\u2026`;
|
|
61
|
-
}
|
|
62
|
-
function stringifyPayload(value) {
|
|
63
|
-
if (value === null || value === void 0) {
|
|
64
|
-
return "";
|
|
65
|
-
}
|
|
66
|
-
if (typeof value === "string") {
|
|
67
|
-
const parsed = tryParseJson(value);
|
|
68
|
-
if (parsed !== void 0 && typeof parsed === "object") {
|
|
69
|
-
return stringifyPayload(parsed);
|
|
70
|
-
}
|
|
71
|
-
return value;
|
|
72
|
-
}
|
|
73
|
-
try {
|
|
74
|
-
return JSON.stringify(value, null, 2) ?? String(value);
|
|
75
|
-
} catch {
|
|
76
|
-
return String(value);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
function tryParseJson(text) {
|
|
80
|
-
const trimmed = text.trim();
|
|
81
|
-
if (!trimmed.startsWith("{") && !trimmed.startsWith("[") && !trimmed.startsWith('"')) {
|
|
82
|
-
return void 0;
|
|
83
|
-
}
|
|
84
|
-
try {
|
|
85
|
-
return JSON.parse(trimmed);
|
|
86
|
-
} catch {
|
|
87
|
-
return void 0;
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
var CREDIT_EXHAUSTION_MESSAGE = "Out of OpenGeni credits \u2014 this workspace's balance is empty. Add credits to continue; the conversation is preserved.";
|
|
91
|
-
var COMPOSER_PAYMENT_REQUIRED_MESSAGE = "This turn requires OpenGeni managed credits, but the account balance is empty. Add credits or choose a connected Codex subscription model, then retry. Your draft and attachments are preserved.";
|
|
92
|
-
function composerSubmissionErrorMessage(error) {
|
|
93
|
-
return error instanceof OpenGeniApiError && error.status === 402 && error.code === "payment_required" ? COMPOSER_PAYMENT_REQUIRED_MESSAGE : error.message;
|
|
94
|
-
}
|
|
95
|
-
function isCreditExhaustion(input) {
|
|
96
|
-
if (typeof input === "string") {
|
|
97
|
-
return input.toLowerCase().includes("insufficient opengeni credits");
|
|
98
|
-
}
|
|
99
|
-
if (input.segmentLimit === "budget_exhausted") {
|
|
100
|
-
return true;
|
|
101
|
-
}
|
|
102
|
-
for (const text of [input.error, input.detail]) {
|
|
103
|
-
if (typeof text === "string" && text.toLowerCase().includes("insufficient opengeni credits")) {
|
|
104
|
-
return true;
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
return false;
|
|
108
|
-
}
|
|
109
|
-
function humanizeFailureReason(reason) {
|
|
110
|
-
if (!reason) {
|
|
111
|
-
return reason;
|
|
112
|
-
}
|
|
113
|
-
if (isCreditExhaustion(reason)) {
|
|
114
|
-
return CREDIT_EXHAUSTION_MESSAGE;
|
|
115
|
-
}
|
|
116
|
-
const normalized = reason.toLowerCase();
|
|
117
|
-
const authFailure = normalized.includes("incorrect api key") || normalized.includes("invalid api key") || normalized.includes("invalid_api_key") || normalized.includes("platform.openai.com/account/api-keys") || normalized.includes("401") && (normalized.includes("api key") || normalized.includes("unauthorized"));
|
|
118
|
-
if (authFailure) {
|
|
119
|
-
return "The model provider rejected this deployment's engine credentials. Sending messages won't help until the deployment's engine configuration is fixed.";
|
|
120
|
-
}
|
|
121
|
-
const quotaFailure = normalized.includes("insufficient_quota") || normalized.includes("exceeded your current quota");
|
|
122
|
-
if (quotaFailure) {
|
|
123
|
-
return "The model provider refused the request: this deployment's provider quota is exhausted.";
|
|
124
|
-
}
|
|
125
|
-
return reason;
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
export {
|
|
129
|
-
formatClockTime,
|
|
130
|
-
formatRelativeTime,
|
|
131
|
-
formatBytes,
|
|
132
|
-
truncate,
|
|
133
|
-
stringifyPayload,
|
|
134
|
-
tryParseJson,
|
|
135
|
-
CREDIT_EXHAUSTION_MESSAGE,
|
|
136
|
-
COMPOSER_PAYMENT_REQUIRED_MESSAGE,
|
|
137
|
-
composerSubmissionErrorMessage,
|
|
138
|
-
isCreditExhaustion,
|
|
139
|
-
humanizeFailureReason
|
|
140
|
-
};
|
|
141
|
-
//# sourceMappingURL=chunk-LAKLF4PA.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/lib/format.ts"],"sourcesContent":["import { OpenGeniApiError } from \"@opengeni/sdk\";\n\n/** Local finished-at stamp for message footers: \"Aug 2, 3:42 PM\" / locale-equivalent. */\nexport function formatClockTime(iso: string): string {\n const then = new Date(iso);\n if (Number.isNaN(then.getTime())) {\n return \"\";\n }\n return then.toLocaleString(undefined, {\n month: \"short\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\",\n });\n}\n\n/** Compact relative time: \"now\", \"42s\", \"7m\", \"3h\", \"2d\", then a date. */\nexport function formatRelativeTime(iso: string, now: Date = new Date()): string {\n const then = new Date(iso).getTime();\n if (Number.isNaN(then)) {\n return \"\";\n }\n const seconds = Math.max(0, Math.floor((now.getTime() - then) / 1000));\n if (seconds < 10) {\n return \"now\";\n }\n if (seconds < 60) {\n return `${seconds}s`;\n }\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) {\n return `${minutes}m`;\n }\n const hours = Math.floor(minutes / 60);\n if (hours < 24) {\n return `${hours}h`;\n }\n const days = Math.floor(hours / 24);\n if (days < 14) {\n return `${days}d`;\n }\n return new Date(iso).toLocaleDateString();\n}\n\n/** Human-readable byte size: \"512 B\", \"8.0 KB\", \"1.4 MB\", \"3 GB\". */\nexport function formatBytes(bytes: number): string {\n if (bytes < 1024) {\n return `${bytes} B`;\n }\n const units = [\"KB\", \"MB\", \"GB\"] as const;\n let value = bytes / 1024;\n for (const unit of units) {\n if (value < 1024 || unit === \"GB\") {\n return `${value.toFixed(value < 10 ? 1 : 0)} ${unit}`;\n }\n value /= 1024;\n }\n return `${bytes} B`;\n}\n\n/** Single-line preview of arbitrary text, for tiles and collapsed rows. */\nexport function truncate(text: string, maxLength: number): string {\n const collapsed = text.replace(/\\s+/g, \" \").trim();\n if (collapsed.length <= maxLength) {\n return collapsed;\n }\n return `${collapsed.slice(0, Math.max(0, maxLength - 1)).trimEnd()}…`;\n}\n\n/** Render an unknown payload as readable text (pretty JSON when possible). */\nexport function stringifyPayload(value: unknown): string {\n if (value === null || value === undefined) {\n return \"\";\n }\n if (typeof value === \"string\") {\n const parsed = tryParseJson(value);\n if (parsed !== undefined && typeof parsed === \"object\") {\n return stringifyPayload(parsed);\n }\n return value;\n }\n try {\n return JSON.stringify(value, null, 2) ?? String(value);\n } catch {\n return String(value);\n }\n}\n\n/** JSON.parse that returns `undefined` instead of throwing. */\nexport function tryParseJson(text: string): unknown {\n const trimmed = text.trim();\n if (!trimmed.startsWith(\"{\") && !trimmed.startsWith(\"[\") && !trimmed.startsWith('\"')) {\n return undefined;\n }\n try {\n return JSON.parse(trimmed) as unknown;\n } catch {\n return undefined;\n }\n}\n\n/**\n * The canonical credit-death sentence. Credit exhaustion is the one failure a\n * user can fix themselves — the copy must say what happened (empty balance),\n * what to do (add credits), and what is safe (nothing was lost). Crucially it\n * must NOT say \"send a message to revive\": a revive turn burns credits the\n * workspace no longer has.\n */\nexport const CREDIT_EXHAUSTION_MESSAGE =\n \"Out of OpenGeni credits — this workspace's balance is empty. Add credits to continue; the conversation is preserved.\";\n\n/**\n * Actionable composer copy for an edge rejection before a turn is accepted.\n * Unlike an in-flight credit exhaustion, this path has not consumed the\n * actor-private draft or any finalized attachment.\n */\nexport const COMPOSER_PAYMENT_REQUIRED_MESSAGE =\n \"This turn requires OpenGeni managed credits, but the account balance is empty. Add credits or choose a connected Codex subscription model, then retry. Your draft and attachments are preserved.\";\n\nexport function composerSubmissionErrorMessage(error: Error): string {\n return error instanceof OpenGeniApiError &&\n error.status === 402 &&\n error.code === \"payment_required\"\n ? COMPOSER_PAYMENT_REQUIRED_MESSAGE\n : error.message;\n}\n\n/**\n * Does this failure/completion payload (or raw error string) mean the\n * workspace ran out of OpenGeni credits? Matches the engine's\n * \"insufficient OpenGeni credits\" text (case-insensitive, substring — it\n * arrives both bare and wrapped in \"Activity task failed: …\") and the\n * budget-exhausted segment limit the engine stamps on a turn it ended early.\n */\nexport function isCreditExhaustion(\n input: { error?: string | null; detail?: string | null; segmentLimit?: string | null } | string,\n): boolean {\n if (typeof input === \"string\") {\n return input.toLowerCase().includes(\"insufficient opengeni credits\");\n }\n if (input.segmentLimit === \"budget_exhausted\") {\n return true;\n }\n for (const text of [input.error, input.detail]) {\n if (typeof text === \"string\" && text.toLowerCase().includes(\"insufficient opengeni credits\")) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Humanize engine/provider failure text before it reaches the timeline or a\n * failure banner. Raw provider errors leak the wrong audience's instructions —\n * \"Incorrect API key … find your API key at platform.openai.com\" tells a\n * managed-deployment USER to fix credentials only an OPERATOR controls (and is\n * flatly wrong for Azure or subscription-backed engines). Auth, quota, and\n * credit-exhaustion failures collapse to one neutral, honest sentence; every\n * other reason passes through untouched. Raw payloads stay available in the\n * debug surfaces.\n */\nexport function humanizeFailureReason(reason: string | null): string | null {\n if (!reason) {\n return reason;\n }\n if (isCreditExhaustion(reason)) {\n return CREDIT_EXHAUSTION_MESSAGE;\n }\n const normalized = reason.toLowerCase();\n const authFailure =\n normalized.includes(\"incorrect api key\") ||\n normalized.includes(\"invalid api key\") ||\n normalized.includes(\"invalid_api_key\") ||\n normalized.includes(\"platform.openai.com/account/api-keys\") ||\n (normalized.includes(\"401\") &&\n (normalized.includes(\"api key\") || normalized.includes(\"unauthorized\")));\n if (authFailure) {\n return \"The model provider rejected this deployment's engine credentials. Sending messages won't help until the deployment's engine configuration is fixed.\";\n }\n const quotaFailure =\n normalized.includes(\"insufficient_quota\") || normalized.includes(\"exceeded your current quota\");\n if (quotaFailure) {\n return \"The model provider refused the request: this deployment's provider quota is exhausted.\";\n }\n return reason;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hooks/use-composer.ts"],"sourcesContent":["import {\n DEFAULT_FILE_RESOURCE_MOUNT_ROOT,\n type ComposerDraft,\n type DraftTimelineAnnotation,\n type EffectiveControlResumeOption,\n type EffectiveSessionControl,\n type LatencyMode,\n type OpenGeniApiError,\n type ReasoningEffort,\n type ResourceRef,\n type SaveComposerDraftRequest,\n type SendMessageInput,\n type SessionEvent,\n type SubmitComposerDraftResponse,\n} from \"@opengeni/sdk\";\nimport { useCallback, useEffect, useLayoutEffect, useRef, useState } from \"react\";\nimport { useEmbeddedSession, type EmbeddedSessionClientOverride } from \"../session-context\";\nimport { useSessionEventTrigger, type SessionEventFeedOptions } from \"./internal\";\n\nexport type ComposerPolicy = {\n model: string;\n reasoningEffort: ReasoningEffort;\n latencyMode: LatencyMode;\n};\n\nexport type ComposerSendExtras = Omit<\n SendMessageInput,\n \"text\" | \"clientEventId\" | \"annotations\" | \"model\" | \"reasoningEffort\" | \"latencyMode\"\n>;\n\nexport type UseComposerOptions = EmbeddedSessionClientOverride &\n SessionEventFeedOptions & {\n /** Called synchronously after an ordinary Send is accepted by the local UI. */\n onSubmitted?: ((text: string, input: SendMessageInput) => void) | undefined;\n /** Called with the exact accepted wire input after a successful send. */\n onSent?: ((text: string, input: SendMessageInput) => void) | undefined;\n /** Called with the exact wire input after a delivery failure. */\n onDeliveryError?:\n | ((error: Error, input: SendMessageInput, delivery: \"send\" | \"steer\") => void)\n | undefined;\n /**\n * Non-policy message fields merged into every send. Durable policy belongs\n * to this composer draft; attachments and credentials may remain host-owned.\n */\n sendExtras?: ComposerSendExtras | (() => ComposerSendExtras) | undefined;\n /**\n * Fail-closed delivery guard evaluated at send time. Attachment hosts use\n * this to preserve unresolved upload cards until the operator waits,\n * retries, or removes them; direct hook callers cannot bypass the UI gate.\n */\n sendBlocked?: (() => boolean) | undefined;\n /** Latest server-derived workstream control; bound into Send/Steer OCC. */\n effectiveControl?: EffectiveSessionControl | null | undefined;\n /** Immediate user-visible destination for an ordinary Send before admission replies. */\n sendDestination?: (() => \"chat\" | \"queue\") | undefined;\n /** Disable remote composer-draft reads and writes for embedded hosts. */\n draftPersistence?: \"durable\" | \"disabled\" | undefined;\n /** Required explicit authority when durable draft persistence is disabled. */\n initialPolicy?: ComposerPolicy | undefined;\n };\n\ntype ComposerDraftShadow = {\n text: string;\n resources: ResourceRef[];\n annotations: DraftTimelineAnnotation[];\n policy?: ComposerPolicy | undefined;\n};\n\ntype PendingComposerOperation = {\n delivery: \"send\" | \"steer\";\n input: SendMessageInput;\n draftAtSend: string;\n resourcesAtSend: ResourceRef[];\n annotationsAtSend: DraftTimelineAnnotation[];\n /** Latest local text/resources that must survive an uncertain delivery. */\n newerShadow: ComposerDraftShadow;\n clearDraftOnAccept: boolean;\n /** False after remount when the original input carried secret credentials. */\n canRetry: boolean;\n};\n\ntype StoredPendingComposerOperation = Omit<PendingComposerOperation, \"input\" | \"canRetry\"> & {\n input: Omit<SendMessageInput, \"mcpCredentialUpdates\">;\n hasMcpCredentialUpdates: boolean;\n};\n\nexport type ComposerOptimisticMessage = {\n clientEventId: string;\n delivery: \"send\" | \"steer\";\n destination: \"chat\" | \"queue\";\n text: string;\n annotations: DraftTimelineAnnotation[];\n resources: ResourceRef[];\n occurredAt: string;\n state: \"sending\" | \"queued\" | \"failed\";\n turnId?: string | null | undefined;\n triggerEventId?: string | null | undefined;\n appliedQueueVersion?: number | null | undefined;\n error?: string | undefined;\n outcomeUnknown?: boolean | undefined;\n};\n\ntype OptimisticSendOperation = ComposerOptimisticMessage & {\n input: SendMessageInput;\n draftPayload: SaveComposerDraftRequest | null;\n /** Latest unsent local draft that must survive this operation and remounts. */\n newerShadow: ComposerDraftShadow;\n canRetry: boolean;\n};\n\ntype StoredOptimisticSendOperation = Omit<OptimisticSendOperation, \"input\" | \"canRetry\"> & {\n input: Omit<SendMessageInput, \"mcpCredentialUpdates\">;\n hasMcpCredentialUpdates: boolean;\n};\n\nconst PENDING_COMPOSER_STORAGE_PREFIX = \"opengeni.pending-composer.v1:\";\nconst OPTIMISTIC_SEND_STORAGE_PREFIX = \"opengeni.optimistic-sends.v1:\";\n// A remount must not manufacture a new operation while the previous mutation\n// is still outcome-unknown. Keep only non-credential request fields here; the\n// mounted hook retains the exact input, including any credential updates. The\n// safe shadow is also session-scoped so a refresh cannot lose newer edits.\nconst pendingComposerOperations = new Map<string, StoredPendingComposerOperation>();\nconst optimisticSendOperations = new Map<string, StoredOptimisticSendOperation[]>();\n\nfunction pendingComposerOperationKey(\n workspaceId: string,\n sessionId: string | null | undefined,\n): string | null {\n return sessionId ? `${workspaceId}\\u0000${sessionId}` : null;\n}\n\nfunction pendingComposerStorage(): Storage | null {\n try {\n return typeof window === \"undefined\" ? null : window.sessionStorage;\n } catch {\n return null;\n }\n}\n\nfunction pendingComposerStorageKey(key: string): string {\n return `${PENDING_COMPOSER_STORAGE_PREFIX}${encodeURIComponent(key)}`;\n}\n\nfunction optimisticSendStorageKey(key: string): string {\n return `${OPTIMISTIC_SEND_STORAGE_PREFIX}${encodeURIComponent(key)}`;\n}\n\nfunction restoreOptimisticSendOperations(key: string | null): OptimisticSendOperation[] {\n if (!key) return [];\n let stored = optimisticSendOperations.get(key);\n if (!stored) {\n const storage = pendingComposerStorage();\n try {\n const parsed: unknown = JSON.parse(storage?.getItem(optimisticSendStorageKey(key)) ?? \"[]\");\n stored = Array.isArray(parsed)\n ? (parsed.filter(\n (candidate): candidate is StoredOptimisticSendOperation =>\n typeof candidate === \"object\" &&\n candidate !== null &&\n typeof candidate.clientEventId === \"string\" &&\n typeof candidate.text === \"string\" &&\n typeof candidate.occurredAt === \"string\" &&\n (candidate.state === \"sending\" || candidate.state === \"failed\") &&\n typeof candidate.input === \"object\" &&\n candidate.input !== null &&\n typeof candidate.input.text === \"string\" &&\n typeof candidate.hasMcpCredentialUpdates === \"boolean\",\n ) as StoredOptimisticSendOperation[])\n : [];\n } catch {\n stored = [];\n }\n }\n return stored.map(({ hasMcpCredentialUpdates, ...operation }) => ({\n ...operation,\n delivery: \"send\",\n destination: operation.destination === \"queue\" ? \"queue\" : \"chat\",\n newerShadow: operation.newerShadow ?? { text: \"\", resources: [], annotations: [] },\n state:\n operation.state === \"sending\" || operation.state === \"queued\" ? \"sending\" : operation.state,\n outcomeUnknown:\n operation.state === \"sending\" || operation.state === \"queued\"\n ? true\n : operation.outcomeUnknown,\n error:\n operation.state === \"sending\"\n ? \"Delivery was interrupted; retry to reconcile this message.\"\n : operation.error,\n input: operation.input,\n canRetry: !hasMcpCredentialUpdates,\n }));\n}\n\nfunction rememberOptimisticSendOperations(\n key: string | null,\n operations: OptimisticSendOperation[],\n): void {\n if (!key) return;\n const stored = operations\n .filter((operation) => operation.state !== \"queued\")\n .map((operation) => {\n const { canRetry: _canRetry, input, ...rest } = operation;\n const { mcpCredentialUpdates: _credentials, ...safeInput } = input;\n return {\n ...rest,\n input: safeInput,\n hasMcpCredentialUpdates: input.mcpCredentialUpdates !== undefined,\n } satisfies StoredOptimisticSendOperation;\n });\n if (stored.length === 0) {\n optimisticSendOperations.delete(key);\n try {\n pendingComposerStorage()?.removeItem(optimisticSendStorageKey(key));\n } catch {\n // Best effort; the in-memory entry is already gone.\n }\n return;\n }\n optimisticSendOperations.set(key, stored);\n try {\n pendingComposerStorage()?.setItem(optimisticSendStorageKey(key), JSON.stringify(stored));\n } catch {\n // Best effort; the in-memory queue still owns this mount.\n }\n}\n\nfunction resourceList(value: unknown): value is ResourceRef[] {\n return (\n Array.isArray(value) &&\n value.every((candidate) => {\n if (typeof candidate !== \"object\" || candidate === null) return false;\n const resource = candidate as Record<string, unknown>;\n return resource.kind === \"file\"\n ? typeof resource.fileId === \"string\"\n : resource.kind === \"repository\" &&\n typeof resource.uri === \"string\" &&\n typeof resource.ref === \"string\";\n })\n );\n}\n\nfunction timelineAnnotationList(value: unknown): value is DraftTimelineAnnotation[] {\n return (\n Array.isArray(value) &&\n value.every((candidate) => {\n if (typeof candidate !== \"object\" || candidate === null) return false;\n const annotation = candidate as Record<string, unknown>;\n const source = annotation.source;\n if (typeof source !== \"object\" || source === null) return false;\n const sourceRecord = source as Record<string, unknown>;\n return (\n typeof annotation.id === \"string\" &&\n typeof annotation.quote === \"string\" &&\n typeof annotation.note === \"string\" &&\n typeof sourceRecord.eventId === \"string\" &&\n typeof sourceRecord.eventType === \"string\" &&\n typeof sourceRecord.sequence === \"number\" &&\n (typeof sourceRecord.turnId === \"string\" || sourceRecord.turnId === null) &&\n typeof sourceRecord.startOffset === \"number\" &&\n typeof sourceRecord.endOffset === \"number\" &&\n typeof sourceRecord.contextBefore === \"string\" &&\n typeof sourceRecord.contextAfter === \"string\"\n );\n })\n );\n}\n\nfunction cloneAnnotations(\n annotations: readonly DraftTimelineAnnotation[],\n): DraftTimelineAnnotation[] {\n return annotations.map((annotation) => ({\n ...annotation,\n source: { ...annotation.source },\n }));\n}\n\nfunction readStoredPendingComposerOperation(\n key: string | null,\n): StoredPendingComposerOperation | null {\n const storage = key ? pendingComposerStorage() : null;\n if (!storage || !key) return null;\n try {\n const parsed: unknown = JSON.parse(storage.getItem(pendingComposerStorageKey(key)) ?? \"null\");\n if (typeof parsed !== \"object\" || parsed === null) return null;\n const record = parsed as Record<string, unknown>;\n const input = record.input;\n const shadow = record.newerShadow;\n if (\n typeof input !== \"object\" ||\n input === null ||\n typeof shadow !== \"object\" ||\n shadow === null\n ) {\n return null;\n }\n const inputRecord = input as Record<string, unknown>;\n const shadowRecord = shadow as Record<string, unknown>;\n if (\n (record.delivery !== \"send\" && record.delivery !== \"steer\") ||\n typeof record.draftAtSend !== \"string\" ||\n !resourceList(record.resourcesAtSend) ||\n (record.annotationsAtSend !== undefined &&\n !timelineAnnotationList(record.annotationsAtSend)) ||\n typeof shadowRecord.text !== \"string\" ||\n !resourceList(shadowRecord.resources) ||\n (shadowRecord.annotations !== undefined &&\n !timelineAnnotationList(shadowRecord.annotations)) ||\n typeof record.clearDraftOnAccept !== \"boolean\" ||\n typeof record.hasMcpCredentialUpdates !== \"boolean\" ||\n typeof inputRecord.text !== \"string\" ||\n typeof inputRecord.clientEventId !== \"string\" ||\n \"mcpCredentialUpdates\" in inputRecord ||\n (\"resources\" in inputRecord && !resourceList(inputRecord.resources)) ||\n (\"annotations\" in inputRecord && !timelineAnnotationList(inputRecord.annotations))\n ) {\n return null;\n }\n return {\n ...(record as StoredPendingComposerOperation),\n annotationsAtSend: timelineAnnotationList(record.annotationsAtSend)\n ? record.annotationsAtSend\n : [],\n newerShadow: {\n ...(shadow as ComposerDraftShadow),\n annotations: timelineAnnotationList(shadowRecord.annotations)\n ? shadowRecord.annotations\n : [],\n },\n };\n } catch {\n return null;\n }\n}\n\nfunction writePendingComposerOperation(\n key: string,\n operation: StoredPendingComposerOperation,\n): void {\n const storage = pendingComposerStorage();\n if (!storage) return;\n try {\n storage.setItem(pendingComposerStorageKey(key), JSON.stringify(operation));\n } catch {\n // Storage is best effort; the in-memory record still protects remounts.\n }\n}\n\nfunction restorePendingComposerOperation(key: string | null): PendingComposerOperation | null {\n const stored =\n (key && pendingComposerOperations.get(key)) ?? readStoredPendingComposerOperation(key);\n if (!stored) return null;\n return {\n ...stored,\n input: stored.input,\n newerShadow: stored.newerShadow ?? {\n text: stored.draftAtSend,\n resources: stored.resourcesAtSend,\n annotations: stored.annotationsAtSend,\n },\n canRetry: !stored.hasMcpCredentialUpdates,\n };\n}\n\nfunction rememberPendingComposerOperation(\n key: string | null,\n operation: PendingComposerOperation,\n): void {\n if (!key) return;\n const { canRetry: _retry, ...safeOperation } = operation;\n const { input: originalInput, ...withoutInput } = safeOperation;\n const { mcpCredentialUpdates: _storedMcp, ...safeInput } = originalInput;\n const stored = {\n ...withoutInput,\n input: safeInput,\n hasMcpCredentialUpdates: operation.input.mcpCredentialUpdates !== undefined,\n newerShadow: {\n text: operation.newerShadow.text,\n resources: [...operation.newerShadow.resources],\n annotations: cloneAnnotations(operation.newerShadow.annotations),\n ...(operation.newerShadow.policy ? { policy: { ...operation.newerShadow.policy } } : {}),\n },\n } satisfies StoredPendingComposerOperation;\n pendingComposerOperations.set(key, stored);\n writePendingComposerOperation(key, stored);\n}\n\nfunction forgetPendingComposerOperation(key: string | null): void {\n if (!key) return;\n pendingComposerOperations.delete(key);\n const storage = pendingComposerStorage();\n if (!storage) return;\n try {\n storage.removeItem(pendingComposerStorageKey(key));\n } catch {\n // Ignore a blocked storage implementation; delivery has already settled.\n }\n}\n\nfunction updatePendingComposerShadow(\n key: string | null,\n operation: PendingComposerOperation | null,\n shadow: ComposerDraftShadow,\n): PendingComposerOperation | null {\n if (!key || !operation) return operation;\n const next = {\n ...operation,\n newerShadow: {\n ...shadow,\n resources: [...shadow.resources],\n annotations: cloneAnnotations(shadow.annotations),\n },\n };\n rememberPendingComposerOperation(key, next);\n return next;\n}\n\nexport type ComposerState = {\n value: string;\n setValue: (value: string) => void;\n annotations?: DraftTimelineAnnotation[] | undefined;\n addAnnotation?: ((annotation: DraftTimelineAnnotation) => void) | undefined;\n updateAnnotation?: ((id: string, note: string) => void) | undefined;\n removeAnnotation?: ((id: string) => void) | undefined;\n /** Newly captured annotation the review surface should focus. */\n annotationReviewTargetId?: string | null | undefined;\n clearAnnotationReviewTarget?: (() => void) | undefined;\n /** Read the current draft synchronously before a destructive replacement. */\n hasDraftContent: () => boolean;\n /** Append the draft behind prompts already visible in the queue. */\n send: (text?: string) => Promise<boolean>;\n /** Locally acknowledged ordinary sends awaiting durable timeline reconciliation. */\n optimisticMessages?: ComposerOptimisticMessage[] | undefined;\n retryOptimisticMessage?: ((clientEventId: string) => void) | undefined;\n removeOptimisticMessage?: ((clientEventId: string) => void) | undefined;\n /** Supersede current direction with the draft. */\n steer: (text?: string) => Promise<boolean>;\n /** Optimistic-to-durable projection for a Steer that has not started yet. */\n steering?: ComposerSteeringState | null | undefined;\n /** Immediate mutation-receipt projection while physical cancellation settles. */\n stoppingAttempt?: \"current\" | \"previous\" | null | undefined;\n sending: boolean;\n canSend: boolean;\n /** Pause the session without deleting its prompt queue. */\n pause: (reason?: string) => Promise<void>;\n pausing: boolean;\n resume: (reason?: string) => Promise<void>;\n resumeScope: (option: EffectiveControlResumeOption) => Promise<void>;\n resuming: boolean;\n /** Mutation-confirmed control while the streamed queue projection catches up. */\n effectiveControl?: EffectiveSessionControl | null | undefined;\n draft: ComposerDraft | null;\n draftRevision: number;\n draftLoading: boolean;\n draftSaving: boolean;\n draftConflict: Error | null;\n /** Exact policy owned by this actor/session composer. Null while hydrating. */\n policy?: ComposerPolicy | null | undefined;\n setModel?: ((model: string) => void) | undefined;\n setReasoningEffort?: ((effort: ReasoningEffort) => void) | undefined;\n setLatencyMode?: ((mode: LatencyMode) => void) | undefined;\n /** Whether this controller owns a durable server-side draft. */\n draftPersistence?: \"durable\" | \"disabled\" | undefined;\n /** Apply an atomic queue Edit checkout without a second read. */\n applyDraft: (draft: ComposerDraft) => void;\n reloadDraft: () => Promise<void>;\n resolveDraftConflict: (choice: \"keep_mine\" | \"use_remote\") => Promise<void>;\n restoredResources: ResourceRef[];\n removeRestoredResource: (index: number) => void;\n error: Error | null;\n clearError: () => void;\n};\n\nexport type ComposerControllerState = ComposerState & {\n policy: ComposerPolicy | null;\n setModel: (model: string) => void;\n setReasoningEffort: (effort: ReasoningEffort) => void;\n setLatencyMode: (mode: LatencyMode) => void;\n};\n\nexport type ComposerSteeringState = {\n phase: \"submitting\" | \"accepted\" | \"failed\";\n text: string;\n clientEventId: string | null;\n triggerEventId: string | null;\n turnId: string | null;\n /** True only when the accepted Steer durably interrupted a live attempt. */\n stoppingPreviousAttempt?: boolean | undefined;\n error?: string | undefined;\n outcomeUnknown?: boolean | undefined;\n};\n\nconst STEERING_SETTLEMENT_EVENT_TYPES = new Set([\n \"turn.started\",\n \"turn.completed\",\n \"turn.failed\",\n \"turn.cancelled\",\n \"turn.superseded\",\n]);\n\nfunction isSteeringSettlementEvent(event: SessionEvent): boolean {\n return STEERING_SETTLEMENT_EVENT_TYPES.has(event.type);\n}\n\nfunction steeringAcceptedEvent(\n steering: ComposerSteeringState,\n events: readonly SessionEvent[],\n): SessionEvent | undefined {\n return events.find(\n (event) =>\n event.type === \"user.message\" &&\n steering.clientEventId !== null &&\n event.clientEventId === steering.clientEventId,\n );\n}\n\nfunction promptTurnIdForTrigger(\n triggerEventId: string | null | undefined,\n events: readonly SessionEvent[],\n): string | null {\n if (!triggerEventId) return null;\n const queued = events.find((event) => {\n if (event.type !== \"turn.queued\") return false;\n const payload = event.payload;\n return (\n typeof payload === \"object\" &&\n payload !== null &&\n \"triggerEventId\" in payload &&\n payload.triggerEventId === triggerEventId\n );\n });\n if (!queued) return null;\n if (queued.turnId) return queued.turnId;\n const payload = queued.payload;\n return typeof payload === \"object\" &&\n payload !== null &&\n \"turnId\" in payload &&\n typeof payload.turnId === \"string\"\n ? payload.turnId\n : null;\n}\n\nfunction steeringSettledByEvents(\n steering: ComposerSteeringState,\n events: readonly SessionEvent[],\n): boolean {\n const acceptedEventId =\n steering.triggerEventId ?? steeringAcceptedEvent(steering, events)?.id ?? null;\n return events.some((event) => {\n if (steering.turnId && event.turnId === steering.turnId && isSteeringSettlementEvent(event)) {\n return true;\n }\n if (event.type !== \"turn.started\" || !acceptedEventId) return false;\n const payload = event.payload;\n return (\n typeof payload === \"object\" &&\n payload !== null &&\n \"triggerEventId\" in payload &&\n payload.triggerEventId === acceptedEventId\n );\n });\n}\n\nfunction reconcileOptimisticSendFromEvents(\n operation: OptimisticSendOperation,\n events: readonly SessionEvent[],\n): { operation: OptimisticSendOperation; admitted: boolean; settled: boolean } {\n const accepted = events.find(\n (event) => event.type === \"user.message\" && event.clientEventId === operation.clientEventId,\n );\n const triggerEventId = operation.triggerEventId ?? accepted?.id ?? null;\n const turnId = operation.turnId ?? promptTurnIdForTrigger(triggerEventId, events);\n const needsAdmissionUpdate =\n accepted !== undefined &&\n (operation.state !== \"queued\" ||\n operation.triggerEventId !== triggerEventId ||\n operation.turnId !== turnId ||\n operation.error !== undefined ||\n operation.outcomeUnknown !== false);\n const reconciled: OptimisticSendOperation = needsAdmissionUpdate\n ? {\n ...operation,\n state: \"queued\",\n triggerEventId,\n turnId,\n error: undefined,\n outcomeUnknown: false,\n }\n : operation;\n const withdrawnFromQueue = events.some((event) => {\n if (event.type !== \"session.queue.changed\" || !turnId) return false;\n const payload = event.payload;\n if (typeof payload !== \"object\" || payload === null || Array.isArray(payload)) return false;\n const record = payload as Record<string, unknown>;\n return (\n record.turnId === turnId && (record.operation === \"edit\" || record.operation === \"delete\")\n );\n });\n return {\n operation: reconciled,\n admitted: accepted !== undefined,\n // Edit/Delete atomically withdraw the queued turn. Keeping its optimistic\n // send alive after that point lets its old `newerShadow` become the newest\n // composer draft again when a later turn settles, duplicating submitted\n // text. The queue mutation is the durable terminal fact for this send.\n settled:\n withdrawnFromQueue ||\n steeringSettledByEvents(\n {\n phase: \"accepted\",\n text: reconciled.text,\n clientEventId: reconciled.clientEventId,\n triggerEventId: reconciled.triggerEventId ?? null,\n turnId: reconciled.turnId ?? null,\n },\n events,\n ),\n };\n}\n\n/**\n * Draft + send + Pause/Resume state for the chat composer — the only\n * human-to-agent input surface. The draft survives a failed send (nothing is\n * more hostile than losing a typed message); each send carries a generated\n * `clientEventId` so retries stay idempotent server-side.\n */\nexport function useComposer(\n sessionId: string | null | undefined,\n options: UseComposerOptions = {},\n): ComposerControllerState {\n const { client, workspaceId, registerSessionReconciler } = useEmbeddedSession(options);\n const durableDrafts = options.draftPersistence !== \"disabled\";\n if (!durableDrafts && !options.initialPolicy) {\n throw new Error(\"useComposer requires initialPolicy when draft persistence is disabled\");\n }\n const targetKey = `${workspaceId}\\u0000${sessionId ?? \"\"}\\u0000${durableDrafts ? \"durable\" : \"disabled\"}`;\n const pendingOperationKey = pendingComposerOperationKey(workspaceId, sessionId);\n const initialPendingOperation = restorePendingComposerOperation(pendingOperationKey);\n const initialOptimisticSends = restoreOptimisticSendOperations(pendingOperationKey);\n const initialShadow =\n initialPendingOperation?.newerShadow ?? initialOptimisticSends.at(-1)?.newerShadow;\n const [value, setValue] = useState(() => initialShadow?.text ?? \"\");\n const [annotations, setAnnotations] = useState<DraftTimelineAnnotation[]>(\n () => initialShadow?.annotations ?? [],\n );\n const [annotationReviewTargetId, setAnnotationReviewTargetId] = useState<string | null>(null);\n // Keep rendered state behind the committed target identity for one frame:\n // a parent may switch sessionId without remounting this public hook.\n const [stateTargetKey, setStateTargetKey] = useState(targetKey);\n const [sending, setSending] = useState(false);\n const [optimisticSends, setOptimisticSends] =\n useState<OptimisticSendOperation[]>(initialOptimisticSends);\n const [steering, setSteering] = useState<ComposerSteeringState | null>(() =>\n initialPendingOperation?.delivery === \"steer\"\n ? {\n phase: \"failed\",\n text: initialPendingOperation.input.text,\n clientEventId: initialPendingOperation.input.clientEventId ?? null,\n triggerEventId: null,\n turnId: null,\n error: \"Not confirmed. Retry to check the same direction change.\",\n outcomeUnknown: true,\n }\n : null,\n );\n const [pausing, setPausing] = useState(false);\n const [acceptedControl, setAcceptedControl] = useState<EffectiveSessionControl | null>(null);\n const [resuming, setResuming] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [draft, setDraft] = useState<ComposerDraft | null>(null);\n const [draftLoading, setDraftLoading] = useState(Boolean(sessionId) && durableDrafts);\n const [draftSaving, setDraftSaving] = useState(false);\n const [draftConflict, setDraftConflict] = useState<Error | null>(null);\n const [policy, setPolicy] = useState<ComposerPolicy | null>(\n () => initialShadow?.policy ?? options.initialPolicy ?? null,\n );\n const [restoredResources, setRestoredResources] = useState<ResourceRef[]>(\n () => initialShadow?.resources ?? [],\n );\n const pendingOperationRef = useRef<PendingComposerOperation | null>(initialPendingOperation);\n const optimisticSendsRef = useRef<OptimisticSendOperation[]>(initialOptimisticSends);\n const optimisticProcessorBusyRef = useRef(false);\n const optimisticCallbackIdsRef = useRef(new Set<string>());\n const steeringSettlementEventsRef = useRef<SessionEvent[]>([]);\n const steeringRef = useRef(steering);\n const steeringOccurredAtRef = useRef(new Date().toISOString());\n const pendingClientEventId = useRef<string | null>(\n initialPendingOperation?.input.clientEventId ?? null,\n );\n const valueRef = useRef(initialShadow?.text ?? \"\");\n const annotationsRef = useRef<DraftTimelineAnnotation[]>(initialShadow?.annotations ?? []);\n const policyRef = useRef<ComposerPolicy | null>(\n initialShadow?.policy ?? options.initialPolicy ?? null,\n );\n const draftRef = useRef<ComposerDraft | null>(null);\n const restoredResourcesRef = useRef<ResourceRef[]>(initialShadow?.resources ?? []);\n const localEditRevision = useRef(initialShadow ? 1 : 0);\n const targetGeneration = useRef(0);\n const draftReadGeneration = useRef(0);\n const draftReadInFlightRef = useRef<string | null>(null);\n const draftReadRetryRef = useRef<{\n targetKey: string;\n failures: number;\n timer: ReturnType<typeof setTimeout> | null;\n }>({ targetKey, failures: 0, timer: null });\n const lastSavedSignature = useRef<string | null>(null);\n const saveChain = useRef<Promise<void>>(Promise.resolve());\n const onSent = options.onSent;\n const onSubmitted = options.onSubmitted;\n const onDeliveryErrorRef = useRef(options.onDeliveryError);\n onDeliveryErrorRef.current = options.onDeliveryError;\n useLayoutEffect(() => {\n steeringRef.current = steering;\n }, [steering]);\n // Read through a ref so a new extras closure (created every render by\n // callers passing inline functions) does not invalidate `send`.\n const sendExtrasRef = useRef(options.sendExtras);\n sendExtrasRef.current = options.sendExtras;\n const sendDestinationRef = useRef(options.sendDestination);\n sendDestinationRef.current = options.sendDestination;\n const sendBlockedRef = useRef(options.sendBlocked);\n sendBlockedRef.current = options.sendBlocked;\n const effectiveControlRef = useRef<EffectiveSessionControl | null>(\n acceptedControl ?? options.effectiveControl ?? null,\n );\n effectiveControlRef.current = acceptedControl ?? options.effectiveControl ?? null;\n const liveExtrasVersion = JSON.stringify(resolveSendExtras(options.sendExtras));\n\n // A composer is bound to one session: switching targets must not leak the\n // previous session's draft, error, or retry idempotency key.\n const targetKeyRef = useRef(targetKey);\n useLayoutEffect(() => {\n if (targetKeyRef.current === targetKey) return;\n if (draftReadRetryRef.current.timer !== null) {\n clearTimeout(draftReadRetryRef.current.timer);\n }\n draftReadRetryRef.current = { targetKey, failures: 0, timer: null };\n targetKeyRef.current = targetKey;\n targetGeneration.current += 1;\n draftReadGeneration.current += 1;\n pendingOperationRef.current = restorePendingComposerOperation(pendingOperationKey);\n const restoredOptimisticSends = restoreOptimisticSendOperations(pendingOperationKey);\n optimisticSendsRef.current = restoredOptimisticSends;\n optimisticProcessorBusyRef.current = false;\n optimisticCallbackIdsRef.current = new Set();\n steeringSettlementEventsRef.current = [];\n pendingClientEventId.current = pendingOperationRef.current?.input.clientEventId ?? null;\n const shadow =\n pendingOperationRef.current?.newerShadow ?? restoredOptimisticSends.at(-1)?.newerShadow;\n localEditRevision.current = shadow ? 1 : 0;\n valueRef.current = shadow?.text ?? \"\";\n annotationsRef.current = shadow?.annotations ?? [];\n policyRef.current = shadow?.policy ?? options.initialPolicy ?? null;\n draftRef.current = null;\n restoredResourcesRef.current = shadow?.resources ?? [];\n lastSavedSignature.current = null;\n // Old saves may still be awaiting the network. Their generation fence\n // prevents settlement, and a fresh chain avoids blocking this target.\n saveChain.current = Promise.resolve();\n setStateTargetKey(targetKey);\n setValue(shadow?.text ?? \"\");\n setAnnotations(shadow?.annotations ?? []);\n setPolicy(policyRef.current);\n setAnnotationReviewTargetId(null);\n setSending(false);\n setOptimisticSends(restoredOptimisticSends);\n setSteering(\n pendingOperationRef.current?.delivery === \"steer\"\n ? {\n phase: \"failed\",\n text: pendingOperationRef.current.input.text,\n clientEventId: pendingOperationRef.current.input.clientEventId ?? null,\n triggerEventId: null,\n turnId: null,\n error: \"Not confirmed. Retry to check the same direction change.\",\n outcomeUnknown: true,\n }\n : null,\n );\n setPausing(false);\n setAcceptedControl(null);\n setResuming(false);\n setError(null);\n setDraft(null);\n setDraftLoading(Boolean(sessionId) && durableDrafts);\n setDraftSaving(false);\n setDraftConflict(null);\n setRestoredResources(shadow?.resources ?? []);\n }, [durableDrafts, options.initialPolicy, pendingOperationKey, sessionId, targetKey]);\n useEffect(\n () => () => {\n if (draftReadRetryRef.current.timer !== null) {\n clearTimeout(draftReadRetryRef.current.timer);\n }\n },\n [],\n );\n\n const setOptimisticDraftShadow = useCallback(\n (shadow: ComposerDraftShadow): void => {\n if (optimisticSendsRef.current.length === 0) return;\n const next = optimisticSendsRef.current.map((operation) => ({\n ...operation,\n newerShadow: {\n text: shadow.text,\n resources: [...shadow.resources],\n annotations: cloneAnnotations(shadow.annotations),\n ...(shadow.policy ? { policy: { ...shadow.policy } } : {}),\n },\n }));\n optimisticSendsRef.current = next;\n rememberOptimisticSendOperations(pendingOperationKey, next);\n setOptimisticSends(next);\n },\n [pendingOperationKey],\n );\n\n const applyDraft = useCallback(\n (next: ComposerDraft): void => {\n if (targetKeyRef.current !== targetKey) return;\n if (!durableDrafts) {\n const nextPolicy = policyFromDraft(next);\n localEditRevision.current += 1;\n valueRef.current = next.text;\n annotationsRef.current = next.annotations ?? [];\n policyRef.current = nextPolicy;\n restoredResourcesRef.current = next.resources;\n draftRef.current = null;\n lastSavedSignature.current = null;\n setDraft(null);\n setValue(next.text);\n setAnnotations(next.annotations ?? []);\n setPolicy(nextPolicy);\n setRestoredResources(next.resources);\n pendingOperationRef.current = updatePendingComposerShadow(\n pendingOperationKey,\n pendingOperationRef.current,\n {\n text: next.text,\n resources: mergeResources(\n next.resources,\n resolveSendExtras(sendExtrasRef.current).resources ?? [],\n ),\n annotations: next.annotations ?? [],\n policy: nextPolicy,\n },\n );\n setOptimisticDraftShadow({\n text: next.text,\n resources: mergeResources(\n next.resources,\n resolveSendExtras(sendExtrasRef.current).resources ?? [],\n ),\n annotations: next.annotations ?? [],\n policy: nextPolicy,\n });\n setDraftConflict(null);\n return;\n }\n const nextPolicy = policyFromDraft(next);\n valueRef.current = next.text;\n annotationsRef.current = next.annotations ?? [];\n policyRef.current = nextPolicy;\n draftRef.current = next;\n restoredResourcesRef.current = next.resources;\n lastSavedSignature.current = draftSignature(draftPayload(next));\n localEditRevision.current += 1;\n setDraft(next);\n setValue(next.text);\n setAnnotations(next.annotations ?? []);\n setPolicy(nextPolicy);\n setRestoredResources(next.resources);\n pendingOperationRef.current = updatePendingComposerShadow(\n pendingOperationKey,\n pendingOperationRef.current,\n {\n text: next.text,\n resources: mergeResources(\n next.resources,\n resolveSendExtras(sendExtrasRef.current).resources ?? [],\n ),\n annotations: next.annotations ?? [],\n policy: nextPolicy,\n },\n );\n setOptimisticDraftShadow({\n text: next.text,\n resources: mergeResources(\n next.resources,\n resolveSendExtras(sendExtrasRef.current).resources ?? [],\n ),\n annotations: next.annotations ?? [],\n policy: nextPolicy,\n });\n setDraftConflict(null);\n },\n [durableDrafts, pendingOperationKey, setOptimisticDraftShadow, targetKey],\n );\n\n const loadDraft = useCallback(\n async (replaceLocal: boolean): Promise<void> => {\n if (targetKeyRef.current !== targetKey) return;\n if (!sessionId || !durableDrafts) {\n setDraftLoading(false);\n return;\n }\n let retry = draftReadRetryRef.current;\n if (retry.targetKey !== targetKey) {\n if (retry.timer !== null) clearTimeout(retry.timer);\n retry = { targetKey, failures: 0, timer: null };\n draftReadRetryRef.current = retry;\n }\n const scheduleRetry = (): void => {\n if (retry.timer !== null) return;\n retry.timer = setTimeout(\n () => {\n if (draftReadRetryRef.current !== retry || targetKeyRef.current !== targetKey) return;\n retry.timer = null;\n void loadDraft(false);\n },\n Math.min(25_000, 1_000 * 2 ** (retry.failures - 1)) * (0.8 + Math.random() * 0.4),\n );\n };\n if (!replaceLocal && retry.timer !== null) return;\n if (draftReadInFlightRef.current === targetKey) return;\n if (retry.timer !== null) {\n clearTimeout(retry.timer);\n retry.timer = null;\n }\n draftReadInFlightRef.current = targetKey;\n const generation = targetGeneration.current;\n const readTicket = ++draftReadGeneration.current;\n const localAtStart = localEditRevision.current;\n const baseAtStart = draftRef.current;\n const policyAtStart = policyRef.current;\n const localSignatureAtStart = baseAtStart\n ? policyAtStart\n ? draftSignature(\n composerDraftPayload(\n baseAtStart,\n valueRef.current,\n restoredResourcesRef.current,\n annotationsRef.current,\n policyAtStart,\n resolveSendExtras(sendExtrasRef.current).resources ?? [],\n ),\n )\n : null\n : null;\n const localWasDirtyAtStart =\n localSignatureAtStart === null\n ? localAtStart !== 0\n : localSignatureAtStart !== lastSavedSignature.current;\n // Only blank the picker on first hydrate / hard reload. Reconcile and\n // event-triggered soft reloads (loadOlder SSE reconnect) must not flicker\n // draftLoading — stale-while-revalidate keeps the settled UI mounted.\n const showLoading = replaceLocal || draftRef.current === null;\n if (showLoading) {\n setDraftLoading(true);\n }\n try {\n const fetched = await client.getComposerDraft(workspaceId, sessionId);\n if (\n generation !== targetGeneration.current ||\n targetKeyRef.current !== targetKey ||\n readTicket !== draftReadGeneration.current\n ) {\n return;\n }\n if (retry.timer !== null) clearTimeout(retry.timer);\n retry.failures = 0;\n retry.timer = null;\n const currentRevision = draftRef.current?.revision ?? -1;\n // Reconnect and client-generation effects can legitimately ask for the\n // draft again. A same-revision response is not new authority: publishing\n // its freshly decoded object back into React creates a response -> render\n // -> read feedback loop. Hard reload remains the explicit exception.\n if (replaceLocal || fetched.revision > currentRevision) {\n draftRef.current = fetched;\n setDraft(fetched);\n setDraftConflict(null);\n const shadow =\n pendingOperationRef.current?.newerShadow ??\n optimisticSendsRef.current.at(-1)?.newerShadow;\n if (shadow) {\n // The server can only know the original operation. Never replace\n // newer local edits while that operation is still uncertain.\n valueRef.current = shadow.text;\n restoredResourcesRef.current = shadow.resources;\n annotationsRef.current = shadow.annotations;\n if (shadow.policy) policyRef.current = shadow.policy;\n localEditRevision.current ||= 1;\n setValue(shadow.text);\n setRestoredResources(shadow.resources);\n setAnnotations(shadow.annotations);\n if (shadow.policy) setPolicy(shadow.policy);\n } else if (\n replaceLocal ||\n (!localWasDirtyAtStart && localAtStart === localEditRevision.current)\n ) {\n const fetchedPolicy = policyFromDraft(fetched);\n valueRef.current = fetched.text;\n restoredResourcesRef.current = fetched.resources;\n annotationsRef.current = fetched.annotations ?? [];\n policyRef.current = fetchedPolicy;\n lastSavedSignature.current = draftSignature(draftPayload(fetched));\n setValue(fetched.text);\n setRestoredResources(fetched.resources);\n setAnnotations(fetched.annotations ?? []);\n setPolicy(fetchedPolicy);\n } else {\n // Keep the in-flight edit, but the fetched row is still the OCC\n // base. First hydrate has no local policy until this read lands;\n // without it autosave cannot persist the typed text.\n lastSavedSignature.current = draftSignature(draftPayload(fetched));\n if (!policyRef.current) {\n const fetchedPolicy = policyFromDraft(fetched);\n policyRef.current = fetchedPolicy;\n setPolicy(fetchedPolicy);\n }\n }\n }\n } catch (cause) {\n if (\n generation === targetGeneration.current &&\n targetKeyRef.current === targetKey &&\n readTicket === draftReadGeneration.current\n ) {\n setError(asError(cause));\n if (\n cause instanceof TypeError ||\n (cause && typeof cause === \"object\" && \"retryable\" in cause && cause.retryable === true)\n ) {\n retry.failures += 1;\n scheduleRetry();\n } else {\n if (retry.timer !== null) clearTimeout(retry.timer);\n retry.failures = 0;\n retry.timer = null;\n }\n }\n } finally {\n if (\n generation === targetGeneration.current &&\n targetKeyRef.current === targetKey &&\n readTicket === draftReadGeneration.current\n ) {\n setDraftLoading(false);\n }\n if (draftReadInFlightRef.current === targetKey) {\n draftReadInFlightRef.current = null;\n }\n }\n },\n [client, durableDrafts, sessionId, targetKey, workspaceId],\n );\n\n useEffect(() => {\n if (!sessionId || !durableDrafts) {\n setDraftLoading(false);\n return;\n }\n void loadDraft(false);\n }, [durableDrafts, loadDraft, sessionId]);\n // After long background / sleep the in-memory revision is often stale while\n // a prior autosave already advanced the server. Soft-reload on wake so the\n // next keystroke does not OCC against a dead revision.\n useEffect(() => {\n if (!sessionId || !durableDrafts) return;\n const onWake = () => {\n if (typeof document !== \"undefined\" && document.visibilityState === \"hidden\") return;\n void loadDraft(false);\n };\n document.addEventListener(\"visibilitychange\", onWake);\n window.addEventListener(\"pageshow\", onWake);\n return () => {\n document.removeEventListener(\"visibilitychange\", onWake);\n window.removeEventListener(\"pageshow\", onWake);\n };\n }, [durableDrafts, loadDraft, sessionId]);\n useEffect(() => {\n if (!sessionId || !durableDrafts) return;\n return registerSessionReconciler(sessionId, \"composer\", async () => await loadDraft(false));\n }, [durableDrafts, loadDraft, registerSessionReconciler, sessionId]);\n const reconcileSteering = useCallback(async (): Promise<void> => {\n if (!sessionId || !steeringRef.current) return;\n const ownedTargetKey = targetKey;\n let events: SessionEvent[];\n try {\n events = await client.listEvents(workspaceId, sessionId, {\n includeTypes: [\n \"user.message\",\n \"turn.started\",\n \"turn.completed\",\n \"turn.failed\",\n \"turn.cancelled\",\n \"turn.superseded\",\n ],\n limit: 250,\n payloadMode: \"full\",\n });\n } catch {\n // Best effort: the live stream still settles steering when its event arrives.\n return;\n }\n if (targetKeyRef.current !== ownedTargetKey) return;\n setSteering((current) => {\n if (!current) return current;\n if (steeringSettledByEvents(current, events)) {\n steeringSettlementEventsRef.current = [];\n return null;\n }\n const accepted = steeringAcceptedEvent(current, events);\n if (!accepted || current.triggerEventId) return current;\n return {\n ...current,\n phase: \"accepted\",\n triggerEventId: accepted.id,\n };\n });\n }, [client, sessionId, targetKey, workspaceId]);\n useSessionEventTrigger(\n client,\n workspaceId,\n sessionId,\n (event) => isComposerDraftEvent(event) || isSteeringSettlementEvent(event),\n (event) => {\n if (isComposerDraftEvent(event)) void loadDraft(false);\n if (!isSteeringSettlementEvent(event)) return;\n steeringSettlementEventsRef.current = [\n ...steeringSettlementEventsRef.current.slice(-15),\n event,\n ];\n setSteering((current) => {\n if (!current || !steeringSettledByEvents(current, [event])) return current;\n steeringSettlementEventsRef.current = [];\n return null;\n });\n },\n {\n enabled: Boolean(sessionId) && (durableDrafts || steering !== null),\n ...(options.events !== undefined ? { events: options.events } : {}),\n },\n reconcileSteering,\n );\n\n useEffect(() => {\n if (!steering) return;\n const observed = [...(options.events ?? []), ...steeringSettlementEventsRef.current];\n if (!steeringSettledByEvents(steering, observed)) return;\n steeringSettlementEventsRef.current = [];\n setSteering(null);\n }, [options.events, steering]);\n\n useEffect(() => {\n if (!acceptedControl) return;\n const effectiveControl = options.effectiveControl;\n if (!effectiveControl || effectiveControl.controlVersion < acceptedControl.controlVersion) {\n return;\n }\n setAcceptedControl((current) => (current === acceptedControl ? null : current));\n }, [acceptedControl, options.effectiveControl]);\n\n const currentDraftPayload = useCallback((): SaveComposerDraftRequest | null => {\n if (!durableDrafts || targetKeyRef.current !== targetKey) return null;\n const base = draftRef.current;\n const currentPolicy = policyRef.current;\n if (!base || !currentPolicy) return null;\n return composerDraftPayload(\n base,\n value,\n restoredResources,\n annotations,\n currentPolicy,\n resolveSendExtras(sendExtrasRef.current).resources ?? [],\n );\n }, [annotations, durableDrafts, restoredResources, targetKey, value]);\n\n const adoptDraftBase = useCallback(\n (next: ComposerDraft): void => {\n if (targetKeyRef.current !== targetKey) return;\n draftRef.current = next;\n setDraft(next);\n lastSavedSignature.current = draftSignature(draftPayload(next));\n setDraftConflict(null);\n setError(null);\n },\n [targetKey],\n );\n\n const persistPayload = useCallback(\n async (payload: SaveComposerDraftRequest): Promise<boolean> => {\n const ownedTargetKey = targetKey;\n const ownedGeneration = targetGeneration.current;\n if (!sessionId || !durableDrafts || targetKeyRef.current !== ownedTargetKey) {\n return false;\n }\n let success = false;\n const run = async () => {\n if (\n targetKeyRef.current !== ownedTargetKey ||\n targetGeneration.current !== ownedGeneration\n ) {\n return;\n }\n const current = draftRef.current;\n if (!current) return;\n const request = { ...payload, expectedRevision: current.revision };\n const signature = draftSignature(request);\n if (signature === lastSavedSignature.current) {\n success = true;\n return;\n }\n setDraftSaving(true);\n try {\n const saved = await client.saveComposerDraft(workspaceId, sessionId, request);\n if (\n targetKeyRef.current !== ownedTargetKey ||\n targetGeneration.current !== ownedGeneration\n ) {\n return;\n }\n adoptDraftBase(saved);\n success = true;\n } catch (cause) {\n if (\n targetKeyRef.current === ownedTargetKey &&\n targetGeneration.current === ownedGeneration\n ) {\n const problem = asError(cause);\n if (isDraftConflictError(problem)) setDraftConflict(problem);\n setError(problem);\n }\n } finally {\n if (\n targetKeyRef.current === ownedTargetKey &&\n targetGeneration.current === ownedGeneration\n ) {\n setDraftSaving(false);\n }\n }\n };\n saveChain.current = saveChain.current.then(run, run);\n await saveChain.current;\n return success;\n },\n [adoptDraftBase, client, durableDrafts, sessionId, targetKey, workspaceId],\n );\n\n const replaceOptimisticSends = useCallback(\n (\n update: (current: OptimisticSendOperation[]) => OptimisticSendOperation[],\n ): OptimisticSendOperation[] => {\n const next = update(optimisticSendsRef.current);\n optimisticSendsRef.current = next;\n rememberOptimisticSendOperations(pendingOperationKey, next);\n setOptimisticSends(next);\n return next;\n },\n [pendingOperationKey],\n );\n\n const markOptimisticAccepted = useCallback(\n (operation: OptimisticSendOperation): void => {\n if (!optimisticCallbackIdsRef.current.has(operation.clientEventId)) {\n optimisticCallbackIdsRef.current.add(operation.clientEventId);\n onSent?.(operation.input.text, operation.input);\n }\n replaceOptimisticSends((current) =>\n current.filter((candidate) => candidate.clientEventId !== operation.clientEventId),\n );\n },\n [onSent, replaceOptimisticSends],\n );\n\n useEffect(() => {\n const events = options.events ?? [];\n if (events.length === 0 || optimisticSendsRef.current.length === 0) return;\n const reconciled = optimisticSendsRef.current.map((operation) =>\n reconcileOptimisticSendFromEvents(operation, events),\n );\n const settledIds = new Set(\n reconciled.filter((item) => item.settled).map((item) => item.operation.clientEventId),\n );\n const changed = reconciled.some(\n (item, index) =>\n item.operation !== optimisticSendsRef.current[index] &&\n !settledIds.has(item.operation.clientEventId),\n );\n for (const item of reconciled) {\n if (item.admitted && !optimisticCallbackIdsRef.current.has(item.operation.clientEventId)) {\n optimisticCallbackIdsRef.current.add(item.operation.clientEventId);\n onSent?.(item.operation.input.text, item.operation.input);\n }\n if (item.settled) markOptimisticAccepted(item.operation);\n }\n if (changed) {\n replaceOptimisticSends((current) =>\n current\n .map(\n (operation) =>\n reconciled.find((item) => item.operation.clientEventId === operation.clientEventId)\n ?.operation ?? operation,\n )\n .filter((operation) => !settledIds.has(operation.clientEventId)),\n );\n }\n if (durableDrafts && reconciled.some((item) => item.admitted)) void loadDraft(false);\n }, [\n durableDrafts,\n loadDraft,\n markOptimisticAccepted,\n onSent,\n options.events,\n replaceOptimisticSends,\n ]);\n\n const processOptimisticSends = useCallback((): void => {\n if (!sessionId || optimisticProcessorBusyRef.current) return;\n const currentOperations = optimisticSendsRef.current;\n const operationIndex = currentOperations.findIndex(\n (candidate) => candidate.state === \"sending\",\n );\n const operation = operationIndex < 0 ? undefined : currentOperations[operationIndex];\n if (!operation) return;\n const ownedTargetKey = targetKey;\n const ownedGeneration = targetGeneration.current;\n optimisticProcessorBusyRef.current = true;\n void (async () => {\n let mutationFailureObserved = false;\n const markFailed = (problem: Error, outcomeUnknown: boolean): void => {\n if (\n targetKeyRef.current !== ownedTargetKey ||\n targetGeneration.current !== ownedGeneration\n ) {\n return;\n }\n replaceOptimisticSends((current) =>\n current.map((candidate) =>\n candidate.clientEventId === operation.clientEventId\n ? {\n ...candidate,\n state: \"failed\",\n error: problem.message,\n outcomeUnknown,\n }\n : candidate,\n ),\n );\n };\n try {\n if (operation.outcomeUnknown) {\n let events: SessionEvent[];\n try {\n events = await client.listEvents(workspaceId, sessionId, {\n includeTypes: [\n \"user.message\",\n \"turn.queued\",\n \"turn.started\",\n \"turn.completed\",\n \"turn.failed\",\n \"turn.cancelled\",\n \"turn.superseded\",\n ],\n limit: 250,\n payloadMode: \"full\",\n });\n } catch (cause) {\n // This read cannot settle the prior mutation in either direction.\n // Preserve its exact key and uncertain status until reconciliation\n // succeeds or that same mutation is actually replayed.\n markFailed(asError(cause), true);\n return;\n }\n const reconciled = reconcileOptimisticSendFromEvents(operation, events);\n if (reconciled.admitted) {\n if (durableDrafts) await loadDraft(false);\n if (reconciled.settled) {\n markOptimisticAccepted(reconciled.operation);\n } else {\n replaceOptimisticSends((current) =>\n current.map((candidate) =>\n candidate.clientEventId === operation.clientEventId\n ? reconciled.operation\n : candidate,\n ),\n );\n if (!optimisticCallbackIdsRef.current.has(operation.clientEventId)) {\n optimisticCallbackIdsRef.current.add(operation.clientEventId);\n onSent?.(reconciled.operation.input.text, reconciled.operation.input);\n }\n }\n return;\n }\n if (!operation.canRetry) {\n throw new Error(\n \"OpenGeni cannot safely retry this uncertain request after remount; reconcile the session before sending again.\",\n );\n }\n }\n let expectedDraftRevision: number | undefined;\n if (durableDrafts && operation.draftPayload) {\n if (!(await persistPayload(operation.draftPayload))) {\n throw new Error(\"The message draft could not be saved before delivery.\");\n }\n expectedDraftRevision = draftRef.current?.revision;\n }\n if (\n targetKeyRef.current !== ownedTargetKey ||\n targetGeneration.current !== ownedGeneration\n ) {\n return;\n }\n const wireInput = {\n ...operation.input,\n ...(expectedDraftRevision !== undefined ? { expectedDraftRevision } : {}),\n };\n let acceptedResult: SubmitComposerDraftResponse | null = null;\n let acceptedEvent: SessionEvent | null = null;\n if (durableDrafts) {\n if (!operation.draftPayload || expectedDraftRevision === undefined) {\n throw new Error(\"The durable composer draft is not ready for delivery.\");\n }\n const result = await client\n .submitComposerDraft(workspaceId, sessionId, {\n text: operation.draftPayload.text,\n annotations: operation.draftPayload.annotations,\n resources: operation.draftPayload.resources,\n model: operation.draftPayload.model,\n reasoningEffort: operation.draftPayload.reasoningEffort,\n latencyMode: operation.draftPayload.latencyMode,\n expectedDraftRevision,\n clientEventId: operation.clientEventId,\n delivery: \"send\",\n ...(wireInput.controlEtag ? { controlEtag: wireInput.controlEtag } : {}),\n ...(wireInput.modelContext ? { modelContext: wireInput.modelContext } : {}),\n ...(wireInput.mcpCredentialUpdates\n ? { mcpCredentialUpdates: wireInput.mcpCredentialUpdates }\n : {}),\n ...(wireInput.connectionAuthorities\n ? { connectionAuthorities: wireInput.connectionAuthorities }\n : {}),\n ...(wireInput.personalResourceAttachment\n ? { personalResourceAttachment: wireInput.personalResourceAttachment }\n : {}),\n })\n .catch((cause: unknown) => {\n mutationFailureObserved = true;\n throw cause;\n });\n acceptedResult = result;\n adoptDraftBase(result.draft);\n } else {\n acceptedEvent = await client\n .sendMessage(workspaceId, sessionId, wireInput)\n .catch((cause: unknown) => {\n mutationFailureObserved = true;\n throw cause;\n });\n }\n if (\n targetKeyRef.current !== ownedTargetKey ||\n targetGeneration.current !== ownedGeneration\n ) {\n return;\n }\n const acceptedDestination =\n acceptedResult?.routing === \"queued_for_execution\"\n ? \"queue\"\n : acceptedResult?.routing === \"accepted_for_execution\"\n ? \"chat\"\n : operation.destination;\n if (options.events === undefined && acceptedDestination === \"chat\") {\n markOptimisticAccepted({ ...operation, input: wireInput });\n } else {\n replaceOptimisticSends((current) =>\n current.map((candidate) =>\n candidate.clientEventId === operation.clientEventId\n ? {\n ...candidate,\n input: wireInput,\n destination: acceptedDestination,\n turnId: acceptedResult?.turn.id ?? candidate.turnId,\n triggerEventId:\n acceptedResult?.accepted.id ?? acceptedEvent?.id ?? candidate.triggerEventId,\n appliedQueueVersion:\n acceptedResult?.receipt?.appliedQueueVersion ?? candidate.appliedQueueVersion,\n state: \"queued\",\n error: undefined,\n }\n : candidate,\n ),\n );\n }\n if (!optimisticCallbackIdsRef.current.has(operation.clientEventId)) {\n optimisticCallbackIdsRef.current.add(operation.clientEventId);\n onSent?.(wireInput.text, wireInput);\n }\n } catch (cause) {\n const current = optimisticSendsRef.current.find(\n (candidate) => candidate.clientEventId === operation.clientEventId,\n );\n // A live durable event can prove admission before the original HTTP\n // response times out. Never regress that confirmed state to failure.\n if (!current || (current.state === \"queued\" && current.outcomeUnknown === false)) {\n return;\n }\n const problem = asError(cause);\n onDeliveryErrorRef.current?.(problem, operation.input, \"send\");\n // Only an actual mutation replay can replace prior uncertainty with a\n // definitive response. Local preparation failures remain retry-only.\n const outcomeUnknown =\n operation.outcomeUnknown && !mutationFailureObserved\n ? true\n : isOutcomeUnknownError(cause);\n markFailed(problem, outcomeUnknown);\n } finally {\n optimisticProcessorBusyRef.current = false;\n if (targetKeyRef.current === ownedTargetKey) {\n setOptimisticSends([...optimisticSendsRef.current]);\n }\n }\n })();\n }, [\n adoptDraftBase,\n client,\n durableDrafts,\n markOptimisticAccepted,\n loadDraft,\n onSent,\n options.events,\n persistPayload,\n replaceOptimisticSends,\n sessionId,\n targetKey,\n workspaceId,\n ]);\n\n useEffect(() => {\n processOptimisticSends();\n }, [optimisticSends, processOptimisticSends]);\n\n // Private durable autosave. A newer local edit is never replaced by an older\n // response; saves serialize and each reads the latest acknowledged revision.\n useEffect(() => {\n const pending = pendingOperationRef.current;\n if (pending) {\n const shadow = {\n text: valueRef.current,\n resources: mergeResources(\n restoredResourcesRef.current,\n resolveSendExtras(sendExtrasRef.current).resources ?? [],\n ),\n annotations: annotationsRef.current,\n ...(policyRef.current ? { policy: policyRef.current } : {}),\n };\n if (\n pending.newerShadow.text !== shadow.text ||\n JSON.stringify(pending.newerShadow.resources) !== JSON.stringify(shadow.resources) ||\n JSON.stringify(pending.newerShadow.annotations) !== JSON.stringify(shadow.annotations) ||\n JSON.stringify(pending.newerShadow.policy) !== JSON.stringify(shadow.policy)\n ) {\n pendingOperationRef.current = updatePendingComposerShadow(\n pendingOperationKey,\n pending,\n shadow,\n );\n }\n return;\n }\n const optimistic = optimisticSendsRef.current.at(-1);\n if (optimistic) {\n const shadow = {\n text: valueRef.current,\n resources: mergeResources(\n restoredResourcesRef.current,\n resolveSendExtras(sendExtrasRef.current).resources ?? [],\n ),\n annotations: annotationsRef.current,\n ...(policyRef.current ? { policy: policyRef.current } : {}),\n };\n if (\n optimistic.newerShadow.text !== shadow.text ||\n JSON.stringify(optimistic.newerShadow.resources) !== JSON.stringify(shadow.resources) ||\n JSON.stringify(optimistic.newerShadow.annotations) !== JSON.stringify(shadow.annotations) ||\n JSON.stringify(optimistic.newerShadow.policy) !== JSON.stringify(shadow.policy)\n ) {\n setOptimisticDraftShadow(shadow);\n }\n }\n if (optimisticSendsRef.current.some((operation) => operation.state === \"sending\")) {\n return;\n }\n if (\n !durableDrafts ||\n !sessionId ||\n draftLoading ||\n sending ||\n !draftRef.current ||\n draftConflict\n )\n return;\n const payload = currentDraftPayload();\n if (!payload || draftSignature(payload) === lastSavedSignature.current) return;\n const timer = window.setTimeout(() => void persistPayload(payload), 500);\n return () => window.clearTimeout(timer);\n }, [\n currentDraftPayload,\n durableDrafts,\n draftConflict,\n draftLoading,\n liveExtrasVersion,\n pendingOperationKey,\n persistPayload,\n setOptimisticDraftShadow,\n sending,\n sessionId,\n ]);\n\n const dispatch = useCallback(\n async (delivery: \"send\" | \"steer\", explicit?: string): Promise<boolean> => {\n const ownedTargetKey = targetKey;\n const ownedGeneration = targetGeneration.current;\n const operationKey = pendingComposerOperationKey(workspaceId, sessionId);\n const pending = pendingOperationRef.current ?? restorePendingComposerOperation(operationKey);\n if (pending && !pendingOperationRef.current) {\n pendingOperationRef.current = pending;\n pendingClientEventId.current = pending.input.clientEventId ?? null;\n }\n const draftAtSend = value;\n const annotationsAtSend = annotations;\n const rawText = explicit ?? draftAtSend;\n const hasText = rawText.trim().length > 0;\n const hasAnnotations = annotationsAtSend.length > 0;\n const currentPolicy = policyRef.current;\n const annotationsComplete = annotationsAtSend.every(\n (annotation) => annotation.note.trim().length > 0,\n );\n // Resolve the extras once: a file-only message (empty text + ≥1 ready\n // resource) is legitimate, so we must not bail on empty text alone.\n const extras = pending ? {} : resolveSendExtras(sendExtrasRef.current);\n const hasResources = restoredResources.length > 0 || (extras.resources?.length ?? 0) > 0;\n if (\n (!pending && (!annotationsComplete || (!hasText && !hasResources && !hasAnnotations))) ||\n !sessionId ||\n !currentPolicy ||\n sending ||\n sendBlockedRef.current?.() === true ||\n targetKeyRef.current !== ownedTargetKey\n ) {\n return false;\n }\n\n const clearPending = (): void => {\n pendingOperationRef.current = null;\n pendingClientEventId.current = null;\n forgetPendingComposerOperation(operationKey);\n };\n\n let keepSteering = pending?.delivery === \"steer\";\n\n const settleAccepted = (operation: PendingComposerOperation): void => {\n clearPending();\n const draftWasUnchanged = valueRef.current === operation.draftAtSend;\n const resourcesWereUnchanged =\n JSON.stringify(restoredResourcesRef.current) ===\n JSON.stringify(operation.resourcesAtSend);\n const annotationsWereUnchanged =\n JSON.stringify(annotationsRef.current) === JSON.stringify(operation.annotationsAtSend);\n if (resourcesWereUnchanged) {\n restoredResourcesRef.current = [];\n setRestoredResources([]);\n }\n if (annotationsWereUnchanged) {\n annotationsRef.current = [];\n setAnnotations([]);\n setAnnotationReviewTargetId(null);\n }\n if (operation.clearDraftOnAccept && draftWasUnchanged) {\n valueRef.current = \"\";\n setValue(\"\");\n }\n onSent?.(operation.input.text, operation.input);\n };\n\n const deliver = async (operation: PendingComposerOperation) => {\n if (durableDrafts) {\n const input = operation.input;\n if (\n input.expectedDraftRevision === undefined ||\n input.clientEventId === undefined ||\n input.model === undefined ||\n input.reasoningEffort === undefined ||\n input.latencyMode === undefined\n ) {\n throw new Error(\"The durable composer draft is not ready for delivery.\");\n }\n const result = await client.submitComposerDraft(workspaceId, sessionId, {\n text: input.text,\n annotations: input.annotations ?? [],\n resources: input.resources ?? [],\n model: input.model,\n reasoningEffort: input.reasoningEffort,\n latencyMode: input.latencyMode,\n expectedDraftRevision: input.expectedDraftRevision,\n clientEventId: input.clientEventId,\n delivery: operation.delivery,\n ...(input.controlEtag ? { controlEtag: input.controlEtag } : {}),\n ...(input.modelContext ? { modelContext: input.modelContext } : {}),\n ...(input.mcpCredentialUpdates\n ? { mcpCredentialUpdates: input.mcpCredentialUpdates }\n : {}),\n ...(input.connectionAuthorities\n ? { connectionAuthorities: input.connectionAuthorities }\n : {}),\n ...(input.personalResourceAttachment\n ? { personalResourceAttachment: input.personalResourceAttachment }\n : {}),\n });\n adoptDraftBase(result.draft);\n return result;\n }\n if (operation.delivery === \"steer\") {\n return await client.steerMessage(workspaceId, sessionId, operation.input);\n }\n await client.sendMessage(workspaceId, sessionId, operation.input);\n return null;\n };\n\n if (delivery === \"steer\") {\n if (steeringRef.current?.clientEventId !== pending?.input.clientEventId) {\n steeringOccurredAtRef.current = new Date().toISOString();\n }\n setSteering({\n phase: \"submitting\",\n text: rawText,\n clientEventId: pending?.input.clientEventId ?? pendingClientEventId.current,\n triggerEventId: null,\n turnId: null,\n });\n }\n setSending(true);\n setError(null);\n try {\n if (pending) {\n let acceptedEvent: SessionEvent | null = null;\n try {\n const events = await client.listEvents(workspaceId, sessionId, {\n includeTypes: [\"user.message\"],\n limit: 100,\n payloadMode: \"none\",\n });\n acceptedEvent =\n events.find(\n (event) =>\n event.type === \"user.message\" &&\n event.clientEventId === pending.input.clientEventId,\n ) ?? null;\n } catch (cause) {\n if (\n targetKeyRef.current === ownedTargetKey &&\n targetGeneration.current === ownedGeneration\n ) {\n const problem = asError(cause);\n setError(problem);\n if (pending.delivery === \"steer\") {\n keepSteering = true;\n setSteering({\n phase: \"failed\",\n text: pending.input.text,\n clientEventId: pending.input.clientEventId ?? null,\n triggerEventId: null,\n turnId: null,\n error: \"Not confirmed. Retry.\",\n outcomeUnknown: true,\n });\n }\n }\n return false;\n }\n if (\n targetKeyRef.current !== ownedTargetKey ||\n targetGeneration.current !== ownedGeneration\n ) {\n return false;\n }\n if (acceptedEvent) {\n if (durableDrafts) await loadDraft(false);\n if (pending.delivery === \"steer\") {\n keepSteering = true;\n setSteering({\n phase: \"accepted\",\n text: pending.input.text,\n clientEventId: pending.input.clientEventId ?? null,\n triggerEventId: acceptedEvent.id,\n turnId: null,\n });\n }\n settleAccepted(pending);\n return true;\n }\n if (!pending.canRetry) {\n setError(\n new Error(\n \"OpenGeni cannot safely retry this uncertain request after remount; reconcile the session before sending again.\",\n ),\n );\n return false;\n }\n try {\n const result = await deliver(pending);\n if (pending.delivery === \"steer\" && result) {\n keepSteering = true;\n setSteering({\n phase: \"accepted\",\n text: pending.input.text,\n clientEventId: pending.input.clientEventId ?? null,\n triggerEventId: result.accepted.id,\n turnId: result.turn.id,\n stoppingPreviousAttempt:\n result.replay !== true && (result.interruptionCount ?? 0) > 0,\n });\n }\n } catch (cause) {\n const problem = asError(cause);\n const outcomeUnknown = isOutcomeUnknownError(cause);\n onDeliveryErrorRef.current?.(problem, pending.input, pending.delivery);\n if (!outcomeUnknown) {\n clearPending();\n keepSteering = false;\n } else if (pending.delivery === \"steer\") {\n keepSteering = true;\n setSteering({\n phase: \"failed\",\n text: pending.input.text,\n clientEventId: pending.input.clientEventId ?? null,\n triggerEventId: null,\n turnId: null,\n error: \"Not confirmed. Retry.\",\n outcomeUnknown: true,\n });\n }\n if (\n targetKeyRef.current === ownedTargetKey &&\n targetGeneration.current === ownedGeneration\n ) {\n setError(problem);\n }\n return false;\n }\n if (\n targetKeyRef.current !== ownedTargetKey ||\n targetGeneration.current !== ownedGeneration\n ) {\n return false;\n }\n settleAccepted(pending);\n return true;\n }\n\n // Trimming is only an emptiness check. A non-blank prompt is persisted\n // and submitted byte-for-byte, while file-only sends use the same\n // placeholder for both operations so the server content fence cannot\n // reject its own client.\n const sendText = hasText ? rawText : hasAnnotations ? \"\" : FILE_ONLY_MESSAGE_TEXT;\n const currentPayload = currentDraftPayload();\n const payload = currentPayload ? { ...currentPayload, text: sendText } : null;\n if (payload && !(await persistPayload(payload))) return false;\n if (\n targetKeyRef.current !== ownedTargetKey ||\n targetGeneration.current !== ownedGeneration\n ) {\n return false;\n }\n // The wire contract requires non-empty text (z.string().min(1)) and the\n // worker rejects whitespace-only text; a file-only message therefore\n // carries a minimal default so the attachments still get delivered.\n pendingClientEventId.current ??= generateClientEventId();\n const effectiveControl = effectiveControlRef.current;\n const input = composeSendInput(sendText, pendingClientEventId.current, extras, {\n ...currentPolicy,\n ...(effectiveControl?.controlEtag ? { controlEtag: effectiveControl.controlEtag } : {}),\n ...(durableDrafts && draftRef.current\n ? { expectedDraftRevision: draftRef.current.revision }\n : {}),\n resources: mergeResources(restoredResources, extras.resources ?? []),\n annotations: cloneAnnotations(annotationsAtSend),\n });\n const operation: PendingComposerOperation = {\n delivery,\n input,\n draftAtSend,\n resourcesAtSend: [...restoredResources],\n annotationsAtSend: cloneAnnotations(annotationsAtSend),\n newerShadow: {\n text: draftAtSend,\n resources: mergeResources(restoredResources, extras.resources ?? []),\n annotations: cloneAnnotations(annotationsAtSend),\n policy: currentPolicy,\n },\n clearDraftOnAccept: explicit === undefined,\n canRetry: true,\n };\n pendingOperationRef.current = operation;\n rememberPendingComposerOperation(operationKey, operation);\n if (delivery === \"steer\") {\n setSteering({\n phase: \"submitting\",\n text: sendText,\n clientEventId: input.clientEventId ?? null,\n triggerEventId: null,\n turnId: null,\n });\n }\n try {\n const result = await deliver(operation);\n if (delivery === \"steer\" && result) {\n keepSteering = true;\n setSteering({\n phase: \"accepted\",\n text: sendText,\n clientEventId: input.clientEventId ?? null,\n triggerEventId: result.accepted.id,\n turnId: result.turn.id,\n stoppingPreviousAttempt:\n result.replay !== true && (result.interruptionCount ?? 0) > 0,\n });\n }\n } catch (cause) {\n onDeliveryErrorRef.current?.(asError(cause), operation.input, operation.delivery);\n if (!isOutcomeUnknownError(cause)) {\n clearPending();\n } else if (delivery === \"steer\") {\n keepSteering = true;\n setSteering({\n phase: \"failed\",\n text: operation.input.text,\n clientEventId: operation.input.clientEventId ?? null,\n triggerEventId: null,\n turnId: null,\n error: \"Not confirmed. Retry.\",\n outcomeUnknown: true,\n });\n }\n if (\n targetKeyRef.current === ownedTargetKey &&\n targetGeneration.current === ownedGeneration\n ) {\n setError(asError(cause));\n }\n return false;\n }\n if (\n targetKeyRef.current !== ownedTargetKey ||\n targetGeneration.current !== ownedGeneration\n ) {\n return false;\n }\n settleAccepted(operation);\n return true;\n } finally {\n if (\n targetKeyRef.current === ownedTargetKey &&\n targetGeneration.current === ownedGeneration\n ) {\n setSending(false);\n if (delivery === \"steer\" && !keepSteering) setSteering(null);\n }\n }\n },\n [\n client,\n currentDraftPayload,\n durableDrafts,\n onSent,\n persistPayload,\n restoredResources,\n annotations,\n adoptDraftBase,\n sending,\n sessionId,\n targetKey,\n value,\n workspaceId,\n loadDraft,\n ],\n );\n\n const send = useCallback(\n async (explicit?: string): Promise<boolean> => {\n if (pendingOperationRef.current?.delivery === \"send\") {\n return await dispatch(\"send\", explicit);\n }\n const rawText = explicit ?? valueRef.current;\n const annotationsAtSend = cloneAnnotations(annotationsRef.current);\n const currentPolicy = policyRef.current;\n const hasText = rawText.trim().length > 0;\n const hasAnnotations = annotationsAtSend.length > 0;\n const annotationsComplete = annotationsAtSend.every(\n (annotation) => annotation.note.trim().length > 0,\n );\n const extras = resolveSendExtras(sendExtrasRef.current);\n const resources = mergeResources(restoredResourcesRef.current, extras.resources ?? []);\n if (\n !sessionId ||\n !currentPolicy ||\n sending ||\n !annotationsComplete ||\n (!hasText && !hasAnnotations && resources.length === 0) ||\n sendBlockedRef.current?.() === true ||\n targetKeyRef.current !== targetKey\n ) {\n return false;\n }\n const sendText = hasText ? rawText : hasAnnotations ? \"\" : FILE_ONLY_MESSAGE_TEXT;\n const clientEventId = generateClientEventId();\n const effectiveControl = effectiveControlRef.current;\n const input = composeSendInput(sendText, clientEventId, extras, {\n ...currentPolicy,\n ...(effectiveControl?.controlEtag ? { controlEtag: effectiveControl.controlEtag } : {}),\n resources,\n annotations: annotationsAtSend,\n });\n const currentPayload = currentDraftPayload();\n const hasEarlierUnsettledSend = optimisticSendsRef.current.some(\n (candidate) => candidate.state !== \"failed\" || candidate.outcomeUnknown === true,\n );\n const operation: OptimisticSendOperation = {\n clientEventId,\n delivery: \"send\",\n destination:\n effectiveControl?.state === \"paused\" || hasEarlierUnsettledSend\n ? \"queue\"\n : (sendDestinationRef.current?.() ?? \"chat\"),\n text: sendText,\n annotations: annotationsAtSend,\n resources,\n occurredAt: new Date().toISOString(),\n state: \"sending\",\n input,\n draftPayload: currentPayload ? { ...currentPayload, text: sendText } : null,\n newerShadow: {\n text: explicit === undefined ? \"\" : valueRef.current,\n resources: explicit === undefined ? [] : [...restoredResourcesRef.current],\n annotations: explicit === undefined ? [] : cloneAnnotations(annotationsRef.current),\n policy: currentPolicy,\n },\n canRetry: true,\n };\n // The local submission acknowledgement owns the composer before any\n // host callback or queued processor can observe it. Hosts commonly use\n // onSubmitted to remove attachment/repository state, and those updates\n // may synchronously re-render the controlled composer. Clear the refs\n // first so that handoff cannot re-project the submitted text as the next\n // draft. The immutable operation above still owns the exact retry input.\n if (explicit === undefined) {\n valueRef.current = \"\";\n annotationsRef.current = [];\n restoredResourcesRef.current = [];\n localEditRevision.current += 1;\n setValue(\"\");\n setAnnotations([]);\n setAnnotationReviewTargetId(null);\n setRestoredResources([]);\n }\n replaceOptimisticSends((current) => [...current, operation]);\n queueMicrotask(processOptimisticSends);\n setError(null);\n onSubmitted?.(sendText, input);\n return true;\n },\n [\n currentDraftPayload,\n dispatch,\n onSubmitted,\n processOptimisticSends,\n replaceOptimisticSends,\n sending,\n sessionId,\n targetKey,\n ],\n );\n const steer = useCallback(async (text?: string) => await dispatch(\"steer\", text), [dispatch]);\n\n const retryOptimisticMessage = useCallback(\n (clientEventId: string): void => {\n if (sendBlockedRef.current?.() === true) return;\n const currentSteering = steeringRef.current;\n if (currentSteering?.phase === \"failed\" && currentSteering.clientEventId === clientEventId) {\n void dispatch(\"steer\");\n return;\n }\n replaceOptimisticSends((current) =>\n current.map((operation) => {\n if (operation.clientEventId !== clientEventId || operation.state !== \"failed\") {\n return operation;\n }\n if (operation.outcomeUnknown) {\n return { ...operation, state: \"sending\", error: undefined };\n }\n const nextClientEventId = generateClientEventId();\n const currentPersonalResourceAttachment = resolveSendExtras(\n sendExtrasRef.current,\n ).personalResourceAttachment;\n const retryInput = composeSendInput(\n operation.text,\n nextClientEventId,\n {\n ...operation.input,\n ...(currentPersonalResourceAttachment\n ? { personalResourceAttachment: currentPersonalResourceAttachment }\n : {}),\n },\n {\n ...(effectiveControlRef.current?.controlEtag\n ? { controlEtag: effectiveControlRef.current.controlEtag }\n : {}),\n resources: operation.resources,\n annotations: operation.annotations,\n },\n );\n return {\n ...operation,\n clientEventId: nextClientEventId,\n input: retryInput,\n draftPayload: operation.draftPayload,\n occurredAt: new Date().toISOString(),\n state: \"sending\",\n error: undefined,\n outcomeUnknown: false,\n canRetry: true,\n };\n }),\n );\n queueMicrotask(processOptimisticSends);\n },\n [dispatch, processOptimisticSends, replaceOptimisticSends],\n );\n\n const removeOptimisticMessage = useCallback(\n (clientEventId: string): void => {\n if (steeringRef.current?.clientEventId === clientEventId) {\n pendingOperationRef.current = null;\n pendingClientEventId.current = null;\n forgetPendingComposerOperation(pendingComposerOperationKey(workspaceId, sessionId));\n setSteering(null);\n setError(null);\n return;\n }\n replaceOptimisticSends((current) =>\n current.filter((operation) => operation.clientEventId !== clientEventId),\n );\n },\n [replaceOptimisticSends, sessionId, workspaceId],\n );\n\n // A send is possible with non-empty text OR with ≥1 attached resource (a\n // file-only message). Resources ride in `sendExtras`, so we resolve them here\n // — keeping useComposer attachment-agnostic while still lighting up the send\n // affordance the moment a file is ready. Attachment hosts bind `sendBlocked`\n // to unresolved uploads so direct send()/steer() calls fail closed too.\n const hasReadyResources =\n restoredResources.length > 0 ||\n (resolveSendExtras(sendExtrasRef.current).resources?.length ?? 0) > 0;\n const hasPendingOperation = pendingOperationRef.current !== null;\n const annotationsComplete = annotations.every((annotation) => annotation.note.trim().length > 0);\n\n const pause = useCallback(\n async (reason?: string): Promise<void> => {\n const ownedTargetKey = targetKey;\n const ownedGeneration = targetGeneration.current;\n if (!sessionId || pausing || targetKeyRef.current !== ownedTargetKey) {\n return;\n }\n setPausing(true);\n setError(null);\n try {\n const clientEventId = generateClientEventId();\n const effectiveControl = effectiveControlRef.current;\n const result = await replayOutcomeUnknown(() =>\n client.pauseSession(workspaceId, sessionId, {\n clientEventId,\n ...(reason !== undefined ? { reason } : {}),\n ...(effectiveControl?.controlEtag\n ? { expectedControlEtag: effectiveControl.controlEtag }\n : {}),\n }),\n );\n if (\n targetKeyRef.current === ownedTargetKey &&\n targetGeneration.current === ownedGeneration\n ) {\n setAcceptedControl(result.effectiveControl);\n }\n } catch (cause) {\n if (\n targetKeyRef.current === ownedTargetKey &&\n targetGeneration.current === ownedGeneration\n ) {\n setError(cause instanceof Error ? cause : new Error(String(cause)));\n }\n } finally {\n if (\n targetKeyRef.current === ownedTargetKey &&\n targetGeneration.current === ownedGeneration\n ) {\n setPausing(false);\n }\n }\n },\n [client, workspaceId, sessionId, pausing, targetKey],\n );\n\n const resume = useCallback(\n async (reason?: string): Promise<void> => {\n const ownedTargetKey = targetKey;\n const ownedGeneration = targetGeneration.current;\n if (!sessionId || resuming || targetKeyRef.current !== ownedTargetKey) return;\n setResuming(true);\n setError(null);\n try {\n const clientEventId = generateClientEventId();\n const effectiveControl = effectiveControlRef.current;\n const result = await replayOutcomeUnknown(() =>\n client.resumeSession(workspaceId, sessionId, {\n clientEventId,\n ...(reason !== undefined ? { reason } : {}),\n ...(effectiveControl?.controlEtag\n ? { expectedControlEtag: effectiveControl.controlEtag }\n : {}),\n }),\n );\n if (\n targetKeyRef.current === ownedTargetKey &&\n targetGeneration.current === ownedGeneration\n ) {\n setAcceptedControl(result.effectiveControl);\n }\n } catch (cause) {\n if (\n targetKeyRef.current === ownedTargetKey &&\n targetGeneration.current === ownedGeneration\n ) {\n setError(cause instanceof Error ? cause : new Error(String(cause)));\n }\n } finally {\n if (\n targetKeyRef.current === ownedTargetKey &&\n targetGeneration.current === ownedGeneration\n ) {\n setResuming(false);\n }\n }\n },\n [client, workspaceId, sessionId, resuming, targetKey],\n );\n\n const resumeScope = useCallback(\n async (option: EffectiveControlResumeOption): Promise<void> => {\n const ownedTargetKey = targetKey;\n const ownedGeneration = targetGeneration.current;\n if (!sessionId || resuming || targetKeyRef.current !== ownedTargetKey) return;\n setResuming(true);\n setError(null);\n try {\n if (option.scope === \"workspace\") {\n const workspaceBlocker = effectiveControlRef.current?.blockers.find(\n (blocker) => blocker.kind === \"workspace\",\n );\n if (!client.setWorkspaceInferenceState) {\n throw new Error(\n \"@opengeni/react: workspace-scoped resume requires setWorkspaceInferenceState.\",\n );\n }\n const clientEventId = generateClientEventId();\n await replayOutcomeUnknown(() =>\n client.setWorkspaceInferenceState!(workspaceId, {\n action: \"resume\",\n clientEventId,\n ...(workspaceBlocker ? { expectedRevision: workspaceBlocker.revision } : {}),\n }),\n );\n } else if (option.scope === \"session\" && option.targetId) {\n const target = await client.getQueue(workspaceId, option.targetId);\n if (\n targetKeyRef.current !== ownedTargetKey ||\n targetGeneration.current !== ownedGeneration\n ) {\n return;\n }\n const clientEventId = generateClientEventId();\n await replayOutcomeUnknown(() =>\n client.resumeSession(workspaceId, option.targetId!, {\n clientEventId,\n expectedControlEtag: target.effectiveControl.controlEtag,\n }),\n );\n } else {\n const clientEventId = generateClientEventId();\n const effectiveControl = effectiveControlRef.current;\n const result = await replayOutcomeUnknown(() =>\n client.resumeSession(workspaceId, sessionId, {\n clientEventId,\n ...(effectiveControl?.controlEtag\n ? { expectedControlEtag: effectiveControl.controlEtag }\n : {}),\n }),\n );\n if (\n targetKeyRef.current === ownedTargetKey &&\n targetGeneration.current === ownedGeneration\n ) {\n setAcceptedControl(result.effectiveControl);\n }\n }\n } catch (cause) {\n if (\n targetKeyRef.current === ownedTargetKey &&\n targetGeneration.current === ownedGeneration\n ) {\n setError(asError(cause));\n }\n } finally {\n if (\n targetKeyRef.current === ownedTargetKey &&\n targetGeneration.current === ownedGeneration\n ) {\n setResuming(false);\n }\n }\n },\n [client, resuming, sessionId, targetKey, workspaceId],\n );\n\n const updateValue = useCallback(\n (next: string) => {\n if (targetKeyRef.current !== targetKey) return;\n localEditRevision.current += 1;\n valueRef.current = next;\n pendingOperationRef.current = updatePendingComposerShadow(\n pendingOperationKey,\n pendingOperationRef.current,\n {\n text: next,\n resources: mergeResources(\n restoredResourcesRef.current,\n resolveSendExtras(sendExtrasRef.current).resources ?? [],\n ),\n annotations: annotationsRef.current,\n policy: policyRef.current ?? undefined,\n },\n );\n setOptimisticDraftShadow({\n text: next,\n resources: mergeResources(\n restoredResourcesRef.current,\n resolveSendExtras(sendExtrasRef.current).resources ?? [],\n ),\n annotations: annotationsRef.current,\n policy: policyRef.current ?? undefined,\n });\n setValue(next);\n },\n [pendingOperationKey, setOptimisticDraftShadow, targetKey],\n );\n\n const updateAnnotations = useCallback(\n (next: DraftTimelineAnnotation[], reviewTargetId: string | null = null) => {\n if (targetKeyRef.current !== targetKey) return;\n localEditRevision.current += 1;\n annotationsRef.current = next;\n pendingOperationRef.current = updatePendingComposerShadow(\n pendingOperationKey,\n pendingOperationRef.current,\n {\n text: valueRef.current,\n resources: mergeResources(\n restoredResourcesRef.current,\n resolveSendExtras(sendExtrasRef.current).resources ?? [],\n ),\n annotations: next,\n policy: policyRef.current ?? undefined,\n },\n );\n setOptimisticDraftShadow({\n text: valueRef.current,\n resources: mergeResources(\n restoredResourcesRef.current,\n resolveSendExtras(sendExtrasRef.current).resources ?? [],\n ),\n annotations: next,\n policy: policyRef.current ?? undefined,\n });\n setAnnotations(next);\n setAnnotationReviewTargetId(reviewTargetId);\n },\n [pendingOperationKey, setOptimisticDraftShadow, targetKey],\n );\n\n const addAnnotation = useCallback(\n (annotation: DraftTimelineAnnotation) => {\n if (annotationsRef.current.length >= 12) {\n setError(new Error(\"A message can include at most 12 timeline annotations.\"));\n return;\n }\n const next = [...annotationsRef.current, annotation];\n updateAnnotations(next, annotation.id);\n },\n [updateAnnotations],\n );\n\n const updateAnnotation = useCallback(\n (id: string, note: string) => {\n updateAnnotations(\n annotationsRef.current.map((annotation) =>\n annotation.id === id ? { ...annotation, note } : annotation,\n ),\n );\n },\n [updateAnnotations],\n );\n\n const removeAnnotation = useCallback(\n (id: string) => {\n updateAnnotations(annotationsRef.current.filter((annotation) => annotation.id !== id));\n },\n [updateAnnotations],\n );\n\n const clearAnnotationReviewTarget = useCallback(() => {\n setAnnotationReviewTargetId(null);\n }, []);\n\n const updatePolicy = useCallback(\n (next: ComposerPolicy): void => {\n if (targetKeyRef.current !== targetKey) return;\n localEditRevision.current += 1;\n policyRef.current = next;\n const shadow = {\n text: valueRef.current,\n resources: mergeResources(\n restoredResourcesRef.current,\n resolveSendExtras(sendExtrasRef.current).resources ?? [],\n ),\n annotations: annotationsRef.current,\n policy: next,\n };\n pendingOperationRef.current = updatePendingComposerShadow(\n pendingOperationKey,\n pendingOperationRef.current,\n shadow,\n );\n setOptimisticDraftShadow(shadow);\n setPolicy(next);\n },\n [pendingOperationKey, setOptimisticDraftShadow, targetKey],\n );\n\n const updateModel = useCallback(\n (model: string): void => {\n const current = policyRef.current;\n if (current) updatePolicy({ ...current, model });\n },\n [updatePolicy],\n );\n\n const updateReasoningEffort = useCallback(\n (reasoningEffort: ReasoningEffort): void => {\n const current = policyRef.current;\n if (current) updatePolicy({ ...current, reasoningEffort });\n },\n [updatePolicy],\n );\n\n const updateLatencyMode = useCallback(\n (latencyMode: LatencyMode): void => {\n const current = policyRef.current;\n if (current) updatePolicy({ ...current, latencyMode });\n },\n [updatePolicy],\n );\n\n const removeRestoredResource = useCallback(\n (index: number) => {\n if (targetKeyRef.current !== targetKey) return;\n localEditRevision.current += 1;\n const next = restoredResourcesRef.current.filter((_, candidate) => candidate !== index);\n restoredResourcesRef.current = next;\n pendingOperationRef.current = updatePendingComposerShadow(\n pendingOperationKey,\n pendingOperationRef.current,\n {\n text: valueRef.current,\n resources: mergeResources(next, resolveSendExtras(sendExtrasRef.current).resources ?? []),\n annotations: annotationsRef.current,\n policy: policyRef.current ?? undefined,\n },\n );\n setOptimisticDraftShadow({\n text: valueRef.current,\n resources: mergeResources(next, resolveSendExtras(sendExtrasRef.current).resources ?? []),\n annotations: annotationsRef.current,\n policy: policyRef.current ?? undefined,\n });\n setRestoredResources(next);\n },\n [pendingOperationKey, setOptimisticDraftShadow, targetKey],\n );\n\n const hasDraftContent = useCallback((): boolean => {\n const current = draftRef.current;\n const extras = resolveSendExtras(sendExtrasRef.current);\n return (\n valueRef.current.length > 0 ||\n annotationsRef.current.length > 0 ||\n restoredResourcesRef.current.length > 0 ||\n (extras.resources?.length ?? 0) > 0 ||\n (current?.sourceTurnId !== null && current?.sourceTurnId !== undefined)\n );\n }, []);\n\n const resolveDraftConflict = useCallback(\n async (choice: \"keep_mine\" | \"use_remote\"): Promise<void> => {\n const ownedTargetKey = targetKey;\n const ownedGeneration = targetGeneration.current;\n if (!sessionId || !durableDrafts || targetKeyRef.current !== ownedTargetKey) return;\n const remote = await client.getComposerDraft(workspaceId, sessionId);\n if (targetKeyRef.current !== ownedTargetKey || targetGeneration.current !== ownedGeneration) {\n return;\n }\n if (choice === \"use_remote\") {\n applyDraft(remote);\n setError(null);\n return;\n }\n draftRef.current = remote;\n setDraft(remote);\n setDraftConflict(null);\n setError(null);\n const payload = currentDraftPayload();\n if (payload) await persistPayload({ ...payload, expectedRevision: remote.revision });\n },\n [\n applyDraft,\n client,\n currentDraftPayload,\n durableDrafts,\n persistPayload,\n sessionId,\n targetKey,\n workspaceId,\n ],\n );\n\n const identityMatches = stateTargetKey === targetKey;\n const visibleSteering = identityMatches ? steering : null;\n const visibleOptimisticMessages: ComposerOptimisticMessage[] = identityMatches\n ? [\n ...optimisticSends.map(\n ({ input: _input, draftPayload: _payload, canRetry: _retry, ...item }) => item,\n ),\n ...(visibleSteering?.clientEventId\n ? [\n {\n clientEventId: visibleSteering.clientEventId,\n delivery: \"steer\" as const,\n destination: \"chat\" as const,\n text: visibleSteering.text,\n annotations:\n pendingOperationRef.current?.delivery === \"steer\"\n ? pendingOperationRef.current.annotationsAtSend\n : [],\n resources:\n pendingOperationRef.current?.delivery === \"steer\"\n ? pendingOperationRef.current.resourcesAtSend\n : [],\n occurredAt: steeringOccurredAtRef.current,\n state:\n visibleSteering.phase === \"submitting\"\n ? (\"sending\" as const)\n : visibleSteering.phase === \"failed\"\n ? (\"failed\" as const)\n : (\"queued\" as const),\n turnId: visibleSteering.turnId,\n triggerEventId: visibleSteering.triggerEventId,\n ...(visibleSteering.error ? { error: visibleSteering.error } : {}),\n ...(visibleSteering.outcomeUnknown !== undefined\n ? { outcomeUnknown: visibleSteering.outcomeUnknown }\n : {}),\n },\n ]\n : []),\n ]\n : [];\n const reloadDraft = useCallback(async () => await loadDraft(true), [loadDraft]);\n const clearError = useCallback(() => {\n if (targetKeyRef.current !== targetKey) return;\n setError(null);\n setDraftConflict(null);\n }, [targetKey]);\n // `valueRef` is the synchronous composer authority. React state exists to\n // schedule renders, but a concurrent autosave settlement can render the\n // previous state lane after a newer input event has already updated the ref.\n // Projecting that stale state into a controlled textarea rewrites the old\n // draft for one commit, which moves the caret and can briefly resurrect a\n // submitted message. Never let an incidental render outrank the latest\n // local lifecycle decision.\n const visibleValue = identityMatches ? valueRef.current : \"\";\n\n return {\n value: visibleValue,\n setValue: updateValue,\n annotations: identityMatches ? annotations : [],\n addAnnotation,\n updateAnnotation,\n removeAnnotation,\n annotationReviewTargetId: identityMatches ? annotationReviewTargetId : null,\n clearAnnotationReviewTarget,\n hasDraftContent,\n send,\n optimisticMessages: visibleOptimisticMessages,\n retryOptimisticMessage,\n removeOptimisticMessage,\n steer,\n steering: visibleSteering,\n stoppingAttempt: identityMatches\n ? visibleSteering?.phase === \"accepted\" && visibleSteering.stoppingPreviousAttempt === true\n ? \"previous\"\n : null\n : null,\n sending: identityMatches ? sending : false,\n canSend:\n identityMatches &&\n Boolean(sessionId) &&\n !sending &&\n !draftLoading &&\n policy !== null &&\n sendBlockedRef.current?.() !== true &&\n annotationsComplete &&\n (hasPendingOperation ||\n visibleValue.trim().length > 0 ||\n hasReadyResources ||\n annotations.length > 0),\n pause,\n pausing: identityMatches ? pausing : false,\n resume,\n resumeScope,\n resuming: identityMatches ? resuming : false,\n effectiveControl: identityMatches ? effectiveControlRef.current : null,\n draft: identityMatches ? draft : null,\n draftRevision: identityMatches ? (draft?.revision ?? 0) : 0,\n draftLoading: identityMatches ? draftLoading : Boolean(sessionId) && durableDrafts,\n draftSaving: identityMatches ? draftSaving : false,\n draftConflict: identityMatches ? draftConflict : null,\n policy: identityMatches ? policy : null,\n setModel: updateModel,\n setReasoningEffort: updateReasoningEffort,\n setLatencyMode: updateLatencyMode,\n draftPersistence: durableDrafts ? \"durable\" : \"disabled\",\n applyDraft,\n reloadDraft,\n resolveDraftConflict,\n restoredResources: identityMatches ? restoredResources : [],\n removeRestoredResource,\n error: identityMatches ? error : null,\n clearError,\n };\n}\n\n/** Events that can atomically replace or clear this subject's durable draft. */\nexport function isComposerDraftEvent(event: Pick<SessionEvent, \"type\">): boolean {\n return event.type === \"user.message\" || event.type === \"session.queue.changed\";\n}\n\n/**\n * Default text for a resource-only message (attachments present, no typed\n * draft). Kept non-empty so the wire contract (`text: z.string().min(1)`) and\n * the worker's non-whitespace guard accept it. The export name is retained for\n * compatibility now that repositories can ride beside files in `resources`.\n */\nexport const FILE_ONLY_MESSAGE_TEXT = \"(see attached context)\";\n\n/** Resolve possibly-deferred extras to a concrete bag (function evaluated now). */\nexport function resolveSendExtras(\n extras: ComposerSendExtras | (() => ComposerSendExtras) | undefined,\n): ComposerSendExtras {\n return (typeof extras === \"function\" ? extras() : extras) ?? {};\n}\n\n/**\n * Merge the draft text + idempotency key with caller-provided extras. The\n * text and clientEventId always win over extras. Exported for tests.\n */\nexport function composeSendInput(\n text: string,\n clientEventId: string,\n extras: ComposerSendExtras | (() => ComposerSendExtras) | undefined,\n bound: Partial<SendMessageInput> = {},\n): SendMessageInput {\n return { ...resolveSendExtras(extras), ...bound, text, clientEventId };\n}\n\n/** Submit on plain Enter; Shift+Enter inserts a newline. Exported for tests. */\nexport function shouldSubmitOnKey(event: {\n key: string;\n shiftKey: boolean;\n metaKey?: boolean;\n ctrlKey?: boolean;\n nativeEvent?: { isComposing?: boolean };\n}): boolean {\n if (event.key !== \"Enter\" || event.shiftKey) {\n return false;\n }\n return event.nativeEvent?.isComposing !== true;\n}\n\n/** Cmd/Ctrl+Enter steers; ordinary Enter appends to the queue. */\nexport function shouldSteerOnKey(event: { metaKey?: boolean; ctrlKey?: boolean }): boolean {\n return event.metaKey === true || event.ctrlKey === true;\n}\n\nfunction generateClientEventId(): string {\n return globalThis.crypto.randomUUID();\n}\n\nfunction isOutcomeUnknownError(cause: unknown): boolean {\n return (\n typeof cause === \"object\" &&\n cause !== null &&\n (cause as { outcomeUnknown?: unknown }).outcomeUnknown === true\n );\n}\n\nasync function replayOutcomeUnknown<T>(command: () => Promise<T>): Promise<T> {\n try {\n return await command();\n } catch (cause) {\n if (!isOutcomeUnknownError(cause)) throw cause;\n return await command();\n }\n}\n\nfunction asError(cause: unknown): Error {\n return cause instanceof Error ? cause : new Error(String(cause));\n}\n\nfunction isDraftConflictError(error: Error): boolean {\n const apiError = error as Partial<OpenGeniApiError>;\n return (\n apiError.status === 409 && apiError.outcomeUnknown !== true && apiError.code === \"DRAFT_CHANGED\"\n );\n}\n\nfunction draftPayload(draft: ComposerDraft): SaveComposerDraftRequest {\n return {\n expectedRevision: draft.revision,\n text: draft.text,\n resources: draft.resources,\n annotations: draft.annotations ?? [],\n model: draft.model,\n reasoningEffort: draft.reasoningEffort,\n latencyMode: draft.latencyMode,\n };\n}\n\nfunction policyFromDraft(draft: ComposerDraft): ComposerPolicy {\n return {\n model: draft.model,\n reasoningEffort: draft.reasoningEffort,\n latencyMode: draft.latencyMode,\n };\n}\n\nfunction composerDraftPayload(\n base: ComposerDraft,\n text: string,\n restoredResources: ResourceRef[],\n annotations: DraftTimelineAnnotation[],\n policy: ComposerPolicy,\n additionalResources: ResourceRef[],\n): SaveComposerDraftRequest {\n return {\n expectedRevision: base.revision,\n text,\n resources: mergeResources(restoredResources, additionalResources),\n annotations,\n model: policy.model,\n reasoningEffort: policy.reasoningEffort,\n latencyMode: policy.latencyMode,\n };\n}\n\nfunction draftSignature(payload: SaveComposerDraftRequest): string {\n const { expectedRevision: _revision, ...content } = payload;\n return JSON.stringify(content);\n}\n\nfunction mergeResources(base: ResourceRef[], additions: ResourceRef[]): ResourceRef[] {\n const seen = new Set<string>();\n return [...base, ...additions].filter((resource) => {\n // Reconnect reconciliation can restore the canonical server form while\n // the still-mounted upload card supplies the same ready file without its\n // default mount. Treat those two wire shapes as one selected attachment;\n // preserving the first representation keeps custom mounts and ordering\n // intact while preventing the draft and command paths from seeing\n // different duplicate counts after server normalization.\n const key =\n resource.kind === \"file\"\n ? `file:${resource.fileId}\\u0000${resource.mountPath ?? `${DEFAULT_FILE_RESOURCE_MOUNT_ROOT}/${resource.fileId}`}`\n : JSON.stringify(resource);\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n"],"mappings":";;;;;;;;AAAA;AAAA,EACE;AAAA,OAaK;AACP,SAAS,aAAa,WAAW,iBAAiB,QAAQ,gBAAgB;AAoG1E,IAAM,kCAAkC;AACxC,IAAM,iCAAiC;AAKvC,IAAM,4BAA4B,oBAAI,IAA4C;AAClF,IAAM,2BAA2B,oBAAI,IAA6C;AAElF,SAAS,4BACP,aACA,WACe;AACf,SAAO,YAAY,GAAG,WAAW,KAAS,SAAS,KAAK;AAC1D;AAEA,SAAS,yBAAyC;AAChD,MAAI;AACF,WAAO,OAAO,WAAW,cAAc,OAAO,OAAO;AAAA,EACvD,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,0BAA0B,KAAqB;AACtD,SAAO,GAAG,+BAA+B,GAAG,mBAAmB,GAAG,CAAC;AACrE;AAEA,SAAS,yBAAyB,KAAqB;AACrD,SAAO,GAAG,8BAA8B,GAAG,mBAAmB,GAAG,CAAC;AACpE;AAEA,SAAS,gCAAgC,KAA+C;AACtF,MAAI,CAAC,IAAK,QAAO,CAAC;AAClB,MAAI,SAAS,yBAAyB,IAAI,GAAG;AAC7C,MAAI,CAAC,QAAQ;AACX,UAAM,UAAU,uBAAuB;AACvC,QAAI;AACF,YAAM,SAAkB,KAAK,MAAM,SAAS,QAAQ,yBAAyB,GAAG,CAAC,KAAK,IAAI;AAC1F,eAAS,MAAM,QAAQ,MAAM,IACxB,OAAO;AAAA,QACN,CAAC,cACC,OAAO,cAAc,YACrB,cAAc,QACd,OAAO,UAAU,kBAAkB,YACnC,OAAO,UAAU,SAAS,YAC1B,OAAO,UAAU,eAAe,aAC/B,UAAU,UAAU,aAAa,UAAU,UAAU,aACtD,OAAO,UAAU,UAAU,YAC3B,UAAU,UAAU,QACpB,OAAO,UAAU,MAAM,SAAS,YAChC,OAAO,UAAU,4BAA4B;AAAA,MACjD,IACA,CAAC;AAAA,IACP,QAAQ;AACN,eAAS,CAAC;AAAA,IACZ;AAAA,EACF;AACA,SAAO,OAAO,IAAI,CAAC,EAAE,yBAAyB,GAAG,UAAU,OAAO;AAAA,IAChE,GAAG;AAAA,IACH,UAAU;AAAA,IACV,aAAa,UAAU,gBAAgB,UAAU,UAAU;AAAA,IAC3D,aAAa,UAAU,eAAe,EAAE,MAAM,IAAI,WAAW,CAAC,GAAG,aAAa,CAAC,EAAE;AAAA,IACjF,OACE,UAAU,UAAU,aAAa,UAAU,UAAU,WAAW,YAAY,UAAU;AAAA,IACxF,gBACE,UAAU,UAAU,aAAa,UAAU,UAAU,WACjD,OACA,UAAU;AAAA,IAChB,OACE,UAAU,UAAU,YAChB,+DACA,UAAU;AAAA,IAChB,OAAO,UAAU;AAAA,IACjB,UAAU,CAAC;AAAA,EACb,EAAE;AACJ;AAEA,SAAS,iCACP,KACA,YACM;AACN,MAAI,CAAC,IAAK;AACV,QAAM,SAAS,WACZ,OAAO,CAAC,cAAc,UAAU,UAAU,QAAQ,EAClD,IAAI,CAAC,cAAc;AAClB,UAAM,EAAE,UAAU,WAAW,OAAO,GAAG,KAAK,IAAI;AAChD,UAAM,EAAE,sBAAsB,cAAc,GAAG,UAAU,IAAI;AAC7D,WAAO;AAAA,MACL,GAAG;AAAA,MACH,OAAO;AAAA,MACP,yBAAyB,MAAM,yBAAyB;AAAA,IAC1D;AAAA,EACF,CAAC;AACH,MAAI,OAAO,WAAW,GAAG;AACvB,6BAAyB,OAAO,GAAG;AACnC,QAAI;AACF,6BAAuB,GAAG,WAAW,yBAAyB,GAAG,CAAC;AAAA,IACpE,QAAQ;AAAA,IAER;AACA;AAAA,EACF;AACA,2BAAyB,IAAI,KAAK,MAAM;AACxC,MAAI;AACF,2BAAuB,GAAG,QAAQ,yBAAyB,GAAG,GAAG,KAAK,UAAU,MAAM,CAAC;AAAA,EACzF,QAAQ;AAAA,EAER;AACF;AAEA,SAAS,aAAa,OAAwC;AAC5D,SACE,MAAM,QAAQ,KAAK,KACnB,MAAM,MAAM,CAAC,cAAc;AACzB,QAAI,OAAO,cAAc,YAAY,cAAc,KAAM,QAAO;AAChE,UAAM,WAAW;AACjB,WAAO,SAAS,SAAS,SACrB,OAAO,SAAS,WAAW,WAC3B,SAAS,SAAS,gBAChB,OAAO,SAAS,QAAQ,YACxB,OAAO,SAAS,QAAQ;AAAA,EAChC,CAAC;AAEL;AAEA,SAAS,uBAAuB,OAAoD;AAClF,SACE,MAAM,QAAQ,KAAK,KACnB,MAAM,MAAM,CAAC,cAAc;AACzB,QAAI,OAAO,cAAc,YAAY,cAAc,KAAM,QAAO;AAChE,UAAM,aAAa;AACnB,UAAM,SAAS,WAAW;AAC1B,QAAI,OAAO,WAAW,YAAY,WAAW,KAAM,QAAO;AAC1D,UAAM,eAAe;AACrB,WACE,OAAO,WAAW,OAAO,YACzB,OAAO,WAAW,UAAU,YAC5B,OAAO,WAAW,SAAS,YAC3B,OAAO,aAAa,YAAY,YAChC,OAAO,aAAa,cAAc,YAClC,OAAO,aAAa,aAAa,aAChC,OAAO,aAAa,WAAW,YAAY,aAAa,WAAW,SACpE,OAAO,aAAa,gBAAgB,YACpC,OAAO,aAAa,cAAc,YAClC,OAAO,aAAa,kBAAkB,YACtC,OAAO,aAAa,iBAAiB;AAAA,EAEzC,CAAC;AAEL;AAEA,SAAS,iBACP,aAC2B;AAC3B,SAAO,YAAY,IAAI,CAAC,gBAAgB;AAAA,IACtC,GAAG;AAAA,IACH,QAAQ,EAAE,GAAG,WAAW,OAAO;AAAA,EACjC,EAAE;AACJ;AAEA,SAAS,mCACP,KACuC;AACvC,QAAM,UAAU,MAAM,uBAAuB,IAAI;AACjD,MAAI,CAAC,WAAW,CAAC,IAAK,QAAO;AAC7B,MAAI;AACF,UAAM,SAAkB,KAAK,MAAM,QAAQ,QAAQ,0BAA0B,GAAG,CAAC,KAAK,MAAM;AAC5F,QAAI,OAAO,WAAW,YAAY,WAAW,KAAM,QAAO;AAC1D,UAAM,SAAS;AACf,UAAM,QAAQ,OAAO;AACrB,UAAM,SAAS,OAAO;AACtB,QACE,OAAO,UAAU,YACjB,UAAU,QACV,OAAO,WAAW,YAClB,WAAW,MACX;AACA,aAAO;AAAA,IACT;AACA,UAAM,cAAc;AACpB,UAAM,eAAe;AACrB,QACG,OAAO,aAAa,UAAU,OAAO,aAAa,WACnD,OAAO,OAAO,gBAAgB,YAC9B,CAAC,aAAa,OAAO,eAAe,KACnC,OAAO,sBAAsB,UAC5B,CAAC,uBAAuB,OAAO,iBAAiB,KAClD,OAAO,aAAa,SAAS,YAC7B,CAAC,aAAa,aAAa,SAAS,KACnC,aAAa,gBAAgB,UAC5B,CAAC,uBAAuB,aAAa,WAAW,KAClD,OAAO,OAAO,uBAAuB,aACrC,OAAO,OAAO,4BAA4B,aAC1C,OAAO,YAAY,SAAS,YAC5B,OAAO,YAAY,kBAAkB,YACrC,0BAA0B,eACzB,eAAe,eAAe,CAAC,aAAa,YAAY,SAAS,KACjE,iBAAiB,eAAe,CAAC,uBAAuB,YAAY,WAAW,GAChF;AACA,aAAO;AAAA,IACT;AACA,WAAO;AAAA,MACL,GAAI;AAAA,MACJ,mBAAmB,uBAAuB,OAAO,iBAAiB,IAC9D,OAAO,oBACP,CAAC;AAAA,MACL,aAAa;AAAA,QACX,GAAI;AAAA,QACJ,aAAa,uBAAuB,aAAa,WAAW,IACxD,aAAa,cACb,CAAC;AAAA,MACP;AAAA,IACF;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,8BACP,KACA,WACM;AACN,QAAM,UAAU,uBAAuB;AACvC,MAAI,CAAC,QAAS;AACd,MAAI;AACF,YAAQ,QAAQ,0BAA0B,GAAG,GAAG,KAAK,UAAU,SAAS,CAAC;AAAA,EAC3E,QAAQ;AAAA,EAER;AACF;AAEA,SAAS,gCAAgC,KAAqD;AAC5F,QAAM,UACH,OAAO,0BAA0B,IAAI,GAAG,MAAM,mCAAmC,GAAG;AACvF,MAAI,CAAC,OAAQ,QAAO;AACpB,SAAO;AAAA,IACL,GAAG;AAAA,IACH,OAAO,OAAO;AAAA,IACd,aAAa,OAAO,eAAe;AAAA,MACjC,MAAM,OAAO;AAAA,MACb,WAAW,OAAO;AAAA,MAClB,aAAa,OAAO;AAAA,IACtB;AAAA,IACA,UAAU,CAAC,OAAO;AAAA,EACpB;AACF;AAEA,SAAS,iCACP,KACA,WACM;AACN,MAAI,CAAC,IAAK;AACV,QAAM,EAAE,UAAU,QAAQ,GAAG,cAAc,IAAI;AAC/C,QAAM,EAAE,OAAO,eAAe,GAAG,aAAa,IAAI;AAClD,QAAM,EAAE,sBAAsB,YAAY,GAAG,UAAU,IAAI;AAC3D,QAAM,SAAS;AAAA,IACb,GAAG;AAAA,IACH,OAAO;AAAA,IACP,yBAAyB,UAAU,MAAM,yBAAyB;AAAA,IAClE,aAAa;AAAA,MACX,MAAM,UAAU,YAAY;AAAA,MAC5B,WAAW,CAAC,GAAG,UAAU,YAAY,SAAS;AAAA,MAC9C,aAAa,iBAAiB,UAAU,YAAY,WAAW;AAAA,MAC/D,GAAI,UAAU,YAAY,SAAS,EAAE,QAAQ,EAAE,GAAG,UAAU,YAAY,OAAO,EAAE,IAAI,CAAC;AAAA,IACxF;AAAA,EACF;AACA,4BAA0B,IAAI,KAAK,MAAM;AACzC,gCAA8B,KAAK,MAAM;AAC3C;AAEA,SAAS,+BAA+B,KAA0B;AAChE,MAAI,CAAC,IAAK;AACV,4BAA0B,OAAO,GAAG;AACpC,QAAM,UAAU,uBAAuB;AACvC,MAAI,CAAC,QAAS;AACd,MAAI;AACF,YAAQ,WAAW,0BAA0B,GAAG,CAAC;AAAA,EACnD,QAAQ;AAAA,EAER;AACF;AAEA,SAAS,4BACP,KACA,WACA,QACiC;AACjC,MAAI,CAAC,OAAO,CAAC,UAAW,QAAO;AAC/B,QAAM,OAAO;AAAA,IACX,GAAG;AAAA,IACH,aAAa;AAAA,MACX,GAAG;AAAA,MACH,WAAW,CAAC,GAAG,OAAO,SAAS;AAAA,MAC/B,aAAa,iBAAiB,OAAO,WAAW;AAAA,IAClD;AAAA,EACF;AACA,mCAAiC,KAAK,IAAI;AAC1C,SAAO;AACT;AA6EA,IAAM,kCAAkC,oBAAI,IAAI;AAAA,EAC9C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,SAAS,0BAA0B,OAA8B;AAC/D,SAAO,gCAAgC,IAAI,MAAM,IAAI;AACvD;AAEA,SAAS,sBACP,UACA,QAC0B;AAC1B,SAAO,OAAO;AAAA,IACZ,CAAC,UACC,MAAM,SAAS,kBACf,SAAS,kBAAkB,QAC3B,MAAM,kBAAkB,SAAS;AAAA,EACrC;AACF;AAEA,SAAS,uBACP,gBACA,QACe;AACf,MAAI,CAAC,eAAgB,QAAO;AAC5B,QAAM,SAAS,OAAO,KAAK,CAAC,UAAU;AACpC,QAAI,MAAM,SAAS,cAAe,QAAO;AACzC,UAAMA,WAAU,MAAM;AACtB,WACE,OAAOA,aAAY,YACnBA,aAAY,QACZ,oBAAoBA,YACpBA,SAAQ,mBAAmB;AAAA,EAE/B,CAAC;AACD,MAAI,CAAC,OAAQ,QAAO;AACpB,MAAI,OAAO,OAAQ,QAAO,OAAO;AACjC,QAAM,UAAU,OAAO;AACvB,SAAO,OAAO,YAAY,YACxB,YAAY,QACZ,YAAY,WACZ,OAAO,QAAQ,WAAW,WACxB,QAAQ,SACR;AACN;AAEA,SAAS,wBACP,UACA,QACS;AACT,QAAM,kBACJ,SAAS,kBAAkB,sBAAsB,UAAU,MAAM,GAAG,MAAM;AAC5E,SAAO,OAAO,KAAK,CAAC,UAAU;AAC5B,QAAI,SAAS,UAAU,MAAM,WAAW,SAAS,UAAU,0BAA0B,KAAK,GAAG;AAC3F,aAAO;AAAA,IACT;AACA,QAAI,MAAM,SAAS,kBAAkB,CAAC,gBAAiB,QAAO;AAC9D,UAAM,UAAU,MAAM;AACtB,WACE,OAAO,YAAY,YACnB,YAAY,QACZ,oBAAoB,WACpB,QAAQ,mBAAmB;AAAA,EAE/B,CAAC;AACH;AAEA,SAAS,kCACP,WACA,QAC6E;AAC7E,QAAM,WAAW,OAAO;AAAA,IACtB,CAAC,UAAU,MAAM,SAAS,kBAAkB,MAAM,kBAAkB,UAAU;AAAA,EAChF;AACA,QAAM,iBAAiB,UAAU,kBAAkB,UAAU,MAAM;AACnE,QAAM,SAAS,UAAU,UAAU,uBAAuB,gBAAgB,MAAM;AAChF,QAAM,uBACJ,aAAa,WACZ,UAAU,UAAU,YACnB,UAAU,mBAAmB,kBAC7B,UAAU,WAAW,UACrB,UAAU,UAAU,UACpB,UAAU,mBAAmB;AACjC,QAAM,aAAsC,uBACxC;AAAA,IACE,GAAG;AAAA,IACH,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP,gBAAgB;AAAA,EAClB,IACA;AACJ,QAAM,qBAAqB,OAAO,KAAK,CAAC,UAAU;AAChD,QAAI,MAAM,SAAS,2BAA2B,CAAC,OAAQ,QAAO;AAC9D,UAAM,UAAU,MAAM;AACtB,QAAI,OAAO,YAAY,YAAY,YAAY,QAAQ,MAAM,QAAQ,OAAO,EAAG,QAAO;AACtF,UAAM,SAAS;AACf,WACE,OAAO,WAAW,WAAW,OAAO,cAAc,UAAU,OAAO,cAAc;AAAA,EAErF,CAAC;AACD,SAAO;AAAA,IACL,WAAW;AAAA,IACX,UAAU,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA,IAKvB,SACE,sBACA;AAAA,MACE;AAAA,QACE,OAAO;AAAA,QACP,MAAM,WAAW;AAAA,QACjB,eAAe,WAAW;AAAA,QAC1B,gBAAgB,WAAW,kBAAkB;AAAA,QAC7C,QAAQ,WAAW,UAAU;AAAA,MAC/B;AAAA,MACA;AAAA,IACF;AAAA,EACJ;AACF;AAQO,SAAS,YACd,WACA,UAA8B,CAAC,GACN;AACzB,QAAM,EAAE,QAAQ,aAAa,0BAA0B,IAAI,mBAAmB,OAAO;AACrF,QAAM,gBAAgB,QAAQ,qBAAqB;AACnD,MAAI,CAAC,iBAAiB,CAAC,QAAQ,eAAe;AAC5C,UAAM,IAAI,MAAM,uEAAuE;AAAA,EACzF;AACA,QAAM,YAAY,GAAG,WAAW,KAAS,aAAa,EAAE,KAAS,gBAAgB,YAAY,UAAU;AACvG,QAAM,sBAAsB,4BAA4B,aAAa,SAAS;AAC9E,QAAM,0BAA0B,gCAAgC,mBAAmB;AACnF,QAAM,yBAAyB,gCAAgC,mBAAmB;AAClF,QAAM,gBACJ,yBAAyB,eAAe,uBAAuB,GAAG,EAAE,GAAG;AACzE,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,MAAM,eAAe,QAAQ,EAAE;AAClE,QAAM,CAAC,aAAa,cAAc,IAAI;AAAA,IACpC,MAAM,eAAe,eAAe,CAAC;AAAA,EACvC;AACA,QAAM,CAAC,0BAA0B,2BAA2B,IAAI,SAAwB,IAAI;AAG5F,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAS,SAAS;AAC9D,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,QAAM,CAAC,iBAAiB,kBAAkB,IACxC,SAAoC,sBAAsB;AAC5D,QAAM,CAAC,UAAU,WAAW,IAAI;AAAA,IAAuC,MACrE,yBAAyB,aAAa,UAClC;AAAA,MACE,OAAO;AAAA,MACP,MAAM,wBAAwB,MAAM;AAAA,MACpC,eAAe,wBAAwB,MAAM,iBAAiB;AAAA,MAC9D,gBAAgB;AAAA,MAChB,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,gBAAgB;AAAA,IAClB,IACA;AAAA,EACN;AACA,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,QAAM,CAAC,iBAAiB,kBAAkB,IAAI,SAAyC,IAAI;AAC3F,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAC9C,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAuB,IAAI;AACrD,QAAM,CAAC,OAAO,QAAQ,IAAI,SAA+B,IAAI;AAC7D,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,QAAQ,SAAS,KAAK,aAAa;AACpF,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,KAAK;AACpD,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAuB,IAAI;AACrE,QAAM,CAAC,QAAQ,SAAS,IAAI;AAAA,IAC1B,MAAM,eAAe,UAAU,QAAQ,iBAAiB;AAAA,EAC1D;AACA,QAAM,CAAC,mBAAmB,oBAAoB,IAAI;AAAA,IAChD,MAAM,eAAe,aAAa,CAAC;AAAA,EACrC;AACA,QAAM,sBAAsB,OAAwC,uBAAuB;AAC3F,QAAM,qBAAqB,OAAkC,sBAAsB;AACnF,QAAM,6BAA6B,OAAO,KAAK;AAC/C,QAAM,2BAA2B,OAAO,oBAAI,IAAY,CAAC;AACzD,QAAM,8BAA8B,OAAuB,CAAC,CAAC;AAC7D,QAAM,cAAc,OAAO,QAAQ;AACnC,QAAM,wBAAwB,QAAO,oBAAI,KAAK,GAAE,YAAY,CAAC;AAC7D,QAAM,uBAAuB;AAAA,IAC3B,yBAAyB,MAAM,iBAAiB;AAAA,EAClD;AACA,QAAM,WAAW,OAAO,eAAe,QAAQ,EAAE;AACjD,QAAM,iBAAiB,OAAkC,eAAe,eAAe,CAAC,CAAC;AACzF,QAAM,YAAY;AAAA,IAChB,eAAe,UAAU,QAAQ,iBAAiB;AAAA,EACpD;AACA,QAAM,WAAW,OAA6B,IAAI;AAClD,QAAM,uBAAuB,OAAsB,eAAe,aAAa,CAAC,CAAC;AACjF,QAAM,oBAAoB,OAAO,gBAAgB,IAAI,CAAC;AACtD,QAAM,mBAAmB,OAAO,CAAC;AACjC,QAAM,sBAAsB,OAAO,CAAC;AACpC,QAAM,uBAAuB,OAAsB,IAAI;AACvD,QAAM,oBAAoB,OAIvB,EAAE,WAAW,UAAU,GAAG,OAAO,KAAK,CAAC;AAC1C,QAAM,qBAAqB,OAAsB,IAAI;AACrD,QAAM,YAAY,OAAsB,QAAQ,QAAQ,CAAC;AACzD,QAAM,SAAS,QAAQ;AACvB,QAAM,cAAc,QAAQ;AAC5B,QAAM,qBAAqB,OAAO,QAAQ,eAAe;AACzD,qBAAmB,UAAU,QAAQ;AACrC,kBAAgB,MAAM;AACpB,gBAAY,UAAU;AAAA,EACxB,GAAG,CAAC,QAAQ,CAAC;AAGb,QAAM,gBAAgB,OAAO,QAAQ,UAAU;AAC/C,gBAAc,UAAU,QAAQ;AAChC,QAAM,qBAAqB,OAAO,QAAQ,eAAe;AACzD,qBAAmB,UAAU,QAAQ;AACrC,QAAM,iBAAiB,OAAO,QAAQ,WAAW;AACjD,iBAAe,UAAU,QAAQ;AACjC,QAAM,sBAAsB;AAAA,IAC1B,mBAAmB,QAAQ,oBAAoB;AAAA,EACjD;AACA,sBAAoB,UAAU,mBAAmB,QAAQ,oBAAoB;AAC7E,QAAM,oBAAoB,KAAK,UAAU,kBAAkB,QAAQ,UAAU,CAAC;AAI9E,QAAM,eAAe,OAAO,SAAS;AACrC,kBAAgB,MAAM;AACpB,QAAI,aAAa,YAAY,UAAW;AACxC,QAAI,kBAAkB,QAAQ,UAAU,MAAM;AAC5C,mBAAa,kBAAkB,QAAQ,KAAK;AAAA,IAC9C;AACA,sBAAkB,UAAU,EAAE,WAAW,UAAU,GAAG,OAAO,KAAK;AAClE,iBAAa,UAAU;AACvB,qBAAiB,WAAW;AAC5B,wBAAoB,WAAW;AAC/B,wBAAoB,UAAU,gCAAgC,mBAAmB;AACjF,UAAM,0BAA0B,gCAAgC,mBAAmB;AACnF,uBAAmB,UAAU;AAC7B,+BAA2B,UAAU;AACrC,6BAAyB,UAAU,oBAAI,IAAI;AAC3C,gCAA4B,UAAU,CAAC;AACvC,yBAAqB,UAAU,oBAAoB,SAAS,MAAM,iBAAiB;AACnF,UAAM,SACJ,oBAAoB,SAAS,eAAe,wBAAwB,GAAG,EAAE,GAAG;AAC9E,sBAAkB,UAAU,SAAS,IAAI;AACzC,aAAS,UAAU,QAAQ,QAAQ;AACnC,mBAAe,UAAU,QAAQ,eAAe,CAAC;AACjD,cAAU,UAAU,QAAQ,UAAU,QAAQ,iBAAiB;AAC/D,aAAS,UAAU;AACnB,yBAAqB,UAAU,QAAQ,aAAa,CAAC;AACrD,uBAAmB,UAAU;AAG7B,cAAU,UAAU,QAAQ,QAAQ;AACpC,sBAAkB,SAAS;AAC3B,aAAS,QAAQ,QAAQ,EAAE;AAC3B,mBAAe,QAAQ,eAAe,CAAC,CAAC;AACxC,cAAU,UAAU,OAAO;AAC3B,gCAA4B,IAAI;AAChC,eAAW,KAAK;AAChB,uBAAmB,uBAAuB;AAC1C;AAAA,MACE,oBAAoB,SAAS,aAAa,UACtC;AAAA,QACE,OAAO;AAAA,QACP,MAAM,oBAAoB,QAAQ,MAAM;AAAA,QACxC,eAAe,oBAAoB,QAAQ,MAAM,iBAAiB;AAAA,QAClE,gBAAgB;AAAA,QAChB,QAAQ;AAAA,QACR,OAAO;AAAA,QACP,gBAAgB;AAAA,MAClB,IACA;AAAA,IACN;AACA,eAAW,KAAK;AAChB,uBAAmB,IAAI;AACvB,gBAAY,KAAK;AACjB,aAAS,IAAI;AACb,aAAS,IAAI;AACb,oBAAgB,QAAQ,SAAS,KAAK,aAAa;AACnD,mBAAe,KAAK;AACpB,qBAAiB,IAAI;AACrB,yBAAqB,QAAQ,aAAa,CAAC,CAAC;AAAA,EAC9C,GAAG,CAAC,eAAe,QAAQ,eAAe,qBAAqB,WAAW,SAAS,CAAC;AACpF;AAAA,IACE,MAAM,MAAM;AACV,UAAI,kBAAkB,QAAQ,UAAU,MAAM;AAC5C,qBAAa,kBAAkB,QAAQ,KAAK;AAAA,MAC9C;AAAA,IACF;AAAA,IACA,CAAC;AAAA,EACH;AAEA,QAAM,2BAA2B;AAAA,IAC/B,CAAC,WAAsC;AACrC,UAAI,mBAAmB,QAAQ,WAAW,EAAG;AAC7C,YAAM,OAAO,mBAAmB,QAAQ,IAAI,CAAC,eAAe;AAAA,QAC1D,GAAG;AAAA,QACH,aAAa;AAAA,UACX,MAAM,OAAO;AAAA,UACb,WAAW,CAAC,GAAG,OAAO,SAAS;AAAA,UAC/B,aAAa,iBAAiB,OAAO,WAAW;AAAA,UAChD,GAAI,OAAO,SAAS,EAAE,QAAQ,EAAE,GAAG,OAAO,OAAO,EAAE,IAAI,CAAC;AAAA,QAC1D;AAAA,MACF,EAAE;AACF,yBAAmB,UAAU;AAC7B,uCAAiC,qBAAqB,IAAI;AAC1D,yBAAmB,IAAI;AAAA,IACzB;AAAA,IACA,CAAC,mBAAmB;AAAA,EACtB;AAEA,QAAM,aAAa;AAAA,IACjB,CAAC,SAA8B;AAC7B,UAAI,aAAa,YAAY,UAAW;AACxC,UAAI,CAAC,eAAe;AAClB,cAAMC,cAAa,gBAAgB,IAAI;AACvC,0BAAkB,WAAW;AAC7B,iBAAS,UAAU,KAAK;AACxB,uBAAe,UAAU,KAAK,eAAe,CAAC;AAC9C,kBAAU,UAAUA;AACpB,6BAAqB,UAAU,KAAK;AACpC,iBAAS,UAAU;AACnB,2BAAmB,UAAU;AAC7B,iBAAS,IAAI;AACb,iBAAS,KAAK,IAAI;AAClB,uBAAe,KAAK,eAAe,CAAC,CAAC;AACrC,kBAAUA,WAAU;AACpB,6BAAqB,KAAK,SAAS;AACnC,4BAAoB,UAAU;AAAA,UAC5B;AAAA,UACA,oBAAoB;AAAA,UACpB;AAAA,YACE,MAAM,KAAK;AAAA,YACX,WAAW;AAAA,cACT,KAAK;AAAA,cACL,kBAAkB,cAAc,OAAO,EAAE,aAAa,CAAC;AAAA,YACzD;AAAA,YACA,aAAa,KAAK,eAAe,CAAC;AAAA,YAClC,QAAQA;AAAA,UACV;AAAA,QACF;AACA,iCAAyB;AAAA,UACvB,MAAM,KAAK;AAAA,UACX,WAAW;AAAA,YACT,KAAK;AAAA,YACL,kBAAkB,cAAc,OAAO,EAAE,aAAa,CAAC;AAAA,UACzD;AAAA,UACA,aAAa,KAAK,eAAe,CAAC;AAAA,UAClC,QAAQA;AAAA,QACV,CAAC;AACD,yBAAiB,IAAI;AACrB;AAAA,MACF;AACA,YAAM,aAAa,gBAAgB,IAAI;AACvC,eAAS,UAAU,KAAK;AACxB,qBAAe,UAAU,KAAK,eAAe,CAAC;AAC9C,gBAAU,UAAU;AACpB,eAAS,UAAU;AACnB,2BAAqB,UAAU,KAAK;AACpC,yBAAmB,UAAU,eAAe,aAAa,IAAI,CAAC;AAC9D,wBAAkB,WAAW;AAC7B,eAAS,IAAI;AACb,eAAS,KAAK,IAAI;AAClB,qBAAe,KAAK,eAAe,CAAC,CAAC;AACrC,gBAAU,UAAU;AACpB,2BAAqB,KAAK,SAAS;AACnC,0BAAoB,UAAU;AAAA,QAC5B;AAAA,QACA,oBAAoB;AAAA,QACpB;AAAA,UACE,MAAM,KAAK;AAAA,UACX,WAAW;AAAA,YACT,KAAK;AAAA,YACL,kBAAkB,cAAc,OAAO,EAAE,aAAa,CAAC;AAAA,UACzD;AAAA,UACA,aAAa,KAAK,eAAe,CAAC;AAAA,UAClC,QAAQ;AAAA,QACV;AAAA,MACF;AACA,+BAAyB;AAAA,QACvB,MAAM,KAAK;AAAA,QACX,WAAW;AAAA,UACT,KAAK;AAAA,UACL,kBAAkB,cAAc,OAAO,EAAE,aAAa,CAAC;AAAA,QACzD;AAAA,QACA,aAAa,KAAK,eAAe,CAAC;AAAA,QAClC,QAAQ;AAAA,MACV,CAAC;AACD,uBAAiB,IAAI;AAAA,IACvB;AAAA,IACA,CAAC,eAAe,qBAAqB,0BAA0B,SAAS;AAAA,EAC1E;AAEA,QAAM,YAAY;AAAA,IAChB,OAAO,iBAAyC;AAC9C,UAAI,aAAa,YAAY,UAAW;AACxC,UAAI,CAAC,aAAa,CAAC,eAAe;AAChC,wBAAgB,KAAK;AACrB;AAAA,MACF;AACA,UAAI,QAAQ,kBAAkB;AAC9B,UAAI,MAAM,cAAc,WAAW;AACjC,YAAI,MAAM,UAAU,KAAM,cAAa,MAAM,KAAK;AAClD,gBAAQ,EAAE,WAAW,UAAU,GAAG,OAAO,KAAK;AAC9C,0BAAkB,UAAU;AAAA,MAC9B;AACA,YAAM,gBAAgB,MAAY;AAChC,YAAI,MAAM,UAAU,KAAM;AAC1B,cAAM,QAAQ;AAAA,UACZ,MAAM;AACJ,gBAAI,kBAAkB,YAAY,SAAS,aAAa,YAAY,UAAW;AAC/E,kBAAM,QAAQ;AACd,iBAAK,UAAU,KAAK;AAAA,UACtB;AAAA,UACA,KAAK,IAAI,MAAQ,MAAQ,MAAM,MAAM,WAAW,EAAE,KAAK,MAAM,KAAK,OAAO,IAAI;AAAA,QAC/E;AAAA,MACF;AACA,UAAI,CAAC,gBAAgB,MAAM,UAAU,KAAM;AAC3C,UAAI,qBAAqB,YAAY,UAAW;AAChD,UAAI,MAAM,UAAU,MAAM;AACxB,qBAAa,MAAM,KAAK;AACxB,cAAM,QAAQ;AAAA,MAChB;AACA,2BAAqB,UAAU;AAC/B,YAAM,aAAa,iBAAiB;AACpC,YAAM,aAAa,EAAE,oBAAoB;AACzC,YAAM,eAAe,kBAAkB;AACvC,YAAM,cAAc,SAAS;AAC7B,YAAM,gBAAgB,UAAU;AAChC,YAAM,wBAAwB,cAC1B,gBACE;AAAA,QACE;AAAA,UACE;AAAA,UACA,SAAS;AAAA,UACT,qBAAqB;AAAA,UACrB,eAAe;AAAA,UACf;AAAA,UACA,kBAAkB,cAAc,OAAO,EAAE,aAAa,CAAC;AAAA,QACzD;AAAA,MACF,IACA,OACF;AACJ,YAAM,uBACJ,0BAA0B,OACtB,iBAAiB,IACjB,0BAA0B,mBAAmB;AAInD,YAAM,cAAc,gBAAgB,SAAS,YAAY;AACzD,UAAI,aAAa;AACf,wBAAgB,IAAI;AAAA,MACtB;AACA,UAAI;AACF,cAAM,UAAU,MAAM,OAAO,iBAAiB,aAAa,SAAS;AACpE,YACE,eAAe,iBAAiB,WAChC,aAAa,YAAY,aACzB,eAAe,oBAAoB,SACnC;AACA;AAAA,QACF;AACA,YAAI,MAAM,UAAU,KAAM,cAAa,MAAM,KAAK;AAClD,cAAM,WAAW;AACjB,cAAM,QAAQ;AACd,cAAM,kBAAkB,SAAS,SAAS,YAAY;AAKtD,YAAI,gBAAgB,QAAQ,WAAW,iBAAiB;AACtD,mBAAS,UAAU;AACnB,mBAAS,OAAO;AAChB,2BAAiB,IAAI;AACrB,gBAAM,SACJ,oBAAoB,SAAS,eAC7B,mBAAmB,QAAQ,GAAG,EAAE,GAAG;AACrC,cAAI,QAAQ;AAGV,qBAAS,UAAU,OAAO;AAC1B,iCAAqB,UAAU,OAAO;AACtC,2BAAe,UAAU,OAAO;AAChC,gBAAI,OAAO,OAAQ,WAAU,UAAU,OAAO;AAC9C,8BAAkB,YAAY;AAC9B,qBAAS,OAAO,IAAI;AACpB,iCAAqB,OAAO,SAAS;AACrC,2BAAe,OAAO,WAAW;AACjC,gBAAI,OAAO,OAAQ,WAAU,OAAO,MAAM;AAAA,UAC5C,WACE,gBACC,CAAC,wBAAwB,iBAAiB,kBAAkB,SAC7D;AACA,kBAAM,gBAAgB,gBAAgB,OAAO;AAC7C,qBAAS,UAAU,QAAQ;AAC3B,iCAAqB,UAAU,QAAQ;AACvC,2BAAe,UAAU,QAAQ,eAAe,CAAC;AACjD,sBAAU,UAAU;AACpB,+BAAmB,UAAU,eAAe,aAAa,OAAO,CAAC;AACjE,qBAAS,QAAQ,IAAI;AACrB,iCAAqB,QAAQ,SAAS;AACtC,2BAAe,QAAQ,eAAe,CAAC,CAAC;AACxC,sBAAU,aAAa;AAAA,UACzB,OAAO;AAIL,+BAAmB,UAAU,eAAe,aAAa,OAAO,CAAC;AACjE,gBAAI,CAAC,UAAU,SAAS;AACtB,oBAAM,gBAAgB,gBAAgB,OAAO;AAC7C,wBAAU,UAAU;AACpB,wBAAU,aAAa;AAAA,YACzB;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,YACE,eAAe,iBAAiB,WAChC,aAAa,YAAY,aACzB,eAAe,oBAAoB,SACnC;AACA,mBAAS,QAAQ,KAAK,CAAC;AACvB,cACE,iBAAiB,aAChB,SAAS,OAAO,UAAU,YAAY,eAAe,SAAS,MAAM,cAAc,MACnF;AACA,kBAAM,YAAY;AAClB,0BAAc;AAAA,UAChB,OAAO;AACL,gBAAI,MAAM,UAAU,KAAM,cAAa,MAAM,KAAK;AAClD,kBAAM,WAAW;AACjB,kBAAM,QAAQ;AAAA,UAChB;AAAA,QACF;AAAA,MACF,UAAE;AACA,YACE,eAAe,iBAAiB,WAChC,aAAa,YAAY,aACzB,eAAe,oBAAoB,SACnC;AACA,0BAAgB,KAAK;AAAA,QACvB;AACA,YAAI,qBAAqB,YAAY,WAAW;AAC9C,+BAAqB,UAAU;AAAA,QACjC;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,QAAQ,eAAe,WAAW,WAAW,WAAW;AAAA,EAC3D;AAEA,YAAU,MAAM;AACd,QAAI,CAAC,aAAa,CAAC,eAAe;AAChC,sBAAgB,KAAK;AACrB;AAAA,IACF;AACA,SAAK,UAAU,KAAK;AAAA,EACtB,GAAG,CAAC,eAAe,WAAW,SAAS,CAAC;AAIxC,YAAU,MAAM;AACd,QAAI,CAAC,aAAa,CAAC,cAAe;AAClC,UAAM,SAAS,MAAM;AACnB,UAAI,OAAO,aAAa,eAAe,SAAS,oBAAoB,SAAU;AAC9E,WAAK,UAAU,KAAK;AAAA,IACtB;AACA,aAAS,iBAAiB,oBAAoB,MAAM;AACpD,WAAO,iBAAiB,YAAY,MAAM;AAC1C,WAAO,MAAM;AACX,eAAS,oBAAoB,oBAAoB,MAAM;AACvD,aAAO,oBAAoB,YAAY,MAAM;AAAA,IAC/C;AAAA,EACF,GAAG,CAAC,eAAe,WAAW,SAAS,CAAC;AACxC,YAAU,MAAM;AACd,QAAI,CAAC,aAAa,CAAC,cAAe;AAClC,WAAO,0BAA0B,WAAW,YAAY,YAAY,MAAM,UAAU,KAAK,CAAC;AAAA,EAC5F,GAAG,CAAC,eAAe,WAAW,2BAA2B,SAAS,CAAC;AACnE,QAAM,oBAAoB,YAAY,YAA2B;AAC/D,QAAI,CAAC,aAAa,CAAC,YAAY,QAAS;AACxC,UAAM,iBAAiB;AACvB,QAAI;AACJ,QAAI;AACF,eAAS,MAAM,OAAO,WAAW,aAAa,WAAW;AAAA,QACvD,cAAc;AAAA,UACZ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,OAAO;AAAA,QACP,aAAa;AAAA,MACf,CAAC;AAAA,IACH,QAAQ;AAEN;AAAA,IACF;AACA,QAAI,aAAa,YAAY,eAAgB;AAC7C,gBAAY,CAAC,YAAY;AACvB,UAAI,CAAC,QAAS,QAAO;AACrB,UAAI,wBAAwB,SAAS,MAAM,GAAG;AAC5C,oCAA4B,UAAU,CAAC;AACvC,eAAO;AAAA,MACT;AACA,YAAM,WAAW,sBAAsB,SAAS,MAAM;AACtD,UAAI,CAAC,YAAY,QAAQ,eAAgB,QAAO;AAChD,aAAO;AAAA,QACL,GAAG;AAAA,QACH,OAAO;AAAA,QACP,gBAAgB,SAAS;AAAA,MAC3B;AAAA,IACF,CAAC;AAAA,EACH,GAAG,CAAC,QAAQ,WAAW,WAAW,WAAW,CAAC;AAC9C;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA,CAAC,UAAU,qBAAqB,KAAK,KAAK,0BAA0B,KAAK;AAAA,IACzE,CAAC,UAAU;AACT,UAAI,qBAAqB,KAAK,EAAG,MAAK,UAAU,KAAK;AACrD,UAAI,CAAC,0BAA0B,KAAK,EAAG;AACvC,kCAA4B,UAAU;AAAA,QACpC,GAAG,4BAA4B,QAAQ,MAAM,GAAG;AAAA,QAChD;AAAA,MACF;AACA,kBAAY,CAAC,YAAY;AACvB,YAAI,CAAC,WAAW,CAAC,wBAAwB,SAAS,CAAC,KAAK,CAAC,EAAG,QAAO;AACnE,oCAA4B,UAAU,CAAC;AACvC,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,IACA;AAAA,MACE,SAAS,QAAQ,SAAS,MAAM,iBAAiB,aAAa;AAAA,MAC9D,GAAI,QAAQ,WAAW,SAAY,EAAE,QAAQ,QAAQ,OAAO,IAAI,CAAC;AAAA,IACnE;AAAA,IACA;AAAA,EACF;AAEA,YAAU,MAAM;AACd,QAAI,CAAC,SAAU;AACf,UAAM,WAAW,CAAC,GAAI,QAAQ,UAAU,CAAC,GAAI,GAAG,4BAA4B,OAAO;AACnF,QAAI,CAAC,wBAAwB,UAAU,QAAQ,EAAG;AAClD,gCAA4B,UAAU,CAAC;AACvC,gBAAY,IAAI;AAAA,EAClB,GAAG,CAAC,QAAQ,QAAQ,QAAQ,CAAC;AAE7B,YAAU,MAAM;AACd,QAAI,CAAC,gBAAiB;AACtB,UAAM,mBAAmB,QAAQ;AACjC,QAAI,CAAC,oBAAoB,iBAAiB,iBAAiB,gBAAgB,gBAAgB;AACzF;AAAA,IACF;AACA,uBAAmB,CAAC,YAAa,YAAY,kBAAkB,OAAO,OAAQ;AAAA,EAChF,GAAG,CAAC,iBAAiB,QAAQ,gBAAgB,CAAC;AAE9C,QAAM,sBAAsB,YAAY,MAAuC;AAC7E,QAAI,CAAC,iBAAiB,aAAa,YAAY,UAAW,QAAO;AACjE,UAAM,OAAO,SAAS;AACtB,UAAM,gBAAgB,UAAU;AAChC,QAAI,CAAC,QAAQ,CAAC,cAAe,QAAO;AACpC,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,kBAAkB,cAAc,OAAO,EAAE,aAAa,CAAC;AAAA,IACzD;AAAA,EACF,GAAG,CAAC,aAAa,eAAe,mBAAmB,WAAW,KAAK,CAAC;AAEpE,QAAM,iBAAiB;AAAA,IACrB,CAAC,SAA8B;AAC7B,UAAI,aAAa,YAAY,UAAW;AACxC,eAAS,UAAU;AACnB,eAAS,IAAI;AACb,yBAAmB,UAAU,eAAe,aAAa,IAAI,CAAC;AAC9D,uBAAiB,IAAI;AACrB,eAAS,IAAI;AAAA,IACf;AAAA,IACA,CAAC,SAAS;AAAA,EACZ;AAEA,QAAM,iBAAiB;AAAA,IACrB,OAAO,YAAwD;AAC7D,YAAM,iBAAiB;AACvB,YAAM,kBAAkB,iBAAiB;AACzC,UAAI,CAAC,aAAa,CAAC,iBAAiB,aAAa,YAAY,gBAAgB;AAC3E,eAAO;AAAA,MACT;AACA,UAAI,UAAU;AACd,YAAM,MAAM,YAAY;AACtB,YACE,aAAa,YAAY,kBACzB,iBAAiB,YAAY,iBAC7B;AACA;AAAA,QACF;AACA,cAAM,UAAU,SAAS;AACzB,YAAI,CAAC,QAAS;AACd,cAAM,UAAU,EAAE,GAAG,SAAS,kBAAkB,QAAQ,SAAS;AACjE,cAAM,YAAY,eAAe,OAAO;AACxC,YAAI,cAAc,mBAAmB,SAAS;AAC5C,oBAAU;AACV;AAAA,QACF;AACA,uBAAe,IAAI;AACnB,YAAI;AACF,gBAAM,QAAQ,MAAM,OAAO,kBAAkB,aAAa,WAAW,OAAO;AAC5E,cACE,aAAa,YAAY,kBACzB,iBAAiB,YAAY,iBAC7B;AACA;AAAA,UACF;AACA,yBAAe,KAAK;AACpB,oBAAU;AAAA,QACZ,SAAS,OAAO;AACd,cACE,aAAa,YAAY,kBACzB,iBAAiB,YAAY,iBAC7B;AACA,kBAAM,UAAU,QAAQ,KAAK;AAC7B,gBAAI,qBAAqB,OAAO,EAAG,kBAAiB,OAAO;AAC3D,qBAAS,OAAO;AAAA,UAClB;AAAA,QACF,UAAE;AACA,cACE,aAAa,YAAY,kBACzB,iBAAiB,YAAY,iBAC7B;AACA,2BAAe,KAAK;AAAA,UACtB;AAAA,QACF;AAAA,MACF;AACA,gBAAU,UAAU,UAAU,QAAQ,KAAK,KAAK,GAAG;AACnD,YAAM,UAAU;AAChB,aAAO;AAAA,IACT;AAAA,IACA,CAAC,gBAAgB,QAAQ,eAAe,WAAW,WAAW,WAAW;AAAA,EAC3E;AAEA,QAAM,yBAAyB;AAAA,IAC7B,CACE,WAC8B;AAC9B,YAAM,OAAO,OAAO,mBAAmB,OAAO;AAC9C,yBAAmB,UAAU;AAC7B,uCAAiC,qBAAqB,IAAI;AAC1D,yBAAmB,IAAI;AACvB,aAAO;AAAA,IACT;AAAA,IACA,CAAC,mBAAmB;AAAA,EACtB;AAEA,QAAM,yBAAyB;AAAA,IAC7B,CAAC,cAA6C;AAC5C,UAAI,CAAC,yBAAyB,QAAQ,IAAI,UAAU,aAAa,GAAG;AAClE,iCAAyB,QAAQ,IAAI,UAAU,aAAa;AAC5D,iBAAS,UAAU,MAAM,MAAM,UAAU,KAAK;AAAA,MAChD;AACA;AAAA,QAAuB,CAAC,YACtB,QAAQ,OAAO,CAAC,cAAc,UAAU,kBAAkB,UAAU,aAAa;AAAA,MACnF;AAAA,IACF;AAAA,IACA,CAAC,QAAQ,sBAAsB;AAAA,EACjC;AAEA,YAAU,MAAM;AACd,UAAM,SAAS,QAAQ,UAAU,CAAC;AAClC,QAAI,OAAO,WAAW,KAAK,mBAAmB,QAAQ,WAAW,EAAG;AACpE,UAAM,aAAa,mBAAmB,QAAQ;AAAA,MAAI,CAAC,cACjD,kCAAkC,WAAW,MAAM;AAAA,IACrD;AACA,UAAM,aAAa,IAAI;AAAA,MACrB,WAAW,OAAO,CAAC,SAAS,KAAK,OAAO,EAAE,IAAI,CAAC,SAAS,KAAK,UAAU,aAAa;AAAA,IACtF;AACA,UAAM,UAAU,WAAW;AAAA,MACzB,CAAC,MAAM,UACL,KAAK,cAAc,mBAAmB,QAAQ,KAAK,KACnD,CAAC,WAAW,IAAI,KAAK,UAAU,aAAa;AAAA,IAChD;AACA,eAAW,QAAQ,YAAY;AAC7B,UAAI,KAAK,YAAY,CAAC,yBAAyB,QAAQ,IAAI,KAAK,UAAU,aAAa,GAAG;AACxF,iCAAyB,QAAQ,IAAI,KAAK,UAAU,aAAa;AACjE,iBAAS,KAAK,UAAU,MAAM,MAAM,KAAK,UAAU,KAAK;AAAA,MAC1D;AACA,UAAI,KAAK,QAAS,wBAAuB,KAAK,SAAS;AAAA,IACzD;AACA,QAAI,SAAS;AACX;AAAA,QAAuB,CAAC,YACtB,QACG;AAAA,UACC,CAAC,cACC,WAAW,KAAK,CAAC,SAAS,KAAK,UAAU,kBAAkB,UAAU,aAAa,GAC9E,aAAa;AAAA,QACrB,EACC,OAAO,CAAC,cAAc,CAAC,WAAW,IAAI,UAAU,aAAa,CAAC;AAAA,MACnE;AAAA,IACF;AACA,QAAI,iBAAiB,WAAW,KAAK,CAAC,SAAS,KAAK,QAAQ,EAAG,MAAK,UAAU,KAAK;AAAA,EACrF,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,EACF,CAAC;AAED,QAAM,yBAAyB,YAAY,MAAY;AACrD,QAAI,CAAC,aAAa,2BAA2B,QAAS;AACtD,UAAM,oBAAoB,mBAAmB;AAC7C,UAAM,iBAAiB,kBAAkB;AAAA,MACvC,CAAC,cAAc,UAAU,UAAU;AAAA,IACrC;AACA,UAAM,YAAY,iBAAiB,IAAI,SAAY,kBAAkB,cAAc;AACnF,QAAI,CAAC,UAAW;AAChB,UAAM,iBAAiB;AACvB,UAAM,kBAAkB,iBAAiB;AACzC,+BAA2B,UAAU;AACrC,UAAM,YAAY;AAChB,UAAI,0BAA0B;AAC9B,YAAM,aAAa,CAAC,SAAgB,mBAAkC;AACpE,YACE,aAAa,YAAY,kBACzB,iBAAiB,YAAY,iBAC7B;AACA;AAAA,QACF;AACA;AAAA,UAAuB,CAAC,YACtB,QAAQ;AAAA,YAAI,CAAC,cACX,UAAU,kBAAkB,UAAU,gBAClC;AAAA,cACE,GAAG;AAAA,cACH,OAAO;AAAA,cACP,OAAO,QAAQ;AAAA,cACf;AAAA,YACF,IACA;AAAA,UACN;AAAA,QACF;AAAA,MACF;AACA,UAAI;AACF,YAAI,UAAU,gBAAgB;AAC5B,cAAI;AACJ,cAAI;AACF,qBAAS,MAAM,OAAO,WAAW,aAAa,WAAW;AAAA,cACvD,cAAc;AAAA,gBACZ;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,gBACA;AAAA,cACF;AAAA,cACA,OAAO;AAAA,cACP,aAAa;AAAA,YACf,CAAC;AAAA,UACH,SAAS,OAAO;AAId,uBAAW,QAAQ,KAAK,GAAG,IAAI;AAC/B;AAAA,UACF;AACA,gBAAM,aAAa,kCAAkC,WAAW,MAAM;AACtE,cAAI,WAAW,UAAU;AACvB,gBAAI,cAAe,OAAM,UAAU,KAAK;AACxC,gBAAI,WAAW,SAAS;AACtB,qCAAuB,WAAW,SAAS;AAAA,YAC7C,OAAO;AACL;AAAA,gBAAuB,CAAC,YACtB,QAAQ;AAAA,kBAAI,CAAC,cACX,UAAU,kBAAkB,UAAU,gBAClC,WAAW,YACX;AAAA,gBACN;AAAA,cACF;AACA,kBAAI,CAAC,yBAAyB,QAAQ,IAAI,UAAU,aAAa,GAAG;AAClE,yCAAyB,QAAQ,IAAI,UAAU,aAAa;AAC5D,yBAAS,WAAW,UAAU,MAAM,MAAM,WAAW,UAAU,KAAK;AAAA,cACtE;AAAA,YACF;AACA;AAAA,UACF;AACA,cAAI,CAAC,UAAU,UAAU;AACvB,kBAAM,IAAI;AAAA,cACR;AAAA,YACF;AAAA,UACF;AAAA,QACF;AACA,YAAI;AACJ,YAAI,iBAAiB,UAAU,cAAc;AAC3C,cAAI,CAAE,MAAM,eAAe,UAAU,YAAY,GAAI;AACnD,kBAAM,IAAI,MAAM,uDAAuD;AAAA,UACzE;AACA,kCAAwB,SAAS,SAAS;AAAA,QAC5C;AACA,YACE,aAAa,YAAY,kBACzB,iBAAiB,YAAY,iBAC7B;AACA;AAAA,QACF;AACA,cAAM,YAAY;AAAA,UAChB,GAAG,UAAU;AAAA,UACb,GAAI,0BAA0B,SAAY,EAAE,sBAAsB,IAAI,CAAC;AAAA,QACzE;AACA,YAAI,iBAAqD;AACzD,YAAI,gBAAqC;AACzC,YAAI,eAAe;AACjB,cAAI,CAAC,UAAU,gBAAgB,0BAA0B,QAAW;AAClE,kBAAM,IAAI,MAAM,uDAAuD;AAAA,UACzE;AACA,gBAAM,SAAS,MAAM,OAClB,oBAAoB,aAAa,WAAW;AAAA,YAC3C,MAAM,UAAU,aAAa;AAAA,YAC7B,aAAa,UAAU,aAAa;AAAA,YACpC,WAAW,UAAU,aAAa;AAAA,YAClC,OAAO,UAAU,aAAa;AAAA,YAC9B,iBAAiB,UAAU,aAAa;AAAA,YACxC,aAAa,UAAU,aAAa;AAAA,YACpC;AAAA,YACA,eAAe,UAAU;AAAA,YACzB,UAAU;AAAA,YACV,GAAI,UAAU,cAAc,EAAE,aAAa,UAAU,YAAY,IAAI,CAAC;AAAA,YACtE,GAAI,UAAU,eAAe,EAAE,cAAc,UAAU,aAAa,IAAI,CAAC;AAAA,YACzE,GAAI,UAAU,uBACV,EAAE,sBAAsB,UAAU,qBAAqB,IACvD,CAAC;AAAA,YACL,GAAI,UAAU,wBACV,EAAE,uBAAuB,UAAU,sBAAsB,IACzD,CAAC;AAAA,YACL,GAAI,UAAU,6BACV,EAAE,4BAA4B,UAAU,2BAA2B,IACnE,CAAC;AAAA,UACP,CAAC,EACA,MAAM,CAAC,UAAmB;AACzB,sCAA0B;AAC1B,kBAAM;AAAA,UACR,CAAC;AACH,2BAAiB;AACjB,yBAAe,OAAO,KAAK;AAAA,QAC7B,OAAO;AACL,0BAAgB,MAAM,OACnB,YAAY,aAAa,WAAW,SAAS,EAC7C,MAAM,CAAC,UAAmB;AACzB,sCAA0B;AAC1B,kBAAM;AAAA,UACR,CAAC;AAAA,QACL;AACA,YACE,aAAa,YAAY,kBACzB,iBAAiB,YAAY,iBAC7B;AACA;AAAA,QACF;AACA,cAAM,sBACJ,gBAAgB,YAAY,yBACxB,UACA,gBAAgB,YAAY,2BAC1B,SACA,UAAU;AAClB,YAAI,QAAQ,WAAW,UAAa,wBAAwB,QAAQ;AAClE,iCAAuB,EAAE,GAAG,WAAW,OAAO,UAAU,CAAC;AAAA,QAC3D,OAAO;AACL;AAAA,YAAuB,CAAC,YACtB,QAAQ;AAAA,cAAI,CAAC,cACX,UAAU,kBAAkB,UAAU,gBAClC;AAAA,gBACE,GAAG;AAAA,gBACH,OAAO;AAAA,gBACP,aAAa;AAAA,gBACb,QAAQ,gBAAgB,KAAK,MAAM,UAAU;AAAA,gBAC7C,gBACE,gBAAgB,SAAS,MAAM,eAAe,MAAM,UAAU;AAAA,gBAChE,qBACE,gBAAgB,SAAS,uBAAuB,UAAU;AAAA,gBAC5D,OAAO;AAAA,gBACP,OAAO;AAAA,cACT,IACA;AAAA,YACN;AAAA,UACF;AAAA,QACF;AACA,YAAI,CAAC,yBAAyB,QAAQ,IAAI,UAAU,aAAa,GAAG;AAClE,mCAAyB,QAAQ,IAAI,UAAU,aAAa;AAC5D,mBAAS,UAAU,MAAM,SAAS;AAAA,QACpC;AAAA,MACF,SAAS,OAAO;AACd,cAAM,UAAU,mBAAmB,QAAQ;AAAA,UACzC,CAAC,cAAc,UAAU,kBAAkB,UAAU;AAAA,QACvD;AAGA,YAAI,CAAC,WAAY,QAAQ,UAAU,YAAY,QAAQ,mBAAmB,OAAQ;AAChF;AAAA,QACF;AACA,cAAM,UAAU,QAAQ,KAAK;AAC7B,2BAAmB,UAAU,SAAS,UAAU,OAAO,MAAM;AAG7D,cAAM,iBACJ,UAAU,kBAAkB,CAAC,0BACzB,OACA,sBAAsB,KAAK;AACjC,mBAAW,SAAS,cAAc;AAAA,MACpC,UAAE;AACA,mCAA2B,UAAU;AACrC,YAAI,aAAa,YAAY,gBAAgB;AAC3C,6BAAmB,CAAC,GAAG,mBAAmB,OAAO,CAAC;AAAA,QACpD;AAAA,MACF;AAAA,IACF,GAAG;AAAA,EACL,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,YAAU,MAAM;AACd,2BAAuB;AAAA,EACzB,GAAG,CAAC,iBAAiB,sBAAsB,CAAC;AAI5C,YAAU,MAAM;AACd,UAAM,UAAU,oBAAoB;AACpC,QAAI,SAAS;AACX,YAAM,SAAS;AAAA,QACb,MAAM,SAAS;AAAA,QACf,WAAW;AAAA,UACT,qBAAqB;AAAA,UACrB,kBAAkB,cAAc,OAAO,EAAE,aAAa,CAAC;AAAA,QACzD;AAAA,QACA,aAAa,eAAe;AAAA,QAC5B,GAAI,UAAU,UAAU,EAAE,QAAQ,UAAU,QAAQ,IAAI,CAAC;AAAA,MAC3D;AACA,UACE,QAAQ,YAAY,SAAS,OAAO,QACpC,KAAK,UAAU,QAAQ,YAAY,SAAS,MAAM,KAAK,UAAU,OAAO,SAAS,KACjF,KAAK,UAAU,QAAQ,YAAY,WAAW,MAAM,KAAK,UAAU,OAAO,WAAW,KACrF,KAAK,UAAU,QAAQ,YAAY,MAAM,MAAM,KAAK,UAAU,OAAO,MAAM,GAC3E;AACA,4BAAoB,UAAU;AAAA,UAC5B;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AACA;AAAA,IACF;AACA,UAAM,aAAa,mBAAmB,QAAQ,GAAG,EAAE;AACnD,QAAI,YAAY;AACd,YAAM,SAAS;AAAA,QACb,MAAM,SAAS;AAAA,QACf,WAAW;AAAA,UACT,qBAAqB;AAAA,UACrB,kBAAkB,cAAc,OAAO,EAAE,aAAa,CAAC;AAAA,QACzD;AAAA,QACA,aAAa,eAAe;AAAA,QAC5B,GAAI,UAAU,UAAU,EAAE,QAAQ,UAAU,QAAQ,IAAI,CAAC;AAAA,MAC3D;AACA,UACE,WAAW,YAAY,SAAS,OAAO,QACvC,KAAK,UAAU,WAAW,YAAY,SAAS,MAAM,KAAK,UAAU,OAAO,SAAS,KACpF,KAAK,UAAU,WAAW,YAAY,WAAW,MAAM,KAAK,UAAU,OAAO,WAAW,KACxF,KAAK,UAAU,WAAW,YAAY,MAAM,MAAM,KAAK,UAAU,OAAO,MAAM,GAC9E;AACA,iCAAyB,MAAM;AAAA,MACjC;AAAA,IACF;AACA,QAAI,mBAAmB,QAAQ,KAAK,CAAC,cAAc,UAAU,UAAU,SAAS,GAAG;AACjF;AAAA,IACF;AACA,QACE,CAAC,iBACD,CAAC,aACD,gBACA,WACA,CAAC,SAAS,WACV;AAEA;AACF,UAAM,UAAU,oBAAoB;AACpC,QAAI,CAAC,WAAW,eAAe,OAAO,MAAM,mBAAmB,QAAS;AACxE,UAAM,QAAQ,OAAO,WAAW,MAAM,KAAK,eAAe,OAAO,GAAG,GAAG;AACvE,WAAO,MAAM,OAAO,aAAa,KAAK;AAAA,EACxC,GAAG;AAAA,IACD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,WAAW;AAAA,IACf,OAAO,UAA4B,aAAwC;AACzE,YAAM,iBAAiB;AACvB,YAAM,kBAAkB,iBAAiB;AACzC,YAAM,eAAe,4BAA4B,aAAa,SAAS;AACvE,YAAM,UAAU,oBAAoB,WAAW,gCAAgC,YAAY;AAC3F,UAAI,WAAW,CAAC,oBAAoB,SAAS;AAC3C,4BAAoB,UAAU;AAC9B,6BAAqB,UAAU,QAAQ,MAAM,iBAAiB;AAAA,MAChE;AACA,YAAM,cAAc;AACpB,YAAM,oBAAoB;AAC1B,YAAM,UAAU,YAAY;AAC5B,YAAM,UAAU,QAAQ,KAAK,EAAE,SAAS;AACxC,YAAM,iBAAiB,kBAAkB,SAAS;AAClD,YAAM,gBAAgB,UAAU;AAChC,YAAMC,uBAAsB,kBAAkB;AAAA,QAC5C,CAAC,eAAe,WAAW,KAAK,KAAK,EAAE,SAAS;AAAA,MAClD;AAGA,YAAM,SAAS,UAAU,CAAC,IAAI,kBAAkB,cAAc,OAAO;AACrE,YAAM,eAAe,kBAAkB,SAAS,MAAM,OAAO,WAAW,UAAU,KAAK;AACvF,UACG,CAAC,YAAY,CAACA,wBAAwB,CAAC,WAAW,CAAC,gBAAgB,CAAC,mBACrE,CAAC,aACD,CAAC,iBACD,WACA,eAAe,UAAU,MAAM,QAC/B,aAAa,YAAY,gBACzB;AACA,eAAO;AAAA,MACT;AAEA,YAAM,eAAe,MAAY;AAC/B,4BAAoB,UAAU;AAC9B,6BAAqB,UAAU;AAC/B,uCAA+B,YAAY;AAAA,MAC7C;AAEA,UAAI,eAAe,SAAS,aAAa;AAEzC,YAAM,iBAAiB,CAAC,cAA8C;AACpE,qBAAa;AACb,cAAM,oBAAoB,SAAS,YAAY,UAAU;AACzD,cAAM,yBACJ,KAAK,UAAU,qBAAqB,OAAO,MAC3C,KAAK,UAAU,UAAU,eAAe;AAC1C,cAAM,2BACJ,KAAK,UAAU,eAAe,OAAO,MAAM,KAAK,UAAU,UAAU,iBAAiB;AACvF,YAAI,wBAAwB;AAC1B,+BAAqB,UAAU,CAAC;AAChC,+BAAqB,CAAC,CAAC;AAAA,QACzB;AACA,YAAI,0BAA0B;AAC5B,yBAAe,UAAU,CAAC;AAC1B,yBAAe,CAAC,CAAC;AACjB,sCAA4B,IAAI;AAAA,QAClC;AACA,YAAI,UAAU,sBAAsB,mBAAmB;AACrD,mBAAS,UAAU;AACnB,mBAAS,EAAE;AAAA,QACb;AACA,iBAAS,UAAU,MAAM,MAAM,UAAU,KAAK;AAAA,MAChD;AAEA,YAAM,UAAU,OAAO,cAAwC;AAC7D,YAAI,eAAe;AACjB,gBAAM,QAAQ,UAAU;AACxB,cACE,MAAM,0BAA0B,UAChC,MAAM,kBAAkB,UACxB,MAAM,UAAU,UAChB,MAAM,oBAAoB,UAC1B,MAAM,gBAAgB,QACtB;AACA,kBAAM,IAAI,MAAM,uDAAuD;AAAA,UACzE;AACA,gBAAM,SAAS,MAAM,OAAO,oBAAoB,aAAa,WAAW;AAAA,YACtE,MAAM,MAAM;AAAA,YACZ,aAAa,MAAM,eAAe,CAAC;AAAA,YACnC,WAAW,MAAM,aAAa,CAAC;AAAA,YAC/B,OAAO,MAAM;AAAA,YACb,iBAAiB,MAAM;AAAA,YACvB,aAAa,MAAM;AAAA,YACnB,uBAAuB,MAAM;AAAA,YAC7B,eAAe,MAAM;AAAA,YACrB,UAAU,UAAU;AAAA,YACpB,GAAI,MAAM,cAAc,EAAE,aAAa,MAAM,YAAY,IAAI,CAAC;AAAA,YAC9D,GAAI,MAAM,eAAe,EAAE,cAAc,MAAM,aAAa,IAAI,CAAC;AAAA,YACjE,GAAI,MAAM,uBACN,EAAE,sBAAsB,MAAM,qBAAqB,IACnD,CAAC;AAAA,YACL,GAAI,MAAM,wBACN,EAAE,uBAAuB,MAAM,sBAAsB,IACrD,CAAC;AAAA,YACL,GAAI,MAAM,6BACN,EAAE,4BAA4B,MAAM,2BAA2B,IAC/D,CAAC;AAAA,UACP,CAAC;AACD,yBAAe,OAAO,KAAK;AAC3B,iBAAO;AAAA,QACT;AACA,YAAI,UAAU,aAAa,SAAS;AAClC,iBAAO,MAAM,OAAO,aAAa,aAAa,WAAW,UAAU,KAAK;AAAA,QAC1E;AACA,cAAM,OAAO,YAAY,aAAa,WAAW,UAAU,KAAK;AAChE,eAAO;AAAA,MACT;AAEA,UAAI,aAAa,SAAS;AACxB,YAAI,YAAY,SAAS,kBAAkB,SAAS,MAAM,eAAe;AACvE,gCAAsB,WAAU,oBAAI,KAAK,GAAE,YAAY;AAAA,QACzD;AACA,oBAAY;AAAA,UACV,OAAO;AAAA,UACP,MAAM;AAAA,UACN,eAAe,SAAS,MAAM,iBAAiB,qBAAqB;AAAA,UACpE,gBAAgB;AAAA,UAChB,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AACA,iBAAW,IAAI;AACf,eAAS,IAAI;AACb,UAAI;AACF,YAAI,SAAS;AACX,cAAI,gBAAqC;AACzC,cAAI;AACF,kBAAM,SAAS,MAAM,OAAO,WAAW,aAAa,WAAW;AAAA,cAC7D,cAAc,CAAC,cAAc;AAAA,cAC7B,OAAO;AAAA,cACP,aAAa;AAAA,YACf,CAAC;AACD,4BACE,OAAO;AAAA,cACL,CAAC,UACC,MAAM,SAAS,kBACf,MAAM,kBAAkB,QAAQ,MAAM;AAAA,YAC1C,KAAK;AAAA,UACT,SAAS,OAAO;AACd,gBACE,aAAa,YAAY,kBACzB,iBAAiB,YAAY,iBAC7B;AACA,oBAAM,UAAU,QAAQ,KAAK;AAC7B,uBAAS,OAAO;AAChB,kBAAI,QAAQ,aAAa,SAAS;AAChC,+BAAe;AACf,4BAAY;AAAA,kBACV,OAAO;AAAA,kBACP,MAAM,QAAQ,MAAM;AAAA,kBACpB,eAAe,QAAQ,MAAM,iBAAiB;AAAA,kBAC9C,gBAAgB;AAAA,kBAChB,QAAQ;AAAA,kBACR,OAAO;AAAA,kBACP,gBAAgB;AAAA,gBAClB,CAAC;AAAA,cACH;AAAA,YACF;AACA,mBAAO;AAAA,UACT;AACA,cACE,aAAa,YAAY,kBACzB,iBAAiB,YAAY,iBAC7B;AACA,mBAAO;AAAA,UACT;AACA,cAAI,eAAe;AACjB,gBAAI,cAAe,OAAM,UAAU,KAAK;AACxC,gBAAI,QAAQ,aAAa,SAAS;AAChC,6BAAe;AACf,0BAAY;AAAA,gBACV,OAAO;AAAA,gBACP,MAAM,QAAQ,MAAM;AAAA,gBACpB,eAAe,QAAQ,MAAM,iBAAiB;AAAA,gBAC9C,gBAAgB,cAAc;AAAA,gBAC9B,QAAQ;AAAA,cACV,CAAC;AAAA,YACH;AACA,2BAAe,OAAO;AACtB,mBAAO;AAAA,UACT;AACA,cAAI,CAAC,QAAQ,UAAU;AACrB;AAAA,cACE,IAAI;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AACA,mBAAO;AAAA,UACT;AACA,cAAI;AACF,kBAAM,SAAS,MAAM,QAAQ,OAAO;AACpC,gBAAI,QAAQ,aAAa,WAAW,QAAQ;AAC1C,6BAAe;AACf,0BAAY;AAAA,gBACV,OAAO;AAAA,gBACP,MAAM,QAAQ,MAAM;AAAA,gBACpB,eAAe,QAAQ,MAAM,iBAAiB;AAAA,gBAC9C,gBAAgB,OAAO,SAAS;AAAA,gBAChC,QAAQ,OAAO,KAAK;AAAA,gBACpB,yBACE,OAAO,WAAW,SAAS,OAAO,qBAAqB,KAAK;AAAA,cAChE,CAAC;AAAA,YACH;AAAA,UACF,SAAS,OAAO;AACd,kBAAM,UAAU,QAAQ,KAAK;AAC7B,kBAAM,iBAAiB,sBAAsB,KAAK;AAClD,+BAAmB,UAAU,SAAS,QAAQ,OAAO,QAAQ,QAAQ;AACrE,gBAAI,CAAC,gBAAgB;AACnB,2BAAa;AACb,6BAAe;AAAA,YACjB,WAAW,QAAQ,aAAa,SAAS;AACvC,6BAAe;AACf,0BAAY;AAAA,gBACV,OAAO;AAAA,gBACP,MAAM,QAAQ,MAAM;AAAA,gBACpB,eAAe,QAAQ,MAAM,iBAAiB;AAAA,gBAC9C,gBAAgB;AAAA,gBAChB,QAAQ;AAAA,gBACR,OAAO;AAAA,gBACP,gBAAgB;AAAA,cAClB,CAAC;AAAA,YACH;AACA,gBACE,aAAa,YAAY,kBACzB,iBAAiB,YAAY,iBAC7B;AACA,uBAAS,OAAO;AAAA,YAClB;AACA,mBAAO;AAAA,UACT;AACA,cACE,aAAa,YAAY,kBACzB,iBAAiB,YAAY,iBAC7B;AACA,mBAAO;AAAA,UACT;AACA,yBAAe,OAAO;AACtB,iBAAO;AAAA,QACT;AAMA,cAAM,WAAW,UAAU,UAAU,iBAAiB,KAAK;AAC3D,cAAM,iBAAiB,oBAAoB;AAC3C,cAAM,UAAU,iBAAiB,EAAE,GAAG,gBAAgB,MAAM,SAAS,IAAI;AACzE,YAAI,WAAW,CAAE,MAAM,eAAe,OAAO,EAAI,QAAO;AACxD,YACE,aAAa,YAAY,kBACzB,iBAAiB,YAAY,iBAC7B;AACA,iBAAO;AAAA,QACT;AAIA,6BAAqB,YAAY,sBAAsB;AACvD,cAAM,mBAAmB,oBAAoB;AAC7C,cAAM,QAAQ,iBAAiB,UAAU,qBAAqB,SAAS,QAAQ;AAAA,UAC7E,GAAG;AAAA,UACH,GAAI,kBAAkB,cAAc,EAAE,aAAa,iBAAiB,YAAY,IAAI,CAAC;AAAA,UACrF,GAAI,iBAAiB,SAAS,UAC1B,EAAE,uBAAuB,SAAS,QAAQ,SAAS,IACnD,CAAC;AAAA,UACL,WAAW,eAAe,mBAAmB,OAAO,aAAa,CAAC,CAAC;AAAA,UACnE,aAAa,iBAAiB,iBAAiB;AAAA,QACjD,CAAC;AACD,cAAM,YAAsC;AAAA,UAC1C;AAAA,UACA;AAAA,UACA;AAAA,UACA,iBAAiB,CAAC,GAAG,iBAAiB;AAAA,UACtC,mBAAmB,iBAAiB,iBAAiB;AAAA,UACrD,aAAa;AAAA,YACX,MAAM;AAAA,YACN,WAAW,eAAe,mBAAmB,OAAO,aAAa,CAAC,CAAC;AAAA,YACnE,aAAa,iBAAiB,iBAAiB;AAAA,YAC/C,QAAQ;AAAA,UACV;AAAA,UACA,oBAAoB,aAAa;AAAA,UACjC,UAAU;AAAA,QACZ;AACA,4BAAoB,UAAU;AAC9B,yCAAiC,cAAc,SAAS;AACxD,YAAI,aAAa,SAAS;AACxB,sBAAY;AAAA,YACV,OAAO;AAAA,YACP,MAAM;AAAA,YACN,eAAe,MAAM,iBAAiB;AAAA,YACtC,gBAAgB;AAAA,YAChB,QAAQ;AAAA,UACV,CAAC;AAAA,QACH;AACA,YAAI;AACF,gBAAM,SAAS,MAAM,QAAQ,SAAS;AACtC,cAAI,aAAa,WAAW,QAAQ;AAClC,2BAAe;AACf,wBAAY;AAAA,cACV,OAAO;AAAA,cACP,MAAM;AAAA,cACN,eAAe,MAAM,iBAAiB;AAAA,cACtC,gBAAgB,OAAO,SAAS;AAAA,cAChC,QAAQ,OAAO,KAAK;AAAA,cACpB,yBACE,OAAO,WAAW,SAAS,OAAO,qBAAqB,KAAK;AAAA,YAChE,CAAC;AAAA,UACH;AAAA,QACF,SAAS,OAAO;AACd,6BAAmB,UAAU,QAAQ,KAAK,GAAG,UAAU,OAAO,UAAU,QAAQ;AAChF,cAAI,CAAC,sBAAsB,KAAK,GAAG;AACjC,yBAAa;AAAA,UACf,WAAW,aAAa,SAAS;AAC/B,2BAAe;AACf,wBAAY;AAAA,cACV,OAAO;AAAA,cACP,MAAM,UAAU,MAAM;AAAA,cACtB,eAAe,UAAU,MAAM,iBAAiB;AAAA,cAChD,gBAAgB;AAAA,cAChB,QAAQ;AAAA,cACR,OAAO;AAAA,cACP,gBAAgB;AAAA,YAClB,CAAC;AAAA,UACH;AACA,cACE,aAAa,YAAY,kBACzB,iBAAiB,YAAY,iBAC7B;AACA,qBAAS,QAAQ,KAAK,CAAC;AAAA,UACzB;AACA,iBAAO;AAAA,QACT;AACA,YACE,aAAa,YAAY,kBACzB,iBAAiB,YAAY,iBAC7B;AACA,iBAAO;AAAA,QACT;AACA,uBAAe,SAAS;AACxB,eAAO;AAAA,MACT,UAAE;AACA,YACE,aAAa,YAAY,kBACzB,iBAAiB,YAAY,iBAC7B;AACA,qBAAW,KAAK;AAChB,cAAI,aAAa,WAAW,CAAC,aAAc,aAAY,IAAI;AAAA,QAC7D;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,OAAO;AAAA,IACX,OAAO,aAAwC;AAC7C,UAAI,oBAAoB,SAAS,aAAa,QAAQ;AACpD,eAAO,MAAM,SAAS,QAAQ,QAAQ;AAAA,MACxC;AACA,YAAM,UAAU,YAAY,SAAS;AACrC,YAAM,oBAAoB,iBAAiB,eAAe,OAAO;AACjE,YAAM,gBAAgB,UAAU;AAChC,YAAM,UAAU,QAAQ,KAAK,EAAE,SAAS;AACxC,YAAM,iBAAiB,kBAAkB,SAAS;AAClD,YAAMA,uBAAsB,kBAAkB;AAAA,QAC5C,CAAC,eAAe,WAAW,KAAK,KAAK,EAAE,SAAS;AAAA,MAClD;AACA,YAAM,SAAS,kBAAkB,cAAc,OAAO;AACtD,YAAM,YAAY,eAAe,qBAAqB,SAAS,OAAO,aAAa,CAAC,CAAC;AACrF,UACE,CAAC,aACD,CAAC,iBACD,WACA,CAACA,wBACA,CAAC,WAAW,CAAC,kBAAkB,UAAU,WAAW,KACrD,eAAe,UAAU,MAAM,QAC/B,aAAa,YAAY,WACzB;AACA,eAAO;AAAA,MACT;AACA,YAAM,WAAW,UAAU,UAAU,iBAAiB,KAAK;AAC3D,YAAM,gBAAgB,sBAAsB;AAC5C,YAAM,mBAAmB,oBAAoB;AAC7C,YAAM,QAAQ,iBAAiB,UAAU,eAAe,QAAQ;AAAA,QAC9D,GAAG;AAAA,QACH,GAAI,kBAAkB,cAAc,EAAE,aAAa,iBAAiB,YAAY,IAAI,CAAC;AAAA,QACrF;AAAA,QACA,aAAa;AAAA,MACf,CAAC;AACD,YAAM,iBAAiB,oBAAoB;AAC3C,YAAM,0BAA0B,mBAAmB,QAAQ;AAAA,QACzD,CAAC,cAAc,UAAU,UAAU,YAAY,UAAU,mBAAmB;AAAA,MAC9E;AACA,YAAM,YAAqC;AAAA,QACzC;AAAA,QACA,UAAU;AAAA,QACV,aACE,kBAAkB,UAAU,YAAY,0BACpC,UACC,mBAAmB,UAAU,KAAK;AAAA,QACzC,MAAM;AAAA,QACN,aAAa;AAAA,QACb;AAAA,QACA,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,QACnC,OAAO;AAAA,QACP;AAAA,QACA,cAAc,iBAAiB,EAAE,GAAG,gBAAgB,MAAM,SAAS,IAAI;AAAA,QACvE,aAAa;AAAA,UACX,MAAM,aAAa,SAAY,KAAK,SAAS;AAAA,UAC7C,WAAW,aAAa,SAAY,CAAC,IAAI,CAAC,GAAG,qBAAqB,OAAO;AAAA,UACzE,aAAa,aAAa,SAAY,CAAC,IAAI,iBAAiB,eAAe,OAAO;AAAA,UAClF,QAAQ;AAAA,QACV;AAAA,QACA,UAAU;AAAA,MACZ;AAOA,UAAI,aAAa,QAAW;AAC1B,iBAAS,UAAU;AACnB,uBAAe,UAAU,CAAC;AAC1B,6BAAqB,UAAU,CAAC;AAChC,0BAAkB,WAAW;AAC7B,iBAAS,EAAE;AACX,uBAAe,CAAC,CAAC;AACjB,oCAA4B,IAAI;AAChC,6BAAqB,CAAC,CAAC;AAAA,MACzB;AACA,6BAAuB,CAAC,YAAY,CAAC,GAAG,SAAS,SAAS,CAAC;AAC3D,qBAAe,sBAAsB;AACrC,eAAS,IAAI;AACb,oBAAc,UAAU,KAAK;AAC7B,aAAO;AAAA,IACT;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,QAAM,QAAQ,YAAY,OAAO,SAAkB,MAAM,SAAS,SAAS,IAAI,GAAG,CAAC,QAAQ,CAAC;AAE5F,QAAM,yBAAyB;AAAA,IAC7B,CAAC,kBAAgC;AAC/B,UAAI,eAAe,UAAU,MAAM,KAAM;AACzC,YAAM,kBAAkB,YAAY;AACpC,UAAI,iBAAiB,UAAU,YAAY,gBAAgB,kBAAkB,eAAe;AAC1F,aAAK,SAAS,OAAO;AACrB;AAAA,MACF;AACA;AAAA,QAAuB,CAAC,YACtB,QAAQ,IAAI,CAAC,cAAc;AACzB,cAAI,UAAU,kBAAkB,iBAAiB,UAAU,UAAU,UAAU;AAC7E,mBAAO;AAAA,UACT;AACA,cAAI,UAAU,gBAAgB;AAC5B,mBAAO,EAAE,GAAG,WAAW,OAAO,WAAW,OAAO,OAAU;AAAA,UAC5D;AACA,gBAAM,oBAAoB,sBAAsB;AAChD,gBAAM,oCAAoC;AAAA,YACxC,cAAc;AAAA,UAChB,EAAE;AACF,gBAAM,aAAa;AAAA,YACjB,UAAU;AAAA,YACV;AAAA,YACA;AAAA,cACE,GAAG,UAAU;AAAA,cACb,GAAI,oCACA,EAAE,4BAA4B,kCAAkC,IAChE,CAAC;AAAA,YACP;AAAA,YACA;AAAA,cACE,GAAI,oBAAoB,SAAS,cAC7B,EAAE,aAAa,oBAAoB,QAAQ,YAAY,IACvD,CAAC;AAAA,cACL,WAAW,UAAU;AAAA,cACrB,aAAa,UAAU;AAAA,YACzB;AAAA,UACF;AACA,iBAAO;AAAA,YACL,GAAG;AAAA,YACH,eAAe;AAAA,YACf,OAAO;AAAA,YACP,cAAc,UAAU;AAAA,YACxB,aAAY,oBAAI,KAAK,GAAE,YAAY;AAAA,YACnC,OAAO;AAAA,YACP,OAAO;AAAA,YACP,gBAAgB;AAAA,YAChB,UAAU;AAAA,UACZ;AAAA,QACF,CAAC;AAAA,MACH;AACA,qBAAe,sBAAsB;AAAA,IACvC;AAAA,IACA,CAAC,UAAU,wBAAwB,sBAAsB;AAAA,EAC3D;AAEA,QAAM,0BAA0B;AAAA,IAC9B,CAAC,kBAAgC;AAC/B,UAAI,YAAY,SAAS,kBAAkB,eAAe;AACxD,4BAAoB,UAAU;AAC9B,6BAAqB,UAAU;AAC/B,uCAA+B,4BAA4B,aAAa,SAAS,CAAC;AAClF,oBAAY,IAAI;AAChB,iBAAS,IAAI;AACb;AAAA,MACF;AACA;AAAA,QAAuB,CAAC,YACtB,QAAQ,OAAO,CAAC,cAAc,UAAU,kBAAkB,aAAa;AAAA,MACzE;AAAA,IACF;AAAA,IACA,CAAC,wBAAwB,WAAW,WAAW;AAAA,EACjD;AAOA,QAAM,oBACJ,kBAAkB,SAAS,MAC1B,kBAAkB,cAAc,OAAO,EAAE,WAAW,UAAU,KAAK;AACtE,QAAM,sBAAsB,oBAAoB,YAAY;AAC5D,QAAM,sBAAsB,YAAY,MAAM,CAAC,eAAe,WAAW,KAAK,KAAK,EAAE,SAAS,CAAC;AAE/F,QAAM,QAAQ;AAAA,IACZ,OAAO,WAAmC;AACxC,YAAM,iBAAiB;AACvB,YAAM,kBAAkB,iBAAiB;AACzC,UAAI,CAAC,aAAa,WAAW,aAAa,YAAY,gBAAgB;AACpE;AAAA,MACF;AACA,iBAAW,IAAI;AACf,eAAS,IAAI;AACb,UAAI;AACF,cAAM,gBAAgB,sBAAsB;AAC5C,cAAM,mBAAmB,oBAAoB;AAC7C,cAAM,SAAS,MAAM;AAAA,UAAqB,MACxC,OAAO,aAAa,aAAa,WAAW;AAAA,YAC1C;AAAA,YACA,GAAI,WAAW,SAAY,EAAE,OAAO,IAAI,CAAC;AAAA,YACzC,GAAI,kBAAkB,cAClB,EAAE,qBAAqB,iBAAiB,YAAY,IACpD,CAAC;AAAA,UACP,CAAC;AAAA,QACH;AACA,YACE,aAAa,YAAY,kBACzB,iBAAiB,YAAY,iBAC7B;AACA,6BAAmB,OAAO,gBAAgB;AAAA,QAC5C;AAAA,MACF,SAAS,OAAO;AACd,YACE,aAAa,YAAY,kBACzB,iBAAiB,YAAY,iBAC7B;AACA,mBAAS,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,QACpE;AAAA,MACF,UAAE;AACA,YACE,aAAa,YAAY,kBACzB,iBAAiB,YAAY,iBAC7B;AACA,qBAAW,KAAK;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,QAAQ,aAAa,WAAW,SAAS,SAAS;AAAA,EACrD;AAEA,QAAM,SAAS;AAAA,IACb,OAAO,WAAmC;AACxC,YAAM,iBAAiB;AACvB,YAAM,kBAAkB,iBAAiB;AACzC,UAAI,CAAC,aAAa,YAAY,aAAa,YAAY,eAAgB;AACvE,kBAAY,IAAI;AAChB,eAAS,IAAI;AACb,UAAI;AACF,cAAM,gBAAgB,sBAAsB;AAC5C,cAAM,mBAAmB,oBAAoB;AAC7C,cAAM,SAAS,MAAM;AAAA,UAAqB,MACxC,OAAO,cAAc,aAAa,WAAW;AAAA,YAC3C;AAAA,YACA,GAAI,WAAW,SAAY,EAAE,OAAO,IAAI,CAAC;AAAA,YACzC,GAAI,kBAAkB,cAClB,EAAE,qBAAqB,iBAAiB,YAAY,IACpD,CAAC;AAAA,UACP,CAAC;AAAA,QACH;AACA,YACE,aAAa,YAAY,kBACzB,iBAAiB,YAAY,iBAC7B;AACA,6BAAmB,OAAO,gBAAgB;AAAA,QAC5C;AAAA,MACF,SAAS,OAAO;AACd,YACE,aAAa,YAAY,kBACzB,iBAAiB,YAAY,iBAC7B;AACA,mBAAS,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,QACpE;AAAA,MACF,UAAE;AACA,YACE,aAAa,YAAY,kBACzB,iBAAiB,YAAY,iBAC7B;AACA,sBAAY,KAAK;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,QAAQ,aAAa,WAAW,UAAU,SAAS;AAAA,EACtD;AAEA,QAAM,cAAc;AAAA,IAClB,OAAO,WAAwD;AAC7D,YAAM,iBAAiB;AACvB,YAAM,kBAAkB,iBAAiB;AACzC,UAAI,CAAC,aAAa,YAAY,aAAa,YAAY,eAAgB;AACvE,kBAAY,IAAI;AAChB,eAAS,IAAI;AACb,UAAI;AACF,YAAI,OAAO,UAAU,aAAa;AAChC,gBAAM,mBAAmB,oBAAoB,SAAS,SAAS;AAAA,YAC7D,CAAC,YAAY,QAAQ,SAAS;AAAA,UAChC;AACA,cAAI,CAAC,OAAO,4BAA4B;AACtC,kBAAM,IAAI;AAAA,cACR;AAAA,YACF;AAAA,UACF;AACA,gBAAM,gBAAgB,sBAAsB;AAC5C,gBAAM;AAAA,YAAqB,MACzB,OAAO,2BAA4B,aAAa;AAAA,cAC9C,QAAQ;AAAA,cACR;AAAA,cACA,GAAI,mBAAmB,EAAE,kBAAkB,iBAAiB,SAAS,IAAI,CAAC;AAAA,YAC5E,CAAC;AAAA,UACH;AAAA,QACF,WAAW,OAAO,UAAU,aAAa,OAAO,UAAU;AACxD,gBAAM,SAAS,MAAM,OAAO,SAAS,aAAa,OAAO,QAAQ;AACjE,cACE,aAAa,YAAY,kBACzB,iBAAiB,YAAY,iBAC7B;AACA;AAAA,UACF;AACA,gBAAM,gBAAgB,sBAAsB;AAC5C,gBAAM;AAAA,YAAqB,MACzB,OAAO,cAAc,aAAa,OAAO,UAAW;AAAA,cAClD;AAAA,cACA,qBAAqB,OAAO,iBAAiB;AAAA,YAC/C,CAAC;AAAA,UACH;AAAA,QACF,OAAO;AACL,gBAAM,gBAAgB,sBAAsB;AAC5C,gBAAM,mBAAmB,oBAAoB;AAC7C,gBAAM,SAAS,MAAM;AAAA,YAAqB,MACxC,OAAO,cAAc,aAAa,WAAW;AAAA,cAC3C;AAAA,cACA,GAAI,kBAAkB,cAClB,EAAE,qBAAqB,iBAAiB,YAAY,IACpD,CAAC;AAAA,YACP,CAAC;AAAA,UACH;AACA,cACE,aAAa,YAAY,kBACzB,iBAAiB,YAAY,iBAC7B;AACA,+BAAmB,OAAO,gBAAgB;AAAA,UAC5C;AAAA,QACF;AAAA,MACF,SAAS,OAAO;AACd,YACE,aAAa,YAAY,kBACzB,iBAAiB,YAAY,iBAC7B;AACA,mBAAS,QAAQ,KAAK,CAAC;AAAA,QACzB;AAAA,MACF,UAAE;AACA,YACE,aAAa,YAAY,kBACzB,iBAAiB,YAAY,iBAC7B;AACA,sBAAY,KAAK;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,QAAQ,UAAU,WAAW,WAAW,WAAW;AAAA,EACtD;AAEA,QAAM,cAAc;AAAA,IAClB,CAAC,SAAiB;AAChB,UAAI,aAAa,YAAY,UAAW;AACxC,wBAAkB,WAAW;AAC7B,eAAS,UAAU;AACnB,0BAAoB,UAAU;AAAA,QAC5B;AAAA,QACA,oBAAoB;AAAA,QACpB;AAAA,UACE,MAAM;AAAA,UACN,WAAW;AAAA,YACT,qBAAqB;AAAA,YACrB,kBAAkB,cAAc,OAAO,EAAE,aAAa,CAAC;AAAA,UACzD;AAAA,UACA,aAAa,eAAe;AAAA,UAC5B,QAAQ,UAAU,WAAW;AAAA,QAC/B;AAAA,MACF;AACA,+BAAyB;AAAA,QACvB,MAAM;AAAA,QACN,WAAW;AAAA,UACT,qBAAqB;AAAA,UACrB,kBAAkB,cAAc,OAAO,EAAE,aAAa,CAAC;AAAA,QACzD;AAAA,QACA,aAAa,eAAe;AAAA,QAC5B,QAAQ,UAAU,WAAW;AAAA,MAC/B,CAAC;AACD,eAAS,IAAI;AAAA,IACf;AAAA,IACA,CAAC,qBAAqB,0BAA0B,SAAS;AAAA,EAC3D;AAEA,QAAM,oBAAoB;AAAA,IACxB,CAAC,MAAiC,iBAAgC,SAAS;AACzE,UAAI,aAAa,YAAY,UAAW;AACxC,wBAAkB,WAAW;AAC7B,qBAAe,UAAU;AACzB,0BAAoB,UAAU;AAAA,QAC5B;AAAA,QACA,oBAAoB;AAAA,QACpB;AAAA,UACE,MAAM,SAAS;AAAA,UACf,WAAW;AAAA,YACT,qBAAqB;AAAA,YACrB,kBAAkB,cAAc,OAAO,EAAE,aAAa,CAAC;AAAA,UACzD;AAAA,UACA,aAAa;AAAA,UACb,QAAQ,UAAU,WAAW;AAAA,QAC/B;AAAA,MACF;AACA,+BAAyB;AAAA,QACvB,MAAM,SAAS;AAAA,QACf,WAAW;AAAA,UACT,qBAAqB;AAAA,UACrB,kBAAkB,cAAc,OAAO,EAAE,aAAa,CAAC;AAAA,QACzD;AAAA,QACA,aAAa;AAAA,QACb,QAAQ,UAAU,WAAW;AAAA,MAC/B,CAAC;AACD,qBAAe,IAAI;AACnB,kCAA4B,cAAc;AAAA,IAC5C;AAAA,IACA,CAAC,qBAAqB,0BAA0B,SAAS;AAAA,EAC3D;AAEA,QAAM,gBAAgB;AAAA,IACpB,CAAC,eAAwC;AACvC,UAAI,eAAe,QAAQ,UAAU,IAAI;AACvC,iBAAS,IAAI,MAAM,wDAAwD,CAAC;AAC5E;AAAA,MACF;AACA,YAAM,OAAO,CAAC,GAAG,eAAe,SAAS,UAAU;AACnD,wBAAkB,MAAM,WAAW,EAAE;AAAA,IACvC;AAAA,IACA,CAAC,iBAAiB;AAAA,EACpB;AAEA,QAAM,mBAAmB;AAAA,IACvB,CAAC,IAAY,SAAiB;AAC5B;AAAA,QACE,eAAe,QAAQ;AAAA,UAAI,CAAC,eAC1B,WAAW,OAAO,KAAK,EAAE,GAAG,YAAY,KAAK,IAAI;AAAA,QACnD;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,iBAAiB;AAAA,EACpB;AAEA,QAAM,mBAAmB;AAAA,IACvB,CAAC,OAAe;AACd,wBAAkB,eAAe,QAAQ,OAAO,CAAC,eAAe,WAAW,OAAO,EAAE,CAAC;AAAA,IACvF;AAAA,IACA,CAAC,iBAAiB;AAAA,EACpB;AAEA,QAAM,8BAA8B,YAAY,MAAM;AACpD,gCAA4B,IAAI;AAAA,EAClC,GAAG,CAAC,CAAC;AAEL,QAAM,eAAe;AAAA,IACnB,CAAC,SAA+B;AAC9B,UAAI,aAAa,YAAY,UAAW;AACxC,wBAAkB,WAAW;AAC7B,gBAAU,UAAU;AACpB,YAAM,SAAS;AAAA,QACb,MAAM,SAAS;AAAA,QACf,WAAW;AAAA,UACT,qBAAqB;AAAA,UACrB,kBAAkB,cAAc,OAAO,EAAE,aAAa,CAAC;AAAA,QACzD;AAAA,QACA,aAAa,eAAe;AAAA,QAC5B,QAAQ;AAAA,MACV;AACA,0BAAoB,UAAU;AAAA,QAC5B;AAAA,QACA,oBAAoB;AAAA,QACpB;AAAA,MACF;AACA,+BAAyB,MAAM;AAC/B,gBAAU,IAAI;AAAA,IAChB;AAAA,IACA,CAAC,qBAAqB,0BAA0B,SAAS;AAAA,EAC3D;AAEA,QAAM,cAAc;AAAA,IAClB,CAAC,UAAwB;AACvB,YAAM,UAAU,UAAU;AAC1B,UAAI,QAAS,cAAa,EAAE,GAAG,SAAS,MAAM,CAAC;AAAA,IACjD;AAAA,IACA,CAAC,YAAY;AAAA,EACf;AAEA,QAAM,wBAAwB;AAAA,IAC5B,CAAC,oBAA2C;AAC1C,YAAM,UAAU,UAAU;AAC1B,UAAI,QAAS,cAAa,EAAE,GAAG,SAAS,gBAAgB,CAAC;AAAA,IAC3D;AAAA,IACA,CAAC,YAAY;AAAA,EACf;AAEA,QAAM,oBAAoB;AAAA,IACxB,CAAC,gBAAmC;AAClC,YAAM,UAAU,UAAU;AAC1B,UAAI,QAAS,cAAa,EAAE,GAAG,SAAS,YAAY,CAAC;AAAA,IACvD;AAAA,IACA,CAAC,YAAY;AAAA,EACf;AAEA,QAAM,yBAAyB;AAAA,IAC7B,CAAC,UAAkB;AACjB,UAAI,aAAa,YAAY,UAAW;AACxC,wBAAkB,WAAW;AAC7B,YAAM,OAAO,qBAAqB,QAAQ,OAAO,CAAC,GAAG,cAAc,cAAc,KAAK;AACtF,2BAAqB,UAAU;AAC/B,0BAAoB,UAAU;AAAA,QAC5B;AAAA,QACA,oBAAoB;AAAA,QACpB;AAAA,UACE,MAAM,SAAS;AAAA,UACf,WAAW,eAAe,MAAM,kBAAkB,cAAc,OAAO,EAAE,aAAa,CAAC,CAAC;AAAA,UACxF,aAAa,eAAe;AAAA,UAC5B,QAAQ,UAAU,WAAW;AAAA,QAC/B;AAAA,MACF;AACA,+BAAyB;AAAA,QACvB,MAAM,SAAS;AAAA,QACf,WAAW,eAAe,MAAM,kBAAkB,cAAc,OAAO,EAAE,aAAa,CAAC,CAAC;AAAA,QACxF,aAAa,eAAe;AAAA,QAC5B,QAAQ,UAAU,WAAW;AAAA,MAC/B,CAAC;AACD,2BAAqB,IAAI;AAAA,IAC3B;AAAA,IACA,CAAC,qBAAqB,0BAA0B,SAAS;AAAA,EAC3D;AAEA,QAAM,kBAAkB,YAAY,MAAe;AACjD,UAAM,UAAU,SAAS;AACzB,UAAM,SAAS,kBAAkB,cAAc,OAAO;AACtD,WACE,SAAS,QAAQ,SAAS,KAC1B,eAAe,QAAQ,SAAS,KAChC,qBAAqB,QAAQ,SAAS,MACrC,OAAO,WAAW,UAAU,KAAK,KACjC,SAAS,iBAAiB,QAAQ,SAAS,iBAAiB;AAAA,EAEjE,GAAG,CAAC,CAAC;AAEL,QAAM,uBAAuB;AAAA,IAC3B,OAAO,WAAsD;AAC3D,YAAM,iBAAiB;AACvB,YAAM,kBAAkB,iBAAiB;AACzC,UAAI,CAAC,aAAa,CAAC,iBAAiB,aAAa,YAAY,eAAgB;AAC7E,YAAM,SAAS,MAAM,OAAO,iBAAiB,aAAa,SAAS;AACnE,UAAI,aAAa,YAAY,kBAAkB,iBAAiB,YAAY,iBAAiB;AAC3F;AAAA,MACF;AACA,UAAI,WAAW,cAAc;AAC3B,mBAAW,MAAM;AACjB,iBAAS,IAAI;AACb;AAAA,MACF;AACA,eAAS,UAAU;AACnB,eAAS,MAAM;AACf,uBAAiB,IAAI;AACrB,eAAS,IAAI;AACb,YAAM,UAAU,oBAAoB;AACpC,UAAI,QAAS,OAAM,eAAe,EAAE,GAAG,SAAS,kBAAkB,OAAO,SAAS,CAAC;AAAA,IACrF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,kBAAkB,mBAAmB;AAC3C,QAAM,kBAAkB,kBAAkB,WAAW;AACrD,QAAM,4BAAyD,kBAC3D;AAAA,IACE,GAAG,gBAAgB;AAAA,MACjB,CAAC,EAAE,OAAO,QAAQ,cAAc,UAAU,UAAU,QAAQ,GAAG,KAAK,MAAM;AAAA,IAC5E;AAAA,IACA,GAAI,iBAAiB,gBACjB;AAAA,MACE;AAAA,QACE,eAAe,gBAAgB;AAAA,QAC/B,UAAU;AAAA,QACV,aAAa;AAAA,QACb,MAAM,gBAAgB;AAAA,QACtB,aACE,oBAAoB,SAAS,aAAa,UACtC,oBAAoB,QAAQ,oBAC5B,CAAC;AAAA,QACP,WACE,oBAAoB,SAAS,aAAa,UACtC,oBAAoB,QAAQ,kBAC5B,CAAC;AAAA,QACP,YAAY,sBAAsB;AAAA,QAClC,OACE,gBAAgB,UAAU,eACrB,YACD,gBAAgB,UAAU,WACvB,WACA;AAAA,QACT,QAAQ,gBAAgB;AAAA,QACxB,gBAAgB,gBAAgB;AAAA,QAChC,GAAI,gBAAgB,QAAQ,EAAE,OAAO,gBAAgB,MAAM,IAAI,CAAC;AAAA,QAChE,GAAI,gBAAgB,mBAAmB,SACnC,EAAE,gBAAgB,gBAAgB,eAAe,IACjD,CAAC;AAAA,MACP;AAAA,IACF,IACA,CAAC;AAAA,EACP,IACA,CAAC;AACL,QAAM,cAAc,YAAY,YAAY,MAAM,UAAU,IAAI,GAAG,CAAC,SAAS,CAAC;AAC9E,QAAM,aAAa,YAAY,MAAM;AACnC,QAAI,aAAa,YAAY,UAAW;AACxC,aAAS,IAAI;AACb,qBAAiB,IAAI;AAAA,EACvB,GAAG,CAAC,SAAS,CAAC;AAQd,QAAM,eAAe,kBAAkB,SAAS,UAAU;AAE1D,SAAO;AAAA,IACL,OAAO;AAAA,IACP,UAAU;AAAA,IACV,aAAa,kBAAkB,cAAc,CAAC;AAAA,IAC9C;AAAA,IACA;AAAA,IACA;AAAA,IACA,0BAA0B,kBAAkB,2BAA2B;AAAA,IACvE;AAAA,IACA;AAAA,IACA;AAAA,IACA,oBAAoB;AAAA,IACpB;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU;AAAA,IACV,iBAAiB,kBACb,iBAAiB,UAAU,cAAc,gBAAgB,4BAA4B,OACnF,aACA,OACF;AAAA,IACJ,SAAS,kBAAkB,UAAU;AAAA,IACrC,SACE,mBACA,QAAQ,SAAS,KACjB,CAAC,WACD,CAAC,gBACD,WAAW,QACX,eAAe,UAAU,MAAM,QAC/B,wBACC,uBACC,aAAa,KAAK,EAAE,SAAS,KAC7B,qBACA,YAAY,SAAS;AAAA,IACzB;AAAA,IACA,SAAS,kBAAkB,UAAU;AAAA,IACrC;AAAA,IACA;AAAA,IACA,UAAU,kBAAkB,WAAW;AAAA,IACvC,kBAAkB,kBAAkB,oBAAoB,UAAU;AAAA,IAClE,OAAO,kBAAkB,QAAQ;AAAA,IACjC,eAAe,kBAAmB,OAAO,YAAY,IAAK;AAAA,IAC1D,cAAc,kBAAkB,eAAe,QAAQ,SAAS,KAAK;AAAA,IACrE,aAAa,kBAAkB,cAAc;AAAA,IAC7C,eAAe,kBAAkB,gBAAgB;AAAA,IACjD,QAAQ,kBAAkB,SAAS;AAAA,IACnC,UAAU;AAAA,IACV,oBAAoB;AAAA,IACpB,gBAAgB;AAAA,IAChB,kBAAkB,gBAAgB,YAAY;AAAA,IAC9C;AAAA,IACA;AAAA,IACA;AAAA,IACA,mBAAmB,kBAAkB,oBAAoB,CAAC;AAAA,IAC1D;AAAA,IACA,OAAO,kBAAkB,QAAQ;AAAA,IACjC;AAAA,EACF;AACF;AAGO,SAAS,qBAAqB,OAA4C;AAC/E,SAAO,MAAM,SAAS,kBAAkB,MAAM,SAAS;AACzD;AAQO,IAAM,yBAAyB;AAG/B,SAAS,kBACd,QACoB;AACpB,UAAQ,OAAO,WAAW,aAAa,OAAO,IAAI,WAAW,CAAC;AAChE;AAMO,SAAS,iBACd,MACA,eACA,QACA,QAAmC,CAAC,GAClB;AAClB,SAAO,EAAE,GAAG,kBAAkB,MAAM,GAAG,GAAG,OAAO,MAAM,cAAc;AACvE;AAGO,SAAS,kBAAkB,OAMtB;AACV,MAAI,MAAM,QAAQ,WAAW,MAAM,UAAU;AAC3C,WAAO;AAAA,EACT;AACA,SAAO,MAAM,aAAa,gBAAgB;AAC5C;AAGO,SAAS,iBAAiB,OAA0D;AACzF,SAAO,MAAM,YAAY,QAAQ,MAAM,YAAY;AACrD;AAEA,SAAS,wBAAgC;AACvC,SAAO,WAAW,OAAO,WAAW;AACtC;AAEA,SAAS,sBAAsB,OAAyB;AACtD,SACE,OAAO,UAAU,YACjB,UAAU,QACT,MAAuC,mBAAmB;AAE/D;AAEA,eAAe,qBAAwB,SAAuC;AAC5E,MAAI;AACF,WAAO,MAAM,QAAQ;AAAA,EACvB,SAAS,OAAO;AACd,QAAI,CAAC,sBAAsB,KAAK,EAAG,OAAM;AACzC,WAAO,MAAM,QAAQ;AAAA,EACvB;AACF;AAEA,SAAS,QAAQ,OAAuB;AACtC,SAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;AACjE;AAEA,SAAS,qBAAqB,OAAuB;AACnD,QAAM,WAAW;AACjB,SACE,SAAS,WAAW,OAAO,SAAS,mBAAmB,QAAQ,SAAS,SAAS;AAErF;AAEA,SAAS,aAAa,OAAgD;AACpE,SAAO;AAAA,IACL,kBAAkB,MAAM;AAAA,IACxB,MAAM,MAAM;AAAA,IACZ,WAAW,MAAM;AAAA,IACjB,aAAa,MAAM,eAAe,CAAC;AAAA,IACnC,OAAO,MAAM;AAAA,IACb,iBAAiB,MAAM;AAAA,IACvB,aAAa,MAAM;AAAA,EACrB;AACF;AAEA,SAAS,gBAAgB,OAAsC;AAC7D,SAAO;AAAA,IACL,OAAO,MAAM;AAAA,IACb,iBAAiB,MAAM;AAAA,IACvB,aAAa,MAAM;AAAA,EACrB;AACF;AAEA,SAAS,qBACP,MACA,MACA,mBACA,aACA,QACA,qBAC0B;AAC1B,SAAO;AAAA,IACL,kBAAkB,KAAK;AAAA,IACvB;AAAA,IACA,WAAW,eAAe,mBAAmB,mBAAmB;AAAA,IAChE;AAAA,IACA,OAAO,OAAO;AAAA,IACd,iBAAiB,OAAO;AAAA,IACxB,aAAa,OAAO;AAAA,EACtB;AACF;AAEA,SAAS,eAAe,SAA2C;AACjE,QAAM,EAAE,kBAAkB,WAAW,GAAG,QAAQ,IAAI;AACpD,SAAO,KAAK,UAAU,OAAO;AAC/B;AAEA,SAAS,eAAe,MAAqB,WAAyC;AACpF,QAAM,OAAO,oBAAI,IAAY;AAC7B,SAAO,CAAC,GAAG,MAAM,GAAG,SAAS,EAAE,OAAO,CAAC,aAAa;AAOlD,UAAM,MACJ,SAAS,SAAS,SACd,QAAQ,SAAS,MAAM,KAAS,SAAS,aAAa,GAAG,gCAAgC,IAAI,SAAS,MAAM,EAAE,KAC9G,KAAK,UAAU,QAAQ;AAC7B,QAAI,KAAK,IAAI,GAAG,EAAG,QAAO;AAC1B,SAAK,IAAI,GAAG;AACZ,WAAO;AAAA,EACT,CAAC;AACH;","names":["payload","nextPolicy","annotationsComplete"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/session-context.ts"],"sourcesContent":["import type {\n StreamConnectionState,\n WorkspaceControlEvent,\n WorkspaceInteractionRevisionEvent,\n} from \"@opengeni/sdk\";\nimport { createContext, useContext } from \"react\";\nimport type {\n EmbeddedFileAttachmentClientLike,\n EmbeddedGoalClientLike,\n EmbeddedHumanInputSessionClientLike,\n EmbeddedBrowserInteractionClientLike,\n EmbeddedComputerInteractionClientLike,\n EmbeddedInteractionClientLike,\n EmbeddedInterventionClientLike,\n EmbeddedRealtimeSessionClientLike,\n EmbeddedSessionClientLike,\n EmbeddedSessionLineageClientLike,\n EmbeddedSessionMcpApprovalPolicyClientLike,\n EmbeddedSessionReadClientLike,\n SessionClientLike,\n} from \"./client\";\n\nexport type OpenGeniContextValue = {\n client: SessionClientLike;\n workspaceId: string;\n workspaceControlEvent: WorkspaceControlEvent | null;\n workspaceControlConnectionState: StreamConnectionState | \"idle\" | \"error\";\n workspaceInteractionEvent: WorkspaceInteractionRevisionEvent | null;\n workspaceInteractionConnectionState: StreamConnectionState | \"idle\" | \"error\";\n registerSessionReconciler: (\n sessionId: string,\n key: string,\n reconcile: () => Promise<void>,\n ) => () => void;\n reconcileSession: (sessionId: string) => Promise<void>;\n};\n\nexport const OpenGeniContext = createContext<OpenGeniContextValue | null>(null);\n\nconst NOOP_REGISTER_RECONCILER: OpenGeniContextValue[\"registerSessionReconciler\"] = () => () =>\n undefined;\nconst NOOP_RECONCILE_SESSION: OpenGeniContextValue[\"reconcileSession\"] = async () => undefined;\n\nexport type ClientOverride = {\n client?: SessionClientLike | undefined;\n workspaceId?: string | undefined;\n};\n\nexport type EmbeddedSessionClientOverride = {\n client?: EmbeddedSessionClientLike | undefined;\n workspaceId?: string | undefined;\n};\n\nexport type EmbeddedHumanInputClientOverride = {\n client?: EmbeddedHumanInputSessionClientLike | undefined;\n workspaceId?: string | undefined;\n};\n\nexport type EmbeddedSessionMcpApprovalPolicyClientOverride = {\n client?: EmbeddedSessionMcpApprovalPolicyClientLike | undefined;\n workspaceId?: string | undefined;\n};\n\nexport type EmbeddedSessionReadClientOverride = {\n client?: EmbeddedSessionReadClientLike | undefined;\n workspaceId?: string | undefined;\n};\n\nexport type EmbeddedRealtimeSessionClientOverride = {\n client?: EmbeddedRealtimeSessionClientLike | undefined;\n workspaceId?: string | undefined;\n};\n\nexport type EmbeddedGoalClientOverride = {\n client?: EmbeddedGoalClientLike | undefined;\n workspaceId?: string | undefined;\n};\n\nexport type EmbeddedSessionLineageClientOverride = {\n client?: EmbeddedSessionLineageClientLike | undefined;\n workspaceId?: string | undefined;\n};\n\nexport type EmbeddedFileAttachmentClientOverride = {\n client?: EmbeddedFileAttachmentClientLike | undefined;\n workspaceId?: string | undefined;\n};\n\nexport type EmbeddedInteractionClientOverride = {\n client?: EmbeddedInteractionClientLike | undefined;\n workspaceId?: string | undefined;\n};\n\nexport type EmbeddedInterventionClientOverride = {\n client?: EmbeddedInterventionClientLike | undefined;\n workspaceId?: string | undefined;\n};\n\nexport type EmbeddedBrowserInteractionClientOverride = {\n client?: EmbeddedBrowserInteractionClientLike | undefined;\n workspaceId?: string | undefined;\n};\n\nexport type EmbeddedComputerInteractionClientOverride = {\n client?: EmbeddedComputerInteractionClientLike | undefined;\n workspaceId?: string | undefined;\n};\n\nexport type EmbeddedSessionContextValue = Omit<OpenGeniContextValue, \"client\"> & {\n client: EmbeddedSessionClientLike;\n};\n\ntype EmbeddedClientOverride<TClient> = {\n client?: TClient | undefined;\n workspaceId?: string | undefined;\n};\n\ntype EmbeddedClientContextValue<TClient> = Omit<OpenGeniContextValue, \"client\"> & {\n client: TClient;\n};\n\nfunction useEmbeddedClientRefinement<TClient extends object>(\n override: EmbeddedClientOverride<TClient>,\n requiredMethods: readonly string[],\n hookName: string,\n): EmbeddedClientContextValue<TClient> {\n const context = useContext(OpenGeniContext);\n const candidate = override.client ?? context?.client;\n const workspaceId = override.workspaceId ?? context?.workspaceId;\n if (!candidate || !workspaceId) {\n throw new Error(\n \"@opengeni/react: no OpenGeni client/workspace available. Wrap the tree in <OpenGeniProvider> or pass { client, workspaceId } to the hook.\",\n );\n }\n const methods = candidate as Record<string, unknown>;\n const missing = requiredMethods.filter((method) => typeof methods[method] !== \"function\");\n if (missing.length > 0) {\n throw new Error(\n `@opengeni/react: ${hookName} requires client method${missing.length === 1 ? \"\" : \"s\"} ${missing.join(\", \")}.`,\n );\n }\n return {\n client: candidate as TClient,\n workspaceId,\n workspaceControlEvent: context?.workspaceControlEvent ?? null,\n workspaceControlConnectionState: context?.workspaceControlConnectionState ?? \"idle\",\n workspaceInteractionEvent: context?.workspaceInteractionEvent ?? null,\n workspaceInteractionConnectionState: context?.workspaceInteractionConnectionState ?? \"idle\",\n registerSessionReconciler: context?.registerSessionReconciler ?? NOOP_REGISTER_RECONCILER,\n reconcileSession: context?.reconcileSession ?? NOOP_RECONCILE_SESSION,\n };\n}\n\nfunction eventClientMethods(override: object, directMethods: readonly string[]): readonly string[] {\n const hasSharedEventFeed =\n \"events\" in override && (override as { events?: unknown }).events !== undefined;\n return hasSharedEventFeed ? directMethods : [\"getSession\", \"streamEvents\", ...directMethods];\n}\n\n/** Resolve client + workspace from explicit overrides or the provider. */\nexport function useOpenGeni(override: ClientOverride = {}): OpenGeniContextValue {\n const context = useContext(OpenGeniContext);\n const client = override.client ?? context?.client;\n const workspaceId = override.workspaceId ?? context?.workspaceId;\n if (!client || !workspaceId) {\n throw new Error(\n \"@opengeni/react: no OpenGeni client/workspace available. Wrap the tree in <OpenGeniProvider> or pass { client, workspaceId } to the hook.\",\n );\n }\n return {\n client,\n workspaceId,\n workspaceControlEvent: context?.workspaceControlEvent ?? null,\n workspaceControlConnectionState: context?.workspaceControlConnectionState ?? \"idle\",\n workspaceInteractionEvent: context?.workspaceInteractionEvent ?? null,\n workspaceInteractionConnectionState: context?.workspaceInteractionConnectionState ?? \"idle\",\n registerSessionReconciler: context?.registerSessionReconciler ?? NOOP_REGISTER_RECONCILER,\n reconcileSession: context?.reconcileSession ?? NOOP_RECONCILE_SESSION,\n };\n}\n\nconst BROWSER_INTERACTION_METHODS = [\n \"streamWorkspaceInteractionRevisions\",\n \"listNetworkRoutes\",\n \"getNetworkRoute\",\n \"createNetworkRoute\",\n \"updateNetworkRoute\",\n \"listSiteAuthConnections\",\n \"getSiteAuthConnection\",\n \"createSiteAuthConnection\",\n \"updateSiteAuthConnection\",\n \"listAuthRuns\",\n \"getAuthRun\",\n \"startBrowserAuthRun\",\n \"reportBrowserAuthRun\",\n \"protectedBrowserAuthFill\",\n \"verifyBrowserAuthRun\",\n \"listInteractionInterventions\",\n \"getInteractionIntervention\",\n \"createInteractionIntervention\",\n \"resolveInteractionIntervention\",\n \"listAttachedBrowsers\",\n \"getAttachedBrowser\",\n \"listBrowserIdentities\",\n \"getBrowserIdentity\",\n \"createBrowserIdentity\",\n \"updateBrowserIdentity\",\n \"listBrowserRevisions\",\n \"listBrowserSessions\",\n \"getBrowserSession\",\n \"readBrowserClipboard\",\n \"listBrowserDownloads\",\n \"getBrowserDownload\",\n \"saveBrowserDownload\",\n \"createBrowserSession\",\n \"listBrowserTargets\",\n \"openBrowserTarget\",\n \"selectBrowserTarget\",\n \"closeBrowserTarget\",\n \"observeBrowserTarget\",\n \"actInBrowser\",\n \"getBrowserActionReceipt\",\n \"listBrowserDiagnostics\",\n \"attachBrowserSession\",\n \"heartbeatBrowserSession\",\n \"publishBrowserRevision\",\n \"suspendBrowserSession\",\n \"resumeBrowserSession\",\n \"endBrowserSession\",\n] as const;\n\nconst COMPUTER_INTERACTION_METHODS = [\n \"streamWorkspaceInteractionRevisions\",\n \"listInteractionInterventions\",\n \"getInteractionIntervention\",\n \"createInteractionIntervention\",\n \"resolveInteractionIntervention\",\n \"listComputerSessions\",\n \"getComputerSession\",\n \"readComputerClipboard\",\n \"createComputerSession\",\n \"listComputerTargets\",\n \"observeComputerTarget\",\n \"actInComputer\",\n \"getComputerActionReceipt\",\n \"attachComputerSession\",\n \"heartbeatComputerSession\",\n \"endComputerSession\",\n] as const;\n\nconst INTERVENTION_METHODS = [\n \"streamWorkspaceInteractionRevisions\",\n \"listInteractionInterventions\",\n \"getInteractionIntervention\",\n \"createInteractionIntervention\",\n \"resolveInteractionIntervention\",\n] as const;\n\n/** Resolve only the workspace-wide Browser/Computer intervention surface. */\nexport function useEmbeddedInterventions(\n override: EmbeddedInterventionClientOverride = {},\n): EmbeddedClientContextValue<EmbeddedInterventionClientLike> {\n return useEmbeddedClientRefinement(\n override,\n INTERVENTION_METHODS,\n \"interaction intervention hooks\",\n );\n}\n\n/** Resolve only BrowserSession methods for a standalone Browser embed. */\nexport function useEmbeddedBrowserInteraction(\n override: EmbeddedBrowserInteractionClientOverride = {},\n): EmbeddedClientContextValue<EmbeddedBrowserInteractionClientLike> {\n return useEmbeddedClientRefinement(\n override,\n BROWSER_INTERACTION_METHODS,\n \"browser interaction hooks\",\n );\n}\n\n/** Resolve only ComputerSession methods for a standalone Computer embed. */\nexport function useEmbeddedComputerInteraction(\n override: EmbeddedComputerInteractionClientOverride = {},\n): EmbeddedClientContextValue<EmbeddedComputerInteractionClientLike> {\n return useEmbeddedClientRefinement(\n override,\n COMPUTER_INTERACTION_METHODS,\n \"computer interaction hooks\",\n );\n}\n\n/** Resolve the complete Browser + Computer client surface. */\nexport function useEmbeddedInteraction(\n override: EmbeddedInteractionClientOverride = {},\n): EmbeddedClientContextValue<EmbeddedInteractionClientLike> {\n return useEmbeddedClientRefinement(\n override,\n [...BROWSER_INTERACTION_METHODS, ...COMPUTER_INTERACTION_METHODS],\n \"interaction hooks\",\n );\n}\n\n/**\n * Resolve the narrow client required by the session-only hooks. The full\n * provider client is structurally compatible, while an explicit host proxy\n * only needs to expose session/event/composer/queue/control operations.\n */\nexport function useEmbeddedSession(\n override: EmbeddedSessionClientOverride = {},\n): EmbeddedSessionContextValue {\n return useEmbeddedClientRefinement(\n override,\n [\n \"getSession\",\n \"listEvents\",\n \"streamEvents\",\n \"getComposerDraft\",\n \"saveComposerDraft\",\n \"submitComposerDraft\",\n \"sendMessage\",\n \"steerMessage\",\n \"getQueue\",\n \"moveQueueItem\",\n \"editQueueItem\",\n \"steerQueueItem\",\n \"deleteQueueItem\",\n \"pauseSession\",\n \"resumeSession\",\n \"sendApprovalDecision\",\n ],\n \"session hooks\",\n );\n}\n\n/** Resolve the exact client surface required by `useSession`. */\nexport function useEmbeddedSessionRead(\n override: EmbeddedSessionReadClientOverride = {},\n): EmbeddedClientContextValue<EmbeddedSessionReadClientLike> {\n return useEmbeddedClientRefinement(\n override,\n eventClientMethods(override, [\"getSession\", \"updateSession\"]),\n \"useSession\",\n );\n}\n\n/** Resolve the exact client surface required by `useGoal`. */\nexport function useEmbeddedGoal(\n override: EmbeddedGoalClientOverride = {},\n): EmbeddedClientContextValue<EmbeddedGoalClientLike> {\n return useEmbeddedClientRefinement(\n override,\n eventClientMethods(override, [\"getGoal\", \"updateGoal\", \"deleteGoal\"]),\n \"useGoal\",\n );\n}\n\n/** Resolve the exact client surface required by `useSessionLineage`. */\nexport function useEmbeddedSessionLineage(\n override: EmbeddedSessionLineageClientOverride = {},\n): EmbeddedClientContextValue<EmbeddedSessionLineageClientLike> {\n return useEmbeddedClientRefinement(\n override,\n eventClientMethods(override, [\"getSessionLineage\"]),\n \"useSessionLineage\",\n );\n}\n\n/** Resolve the exact client surface required by `useFileAttachments`. */\nexport function useEmbeddedFileAttachments(\n override: EmbeddedFileAttachmentClientOverride = {},\n): EmbeddedClientContextValue<EmbeddedFileAttachmentClientLike> {\n return useEmbeddedClientRefinement(override, [\"uploadFile\"], \"useFileAttachments\");\n}\n\n/**\n * Resolve the structured-input refinement without widening the baseline\n * session-only proxy contract.\n */\nexport function useEmbeddedHumanInputSession(override: EmbeddedHumanInputClientOverride = {}): Omit<\n EmbeddedSessionContextValue,\n \"client\"\n> & {\n client: EmbeddedHumanInputSessionClientLike;\n} {\n return useEmbeddedClientRefinement(\n override,\n eventClientMethods(override, [\"listHumanInputRequests\", \"submitHumanInputResponse\"]),\n \"useHumanInputRequests\",\n );\n}\n\n/** Resolve the approval-policy refinement without widening session-only hosts. */\nexport function useEmbeddedSessionMcpApprovalPolicy(\n override: EmbeddedSessionMcpApprovalPolicyClientOverride = {},\n): Omit<EmbeddedSessionContextValue, \"client\"> & {\n client: EmbeddedSessionMcpApprovalPolicyClientLike;\n} {\n return useEmbeddedClientRefinement(\n override,\n eventClientMethods(override, [\"getSession\", \"updateSessionMcpApprovalPolicy\"]),\n \"useSessionMcpApprovalPolicy\",\n );\n}\n\n/** Resolve the exact browser/API surface required by `@opengeni/react/realtime`. */\nexport function useEmbeddedRealtimeSession(\n override: EmbeddedRealtimeSessionClientOverride = {},\n): EmbeddedClientContextValue<EmbeddedRealtimeSessionClientLike> {\n // Preserve the existing lazy capability behavior: proxy/test clients may\n // implement only the methods reached by their selected model and lifecycle.\n // The exported structural type remains the complete embedding contract.\n return useEmbeddedClientRefinement(override, [], \"realtime hooks\");\n}\n\n/**\n * Resolve the client only — for hooks that are not workspace-scoped\n * (`useWorkspaces`, `useBillingUsage`).\n */\nexport function useOpenGeniClient(\n override: Pick<ClientOverride, \"client\"> = {},\n): SessionClientLike {\n const context = useContext(OpenGeniContext);\n const client = override.client ?? context?.client;\n if (!client) {\n throw new Error(\n \"@opengeni/react: no OpenGeni client available. Wrap the tree in <OpenGeniProvider> or pass { client } to the hook.\",\n );\n }\n return client;\n}\n"],"mappings":"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","names":[]}
|