@stigmer/react 3.12.0 → 3.12.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (738) hide show
  1. package/access/ManageAccessDialog.d.ts.map +1 -1
  2. package/access/ManageAccessDialog.js +7 -2
  3. package/access/ManageAccessDialog.js.map +1 -1
  4. package/activity/format-relative-time.d.ts +11 -9
  5. package/activity/format-relative-time.d.ts.map +1 -1
  6. package/activity/format-relative-time.js +11 -9
  7. package/activity/format-relative-time.js.map +1 -1
  8. package/agent/steps/CapabilitiesStep.js +5 -2
  9. package/agent/steps/CapabilitiesStep.js.map +1 -1
  10. package/agent/steps/IdentityStep.d.ts.map +1 -1
  11. package/agent/steps/IdentityStep.js +6 -5
  12. package/agent/steps/IdentityStep.js.map +1 -1
  13. package/agent-instance/CreateAgentInstanceDialog.d.ts.map +1 -1
  14. package/agent-instance/CreateAgentInstanceDialog.js +10 -2
  15. package/agent-instance/CreateAgentInstanceDialog.js.map +1 -1
  16. package/api-key/ApiKeyCreatedAlert.d.ts.map +1 -1
  17. package/api-key/ApiKeyCreatedAlert.js +12 -20
  18. package/api-key/ApiKeyCreatedAlert.js.map +1 -1
  19. package/api-key/ApiKeyListPanel.d.ts.map +1 -1
  20. package/api-key/ApiKeyListPanel.js +3 -23
  21. package/api-key/ApiKeyListPanel.js.map +1 -1
  22. package/api-key/CreateApiKeyForm.d.ts.map +1 -1
  23. package/api-key/CreateApiKeyForm.js +6 -10
  24. package/api-key/CreateApiKeyForm.js.map +1 -1
  25. package/approval-defaults-context.d.ts +47 -0
  26. package/approval-defaults-context.d.ts.map +1 -0
  27. package/approval-defaults-context.js +27 -0
  28. package/approval-defaults-context.js.map +1 -0
  29. package/attachment/index.d.ts +2 -0
  30. package/attachment/index.d.ts.map +1 -1
  31. package/attachment/index.js +1 -0
  32. package/attachment/index.js.map +1 -1
  33. package/attachment/vision-preflight.d.ts +113 -0
  34. package/attachment/vision-preflight.d.ts.map +1 -0
  35. package/attachment/vision-preflight.js +143 -0
  36. package/attachment/vision-preflight.js.map +1 -0
  37. package/billing/AutoRechargeCard.d.ts.map +1 -1
  38. package/billing/AutoRechargeCard.js +3 -2
  39. package/billing/AutoRechargeCard.js.map +1 -1
  40. package/billing/BillingSection.d.ts.map +1 -1
  41. package/billing/BillingSection.js +3 -2
  42. package/billing/BillingSection.js.map +1 -1
  43. package/channel/ChannelConversationsDialog.d.ts.map +1 -1
  44. package/channel/ChannelConversationsDialog.js +5 -4
  45. package/channel/ChannelConversationsDialog.js.map +1 -1
  46. package/channel/ChannelCredentialsDialog.d.ts.map +1 -1
  47. package/channel/ChannelCredentialsDialog.js +9 -4
  48. package/channel/ChannelCredentialsDialog.js.map +1 -1
  49. package/channel/ChannelTemplatesDialog.d.ts.map +1 -1
  50. package/channel/ChannelTemplatesDialog.js +5 -4
  51. package/channel/ChannelTemplatesDialog.js.map +1 -1
  52. package/channel/ConnectSlackDialog.d.ts.map +1 -1
  53. package/channel/ConnectSlackDialog.js +9 -4
  54. package/channel/ConnectSlackDialog.js.map +1 -1
  55. package/channel/ConnectWhatsAppDialog.d.ts.map +1 -1
  56. package/channel/ConnectWhatsAppDialog.js +9 -4
  57. package/channel/ConnectWhatsAppDialog.js.map +1 -1
  58. package/channel/useChannelSessions.d.ts.map +1 -1
  59. package/channel/useChannelSessions.js.map +1 -1
  60. package/channel-app/ChannelAppDetailPanel.d.ts.map +1 -1
  61. package/channel-app/ChannelAppDetailPanel.js +8 -5
  62. package/channel-app/ChannelAppDetailPanel.js.map +1 -1
  63. package/channel-app/CreateChannelAppForm.d.ts.map +1 -1
  64. package/channel-app/CreateChannelAppForm.js +12 -7
  65. package/channel-app/CreateChannelAppForm.js.map +1 -1
  66. package/channel-app/internal.d.ts +0 -1
  67. package/channel-app/internal.d.ts.map +1 -1
  68. package/channel-app/internal.js +5 -10
  69. package/channel-app/internal.js.map +1 -1
  70. package/composer/ComposerToolbar.js +2 -1
  71. package/composer/ComposerToolbar.js.map +1 -1
  72. package/composer/SessionComposer.d.ts +1 -1
  73. package/composer/SessionComposer.d.ts.map +1 -1
  74. package/composer/SessionComposer.js +120 -13
  75. package/composer/SessionComposer.js.map +1 -1
  76. package/composer/icons.d.ts +0 -1
  77. package/composer/icons.d.ts.map +1 -1
  78. package/composer/icons.js +0 -3
  79. package/composer/icons.js.map +1 -1
  80. package/conversation/ConversationComposer.js +1 -1
  81. package/conversation/ConversationComposer.js.map +1 -1
  82. package/conversation/ConversationListPane.d.ts.map +1 -1
  83. package/conversation/ConversationListPane.js +3 -2
  84. package/conversation/ConversationListPane.js.map +1 -1
  85. package/cursor-accounts/MemberCoverageTable.js +3 -14
  86. package/cursor-accounts/MemberCoverageTable.js.map +1 -1
  87. package/dashboard/DashboardFailedRuns.d.ts.map +1 -1
  88. package/dashboard/DashboardFailedRuns.js +2 -14
  89. package/dashboard/DashboardFailedRuns.js.map +1 -1
  90. package/environment/CreateEnvironmentForm.d.ts.map +1 -1
  91. package/environment/CreateEnvironmentForm.js +4 -8
  92. package/environment/CreateEnvironmentForm.js.map +1 -1
  93. package/environment/EnvVarForm.d.ts.map +1 -1
  94. package/environment/EnvVarForm.js +2 -4
  95. package/environment/EnvVarForm.js.map +1 -1
  96. package/environment/EnvironmentVariableEditor.d.ts.map +1 -1
  97. package/environment/EnvironmentVariableEditor.js +5 -7
  98. package/environment/EnvironmentVariableEditor.js.map +1 -1
  99. package/execution/ArtifactApplyButton.d.ts.map +1 -1
  100. package/execution/ArtifactApplyButton.js +2 -4
  101. package/execution/ArtifactApplyButton.js.map +1 -1
  102. package/execution/ExecutionErrorNotice.d.ts +36 -0
  103. package/execution/ExecutionErrorNotice.d.ts.map +1 -0
  104. package/execution/ExecutionErrorNotice.js +39 -0
  105. package/execution/ExecutionErrorNotice.js.map +1 -0
  106. package/execution/FilePathLink.d.ts.map +1 -1
  107. package/execution/FilePathLink.js +5 -8
  108. package/execution/FilePathLink.js.map +1 -1
  109. package/execution/FileReviewCard.d.ts.map +1 -1
  110. package/execution/FileReviewCard.js +1 -6
  111. package/execution/FileReviewCard.js.map +1 -1
  112. package/execution/FollowUpInput.d.ts.map +1 -1
  113. package/execution/FollowUpInput.js +1 -3
  114. package/execution/FollowUpInput.js.map +1 -1
  115. package/execution/LivenessStatusLine.d.ts +40 -0
  116. package/execution/LivenessStatusLine.d.ts.map +1 -0
  117. package/execution/LivenessStatusLine.js +34 -0
  118. package/execution/LivenessStatusLine.js.map +1 -0
  119. package/execution/MessageEntry.d.ts.map +1 -1
  120. package/execution/MessageEntry.js +31 -3
  121. package/execution/MessageEntry.js.map +1 -1
  122. package/execution/MessageThread.d.ts +25 -0
  123. package/execution/MessageThread.d.ts.map +1 -1
  124. package/execution/MessageThread.js +51 -36
  125. package/execution/MessageThread.js.map +1 -1
  126. package/execution/SetupProgress.d.ts.map +1 -1
  127. package/execution/SetupProgress.js +1 -1
  128. package/execution/SetupProgress.js.map +1 -1
  129. package/execution/SubAgentSection.d.ts.map +1 -1
  130. package/execution/SubAgentSection.js +9 -7
  131. package/execution/SubAgentSection.js.map +1 -1
  132. package/execution/TerminalSession.d.ts +30 -0
  133. package/execution/TerminalSession.d.ts.map +1 -1
  134. package/execution/TerminalSession.js +37 -1
  135. package/execution/TerminalSession.js.map +1 -1
  136. package/execution/ToolCallDetail.d.ts +9 -0
  137. package/execution/ToolCallDetail.d.ts.map +1 -1
  138. package/execution/ToolCallDetail.js +16 -0
  139. package/execution/ToolCallDetail.js.map +1 -1
  140. package/execution/ToolCallItem.d.ts +20 -6
  141. package/execution/ToolCallItem.d.ts.map +1 -1
  142. package/execution/ToolCallItem.js +102 -29
  143. package/execution/ToolCallItem.js.map +1 -1
  144. package/execution/ToolRunGroup.d.ts.map +1 -1
  145. package/execution/ToolRunGroup.js +11 -11
  146. package/execution/ToolRunGroup.js.map +1 -1
  147. package/execution/WriteBackCard.d.ts.map +1 -1
  148. package/execution/WriteBackCard.js +5 -20
  149. package/execution/WriteBackCard.js.map +1 -1
  150. package/execution/index.d.ts +6 -2
  151. package/execution/index.d.ts.map +1 -1
  152. package/execution/index.js +3 -1
  153. package/execution/index.js.map +1 -1
  154. package/execution/tool-categories.d.ts +42 -7
  155. package/execution/tool-categories.d.ts.map +1 -1
  156. package/execution/tool-categories.js +38 -4
  157. package/execution/tool-categories.js.map +1 -1
  158. package/execution/tool-presenter.d.ts +17 -1
  159. package/execution/tool-presenter.d.ts.map +1 -1
  160. package/execution/tool-presenter.js +4 -1
  161. package/execution/tool-presenter.js.map +1 -1
  162. package/execution/useArtifactInspection.d.ts.map +1 -1
  163. package/execution/useArtifactInspection.js +4 -7
  164. package/execution/useArtifactInspection.js.map +1 -1
  165. package/execution/useCreateAgentExecution.d.ts +3 -2
  166. package/execution/useCreateAgentExecution.d.ts.map +1 -1
  167. package/execution/useCreateAgentExecution.js.map +1 -1
  168. package/iam-policy/GrantAccessForm.d.ts.map +1 -1
  169. package/iam-policy/GrantAccessForm.js +2 -4
  170. package/iam-policy/GrantAccessForm.js.map +1 -1
  171. package/iam-policy/OrgMembersPanel.d.ts.map +1 -1
  172. package/iam-policy/OrgMembersPanel.js +3 -5
  173. package/iam-policy/OrgMembersPanel.js.map +1 -1
  174. package/iam-policy/RoleSelector.d.ts.map +1 -1
  175. package/iam-policy/RoleSelector.js +7 -1
  176. package/iam-policy/RoleSelector.js.map +1 -1
  177. package/identity-provider/CreateIdentityProviderForm.d.ts.map +1 -1
  178. package/identity-provider/CreateIdentityProviderForm.js +6 -9
  179. package/identity-provider/CreateIdentityProviderForm.js.map +1 -1
  180. package/identity-provider/IdentityProviderDetailPanel.d.ts.map +1 -1
  181. package/identity-provider/IdentityProviderDetailPanel.js +17 -26
  182. package/identity-provider/IdentityProviderDetailPanel.js.map +1 -1
  183. package/identity-provider/IdentityProviderListPanel.d.ts.map +1 -1
  184. package/identity-provider/IdentityProviderListPanel.js +2 -4
  185. package/identity-provider/IdentityProviderListPanel.js.map +1 -1
  186. package/identity-provider/IdentityProviderWizard.d.ts.map +1 -1
  187. package/identity-provider/IdentityProviderWizard.js +8 -7
  188. package/identity-provider/IdentityProviderWizard.js.map +1 -1
  189. package/identity-provider/SsoLoginPrompt.js +5 -6
  190. package/identity-provider/SsoLoginPrompt.js.map +1 -1
  191. package/index.d.ts +9 -8
  192. package/index.d.ts.map +1 -1
  193. package/index.js +4 -4
  194. package/index.js.map +1 -1
  195. package/internal/DecisionButton.d.ts.map +1 -1
  196. package/internal/DecisionButton.js +1 -6
  197. package/internal/DecisionButton.js.map +1 -1
  198. package/internal/SpinnerIcon.d.ts +22 -0
  199. package/internal/SpinnerIcon.d.ts.map +1 -0
  200. package/internal/SpinnerIcon.js +23 -0
  201. package/internal/SpinnerIcon.js.map +1 -0
  202. package/internal/isUnimplemented.d.ts +17 -0
  203. package/internal/isUnimplemented.d.ts.map +1 -0
  204. package/internal/isUnimplemented.js +26 -0
  205. package/internal/isUnimplemented.js.map +1 -0
  206. package/internal/select-element-text.d.ts +11 -0
  207. package/internal/select-element-text.d.ts.map +1 -0
  208. package/internal/select-element-text.js +19 -0
  209. package/internal/select-element-text.js.map +1 -0
  210. package/internal/thread-card/ThreadCardShell.d.ts +27 -10
  211. package/internal/thread-card/ThreadCardShell.d.ts.map +1 -1
  212. package/internal/thread-card/ThreadCardShell.js +11 -5
  213. package/internal/thread-card/ThreadCardShell.js.map +1 -1
  214. package/internal/thread-card/glyphs.d.ts +11 -2
  215. package/internal/thread-card/glyphs.d.ts.map +1 -1
  216. package/internal/thread-card/glyphs.js +9 -3
  217. package/internal/thread-card/glyphs.js.map +1 -1
  218. package/internal/thread-card/index.d.ts +1 -1
  219. package/internal/thread-card/index.d.ts.map +1 -1
  220. package/internal/thread-card/index.js.map +1 -1
  221. package/internal/useCopyFeedback.d.ts +28 -0
  222. package/internal/useCopyFeedback.d.ts.map +1 -0
  223. package/internal/useCopyFeedback.js +40 -0
  224. package/internal/useCopyFeedback.js.map +1 -0
  225. package/invitation/InvitationCreatedAlert.d.ts.map +1 -1
  226. package/invitation/InvitationCreatedAlert.js +12 -19
  227. package/invitation/InvitationCreatedAlert.js.map +1 -1
  228. package/invitation/InvitationManager.d.ts.map +1 -1
  229. package/invitation/InvitationManager.js +14 -21
  230. package/invitation/InvitationManager.js.map +1 -1
  231. package/invitation/InvitationRedemption.d.ts.map +1 -1
  232. package/invitation/InvitationRedemption.js +2 -4
  233. package/invitation/InvitationRedemption.js.map +1 -1
  234. package/library/useExportResource.d.ts.map +1 -1
  235. package/library/useExportResource.js +16 -27
  236. package/library/useExportResource.js.map +1 -1
  237. package/manifest/ApplyManifestDialog.js +1 -1
  238. package/manifest/EditResourceYamlDialog.js +1 -1
  239. package/mcp-server/DefinitionDriftNotice.d.ts +42 -0
  240. package/mcp-server/DefinitionDriftNotice.d.ts.map +1 -0
  241. package/mcp-server/DefinitionDriftNotice.js +52 -0
  242. package/mcp-server/DefinitionDriftNotice.js.map +1 -0
  243. package/mcp-server/McpServerConnectDialog.js +8 -4
  244. package/mcp-server/McpServerConnectDialog.js.map +1 -1
  245. package/mcp-server/McpServerDetailView.d.ts.map +1 -1
  246. package/mcp-server/McpServerDetailView.js +47 -14
  247. package/mcp-server/McpServerDetailView.js.map +1 -1
  248. package/mcp-server/OAuthAppForm.d.ts.map +1 -1
  249. package/mcp-server/OAuthAppForm.js +2 -4
  250. package/mcp-server/OAuthAppForm.js.map +1 -1
  251. package/mcp-server/internal/definitionDrift.d.ts +39 -0
  252. package/mcp-server/internal/definitionDrift.d.ts.map +1 -0
  253. package/mcp-server/internal/definitionDrift.js +122 -0
  254. package/mcp-server/internal/definitionDrift.js.map +1 -0
  255. package/mcp-server/internal/mcpServerToInput.d.ts.map +1 -1
  256. package/mcp-server/internal/mcpServerToInput.js +3 -0
  257. package/mcp-server/internal/mcpServerToInput.js.map +1 -1
  258. package/mcp-server/steps/EnvironmentAuthStep.d.ts.map +1 -1
  259. package/mcp-server/steps/EnvironmentAuthStep.js +8 -4
  260. package/mcp-server/steps/EnvironmentAuthStep.js.map +1 -1
  261. package/mcp-server/steps/IdentityTransportStep.d.ts.map +1 -1
  262. package/mcp-server/steps/IdentityTransportStep.js +5 -4
  263. package/mcp-server/steps/IdentityTransportStep.js.map +1 -1
  264. package/mcp-server/useMcpServerConnect.d.ts +1 -1
  265. package/mcp-server/useMcpServerCredentials.d.ts +38 -10
  266. package/mcp-server/useMcpServerCredentials.d.ts.map +1 -1
  267. package/mcp-server/useMcpServerCredentials.js +50 -7
  268. package/mcp-server/useMcpServerCredentials.js.map +1 -1
  269. package/mcp-server/useMcpServerDefinitionDrift.d.ts +44 -0
  270. package/mcp-server/useMcpServerDefinitionDrift.d.ts.map +1 -0
  271. package/mcp-server/useMcpServerDefinitionDrift.js +61 -0
  272. package/mcp-server/useMcpServerDefinitionDrift.js.map +1 -0
  273. package/mcp-server/useOrgOAuthApp.d.ts +22 -0
  274. package/mcp-server/useOrgOAuthApp.d.ts.map +1 -1
  275. package/mcp-server/useOrgOAuthApp.js +39 -7
  276. package/mcp-server/useOrgOAuthApp.js.map +1 -1
  277. package/models/ModelRegistryContext.d.ts +7 -1
  278. package/models/ModelRegistryContext.d.ts.map +1 -1
  279. package/models/ModelRegistryContext.js.map +1 -1
  280. package/models/ModelSelector.js +9 -1
  281. package/models/ModelSelector.js.map +1 -1
  282. package/models/index.d.ts +2 -2
  283. package/models/index.d.ts.map +1 -1
  284. package/models/index.js +1 -1
  285. package/models/index.js.map +1 -1
  286. package/models/registry.d.ts +88 -6
  287. package/models/registry.d.ts.map +1 -1
  288. package/models/registry.js +133 -27
  289. package/models/registry.js.map +1 -1
  290. package/models/useModelRegistry.d.ts +7 -1
  291. package/models/useModelRegistry.d.ts.map +1 -1
  292. package/models/useModelRegistry.js +3 -2
  293. package/models/useModelRegistry.js.map +1 -1
  294. package/oauth-app/CreateOAuthAppForm.d.ts.map +1 -1
  295. package/oauth-app/CreateOAuthAppForm.js +4 -5
  296. package/oauth-app/CreateOAuthAppForm.js.map +1 -1
  297. package/oauth-app/OAuthAppDetailPanel.d.ts.map +1 -1
  298. package/oauth-app/OAuthAppDetailPanel.js +5 -6
  299. package/oauth-app/OAuthAppDetailPanel.js.map +1 -1
  300. package/organization/CreateOrganizationForm.d.ts.map +1 -1
  301. package/organization/CreateOrganizationForm.js +5 -9
  302. package/organization/CreateOrganizationForm.js.map +1 -1
  303. package/organization/OrgProfilePanel.d.ts.map +1 -1
  304. package/organization/OrgProfilePanel.js +7 -16
  305. package/organization/OrgProfilePanel.js.map +1 -1
  306. package/package.json +4 -4
  307. package/platform-client/CreatePlatformClientForm.d.ts.map +1 -1
  308. package/platform-client/CreatePlatformClientForm.js +5 -6
  309. package/platform-client/CreatePlatformClientForm.js.map +1 -1
  310. package/platform-client/PlatformClientDetailPanel.d.ts.map +1 -1
  311. package/platform-client/PlatformClientDetailPanel.js +6 -7
  312. package/platform-client/PlatformClientDetailPanel.js.map +1 -1
  313. package/platform-client/PlatformClientListPanel.d.ts.map +1 -1
  314. package/platform-client/PlatformClientListPanel.js +2 -4
  315. package/platform-client/PlatformClientListPanel.js.map +1 -1
  316. package/platform-client/PlatformClientSecretAlert.d.ts.map +1 -1
  317. package/platform-client/PlatformClientSecretAlert.js +18 -25
  318. package/platform-client/PlatformClientSecretAlert.js.map +1 -1
  319. package/provider.d.ts +34 -1
  320. package/provider.d.ts.map +1 -1
  321. package/provider.js +14 -7
  322. package/provider.js.map +1 -1
  323. package/resource-creation/WizardNav.d.ts.map +1 -1
  324. package/resource-creation/WizardNav.js +2 -4
  325. package/resource-creation/WizardNav.js.map +1 -1
  326. package/resource-detail/ConfirmDialog.js +1 -1
  327. package/resource-detail/useCopyResource.d.ts +4 -3
  328. package/resource-detail/useCopyResource.d.ts.map +1 -1
  329. package/resource-detail/useCopyResource.js +10 -19
  330. package/resource-detail/useCopyResource.js.map +1 -1
  331. package/schedule/ScheduleDetailView.d.ts.map +1 -1
  332. package/schedule/ScheduleDetailView.js +2 -4
  333. package/schedule/ScheduleDetailView.js.map +1 -1
  334. package/schedule/ScheduleForm.d.ts.map +1 -1
  335. package/schedule/ScheduleForm.js +6 -7
  336. package/schedule/ScheduleForm.js.map +1 -1
  337. package/session/NewSessionViewer.d.ts +52 -2
  338. package/session/NewSessionViewer.d.ts.map +1 -1
  339. package/session/NewSessionViewer.js +21 -6
  340. package/session/NewSessionViewer.js.map +1 -1
  341. package/session/SessionViewer.d.ts +63 -2
  342. package/session/SessionViewer.d.ts.map +1 -1
  343. package/session/SessionViewer.js +43 -17
  344. package/session/SessionViewer.js.map +1 -1
  345. package/session/audience.d.ts +17 -0
  346. package/session/audience.d.ts.map +1 -1
  347. package/session/index.d.ts +2 -1
  348. package/session/index.d.ts.map +1 -1
  349. package/session/index.js.map +1 -1
  350. package/session/run-config.d.ts +50 -0
  351. package/session/run-config.d.ts.map +1 -0
  352. package/session/run-config.js +15 -0
  353. package/session/run-config.js.map +1 -0
  354. package/session/useNewSessionFlow.d.ts +11 -0
  355. package/session/useNewSessionFlow.d.ts.map +1 -1
  356. package/session/useNewSessionFlow.js +29 -2
  357. package/session/useNewSessionFlow.js.map +1 -1
  358. package/session/useSessionConversation.d.ts +11 -9
  359. package/session/useSessionConversation.d.ts.map +1 -1
  360. package/session/useSessionConversation.js +2 -0
  361. package/session/useSessionConversation.js.map +1 -1
  362. package/session/useSessionPageFlow.d.ts +18 -4
  363. package/session/useSessionPageFlow.d.ts.map +1 -1
  364. package/session/useSessionPageFlow.js +33 -6
  365. package/session/useSessionPageFlow.js.map +1 -1
  366. package/session/useSessionPanel.d.ts +37 -2
  367. package/session/useSessionPanel.d.ts.map +1 -1
  368. package/session/useSessionPanel.js +44 -10
  369. package/session/useSessionPanel.js.map +1 -1
  370. package/settings/ApiKeysSection.d.ts.map +1 -1
  371. package/settings/ApiKeysSection.js +3 -2
  372. package/settings/ApiKeysSection.js.map +1 -1
  373. package/settings/ChannelAppsSection.d.ts.map +1 -1
  374. package/settings/ChannelAppsSection.js +3 -2
  375. package/settings/ChannelAppsSection.js.map +1 -1
  376. package/settings/EnvironmentsSection.js +5 -3
  377. package/settings/EnvironmentsSection.js.map +1 -1
  378. package/settings/IdentityProvidersSection.d.ts.map +1 -1
  379. package/settings/IdentityProvidersSection.js +3 -2
  380. package/settings/IdentityProvidersSection.js.map +1 -1
  381. package/settings/InvitationsSection.d.ts.map +1 -1
  382. package/settings/InvitationsSection.js +3 -1
  383. package/settings/InvitationsSection.js.map +1 -1
  384. package/settings/MembersSection.d.ts.map +1 -1
  385. package/settings/MembersSection.js +3 -1
  386. package/settings/MembersSection.js.map +1 -1
  387. package/settings/OAuthAppsSection.d.ts.map +1 -1
  388. package/settings/OAuthAppsSection.js +3 -2
  389. package/settings/OAuthAppsSection.js.map +1 -1
  390. package/settings/OrgProfileSection.d.ts.map +1 -1
  391. package/settings/OrgProfileSection.js +3 -2
  392. package/settings/OrgProfileSection.js.map +1 -1
  393. package/settings/PlatformClientsSection.d.ts.map +1 -1
  394. package/settings/PlatformClientsSection.js +3 -2
  395. package/settings/PlatformClientsSection.js.map +1 -1
  396. package/settings/UsageSection.d.ts.map +1 -1
  397. package/settings/UsageSection.js +3 -1
  398. package/settings/UsageSection.js.map +1 -1
  399. package/sharing/ShareAgentDialog.d.ts.map +1 -1
  400. package/sharing/ShareAgentDialog.js +18 -7
  401. package/sharing/ShareAgentDialog.js.map +1 -1
  402. package/sidebar/chrome.d.ts +3 -4
  403. package/sidebar/chrome.d.ts.map +1 -1
  404. package/sidebar/chrome.js +5 -4
  405. package/sidebar/chrome.js.map +1 -1
  406. package/skill/SkillDiffDialog.js +1 -1
  407. package/skill/useSkillVersions.d.ts.map +1 -1
  408. package/skill/useSkillVersions.js +1 -9
  409. package/skill/useSkillVersions.js.map +1 -1
  410. package/src/access/ManageAccessDialog.tsx +10 -4
  411. package/src/activity/format-relative-time.ts +11 -9
  412. package/src/agent/steps/CapabilitiesStep.tsx +6 -3
  413. package/src/agent/steps/IdentityStep.tsx +19 -12
  414. package/src/agent-instance/CreateAgentInstanceDialog.tsx +17 -8
  415. package/src/api-key/ApiKeyCreatedAlert.tsx +10 -19
  416. package/src/api-key/ApiKeyListPanel.tsx +3 -39
  417. package/src/api-key/CreateApiKeyForm.tsx +12 -26
  418. package/src/approval-defaults-context.ts +56 -0
  419. package/src/attachment/__tests__/vision-preflight.test.ts +311 -0
  420. package/src/attachment/index.ts +12 -0
  421. package/src/attachment/vision-preflight.ts +236 -0
  422. package/src/billing/AutoRechargeCard.tsx +5 -4
  423. package/src/billing/BillingSection.tsx +4 -3
  424. package/src/channel/ChannelConversationsDialog.tsx +8 -4
  425. package/src/channel/ChannelCredentialsDialog.tsx +14 -4
  426. package/src/channel/ChannelTemplatesDialog.tsx +8 -4
  427. package/src/channel/ConnectSlackDialog.tsx +14 -4
  428. package/src/channel/ConnectWhatsAppDialog.tsx +14 -4
  429. package/src/channel/useChannelSessions.ts +3 -0
  430. package/src/channel-app/ChannelAppDetailPanel.tsx +15 -12
  431. package/src/channel-app/CreateChannelAppForm.tsx +17 -12
  432. package/src/channel-app/internal.tsx +5 -25
  433. package/src/composer/ComposerToolbar.tsx +1 -1
  434. package/src/composer/SessionComposer.tsx +160 -13
  435. package/src/composer/__tests__/SessionComposer-modelCoherence.test.tsx +220 -0
  436. package/src/composer/__tests__/SessionComposer-visionPreflight.test.tsx +222 -0
  437. package/src/composer/icons.tsx +0 -18
  438. package/src/conversation/ConversationComposer.tsx +1 -1
  439. package/src/conversation/ConversationListPane.tsx +4 -3
  440. package/src/cursor-accounts/MemberCoverageTable.tsx +3 -14
  441. package/src/cursor-accounts/__tests__/CursorAccountsConsole.test.tsx +2 -10
  442. package/src/dashboard/DashboardFailedRuns.tsx +2 -12
  443. package/src/environment/CreateEnvironmentForm.tsx +8 -27
  444. package/src/environment/EnvVarForm.tsx +2 -18
  445. package/src/environment/EnvironmentVariableEditor.tsx +5 -21
  446. package/src/execution/ArtifactApplyButton.tsx +2 -17
  447. package/src/execution/ExecutionErrorNotice.tsx +99 -0
  448. package/src/execution/FilePathLink.tsx +5 -9
  449. package/src/execution/FileReviewCard.tsx +1 -20
  450. package/src/execution/FollowUpInput.tsx +1 -16
  451. package/src/execution/LivenessStatusLine.tsx +59 -0
  452. package/src/execution/MessageEntry.tsx +136 -25
  453. package/src/execution/MessageThread.tsx +84 -83
  454. package/src/execution/SetupProgress.tsx +5 -1
  455. package/src/execution/SubAgentSection.tsx +9 -20
  456. package/src/execution/TerminalSession.tsx +97 -10
  457. package/src/execution/ToolCallDetail.tsx +19 -0
  458. package/src/execution/ToolCallItem.tsx +157 -37
  459. package/src/execution/ToolRunGroup.tsx +30 -32
  460. package/src/execution/WriteBackCard.tsx +5 -24
  461. package/src/execution/__tests__/MessageEntry-copy.test.tsx +125 -0
  462. package/src/execution/__tests__/MessageThread.test.tsx +97 -0
  463. package/src/execution/__tests__/TerminalSession.test.tsx +71 -1
  464. package/src/execution/__tests__/ToolCallDetail.test.tsx +33 -1
  465. package/src/execution/__tests__/ToolCallItem.test.tsx +299 -11
  466. package/src/execution/__tests__/ToolRunGroup.test.tsx +41 -9
  467. package/src/execution/__tests__/message-thread-slots.test.tsx +92 -0
  468. package/src/execution/__tests__/tool-presenter.test.tsx +41 -4
  469. package/src/execution/index.ts +8 -2
  470. package/src/execution/tool-categories.ts +72 -8
  471. package/src/execution/tool-presenter.ts +22 -1
  472. package/src/execution/useArtifactInspection.ts +4 -8
  473. package/src/execution/useCreateAgentExecution.ts +3 -2
  474. package/src/iam-policy/GrantAccessForm.tsx +2 -18
  475. package/src/iam-policy/OrgMembersPanel.tsx +3 -19
  476. package/src/iam-policy/RoleSelector.tsx +8 -1
  477. package/src/identity-provider/CreateIdentityProviderForm.tsx +13 -31
  478. package/src/identity-provider/IdentityProviderDetailPanel.tsx +24 -49
  479. package/src/identity-provider/IdentityProviderListPanel.tsx +2 -18
  480. package/src/identity-provider/IdentityProviderWizard.tsx +15 -32
  481. package/src/identity-provider/SsoLoginPrompt.tsx +6 -21
  482. package/src/index.ts +23 -1
  483. package/src/internal/DecisionButton.tsx +1 -20
  484. package/src/internal/SpinnerIcon.tsx +42 -0
  485. package/src/internal/__tests__/ThreadCardShell.test.tsx +43 -7
  486. package/src/internal/__tests__/useCopyFeedback.test.ts +92 -0
  487. package/src/internal/isUnimplemented.ts +26 -0
  488. package/src/internal/select-element-text.ts +17 -0
  489. package/src/internal/thread-card/ThreadCardShell.tsx +53 -21
  490. package/src/internal/thread-card/glyphs.tsx +24 -3
  491. package/src/internal/thread-card/index.ts +1 -0
  492. package/src/internal/useCopyFeedback.ts +61 -0
  493. package/src/invitation/InvitationCreatedAlert.tsx +10 -18
  494. package/src/invitation/InvitationManager.tsx +23 -34
  495. package/src/invitation/InvitationRedemption.tsx +2 -18
  496. package/src/library/useExportResource.ts +15 -29
  497. package/src/manifest/ApplyManifestDialog.tsx +1 -1
  498. package/src/manifest/EditResourceYamlDialog.tsx +1 -1
  499. package/src/mcp-server/DefinitionDriftNotice.tsx +120 -0
  500. package/src/mcp-server/McpServerConnectDialog.tsx +30 -12
  501. package/src/mcp-server/McpServerDetailView.tsx +58 -26
  502. package/src/mcp-server/OAuthAppForm.tsx +2 -18
  503. package/src/mcp-server/__tests__/DefinitionDriftNotice.test.tsx +57 -0
  504. package/src/mcp-server/__tests__/VendorApprovalBlocked.surfaces.test.tsx +103 -5
  505. package/src/mcp-server/__tests__/byoaEditionDegradation.test.tsx +323 -0
  506. package/src/mcp-server/__tests__/definitionDrift.test.ts +245 -0
  507. package/src/mcp-server/__tests__/mcpServerToInput.test.ts +201 -0
  508. package/src/mcp-server/__tests__/useMcpServerCredentials.test.tsx +306 -0
  509. package/src/mcp-server/__tests__/useMcpServerDefinitionDrift.test.tsx +173 -0
  510. package/src/mcp-server/internal/definitionDrift.ts +158 -0
  511. package/src/mcp-server/internal/mcpServerToInput.ts +3 -0
  512. package/src/mcp-server/steps/EnvironmentAuthStep.tsx +19 -19
  513. package/src/mcp-server/steps/IdentityTransportStep.tsx +24 -23
  514. package/src/mcp-server/useMcpServerConnect.ts +1 -1
  515. package/src/mcp-server/useMcpServerCredentials.ts +87 -19
  516. package/src/mcp-server/useMcpServerDefinitionDrift.ts +95 -0
  517. package/src/mcp-server/useOrgOAuthApp.ts +54 -8
  518. package/src/models/ModelRegistryContext.ts +7 -1
  519. package/src/models/ModelSelector.tsx +37 -0
  520. package/src/models/__tests__/ModelSelector-visionIndicator.test.tsx +129 -0
  521. package/src/models/__tests__/resolveDefaultModel.test.ts +115 -0
  522. package/src/models/__tests__/useModelRegistry.test.tsx +99 -4
  523. package/src/models/index.ts +2 -2
  524. package/src/models/registry.ts +196 -29
  525. package/src/models/useModelRegistry.ts +10 -2
  526. package/src/oauth-app/CreateOAuthAppForm.tsx +16 -31
  527. package/src/oauth-app/OAuthAppDetailPanel.tsx +16 -31
  528. package/src/organization/CreateOrganizationForm.tsx +10 -29
  529. package/src/organization/OrgProfilePanel.tsx +13 -44
  530. package/src/platform-client/CreatePlatformClientForm.tsx +9 -29
  531. package/src/platform-client/PlatformClientDetailPanel.tsx +10 -30
  532. package/src/platform-client/PlatformClientListPanel.tsx +2 -18
  533. package/src/platform-client/PlatformClientSecretAlert.tsx +26 -55
  534. package/src/provider.tsx +76 -33
  535. package/src/resource-creation/WizardNav.tsx +2 -18
  536. package/src/resource-detail/ConfirmDialog.tsx +1 -1
  537. package/src/resource-detail/useCopyResource.ts +17 -23
  538. package/src/schedule/ScheduleDetailView.tsx +2 -18
  539. package/src/schedule/ScheduleForm.tsx +19 -34
  540. package/src/session/NewSessionViewer.tsx +85 -7
  541. package/src/session/SessionViewer.tsx +120 -17
  542. package/src/session/__tests__/audienceWiring.test.tsx +76 -0
  543. package/src/session/__tests__/panelNegotiation.test.tsx +302 -0
  544. package/src/session/__tests__/useNewSessionFlow.test.tsx +134 -5
  545. package/src/session/__tests__/useSessionPageFlow.autoApprove.test.tsx +74 -0
  546. package/src/session/__tests__/useSessionPageFlow.runConfig.test.tsx +157 -0
  547. package/src/session/__tests__/useSessionPanel.test.ts +114 -0
  548. package/src/session/audience.ts +18 -0
  549. package/src/session/index.ts +2 -1
  550. package/src/session/run-config.ts +59 -0
  551. package/src/session/useNewSessionFlow.ts +39 -2
  552. package/src/session/useSessionConversation.ts +14 -10
  553. package/src/session/useSessionPageFlow.ts +51 -10
  554. package/src/session/useSessionPanel.ts +91 -10
  555. package/src/settings/ApiKeysSection.tsx +4 -3
  556. package/src/settings/ChannelAppsSection.tsx +4 -3
  557. package/src/settings/EnvironmentsSection.tsx +8 -5
  558. package/src/settings/IdentityProvidersSection.tsx +4 -3
  559. package/src/settings/InvitationsSection.tsx +4 -2
  560. package/src/settings/MembersSection.tsx +4 -2
  561. package/src/settings/OAuthAppsSection.tsx +4 -3
  562. package/src/settings/OrgProfileSection.tsx +4 -3
  563. package/src/settings/PlatformClientsSection.tsx +4 -3
  564. package/src/settings/UsageSection.tsx +4 -2
  565. package/src/sharing/ShareAgentDialog.tsx +28 -10
  566. package/src/sidebar/__tests__/WorkspaceSidebar.test.tsx +4 -1
  567. package/src/sidebar/chrome.tsx +6 -6
  568. package/src/skill/SkillDiffDialog.tsx +1 -1
  569. package/src/skill/useSkillVersions.ts +1 -11
  570. package/src/styles.css +43 -0
  571. package/src/version-history/VersionTimelineEntry.tsx +1 -21
  572. package/src/workflow/FailedRunsWidget.tsx +2 -9
  573. package/src/workflow/PendingApprovalsWidget.tsx +2 -9
  574. package/src/workflow/ViewYamlDialog.tsx +7 -22
  575. package/src/workflow/WorkflowArchitectDialog.tsx +8 -27
  576. package/src/workflow/WorkflowArtifactDocument.tsx +5 -9
  577. package/src/workflow/WorkflowCanvasEditor.tsx +39 -7
  578. package/src/workflow/WorkflowCanvasInner.tsx +14 -1
  579. package/src/workflow/WorkflowDiffGraph.tsx +7 -1
  580. package/src/workflow/WorkflowExecutionGraph.tsx +26 -1
  581. package/src/workflow/WorkflowExecutionViewer.tsx +115 -24
  582. package/src/workflow/WorkflowExplainDialog.tsx +8 -24
  583. package/src/workflow/WorkflowNode.tsx +5 -2
  584. package/src/workflow/WorkflowOverviewGraph.tsx +9 -1
  585. package/src/workflow/WorkflowRefinePanel.tsx +2 -18
  586. package/src/workflow/WorkflowRepairCard.tsx +2 -18
  587. package/src/workflow/WorkflowRunDialog.tsx +31 -24
  588. package/src/workflow/WorkflowTaskApprovalSummary.tsx +2 -17
  589. package/src/workflow/WorkflowVersionBadge.tsx +4 -13
  590. package/src/workflow/WorkflowVersionTimeline.tsx +1 -25
  591. package/src/workflow/__tests__/WorkflowExecutionViewer.reconciliation.test.tsx +48 -1
  592. package/src/workflow/__tests__/WorkflowNode.test.tsx +93 -0
  593. package/src/workflow/__tests__/WorkflowRunDialog.test.tsx +127 -0
  594. package/src/workflow/__tests__/graph-history.test.ts +103 -0
  595. package/src/workflow/__tests__/overview-graph.test.ts +17 -0
  596. package/src/workflow/__tests__/panelNegotiation.test.tsx +230 -0
  597. package/src/workflow/__tests__/useCanvasKeyboardShortcuts.undo.test.ts +115 -0
  598. package/src/workflow/__tests__/useWorkflowCanvas.dirty.test.tsx +178 -0
  599. package/src/workflow/__tests__/useWorkflowCanvas.drag.test.tsx +224 -0
  600. package/src/workflow/__tests__/useWorkflowCanvas.undo.test.tsx +133 -0
  601. package/src/workflow/__tests__/useWorkflowExecutionPanel.test.ts +100 -0
  602. package/src/workflow/execution-comparison/ExecutionComparisonPicker.tsx +7 -11
  603. package/src/workflow/execution-history/ExecutionHistoryTable.tsx +1 -25
  604. package/src/workflow/index.ts +1 -0
  605. package/src/workflow/instance/CreateWorkflowInstanceDialog.tsx +17 -8
  606. package/src/workflow/instance/WorkflowInstanceDetailPanel.tsx +2 -1
  607. package/src/workflow/instance/useDeleteWorkflowInstance.ts +9 -4
  608. package/src/workflow/layout/registry-dimensions.ts +2 -5
  609. package/src/workflow/node-shell/NodeShell.tsx +4 -0
  610. package/src/workflow/picker/BranchAddPopover.tsx +4 -3
  611. package/src/workflow/task-type-visual-registry.ts +5 -3
  612. package/src/workflow/templates/WorkflowTemplatePreview.tsx +1 -1
  613. package/src/workflow/useApprovalBoundary.ts +1 -1
  614. package/src/workflow/useCanvasKeyboardShortcuts.ts +33 -3
  615. package/src/workflow/useGraphHistory.ts +22 -41
  616. package/src/workflow/useWorkflowCanvas.ts +126 -21
  617. package/src/workflow/useWorkflowExecutionPanel.ts +95 -13
  618. package/src/workflow/useWorkflowSave.ts +2 -15
  619. package/src/workflow/workflow-graph-conversions.ts +25 -3
  620. package/styles.css +1 -1
  621. package/version-history/VersionTimelineEntry.d.ts.map +1 -1
  622. package/version-history/VersionTimelineEntry.js +1 -23
  623. package/version-history/VersionTimelineEntry.js.map +1 -1
  624. package/workflow/CanvasTransitionEdge.d.ts +1 -1
  625. package/workflow/FailedRunsWidget.d.ts.map +1 -1
  626. package/workflow/FailedRunsWidget.js +2 -11
  627. package/workflow/FailedRunsWidget.js.map +1 -1
  628. package/workflow/PendingApprovalsWidget.d.ts.map +1 -1
  629. package/workflow/PendingApprovalsWidget.js +2 -11
  630. package/workflow/PendingApprovalsWidget.js.map +1 -1
  631. package/workflow/ViewYamlDialog.d.ts.map +1 -1
  632. package/workflow/ViewYamlDialog.js +7 -23
  633. package/workflow/ViewYamlDialog.js.map +1 -1
  634. package/workflow/WorkflowArchitectDialog.d.ts.map +1 -1
  635. package/workflow/WorkflowArchitectDialog.js +7 -11
  636. package/workflow/WorkflowArchitectDialog.js.map +1 -1
  637. package/workflow/WorkflowArtifactDocument.d.ts.map +1 -1
  638. package/workflow/WorkflowArtifactDocument.js +5 -8
  639. package/workflow/WorkflowArtifactDocument.js.map +1 -1
  640. package/workflow/WorkflowCanvasEditor.d.ts.map +1 -1
  641. package/workflow/WorkflowCanvasEditor.js +31 -6
  642. package/workflow/WorkflowCanvasEditor.js.map +1 -1
  643. package/workflow/WorkflowCanvasInner.d.ts +4 -2
  644. package/workflow/WorkflowCanvasInner.d.ts.map +1 -1
  645. package/workflow/WorkflowCanvasInner.js +7 -3
  646. package/workflow/WorkflowCanvasInner.js.map +1 -1
  647. package/workflow/WorkflowDiffGraph.js +6 -2
  648. package/workflow/WorkflowDiffGraph.js.map +1 -1
  649. package/workflow/WorkflowExecutionGraph.d.ts.map +1 -1
  650. package/workflow/WorkflowExecutionGraph.js +27 -1
  651. package/workflow/WorkflowExecutionGraph.js.map +1 -1
  652. package/workflow/WorkflowExecutionViewer.d.ts +51 -0
  653. package/workflow/WorkflowExecutionViewer.d.ts.map +1 -1
  654. package/workflow/WorkflowExecutionViewer.js +49 -18
  655. package/workflow/WorkflowExecutionViewer.js.map +1 -1
  656. package/workflow/WorkflowExplainDialog.d.ts.map +1 -1
  657. package/workflow/WorkflowExplainDialog.js +6 -8
  658. package/workflow/WorkflowExplainDialog.js.map +1 -1
  659. package/workflow/WorkflowNode.d.ts.map +1 -1
  660. package/workflow/WorkflowNode.js +2 -2
  661. package/workflow/WorkflowNode.js.map +1 -1
  662. package/workflow/WorkflowOverviewGraph.js +8 -2
  663. package/workflow/WorkflowOverviewGraph.js.map +1 -1
  664. package/workflow/WorkflowRefinePanel.d.ts.map +1 -1
  665. package/workflow/WorkflowRefinePanel.js +2 -4
  666. package/workflow/WorkflowRefinePanel.js.map +1 -1
  667. package/workflow/WorkflowRepairCard.d.ts.map +1 -1
  668. package/workflow/WorkflowRepairCard.js +2 -4
  669. package/workflow/WorkflowRepairCard.js.map +1 -1
  670. package/workflow/WorkflowRunDialog.d.ts +11 -1
  671. package/workflow/WorkflowRunDialog.d.ts.map +1 -1
  672. package/workflow/WorkflowRunDialog.js +18 -9
  673. package/workflow/WorkflowRunDialog.js.map +1 -1
  674. package/workflow/WorkflowTaskApprovalSummary.d.ts.map +1 -1
  675. package/workflow/WorkflowTaskApprovalSummary.js +2 -4
  676. package/workflow/WorkflowTaskApprovalSummary.js.map +1 -1
  677. package/workflow/WorkflowVersionBadge.d.ts.map +1 -1
  678. package/workflow/WorkflowVersionBadge.js +4 -13
  679. package/workflow/WorkflowVersionBadge.js.map +1 -1
  680. package/workflow/WorkflowVersionTimeline.d.ts.map +1 -1
  681. package/workflow/WorkflowVersionTimeline.js +1 -26
  682. package/workflow/WorkflowVersionTimeline.js.map +1 -1
  683. package/workflow/execution-comparison/ExecutionComparisonPicker.d.ts.map +1 -1
  684. package/workflow/execution-comparison/ExecutionComparisonPicker.js +7 -15
  685. package/workflow/execution-comparison/ExecutionComparisonPicker.js.map +1 -1
  686. package/workflow/execution-history/ExecutionHistoryTable.d.ts.map +1 -1
  687. package/workflow/execution-history/ExecutionHistoryTable.js +1 -24
  688. package/workflow/execution-history/ExecutionHistoryTable.js.map +1 -1
  689. package/workflow/index.d.ts +1 -1
  690. package/workflow/index.d.ts.map +1 -1
  691. package/workflow/index.js.map +1 -1
  692. package/workflow/instance/CreateWorkflowInstanceDialog.d.ts.map +1 -1
  693. package/workflow/instance/CreateWorkflowInstanceDialog.js +10 -2
  694. package/workflow/instance/CreateWorkflowInstanceDialog.js.map +1 -1
  695. package/workflow/instance/WorkflowInstanceDetailPanel.d.ts.map +1 -1
  696. package/workflow/instance/WorkflowInstanceDetailPanel.js +1 -1
  697. package/workflow/instance/WorkflowInstanceDetailPanel.js.map +1 -1
  698. package/workflow/instance/useDeleteWorkflowInstance.d.ts +9 -4
  699. package/workflow/instance/useDeleteWorkflowInstance.d.ts.map +1 -1
  700. package/workflow/instance/useDeleteWorkflowInstance.js +4 -2
  701. package/workflow/instance/useDeleteWorkflowInstance.js.map +1 -1
  702. package/workflow/layout/registry-dimensions.d.ts.map +1 -1
  703. package/workflow/layout/registry-dimensions.js +2 -5
  704. package/workflow/layout/registry-dimensions.js.map +1 -1
  705. package/workflow/node-shell/NodeShell.js +1 -1
  706. package/workflow/node-shell/NodeShell.js.map +1 -1
  707. package/workflow/picker/BranchAddPopover.d.ts.map +1 -1
  708. package/workflow/picker/BranchAddPopover.js +3 -2
  709. package/workflow/picker/BranchAddPopover.js.map +1 -1
  710. package/workflow/task-type-visual-registry.d.ts.map +1 -1
  711. package/workflow/task-type-visual-registry.js +5 -3
  712. package/workflow/task-type-visual-registry.js.map +1 -1
  713. package/workflow/templates/WorkflowTemplatePreview.js +1 -1
  714. package/workflow/useApprovalBoundary.d.ts +1 -1
  715. package/workflow/useApprovalBoundary.js +1 -1
  716. package/workflow/useCanvasKeyboardShortcuts.d.ts +15 -4
  717. package/workflow/useCanvasKeyboardShortcuts.d.ts.map +1 -1
  718. package/workflow/useCanvasKeyboardShortcuts.js +25 -4
  719. package/workflow/useCanvasKeyboardShortcuts.js.map +1 -1
  720. package/workflow/useGraphHistory.d.ts +16 -9
  721. package/workflow/useGraphHistory.d.ts.map +1 -1
  722. package/workflow/useGraphHistory.js +19 -33
  723. package/workflow/useGraphHistory.js.map +1 -1
  724. package/workflow/useWorkflowCanvas.d.ts +6 -4
  725. package/workflow/useWorkflowCanvas.d.ts.map +1 -1
  726. package/workflow/useWorkflowCanvas.js +115 -23
  727. package/workflow/useWorkflowCanvas.js.map +1 -1
  728. package/workflow/useWorkflowExecutionPanel.d.ts +38 -2
  729. package/workflow/useWorkflowExecutionPanel.d.ts.map +1 -1
  730. package/workflow/useWorkflowExecutionPanel.js +46 -13
  731. package/workflow/useWorkflowExecutionPanel.js.map +1 -1
  732. package/workflow/useWorkflowSave.d.ts.map +1 -1
  733. package/workflow/useWorkflowSave.js +2 -15
  734. package/workflow/useWorkflowSave.js.map +1 -1
  735. package/workflow/workflow-graph-conversions.d.ts +19 -1
  736. package/workflow/workflow-graph-conversions.d.ts.map +1 -1
  737. package/workflow/workflow-graph-conversions.js +17 -3
  738. package/workflow/workflow-graph-conversions.js.map +1 -1
@@ -11,6 +11,7 @@ import { diffEnv } from "../environment/diffEnv.js";
11
11
  import { SYSTEM_ENV_VAR_KEYS } from "../environment/systemEnvVars.js";
12
12
  import type { EnvVarFormVariable } from "../environment/EnvVarForm.js";
13
13
  import { useOAuthGrantStatus } from "./useOAuthGrantStatus.js";
14
+ import { useOrgOAuthApp } from "./useOrgOAuthApp.js";
14
15
 
15
16
  /**
16
17
  * Credential acquisition mode for an MCP server.
@@ -93,9 +94,15 @@ export interface UseMcpServerCredentialsReturn {
93
94
  * Servers whose env vars are all optional are always ready.
94
95
  */
95
96
  readonly isReady: boolean;
96
- /** `true` while the personal environment or grant status is being fetched. */
97
+ /**
98
+ * `true` while the personal environment, grant status, or org-override
99
+ * lookup is being fetched.
100
+ */
97
101
  readonly isLoading: boolean;
98
- /** Error from the personal environment or grant status fetch, or `null`. */
102
+ /**
103
+ * Error from the personal environment, grant status, or org-override
104
+ * fetch, or `null`.
105
+ */
99
106
  readonly error: Error | null;
100
107
  /**
101
108
  * Save the provided credentials to the user's personal environment.
@@ -131,22 +138,35 @@ export interface UseMcpServerCredentialsReturn {
131
138
  */
132
139
  readonly isVendorApprovalBlocked: boolean;
133
140
  /**
134
- * Where the effective OAuth app was resolved from for the caller's org.
141
+ * Where the effective OAuth app is resolved from for the caller's org
142
+ * — the same source the connect flow will use.
135
143
  *
136
- * Enriched at query time by the backend no additional RPC needed.
137
- * `UNSPECIFIED` when `authMode` is `"manual"` or enrichment has not
138
- * been performed yet.
144
+ * Resolved client-side from the `getOrgOAuthApp` RPC keyed on this
145
+ * hook's `org` parameter. It cannot come from the fetched McpServer:
146
+ * the caller's active org is client-side context the read RPCs never
147
+ * carry, so `status.oauth_status` fields 3-4 are never populated by
148
+ * any backend (see the OAuthStatus proto).
149
+ *
150
+ * `UNSPECIFIED` when `authMode` is `"manual"` or while the override
151
+ * lookup has not yet resolved.
139
152
  */
140
153
  readonly effectiveOAuthSource: OAuthAppSource;
141
154
  /**
142
- * `true` when an org-level BYOA override is active for this server.
143
- * Derived from `effectiveOAuthSource === OAUTH_APP_SOURCE_ORG_OVERRIDE`.
155
+ * `true` when an org-level BYOA override is active for this server
156
+ * and org. Derived from the `getOrgOAuthApp` lookup.
144
157
  */
145
158
  readonly isOrgOAuthApp: boolean;
146
159
  /**
147
160
  * `true` when the BYOA option is relevant for this server: the server
148
- * uses vendor OAuth (`authMode === "oauth"` with an `oauth_app_ref`)
149
- * and no org override is currently active.
161
+ * uses vendor OAuth (`authMode === "oauth"` with an `oauth_app_ref`),
162
+ * no org override is currently active, AND the backend supports the
163
+ * org-override surface at all.
164
+ *
165
+ * The last condition is an edition capability, confirmed by probing
166
+ * `getOrgOAuthApp` (see {@link useOrgOAuthApp}): the surface is
167
+ * hosted-only, so on OSS deployments — where the submit could only
168
+ * answer UNIMPLEMENTED — this stays `false` and no BYOA affordance
169
+ * renders (stigmer/stigmer#558).
150
170
  *
151
171
  * When `true`, the UI should offer "Use your own OAuth app" as either
152
172
  * a primary action (when vendor approval is blocked) or a secondary
@@ -201,6 +221,15 @@ export interface UseMcpServerCredentialsReturn {
201
221
  * form. Additional non-OAuth vars still appear in `missingVariables`
202
222
  * (mixed mode).
203
223
  *
224
+ * **Org-override-aware**: for vendor-OAuth servers with an
225
+ * `oauth_app_ref`, the hook also composes {@link useOrgOAuthApp} to
226
+ * resolve which OAuth app the connect flow will use for `org`
227
+ * (`effectiveOAuthSource` / `isOrgOAuthApp` / `canBringOwnApp`).
228
+ * The `org` parameter must therefore be the caller's ACTIVE org — the
229
+ * org credentials are stored in and the org whose BYOA override
230
+ * applies — not necessarily the org that owns the MCP server (they
231
+ * differ when browsing another org's public server).
232
+ *
204
233
  * Unlike {@link useMcpServerSetup} which manages multi-server setup
205
234
  * for session creation, this hook is scoped to a single server and
206
235
  * always persists to the personal environment (no one-time option).
@@ -281,14 +310,51 @@ export function useMcpServerCredentials(
281
310
  oauthStatus?.vendorApprovalStatus === VendorApprovalStatus.REJECTED);
282
311
  const vendorApprovalDocsUrl = oauthStatus?.vendorApprovalDocsUrl || null;
283
312
 
284
- const effectiveOAuthSource =
285
- oauthStatus?.effectiveOauthSource ??
286
- OAuthAppSource.OAUTH_APP_SOURCE_UNSPECIFIED;
287
- const isOrgOAuthApp =
288
- effectiveOAuthSource === OAuthAppSource.OAUTH_APP_SOURCE_ORG_OVERRIDE;
289
313
  const hasOAuthAppRef = Boolean(auth?.oauthAppRef?.slug);
314
+
315
+ // Org-override lookup, two duties in one fetch (shared cross-mount via
316
+ // the hook's fetch cache):
317
+ // 1. Capability probe (`isSupported`) — the org-override surface is
318
+ // hosted-only, so BYOA affordances must hide on OSS (#558).
319
+ // 2. The override signal (`hasOverride`) — which OAuthApp the connect
320
+ // flow will actually use for this org. Resolved client-side because
321
+ // the caller's active org is client-side context the read RPCs never
322
+ // carry (get has no org; getByReference's org is the server's OWNING
323
+ // org, which differs from the caller's org when browsing another
324
+ // org's public server), so the fetched McpServer cannot answer this
325
+ // (stigmer-cloud#401).
326
+ // Scoped to vendor-OAuth servers with a platform app ref — the only
327
+ // shape an override can exist for — so manual/DCR servers pay no RPC.
328
+ const orgOverride = useOrgOAuthApp(
329
+ authMode === "oauth" && hasOAuthAppRef
330
+ ? (mcpServer?.metadata?.id ?? null)
331
+ : null,
332
+ org,
333
+ );
334
+
335
+ const isOrgOAuthApp = orgOverride.hasOverride;
336
+ // While the lookup is in flight, failed, or unposable (an app ref exists
337
+ // but no org to resolve an override for), the override state is unknown —
338
+ // report UNSPECIFIED rather than guessing PLATFORM, matching the
339
+ // documented "not yet resolved" contract. UNSUPPORTED is not unknown:
340
+ // on OSS the platform-ref app is truthfully the effective source.
341
+ const overrideUnknown =
342
+ orgOverride.isLoading ||
343
+ orgOverride.error !== null ||
344
+ (hasOAuthAppRef && !org);
345
+ const effectiveOAuthSource =
346
+ authMode !== "oauth" || overrideUnknown
347
+ ? OAuthAppSource.OAUTH_APP_SOURCE_UNSPECIFIED
348
+ : isOrgOAuthApp
349
+ ? OAuthAppSource.OAUTH_APP_SOURCE_ORG_OVERRIDE
350
+ : hasOAuthAppRef
351
+ ? OAuthAppSource.OAUTH_APP_SOURCE_PLATFORM
352
+ : OAuthAppSource.OAUTH_APP_SOURCE_NONE;
290
353
  const canBringOwnApp =
291
- authMode === "oauth" && hasOAuthAppRef && !isOrgOAuthApp;
354
+ authMode === "oauth" &&
355
+ hasOAuthAppRef &&
356
+ !isOrgOAuthApp &&
357
+ orgOverride.isSupported;
292
358
 
293
359
  const grantStatus = useOAuthGrantStatus(
294
360
  authMode === "oauth" ? (mcpServer?.metadata?.id ?? null) : null,
@@ -339,7 +405,8 @@ export function useMcpServerCredentials(
339
405
  const refetch = useCallback(() => {
340
406
  personalEnv.refetch();
341
407
  grantStatus.refetch();
342
- }, [personalEnv, grantStatus]);
408
+ orgOverride.refetch();
409
+ }, [personalEnv, grantStatus, orgOverride]);
343
410
 
344
411
  return {
345
412
  authMode,
@@ -358,8 +425,9 @@ export function useMcpServerCredentials(
358
425
  manualEntrySupported,
359
426
  missingVariables,
360
427
  isReady,
361
- isLoading: personalEnv.isLoading || grantStatus.isLoading,
362
- error: personalEnv.error ?? grantStatus.error,
428
+ isLoading:
429
+ personalEnv.isLoading || grantStatus.isLoading || orgOverride.isLoading,
430
+ error: personalEnv.error ?? grantStatus.error ?? orgOverride.error,
363
431
  saveCredentials,
364
432
  isSaving: personalEnv.isMutating,
365
433
  refetch,
@@ -0,0 +1,95 @@
1
+ "use client";
2
+
3
+ import type { McpServer } from "@stigmer/protos/ai/stigmer/agentic/mcpserver/v1/api_pb";
4
+ import { useStigmer } from "../hooks.js";
5
+ import { useFetch } from "../internal/useFetch.js";
6
+ import {
7
+ computeDefinitionDrift,
8
+ type DriftFieldId,
9
+ } from "./internal/definitionDrift.js";
10
+
11
+ /** A detected divergence from the marketplace definition. */
12
+ export interface McpServerDefinitionDrift {
13
+ /** The marketplace definition the comparison ran against. */
14
+ readonly template: McpServer;
15
+ /** Connection-defining field groups that differ. Never empty. */
16
+ readonly changedFields: readonly DriftFieldId[];
17
+ }
18
+
19
+ /** Return value of {@link useMcpServerDefinitionDrift}. */
20
+ export interface UseMcpServerDefinitionDriftReturn {
21
+ /**
22
+ * The detected drift, or `null` — which covers all of: still checking,
23
+ * no marketplace counterpart, ambiguous counterpart, configurations
24
+ * match, or the check failed. Consumers need no other state: this is an
25
+ * advisory affordance, not page data.
26
+ */
27
+ readonly drift: McpServerDefinitionDrift | null;
28
+ }
29
+
30
+ /**
31
+ * Detects when an org-owned MCP server's connection-defining
32
+ * configuration has drifted from the marketplace definition it mirrors
33
+ * (stigmer/stigmer#228: a template fix — e.g. monday.com's OAuth header —
34
+ * never reached servers copied before the fix, stranding them on a
35
+ * configuration that can never connect).
36
+ *
37
+ * **How the marketplace counterpart is found.** Connected copies carry no
38
+ * reference back to their template, so the hook uses the platform's own
39
+ * client-side definition of "marketplace": the search RPC's
40
+ * `crossOrgPublic` scope (what the library's "All" tab shows). A public
41
+ * row with the exact same slug from a different org is treated as the
42
+ * template. Zero or multiple candidates means there is nothing
43
+ * trustworthy to compare against — the hook stays quiet.
44
+ *
45
+ * **Fail-quiet by design.** Drift detection is advisory. No network
46
+ * error, missing template, or ambiguity may ever degrade the detail page,
47
+ * so every failure path resolves to `null` rather than an error state.
48
+ *
49
+ * Pass `null` to skip (stable no-op) — callers gate on editability, since
50
+ * the paired refresh action writes to the resource and the notice is
51
+ * meaningless to viewers who cannot act on it.
52
+ */
53
+ export function useMcpServerDefinitionDrift(
54
+ mcpServer: McpServer | null,
55
+ ): UseMcpServerDefinitionDriftReturn {
56
+ const stigmer = useStigmer();
57
+
58
+ const org = mcpServer?.metadata?.org ?? null;
59
+ const slug = mcpServer?.metadata?.slug ?? null;
60
+
61
+ const { data: drift } = useFetch<McpServerDefinitionDrift | null>(
62
+ mcpServer && org && slug
63
+ ? async () => {
64
+ try {
65
+ const result = await stigmer.mcpServer.list({
66
+ org,
67
+ query: slug,
68
+ crossOrgPublic: true,
69
+ });
70
+ const candidateOrgs = [
71
+ ...new Set(
72
+ result.entries
73
+ .filter((e) => e.slug === slug && e.org && e.org !== org)
74
+ .map((e) => e.org),
75
+ ),
76
+ ];
77
+ if (candidateOrgs.length !== 1) return null;
78
+
79
+ const template = await stigmer.mcpServer.getByReference({
80
+ org: candidateOrgs[0],
81
+ slug,
82
+ });
83
+ const changedFields = computeDefinitionDrift(mcpServer, template);
84
+ return changedFields ? { template, changedFields } : null;
85
+ } catch {
86
+ return null;
87
+ }
88
+ }
89
+ : null,
90
+ [mcpServer, org, slug, stigmer],
91
+ null,
92
+ );
93
+
94
+ return { drift };
95
+ }
@@ -8,11 +8,26 @@ import {
8
8
  DeleteOrgOAuthAppInputSchema,
9
9
  } from "@stigmer/protos/ai/stigmer/agentic/mcpserver/v1/io_pb";
10
10
  import { useStigmer } from "../hooks.js";
11
+ import { isUnimplemented } from "../internal/isUnimplemented.js";
11
12
  import { toError } from "../internal/toError.js";
12
13
  import { useFetch } from "../internal/useFetch.js";
13
14
 
14
15
  /** Return value of {@link useOrgOAuthApp}. */
15
16
  export interface UseOrgOAuthAppReturn {
17
+ /**
18
+ * Whether the backend supports the org-OAuth-app override surface at all.
19
+ *
20
+ * The surface is hosted-only by design: the OSS server answers
21
+ * UNIMPLEMENTED for all three org-override RPCs because its flat
22
+ * OAuthApp store has no override binding (stigmer/stigmer#558 — the
23
+ * self-hosted equivalent is applying an OAuthApp resource and
24
+ * referencing it from `spec.auth.oauth_app_ref`). The fetch doubles
25
+ * as the capability probe: `isSupported` is `false` until the first
26
+ * successful response confirms the surface exists, so BYOA
27
+ * affordances gated on it never flash on deployments where the
28
+ * submit could only fail.
29
+ */
30
+ readonly isSupported: boolean;
16
31
  /** Whether an org-level BYOA override exists for this resource + org. */
17
32
  readonly hasOverride: boolean;
18
33
  /** System-generated ID of the override's OAuthApp, or `null` when absent. */
@@ -72,12 +87,25 @@ export interface UseOrgOAuthAppReturn {
72
87
  }
73
88
 
74
89
  interface OrgOAuthAppData {
90
+ isSupported: boolean;
75
91
  hasOverride: boolean;
76
92
  oauthAppId: string | null;
77
93
  clientId: string | null;
78
94
  }
79
95
 
80
96
  const IDLE_DATA: OrgOAuthAppData = {
97
+ isSupported: false,
98
+ hasOverride: false,
99
+ oauthAppId: null,
100
+ clientId: null,
101
+ };
102
+
103
+ /**
104
+ * The UNIMPLEMENTED answer resolved into data rather than an error:
105
+ * the backend is healthy, it just doesn't have this edition capability.
106
+ */
107
+ const UNSUPPORTED_DATA: OrgOAuthAppData = {
108
+ isSupported: false,
81
109
  hasOverride: false,
82
110
  oauthAppId: null,
83
111
  clientId: null,
@@ -110,6 +138,14 @@ const IDLE: UseOrgOAuthAppReturn = {
110
138
  * mutations bound to the hook's resource + org context, eliminating
111
139
  * parameter repetition at call sites.
112
140
  *
141
+ * **Edition awareness**: the fetch doubles as a capability probe. The
142
+ * org-override surface is hosted-only; the OSS server answers
143
+ * UNIMPLEMENTED for it, which this hook resolves into
144
+ * `isSupported: false` with no error. Gate every BYOA affordance on
145
+ * `isSupported` (as {@link useMcpServerCredentials} does for
146
+ * `canBringOwnApp`) — the mutations can only fail where the probe
147
+ * reports the surface absent.
148
+ *
113
149
  * Pass `null` for either parameter to skip fetching (stable no-op).
114
150
  *
115
151
  * @example
@@ -136,18 +172,28 @@ export function useOrgOAuthApp(
136
172
  const { data, isLoading, isRefetching, error, refetch } = useFetch<OrgOAuthAppData>(
137
173
  resourceId && org
138
174
  ? async () => {
139
- const result = await stigmer.mcpServer.getOrgOAuthApp(
140
- create(GetOrgOAuthAppInputSchema, { resourceId, org }),
141
- );
142
- return {
143
- hasOverride: result.hasOverride,
144
- oauthAppId: result.oauthAppId || null,
145
- clientId: result.clientId || null,
146
- };
175
+ try {
176
+ const result = await stigmer.mcpServer.getOrgOAuthApp(
177
+ create(GetOrgOAuthAppInputSchema, { resourceId, org }),
178
+ );
179
+ return {
180
+ isSupported: true,
181
+ hasOverride: result.hasOverride,
182
+ oauthAppId: result.oauthAppId || null,
183
+ clientId: result.clientId || null,
184
+ };
185
+ } catch (err) {
186
+ if (isUnimplemented(err)) return UNSUPPORTED_DATA;
187
+ throw err;
188
+ }
147
189
  }
148
190
  : null,
149
191
  [resourceId, org, stigmer],
150
192
  IDLE_DATA,
193
+ // Cross-mount cache: the credentials hook composes this fetch as its
194
+ // capability probe, so a detail page mounts two instances — the cache
195
+ // lets the second render from the first's result.
196
+ { cacheKey: `org-oauth-app:${org}:${resourceId}` },
151
197
  );
152
198
 
153
199
  const [isSetting, setIsSetting] = useState(false);
@@ -1,11 +1,17 @@
1
1
  "use client";
2
2
 
3
3
  import { createContext, useContext } from "react";
4
- import type { ModelInfo } from "./registry.js";
4
+ import type { ModelInfo, VisionLimits } from "./registry.js";
5
5
 
6
6
  /** Internal state held by the model registry context provider. */
7
7
  export interface ModelRegistryState {
8
8
  readonly models: readonly ModelInfo[];
9
+ /**
10
+ * Document-level vision byte budget (stigmer/stigmer#365).
11
+ * `undefined` while loading or when the served document predates the
12
+ * `limits` block — consumers stay silent rather than assume a budget.
13
+ */
14
+ readonly visionLimits?: VisionLimits;
9
15
  readonly isLoading: boolean;
10
16
  readonly error: Error | null;
11
17
  /** Retry fetching the model registry. No-op while a fetch is in flight. */
@@ -629,6 +629,17 @@ function ModelRow({
629
629
  <div className="stg:flex stg:w-full stg:items-center stg:gap-2">
630
630
  <span className="stg:flex-1 stg:truncate stg:text-left stg:font-medium">{model.displayName}</span>
631
631
 
632
+ {/* Explicit vision:false only (stigmer/stigmer#386) — an unassessed
633
+ model (absent capabilities block) shows nothing, per the
634
+ registry's tri-state convention. Visible text, not a tooltip:
635
+ keyboard and touch users must see it before picking the model. */}
636
+ {model.visionCapability === false && (
637
+ <span className="stg:flex stg:shrink-0 stg:items-center stg:gap-0.5 stg:text-[0.6rem] stg:text-muted-foreground">
638
+ <NoImageInputIcon />
639
+ No image input
640
+ </span>
641
+ )}
642
+
632
643
  <span className="stg:shrink-0 stg:text-[0.6rem] stg:text-muted-foreground">
633
644
  {showSpeedBadge
634
645
  ? `${SPEED_TIER_LABEL[model.speedTier]} ${COST_TIER_LABEL[model.costTier]}`
@@ -683,6 +694,32 @@ function CheckIcon({ className }: { className?: string }) {
683
694
  );
684
695
  }
685
696
 
697
+ /**
698
+ * "Image with a slash" glyph for models explicitly assessed as unable to
699
+ * see images. Decorative (`aria-hidden`) — the wrapping span carries the
700
+ * accessible text.
701
+ */
702
+ function NoImageInputIcon() {
703
+ return (
704
+ <svg
705
+ width="11"
706
+ height="11"
707
+ viewBox="0 0 12 12"
708
+ fill="none"
709
+ stroke="currentColor"
710
+ strokeWidth="1.2"
711
+ strokeLinecap="round"
712
+ strokeLinejoin="round"
713
+ aria-hidden
714
+ >
715
+ <rect x="1.5" y="2" width="9" height="8" rx="1.2" />
716
+ <path d="M1.5 8L4.2 5.6L6.4 7.6" />
717
+ <circle cx="7.6" cy="4.6" r="0.8" fill="currentColor" stroke="none" />
718
+ <path d="M1 1L11 11" />
719
+ </svg>
720
+ );
721
+ }
722
+
686
723
  function BoltIcon() {
687
724
  return (
688
725
  <svg
@@ -0,0 +1,129 @@
1
+ import { describe, it, expect, vi, afterEach, beforeAll } from "vitest";
2
+ import { render, screen, cleanup, fireEvent } from "@testing-library/react";
3
+ import { ModelSelector } from "../ModelSelector";
4
+ import { ModelRegistryContext } from "../ModelRegistryContext";
5
+ import type { ModelInfo } from "../registry";
6
+
7
+ // Shim ResizeObserver for Base UI's positioner (the
8
+ // scheduleCreation.test.tsx pattern).
9
+ beforeAll(() => {
10
+ if (!("ResizeObserver" in globalThis)) {
11
+ (globalThis as unknown as { ResizeObserver: unknown }).ResizeObserver =
12
+ class {
13
+ observe() {}
14
+ unobserve() {}
15
+ disconnect() {}
16
+ };
17
+ }
18
+ });
19
+
20
+ /**
21
+ * "No image input" indicator on model rows (stigmer/stigmer#386).
22
+ *
23
+ * Tri-state contract: the indicator renders ONLY for models the registry
24
+ * explicitly assessed as blind (`visionCapability === false`). A sighted
25
+ * model shows nothing, and — the load-bearing case — an UNASSESSED model
26
+ * (absent capabilities block) also shows nothing: most registry entries
27
+ * were never capability-assessed, and flagging them all as blind would
28
+ * be wrong for nearly every one.
29
+ */
30
+
31
+ const BLIND: ModelInfo = {
32
+ modelId: "kimi-k3",
33
+ provider: "moonshot",
34
+ displayName: "Kimi K3",
35
+ shortDescription: "Text-only economy model",
36
+ speedTier: "fast",
37
+ costTier: "economy",
38
+ harness: "cursor",
39
+ featured: true,
40
+ serviceTiers: [],
41
+ visionCapability: false,
42
+ };
43
+
44
+ const SIGHTED: ModelInfo = {
45
+ modelId: "composer-2.5",
46
+ provider: "cursor",
47
+ displayName: "Composer 2.5",
48
+ shortDescription: "Fast agentic model",
49
+ speedTier: "fastest",
50
+ costTier: "economy",
51
+ harness: "cursor",
52
+ featured: true,
53
+ serviceTiers: [],
54
+ visionCapability: true,
55
+ };
56
+
57
+ const UNASSESSED: ModelInfo = {
58
+ modelId: "mystery-model",
59
+ provider: "cursor",
60
+ displayName: "Mystery Model",
61
+ shortDescription: "Never capability-assessed",
62
+ speedTier: "fast",
63
+ costTier: "standard",
64
+ harness: "cursor",
65
+ featured: true,
66
+ serviceTiers: [],
67
+ };
68
+
69
+ function renderSelector() {
70
+ return render(
71
+ <ModelRegistryContext.Provider
72
+ value={{
73
+ models: [BLIND, SIGHTED, UNASSESSED],
74
+ isLoading: false,
75
+ error: null,
76
+ refetch: vi.fn(),
77
+ }}
78
+ >
79
+ <ModelSelector
80
+ value="composer-2.5"
81
+ onValueChange={vi.fn()}
82
+ harness="cursor"
83
+ />
84
+ </ModelRegistryContext.Provider>,
85
+ );
86
+ }
87
+
88
+ async function openPopover(triggerLabel: string) {
89
+ fireEvent.click(screen.getByRole("button", { name: new RegExp(triggerLabel) }));
90
+ await screen.findByPlaceholderText("Search models…");
91
+ }
92
+
93
+ /** A model row inside the popup list (never matches the trigger). */
94
+ function modelOption(displayName: string): HTMLElement {
95
+ const option = screen
96
+ .getAllByText(displayName)
97
+ .map((el) => el.closest<HTMLElement>("[data-model-option]"))
98
+ .find((el) => el != null);
99
+ if (!option) throw new Error(`No popup option for "${displayName}"`);
100
+ return option;
101
+ }
102
+
103
+ afterEach(cleanup);
104
+
105
+ describe("ModelSelector — no-image-input indicator", () => {
106
+ it("marks an explicitly blind model with visible badge text", async () => {
107
+ renderSelector();
108
+ await openPopover("Composer 2.5");
109
+
110
+ // Visible text, not a tooltip — keyboard and touch users must see it
111
+ // before picking the model (stigmer/no-native-title).
112
+ const row = modelOption("Kimi K3");
113
+ expect(row.textContent).toContain("No image input");
114
+ });
115
+
116
+ it("shows nothing on an explicitly sighted model", async () => {
117
+ renderSelector();
118
+ await openPopover("Composer 2.5");
119
+
120
+ expect(modelOption("Composer 2.5").textContent).not.toContain("No image input");
121
+ });
122
+
123
+ it("shows nothing on an unassessed model (tri-state: absent is not false)", async () => {
124
+ renderSelector();
125
+ await openPopover("Composer 2.5");
126
+
127
+ expect(modelOption("Mystery Model").textContent).not.toContain("No image input");
128
+ });
129
+ });
@@ -0,0 +1,115 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import {
3
+ DEFAULT_CURSOR_MODEL_ID,
4
+ DEFAULT_MODEL_ID,
5
+ resolveDefaultModelId,
6
+ type ModelInfo,
7
+ } from "../registry";
8
+
9
+ /**
10
+ * The harness-default arm is a contract, not a suggestion
11
+ * (stigmer/stigmer#663): this resolution feeds the composer's pill, and
12
+ * the submission adopts what the pill displays — so the default must be
13
+ * what the platform actually runs for an unpinned execution:
14
+ *
15
+ * - cursor → the registry's Auto entry (the runner coerces an empty
16
+ * model_name to "default")
17
+ * - native → the runner's getDefaultModel() rule (featured + standard
18
+ * cost, then any standard cost)
19
+ */
20
+
21
+ function model(overrides: Partial<ModelInfo> & { modelId: string }): ModelInfo {
22
+ return {
23
+ provider: "anthropic",
24
+ displayName: overrides.modelId,
25
+ shortDescription: "",
26
+ speedTier: "fast",
27
+ costTier: "standard",
28
+ harness: "native",
29
+ featured: false,
30
+ serviceTiers: [],
31
+ ...overrides,
32
+ };
33
+ }
34
+
35
+ describe("resolveDefaultModelId — cursor harness", () => {
36
+ it("prefers the Auto entry over featured models listed before it (the production order that caused #663)", () => {
37
+ // Mirrors the live registry: featured premium models precede Auto.
38
+ const models = [
39
+ model({ modelId: "claude-opus-4-8", harness: "cursor", featured: true, costTier: "premium" }),
40
+ model({ modelId: DEFAULT_CURSOR_MODEL_ID, harness: "cursor", featured: true }),
41
+ ];
42
+ expect(resolveDefaultModelId("cursor", models)).toEqual({
43
+ modelId: DEFAULT_CURSOR_MODEL_ID,
44
+ source: "harness_default",
45
+ });
46
+ });
47
+
48
+ it("falls back to the first featured cursor model when the registry has no Auto entry", () => {
49
+ const models = [
50
+ model({ modelId: "composer-2.5", harness: "cursor", featured: true }),
51
+ ];
52
+ expect(resolveDefaultModelId("cursor", models).modelId).toBe("composer-2.5");
53
+ });
54
+
55
+ it("falls back to the hardcoded cursor id on an empty registry", () => {
56
+ expect(resolveDefaultModelId("cursor", [])).toEqual({
57
+ modelId: DEFAULT_CURSOR_MODEL_ID,
58
+ source: "platform_fallback",
59
+ });
60
+ });
61
+
62
+ it("lets an explicit user preference win over Auto", () => {
63
+ const models = [
64
+ model({ modelId: DEFAULT_CURSOR_MODEL_ID, harness: "cursor", featured: true }),
65
+ model({ modelId: "composer-2.5", harness: "cursor", featured: true }),
66
+ ];
67
+ expect(
68
+ resolveDefaultModelId("cursor", models, { userPreference: "composer-2.5" }),
69
+ ).toEqual({ modelId: "composer-2.5", source: "user_preference" });
70
+ });
71
+ });
72
+
73
+ describe("resolveDefaultModelId — native harness", () => {
74
+ it("skips a featured premium model for the featured standard-cost one (the runner's own rule)", () => {
75
+ const models = [
76
+ model({ modelId: "claude-opus-4.6", featured: true, costTier: "premium" }),
77
+ model({ modelId: "claude-sonnet-4.6", featured: true, costTier: "standard" }),
78
+ ];
79
+ expect(resolveDefaultModelId("native", models)).toEqual({
80
+ modelId: "claude-sonnet-4.6",
81
+ source: "harness_default",
82
+ });
83
+ });
84
+
85
+ it("falls back to any standard-cost model when no featured one is standard", () => {
86
+ const models = [
87
+ model({ modelId: "claude-opus-4.6", featured: true, costTier: "premium" }),
88
+ model({ modelId: "gpt-4o", featured: false, costTier: "standard" }),
89
+ ];
90
+ expect(resolveDefaultModelId("native", models).modelId).toBe("gpt-4o");
91
+ });
92
+
93
+ it("falls back to the first featured model when the registry lists no standard-cost model at all", () => {
94
+ const models = [
95
+ model({ modelId: "claude-opus-4.6", featured: true, costTier: "premium" }),
96
+ model({ modelId: "ollama-local", featured: false, costTier: "economy" }),
97
+ ];
98
+ expect(resolveDefaultModelId("native", models).modelId).toBe("claude-opus-4.6");
99
+ });
100
+
101
+ it("falls back to the hardcoded native id on an empty registry", () => {
102
+ expect(resolveDefaultModelId("native", [])).toEqual({
103
+ modelId: DEFAULT_MODEL_ID,
104
+ source: "platform_fallback",
105
+ });
106
+ });
107
+
108
+ it("never resolves across harnesses (a cursor Auto entry is invisible to native)", () => {
109
+ const models = [
110
+ model({ modelId: DEFAULT_CURSOR_MODEL_ID, harness: "cursor", featured: true }),
111
+ model({ modelId: "claude-sonnet-4.6", featured: true, costTier: "standard" }),
112
+ ];
113
+ expect(resolveDefaultModelId("native", models).modelId).toBe("claude-sonnet-4.6");
114
+ });
115
+ });