@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
@@ -0,0 +1,220 @@
1
+ import { describe, it, expect, vi, afterEach, beforeAll } from "vitest";
2
+ import { render, screen, cleanup, fireEvent, waitFor } from "@testing-library/react";
3
+ import { type ReactNode } from "react";
4
+ import type { Stigmer } from "@stigmer/sdk";
5
+ import { StigmerContext } from "../../context";
6
+ import { ModelRegistryContext } from "../../models/ModelRegistryContext";
7
+ import type { ModelInfo } from "../../models/registry";
8
+ import { SessionComposer } from "../SessionComposer";
9
+
10
+ // Shim ResizeObserver for Base UI's positioner (the
11
+ // scheduleCreation.test.tsx pattern).
12
+ beforeAll(() => {
13
+ if (!("ResizeObserver" in globalThis)) {
14
+ (globalThis as unknown as { ResizeObserver: unknown }).ResizeObserver =
15
+ class {
16
+ observe() {}
17
+ unobserve() {}
18
+ disconnect() {}
19
+ };
20
+ }
21
+ });
22
+
23
+ /**
24
+ * Effective run selection coherence (stigmer/stigmer#663): the submission
25
+ * must carry exactly the model the pill displays, and "fast" must only
26
+ * ride the wire while the effective model prices it. The original defect:
27
+ * an empty composer displayed the registry fallback with a toggleable
28
+ * FAST badge, then sent `service_tier: fast` with NO model — refused
29
+ * fail-closed by the server ("Couldn't send." + a Retry that can never
30
+ * succeed).
31
+ */
32
+
33
+ const AUTO: ModelInfo = {
34
+ modelId: "default",
35
+ provider: "cursor",
36
+ displayName: "Auto",
37
+ shortDescription: "Automatic model selection",
38
+ speedTier: "fast",
39
+ costTier: "standard",
40
+ harness: "cursor",
41
+ featured: true,
42
+ serviceTiers: [],
43
+ };
44
+
45
+ const FAST_CAPABLE: ModelInfo = {
46
+ modelId: "composer-2.5",
47
+ provider: "cursor",
48
+ displayName: "Composer 2.5",
49
+ shortDescription: "Fast agentic model",
50
+ speedTier: "fastest",
51
+ costTier: "economy",
52
+ harness: "cursor",
53
+ featured: true,
54
+ serviceTiers: ["fast"],
55
+ };
56
+
57
+ const NO_FAST: ModelInfo = {
58
+ modelId: "gpt-5.3-codex",
59
+ provider: "openai",
60
+ displayName: "GPT-5.3 Codex",
61
+ shortDescription: "No fast variant",
62
+ speedTier: "fast",
63
+ costTier: "standard",
64
+ harness: "cursor",
65
+ featured: true,
66
+ serviceTiers: [],
67
+ };
68
+
69
+ function createMinimalStigmerMock(): Stigmer {
70
+ return {
71
+ agentExecution: { uploadAttachment: vi.fn() },
72
+ environment: { getPersonal: vi.fn().mockResolvedValue(null) },
73
+ baseUrl: "http://localhost:8080",
74
+ getAuthCredential: vi.fn().mockResolvedValue("test-token"),
75
+ config: {
76
+ baseUrl: "http://localhost:8080",
77
+ getAccessToken: vi.fn().mockResolvedValue(""),
78
+ },
79
+ } as unknown as Stigmer;
80
+ }
81
+
82
+ function createWrapper(
83
+ client: Stigmer,
84
+ registry: { models: readonly ModelInfo[]; isLoading?: boolean },
85
+ ) {
86
+ return function Wrapper({ children }: { children: ReactNode }) {
87
+ return (
88
+ <StigmerContext.Provider value={client}>
89
+ <ModelRegistryContext.Provider
90
+ value={{
91
+ models: [...registry.models],
92
+ isLoading: registry.isLoading ?? false,
93
+ error: null,
94
+ refetch: vi.fn(),
95
+ }}
96
+ >
97
+ {children}
98
+ </ModelRegistryContext.Provider>
99
+ </StigmerContext.Provider>
100
+ );
101
+ };
102
+ }
103
+
104
+ function submitMessage(message: string) {
105
+ const textarea = screen.getByRole("textbox");
106
+ fireEvent.change(textarea, { target: { value: message } });
107
+ fireEvent.keyDown(textarea, { key: "Enter", shiftKey: false });
108
+ }
109
+
110
+ /** Open the picker and flip the fast-tier switch (Base UI portals mount
111
+ * asynchronously in jsdom — the switch is awaited). */
112
+ async function toggleFastTier(triggerName: RegExp) {
113
+ fireEvent.click(screen.getByRole("button", { name: triggerName }));
114
+ const toggle = await screen.findByRole("switch", { name: "Fast tier" });
115
+ fireEvent.click(toggle);
116
+ fireEvent.keyDown(document.activeElement ?? document.body, { key: "Escape" });
117
+ }
118
+
119
+ afterEach(cleanup);
120
+
121
+ describe("SessionComposer — effective run selection (#663)", () => {
122
+ it("adopts the displayed harness default when no model is selected", async () => {
123
+ const onSubmit = vi.fn();
124
+ render(
125
+ <SessionComposer onSubmit={onSubmit} harness="cursor" />,
126
+ { wrapper: createWrapper(createMinimalStigmerMock(), { models: [FAST_CAPABLE, AUTO, NO_FAST] }) },
127
+ );
128
+
129
+ // The pill displays the harness default (Auto for cursor)…
130
+ expect(screen.getByRole("button", { name: /Auto/ })).toBeTruthy();
131
+
132
+ submitMessage("hello");
133
+
134
+ // …and the submission carries exactly that model, never undefined.
135
+ await waitFor(() => expect(onSubmit).toHaveBeenCalledOnce());
136
+ expect(onSubmit.mock.calls[0][1]).toBe("default");
137
+ });
138
+
139
+ it("renders no fast-tier switch for a fresh cursor composer (Auto has no tier dimension)", async () => {
140
+ render(
141
+ <SessionComposer onSubmit={vi.fn()} harness="cursor" />,
142
+ { wrapper: createWrapper(createMinimalStigmerMock(), { models: [FAST_CAPABLE, AUTO, NO_FAST] }) },
143
+ );
144
+
145
+ fireEvent.click(screen.getByRole("button", { name: /Auto/ }));
146
+ // Popover content mounts async; settle on the options area appearing.
147
+ await screen.findByRole("dialog");
148
+ expect(screen.queryByRole("switch", { name: "Fast tier" })).toBeNull();
149
+ });
150
+
151
+ it("drops an armed fast tier when a prop-driven model change lands on a model without a fast variant", async () => {
152
+ const onSubmit = vi.fn();
153
+ const wrapper = createWrapper(createMinimalStigmerMock(), {
154
+ models: [FAST_CAPABLE, AUTO, NO_FAST],
155
+ });
156
+ const { rerender } = render(
157
+ <SessionComposer onSubmit={onSubmit} harness="cursor" defaultModelId="composer-2.5" />,
158
+ { wrapper },
159
+ );
160
+
161
+ // Arm fast on the fast-capable model (user-driven), then let the host
162
+ // re-sync `defaultModelId` onto a model with no fast variant — the
163
+ // path that bypasses ModelSelector's user-pick reset.
164
+ await toggleFastTier(/Composer 2\.5/);
165
+ rerender(
166
+ <SessionComposer onSubmit={onSubmit} harness="cursor" defaultModelId="gpt-5.3-codex" />,
167
+ );
168
+
169
+ submitMessage("resynced");
170
+
171
+ await waitFor(() => expect(onSubmit).toHaveBeenCalledOnce());
172
+ expect(onSubmit.mock.calls[0][1]).toBe("gpt-5.3-codex");
173
+ // The armed tier is unsendable, not just unstyled (#357 fail-closed rule).
174
+ expect(onSubmit.mock.calls[0][2]?.serviceTier).toBeUndefined();
175
+ });
176
+
177
+ it("never adopts a default while the model selector is hidden (the hider owns the model)", async () => {
178
+ const onSubmit = vi.fn();
179
+ render(
180
+ <SessionComposer onSubmit={onSubmit} harness="cursor" showModelSelector={false} />,
181
+ { wrapper: createWrapper(createMinimalStigmerMock(), { models: [FAST_CAPABLE, AUTO, NO_FAST] }) },
182
+ );
183
+
184
+ submitMessage("guest-shaped send");
185
+
186
+ // No pill, no promise: guests' server-side profile (and #664 pins)
187
+ // own the model — the composer must not invent one.
188
+ await waitFor(() => expect(onSubmit).toHaveBeenCalledOnce());
189
+ expect(onSubmit.mock.calls[0][1]).toBeUndefined();
190
+ });
191
+
192
+ it("adopts the displayed default over a model id the registry no longer lists", async () => {
193
+ const onSubmit = vi.fn();
194
+ render(
195
+ <SessionComposer onSubmit={onSubmit} harness="cursor" defaultModelId="retired-model" />,
196
+ { wrapper: createWrapper(createMinimalStigmerMock(), { models: [FAST_CAPABLE, AUTO, NO_FAST] }) },
197
+ );
198
+
199
+ submitMessage("stale id");
200
+
201
+ // The pill cannot display "retired-model" (unknown → falls back to the
202
+ // harness default), so the payload must not carry it either.
203
+ await waitFor(() => expect(onSubmit).toHaveBeenCalledOnce());
204
+ expect(onSubmit.mock.calls[0][1]).toBe("default");
205
+ });
206
+
207
+ it("passes the raw model id through while the registry is still loading", async () => {
208
+ const onSubmit = vi.fn();
209
+ render(
210
+ <SessionComposer onSubmit={onSubmit} harness="cursor" defaultModelId="composer-2.5" />,
211
+ { wrapper: createWrapper(createMinimalStigmerMock(), { models: [], isLoading: true }) },
212
+ );
213
+
214
+ submitMessage("early send");
215
+
216
+ // Nothing can be classified mid-load: adopt nothing, rewrite nothing.
217
+ await waitFor(() => expect(onSubmit).toHaveBeenCalledOnce());
218
+ expect(onSubmit.mock.calls[0][1]).toBe("composer-2.5");
219
+ });
220
+ });
@@ -0,0 +1,222 @@
1
+ import { describe, it, expect, vi, afterEach } from "vitest";
2
+ import { render, screen, cleanup, fireEvent, act } from "@testing-library/react";
3
+ import type { ReactNode } from "react";
4
+ import type { Stigmer } from "@stigmer/sdk";
5
+ import { StigmerContext } from "../../context";
6
+ import { ModelRegistryContext } from "../../models/ModelRegistryContext";
7
+ import type { ModelRegistryState } from "../../models/ModelRegistryContext";
8
+ import { parseRegistryDocument } from "../../models/registry";
9
+ import type { VisionLimits } from "../../models/registry";
10
+ import { SessionComposer } from "../SessionComposer";
11
+
12
+ // ---------------------------------------------------------------------------
13
+ // Helpers
14
+ // ---------------------------------------------------------------------------
15
+
16
+ /** The production budget the registry advertises (3 MiB / 4 MiB / 10). */
17
+ const LIMITS: VisionLimits = {
18
+ maxImageBytes: 3 * 1024 * 1024,
19
+ maxTotalBytes: 4 * 1024 * 1024,
20
+ maxImages: 10,
21
+ };
22
+
23
+ /**
24
+ * Registry fixture routed through the REAL document parser so this test
25
+ * also breaks if the parse contract drifts. kimi-k3 mirrors the live
26
+ * registry's explicitly-blind cursor model.
27
+ */
28
+ const REGISTRY_DOCUMENT = parseRegistryDocument({
29
+ limits: { vision: { ...LIMITS } },
30
+ models: [
31
+ {
32
+ id: "claude-sonnet-4.6",
33
+ displayName: "Claude Sonnet 4.6",
34
+ provider: "anthropic",
35
+ harness: "native",
36
+ costTier: "standard",
37
+ featured: true,
38
+ capabilities: { toolUse: true, vision: true, streaming: true, thinking: true, adaptiveThinking: false },
39
+ pricing: { inputPricePerMillion: 3, outputPricePerMillion: 15, cacheWritePricePerMillion: 3.75, cacheReadPricePerMillion: 0.3 },
40
+ },
41
+ {
42
+ id: "kimi-k3",
43
+ displayName: "Kimi K3",
44
+ provider: "moonshot",
45
+ harness: "cursor",
46
+ costTier: "economy",
47
+ featured: false,
48
+ capabilities: { toolUse: true, vision: false, streaming: true, thinking: false, adaptiveThinking: false },
49
+ pricing: { inputPricePerMillion: 1, outputPricePerMillion: 3, cacheWritePricePerMillion: 1, cacheReadPricePerMillion: 0.1 },
50
+ },
51
+ ],
52
+ });
53
+
54
+ function createUploadMockClient(): Stigmer {
55
+ return {
56
+ agentExecution: {
57
+ uploadAttachment: vi.fn().mockResolvedValue({ storageKey: "attachments/test/file" }),
58
+ },
59
+ environment: { getPersonal: vi.fn().mockResolvedValue(null) },
60
+ baseUrl: "http://localhost:8080",
61
+ getAuthCredential: vi.fn().mockResolvedValue("test-token"),
62
+ config: {
63
+ baseUrl: "http://localhost:8080",
64
+ getAccessToken: vi.fn().mockResolvedValue(""),
65
+ },
66
+ } as unknown as Stigmer;
67
+ }
68
+
69
+ function createWrapper(registry?: Partial<ModelRegistryState>) {
70
+ const client = createUploadMockClient();
71
+ const state: ModelRegistryState = {
72
+ models: REGISTRY_DOCUMENT.models,
73
+ visionLimits: REGISTRY_DOCUMENT.visionLimits,
74
+ isLoading: false,
75
+ error: null,
76
+ refetch: vi.fn(),
77
+ ...registry,
78
+ };
79
+ return function Wrapper({ children }: { children: ReactNode }) {
80
+ return (
81
+ <StigmerContext.Provider value={client}>
82
+ <ModelRegistryContext.Provider value={state}>
83
+ {children}
84
+ </ModelRegistryContext.Provider>
85
+ </StigmerContext.Provider>
86
+ );
87
+ };
88
+ }
89
+
90
+ function pngFile(name: string, sizeBytes: number): File {
91
+ return new File([new Uint8Array(sizeBytes)], name, { type: "image/png" });
92
+ }
93
+
94
+ function pasteFiles(textarea: Element, files: File[]) {
95
+ fireEvent.paste(textarea, {
96
+ clipboardData: {
97
+ files: files as unknown as FileList,
98
+ getData: () => "",
99
+ types: ["Files"],
100
+ },
101
+ });
102
+ }
103
+
104
+ const OVERSIZED = Math.round(3.6 * 1024 * 1024);
105
+ const SMALL = 64 * 1024;
106
+
107
+ afterEach(cleanup);
108
+
109
+ // ---------------------------------------------------------------------------
110
+ // Tests
111
+ // ---------------------------------------------------------------------------
112
+
113
+ describe("SessionComposer — vision preflight notice (#365, #386)", () => {
114
+ it("warns at paste time when an image exceeds the advertised per-image cap", async () => {
115
+ render(<SessionComposer onSubmit={vi.fn()} />, { wrapper: createWrapper() });
116
+ const textarea = screen.getByRole("textbox");
117
+
118
+ await act(async () => {
119
+ pasteFiles(textarea, [pngFile("screenshot.png", OVERSIZED)]);
120
+ });
121
+
122
+ const notice = screen.getByText(
123
+ /screenshot\.png \(3\.6 MB\) exceeds the 3\.0 MB inline-image limit/,
124
+ );
125
+ expect(notice).toBeTruthy();
126
+ expect(notice.closest('[role="status"]')).toBeTruthy();
127
+ });
128
+
129
+ it("stays silent for images within the budget", async () => {
130
+ render(<SessionComposer onSubmit={vi.fn()} />, { wrapper: createWrapper() });
131
+ const textarea = screen.getByRole("textbox");
132
+
133
+ await act(async () => {
134
+ pasteFiles(textarea, [pngFile("small.png", SMALL)]);
135
+ });
136
+
137
+ expect(screen.queryByText(/inline-image/)).toBeNull();
138
+ });
139
+
140
+ it("stays silent when the server advertises no limits (older server, tri-state)", async () => {
141
+ render(<SessionComposer onSubmit={vi.fn()} />, {
142
+ wrapper: createWrapper({ visionLimits: undefined }),
143
+ });
144
+ const textarea = screen.getByRole("textbox");
145
+
146
+ await act(async () => {
147
+ pasteFiles(textarea, [pngFile("huge.png", OVERSIZED)]);
148
+ });
149
+
150
+ expect(screen.queryByText(/inline-image/)).toBeNull();
151
+ });
152
+
153
+ it("clears the warning when the offending attachment is removed", async () => {
154
+ render(<SessionComposer onSubmit={vi.fn()} />, { wrapper: createWrapper() });
155
+ const textarea = screen.getByRole("textbox");
156
+
157
+ await act(async () => {
158
+ pasteFiles(textarea, [pngFile("screenshot.png", OVERSIZED)]);
159
+ });
160
+ expect(screen.getByText(/exceeds the 3\.0 MB inline-image limit/)).toBeTruthy();
161
+
162
+ const removeButton = screen.getByRole("button", { name: /remove screenshot\.png/i });
163
+ await act(async () => {
164
+ fireEvent.click(removeButton);
165
+ });
166
+
167
+ expect(screen.queryByText(/inline-image/)).toBeNull();
168
+ });
169
+
170
+ it("leads with the model when the selected model is explicitly blind", async () => {
171
+ render(
172
+ <SessionComposer onSubmit={vi.fn()} defaultModelId="cursor/kimi-k3" />,
173
+ { wrapper: createWrapper() },
174
+ );
175
+ const textarea = screen.getByRole("textbox");
176
+
177
+ await act(async () => {
178
+ pasteFiles(textarea, [pngFile("tiny.png", SMALL)]);
179
+ });
180
+
181
+ expect(
182
+ screen.getByText(
183
+ "Kimi K3 can't view images — attached images will reach the agent as files only.",
184
+ ),
185
+ ).toBeTruthy();
186
+ });
187
+
188
+ it("never warns about non-image attachments on a blind model", async () => {
189
+ render(
190
+ <SessionComposer onSubmit={vi.fn()} defaultModelId="cursor/kimi-k3" />,
191
+ { wrapper: createWrapper() },
192
+ );
193
+ const textarea = screen.getByRole("textbox");
194
+
195
+ await act(async () => {
196
+ pasteFiles(textarea, [
197
+ new File([new Uint8Array(SMALL)], "notes.pdf", { type: "application/pdf" }),
198
+ ]);
199
+ });
200
+
201
+ expect(screen.queryByText(/can't view images/)).toBeNull();
202
+ });
203
+
204
+ it("does not gate the send — the warned message still submits with the attachment", async () => {
205
+ const onSubmit = vi.fn();
206
+ render(<SessionComposer onSubmit={onSubmit} />, { wrapper: createWrapper() });
207
+ const textarea = screen.getByRole("textbox");
208
+
209
+ await act(async () => {
210
+ pasteFiles(textarea, [pngFile("screenshot.png", OVERSIZED)]);
211
+ });
212
+ expect(screen.getByText(/exceeds the 3\.0 MB inline-image limit/)).toBeTruthy();
213
+
214
+ await act(async () => {
215
+ fireEvent.change(textarea, { target: { value: "look at this anyway" } });
216
+ fireEvent.keyDown(textarea, { key: "Enter", shiftKey: false });
217
+ });
218
+
219
+ expect(onSubmit).toHaveBeenCalledTimes(1);
220
+ expect(onSubmit.mock.calls[0][2]?.attachments).toHaveLength(1);
221
+ });
222
+ });
@@ -54,24 +54,6 @@ export function ArrowUpIcon() {
54
54
  );
55
55
  }
56
56
 
57
- export function SpinnerIcon() {
58
- return (
59
- <svg
60
- width="16"
61
- height="16"
62
- viewBox="0 0 16 16"
63
- fill="none"
64
- stroke="currentColor"
65
- strokeWidth="2"
66
- strokeLinecap="round"
67
- className="stg:animate-spin"
68
- aria-hidden="true"
69
- >
70
- <path d="M8 2a6 6 0 1 0 6 6" />
71
- </svg>
72
- );
73
- }
74
-
75
57
  /**
76
58
  * Filled rounded square — the universal "stop" glyph. Sized to ~62% of the
77
59
  * viewBox so it reads as a confident, deliberate mark (not a stray dot) when
@@ -7,7 +7,7 @@ import { getUserMessage } from "@stigmer/sdk";
7
7
  import { ChannelSendOutcome } from "@stigmer/protos/ai/stigmer/agentic/agentchannel/v1/message_io_pb";
8
8
  import type { SendChannelMessageOutput } from "@stigmer/protos/ai/stigmer/agentic/agentchannel/v1/message_io_pb";
9
9
  import { Button } from "../button/Button.js";
10
- import { SpinnerIcon } from "../composer/icons.js";
10
+ import { SpinnerIcon } from "../internal/SpinnerIcon.js";
11
11
  import { useComposer } from "../composer/useComposer.js";
12
12
 
13
13
  /** Props for {@link ConversationComposer}. */
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
 
3
- import { memo, useCallback, useRef } from "react";
3
+ import { memo, useCallback, useId, useRef } from "react";
4
4
  import { timestampDate } from "@bufbuild/protobuf/wkt";
5
5
  import { MessageSquare, TriangleAlert, User } from "lucide-react";
6
6
  import { cn } from "@stigmer/theme";
@@ -110,6 +110,7 @@ export function ConversationListPane({
110
110
  now,
111
111
  className,
112
112
  }: ConversationListPaneProps) {
113
+ const channelFilterId = useId();
113
114
  const providerById = new Map(
114
115
  channels.map((channel) => [
115
116
  channel.metadata?.id ?? "",
@@ -129,11 +130,11 @@ export function ConversationListPane({
129
130
  )}
130
131
  {channels.length > 1 && (
131
132
  <>
132
- <label className="stg:sr-only" htmlFor="stgm-conversation-channel-filter">
133
+ <label className="stg:sr-only" htmlFor={channelFilterId}>
133
134
  Filter by channel
134
135
  </label>
135
136
  <select
136
- id="stgm-conversation-channel-filter"
137
+ id={channelFilterId}
137
138
  value={channelFilter}
138
139
  onChange={(e) => onChannelFilterChange(e.target.value)}
139
140
  className={cn(
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
 
3
- import { useCallback, useState } from "react";
3
+ import { useCopyFeedback } from "../internal/useCopyFeedback.js";
4
4
  import { cn } from "@stigmer/theme";
5
5
  import {
6
6
  CursorMemberKeyState,
@@ -420,21 +420,10 @@ function KeyStatusBadge({
420
420
  * would join the operator's own Cursor account to the team.
421
421
  */
422
422
  function CopyInviteButton({ inviteLink }: { readonly inviteLink: string }) {
423
- const [copied, setCopied] = useState(false);
424
-
425
- const handleCopy = useCallback(async () => {
426
- try {
427
- await navigator.clipboard.writeText(inviteLink);
428
- setCopied(true);
429
- setTimeout(() => setCopied(false), 2000);
430
- } catch {
431
- // Clipboard unavailable (permissions, non-secure context) — the
432
- // section description still points at the Cursor dashboard.
433
- }
434
- }, [inviteLink]);
423
+ const { copy, copied } = useCopyFeedback();
435
424
 
436
425
  return (
437
- <Button size="sm" variant="outline" onClick={() => void handleCopy()}>
426
+ <Button size="sm" variant="outline" onClick={() => void copy(inviteLink)}>
438
427
  {copied ? "Copied" : "Copy invite"}
439
428
  </Button>
440
429
  );
@@ -137,16 +137,8 @@ function scenarView() {
137
137
  }),
138
138
  }),
139
139
  ],
140
- // The server populates both the deprecated flat list and the
141
- // spend-joined views; the console reads only the views.
142
- membersWithoutKeys: [
143
- create(CursorTeamMemberSchema, {
144
- userId: "u2",
145
- email: "uncovered@scenar.ai",
146
- name: "Uncovered U",
147
- role: "member",
148
- }),
149
- ],
140
+ // The console reads the spend-joined views (field 4's flat list is
141
+ // gone from the proto stigmer#313).
150
142
  membersWithoutKeysViews: [
151
143
  create(CursorTeamMemberViewSchema, {
152
144
  member: create(CursorTeamMemberSchema, {
@@ -3,6 +3,7 @@
3
3
  import { memo } from "react";
4
4
  import { cn } from "@stigmer/theme";
5
5
  import type { DashboardFailedRun } from "./types.js";
6
+ import { formatRelativeTime } from "../activity/format-relative-time.js";
6
7
 
7
8
  export interface DashboardFailedRunsProps {
8
9
  readonly failedRuns: readonly DashboardFailedRun[];
@@ -12,17 +13,6 @@ export interface DashboardFailedRunsProps {
12
13
  readonly className?: string;
13
14
  }
14
15
 
15
- function timeAgo(date: Date): string {
16
- const seconds = Math.floor((Date.now() - date.getTime()) / 1000);
17
- if (seconds < 60) return "just now";
18
- const minutes = Math.floor(seconds / 60);
19
- if (minutes < 60) return `${minutes}m ago`;
20
- const hours = Math.floor(minutes / 60);
21
- if (hours < 24) return `${hours}h ago`;
22
- const days = Math.floor(hours / 24);
23
- return `${days}d ago`;
24
- }
25
-
26
16
  /**
27
17
  * Widget showing recent failed executions from both agent and workflow
28
18
  * domains, interleaved by timestamp.
@@ -89,7 +79,7 @@ export const DashboardFailedRuns = memo(function DashboardFailedRuns({
89
79
  )}
90
80
  </div>
91
81
  <span className="stg:shrink-0 stg:text-muted-foreground">
92
- {timeAgo(run.failedAt)}
82
+ {formatRelativeTime(run.failedAt)}
93
83
  </span>
94
84
  {onViewClick && (
95
85
  <button
@@ -1,10 +1,11 @@
1
1
  "use client";
2
2
 
3
- import { useCallback, useState, type FormEvent } from "react";
3
+ import { type FormEvent, useCallback, useId, useState } from "react";
4
4
  import { cn } from "@stigmer/theme";
5
5
  import { getUserMessage } from "@stigmer/sdk";
6
6
  import type { Environment } from "@stigmer/protos/ai/stigmer/agentic/environment/v1/api_pb";
7
7
  import { useCreateEnvironment } from "./useCreateEnvironment.js";
8
+ import { SpinnerIcon } from "../internal/SpinnerIcon.js";
8
9
 
9
10
  // ---------------------------------------------------------------------------
10
11
  // Public API
@@ -47,6 +48,7 @@ export function CreateEnvironmentForm({
47
48
  onCancel,
48
49
  className,
49
50
  }: CreateEnvironmentFormProps) {
51
+ const baseId = useId();
50
52
  const { create, isCreating, error, clearError } = useCreateEnvironment();
51
53
 
52
54
  const [name, setName] = useState("");
@@ -80,13 +82,13 @@ export function CreateEnvironmentForm({
80
82
  <div className="stg:space-y-2">
81
83
  <div className="stg:space-y-1">
82
84
  <label
83
- htmlFor="stgm-new-env-name"
85
+ htmlFor={`${baseId}-name`}
84
86
  className="stg:text-xs stg:font-medium stg:text-foreground"
85
87
  >
86
88
  Name
87
89
  </label>
88
90
  <input
89
- id="stgm-new-env-name"
91
+ id={`${baseId}-name`}
90
92
  type="text"
91
93
  value={name}
92
94
  onChange={(e) => setName(e.target.value)}
@@ -105,14 +107,14 @@ export function CreateEnvironmentForm({
105
107
 
106
108
  <div className="stg:space-y-1">
107
109
  <label
108
- htmlFor="stgm-new-env-desc"
110
+ htmlFor={`${baseId}-desc`}
109
111
  className="stg:text-xs stg:font-medium stg:text-muted-foreground"
110
112
  >
111
113
  Description{" "}
112
114
  <span className="stg:text-muted-foreground-subtle">(optional)</span>
113
115
  </label>
114
116
  <input
115
- id="stgm-new-env-desc"
117
+ id={`${baseId}-desc`}
116
118
  type="text"
117
119
  value={description}
118
120
  onChange={(e) => setDescription(e.target.value)}
@@ -144,7 +146,7 @@ export function CreateEnvironmentForm({
144
146
  "stg:disabled:pointer-events-none stg:disabled:opacity-40",
145
147
  )}
146
148
  >
147
- {isCreating && <SpinnerIcon />}
149
+ {isCreating && <SpinnerIcon size={12} />}
148
150
  Create environment
149
151
  </button>
150
152
 
@@ -167,24 +169,3 @@ export function CreateEnvironmentForm({
167
169
  );
168
170
  }
169
171
 
170
- // ---------------------------------------------------------------------------
171
- // Icons
172
- // ---------------------------------------------------------------------------
173
-
174
- function SpinnerIcon() {
175
- return (
176
- <svg
177
- width="12"
178
- height="12"
179
- viewBox="0 0 16 16"
180
- fill="none"
181
- stroke="currentColor"
182
- strokeWidth="2"
183
- strokeLinecap="round"
184
- className="stg:animate-spin"
185
- aria-hidden="true"
186
- >
187
- <path d="M8 2a6 6 0 1 0 6 6" />
188
- </svg>
189
- );
190
- }