@opengeni/react 4.6.1 → 4.6.2-canary.39854174564001
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/dist/app/app-state.js +5 -5
- package/dist/app/components/Composer.js +14 -14
- package/dist/app/components/artifacts/artifact-library.js +2 -2
- package/dist/app/components/artifacts/chat-interactive-block.js +10 -10
- package/dist/app/components/artifacts/inline-chat-image.js +14 -14
- package/dist/app/components/artifacts/retained-file-preview.js +15 -15
- package/dist/app/components/artifacts/retained-text-preview.js +2 -2
- package/dist/app/components/artifacts/site-conversations.js +4 -3
- package/dist/app/components/artifacts/site-data.js +2 -2
- package/dist/app/components/artifacts/site-publishing.js +11 -11
- package/dist/app/components/artifacts/site-settings.js +12 -12
- package/dist/app/components/billing-class-mark.js +3 -3
- package/dist/app/components/capabilities/capability-detail-sheet.js +2 -2
- package/dist/app/components/capabilities/capability-logo-source.js +7 -7
- package/dist/app/components/capabilities/native-connect-readiness.js +1 -0
- package/dist/app/components/capabilities/native-connect-readiness.js.map +1 -1
- package/dist/app/components/capabilities/native-connect-setup.js +6 -6
- package/dist/app/components/capabilities/perform-capability-action.js +2 -1
- package/dist/app/components/capabilities/prepared-mcp-setup-card.js +8 -8
- package/dist/app/components/capabilities/session-capability-card.js +28 -27
- package/dist/app/components/capabilities/session-capability-card.js.map +1 -1
- package/dist/app/components/capabilities/session-chrome-card.js +14 -14
- package/dist/app/components/capabilities/session-custom-mcp-card.js +9 -9
- package/dist/app/components/capabilities/session-github-card.js +9 -9
- package/dist/app/components/capabilities/session-machine-card.js +13 -13
- package/dist/app/components/command-menu/chat-status.js +6 -5
- package/dist/app/components/command-menu/chat-switcher.d.ts +2 -0
- package/dist/app/components/command-menu/chat-switcher.js +26 -9
- package/dist/app/components/command-menu/chat-switcher.js.map +1 -1
- package/dist/app/components/command-menu/command-menu.js +9 -8
- package/dist/app/components/command-menu/command-menu.js.map +1 -1
- package/dist/app/components/command-menu/shortcut-sheet.js +4 -4
- package/dist/app/components/composer-mobile-plus-panel.js +5 -5
- package/dist/app/components/composer-mobile-plus.js +1 -1
- package/dist/app/components/credit-required-gate.js +1 -1
- package/dist/app/components/credit-required-prompt.js +3 -3
- package/dist/app/components/desktop/app-shots.js +5 -5
- package/dist/app/components/desktop/this-computer.js +4 -4
- package/dist/app/components/feedback.js +3 -3
- package/dist/app/components/github-app-connect-launcher.js +1 -1
- package/dist/app/components/machines/connect-machine-dialog.js +3 -3
- package/dist/app/components/markdown.js +4 -4
- package/dist/app/components/models/models-ui.js +2 -2
- package/dist/app/components/pickers.js +5 -5
- package/dist/app/components/rail/rail-context.js +1 -1
- package/dist/app/components/rail/rail-sections.js +15 -14
- package/dist/app/components/rail/session-header.d.ts +6 -5
- package/dist/app/components/rail/session-header.js +11 -10
- package/dist/app/components/rail/session-list.js +14 -13
- package/dist/app/components/rail/session-row-hover-details.js +7 -6
- package/dist/app/components/rail/session-shell.js +30 -32
- package/dist/app/components/rail/site-session-group-heading.js +2 -1
- package/dist/app/components/session/agent-configuration-panel.js +3 -3
- package/dist/app/components/session/banners.js +6 -6
- package/dist/app/components/session/editable-artifacts-workspace.js +12 -12
- package/dist/app/components/session/failed-session-banner.js +4 -4
- package/dist/app/components/session/human-input.js +24 -24
- package/dist/app/components/session/inspector.js +30 -30
- package/dist/app/components/session/message-actions.js +3 -3
- package/dist/app/components/session/message-resource-attachments.js +5 -5
- package/dist/app/components/session/model-recovery-notice.js +3 -3
- package/dist/app/components/session/new-session-settings-menu.js +4 -4
- package/dist/app/components/session/sandbox-switcher.js +7 -7
- package/dist/app/components/session/sandbox-workspace.js +33 -33
- package/dist/app/components/session/search-markdown-highlight.js +5 -5
- package/dist/app/components/session/search-results-view.js +6 -6
- package/dist/app/components/session/session-admission-notice.js +4 -4
- package/dist/app/components/session/session-machine-access-notice.js +4 -4
- package/dist/app/components/session/session-search-dialog.js +6 -6
- package/dist/app/components/session/session-usage-limit-section.js +3 -3
- package/dist/app/components/session/session-wait-status.js +2 -1
- package/dist/app/components/session/session-wait-status.js.map +1 -1
- package/dist/app/components/session/subagents.js +5 -4
- package/dist/app/components/session/subscription-account-indicator.d.ts +35 -0
- package/dist/app/components/session/{codex-account-indicator.js → subscription-account-indicator.js} +23 -10
- package/dist/app/components/session/subscription-account-menu.d.ts +11 -12
- package/dist/app/components/session/subscription-account-menu.js +1 -1
- package/dist/app/components/session/subscription-account.d.ts +105 -0
- package/dist/app/components/usage/usage-entry.js +3 -3
- package/dist/app/components/workspace-composer-plus.js +10 -10
- package/dist/app/embed/session-app.js +92 -94
- package/dist/app/lib/actions/actions-provider.js +4 -4
- package/dist/app/lib/actions/chat-switcher.d.ts +19 -7
- package/dist/app/lib/codex-usage-query.js +2 -2
- package/dist/app/lib/composer-connectors.js +8 -8
- package/dist/app/lib/console-text.js +2 -2
- package/dist/app/lib/drive-connect-return.d.ts +26 -0
- package/dist/app/lib/drive-connect-return.js +16 -0
- package/dist/app/lib/events.js +7 -7
- package/dist/app/lib/failed-session-copy.js +3 -3
- package/dist/app/lib/model-access-onboarding.js +3 -3
- package/dist/app/lib/move-chat-to-machine.js +3 -3
- package/dist/app/lib/session-branch-cache.js +6 -5
- package/dist/app/lib/session-group-pagination.js +6 -5
- package/dist/app/lib/session-hover-facts.js +6 -5
- package/dist/app/lib/session-rail.js +2 -1
- package/dist/app/lib/sessions-group.js +5 -4
- package/dist/app/lib/turn-failure-analytics.js +4 -4
- package/dist/app/lib/use-workspace-machines.js +4 -4
- package/dist/app/lib/use-workspace-model-catalog.js +3 -3
- package/dist/app/lib/use-workspace-rigs.js +2 -2
- package/dist/app/lib/workspace-navigation-preference.js +4 -4
- package/dist/app/lib/workspace-scope-context.js +3 -3
- package/dist/app/routes/artifacts.js +26 -25
- package/dist/app/routes/artifacts.js.map +1 -1
- package/dist/app/routes/retained-artifact.js +15 -15
- package/dist/app/routes/session.js +64 -63
- package/dist/app/routes/sessions-index.js +41 -41
- package/dist/app/routes/site-view.js +30 -29
- package/dist/app/routes/site-view.js.map +1 -1
- package/dist/artifacts-document.js +4 -4
- package/dist/artifacts-presentation.js +4 -4
- package/dist/artifacts-spreadsheet.js +4 -4
- package/dist/artifacts.js +10 -10
- package/dist/{browser-viewer-YQC6BFMS.js → browser-viewer-VKIAULG7.js} +4 -4
- package/dist/{chat-interactive-block-Z22YHDRU.js → chat-interactive-block-JGYSW4KB.js} +5 -5
- package/dist/{chunk-WN2MIB4Q.js → chunk-22V2QCEM.js} +2 -2
- package/dist/{chunk-SJPAKWWP.js → chunk-2BISI664.js} +2 -2
- package/dist/{chunk-O5UOCMH4.js → chunk-2LPJVEWY.js} +3 -3
- package/dist/{chunk-JI6WPLZB.js → chunk-2SBCOGQN.js} +4 -4
- package/dist/{chunk-6JF7C3U3.js → chunk-2WERWWSS.js} +2 -2
- package/dist/{chunk-4XKT4ENZ.js → chunk-2Y3QL3DA.js} +4 -4
- package/dist/{chunk-KVMFT6FN.js → chunk-3FL3F4WF.js} +2 -2
- package/dist/{chunk-4VJOZJDV.js → chunk-3JPQAIYJ.js} +2 -2
- package/dist/{chunk-27EORKJ4.js → chunk-3N4LNBJF.js} +2 -2
- package/dist/{chunk-7JZSFJHB.js → chunk-3OJU3RUR.js} +2 -2
- package/dist/{chunk-NV5OYV3G.js → chunk-3U6K36QA.js} +5 -5
- package/dist/{chunk-MDRLP5DO.js → chunk-3W7ROHN4.js} +3 -3
- package/dist/{chunk-3MQM4ZOC.js → chunk-3Y6ZR2VN.js} +3 -3
- package/dist/{chunk-HXZIX7MR.js → chunk-47AB65IO.js} +4 -4
- package/dist/{chunk-DNYD7AUG.js → chunk-4BOLIZ7Y.js} +3 -3
- package/dist/{chunk-4XO346BW.js → chunk-4FBJFQFU.js} +2 -2
- package/dist/{chunk-DAQG3C4W.js → chunk-4HM6YDBX.js} +3 -3
- package/dist/{chunk-BWKZEW6K.js → chunk-4T3E56NT.js} +3 -3
- package/dist/{chunk-4PC7LIQK.js → chunk-4ZMUWRFF.js} +3 -3
- package/dist/{chunk-O4AWXTZQ.js → chunk-52XIYULR.js} +3 -3
- package/dist/{chunk-GXK4CUAB.js → chunk-5WQKTT5Z.js} +2 -2
- package/dist/{chunk-MHIYYHCL.js → chunk-5ZAHAUWD.js} +10 -10
- package/dist/{chunk-6N7W3TOV.js → chunk-63BPMTBM.js} +2 -2
- package/dist/{chunk-R5YZ3ROM.js → chunk-63PQKTTT.js} +2 -2
- package/dist/{chunk-WLZVXCPZ.js → chunk-6GO6WN22.js} +3 -3
- package/dist/{chunk-6PQBKMUL.js → chunk-6IIA63VD.js} +11 -7
- package/dist/chunk-6IIA63VD.js.map +1 -0
- package/dist/{chunk-PQCFW2KT.js → chunk-6IRDW7K3.js} +18 -13
- package/dist/chunk-6IRDW7K3.js.map +1 -0
- package/dist/{chunk-XDCZBOEY.js → chunk-6LGBGPBU.js} +1 -1
- package/dist/{chunk-D4QOZXPM.js → chunk-7ITDATTP.js} +2 -2
- package/dist/{chunk-M5E3CKSE.js → chunk-7QWWE5XL.js} +2 -2
- package/dist/{chunk-RABKQFTA.js → chunk-A2HCAMRH.js} +2 -2
- package/dist/{chunk-6K3WNTRI.js → chunk-AODISQO6.js} +2 -2
- package/dist/{chunk-C6JL6PBL.js → chunk-AQDRH6VF.js} +3 -3
- package/dist/{chunk-72XEFLMD.js → chunk-ASWINLSW.js} +2 -2
- package/dist/{chunk-DNLXQUBX.js → chunk-B746OUJC.js} +24 -36
- package/dist/chunk-B746OUJC.js.map +1 -0
- package/dist/{chunk-FVCLVASD.js → chunk-B7ZKSROO.js} +24 -24
- package/dist/{chunk-EURDMOXZ.js → chunk-BYJZUCOQ.js} +2 -2
- package/dist/{chunk-ZWACUOU5.js → chunk-CDBGAAJY.js} +3 -3
- package/dist/chunk-CDBGAAJY.js.map +1 -0
- package/dist/{chunk-BPD4IJBG.js → chunk-CG6CJMIS.js} +2 -2
- package/dist/{chunk-B254JG72.js → chunk-CQX24PT7.js} +2 -2
- package/dist/{chunk-HJTTDLF6.js → chunk-CY3NO4JN.js} +4 -4
- package/dist/{chunk-OLUG4IFF.js → chunk-D2RLPRSG.js} +2 -2
- package/dist/{chunk-74NIHMAT.js → chunk-D653JH6D.js} +3 -3
- package/dist/{chunk-FMATVQFW.js → chunk-DA6EQDFR.js} +6 -6
- package/dist/{chunk-2LUO22FR.js → chunk-DAI5CTQF.js} +4 -4
- package/dist/{chunk-HTKVYEVB.js → chunk-DBM4ZXDN.js} +2 -2
- package/dist/{chunk-MB2DTUEG.js → chunk-DNYKLU3K.js} +4 -4
- package/dist/{chunk-NPDL4W4Y.js → chunk-DT53LBQN.js} +44 -45
- package/dist/chunk-DT53LBQN.js.map +1 -0
- package/dist/{chunk-26P7B46A.js → chunk-DXYARXK3.js} +3 -3
- package/dist/{chunk-JQKURO3S.js → chunk-E4MQRQ6Z.js} +2 -2
- package/dist/{chunk-KW53DBY7.js → chunk-EBW2E32G.js} +2 -2
- package/dist/{chunk-O73DRA77.js → chunk-ENKBO7FC.js} +4 -4
- package/dist/{chunk-32HA7DXJ.js → chunk-EQNGX77H.js} +11 -11
- package/dist/{chunk-CA64OZLZ.js → chunk-FAPYRTG6.js} +4 -4
- package/dist/{chunk-WWM7WVD2.js → chunk-GABFKHQE.js} +2 -2
- package/dist/chunk-GLCOKWLH.js +42 -0
- package/dist/chunk-GLCOKWLH.js.map +1 -0
- package/dist/{chunk-OHG2UQ2O.js → chunk-GNM3OY36.js} +51 -13
- package/dist/chunk-GNM3OY36.js.map +1 -0
- package/dist/{chunk-JJ7VMIEQ.js → chunk-H2GTWX4D.js} +14 -14
- package/dist/{chunk-LR7U3HCD.js → chunk-HPSATFLQ.js} +4 -4
- package/dist/{chunk-TM2ZLY3Q.js → chunk-I56TUH3Z.js} +13 -13
- package/dist/{chunk-ZZUKJ5HQ.js → chunk-IG2ERMSB.js} +2 -2
- package/dist/{chunk-2SZ3KC5S.js → chunk-IMKIIS4Y.js} +2 -2
- package/dist/{chunk-I57HZMMA.js → chunk-IXIE3H43.js} +2 -2
- package/dist/{chunk-OWJD3V4V.js → chunk-J3YQ3554.js} +2 -2
- package/dist/{chunk-BCFHMBMK.js → chunk-J5HZBHU4.js} +7 -7
- package/dist/{chunk-UHMMRQGU.js → chunk-KD7GNHOP.js} +3 -3
- package/dist/{chunk-RXMIXKB3.js → chunk-KIKAVZOW.js} +2 -2
- package/dist/{chunk-X7Z4B5GK.js → chunk-KPL7EXS6.js} +2 -2
- package/dist/{chunk-GTR2WUBA.js → chunk-KX6M5CJI.js} +1 -1
- package/dist/{chunk-CYO5HL4C.js → chunk-KYL2BPS2.js} +2 -2
- package/dist/{chunk-ZPZYYSHW.js → chunk-L7EAQGWN.js} +5 -5
- package/dist/{chunk-QLDMF7MH.js → chunk-LC5HE7PZ.js} +2 -2
- package/dist/{chunk-3SMJ2BIQ.js → chunk-LGD5RESZ.js} +7 -33
- package/dist/chunk-LGD5RESZ.js.map +1 -0
- package/dist/{chunk-4ICPJZAB.js → chunk-LMYSYG6U.js} +2 -2
- package/dist/{chunk-3ZZOE4SN.js → chunk-LOCDYMD6.js} +4 -4
- package/dist/{chunk-DNWBLT4U.js → chunk-MASBMJ2M.js} +2 -2
- package/dist/{chunk-6VITVQ23.js → chunk-MTYE2PPR.js} +1 -1
- package/dist/{chunk-NZMQDUOD.js → chunk-MU6HYDNF.js} +5 -5
- package/dist/{chunk-GMVKCEBG.js → chunk-MY6QEDZ2.js} +2 -2
- package/dist/{chunk-SK57RWSA.js → chunk-MZGKQ5WV.js} +2 -2
- package/dist/{chunk-HSQRYJ4P.js → chunk-N52SFH2K.js} +2 -2
- package/dist/{chunk-CEQUNJJY.js → chunk-NDCP5TVN.js} +2 -2
- package/dist/{chunk-MY6VZVCP.js → chunk-OAJX5CEL.js} +4 -4
- package/dist/{chunk-BQWUXC55.js → chunk-OBBLVC2W.js} +9 -9
- package/dist/{chunk-IWIMIRV3.js → chunk-OSJTLQXA.js} +9 -4
- package/dist/chunk-OSJTLQXA.js.map +1 -0
- package/dist/{chunk-FH75NNLB.js → chunk-OZ5NAXCP.js} +2 -2
- package/dist/{chunk-PEGNFZ3F.js → chunk-P5S777YI.js} +2 -2
- package/dist/{chunk-LY6727IF.js → chunk-PPSVFNEA.js} +1 -1
- package/dist/{chunk-K4FDZVMQ.js → chunk-PR42VIVY.js} +2 -2
- package/dist/{chunk-I74J2UZ2.js → chunk-PWMZCW4H.js} +8 -8
- package/dist/{chunk-6YDXUE5H.js → chunk-PYA2O3WS.js} +2 -2
- package/dist/{chunk-GUIZDI5T.js → chunk-Q2PA4KZS.js} +2 -2
- package/dist/{chunk-DZH2HTTB.js → chunk-R27GW5WV.js} +1 -1
- package/dist/chunk-R4U4EWZG.js +414 -0
- package/dist/chunk-R4U4EWZG.js.map +1 -0
- package/dist/{chunk-7OIBLMDP.js → chunk-RAQISW42.js} +2 -2
- package/dist/{chunk-CPKD2YGK.js → chunk-RNU5CUPI.js} +2 -2
- package/dist/{chunk-467VRP4E.js → chunk-RO5YZQHZ.js} +3 -3
- package/dist/{chunk-SSZROOOI.js → chunk-ROLXYGT5.js} +2 -2
- package/dist/{chunk-F4B2YYCN.js → chunk-TAWFXRXB.js} +3 -3
- package/dist/{chunk-G3FU2IF7.js → chunk-TB7UW5BB.js} +3 -3
- package/dist/{chunk-NF6Q4XTN.js → chunk-TQF2I5SY.js} +3 -3
- package/dist/{chunk-MM7OKOTE.js → chunk-UBXHP224.js} +43 -18
- package/dist/chunk-UBXHP224.js.map +1 -0
- package/dist/{chunk-M7A226EQ.js → chunk-UL44R3W2.js} +2 -2
- package/dist/{chunk-65K5LV4L.js → chunk-UQKBV22P.js} +21 -20
- package/dist/{chunk-65K5LV4L.js.map → chunk-UQKBV22P.js.map} +1 -1
- package/dist/{chunk-GTR5NLVP.js → chunk-VCRQPLKS.js} +2 -2
- package/dist/{chunk-NWSAF6P5.js → chunk-WJDH7CH5.js} +22 -1
- package/dist/chunk-WJDH7CH5.js.map +1 -0
- package/dist/{chunk-LG67ZNRU.js → chunk-WK2ZCTUF.js} +2 -2
- package/dist/{chunk-XGE75VPK.js → chunk-WNARM3LY.js} +3 -3
- package/dist/{chunk-RNBH5TSM.js → chunk-WQ2RTQYO.js} +2 -2
- package/dist/chunk-X5XEYQ4B.js +84 -0
- package/dist/chunk-X5XEYQ4B.js.map +1 -0
- package/dist/{chunk-W57QFLQD.js → chunk-X6JIGNLI.js} +4 -4
- package/dist/{chunk-CKA4SJRK.js → chunk-XIQDCQX7.js} +2 -2
- package/dist/{chunk-AJ7PY4FJ.js → chunk-Y3GCG6CA.js} +2 -2
- package/dist/{chunk-2K27S6LK.js → chunk-Y565N5ZJ.js} +24 -7
- package/dist/chunk-Y565N5ZJ.js.map +1 -0
- package/dist/{chunk-ZRB4M3GG.js → chunk-YC5KH7ZB.js} +3 -3
- package/dist/{chunk-4RY64KQY.js → chunk-YJUKLLNP.js} +2 -2
- package/dist/{chunk-24POWVUY.js → chunk-ZDJNRRVS.js} +4 -4
- package/dist/{chunk-S6WJ6TUT.js → chunk-ZEVJGMNB.js} +2 -2
- package/dist/chunk-ZEVJGMNB.js.map +1 -0
- package/dist/{chunk-M7YEZR6X.js → chunk-ZITMDA4C.js} +2 -2
- package/dist/components/model-policy-picker.d.ts +2 -0
- package/dist/composer.js +6 -6
- package/dist/{computer-viewer-BWVNDFTO.js → computer-viewer-6CRLWQHP.js} +5 -5
- package/dist/connect.js +6 -6
- package/dist/connection-service-presentation.d.ts +1 -4
- package/dist/desktop.js +2 -2
- package/dist/editor.js +2 -2
- package/dist/{embedded-new-voice-GBXSZ3TO.js → embedded-new-voice-KILV3RYM.js} +5 -5
- package/dist/{embedded-voice-MGI7EK7C.js → embedded-voice-GHDRLCFX.js} +5 -5
- package/dist/{fleet-decision-row-35S3GAUN.js → fleet-decision-row-DQXRRBT7.js} +2 -2
- package/dist/index.js +36 -36
- package/dist/interaction.js +5 -5
- package/dist/machines.js +3 -3
- package/dist/messages/en.d.ts +1 -1
- package/dist/messages.js +1 -1
- package/dist/{model-policy-picker-menu-KP53N6UJ.js → model-policy-picker-menu-5ALKUJMR.js} +4 -4
- package/dist/{platform-activity-row-ISMXR7NJ.js → platform-activity-row-227C764Z.js} +2 -2
- package/dist/{queue-surface-implementation-ULW7DDJA.js → queue-surface-implementation-H3NOBXU5.js} +5 -5
- package/dist/realtime.js +4 -4
- package/dist/{sandbox-files-QYSD4XCZ.js → sandbox-files-5FEOHUMD.js} +6 -6
- package/dist/session-app.js +92 -94
- package/dist/{session-realtime-JXRLPNUH.js → session-realtime-OHBMODNX.js} +3 -3
- package/dist/session-realtime.js +2 -2
- package/dist/session-ui.js +24 -24
- package/dist/session.js +5 -5
- package/dist/sites.js +2 -2
- package/dist/terminal.js +2 -2
- package/dist/this-computer.js +3 -3
- package/dist/timeline/connector-logo-index.d.ts +19 -0
- package/dist/{timeline-annotation-markers-OJYKHBEO.js → timeline-annotation-markers-NDHS7MCK.js} +2 -2
- package/dist/{timeline-annotation-selection-6OAZLXFU.js → timeline-annotation-selection-DRQSTJOV.js} +2 -2
- package/dist/{timeline-annotations-dialog-5M6DP5FX.js → timeline-annotations-dialog-G6J5ZJKN.js} +3 -3
- package/dist/timeline-model.d.ts +2 -0
- package/dist/timeline-model.js +9 -1
- package/dist/ui/list-row.js +1 -1
- package/dist/usage.js +2 -2
- package/dist/workbench.js +4 -4
- package/package.json +4 -4
- package/src/app/components/capabilities/native-connect-readiness.tsx +1 -0
- package/src/app/components/capabilities/perform-capability-action.test.ts +67 -0
- package/src/app/components/capabilities/perform-capability-action.tsx +28 -0
- package/src/app/components/command-menu/chat-switcher.tsx +25 -4
- package/src/app/components/rail/session-header.test.tsx +73 -2
- package/src/app/components/rail/session-header.tsx +20 -12
- package/src/app/components/rail/session-shell.tsx +10 -18
- package/src/app/components/session/subscription-account-indicator.test.ts +239 -0
- package/src/app/components/session/subscription-account-indicator.tsx +361 -0
- package/src/app/components/session/subscription-account-menu.tsx +21 -43
- package/src/app/components/session/subscription-account.test.ts +314 -0
- package/src/app/components/session/subscription-account.ts +354 -0
- package/src/app/lib/actions/actions-provider.tsx +11 -0
- package/src/app/lib/actions/actions.test.ts +59 -4
- package/src/app/lib/actions/chat-switcher.ts +73 -20
- package/src/app/lib/drive-connect-return.test.ts +183 -0
- package/src/app/lib/drive-connect-return.tsx +116 -0
- package/src/app/routes/session.tsx +12 -14
- package/src/app/routes/sessions-index.tsx +1 -0
- package/src/components/model-policy-picker-menu.tsx +25 -4
- package/src/components/model-policy-picker.tsx +2 -0
- package/src/components/session-mcp-capability-card.tsx +13 -4
- package/src/connection-service-presentation.ts +6 -1
- package/src/messages/en.ts +1 -1
- package/src/timeline/connector-logo-index.test.ts +46 -0
- package/src/timeline/connector-logo-index.ts +68 -0
- package/src/timeline-model.ts +6 -0
- package/src/ui/list-row.tsx +38 -10
- package/styles/compiled.css +13 -0
- package/dist/app/components/session/codex-account-indicator.d.ts +0 -9
- package/dist/app/components/session/model-account-indicator.d.ts +0 -10
- package/dist/app/components/session/model-account-indicator.js +0 -34
- package/dist/app/components/session/model-account-usage.d.ts +0 -8
- package/dist/app/components/session/model-account-usage.js +0 -8
- package/dist/chunk-2K27S6LK.js.map +0 -1
- package/dist/chunk-3SMJ2BIQ.js.map +0 -1
- package/dist/chunk-6PQBKMUL.js.map +0 -1
- package/dist/chunk-7H2D4VNU.js +0 -150
- package/dist/chunk-7H2D4VNU.js.map +0 -1
- package/dist/chunk-DNLXQUBX.js.map +0 -1
- package/dist/chunk-HCCSAECI.js +0 -132
- package/dist/chunk-HCCSAECI.js.map +0 -1
- package/dist/chunk-IWIMIRV3.js.map +0 -1
- package/dist/chunk-M77ZQE5T.js +0 -58
- package/dist/chunk-M77ZQE5T.js.map +0 -1
- package/dist/chunk-MM7OKOTE.js.map +0 -1
- package/dist/chunk-NPDL4W4Y.js.map +0 -1
- package/dist/chunk-NWSAF6P5.js.map +0 -1
- package/dist/chunk-OHG2UQ2O.js.map +0 -1
- package/dist/chunk-PQCFW2KT.js.map +0 -1
- package/dist/chunk-S6WJ6TUT.js.map +0 -1
- package/dist/chunk-ZWACUOU5.js.map +0 -1
- package/dist/session-realtime-JXRLPNUH.js.map +0 -1
- package/src/app/components/session/codex-account-indicator.tsx +0 -207
- package/src/app/components/session/model-account-indicator.tsx +0 -189
- package/src/app/components/session/model-account-usage.test.ts +0 -59
- package/src/app/components/session/model-account-usage.tsx +0 -89
- /package/dist/app/components/session/{codex-account-indicator.js.map → subscription-account-indicator.js.map} +0 -0
- /package/dist/app/{components/session/model-account-indicator.js.map → lib/drive-connect-return.js.map} +0 -0
- /package/dist/{app/components/session/model-account-usage.js.map → browser-viewer-VKIAULG7.js.map} +0 -0
- /package/dist/{browser-viewer-YQC6BFMS.js.map → chat-interactive-block-JGYSW4KB.js.map} +0 -0
- /package/dist/{chunk-WN2MIB4Q.js.map → chunk-22V2QCEM.js.map} +0 -0
- /package/dist/{chunk-SJPAKWWP.js.map → chunk-2BISI664.js.map} +0 -0
- /package/dist/{chunk-O5UOCMH4.js.map → chunk-2LPJVEWY.js.map} +0 -0
- /package/dist/{chunk-JI6WPLZB.js.map → chunk-2SBCOGQN.js.map} +0 -0
- /package/dist/{chunk-6JF7C3U3.js.map → chunk-2WERWWSS.js.map} +0 -0
- /package/dist/{chunk-4XKT4ENZ.js.map → chunk-2Y3QL3DA.js.map} +0 -0
- /package/dist/{chunk-KVMFT6FN.js.map → chunk-3FL3F4WF.js.map} +0 -0
- /package/dist/{chunk-4VJOZJDV.js.map → chunk-3JPQAIYJ.js.map} +0 -0
- /package/dist/{chunk-27EORKJ4.js.map → chunk-3N4LNBJF.js.map} +0 -0
- /package/dist/{chunk-7JZSFJHB.js.map → chunk-3OJU3RUR.js.map} +0 -0
- /package/dist/{chunk-NV5OYV3G.js.map → chunk-3U6K36QA.js.map} +0 -0
- /package/dist/{chunk-MDRLP5DO.js.map → chunk-3W7ROHN4.js.map} +0 -0
- /package/dist/{chunk-3MQM4ZOC.js.map → chunk-3Y6ZR2VN.js.map} +0 -0
- /package/dist/{chunk-HXZIX7MR.js.map → chunk-47AB65IO.js.map} +0 -0
- /package/dist/{chunk-DNYD7AUG.js.map → chunk-4BOLIZ7Y.js.map} +0 -0
- /package/dist/{chunk-4XO346BW.js.map → chunk-4FBJFQFU.js.map} +0 -0
- /package/dist/{chunk-DAQG3C4W.js.map → chunk-4HM6YDBX.js.map} +0 -0
- /package/dist/{chunk-BWKZEW6K.js.map → chunk-4T3E56NT.js.map} +0 -0
- /package/dist/{chunk-4PC7LIQK.js.map → chunk-4ZMUWRFF.js.map} +0 -0
- /package/dist/{chunk-O4AWXTZQ.js.map → chunk-52XIYULR.js.map} +0 -0
- /package/dist/{chunk-GXK4CUAB.js.map → chunk-5WQKTT5Z.js.map} +0 -0
- /package/dist/{chunk-MHIYYHCL.js.map → chunk-5ZAHAUWD.js.map} +0 -0
- /package/dist/{chunk-6N7W3TOV.js.map → chunk-63BPMTBM.js.map} +0 -0
- /package/dist/{chunk-R5YZ3ROM.js.map → chunk-63PQKTTT.js.map} +0 -0
- /package/dist/{chunk-WLZVXCPZ.js.map → chunk-6GO6WN22.js.map} +0 -0
- /package/dist/{chunk-XDCZBOEY.js.map → chunk-6LGBGPBU.js.map} +0 -0
- /package/dist/{chunk-D4QOZXPM.js.map → chunk-7ITDATTP.js.map} +0 -0
- /package/dist/{chunk-M5E3CKSE.js.map → chunk-7QWWE5XL.js.map} +0 -0
- /package/dist/{chunk-RABKQFTA.js.map → chunk-A2HCAMRH.js.map} +0 -0
- /package/dist/{chunk-6K3WNTRI.js.map → chunk-AODISQO6.js.map} +0 -0
- /package/dist/{chunk-C6JL6PBL.js.map → chunk-AQDRH6VF.js.map} +0 -0
- /package/dist/{chunk-72XEFLMD.js.map → chunk-ASWINLSW.js.map} +0 -0
- /package/dist/{chunk-FVCLVASD.js.map → chunk-B7ZKSROO.js.map} +0 -0
- /package/dist/{chunk-EURDMOXZ.js.map → chunk-BYJZUCOQ.js.map} +0 -0
- /package/dist/{chunk-BPD4IJBG.js.map → chunk-CG6CJMIS.js.map} +0 -0
- /package/dist/{chunk-B254JG72.js.map → chunk-CQX24PT7.js.map} +0 -0
- /package/dist/{chunk-HJTTDLF6.js.map → chunk-CY3NO4JN.js.map} +0 -0
- /package/dist/{chunk-OLUG4IFF.js.map → chunk-D2RLPRSG.js.map} +0 -0
- /package/dist/{chunk-74NIHMAT.js.map → chunk-D653JH6D.js.map} +0 -0
- /package/dist/{chunk-FMATVQFW.js.map → chunk-DA6EQDFR.js.map} +0 -0
- /package/dist/{chunk-2LUO22FR.js.map → chunk-DAI5CTQF.js.map} +0 -0
- /package/dist/{chunk-HTKVYEVB.js.map → chunk-DBM4ZXDN.js.map} +0 -0
- /package/dist/{chunk-MB2DTUEG.js.map → chunk-DNYKLU3K.js.map} +0 -0
- /package/dist/{chunk-26P7B46A.js.map → chunk-DXYARXK3.js.map} +0 -0
- /package/dist/{chunk-JQKURO3S.js.map → chunk-E4MQRQ6Z.js.map} +0 -0
- /package/dist/{chunk-KW53DBY7.js.map → chunk-EBW2E32G.js.map} +0 -0
- /package/dist/{chunk-O73DRA77.js.map → chunk-ENKBO7FC.js.map} +0 -0
- /package/dist/{chunk-32HA7DXJ.js.map → chunk-EQNGX77H.js.map} +0 -0
- /package/dist/{chunk-CA64OZLZ.js.map → chunk-FAPYRTG6.js.map} +0 -0
- /package/dist/{chunk-WWM7WVD2.js.map → chunk-GABFKHQE.js.map} +0 -0
- /package/dist/{chunk-JJ7VMIEQ.js.map → chunk-H2GTWX4D.js.map} +0 -0
- /package/dist/{chunk-LR7U3HCD.js.map → chunk-HPSATFLQ.js.map} +0 -0
- /package/dist/{chunk-TM2ZLY3Q.js.map → chunk-I56TUH3Z.js.map} +0 -0
- /package/dist/{chunk-ZZUKJ5HQ.js.map → chunk-IG2ERMSB.js.map} +0 -0
- /package/dist/{chunk-2SZ3KC5S.js.map → chunk-IMKIIS4Y.js.map} +0 -0
- /package/dist/{chunk-I57HZMMA.js.map → chunk-IXIE3H43.js.map} +0 -0
- /package/dist/{chunk-OWJD3V4V.js.map → chunk-J3YQ3554.js.map} +0 -0
- /package/dist/{chunk-BCFHMBMK.js.map → chunk-J5HZBHU4.js.map} +0 -0
- /package/dist/{chunk-UHMMRQGU.js.map → chunk-KD7GNHOP.js.map} +0 -0
- /package/dist/{chunk-RXMIXKB3.js.map → chunk-KIKAVZOW.js.map} +0 -0
- /package/dist/{chunk-X7Z4B5GK.js.map → chunk-KPL7EXS6.js.map} +0 -0
- /package/dist/{chunk-GTR2WUBA.js.map → chunk-KX6M5CJI.js.map} +0 -0
- /package/dist/{chunk-CYO5HL4C.js.map → chunk-KYL2BPS2.js.map} +0 -0
- /package/dist/{chunk-ZPZYYSHW.js.map → chunk-L7EAQGWN.js.map} +0 -0
- /package/dist/{chunk-QLDMF7MH.js.map → chunk-LC5HE7PZ.js.map} +0 -0
- /package/dist/{chunk-4ICPJZAB.js.map → chunk-LMYSYG6U.js.map} +0 -0
- /package/dist/{chunk-3ZZOE4SN.js.map → chunk-LOCDYMD6.js.map} +0 -0
- /package/dist/{chunk-DNWBLT4U.js.map → chunk-MASBMJ2M.js.map} +0 -0
- /package/dist/{chunk-6VITVQ23.js.map → chunk-MTYE2PPR.js.map} +0 -0
- /package/dist/{chunk-NZMQDUOD.js.map → chunk-MU6HYDNF.js.map} +0 -0
- /package/dist/{chunk-GMVKCEBG.js.map → chunk-MY6QEDZ2.js.map} +0 -0
- /package/dist/{chunk-SK57RWSA.js.map → chunk-MZGKQ5WV.js.map} +0 -0
- /package/dist/{chunk-HSQRYJ4P.js.map → chunk-N52SFH2K.js.map} +0 -0
- /package/dist/{chunk-CEQUNJJY.js.map → chunk-NDCP5TVN.js.map} +0 -0
- /package/dist/{chunk-MY6VZVCP.js.map → chunk-OAJX5CEL.js.map} +0 -0
- /package/dist/{chunk-BQWUXC55.js.map → chunk-OBBLVC2W.js.map} +0 -0
- /package/dist/{chunk-FH75NNLB.js.map → chunk-OZ5NAXCP.js.map} +0 -0
- /package/dist/{chunk-PEGNFZ3F.js.map → chunk-P5S777YI.js.map} +0 -0
- /package/dist/{chunk-LY6727IF.js.map → chunk-PPSVFNEA.js.map} +0 -0
- /package/dist/{chunk-K4FDZVMQ.js.map → chunk-PR42VIVY.js.map} +0 -0
- /package/dist/{chunk-I74J2UZ2.js.map → chunk-PWMZCW4H.js.map} +0 -0
- /package/dist/{chunk-6YDXUE5H.js.map → chunk-PYA2O3WS.js.map} +0 -0
- /package/dist/{chunk-GUIZDI5T.js.map → chunk-Q2PA4KZS.js.map} +0 -0
- /package/dist/{chunk-DZH2HTTB.js.map → chunk-R27GW5WV.js.map} +0 -0
- /package/dist/{chunk-7OIBLMDP.js.map → chunk-RAQISW42.js.map} +0 -0
- /package/dist/{chunk-CPKD2YGK.js.map → chunk-RNU5CUPI.js.map} +0 -0
- /package/dist/{chunk-467VRP4E.js.map → chunk-RO5YZQHZ.js.map} +0 -0
- /package/dist/{chunk-SSZROOOI.js.map → chunk-ROLXYGT5.js.map} +0 -0
- /package/dist/{chunk-F4B2YYCN.js.map → chunk-TAWFXRXB.js.map} +0 -0
- /package/dist/{chunk-G3FU2IF7.js.map → chunk-TB7UW5BB.js.map} +0 -0
- /package/dist/{chunk-NF6Q4XTN.js.map → chunk-TQF2I5SY.js.map} +0 -0
- /package/dist/{chunk-M7A226EQ.js.map → chunk-UL44R3W2.js.map} +0 -0
- /package/dist/{chunk-GTR5NLVP.js.map → chunk-VCRQPLKS.js.map} +0 -0
- /package/dist/{chunk-LG67ZNRU.js.map → chunk-WK2ZCTUF.js.map} +0 -0
- /package/dist/{chunk-XGE75VPK.js.map → chunk-WNARM3LY.js.map} +0 -0
- /package/dist/{chunk-RNBH5TSM.js.map → chunk-WQ2RTQYO.js.map} +0 -0
- /package/dist/{chunk-W57QFLQD.js.map → chunk-X6JIGNLI.js.map} +0 -0
- /package/dist/{chunk-CKA4SJRK.js.map → chunk-XIQDCQX7.js.map} +0 -0
- /package/dist/{chunk-AJ7PY4FJ.js.map → chunk-Y3GCG6CA.js.map} +0 -0
- /package/dist/{chunk-ZRB4M3GG.js.map → chunk-YC5KH7ZB.js.map} +0 -0
- /package/dist/{chunk-4RY64KQY.js.map → chunk-YJUKLLNP.js.map} +0 -0
- /package/dist/{chunk-24POWVUY.js.map → chunk-ZDJNRRVS.js.map} +0 -0
- /package/dist/{chunk-M7YEZR6X.js.map → chunk-ZITMDA4C.js.map} +0 -0
- /package/dist/{chat-interactive-block-Z22YHDRU.js.map → computer-viewer-6CRLWQHP.js.map} +0 -0
- /package/dist/{computer-viewer-BWVNDFTO.js.map → embedded-new-voice-KILV3RYM.js.map} +0 -0
- /package/dist/{embedded-new-voice-GBXSZ3TO.js.map → embedded-voice-GHDRLCFX.js.map} +0 -0
- /package/dist/{fleet-decision-row-35S3GAUN.js.map → fleet-decision-row-DQXRRBT7.js.map} +0 -0
- /package/dist/{embedded-voice-MGI7EK7C.js.map → model-policy-picker-menu-5ALKUJMR.js.map} +0 -0
- /package/dist/{platform-activity-row-ISMXR7NJ.js.map → platform-activity-row-227C764Z.js.map} +0 -0
- /package/dist/{queue-surface-implementation-ULW7DDJA.js.map → queue-surface-implementation-H3NOBXU5.js.map} +0 -0
- /package/dist/{model-policy-picker-menu-KP53N6UJ.js.map → sandbox-files-5FEOHUMD.js.map} +0 -0
- /package/dist/{sandbox-files-QYSD4XCZ.js.map → session-realtime-OHBMODNX.js.map} +0 -0
- /package/dist/{timeline-annotation-markers-OJYKHBEO.js.map → timeline-annotation-markers-NDHS7MCK.js.map} +0 -0
- /package/dist/{timeline-annotation-selection-6OAZLXFU.js.map → timeline-annotation-selection-DRQSTJOV.js.map} +0 -0
- /package/dist/{timeline-annotations-dialog-5M6DP5FX.js.map → timeline-annotations-dialog-G6J5ZJKN.js.map} +0 -0
package/src/ui/list-row.tsx
CHANGED
|
@@ -550,6 +550,11 @@ export function ListRow({
|
|
|
550
550
|
const hasColumns = gridded && columns.length > 0;
|
|
551
551
|
const expandable = !table && expanded !== undefined;
|
|
552
552
|
|
|
553
|
+
// Resource and table rows keep one fixed height: the description, the meta
|
|
554
|
+
// facts and (on narrow lists) the status and indicator words share ONE
|
|
555
|
+
// secondary line that truncates. Catalog rows keep a two-line description
|
|
556
|
+
// with the facts under it.
|
|
557
|
+
const singleLine = !catalog;
|
|
553
558
|
/* The meta line: quiet facts, then the fact columns folded in on narrow lists. */
|
|
554
559
|
const presentFacts = columns.filter((column) => cells[column.id] != null);
|
|
555
560
|
const facts = [
|
|
@@ -568,6 +573,7 @@ export function ListRow({
|
|
|
568
573
|
key={column.id}
|
|
569
574
|
order={order}
|
|
570
575
|
keep={leads}
|
|
576
|
+
oneLine={singleLine}
|
|
571
577
|
className={cn(
|
|
572
578
|
hasColumns && "@[640px]/list:hidden",
|
|
573
579
|
// A phone-width line has room for one folded fact (none next to a
|
|
@@ -586,8 +592,13 @@ export function ListRow({
|
|
|
586
592
|
...metaItems.map((item, index) => {
|
|
587
593
|
const last = index === metaItems.length - 1;
|
|
588
594
|
return (
|
|
589
|
-
|
|
590
|
-
|
|
595
|
+
<MetaPart
|
|
596
|
+
// oxlint-disable-next-line react/no-array-index-key -- meta items are positional
|
|
597
|
+
key={`meta-${index}`}
|
|
598
|
+
order={leadingFacts + index}
|
|
599
|
+
keep={!last}
|
|
600
|
+
oneLine={singleLine}
|
|
601
|
+
>
|
|
591
602
|
{item}
|
|
592
603
|
</MetaPart>
|
|
593
604
|
);
|
|
@@ -598,11 +609,6 @@ export function ListRow({
|
|
|
598
609
|
foldedFact(column, leadingFacts + index, leadingFacts + metaItems.length + index, false),
|
|
599
610
|
),
|
|
600
611
|
];
|
|
601
|
-
// Resource and table rows keep one fixed height: the description, the meta
|
|
602
|
-
// facts and (on narrow lists) the status and indicator words share ONE
|
|
603
|
-
// secondary line that truncates. Catalog rows keep a two-line description
|
|
604
|
-
// with the facts under it.
|
|
605
|
-
const singleLine = !catalog;
|
|
606
612
|
const statusPart = status ? (
|
|
607
613
|
<MetaPart key="status" keep className="@[480px]/list:hidden">
|
|
608
614
|
{status}
|
|
@@ -840,13 +846,18 @@ export function ListRow({
|
|
|
840
846
|
<span className="flex shrink-0 items-center">{keptLeadParts}</span>
|
|
841
847
|
) : null}
|
|
842
848
|
{restLineParts.length > 0 ? (
|
|
849
|
+
// One line tall and wrapping: a part with no room for a few
|
|
850
|
+
// letters wraps onto the clipped second line and disappears
|
|
851
|
+
// whole, instead of staying behind as a lone dot. The empty
|
|
852
|
+
// first item lets even the first part wrap away.
|
|
843
853
|
<span
|
|
844
854
|
className={cn(
|
|
845
|
-
"flex min-w-0 shrink-[2] items-center overflow-hidden",
|
|
855
|
+
"flex h-4.5 min-w-0 shrink-[2] flex-wrap content-start items-center overflow-hidden",
|
|
846
856
|
// No description: drop the first part's leading dot.
|
|
847
857
|
!(secondary && !(disabled && disabledReason)) && "-ml-4",
|
|
848
858
|
)}
|
|
849
859
|
>
|
|
860
|
+
<span aria-hidden="true" className="h-4.5 w-0 shrink-0" />
|
|
850
861
|
{restLineParts}
|
|
851
862
|
</span>
|
|
852
863
|
) : null}
|
|
@@ -1018,6 +1029,7 @@ function MetaPart({
|
|
|
1018
1029
|
hidden = false,
|
|
1019
1030
|
order = 0,
|
|
1020
1031
|
keep = false,
|
|
1032
|
+
oneLine = false,
|
|
1021
1033
|
}: {
|
|
1022
1034
|
className?: string | undefined;
|
|
1023
1035
|
children: ReactNode;
|
|
@@ -1027,13 +1039,29 @@ function MetaPart({
|
|
|
1027
1039
|
order?: number | undefined;
|
|
1028
1040
|
/** Never shrinks (a status): it stays whole while the facts before it give way. */
|
|
1029
1041
|
keep?: boolean | undefined;
|
|
1042
|
+
/**
|
|
1043
|
+
* On a one-line meta line (which wraps into a clipped second line): the part
|
|
1044
|
+
* claims room for its dot and a few letters, then takes what is left in
|
|
1045
|
+
* order. One without even that much wraps away whole.
|
|
1046
|
+
*/
|
|
1047
|
+
oneLine?: boolean | undefined;
|
|
1030
1048
|
}) {
|
|
1049
|
+
const sizing: CSSProperties = keep
|
|
1050
|
+
? { flexShrink: 0 }
|
|
1051
|
+
: oneLine
|
|
1052
|
+
? // Earlier parts fill to their full width before later ones grow past
|
|
1053
|
+
// their few letters, so the line still gives way from the end.
|
|
1054
|
+
{ flexBasis: "3.5rem", flexGrow: 64 ** (4 - Math.min(order, 4)), flexShrink: 0 }
|
|
1055
|
+
: { flexShrink: 64 ** Math.min(order, 4) };
|
|
1031
1056
|
return (
|
|
1032
1057
|
<span
|
|
1033
1058
|
aria-hidden={hidden || undefined}
|
|
1034
|
-
style={
|
|
1059
|
+
style={sizing}
|
|
1035
1060
|
className={cn(
|
|
1036
|
-
"flex
|
|
1061
|
+
"flex min-w-0 items-center overflow-hidden whitespace-nowrap",
|
|
1062
|
+
// max-content caps the growth; the 3.5rem basis is the most a part
|
|
1063
|
+
// asks for before it fits, so a short fact never gains empty space.
|
|
1064
|
+
oneLine && !keep ? "max-w-max" : "max-w-full",
|
|
1037
1065
|
className,
|
|
1038
1066
|
)}
|
|
1039
1067
|
>
|
package/styles/compiled.css
CHANGED
|
@@ -2177,6 +2177,9 @@
|
|
|
2177
2177
|
:where(.og-root).max-w-lg,:where(.og-root) .max-w-lg {
|
|
2178
2178
|
max-width: var(--container-lg);
|
|
2179
2179
|
}
|
|
2180
|
+
:where(.og-root).max-w-max,:where(.og-root) .max-w-max {
|
|
2181
|
+
max-width: max-content;
|
|
2182
|
+
}
|
|
2180
2183
|
:where(.og-root).max-w-md,:where(.og-root) .max-w-md {
|
|
2181
2184
|
max-width: var(--container-md);
|
|
2182
2185
|
}
|
|
@@ -2581,6 +2584,9 @@
|
|
|
2581
2584
|
:where(.og-root).content-center,:where(.og-root) .content-center {
|
|
2582
2585
|
align-content: center;
|
|
2583
2586
|
}
|
|
2587
|
+
:where(.og-root).content-start,:where(.og-root) .content-start {
|
|
2588
|
+
align-content: flex-start;
|
|
2589
|
+
}
|
|
2584
2590
|
:where(.og-root).items-baseline,:where(.og-root) .items-baseline {
|
|
2585
2591
|
align-items: baseline;
|
|
2586
2592
|
}
|
|
@@ -6589,6 +6595,13 @@
|
|
|
6589
6595
|
padding-bottom: calc(var(--spacing) * 0);
|
|
6590
6596
|
}
|
|
6591
6597
|
}
|
|
6598
|
+
:where(.og-root).odd\:last\:col-span-2,:where(.og-root) .odd\:last\:col-span-2 {
|
|
6599
|
+
&:nth-child(odd) {
|
|
6600
|
+
&:last-child {
|
|
6601
|
+
grid-column: span 2 / span 2;
|
|
6602
|
+
}
|
|
6603
|
+
}
|
|
6604
|
+
}
|
|
6592
6605
|
:where(.og-root).open\:basis-full,:where(.og-root) .open\:basis-full {
|
|
6593
6606
|
&:is([open], :popover-open, :open) {
|
|
6594
6607
|
flex-basis: 100%;
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import type { SessionEvent } from "@opengeni/sdk";
|
|
2
|
-
export declare function CodexAccountIndicator({ workspaceId: _workspaceId, sessionId, model, modelReady, events, }: {
|
|
3
|
-
workspaceId: string;
|
|
4
|
-
sessionId: string;
|
|
5
|
-
model: string;
|
|
6
|
-
/** False while the session's admitted model identity is still loading. */
|
|
7
|
-
modelReady?: boolean;
|
|
8
|
-
events?: SessionEvent[];
|
|
9
|
-
}): import("react").JSX.Element | null;
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import type { SessionEvent } from "@opengeni/sdk";
|
|
2
|
-
export declare function ModelAccountIndicator({ workspaceId, sessionId, organizationId, provider, servingTurnId, events, }: {
|
|
3
|
-
workspaceId: string;
|
|
4
|
-
sessionId: string;
|
|
5
|
-
organizationId: string | null;
|
|
6
|
-
/** The session model's subscription provider; only its accounts are offered. */
|
|
7
|
-
provider: string;
|
|
8
|
-
servingTurnId?: string | undefined;
|
|
9
|
-
events?: SessionEvent[];
|
|
10
|
-
}): import("react").JSX.Element | null;
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import {
|
|
3
|
-
ModelAccountIndicator
|
|
4
|
-
} from "../../../chunk-HCCSAECI.js";
|
|
5
|
-
import "../../../chunk-M77ZQE5T.js";
|
|
6
|
-
import "../../../chunk-3SMJ2BIQ.js";
|
|
7
|
-
import "../../../chunk-M7YEZR6X.js";
|
|
8
|
-
import "../../../chunk-Z63GB7JI.js";
|
|
9
|
-
import "../../../chunk-A3MTTRCX.js";
|
|
10
|
-
import "../../../chunk-TREHTIBD.js";
|
|
11
|
-
import "../../../chunk-5OTQA7CM.js";
|
|
12
|
-
import "../../../chunk-BMJTNPWK.js";
|
|
13
|
-
import "../../../chunk-CKA4SJRK.js";
|
|
14
|
-
import "../../../chunk-NLAFNMPK.js";
|
|
15
|
-
import "../../../chunk-RZLBICR5.js";
|
|
16
|
-
import "../../../chunk-IGVL3ELX.js";
|
|
17
|
-
import "../../../chunk-ZWACUOU5.js";
|
|
18
|
-
import "../../../chunk-PNNTR6KP.js";
|
|
19
|
-
import "../../../chunk-WJPMYXKZ.js";
|
|
20
|
-
import "../../../chunk-VYT4POBH.js";
|
|
21
|
-
import "../../../chunk-IQ64BNAG.js";
|
|
22
|
-
import "../../../chunk-J3BHDXQQ.js";
|
|
23
|
-
import "../../../chunk-CFEFYPNR.js";
|
|
24
|
-
import "../../../chunk-N7S72EXK.js";
|
|
25
|
-
import "../../../chunk-XEA5BCMA.js";
|
|
26
|
-
import "../../../chunk-2KO2G3RI.js";
|
|
27
|
-
import "../../../chunk-CM7LVUKC.js";
|
|
28
|
-
import "../../../chunk-TVQCDDSZ.js";
|
|
29
|
-
import "../../../chunk-TXS65BB2.js";
|
|
30
|
-
import "../../../chunk-S6WJ6TUT.js";
|
|
31
|
-
export {
|
|
32
|
-
ModelAccountIndicator
|
|
33
|
-
};
|
|
34
|
-
//# sourceMappingURL=model-account-indicator.js.map
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import type { ModelAccountUsageSnapshot } from "@opengeni/sdk";
|
|
2
|
-
import type { SubscriptionAccountUsageWindow } from "./subscription-account-menu.js";
|
|
3
|
-
export declare function modelAccountUsage(usage: ModelAccountUsageSnapshot | null | undefined, now?: number): {
|
|
4
|
-
windows?: SubscriptionAccountUsageWindow[];
|
|
5
|
-
message?: string;
|
|
6
|
-
note?: string;
|
|
7
|
-
summary?: string;
|
|
8
|
-
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/model-policy-picker-menu.tsx"],"sourcesContent":["import type { ClientModel, LatencyMode, ReasoningEffort } from \"@opengeni/sdk\";\nimport { ArrowRightIcon, CheckIcon, SearchIcon, ZapIcon } from \"lucide-react\";\nimport { useRef, useState, type RefObject, type CSSProperties } from \"react\";\nimport { Popover, RadioGroup } from \"radix-ui\";\nimport { containedPortal } from \"../ui/portal-container\";\nimport { cn } from \"../lib/cn\";\nimport {\n MENU_CHECK_CLASS,\n MENU_LABEL_CLASS,\n MENU_NOTE_CLASS,\n MENU_SURFACE_CLASS,\n} from \"../lib/menu-styles\";\nimport { labelReasoningEffort, type PickerModelRow } from \"../model-policy\";\nimport {\n compactEffortLabel,\n groupPresentationFor,\n modelPickerChoice,\n modelPickerMenuView,\n} from \"../model-picker-model\";\nimport {\n BillingClassMark,\n defaultModelPolicyPickerMessages,\n PickerNavRow,\n type ModelPolicyPickerProps,\n} from \"./model-policy-picker\";\nimport { ModelMark } from \"./model-mark\";\nimport { useOpenGeniText, type OpenGeniText } from \"../messages/runtime\";\n\nconst PopoverContainedPortal = containedPortal(Popover.Portal);\ntype ClientPickerModelRow = PickerModelRow<ClientModel>;\n\n/** Model selection stays flat; reasoning never becomes a navigation destination. */\nexport function ModelPolicyPickerMenu(props: ModelPolicyPickerProps) {\n const t = useOpenGeniText();\n const [query, setQuery] = useState(\"\");\n const view = modelPickerMenuView(t, props, query);\n const { messages, rows, groups } = view;\n const selected = view.selected;\n const choose = (row: ClientPickerModelRow) => {\n if (props.disabled) return;\n const choice = modelPickerChoice(props, row);\n if (!choice) return;\n if (choice.model !== null) props.onModelChange(choice.model);\n // Hosts may commit the combined model/effort draft through this callback.\n props.onEffortChange(choice.effort);\n if (choice.latencyMode !== null) props.onLatencyModeChange(choice.latencyMode);\n };\n const modelRow = (row: ClientPickerModelRow) => (\n <PickerNavRow\n key={row.id}\n icon={\n props.collapseScopes === false ? undefined : (\n <ModelMark model={row.catalog} className=\"size-4 text-og-fg-muted\" />\n )\n }\n label={row.label}\n hint={row.unavailableReason ?? row.fundingHint}\n disabled={props.disabled || !row.selectable}\n title={[row.label, row.unavailableReason ?? row.fundingHint].filter(Boolean).join(\" · \")}\n active={row.selectable && row.id === props.model}\n showChevron={false}\n trailing={\n row.catalog.cost === \"free\" || row.id === props.model ? (\n <span className=\"flex items-center gap-2\">\n {row.catalog.cost === \"free\" ? (\n <span className=\"rounded-full bg-og-surface-2 px-1.5 py-0.5 text-og-control text-og-fg-muted\">\n {messages.free}\n </span>\n ) : null}\n {row.id === props.model ? (\n <CheckIcon className={MENU_CHECK_CLASS} aria-label={messages.selected} />\n ) : null}\n </span>\n ) : null\n }\n testId={`model-picker-choice-${row.id}`}\n onClick={() => choose(row)}\n />\n );\n return (\n <div\n data-testid=\"model-picker-menu\"\n className=\"flex min-h-0 flex-col\"\n onKeyDown={(event) => {\n if (\n !(event.target instanceof HTMLButtonElement) ||\n ![\"ArrowDown\", \"ArrowUp\", \"Home\", \"End\"].includes(event.key)\n )\n return;\n const buttons = Array.from(\n event.currentTarget.querySelectorAll<HTMLButtonElement>(\n '[data-testid^=\"model-picker-choice-\"]:not(:disabled)',\n ),\n );\n const index = buttons.indexOf(event.target);\n if (index < 0) return;\n event.preventDefault();\n const next =\n event.key === \"Home\"\n ? 0\n : event.key === \"End\"\n ? buttons.length - 1\n : (index + (event.key === \"ArrowDown\" ? 1 : -1) + buttons.length) % buttons.length;\n buttons[next]?.focus();\n }}\n >\n {rows.some((row) => row.selectable) ? (\n <div className=\"border-b border-og-border py-1\">\n <label className=\"og-model-policy-search flex items-center gap-2 px-2.5 py-0.5\">\n <SearchIcon className=\"size-4 shrink-0 text-og-fg-subtle\" aria-hidden />\n <input\n aria-label={messages.searchLabel}\n placeholder={messages.searchPlaceholder}\n value={query}\n onChange={(event) => setQuery(event.target.value)}\n onKeyDown={(event) => {\n if (event.key !== \"Escape\" && event.key !== \"Tab\") event.stopPropagation();\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n event.currentTarget\n .closest('[data-testid=\"model-picker-menu\"]')\n ?.querySelector<HTMLButtonElement>(\"button:not(:disabled)\")\n ?.focus();\n }\n }}\n className=\"og-model-policy-search-input h-8 min-w-0 flex-1 bg-transparent text-og-menu text-og-fg outline-hidden placeholder:text-og-fg-subtle\"\n />\n </label>\n </div>\n ) : null}\n {props.error ? (\n <p className={cn(MENU_NOTE_CLASS, \"text-og-sm text-og-status-failed\")} role=\"alert\">\n {props.error}\n </p>\n ) : null}\n <div\n className=\"min-h-0 flex-1 overflow-y-auto overscroll-contain py-1\"\n data-testid=\"model-picker-models\"\n >\n {props.loading ? (\n // Rows at the menu's row height, never a sentence, so nothing jumps.\n <div role=\"status\" aria-label={messages.loading}>\n {[58, 44, 66, 50].map((width) => (\n <div key={width} aria-hidden=\"true\" className=\"flex h-8 items-center gap-3 px-2.5\">\n <span className=\"size-4 shrink-0 animate-pulse rounded bg-og-surface-2\" />\n <span\n className=\"h-2.5 animate-pulse rounded bg-og-surface-2\"\n style={{ width: `${width}%` }}\n />\n </div>\n ))}\n </div>\n ) : rows.some((row) => row.selectable) ? (\n <>\n {groups.map((group) => (\n <section\n key={group.billingClass}\n aria-label={group.label}\n className=\"[&+section]:mt-1.5 [&+section]:border-t [&+section]:border-og-border [&+section]:pt-1.5\"\n >\n <div className={cn(MENU_LABEL_CLASS, \"flex items-center gap-2\")}>\n <BillingClassMark\n billingClass={group.billingClass}\n presentation={groupPresentationFor(props, group.billingClass)}\n aria-label=\"\"\n />\n <span className=\"min-w-0 break-words\">{group.label}</span>\n </div>\n {group.description ? (\n <p className=\"break-words px-2.5 pb-1 text-og-sm text-og-fg-muted\">\n {group.description}\n </p>\n ) : null}\n {group.rows.map(modelRow)}\n </section>\n ))}\n {view.matchCount === 0 ? (\n <p className={MENU_NOTE_CLASS}>\n {view.searching ? messages.noMatches : messages.noModels}\n </p>\n ) : null}\n </>\n ) : props.connectModelsHref || rows.length > 0 ? (\n <ConnectModelsPanel href={props.connectModelsHref} messages={messages} />\n ) : (\n <p className={MENU_NOTE_CLASS}>{messages.noModels}</p>\n )}\n </div>\n {view.anySelectable &&\n selected &&\n (view.unsupportedAttachments || (props.allowModelOptions !== false && view.thinking)) ? (\n <div className=\"border-t border-og-border px-2.5 py-2.5\">\n {view.unsupportedAttachments ? (\n <p className=\"pb-1.5 text-og-control leading-relaxed text-og-fg-subtle\">\n {messages.unsupportedAttachments}\n </p>\n ) : null}\n {props.allowModelOptions !== false ? <ModelThinkingControls {...props} /> : null}\n </div>\n ) : null}\n </div>\n );\n}\n\nconst CONNECT_MODEL_OPTIONS = (\n t: OpenGeniText,\n): Array<{\n billingClass: \"codex_subscription\" | \"supergrok_subscription\" | \"byok\" | \"external\";\n title: string;\n detail: string;\n}> => [\n {\n billingClass: \"codex_subscription\",\n title: t(\"modelPolicyPickerMenu.codex\"),\n detail: \"ChatGPT\",\n },\n { billingClass: \"supergrok_subscription\", title: \"SuperGrok\", detail: \"xAI\" },\n {\n billingClass: \"byok\",\n title: t(\"modelPolicyPickerMenu.aiGateway\"),\n detail: t(\"modelPolicyPickerMenu.vercel\"),\n },\n { billingClass: \"external\", title: \"OpenRouter\", detail: t(\"modelPolicyPickerMenu.apiKey\") },\n];\n\nfunction ConnectModelsPanel(props: {\n href: string | undefined;\n messages: ReturnType<typeof defaultModelPolicyPickerMessages>;\n}) {\n const t = useOpenGeniText();\n return (\n <div className=\"px-1.5 pb-1.5 pt-2\" data-testid=\"model-picker-connect\">\n <div className=\"px-1.5 pb-3\">\n <p className=\"text-og-menu font-medium tracking-tight text-og-fg\">\n {props.messages.connectTitle}\n </p>\n <p className=\"mt-1 text-og-control leading-snug text-og-fg-subtle\">\n {props.messages.connectBody}\n </p>\n </div>\n <div className=\"grid grid-cols-2 gap-1\">\n {CONNECT_MODEL_OPTIONS(t).map((option) => {\n const content = (\n <>\n <span className=\"flex size-8 shrink-0 items-center justify-center rounded-og-md bg-og-surface-2 text-og-fg\">\n <BillingClassMark\n billingClass={option.billingClass}\n aria-label=\"\"\n className=\"size-4 text-og-fg\"\n />\n </span>\n <span className=\"min-w-0\">\n <span className=\"block truncate text-og-control font-medium text-og-fg\">\n {option.title}\n </span>\n <span className=\"block truncate text-og-control text-og-fg-subtle\">\n {option.detail}\n </span>\n </span>\n </>\n );\n const className =\n \"flex min-w-0 items-center gap-2 rounded-og-md px-1.5 py-1.5 outline-hidden transition-colors hover:bg-og-hover focus-visible:ring-2 focus-visible:ring-og-accent/40\";\n return props.href ? (\n <a key={option.title} href={props.href} className={className}>\n {content}\n </a>\n ) : (\n <div key={option.title} className={className}>\n {content}\n </div>\n );\n })}\n </div>\n {props.href ? (\n <a\n href={props.href}\n className=\"mt-2 flex h-9 w-full items-center justify-center gap-1.5 rounded-og-md border border-og-primary-border bg-og-primary text-og-primary-fg hover:bg-og-primary-hover text-og-control font-medium outline-hidden transition-colors focus-visible:ring-2 focus-visible:ring-og-accent/40\"\n >\n {props.messages.connectAction}\n <ArrowRightIcon className=\"size-3.5\" aria-hidden />\n </a>\n ) : (\n <p className=\"px-1.5 pt-3 text-og-control text-og-fg-subtle\">{props.messages.noModels}</p>\n )}\n </div>\n );\n}\n\nfunction ModelThinkingControls(props: ModelPolicyPickerProps) {\n const t = useOpenGeniText();\n const view = modelPickerMenuView(t, props, \"\");\n const thinking = view.thinking;\n if (!view.selected || !thinking) return null;\n const messages = view.messages;\n const efforts = thinking.efforts;\n const showThinking = thinking.showThinking;\n const showFast = thinking.showFast;\n const speeds = thinking.speeds;\n const selectedSpeed = speeds?.find((speed) => speed.id === props.latencyMode) ?? speeds?.[0];\n return (\n <div className=\"space-y-2 text-og-control\" data-testid=\"model-picker-reasoning\">\n {showThinking || showFast ? (\n <div className=\"flex min-h-7 items-center justify-between gap-3\">\n {showThinking ? <span className=\"text-og-fg-subtle\">{messages.thinking}</span> : <span />}\n {showFast ? (\n <button\n type=\"button\"\n data-testid=\"model-picker-fast\"\n disabled={props.disabled || thinking.disabled}\n aria-pressed={props.latencyMode === \"fast\"}\n title={messages.fast + \" · \" + messages.fastRateHint}\n onClick={() =>\n props.onLatencyModeChange(props.latencyMode === \"fast\" ? \"standard\" : \"fast\")\n }\n className=\"flex min-h-8 shrink-0 items-center gap-1.5 whitespace-nowrap rounded-og-sm px-2 text-og-fg-muted hover:bg-og-hover focus-visible:ring-2 focus-visible:ring-og-accent/40 disabled:opacity-50\"\n >\n <ZapIcon className={cn(\"size-3.5\", props.latencyMode === \"fast\" && \"fill-current\")} />\n {messages.fast}\n <span className=\"text-og-fg-subtle\">{messages.fastRateHint}</span>\n </button>\n ) : null}\n </div>\n ) : null}\n {showThinking ? (\n <RadioGroup.Root\n aria-label={messages.thinkingEffort}\n value={thinking.value}\n disabled={props.disabled || thinking.disabled}\n onValueChange={(value) => props.onEffortChange(value as ReasoningEffort)}\n orientation=\"horizontal\"\n className=\"flex flex-wrap gap-0.5 rounded-og-md bg-og-surface-2 p-0.5\"\n >\n {efforts.map((effort) => (\n <RadioGroup.Item\n key={effort}\n value={effort}\n aria-label={labelReasoningEffort(t, effort)}\n title={labelReasoningEffort(t, effort)}\n className=\"min-h-8 min-w-10 flex-1 cursor-pointer whitespace-nowrap rounded-og-sm px-1.5 text-og-control text-og-fg-muted outline-hidden transition-colors hover:text-og-fg focus-visible:ring-2 focus-visible:ring-og-accent/40 data-[state=checked]:bg-og-surface-1 data-[state=checked]:text-og-fg data-[state=checked]:shadow-sm disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {compactEffortLabel(t, effort, labelReasoningEffort(t, effort))}\n </RadioGroup.Item>\n ))}\n </RadioGroup.Root>\n ) : null}\n {speeds && selectedSpeed ? (\n <div className=\"space-y-2 pt-1\" data-testid=\"model-picker-speed\">\n <div className=\"flex min-h-7 items-center justify-between gap-3\">\n <span className=\"text-og-fg-subtle\">{messages.speed}</span>\n {selectedSpeed.hint ? (\n <span className=\"text-og-fg-subtle\">{selectedSpeed.hint}</span>\n ) : null}\n </div>\n <RadioGroup.Root\n aria-label={messages.speed}\n value={selectedSpeed.id}\n disabled={props.disabled || thinking.disabled}\n onValueChange={(value) => props.onLatencyModeChange(value as LatencyMode)}\n orientation=\"horizontal\"\n className=\"flex flex-wrap gap-0.5 rounded-og-md bg-og-surface-2 p-0.5\"\n >\n {speeds.map((speed) => (\n <RadioGroup.Item\n key={speed.id}\n value={speed.id}\n aria-label={speed.hint ? `${speed.label} · ${speed.hint}` : speed.label}\n title={speed.hint ? `${speed.label} · ${speed.hint}` : speed.label}\n className=\"flex min-h-8 min-w-10 flex-1 cursor-pointer items-center justify-center gap-1 whitespace-nowrap rounded-og-sm px-1.5 text-og-control text-og-fg-muted outline-hidden transition-colors hover:text-og-fg focus-visible:ring-2 focus-visible:ring-og-accent/40 data-[state=checked]:bg-og-surface-1 data-[state=checked]:text-og-fg data-[state=checked]:shadow-sm disabled:cursor-not-allowed disabled:opacity-50\"\n >\n {speed.id === \"standard\" ? null : (\n <ZapIcon\n aria-hidden\n className={cn(\n \"size-3.5 shrink-0\",\n speed.id === selectedSpeed.id && \"fill-current\",\n )}\n />\n )}\n {speed.label}\n </RadioGroup.Item>\n ))}\n </RadioGroup.Root>\n </div>\n ) : null}\n </div>\n );\n}\n\nexport function ModelPolicyPickerPopover(\n props: ModelPolicyPickerProps & {\n anchor: RefObject<HTMLButtonElement | null>;\n contentId: string;\n portalStyle: CSSProperties;\n },\n) {\n const t = useOpenGeniText();\n const outside = useRef(false);\n const messages = { ...defaultModelPolicyPickerMessages(t), ...props.messages };\n return (\n <Popover.Root open onOpenChange={(open) => props.onOpenChange?.(open)}>\n <Popover.Anchor virtualRef={props.anchor} />\n <PopoverContainedPortal>\n <Popover.Content\n id={props.contentId}\n aria-label={messages.label}\n align=\"start\"\n side={props.menuSide ?? \"bottom\"}\n sideOffset={8}\n collisionPadding={12}\n onInteractOutside={(event) => {\n if (props.anchor.current?.contains(event.target as Node)) event.preventDefault();\n else outside.current = true;\n }}\n onCloseAutoFocus={(event) => {\n event.preventDefault();\n if (!outside.current) props.anchor.current?.focus();\n }}\n className={cn(\n MENU_SURFACE_CLASS,\n \"og-root og-model-policy-menu z-50 flex max-h-[min(32rem,var(--radix-popover-content-available-height))] w-[22rem] max-w-[calc(100vw-16px)] flex-col overflow-hidden p-[var(--og-model-picker-menu-padding)]\",\n props.contentClassName,\n )}\n style={{ ...props.portalStyle, ...props.contentStyle }}\n data-testid=\"model-picker-content\"\n >\n <ModelPolicyPickerMenu {...props} />\n </Popover.Content>\n </PopoverContainedPortal>\n </Popover.Root>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/app/components/session/subscription-account-menu.tsx"],"sourcesContent":["// Shared presentation extracted from the Codex subscription-account dropdown.\n// Adapters own loading, authorization, usage freshness, and selection semantics.\nimport { ChevronDownIcon, Loader2Icon } from \"lucide-react\";\nimport type { ReactNode } from \"react\";\n\nimport {\n DropdownMenu,\n DropdownMenuCheck,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuMeta,\n DropdownMenuNote,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"../../../ui/dropdown-menu\";\nimport { cn } from \"../../lib/utils\";\n\nexport type SubscriptionAccountMenuRow = {\n id: string;\n label: string;\n plan?: string | null | undefined;\n status?: string | null;\n detail?: string;\n personal?: boolean;\n disabled?: boolean;\n /** Only supplied when the adapter has a trustworthy quota reading. */\n remaining?: number | null;\n /** Cached window readings, not an aggregate capacity/eligibility estimate. */\n usageSummary?: string | undefined;\n};\n\nexport type SubscriptionAccountUsageWindow = {\n label: string;\n remaining?: number;\n usedPercent?: number | null;\n detail?: string;\n};\n\nfunction UsageRow({ label, remaining, usedPercent, detail }: SubscriptionAccountUsageWindow) {\n const value = remaining ?? usedPercent;\n const known = typeof value === \"number\" && Number.isFinite(value);\n const pct = known ? Math.min(100, Math.max(0, value)) : 0;\n const measure = remaining !== undefined ? \"remaining\" : \"used\";\n const text = known ? `${Math.round(value)}% ${measure}` : \"Unknown\";\n return (\n <div className=\"space-y-0.5 text-2xs text-fg-subtle\">\n <div className=\"flex items-center gap-2\">\n <span className=\"max-w-28 min-w-10 shrink-0 truncate\" title={label}>\n {label}\n </span>\n {known ? (\n <span\n className=\"h-1 min-w-0 flex-1 overflow-hidden rounded-full bg-surface-2\"\n role=\"progressbar\"\n aria-label={`${label} ${measure}`}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={pct}\n aria-valuetext={text}\n >\n <span\n className={cn(\n \"block h-full rounded-full\",\n (measure === \"remaining\" ? pct <= 10 : pct >= 90)\n ? \"bg-status-waiting\"\n : \"bg-brand\",\n )}\n style={{ width: `${pct}%` }}\n />\n </span>\n ) : (\n <span className=\"flex-1\" />\n )}\n <span className=\"shrink-0 whitespace-nowrap text-right tabular-nums\">{text}</span>\n </div>\n {detail ? <p>{detail}</p> : null}\n </div>\n );\n}\n\nfunction MiniBar({ remaining }: { remaining: number }) {\n const pct = Math.min(100, Math.max(0, remaining));\n return (\n <span\n className=\"inline-flex shrink-0 items-center gap-1.5 text-2xs text-fg-subtle\"\n title={`${Math.round(pct)}% remaining in the tighter usage window`}\n >\n <span className=\"h-1 w-8 overflow-hidden rounded-full bg-surface-2\" aria-hidden=\"true\">\n <span\n className={cn(\"block h-full rounded-full\", pct <= 10 ? \"bg-status-waiting\" : \"bg-brand\")}\n style={{ width: `${pct}%` }}\n />\n </span>\n <span className=\"whitespace-nowrap tabular-nums\">{Math.round(pct)}% remaining</span>\n </span>\n );\n}\n\nexport function SubscriptionAccountMenu({\n ariaLabel,\n triggerMark,\n headerMark,\n selectionLabel,\n displayName,\n metadata,\n identity,\n tone = \"ok\",\n usage,\n accounts,\n selectedId,\n automaticSelected,\n choosing,\n choosingTarget,\n actionLabel = \"Use for next turn\",\n automaticLabel = \"Automatic\",\n emptyMessage,\n error,\n note,\n onOpenChange,\n onChoose,\n}: {\n ariaLabel: string;\n triggerMark: ReactNode;\n headerMark: ReactNode;\n selectionLabel: string;\n displayName: string;\n metadata: string;\n identity?: string | null | undefined;\n tone?: \"ok\" | \"warn\" | \"bad\" | undefined;\n usage: {\n checking?: boolean | undefined;\n unavailable?: boolean | undefined;\n message?: string | undefined;\n note?: string | undefined;\n windows?: SubscriptionAccountUsageWindow[] | undefined;\n };\n accounts: SubscriptionAccountMenuRow[];\n selectedId: string | null;\n automaticSelected: boolean;\n choosing: boolean;\n choosingTarget: string | null | undefined;\n actionLabel?: string | undefined;\n automaticLabel?: string | undefined;\n emptyMessage?: string | undefined;\n error?: string | null | undefined;\n note: string;\n onOpenChange?: ((open: boolean) => void) | undefined;\n onChoose: (connectionId: string | null) => void;\n}) {\n const row = (account: SubscriptionAccountMenuRow) => (\n <DropdownMenuItem\n key={account.id}\n disabled={choosing || account.disabled}\n title={account.detail}\n onSelect={(event) => {\n event.preventDefault();\n onChoose(account.id);\n }}\n className=\"cursor-pointer\"\n >\n <span className=\"min-w-0 flex-1\">\n <span className=\"block truncate\">{account.label}</span>\n {account.usageSummary ? (\n <span className=\"block truncate text-2xs text-fg-subtle\" title={account.usageSummary}>\n {account.usageSummary}\n </span>\n ) : null}\n </span>\n {account.plan ? <DropdownMenuMeta>{account.plan}</DropdownMenuMeta> : null}\n {account.remaining != null ? <MiniBar remaining={account.remaining} /> : null}\n {account.status ? (\n <span className=\"shrink-0 text-xs text-status-waiting\">{account.status}</span>\n ) : null}\n {choosingTarget === account.id ? (\n <Loader2Icon className=\"size-4 shrink-0 animate-spin\" />\n ) : (\n <DropdownMenuCheck checked={account.id === selectedId} className=\"ml-0\" />\n )}\n </DropdownMenuItem>\n );\n const personal = accounts.filter((account) => account.personal);\n return (\n <DropdownMenu {...(onOpenChange ? { onOpenChange } : {})}>\n <DropdownMenuTrigger asChild>\n <button\n type=\"button\"\n aria-label={ariaLabel}\n title={ariaLabel}\n className={cn(\n \"group/account relative inline-flex h-6 shrink-0 cursor-pointer items-center gap-0.5 rounded-full border border-border/70 bg-surface-2/50 px-1.5 text-fg-muted outline-hidden transition-[background-color,border-color,color] hover:border-border hover:bg-surface-2 hover:text-fg focus-visible:ring-1 focus-visible:ring-ring/40 data-[state=open]:border-border data-[state=open]:bg-surface-2 data-[state=open]:text-fg\",\n choosing && \"opacity-60\",\n )}\n >\n {triggerMark}\n {choosing ? (\n <Loader2Icon className=\"size-2.5 animate-spin text-current\" aria-hidden />\n ) : (\n <ChevronDownIcon\n className=\"size-2.5 shrink-0 opacity-70 transition-opacity group-hover/account:opacity-100\"\n aria-hidden\n />\n )}\n {tone !== \"ok\" ? (\n <span\n className={cn(\n \"absolute -top-0.5 -right-0.5 size-1.5 rounded-full ring-1 ring-surface\",\n tone === \"bad\" ? \"bg-destructive\" : \"bg-status-waiting\",\n )}\n aria-hidden\n />\n ) : null}\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"start\"\n side=\"bottom\"\n sideOffset={8}\n collisionPadding={12}\n className=\"flex max-h-[min(32rem,var(--radix-dropdown-menu-content-available-height))] w-72 flex-col overflow-hidden\"\n >\n <div className=\"shrink-0 space-y-2 px-2.5 pt-1.5 pb-2\">\n <div className=\"flex items-start gap-2\">\n <span className=\"mt-0.5 inline-flex size-7 shrink-0 items-center justify-center overflow-hidden rounded-md bg-surface-2 text-fg\">\n {headerMark}\n </span>\n <div className=\"min-w-0 flex-1\">\n <p className=\"text-2xs text-fg-subtle\">{selectionLabel}</p>\n <p className=\"truncate text-sm font-medium text-fg\">{displayName}</p>\n {identity ? (\n <p className=\"truncate text-2xs text-fg-subtle\" title={identity}>\n {identity}\n </p>\n ) : null}\n <p className=\"truncate text-2xs text-fg-subtle\" title={metadata}>\n {metadata}\n </p>\n </div>\n </div>\n {usage.checking ? (\n <p className=\"text-2xs text-fg-subtle\">Checking usage…</p>\n ) : usage.unavailable ? (\n <p className=\"text-2xs text-fg-subtle\">Usage unavailable</p>\n ) : usage.message ? (\n <p className=\"text-2xs text-fg-subtle\">{usage.message}</p>\n ) : (\n <div className=\"max-h-36 space-y-1.5 overflow-y-auto overscroll-contain\">\n {usage.windows?.map((window) => (\n <UsageRow key={window.label} {...window} />\n ))}\n </div>\n )}\n {usage.note ? <p className=\"text-2xs text-fg-subtle\">{usage.note}</p> : null}\n </div>\n <DropdownMenuSeparator className=\"shrink-0\" />\n <DropdownMenuLabel className=\"shrink-0\">{actionLabel}</DropdownMenuLabel>\n <div className=\"min-h-0 flex-1 overflow-y-auto overscroll-contain\">\n <DropdownMenuItem\n disabled={choosing}\n onSelect={(event) => {\n event.preventDefault();\n onChoose(null);\n }}\n className=\"cursor-pointer\"\n >\n <span className=\"min-w-0 flex-1 truncate\">{automaticLabel}</span>\n {choosingTarget === null ? (\n <Loader2Icon className=\"size-4 shrink-0 animate-spin\" />\n ) : (\n <DropdownMenuCheck checked={automaticSelected} className=\"ml-0\" />\n )}\n </DropdownMenuItem>\n {accounts.filter((account) => !account.personal).map(row)}\n {personal.length > 0 ? (\n <>\n <DropdownMenuLabel className=\"pt-2\">Your accounts</DropdownMenuLabel>\n {personal.map(row)}\n </>\n ) : null}\n {accounts.length === 0 && emptyMessage ? (\n <DropdownMenuNote>{emptyMessage}</DropdownMenuNote>\n ) : null}\n {error ? (\n <DropdownMenuNote role=\"alert\" className=\"text-xs text-danger\">\n {error}\n </DropdownMenuNote>\n ) : (\n <p className=\"px-2.5 pt-1.5 pb-1 text-xs text-fg-muted\">{note}</p>\n )}\n </div>\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hooks/use-connect.ts","../src/components/session-mcp-capability-card.tsx","../src/mcp-connection-status.ts"],"sourcesContent":["import type { ConnectController } from \"@opengeni/connect\";\nimport { useMemo, useSyncExternalStore } from \"react\";\n\n/** Internal consumers import the hook directly so setup surfaces stay lazy. */\nexport function useConnect(controller: ConnectController) {\n const snapshot = useSyncExternalStore(\n controller.subscribe,\n controller.getSnapshot,\n controller.getSnapshot,\n );\n const actions = useMemo(\n () => ({\n begin: controller.begin.bind(controller),\n recover: controller.recover.bind(controller),\n refresh: controller.refresh.bind(controller),\n waitForAction: controller.waitForAction.bind(controller),\n advance: controller.advance.bind(controller),\n cancel: controller.cancel.bind(controller),\n }),\n [controller],\n );\n return useMemo(() => ({ ...snapshot, ...actions }), [snapshot, actions]);\n}\n","import {\n authorizeConnectAttempt,\n ConnectPopupClosedError,\n ConnectController,\n createBrowserConnectNavigation,\n reserveBrowserConnectNavigation,\n type ConnectAttempt,\n type ConnectNavigation,\n type ConnectOwnership,\n} from \"@opengeni/connect\";\nimport type { CapabilityCatalogItem } from \"@opengeni/sdk\";\nimport type { OpenGeniBrowserClient as OpenGeniClient } from \"@opengeni/sdk/browser\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { useConnect } from \"../hooks/use-connect\";\nimport { attachSessionCapability, sessionCapabilityTools } from \"../session-capability-policy\";\nimport { SessionCapabilityFrame } from \"./session-capability-frame\";\nimport { matchingActiveMcpConnections } from \"../mcp-connection-status\";\nimport { useOpenGeniText } from \"../messages/runtime\";\n\nexport type SessionMcpCapabilityCardProps = {\n client: OpenGeniClient;\n workspaceId: string;\n sessionId: string;\n capabilityId: string;\n name: string;\n rationale?: string;\n /** Exact host route; no console-specific routing is assumed. */\n returnUrl: string;\n onConfigured?: (() => void | Promise<void>) | undefined;\n};\n\nexport type McpConnectionCardProps = Omit<SessionMcpCapabilityCardProps, \"sessionId\"> & {\n /** Omit for connection management: no session tool selection is written. */\n sessionId?: string;\n dialogOnly?: boolean;\n onClose?: (() => void) | undefined;\n /**\n * The provider only ever connects someone's own account (official Gmail,\n * Slack's hosted MCP): no ownership choice, always personal.\n */\n personalOnly?: boolean;\n /** The connect button's words, \"Connect Gmail\". Defaults to \"Continue to <name>\". */\n connectLabel?: string;\n /** The line under the dialog title. Defaults to the kind and provider domain. */\n dialogSubtitle?: string;\n /** The host's product copy for this connection, instead of the catalog description. */\n description?: string;\n /** The host's logo for this connection, when the catalog has no asset. */\n logoSrc?: string | null;\n /** The host's words for the ownership choice. */\n ownershipCopy?: { legend: string; workspace: string; personal: string };\n};\n\n/** Native OAuth recommendation flow. Identity and endpoint come from the live\n * catalog, never from model-authored recommendation text. */\nexport function SessionMcpCapabilityCard(props: SessionMcpCapabilityCardProps) {\n return <McpConnectionCard {...props} />;\n}\n\nexport function McpConnectionCard(props: McpConnectionCardProps) {\n const [client, setClient] = useState(props.client);\n const [generation, setGeneration] = useState(0);\n if (client !== props.client) {\n setClient(props.client);\n setGeneration(generation + 1);\n }\n return (\n <ScopedCard\n key={`${generation}:${props.workspaceId}:${props.sessionId}:${props.capabilityId}`}\n {...props}\n />\n );\n}\n\nfunction ScopedCard({\n client,\n workspaceId,\n sessionId,\n capabilityId,\n name,\n rationale = \"\",\n returnUrl,\n onConfigured,\n dialogOnly = false,\n onClose,\n personalOnly = false,\n connectLabel,\n dialogSubtitle,\n description: hostDescription,\n logoSrc,\n ownershipCopy,\n}: McpConnectionCardProps) {\n const t = useOpenGeniText();\n const [controller] = useState(\n () => new ConnectController(client.connectTransport(), workspaceId),\n );\n const view = useConnect(controller);\n const [item, setItem] = useState<CapabilityCatalogItem | null>(null);\n const [logo, setLogo] = useState<string | null>(null);\n const [expanded, setExpanded] = useState(dialogOnly);\n const [complete, setComplete] = useState(false);\n const [connected, setConnected] = useState(false);\n const [waiting, setWaiting] = useState(false);\n const [reconciling, setReconciling] = useState(false);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [notice, setNotice] = useState<string | null>(null);\n const [retryFresh, setRetryFresh] = useState(false);\n const [ownership, setOwnership] = useState<ConnectOwnership>(\n personalOnly ? \"personal\" : \"workspace\",\n );\n const lifetime = useRef<AbortController | null>(null);\n const authorization = useRef<AbortController | null>(null);\n const operation = useRef<AbortController | null>(null);\n const reservedPopup = useRef<(() => void) | null>(null);\n const startKey = useRef(crypto.randomUUID());\n const advanceKey = useRef(crypto.randomUUID());\n const startInput = useRef<string | null>(null);\n const storageKey = sessionId\n ? `opengeni:session-connect:${workspaceId}:${sessionId}:${capabilityId}`\n : `opengeni:workspace-connect:${workspaceId}:${capabilityId}`;\n const current = () => !!lifetime.current && !lifetime.current.signal.aborted;\n\n async function load(active: () => boolean = current) {\n const invocation = lifetime.current;\n const [catalog, session] = await Promise.all([\n client.listCapabilities(workspaceId),\n sessionId ? client.getSession(workspaceId, sessionId) : Promise.resolve(null),\n ]);\n if (!invocation || invocation.signal.aborted || lifetime.current !== invocation || !active())\n return null;\n let resolved = catalog.items.find((entry) => entry.id === capabilityId);\n // Custom catalog entries may not declare authentication. Discover it from\n // the live catalog's endpoint, never from recommendation/host copy.\n if (resolved?.kind === \"mcp\" && !resolved.enabled && !resolved.authKind) {\n const endpoint = resolved.mcpUrl ?? resolved.endpointUrl;\n if (endpoint) {\n const inspected = await client.inspectMcpAuthentication(workspaceId, endpoint);\n if (invocation.signal.aborted || lifetime.current !== invocation || !active()) return null;\n if (inspected.kind === \"oauth2\") resolved = { ...resolved, authKind: \"oauth2\" };\n else if (inspected.kind === \"unknown\")\n throw new Error(\n inspected.message ?? t(\"sessionMcpCapabilityCard.couldNotDetermineHowTo\"),\n );\n }\n }\n if (!resolved || resolved.kind !== \"mcp\" || resolved.authKind !== \"oauth2\")\n throw new Error(t(\"sessionMcpCapabilityCard.thisRecommendationIsNotAn\"));\n setItem(resolved);\n if (resolved.connectionRef)\n setOwnership(resolved.connectionRef.subjectScope === \"subject\" ? \"personal\" : \"workspace\");\n else if (\n !item &&\n (personalOnly || resolved.metadata?.defaultConnectionOwnership === \"personal\")\n )\n setOwnership(\"personal\");\n let accountReady = false;\n if (resolved.enabled && resolved.connectionRef) {\n const connections =\n resolved.connectionRef.subjectScope === \"subject\"\n ? await client.listOwnConnectionAccounts(workspaceId)\n : await client.listConnections(workspaceId);\n if (invocation.signal.aborted || lifetime.current !== invocation || !active()) return null;\n const matches = matchingActiveMcpConnections(resolved, connections);\n accountReady = matches.length === 1;\n }\n if (invocation.signal.aborted || lifetime.current !== invocation || !active()) return null;\n const selected =\n session?.toolPolicy.mode === \"workspace_default\"\n ? session.effectiveToolPolicy?.selectedIds\n : session?.tools.filter((tool) => tool.kind === \"mcp\").map((tool) => tool.id);\n setConnected(accountReady);\n setComplete(\n accountReady &&\n !!selected &&\n sessionCapabilityTools(resolved).every((tool) => selected.includes(tool.id)),\n );\n return resolved;\n }\n\n useEffect(() => {\n const abort = new AbortController();\n lifetime.current = abort;\n // Mount reads are scoped to this effect, not to the user-action lock.\n // Strict Mode may cancel the first mount while its promise is still in\n // flight; that must not suppress the replacement mount's initialization.\n if (dialogOnly) setBusy(true);\n void (async () => {\n await load();\n if (abort.signal.aborted || !dialogOnly) return;\n await recoverSavedAttempt();\n })()\n .catch((failure) => {\n if (!abort.signal.aborted)\n setError(\n failure instanceof Error\n ? failure.message\n : t(\"sessionMcpCapabilityCard.couldnTLoadConnectionDetails\"),\n );\n })\n .finally(() => {\n if (!abort.signal.aborted && dialogOnly) setBusy(false);\n });\n return () => {\n abort.abort();\n };\n // ScopedCard remounts for client/workspace/session/capability changes.\n // These reads initialize that scope; rerunning on action closures would\n // cancel initialization whenever its own state updates render the card.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [client, workspaceId, sessionId, capabilityId, dialogOnly, t]);\n\n useEffect(() => {\n const path = item?.logoAssetPath;\n setLogo(null);\n if (!path?.startsWith(\"catalog-assets/\")) return;\n const abort = new AbortController();\n let objectUrl: string | null = null;\n // Embeds can require authentication even for the API's public catalog\n // asset route. Use the client's transport instead of an unauthenticated img.\n void client\n .downloadCatalogAsset(path, { signal: abort.signal })\n .then((blob) => {\n if (abort.signal.aborted || !blob.type.startsWith(\"image/\") || blob.size > 2_000_000)\n return;\n objectUrl = URL.createObjectURL(blob);\n setLogo(objectUrl);\n })\n .catch(() => {\n /* Keep the provider's initials if its passive mark is unavailable. */\n });\n return () => {\n abort.abort();\n if (objectUrl) URL.revokeObjectURL(objectUrl);\n };\n }, [client, item?.logoAssetPath]);\n\n async function run(action: (active: () => boolean) => Promise<void>) {\n if (operation.current || !current()) return;\n const pending = new AbortController();\n operation.current = pending;\n const active = () => current() && operation.current === pending && !pending.signal.aborted;\n setBusy(true);\n setError(null);\n setNotice(null);\n setRetryFresh(false);\n try {\n await action(active);\n } catch (failure) {\n if (active()) {\n if (failure instanceof ConnectPopupClosedError) setNotice(failure.message);\n else\n setError(\n failure instanceof Error\n ? failure.message\n : t(\"sessionMcpCapabilityCard.connectionSetupCouldNotFinish\"),\n );\n }\n } finally {\n if (operation.current === pending) {\n operation.current = null;\n if (current()) setBusy(false);\n }\n }\n }\n\n function remember(attemptId: string) {\n // An opaque recovery hint only. The backend rechecks the authenticated\n // owner on recover; this value never grants access or proves completion.\n try {\n sessionStorage.setItem(storageKey, attemptId);\n } catch {\n /* Storage may be disabled. */\n }\n }\n\n async function reconcile(attempt: ConnectAttempt, active: () => boolean = current) {\n if (!active()) return;\n if (attempt.state !== \"complete\" || !attempt.account || !attempt.credentialsCommitted) return;\n const resolved = await load(active);\n if (!resolved || !active()) return;\n const connection = (await client.listConnections(workspaceId)).find(\n (entry) => entry.id === attempt.account!.id,\n );\n if (!active()) return;\n if (\n !connection ||\n connection.status !== \"active\" ||\n connection.kind !== \"oauth2\" ||\n connection.metadata.mcpUrl !== (resolved.mcpUrl ?? resolved.endpointUrl) ||\n (connection.subjectId !== null) !== (attempt.ownership === \"personal\")\n )\n throw new Error(t(\"sessionMcpCapabilityCard.theAuthorizedAccountDoesNot\"));\n const previous = resolved.connectionRef;\n if (\n resolved.enabled &&\n previous?.subjectScope !== \"subject\" &&\n previous?.connectionId &&\n previous.connectionId !== connection.id\n )\n throw new Error(t(\"sessionMcpCapabilityCard.thisIntegrationSSelectedAccount\"));\n await client.enableCapability(workspaceId, capabilityId, {\n connectionRef:\n attempt.ownership === \"personal\"\n ? { providerDomain: connection.providerDomain, kind: \"oauth2\", subjectScope: \"subject\" }\n : {\n providerDomain: connection.providerDomain,\n kind: \"oauth2\",\n subjectScope: \"workspace\",\n connectionId: connection.id,\n },\n });\n if (!active()) return;\n const enabled = await load(active);\n if (enabled && active()) {\n await finishConnection(enabled, active);\n }\n if (!active()) return;\n try {\n sessionStorage.removeItem(storageKey);\n } catch {\n /* Recovery hint only. */\n }\n }\n\n async function open() {\n setExpanded(true);\n await run(async (active) => {\n await load(active);\n if (!active()) return;\n await recoverSavedAttempt(active);\n });\n }\n\n async function recoverSavedAttempt(active: () => boolean = current) {\n let saved: string | null = null;\n try {\n saved = sessionStorage.getItem(storageKey);\n } catch {\n /* No persisted attempt. */\n }\n if (saved) {\n const attempt = await controller.recover(saved);\n if (!active()) return;\n if ([\"failed\", \"expired\", \"cancelled\"].includes(attempt.state)) setRetryFresh(true);\n if (attempt.state === \"complete\") setReconciling(true);\n try {\n await reconcile(attempt, active);\n } finally {\n if (active()) setReconciling(false);\n }\n }\n }\n\n async function begin(fresh = false) {\n await run(async (active) => {\n if (\n fresh ||\n (view.attempt && [\"failed\", \"expired\", \"cancelled\"].includes(view.attempt.state))\n ) {\n startKey.current = crypto.randomUUID();\n advanceKey.current = crypto.randomUUID();\n }\n const reserved = reserveBrowserConnectNavigation(window);\n reservedPopup.current = reserved.close;\n try {\n const resolved = await load(active);\n if (!resolved || !active()) return;\n if (\n resolved.connectionRef &&\n ownership !==\n (resolved.connectionRef.subjectScope === \"subject\" ? \"personal\" : \"workspace\")\n )\n throw new Error(t(\"sessionMcpCapabilityCard.theConnectionOwnershipChangedReview\"));\n const mcpUrl = resolved.mcpUrl ?? resolved.endpointUrl;\n if (!mcpUrl) throw new Error(t(\"sessionMcpCapabilityCard.theCurrentCatalogHasNo\"));\n // Never silently replace an already selected account. Reauthorization\n // stays on its exact native connection ID.\n let reconnectAccountId = resolved.connectionRef?.connectionId ?? undefined;\n if (resolved.connectionRef?.subjectScope === \"subject\") {\n const connections = (await client.listConnections(workspaceId)).filter(\n (entry) =>\n entry.subjectId !== null &&\n entry.kind === \"oauth2\" &&\n entry.metadata.mcpUrl === mcpUrl,\n );\n if (!active()) return;\n if (connections.length > 1)\n throw new Error(t(\"sessionMcpCapabilityCard.moreThanOnePersonalAccount\"));\n reconnectAccountId = connections[0]?.id;\n }\n // A closed request can still have reached the server. Keep its key for\n // an exact replay, but never reuse it when ownership or another input\n // changes while the user reopens setup.\n const input = JSON.stringify({ ownership, returnUrl, reconnectAccountId, mcpUrl });\n if (startInput.current !== null && startInput.current !== input) {\n startKey.current = crypto.randomUUID();\n advanceKey.current = crypto.randomUUID();\n }\n startInput.current = input;\n let attempt = await controller.begin({\n providerId: \"mcp-oauth\",\n ownership,\n returnUrl,\n idempotencyKey: startKey.current,\n ...(reconnectAccountId ? { reconnectAccountId } : {}),\n });\n if (!active()) return;\n remember(attempt.id);\n if (attempt.state === \"credential_input\")\n attempt = await controller.advance(\n { type: \"credentials\", values: { mcpUrl } },\n advanceKey.current,\n );\n if (!active()) return;\n if (attempt.nextAction.type === \"authorize\")\n await performAuthorization(attempt, reserved.navigation, active);\n else await reconcile(attempt, active);\n } finally {\n if (reservedPopup.current === reserved.close) reservedPopup.current = null;\n reserved.close();\n }\n });\n }\n\n async function performAuthorization(\n attempt: ConnectAttempt,\n navigation: ConnectNavigation,\n active: () => boolean,\n ) {\n if (!active()) return;\n const pending = new AbortController();\n authorization.current = pending;\n const abortOnUnmount = () => pending.abort(lifetime.current?.signal.reason);\n lifetime.current!.signal.addEventListener(\"abort\", abortOnUnmount, { once: true });\n setWaiting(true);\n try {\n const result = await authorizeConnectAttempt(controller.transport, attempt, navigation, {\n mode: \"popup\",\n signal: pending.signal,\n });\n if (!active() || !result) return;\n setWaiting(false);\n setReconciling(true);\n await reconcile(result, active);\n if (!active()) return;\n if (result.state === \"cancelled\") {\n setNotice(t(\"sessionMcpCapabilityCard.signInWasCancelledYou\"));\n setRetryFresh(true);\n return;\n }\n if (result.state !== \"complete\") {\n if ([\"failed\", \"expired\"].includes(result.state)) setRetryFresh(true);\n throw new Error(t(\"sessionMcpCapabilityCard.signInDidNotFinish\"));\n }\n } finally {\n lifetime.current?.signal.removeEventListener(\"abort\", abortOnUnmount);\n if (authorization.current === pending) authorization.current = null;\n if (active()) {\n setReconciling(false);\n setWaiting(false);\n }\n }\n }\n\n function authorize(attempt: ConnectAttempt) {\n // run invokes action synchronously, retaining the browser click gesture.\n return run((active) =>\n performAuthorization(attempt, createBrowserConnectNavigation(window), active),\n );\n }\n\n async function finishConnection(\n capability: CapabilityCatalogItem,\n active: () => boolean = current,\n ) {\n if (!sessionId) {\n // Connection management does not select session tools.\n await onConfigured?.();\n if (!active()) return;\n setComplete(true);\n setExpanded(false);\n onClose?.();\n return;\n }\n if (capability.connectionRef && capability.connectionRef.subjectScope !== \"subject\") {\n const selected = (await client.listConnections(workspaceId)).find(\n (entry) => entry.id === capability.connectionRef?.connectionId,\n );\n if (!active()) return;\n if (!selected || selected.status !== \"active\")\n throw new Error(t(\"sessionMcpCapabilityCard.thisAccountNeedsReconnectionBefore\"));\n }\n if (capability.connectionRef?.subjectScope === \"subject\") {\n const accounts = await client.listOwnConnectionAccounts(workspaceId);\n if (!active()) return;\n if (matchingActiveMcpConnections(capability, accounts).length === 0)\n throw new Error(t(\"sessionMcpCapabilityCard.yourAccountNeedsReconnectionBefore\"));\n }\n if (!active()) return;\n await attachSessionCapability(t, client, workspaceId, sessionId, capability, active);\n if (!active()) return;\n await onConfigured?.();\n if (!active()) return;\n setComplete(true);\n setExpanded(false);\n }\n\n async function useHere() {\n await run(async (active) => {\n if (item) await finishConnection(item, active);\n });\n }\n\n function close() {\n const pending = operation.current;\n if (pending) {\n operation.current = null;\n pending.abort(new ConnectPopupClosedError());\n authorization.current?.abort(new ConnectPopupClosedError());\n authorization.current = null;\n reservedPopup.current?.();\n setBusy(false);\n setWaiting(false);\n setReconciling(false);\n }\n setExpanded(false);\n onClose?.();\n }\n\n return (\n <SessionCapabilityFrame\n name={item?.name ?? name}\n subtitle={dialogSubtitle !== undefined ? \"\" : (item?.providerDomain ?? \"\")}\n logo={logo ?? logoSrc ?? null}\n typeLabel={dialogSubtitle ?? t(\"sessionMcpCapabilityCard.mcpServer\")}\n description={hostDescription || item?.description || rationale}\n skill={false}\n expanded={expanded}\n complete={complete}\n actionLabel={\n connected\n ? sessionId\n ? t(\"sessionMcpCapabilityCard.useInThisConversation\")\n : t(\"sessionMcpCapabilityCard.connected\")\n : t(\"sessionMcpCapabilityCard.connectName\", { name: item?.name ?? name })\n }\n note={\n sessionId\n ? t(\"sessionMcpCapabilityCard.reviewAccessBeforeSigningIn\")\n : t(\"sessionMcpCapabilityCard.reviewAccessBeforeSigningIn2\")\n }\n onOpen={() => void open()}\n onClose={close}\n dialogOnly={dialogOnly}\n >\n <div className=\"og-session-capability-setup\">\n {error ? <p role=\"alert\">{error}</p> : null}\n {notice ? (\n <p role=\"status\" className=\"og-session-capability-notice\">\n {notice}\n </p>\n ) : null}\n {!item ? (\n <>\n <p role=\"status\">\n {busy\n ? t(\"sessionMcpCapabilityCard.loadingConnectionDetails\")\n : t(\"sessionMcpCapabilityCard.connectionDetailsAreUnavailable\")}\n </p>\n <button disabled={busy} onClick={() => void open()}>\n {t(\"sessionMcpCapabilityCard.retry\")}\n </button>\n </>\n ) : (\n <>\n <p>{hostDescription || item.description || rationale}</p>\n {busy ? (\n <>\n <p role=\"status\" className=\"og-session-capability-progress\">\n {waiting\n ? t(\"sessionMcpCapabilityCard.finishSigningInWithName\", { name: item.name })\n : reconciling\n ? t(\"sessionMcpCapabilityCard.finishingYourConnection\")\n : t(\"sessionMcpCapabilityCard.preparingYourConnection\")}\n </p>\n {waiting ? (\n <button\n type=\"button\"\n className=\"og-session-capability-stop\"\n onClick={() => authorization.current?.abort(new ConnectPopupClosedError())}\n >\n {t(\"sessionMcpCapabilityCard.stopWaiting\")}\n </button>\n ) : null}\n </>\n ) : !connected ? (\n <>\n {!item.connectionRef && !personalOnly ? (\n <fieldset disabled={busy}>\n <legend>\n {ownershipCopy?.legend ??\n t(\"sessionMcpCapabilityCard.whoCanUseThisConnection\")}\n </legend>\n <label>\n <input\n type=\"radio\"\n name={`${capabilityId}-ownership`}\n checked={ownership === \"workspace\"}\n onChange={() => setOwnership(\"workspace\")}\n />\n {t(\"sessionMcpCapabilityCard.everyoneInThisWorkspace\")}\n </label>\n <label>\n <input\n type=\"radio\"\n name={`${capabilityId}-ownership`}\n checked={ownership === \"personal\"}\n onChange={() => setOwnership(\"personal\")}\n />\n {t(\"sessionMcpCapabilityCard.onlyMe\")}\n </label>\n </fieldset>\n ) : null}\n <p className=\"og-session-capability-scope\">\n {personalOnly && ownership === \"personal\"\n ? t(\"sessionMcpCapabilityCard.connectsYourOwnAccountOnly\")\n : ownershipCopy\n ? ownership === \"workspace\"\n ? ownershipCopy.workspace\n : ownershipCopy.personal\n : ownership === \"workspace\"\n ? sessionId\n ? t(\"sessionMcpCapabilityCard.thisConnectionWillBeAvailable\")\n : t(\"sessionMcpCapabilityCard.thisConnectionWillBeAvailable2\")\n : t(\"sessionMcpCapabilityCard.thisConnectionBelongsToYou\")}\n </p>\n <button\n className=\"og-session-capability-primary\"\n onClick={() => {\n if (notice || retryFresh) void begin(true);\n else if (\n view.attempt?.nextAction.type === \"authorize\" &&\n view.attempt.ownership === ownership\n )\n void authorize(view.attempt);\n else void begin();\n }}\n >\n {retryFresh ||\n ((error || notice) && view.attempt?.nextAction.type === \"authorize\")\n ? t(\"sessionMcpCapabilityCard.trySigningInAgain\")\n : (connectLabel ??\n t(\"sessionMcpCapabilityCard.continueToName\", { name: item.name }))}\n </button>\n </>\n ) : null}\n {connected && !busy ? (\n <>\n <p className=\"og-session-capability-scope\">\n {sessionId\n ? t(\"sessionMcpCapabilityCard.yourAccountIsConnectedEnable\")\n : t(\"sessionMcpCapabilityCard.yourAccountIsConnected\")}\n </p>\n <button\n className=\"og-session-capability-primary\"\n disabled={busy || view.busy}\n onClick={() => void useHere()}\n >\n {sessionId\n ? t(\"sessionMcpCapabilityCard.useInThisConversation\")\n : t(\"sessionMcpCapabilityCard.done\")}\n </button>\n </>\n ) : null}\n </>\n )}\n </div>\n </SessionCapabilityFrame>\n );\n}\n","import type { CapabilityCatalogItem, ConnectionMetadata } from \"@opengeni/sdk\";\nimport { type OpenGeniText } from \"./messages/runtime\";\n\n/** Status only; runtime use is authorized for the authenticated initiating user. */\nexport function matchingActiveMcpConnections(\n item: CapabilityCatalogItem,\n connections: ConnectionMetadata[],\n) {\n return matchingMcpConnections(item, connections).filter((entry) => entry.status === \"active\");\n}\n\nfunction matchingMcpConnections(item: CapabilityCatalogItem, connections: ConnectionMetadata[]) {\n const ref = item.connectionRef;\n if (!item.enabled || !ref) return [];\n return connections.filter(\n (entry) =>\n entry.status !== \"revoked\" &&\n entry.kind === \"oauth2\" &&\n entry.metadata.mcpUrl === (item.mcpUrl ?? item.endpointUrl) &&\n (ref.subjectScope !== \"subject\"\n ? entry.id === ref.connectionId && entry.subjectId === null\n : entry.subjectId !== null),\n );\n}\n\n/** Installation availability is not account readiness. Revoked history is not actionable. */\nexport function mcpConnectionDiscoveryState(\n t: OpenGeniText,\n item: CapabilityCatalogItem,\n connections: ConnectionMetadata[],\n) {\n const matching = matchingMcpConnections(item, connections);\n const active = matching.filter((entry) => entry.status === \"active\");\n if (active.length === 1)\n return { status: \"added\", label: t(\"mcpConnectionStatus.connected\") } as const;\n if (matching.length > 0)\n return { status: \"attention\", label: t(\"mcpConnectionStatus.reviewConnection\") } as const;\n return { status: \"available\", label: t(\"mcpConnectionStatus.connect\") } as const;\n}\n"],"mappings":"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","names":[]}
|
package/dist/chunk-7H2D4VNU.js
DELETED
|
@@ -1,150 +0,0 @@
|
|
|
1
|
-
"use client";
|
|
2
|
-
import {
|
|
3
|
-
SubscriptionAccountMenu
|
|
4
|
-
} from "./chunk-3SMJ2BIQ.js";
|
|
5
|
-
import {
|
|
6
|
-
ChatGptMark
|
|
7
|
-
} from "./chunk-GVK3MCHP.js";
|
|
8
|
-
import {
|
|
9
|
-
BillingClassMark
|
|
10
|
-
} from "./chunk-M7YEZR6X.js";
|
|
11
|
-
import {
|
|
12
|
-
Skeleton
|
|
13
|
-
} from "./chunk-HY7EYWIG.js";
|
|
14
|
-
import {
|
|
15
|
-
useCodexAccounts
|
|
16
|
-
} from "./chunk-EWL6NDOO.js";
|
|
17
|
-
|
|
18
|
-
// src/app/components/session/codex-account-indicator.tsx
|
|
19
|
-
import { useState } from "react";
|
|
20
|
-
import { jsx } from "react/jsx-runtime";
|
|
21
|
-
var CODEX_MODEL_ID_PREFIX = "codex/";
|
|
22
|
-
var AUTO = "auto";
|
|
23
|
-
var LIVE_USAGE_REUSE_MS = 3e4;
|
|
24
|
-
function accountLabel(account) {
|
|
25
|
-
if (!account) return "\u2014";
|
|
26
|
-
return account.label ?? account.email ?? account.plan ?? account.chatgptAccountId ?? "Codex account";
|
|
27
|
-
}
|
|
28
|
-
function tighterRemaining(account) {
|
|
29
|
-
if (!account) return null;
|
|
30
|
-
const remainings = [account.fiveHour?.remaining, account.weekly?.remaining].filter(
|
|
31
|
-
(value) => typeof value === "number"
|
|
32
|
-
);
|
|
33
|
-
return remainings.length > 0 ? Math.min(...remainings) : null;
|
|
34
|
-
}
|
|
35
|
-
function statusTone(account) {
|
|
36
|
-
if (!account) return "ok";
|
|
37
|
-
if (account.status === "needs_relogin" || account.status === "error") return "bad";
|
|
38
|
-
const remaining = tighterRemaining(account);
|
|
39
|
-
if (remaining != null && remaining <= 10) return "warn";
|
|
40
|
-
return "ok";
|
|
41
|
-
}
|
|
42
|
-
function CodexAccountIndicator({
|
|
43
|
-
workspaceId: _workspaceId,
|
|
44
|
-
sessionId,
|
|
45
|
-
model,
|
|
46
|
-
modelReady = true,
|
|
47
|
-
events
|
|
48
|
-
}) {
|
|
49
|
-
const isCodexSession = model.startsWith(CODEX_MODEL_ID_PREFIX);
|
|
50
|
-
const codex = useCodexAccounts({
|
|
51
|
-
sessionId,
|
|
52
|
-
pollIntervalMs: 3e4,
|
|
53
|
-
enabled: modelReady && isCodexSession,
|
|
54
|
-
...events !== void 0 ? { events } : {}
|
|
55
|
-
});
|
|
56
|
-
const [checkingUsage, setCheckingUsage] = useState(false);
|
|
57
|
-
const [usageChecked, setUsageChecked] = useState(false);
|
|
58
|
-
const [usageCheckFailed, setUsageCheckFailed] = useState(false);
|
|
59
|
-
const hasLiveUsage = codex.liveUsageUpdatedAt !== null;
|
|
60
|
-
const awaitingFirstUsage = checkingUsage && !hasLiveUsage;
|
|
61
|
-
if (!modelReady) {
|
|
62
|
-
return /* @__PURE__ */ jsx(Skeleton, { className: "h-6 w-11 shrink-0 rounded-full", "aria-label": "Loading Codex account" });
|
|
63
|
-
}
|
|
64
|
-
if (!isCodexSession) {
|
|
65
|
-
return null;
|
|
66
|
-
}
|
|
67
|
-
const current = codex.currentSelection;
|
|
68
|
-
const effective = (current ? codex.currentAccount : null) ?? codex.accounts.find(
|
|
69
|
-
(account) => account.id === (current ? current.credentialId : codex.pinnedAccountId)
|
|
70
|
-
) ?? null;
|
|
71
|
-
const selectionLabel = current ? current.waiting ? "Limit reached" : "Current account" : "Account selection";
|
|
72
|
-
const displayName = effective ? accountLabel(effective) : current?.credentialId ? "Account unavailable" : current && !current.waiting ? "Selecting account" : "Automatic selection";
|
|
73
|
-
const accountsPending = codex.loading && !effective;
|
|
74
|
-
if (accountsPending) {
|
|
75
|
-
return /* @__PURE__ */ jsx(Skeleton, { className: "h-6 w-11 shrink-0 rounded-full", "aria-label": "Loading Codex account" });
|
|
76
|
-
}
|
|
77
|
-
const tone = statusTone(effective);
|
|
78
|
-
const ariaLabel = `Switch Codex account \xB7 ${selectionLabel} \xB7 ${displayName}`;
|
|
79
|
-
const liveStatus = effective ? codex.liveUsage[effective.id]?.status : null;
|
|
80
|
-
const usageUnavailable = usageCheckFailed || usageChecked && !liveStatus || liveStatus === "error" || liveStatus === "no-data";
|
|
81
|
-
return /* @__PURE__ */ jsx(
|
|
82
|
-
SubscriptionAccountMenu,
|
|
83
|
-
{
|
|
84
|
-
ariaLabel,
|
|
85
|
-
triggerMark: /* @__PURE__ */ jsx(
|
|
86
|
-
BillingClassMark,
|
|
87
|
-
{
|
|
88
|
-
billingClass: "codex_subscription",
|
|
89
|
-
className: "size-3.5 text-current",
|
|
90
|
-
"aria-label": ""
|
|
91
|
-
}
|
|
92
|
-
),
|
|
93
|
-
headerMark: /* @__PURE__ */ jsx(ChatGptMark, { className: "size-4" }),
|
|
94
|
-
selectionLabel,
|
|
95
|
-
displayName,
|
|
96
|
-
metadata: [effective?.plan, effective?.status === "active" ? null : effective?.status].filter(Boolean).join(" \xB7 ") || "Codex subscription",
|
|
97
|
-
tone,
|
|
98
|
-
usage: {
|
|
99
|
-
checking: awaitingFirstUsage,
|
|
100
|
-
unavailable: usageUnavailable,
|
|
101
|
-
windows: [
|
|
102
|
-
...effective?.fiveHour ? [{ label: "5h", remaining: effective.fiveHour.remaining }] : [],
|
|
103
|
-
...effective?.weekly ? [{ label: "Week", remaining: effective.weekly.remaining }] : []
|
|
104
|
-
]
|
|
105
|
-
},
|
|
106
|
-
accounts: codex.accounts.map((account) => ({
|
|
107
|
-
id: account.id,
|
|
108
|
-
label: accountLabel(account),
|
|
109
|
-
plan: account.plan,
|
|
110
|
-
status: account.status === "active" ? null : account.status === "needs_relogin" ? "relogin" : account.status,
|
|
111
|
-
remaining: account.id !== effective?.id && !awaitingFirstUsage && !usageCheckFailed && (!usageChecked || codex.liveUsage[account.id]) && codex.liveUsage[account.id]?.status !== "error" && codex.liveUsage[account.id]?.status !== "no-data" ? tighterRemaining(account) : null
|
|
112
|
-
})),
|
|
113
|
-
selectedId: codex.pinnedAccountId,
|
|
114
|
-
automaticSelected: codex.pinnedAccountId === null,
|
|
115
|
-
choosing: codex.pinning,
|
|
116
|
-
choosingTarget: codex.pinningTarget === AUTO ? null : codex.pinningTarget ?? void 0,
|
|
117
|
-
actionLabel: current?.waiting ? "Retry with" : "Use for next turn",
|
|
118
|
-
automaticLabel: current?.waiting ? "Auto" : "Auto (workspace default)",
|
|
119
|
-
emptyMessage: codex.error ? "Accounts unavailable." : "No Codex subscriptions connected.",
|
|
120
|
-
error: codex.mutationError ? `Switch failed: ${codex.mutationError.message}` : null,
|
|
121
|
-
note: codex.switchAppliedTo === "waiting_turn" ? "Selection saved. Capacity is being rechecked." : codex.switchAppliedTo === "next_turn" ? "Selection saved for the next turn." : current?.waiting ? "Changing accounts retries the waiting turn." : "Applies next turn. The current turn keeps its account.",
|
|
122
|
-
onChoose: (id) => {
|
|
123
|
-
if (codex.pinnedAccountId === id && !current?.waiting) return;
|
|
124
|
-
void codex.pin(id ?? AUTO);
|
|
125
|
-
},
|
|
126
|
-
onOpenChange: (open) => {
|
|
127
|
-
if (!open) return;
|
|
128
|
-
setCheckingUsage(true);
|
|
129
|
-
setUsageChecked(false);
|
|
130
|
-
setUsageCheckFailed(false);
|
|
131
|
-
void codex.refreshUsage({ maxAgeMs: LIVE_USAGE_REUSE_MS }).then(
|
|
132
|
-
(ok) => {
|
|
133
|
-
setUsageChecked(ok);
|
|
134
|
-
setUsageCheckFailed(!ok);
|
|
135
|
-
setCheckingUsage(false);
|
|
136
|
-
},
|
|
137
|
-
() => {
|
|
138
|
-
setUsageCheckFailed(true);
|
|
139
|
-
setCheckingUsage(false);
|
|
140
|
-
}
|
|
141
|
-
);
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
);
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
export {
|
|
148
|
-
CodexAccountIndicator
|
|
149
|
-
};
|
|
150
|
-
//# sourceMappingURL=chunk-7H2D4VNU.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/app/components/session/codex-account-indicator.tsx"],"sourcesContent":["// Session-header Codex control: the same ChatGPT mark that identifies the Codex\n// rail doubles as the account switcher trigger (not a second icon). Menu shows\n// active subscription, status/usage, and pin switching. Host-credit: null.\nimport { useCodexAccounts } from \"../../../hooks/use-codex-accounts\";\nimport type { CodexAccount, SessionEvent } from \"@opengeni/sdk\";\nimport { useState } from \"react\";\n\nimport { BillingClassMark } from \"../billing-class-mark\";\nimport { ChatGptMark } from \"../chatgpt-mark\";\nimport { SubscriptionAccountMenu } from \"./subscription-account-menu\";\nimport { Skeleton } from \"../../../ui/skeleton\";\n\n// Canonical value: @opengeni/codex CODEX_MODEL_ID_PREFIX. Inlined to avoid a new\n// web dependency on the server-only codex package.\nconst CODEX_MODEL_ID_PREFIX = \"codex/\";\nconst AUTO = \"auto\";\n// Reopening the menu reuses live readings this recent instead of asking the\n// provider again; older ones stay on screen while the menu re-checks.\nconst LIVE_USAGE_REUSE_MS = 30_000;\n\nfunction accountLabel(account: CodexAccount | undefined | null): string {\n if (!account) return \"—\";\n return (\n account.label ?? account.email ?? account.plan ?? account.chatgptAccountId ?? \"Codex account\"\n );\n}\n\nfunction tighterRemaining(account: CodexAccount | undefined | null): number | null {\n if (!account) return null;\n const remainings = [account.fiveHour?.remaining, account.weekly?.remaining].filter(\n (value): value is number => typeof value === \"number\",\n );\n return remainings.length > 0 ? Math.min(...remainings) : null;\n}\n\nfunction statusTone(account: CodexAccount | undefined | null): \"ok\" | \"warn\" | \"bad\" {\n if (!account) return \"ok\";\n if (account.status === \"needs_relogin\" || account.status === \"error\") return \"bad\";\n const remaining = tighterRemaining(account);\n if (remaining != null && remaining <= 10) return \"warn\";\n return \"ok\";\n}\n\nexport function CodexAccountIndicator({\n workspaceId: _workspaceId,\n sessionId,\n model,\n modelReady = true,\n events,\n}: {\n workspaceId: string;\n sessionId: string;\n model: string;\n /** False while the session's admitted model identity is still loading. */\n modelReady?: boolean;\n events?: SessionEvent[];\n}) {\n const isCodexSession = model.startsWith(CODEX_MODEL_ID_PREFIX);\n const codex = useCodexAccounts({\n sessionId,\n pollIntervalMs: 30_000,\n enabled: modelReady && isCodexSession,\n ...(events !== undefined ? { events } : {}),\n });\n const [checkingUsage, setCheckingUsage] = useState(false);\n const [usageChecked, setUsageChecked] = useState(false);\n const [usageCheckFailed, setUsageCheckFailed] = useState(false);\n // Live readings from an earlier check (this menu, another session's, or\n // Settings) stay visible while a new check runs instead of flashing away.\n const hasLiveUsage = codex.liveUsageUpdatedAt !== null;\n const awaitingFirstUsage = checkingUsage && !hasLiveUsage;\n\n if (!modelReady) {\n return (\n <Skeleton className=\"h-6 w-11 shrink-0 rounded-full\" aria-label=\"Loading Codex account\" />\n );\n }\n\n if (!isCodexSession) {\n return null;\n }\n\n const current = codex.currentSelection;\n const effective =\n (current ? codex.currentAccount : null) ??\n codex.accounts.find(\n (account) => account.id === (current ? current.credentialId : codex.pinnedAccountId),\n ) ??\n null;\n const selectionLabel = current\n ? current.waiting\n ? \"Limit reached\"\n : \"Current account\"\n : \"Account selection\";\n const displayName = effective\n ? accountLabel(effective)\n : current?.credentialId\n ? \"Account unavailable\"\n : current && !current.waiting\n ? \"Selecting account\"\n : \"Automatic selection\";\n const accountsPending = codex.loading && !effective;\n if (accountsPending) {\n return (\n <Skeleton className=\"h-6 w-11 shrink-0 rounded-full\" aria-label=\"Loading Codex account\" />\n );\n }\n\n const tone = statusTone(effective);\n const ariaLabel = `Switch Codex account · ${selectionLabel} · ${displayName}`;\n const liveStatus = effective ? codex.liveUsage[effective.id]?.status : null;\n const usageUnavailable =\n usageCheckFailed ||\n (usageChecked && !liveStatus) ||\n liveStatus === \"error\" ||\n liveStatus === \"no-data\";\n\n return (\n <SubscriptionAccountMenu\n ariaLabel={ariaLabel}\n triggerMark={\n <BillingClassMark\n billingClass=\"codex_subscription\"\n className=\"size-3.5 text-current\"\n aria-label=\"\"\n />\n }\n headerMark={<ChatGptMark className=\"size-4\" />}\n selectionLabel={selectionLabel}\n displayName={displayName}\n metadata={\n [effective?.plan, effective?.status === \"active\" ? null : effective?.status]\n .filter(Boolean)\n .join(\" · \") || \"Codex subscription\"\n }\n tone={tone}\n usage={{\n checking: awaitingFirstUsage,\n unavailable: usageUnavailable,\n windows: [\n ...(effective?.fiveHour\n ? [{ label: \"5h\", remaining: effective.fiveHour.remaining }]\n : []),\n ...(effective?.weekly ? [{ label: \"Week\", remaining: effective.weekly.remaining }] : []),\n ],\n }}\n accounts={codex.accounts.map((account) => ({\n id: account.id,\n label: accountLabel(account),\n plan: account.plan,\n status:\n account.status === \"active\"\n ? null\n : account.status === \"needs_relogin\"\n ? \"relogin\"\n : account.status,\n remaining:\n account.id !== effective?.id &&\n !awaitingFirstUsage &&\n !usageCheckFailed &&\n (!usageChecked || codex.liveUsage[account.id]) &&\n codex.liveUsage[account.id]?.status !== \"error\" &&\n codex.liveUsage[account.id]?.status !== \"no-data\"\n ? tighterRemaining(account)\n : null,\n }))}\n selectedId={codex.pinnedAccountId}\n automaticSelected={codex.pinnedAccountId === null}\n choosing={codex.pinning}\n choosingTarget={codex.pinningTarget === AUTO ? null : (codex.pinningTarget ?? undefined)}\n actionLabel={current?.waiting ? \"Retry with\" : \"Use for next turn\"}\n automaticLabel={current?.waiting ? \"Auto\" : \"Auto (workspace default)\"}\n emptyMessage={codex.error ? \"Accounts unavailable.\" : \"No Codex subscriptions connected.\"}\n error={codex.mutationError ? `Switch failed: ${codex.mutationError.message}` : null}\n note={\n codex.switchAppliedTo === \"waiting_turn\"\n ? \"Selection saved. Capacity is being rechecked.\"\n : codex.switchAppliedTo === \"next_turn\"\n ? \"Selection saved for the next turn.\"\n : current?.waiting\n ? \"Changing accounts retries the waiting turn.\"\n : \"Applies next turn. The current turn keeps its account.\"\n }\n onChoose={(id) => {\n if (codex.pinnedAccountId === id && !current?.waiting) return;\n void codex.pin(id ?? AUTO);\n }}\n onOpenChange={(open) => {\n if (!open) return;\n setCheckingUsage(true);\n setUsageChecked(false);\n setUsageCheckFailed(false);\n void codex.refreshUsage({ maxAgeMs: LIVE_USAGE_REUSE_MS }).then(\n (ok) => {\n setUsageChecked(ok);\n setUsageCheckFailed(!ok);\n setCheckingUsage(false);\n },\n () => {\n setUsageCheckFailed(true);\n setCheckingUsage(false);\n },\n );\n }}\n />\n );\n}\n"],"mappings":"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","names":[]}
|