@stigmer/react 3.12.1 → 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 (658) 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/iam-policy/GrantAccessForm.d.ts.map +1 -1
  166. package/iam-policy/GrantAccessForm.js +2 -4
  167. package/iam-policy/GrantAccessForm.js.map +1 -1
  168. package/iam-policy/OrgMembersPanel.d.ts.map +1 -1
  169. package/iam-policy/OrgMembersPanel.js +3 -5
  170. package/iam-policy/OrgMembersPanel.js.map +1 -1
  171. package/iam-policy/RoleSelector.d.ts.map +1 -1
  172. package/iam-policy/RoleSelector.js +7 -1
  173. package/iam-policy/RoleSelector.js.map +1 -1
  174. package/identity-provider/CreateIdentityProviderForm.d.ts.map +1 -1
  175. package/identity-provider/CreateIdentityProviderForm.js +6 -9
  176. package/identity-provider/CreateIdentityProviderForm.js.map +1 -1
  177. package/identity-provider/IdentityProviderDetailPanel.d.ts.map +1 -1
  178. package/identity-provider/IdentityProviderDetailPanel.js +17 -26
  179. package/identity-provider/IdentityProviderDetailPanel.js.map +1 -1
  180. package/identity-provider/IdentityProviderListPanel.d.ts.map +1 -1
  181. package/identity-provider/IdentityProviderListPanel.js +2 -4
  182. package/identity-provider/IdentityProviderListPanel.js.map +1 -1
  183. package/identity-provider/IdentityProviderWizard.d.ts.map +1 -1
  184. package/identity-provider/IdentityProviderWizard.js +8 -7
  185. package/identity-provider/IdentityProviderWizard.js.map +1 -1
  186. package/identity-provider/SsoLoginPrompt.js +5 -6
  187. package/identity-provider/SsoLoginPrompt.js.map +1 -1
  188. package/index.d.ts +9 -8
  189. package/index.d.ts.map +1 -1
  190. package/index.js +4 -4
  191. package/index.js.map +1 -1
  192. package/internal/DecisionButton.d.ts.map +1 -1
  193. package/internal/DecisionButton.js +1 -6
  194. package/internal/DecisionButton.js.map +1 -1
  195. package/internal/SpinnerIcon.d.ts +22 -0
  196. package/internal/SpinnerIcon.d.ts.map +1 -0
  197. package/internal/SpinnerIcon.js +23 -0
  198. package/internal/SpinnerIcon.js.map +1 -0
  199. package/internal/select-element-text.d.ts +11 -0
  200. package/internal/select-element-text.d.ts.map +1 -0
  201. package/internal/select-element-text.js +19 -0
  202. package/internal/select-element-text.js.map +1 -0
  203. package/internal/thread-card/ThreadCardShell.d.ts +27 -10
  204. package/internal/thread-card/ThreadCardShell.d.ts.map +1 -1
  205. package/internal/thread-card/ThreadCardShell.js +11 -5
  206. package/internal/thread-card/ThreadCardShell.js.map +1 -1
  207. package/internal/thread-card/glyphs.d.ts +11 -2
  208. package/internal/thread-card/glyphs.d.ts.map +1 -1
  209. package/internal/thread-card/glyphs.js +9 -3
  210. package/internal/thread-card/glyphs.js.map +1 -1
  211. package/internal/thread-card/index.d.ts +1 -1
  212. package/internal/thread-card/index.d.ts.map +1 -1
  213. package/internal/thread-card/index.js.map +1 -1
  214. package/internal/useCopyFeedback.d.ts +28 -0
  215. package/internal/useCopyFeedback.d.ts.map +1 -0
  216. package/internal/useCopyFeedback.js +40 -0
  217. package/internal/useCopyFeedback.js.map +1 -0
  218. package/invitation/InvitationCreatedAlert.d.ts.map +1 -1
  219. package/invitation/InvitationCreatedAlert.js +12 -19
  220. package/invitation/InvitationCreatedAlert.js.map +1 -1
  221. package/invitation/InvitationManager.d.ts.map +1 -1
  222. package/invitation/InvitationManager.js +14 -21
  223. package/invitation/InvitationManager.js.map +1 -1
  224. package/invitation/InvitationRedemption.d.ts.map +1 -1
  225. package/invitation/InvitationRedemption.js +2 -4
  226. package/invitation/InvitationRedemption.js.map +1 -1
  227. package/library/useExportResource.d.ts.map +1 -1
  228. package/library/useExportResource.js +16 -27
  229. package/library/useExportResource.js.map +1 -1
  230. package/manifest/ApplyManifestDialog.js +1 -1
  231. package/manifest/EditResourceYamlDialog.js +1 -1
  232. package/mcp-server/DefinitionDriftNotice.d.ts +42 -0
  233. package/mcp-server/DefinitionDriftNotice.d.ts.map +1 -0
  234. package/mcp-server/DefinitionDriftNotice.js +52 -0
  235. package/mcp-server/DefinitionDriftNotice.js.map +1 -0
  236. package/mcp-server/McpServerConnectDialog.js +1 -1
  237. package/mcp-server/McpServerDetailView.d.ts.map +1 -1
  238. package/mcp-server/McpServerDetailView.js +47 -14
  239. package/mcp-server/McpServerDetailView.js.map +1 -1
  240. package/mcp-server/OAuthAppForm.d.ts.map +1 -1
  241. package/mcp-server/OAuthAppForm.js +2 -4
  242. package/mcp-server/OAuthAppForm.js.map +1 -1
  243. package/mcp-server/internal/definitionDrift.d.ts +39 -0
  244. package/mcp-server/internal/definitionDrift.d.ts.map +1 -0
  245. package/mcp-server/internal/definitionDrift.js +122 -0
  246. package/mcp-server/internal/definitionDrift.js.map +1 -0
  247. package/mcp-server/internal/mcpServerToInput.d.ts.map +1 -1
  248. package/mcp-server/internal/mcpServerToInput.js +3 -0
  249. package/mcp-server/internal/mcpServerToInput.js.map +1 -1
  250. package/mcp-server/steps/EnvironmentAuthStep.d.ts.map +1 -1
  251. package/mcp-server/steps/EnvironmentAuthStep.js +8 -4
  252. package/mcp-server/steps/EnvironmentAuthStep.js.map +1 -1
  253. package/mcp-server/steps/IdentityTransportStep.d.ts.map +1 -1
  254. package/mcp-server/steps/IdentityTransportStep.js +5 -4
  255. package/mcp-server/steps/IdentityTransportStep.js.map +1 -1
  256. package/mcp-server/useMcpServerConnect.d.ts +1 -1
  257. package/mcp-server/useMcpServerDefinitionDrift.d.ts +44 -0
  258. package/mcp-server/useMcpServerDefinitionDrift.d.ts.map +1 -0
  259. package/mcp-server/useMcpServerDefinitionDrift.js +61 -0
  260. package/mcp-server/useMcpServerDefinitionDrift.js.map +1 -0
  261. package/models/ModelRegistryContext.d.ts +7 -1
  262. package/models/ModelRegistryContext.d.ts.map +1 -1
  263. package/models/ModelRegistryContext.js.map +1 -1
  264. package/models/ModelSelector.js +9 -1
  265. package/models/ModelSelector.js.map +1 -1
  266. package/models/index.d.ts +2 -2
  267. package/models/index.d.ts.map +1 -1
  268. package/models/index.js +1 -1
  269. package/models/index.js.map +1 -1
  270. package/models/registry.d.ts +88 -6
  271. package/models/registry.d.ts.map +1 -1
  272. package/models/registry.js +133 -27
  273. package/models/registry.js.map +1 -1
  274. package/models/useModelRegistry.d.ts +7 -1
  275. package/models/useModelRegistry.d.ts.map +1 -1
  276. package/models/useModelRegistry.js +3 -2
  277. package/models/useModelRegistry.js.map +1 -1
  278. package/oauth-app/CreateOAuthAppForm.d.ts.map +1 -1
  279. package/oauth-app/CreateOAuthAppForm.js +4 -5
  280. package/oauth-app/CreateOAuthAppForm.js.map +1 -1
  281. package/oauth-app/OAuthAppDetailPanel.d.ts.map +1 -1
  282. package/oauth-app/OAuthAppDetailPanel.js +5 -6
  283. package/oauth-app/OAuthAppDetailPanel.js.map +1 -1
  284. package/organization/CreateOrganizationForm.d.ts.map +1 -1
  285. package/organization/CreateOrganizationForm.js +5 -9
  286. package/organization/CreateOrganizationForm.js.map +1 -1
  287. package/organization/OrgProfilePanel.d.ts.map +1 -1
  288. package/organization/OrgProfilePanel.js +7 -16
  289. package/organization/OrgProfilePanel.js.map +1 -1
  290. package/package.json +4 -4
  291. package/platform-client/CreatePlatformClientForm.d.ts.map +1 -1
  292. package/platform-client/CreatePlatformClientForm.js +5 -6
  293. package/platform-client/CreatePlatformClientForm.js.map +1 -1
  294. package/platform-client/PlatformClientDetailPanel.d.ts.map +1 -1
  295. package/platform-client/PlatformClientDetailPanel.js +6 -7
  296. package/platform-client/PlatformClientDetailPanel.js.map +1 -1
  297. package/platform-client/PlatformClientListPanel.d.ts.map +1 -1
  298. package/platform-client/PlatformClientListPanel.js +2 -4
  299. package/platform-client/PlatformClientListPanel.js.map +1 -1
  300. package/platform-client/PlatformClientSecretAlert.d.ts.map +1 -1
  301. package/platform-client/PlatformClientSecretAlert.js +18 -25
  302. package/platform-client/PlatformClientSecretAlert.js.map +1 -1
  303. package/provider.d.ts +34 -1
  304. package/provider.d.ts.map +1 -1
  305. package/provider.js +14 -7
  306. package/provider.js.map +1 -1
  307. package/resource-creation/WizardNav.d.ts.map +1 -1
  308. package/resource-creation/WizardNav.js +2 -4
  309. package/resource-creation/WizardNav.js.map +1 -1
  310. package/resource-detail/ConfirmDialog.js +1 -1
  311. package/resource-detail/useCopyResource.d.ts +4 -3
  312. package/resource-detail/useCopyResource.d.ts.map +1 -1
  313. package/resource-detail/useCopyResource.js +10 -19
  314. package/resource-detail/useCopyResource.js.map +1 -1
  315. package/schedule/ScheduleDetailView.d.ts.map +1 -1
  316. package/schedule/ScheduleDetailView.js +2 -4
  317. package/schedule/ScheduleDetailView.js.map +1 -1
  318. package/schedule/ScheduleForm.d.ts.map +1 -1
  319. package/schedule/ScheduleForm.js +6 -7
  320. package/schedule/ScheduleForm.js.map +1 -1
  321. package/session/NewSessionViewer.d.ts +52 -2
  322. package/session/NewSessionViewer.d.ts.map +1 -1
  323. package/session/NewSessionViewer.js +21 -6
  324. package/session/NewSessionViewer.js.map +1 -1
  325. package/session/SessionViewer.d.ts +63 -2
  326. package/session/SessionViewer.d.ts.map +1 -1
  327. package/session/SessionViewer.js +43 -17
  328. package/session/SessionViewer.js.map +1 -1
  329. package/session/audience.d.ts +17 -0
  330. package/session/audience.d.ts.map +1 -1
  331. package/session/index.d.ts +2 -1
  332. package/session/index.d.ts.map +1 -1
  333. package/session/index.js.map +1 -1
  334. package/session/run-config.d.ts +50 -0
  335. package/session/run-config.d.ts.map +1 -0
  336. package/session/run-config.js +15 -0
  337. package/session/run-config.js.map +1 -0
  338. package/session/useNewSessionFlow.d.ts +11 -0
  339. package/session/useNewSessionFlow.d.ts.map +1 -1
  340. package/session/useNewSessionFlow.js +29 -2
  341. package/session/useNewSessionFlow.js.map +1 -1
  342. package/session/useSessionConversation.d.ts +7 -7
  343. package/session/useSessionConversation.d.ts.map +1 -1
  344. package/session/useSessionConversation.js +2 -0
  345. package/session/useSessionConversation.js.map +1 -1
  346. package/session/useSessionPageFlow.d.ts +18 -4
  347. package/session/useSessionPageFlow.d.ts.map +1 -1
  348. package/session/useSessionPageFlow.js +33 -6
  349. package/session/useSessionPageFlow.js.map +1 -1
  350. package/session/useSessionPanel.d.ts +37 -2
  351. package/session/useSessionPanel.d.ts.map +1 -1
  352. package/session/useSessionPanel.js +44 -10
  353. package/session/useSessionPanel.js.map +1 -1
  354. package/settings/ApiKeysSection.d.ts.map +1 -1
  355. package/settings/ApiKeysSection.js +3 -2
  356. package/settings/ApiKeysSection.js.map +1 -1
  357. package/settings/ChannelAppsSection.d.ts.map +1 -1
  358. package/settings/ChannelAppsSection.js +3 -2
  359. package/settings/ChannelAppsSection.js.map +1 -1
  360. package/settings/EnvironmentsSection.js +5 -3
  361. package/settings/EnvironmentsSection.js.map +1 -1
  362. package/settings/IdentityProvidersSection.d.ts.map +1 -1
  363. package/settings/IdentityProvidersSection.js +3 -2
  364. package/settings/IdentityProvidersSection.js.map +1 -1
  365. package/settings/InvitationsSection.d.ts.map +1 -1
  366. package/settings/InvitationsSection.js +3 -1
  367. package/settings/InvitationsSection.js.map +1 -1
  368. package/settings/MembersSection.d.ts.map +1 -1
  369. package/settings/MembersSection.js +3 -1
  370. package/settings/MembersSection.js.map +1 -1
  371. package/settings/OAuthAppsSection.d.ts.map +1 -1
  372. package/settings/OAuthAppsSection.js +3 -2
  373. package/settings/OAuthAppsSection.js.map +1 -1
  374. package/settings/OrgProfileSection.d.ts.map +1 -1
  375. package/settings/OrgProfileSection.js +3 -2
  376. package/settings/OrgProfileSection.js.map +1 -1
  377. package/settings/PlatformClientsSection.d.ts.map +1 -1
  378. package/settings/PlatformClientsSection.js +3 -2
  379. package/settings/PlatformClientsSection.js.map +1 -1
  380. package/settings/UsageSection.d.ts.map +1 -1
  381. package/settings/UsageSection.js +3 -1
  382. package/settings/UsageSection.js.map +1 -1
  383. package/sharing/ShareAgentDialog.d.ts.map +1 -1
  384. package/sharing/ShareAgentDialog.js +18 -7
  385. package/sharing/ShareAgentDialog.js.map +1 -1
  386. package/sidebar/chrome.d.ts +3 -4
  387. package/sidebar/chrome.d.ts.map +1 -1
  388. package/sidebar/chrome.js +5 -4
  389. package/sidebar/chrome.js.map +1 -1
  390. package/skill/SkillDiffDialog.js +1 -1
  391. package/src/access/ManageAccessDialog.tsx +10 -4
  392. package/src/activity/format-relative-time.ts +11 -9
  393. package/src/agent/steps/CapabilitiesStep.tsx +6 -3
  394. package/src/agent/steps/IdentityStep.tsx +19 -12
  395. package/src/agent-instance/CreateAgentInstanceDialog.tsx +17 -8
  396. package/src/api-key/ApiKeyCreatedAlert.tsx +10 -19
  397. package/src/api-key/ApiKeyListPanel.tsx +3 -39
  398. package/src/api-key/CreateApiKeyForm.tsx +12 -26
  399. package/src/approval-defaults-context.ts +56 -0
  400. package/src/attachment/__tests__/vision-preflight.test.ts +311 -0
  401. package/src/attachment/index.ts +12 -0
  402. package/src/attachment/vision-preflight.ts +236 -0
  403. package/src/billing/AutoRechargeCard.tsx +5 -4
  404. package/src/billing/BillingSection.tsx +4 -3
  405. package/src/channel/ChannelConversationsDialog.tsx +8 -4
  406. package/src/channel/ChannelCredentialsDialog.tsx +14 -4
  407. package/src/channel/ChannelTemplatesDialog.tsx +8 -4
  408. package/src/channel/ConnectSlackDialog.tsx +14 -4
  409. package/src/channel/ConnectWhatsAppDialog.tsx +14 -4
  410. package/src/channel/useChannelSessions.ts +3 -0
  411. package/src/channel-app/ChannelAppDetailPanel.tsx +15 -12
  412. package/src/channel-app/CreateChannelAppForm.tsx +17 -12
  413. package/src/channel-app/internal.tsx +5 -25
  414. package/src/composer/ComposerToolbar.tsx +1 -1
  415. package/src/composer/SessionComposer.tsx +160 -13
  416. package/src/composer/__tests__/SessionComposer-modelCoherence.test.tsx +220 -0
  417. package/src/composer/__tests__/SessionComposer-visionPreflight.test.tsx +222 -0
  418. package/src/composer/icons.tsx +0 -18
  419. package/src/conversation/ConversationComposer.tsx +1 -1
  420. package/src/conversation/ConversationListPane.tsx +4 -3
  421. package/src/cursor-accounts/MemberCoverageTable.tsx +3 -14
  422. package/src/cursor-accounts/__tests__/CursorAccountsConsole.test.tsx +2 -10
  423. package/src/dashboard/DashboardFailedRuns.tsx +2 -12
  424. package/src/environment/CreateEnvironmentForm.tsx +8 -27
  425. package/src/environment/EnvVarForm.tsx +2 -18
  426. package/src/environment/EnvironmentVariableEditor.tsx +5 -21
  427. package/src/execution/ArtifactApplyButton.tsx +2 -17
  428. package/src/execution/ExecutionErrorNotice.tsx +99 -0
  429. package/src/execution/FilePathLink.tsx +5 -9
  430. package/src/execution/FileReviewCard.tsx +1 -20
  431. package/src/execution/FollowUpInput.tsx +1 -16
  432. package/src/execution/LivenessStatusLine.tsx +59 -0
  433. package/src/execution/MessageEntry.tsx +136 -25
  434. package/src/execution/MessageThread.tsx +84 -83
  435. package/src/execution/SetupProgress.tsx +5 -1
  436. package/src/execution/SubAgentSection.tsx +9 -20
  437. package/src/execution/TerminalSession.tsx +97 -10
  438. package/src/execution/ToolCallDetail.tsx +19 -0
  439. package/src/execution/ToolCallItem.tsx +157 -37
  440. package/src/execution/ToolRunGroup.tsx +30 -32
  441. package/src/execution/WriteBackCard.tsx +5 -24
  442. package/src/execution/__tests__/MessageEntry-copy.test.tsx +125 -0
  443. package/src/execution/__tests__/MessageThread.test.tsx +97 -0
  444. package/src/execution/__tests__/TerminalSession.test.tsx +71 -1
  445. package/src/execution/__tests__/ToolCallDetail.test.tsx +33 -1
  446. package/src/execution/__tests__/ToolCallItem.test.tsx +299 -11
  447. package/src/execution/__tests__/ToolRunGroup.test.tsx +41 -9
  448. package/src/execution/__tests__/message-thread-slots.test.tsx +92 -0
  449. package/src/execution/__tests__/tool-presenter.test.tsx +41 -4
  450. package/src/execution/index.ts +8 -2
  451. package/src/execution/tool-categories.ts +72 -8
  452. package/src/execution/tool-presenter.ts +22 -1
  453. package/src/execution/useArtifactInspection.ts +4 -8
  454. package/src/iam-policy/GrantAccessForm.tsx +2 -18
  455. package/src/iam-policy/OrgMembersPanel.tsx +3 -19
  456. package/src/iam-policy/RoleSelector.tsx +8 -1
  457. package/src/identity-provider/CreateIdentityProviderForm.tsx +13 -31
  458. package/src/identity-provider/IdentityProviderDetailPanel.tsx +24 -49
  459. package/src/identity-provider/IdentityProviderListPanel.tsx +2 -18
  460. package/src/identity-provider/IdentityProviderWizard.tsx +15 -32
  461. package/src/identity-provider/SsoLoginPrompt.tsx +6 -21
  462. package/src/index.ts +23 -1
  463. package/src/internal/DecisionButton.tsx +1 -20
  464. package/src/internal/SpinnerIcon.tsx +42 -0
  465. package/src/internal/__tests__/ThreadCardShell.test.tsx +43 -7
  466. package/src/internal/__tests__/useCopyFeedback.test.ts +92 -0
  467. package/src/internal/select-element-text.ts +17 -0
  468. package/src/internal/thread-card/ThreadCardShell.tsx +53 -21
  469. package/src/internal/thread-card/glyphs.tsx +24 -3
  470. package/src/internal/thread-card/index.ts +1 -0
  471. package/src/internal/useCopyFeedback.ts +61 -0
  472. package/src/invitation/InvitationCreatedAlert.tsx +10 -18
  473. package/src/invitation/InvitationManager.tsx +23 -34
  474. package/src/invitation/InvitationRedemption.tsx +2 -18
  475. package/src/library/useExportResource.ts +15 -29
  476. package/src/manifest/ApplyManifestDialog.tsx +1 -1
  477. package/src/manifest/EditResourceYamlDialog.tsx +1 -1
  478. package/src/mcp-server/DefinitionDriftNotice.tsx +120 -0
  479. package/src/mcp-server/McpServerConnectDialog.tsx +1 -1
  480. package/src/mcp-server/McpServerDetailView.tsx +58 -26
  481. package/src/mcp-server/OAuthAppForm.tsx +2 -18
  482. package/src/mcp-server/__tests__/DefinitionDriftNotice.test.tsx +57 -0
  483. package/src/mcp-server/__tests__/definitionDrift.test.ts +245 -0
  484. package/src/mcp-server/__tests__/mcpServerToInput.test.ts +201 -0
  485. package/src/mcp-server/__tests__/useMcpServerDefinitionDrift.test.tsx +173 -0
  486. package/src/mcp-server/internal/definitionDrift.ts +158 -0
  487. package/src/mcp-server/internal/mcpServerToInput.ts +3 -0
  488. package/src/mcp-server/steps/EnvironmentAuthStep.tsx +19 -19
  489. package/src/mcp-server/steps/IdentityTransportStep.tsx +24 -23
  490. package/src/mcp-server/useMcpServerConnect.ts +1 -1
  491. package/src/mcp-server/useMcpServerDefinitionDrift.ts +95 -0
  492. package/src/models/ModelRegistryContext.ts +7 -1
  493. package/src/models/ModelSelector.tsx +37 -0
  494. package/src/models/__tests__/ModelSelector-visionIndicator.test.tsx +129 -0
  495. package/src/models/__tests__/resolveDefaultModel.test.ts +115 -0
  496. package/src/models/__tests__/useModelRegistry.test.tsx +99 -4
  497. package/src/models/index.ts +2 -2
  498. package/src/models/registry.ts +196 -29
  499. package/src/models/useModelRegistry.ts +10 -2
  500. package/src/oauth-app/CreateOAuthAppForm.tsx +16 -31
  501. package/src/oauth-app/OAuthAppDetailPanel.tsx +16 -31
  502. package/src/organization/CreateOrganizationForm.tsx +10 -29
  503. package/src/organization/OrgProfilePanel.tsx +13 -44
  504. package/src/platform-client/CreatePlatformClientForm.tsx +9 -29
  505. package/src/platform-client/PlatformClientDetailPanel.tsx +10 -30
  506. package/src/platform-client/PlatformClientListPanel.tsx +2 -18
  507. package/src/platform-client/PlatformClientSecretAlert.tsx +26 -55
  508. package/src/provider.tsx +76 -33
  509. package/src/resource-creation/WizardNav.tsx +2 -18
  510. package/src/resource-detail/ConfirmDialog.tsx +1 -1
  511. package/src/resource-detail/useCopyResource.ts +17 -23
  512. package/src/schedule/ScheduleDetailView.tsx +2 -18
  513. package/src/schedule/ScheduleForm.tsx +19 -34
  514. package/src/session/NewSessionViewer.tsx +85 -7
  515. package/src/session/SessionViewer.tsx +120 -17
  516. package/src/session/__tests__/audienceWiring.test.tsx +76 -0
  517. package/src/session/__tests__/panelNegotiation.test.tsx +302 -0
  518. package/src/session/__tests__/useNewSessionFlow.test.tsx +134 -5
  519. package/src/session/__tests__/useSessionPageFlow.autoApprove.test.tsx +74 -0
  520. package/src/session/__tests__/useSessionPageFlow.runConfig.test.tsx +157 -0
  521. package/src/session/__tests__/useSessionPanel.test.ts +114 -0
  522. package/src/session/audience.ts +18 -0
  523. package/src/session/index.ts +2 -1
  524. package/src/session/run-config.ts +59 -0
  525. package/src/session/useNewSessionFlow.ts +39 -2
  526. package/src/session/useSessionConversation.ts +10 -8
  527. package/src/session/useSessionPageFlow.ts +51 -10
  528. package/src/session/useSessionPanel.ts +91 -10
  529. package/src/settings/ApiKeysSection.tsx +4 -3
  530. package/src/settings/ChannelAppsSection.tsx +4 -3
  531. package/src/settings/EnvironmentsSection.tsx +8 -5
  532. package/src/settings/IdentityProvidersSection.tsx +4 -3
  533. package/src/settings/InvitationsSection.tsx +4 -2
  534. package/src/settings/MembersSection.tsx +4 -2
  535. package/src/settings/OAuthAppsSection.tsx +4 -3
  536. package/src/settings/OrgProfileSection.tsx +4 -3
  537. package/src/settings/PlatformClientsSection.tsx +4 -3
  538. package/src/settings/UsageSection.tsx +4 -2
  539. package/src/sharing/ShareAgentDialog.tsx +28 -10
  540. package/src/sidebar/__tests__/WorkspaceSidebar.test.tsx +4 -1
  541. package/src/sidebar/chrome.tsx +6 -6
  542. package/src/skill/SkillDiffDialog.tsx +1 -1
  543. package/src/styles.css +43 -0
  544. package/src/version-history/VersionTimelineEntry.tsx +1 -21
  545. package/src/workflow/FailedRunsWidget.tsx +2 -9
  546. package/src/workflow/PendingApprovalsWidget.tsx +2 -9
  547. package/src/workflow/ViewYamlDialog.tsx +7 -22
  548. package/src/workflow/WorkflowArchitectDialog.tsx +8 -27
  549. package/src/workflow/WorkflowArtifactDocument.tsx +5 -9
  550. package/src/workflow/WorkflowCanvasEditor.tsx +2 -0
  551. package/src/workflow/WorkflowCanvasInner.tsx +14 -1
  552. package/src/workflow/WorkflowDiffGraph.tsx +7 -1
  553. package/src/workflow/WorkflowExecutionViewer.tsx +88 -11
  554. package/src/workflow/WorkflowExplainDialog.tsx +8 -24
  555. package/src/workflow/WorkflowOverviewGraph.tsx +9 -1
  556. package/src/workflow/WorkflowRefinePanel.tsx +2 -18
  557. package/src/workflow/WorkflowRepairCard.tsx +2 -18
  558. package/src/workflow/WorkflowRunDialog.tsx +3 -23
  559. package/src/workflow/WorkflowTaskApprovalSummary.tsx +2 -17
  560. package/src/workflow/WorkflowVersionBadge.tsx +4 -13
  561. package/src/workflow/WorkflowVersionTimeline.tsx +1 -25
  562. package/src/workflow/__tests__/panelNegotiation.test.tsx +230 -0
  563. package/src/workflow/__tests__/useWorkflowCanvas.dirty.test.tsx +178 -0
  564. package/src/workflow/__tests__/useWorkflowCanvas.drag.test.tsx +224 -0
  565. package/src/workflow/__tests__/useWorkflowExecutionPanel.test.ts +100 -0
  566. package/src/workflow/execution-comparison/ExecutionComparisonPicker.tsx +7 -11
  567. package/src/workflow/execution-history/ExecutionHistoryTable.tsx +1 -25
  568. package/src/workflow/index.ts +1 -0
  569. package/src/workflow/instance/CreateWorkflowInstanceDialog.tsx +1 -1
  570. package/src/workflow/instance/WorkflowInstanceDetailPanel.tsx +2 -1
  571. package/src/workflow/picker/BranchAddPopover.tsx +4 -3
  572. package/src/workflow/templates/WorkflowTemplatePreview.tsx +1 -1
  573. package/src/workflow/useApprovalBoundary.ts +1 -1
  574. package/src/workflow/useWorkflowCanvas.ts +114 -11
  575. package/src/workflow/useWorkflowExecutionPanel.ts +95 -13
  576. package/styles.css +1 -1
  577. package/version-history/VersionTimelineEntry.d.ts.map +1 -1
  578. package/version-history/VersionTimelineEntry.js +1 -23
  579. package/version-history/VersionTimelineEntry.js.map +1 -1
  580. package/workflow/CanvasTransitionEdge.d.ts +1 -1
  581. package/workflow/FailedRunsWidget.d.ts.map +1 -1
  582. package/workflow/FailedRunsWidget.js +2 -11
  583. package/workflow/FailedRunsWidget.js.map +1 -1
  584. package/workflow/PendingApprovalsWidget.d.ts.map +1 -1
  585. package/workflow/PendingApprovalsWidget.js +2 -11
  586. package/workflow/PendingApprovalsWidget.js.map +1 -1
  587. package/workflow/ViewYamlDialog.d.ts.map +1 -1
  588. package/workflow/ViewYamlDialog.js +7 -23
  589. package/workflow/ViewYamlDialog.js.map +1 -1
  590. package/workflow/WorkflowArchitectDialog.d.ts.map +1 -1
  591. package/workflow/WorkflowArchitectDialog.js +7 -11
  592. package/workflow/WorkflowArchitectDialog.js.map +1 -1
  593. package/workflow/WorkflowArtifactDocument.d.ts.map +1 -1
  594. package/workflow/WorkflowArtifactDocument.js +5 -8
  595. package/workflow/WorkflowArtifactDocument.js.map +1 -1
  596. package/workflow/WorkflowCanvasEditor.d.ts.map +1 -1
  597. package/workflow/WorkflowCanvasEditor.js +1 -1
  598. package/workflow/WorkflowCanvasEditor.js.map +1 -1
  599. package/workflow/WorkflowCanvasInner.d.ts +4 -2
  600. package/workflow/WorkflowCanvasInner.d.ts.map +1 -1
  601. package/workflow/WorkflowCanvasInner.js +7 -3
  602. package/workflow/WorkflowCanvasInner.js.map +1 -1
  603. package/workflow/WorkflowDiffGraph.js +6 -2
  604. package/workflow/WorkflowDiffGraph.js.map +1 -1
  605. package/workflow/WorkflowExecutionViewer.d.ts +51 -0
  606. package/workflow/WorkflowExecutionViewer.d.ts.map +1 -1
  607. package/workflow/WorkflowExecutionViewer.js +23 -6
  608. package/workflow/WorkflowExecutionViewer.js.map +1 -1
  609. package/workflow/WorkflowExplainDialog.d.ts.map +1 -1
  610. package/workflow/WorkflowExplainDialog.js +6 -8
  611. package/workflow/WorkflowExplainDialog.js.map +1 -1
  612. package/workflow/WorkflowOverviewGraph.js +8 -2
  613. package/workflow/WorkflowOverviewGraph.js.map +1 -1
  614. package/workflow/WorkflowRefinePanel.d.ts.map +1 -1
  615. package/workflow/WorkflowRefinePanel.js +2 -4
  616. package/workflow/WorkflowRefinePanel.js.map +1 -1
  617. package/workflow/WorkflowRepairCard.d.ts.map +1 -1
  618. package/workflow/WorkflowRepairCard.js +2 -4
  619. package/workflow/WorkflowRepairCard.js.map +1 -1
  620. package/workflow/WorkflowRunDialog.d.ts.map +1 -1
  621. package/workflow/WorkflowRunDialog.js +2 -7
  622. package/workflow/WorkflowRunDialog.js.map +1 -1
  623. package/workflow/WorkflowTaskApprovalSummary.d.ts.map +1 -1
  624. package/workflow/WorkflowTaskApprovalSummary.js +2 -4
  625. package/workflow/WorkflowTaskApprovalSummary.js.map +1 -1
  626. package/workflow/WorkflowVersionBadge.d.ts.map +1 -1
  627. package/workflow/WorkflowVersionBadge.js +4 -13
  628. package/workflow/WorkflowVersionBadge.js.map +1 -1
  629. package/workflow/WorkflowVersionTimeline.d.ts.map +1 -1
  630. package/workflow/WorkflowVersionTimeline.js +1 -26
  631. package/workflow/WorkflowVersionTimeline.js.map +1 -1
  632. package/workflow/execution-comparison/ExecutionComparisonPicker.d.ts.map +1 -1
  633. package/workflow/execution-comparison/ExecutionComparisonPicker.js +7 -15
  634. package/workflow/execution-comparison/ExecutionComparisonPicker.js.map +1 -1
  635. package/workflow/execution-history/ExecutionHistoryTable.d.ts.map +1 -1
  636. package/workflow/execution-history/ExecutionHistoryTable.js +1 -24
  637. package/workflow/execution-history/ExecutionHistoryTable.js.map +1 -1
  638. package/workflow/index.d.ts +1 -1
  639. package/workflow/index.d.ts.map +1 -1
  640. package/workflow/index.js.map +1 -1
  641. package/workflow/instance/CreateWorkflowInstanceDialog.js +1 -1
  642. package/workflow/instance/WorkflowInstanceDetailPanel.d.ts.map +1 -1
  643. package/workflow/instance/WorkflowInstanceDetailPanel.js +1 -1
  644. package/workflow/instance/WorkflowInstanceDetailPanel.js.map +1 -1
  645. package/workflow/picker/BranchAddPopover.d.ts.map +1 -1
  646. package/workflow/picker/BranchAddPopover.js +3 -2
  647. package/workflow/picker/BranchAddPopover.js.map +1 -1
  648. package/workflow/templates/WorkflowTemplatePreview.js +1 -1
  649. package/workflow/useApprovalBoundary.d.ts +1 -1
  650. package/workflow/useApprovalBoundary.js +1 -1
  651. package/workflow/useWorkflowCanvas.d.ts +5 -1
  652. package/workflow/useWorkflowCanvas.d.ts.map +1 -1
  653. package/workflow/useWorkflowCanvas.js +99 -13
  654. package/workflow/useWorkflowCanvas.js.map +1 -1
  655. package/workflow/useWorkflowExecutionPanel.d.ts +38 -2
  656. package/workflow/useWorkflowExecutionPanel.d.ts.map +1 -1
  657. package/workflow/useWorkflowExecutionPanel.js +46 -13
  658. package/workflow/useWorkflowExecutionPanel.js.map +1 -1
@@ -0,0 +1,230 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
2
+ import { render, screen, cleanup, fireEvent } from "@testing-library/react";
3
+ import { create } from "@bufbuild/protobuf";
4
+ import { WorkflowExecutionSchema } from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/api_pb";
5
+ import { ExecutionPhase } from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/enum_pb";
6
+ import type { DerivedCostSummary } from "../../internal/store/workflow-execution-event-store";
7
+ import { useWorkflowExecution } from "../useWorkflowExecution";
8
+ import { useWorkflowExecutionEventStream } from "../useWorkflowExecutionEventStream";
9
+ import { useWorkflowExecutionArtifacts } from "../useWorkflowExecutionArtifacts";
10
+ import { useWorkflowExecutionFileChanges } from "../useWorkflowExecutionFileChanges";
11
+ import { useWorkflowExecutionActions } from "../useWorkflowExecutionActions";
12
+ import { WorkflowExecutionViewer } from "../WorkflowExecutionViewer";
13
+
14
+ // ---------------------------------------------------------------------------
15
+ // Wiring-contract tests for the execution panel's host-negotiation surface
16
+ // (issue #654): `panel="none"` omission, `defaultPanelOpen`, and the
17
+ // controlled/observed `panelOpen` + `onPanelOpenChange` pair — the workflow
18
+ // mirror of the session organisms' #651 contract (see the session
19
+ // panelNegotiation suite). Workflow-specific beat: Diagnose gates on the
20
+ // panel too, because its conversation renders inside the panel.
21
+ //
22
+ // Same probe/stub setup as the approvals suite: data hooks are stubbed to a
23
+ // loaded, task-less execution; the graph and comparison picker are inert.
24
+ // ---------------------------------------------------------------------------
25
+
26
+ vi.mock("../useWorkflowExecution", () => ({
27
+ useWorkflowExecution: vi.fn(),
28
+ }));
29
+ vi.mock("../useWorkflowExecutionEventStream", () => ({
30
+ useWorkflowExecutionEventStream: vi.fn(),
31
+ }));
32
+ vi.mock("../useWorkflowExecutionArtifacts", () => ({
33
+ useWorkflowExecutionArtifacts: vi.fn(),
34
+ }));
35
+ vi.mock("../useWorkflowExecutionFileChanges", () => ({
36
+ useWorkflowExecutionFileChanges: vi.fn(),
37
+ }));
38
+ vi.mock("../useWorkflowExecutionActions", () => ({
39
+ useWorkflowExecutionActions: vi.fn(),
40
+ }));
41
+ vi.mock("../WorkflowExecutionGraph", () => ({
42
+ WorkflowExecutionGraph: () => <div data-testid="graph-stub" />,
43
+ }));
44
+ vi.mock("../execution-comparison/ExecutionComparisonPicker", () => ({
45
+ ExecutionComparisonPicker: () => null,
46
+ }));
47
+
48
+ const mockedUseWorkflowExecution = vi.mocked(useWorkflowExecution);
49
+ const mockedUseEventStream = vi.mocked(useWorkflowExecutionEventStream);
50
+ const mockedUseArtifacts = vi.mocked(useWorkflowExecutionArtifacts);
51
+ const mockedUseFileChanges = vi.mocked(useWorkflowExecutionFileChanges);
52
+ const mockedUseActions = vi.mocked(useWorkflowExecutionActions);
53
+
54
+ const COST_SUMMARY: DerivedCostSummary = {
55
+ costConsumedMicros: 0n,
56
+ costRemainingMicros: -1n,
57
+ tokensConsumed: 0n,
58
+ tokensRemaining: -1n,
59
+ thresholdBreached: false,
60
+ };
61
+
62
+ function arrange(phase: ExecutionPhase = ExecutionPhase.EXECUTION_IN_PROGRESS) {
63
+ mockedUseWorkflowExecution.mockReturnValue({
64
+ execution: create(WorkflowExecutionSchema, {
65
+ metadata: { id: "wex_1", name: "nightly-report" },
66
+ spec: { workflowId: "wf_1" },
67
+ status: { phase, startedAt: "2026-07-15T00:00:00Z", tasks: [] },
68
+ }),
69
+ isLoading: false,
70
+ error: null,
71
+ refetch: vi.fn(),
72
+ } as unknown as ReturnType<typeof useWorkflowExecution>);
73
+ mockedUseEventStream.mockReturnValue({
74
+ events: [],
75
+ taskStates: new Map(),
76
+ costSummary: COST_SUMMARY,
77
+ streamState: { stage: "streaming" },
78
+ totalTasks: 0,
79
+ error: null,
80
+ reconnect: vi.fn(),
81
+ } as unknown as ReturnType<typeof useWorkflowExecutionEventStream>);
82
+ mockedUseArtifacts.mockReturnValue({
83
+ artifacts: [],
84
+ } as unknown as ReturnType<typeof useWorkflowExecutionArtifacts>);
85
+ mockedUseFileChanges.mockReturnValue({
86
+ fileChanges: [],
87
+ fileChangeCount: 0,
88
+ isLoading: false,
89
+ isRefetching: false,
90
+ error: null,
91
+ refetch: vi.fn(),
92
+ } as unknown as ReturnType<typeof useWorkflowExecutionFileChanges>);
93
+ mockedUseActions.mockReturnValue({
94
+ cancel: vi.fn(),
95
+ terminate: vi.fn(),
96
+ pause: vi.fn(),
97
+ resume: vi.fn(),
98
+ recover: vi.fn(),
99
+ submitApproval: vi.fn(),
100
+ submitTaskApproval: vi.fn(),
101
+ submitFileDecision: vi.fn(),
102
+ isSubmitting: false,
103
+ error: null,
104
+ clearError: vi.fn(),
105
+ approvalSubmittingToolCallIds: new Set<string>(),
106
+ approvalErrorsByToolCallId: new Map<string, Error>(),
107
+ taskApprovalSubmittingTaskNames: new Set<string>(),
108
+ taskApprovalErrorsByTaskName: new Map<string, Error>(),
109
+ fileDecisionSubmittingKeys: new Set<string>(),
110
+ fileDecisionErrorsByKey: new Map<string, Error>(),
111
+ } as unknown as ReturnType<typeof useWorkflowExecutionActions>);
112
+ }
113
+
114
+ function chipButton(): HTMLElement | null {
115
+ return (
116
+ screen.queryByRole("button", { name: "Show panel" }) ??
117
+ screen.queryByRole("button", { name: "Hide panel" })
118
+ );
119
+ }
120
+
121
+ beforeEach(() => {
122
+ vi.clearAllMocks();
123
+ localStorage.clear();
124
+ });
125
+
126
+ afterEach(cleanup);
127
+
128
+ describe('WorkflowExecutionViewer — panel="none"', () => {
129
+ it("removes the chip and never renders the panel", () => {
130
+ arrange();
131
+ render(<WorkflowExecutionViewer executionId="wex_1" panel="none" />);
132
+ expect(chipButton()).toBeNull();
133
+ });
134
+
135
+ it("withholds Diagnose — its conversation renders inside the panel", () => {
136
+ arrange(ExecutionPhase.EXECUTION_FAILED);
137
+ render(
138
+ <WorkflowExecutionViewer executionId="wex_1" org="acme" panel="none" />,
139
+ );
140
+ expect(screen.queryByRole("button", { name: "Diagnose" })).toBeNull();
141
+ // The failed-state actions that live OUTSIDE the panel are untouched.
142
+ expect(screen.getByRole("button", { name: "Recover" })).toBeDefined();
143
+ });
144
+
145
+ it("keeps controlled props inert — panelOpen cannot force a surface that does not exist", () => {
146
+ arrange();
147
+ const onPanelOpenChange = vi.fn();
148
+ render(
149
+ <WorkflowExecutionViewer
150
+ executionId="wex_1"
151
+ panel="none"
152
+ panelOpen={true}
153
+ onPanelOpenChange={onPanelOpenChange}
154
+ />,
155
+ );
156
+ expect(chipButton()).toBeNull();
157
+ expect(onPanelOpenChange).not.toHaveBeenCalled();
158
+ });
159
+ });
160
+
161
+ describe("WorkflowExecutionViewer — Diagnose in the default panel mode", () => {
162
+ it("offers Diagnose on a failed execution (the contrast for the none-mode withholding)", () => {
163
+ arrange(ExecutionPhase.EXECUTION_FAILED);
164
+ render(<WorkflowExecutionViewer executionId="wex_1" org="acme" />);
165
+ expect(screen.getByRole("button", { name: "Diagnose" })).toBeDefined();
166
+ });
167
+ });
168
+
169
+ describe("WorkflowExecutionViewer — observed panel state (uncontrolled + onPanelOpenChange)", () => {
170
+ it("reports chip toggles without taking control", () => {
171
+ arrange();
172
+ const seen: boolean[] = [];
173
+ render(
174
+ <WorkflowExecutionViewer
175
+ executionId="wex_1"
176
+ onPanelOpenChange={(open) => seen.push(open)}
177
+ />,
178
+ );
179
+
180
+ fireEvent.click(screen.getByRole("button", { name: "Show panel" }));
181
+ expect(seen).toEqual([true]);
182
+ fireEvent.click(screen.getByRole("button", { name: "Hide panel" }));
183
+ expect(seen).toEqual([true, false]);
184
+ });
185
+
186
+ it("starts open with defaultPanelOpen, without a spurious notification", () => {
187
+ arrange();
188
+ const onPanelOpenChange = vi.fn();
189
+ render(
190
+ <WorkflowExecutionViewer
191
+ executionId="wex_1"
192
+ defaultPanelOpen
193
+ onPanelOpenChange={onPanelOpenChange}
194
+ />,
195
+ );
196
+
197
+ expect(screen.getByRole("button", { name: "Hide panel" })).toBeDefined();
198
+ expect(onPanelOpenChange).not.toHaveBeenCalled();
199
+ });
200
+ });
201
+
202
+ describe("WorkflowExecutionViewer — controlled panel state", () => {
203
+ it("follows panelOpen and surfaces the chip's request without applying it", () => {
204
+ arrange();
205
+ const seen: boolean[] = [];
206
+ const onPanelOpenChange = (open: boolean) => seen.push(open);
207
+ const { rerender } = render(
208
+ <WorkflowExecutionViewer
209
+ executionId="wex_1"
210
+ panelOpen={false}
211
+ onPanelOpenChange={onPanelOpenChange}
212
+ />,
213
+ );
214
+
215
+ // The chip requests; the host owns the state — nothing moves yet.
216
+ fireEvent.click(screen.getByRole("button", { name: "Show panel" }));
217
+ expect(seen).toEqual([true]);
218
+ expect(screen.getByRole("button", { name: "Show panel" })).toBeDefined();
219
+
220
+ // The host grants the request: the panel opens and the chip flips.
221
+ rerender(
222
+ <WorkflowExecutionViewer
223
+ executionId="wex_1"
224
+ panelOpen={true}
225
+ onPanelOpenChange={onPanelOpenChange}
226
+ />,
227
+ );
228
+ expect(screen.getByRole("button", { name: "Hide panel" })).toBeDefined();
229
+ });
230
+ });
@@ -0,0 +1,178 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { renderHook, act } from "@testing-library/react";
3
+ import type { ReactNode } from "react";
4
+ import { ReactFlowProvider } from "@xyflow/react";
5
+ import type { Node } from "@xyflow/react";
6
+ import { useWorkflowCanvas } from "../useWorkflowCanvas";
7
+
8
+ // Regression tests for oss#609: isDirty was a model-reference comparison
9
+ // while graphToYaml serializes no positions. A position-only edit session
10
+ // (drag, auto-layout) armed Save and showed "Modified", but saving
11
+ // round-tripped byte-identical YAML — and because hosts reset the baseline
12
+ // by feeding saved YAML back through the `yaml` prop (string-change gated),
13
+ // the flag could never clear. Dirty now means "saving would change the
14
+ // document": position-only sessions never arm, content saves still clear
15
+ // through the yaml-prop feedback loop.
16
+
17
+ const FIXTURE_YAML = `apiVersion: agentic.stigmer.ai/v1
18
+ kind: Workflow
19
+ metadata:
20
+ name: dirty-fixture
21
+ spec:
22
+ document:
23
+ dsl: "1.0.0"
24
+ namespace: test
25
+ name: dirty-fixture
26
+ version: "0.0.1"
27
+ tasks:
28
+ - name: step_1
29
+ kind: agent_call
30
+ task_config:
31
+ agent: "org/agent-slug"
32
+ message: "first"
33
+ flow:
34
+ then: step_2
35
+ - name: step_2
36
+ kind: agent_call
37
+ task_config:
38
+ agent: "org/agent-slug"
39
+ message: "second"
40
+ flow:
41
+ then: end
42
+ `;
43
+
44
+ function wrapper({ children }: { children: ReactNode }) {
45
+ return <ReactFlowProvider>{children}</ReactFlowProvider>;
46
+ }
47
+
48
+ function renderCanvas() {
49
+ return renderHook(({ yaml }: { yaml: string }) => useWorkflowCanvas(yaml), {
50
+ initialProps: { yaml: FIXTURE_YAML },
51
+ wrapper,
52
+ });
53
+ }
54
+
55
+ type CanvasResult = ReturnType<typeof renderCanvas>["result"];
56
+
57
+ const DRAG_EVENT = {} as React.MouseEvent;
58
+
59
+ /** Drives one full drag gesture the way React Flow produces it. */
60
+ function drag(result: CanvasResult, id: string, to: { x: number; y: number }) {
61
+ const startNode = result.current.nodes.find((n) => n.id === id);
62
+ expect(startNode).toBeDefined();
63
+
64
+ act(() => {
65
+ result.current.onNodeDragStart(DRAG_EVENT, startNode!, [startNode!]);
66
+ });
67
+ act(() => {
68
+ result.current.onNodesChange([{ id, type: "position", position: to, dragging: true }]);
69
+ result.current.onNodesChange([{ id, type: "position", position: to, dragging: false }]);
70
+ });
71
+ const stopped: Node = { ...startNode!, position: to };
72
+ act(() => {
73
+ result.current.onNodeDragStop(DRAG_EVENT, stopped, [stopped]);
74
+ });
75
+ }
76
+
77
+ describe("useWorkflowCanvas — dirty semantics (oss#609)", () => {
78
+ it("a drag-only session is NOT dirty — saving it would change nothing", () => {
79
+ const { result } = renderCanvas();
80
+ expect(result.current.isDirty).toBe(false);
81
+
82
+ drag(result, "step_2", { x: 640, y: 480 });
83
+
84
+ // The drag IS in the model and undoable (oss#602)…
85
+ expect(result.current.canUndo).toBe(true);
86
+ // …but positions don't serialize, so the document is unchanged.
87
+ expect(result.current.isDirty).toBe(false);
88
+ });
89
+
90
+ it("an auto-layout-only session is NOT dirty", async () => {
91
+ const { result } = renderCanvas();
92
+
93
+ // Nudge a node off its dagre position first so auto-layout has real
94
+ // work to do (a no-op layout wouldn't even dispatch).
95
+ drag(result, "step_2", { x: 640, y: 480 });
96
+ await act(async () => {
97
+ await result.current.autoLayout();
98
+ });
99
+
100
+ expect(result.current.canUndo).toBe(true);
101
+ expect(result.current.isDirty).toBe(false);
102
+ });
103
+
104
+ it("a content edit IS dirty", () => {
105
+ const { result } = renderCanvas();
106
+
107
+ act(() => {
108
+ result.current.renameNode("step_1", "step_1_renamed");
109
+ });
110
+
111
+ expect(result.current.isDirty).toBe(true);
112
+ });
113
+
114
+ it("a content edit that is undone is NOT dirty again", () => {
115
+ const { result } = renderCanvas();
116
+
117
+ act(() => {
118
+ result.current.renameNode("step_1", "step_1_renamed");
119
+ });
120
+ expect(result.current.isDirty).toBe(true);
121
+
122
+ act(() => {
123
+ result.current.undo();
124
+ });
125
+ expect(result.current.isDirty).toBe(false);
126
+ });
127
+
128
+ it("the save feedback loop clears dirty: edit → serialize → feed back through the yaml prop", () => {
129
+ const { result, rerender } = renderCanvas();
130
+
131
+ act(() => {
132
+ result.current.renameNode("step_1", "step_1_renamed");
133
+ });
134
+ expect(result.current.isDirty).toBe(true);
135
+
136
+ // WorkflowEditorView's handleCanvasSave: serializeToYaml() → setYaml()
137
+ // → the string re-enters through the `yaml` prop and resets the baseline.
138
+ const saved = result.current.serializeToYaml();
139
+ expect(saved).not.toBeNull();
140
+ rerender({ yaml: saved! });
141
+
142
+ expect(result.current.isDirty).toBe(false);
143
+ });
144
+
145
+ it("drag + content edit is dirty; the save loop clears it even though positions never persist", () => {
146
+ const { result, rerender } = renderCanvas();
147
+
148
+ drag(result, "step_2", { x: 640, y: 480 });
149
+ act(() => {
150
+ result.current.renameNode("step_1", "step_1_renamed");
151
+ });
152
+ expect(result.current.isDirty).toBe(true);
153
+
154
+ const saved = result.current.serializeToYaml();
155
+ expect(saved).not.toBeNull();
156
+ rerender({ yaml: saved! });
157
+
158
+ // Pre-#609 this was the trap: the position delta kept the model
159
+ // reference unequal forever, so dirty survived its own save.
160
+ expect(result.current.isDirty).toBe(false);
161
+ });
162
+
163
+ it("cosmetic YAML formatting differences do not read as dirty", () => {
164
+ // Host YAML with extra blank lines / comments parses to the same model;
165
+ // the baseline is the canonical re-serialization, so the comparison is
166
+ // canonical-vs-canonical from the first render.
167
+ const cosmetic = `${FIXTURE_YAML}\n# trailing comment\n`;
168
+ const { result } = renderHook(({ yaml }: { yaml: string }) => useWorkflowCanvas(yaml), {
169
+ initialProps: { yaml: cosmetic },
170
+ wrapper,
171
+ });
172
+
173
+ expect(result.current.isDirty).toBe(false);
174
+
175
+ drag(result, "step_2", { x: 640, y: 480 });
176
+ expect(result.current.isDirty).toBe(false);
177
+ });
178
+ });
@@ -0,0 +1,224 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { renderHook, act } from "@testing-library/react";
3
+ import type { ReactNode } from "react";
4
+ import { ReactFlowProvider } from "@xyflow/react";
5
+ import type { Node } from "@xyflow/react";
6
+ import { useWorkflowCanvas } from "../useWorkflowCanvas";
7
+
8
+ // Regression tests for oss#602: node drags updated only React Flow's copy
9
+ // of positions — nothing wrote them back to the WorkflowGraphModel. Any
10
+ // later dispatch's syncFromModel snapped dragged nodes back to stale model
11
+ // positions, and drags were invisible to undo (inconsistent with
12
+ // auto-layout, which records a MoveNodesCommand). These tests drive the
13
+ // hook through the same event sequence React Flow produces: position
14
+ // changes stream through onNodesChange during the drag, then
15
+ // onNodeDragStop fires with the dragged nodes' final positions.
16
+
17
+ const FIXTURE_YAML = `apiVersion: agentic.stigmer.ai/v1
18
+ kind: Workflow
19
+ metadata:
20
+ name: drag-fixture
21
+ spec:
22
+ document:
23
+ dsl: "1.0.0"
24
+ namespace: test
25
+ name: drag-fixture
26
+ version: "0.0.1"
27
+ tasks:
28
+ - name: step_1
29
+ kind: agent_call
30
+ task_config:
31
+ agent: "org/agent-slug"
32
+ message: "first"
33
+ flow:
34
+ then: step_2
35
+ - name: step_2
36
+ kind: agent_call
37
+ task_config:
38
+ agent: "org/agent-slug"
39
+ message: "second"
40
+ flow:
41
+ then: end
42
+ `;
43
+
44
+ function wrapper({ children }: { children: ReactNode }) {
45
+ return <ReactFlowProvider>{children}</ReactFlowProvider>;
46
+ }
47
+
48
+ function renderCanvas() {
49
+ return renderHook(() => useWorkflowCanvas(FIXTURE_YAML), { wrapper });
50
+ }
51
+
52
+ type CanvasResult = ReturnType<typeof renderCanvas>["result"];
53
+
54
+ const DRAG_EVENT = {} as React.MouseEvent;
55
+
56
+ function canvasPosition(result: CanvasResult, id: string): { x: number; y: number } {
57
+ const node = result.current.nodes.find((n) => n.id === id);
58
+ expect(node).toBeDefined();
59
+ return { x: node!.position.x, y: node!.position.y };
60
+ }
61
+
62
+ function modelPosition(result: CanvasResult, id: string): { x: number; y: number } {
63
+ const node = result.current.graph?.nodes.find((n) => n.id === id);
64
+ expect(node).toBeDefined();
65
+ return { x: node!.position.x, y: node!.position.y };
66
+ }
67
+
68
+ /**
69
+ * Drives one full drag gesture the way React Flow does: dragStart with the
70
+ * node at its current position, position changes streamed through
71
+ * onNodesChange, then dragStop with the final positions.
72
+ */
73
+ function drag(result: CanvasResult, moves: readonly { id: string; to: { x: number; y: number } }[]) {
74
+ const startNodes = moves.map(({ id }) => {
75
+ const node = result.current.nodes.find((n) => n.id === id);
76
+ expect(node).toBeDefined();
77
+ return node!;
78
+ });
79
+
80
+ act(() => {
81
+ result.current.onNodeDragStart(DRAG_EVENT, startNodes[0], startNodes);
82
+ });
83
+ act(() => {
84
+ result.current.onNodesChange(
85
+ moves.map(({ id, to }) => ({ id, type: "position" as const, position: to, dragging: true })),
86
+ );
87
+ result.current.onNodesChange(
88
+ moves.map(({ id, to }) => ({ id, type: "position" as const, position: to, dragging: false })),
89
+ );
90
+ });
91
+
92
+ const stoppedNodes: Node[] = moves.map(({ id, to }, i) => ({
93
+ ...startNodes[i],
94
+ id,
95
+ position: to,
96
+ }));
97
+ act(() => {
98
+ result.current.onNodeDragStop(DRAG_EVENT, stoppedNodes[0], stoppedNodes);
99
+ });
100
+ }
101
+
102
+ describe("useWorkflowCanvas — drag → model sync (oss#602)", () => {
103
+ it("writes the dragged position into the graph model", () => {
104
+ const { result } = renderCanvas();
105
+ const target = { x: 640, y: 480 };
106
+
107
+ drag(result, [{ id: "step_2", to: target }]);
108
+
109
+ expect(modelPosition(result, "step_2")).toEqual(target);
110
+ expect(canvasPosition(result, "step_2")).toEqual(target);
111
+ });
112
+
113
+ it("a dragged position survives a later dispatch (the snap-back repro)", () => {
114
+ const { result } = renderCanvas();
115
+ const target = { x: 640, y: 480 };
116
+
117
+ drag(result, [{ id: "step_2", to: target }]);
118
+
119
+ // Any dispatch triggers syncFromModel, which rebuilds the canvas from
120
+ // the model — on main this snapped step_2 back to its stale position.
121
+ act(() => {
122
+ result.current.renameNode("step_1", "step_1_renamed");
123
+ });
124
+
125
+ expect(result.current.nodes.map((n) => n.id)).toContain("step_1_renamed");
126
+ expect(canvasPosition(result, "step_2")).toEqual(target);
127
+ expect(modelPosition(result, "step_2")).toEqual(target);
128
+ });
129
+
130
+ it("undo restores pre-drag positions on model AND canvas; redo reapplies", () => {
131
+ const { result } = renderCanvas();
132
+ const before = canvasPosition(result, "step_2");
133
+ const target = { x: 640, y: 480 };
134
+
135
+ drag(result, [{ id: "step_2", to: target }]);
136
+ expect(result.current.canUndo).toBe(true);
137
+
138
+ act(() => {
139
+ result.current.undo();
140
+ });
141
+ expect(modelPosition(result, "step_2")).toEqual(before);
142
+ expect(canvasPosition(result, "step_2")).toEqual(before);
143
+
144
+ act(() => {
145
+ result.current.redo();
146
+ });
147
+ expect(modelPosition(result, "step_2")).toEqual(target);
148
+ expect(canvasPosition(result, "step_2")).toEqual(target);
149
+ });
150
+
151
+ it("a multi-select drag is ONE history entry — a single undo restores the group", () => {
152
+ const { result } = renderCanvas();
153
+ const before1 = canvasPosition(result, "step_1");
154
+ const before2 = canvasPosition(result, "step_2");
155
+
156
+ drag(result, [
157
+ { id: "step_1", to: { x: 100, y: 700 } },
158
+ { id: "step_2", to: { x: 300, y: 700 } },
159
+ ]);
160
+ expect(modelPosition(result, "step_1")).toEqual({ x: 100, y: 700 });
161
+ expect(modelPosition(result, "step_2")).toEqual({ x: 300, y: 700 });
162
+
163
+ act(() => {
164
+ result.current.undo();
165
+ });
166
+ expect(modelPosition(result, "step_1")).toEqual(before1);
167
+ expect(modelPosition(result, "step_2")).toEqual(before2);
168
+ expect(result.current.canUndo).toBe(false);
169
+ });
170
+
171
+ it("a zero-delta drag records no history entry", () => {
172
+ const { result } = renderCanvas();
173
+ const before = canvasPosition(result, "step_2");
174
+
175
+ drag(result, [{ id: "step_2", to: before }]);
176
+
177
+ expect(result.current.canUndo).toBe(false);
178
+ });
179
+
180
+ it("selection survives a drag (record-only dispatch: no canvas rebuild)", () => {
181
+ const { result } = renderCanvas();
182
+
183
+ act(() => {
184
+ result.current.onNodesChange([{ id: "step_2", type: "select", selected: true }]);
185
+ });
186
+ expect(result.current.nodes.find((n) => n.id === "step_2")?.selected).toBe(true);
187
+
188
+ drag(result, [{ id: "step_2", to: { x: 640, y: 480 } }]);
189
+
190
+ // A syncing dispatch would rebuild the node array from the model and
191
+ // wipe React Flow's `selected` flags — the record-only invariant
192
+ // keeps the just-dragged node selected. Pinned so a refactor to the
193
+ // syncing dispatch() fails here.
194
+ expect(result.current.nodes.find((n) => n.id === "step_2")?.selected).toBe(true);
195
+ });
196
+
197
+ it("a drag invalidated by a mid-drag model mutation records nothing", () => {
198
+ const { result } = renderCanvas();
199
+ const startNode = result.current.nodes.find((n) => n.id === "step_2")!;
200
+
201
+ act(() => {
202
+ result.current.onNodeDragStart(DRAG_EVENT, startNode, [startNode]);
203
+ });
204
+ // A mutation lands while the mouse is still down (keyboard undo and
205
+ // the host's YAML prop are both reachable mid-drag). syncFromModel
206
+ // already rebuilt the canvas, so the drag has nothing valid to record.
207
+ act(() => {
208
+ result.current.renameNode("step_1", "step_1_renamed");
209
+ });
210
+ act(() => {
211
+ result.current.onNodeDragStop(DRAG_EVENT, { ...startNode, position: { x: 640, y: 480 } }, [
212
+ { ...startNode, position: { x: 640, y: 480 } },
213
+ ]);
214
+ });
215
+
216
+ expect(modelPosition(result, "step_2")).not.toEqual({ x: 640, y: 480 });
217
+
218
+ // Only the rename is in history: one undo drains it.
219
+ act(() => {
220
+ result.current.undo();
221
+ });
222
+ expect(result.current.canUndo).toBe(false);
223
+ });
224
+ });