@stigmer/react 3.9.0 → 3.11.0

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 (1356) hide show
  1. package/access/ManageAccessButton.js +1 -1
  2. package/access/ManageAccessButton.js.map +1 -1
  3. package/access/ManageAccessDialog.js +3 -3
  4. package/access/ManageAccessDialog.js.map +1 -1
  5. package/action-menu/ActionMenu.js +3 -3
  6. package/action-menu/ActionMenu.js.map +1 -1
  7. package/activity/useRecentActivity.d.ts +6 -1
  8. package/activity/useRecentActivity.d.ts.map +1 -1
  9. package/activity/useRecentActivity.js +6 -1
  10. package/activity/useRecentActivity.js.map +1 -1
  11. package/agent/AgentDetailView.js +21 -21
  12. package/agent/AgentDetailView.js.map +1 -1
  13. package/agent/AgentPicker.js +8 -8
  14. package/agent/AgentPicker.js.map +1 -1
  15. package/agent/steps/CapabilitiesStep.js +3 -3
  16. package/agent/steps/CapabilitiesStep.js.map +1 -1
  17. package/agent/steps/IdentityStep.js +6 -6
  18. package/agent/steps/IdentityStep.js.map +1 -1
  19. package/agent/steps/ReviewStep.js +3 -3
  20. package/agent/steps/ReviewStep.js.map +1 -1
  21. package/agent-instance/AgentInstanceDetailPanel.js +2 -2
  22. package/agent-instance/AgentInstanceDetailPanel.js.map +1 -1
  23. package/agent-instance/AgentInstanceList.js +4 -4
  24. package/agent-instance/AgentInstanceList.js.map +1 -1
  25. package/agent-instance/CreateAgentInstanceDialog.js +1 -1
  26. package/agent-instance/CreateAgentInstanceDialog.js.map +1 -1
  27. package/api-key/ApiKeyCreatedAlert.js +1 -1
  28. package/api-key/ApiKeyCreatedAlert.js.map +1 -1
  29. package/api-key/ApiKeyListPanel.js +9 -9
  30. package/api-key/ApiKeyListPanel.js.map +1 -1
  31. package/api-key/CreateApiKeyForm.js +5 -5
  32. package/api-key/CreateApiKeyForm.js.map +1 -1
  33. package/attachment/AttachmentChipList.d.ts +16 -4
  34. package/attachment/AttachmentChipList.d.ts.map +1 -1
  35. package/attachment/AttachmentChipList.js +103 -37
  36. package/attachment/AttachmentChipList.js.map +1 -1
  37. package/attachment/AttachmentImageLightbox.d.ts +39 -0
  38. package/attachment/AttachmentImageLightbox.d.ts.map +1 -0
  39. package/attachment/AttachmentImageLightbox.js +57 -0
  40. package/attachment/AttachmentImageLightbox.js.map +1 -0
  41. package/attachment/attachment-utils.d.ts +8 -5
  42. package/attachment/attachment-utils.d.ts.map +1 -1
  43. package/attachment/attachment-utils.js +8 -5
  44. package/attachment/attachment-utils.js.map +1 -1
  45. package/attachment/useObjectUrl.d.ts +15 -0
  46. package/attachment/useObjectUrl.d.ts.map +1 -0
  47. package/attachment/useObjectUrl.js +25 -0
  48. package/attachment/useObjectUrl.js.map +1 -0
  49. package/billing/AutoRechargeCard.js +2 -2
  50. package/billing/AutoRechargeCard.js.map +1 -1
  51. package/billing/BillingSection.js +6 -6
  52. package/billing/BillingSection.js.map +1 -1
  53. package/billing/CreditBalanceCard.js +4 -4
  54. package/billing/CreditBalanceCard.js.map +1 -1
  55. package/billing/CreditLedgerTable.js +13 -13
  56. package/billing/CreditLedgerTable.js.map +1 -1
  57. package/billing/CreditPackGrid.js +2 -2
  58. package/billing/CreditPackGrid.js.map +1 -1
  59. package/billing/LowBalanceBanner.js +4 -4
  60. package/billing/LowBalanceBanner.js.map +1 -1
  61. package/billing/PaymentMethodCard.js +2 -2
  62. package/billing/PaymentMethodCard.js.map +1 -1
  63. package/button/Button.js +7 -7
  64. package/button/Button.js.map +1 -1
  65. package/channel/AgentChannelsPanel.js +12 -12
  66. package/channel/AgentChannelsPanel.js.map +1 -1
  67. package/channel/ChannelConversationsDialog.js +6 -6
  68. package/channel/ChannelConversationsDialog.js.map +1 -1
  69. package/channel/ChannelCredentialsDialog.js +2 -2
  70. package/channel/ChannelCredentialsDialog.js.map +1 -1
  71. package/channel/ChannelTemplatesDialog.js +13 -13
  72. package/channel/ChannelTemplatesDialog.js.map +1 -1
  73. package/channel/ChannelToolCredentials.js +3 -3
  74. package/channel/ChannelToolCredentials.js.map +1 -1
  75. package/channel/ConnectSlackDialog.js +13 -13
  76. package/channel/ConnectSlackDialog.js.map +1 -1
  77. package/channel/ConnectWhatsAppDialog.js +8 -8
  78. package/channel/ConnectWhatsAppDialog.js.map +1 -1
  79. package/channel/connect/ServingAppSection.js +5 -5
  80. package/channel/connect/ServingAppSection.js.map +1 -1
  81. package/channel/connect/ToolCredentialsSection.js +1 -1
  82. package/channel/connect/ToolCredentialsSection.js.map +1 -1
  83. package/channel/connect/VerbatimRefusal.js +1 -1
  84. package/channel/connect/VerbatimRefusal.js.map +1 -1
  85. package/channel/connect/icons.js +1 -1
  86. package/channel/connect/icons.js.map +1 -1
  87. package/channel-app/ChannelAppDetailPanel.js +3 -3
  88. package/channel-app/ChannelAppDetailPanel.js.map +1 -1
  89. package/channel-app/ChannelAppListPanel.js +5 -5
  90. package/channel-app/ChannelAppListPanel.js.map +1 -1
  91. package/channel-app/CreateChannelAppForm.js +6 -6
  92. package/channel-app/CreateChannelAppForm.js.map +1 -1
  93. package/channel-app/internal.js +7 -7
  94. package/channel-app/internal.js.map +1 -1
  95. package/composer/ComposerToolbar.js +4 -4
  96. package/composer/ComposerToolbar.js.map +1 -1
  97. package/composer/ConfigureMenu.js +4 -4
  98. package/composer/ConfigureMenu.js.map +1 -1
  99. package/composer/ContextChip.js +4 -4
  100. package/composer/ContextChip.js.map +1 -1
  101. package/composer/ContextPopover.js +4 -4
  102. package/composer/ContextPopover.js.map +1 -1
  103. package/composer/InteractionModePicker.js +5 -5
  104. package/composer/InteractionModePicker.js.map +1 -1
  105. package/composer/SessionComposer.js +8 -8
  106. package/composer/SessionComposer.js.map +1 -1
  107. package/composer/icons.js +3 -3
  108. package/composer/icons.js.map +1 -1
  109. package/conversation/ConversationAttentionBanner.js +2 -2
  110. package/conversation/ConversationAttentionBanner.js.map +1 -1
  111. package/conversation/ConversationComposer.js +2 -2
  112. package/conversation/ConversationComposer.js.map +1 -1
  113. package/conversation/ConversationControlBanner.js +5 -5
  114. package/conversation/ConversationControlBanner.js.map +1 -1
  115. package/conversation/ConversationListPane.js +12 -12
  116. package/conversation/ConversationListPane.js.map +1 -1
  117. package/conversation/ConversationMediaAttachment.d.ts +45 -0
  118. package/conversation/ConversationMediaAttachment.d.ts.map +1 -0
  119. package/conversation/ConversationMediaAttachment.js +153 -0
  120. package/conversation/ConversationMediaAttachment.js.map +1 -0
  121. package/conversation/ConversationTimelineView.d.ts +18 -1
  122. package/conversation/ConversationTimelineView.d.ts.map +1 -1
  123. package/conversation/ConversationTimelineView.js +24 -15
  124. package/conversation/ConversationTimelineView.js.map +1 -1
  125. package/conversation/ConversationsWorkbench.d.ts.map +1 -1
  126. package/conversation/ConversationsWorkbench.js +3 -3
  127. package/conversation/ConversationsWorkbench.js.map +1 -1
  128. package/conversation/conversationPresentation.d.ts +10 -3
  129. package/conversation/conversationPresentation.d.ts.map +1 -1
  130. package/conversation/conversationPresentation.js +10 -3
  131. package/conversation/conversationPresentation.js.map +1 -1
  132. package/conversation/index.d.ts +2 -0
  133. package/conversation/index.d.ts.map +1 -1
  134. package/conversation/index.js +1 -0
  135. package/conversation/index.js.map +1 -1
  136. package/conversation/useConversationMediaUrl.d.ts +65 -0
  137. package/conversation/useConversationMediaUrl.d.ts.map +1 -0
  138. package/conversation/useConversationMediaUrl.js +61 -0
  139. package/conversation/useConversationMediaUrl.js.map +1 -0
  140. package/cursor-accounts/CursorAccountEditor.js +1 -1
  141. package/cursor-accounts/CursorAccountEditor.js.map +1 -1
  142. package/cursor-accounts/CursorAccountsAccessNotice.js +1 -1
  143. package/cursor-accounts/CursorAccountsAccessNotice.js.map +1 -1
  144. package/cursor-accounts/CursorAccountsConsole.js +9 -9
  145. package/cursor-accounts/CursorAccountsConsole.js.map +1 -1
  146. package/cursor-accounts/MemberCoverageTable.js +7 -7
  147. package/cursor-accounts/MemberCoverageTable.js.map +1 -1
  148. package/cursor-accounts/MemberKeysPanel.js +3 -3
  149. package/cursor-accounts/MemberKeysPanel.js.map +1 -1
  150. package/cursor-accounts/badges.js +1 -1
  151. package/cursor-accounts/badges.js.map +1 -1
  152. package/dashboard/DashboardFailedRuns.js +4 -4
  153. package/dashboard/DashboardFailedRuns.js.map +1 -1
  154. package/dashboard/DashboardKPICards.js +7 -7
  155. package/dashboard/DashboardKPICards.js.map +1 -1
  156. package/dashboard/OperationalDashboard.js +1 -1
  157. package/dashboard/OperationalDashboard.js.map +1 -1
  158. package/datastore/CollectionRecordsBrowser.js +10 -10
  159. package/datastore/CollectionRecordsBrowser.js.map +1 -1
  160. package/datastore/CollectionSchemaView.js +4 -4
  161. package/datastore/CollectionSchemaView.js.map +1 -1
  162. package/datastore/DatastoreDetailView.js +4 -4
  163. package/datastore/DatastoreDetailView.js.map +1 -1
  164. package/datastore/DatastoreSyncReport.js +1 -1
  165. package/datastore/DatastoreSyncReport.js.map +1 -1
  166. package/datastore/DeleteDatastoreDialog.js +1 -1
  167. package/datastore/DeleteDatastoreDialog.js.map +1 -1
  168. package/datastore/FieldValueControl.js +2 -2
  169. package/datastore/FieldValueControl.js.map +1 -1
  170. package/datastore/RecordFilterBuilder.js +4 -4
  171. package/datastore/RecordFilterBuilder.js.map +1 -1
  172. package/datastore/RecordFormPanel.js +5 -5
  173. package/datastore/RecordFormPanel.js.map +1 -1
  174. package/dependency-graph/DependencyGraph.js +1 -1
  175. package/dependency-graph/DependencyGraph.js.map +1 -1
  176. package/dependency-graph/DependencyTreeNode.js +8 -8
  177. package/dependency-graph/DependencyTreeNode.js.map +1 -1
  178. package/empty-state/EmptyState.js +3 -3
  179. package/empty-state/EmptyState.js.map +1 -1
  180. package/empty-state/useEmptyState.js +1 -1
  181. package/empty-state/useEmptyState.js.map +1 -1
  182. package/environment/CreateEnvironmentForm.js +2 -2
  183. package/environment/CreateEnvironmentForm.js.map +1 -1
  184. package/environment/EnvVarForm.js +4 -4
  185. package/environment/EnvVarForm.js.map +1 -1
  186. package/environment/EnvironmentListPanel.js +9 -9
  187. package/environment/EnvironmentListPanel.js.map +1 -1
  188. package/environment/EnvironmentPicker.js +4 -4
  189. package/environment/EnvironmentPicker.js.map +1 -1
  190. package/environment/EnvironmentVariableEditor.js +17 -17
  191. package/environment/EnvironmentVariableEditor.js.map +1 -1
  192. package/error/ErrorMessage.js +1 -1
  193. package/error/ErrorMessage.js.map +1 -1
  194. package/error/SecretFlowErrorGuide.js +1 -1
  195. package/error/SecretFlowErrorGuide.js.map +1 -1
  196. package/execution/ApprovalCard.js +8 -8
  197. package/execution/ApprovalCard.js.map +1 -1
  198. package/execution/ArtifactApplyButton.js +4 -4
  199. package/execution/ArtifactApplyButton.js.map +1 -1
  200. package/execution/ArtifactContentBody.js +3 -3
  201. package/execution/ArtifactContentBody.js.map +1 -1
  202. package/execution/ArtifactContentRenderer.js +19 -19
  203. package/execution/ArtifactContentRenderer.js.map +1 -1
  204. package/execution/ArtifactDocument.js +10 -10
  205. package/execution/ArtifactDocument.js.map +1 -1
  206. package/execution/ArtifactFileContent.js +4 -4
  207. package/execution/ArtifactFileContent.js.map +1 -1
  208. package/execution/ArtifactPreviewModal.js +11 -11
  209. package/execution/ArtifactPreviewModal.js.map +1 -1
  210. package/execution/ArtifactRowView.js +2 -2
  211. package/execution/ArtifactRowView.js.map +1 -1
  212. package/execution/ArtifactsWidget.js +1 -1
  213. package/execution/ArtifactsWidget.js.map +1 -1
  214. package/execution/ContextGauge.js +9 -9
  215. package/execution/ContextGauge.js.map +1 -1
  216. package/execution/EmptyChangeNotice.js +1 -1
  217. package/execution/EmptyChangeNotice.js.map +1 -1
  218. package/execution/ExecutionPhaseBadge.js +10 -10
  219. package/execution/ExecutionPhaseBadge.js.map +1 -1
  220. package/execution/ExecutionProgress.js +1 -1
  221. package/execution/ExecutionProgress.js.map +1 -1
  222. package/execution/FileChangeProgressBar.js +3 -3
  223. package/execution/FileChangeProgressBar.js.map +1 -1
  224. package/execution/FileChangesView.js +5 -5
  225. package/execution/FileChangesView.js.map +1 -1
  226. package/execution/FilePathLink.js +6 -6
  227. package/execution/FilePathLink.js.map +1 -1
  228. package/execution/FileReviewAtoms.js +7 -7
  229. package/execution/FileReviewAtoms.js.map +1 -1
  230. package/execution/FileReviewCard.js +18 -18
  231. package/execution/FileReviewCard.js.map +1 -1
  232. package/execution/FileReviewDock.js +1 -1
  233. package/execution/FileReviewDock.js.map +1 -1
  234. package/execution/FollowUpInput.js +3 -3
  235. package/execution/FollowUpInput.js.map +1 -1
  236. package/execution/InteractionModeBadge.js +1 -1
  237. package/execution/InteractionModeBadge.js.map +1 -1
  238. package/execution/McpToolDetail.js +12 -12
  239. package/execution/McpToolDetail.js.map +1 -1
  240. package/execution/MessageAttachments.d.ts +52 -0
  241. package/execution/MessageAttachments.d.ts.map +1 -0
  242. package/execution/MessageAttachments.js +142 -0
  243. package/execution/MessageAttachments.js.map +1 -0
  244. package/execution/MessageEntry.d.ts +18 -0
  245. package/execution/MessageEntry.d.ts.map +1 -1
  246. package/execution/MessageEntry.js +12 -11
  247. package/execution/MessageEntry.js.map +1 -1
  248. package/execution/MessageThread.d.ts +15 -2
  249. package/execution/MessageThread.d.ts.map +1 -1
  250. package/execution/MessageThread.js +34 -17
  251. package/execution/MessageThread.js.map +1 -1
  252. package/execution/PlanArtifactCard.js +8 -8
  253. package/execution/PlanArtifactCard.js.map +1 -1
  254. package/execution/PlanCompletionCard.js +2 -2
  255. package/execution/PlanCompletionCard.js.map +1 -1
  256. package/execution/PlanDocumentMessage.js +2 -2
  257. package/execution/PlanDocumentMessage.js.map +1 -1
  258. package/execution/PlanStreamingCard.js +3 -3
  259. package/execution/PlanStreamingCard.js.map +1 -1
  260. package/execution/ResultView.js +17 -17
  261. package/execution/ResultView.js.map +1 -1
  262. package/execution/SessionVariablesInput.js +6 -6
  263. package/execution/SessionVariablesInput.js.map +1 -1
  264. package/execution/SetupProgress.js +2 -2
  265. package/execution/SetupProgress.js.map +1 -1
  266. package/execution/SubAgentSection.js +19 -19
  267. package/execution/SubAgentSection.js.map +1 -1
  268. package/execution/SummarizationBadge.js +3 -3
  269. package/execution/SummarizationBadge.js.map +1 -1
  270. package/execution/SummarizationCard.js +2 -2
  271. package/execution/SummarizationCard.js.map +1 -1
  272. package/execution/TerminalSession.js +2 -2
  273. package/execution/TerminalSession.js.map +1 -1
  274. package/execution/ThreadSkeleton.js +1 -1
  275. package/execution/ThreadSkeleton.js.map +1 -1
  276. package/execution/TodoCard.js +3 -3
  277. package/execution/TodoCard.js.map +1 -1
  278. package/execution/TodoList.js +8 -8
  279. package/execution/TodoList.js.map +1 -1
  280. package/execution/ToolArgsView.js +4 -4
  281. package/execution/ToolArgsView.js.map +1 -1
  282. package/execution/ToolCallDetail.js +4 -4
  283. package/execution/ToolCallDetail.js.map +1 -1
  284. package/execution/ToolCallGroup.js +1 -1
  285. package/execution/ToolCallGroup.js.map +1 -1
  286. package/execution/ToolCallItem.js +16 -16
  287. package/execution/ToolCallItem.js.map +1 -1
  288. package/execution/ToolRunGroup.js +9 -9
  289. package/execution/ToolRunGroup.js.map +1 -1
  290. package/execution/UsageWidget.js +3 -3
  291. package/execution/UsageWidget.js.map +1 -1
  292. package/execution/WriteBackCard.js +16 -16
  293. package/execution/WriteBackCard.js.map +1 -1
  294. package/execution/WriteBacksWidget.js +1 -1
  295. package/execution/WriteBacksWidget.js.map +1 -1
  296. package/execution/index.d.ts +2 -0
  297. package/execution/index.d.ts.map +1 -1
  298. package/execution/index.js +1 -0
  299. package/execution/index.js.map +1 -1
  300. package/execution/tool-rendering-primitives.js +5 -5
  301. package/execution/tool-rendering-primitives.js.map +1 -1
  302. package/feedback/StigmerToaster.d.ts.map +1 -1
  303. package/feedback/StigmerToaster.js +9 -5
  304. package/feedback/StigmerToaster.js.map +1 -1
  305. package/file-reference/FileReferenceChipList.js +3 -3
  306. package/file-reference/FileReferenceChipList.js.map +1 -1
  307. package/github/GitHubRepoPicker.js +26 -26
  308. package/github/GitHubRepoPicker.js.map +1 -1
  309. package/github/decodeGitHubContent.d.ts +10 -5
  310. package/github/decodeGitHubContent.d.ts.map +1 -1
  311. package/github/decodeGitHubContent.js +21 -7
  312. package/github/decodeGitHubContent.js.map +1 -1
  313. package/github/useGitHubFileReader.d.ts.map +1 -1
  314. package/github/useGitHubFileReader.js +5 -5
  315. package/github/useGitHubFileReader.js.map +1 -1
  316. package/iam-policy/GrantAccessForm.js +2 -2
  317. package/iam-policy/GrantAccessForm.js.map +1 -1
  318. package/iam-policy/OrgMembersPanel.js +11 -11
  319. package/iam-policy/OrgMembersPanel.js.map +1 -1
  320. package/iam-policy/PeopleWithAccess.js +4 -4
  321. package/iam-policy/PeopleWithAccess.js.map +1 -1
  322. package/iam-policy/PrincipalPicker.js +6 -6
  323. package/iam-policy/PrincipalPicker.js.map +1 -1
  324. package/iam-policy/ProviderBadge.js +1 -1
  325. package/iam-policy/ProviderBadge.js.map +1 -1
  326. package/iam-policy/RoleSelector.js +4 -4
  327. package/iam-policy/RoleSelector.js.map +1 -1
  328. package/iam-policy/SharePanel.js +1 -1
  329. package/iam-policy/SharePanel.js.map +1 -1
  330. package/identity-provider/CreateIdentityProviderForm.js +6 -6
  331. package/identity-provider/CreateIdentityProviderForm.js.map +1 -1
  332. package/identity-provider/IdentityProviderDetailPanel.js +11 -11
  333. package/identity-provider/IdentityProviderDetailPanel.js.map +1 -1
  334. package/identity-provider/IdentityProviderListPanel.js +8 -8
  335. package/identity-provider/IdentityProviderListPanel.js.map +1 -1
  336. package/identity-provider/IdentityProviderWizard.js +16 -16
  337. package/identity-provider/IdentityProviderWizard.js.map +1 -1
  338. package/identity-provider/ProviderPicker.js +11 -11
  339. package/identity-provider/ProviderPicker.js.map +1 -1
  340. package/identity-provider/SsoLoginPrompt.js +7 -7
  341. package/identity-provider/SsoLoginPrompt.js.map +1 -1
  342. package/index.d.ts +4 -4
  343. package/index.d.ts.map +1 -1
  344. package/index.js +3 -3
  345. package/index.js.map +1 -1
  346. package/inline-edit/InlineEditImage.js +5 -5
  347. package/inline-edit/InlineEditImage.js.map +1 -1
  348. package/inline-edit/InlineEditKeyValue.js +3 -3
  349. package/inline-edit/InlineEditKeyValue.js.map +1 -1
  350. package/inline-edit/InlineEditResourceList.js +8 -8
  351. package/inline-edit/InlineEditResourceList.js.map +1 -1
  352. package/inline-edit/InlineEditSelect.js +8 -8
  353. package/inline-edit/InlineEditSelect.js.map +1 -1
  354. package/inline-edit/InlineEditText.js +6 -6
  355. package/inline-edit/InlineEditText.js.map +1 -1
  356. package/inline-edit/InlineEditTextarea.js +4 -4
  357. package/inline-edit/InlineEditTextarea.js.map +1 -1
  358. package/internal/ApprovalPeekBar.js +3 -3
  359. package/internal/ApprovalPeekBar.js.map +1 -1
  360. package/internal/BoundedContent.d.ts +1 -1
  361. package/internal/BoundedContent.d.ts.map +1 -1
  362. package/internal/BoundedContent.js +2 -2
  363. package/internal/BoundedContent.js.map +1 -1
  364. package/internal/CloudFeatureNotice.js +1 -1
  365. package/internal/CloudFeatureNotice.js.map +1 -1
  366. package/internal/DecisionButton.js +6 -6
  367. package/internal/DecisionButton.js.map +1 -1
  368. package/internal/InCardDecisionError.js +1 -1
  369. package/internal/InCardDecisionError.js.map +1 -1
  370. package/internal/JumpToLatestButton.js +3 -3
  371. package/internal/JumpToLatestButton.js.map +1 -1
  372. package/internal/MermaidDiagram.js +2 -2
  373. package/internal/MermaidDiagram.js.map +1 -1
  374. package/internal/Pagination.js +2 -2
  375. package/internal/Pagination.js.map +1 -1
  376. package/internal/ResizableSplit.d.ts +28 -6
  377. package/internal/ResizableSplit.d.ts.map +1 -1
  378. package/internal/ResizableSplit.js +18 -4
  379. package/internal/ResizableSplit.js.map +1 -1
  380. package/internal/RevealToggle.js +2 -2
  381. package/internal/RevealToggle.js.map +1 -1
  382. package/internal/ScrollFade.js +2 -2
  383. package/internal/ScrollFade.js.map +1 -1
  384. package/internal/VirtualizedThread.js +2 -2
  385. package/internal/VirtualizedThread.js.map +1 -1
  386. package/internal/file-icons/index.js +2 -2
  387. package/internal/file-icons/index.js.map +1 -1
  388. package/internal/file-tree/FileTreeNode.js +3 -3
  389. package/internal/file-tree/FileTreeNode.js.map +1 -1
  390. package/internal/form-primitives.d.ts +15 -0
  391. package/internal/form-primitives.d.ts.map +1 -1
  392. package/internal/form-primitives.js +17 -2
  393. package/internal/form-primitives.js.map +1 -1
  394. package/internal/markdown-components.js +23 -23
  395. package/internal/markdown-components.js.map +1 -1
  396. package/internal/menu.js +5 -5
  397. package/internal/menu.js.map +1 -1
  398. package/internal/scroll-area.js +1 -1
  399. package/internal/scroll-area.js.map +1 -1
  400. package/internal/thread-card/ThreadCardShell.js +7 -7
  401. package/internal/thread-card/ThreadCardShell.js.map +1 -1
  402. package/internal/thread-card/glyphs.js +2 -2
  403. package/internal/thread-card/glyphs.js.map +1 -1
  404. package/internal/tooltip.d.ts.map +1 -1
  405. package/internal/tooltip.js +4 -6
  406. package/internal/tooltip.js.map +1 -1
  407. package/invitation/InvitationCreatedAlert.js +1 -1
  408. package/invitation/InvitationCreatedAlert.js.map +1 -1
  409. package/invitation/InvitationManager.js +23 -23
  410. package/invitation/InvitationManager.js.map +1 -1
  411. package/invitation/InvitationRedemption.js +12 -12
  412. package/invitation/InvitationRedemption.js.map +1 -1
  413. package/library/ResourceCountCard.js +4 -4
  414. package/library/ResourceCountCard.js.map +1 -1
  415. package/library/ScopeToggle.js +4 -4
  416. package/library/ScopeToggle.js.map +1 -1
  417. package/library/VisibilityOptionRow.d.ts +1 -1
  418. package/library/VisibilityOptionRow.d.ts.map +1 -1
  419. package/library/VisibilityOptionRow.js +22 -22
  420. package/library/VisibilityOptionRow.js.map +1 -1
  421. package/library/VisibilitySelector.js +5 -5
  422. package/library/VisibilitySelector.js.map +1 -1
  423. package/manifest/ApplyManifestDialog.js +6 -6
  424. package/manifest/ApplyManifestDialog.js.map +1 -1
  425. package/manifest/EditResourceYamlDialog.js +2 -2
  426. package/manifest/EditResourceYamlDialog.js.map +1 -1
  427. package/manifest/RedactedSecretsNotice.js +1 -1
  428. package/manifest/RedactedSecretsNotice.js.map +1 -1
  429. package/manifest/YamlEditor.js +1 -1
  430. package/manifest/YamlEditor.js.map +1 -1
  431. package/mcp-server/McpServerConfigPanel.js +22 -22
  432. package/mcp-server/McpServerConfigPanel.js.map +1 -1
  433. package/mcp-server/McpServerConnectDialog.js +43 -17
  434. package/mcp-server/McpServerConnectDialog.js.map +1 -1
  435. package/mcp-server/McpServerDetailView.d.ts.map +1 -1
  436. package/mcp-server/McpServerDetailView.js +112 -63
  437. package/mcp-server/McpServerDetailView.js.map +1 -1
  438. package/mcp-server/McpServerPicker.js +16 -16
  439. package/mcp-server/McpServerPicker.js.map +1 -1
  440. package/mcp-server/McpToolSelector.js +4 -4
  441. package/mcp-server/McpToolSelector.js.map +1 -1
  442. package/mcp-server/OAuthAppForm.js +2 -2
  443. package/mcp-server/OAuthAppForm.js.map +1 -1
  444. package/mcp-server/OAuthCallbackHandler.js +4 -4
  445. package/mcp-server/OAuthCallbackHandler.js.map +1 -1
  446. package/mcp-server/OAuthRequiredNotice.js +1 -1
  447. package/mcp-server/OAuthRequiredNotice.js.map +1 -1
  448. package/mcp-server/StdioSandboxNotice.js +1 -1
  449. package/mcp-server/StdioSandboxNotice.js.map +1 -1
  450. package/mcp-server/index.d.ts +1 -1
  451. package/mcp-server/index.d.ts.map +1 -1
  452. package/mcp-server/index.js +1 -1
  453. package/mcp-server/index.js.map +1 -1
  454. package/mcp-server/steps/EnvironmentAuthStep.js +4 -4
  455. package/mcp-server/steps/EnvironmentAuthStep.js.map +1 -1
  456. package/mcp-server/steps/IdentityTransportStep.js +8 -8
  457. package/mcp-server/steps/IdentityTransportStep.js.map +1 -1
  458. package/mcp-server/steps/ReviewStep.js +3 -3
  459. package/mcp-server/steps/ReviewStep.js.map +1 -1
  460. package/mcp-server/useMcpServerOAuthConnect.d.ts +29 -0
  461. package/mcp-server/useMcpServerOAuthConnect.d.ts.map +1 -1
  462. package/mcp-server/useMcpServerOAuthConnect.js +49 -10
  463. package/mcp-server/useMcpServerOAuthConnect.js.map +1 -1
  464. package/models/HarnessSelector.js +8 -8
  465. package/models/HarnessSelector.js.map +1 -1
  466. package/models/ModelSelector.js +11 -11
  467. package/models/ModelSelector.js.map +1 -1
  468. package/oauth-app/CreateOAuthAppForm.js +4 -4
  469. package/oauth-app/CreateOAuthAppForm.js.map +1 -1
  470. package/oauth-app/OAuthAppDetailPanel.js +8 -8
  471. package/oauth-app/OAuthAppDetailPanel.js.map +1 -1
  472. package/oauth-app/OAuthAppListPanel.js +6 -6
  473. package/oauth-app/OAuthAppListPanel.js.map +1 -1
  474. package/organization/CreateOrganizationForm.js +4 -4
  475. package/organization/CreateOrganizationForm.js.map +1 -1
  476. package/organization/OrgProfilePanel.js +10 -10
  477. package/organization/OrgProfilePanel.js.map +1 -1
  478. package/organization/OrgSwitcher.js +5 -5
  479. package/organization/OrgSwitcher.js.map +1 -1
  480. package/package.json +4 -4
  481. package/platform-client/CreatePlatformClientForm.js +5 -5
  482. package/platform-client/CreatePlatformClientForm.js.map +1 -1
  483. package/platform-client/PlatformClientDetailPanel.js +8 -8
  484. package/platform-client/PlatformClientDetailPanel.js.map +1 -1
  485. package/platform-client/PlatformClientListPanel.js +10 -10
  486. package/platform-client/PlatformClientListPanel.js.map +1 -1
  487. package/platform-client/PlatformClientSecretAlert.js +2 -2
  488. package/platform-client/PlatformClientSecretAlert.js.map +1 -1
  489. package/portal-container.d.ts +34 -9
  490. package/portal-container.d.ts.map +1 -1
  491. package/portal-container.js +33 -8
  492. package/portal-container.js.map +1 -1
  493. package/pricing-governance/BaselineEditor.js +5 -5
  494. package/pricing-governance/BaselineEditor.js.map +1 -1
  495. package/pricing-governance/ModelCatalogPanel.js +5 -5
  496. package/pricing-governance/ModelCatalogPanel.js.map +1 -1
  497. package/pricing-governance/ModelGovernanceDetail.js +7 -7
  498. package/pricing-governance/ModelGovernanceDetail.js.map +1 -1
  499. package/pricing-governance/OperatorAccessNotice.js +1 -1
  500. package/pricing-governance/OperatorAccessNotice.js.map +1 -1
  501. package/pricing-governance/PricingGovernanceConsole.js +8 -8
  502. package/pricing-governance/PricingGovernanceConsole.js.map +1 -1
  503. package/pricing-governance/PricingGovernancePanel.js +4 -4
  504. package/pricing-governance/PricingGovernancePanel.js.map +1 -1
  505. package/pricing-governance/RetireConfirm.js +1 -1
  506. package/pricing-governance/RetireConfirm.js.map +1 -1
  507. package/pricing-governance/governance-primitives.js +6 -6
  508. package/pricing-governance/governance-primitives.js.map +1 -1
  509. package/resource-creation/CreationPicker.js +7 -7
  510. package/resource-creation/CreationPicker.js.map +1 -1
  511. package/resource-creation/StepIndicator.js +4 -4
  512. package/resource-creation/StepIndicator.js.map +1 -1
  513. package/resource-creation/TemplateCard.js +15 -15
  514. package/resource-creation/TemplateCard.js.map +1 -1
  515. package/resource-creation/TemplateGallery.js +5 -5
  516. package/resource-creation/TemplateGallery.js.map +1 -1
  517. package/resource-creation/WizardNav.js +2 -2
  518. package/resource-creation/WizardNav.js.map +1 -1
  519. package/resource-creation/WizardShell.js +2 -2
  520. package/resource-creation/WizardShell.js.map +1 -1
  521. package/resource-detail/ConfirmDialog.js +3 -3
  522. package/resource-detail/ConfirmDialog.js.map +1 -1
  523. package/resource-detail/ResourceActionBar.js +2 -2
  524. package/resource-detail/ResourceActionBar.js.map +1 -1
  525. package/resource-detail/ResourceDetailShell.js +3 -3
  526. package/resource-detail/ResourceDetailShell.js.map +1 -1
  527. package/resource-detail/Section.js +1 -1
  528. package/resource-detail/Section.js.map +1 -1
  529. package/resource-workbench/components/BulkActionBar.js +4 -4
  530. package/resource-workbench/components/BulkActionBar.js.map +1 -1
  531. package/resource-workbench/components/ColumnHeader.js +3 -3
  532. package/resource-workbench/components/ColumnHeader.js.map +1 -1
  533. package/resource-workbench/components/FilterBar.js +3 -3
  534. package/resource-workbench/components/FilterBar.js.map +1 -1
  535. package/resource-workbench/components/ResourceAvatar.js +18 -18
  536. package/resource-workbench/components/ResourceAvatar.js.map +1 -1
  537. package/resource-workbench/components/ResourceCards.js +2 -2
  538. package/resource-workbench/components/ResourceCards.js.map +1 -1
  539. package/resource-workbench/components/ResourceInspector.js +1 -1
  540. package/resource-workbench/components/ResourceInspector.js.map +1 -1
  541. package/resource-workbench/components/ResourceList.js +2 -2
  542. package/resource-workbench/components/ResourceList.js.map +1 -1
  543. package/resource-workbench/components/ResourceTable.js +5 -5
  544. package/resource-workbench/components/ResourceTable.js.map +1 -1
  545. package/resource-workbench/components/ResourceWorkbench.js +11 -11
  546. package/resource-workbench/components/ResourceWorkbench.js.map +1 -1
  547. package/resource-workbench/components/SelectionCheckbox.js +1 -1
  548. package/resource-workbench/components/SelectionCheckbox.js.map +1 -1
  549. package/resource-workbench/components/StatusBadge.js +16 -16
  550. package/resource-workbench/components/StatusBadge.js.map +1 -1
  551. package/resource-workbench/components/ViewSwitcher.js +4 -4
  552. package/resource-workbench/components/ViewSwitcher.js.map +1 -1
  553. package/schedule/CadenceField.js +14 -14
  554. package/schedule/CadenceField.js.map +1 -1
  555. package/schedule/ScheduleDetailView.js +39 -39
  556. package/schedule/ScheduleDetailView.js.map +1 -1
  557. package/schedule/ScheduleForm.js +9 -9
  558. package/schedule/ScheduleForm.js.map +1 -1
  559. package/schedule/ScheduleRowActions.js +1 -1
  560. package/schedule/ScheduleRowActions.js.map +1 -1
  561. package/schedule/ScheduleRunsTable.js +17 -17
  562. package/schedule/ScheduleRunsTable.js.map +1 -1
  563. package/schedule/TimeZoneField.js +5 -5
  564. package/schedule/TimeZoneField.js.map +1 -1
  565. package/schedule/scheduleColumns.js +5 -5
  566. package/schedule/scheduleColumns.js.map +1 -1
  567. package/session/NewSessionViewer.js +3 -3
  568. package/session/NewSessionViewer.js.map +1 -1
  569. package/session/PlanEditor.js +9 -9
  570. package/session/PlanEditor.js.map +1 -1
  571. package/session/PlanStreamingDocument.js +2 -2
  572. package/session/PlanStreamingDocument.js.map +1 -1
  573. package/session/SessionViewer.js +21 -21
  574. package/session/SessionViewer.js.map +1 -1
  575. package/session/SessionViewerLayout.d.ts +11 -8
  576. package/session/SessionViewerLayout.d.ts.map +1 -1
  577. package/session/SessionViewerLayout.js +1 -1
  578. package/session/SessionViewerLayout.js.map +1 -1
  579. package/session/facets/ArtifactsTab.js +2 -2
  580. package/session/facets/ArtifactsTab.js.map +1 -1
  581. package/session/facets/ChangesTab.js +3 -3
  582. package/session/facets/ChangesTab.js.map +1 -1
  583. package/session/facets/SetupTab.js +11 -11
  584. package/session/facets/SetupTab.js.map +1 -1
  585. package/session/facets/UsageTab.js +1 -1
  586. package/session/facets/UsageTab.js.map +1 -1
  587. package/session/useSessionConversation.d.ts +8 -0
  588. package/session/useSessionConversation.d.ts.map +1 -1
  589. package/session/useSessionConversation.js +12 -2
  590. package/session/useSessionConversation.js.map +1 -1
  591. package/settings/ApiKeysSection.js +1 -1
  592. package/settings/ApiKeysSection.js.map +1 -1
  593. package/settings/ChannelAppsSection.js +1 -1
  594. package/settings/ChannelAppsSection.js.map +1 -1
  595. package/settings/EnvironmentsSection.js +4 -4
  596. package/settings/EnvironmentsSection.js.map +1 -1
  597. package/settings/IdentityProvidersSection.js +1 -1
  598. package/settings/IdentityProvidersSection.js.map +1 -1
  599. package/settings/InvitationsSection.js +1 -1
  600. package/settings/InvitationsSection.js.map +1 -1
  601. package/settings/MembersSection.js +1 -1
  602. package/settings/MembersSection.js.map +1 -1
  603. package/settings/OAuthAppsSection.js +1 -1
  604. package/settings/OAuthAppsSection.js.map +1 -1
  605. package/settings/OrgProfileSection.js +1 -1
  606. package/settings/OrgProfileSection.js.map +1 -1
  607. package/settings/PlatformClientsSection.js +1 -1
  608. package/settings/PlatformClientsSection.js.map +1 -1
  609. package/settings/UsageSection.js +1 -1
  610. package/settings/UsageSection.js.map +1 -1
  611. package/sharing/AgentShareList.js +5 -5
  612. package/sharing/AgentShareList.js.map +1 -1
  613. package/sharing/ShareAgentDialog.js +30 -30
  614. package/sharing/ShareAgentDialog.js.map +1 -1
  615. package/sharing/SharedAgentChat.js +6 -6
  616. package/sharing/SharedAgentChat.js.map +1 -1
  617. package/sidebar/SettingsSidebar.js +5 -5
  618. package/sidebar/SettingsSidebar.js.map +1 -1
  619. package/sidebar/WorkspaceSidebar.js +13 -13
  620. package/sidebar/WorkspaceSidebar.js.map +1 -1
  621. package/sidebar/chrome.js +5 -5
  622. package/sidebar/chrome.js.map +1 -1
  623. package/skill/SkillDetailView.js +13 -13
  624. package/skill/SkillDetailView.js.map +1 -1
  625. package/skill/SkillDiffDialog.js +2 -2
  626. package/skill/SkillDiffDialog.js.map +1 -1
  627. package/skill/SkillFileBrowser.js +4 -4
  628. package/skill/SkillFileBrowser.js.map +1 -1
  629. package/skill/SkillPicker.js +10 -10
  630. package/skill/SkillPicker.js.map +1 -1
  631. package/skill/SkillUploader.js +8 -8
  632. package/skill/SkillUploader.js.map +1 -1
  633. package/src/__tests__/helpers/compile-sdk-styles.ts +33 -0
  634. package/src/__tests__/portal-container.test.tsx +97 -0
  635. package/src/__tests__/preflight-parity.layout.test.tsx +156 -0
  636. package/src/__tests__/scope-unprefixed.test.ts +86 -0
  637. package/src/__tests__/styles-border-layer-invariant.test.ts +86 -58
  638. package/src/__tests__/styles-dist-isolation.test.ts +195 -0
  639. package/src/__tests__/styles-host-isolation.layout.test.tsx +204 -0
  640. package/src/access/ManageAccessButton.tsx +3 -3
  641. package/src/access/ManageAccessDialog.tsx +19 -19
  642. package/src/action-menu/ActionMenu.tsx +8 -8
  643. package/src/activity/useRecentActivity.ts +6 -1
  644. package/src/agent/AgentDetailView.tsx +112 -112
  645. package/src/agent/AgentPicker.tsx +26 -26
  646. package/src/agent/steps/CapabilitiesStep.tsx +36 -36
  647. package/src/agent/steps/IdentityStep.tsx +45 -45
  648. package/src/agent/steps/ReviewStep.tsx +18 -18
  649. package/src/agent-instance/AgentInstanceDetailPanel.tsx +45 -45
  650. package/src/agent-instance/AgentInstanceList.tsx +36 -36
  651. package/src/agent-instance/CreateAgentInstanceDialog.tsx +35 -35
  652. package/src/agent-instance/__tests__/AgentInstanceList.test.tsx +0 -6
  653. package/src/api-key/ApiKeyCreatedAlert.tsx +15 -15
  654. package/src/api-key/ApiKeyListPanel.tsx +28 -28
  655. package/src/api-key/CreateApiKeyForm.tsx +25 -25
  656. package/src/attachment/AttachmentChipList.tsx +321 -75
  657. package/src/attachment/AttachmentImageLightbox.tsx +154 -0
  658. package/src/attachment/__tests__/AttachmentChipList.test.tsx +240 -17
  659. package/src/attachment/attachment-utils.ts +8 -5
  660. package/src/attachment/useObjectUrl.ts +28 -0
  661. package/src/billing/AutoRechargeCard.tsx +26 -26
  662. package/src/billing/BillingSection.tsx +14 -14
  663. package/src/billing/CreditBalanceCard.tsx +7 -7
  664. package/src/billing/CreditLedgerTable.tsx +27 -27
  665. package/src/billing/CreditPackGrid.tsx +13 -13
  666. package/src/billing/LowBalanceBanner.tsx +6 -6
  667. package/src/billing/PaymentMethodCard.tsx +13 -13
  668. package/src/button/Button.tsx +10 -10
  669. package/src/button/__tests__/Button.test.tsx +9 -9
  670. package/src/channel/AgentChannelsPanel.tsx +33 -33
  671. package/src/channel/ChannelConversationsDialog.tsx +21 -21
  672. package/src/channel/ChannelCredentialsDialog.tsx +13 -13
  673. package/src/channel/ChannelTemplatesDialog.tsx +34 -34
  674. package/src/channel/ChannelToolCredentials.tsx +5 -5
  675. package/src/channel/ConnectSlackDialog.tsx +48 -48
  676. package/src/channel/ConnectWhatsAppDialog.tsx +42 -42
  677. package/src/channel/__tests__/AgentChannelsPanel.test.tsx +4 -9
  678. package/src/channel/connect/ServingAppSection.tsx +14 -14
  679. package/src/channel/connect/ToolCredentialsSection.tsx +5 -5
  680. package/src/channel/connect/VerbatimRefusal.tsx +1 -1
  681. package/src/channel/connect/icons.tsx +1 -1
  682. package/src/channel-app/ChannelAppDetailPanel.tsx +44 -44
  683. package/src/channel-app/ChannelAppListPanel.tsx +15 -15
  684. package/src/channel-app/CreateChannelAppForm.tsx +37 -37
  685. package/src/channel-app/internal.tsx +21 -21
  686. package/src/composer/ComposerToolbar.tsx +15 -15
  687. package/src/composer/ConfigureMenu.tsx +22 -22
  688. package/src/composer/ContextChip.tsx +12 -12
  689. package/src/composer/ContextPopover.tsx +8 -8
  690. package/src/composer/InteractionModePicker.tsx +14 -14
  691. package/src/composer/SessionComposer.tsx +24 -24
  692. package/src/composer/__tests__/SessionComposer-lockAgent.test.tsx +16 -15
  693. package/src/composer/__tests__/SessionComposer-serviceTier.test.tsx +2 -7
  694. package/src/composer/icons.tsx +5 -5
  695. package/src/conversation/ConversationAttentionBanner.tsx +6 -6
  696. package/src/conversation/ConversationComposer.tsx +13 -13
  697. package/src/conversation/ConversationControlBanner.tsx +11 -11
  698. package/src/conversation/ConversationListPane.tsx +38 -38
  699. package/src/conversation/ConversationMediaAttachment.tsx +308 -0
  700. package/src/conversation/ConversationTimelineView.tsx +102 -52
  701. package/src/conversation/ConversationsWorkbench.tsx +12 -10
  702. package/src/conversation/__tests__/ConversationComposer.test.tsx +1 -1
  703. package/src/conversation/__tests__/ConversationTimelineView.test.tsx +233 -6
  704. package/src/conversation/__tests__/a11y/conversation-surfaces.a11y.test.tsx +67 -1
  705. package/src/conversation/__tests__/useConversationMediaUrl.test.tsx +66 -0
  706. package/src/conversation/conversationPresentation.ts +10 -3
  707. package/src/conversation/index.ts +6 -0
  708. package/src/conversation/useConversationMediaUrl.ts +121 -0
  709. package/src/cursor-accounts/CursorAccountEditor.tsx +13 -13
  710. package/src/cursor-accounts/CursorAccountsAccessNotice.tsx +3 -3
  711. package/src/cursor-accounts/CursorAccountsConsole.tsx +35 -35
  712. package/src/cursor-accounts/MemberCoverageTable.tsx +29 -29
  713. package/src/cursor-accounts/MemberKeysPanel.tsx +17 -17
  714. package/src/cursor-accounts/badges.tsx +4 -4
  715. package/src/dashboard/DashboardFailedRuns.tsx +17 -17
  716. package/src/dashboard/DashboardKPICards.tsx +12 -12
  717. package/src/dashboard/OperationalDashboard.tsx +2 -2
  718. package/src/datastore/CollectionRecordsBrowser.tsx +35 -35
  719. package/src/datastore/CollectionSchemaView.tsx +43 -43
  720. package/src/datastore/DatastoreDetailView.tsx +18 -18
  721. package/src/datastore/DatastoreSyncReport.tsx +13 -13
  722. package/src/datastore/DeleteDatastoreDialog.tsx +21 -21
  723. package/src/datastore/FieldValueControl.tsx +7 -7
  724. package/src/datastore/RecordFilterBuilder.tsx +35 -35
  725. package/src/datastore/RecordFormPanel.tsx +35 -35
  726. package/src/dependency-graph/DependencyGraph.tsx +6 -6
  727. package/src/dependency-graph/DependencyTreeNode.tsx +21 -21
  728. package/src/empty-state/EmptyState.tsx +7 -7
  729. package/src/empty-state/useEmptyState.ts +1 -1
  730. package/src/environment/CreateEnvironmentForm.tsx +24 -24
  731. package/src/environment/EnvVarForm.tsx +40 -40
  732. package/src/environment/EnvironmentListPanel.tsx +19 -19
  733. package/src/environment/EnvironmentPicker.tsx +22 -22
  734. package/src/environment/EnvironmentVariableEditor.tsx +53 -53
  735. package/src/error/ErrorMessage.tsx +22 -22
  736. package/src/error/SecretFlowErrorGuide.tsx +19 -19
  737. package/src/execution/ApprovalCard.tsx +19 -19
  738. package/src/execution/ArtifactApplyButton.tsx +7 -7
  739. package/src/execution/ArtifactContentBody.tsx +11 -11
  740. package/src/execution/ArtifactContentRenderer.tsx +29 -29
  741. package/src/execution/ArtifactDocument.tsx +22 -22
  742. package/src/execution/ArtifactFileContent.tsx +6 -6
  743. package/src/execution/ArtifactPreviewModal.tsx +33 -33
  744. package/src/execution/ArtifactRowView.tsx +13 -13
  745. package/src/execution/ArtifactsWidget.tsx +4 -4
  746. package/src/execution/ContextGauge.tsx +24 -24
  747. package/src/execution/EmptyChangeNotice.tsx +1 -1
  748. package/src/execution/ExecutionPhaseBadge.tsx +12 -12
  749. package/src/execution/ExecutionProgress.tsx +2 -2
  750. package/src/execution/FileChangeProgressBar.tsx +9 -9
  751. package/src/execution/FileChangesView.tsx +12 -12
  752. package/src/execution/FilePathLink.tsx +10 -10
  753. package/src/execution/FileReviewAtoms.tsx +9 -9
  754. package/src/execution/FileReviewCard.tsx +37 -37
  755. package/src/execution/FileReviewDock.tsx +2 -2
  756. package/src/execution/FollowUpInput.tsx +9 -9
  757. package/src/execution/InteractionModeBadge.tsx +2 -2
  758. package/src/execution/McpToolDetail.tsx +28 -28
  759. package/src/execution/MessageAttachments.tsx +364 -0
  760. package/src/execution/MessageEntry.tsx +60 -22
  761. package/src/execution/MessageThread.tsx +72 -32
  762. package/src/execution/PlanArtifactCard.tsx +22 -22
  763. package/src/execution/PlanCompletionCard.tsx +10 -10
  764. package/src/execution/PlanDocumentMessage.tsx +6 -6
  765. package/src/execution/PlanStreamingCard.tsx +11 -11
  766. package/src/execution/ResultView.tsx +44 -44
  767. package/src/execution/SessionVariablesInput.tsx +38 -38
  768. package/src/execution/SetupProgress.tsx +5 -5
  769. package/src/execution/SubAgentSection.tsx +42 -42
  770. package/src/execution/SummarizationBadge.tsx +15 -15
  771. package/src/execution/SummarizationCard.tsx +11 -11
  772. package/src/execution/TerminalSession.tsx +7 -7
  773. package/src/execution/ThreadSkeleton.tsx +10 -10
  774. package/src/execution/TodoCard.tsx +11 -11
  775. package/src/execution/TodoList.tsx +13 -13
  776. package/src/execution/ToolArgsView.tsx +8 -8
  777. package/src/execution/ToolCallDetail.tsx +7 -7
  778. package/src/execution/ToolCallGroup.tsx +1 -1
  779. package/src/execution/ToolCallItem.tsx +28 -28
  780. package/src/execution/ToolRunGroup.tsx +16 -16
  781. package/src/execution/UsageWidget.tsx +12 -12
  782. package/src/execution/WriteBackCard.tsx +30 -30
  783. package/src/execution/WriteBacksWidget.tsx +4 -4
  784. package/src/execution/__tests__/ApprovalCard.test.tsx +12 -12
  785. package/src/execution/__tests__/ArtifactContentRenderer.test.tsx +3 -3
  786. package/src/execution/__tests__/FileChangesView.test.tsx +2 -2
  787. package/src/execution/__tests__/FilePathLink.test.tsx +1 -1
  788. package/src/execution/__tests__/FileReviewDock.test.tsx +1 -1
  789. package/src/execution/__tests__/MessageEntry-attachments.test.tsx +228 -0
  790. package/src/execution/__tests__/MessageThread.test.tsx +1 -1
  791. package/src/execution/__tests__/TerminalSession.test.tsx +1 -1
  792. package/src/execution/__tests__/ToolCallDetail.test.tsx +1 -1
  793. package/src/execution/__tests__/ToolCallGroup.test.tsx +4 -4
  794. package/src/execution/__tests__/ToolCallItem.test.tsx +9 -9
  795. package/src/execution/__tests__/ToolRunGroup.test.tsx +6 -6
  796. package/src/execution/__tests__/WriteBackCard.test.tsx +4 -4
  797. package/src/execution/__tests__/buildThreadItems-attachments.test.ts +174 -0
  798. package/src/execution/__tests__/message-entry.test.tsx +8 -8
  799. package/src/execution/__tests__/thread-memoization.test.ts +2 -2
  800. package/src/execution/__tests__/thread-skeleton.test.tsx +1 -1
  801. package/src/execution/__tests__/virtualized-thread.test.tsx +1 -1
  802. package/src/execution/index.ts +6 -0
  803. package/src/execution/tool-rendering-primitives.tsx +12 -12
  804. package/src/feedback/StigmerToaster.tsx +8 -5
  805. package/src/file-reference/FileReferenceChipList.tsx +5 -5
  806. package/src/github/GitHubRepoPicker.tsx +60 -60
  807. package/src/github/__tests__/decodeGitHubContent.test.ts +42 -1
  808. package/src/github/decodeGitHubContent.ts +22 -5
  809. package/src/github/useGitHubFileReader.ts +13 -3
  810. package/src/iam-policy/GrantAccessForm.tsx +11 -11
  811. package/src/iam-policy/OrgMembersPanel.tsx +48 -48
  812. package/src/iam-policy/PeopleWithAccess.tsx +23 -23
  813. package/src/iam-policy/PrincipalPicker.tsx +34 -34
  814. package/src/iam-policy/ProviderBadge.tsx +2 -2
  815. package/src/iam-policy/RoleSelector.tsx +9 -9
  816. package/src/iam-policy/SharePanel.tsx +5 -5
  817. package/src/identity-provider/CreateIdentityProviderForm.tsx +47 -47
  818. package/src/identity-provider/IdentityProviderDetailPanel.tsx +73 -73
  819. package/src/identity-provider/IdentityProviderListPanel.tsx +33 -33
  820. package/src/identity-provider/IdentityProviderWizard.tsx +72 -72
  821. package/src/identity-provider/ProviderPicker.tsx +17 -17
  822. package/src/identity-provider/SsoLoginPrompt.tsx +39 -39
  823. package/src/index.ts +6 -0
  824. package/src/inline-edit/InlineEditImage.tsx +26 -26
  825. package/src/inline-edit/InlineEditKeyValue.tsx +44 -44
  826. package/src/inline-edit/InlineEditResourceList.tsx +48 -48
  827. package/src/inline-edit/InlineEditSelect.tsx +22 -22
  828. package/src/inline-edit/InlineEditText.tsx +29 -29
  829. package/src/inline-edit/InlineEditTextarea.tsx +27 -27
  830. package/src/internal/ApprovalPeekBar.tsx +9 -9
  831. package/src/internal/BoundedContent.tsx +3 -3
  832. package/src/internal/CloudFeatureNotice.tsx +3 -3
  833. package/src/internal/DecisionButton.tsx +10 -10
  834. package/src/internal/InCardDecisionError.tsx +1 -1
  835. package/src/internal/JumpToLatestButton.tsx +9 -9
  836. package/src/internal/MermaidDiagram.tsx +5 -5
  837. package/src/internal/Pagination.tsx +5 -5
  838. package/src/internal/ResizableSplit.tsx +61 -20
  839. package/src/internal/RevealToggle.tsx +5 -5
  840. package/src/internal/ScrollFade.tsx +2 -2
  841. package/src/internal/VirtualizedThread.tsx +6 -6
  842. package/src/internal/__tests__/BoundedContent.test.tsx +1 -1
  843. package/src/internal/__tests__/DecisionButton.test.tsx +14 -14
  844. package/src/internal/__tests__/ResizableSplit.layout.test.tsx +136 -0
  845. package/src/internal/__tests__/ResizableSplit.test.tsx +49 -2
  846. package/src/internal/__tests__/ThreadCardShell.test.tsx +4 -4
  847. package/src/internal/__tests__/markdown-components.test.tsx +2 -2
  848. package/src/internal/__tests__/thread-animation.test.tsx +6 -6
  849. package/src/internal/file-icons/index.tsx +2 -2
  850. package/src/internal/file-tree/FileTreeNode.tsx +9 -9
  851. package/src/internal/file-tree/__tests__/FileTreeNode-explorer.test.tsx +1 -1
  852. package/src/internal/form-primitives.tsx +22 -6
  853. package/src/internal/markdown-components.tsx +24 -24
  854. package/src/internal/menu.tsx +18 -18
  855. package/src/internal/scroll-area.tsx +6 -6
  856. package/src/internal/thread-card/ThreadCardShell.tsx +10 -10
  857. package/src/internal/thread-card/glyphs.tsx +3 -3
  858. package/src/internal/tooltip.tsx +9 -11
  859. package/src/invitation/InvitationCreatedAlert.tsx +15 -15
  860. package/src/invitation/InvitationManager.tsx +79 -79
  861. package/src/invitation/InvitationRedemption.tsx +49 -49
  862. package/src/library/ResourceCountCard.tsx +7 -7
  863. package/src/library/ScopeToggle.tsx +7 -7
  864. package/src/library/VisibilityOptionRow.tsx +30 -30
  865. package/src/library/VisibilitySelector.tsx +19 -19
  866. package/src/library/__tests__/VisibilitySelector.test.tsx +0 -6
  867. package/src/manifest/ApplyManifestDialog.tsx +36 -36
  868. package/src/manifest/EditResourceYamlDialog.tsx +32 -32
  869. package/src/manifest/RedactedSecretsNotice.tsx +2 -2
  870. package/src/manifest/YamlEditor.tsx +1 -1
  871. package/src/mcp-server/McpServerConfigPanel.tsx +70 -70
  872. package/src/mcp-server/McpServerConnectDialog.tsx +80 -53
  873. package/src/mcp-server/McpServerDetailView.tsx +325 -224
  874. package/src/mcp-server/McpServerPicker.tsx +50 -50
  875. package/src/mcp-server/McpToolSelector.tsx +26 -26
  876. package/src/mcp-server/OAuthAppForm.tsx +32 -32
  877. package/src/mcp-server/OAuthCallbackHandler.tsx +11 -11
  878. package/src/mcp-server/OAuthRequiredNotice.tsx +3 -3
  879. package/src/mcp-server/StdioSandboxNotice.tsx +3 -3
  880. package/src/mcp-server/__tests__/McpServerDetailView.test.tsx +162 -7
  881. package/src/mcp-server/__tests__/useMcpServerOAuthConnect.test.tsx +159 -0
  882. package/src/mcp-server/index.ts +4 -1
  883. package/src/mcp-server/steps/EnvironmentAuthStep.tsx +71 -71
  884. package/src/mcp-server/steps/IdentityTransportStep.tsx +94 -94
  885. package/src/mcp-server/steps/ReviewStep.tsx +17 -17
  886. package/src/mcp-server/useMcpServerOAuthConnect.ts +65 -10
  887. package/src/models/HarnessSelector.tsx +8 -8
  888. package/src/models/ModelSelector.tsx +58 -58
  889. package/src/models/__tests__/ModelSelector-serviceTier.test.tsx +2 -7
  890. package/src/oauth-app/CreateOAuthAppForm.tsx +28 -28
  891. package/src/oauth-app/OAuthAppDetailPanel.tsx +51 -51
  892. package/src/oauth-app/OAuthAppListPanel.tsx +14 -14
  893. package/src/organization/CreateOrganizationForm.tsx +37 -37
  894. package/src/organization/OrgProfilePanel.tsx +65 -65
  895. package/src/organization/OrgSwitcher.tsx +33 -33
  896. package/src/platform-client/CreatePlatformClientForm.tsx +59 -59
  897. package/src/platform-client/PlatformClientDetailPanel.tsx +107 -107
  898. package/src/platform-client/PlatformClientListPanel.tsx +38 -38
  899. package/src/platform-client/PlatformClientSecretAlert.tsx +18 -18
  900. package/src/portal-container.ts +36 -9
  901. package/src/pricing-governance/BaselineEditor.tsx +29 -29
  902. package/src/pricing-governance/ModelCatalogPanel.tsx +28 -28
  903. package/src/pricing-governance/ModelGovernanceDetail.tsx +35 -35
  904. package/src/pricing-governance/OperatorAccessNotice.tsx +3 -3
  905. package/src/pricing-governance/PricingGovernanceConsole.tsx +31 -31
  906. package/src/pricing-governance/PricingGovernancePanel.tsx +19 -19
  907. package/src/pricing-governance/RetireConfirm.tsx +7 -7
  908. package/src/pricing-governance/governance-primitives.tsx +12 -12
  909. package/src/resource-creation/CreationPicker.tsx +23 -23
  910. package/src/resource-creation/StepIndicator.tsx +17 -17
  911. package/src/resource-creation/TemplateCard.tsx +23 -23
  912. package/src/resource-creation/TemplateGallery.tsx +13 -13
  913. package/src/resource-creation/WizardNav.tsx +19 -19
  914. package/src/resource-creation/WizardShell.tsx +7 -7
  915. package/src/resource-detail/ConfirmDialog.tsx +16 -16
  916. package/src/resource-detail/ResourceActionBar.tsx +6 -6
  917. package/src/resource-detail/ResourceDetailShell.tsx +14 -14
  918. package/src/resource-detail/Section.tsx +10 -10
  919. package/src/resource-workbench/components/BulkActionBar.tsx +13 -13
  920. package/src/resource-workbench/components/ColumnHeader.tsx +9 -9
  921. package/src/resource-workbench/components/FilterBar.tsx +9 -9
  922. package/src/resource-workbench/components/ResourceAvatar.tsx +19 -19
  923. package/src/resource-workbench/components/ResourceCards.tsx +8 -8
  924. package/src/resource-workbench/components/ResourceInspector.tsx +8 -8
  925. package/src/resource-workbench/components/ResourceList.tsx +7 -7
  926. package/src/resource-workbench/components/ResourceTable.tsx +12 -12
  927. package/src/resource-workbench/components/ResourceWorkbench.tsx +42 -42
  928. package/src/resource-workbench/components/SelectionCheckbox.tsx +2 -2
  929. package/src/resource-workbench/components/StatusBadge.tsx +17 -17
  930. package/src/resource-workbench/components/ViewSwitcher.tsx +7 -7
  931. package/src/schedule/CadenceField.tsx +36 -36
  932. package/src/schedule/ScheduleDetailView.tsx +105 -105
  933. package/src/schedule/ScheduleForm.tsx +49 -49
  934. package/src/schedule/ScheduleRowActions.tsx +4 -4
  935. package/src/schedule/ScheduleRunsTable.tsx +43 -43
  936. package/src/schedule/TimeZoneField.tsx +12 -12
  937. package/src/schedule/__tests__/scheduleCreation.test.tsx +0 -7
  938. package/src/schedule/scheduleColumns.tsx +7 -7
  939. package/src/session/NewSessionViewer.tsx +5 -5
  940. package/src/session/PlanEditor.tsx +37 -37
  941. package/src/session/PlanStreamingDocument.tsx +8 -8
  942. package/src/session/SessionViewer.tsx +49 -48
  943. package/src/session/SessionViewerLayout.tsx +14 -11
  944. package/src/session/__tests__/NewSessionViewer.test.tsx +4 -4
  945. package/src/session/__tests__/PlanEditor.test.tsx +2 -2
  946. package/src/session/__tests__/SessionViewerLayout.test.tsx +20 -8
  947. package/src/session/__tests__/useSessionConversation.test.tsx +62 -0
  948. package/src/session/facets/ArtifactsTab.tsx +3 -3
  949. package/src/session/facets/ChangesTab.tsx +5 -5
  950. package/src/session/facets/SetupTab.tsx +26 -26
  951. package/src/session/facets/UsageTab.tsx +2 -2
  952. package/src/session/useSessionConversation.ts +21 -2
  953. package/src/settings/ApiKeysSection.tsx +6 -6
  954. package/src/settings/ChannelAppsSection.tsx +6 -6
  955. package/src/settings/EnvironmentsSection.tsx +15 -15
  956. package/src/settings/IdentityProvidersSection.tsx +7 -7
  957. package/src/settings/InvitationsSection.tsx +4 -4
  958. package/src/settings/MembersSection.tsx +5 -5
  959. package/src/settings/OAuthAppsSection.tsx +6 -6
  960. package/src/settings/OrgProfileSection.tsx +3 -3
  961. package/src/settings/PlatformClientsSection.tsx +7 -7
  962. package/src/settings/UsageSection.tsx +3 -3
  963. package/src/sharing/AgentShareList.tsx +39 -39
  964. package/src/sharing/ShareAgentDialog.tsx +149 -149
  965. package/src/sharing/SharedAgentChat.tsx +24 -24
  966. package/src/sharing/__tests__/AgentShareList.test.tsx +0 -7
  967. package/src/sidebar/SettingsSidebar.tsx +7 -7
  968. package/src/sidebar/WorkspaceSidebar.tsx +25 -25
  969. package/src/sidebar/__tests__/SettingsSidebar.test.tsx +3 -7
  970. package/src/sidebar/__tests__/WorkspaceSidebar.test.tsx +4 -11
  971. package/src/sidebar/chrome.tsx +16 -16
  972. package/src/skill/SkillDetailView.tsx +54 -54
  973. package/src/skill/SkillDiffDialog.tsx +25 -25
  974. package/src/skill/SkillFileBrowser.tsx +22 -22
  975. package/src/skill/SkillPicker.tsx +28 -28
  976. package/src/skill/SkillUploader.tsx +67 -67
  977. package/src/styles.css +136 -15
  978. package/src/switch/Switch.tsx +9 -9
  979. package/src/switch/__tests__/Switch.test.tsx +3 -3
  980. package/src/tabs/Tabs.tsx +11 -11
  981. package/src/usage/AgentBreakdownList.tsx +18 -18
  982. package/src/usage/CreditRunwayIndicator.tsx +4 -4
  983. package/src/usage/ExportButton.tsx +8 -8
  984. package/src/usage/HarnessSplitCard.tsx +14 -14
  985. package/src/usage/OrgUsagePanel.tsx +71 -71
  986. package/src/user/UserMenu.tsx +13 -13
  987. package/src/version-history/DiffFileList.tsx +13 -13
  988. package/src/version-history/DiffSummary.tsx +3 -3
  989. package/src/version-history/DiffViewer.tsx +14 -14
  990. package/src/version-history/MultiFileDiffView.tsx +6 -6
  991. package/src/version-history/UnifiedDiffView.tsx +4 -4
  992. package/src/version-history/VersionTimeline.tsx +21 -21
  993. package/src/version-history/VersionTimelineEntry.tsx +28 -28
  994. package/src/version-history/__tests__/UnifiedDiffView.test.tsx +2 -2
  995. package/src/workflow/ApprovalFormBuilder.tsx +48 -48
  996. package/src/workflow/BranchConditionBuilder.tsx +21 -21
  997. package/src/workflow/CanvasContextMenu.tsx +10 -10
  998. package/src/workflow/CanvasTransitionEdge.tsx +16 -16
  999. package/src/workflow/CostByWorkflowChart.tsx +18 -18
  1000. package/src/workflow/ExecutionActiveTaskIndicator.tsx +13 -13
  1001. package/src/workflow/ExecutionSummaryWidget.tsx +29 -29
  1002. package/src/workflow/ExecutionTrendChart.tsx +25 -25
  1003. package/src/workflow/FailedRunsWidget.tsx +14 -14
  1004. package/src/workflow/PendingApprovalsWidget.tsx +19 -19
  1005. package/src/workflow/TaskConfigForm.tsx +32 -32
  1006. package/src/workflow/TaskPickerPopover.tsx +22 -22
  1007. package/src/workflow/ViewYamlDialog.tsx +12 -12
  1008. package/src/workflow/WorkflowAgentCallTranscript.tsx +15 -15
  1009. package/src/workflow/WorkflowApprovalList.tsx +3 -3
  1010. package/src/workflow/WorkflowArchitectDialog.tsx +80 -80
  1011. package/src/workflow/WorkflowArtifactDocument.tsx +17 -17
  1012. package/src/workflow/WorkflowCanvasEditor.tsx +22 -22
  1013. package/src/workflow/WorkflowCanvasInner.tsx +3 -3
  1014. package/src/workflow/WorkflowCodePreviewGraph.tsx +2 -2
  1015. package/src/workflow/WorkflowDashboard.tsx +2 -2
  1016. package/src/workflow/WorkflowDetailView.tsx +50 -50
  1017. package/src/workflow/WorkflowDiffGraph.tsx +5 -5
  1018. package/src/workflow/WorkflowEditorView.tsx +58 -58
  1019. package/src/workflow/WorkflowExecutionGraph.tsx +15 -15
  1020. package/src/workflow/WorkflowExecutionHeader.tsx +14 -14
  1021. package/src/workflow/WorkflowExecutionPhaseBadge.tsx +11 -11
  1022. package/src/workflow/WorkflowExecutionViewer.tsx +39 -39
  1023. package/src/workflow/WorkflowExplainDialog.tsx +30 -30
  1024. package/src/workflow/WorkflowFileReviewList.tsx +3 -3
  1025. package/src/workflow/WorkflowGraphFullscreenDialog.tsx +11 -11
  1026. package/src/workflow/WorkflowNode.tsx +2 -2
  1027. package/src/workflow/WorkflowNodePopover.tsx +15 -15
  1028. package/src/workflow/WorkflowOverviewGraph.tsx +9 -9
  1029. package/src/workflow/WorkflowOverviewSummary.tsx +12 -12
  1030. package/src/workflow/WorkflowRefinePanel.tsx +49 -49
  1031. package/src/workflow/WorkflowRepairCard.tsx +53 -53
  1032. package/src/workflow/WorkflowRunDialog.tsx +20 -20
  1033. package/src/workflow/WorkflowRunForm.tsx +19 -19
  1034. package/src/workflow/WorkflowTaskApprovalCard.tsx +19 -19
  1035. package/src/workflow/WorkflowTaskApprovalSummary.tsx +23 -23
  1036. package/src/workflow/WorkflowTaskList.tsx +11 -11
  1037. package/src/workflow/WorkflowTaskPalette.tsx +23 -23
  1038. package/src/workflow/WorkflowTaskReviewGate.tsx +10 -10
  1039. package/src/workflow/WorkflowVersionBadge.tsx +7 -7
  1040. package/src/workflow/WorkflowVersionDiffViewer.tsx +24 -24
  1041. package/src/workflow/WorkflowVersionTimeline.tsx +32 -32
  1042. package/src/workflow/WorkflowVersionsTab.tsx +7 -7
  1043. package/src/workflow/__tests__/WorkflowAgentCallTranscript.test.tsx +2 -2
  1044. package/src/workflow/__tests__/WorkflowExecutionViewer.reconciliation.test.tsx +6 -6
  1045. package/src/workflow/__tests__/WorkflowTaskApprovalCard.test.tsx +15 -15
  1046. package/src/workflow/__tests__/WorkflowTaskApprovalSummary.test.tsx +1 -1
  1047. package/src/workflow/__tests__/node-shell.test.ts +2 -0
  1048. package/src/workflow/__tests__/task-type-visual-registry.test.ts +2 -0
  1049. package/src/workflow/diff/DiffSummaryBar.tsx +5 -5
  1050. package/src/workflow/execution-comparison/ComparisonSummaryCards.tsx +11 -11
  1051. package/src/workflow/execution-comparison/ExecutionComparisonPicker.tsx +20 -20
  1052. package/src/workflow/execution-comparison/ExecutionComparisonView.tsx +16 -16
  1053. package/src/workflow/execution-comparison/TaskComparisonTable.tsx +44 -44
  1054. package/src/workflow/execution-history/ExecutionFilterBar.tsx +12 -12
  1055. package/src/workflow/execution-history/ExecutionHistoryTable.tsx +25 -25
  1056. package/src/workflow/execution-history/FailureAnalysisPanel.tsx +18 -18
  1057. package/src/workflow/execution-history/HealthMetricsStrip.tsx +16 -16
  1058. package/src/workflow/execution-history/WorkflowExecutionHistory.tsx +1 -1
  1059. package/src/workflow/facets/WorkflowArtifactsTab.tsx +3 -3
  1060. package/src/workflow/facets/WorkflowChangesTab.tsx +8 -8
  1061. package/src/workflow/facets/WorkflowUsageTab.tsx +24 -24
  1062. package/src/workflow/inspector/EdgeInspector.tsx +14 -14
  1063. package/src/workflow/inspector/InspectorHeader.tsx +18 -18
  1064. package/src/workflow/inspector/InspectorShell.tsx +6 -6
  1065. package/src/workflow/inspector/NestedTaskList.tsx +11 -11
  1066. package/src/workflow/inspector/SentinelInspector.tsx +3 -3
  1067. package/src/workflow/inspector/WorkflowSummaryPanel.tsx +33 -33
  1068. package/src/workflow/inspector/forms/AgentCallForm.tsx +48 -48
  1069. package/src/workflow/inspector/forms/HttpCallForm.tsx +22 -22
  1070. package/src/workflow/inspector/tabs/AdvancedTab.tsx +12 -12
  1071. package/src/workflow/inspector/tabs/BranchesTab.tsx +36 -36
  1072. package/src/workflow/inspector/tabs/CatchTab.tsx +23 -23
  1073. package/src/workflow/inspector/tabs/ConfigureTab.tsx +3 -3
  1074. package/src/workflow/inspector/tabs/DataTab.tsx +6 -6
  1075. package/src/workflow/inspector/tabs/DocsTab.tsx +11 -11
  1076. package/src/workflow/inspector/tabs/IterationTab.tsx +25 -25
  1077. package/src/workflow/inspector/tabs/RuntimeTab.tsx +16 -16
  1078. package/src/workflow/instance/CreateWorkflowInstanceDialog.tsx +35 -35
  1079. package/src/workflow/instance/RunVisibilityControl.tsx +10 -10
  1080. package/src/workflow/instance/WorkflowInstanceDetailPanel.tsx +45 -45
  1081. package/src/workflow/instance/WorkflowInstanceList.tsx +32 -32
  1082. package/src/workflow/instance/__tests__/WorkflowInstanceList.test.tsx +0 -6
  1083. package/src/workflow/node-shell/BranchBadge.tsx +9 -9
  1084. package/src/workflow/node-shell/DiffBadge.tsx +4 -4
  1085. package/src/workflow/node-shell/ExecutionBadge.tsx +17 -17
  1086. package/src/workflow/node-shell/NodeActions.tsx +15 -15
  1087. package/src/workflow/node-shell/NodeContent.tsx +9 -9
  1088. package/src/workflow/node-shell/NodeHandles.tsx +5 -5
  1089. package/src/workflow/node-shell/NodeShell.tsx +27 -27
  1090. package/src/workflow/picker/BranchAddPopover.tsx +16 -16
  1091. package/src/workflow/task-detail/StructuredDataViewer.tsx +34 -34
  1092. package/src/workflow/templates/WorkflowTemplateCard.tsx +32 -32
  1093. package/src/workflow/templates/WorkflowTemplateGallery.tsx +13 -13
  1094. package/src/workflow/templates/WorkflowTemplatePreview.tsx +29 -29
  1095. package/src/workflow/thread/WorkflowTaskThread.tsx +36 -36
  1096. package/src/workspace/EditorTabs.tsx +8 -8
  1097. package/src/workspace/ExplorerTree.tsx +17 -17
  1098. package/src/workspace/FileViewer.tsx +139 -30
  1099. package/src/workspace/PanelChip.tsx +4 -4
  1100. package/src/workspace/WorkspaceContentSearch.tsx +26 -26
  1101. package/src/workspace/WorkspaceEditor.tsx +44 -44
  1102. package/src/workspace/WorkspaceFileReader.ts +55 -1
  1103. package/src/workspace/WorkspaceFileSearch.tsx +22 -22
  1104. package/src/workspace/WorkspaceSummary.tsx +6 -6
  1105. package/src/workspace/WorkspaceSurface.tsx +42 -42
  1106. package/src/workspace/__tests__/FileViewer.test.tsx +99 -1
  1107. package/src/workspace/__tests__/WorkspaceContentSearch.test.tsx +5 -5
  1108. package/src/workspace/__tests__/WorkspaceFileSearch.test.tsx +3 -3
  1109. package/src/workspace/__tests__/WorkspaceSurface.test.tsx +6 -6
  1110. package/src/workspace/index.ts +2 -0
  1111. package/styles.css +1 -1
  1112. package/switch/Switch.js +2 -2
  1113. package/switch/Switch.js.map +1 -1
  1114. package/tabs/Tabs.js +7 -7
  1115. package/tabs/Tabs.js.map +1 -1
  1116. package/usage/AgentBreakdownList.js +4 -4
  1117. package/usage/AgentBreakdownList.js.map +1 -1
  1118. package/usage/CreditRunwayIndicator.js +1 -1
  1119. package/usage/CreditRunwayIndicator.js.map +1 -1
  1120. package/usage/ExportButton.js +2 -2
  1121. package/usage/ExportButton.js.map +1 -1
  1122. package/usage/HarnessSplitCard.js +6 -6
  1123. package/usage/HarnessSplitCard.js.map +1 -1
  1124. package/usage/OrgUsagePanel.js +15 -15
  1125. package/usage/OrgUsagePanel.js.map +1 -1
  1126. package/user/UserMenu.js +3 -3
  1127. package/user/UserMenu.js.map +1 -1
  1128. package/version-history/DiffFileList.js +8 -8
  1129. package/version-history/DiffFileList.js.map +1 -1
  1130. package/version-history/DiffSummary.js +1 -1
  1131. package/version-history/DiffSummary.js.map +1 -1
  1132. package/version-history/DiffViewer.js +11 -11
  1133. package/version-history/DiffViewer.js.map +1 -1
  1134. package/version-history/MultiFileDiffView.js +2 -2
  1135. package/version-history/MultiFileDiffView.js.map +1 -1
  1136. package/version-history/UnifiedDiffView.js +1 -1
  1137. package/version-history/UnifiedDiffView.js.map +1 -1
  1138. package/version-history/VersionTimeline.js +4 -4
  1139. package/version-history/VersionTimeline.js.map +1 -1
  1140. package/version-history/VersionTimelineEntry.js +9 -9
  1141. package/version-history/VersionTimelineEntry.js.map +1 -1
  1142. package/workflow/ApprovalFormBuilder.js +15 -15
  1143. package/workflow/ApprovalFormBuilder.js.map +1 -1
  1144. package/workflow/BranchConditionBuilder.js +8 -8
  1145. package/workflow/BranchConditionBuilder.js.map +1 -1
  1146. package/workflow/CanvasContextMenu.js +6 -6
  1147. package/workflow/CanvasContextMenu.js.map +1 -1
  1148. package/workflow/CanvasTransitionEdge.js +11 -11
  1149. package/workflow/CanvasTransitionEdge.js.map +1 -1
  1150. package/workflow/CostByWorkflowChart.js +4 -4
  1151. package/workflow/CostByWorkflowChart.js.map +1 -1
  1152. package/workflow/ExecutionActiveTaskIndicator.js +8 -8
  1153. package/workflow/ExecutionActiveTaskIndicator.js.map +1 -1
  1154. package/workflow/ExecutionSummaryWidget.js +15 -15
  1155. package/workflow/ExecutionSummaryWidget.js.map +1 -1
  1156. package/workflow/ExecutionTrendChart.js +10 -10
  1157. package/workflow/ExecutionTrendChart.js.map +1 -1
  1158. package/workflow/FailedRunsWidget.js +3 -3
  1159. package/workflow/FailedRunsWidget.js.map +1 -1
  1160. package/workflow/PendingApprovalsWidget.js +3 -3
  1161. package/workflow/PendingApprovalsWidget.js.map +1 -1
  1162. package/workflow/TaskConfigForm.js +12 -12
  1163. package/workflow/TaskConfigForm.js.map +1 -1
  1164. package/workflow/TaskPickerPopover.js +5 -5
  1165. package/workflow/TaskPickerPopover.js.map +1 -1
  1166. package/workflow/ViewYamlDialog.js +2 -2
  1167. package/workflow/ViewYamlDialog.js.map +1 -1
  1168. package/workflow/WorkflowAgentCallTranscript.js +2 -2
  1169. package/workflow/WorkflowAgentCallTranscript.js.map +1 -1
  1170. package/workflow/WorkflowApprovalList.js +2 -2
  1171. package/workflow/WorkflowApprovalList.js.map +1 -1
  1172. package/workflow/WorkflowArchitectDialog.js +9 -9
  1173. package/workflow/WorkflowArchitectDialog.js.map +1 -1
  1174. package/workflow/WorkflowArtifactDocument.js +7 -7
  1175. package/workflow/WorkflowArtifactDocument.js.map +1 -1
  1176. package/workflow/WorkflowCanvasEditor.js +6 -6
  1177. package/workflow/WorkflowCanvasEditor.js.map +1 -1
  1178. package/workflow/WorkflowCanvasInner.js +1 -1
  1179. package/workflow/WorkflowCanvasInner.js.map +1 -1
  1180. package/workflow/WorkflowCodePreviewGraph.js +2 -2
  1181. package/workflow/WorkflowCodePreviewGraph.js.map +1 -1
  1182. package/workflow/WorkflowDashboard.js +1 -1
  1183. package/workflow/WorkflowDashboard.js.map +1 -1
  1184. package/workflow/WorkflowDetailView.js +15 -15
  1185. package/workflow/WorkflowDetailView.js.map +1 -1
  1186. package/workflow/WorkflowDiffGraph.js +3 -3
  1187. package/workflow/WorkflowDiffGraph.js.map +1 -1
  1188. package/workflow/WorkflowEditorView.js +13 -13
  1189. package/workflow/WorkflowEditorView.js.map +1 -1
  1190. package/workflow/WorkflowExecutionGraph.js +6 -6
  1191. package/workflow/WorkflowExecutionGraph.js.map +1 -1
  1192. package/workflow/WorkflowExecutionHeader.js +4 -4
  1193. package/workflow/WorkflowExecutionHeader.js.map +1 -1
  1194. package/workflow/WorkflowExecutionPhaseBadge.js +9 -9
  1195. package/workflow/WorkflowExecutionPhaseBadge.js.map +1 -1
  1196. package/workflow/WorkflowExecutionViewer.js +16 -16
  1197. package/workflow/WorkflowExecutionViewer.js.map +1 -1
  1198. package/workflow/WorkflowExplainDialog.js +2 -2
  1199. package/workflow/WorkflowExplainDialog.js.map +1 -1
  1200. package/workflow/WorkflowFileReviewList.js +2 -2
  1201. package/workflow/WorkflowFileReviewList.js.map +1 -1
  1202. package/workflow/WorkflowGraphFullscreenDialog.js +1 -1
  1203. package/workflow/WorkflowGraphFullscreenDialog.js.map +1 -1
  1204. package/workflow/WorkflowNode.js +1 -1
  1205. package/workflow/WorkflowNode.js.map +1 -1
  1206. package/workflow/WorkflowNodePopover.js +2 -2
  1207. package/workflow/WorkflowNodePopover.js.map +1 -1
  1208. package/workflow/WorkflowOverviewGraph.js +4 -4
  1209. package/workflow/WorkflowOverviewGraph.js.map +1 -1
  1210. package/workflow/WorkflowOverviewSummary.js +8 -8
  1211. package/workflow/WorkflowOverviewSummary.js.map +1 -1
  1212. package/workflow/WorkflowRefinePanel.js +5 -5
  1213. package/workflow/WorkflowRefinePanel.js.map +1 -1
  1214. package/workflow/WorkflowRepairCard.js +5 -5
  1215. package/workflow/WorkflowRepairCard.js.map +1 -1
  1216. package/workflow/WorkflowRunDialog.js +2 -2
  1217. package/workflow/WorkflowRunDialog.js.map +1 -1
  1218. package/workflow/WorkflowRunForm.js +10 -10
  1219. package/workflow/WorkflowRunForm.js.map +1 -1
  1220. package/workflow/WorkflowTaskApprovalCard.js +1 -1
  1221. package/workflow/WorkflowTaskApprovalCard.js.map +1 -1
  1222. package/workflow/WorkflowTaskApprovalSummary.js +8 -8
  1223. package/workflow/WorkflowTaskApprovalSummary.js.map +1 -1
  1224. package/workflow/WorkflowTaskList.js +4 -4
  1225. package/workflow/WorkflowTaskList.js.map +1 -1
  1226. package/workflow/WorkflowTaskPalette.js +5 -5
  1227. package/workflow/WorkflowTaskPalette.js.map +1 -1
  1228. package/workflow/WorkflowTaskReviewGate.js +3 -3
  1229. package/workflow/WorkflowTaskReviewGate.js.map +1 -1
  1230. package/workflow/WorkflowVersionBadge.js +1 -1
  1231. package/workflow/WorkflowVersionBadge.js.map +1 -1
  1232. package/workflow/WorkflowVersionDiffViewer.js +12 -12
  1233. package/workflow/WorkflowVersionDiffViewer.js.map +1 -1
  1234. package/workflow/WorkflowVersionTimeline.js +7 -7
  1235. package/workflow/WorkflowVersionTimeline.js.map +1 -1
  1236. package/workflow/WorkflowVersionsTab.js +1 -1
  1237. package/workflow/WorkflowVersionsTab.js.map +1 -1
  1238. package/workflow/diff/DiffSummaryBar.js +2 -2
  1239. package/workflow/diff/DiffSummaryBar.js.map +1 -1
  1240. package/workflow/execution-comparison/ComparisonSummaryCards.js +1 -1
  1241. package/workflow/execution-comparison/ComparisonSummaryCards.js.map +1 -1
  1242. package/workflow/execution-comparison/ExecutionComparisonPicker.js +7 -7
  1243. package/workflow/execution-comparison/ExecutionComparisonPicker.js.map +1 -1
  1244. package/workflow/execution-comparison/ExecutionComparisonView.js +4 -4
  1245. package/workflow/execution-comparison/ExecutionComparisonView.js.map +1 -1
  1246. package/workflow/execution-comparison/TaskComparisonTable.js +22 -22
  1247. package/workflow/execution-comparison/TaskComparisonTable.js.map +1 -1
  1248. package/workflow/execution-history/ExecutionFilterBar.js +5 -5
  1249. package/workflow/execution-history/ExecutionFilterBar.js.map +1 -1
  1250. package/workflow/execution-history/ExecutionHistoryTable.js +11 -11
  1251. package/workflow/execution-history/ExecutionHistoryTable.js.map +1 -1
  1252. package/workflow/execution-history/FailureAnalysisPanel.js +4 -4
  1253. package/workflow/execution-history/FailureAnalysisPanel.js.map +1 -1
  1254. package/workflow/execution-history/HealthMetricsStrip.js +8 -8
  1255. package/workflow/execution-history/HealthMetricsStrip.js.map +1 -1
  1256. package/workflow/execution-history/WorkflowExecutionHistory.js +1 -1
  1257. package/workflow/execution-history/WorkflowExecutionHistory.js.map +1 -1
  1258. package/workflow/facets/WorkflowArtifactsTab.js +2 -2
  1259. package/workflow/facets/WorkflowArtifactsTab.js.map +1 -1
  1260. package/workflow/facets/WorkflowChangesTab.js +5 -5
  1261. package/workflow/facets/WorkflowChangesTab.js.map +1 -1
  1262. package/workflow/facets/WorkflowUsageTab.js +6 -6
  1263. package/workflow/facets/WorkflowUsageTab.js.map +1 -1
  1264. package/workflow/inspector/EdgeInspector.js +1 -1
  1265. package/workflow/inspector/EdgeInspector.js.map +1 -1
  1266. package/workflow/inspector/InspectorHeader.js +7 -7
  1267. package/workflow/inspector/InspectorHeader.js.map +1 -1
  1268. package/workflow/inspector/InspectorShell.js +2 -2
  1269. package/workflow/inspector/InspectorShell.js.map +1 -1
  1270. package/workflow/inspector/NestedTaskList.js +2 -2
  1271. package/workflow/inspector/NestedTaskList.js.map +1 -1
  1272. package/workflow/inspector/SentinelInspector.js +1 -1
  1273. package/workflow/inspector/SentinelInspector.js.map +1 -1
  1274. package/workflow/inspector/WorkflowSummaryPanel.js +5 -5
  1275. package/workflow/inspector/WorkflowSummaryPanel.js.map +1 -1
  1276. package/workflow/inspector/forms/AgentCallForm.js +9 -9
  1277. package/workflow/inspector/forms/AgentCallForm.js.map +1 -1
  1278. package/workflow/inspector/forms/HttpCallForm.js +4 -4
  1279. package/workflow/inspector/forms/HttpCallForm.js.map +1 -1
  1280. package/workflow/inspector/tabs/AdvancedTab.js +2 -2
  1281. package/workflow/inspector/tabs/AdvancedTab.js.map +1 -1
  1282. package/workflow/inspector/tabs/BranchesTab.js +6 -6
  1283. package/workflow/inspector/tabs/BranchesTab.js.map +1 -1
  1284. package/workflow/inspector/tabs/CatchTab.js +2 -2
  1285. package/workflow/inspector/tabs/CatchTab.js.map +1 -1
  1286. package/workflow/inspector/tabs/ConfigureTab.js +3 -3
  1287. package/workflow/inspector/tabs/ConfigureTab.js.map +1 -1
  1288. package/workflow/inspector/tabs/DataTab.js +1 -1
  1289. package/workflow/inspector/tabs/DataTab.js.map +1 -1
  1290. package/workflow/inspector/tabs/DocsTab.js +1 -1
  1291. package/workflow/inspector/tabs/DocsTab.js.map +1 -1
  1292. package/workflow/inspector/tabs/IterationTab.js +3 -3
  1293. package/workflow/inspector/tabs/IterationTab.js.map +1 -1
  1294. package/workflow/inspector/tabs/RuntimeTab.js +9 -9
  1295. package/workflow/inspector/tabs/RuntimeTab.js.map +1 -1
  1296. package/workflow/instance/CreateWorkflowInstanceDialog.js +1 -1
  1297. package/workflow/instance/CreateWorkflowInstanceDialog.js.map +1 -1
  1298. package/workflow/instance/RunVisibilityControl.js +5 -5
  1299. package/workflow/instance/RunVisibilityControl.js.map +1 -1
  1300. package/workflow/instance/WorkflowInstanceDetailPanel.js +2 -2
  1301. package/workflow/instance/WorkflowInstanceDetailPanel.js.map +1 -1
  1302. package/workflow/instance/WorkflowInstanceList.js +4 -4
  1303. package/workflow/instance/WorkflowInstanceList.js.map +1 -1
  1304. package/workflow/node-shell/BranchBadge.js +3 -3
  1305. package/workflow/node-shell/BranchBadge.js.map +1 -1
  1306. package/workflow/node-shell/DiffBadge.js +4 -4
  1307. package/workflow/node-shell/DiffBadge.js.map +1 -1
  1308. package/workflow/node-shell/ExecutionBadge.js +10 -10
  1309. package/workflow/node-shell/ExecutionBadge.js.map +1 -1
  1310. package/workflow/node-shell/NodeActions.js +3 -3
  1311. package/workflow/node-shell/NodeActions.js.map +1 -1
  1312. package/workflow/node-shell/NodeContent.js +5 -5
  1313. package/workflow/node-shell/NodeContent.js.map +1 -1
  1314. package/workflow/node-shell/NodeHandles.js +5 -5
  1315. package/workflow/node-shell/NodeHandles.js.map +1 -1
  1316. package/workflow/node-shell/NodeShell.js +14 -14
  1317. package/workflow/node-shell/NodeShell.js.map +1 -1
  1318. package/workflow/picker/BranchAddPopover.js +2 -2
  1319. package/workflow/picker/BranchAddPopover.js.map +1 -1
  1320. package/workflow/task-detail/StructuredDataViewer.js +12 -12
  1321. package/workflow/task-detail/StructuredDataViewer.js.map +1 -1
  1322. package/workflow/templates/WorkflowTemplateCard.js +17 -17
  1323. package/workflow/templates/WorkflowTemplateCard.js.map +1 -1
  1324. package/workflow/templates/WorkflowTemplateGallery.js +5 -5
  1325. package/workflow/templates/WorkflowTemplateGallery.js.map +1 -1
  1326. package/workflow/templates/WorkflowTemplatePreview.js +5 -5
  1327. package/workflow/templates/WorkflowTemplatePreview.js.map +1 -1
  1328. package/workflow/thread/WorkflowTaskThread.js +16 -16
  1329. package/workflow/thread/WorkflowTaskThread.js.map +1 -1
  1330. package/workspace/EditorTabs.js +5 -5
  1331. package/workspace/EditorTabs.js.map +1 -1
  1332. package/workspace/ExplorerTree.js +6 -6
  1333. package/workspace/ExplorerTree.js.map +1 -1
  1334. package/workspace/FileViewer.d.ts.map +1 -1
  1335. package/workspace/FileViewer.js +55 -17
  1336. package/workspace/FileViewer.js.map +1 -1
  1337. package/workspace/PanelChip.js +1 -1
  1338. package/workspace/PanelChip.js.map +1 -1
  1339. package/workspace/WorkspaceContentSearch.js +11 -11
  1340. package/workspace/WorkspaceContentSearch.js.map +1 -1
  1341. package/workspace/WorkspaceEditor.js +10 -10
  1342. package/workspace/WorkspaceEditor.js.map +1 -1
  1343. package/workspace/WorkspaceFileReader.d.ts +29 -1
  1344. package/workspace/WorkspaceFileReader.d.ts.map +1 -1
  1345. package/workspace/WorkspaceFileReader.js +42 -0
  1346. package/workspace/WorkspaceFileReader.js.map +1 -1
  1347. package/workspace/WorkspaceFileSearch.js +9 -9
  1348. package/workspace/WorkspaceFileSearch.js.map +1 -1
  1349. package/workspace/WorkspaceSummary.js +3 -3
  1350. package/workspace/WorkspaceSummary.js.map +1 -1
  1351. package/workspace/WorkspaceSurface.js +22 -22
  1352. package/workspace/WorkspaceSurface.js.map +1 -1
  1353. package/workspace/index.d.ts +1 -1
  1354. package/workspace/index.d.ts.map +1 -1
  1355. package/workspace/index.js +1 -1
  1356. package/workspace/index.js.map +1 -1
@@ -11,7 +11,7 @@ import { useUpdateMcpServer } from "./useUpdateMcpServer.js";
11
11
  import { mcpServerToInput } from "./internal/mcpServerToInput.js";
12
12
  import { useMcpServerConnect } from "./useMcpServerConnect.js";
13
13
  import { useMcpServerCredentials } from "./useMcpServerCredentials.js";
14
- import { useMcpServerOAuthConnect } from "./useMcpServerOAuthConnect.js";
14
+ import { useMcpServerOAuthConnect, getOAuthConnectErrorMessage, } from "./useMcpServerOAuthConnect.js";
15
15
  import { StdioSandboxNotice } from "./StdioSandboxNotice.js";
16
16
  import { OAuthRequiredNotice } from "./OAuthRequiredNotice.js";
17
17
  import { useDisconnectOAuth } from "./useDisconnectOAuth.js";
@@ -114,31 +114,48 @@ export function McpServerDetailView({ org, slug, mcpServerState, onResourceLoad,
114
114
  refetch();
115
115
  }
116
116
  catch {
117
- // error state is managed by the oauth hook
117
+ // Error state is managed by the oauth hook — but refetch anyway:
118
+ // completeOAuthConnect persists the grant BEFORE the chained
119
+ // discovery runs, so a discovery-leg failure still changed server
120
+ // state. Without this, stale isOAuthConnected=false makes the next
121
+ // Connect click relaunch the popup instead of retrying discovery
122
+ // (stigmer/stigmer#229).
123
+ credentials.refetch();
124
+ refetch();
118
125
  }
119
126
  }, [mcpServer, oauth, credentials, refetch]);
127
+ // A failure in the "connecting" phase proves sign-in already succeeded —
128
+ // the grant exists server-side even while the grant-status refetch is
129
+ // still in flight. Retry bare discovery; never relaunch the popup and
130
+ // never demand credentials the flow already has.
131
+ const isDiscoveryRetry = credentials.authMode === "oauth" && oauth.failedPhase === "connecting";
120
132
  const handleConnectClick = useCallback(async () => {
121
133
  if (!mcpServer?.metadata?.id)
122
134
  return;
123
135
  if (credentials.authMode === "oauth" &&
124
136
  !credentials.isOAuthConnected &&
125
- !credentials.manualOverride) {
137
+ !credentials.manualOverride &&
138
+ !isDiscoveryRetry) {
126
139
  handleOAuthSignIn();
127
140
  return;
128
141
  }
129
- if (!credentials.isReady) {
142
+ if (!credentials.isReady && !isDiscoveryRetry) {
130
143
  setShowCredentialForm(true);
131
144
  return;
132
145
  }
133
146
  const envKeys = Object.keys(mcpServer.spec?.env ?? {});
134
147
  try {
135
148
  await connection.connect(mcpServer.metadata.id, activeOrg ?? org, undefined, envKeys);
149
+ // Discovery succeeded — retire the OAuth chain's stale
150
+ // discovery-failure error so the banner doesn't outlive the state
151
+ // it described.
152
+ oauth.clearError();
136
153
  refetch();
137
154
  }
138
155
  catch {
139
156
  // error state is managed by the hook
140
157
  }
141
- }, [mcpServer, credentials.authMode, credentials.isOAuthConnected, credentials.manualOverride, credentials.isReady, connection, refetch, handleOAuthSignIn]);
158
+ }, [mcpServer, credentials.authMode, credentials.isOAuthConnected, credentials.manualOverride, credentials.isReady, isDiscoveryRetry, connection, oauth.clearError, refetch, handleOAuthSignIn, activeOrg, org]);
142
159
  const handleCredentialSubmit = useCallback(async (values, options) => {
143
160
  try {
144
161
  if (options.saveForFuture) {
@@ -210,6 +227,18 @@ export function McpServerDetailView({ org, slug, mcpServerState, onResourceLoad,
210
227
  const tools = capabilities?.tools ?? [];
211
228
  const resourceTemplates = capabilities?.resourceTemplates ?? [];
212
229
  const hasDiscoveredTools = tools.length > 0;
230
+ // "Signed in but never discovered" (stigmer/stigmer#229): the OAuth flow
231
+ // persists the grant in completeOAuthConnect BEFORE the chained discovery
232
+ // runs, so a failed/interrupted discovery leg leaves a healthy grant with
233
+ // empty discovered_capabilities. Both inputs are server truth, so this
234
+ // derivation survives reloads and self-heals once discovery lands (even
235
+ // when the workflow outlives the browser's RPC). Token-expired grants are
236
+ // excluded — re-auth, not discovery, is their next step.
237
+ const isOAuthStranded = credentials.authMode === "oauth" &&
238
+ credentials.isOAuthConnected &&
239
+ credentials.connectionHealth !==
240
+ OAuthConnectionHealth.OAUTH_CONNECTION_HEALTH_TOKEN_EXPIRED &&
241
+ !hasDiscoveredTools;
213
242
  const capabilityTabs = useMemo(() => {
214
243
  const items = [
215
244
  { id: "tools", label: "Tools", badge: tools.length },
@@ -225,6 +254,14 @@ export function McpServerDetailView({ org, slug, mcpServerState, onResourceLoad,
225
254
  return items;
226
255
  }, [tools.length, totalPolicyCount, resourceTemplates.length]);
227
256
  const combinedError = connection.error ?? oauth.error;
257
+ // OAuth-chain errors compose through the phase-aware helper so a
258
+ // discovery-leg failure reads "signed in, but discovery failed" instead
259
+ // of masquerading as a failed sign-in.
260
+ const combinedErrorMessage = connection.error
261
+ ? getUserMessage(connection.error)
262
+ : oauth.error
263
+ ? getOAuthConnectErrorMessage(oauth.error, oauth.failedPhase)
264
+ : null;
228
265
  const combinedClearError = useCallback(() => {
229
266
  connection.clearError();
230
267
  oauth.clearError();
@@ -270,7 +307,7 @@ export function McpServerDetailView({ org, slug, mcpServerState, onResourceLoad,
270
307
  qualifiedSlug: meta?.slug
271
308
  ? (meta.org ? `${meta.org}/${meta.slug}` : meta.slug)
272
309
  : undefined,
273
- icon: editable && saveMcpField ? (_jsx(InlineEditImage, { value: spec?.iconUrl ?? "", onSave: (v) => saveMcpField("iconUrl", v || undefined), isSaving: isUpdating, fallback: _jsx(McpServerIcon, { className: "size-6 text-muted-foreground" }), size: "md" })) : spec?.iconUrl ? undefined : _jsx(McpServerIcon, { className: "size-6 text-muted-foreground" }),
310
+ icon: editable && saveMcpField ? (_jsx(InlineEditImage, { value: spec?.iconUrl ?? "", onSave: (v) => saveMcpField("iconUrl", v || undefined), isSaving: isUpdating, fallback: _jsx(McpServerIcon, { className: "stg:size-6 stg:text-muted-foreground" }), size: "md" })) : spec?.iconUrl ? undefined : _jsx(McpServerIcon, { className: "stg:size-6 stg:text-muted-foreground" }),
274
311
  iconUrl: editable ? undefined : spec?.iconUrl || undefined,
275
312
  createdAt: specAudit?.createdAt ? timestampDate(specAudit.createdAt) : null,
276
313
  updatedAt: specAudit?.updatedAt ? timestampDate(specAudit.updatedAt) : null,
@@ -285,16 +322,16 @@ export function McpServerDetailView({ org, slug, mcpServerState, onResourceLoad,
285
322
  const headerMetaExtra = (_jsxs(_Fragment, { children: [status && _jsx(ValidationStateBadge, { state: status.validationState }), lastDiscoveredAt && (_jsxs(_Fragment, { children: [_jsx(Dot, {}), _jsxs("span", { children: ["Discovered ", formatDate(lastDiscoveredAt)] })] }))] }));
286
323
  const headerBanner = status?.validationState === ValidationState.invalid &&
287
324
  status.validationMessage ? (_jsx(ValidationBanner, { message: status.validationMessage })) : undefined;
288
- return (_jsxs(_Fragment, { children: [_jsxs(ResourceDetailShell, { header: headerMeta, visibilityControl: visibilityControl, headerMetaExtra: headerMetaExtra, headerBanner: headerBanner, primaryAction: primaryAction, actions: mergedActions, className: className, children: [(editable || spec?.description) && (_jsx(Section, { title: "Description", children: editable && saveMcpField ? (_jsx("div", { className: "max-h-20 overflow-y-auto p-3", children: _jsx(InlineEditTextarea, { value: spec?.description || "", onSave: (v) => saveMcpField("description", v || undefined), isSaving: isUpdating, placeholder: "Add a description", minRows: 2 }) })) : (_jsx("div", { className: "p-3", children: _jsx("pre", { className: "whitespace-pre-wrap break-words text-sm text-foreground font-sans", children: spec?.description }) })) })), hasSource && _jsx(SourceSection, { spec: spec }), (editable || spec?.serverType.case) && (_jsx(ServerConfigSection, { serverType: spec?.serverType, editable: editable, isSaving: isUpdating, saveMcpField: saveMcpField })), (editable || (spec?.env && Object.keys(spec.env).length > 0)) && (_jsx(EnvSection, { data: spec?.env ?? {}, oauthTargetEnvVar: credentials.oauthTargetEnvVar, editable: editable, isSaving: isUpdating, saveMcpField: saveMcpField })), _jsxs(Section, { title: "Connection", scrollTarget: "mcp-connection", children: [_jsx(StdioSandboxNotice, { serverType: spec?.serverType, className: "mb-3" }), _jsx(OAuthRequiredNotice, { oauthOnly: spec?.auth?.oauthOnly, className: "mb-3" }), _jsx(ConnectBar, { manualEntrySupported: credentials.manualEntrySupported, isConnecting: connection.isConnecting || oauth.isInProgress, connectionError: combinedError, onConnect: handleConnectClick, onClearConnectionError: combinedClearError, hasDiscoveredTools: hasDiscoveredTools, credentialsLoading: credentials.isLoading, oauthPhase: oauth.phase, authMode: credentials.authMode, isOAuthConnected: credentials.isOAuthConnected, connectionHealth: credentials.connectionHealth, canDisconnect: credentials.canDisconnect, onDisconnect: handleDisconnect, isDisconnecting: disconnectOAuth.isDisconnecting, disconnectError: disconnectOAuth.error, onClearDisconnectError: disconnectOAuth.clearError, serverName: mcpServer?.metadata?.name ?? slug, accessTokenExpiresAt: credentials.accessTokenExpiresAt, tokenLifetimeHint: credentials.tokenLifetimeHint, isVendorApprovalPending: credentials.isVendorApprovalPending, isVendorApprovalBlocked: credentials.isVendorApprovalBlocked, vendorApprovalDocsUrl: credentials.vendorApprovalDocsUrl, canBringOwnApp: credentials.canBringOwnApp, isOrgOAuthApp: credentials.isOrgOAuthApp, onBringOwnApp: () => setShowByoaForm(true), onRemoveOrgApp: handleRemoveOrgApp, isRemovingOrgApp: orgOAuthApp.isDeleting, removeOrgAppError: orgOAuthApp.deleteError, onClearRemoveOrgAppError: orgOAuthApp.clearErrors, manualOverride: credentials.manualOverride, onManualOverride: () => {
325
+ return (_jsxs(_Fragment, { children: [_jsxs(ResourceDetailShell, { header: headerMeta, visibilityControl: visibilityControl, headerMetaExtra: headerMetaExtra, headerBanner: headerBanner, primaryAction: primaryAction, actions: mergedActions, className: className, children: [(editable || spec?.description) && (_jsx(Section, { title: "Description", children: editable && saveMcpField ? (_jsx("div", { className: "stg:max-h-20 stg:overflow-y-auto stg:p-3", children: _jsx(InlineEditTextarea, { value: spec?.description || "", onSave: (v) => saveMcpField("description", v || undefined), isSaving: isUpdating, placeholder: "Add a description", minRows: 2 }) })) : (_jsx("div", { className: "stg:p-3", children: _jsx("pre", { className: "stg:whitespace-pre-wrap stg:break-words stg:text-sm stg:text-foreground stg:font-sans", children: spec?.description }) })) })), hasSource && _jsx(SourceSection, { spec: spec }), (editable || spec?.serverType.case) && (_jsx(ServerConfigSection, { serverType: spec?.serverType, editable: editable, isSaving: isUpdating, saveMcpField: saveMcpField })), (editable || (spec?.env && Object.keys(spec.env).length > 0)) && (_jsx(EnvSection, { data: spec?.env ?? {}, oauthTargetEnvVar: credentials.oauthTargetEnvVar, editable: editable, isSaving: isUpdating, saveMcpField: saveMcpField })), _jsxs(Section, { title: "Connection", scrollTarget: "mcp-connection", children: [_jsx(StdioSandboxNotice, { serverType: spec?.serverType, className: "stg:mb-3" }), _jsx(OAuthRequiredNotice, { oauthOnly: spec?.auth?.oauthOnly, className: "stg:mb-3" }), _jsx(ConnectBar, { manualEntrySupported: credentials.manualEntrySupported, isConnecting: connection.isConnecting || oauth.isInProgress, connectionError: combinedError, connectionErrorMessage: combinedErrorMessage, onConnect: handleConnectClick, onClearConnectionError: combinedClearError, hasDiscoveredTools: hasDiscoveredTools, isOAuthStranded: isOAuthStranded, credentialsLoading: credentials.isLoading, oauthPhase: oauth.phase, authMode: credentials.authMode, isOAuthConnected: credentials.isOAuthConnected, connectionHealth: credentials.connectionHealth, canDisconnect: credentials.canDisconnect, onDisconnect: handleDisconnect, isDisconnecting: disconnectOAuth.isDisconnecting, disconnectError: disconnectOAuth.error, onClearDisconnectError: disconnectOAuth.clearError, serverName: mcpServer?.metadata?.name ?? slug, accessTokenExpiresAt: credentials.accessTokenExpiresAt, tokenLifetimeHint: credentials.tokenLifetimeHint, isVendorApprovalPending: credentials.isVendorApprovalPending, isVendorApprovalBlocked: credentials.isVendorApprovalBlocked, vendorApprovalDocsUrl: credentials.vendorApprovalDocsUrl, canBringOwnApp: credentials.canBringOwnApp, isOrgOAuthApp: credentials.isOrgOAuthApp, onBringOwnApp: () => setShowByoaForm(true), onRemoveOrgApp: handleRemoveOrgApp, isRemovingOrgApp: orgOAuthApp.isDeleting, removeOrgAppError: orgOAuthApp.deleteError, onClearRemoveOrgAppError: orgOAuthApp.clearErrors, manualOverride: credentials.manualOverride, onManualOverride: () => {
289
326
  credentials.setManualOverride(true);
290
327
  setShowCredentialForm(true);
291
328
  }, onBackToOAuth: () => {
292
329
  credentials.setManualOverride(false);
293
330
  setShowCredentialForm(false);
294
- }, onCancelOAuth: oauth.clearError }), showCredentialForm && credentials.missingVariables.length > 0 && (_jsx("div", { className: "border-b border-border p-4", "data-cursor-target": "credential-form", children: _jsx(EnvVarForm, { title: "Credentials Required", description: "Enter the credentials needed to connect to this MCP server. Toggle \"Save for future runs\" to persist them in your personal environment, or leave it off for one-time use.", variables: credentials.missingVariables, onSubmit: (values, options) => handleCredentialSubmit(values, options), onCancel: () => setShowCredentialForm(false), isSubmitting: credentials.isSaving, poolValues: credentialPoolValues, className: "w-full max-w-md" }) }))] }), _jsxs("dialog", { ref: byoaDialogRef, onCancel: handleByoaDialogCancel, className: cn("m-auto w-full max-w-md rounded-lg border border-border bg-background p-6 shadow-lg", "backdrop:bg-black/50"), children: [_jsx("h3", { className: "mb-4 text-base font-semibold text-foreground", children: "Use your own OAuth app" }), _jsx(OAuthAppForm, { providerName: mcpServer?.metadata?.name ?? slug, vendorDocsUrl: credentials.vendorApprovalDocsUrl, onSubmit: handleByoaSubmit, onCancel: () => {
331
+ }, onCancelOAuth: oauth.clearError }), showCredentialForm && credentials.missingVariables.length > 0 && (_jsx("div", { className: "stg:border-b stg:border-border stg:p-4", "data-cursor-target": "credential-form", children: _jsx(EnvVarForm, { title: "Credentials Required", description: "Enter the credentials needed to connect to this MCP server. Toggle \"Save for future runs\" to persist them in your personal environment, or leave it off for one-time use.", variables: credentials.missingVariables, onSubmit: (values, options) => handleCredentialSubmit(values, options), onCancel: () => setShowCredentialForm(false), isSubmitting: credentials.isSaving, poolValues: credentialPoolValues, className: "stg:w-full stg:max-w-md" }) }))] }), _jsxs("dialog", { ref: byoaDialogRef, onCancel: handleByoaDialogCancel, className: cn("stg:m-auto stg:w-full stg:max-w-md stg:rounded-lg stg:border stg:border-border stg:bg-background stg:p-6 stg:shadow-lg", "stg:backdrop:bg-black/50"), children: [_jsx("h3", { className: "stg:mb-4 stg:text-base stg:font-semibold stg:text-foreground", children: "Use your own OAuth app" }), _jsx(OAuthAppForm, { providerName: mcpServer?.metadata?.name ?? slug, vendorDocsUrl: credentials.vendorApprovalDocsUrl, onSubmit: handleByoaSubmit, onCancel: () => {
295
332
  setShowByoaForm(false);
296
333
  orgOAuthApp.clearErrors();
297
- }, isSubmitting: orgOAuthApp.isSetting, error: orgOAuthApp.setError })] }), _jsx(Section, { title: "Capabilities", scrollTarget: "mcp-capabilities", children: _jsxs(Tabs, { tabs: capabilityTabs, activeTab: capabilityTab, onTabChange: (id) => setCapabilityTab(id), "aria-label": "MCP server capabilities", children: [capabilityTab === "tools" && (_jsx(ToolsTabContent, { tools: tools })), capabilityTab === "policies" && (_jsx(PoliciesTabContent, { pinnedPolicies: pinnedPolicies, classifiedPolicies: classifiedPolicies, hasDiscoveredTools: hasDiscoveredTools })), capabilityTab === "resources" && (_jsx(ResourceTemplatesList, { templates: resourceTemplates }))] }) }), (editable || (spec && spec.tags.length > 0)) && (_jsx(TagsSection, { tags: spec?.tags ?? [], editable: editable, isSaving: isUpdating, saveMcpField: saveMcpField }))] }), access.dialog] }));
334
+ }, isSubmitting: orgOAuthApp.isSetting, error: orgOAuthApp.setError })] }), _jsx(Section, { title: "Capabilities", scrollTarget: "mcp-capabilities", children: _jsxs(Tabs, { tabs: capabilityTabs, activeTab: capabilityTab, onTabChange: (id) => setCapabilityTab(id), "aria-label": "MCP server capabilities", children: [capabilityTab === "tools" && (_jsx(ToolsTabContent, { tools: tools, isOAuthStranded: isOAuthStranded, onDiscover: handleConnectClick, isDiscovering: connection.isConnecting || oauth.isInProgress })), capabilityTab === "policies" && (_jsx(PoliciesTabContent, { pinnedPolicies: pinnedPolicies, classifiedPolicies: classifiedPolicies, hasDiscoveredTools: hasDiscoveredTools, isOAuthStranded: isOAuthStranded })), capabilityTab === "resources" && (_jsx(ResourceTemplatesList, { templates: resourceTemplates }))] }) }), (editable || (spec && spec.tags.length > 0)) && (_jsx(TagsSection, { tags: spec?.tags ?? [], editable: editable, isSaving: isUpdating, saveMcpField: saveMcpField }))] }), access.dialog] }));
298
335
  }
299
336
  // ---------------------------------------------------------------------------
300
337
  // ConnectBar — single entry point for capability discovery
@@ -303,34 +340,34 @@ export function McpServerDetailView({ org, slug, mcpServerState, onResourceLoad,
303
340
  function healthPillProps(health, isVendorApprovalPending) {
304
341
  if (isVendorApprovalPending) {
305
342
  return {
306
- pillClass: "bg-amber-500/10 text-amber-600 dark:text-amber-400",
307
- dotClass: "bg-amber-500",
343
+ pillClass: "stg:bg-amber-500/10 stg:text-amber-600 stg:dark:text-amber-400",
344
+ dotClass: "stg:bg-amber-500",
308
345
  label: "Pending approval",
309
346
  };
310
347
  }
311
348
  switch (health) {
312
349
  case OAuthConnectionHealth.OAUTH_CONNECTION_HEALTH_HEALTHY:
313
350
  return {
314
- pillClass: "bg-success/10 text-success",
315
- dotClass: "bg-success",
351
+ pillClass: "stg:bg-success/10 stg:text-success",
352
+ dotClass: "stg:bg-success",
316
353
  label: "Connected",
317
354
  };
318
355
  case OAuthConnectionHealth.OAUTH_CONNECTION_HEALTH_TOKEN_EXPIRED_REFRESHABLE:
319
356
  return {
320
- pillClass: "bg-amber-500/10 text-amber-600 dark:text-amber-400",
321
- dotClass: "bg-amber-500",
357
+ pillClass: "stg:bg-amber-500/10 stg:text-amber-600 stg:dark:text-amber-400",
358
+ dotClass: "stg:bg-amber-500",
322
359
  label: "Token expired",
323
360
  };
324
361
  case OAuthConnectionHealth.OAUTH_CONNECTION_HEALTH_TOKEN_EXPIRED:
325
362
  return {
326
- pillClass: "bg-destructive-subtle text-destructive",
327
- dotClass: "bg-destructive",
363
+ pillClass: "stg:bg-destructive-subtle stg:text-destructive",
364
+ dotClass: "stg:bg-destructive",
328
365
  label: "Re-auth needed",
329
366
  };
330
367
  default:
331
368
  return {
332
- pillClass: "bg-muted text-muted-foreground",
333
- dotClass: "bg-muted-foreground",
369
+ pillClass: "stg:bg-muted stg:text-muted-foreground",
370
+ dotClass: "stg:bg-muted-foreground",
334
371
  label: "Not connected",
335
372
  };
336
373
  }
@@ -355,7 +392,7 @@ function healthStatusText(health, accessTokenExpiresAt, tokenLifetimeHint) {
355
392
  return "Not connected yet";
356
393
  }
357
394
  }
358
- function ConnectBar({ isConnecting, connectionError, onConnect, onClearConnectionError, hasDiscoveredTools, credentialsLoading, oauthPhase, authMode, isOAuthConnected, connectionHealth, canDisconnect, onDisconnect, isDisconnecting, disconnectError, onClearDisconnectError, serverName, accessTokenExpiresAt, tokenLifetimeHint, isVendorApprovalPending, isVendorApprovalBlocked, vendorApprovalDocsUrl, canBringOwnApp, isOrgOAuthApp, onBringOwnApp, onRemoveOrgApp, isRemovingOrgApp, removeOrgAppError, onClearRemoveOrgAppError, manualEntrySupported, manualOverride, onManualOverride, onBackToOAuth, onCancelOAuth, }) {
395
+ function ConnectBar({ isConnecting, connectionError, connectionErrorMessage, onConnect, onClearConnectionError, hasDiscoveredTools, isOAuthStranded, credentialsLoading, oauthPhase, authMode, isOAuthConnected, connectionHealth, canDisconnect, onDisconnect, isDisconnecting, disconnectError, onClearDisconnectError, serverName, accessTokenExpiresAt, tokenLifetimeHint, isVendorApprovalPending, isVendorApprovalBlocked, vendorApprovalDocsUrl, canBringOwnApp, isOrgOAuthApp, onBringOwnApp, onRemoveOrgApp, isRemovingOrgApp, removeOrgAppError, onClearRemoveOrgAppError, manualEntrySupported, manualOverride, onManualOverride, onBackToOAuth, onCancelOAuth, }) {
359
396
  const [disconnectPhase, setDisconnectPhase] = useState("idle");
360
397
  const [removeOrgAppPhase, setRemoveOrgAppPhase] = useState("idle");
361
398
  const isOAuthBusy = oauthPhase === "initiating" ||
@@ -375,6 +412,8 @@ function ConnectBar({ isConnecting, connectionError, onConnect, onClearConnectio
375
412
  return "Sign in with your app";
376
413
  if (showOAuthPrimary || needsReAuth)
377
414
  return "Sign in to connect";
415
+ if (isOAuthStranded)
416
+ return "Discover tools";
378
417
  if (hasDiscoveredTools)
379
418
  return "Reconnect";
380
419
  return "Connect";
@@ -383,13 +422,17 @@ function ConnectBar({ isConnecting, connectionError, onConnect, onClearConnectio
383
422
  if (isOAuthBusy || isConnecting)
384
423
  return _jsx(Spinner, {});
385
424
  if (showOAuthPrimary || needsReAuth)
386
- return _jsx(OAuthIcon, { className: "size-3.5" });
425
+ return _jsx(OAuthIcon, { className: "stg:size-3.5" });
387
426
  if (hasDiscoveredTools)
388
- return _jsx(RefreshIcon, { className: "size-3.5" });
389
- return _jsx(ConnectIcon, { className: "size-3.5" });
427
+ return _jsx(RefreshIcon, { className: "stg:size-3.5" });
428
+ return _jsx(ConnectIcon, { className: "stg:size-3.5" });
390
429
  })();
391
430
  const statusText = (() => {
392
431
  if (authMode === "oauth" && isOAuthConnected) {
432
+ // Stranded takes precedence over token health: "tokens refresh
433
+ // automatically" reads as all-done while the Tools tab is empty.
434
+ if (isOAuthStranded)
435
+ return "Signed in \u2014 tools not discovered yet";
393
436
  const base = healthStatusText(connectionHealth, accessTokenExpiresAt, tokenLifetimeHint);
394
437
  return isOrgOAuthApp ? `${base} \u00B7 Using your OAuth app` : base;
395
438
  }
@@ -406,7 +449,7 @@ function ConnectBar({ isConnecting, connectionError, onConnect, onClearConnectio
406
449
  const showRemoveOrgAppLink = isOrgOAuthApp && !anyBusy && removeOrgAppPhase === "idle";
407
450
  // Inline disconnect confirmation replaces the main bar content
408
451
  if (disconnectPhase === "confirming" || disconnectPhase === "disconnecting") {
409
- return (_jsxs("div", { className: "flex flex-col", children: [_jsxs("div", { className: "flex items-center gap-2 px-3 py-2", children: [_jsx(WarningIcon, { className: "size-3.5 shrink-0 text-destructive" }), _jsxs("p", { className: "flex-1 text-xs text-foreground", children: ["Remove OAuth credentials for ", _jsx("span", { className: "font-medium", children: serverName }), "? You can reconnect at any time."] }), _jsxs("div", { className: "flex shrink-0 items-center gap-1.5", children: [_jsxs("button", { type: "button", disabled: isDisconnecting, onClick: async () => {
452
+ return (_jsxs("div", { className: "stg:flex stg:flex-col", children: [_jsxs("div", { className: "stg:flex stg:items-center stg:gap-2 stg:px-3 stg:py-2", children: [_jsx(WarningIcon, { className: "stg:size-3.5 stg:shrink-0 stg:text-destructive" }), _jsxs("p", { className: "stg:flex-1 stg:text-xs stg:text-foreground", children: ["Remove OAuth credentials for ", _jsx("span", { className: "stg:font-medium", children: serverName }), "? You can reconnect at any time."] }), _jsxs("div", { className: "stg:flex stg:shrink-0 stg:items-center stg:gap-1.5", children: [_jsxs("button", { type: "button", disabled: isDisconnecting, onClick: async () => {
410
453
  setDisconnectPhase("disconnecting");
411
454
  try {
412
455
  await onDisconnect();
@@ -415,14 +458,14 @@ function ConnectBar({ isConnecting, connectionError, onConnect, onClearConnectio
415
458
  catch {
416
459
  setDisconnectPhase("confirming");
417
460
  }
418
- }, className: cn("inline-flex items-center gap-1 rounded-md px-2.5 py-1 text-xs font-medium", "bg-destructive text-destructive-foreground hover:bg-destructive-hover", "disabled:pointer-events-none disabled:opacity-50"), children: [isDisconnecting && _jsx(Spinner, {}), "Disconnect"] }), _jsx("button", { type: "button", disabled: isDisconnecting, onClick: () => {
461
+ }, className: cn("stg:inline-flex stg:items-center stg:gap-1 stg:rounded-md stg:px-2.5 stg:py-1 stg:text-xs stg:font-medium", "stg:bg-destructive stg:text-destructive-foreground stg:hover:bg-destructive-hover", "stg:disabled:pointer-events-none stg:disabled:opacity-50"), children: [isDisconnecting && _jsx(Spinner, {}), "Disconnect"] }), _jsx("button", { type: "button", disabled: isDisconnecting, onClick: () => {
419
462
  setDisconnectPhase("idle");
420
463
  onClearDisconnectError();
421
- }, className: cn("inline-flex items-center rounded-md px-2.5 py-1 text-xs font-medium", "border border-border bg-background text-foreground hover:bg-accent hover:text-accent-foreground", "disabled:pointer-events-none disabled:opacity-50"), children: "Cancel" })] })] }), disconnectError && (_jsxs("div", { className: "flex items-start gap-2 border-t border-destructive/20 bg-destructive-subtle px-3 py-2", children: [_jsx(WarningIcon, { className: "mt-0.5 size-3.5 shrink-0 text-destructive" }), _jsx("p", { className: "flex-1 text-xs text-destructive", children: getUserMessage(disconnectError) }), _jsx("button", { type: "button", onClick: onClearDisconnectError, className: "shrink-0 text-xs text-destructive-muted hover:text-destructive", "aria-label": "Dismiss error", children: "Dismiss" })] }))] }));
464
+ }, className: cn("stg:inline-flex stg:items-center stg:rounded-md stg:px-2.5 stg:py-1 stg:text-xs stg:font-medium", "stg:border stg:border-border stg:bg-background stg:text-foreground stg:hover:bg-accent stg:hover:text-accent-foreground", "stg:disabled:pointer-events-none stg:disabled:opacity-50"), children: "Cancel" })] })] }), disconnectError && (_jsxs("div", { className: "stg:flex stg:items-start stg:gap-2 stg:border-t stg:border-destructive/20 stg:bg-destructive-subtle stg:px-3 stg:py-2", children: [_jsx(WarningIcon, { className: "stg:mt-0.5 stg:size-3.5 stg:shrink-0 stg:text-destructive" }), _jsx("p", { className: "stg:flex-1 stg:text-xs stg:text-destructive", children: getUserMessage(disconnectError) }), _jsx("button", { type: "button", onClick: onClearDisconnectError, className: "stg:shrink-0 stg:text-xs stg:text-destructive-muted stg:hover:text-destructive", "aria-label": "Dismiss error", children: "Dismiss" })] }))] }));
422
465
  }
423
466
  // Inline "remove custom app" confirmation
424
467
  if (removeOrgAppPhase === "confirming" || removeOrgAppPhase === "removing") {
425
- return (_jsxs("div", { className: "flex flex-col", children: [_jsxs("div", { className: "flex items-center gap-2 px-3 py-2", children: [_jsx(WarningIcon, { className: "size-3.5 shrink-0 text-destructive" }), _jsxs("p", { className: "flex-1 text-xs text-foreground", children: ["Remove your custom OAuth app for", " ", _jsx("span", { className: "font-medium", children: serverName }), "? The server will revert to the platform's OAuth app."] }), _jsxs("div", { className: "flex shrink-0 items-center gap-1.5", children: [_jsxs("button", { type: "button", disabled: isRemovingOrgApp, onClick: async () => {
468
+ return (_jsxs("div", { className: "stg:flex stg:flex-col", children: [_jsxs("div", { className: "stg:flex stg:items-center stg:gap-2 stg:px-3 stg:py-2", children: [_jsx(WarningIcon, { className: "stg:size-3.5 stg:shrink-0 stg:text-destructive" }), _jsxs("p", { className: "stg:flex-1 stg:text-xs stg:text-foreground", children: ["Remove your custom OAuth app for", " ", _jsx("span", { className: "stg:font-medium", children: serverName }), "? The server will revert to the platform's OAuth app."] }), _jsxs("div", { className: "stg:flex stg:shrink-0 stg:items-center stg:gap-1.5", children: [_jsxs("button", { type: "button", disabled: isRemovingOrgApp, onClick: async () => {
426
469
  setRemoveOrgAppPhase("removing");
427
470
  try {
428
471
  await onRemoveOrgApp();
@@ -431,20 +474,20 @@ function ConnectBar({ isConnecting, connectionError, onConnect, onClearConnectio
431
474
  catch {
432
475
  setRemoveOrgAppPhase("confirming");
433
476
  }
434
- }, className: cn("inline-flex items-center gap-1 rounded-md px-2.5 py-1 text-xs font-medium", "bg-destructive text-destructive-foreground hover:bg-destructive-hover", "disabled:pointer-events-none disabled:opacity-50"), children: [isRemovingOrgApp && _jsx(Spinner, {}), "Remove"] }), _jsx("button", { type: "button", disabled: isRemovingOrgApp, onClick: () => {
477
+ }, className: cn("stg:inline-flex stg:items-center stg:gap-1 stg:rounded-md stg:px-2.5 stg:py-1 stg:text-xs stg:font-medium", "stg:bg-destructive stg:text-destructive-foreground stg:hover:bg-destructive-hover", "stg:disabled:pointer-events-none stg:disabled:opacity-50"), children: [isRemovingOrgApp && _jsx(Spinner, {}), "Remove"] }), _jsx("button", { type: "button", disabled: isRemovingOrgApp, onClick: () => {
435
478
  setRemoveOrgAppPhase("idle");
436
479
  onClearRemoveOrgAppError();
437
- }, className: cn("inline-flex items-center rounded-md px-2.5 py-1 text-xs font-medium", "border border-border bg-background text-foreground hover:bg-accent hover:text-accent-foreground", "disabled:pointer-events-none disabled:opacity-50"), children: "Cancel" })] })] }), removeOrgAppError && (_jsxs("div", { className: "flex items-start gap-2 border-t border-destructive/20 bg-destructive-subtle px-3 py-2", children: [_jsx(WarningIcon, { className: "mt-0.5 size-3.5 shrink-0 text-destructive" }), _jsx("p", { className: "flex-1 text-xs text-destructive", children: getUserMessage(removeOrgAppError) }), _jsx("button", { type: "button", onClick: onClearRemoveOrgAppError, className: "shrink-0 text-xs text-destructive-muted hover:text-destructive", "aria-label": "Dismiss error", children: "Dismiss" })] }))] }));
480
+ }, className: cn("stg:inline-flex stg:items-center stg:rounded-md stg:px-2.5 stg:py-1 stg:text-xs stg:font-medium", "stg:border stg:border-border stg:bg-background stg:text-foreground stg:hover:bg-accent stg:hover:text-accent-foreground", "stg:disabled:pointer-events-none stg:disabled:opacity-50"), children: "Cancel" })] })] }), removeOrgAppError && (_jsxs("div", { className: "stg:flex stg:items-start stg:gap-2 stg:border-t stg:border-destructive/20 stg:bg-destructive-subtle stg:px-3 stg:py-2", children: [_jsx(WarningIcon, { className: "stg:mt-0.5 stg:size-3.5 stg:shrink-0 stg:text-destructive" }), _jsx("p", { className: "stg:flex-1 stg:text-xs stg:text-destructive", children: getUserMessage(removeOrgAppError) }), _jsx("button", { type: "button", onClick: onClearRemoveOrgAppError, className: "stg:shrink-0 stg:text-xs stg:text-destructive-muted stg:hover:text-destructive", "aria-label": "Dismiss error", children: "Dismiss" })] }))] }));
438
481
  }
439
- return (_jsxs("div", { className: "flex flex-col", children: [_jsxs("div", { className: "flex items-center justify-between px-3 py-2", children: [_jsxs("div", { className: "flex items-center gap-2", children: [authMode === "oauth" && !manualOverride && (_jsxs("span", { className: cn("inline-flex items-center gap-1.5 rounded-full px-2 py-0.5 text-[10px] font-medium", pill.pillClass), children: [_jsx("span", { className: cn("size-1.5 rounded-full", pill.dotClass), "aria-hidden": "true" }), pill.label] })), _jsx("span", { className: "text-xs text-muted-foreground", children: oauthSignInDisabled ? "OAuth sign-in is pending vendor approval" : statusText }), showDisconnectLink && (_jsx("button", { type: "button", onClick: () => setDisconnectPhase("confirming"), className: "text-[11px] text-muted-foreground underline decoration-muted-foreground/40 underline-offset-2 hover:text-foreground hover:decoration-foreground", children: "Disconnect" })), showRemoveOrgAppLink && (_jsx("button", { type: "button", onClick: () => setRemoveOrgAppPhase("confirming"), className: "text-[11px] text-muted-foreground underline decoration-muted-foreground/40 underline-offset-2 hover:text-foreground hover:decoration-foreground", children: "Remove custom app" }))] }), _jsxs("button", { type: "button", onClick: onConnect, disabled: anyBusy || credentialsLoading || oauthSignInDisabled, "data-cursor-target": "connect-button", className: cn("inline-flex items-center gap-1.5 rounded-md px-2.5 py-1 text-xs font-medium", showOAuthPrimary || needsReAuth
440
- ? "bg-primary text-primary-foreground hover:bg-primary-hover"
441
- : "border border-border bg-background text-foreground hover:bg-accent hover:text-accent-foreground", "disabled:pointer-events-none disabled:opacity-50"), children: [buttonIcon, buttonLabel] })] }), oauthPhase === "awaiting-callback" && (_jsx("div", { className: "flex items-center gap-3 border-t border-border px-3 py-1.5", children: _jsx("button", { type: "button", onClick: onCancelOAuth, className: "text-[11px] text-muted-foreground underline decoration-muted-foreground/40 underline-offset-2 hover:text-foreground hover:decoration-foreground", children: "Cancel sign-in" }) })), oauthSignInDisabled && (_jsxs("div", { className: "flex items-start gap-2 border-t border-amber-500/20 bg-amber-500/5 px-3 py-2", children: [_jsx(WarningIcon, { className: "mt-0.5 size-3.5 shrink-0 text-amber-600 dark:text-amber-400" }), _jsxs("div", { className: "flex-1 text-xs text-amber-700 dark:text-amber-300", children: [_jsxs("p", { children: ["The platform's OAuth app is awaiting vendor approval.", canBringOwnApp
482
+ return (_jsxs("div", { className: "stg:flex stg:flex-col", children: [_jsxs("div", { className: "stg:flex stg:items-center stg:justify-between stg:px-3 stg:py-2", children: [_jsxs("div", { className: "stg:flex stg:items-center stg:gap-2", children: [authMode === "oauth" && !manualOverride && (_jsxs("span", { className: cn("stg:inline-flex stg:items-center stg:gap-1.5 stg:rounded-full stg:px-2 stg:py-0.5 stg:text-[10px] stg:font-medium", pill.pillClass), children: [_jsx("span", { className: cn("stg:size-1.5 stg:rounded-full", pill.dotClass), "aria-hidden": "true" }), pill.label] })), _jsx("span", { className: "stg:text-xs stg:text-muted-foreground", children: oauthSignInDisabled ? "OAuth sign-in is pending vendor approval" : statusText }), showDisconnectLink && (_jsx("button", { type: "button", onClick: () => setDisconnectPhase("confirming"), className: "stg:text-[11px] stg:text-muted-foreground stg:underline stg:decoration-muted-foreground/40 stg:underline-offset-2 stg:hover:text-foreground stg:hover:decoration-foreground", children: "Disconnect" })), showRemoveOrgAppLink && (_jsx("button", { type: "button", onClick: () => setRemoveOrgAppPhase("confirming"), className: "stg:text-[11px] stg:text-muted-foreground stg:underline stg:decoration-muted-foreground/40 stg:underline-offset-2 stg:hover:text-foreground stg:hover:decoration-foreground", children: "Remove custom app" }))] }), _jsxs("button", { type: "button", onClick: onConnect, disabled: anyBusy || credentialsLoading || oauthSignInDisabled, "data-cursor-target": "connect-button", className: cn("stg:inline-flex stg:items-center stg:gap-1.5 stg:rounded-md stg:px-2.5 stg:py-1 stg:text-xs stg:font-medium", showOAuthPrimary || needsReAuth
483
+ ? "stg:bg-primary stg:text-primary-foreground stg:hover:bg-primary-hover"
484
+ : "stg:border stg:border-border stg:bg-background stg:text-foreground stg:hover:bg-accent stg:hover:text-accent-foreground", "stg:disabled:pointer-events-none stg:disabled:opacity-50"), children: [buttonIcon, buttonLabel] })] }), oauthPhase === "awaiting-callback" && (_jsx("div", { className: "stg:flex stg:items-center stg:gap-3 stg:border-t stg:border-border stg:px-3 stg:py-1.5", children: _jsx("button", { type: "button", onClick: onCancelOAuth, className: "stg:text-[11px] stg:text-muted-foreground stg:underline stg:decoration-muted-foreground/40 stg:underline-offset-2 stg:hover:text-foreground stg:hover:decoration-foreground", children: "Cancel sign-in" }) })), oauthSignInDisabled && (_jsxs("div", { className: "stg:flex stg:items-start stg:gap-2 stg:border-t stg:border-amber-500/20 stg:bg-amber-500/5 stg:px-3 stg:py-2", children: [_jsx(WarningIcon, { className: "stg:mt-0.5 stg:size-3.5 stg:shrink-0 stg:text-amber-600 stg:dark:text-amber-400" }), _jsxs("div", { className: "stg:flex-1 stg:text-xs stg:text-amber-700 stg:dark:text-amber-300", children: [_jsxs("p", { children: ["The platform's OAuth app is awaiting vendor approval.", canBringOwnApp
442
485
  ? " You can use your own OAuth app or enter a token manually."
443
- : " You can still connect by entering your own token manually."] }), canBringOwnApp && (_jsx("button", { type: "button", onClick: onBringOwnApp, "data-cursor-target": "byoa-cta-button", className: "mt-1.5 inline-flex items-center gap-1 rounded-md bg-amber-600 px-2.5 py-1 text-[11px] font-medium text-white hover:bg-amber-700 dark:bg-amber-500 dark:text-amber-950 dark:hover:bg-amber-400", children: "Use your own OAuth app" })), vendorApprovalDocsUrl && !canBringOwnApp && (_jsxs("a", { href: vendorApprovalDocsUrl, target: "_blank", rel: "noopener noreferrer", className: "mt-1 inline-flex items-center gap-1 underline decoration-amber-600/40 underline-offset-2 hover:decoration-amber-600 dark:decoration-amber-400/40 dark:hover:decoration-amber-400", children: ["Learn how to bring your own token", _jsx(ExternalLinkIcon, { className: "size-3 shrink-0" })] }))] })] })), authMode === "oauth" && !isOAuthConnected && !isOAuthBusy && !isConnecting &&
444
- (manualOverride || manualEntrySupported || canBringOwnApp) && (_jsx("div", { className: "flex items-center gap-3 border-t border-border px-3 py-1.5", children: manualOverride ? (_jsx("button", { type: "button", onClick: onBackToOAuth, className: "text-[11px] text-muted-foreground underline decoration-muted-foreground/40 underline-offset-2 hover:text-foreground hover:decoration-foreground", children: isVendorApprovalPending ? "Back to OAuth status" : "Sign in with OAuth instead" })) : (_jsxs(_Fragment, { children: [manualEntrySupported && (_jsx("button", { type: "button", onClick: onManualOverride, className: "text-[11px] text-muted-foreground underline decoration-muted-foreground/40 underline-offset-2 hover:text-foreground hover:decoration-foreground", children: "Enter token manually" })), canBringOwnApp && !isVendorApprovalBlocked && (_jsx("button", { type: "button", onClick: onBringOwnApp, className: "text-[11px] text-muted-foreground underline decoration-muted-foreground/40 underline-offset-2 hover:text-foreground hover:decoration-foreground", children: "Use your own OAuth app" }))] })) })), connectionError && (_jsxs("div", { className: "flex items-start gap-2 border-t border-destructive/20 bg-destructive-subtle px-3 py-2", role: "alert", children: [_jsx(WarningIcon, { className: "mt-0.5 size-3.5 shrink-0 text-destructive" }), _jsx("p", { className: "flex-1 text-xs text-destructive", children: getUserMessage(connectionError) }), _jsxs("div", { className: "flex shrink-0 items-center gap-2", children: [isRetryableError(connectionError) && (_jsx("button", { type: "button", onClick: () => {
486
+ : " You can still connect by entering your own token manually."] }), canBringOwnApp && (_jsx("button", { type: "button", onClick: onBringOwnApp, "data-cursor-target": "byoa-cta-button", className: "stg:mt-1.5 stg:inline-flex stg:items-center stg:gap-1 stg:rounded-md stg:bg-amber-600 stg:px-2.5 stg:py-1 stg:text-[11px] stg:font-medium stg:text-white stg:hover:bg-amber-700 stg:dark:bg-amber-500 stg:dark:text-amber-950 stg:dark:hover:bg-amber-400", children: "Use your own OAuth app" })), vendorApprovalDocsUrl && !canBringOwnApp && (_jsxs("a", { href: vendorApprovalDocsUrl, target: "_blank", rel: "noopener noreferrer", className: "stg:mt-1 stg:inline-flex stg:items-center stg:gap-1 stg:underline stg:decoration-amber-600/40 stg:underline-offset-2 stg:hover:decoration-amber-600 stg:dark:decoration-amber-400/40 stg:dark:hover:decoration-amber-400", children: ["Learn how to bring your own token", _jsx(ExternalLinkIcon, { className: "stg:size-3 stg:shrink-0" })] }))] })] })), authMode === "oauth" && !isOAuthConnected && !isOAuthBusy && !isConnecting &&
487
+ (manualOverride || manualEntrySupported || canBringOwnApp) && (_jsx("div", { className: "stg:flex stg:items-center stg:gap-3 stg:border-t stg:border-border stg:px-3 stg:py-1.5", children: manualOverride ? (_jsx("button", { type: "button", onClick: onBackToOAuth, className: "stg:text-[11px] stg:text-muted-foreground stg:underline stg:decoration-muted-foreground/40 stg:underline-offset-2 stg:hover:text-foreground stg:hover:decoration-foreground", children: isVendorApprovalPending ? "Back to OAuth status" : "Sign in with OAuth instead" })) : (_jsxs(_Fragment, { children: [manualEntrySupported && (_jsx("button", { type: "button", onClick: onManualOverride, className: "stg:text-[11px] stg:text-muted-foreground stg:underline stg:decoration-muted-foreground/40 stg:underline-offset-2 stg:hover:text-foreground stg:hover:decoration-foreground", children: "Enter token manually" })), canBringOwnApp && !isVendorApprovalBlocked && (_jsx("button", { type: "button", onClick: onBringOwnApp, className: "stg:text-[11px] stg:text-muted-foreground stg:underline stg:decoration-muted-foreground/40 stg:underline-offset-2 stg:hover:text-foreground stg:hover:decoration-foreground", children: "Use your own OAuth app" }))] })) })), connectionError && (_jsxs("div", { className: "stg:flex stg:items-start stg:gap-2 stg:border-t stg:border-destructive/20 stg:bg-destructive-subtle stg:px-3 stg:py-2", role: "alert", children: [_jsx(WarningIcon, { className: "stg:mt-0.5 stg:size-3.5 stg:shrink-0 stg:text-destructive" }), _jsx("p", { className: "stg:flex-1 stg:text-xs stg:text-destructive", children: connectionErrorMessage ?? getUserMessage(connectionError) }), _jsxs("div", { className: "stg:flex stg:shrink-0 stg:items-center stg:gap-2", children: [isRetryableError(connectionError) && (_jsx("button", { type: "button", onClick: () => {
445
488
  onClearConnectionError();
446
489
  onConnect();
447
- }, className: "text-xs font-medium text-destructive underline underline-offset-2 hover:no-underline", children: "Try again" })), _jsx("button", { type: "button", onClick: onClearConnectionError, className: "text-xs text-destructive-muted hover:text-destructive", "aria-label": "Dismiss error", children: "Dismiss" })] })] }))] }));
490
+ }, className: "stg:text-xs stg:font-medium stg:text-destructive stg:underline stg:underline-offset-2 stg:hover:no-underline", children: "Try again" })), _jsx("button", { type: "button", onClick: onClearConnectionError, className: "stg:text-xs stg:text-destructive-muted stg:hover:text-destructive", "aria-label": "Dismiss error", children: "Dismiss" })] })] }))] }));
448
491
  }
449
492
  function oauthPhaseLabel(phase) {
450
493
  switch (phase) {
@@ -482,14 +525,14 @@ function formatTokenExpiry(expiresAtSeconds) {
482
525
  // Internal section components
483
526
  // ---------------------------------------------------------------------------
484
527
  function ValidationBanner({ message }) {
485
- return (_jsxs("div", { role: "alert", className: "flex items-start gap-2.5 rounded-lg border border-destructive/30 bg-destructive-subtle px-4 py-3", children: [_jsx(WarningIcon, { className: "mt-0.5 size-4 shrink-0 text-destructive" }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("p", { className: "text-sm font-medium text-destructive", children: "Invalid Configuration" }), _jsx("p", { className: "mt-0.5 text-xs text-destructive-muted", children: message })] })] }));
528
+ return (_jsxs("div", { role: "alert", className: "stg:flex stg:items-start stg:gap-2.5 stg:rounded-lg stg:border stg:border-destructive/30 stg:bg-destructive-subtle stg:px-4 stg:py-3", children: [_jsx(WarningIcon, { className: "stg:mt-0.5 stg:size-4 stg:shrink-0 stg:text-destructive" }), _jsxs("div", { className: "stg:min-w-0 stg:flex-1", children: [_jsx("p", { className: "stg:text-sm stg:font-medium stg:text-destructive", children: "Invalid Configuration" }), _jsx("p", { className: "stg:mt-0.5 stg:text-xs stg:text-destructive-muted", children: message })] })] }));
486
529
  }
487
530
  function ValidationStateBadge({ state, }) {
488
531
  switch (state) {
489
532
  case ValidationState.valid:
490
- return (_jsxs(_Fragment, { children: [_jsx(Dot, {}), _jsxs("span", { className: "inline-flex items-center gap-1 text-emerald-600 dark:text-emerald-400", children: [_jsx(CheckIcon, { className: "size-3" }), "Valid"] })] }));
533
+ return (_jsxs(_Fragment, { children: [_jsx(Dot, {}), _jsxs("span", { className: "stg:inline-flex stg:items-center stg:gap-1 stg:text-emerald-600 stg:dark:text-emerald-400", children: [_jsx(CheckIcon, { className: "stg:size-3" }), "Valid"] })] }));
491
534
  case ValidationState.invalid:
492
- return (_jsxs(_Fragment, { children: [_jsx(Dot, {}), _jsx("span", { className: "text-destructive", children: "Invalid" })] }));
535
+ return (_jsxs(_Fragment, { children: [_jsx(Dot, {}), _jsx("span", { className: "stg:text-destructive", children: "Invalid" })] }));
493
536
  default:
494
537
  return null;
495
538
  }
@@ -562,29 +605,29 @@ function ServerConfigSection({ serverType, editable, isSaving, saveMcpField, })
562
605
  queryParams: Object.keys(queryParams).length > 0 ? queryParams : undefined,
563
606
  });
564
607
  }, [saveMcpField, currentHttpConfig]);
565
- return (_jsxs(Section, { title: "Server Configuration", children: [_jsxs("div", { className: "flex flex-col gap-2 p-3", children: [_jsxs("div", { className: "flex items-baseline gap-2", children: [_jsx("span", { className: "text-xs font-medium text-muted-foreground", children: "Type" }), editable && saveMcpField ? (_jsx(InlineEditSelect, { value: serverType?.case ?? "http", options: TRANSPORT_OPTIONS, onSave: handleTransportChange, isSaving: isSaving })) : (_jsx("span", { className: "rounded bg-muted px-1.5 py-0.5 font-mono text-xs font-medium text-foreground", children: serverType?.case ?? "none" }))] }), serverType?.case === "stdio" && (_jsxs(_Fragment, { children: [_jsxs("div", { className: "flex items-baseline gap-2", children: [_jsx("span", { className: "text-xs font-medium text-muted-foreground", children: "Command" }), editable && saveMcpField ? (_jsx(InlineEditText, { value: `${serverType.value.command}${serverType.value.args.length > 0 ? ` ${serverType.value.args.join(" ")}` : ""}`, onSave: async (v) => {
608
+ return (_jsxs(Section, { title: "Server Configuration", children: [_jsxs("div", { className: "stg:flex stg:flex-col stg:gap-2 stg:p-3", children: [_jsxs("div", { className: "stg:flex stg:items-baseline stg:gap-2", children: [_jsx("span", { className: "stg:text-xs stg:font-medium stg:text-muted-foreground", children: "Type" }), editable && saveMcpField ? (_jsx(InlineEditSelect, { value: serverType?.case ?? "http", options: TRANSPORT_OPTIONS, onSave: handleTransportChange, isSaving: isSaving })) : (_jsx("span", { className: "stg:rounded stg:bg-muted stg:px-1.5 stg:py-0.5 stg:font-mono stg:text-xs stg:font-medium stg:text-foreground", children: serverType?.case ?? "none" }))] }), serverType?.case === "stdio" && (_jsxs(_Fragment, { children: [_jsxs("div", { className: "stg:flex stg:items-baseline stg:gap-2", children: [_jsx("span", { className: "stg:text-xs stg:font-medium stg:text-muted-foreground", children: "Command" }), editable && saveMcpField ? (_jsx(InlineEditText, { value: `${serverType.value.command}${serverType.value.args.length > 0 ? ` ${serverType.value.args.join(" ")}` : ""}`, onSave: async (v) => {
566
609
  const parts = v.trim().split(/\s+/);
567
610
  return saveMcpField("stdio", {
568
611
  command: parts[0] || "",
569
612
  args: parts.slice(1),
570
613
  });
571
- }, isSaving: isSaving, placeholder: "e.g. npx -y @modelcontextprotocol/server" })) : (_jsxs("code", { className: "font-mono text-sm text-foreground", children: [serverType.value.command, serverType.value.args.length > 0 &&
572
- ` ${serverType.value.args.join(" ")}`] }))] }), (editable || serverType.value.workingDir) && (_jsxs("div", { className: "flex items-baseline gap-2", children: [_jsx("span", { className: "text-xs font-medium text-muted-foreground", children: "Working Dir" }), editable && saveMcpField ? (_jsx(InlineEditText, { value: serverType.value.workingDir ?? "", onSave: async (v) => saveMcpField("stdio", {
614
+ }, isSaving: isSaving, placeholder: "e.g. npx -y @modelcontextprotocol/server" })) : (_jsxs("code", { className: "stg:font-mono stg:text-sm stg:text-foreground", children: [serverType.value.command, serverType.value.args.length > 0 &&
615
+ ` ${serverType.value.args.join(" ")}`] }))] }), (editable || serverType.value.workingDir) && (_jsxs("div", { className: "stg:flex stg:items-baseline stg:gap-2", children: [_jsx("span", { className: "stg:text-xs stg:font-medium stg:text-muted-foreground", children: "Working Dir" }), editable && saveMcpField ? (_jsx(InlineEditText, { value: serverType.value.workingDir ?? "", onSave: async (v) => saveMcpField("stdio", {
573
616
  command: serverType.value.command,
574
617
  args: [...serverType.value.args],
575
618
  workingDir: v || undefined,
576
- }), isSaving: isSaving, placeholder: "/path/to/working/dir" })) : (_jsx("code", { className: "font-mono text-xs text-foreground", children: serverType.value.workingDir }))] }))] })), serverType?.case === "http" && (_jsxs(_Fragment, { children: [_jsxs("div", { className: "flex items-baseline gap-2", children: [_jsx("span", { className: "text-xs font-medium text-muted-foreground", children: "URL" }), editable && saveMcpField ? (_jsx(InlineEditText, { value: serverType.value.url, onSave: async (v) => saveMcpField("http", { ...currentHttpConfig, url: v }), isSaving: isSaving, placeholder: "https://example.com/mcp" })) : (_jsx("code", { className: "break-all font-mono text-sm text-foreground", children: serverType.value.url }))] }), (editable || serverType.value.timeoutSeconds > 0) && (_jsxs("div", { className: "flex items-baseline gap-2", children: [_jsx("span", { className: "text-xs font-medium text-muted-foreground", children: "Timeout" }), editable && saveMcpField ? (_jsx(InlineEditText, { value: serverType.value.timeoutSeconds > 0 ? String(serverType.value.timeoutSeconds) : "", onSave: async (v) => saveMcpField("http", {
619
+ }), isSaving: isSaving, placeholder: "/path/to/working/dir" })) : (_jsx("code", { className: "stg:font-mono stg:text-xs stg:text-foreground", children: serverType.value.workingDir }))] }))] })), serverType?.case === "http" && (_jsxs(_Fragment, { children: [_jsxs("div", { className: "stg:flex stg:items-baseline stg:gap-2", children: [_jsx("span", { className: "stg:text-xs stg:font-medium stg:text-muted-foreground", children: "URL" }), editable && saveMcpField ? (_jsx(InlineEditText, { value: serverType.value.url, onSave: async (v) => saveMcpField("http", { ...currentHttpConfig, url: v }), isSaving: isSaving, placeholder: "https://example.com/mcp" })) : (_jsx("code", { className: "stg:break-all stg:font-mono stg:text-sm stg:text-foreground", children: serverType.value.url }))] }), (editable || serverType.value.timeoutSeconds > 0) && (_jsxs("div", { className: "stg:flex stg:items-baseline stg:gap-2", children: [_jsx("span", { className: "stg:text-xs stg:font-medium stg:text-muted-foreground", children: "Timeout" }), editable && saveMcpField ? (_jsx(InlineEditText, { value: serverType.value.timeoutSeconds > 0 ? String(serverType.value.timeoutSeconds) : "", onSave: async (v) => saveMcpField("http", {
577
620
  ...currentHttpConfig,
578
621
  timeoutSeconds: v ? Number(v) : undefined,
579
622
  }), isSaving: isSaving, placeholder: "30", validate: (v) => {
580
623
  if (v && (isNaN(Number(v)) || Number(v) < 0))
581
624
  return "Must be a positive number";
582
625
  return null;
583
- } })) : (_jsxs("span", { className: "text-xs text-foreground", children: [serverType.value.timeoutSeconds, "s"] }))] }))] }))] }), serverType?.case === "http" && (editable || headerRows.length > 0) && (_jsx(HttpKeyValueSubsection, { title: "Headers", count: headerRows.length, rows: headerRows, editable: editable, isSaving: isSaving, editing: headersEditing, onEditingChange: setHeadersEditing, onSave: handleHeadersSave, keyLabel: "Header name" })), serverType?.case === "http" && (editable || queryParamRows.length > 0) && (_jsx(HttpKeyValueSubsection, { title: "Query Parameters", count: queryParamRows.length, rows: queryParamRows, editable: editable, isSaving: isSaving, editing: queryParamsEditing, onEditingChange: setQueryParamsEditing, onSave: handleQueryParamsSave, keyLabel: "Parameter name" }))] }));
626
+ } })) : (_jsxs("span", { className: "stg:text-xs stg:text-foreground", children: [serverType.value.timeoutSeconds, "s"] }))] }))] }))] }), serverType?.case === "http" && (editable || headerRows.length > 0) && (_jsx(HttpKeyValueSubsection, { title: "Headers", count: headerRows.length, rows: headerRows, editable: editable, isSaving: isSaving, editing: headersEditing, onEditingChange: setHeadersEditing, onSave: handleHeadersSave, keyLabel: "Header name" })), serverType?.case === "http" && (editable || queryParamRows.length > 0) && (_jsx(HttpKeyValueSubsection, { title: "Query Parameters", count: queryParamRows.length, rows: queryParamRows, editable: editable, isSaving: isSaving, editing: queryParamsEditing, onEditingChange: setQueryParamsEditing, onSave: handleQueryParamsSave, keyLabel: "Parameter name" }))] }));
584
627
  }
585
628
  /** Renders a key-value subsection (headers or query params) within ServerConfigSection. */
586
629
  function HttpKeyValueSubsection({ title, count, rows, editable, isSaving, editing, onEditingChange, onSave, keyLabel, }) {
587
- return (_jsxs("div", { className: "border-t border-border", children: [_jsxs("div", { className: "flex items-center justify-between px-3 py-2", children: [_jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx("span", { className: "text-xs font-medium text-muted-foreground", children: title }), count > 0 && (_jsx("span", { className: "inline-flex min-w-[1.25rem] items-center justify-center rounded-full bg-muted px-1 py-px text-[10px] font-medium leading-none text-muted-foreground", children: count }))] }), editable && (_jsx("button", { type: "button", onClick: () => onEditingChange(!editing), className: "text-[11px] text-muted-foreground underline decoration-muted-foreground/40 underline-offset-2 hover:text-foreground hover:decoration-foreground", children: editing ? "Done" : "Edit" }))] }), editable && editing ? (_jsx(InlineEditKeyValue, { value: [...rows], onSave: onSave, isSaving: isSaving, editing: editing, onEditingChange: onEditingChange, keyLabel: keyLabel, showValue: true, valueLabel: "Value" })) : (_jsx("div", { className: "flex flex-col divide-y divide-border", children: rows.map((row) => (_jsxs("div", { className: "flex items-start gap-2 px-3 py-1.5", children: [_jsx("code", { className: "shrink-0 font-mono text-xs font-medium text-foreground", children: row.key }), _jsx("span", { className: "min-w-0 break-all font-mono text-xs text-muted-foreground", children: renderHeaderValue(row.value) })] }, row.key))) }))] }));
630
+ return (_jsxs("div", { className: "stg:border-t stg:border-border", children: [_jsxs("div", { className: "stg:flex stg:items-center stg:justify-between stg:px-3 stg:py-2", children: [_jsxs("div", { className: "stg:flex stg:items-center stg:gap-1.5", children: [_jsx("span", { className: "stg:text-xs stg:font-medium stg:text-muted-foreground", children: title }), count > 0 && (_jsx("span", { className: "stg:inline-flex stg:min-w-[1.25rem] stg:items-center stg:justify-center stg:rounded-full stg:bg-muted stg:px-1 stg:py-px stg:text-[10px] stg:font-medium stg:leading-none stg:text-muted-foreground", children: count }))] }), editable && (_jsx("button", { type: "button", onClick: () => onEditingChange(!editing), className: "stg:text-[11px] stg:text-muted-foreground stg:underline stg:decoration-muted-foreground/40 stg:underline-offset-2 stg:hover:text-foreground stg:hover:decoration-foreground", children: editing ? "Done" : "Edit" }))] }), editable && editing ? (_jsx(InlineEditKeyValue, { value: [...rows], onSave: onSave, isSaving: isSaving, editing: editing, onEditingChange: onEditingChange, keyLabel: keyLabel, showValue: true, valueLabel: "Value" })) : (_jsx("div", { className: "stg:flex stg:flex-col stg:divide-y stg:divide-border", children: rows.map((row) => (_jsxs("div", { className: "stg:flex stg:items-start stg:gap-2 stg:px-3 stg:py-1.5", children: [_jsx("code", { className: "stg:shrink-0 stg:font-mono stg:text-xs stg:font-medium stg:text-foreground", children: row.key }), _jsx("span", { className: "stg:min-w-0 stg:break-all stg:font-mono stg:text-xs stg:text-muted-foreground", children: renderHeaderValue(row.value) })] }, row.key))) }))] }));
588
631
  }
589
632
  const ENV_VAR_PLACEHOLDER = /\$\{([^}]+)\}/g;
590
633
  /** Renders a header value, highlighting ${VAR} placeholders with a variable badge. */
@@ -599,7 +642,7 @@ function renderHeaderValue(value) {
599
642
  if (match.index > lastIndex) {
600
643
  parts.push(value.slice(lastIndex, match.index));
601
644
  }
602
- parts.push(_jsx("span", { className: "inline-flex items-center gap-0.5 rounded bg-primary-subtle px-1 py-px text-[10px] font-medium text-primary", title: `Resolved from environment variable: ${match[1]}`, children: match[0] }, match.index));
645
+ parts.push(_jsx("span", { className: "stg:inline-flex stg:items-center stg:gap-0.5 stg:rounded stg:bg-primary-subtle stg:px-1 stg:py-px stg:text-[10px] stg:font-medium stg:text-primary", title: `Resolved from environment variable: ${match[1]}`, children: match[0] }, match.index));
603
646
  lastIndex = match.index + match[0].length;
604
647
  }
605
648
  if (lastIndex < value.length) {
@@ -608,12 +651,12 @@ function renderHeaderValue(value) {
608
651
  return _jsx(_Fragment, { children: parts });
609
652
  }
610
653
  function SourceSection({ spec, }) {
611
- return (_jsx(Section, { title: "Source", children: _jsxs("div", { className: "flex flex-col gap-2 p-3", children: [spec.repositoryUrl && (_jsxs("div", { className: "flex items-baseline gap-2", children: [_jsx("span", { className: "shrink-0 text-xs font-medium text-muted-foreground", children: "Repository" }), _jsxs("a", { href: spec.repositoryUrl, target: "_blank", rel: "noopener noreferrer", className: "inline-flex items-center gap-1 break-all font-mono text-xs text-foreground underline decoration-muted-foreground/40 underline-offset-2 hover:decoration-foreground", children: [spec.repositoryUrl, _jsx(ExternalLinkIcon, { className: "size-3 shrink-0" })] })] })), spec.githubStars > 0 && (_jsxs("div", { className: "flex items-baseline gap-2", children: [_jsx("span", { className: "shrink-0 text-xs font-medium text-muted-foreground", children: "Stars" }), _jsx("span", { className: "text-xs text-foreground", children: spec.githubStars.toLocaleString() })] }))] }) }));
654
+ return (_jsx(Section, { title: "Source", children: _jsxs("div", { className: "stg:flex stg:flex-col stg:gap-2 stg:p-3", children: [spec.repositoryUrl && (_jsxs("div", { className: "stg:flex stg:items-baseline stg:gap-2", children: [_jsx("span", { className: "stg:shrink-0 stg:text-xs stg:font-medium stg:text-muted-foreground", children: "Repository" }), _jsxs("a", { href: spec.repositoryUrl, target: "_blank", rel: "noopener noreferrer", className: "stg:inline-flex stg:items-center stg:gap-1 stg:break-all stg:font-mono stg:text-xs stg:text-foreground stg:underline stg:decoration-muted-foreground/40 stg:underline-offset-2 stg:hover:decoration-foreground", children: [spec.repositoryUrl, _jsx(ExternalLinkIcon, { className: "stg:size-3 stg:shrink-0" })] })] })), spec.githubStars > 0 && (_jsxs("div", { className: "stg:flex stg:items-baseline stg:gap-2", children: [_jsx("span", { className: "stg:shrink-0 stg:text-xs stg:font-medium stg:text-muted-foreground", children: "Stars" }), _jsx("span", { className: "stg:text-xs stg:text-foreground", children: spec.githubStars.toLocaleString() })] }))] }) }));
612
655
  }
613
656
  function ResourceTemplatesList({ templates, }) {
614
657
  if (templates.length === 0)
615
658
  return null;
616
- return (_jsx("div", { className: "flex flex-col divide-y divide-border", children: templates.map((tpl) => (_jsxs("div", { className: "px-3 py-2.5", children: [_jsxs("div", { className: "flex items-baseline gap-2", children: [_jsx("span", { className: "text-sm font-medium text-foreground", children: tpl.name }), _jsx("code", { className: "font-mono text-[10px] text-muted-foreground", children: tpl.uriTemplate })] }), tpl.description && (_jsx("p", { className: "mt-0.5 text-xs text-muted-foreground", children: tpl.description }))] }, tpl.uriTemplate || tpl.name))) }));
659
+ return (_jsx("div", { className: "stg:flex stg:flex-col stg:divide-y stg:divide-border", children: templates.map((tpl) => (_jsxs("div", { className: "stg:px-3 stg:py-2.5", children: [_jsxs("div", { className: "stg:flex stg:items-baseline stg:gap-2", children: [_jsx("span", { className: "stg:text-sm stg:font-medium stg:text-foreground", children: tpl.name }), _jsx("code", { className: "stg:font-mono stg:text-[10px] stg:text-muted-foreground", children: tpl.uriTemplate })] }), tpl.description && (_jsx("p", { className: "stg:mt-0.5 stg:text-xs stg:text-muted-foreground", children: tpl.description }))] }, tpl.uriTemplate || tpl.name))) }));
617
660
  }
618
661
  function EnvSection({ data, oauthTargetEnvVar, editable, isSaving, saveMcpField, }) {
619
662
  const entries = Object.entries(data).sort(([a], [b]) => a.localeCompare(b));
@@ -640,9 +683,9 @@ function EnvSection({ data, oauthTargetEnvVar, editable, isSaving, saveMcpField,
640
683
  return saveMcpField("env", Object.keys(env).length > 0 ? env : undefined);
641
684
  }, [saveMcpField]);
642
685
  const [envEditing, setEnvEditing] = useState(false);
643
- return (_jsx(Section, { title: "Environment Variables", count: entries.length, onEdit: editable ? () => setEnvEditing((v) => !v) : undefined, children: editable ? (_jsx(InlineEditKeyValue, { value: envRows, onSave: handleEnvSave, isSaving: isSaving, editing: envEditing, onEditingChange: setEnvEditing, showSecretToggle: true, showOptionalToggle: true, showDescription: true, keyLabel: "Variable name" })) : (_jsx("div", { className: "flex flex-col divide-y divide-border", children: entries.map(([name, env]) => {
686
+ return (_jsx(Section, { title: "Environment Variables", count: entries.length, onEdit: editable ? () => setEnvEditing((v) => !v) : undefined, children: editable ? (_jsx(InlineEditKeyValue, { value: envRows, onSave: handleEnvSave, isSaving: isSaving, editing: envEditing, onEditingChange: setEnvEditing, showSecretToggle: true, showOptionalToggle: true, showDescription: true, keyLabel: "Variable name" })) : (_jsx("div", { className: "stg:flex stg:flex-col stg:divide-y stg:divide-border", children: entries.map(([name, env]) => {
644
687
  const isOAuthManaged = name === oauthTargetEnvVar;
645
- return (_jsxs("div", { className: "flex items-start gap-3 px-3 py-2", children: [_jsx("code", { className: "shrink-0 font-mono text-sm font-medium text-foreground", children: name }), _jsx("span", { className: "shrink-0 rounded bg-muted px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground", children: env.isSecret ? "secret" : "config" }), isOAuthManaged && (_jsx("span", { className: "shrink-0 rounded bg-primary-subtle px-1.5 py-0.5 text-[10px] font-medium text-primary", children: "oauth" })), env.optional && (_jsx("span", { className: "shrink-0 rounded bg-muted px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground-subtle", children: "optional" })), env.description && (_jsx("span", { className: "text-xs text-muted-foreground", children: env.description }))] }, name));
688
+ return (_jsxs("div", { className: "stg:flex stg:items-start stg:gap-3 stg:px-3 stg:py-2", children: [_jsx("code", { className: "stg:shrink-0 stg:font-mono stg:text-sm stg:font-medium stg:text-foreground", children: name }), _jsx("span", { className: "stg:shrink-0 stg:rounded stg:bg-muted stg:px-1.5 stg:py-0.5 stg:text-[10px] stg:font-medium stg:text-muted-foreground", children: env.isSecret ? "secret" : "config" }), isOAuthManaged && (_jsx("span", { className: "stg:shrink-0 stg:rounded stg:bg-primary-subtle stg:px-1.5 stg:py-0.5 stg:text-[10px] stg:font-medium stg:text-primary", children: "oauth" })), env.optional && (_jsx("span", { className: "stg:shrink-0 stg:rounded stg:bg-muted stg:px-1.5 stg:py-0.5 stg:text-[10px] stg:font-medium stg:text-muted-foreground-subtle", children: "optional" })), env.description && (_jsx("span", { className: "stg:text-xs stg:text-muted-foreground", children: env.description }))] }, name));
646
689
  }) })) }));
647
690
  }
648
691
  function TagsSection({ tags, editable, isSaving, saveMcpField, }) {
@@ -656,12 +699,12 @@ function TagsSection({ tags, editable, isSaving, saveMcpField, }) {
656
699
  // a higher level if needed. For now, show read-only in edit mode.
657
700
  return false;
658
701
  }, [saveMcpField]);
659
- return (_jsx(Section, { title: "Tags", count: tags.length, children: _jsxs("div", { className: "flex flex-wrap gap-1.5 p-3", children: [tags.map((tag) => (_jsx("span", { className: "rounded-full bg-muted px-2.5 py-0.5 text-xs font-medium text-muted-foreground", children: tag }, tag))), editable && tags.length === 0 && (_jsx("p", { className: "text-xs text-muted-foreground italic", children: "No tags" }))] }) }));
702
+ return (_jsx(Section, { title: "Tags", count: tags.length, children: _jsxs("div", { className: "stg:flex stg:flex-wrap stg:gap-1.5 stg:p-3", children: [tags.map((tag) => (_jsx("span", { className: "stg:rounded-full stg:bg-muted stg:px-2.5 stg:py-0.5 stg:text-xs stg:font-medium stg:text-muted-foreground", children: tag }, tag))), editable && tags.length === 0 && (_jsx("p", { className: "stg:text-xs stg:text-muted-foreground stg:italic", children: "No tags" }))] }) }));
660
703
  }
661
704
  // ---------------------------------------------------------------------------
662
705
  // Capability tab contents (read-only)
663
706
  // ---------------------------------------------------------------------------
664
- function ToolsTabContent({ tools, }) {
707
+ function ToolsTabContent({ tools, isOAuthStranded, onDiscover, isDiscovering, }) {
665
708
  const [search, setSearch] = useState("");
666
709
  const [expandedTool, setExpandedTool] = useState(null);
667
710
  const filtered = useMemo(() => {
@@ -672,17 +715,21 @@ function ToolsTabContent({ tools, }) {
672
715
  t.description?.toLowerCase().includes(q));
673
716
  }, [tools, search]);
674
717
  if (tools.length === 0) {
675
- return (_jsxs("div", { className: "px-3 py-8 text-center", children: [_jsx(ConnectIcon, { className: "mx-auto mb-2 size-6 text-muted-foreground-faint" }), _jsx("p", { className: "text-xs text-muted-foreground", children: "Connect to this MCP server to discover its available tools." })] }));
718
+ // Two distinct empty states: "never connected" (informational) vs
719
+ // "signed in but discovery never landed" (stigmer/stigmer#229) — the
720
+ // latter must carry its own recovery action, because the user already
721
+ // did the thing the informational copy asks for.
722
+ return (_jsxs("div", { className: "stg:px-3 stg:py-8 stg:text-center", children: [_jsx(ConnectIcon, { className: "stg:mx-auto stg:mb-2 stg:size-6 stg:text-muted-foreground-faint" }), isOAuthStranded ? (_jsxs(_Fragment, { children: [_jsx("p", { className: "stg:text-xs stg:text-muted-foreground", children: "Signed in, but tools haven't been discovered yet." }), _jsxs("button", { type: "button", onClick: onDiscover, disabled: isDiscovering, className: cn("stg:mt-3 stg:inline-flex stg:items-center stg:gap-1.5 stg:rounded-md stg:px-2.5 stg:py-1 stg:text-xs stg:font-medium", "stg:bg-primary stg:text-primary-foreground stg:hover:bg-primary-hover", "stg:disabled:pointer-events-none stg:disabled:opacity-50"), children: [isDiscovering && _jsx(Spinner, {}), isDiscovering ? "Discovering tools..." : "Discover tools"] })] })) : (_jsx("p", { className: "stg:text-xs stg:text-muted-foreground", children: "Connect to this MCP server to discover its available tools." }))] }));
676
723
  }
677
724
  const isFiltered = search.trim().length > 0;
678
- return (_jsxs("div", { className: "flex flex-col", children: [_jsxs("div", { className: "flex items-center gap-2 px-3 pb-2", children: [_jsxs("div", { className: "relative flex-1", children: [_jsx(SearchIcon, { className: "pointer-events-none absolute left-2 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground" }), _jsx("input", { type: "text", value: search, onChange: (e) => setSearch(e.target.value), placeholder: "Search tools\u2026", "aria-label": "Search tools", className: "w-full rounded-md border border-border bg-background py-1.5 pl-7 pr-7 text-xs text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring" }), isFiltered && (_jsx("button", { type: "button", onClick: () => setSearch(""), "aria-label": "Clear search", className: "absolute right-2 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground", children: _jsx(CloseIcon, { className: "size-3" }) }))] }), _jsx("span", { className: "shrink-0 text-[10px] text-muted-foreground", children: isFiltered ? `${filtered.length} of ${tools.length}` : tools.length })] }), filtered.length === 0 ? (_jsx("div", { className: "px-3 py-6 text-center", children: _jsxs("p", { className: "text-xs text-muted-foreground", children: ["No tools matching \u201C", search, "\u201D"] }) })) : (_jsx("div", { className: "max-h-96 overflow-y-auto", children: _jsx("div", { className: "flex flex-col divide-y divide-border", children: filtered.map((tool) => {
725
+ return (_jsxs("div", { className: "stg:flex stg:flex-col", children: [_jsxs("div", { className: "stg:flex stg:items-center stg:gap-2 stg:px-3 stg:pb-2", children: [_jsxs("div", { className: "stg:relative stg:flex-1", children: [_jsx(SearchIcon, { className: "stg:pointer-events-none stg:absolute stg:left-2 stg:top-1/2 stg:size-3.5 stg:-translate-y-1/2 stg:text-muted-foreground" }), _jsx("input", { type: "text", value: search, onChange: (e) => setSearch(e.target.value), placeholder: "Search tools\u2026", "aria-label": "Search tools", className: "stg:w-full stg:rounded-md stg:border stg:border-border stg:bg-background stg:py-1.5 stg:pl-7 stg:pr-7 stg:text-xs stg:text-foreground stg:placeholder:text-muted-foreground stg:focus:outline-none stg:focus:ring-2 stg:focus:ring-ring" }), isFiltered && (_jsx("button", { type: "button", onClick: () => setSearch(""), "aria-label": "Clear search", className: "stg:absolute stg:right-2 stg:top-1/2 stg:-translate-y-1/2 stg:text-muted-foreground stg:hover:text-foreground", children: _jsx(CloseIcon, { className: "stg:size-3" }) }))] }), _jsx("span", { className: "stg:shrink-0 stg:text-[10px] stg:text-muted-foreground", children: isFiltered ? `${filtered.length} of ${tools.length}` : tools.length })] }), filtered.length === 0 ? (_jsx("div", { className: "stg:px-3 stg:py-6 stg:text-center", children: _jsxs("p", { className: "stg:text-xs stg:text-muted-foreground", children: ["No tools matching \u201C", search, "\u201D"] }) })) : (_jsx("div", { className: "stg:max-h-96 stg:overflow-y-auto", children: _jsx("div", { className: "stg:flex stg:flex-col stg:divide-y stg:divide-border", children: filtered.map((tool) => {
679
726
  const isExpanded = expandedTool === tool.name;
680
727
  const hasSchema = tool.inputSchema != null &&
681
728
  Object.keys(tool.inputSchema).length > 0;
682
- return (_jsxs("div", { children: [_jsxs("button", { type: "button", onClick: () => setExpandedTool(isExpanded ? null : tool.name), className: "flex w-full items-start gap-2 px-3 py-2.5 text-left transition-colors hover:bg-muted-faint", "aria-expanded": isExpanded, children: [_jsx(ChevronIcon, { className: cn("mt-0.5 size-3 shrink-0 text-muted-foreground transition-transform", isExpanded && "rotate-90") }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("code", { className: "font-mono text-sm font-medium text-foreground", children: tool.name }), tool.description && (_jsx("p", { className: "mt-0.5 text-xs text-muted-foreground", children: tool.description }))] }), hasSchema && (_jsx("span", { className: "mt-0.5 shrink-0 rounded bg-muted px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground", children: "schema" }))] }), isExpanded && hasSchema && (_jsx("div", { className: "border-t border-border bg-muted-faint px-3 py-2", children: _jsx("pre", { className: "max-h-64 overflow-auto whitespace-pre-wrap break-words rounded border border-border bg-background p-2 font-mono text-[11px] text-foreground", children: JSON.stringify(tool.inputSchema, null, 2) }) }))] }, tool.name));
729
+ return (_jsxs("div", { children: [_jsxs("button", { type: "button", onClick: () => setExpandedTool(isExpanded ? null : tool.name), className: "stg:flex stg:w-full stg:items-start stg:gap-2 stg:px-3 stg:py-2.5 stg:text-left stg:transition-colors stg:hover:bg-muted-faint", "aria-expanded": isExpanded, children: [_jsx(ChevronIcon, { className: cn("stg:mt-0.5 stg:size-3 stg:shrink-0 stg:text-muted-foreground stg:transition-transform", isExpanded && "stg:rotate-90") }), _jsxs("div", { className: "stg:min-w-0 stg:flex-1", children: [_jsx("code", { className: "stg:font-mono stg:text-sm stg:font-medium stg:text-foreground", children: tool.name }), tool.description && (_jsx("p", { className: "stg:mt-0.5 stg:text-xs stg:text-muted-foreground", children: tool.description }))] }), hasSchema && (_jsx("span", { className: "stg:mt-0.5 stg:shrink-0 stg:rounded stg:bg-muted stg:px-1.5 stg:py-0.5 stg:text-[10px] stg:font-medium stg:text-muted-foreground", children: "schema" }))] }), isExpanded && hasSchema && (_jsx("div", { className: "stg:border-t stg:border-border stg:bg-muted-faint stg:px-3 stg:py-2", children: _jsx("pre", { className: "stg:max-h-64 stg:overflow-auto stg:whitespace-pre-wrap stg:break-words stg:rounded stg:border stg:border-border stg:bg-background stg:p-2 stg:font-mono stg:text-[11px] stg:text-foreground", children: JSON.stringify(tool.inputSchema, null, 2) }) }))] }, tool.name));
683
730
  }) }) }))] }));
684
731
  }
685
- function PoliciesTabContent({ pinnedPolicies, classifiedPolicies, hasDiscoveredTools, }) {
732
+ function PoliciesTabContent({ pinnedPolicies, classifiedPolicies, hasDiscoveredTools, isOAuthStranded, }) {
686
733
  const [search, setSearch] = useState("");
687
734
  const totalCount = pinnedPolicies.length + classifiedPolicies.length;
688
735
  const hasAnyPolicies = totalCount > 0;
@@ -703,29 +750,31 @@ function PoliciesTabContent({ pinnedPolicies, classifiedPolicies, hasDiscoveredT
703
750
  const filteredTotal = filteredPinned.length + filteredClassified.length;
704
751
  const isFiltered = search.trim().length > 0;
705
752
  if (!hasAnyPolicies) {
706
- return (_jsxs("div", { className: "px-3 py-8 text-center", children: [_jsx(ShieldIcon, { className: "mx-auto mb-2 size-6 text-muted-foreground-faint" }), _jsx("p", { className: "text-xs text-muted-foreground", children: hasDiscoveredTools
753
+ return (_jsxs("div", { className: "stg:px-3 stg:py-8 stg:text-center", children: [_jsx(ShieldIcon, { className: "stg:mx-auto stg:mb-2 stg:size-6 stg:text-muted-foreground-faint" }), _jsx("p", { className: "stg:text-xs stg:text-muted-foreground", children: hasDiscoveredTools
707
754
  ? "No approval policies yet. Reconnect to reclassify tools."
708
- : "Connect to discover tools and auto-classify approval policies." })] }));
755
+ : isOAuthStranded
756
+ ? "Signed in \u2014 discover tools to auto-classify approval policies."
757
+ : "Connect to discover tools and auto-classify approval policies." })] }));
709
758
  }
710
- return (_jsxs("div", { className: "flex flex-col", children: [_jsxs("div", { className: "flex items-center gap-2 px-3 pb-2", children: [_jsxs("div", { className: "relative flex-1", children: [_jsx(SearchIcon, { className: "pointer-events-none absolute left-2 top-1/2 size-3.5 -translate-y-1/2 text-muted-foreground" }), _jsx("input", { type: "text", value: search, onChange: (e) => setSearch(e.target.value), placeholder: "Search policies\u2026", "aria-label": "Search policies", className: "w-full rounded-md border border-border bg-background py-1.5 pl-7 pr-7 text-xs text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring" }), isFiltered && (_jsx("button", { type: "button", onClick: () => setSearch(""), "aria-label": "Clear search", className: "absolute right-2 top-1/2 -translate-y-1/2 text-muted-foreground hover:text-foreground", children: _jsx(CloseIcon, { className: "size-3" }) }))] }), _jsx("span", { className: "shrink-0 text-[10px] text-muted-foreground", children: isFiltered ? `${filteredTotal} of ${totalCount}` : totalCount })] }), filteredTotal === 0 ? (_jsx("div", { className: "px-3 py-6 text-center", children: _jsxs("p", { className: "text-xs text-muted-foreground", children: ["No policies matching \u201C", search, "\u201D"] }) })) : (_jsxs("div", { className: "max-h-96 overflow-y-auto", children: [filteredPinned.length > 0 && (_jsx(PolicyGroup, { icon: _jsx(PinIcon, { className: "size-3.5" }), label: "Pinned", policies: filteredPinned })), filteredClassified.length > 0 && (_jsx(PolicyGroup, { icon: _jsx(SparklesIcon, { className: "size-3.5" }), label: "Auto-classified", policies: filteredClassified }))] }))] }));
759
+ return (_jsxs("div", { className: "stg:flex stg:flex-col", children: [_jsxs("div", { className: "stg:flex stg:items-center stg:gap-2 stg:px-3 stg:pb-2", children: [_jsxs("div", { className: "stg:relative stg:flex-1", children: [_jsx(SearchIcon, { className: "stg:pointer-events-none stg:absolute stg:left-2 stg:top-1/2 stg:size-3.5 stg:-translate-y-1/2 stg:text-muted-foreground" }), _jsx("input", { type: "text", value: search, onChange: (e) => setSearch(e.target.value), placeholder: "Search policies\u2026", "aria-label": "Search policies", className: "stg:w-full stg:rounded-md stg:border stg:border-border stg:bg-background stg:py-1.5 stg:pl-7 stg:pr-7 stg:text-xs stg:text-foreground stg:placeholder:text-muted-foreground stg:focus:outline-none stg:focus:ring-2 stg:focus:ring-ring" }), isFiltered && (_jsx("button", { type: "button", onClick: () => setSearch(""), "aria-label": "Clear search", className: "stg:absolute stg:right-2 stg:top-1/2 stg:-translate-y-1/2 stg:text-muted-foreground stg:hover:text-foreground", children: _jsx(CloseIcon, { className: "stg:size-3" }) }))] }), _jsx("span", { className: "stg:shrink-0 stg:text-[10px] stg:text-muted-foreground", children: isFiltered ? `${filteredTotal} of ${totalCount}` : totalCount })] }), filteredTotal === 0 ? (_jsx("div", { className: "stg:px-3 stg:py-6 stg:text-center", children: _jsxs("p", { className: "stg:text-xs stg:text-muted-foreground", children: ["No policies matching \u201C", search, "\u201D"] }) })) : (_jsxs("div", { className: "stg:max-h-96 stg:overflow-y-auto", children: [filteredPinned.length > 0 && (_jsx(PolicyGroup, { icon: _jsx(PinIcon, { className: "stg:size-3.5" }), label: "Pinned", policies: filteredPinned })), filteredClassified.length > 0 && (_jsx(PolicyGroup, { icon: _jsx(SparklesIcon, { className: "stg:size-3.5" }), label: "Auto-classified", policies: filteredClassified }))] }))] }));
711
760
  }
712
761
  function PolicyGroup({ icon, label, policies, }) {
713
- return (_jsxs("div", { className: "flex flex-col", children: [_jsxs("div", { className: "flex items-center gap-1.5 border-b border-border bg-muted-faint px-3 py-1.5", children: [_jsx("span", { className: "text-muted-foreground", children: icon }), _jsx("span", { className: "text-[10px] font-medium uppercase tracking-wider text-muted-foreground", children: label }), _jsxs("span", { className: "text-[10px] text-muted-foreground", children: ["(", policies.length, ")"] })] }), _jsx("div", { className: "flex flex-col divide-y divide-border", children: policies.map((policy) => (_jsxs("div", { className: "px-3 py-2.5", children: [_jsxs("div", { className: "flex items-baseline gap-2", children: [_jsx("code", { className: "font-mono text-sm font-medium text-foreground", children: policy.toolName }), _jsxs("span", { className: "inline-flex items-center gap-1 rounded bg-amber-500/10 px-1.5 py-0.5 text-[10px] font-medium text-amber-600 dark:text-amber-400", children: [_jsx(ShieldIcon, { className: "size-2.5" }), "requires approval"] })] }), policy.message && (_jsx("p", { className: "mt-0.5 text-xs text-muted-foreground", children: policy.message }))] }, policy.toolName))) })] }));
762
+ return (_jsxs("div", { className: "stg:flex stg:flex-col", children: [_jsxs("div", { className: "stg:flex stg:items-center stg:gap-1.5 stg:border-b stg:border-border stg:bg-muted-faint stg:px-3 stg:py-1.5", children: [_jsx("span", { className: "stg:text-muted-foreground", children: icon }), _jsx("span", { className: "stg:text-[10px] stg:font-medium stg:uppercase stg:tracking-wider stg:text-muted-foreground", children: label }), _jsxs("span", { className: "stg:text-[10px] stg:text-muted-foreground", children: ["(", policies.length, ")"] })] }), _jsx("div", { className: "stg:flex stg:flex-col stg:divide-y stg:divide-border", children: policies.map((policy) => (_jsxs("div", { className: "stg:px-3 stg:py-2.5", children: [_jsxs("div", { className: "stg:flex stg:items-baseline stg:gap-2", children: [_jsx("code", { className: "stg:font-mono stg:text-sm stg:font-medium stg:text-foreground", children: policy.toolName }), _jsxs("span", { className: "stg:inline-flex stg:items-center stg:gap-1 stg:rounded stg:bg-amber-500/10 stg:px-1.5 stg:py-0.5 stg:text-[10px] stg:font-medium stg:text-amber-600 stg:dark:text-amber-400", children: [_jsx(ShieldIcon, { className: "stg:size-2.5" }), "requires approval"] })] }), policy.message && (_jsx("p", { className: "stg:mt-0.5 stg:text-xs stg:text-muted-foreground", children: policy.message }))] }, policy.toolName))) })] }));
714
763
  }
715
764
  // ---------------------------------------------------------------------------
716
765
  // Shared layout primitives
717
766
  // ---------------------------------------------------------------------------
718
767
  function Dot() {
719
- return (_jsx("span", { className: "shrink-0", "aria-hidden": "true", children: "\u00B7" }));
768
+ return (_jsx("span", { className: "stg:shrink-0", "aria-hidden": "true", children: "\u00B7" }));
720
769
  }
721
770
  // ---------------------------------------------------------------------------
722
771
  // Non-happy states
723
772
  // ---------------------------------------------------------------------------
724
773
  function LoadingSkeleton({ className }) {
725
- return (_jsxs("div", { className: cn("flex flex-col gap-6", className), "aria-busy": "true", "aria-label": "Loading MCP server details", children: [_jsxs("div", { className: "flex items-start gap-3", children: [_jsx("div", { className: "mt-1 size-6 shrink-0 animate-pulse rounded bg-muted" }), _jsxs("div", { className: "flex-1 space-y-2", children: [_jsx("div", { className: "h-5 w-48 animate-pulse rounded bg-muted" }), _jsx("div", { className: "h-3 w-64 animate-pulse rounded bg-muted" }), _jsx("div", { className: "h-4 w-full max-w-md animate-pulse rounded bg-muted" })] })] }), [24, 48, 16, 12].map((h, i) => (_jsxs("div", { className: "space-y-2", children: [_jsx("div", { className: "h-3 w-28 animate-pulse rounded bg-muted" }), _jsx("div", { className: "animate-pulse rounded-lg border border-border bg-muted-faint", style: { height: `${h * 4}px` } })] }, i)))] }));
774
+ return (_jsxs("div", { className: cn("stg:flex stg:flex-col stg:gap-6", className), "aria-busy": "true", "aria-label": "Loading MCP server details", children: [_jsxs("div", { className: "stg:flex stg:items-start stg:gap-3", children: [_jsx("div", { className: "stg:mt-1 stg:size-6 stg:shrink-0 stg:animate-pulse stg:rounded stg:bg-muted" }), _jsxs("div", { className: "stg:flex-1 stg:space-y-2", children: [_jsx("div", { className: "stg:h-5 stg:w-48 stg:animate-pulse stg:rounded stg:bg-muted" }), _jsx("div", { className: "stg:h-3 stg:w-64 stg:animate-pulse stg:rounded stg:bg-muted" }), _jsx("div", { className: "stg:h-4 stg:w-full stg:max-w-md stg:animate-pulse stg:rounded stg:bg-muted" })] })] }), [24, 48, 16, 12].map((h, i) => (_jsxs("div", { className: "stg:space-y-2", children: [_jsx("div", { className: "stg:h-3 stg:w-28 stg:animate-pulse stg:rounded stg:bg-muted" }), _jsx("div", { className: "stg:animate-pulse stg:rounded-lg stg:border stg:border-border stg:bg-muted-faint", style: { height: `${h * 4}px` } })] }, i)))] }));
726
775
  }
727
776
  function NotFoundState({ className }) {
728
- return (_jsxs("div", { role: "status", className: cn("flex flex-col items-center gap-2 py-12 text-center", className), children: [_jsx(McpServerIcon, { className: "size-10 text-muted-foreground-faint" }), _jsx("p", { className: "text-sm font-medium text-muted-foreground", children: "MCP Server not found" }), _jsx("p", { className: "text-xs text-muted-foreground-subtle", children: "This MCP server doesn't exist or you don't have access to it." })] }));
777
+ return (_jsxs("div", { role: "status", className: cn("stg:flex stg:flex-col stg:items-center stg:gap-2 stg:py-12 stg:text-center", className), children: [_jsx(McpServerIcon, { className: "stg:size-10 stg:text-muted-foreground-faint" }), _jsx("p", { className: "stg:text-sm stg:font-medium stg:text-muted-foreground", children: "MCP Server not found" }), _jsx("p", { className: "stg:text-xs stg:text-muted-foreground-subtle", children: "This MCP server doesn't exist or you don't have access to it." })] }));
729
778
  }
730
779
  // ---------------------------------------------------------------------------
731
780
  // Utilities
@@ -780,6 +829,6 @@ function ChevronIcon({ className }) {
780
829
  return (_jsx("svg", { className: className, viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", children: _jsx("path", { d: "m6 4 4 4-4 4" }) }));
781
830
  }
782
831
  function Spinner() {
783
- return (_jsx("svg", { width: "14", height: "14", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", className: "animate-spin", "aria-hidden": "true", children: _jsx("path", { d: "M8 2a6 6 0 1 0 6 6" }) }));
832
+ return (_jsx("svg", { width: "14", height: "14", viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "2", strokeLinecap: "round", className: "stg:animate-spin", "aria-hidden": "true", children: _jsx("path", { d: "M8 2a6 6 0 1 0 6 6" }) }));
784
833
  }
785
834
  //# sourceMappingURL=McpServerDetailView.js.map