@opengeni/react 4.3.3-canary.39705388692001 → 4.3.3-canary.39745621161001

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. package/dist/app/app-state.js +4 -4
  2. package/dist/app/components/artifacts/artifact-library.js +1 -1
  3. package/dist/app/components/artifacts/inline-chat-image.js +3 -3
  4. package/dist/app/components/artifacts/retained-file-preview.js +4 -4
  5. package/dist/app/components/artifacts/site-publishing.js +2 -2
  6. package/dist/app/components/artifacts/site-settings.js +3 -3
  7. package/dist/app/components/capabilities/capability-detail-sheet.js +3 -2
  8. package/dist/app/components/capabilities/capability-logo-source.js +1 -1
  9. package/dist/app/components/capabilities/excel-addin-catalog-link.d.ts +16 -0
  10. package/dist/app/components/capabilities/excel-addin-catalog-link.js +14 -0
  11. package/dist/app/components/capabilities/session-capability-card.d.ts +2 -0
  12. package/dist/app/components/capabilities/session-capability-card.js +11 -7
  13. package/dist/app/components/capabilities/session-capability-card.js.map +1 -1
  14. package/dist/app/components/capabilities/session-github-card.js +2 -2
  15. package/dist/app/components/composer-mobile-plus-panel.js +1 -1
  16. package/dist/app/components/composer-mobile-plus.js +1 -1
  17. package/dist/app/components/pickers.js +1 -1
  18. package/dist/app/components/rail/rail-sections.js +3 -3
  19. package/dist/app/components/rail/session-header.js +1 -1
  20. package/dist/app/components/rail/session-list.js +2 -2
  21. package/dist/app/components/rail/session-shell.js +6 -6
  22. package/dist/app/components/session/banners.js +1 -1
  23. package/dist/app/components/session/editable-artifacts-workspace.js +1 -1
  24. package/dist/app/components/session/failed-session-banner.js +2 -2
  25. package/dist/app/components/session/human-input.js +5 -5
  26. package/dist/app/components/session/inspector.js +10 -10
  27. package/dist/app/components/session/message-resource-attachments.js +2 -2
  28. package/dist/app/components/session/sandbox-recovery-actions.js +2 -2
  29. package/dist/app/components/session/sandbox-switcher.js +1 -1
  30. package/dist/app/components/session/sandbox-workspace.js +8 -8
  31. package/dist/app/components/session-connectors-menu-body.js +3 -3
  32. package/dist/app/components/workspace-composer-plus.js +4 -4
  33. package/dist/app/embed/session-app.js +43 -43
  34. package/dist/app/lib/composer-connectors.js +2 -2
  35. package/dist/app/lib/events.js +3 -3
  36. package/dist/app/lib/sandbox-recovery.js +1 -1
  37. package/dist/app/routes/artifacts.js +4 -4
  38. package/dist/app/routes/retained-artifact.js +4 -4
  39. package/dist/app/routes/session.js +26 -26
  40. package/dist/app/routes/sessions-index.js +13 -13
  41. package/dist/{chunk-OSOWZBVH.js → chunk-2XKNDJFQ.js} +2 -2
  42. package/dist/{chunk-SWXAQX7F.js → chunk-3TR7UE7F.js} +15 -15
  43. package/dist/{chunk-TVY3RDPG.js → chunk-4A7F6ZIA.js} +2 -2
  44. package/dist/chunk-4A7F6ZIA.js.map +1 -0
  45. package/dist/{chunk-IGEVL3VF.js → chunk-5AQ33XU7.js} +8 -8
  46. package/dist/chunk-5N6XZ7LG.js +64 -0
  47. package/dist/chunk-5N6XZ7LG.js.map +1 -0
  48. package/dist/{chunk-H34YMXOS.js → chunk-727HM6EH.js} +3 -3
  49. package/dist/chunk-727HM6EH.js.map +1 -0
  50. package/dist/{chunk-L7WXFWBQ.js → chunk-BEBX5SPG.js} +3 -3
  51. package/dist/{chunk-GMZ3WRCP.js → chunk-BIIOGA4E.js} +1 -1
  52. package/dist/{chunk-E7CV5RO5.js → chunk-BIZJY3XQ.js} +2 -2
  53. package/dist/{chunk-REILVRCC.js → chunk-BW3M2O6S.js} +2 -2
  54. package/dist/{chunk-5R7TMFNY.js → chunk-BY3MVSZF.js} +3 -3
  55. package/dist/{chunk-REQUUREY.js → chunk-CAIHRVOI.js} +2 -2
  56. package/dist/{chunk-OFQ2BSIP.js → chunk-DKCX643S.js} +9 -6
  57. package/dist/chunk-DKCX643S.js.map +1 -0
  58. package/dist/{chunk-4ZYVRWUR.js → chunk-FRCRAX5W.js} +5 -5
  59. package/dist/{chunk-GB2TVZVD.js → chunk-FROJT2IT.js} +4 -4
  60. package/dist/{chunk-3P2J7IKF.js → chunk-GBUD3QHS.js} +2 -2
  61. package/dist/{chunk-W7YOX2ZP.js → chunk-GGEAJMJO.js} +7 -7
  62. package/dist/{chunk-NBSMIOJ7.js → chunk-KV4HHUKS.js} +3 -3
  63. package/dist/{chunk-2DWZIO7A.js → chunk-KWAOM7CR.js} +1 -1
  64. package/dist/{chunk-YNUPFA5Y.js → chunk-LAKKRMUD.js} +1 -1
  65. package/dist/{chunk-LQ4RFD5C.js → chunk-MALQ26LW.js} +3 -3
  66. package/dist/{chunk-GQETSOY4.js → chunk-QCZL6NVL.js} +2 -2
  67. package/dist/{chunk-D47LLDSU.js → chunk-S537VZWI.js} +2 -2
  68. package/dist/{chunk-64BNUN6Z.js → chunk-SMQAQNHV.js} +11 -11
  69. package/dist/{chunk-6NIMUVNY.js → chunk-SYBBQBHX.js} +2 -1
  70. package/dist/chunk-SYBBQBHX.js.map +1 -0
  71. package/dist/{chunk-QLSRJMNI.js → chunk-TJO3HF2K.js} +2 -2
  72. package/dist/{chunk-PST2KTBM.js → chunk-VDM67OLI.js} +2 -2
  73. package/dist/{chunk-OUVK5KBF.js → chunk-WEA6DDDQ.js} +24 -11
  74. package/dist/chunk-WEA6DDDQ.js.map +1 -0
  75. package/dist/{chunk-GUBAMI7Y.js → chunk-XBRJWSYP.js} +1 -1
  76. package/dist/{chunk-PHCWW2IS.js → chunk-XNWHWEPN.js} +3 -2
  77. package/dist/chunk-XNWHWEPN.js.map +1 -0
  78. package/dist/{chunk-ES4KAIWU.js → chunk-YSTIJ6RW.js} +2 -2
  79. package/dist/{chunk-UNFAQ7XF.js → chunk-ZOSVL4QR.js} +38 -38
  80. package/dist/{chunk-UZ7OOERU.js → chunk-ZZSJDBWV.js} +1 -1
  81. package/dist/{embedded-new-voice-YQ2CXQOH.js → embedded-new-voice-BYXNDZOM.js} +3 -3
  82. package/dist/{embedded-voice-SIE4XOPL.js → embedded-voice-XYL27RP4.js} +3 -3
  83. package/dist/index.js +9 -9
  84. package/dist/{latest-question-W4Y3QDUJ.js → latest-question-3PUAHH6D.js} +2 -2
  85. package/dist/realtime/session-realtime.d.ts +4 -0
  86. package/dist/realtime.js +2 -2
  87. package/dist/{sandbox-files-D5WI6EQN.js → sandbox-files-BBYYHD6M.js} +2 -2
  88. package/dist/session-app.js +43 -43
  89. package/dist/{session-realtime-RYQAJ77N.js → session-realtime-ITTPRBQU.js} +2 -2
  90. package/dist/session-realtime-ITTPRBQU.js.map +1 -0
  91. package/dist/session-realtime.js +1 -1
  92. package/dist/session-ui.js +5 -5
  93. package/dist/session.js +2 -2
  94. package/package.json +4 -4
  95. package/src/app/components/capabilities/capability-detail-sheet.tsx +3 -0
  96. package/src/app/components/capabilities/capability-logo-source.tsx +2 -0
  97. package/src/app/components/capabilities/excel-addin-catalog-link.tsx +68 -0
  98. package/src/app/components/capabilities/session-capability-card.tsx +23 -13
  99. package/src/app/components/session/sandbox-recovery-actions.tsx +1 -1
  100. package/src/app/lib/sandbox-recovery.tsx +1 -1
  101. package/src/realtime/session-realtime.ts +47 -10
  102. package/src/timeline/projection.ts +5 -2
  103. package/dist/chunk-6NIMUVNY.js.map +0 -1
  104. package/dist/chunk-H34YMXOS.js.map +0 -1
  105. package/dist/chunk-OFQ2BSIP.js.map +0 -1
  106. package/dist/chunk-OUVK5KBF.js.map +0 -1
  107. package/dist/chunk-PHCWW2IS.js.map +0 -1
  108. package/dist/chunk-TVY3RDPG.js.map +0 -1
  109. /package/dist/{embedded-new-voice-YQ2CXQOH.js.map → app/components/capabilities/excel-addin-catalog-link.js.map} +0 -0
  110. /package/dist/{chunk-OSOWZBVH.js.map → chunk-2XKNDJFQ.js.map} +0 -0
  111. /package/dist/{chunk-SWXAQX7F.js.map → chunk-3TR7UE7F.js.map} +0 -0
  112. /package/dist/{chunk-IGEVL3VF.js.map → chunk-5AQ33XU7.js.map} +0 -0
  113. /package/dist/{chunk-L7WXFWBQ.js.map → chunk-BEBX5SPG.js.map} +0 -0
  114. /package/dist/{chunk-GMZ3WRCP.js.map → chunk-BIIOGA4E.js.map} +0 -0
  115. /package/dist/{chunk-E7CV5RO5.js.map → chunk-BIZJY3XQ.js.map} +0 -0
  116. /package/dist/{chunk-REILVRCC.js.map → chunk-BW3M2O6S.js.map} +0 -0
  117. /package/dist/{chunk-5R7TMFNY.js.map → chunk-BY3MVSZF.js.map} +0 -0
  118. /package/dist/{chunk-REQUUREY.js.map → chunk-CAIHRVOI.js.map} +0 -0
  119. /package/dist/{chunk-4ZYVRWUR.js.map → chunk-FRCRAX5W.js.map} +0 -0
  120. /package/dist/{chunk-GB2TVZVD.js.map → chunk-FROJT2IT.js.map} +0 -0
  121. /package/dist/{chunk-3P2J7IKF.js.map → chunk-GBUD3QHS.js.map} +0 -0
  122. /package/dist/{chunk-W7YOX2ZP.js.map → chunk-GGEAJMJO.js.map} +0 -0
  123. /package/dist/{chunk-NBSMIOJ7.js.map → chunk-KV4HHUKS.js.map} +0 -0
  124. /package/dist/{chunk-2DWZIO7A.js.map → chunk-KWAOM7CR.js.map} +0 -0
  125. /package/dist/{chunk-YNUPFA5Y.js.map → chunk-LAKKRMUD.js.map} +0 -0
  126. /package/dist/{chunk-LQ4RFD5C.js.map → chunk-MALQ26LW.js.map} +0 -0
  127. /package/dist/{chunk-GQETSOY4.js.map → chunk-QCZL6NVL.js.map} +0 -0
  128. /package/dist/{chunk-D47LLDSU.js.map → chunk-S537VZWI.js.map} +0 -0
  129. /package/dist/{chunk-64BNUN6Z.js.map → chunk-SMQAQNHV.js.map} +0 -0
  130. /package/dist/{chunk-QLSRJMNI.js.map → chunk-TJO3HF2K.js.map} +0 -0
  131. /package/dist/{chunk-PST2KTBM.js.map → chunk-VDM67OLI.js.map} +0 -0
  132. /package/dist/{chunk-GUBAMI7Y.js.map → chunk-XBRJWSYP.js.map} +0 -0
  133. /package/dist/{chunk-ES4KAIWU.js.map → chunk-YSTIJ6RW.js.map} +0 -0
  134. /package/dist/{chunk-UNFAQ7XF.js.map → chunk-ZOSVL4QR.js.map} +0 -0
  135. /package/dist/{chunk-UZ7OOERU.js.map → chunk-ZZSJDBWV.js.map} +0 -0
  136. /package/dist/{embedded-voice-SIE4XOPL.js.map → embedded-new-voice-BYXNDZOM.js.map} +0 -0
  137. /package/dist/{sandbox-files-D5WI6EQN.js.map → embedded-voice-XYL27RP4.js.map} +0 -0
  138. /package/dist/{latest-question-W4Y3QDUJ.js.map → latest-question-3PUAHH6D.js.map} +0 -0
  139. /package/dist/{session-realtime-RYQAJ77N.js.map → sandbox-files-BBYYHD6M.js.map} +0 -0
@@ -3,7 +3,7 @@ import {
3
3
  createSlackLinkPrepareController,
4
4
  preserveSlackLinkForManagedAuth,
5
5
  useAppState
6
- } from "../chunk-W7YOX2ZP.js";
6
+ } from "../chunk-GGEAJMJO.js";
7
7
  import "../chunk-SJ3N6QU2.js";
8
8
  import "../chunk-UIZYJFLO.js";
9
9
  import "../chunk-34XTCKDJ.js";
@@ -11,22 +11,22 @@ import "../chunk-OM3NWCHG.js";
11
11
  import "../chunk-MFGKX4C3.js";
12
12
  import "../chunk-HAZE2JR3.js";
13
13
  import "../chunk-CTBP2E2T.js";
14
- import "../chunk-I7NCHCA7.js";
15
14
  import "../chunk-BXYPBZQC.js";
16
15
  import "../chunk-I3NO3MGL.js";
16
+ import "../chunk-I7NCHCA7.js";
17
17
  import "../chunk-M6EDZ3UY.js";
18
18
  import "../chunk-ANALJOJL.js";
19
19
  import "../chunk-OJSMCBDN.js";
20
- import "../chunk-3BCPHI4Q.js";
21
20
  import "../chunk-ARIV4S6T.js";
22
21
  import "../chunk-DDCEFH6T.js";
23
- import "../chunk-AQBCKNTL.js";
24
22
  import "../chunk-MXDZE5ML.js";
23
+ import "../chunk-3BCPHI4Q.js";
25
24
  import "../chunk-OXD6ET34.js";
26
25
  import "../chunk-JHZRAYI4.js";
27
26
  import "../chunk-UKZ3SGNF.js";
28
27
  import "../chunk-ALR42W4W.js";
29
28
  import "../chunk-6L7U46Y2.js";
29
+ import "../chunk-AQBCKNTL.js";
30
30
  import "../chunk-XLIJ36RG.js";
31
31
  import "../chunk-WF5EREZB.js";
32
32
  import "../chunk-L6Y4ALSM.js";
@@ -5,7 +5,7 @@ import {
5
5
  ArtifactRow,
6
6
  ArtifactThumbnail,
7
7
  siteStillDocument
8
- } from "../../../chunk-UZ7OOERU.js";
8
+ } from "../../../chunk-ZZSJDBWV.js";
9
9
  import "../../../chunk-HDHK3SXK.js";
10
10
  import "../../../chunk-4AYHOWII.js";
11
11
  import "../../../chunk-KV6VVKG5.js";
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  InlineChatImage
4
- } from "../../../chunk-PST2KTBM.js";
4
+ } from "../../../chunk-VDM67OLI.js";
5
5
  import "../../../chunk-6D35DJUK.js";
6
6
  import "../../../chunk-XULIHS2E.js";
7
7
  import "../../../chunk-JRDWJQHK.js";
@@ -14,11 +14,11 @@ import "../../../chunk-MYNUBDU7.js";
14
14
  import "../../../chunk-IZUAIHR4.js";
15
15
  import "../../../chunk-W6KAUGXO.js";
16
16
  import "../../../chunk-HMU5IELG.js";
17
- import "../../../chunk-REQUUREY.js";
17
+ import "../../../chunk-CAIHRVOI.js";
18
18
  import "../../../chunk-B27E3V37.js";
19
19
  import "../../../chunk-XFB5OK4W.js";
20
20
  import "../../../chunk-UD2PSIIX.js";
21
- import "../../../chunk-PHCWW2IS.js";
21
+ import "../../../chunk-XNWHWEPN.js";
22
22
  import "../../../chunk-IGVL3ELX.js";
23
23
  import "../../../chunk-WPWC4XUZ.js";
24
24
  import "../../../chunk-OYQQJL3J.js";
@@ -3,8 +3,8 @@ import {
3
3
  InlineChatArtifact,
4
4
  RetainedFilePreview,
5
5
  retainedPreviewKind
6
- } from "../../../chunk-L7WXFWBQ.js";
7
- import "../../../chunk-PST2KTBM.js";
6
+ } from "../../../chunk-BEBX5SPG.js";
7
+ import "../../../chunk-VDM67OLI.js";
8
8
  import "../../../chunk-6D35DJUK.js";
9
9
  import "../../../chunk-WRB2GNXO.js";
10
10
  import "../../../chunk-FBE6AIIW.js";
@@ -25,11 +25,11 @@ import "../../../chunk-IZUAIHR4.js";
25
25
  import "../../../chunk-L4OF77LE.js";
26
26
  import "../../../chunk-W6KAUGXO.js";
27
27
  import "../../../chunk-HMU5IELG.js";
28
- import "../../../chunk-REQUUREY.js";
28
+ import "../../../chunk-CAIHRVOI.js";
29
29
  import "../../../chunk-B27E3V37.js";
30
30
  import "../../../chunk-XFB5OK4W.js";
31
31
  import "../../../chunk-UD2PSIIX.js";
32
- import "../../../chunk-PHCWW2IS.js";
32
+ import "../../../chunk-XNWHWEPN.js";
33
33
  import "../../../chunk-IGVL3ELX.js";
34
34
  import "../../../chunk-WPWC4XUZ.js";
35
35
  import "../../../chunk-OYQQJL3J.js";
@@ -4,7 +4,7 @@ import {
4
4
  SitePublishPage,
5
5
  sitePublicationHeader,
6
6
  useSitePublication
7
- } from "../../../chunk-QLSRJMNI.js";
7
+ } from "../../../chunk-TJO3HF2K.js";
8
8
  import "../../../chunk-XBXTG35J.js";
9
9
  import "../../../chunk-FCRIDEWQ.js";
10
10
  import "../../../chunk-XF7FEE4H.js";
@@ -23,7 +23,7 @@ import "../../../chunk-MBYVEZOH.js";
23
23
  import "../../../chunk-6N2P6QEH.js";
24
24
  import "../../../chunk-PYSONAMV.js";
25
25
  import "../../../chunk-GVK3MCHP.js";
26
- import "../../../chunk-GMZ3WRCP.js";
26
+ import "../../../chunk-BIIOGA4E.js";
27
27
  import "../../../chunk-4NTPH5M6.js";
28
28
  import "../../../chunk-5CLFYV7L.js";
29
29
  import "../../../chunk-Z63GB7JI.js";
@@ -3,8 +3,8 @@ import {
3
3
  SiteSettings,
4
4
  hasSiteSettings,
5
5
  useSiteManagement
6
- } from "../../../chunk-REILVRCC.js";
7
- import "../../../chunk-QLSRJMNI.js";
6
+ } from "../../../chunk-BW3M2O6S.js";
7
+ import "../../../chunk-TJO3HF2K.js";
8
8
  import "../../../chunk-XBXTG35J.js";
9
9
  import "../../../chunk-FCRIDEWQ.js";
10
10
  import "../../../chunk-XF7FEE4H.js";
@@ -29,7 +29,7 @@ import "../../../chunk-7NLCCKNJ.js";
29
29
  import "../../../chunk-I7W36FPY.js";
30
30
  import "../../../chunk-PYSONAMV.js";
31
31
  import "../../../chunk-GVK3MCHP.js";
32
- import "../../../chunk-GMZ3WRCP.js";
32
+ import "../../../chunk-BIIOGA4E.js";
33
33
  import "../../../chunk-4NTPH5M6.js";
34
34
  import "../../../chunk-5CLFYV7L.js";
35
35
  import "../../../chunk-Z63GB7JI.js";
@@ -6,15 +6,16 @@ import {
6
6
  DetailBody,
7
7
  FikenConnectorControls,
8
8
  SocialConnectorControls
9
- } from "../../../chunk-OFQ2BSIP.js";
9
+ } from "../../../chunk-DKCX643S.js";
10
+ import "../../../chunk-C535KSTY.js";
10
11
  import "../../../chunk-Y6TTMPZC.js";
11
12
  import "../../../chunk-VHDCIO4V.js";
12
13
  import "../../../chunk-V3RHG7CF.js";
13
- import "../../../chunk-C535KSTY.js";
14
14
  import {
15
15
  OwnershipSelector
16
16
  } from "../../../chunk-FIPSOCVC.js";
17
17
  import "../../../chunk-IYEI5OZL.js";
18
+ import "../../../chunk-5N6XZ7LG.js";
18
19
  import "../../../chunk-MKG5VTIJ.js";
19
20
  import "../../../chunk-LEDS7L3I.js";
20
21
  import "../../../chunk-TFK4KFKA.js";
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  FIRST_PARTY_CAPABILITY_LOGOS,
4
4
  capabilityLogoSource
5
- } from "../../../chunk-6NIMUVNY.js";
5
+ } from "../../../chunk-SYBBQBHX.js";
6
6
  import "../../../chunk-MP2WYEFV.js";
7
7
  import "../../../chunk-M357MHH3.js";
8
8
  import "../../../chunk-CQJ6VJAM.js";
@@ -0,0 +1,16 @@
1
+ import type { CapabilityCatalogItem } from "../../types.js";
2
+ /** The add-in's name and install page, as the API projected them onto its tile. */
3
+ export declare function excelAddinDetails(item: Pick<CapabilityCatalogItem, "metadata">): {
4
+ name: string;
5
+ installUrl: string | null;
6
+ };
7
+ /** Opens the add-in's install-and-connect page; the add-in lives in each person's own Excel. */
8
+ export declare function ExcelAddinCatalogLink({ item, preserveChat, }: {
9
+ item: Pick<CapabilityCatalogItem, "metadata">;
10
+ preserveChat?: boolean | undefined;
11
+ }): import("react").JSX.Element | null;
12
+ /** What the add-in does and the three steps to start using it. */
13
+ export declare function ExcelAddinSetupSteps({ item, preserveChat, }: {
14
+ item: Pick<CapabilityCatalogItem, "metadata">;
15
+ preserveChat?: boolean | undefined;
16
+ }): import("react").JSX.Element;
@@ -0,0 +1,14 @@
1
+ "use client";
2
+ import {
3
+ ExcelAddinCatalogLink,
4
+ ExcelAddinSetupSteps,
5
+ excelAddinDetails
6
+ } from "../../../chunk-5N6XZ7LG.js";
7
+ import "../../../chunk-HMU5IELG.js";
8
+ import "../../../chunk-TXS65BB2.js";
9
+ export {
10
+ ExcelAddinCatalogLink,
11
+ ExcelAddinSetupSteps,
12
+ excelAddinDetails
13
+ };
14
+ //# sourceMappingURL=excel-addin-catalog-link.js.map
@@ -3,6 +3,8 @@ import type { ResourceRef } from "../../types.js";
3
3
  import type { ChatSendContext } from "./session-github-repositories.js";
4
4
  /** The built-in card for connecting a person's own computer to this chat. */
5
5
  export declare const CONNECTED_MACHINE_CAPABILITY_ID = "api:connected-machine";
6
+ /** The built-in tile and card that install the deployment's Excel add-in. */
7
+ export declare const EXCEL_ADDIN_CAPABILITY_ID = "api:excel-addin";
6
8
  /** Recommendations carry identity and rationale, never connection configuration.
7
9
  * Expand against the current authenticated catalog before rendering any form. */
8
10
  type SessionCapabilityCardProps = {
@@ -4,14 +4,14 @@ import {
4
4
  } from "../../../chunk-7PCGGC7L.js";
5
5
  import {
6
6
  DetailBody
7
- } from "../../../chunk-OFQ2BSIP.js";
7
+ } from "../../../chunk-DKCX643S.js";
8
+ import "../../../chunk-C535KSTY.js";
8
9
  import "../../../chunk-Y6TTMPZC.js";
9
10
  import "../../../chunk-VHDCIO4V.js";
10
11
  import {
11
12
  useCapabilitiesCatalog
12
13
  } from "../../../chunk-KHPOKZ6Z.js";
13
14
  import "../../../chunk-V3RHG7CF.js";
14
- import "../../../chunk-C535KSTY.js";
15
15
  import "../../../chunk-SFHBQ3G4.js";
16
16
  import "../../../chunk-AF53CDFM.js";
17
17
  import {
@@ -24,9 +24,10 @@ import {
24
24
  import "../../../chunk-DKCNTTM2.js";
25
25
  import {
26
26
  SessionGitHubCapabilityCard
27
- } from "../../../chunk-OSOWZBVH.js";
27
+ } from "../../../chunk-2XKNDJFQ.js";
28
28
  import "../../../chunk-MOMM26UR.js";
29
29
  import "../../../chunk-IYEI5OZL.js";
30
+ import "../../../chunk-5N6XZ7LG.js";
30
31
  import "../../../chunk-M27WO6W3.js";
31
32
  import "../../../chunk-MKG5VTIJ.js";
32
33
  import "../../../chunk-46I7MMAL.js";
@@ -51,7 +52,7 @@ import "../../../chunk-ZHNJW2A3.js";
51
52
  import "../../../chunk-HUKUDAIP.js";
52
53
  import {
53
54
  capabilityLogoSource
54
- } from "../../../chunk-6NIMUVNY.js";
55
+ } from "../../../chunk-SYBBQBHX.js";
55
56
  import {
56
57
  capabilityConnectPlan,
57
58
  capabilityErrorToast,
@@ -154,6 +155,7 @@ import { Suspense, useCallback, useEffect, useMemo, useRef, useState } from "rea
154
155
  import { CheckIcon, Loader2Icon } from "lucide-react";
155
156
  import { jsx, jsxs } from "react/jsx-runtime";
156
157
  var CONNECTED_MACHINE_CAPABILITY_ID = "api:connected-machine";
158
+ var EXCEL_ADDIN_CAPABILITY_ID = "api:excel-addin";
157
159
  function SessionCapabilityCard(props) {
158
160
  const page = usePage();
159
161
  const context = useAppContext();
@@ -268,6 +270,7 @@ function ScopedSessionCapabilityCard({
268
270
  setExpanded(false);
269
271
  };
270
272
  const skill = recommendation.kind === "skill";
273
+ const excel = recommendation.id === EXCEL_ADDIN_CAPABILITY_ID;
271
274
  const apiKey = catalogItem ? capabilityConnectPlan(catalogItem).mode === "api_key" : false;
272
275
  return /* @__PURE__ */ jsx(
273
276
  SessionCapabilityFrame,
@@ -275,13 +278,13 @@ function ScopedSessionCapabilityCard({
275
278
  name: catalogItem?.name ?? recommendation.name,
276
279
  subtitle: catalogItem ? catalogItem.providerDomain ?? "" : item.providerDomain,
277
280
  logo,
278
- typeLabel: skill ? "Skill" : recommendation.kind === "mcp" ? "MCP server" : "API",
281
+ typeLabel: skill ? "Skill" : excel ? "Add-in" : recommendation.kind === "mcp" ? "MCP server" : "API",
279
282
  description: catalogItem?.description || recommendation.rationale,
280
283
  skill,
281
284
  expanded,
282
285
  complete,
283
- actionLabel: catalogItem?.enabled ? "Review" : skill ? "Review skill" : apiKey ? "Add API key" : `Connect ${catalogItem?.name ?? recommendation.name}`,
284
- note: skill ? "Skill content is reviewed separately from permission to use any integration." : apiKey ? "Add credentials in the protected form, not in a chat message." : "Review access before signing in. You'll return to this conversation after authorization.",
286
+ actionLabel: excel ? "Add to Excel" : catalogItem?.enabled ? "Review" : skill ? "Review skill" : apiKey ? "Add API key" : `Connect ${catalogItem?.name ?? recommendation.name}`,
287
+ note: excel ? "The add-in runs in your own Excel. Agents reach a workbook only while you have the add-in open in it." : skill ? "Skill content is reviewed separately from permission to use any integration." : apiKey ? "Add credentials in the protected form, not in a chat message." : "Review access before signing in. You'll return to this conversation after authorization.",
285
288
  onOpen: () => setExpanded(true),
286
289
  onClose: close,
287
290
  busy,
@@ -679,6 +682,7 @@ function SessionCodexAppsSetup({
679
682
  }
680
683
  export {
681
684
  CONNECTED_MACHINE_CAPABILITY_ID,
685
+ EXCEL_ADDIN_CAPABILITY_ID,
682
686
  SessionCapabilityCard
683
687
  };
684
688
  //# sourceMappingURL=session-capability-card.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/app/components/capabilities/session-capability-card.tsx"],"sourcesContent":["import { t } from \"../../lib/console-text\";\nimport {\n attachSessionCapability,\n prepareSessionCapabilityAccess,\n applySessionCapabilityAccess,\n type SessionCapabilityAccessPlan,\n} from \"./attach-session-capability\";\nimport { Suspense, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { SessionMcpCapabilityCard } from \"../../../components/session-mcp-capability-card\";\nimport type { AuthNeededItem } from \"../../../timeline\";\nimport { CheckIcon, Loader2Icon } from \"lucide-react\";\nimport { useAppContext } from \"../../app-context\";\nimport { CodexSubscriptionsSurface } from \"../../lib/app-surfaces\";\nimport { Button } from \"../../../ui/button\";\nimport { Notice } from \"../../../ui/notice\";\nimport { SessionCapabilityFrame } from \"../../../components/session-capability-frame\";\nimport { capabilityLogoSource } from \"./capability-logo-source\";\nimport { DetailBody, type ConnectAction } from \"./capability-detail-sheet\";\nimport { performCapabilityAction } from \"./perform-capability-action\";\nimport { useCapabilitiesCatalog } from \"./use-capabilities-catalog\";\nimport { SessionCustomMcpCard } from \"./session-custom-mcp-card\";\nimport {\n capabilityConnectPlan,\n capabilityErrorToast,\n connectionHealth,\n} from \"../../lib/capabilities\";\nimport { userErrorText } from \"../../../ui/api-error\";\nimport { hasWorkspacePermission } from \"../../lib/permissions\";\nimport type { CapabilityCatalogItem, ResourceRef } from \"../../types\";\nimport type { ChatSendContext } from \"./session-github-repositories\";\nimport { SessionGitHubCapabilityCard } from \"./session-github-card\";\nimport { SessionMachineCapabilityCard } from \"./session-machine-card\";\nimport { usePage } from \"../../lib/navigation\";\n\n/** The built-in card for connecting a person's own computer to this chat. */\nexport const CONNECTED_MACHINE_CAPABILITY_ID = \"api:connected-machine\";\n\n/** Recommendations carry identity and rationale, never connection configuration.\n * Expand against the current authenticated catalog before rendering any form. */\ntype SessionCapabilityCardProps = {\n visibility?: \"private\" | \"workspace\" | undefined;\n onConfigured?: (() => Promise<void>) | undefined;\n item: AuthNeededItem;\n workspaceId: string;\n sessionId: string;\n /** The chat's mounted resources, for cards that add a resource to this chat. */\n resources?: readonly ResourceRef[] | undefined;\n /** What a composer Send would carry now, for cards that send a human message. */\n sendContext?: (() => ChatSendContext) | undefined;\n};\n\nexport function SessionCapabilityCard(props: SessionCapabilityCardProps) {\n const page = usePage();\n const context = useAppContext();\n const [registered, setRegistered] = useState<{ id: string; restoreFocus: boolean } | null>(null);\n const onRegistered = useCallback(\n (id: string, restoreFocus: boolean) => setRegistered({ id, restoreFocus }),\n [],\n );\n if (props.item.setupRequest && !registered) {\n return (\n <SessionCustomMcpCard\n key={`${props.workspaceId}:${props.item.id}`}\n item={props.item}\n workspaceId={props.workspaceId}\n sessionId={props.sessionId}\n onConfigured={props.onConfigured}\n onRegistered={onRegistered}\n />\n );\n }\n const item = registered\n ? {\n ...props.item,\n setupRequest: null,\n capability: {\n id: registered.id,\n name: props.item.setupRequest!.name,\n kind: \"mcp\" as const,\n source: \"manual\" as const,\n action: \"connect\" as const,\n rationale: props.item.setupRequest!.rationale,\n requiredVariables: [],\n },\n }\n : props.item;\n const capability = item.capability;\n if (capability?.id === CONNECTED_MACHINE_CAPABILITY_ID) {\n return (\n <SessionMachineCapabilityCard\n key={`${props.workspaceId}:${props.sessionId}`}\n item={item}\n workspaceId={props.workspaceId}\n sessionId={props.sessionId}\n sendContext={props.sendContext}\n onConfigured={props.onConfigured}\n />\n );\n }\n if (capability?.id === \"api:github-app\") {\n return (\n <SessionGitHubCapabilityCard\n key={`${props.workspaceId}:${props.sessionId}`}\n item={item}\n workspaceId={props.workspaceId}\n sessionId={props.sessionId}\n resources={props.resources}\n sendContext={props.sendContext}\n onConfigured={props.onConfigured}\n />\n );\n }\n const resolved = context.workspaceCapabilityCatalog.find((entry) => entry.id === capability?.id);\n if (capability && resolved?.kind === \"mcp\" && resolved.authKind === \"oauth2\") {\n return (\n <SessionMcpCapabilityCard\n client={context.client}\n workspaceId={props.workspaceId}\n sessionId={props.sessionId}\n capabilityId={capability.id}\n name={capability.name}\n rationale={capability.rationale}\n returnUrl={page.href()}\n onConfigured={props.onConfigured}\n />\n );\n }\n return (\n <ScopedSessionCapabilityCard\n key={`${props.workspaceId}:${props.sessionId}:${capability!.id}`}\n {...props}\n item={item}\n restoreFocus={registered?.restoreFocus ?? false}\n />\n );\n}\n\nfunction ScopedSessionCapabilityCard({\n item,\n workspaceId,\n sessionId,\n onConfigured,\n restoreFocus = false,\n}: SessionCapabilityCardProps & { restoreFocus?: boolean | undefined }) {\n const context = useAppContext();\n const recommendation = item.capability!;\n const [expanded, setExpanded] = useState(false);\n const [complete, setComplete] = useState(false);\n const [busy, setBusy] = useState(false);\n const [resolvedItem, setResolvedItem] = useState<CapabilityCatalogItem | null>(null);\n const opener = useRef<HTMLButtonElement>(null);\n const cardRef = useRef<HTMLElement>(null);\n useEffect(() => {\n if (!restoreFocus) return;\n // The review dialog's opener is removed when the new connection card\n // replaces it. Focus the next actionable control after Radix closes it.\n const frame = requestAnimationFrame(() => opener.current?.focus());\n return () => cancelAnimationFrame(frame);\n }, [restoreFocus]);\n const catalogItem =\n resolvedItem ??\n context.workspaceCapabilityCatalog.find((entry) => entry.id === recommendation.id);\n const logo = catalogItem\n ? capabilityLogoSource(catalogItem, (path) => context.client.catalogAssetUrl(path))\n : null;\n const close = () => {\n setExpanded(false);\n };\n const skill = recommendation.kind === \"skill\";\n const apiKey = catalogItem ? capabilityConnectPlan(catalogItem).mode === \"api_key\" : false;\n return (\n <SessionCapabilityFrame\n name={catalogItem?.name ?? recommendation.name}\n subtitle={catalogItem ? (catalogItem.providerDomain ?? \"\") : item.providerDomain}\n logo={logo}\n typeLabel={skill ? \"Skill\" : recommendation.kind === \"mcp\" ? \"MCP server\" : \"API\"}\n description={catalogItem?.description || recommendation.rationale}\n skill={skill}\n expanded={expanded}\n complete={complete}\n actionLabel={\n catalogItem?.enabled\n ? \"Review\"\n : skill\n ? \"Review skill\"\n : apiKey\n ? \"Add API key\"\n : `Connect ${catalogItem?.name ?? recommendation.name}`\n }\n note={\n skill\n ? \"Skill content is reviewed separately from permission to use any integration.\"\n : apiKey\n ? \"Add credentials in the protected form, not in a chat message.\"\n : \"Review access before signing in. You'll return to this conversation after authorization.\"\n }\n onOpen={() => setExpanded(true)}\n onClose={close}\n busy={busy}\n opener={opener}\n cardRef={cardRef}\n >\n {recommendation.id === \"mcp:codex_apps\" ? (\n <SessionCodexAppsSetup\n busy={busy}\n setBusy={setBusy}\n workspaceId={workspaceId}\n sessionId={sessionId}\n onClose={close}\n onComplete={() => {\n setComplete(true);\n close();\n }}\n />\n ) : (\n <SessionCapabilitySetup\n busy={busy}\n setBusy={setBusy}\n key={`${workspaceId}:${sessionId}:${recommendation.id}`}\n capabilityId={recommendation.id}\n onResolvedItem={setResolvedItem}\n onConfigured={onConfigured}\n workspaceId={workspaceId}\n sessionId={sessionId}\n onClose={close}\n onComplete={() => {\n setComplete(true);\n close();\n }}\n />\n )}\n </SessionCapabilityFrame>\n );\n}\n\nfunction SessionCapabilitySetup({\n busy,\n setBusy,\n capabilityId,\n onResolvedItem,\n onConfigured,\n workspaceId,\n sessionId,\n onClose,\n onComplete,\n}: {\n busy: boolean;\n setBusy: (busy: boolean) => void;\n capabilityId: string;\n onResolvedItem: (item: CapabilityCatalogItem) => void;\n onConfigured?: (() => Promise<void>) | undefined;\n workspaceId: string;\n sessionId: string;\n onClose: () => void;\n onComplete: () => void;\n}) {\n const page = usePage();\n const context = useAppContext();\n const catalog = useCapabilitiesCatalog(workspaceId);\n const canReadConnections =\n context.accessContext === null\n ? null\n : hasWorkspacePermission(context.accessContext, workspaceId, \"connections:read\");\n const [error, setError] = useState<string | null>(null);\n const subjectId = context.accessContext?.subjectId ?? null;\n const [parentAccessReview, setParentAccessReview] = useState<{\n plan: SessionCapabilityAccessPlan;\n invocation: object;\n } | null>(null);\n const [authInspection, setAuthInspection] = useState<{\n id: string;\n url: string;\n kind: \"oauth2\" | \"none\" | \"unknown\";\n message?: string | undefined;\n } | null>(null);\n const [authInspectionRevision, setAuthInspectionRevision] = useState(0);\n const inFlight = useRef<object | null>(null);\n const scope = useRef({\n client: context.client,\n workspaceId,\n sessionId,\n canReadConnections,\n subjectId,\n authorityKey: catalog.authorityKey,\n alive: true,\n });\n if (\n scope.current.client !== context.client ||\n scope.current.workspaceId !== workspaceId ||\n scope.current.sessionId !== sessionId ||\n scope.current.canReadConnections !== canReadConnections ||\n scope.current.subjectId !== subjectId ||\n scope.current.authorityKey !== catalog.authorityKey\n ) {\n scope.current = {\n client: context.client,\n workspaceId,\n sessionId,\n canReadConnections,\n subjectId,\n authorityKey: catalog.authorityKey,\n alive: true,\n };\n }\n const parentAccessPlan =\n parentAccessReview?.invocation === scope.current ? parentAccessReview.plan : null;\n useEffect(() => {\n // StrictMode replays setup after cleanup. Give the replay a new owner:\n // reusing the retired object would either keep it dead or revive old work.\n if (!scope.current.alive) scope.current = { ...scope.current, alive: true };\n const activeScope = scope.current;\n setParentAccessReview(null);\n setBusy(false);\n void catalog.refresh();\n return () => {\n activeScope.alive = false;\n };\n // Refetch on a live read-grant change; the hook masks prior rows during render.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n context.client,\n workspaceId,\n sessionId,\n canReadConnections,\n subjectId,\n catalog.authorityKey,\n setBusy,\n ]);\n const rawItem = catalog.items.find((entry) => entry.id === capabilityId);\n const rawItemId = rawItem?.id;\n const inspectUrl = rawItem?.mcpUrl ?? rawItem?.endpointUrl;\n const needsAuthInspection =\n rawItem?.kind === \"mcp\" &&\n !rawItem.enabled &&\n capabilityConnectPlan(rawItem).mode === \"setup_required\" &&\n Boolean(inspectUrl);\n useEffect(() => {\n if (!needsAuthInspection || !rawItemId || !inspectUrl) return;\n let active = true;\n setAuthInspection(null);\n void context.client.inspectMcpAuthentication(workspaceId, inspectUrl).then(\n (result) => {\n if (active) setAuthInspection({ id: rawItemId, url: inspectUrl, ...result });\n },\n () => {\n if (active) setAuthInspection({ id: rawItemId, url: inspectUrl, kind: \"unknown\" });\n },\n );\n return () => {\n active = false;\n };\n }, [\n context.client,\n workspaceId,\n rawItemId,\n inspectUrl,\n needsAuthInspection,\n authInspectionRevision,\n ]);\n const item = useMemo(() => {\n if (!rawItem || !needsAuthInspection) return rawItem;\n const inspection =\n authInspection?.id === rawItem.id && authInspection.url === inspectUrl\n ? authInspection.kind\n : \"checking\";\n return {\n ...rawItem,\n authKind:\n inspection === \"oauth2\"\n ? (\"oauth2\" as const)\n : inspection === \"none\"\n ? (\"none\" as const)\n : null,\n metadata: {\n ...rawItem.metadata,\n authDiscovery: inspection,\n authDiscoveryMessage: inspection === \"unknown\" ? authInspection?.message : undefined,\n },\n };\n }, [rawItem, needsAuthInspection, inspectUrl, authInspection]);\n useEffect(() => {\n if (item) onResolvedItem(item);\n }, [item, onResolvedItem]);\n const refreshRuntime = useCallback(() => {\n void context.refreshWorkspaceMcpServers(workspaceId);\n }, [context, workspaceId]);\n async function act(action: ConnectAction) {\n if (!item) return;\n const invocation = scope.current;\n if (inFlight.current === invocation) return;\n inFlight.current = invocation;\n setBusy(true);\n setError(null);\n setParentAccessReview(null);\n const current = () => scope.current === invocation && invocation.alive;\n try {\n await performCapabilityAction(\n {\n client: context.client,\n workspaceId,\n item,\n connections: catalog.connectionsLoadFailed ? null : catalog.connections,\n canManageSkills: hasWorkspacePermission(\n context.accessContext,\n workspaceId,\n \"capabilities:manage\",\n ),\n refresh: catalog.refresh,\n onRuntimeChanged: () => {\n if (current()) refreshRuntime();\n },\n onComplete: async () => {\n if (!current()) return;\n const updated = (await context.client.listCapabilities(workspaceId)).items.find(\n (entry) => entry.id === item.id,\n );\n if (!current()) return;\n if (!updated?.enabled)\n throw new Error(\"Setup could not be verified. Refresh and try again.\");\n const plan = await prepareSessionCapabilityAccess(\n t,\n context.client,\n workspaceId,\n sessionId,\n updated,\n current,\n );\n if (!current()) return;\n if (plan.sessions.some((chat) => chat.id !== sessionId && chat.request)) {\n setParentAccessReview({ plan, invocation });\n return;\n }\n await applySessionCapabilityAccess(t, context.client, plan, current);\n await onConfigured?.();\n if (current()) onComplete();\n },\n onSkillRemoval: () => {\n throw new Error(\n \"Use the workspace Skill controls to review removal and its other owners.\",\n );\n },\n returnPathFor: (id) =>\n `/workspaces/${encodeURIComponent(workspaceId)}/sessions/${encodeURIComponent(sessionId)}?capability_auth=${encodeURIComponent(id)}`,\n redirect: (url) => {\n if (current()) page.assign(url);\n },\n },\n action,\n );\n } catch (failure) {\n // A credential may have committed before enabling failed. Reconcile before\n // offering Retry so it reuses that row instead of minting a duplicate.\n if (current()) await catalog.refresh();\n if (current()) setError(capabilityErrorToast(failure, \"Couldn't complete setup\").description);\n } finally {\n if (inFlight.current === invocation) inFlight.current = null;\n if (current()) setBusy(false);\n }\n }\n async function useConnected() {\n if (!item) return;\n const invocation = scope.current;\n if (inFlight.current === invocation) return;\n inFlight.current = invocation;\n setBusy(true);\n setError(null);\n const current = () => scope.current === invocation && invocation.alive;\n try {\n const plan =\n parentAccessPlan ??\n (await prepareSessionCapabilityAccess(\n t,\n context.client,\n workspaceId,\n sessionId,\n item,\n current,\n ));\n if (!current()) return;\n if (\n !parentAccessPlan &&\n plan.sessions.some((chat) => chat.id !== sessionId && chat.request)\n ) {\n setParentAccessReview({ plan, invocation });\n return;\n }\n await applySessionCapabilityAccess(t, context.client, plan, current);\n if (current()) setParentAccessReview(null);\n if (current()) await onConfigured?.();\n if (current()) onComplete();\n } catch (failure) {\n if (current()) {\n setParentAccessReview(null);\n setError(`Couldn't add this connection. ${userErrorText(failure, \"Try again.\")}`);\n }\n } finally {\n if (inFlight.current === invocation) inFlight.current = null;\n if (current()) setBusy(false);\n }\n }\n const ownsActionRow =\n !catalog.loadError && item && !item.enabled && (item.kind === \"skill\" || item.kind === \"mcp\");\n const health = item\n ? connectionHealth(item, catalog.connections ?? [], catalog.connections !== null)\n : null;\n return (\n <div className=\"p-6 sm:p-8\">\n {catalog.loading && !item ? (\n <p role=\"status\" className=\"flex items-center gap-2 text-sm text-fg-muted\">\n <Loader2Icon className=\"size-4 animate-spin\" />\n Loading connection details…\n </p>\n ) : catalog.loadError || !item ? (\n <Notice\n tone=\"failed\"\n action={\n <Button size=\"sm\" onClick={() => void catalog.refresh()}>\n Retry\n </Button>\n }\n >\n {catalog.loadError\n ? \"Couldn't load the integration catalog.\"\n : \"This recommendation is no longer in the current catalog.\"}\n </Notice>\n ) : (\n <DetailBody\n workspaceId={workspaceId}\n setupOnly\n showIdentity={false}\n onCancel={ownsActionRow ? onClose : undefined}\n item={item}\n health={connectionHealth(item, catalog.connections ?? [], catalog.connections !== null)}\n logoSrc={capabilityLogoSource(item, (path) => context.client.catalogAssetUrl(path))}\n busy={busy}\n errorMessage={error}\n socialConnections={catalog.socialConnections}\n canManageSocial={hasWorkspacePermission(\n context.accessContext,\n workspaceId,\n \"connections:write\",\n )}\n canManageSkills={hasWorkspacePermission(\n context.accessContext,\n workspaceId,\n \"capabilities:manage\",\n )}\n onAction={(action) => void act(action)}\n onRetryAuthInspection={\n needsAuthInspection\n ? () => {\n setAuthInspection(null);\n setAuthInspectionRevision((revision) => revision + 1);\n }\n : undefined\n }\n />\n )}\n {parentAccessPlan && item ? (\n <Notice tone=\"waiting\" live=\"polite\">\n <p>\n This chat inherits its tool access from its parent. To add {item.name}, enable its tools\n in these parent chats first:\n </p>\n <ul className=\"mt-2 list-disc pl-5\">\n {parentAccessPlan.sessions\n .filter((chat) => chat.id !== sessionId && chat.request)\n .map((chat) => (\n <li key={chat.id}>\n <a\n className=\"underline\"\n href={`/workspaces/${encodeURIComponent(workspaceId)}/sessions/${encodeURIComponent(chat.id)}`}\n >\n {chat.title || \"Parent chat\"}\n </a>\n </li>\n ))}\n </ul>\n <p className=\"mt-2\">\n Confirming adds {item.name}'s tools to these chats and this chat. Parent chats and\n future children can then use them. Existing tool choices are preserved; workspace\n defaults become chat-specific selections where needed. Current turns keep their accepted\n access.\n </p>\n <p className=\"mt-2\">\n Updates are saved separately. If a later update fails, approved parent changes may\n already be saved.\n </p>\n </Notice>\n ) : null}\n <div className=\"mt-2 flex justify-end gap-2\">\n {!ownsActionRow ? (\n <Button size=\"sm\" variant=\"ghost\" disabled={busy} onClick={onClose}>\n Cancel\n </Button>\n ) : null}\n {item?.enabled && health?.state !== \"attention\" && health?.state !== \"unverified\" ? (\n <Button size=\"sm\" disabled={busy} onClick={() => void useConnected()}>\n {busy ? <Loader2Icon className=\"animate-spin\" /> : <CheckIcon />}\n {parentAccessPlan ? \"Enable in parents and add tools\" : \"Add tools\"}\n </Button>\n ) : null}\n </div>\n </div>\n );\n}\n\nfunction SessionCodexAppsSetup({\n busy,\n setBusy,\n workspaceId,\n sessionId,\n onClose,\n onComplete,\n}: {\n busy: boolean;\n setBusy: (busy: boolean) => void;\n workspaceId: string;\n sessionId: string;\n onClose: () => void;\n onComplete: () => void;\n}) {\n const context = useAppContext();\n const [error, setError] = useState<string | null>(null);\n const inFlight = useRef(false);\n const active = useRef(true);\n useEffect(\n () => () => {\n active.current = false;\n },\n [],\n );\n async function useApps() {\n if (inFlight.current) return;\n inFlight.current = true;\n setBusy(true);\n setError(null);\n try {\n const catalog = await context.client.listCapabilities(workspaceId);\n const item = catalog.items.find((entry) => entry.id === \"mcp:codex_apps\");\n if (!active.current) return;\n if (!item?.enabled || !item.runtime.available)\n throw new Error(\"Choose an active subscription for Codex Apps before continuing.\");\n await attachSessionCapability(\n t,\n context.client,\n workspaceId,\n sessionId,\n item,\n () => active.current,\n );\n await context.refreshWorkspaceMcpServers(workspaceId);\n if (active.current) onComplete();\n } catch (failure) {\n if (active.current)\n setError(\n `Couldn't enable Apps in this conversation. ${userErrorText(failure, \"Try again.\")}`,\n );\n } finally {\n inFlight.current = false;\n if (active.current) setBusy(false);\n }\n }\n return (\n <div className=\"p-6 sm:p-8\">\n <Suspense fallback={<p role=\"status\">Loading connection controls…</p>}>\n <CodexSubscriptionsSurface\n workspaceId={workspaceId}\n canManage={hasWorkspacePermission(\n context.accessContext,\n workspaceId,\n \"connections:write\",\n )}\n />\n </Suspense>\n {error ? <Notice tone=\"failed\">{error}</Notice> : null}\n <div className=\"mt-2 flex justify-end gap-2\">\n <Button variant=\"ghost\" size=\"sm\" disabled={busy} onClick={onClose}>\n Cancel\n </Button>\n <Button size=\"sm\" disabled={busy} onClick={() => void useApps()}>\n {busy ? <Loader2Icon className=\"animate-spin\" /> : <CheckIcon />}Use in this conversation\n </Button>\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/app/components/capabilities/session-capability-card.tsx"],"sourcesContent":["import { t } from \"../../lib/console-text\";\nimport {\n attachSessionCapability,\n prepareSessionCapabilityAccess,\n applySessionCapabilityAccess,\n type SessionCapabilityAccessPlan,\n} from \"./attach-session-capability\";\nimport { Suspense, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { SessionMcpCapabilityCard } from \"../../../components/session-mcp-capability-card\";\nimport type { AuthNeededItem } from \"../../../timeline\";\nimport { CheckIcon, Loader2Icon } from \"lucide-react\";\nimport { useAppContext } from \"../../app-context\";\nimport { CodexSubscriptionsSurface } from \"../../lib/app-surfaces\";\nimport { Button } from \"../../../ui/button\";\nimport { Notice } from \"../../../ui/notice\";\nimport { SessionCapabilityFrame } from \"../../../components/session-capability-frame\";\nimport { capabilityLogoSource } from \"./capability-logo-source\";\nimport { DetailBody, type ConnectAction } from \"./capability-detail-sheet\";\nimport { performCapabilityAction } from \"./perform-capability-action\";\nimport { useCapabilitiesCatalog } from \"./use-capabilities-catalog\";\nimport { SessionCustomMcpCard } from \"./session-custom-mcp-card\";\nimport {\n capabilityConnectPlan,\n capabilityErrorToast,\n connectionHealth,\n} from \"../../lib/capabilities\";\nimport { userErrorText } from \"../../../ui/api-error\";\nimport { hasWorkspacePermission } from \"../../lib/permissions\";\nimport type { CapabilityCatalogItem, ResourceRef } from \"../../types\";\nimport type { ChatSendContext } from \"./session-github-repositories\";\nimport { SessionGitHubCapabilityCard } from \"./session-github-card\";\nimport { SessionMachineCapabilityCard } from \"./session-machine-card\";\nimport { usePage } from \"../../lib/navigation\";\n\n/** The built-in card for connecting a person's own computer to this chat. */\nexport const CONNECTED_MACHINE_CAPABILITY_ID = \"api:connected-machine\";\n\n/** The built-in tile and card that install the deployment's Excel add-in. */\nexport const EXCEL_ADDIN_CAPABILITY_ID = \"api:excel-addin\";\n\n/** Recommendations carry identity and rationale, never connection configuration.\n * Expand against the current authenticated catalog before rendering any form. */\ntype SessionCapabilityCardProps = {\n visibility?: \"private\" | \"workspace\" | undefined;\n onConfigured?: (() => Promise<void>) | undefined;\n item: AuthNeededItem;\n workspaceId: string;\n sessionId: string;\n /** The chat's mounted resources, for cards that add a resource to this chat. */\n resources?: readonly ResourceRef[] | undefined;\n /** What a composer Send would carry now, for cards that send a human message. */\n sendContext?: (() => ChatSendContext) | undefined;\n};\n\nexport function SessionCapabilityCard(props: SessionCapabilityCardProps) {\n const page = usePage();\n const context = useAppContext();\n const [registered, setRegistered] = useState<{ id: string; restoreFocus: boolean } | null>(null);\n const onRegistered = useCallback(\n (id: string, restoreFocus: boolean) => setRegistered({ id, restoreFocus }),\n [],\n );\n if (props.item.setupRequest && !registered) {\n return (\n <SessionCustomMcpCard\n key={`${props.workspaceId}:${props.item.id}`}\n item={props.item}\n workspaceId={props.workspaceId}\n sessionId={props.sessionId}\n onConfigured={props.onConfigured}\n onRegistered={onRegistered}\n />\n );\n }\n const item = registered\n ? {\n ...props.item,\n setupRequest: null,\n capability: {\n id: registered.id,\n name: props.item.setupRequest!.name,\n kind: \"mcp\" as const,\n source: \"manual\" as const,\n action: \"connect\" as const,\n rationale: props.item.setupRequest!.rationale,\n requiredVariables: [],\n },\n }\n : props.item;\n const capability = item.capability;\n if (capability?.id === CONNECTED_MACHINE_CAPABILITY_ID) {\n return (\n <SessionMachineCapabilityCard\n key={`${props.workspaceId}:${props.sessionId}`}\n item={item}\n workspaceId={props.workspaceId}\n sessionId={props.sessionId}\n sendContext={props.sendContext}\n onConfigured={props.onConfigured}\n />\n );\n }\n if (capability?.id === \"api:github-app\") {\n return (\n <SessionGitHubCapabilityCard\n key={`${props.workspaceId}:${props.sessionId}`}\n item={item}\n workspaceId={props.workspaceId}\n sessionId={props.sessionId}\n resources={props.resources}\n sendContext={props.sendContext}\n onConfigured={props.onConfigured}\n />\n );\n }\n const resolved = context.workspaceCapabilityCatalog.find((entry) => entry.id === capability?.id);\n if (capability && resolved?.kind === \"mcp\" && resolved.authKind === \"oauth2\") {\n return (\n <SessionMcpCapabilityCard\n client={context.client}\n workspaceId={props.workspaceId}\n sessionId={props.sessionId}\n capabilityId={capability.id}\n name={capability.name}\n rationale={capability.rationale}\n returnUrl={page.href()}\n onConfigured={props.onConfigured}\n />\n );\n }\n return (\n <ScopedSessionCapabilityCard\n key={`${props.workspaceId}:${props.sessionId}:${capability!.id}`}\n {...props}\n item={item}\n restoreFocus={registered?.restoreFocus ?? false}\n />\n );\n}\n\nfunction ScopedSessionCapabilityCard({\n item,\n workspaceId,\n sessionId,\n onConfigured,\n restoreFocus = false,\n}: SessionCapabilityCardProps & { restoreFocus?: boolean | undefined }) {\n const context = useAppContext();\n const recommendation = item.capability!;\n const [expanded, setExpanded] = useState(false);\n const [complete, setComplete] = useState(false);\n const [busy, setBusy] = useState(false);\n const [resolvedItem, setResolvedItem] = useState<CapabilityCatalogItem | null>(null);\n const opener = useRef<HTMLButtonElement>(null);\n const cardRef = useRef<HTMLElement>(null);\n useEffect(() => {\n if (!restoreFocus) return;\n // The review dialog's opener is removed when the new connection card\n // replaces it. Focus the next actionable control after Radix closes it.\n const frame = requestAnimationFrame(() => opener.current?.focus());\n return () => cancelAnimationFrame(frame);\n }, [restoreFocus]);\n const catalogItem =\n resolvedItem ??\n context.workspaceCapabilityCatalog.find((entry) => entry.id === recommendation.id);\n const logo = catalogItem\n ? capabilityLogoSource(catalogItem, (path) => context.client.catalogAssetUrl(path))\n : null;\n const close = () => {\n setExpanded(false);\n };\n const skill = recommendation.kind === \"skill\";\n const excel = recommendation.id === EXCEL_ADDIN_CAPABILITY_ID;\n const apiKey = catalogItem ? capabilityConnectPlan(catalogItem).mode === \"api_key\" : false;\n return (\n <SessionCapabilityFrame\n name={catalogItem?.name ?? recommendation.name}\n subtitle={catalogItem ? (catalogItem.providerDomain ?? \"\") : item.providerDomain}\n logo={logo}\n typeLabel={\n skill ? \"Skill\" : excel ? \"Add-in\" : recommendation.kind === \"mcp\" ? \"MCP server\" : \"API\"\n }\n description={catalogItem?.description || recommendation.rationale}\n skill={skill}\n expanded={expanded}\n complete={complete}\n actionLabel={\n excel\n ? \"Add to Excel\"\n : catalogItem?.enabled\n ? \"Review\"\n : skill\n ? \"Review skill\"\n : apiKey\n ? \"Add API key\"\n : `Connect ${catalogItem?.name ?? recommendation.name}`\n }\n note={\n excel\n ? \"The add-in runs in your own Excel. Agents reach a workbook only while you have the add-in open in it.\"\n : skill\n ? \"Skill content is reviewed separately from permission to use any integration.\"\n : apiKey\n ? \"Add credentials in the protected form, not in a chat message.\"\n : \"Review access before signing in. You'll return to this conversation after authorization.\"\n }\n onOpen={() => setExpanded(true)}\n onClose={close}\n busy={busy}\n opener={opener}\n cardRef={cardRef}\n >\n {recommendation.id === \"mcp:codex_apps\" ? (\n <SessionCodexAppsSetup\n busy={busy}\n setBusy={setBusy}\n workspaceId={workspaceId}\n sessionId={sessionId}\n onClose={close}\n onComplete={() => {\n setComplete(true);\n close();\n }}\n />\n ) : (\n <SessionCapabilitySetup\n busy={busy}\n setBusy={setBusy}\n key={`${workspaceId}:${sessionId}:${recommendation.id}`}\n capabilityId={recommendation.id}\n onResolvedItem={setResolvedItem}\n onConfigured={onConfigured}\n workspaceId={workspaceId}\n sessionId={sessionId}\n onClose={close}\n onComplete={() => {\n setComplete(true);\n close();\n }}\n />\n )}\n </SessionCapabilityFrame>\n );\n}\n\nfunction SessionCapabilitySetup({\n busy,\n setBusy,\n capabilityId,\n onResolvedItem,\n onConfigured,\n workspaceId,\n sessionId,\n onClose,\n onComplete,\n}: {\n busy: boolean;\n setBusy: (busy: boolean) => void;\n capabilityId: string;\n onResolvedItem: (item: CapabilityCatalogItem) => void;\n onConfigured?: (() => Promise<void>) | undefined;\n workspaceId: string;\n sessionId: string;\n onClose: () => void;\n onComplete: () => void;\n}) {\n const page = usePage();\n const context = useAppContext();\n const catalog = useCapabilitiesCatalog(workspaceId);\n const canReadConnections =\n context.accessContext === null\n ? null\n : hasWorkspacePermission(context.accessContext, workspaceId, \"connections:read\");\n const [error, setError] = useState<string | null>(null);\n const subjectId = context.accessContext?.subjectId ?? null;\n const [parentAccessReview, setParentAccessReview] = useState<{\n plan: SessionCapabilityAccessPlan;\n invocation: object;\n } | null>(null);\n const [authInspection, setAuthInspection] = useState<{\n id: string;\n url: string;\n kind: \"oauth2\" | \"none\" | \"unknown\";\n message?: string | undefined;\n } | null>(null);\n const [authInspectionRevision, setAuthInspectionRevision] = useState(0);\n const inFlight = useRef<object | null>(null);\n const scope = useRef({\n client: context.client,\n workspaceId,\n sessionId,\n canReadConnections,\n subjectId,\n authorityKey: catalog.authorityKey,\n alive: true,\n });\n if (\n scope.current.client !== context.client ||\n scope.current.workspaceId !== workspaceId ||\n scope.current.sessionId !== sessionId ||\n scope.current.canReadConnections !== canReadConnections ||\n scope.current.subjectId !== subjectId ||\n scope.current.authorityKey !== catalog.authorityKey\n ) {\n scope.current = {\n client: context.client,\n workspaceId,\n sessionId,\n canReadConnections,\n subjectId,\n authorityKey: catalog.authorityKey,\n alive: true,\n };\n }\n const parentAccessPlan =\n parentAccessReview?.invocation === scope.current ? parentAccessReview.plan : null;\n useEffect(() => {\n // StrictMode replays setup after cleanup. Give the replay a new owner:\n // reusing the retired object would either keep it dead or revive old work.\n if (!scope.current.alive) scope.current = { ...scope.current, alive: true };\n const activeScope = scope.current;\n setParentAccessReview(null);\n setBusy(false);\n void catalog.refresh();\n return () => {\n activeScope.alive = false;\n };\n // Refetch on a live read-grant change; the hook masks prior rows during render.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n context.client,\n workspaceId,\n sessionId,\n canReadConnections,\n subjectId,\n catalog.authorityKey,\n setBusy,\n ]);\n const rawItem = catalog.items.find((entry) => entry.id === capabilityId);\n const rawItemId = rawItem?.id;\n const inspectUrl = rawItem?.mcpUrl ?? rawItem?.endpointUrl;\n const needsAuthInspection =\n rawItem?.kind === \"mcp\" &&\n !rawItem.enabled &&\n capabilityConnectPlan(rawItem).mode === \"setup_required\" &&\n Boolean(inspectUrl);\n useEffect(() => {\n if (!needsAuthInspection || !rawItemId || !inspectUrl) return;\n let active = true;\n setAuthInspection(null);\n void context.client.inspectMcpAuthentication(workspaceId, inspectUrl).then(\n (result) => {\n if (active) setAuthInspection({ id: rawItemId, url: inspectUrl, ...result });\n },\n () => {\n if (active) setAuthInspection({ id: rawItemId, url: inspectUrl, kind: \"unknown\" });\n },\n );\n return () => {\n active = false;\n };\n }, [\n context.client,\n workspaceId,\n rawItemId,\n inspectUrl,\n needsAuthInspection,\n authInspectionRevision,\n ]);\n const item = useMemo(() => {\n if (!rawItem || !needsAuthInspection) return rawItem;\n const inspection =\n authInspection?.id === rawItem.id && authInspection.url === inspectUrl\n ? authInspection.kind\n : \"checking\";\n return {\n ...rawItem,\n authKind:\n inspection === \"oauth2\"\n ? (\"oauth2\" as const)\n : inspection === \"none\"\n ? (\"none\" as const)\n : null,\n metadata: {\n ...rawItem.metadata,\n authDiscovery: inspection,\n authDiscoveryMessage: inspection === \"unknown\" ? authInspection?.message : undefined,\n },\n };\n }, [rawItem, needsAuthInspection, inspectUrl, authInspection]);\n useEffect(() => {\n if (item) onResolvedItem(item);\n }, [item, onResolvedItem]);\n const refreshRuntime = useCallback(() => {\n void context.refreshWorkspaceMcpServers(workspaceId);\n }, [context, workspaceId]);\n async function act(action: ConnectAction) {\n if (!item) return;\n const invocation = scope.current;\n if (inFlight.current === invocation) return;\n inFlight.current = invocation;\n setBusy(true);\n setError(null);\n setParentAccessReview(null);\n const current = () => scope.current === invocation && invocation.alive;\n try {\n await performCapabilityAction(\n {\n client: context.client,\n workspaceId,\n item,\n connections: catalog.connectionsLoadFailed ? null : catalog.connections,\n canManageSkills: hasWorkspacePermission(\n context.accessContext,\n workspaceId,\n \"capabilities:manage\",\n ),\n refresh: catalog.refresh,\n onRuntimeChanged: () => {\n if (current()) refreshRuntime();\n },\n onComplete: async () => {\n if (!current()) return;\n const updated = (await context.client.listCapabilities(workspaceId)).items.find(\n (entry) => entry.id === item.id,\n );\n if (!current()) return;\n if (!updated?.enabled)\n throw new Error(\"Setup could not be verified. Refresh and try again.\");\n const plan = await prepareSessionCapabilityAccess(\n t,\n context.client,\n workspaceId,\n sessionId,\n updated,\n current,\n );\n if (!current()) return;\n if (plan.sessions.some((chat) => chat.id !== sessionId && chat.request)) {\n setParentAccessReview({ plan, invocation });\n return;\n }\n await applySessionCapabilityAccess(t, context.client, plan, current);\n await onConfigured?.();\n if (current()) onComplete();\n },\n onSkillRemoval: () => {\n throw new Error(\n \"Use the workspace Skill controls to review removal and its other owners.\",\n );\n },\n returnPathFor: (id) =>\n `/workspaces/${encodeURIComponent(workspaceId)}/sessions/${encodeURIComponent(sessionId)}?capability_auth=${encodeURIComponent(id)}`,\n redirect: (url) => {\n if (current()) page.assign(url);\n },\n },\n action,\n );\n } catch (failure) {\n // A credential may have committed before enabling failed. Reconcile before\n // offering Retry so it reuses that row instead of minting a duplicate.\n if (current()) await catalog.refresh();\n if (current()) setError(capabilityErrorToast(failure, \"Couldn't complete setup\").description);\n } finally {\n if (inFlight.current === invocation) inFlight.current = null;\n if (current()) setBusy(false);\n }\n }\n async function useConnected() {\n if (!item) return;\n const invocation = scope.current;\n if (inFlight.current === invocation) return;\n inFlight.current = invocation;\n setBusy(true);\n setError(null);\n const current = () => scope.current === invocation && invocation.alive;\n try {\n const plan =\n parentAccessPlan ??\n (await prepareSessionCapabilityAccess(\n t,\n context.client,\n workspaceId,\n sessionId,\n item,\n current,\n ));\n if (!current()) return;\n if (\n !parentAccessPlan &&\n plan.sessions.some((chat) => chat.id !== sessionId && chat.request)\n ) {\n setParentAccessReview({ plan, invocation });\n return;\n }\n await applySessionCapabilityAccess(t, context.client, plan, current);\n if (current()) setParentAccessReview(null);\n if (current()) await onConfigured?.();\n if (current()) onComplete();\n } catch (failure) {\n if (current()) {\n setParentAccessReview(null);\n setError(`Couldn't add this connection. ${userErrorText(failure, \"Try again.\")}`);\n }\n } finally {\n if (inFlight.current === invocation) inFlight.current = null;\n if (current()) setBusy(false);\n }\n }\n const ownsActionRow =\n !catalog.loadError && item && !item.enabled && (item.kind === \"skill\" || item.kind === \"mcp\");\n const health = item\n ? connectionHealth(item, catalog.connections ?? [], catalog.connections !== null)\n : null;\n return (\n <div className=\"p-6 sm:p-8\">\n {catalog.loading && !item ? (\n <p role=\"status\" className=\"flex items-center gap-2 text-sm text-fg-muted\">\n <Loader2Icon className=\"size-4 animate-spin\" />\n Loading connection details…\n </p>\n ) : catalog.loadError || !item ? (\n <Notice\n tone=\"failed\"\n action={\n <Button size=\"sm\" onClick={() => void catalog.refresh()}>\n Retry\n </Button>\n }\n >\n {catalog.loadError\n ? \"Couldn't load the integration catalog.\"\n : \"This recommendation is no longer in the current catalog.\"}\n </Notice>\n ) : (\n <DetailBody\n workspaceId={workspaceId}\n setupOnly\n showIdentity={false}\n onCancel={ownsActionRow ? onClose : undefined}\n item={item}\n health={connectionHealth(item, catalog.connections ?? [], catalog.connections !== null)}\n logoSrc={capabilityLogoSource(item, (path) => context.client.catalogAssetUrl(path))}\n busy={busy}\n errorMessage={error}\n socialConnections={catalog.socialConnections}\n canManageSocial={hasWorkspacePermission(\n context.accessContext,\n workspaceId,\n \"connections:write\",\n )}\n canManageSkills={hasWorkspacePermission(\n context.accessContext,\n workspaceId,\n \"capabilities:manage\",\n )}\n onAction={(action) => void act(action)}\n onRetryAuthInspection={\n needsAuthInspection\n ? () => {\n setAuthInspection(null);\n setAuthInspectionRevision((revision) => revision + 1);\n }\n : undefined\n }\n />\n )}\n {parentAccessPlan && item ? (\n <Notice tone=\"waiting\" live=\"polite\">\n <p>\n This chat inherits its tool access from its parent. To add {item.name}, enable its tools\n in these parent chats first:\n </p>\n <ul className=\"mt-2 list-disc pl-5\">\n {parentAccessPlan.sessions\n .filter((chat) => chat.id !== sessionId && chat.request)\n .map((chat) => (\n <li key={chat.id}>\n <a\n className=\"underline\"\n href={`/workspaces/${encodeURIComponent(workspaceId)}/sessions/${encodeURIComponent(chat.id)}`}\n >\n {chat.title || \"Parent chat\"}\n </a>\n </li>\n ))}\n </ul>\n <p className=\"mt-2\">\n Confirming adds {item.name}'s tools to these chats and this chat. Parent chats and\n future children can then use them. Existing tool choices are preserved; workspace\n defaults become chat-specific selections where needed. Current turns keep their accepted\n access.\n </p>\n <p className=\"mt-2\">\n Updates are saved separately. If a later update fails, approved parent changes may\n already be saved.\n </p>\n </Notice>\n ) : null}\n <div className=\"mt-2 flex justify-end gap-2\">\n {!ownsActionRow ? (\n <Button size=\"sm\" variant=\"ghost\" disabled={busy} onClick={onClose}>\n Cancel\n </Button>\n ) : null}\n {item?.enabled && health?.state !== \"attention\" && health?.state !== \"unverified\" ? (\n <Button size=\"sm\" disabled={busy} onClick={() => void useConnected()}>\n {busy ? <Loader2Icon className=\"animate-spin\" /> : <CheckIcon />}\n {parentAccessPlan ? \"Enable in parents and add tools\" : \"Add tools\"}\n </Button>\n ) : null}\n </div>\n </div>\n );\n}\n\nfunction SessionCodexAppsSetup({\n busy,\n setBusy,\n workspaceId,\n sessionId,\n onClose,\n onComplete,\n}: {\n busy: boolean;\n setBusy: (busy: boolean) => void;\n workspaceId: string;\n sessionId: string;\n onClose: () => void;\n onComplete: () => void;\n}) {\n const context = useAppContext();\n const [error, setError] = useState<string | null>(null);\n const inFlight = useRef(false);\n const active = useRef(true);\n useEffect(\n () => () => {\n active.current = false;\n },\n [],\n );\n async function useApps() {\n if (inFlight.current) return;\n inFlight.current = true;\n setBusy(true);\n setError(null);\n try {\n const catalog = await context.client.listCapabilities(workspaceId);\n const item = catalog.items.find((entry) => entry.id === \"mcp:codex_apps\");\n if (!active.current) return;\n if (!item?.enabled || !item.runtime.available)\n throw new Error(\"Choose an active subscription for Codex Apps before continuing.\");\n await attachSessionCapability(\n t,\n context.client,\n workspaceId,\n sessionId,\n item,\n () => active.current,\n );\n await context.refreshWorkspaceMcpServers(workspaceId);\n if (active.current) onComplete();\n } catch (failure) {\n if (active.current)\n setError(\n `Couldn't enable Apps in this conversation. ${userErrorText(failure, \"Try again.\")}`,\n );\n } finally {\n inFlight.current = false;\n if (active.current) setBusy(false);\n }\n }\n return (\n <div className=\"p-6 sm:p-8\">\n <Suspense fallback={<p role=\"status\">Loading connection controls…</p>}>\n <CodexSubscriptionsSurface\n workspaceId={workspaceId}\n canManage={hasWorkspacePermission(\n context.accessContext,\n workspaceId,\n \"connections:write\",\n )}\n />\n </Suspense>\n {error ? <Notice tone=\"failed\">{error}</Notice> : null}\n <div className=\"mt-2 flex justify-end gap-2\">\n <Button variant=\"ghost\" size=\"sm\" disabled={busy} onClick={onClose}>\n Cancel\n </Button>\n <Button size=\"sm\" disabled={busy} onClick={() => void useApps()}>\n {busy ? <Loader2Icon className=\"animate-spin\" /> : <CheckIcon />}Use in this conversation\n </Button>\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
@@ -1,12 +1,12 @@
1
1
  "use client";
2
2
  import {
3
3
  SessionGitHubCapabilityCard
4
- } from "../../../chunk-OSOWZBVH.js";
4
+ } from "../../../chunk-2XKNDJFQ.js";
5
5
  import "../../../chunk-MOMM26UR.js";
6
6
  import "../../../chunk-2LUBBDZV.js";
7
7
  import "../../../chunk-MM7OKOTE.js";
8
8
  import "../../../chunk-PVNI2KHS.js";
9
- import "../../../chunk-6NIMUVNY.js";
9
+ import "../../../chunk-SYBBQBHX.js";
10
10
  import "../../../chunk-A3MTTRCX.js";
11
11
  import "../../../chunk-ECNX3UOI.js";
12
12
  import "../../../chunk-FQQEZUSN.js";
@@ -4,7 +4,7 @@ import {
4
4
  } from "../../chunk-OANSIX34.js";
5
5
  import {
6
6
  SessionToolsMenuBody
7
- } from "../../chunk-GMZ3WRCP.js";
7
+ } from "../../chunk-BIIOGA4E.js";
8
8
  import "../../chunk-4NTPH5M6.js";
9
9
  import "../../chunk-5CLFYV7L.js";
10
10
  import "../../chunk-Z63GB7JI.js";
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  ComposerMobilePlus
4
- } from "../../chunk-GUBAMI7Y.js";
4
+ } from "../../chunk-XBRJWSYP.js";
5
5
  import "../../chunk-O2LGEYG4.js";
6
6
  import "../../chunk-HZUL2CUH.js";
7
7
  import "../../chunk-TREHTIBD.js";
@@ -7,7 +7,7 @@ import {
7
7
  SessionToolsMenuBody,
8
8
  sessionToolSelectionSummary,
9
9
  visibleSessionToolSelection
10
- } from "../../chunk-GMZ3WRCP.js";
10
+ } from "../../chunk-BIIOGA4E.js";
11
11
  import "../../chunk-4NTPH5M6.js";
12
12
  import "../../chunk-5CLFYV7L.js";
13
13
  import "../../chunk-Z63GB7JI.js";
@@ -4,13 +4,13 @@ import {
4
4
  RailHeader,
5
5
  SessionShellSlotsContext,
6
6
  SessionShellSlotsProvider
7
- } from "../../../chunk-E7CV5RO5.js";
8
- import "../../../chunk-GB2TVZVD.js";
7
+ } from "../../../chunk-BIZJY3XQ.js";
8
+ import "../../../chunk-FROJT2IT.js";
9
9
  import "../../../chunk-GZ64CASI.js";
10
10
  import "../../../chunk-GK2HWGUI.js";
11
11
  import "../../../chunk-22ZBT6CN.js";
12
- import "../../../chunk-HI75UTI6.js";
13
12
  import "../../../chunk-PM3OSANE.js";
13
+ import "../../../chunk-HI75UTI6.js";
14
14
  import "../../../chunk-CG4CIO5L.js";
15
15
  import "../../../chunk-R6NQXGRD.js";
16
16
  import "../../../chunk-GQGNRL2L.js";
@@ -11,8 +11,8 @@ import "../../../chunk-MF464AKA.js";
11
11
  import "../../../chunk-GLYJV66C.js";
12
12
  import "../../../chunk-O5S57N6H.js";
13
13
  import "../../../chunk-OSI2QWSL.js";
14
- import "../../../chunk-YO223PAT.js";
15
14
  import "../../../chunk-IRMNKKSY.js";
15
+ import "../../../chunk-YO223PAT.js";
16
16
  import "../../../chunk-K3TJNJSU.js";
17
17
  import "../../../chunk-BPY5FD3Q.js";
18
18
  import "../../../chunk-YSSOYORS.js";
@@ -5,14 +5,14 @@ import {
5
5
  RowQuickActions,
6
6
  SessionList,
7
7
  isStillRunningDeleteRefusal
8
- } from "../../../chunk-GB2TVZVD.js";
8
+ } from "../../../chunk-FROJT2IT.js";
9
9
  import "../../../chunk-GZ64CASI.js";
10
10
  import "../../../chunk-GK2HWGUI.js";
11
11
  import "../../../chunk-22ZBT6CN.js";
12
- import "../../../chunk-HI75UTI6.js";
13
12
  import {
14
13
  RailTrailingMetadata
15
14
  } from "../../../chunk-PM3OSANE.js";
15
+ import "../../../chunk-HI75UTI6.js";
16
16
  import "../../../chunk-CG4CIO5L.js";
17
17
  import "../../../chunk-R6NQXGRD.js";
18
18
  import "../../../chunk-GQGNRL2L.js";
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  RailBody,
4
4
  SessionShell
5
- } from "../../../chunk-5R7TMFNY.js";
5
+ } from "../../../chunk-BY3MVSZF.js";
6
6
  import "../../../chunk-RXVRW3OA.js";
7
7
  import "../../../chunk-HWYXY7KU.js";
8
8
  import "../../../chunk-M77ZQE5T.js";
@@ -15,13 +15,13 @@ import {
15
15
  PrimaryNav,
16
16
  RailHeader,
17
17
  SessionShellSlotsProvider
18
- } from "../../../chunk-E7CV5RO5.js";
19
- import "../../../chunk-GB2TVZVD.js";
18
+ } from "../../../chunk-BIZJY3XQ.js";
19
+ import "../../../chunk-FROJT2IT.js";
20
20
  import "../../../chunk-GZ64CASI.js";
21
21
  import "../../../chunk-GK2HWGUI.js";
22
22
  import "../../../chunk-22ZBT6CN.js";
23
- import "../../../chunk-HI75UTI6.js";
24
23
  import "../../../chunk-PM3OSANE.js";
24
+ import "../../../chunk-HI75UTI6.js";
25
25
  import "../../../chunk-CG4CIO5L.js";
26
26
  import "../../../chunk-R6NQXGRD.js";
27
27
  import "../../../chunk-GQGNRL2L.js";
@@ -34,8 +34,8 @@ import "../../../chunk-QTDAWO6O.js";
34
34
  import "../../../chunk-6BVT27Y2.js";
35
35
  import "../../../chunk-OSI2QWSL.js";
36
36
  import "../../../chunk-CFZTYRM6.js";
37
- import "../../../chunk-YO223PAT.js";
38
37
  import "../../../chunk-IRMNKKSY.js";
38
+ import "../../../chunk-YO223PAT.js";
39
39
  import "../../../chunk-VZCZLR2U.js";
40
40
  import "../../../chunk-XVVJBNUQ.js";
41
41
  import "../../../chunk-5VEK5RA4.js";
@@ -60,8 +60,8 @@ import "../../../chunk-XFNLU7EW.js";
60
60
  import "../../../chunk-Z2S5VQG7.js";
61
61
  import "../../../chunk-HQA6FUM5.js";
62
62
  import "../../../chunk-WGPLDFEC.js";
63
- import "../../../chunk-HZXH4XYA.js";
64
63
  import "../../../chunk-J4OPEWC3.js";
64
+ import "../../../chunk-HZXH4XYA.js";
65
65
  import "../../../chunk-RBRX5ZS3.js";
66
66
  import "../../../chunk-JM4XEJPM.js";
67
67
  import "../../../chunk-ZHNJW2A3.js";
@@ -3,7 +3,7 @@ import {
3
3
  TerminalSessionArchive,
4
4
  TerminalSessionBanner,
5
5
  UserMessageBody
6
- } from "../../../chunk-2DWZIO7A.js";
6
+ } from "../../../chunk-KWAOM7CR.js";
7
7
  import "../../../chunk-LT2CPZRB.js";
8
8
  import "../../../chunk-Q4ZCCQDY.js";
9
9
  import "../../../chunk-OTEWVFAG.js";