@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
@@ -1,13 +1,13 @@
1
1
  "use client";
2
2
 
3
3
  import { useState, useCallback, useMemo, useRef, useEffect } from "react";
4
- import type { RefObject } from "react";
5
4
  import { useNodesState, useEdgesState, useReactFlow } from "@xyflow/react";
6
5
  import type {
7
6
  Node,
8
7
  Edge,
9
8
  OnNodesChange,
10
9
  OnEdgesChange,
10
+ OnNodeDrag,
11
11
  Connection,
12
12
  IsValidConnection,
13
13
  } from "@xyflow/react";
@@ -68,6 +68,20 @@ import type { LayoutEngine } from "./layout/index.js";
68
68
  import { serializeSelection, pasteClipboard } from "./clipboard.js";
69
69
  import type { ClipboardEntry } from "./clipboard.js";
70
70
 
71
+ /**
72
+ * Serializes a graph model to canonical YAML, or `null` if serialization
73
+ * fails. graphToYaml is total on models produced by yamlToGraph (its sort is
74
+ * cycle-protected and unknown kinds fall back to `unknown_N`), so `null` is
75
+ * a defensive outcome, not an expected one.
76
+ */
77
+ function serializeGraphOrNull(model: WorkflowGraphModel): string | null {
78
+ try {
79
+ return graphToYaml(model);
80
+ } catch {
81
+ return null;
82
+ }
83
+ }
84
+
71
85
  /** Selection state for the canvas inspector. */
72
86
  export interface CanvasSelection {
73
87
  readonly type: "node" | "edge";
@@ -91,6 +105,10 @@ export interface UseWorkflowCanvasReturn {
91
105
  readonly edges: Edge[];
92
106
  readonly onNodesChange: OnNodesChange;
93
107
  readonly onEdgesChange: OnEdgesChange;
108
+ /** Marks the model snapshot an in-flight drag started from. */
109
+ readonly onNodeDragStart: OnNodeDrag;
110
+ /** Records a completed node drag into the command history (oss#602). */
111
+ readonly onNodeDragStop: OnNodeDrag;
94
112
  readonly onConnect: (connection: Connection) => void;
95
113
  readonly isValidConnection: IsValidConnection;
96
114
  readonly onDrop: (event: React.DragEvent) => void;
@@ -165,19 +183,21 @@ export interface UseWorkflowCanvasReturn {
165
183
  * is derived from the model after each mutation.
166
184
  *
167
185
  * @param yaml - The workflow YAML to initialize from. Changes trigger re-parse.
168
- * @param containerRef - Ref to the canvas container for keyboard shortcut scoping.
169
186
  * @param options - Optional configuration including a custom layout engine.
170
187
  *
171
188
  * @since T15 (Visual Canvas Editor)
172
189
  */
173
190
  export function useWorkflowCanvas(
174
191
  yaml: string | null,
175
- containerRef: RefObject<HTMLDivElement | null>,
176
192
  options?: UseWorkflowCanvasOptions,
177
193
  ): UseWorkflowCanvasReturn {
178
194
  const [error, setError] = useState<string | null>(null);
179
195
  const [selection, setSelection] = useState<CanvasSelection | null>(null);
180
196
  const initialModelRef = useRef<WorkflowGraphModel | null>(null);
197
+ // Serialized form of the baseline model, kept in lockstep with
198
+ // initialModelRef. Dirty tracking compares serializations, not references —
199
+ // see the "Dirty tracking" section below for why.
200
+ const initialYamlRef = useRef<string | null>(null);
181
201
 
182
202
  const [nodes, setNodes, onNodesChangeRaw] = useNodesState([] as Node[]);
183
203
  const [edges, setEdges, onEdgesChangeRaw] = useEdgesState([] as Edge[]);
@@ -195,7 +215,7 @@ export function useWorkflowCanvas(
195
215
  }, [yaml]);
196
216
 
197
217
  // Set up graph history with the parsed model
198
- const history = useGraphHistory(parsedModel, containerRef);
218
+ const history = useGraphHistory(parsedModel);
199
219
 
200
220
  // Sync: when YAML changes, reset the history and RF elements
201
221
  useEffect(() => {
@@ -204,6 +224,7 @@ export function useWorkflowCanvas(
204
224
  setNodes([]);
205
225
  setEdges([]);
206
226
  initialModelRef.current = null;
227
+ initialYamlRef.current = null;
207
228
  return;
208
229
  }
209
230
 
@@ -212,6 +233,10 @@ export function useWorkflowCanvas(
212
233
  const laidOut = applyDagreLayout(parsed);
213
234
  history.reset(laidOut);
214
235
  initialModelRef.current = laidOut;
236
+ // Baseline is the canonical re-serialization, not the incoming string:
237
+ // dirty comparisons must be canonical-vs-canonical, immune to cosmetic
238
+ // formatting differences in host-provided YAML.
239
+ initialYamlRef.current = serializeGraphOrNull(laidOut);
215
240
  setError(null);
216
241
 
217
242
  const elements = toReactFlowElements(laidOut);
@@ -222,6 +247,7 @@ export function useWorkflowCanvas(
222
247
  setNodes([]);
223
248
  setEdges([]);
224
249
  initialModelRef.current = null;
250
+ initialYamlRef.current = null;
225
251
  }
226
252
  }, [yaml]);
227
253
 
@@ -255,6 +281,63 @@ export function useWorkflowCanvas(
255
281
  [onNodesChangeRaw],
256
282
  );
257
283
 
284
+ // During a drag, React Flow streams position changes into RF state only
285
+ // (via onNodesChange above); the model still holds the pre-drag
286
+ // positions. At drag stop, the completed gesture is recorded as ONE
287
+ // MoveNodesCommand — the auto-layout precedent — so drags survive
288
+ // later syncFromModel calls and are undoable (oss#602).
289
+ //
290
+ // The ref detects mid-drag model mutations: the keyboard undo listener
291
+ // and the host's YAML prop are both reachable while the mouse is down,
292
+ // and either one rebuilds the canvas from a model this drag never saw —
293
+ // recording the drag on top of that would fight the mutation.
294
+ const dragStartModelRef = useRef<WorkflowGraphModel | null>(null);
295
+
296
+ const onNodeDragStart: OnNodeDrag = useCallback(() => {
297
+ dragStartModelRef.current = history.currentModel;
298
+ }, [history.currentModel]);
299
+
300
+ const onNodeDragStop: OnNodeDrag = useCallback(
301
+ (_event, _node, draggedNodes) => {
302
+ const model = history.currentModel;
303
+ const startModel = dragStartModelRef.current;
304
+ dragStartModelRef.current = null;
305
+ if (!startModel || model !== startModel) return;
306
+
307
+ const oldPositions: { id: string; x: number; y: number }[] = [];
308
+ const newPositions: { id: string; x: number; y: number }[] = [];
309
+ for (const dragged of draggedNodes) {
310
+ const modelNode = model.nodes.find((n) => n.id === dragged.id);
311
+ if (!modelNode) continue;
312
+ oldPositions.push({
313
+ id: modelNode.id,
314
+ x: modelNode.position.x,
315
+ y: modelNode.position.y,
316
+ });
317
+ newPositions.push({
318
+ id: dragged.id,
319
+ x: dragged.position.x,
320
+ y: dragged.position.y,
321
+ });
322
+ }
323
+
324
+ const hasChanges = newPositions.some((np, i) => {
325
+ const op = oldPositions[i];
326
+ return Math.abs(op.x - np.x) > 0.5 || Math.abs(op.y - np.y) > 0.5;
327
+ });
328
+ if (!hasChanges) return;
329
+
330
+ // Record-only dispatch — deliberately NOT the syncing dispatch().
331
+ // React Flow already renders the dragged positions, so here the
332
+ // model catches up to the canvas (everywhere else the model leads
333
+ // and syncFromModel makes the canvas follow). Rebuilding the node
334
+ // array would be a visual no-op that wipes React Flow's `selected`
335
+ // flags at the end of every drag, breaking consecutive group drags.
336
+ history.dispatch(new MoveNodesCommand(oldPositions, newPositions));
337
+ },
338
+ [history.currentModel, history.dispatch],
339
+ );
340
+
258
341
  const onEdgesChange: OnEdgesChange = useCallback(
259
342
  (changes) => {
260
343
  onEdgesChangeRaw(changes);
@@ -390,6 +473,7 @@ export function useWorkflowCanvas(
390
473
  };
391
474
  history.reset(bootstrapModel);
392
475
  initialModelRef.current = bootstrapModel;
476
+ initialYamlRef.current = serializeGraphOrNull(bootstrapModel);
393
477
 
394
478
  const autoEdge = {
395
479
  id: generateEdgeId(),
@@ -1083,31 +1167,49 @@ export function useWorkflowCanvas(
1083
1167
  // Undo / Redo (delegates to history, then syncs RF)
1084
1168
  // ---------------------------------------------------------------------------
1085
1169
 
1170
+ // Sync from the model RETURNED by the mutation, mirroring dispatch().
1171
+ // `history.currentModel` is a render-time snapshot — reading it here
1172
+ // after undo()/redo() yields the PRE-mutation model (oss#588: the
1173
+ // canvas re-rendered the still-deleted graph while the inspector,
1174
+ // reading state on the next render, showed the restored node).
1086
1175
  const undo = useCallback(() => {
1087
- history.undo();
1088
- syncFromModel(history.currentModel);
1089
- }, [history, syncFromModel]);
1176
+ const next = history.undo();
1177
+ if (next) syncFromModel(next);
1178
+ }, [history.undo, syncFromModel]);
1090
1179
 
1091
1180
  const redo = useCallback(() => {
1092
- history.redo();
1093
- syncFromModel(history.currentModel);
1094
- }, [history, syncFromModel]);
1181
+ const next = history.redo();
1182
+ if (next) syncFromModel(next);
1183
+ }, [history.redo, syncFromModel]);
1095
1184
 
1096
1185
  // ---------------------------------------------------------------------------
1097
- // Dirty tracking: model reference comparison
1186
+ // Dirty tracking: serialization comparison (oss#609)
1187
+ //
1188
+ // Dirty means "saving would change the document". Node positions are not
1189
+ // part of the serialized YAML (dagre recomputes them on every load), so a
1190
+ // position-only edit session (drags, auto-layout) must NOT read as dirty:
1191
+ // its save would round-trip byte-identical YAML, and because hosts reset
1192
+ // the baseline by feeding saved YAML back through the `yaml` prop (whose
1193
+ // re-parse effect is string-change gated), a reference-based flag could
1194
+ // never clear afterwards — an armed Save button that saving cannot disarm.
1195
+ // graphToYaml is total on parsed models (cycle-protected sort, unknown-kind
1196
+ // fallback) and O(nodes+edges), cheap enough to compare per model change.
1098
1197
  // ---------------------------------------------------------------------------
1099
1198
 
1100
1199
  const graph = history.currentModel.nodes.length > 0 ? history.currentModel : null;
1101
- const isDirty = initialModelRef.current !== null && graph !== initialModelRef.current;
1200
+ const currentYaml = useMemo(
1201
+ () => (graph ? serializeGraphOrNull(graph) : null),
1202
+ [graph],
1203
+ );
1204
+ // Reference comparison remains as the fallback for the defensive case where
1205
+ // serialization failed (null); failing dirty-side keeps Save reachable.
1206
+ const isDirty =
1207
+ initialModelRef.current !== null &&
1208
+ (currentYaml !== null && initialYamlRef.current !== null
1209
+ ? currentYaml !== initialYamlRef.current
1210
+ : graph !== initialModelRef.current);
1102
1211
 
1103
- const serializeToYaml = useCallback((): string | null => {
1104
- if (!graph) return null;
1105
- try {
1106
- return graphToYaml(graph);
1107
- } catch {
1108
- return null;
1109
- }
1110
- }, [graph]);
1212
+ const serializeToYaml = useCallback((): string | null => currentYaml, [currentYaml]);
1111
1213
 
1112
1214
  return useMemo(
1113
1215
  () => ({
@@ -1115,6 +1217,8 @@ export function useWorkflowCanvas(
1115
1217
  edges,
1116
1218
  onNodesChange,
1117
1219
  onEdgesChange,
1220
+ onNodeDragStart,
1221
+ onNodeDragStop,
1118
1222
  onConnect,
1119
1223
  isValidConnection,
1120
1224
  onDrop,
@@ -1172,7 +1276,8 @@ export function useWorkflowCanvas(
1172
1276
  getSelectedNodeIds,
1173
1277
  }),
1174
1278
  [
1175
- nodes, edges, onNodesChange, onEdgesChange, onConnect,
1279
+ nodes, edges, onNodesChange, onEdgesChange, onNodeDragStart,
1280
+ onNodeDragStop, onConnect,
1176
1281
  isValidConnection, onDrop, onDragOver, onNodesDelete, onEdgesDelete,
1177
1282
  selection, selectNode, selectEdge, clearSelection, autoLayout,
1178
1283
  undo, redo, history.canUndo, history.canRedo, isDirty, graph, error,
@@ -3,7 +3,7 @@
3
3
  // State + actions for the workflow execution viewer's WorkspaceSurface panel.
4
4
  // Domain: workflow (the lean analog of session/useSessionPanel).
5
5
 
6
- import { useCallback, useMemo, useState } from "react";
6
+ import { useCallback, useMemo, useRef, useState } from "react";
7
7
  import type { Artifact } from "@stigmer/protos/ai/stigmer/agentic/artifact/v1/api_pb";
8
8
  import type { FileChange } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/message_pb";
9
9
  import {
@@ -50,7 +50,11 @@ export function workflowArtifactTabPath(artifact: Artifact): string {
50
50
  export interface WorkflowExecutionPanelController {
51
51
  /** The open-editor group store; subscribe with `useWorkspaceEditors`. */
52
52
  readonly editorsStore: WorkspaceEditorsStore;
53
- /** Whether the panel is expanded or collapsed to the chip. */
53
+ /**
54
+ * Whether the panel is expanded or collapsed to the chip. In controlled
55
+ * mode ({@link UseWorkflowExecutionPanelOptions.open}) this mirrors the
56
+ * host's value.
57
+ */
54
58
  readonly isOpen: boolean;
55
59
  /** The active rail view id (an injected facet — `"artifacts"` today). */
56
60
  readonly view: string;
@@ -119,6 +123,38 @@ export interface UseWorkflowExecutionPanelOptions {
119
123
  * @default "artifacts"
120
124
  */
121
125
  readonly defaultView?: string;
126
+ /**
127
+ * Controlled open state. When provided, the host owns whether the panel is
128
+ * expanded: internal open intents (the chip toggle, Diagnose, an
129
+ * artifact/file-change/file open) no longer flip state themselves — they
130
+ * surface through {@link UseWorkflowExecutionPanelOptions.onOpenChange}
131
+ * and the panel follows this value. Leave `undefined` for the
132
+ * self-managing default. The same seam `useSessionPanel` carries (#651);
133
+ * kept domain-local, like the controllers themselves.
134
+ */
135
+ readonly open?: boolean;
136
+ /**
137
+ * Initial open state in uncontrolled mode. Ignored when
138
+ * {@link UseWorkflowExecutionPanelOptions.open} is provided.
139
+ *
140
+ * @default false
141
+ */
142
+ readonly defaultOpen?: boolean;
143
+ /**
144
+ * Called on every effective open/close transition — in BOTH modes,
145
+ * matching `useSessionPanel`'s convention (and departing from
146
+ * `useDetailTabs`'s DD-T05A-001 for the same principled reason): this
147
+ * panel opens ITSELF (`openDiagnosis`, `openArtifact`, `openFileChange`,
148
+ * `openFile` all expand a collapsed panel), and an embedding host that
149
+ * must react to those moments — widen a dock, make room for a diagnosis
150
+ * conversation — has no other seam. Passing only this callback observes
151
+ * the panel without controlling it.
152
+ *
153
+ * In controlled mode this fires once per open/close REQUEST (the host may
154
+ * decline by not updating `open` — a later identical request re-fires); in
155
+ * uncontrolled mode it fires once per actual transition.
156
+ */
157
+ readonly onOpenChange?: (open: boolean) => void;
122
158
  }
123
159
 
124
160
  /**
@@ -126,13 +162,59 @@ export interface UseWorkflowExecutionPanelOptions {
126
162
  */
127
163
  export function useWorkflowExecutionPanel({
128
164
  defaultView = "artifacts",
165
+ open,
166
+ defaultOpen = false,
167
+ onOpenChange,
129
168
  }: UseWorkflowExecutionPanelOptions = {}): WorkflowExecutionPanelController {
130
169
  const editorsStore = useWorkspaceEditorsStoreRef();
131
- const [isOpen, setIsOpen] = useState(false);
170
+
171
+ // Uncontrolled-by-default / controlled-when-`open`-is-provided (React's own
172
+ // value/defaultValue convention — presence of the value prop decides, so an
173
+ // observe-only host can pass just `onOpenChange`). Same shape as
174
+ // `useSessionPanel`; re-transcribed rather than extracted because the
175
+ // controllers are deliberately not shared (see the interface doc above).
176
+ const isControlled = open !== undefined;
177
+ const [internalIsOpen, setInternalIsOpen] = useState(defaultOpen);
178
+ const isOpen = isControlled ? open : internalIsOpen;
179
+
180
+ // Latest-ref idiom: the host's callback and the mode/value mirrors live in
181
+ // refs so `requestOpenChange` — and every action callback built on it —
182
+ // stays referentially stable regardless of how the host authored
183
+ // `onOpenChange` (DD-010: an inline lambda must not churn the memoized
184
+ // controller and re-render the panel subtree).
185
+ const onOpenChangeRef = useRef(onOpenChange);
186
+ onOpenChangeRef.current = onOpenChange;
187
+ const isControlledRef = useRef(isControlled);
188
+ isControlledRef.current = isControlled;
189
+ const isOpenRef = useRef(isOpen);
190
+ isOpenRef.current = isOpen;
191
+
192
+ // The single seam every open/close intent routes through — the chip
193
+ // toggle, Diagnose, artifact/file-change/file opens, and the surface's
194
+ // collapse affordance. Uncontrolled: apply + notify (the ref is updated
195
+ // eagerly so two same-tick intents produce one notification). Controlled:
196
+ // notify only — the host owns the state, and the panel follows the `open`
197
+ // prop; the ref is NOT updated, so a declined request stays re-fireable.
198
+ const requestOpenChange = useCallback((next: boolean) => {
199
+ if (isOpenRef.current === next) return;
200
+ if (!isControlledRef.current) {
201
+ isOpenRef.current = next;
202
+ setInternalIsOpen(next);
203
+ }
204
+ onOpenChangeRef.current?.(next);
205
+ }, []);
206
+
132
207
  const [view, setViewState] = useState(defaultView);
133
208
 
134
- const openPanel = useCallback(() => setIsOpen(true), []);
135
- const closePanel = useCallback(() => setIsOpen(false), []);
209
+ const openPanel = useCallback(
210
+ () => requestOpenChange(true),
211
+ [requestOpenChange],
212
+ );
213
+
214
+ const closePanel = useCallback(
215
+ () => requestOpenChange(false),
216
+ [requestOpenChange],
217
+ );
136
218
 
137
219
  const setView = useCallback((viewId: string) => setViewState(viewId), []);
138
220
 
@@ -141,15 +223,15 @@ export function useWorkflowExecutionPanel({
141
223
  DIAGNOSIS_DOCUMENT_ENTRY_ID,
142
224
  DIAGNOSIS_DOCUMENT_PATH,
143
225
  );
144
- setIsOpen(true);
145
- }, [editorsStore]);
226
+ requestOpenChange(true);
227
+ }, [editorsStore, requestOpenChange]);
146
228
 
147
229
  const openFile = useCallback(
148
230
  (entryId: string, path: string, options?: OpenFileOptions) => {
149
231
  editorsStore.openPreview(entryId, path, options);
150
- setIsOpen(true);
232
+ requestOpenChange(true);
151
233
  },
152
- [editorsStore],
234
+ [editorsStore, requestOpenChange],
153
235
  );
154
236
 
155
237
  const openArtifact = useCallback(
@@ -158,9 +240,9 @@ export function useWorkflowExecutionPanel({
158
240
  ARTIFACT_DOCUMENT_ENTRY_ID,
159
241
  workflowArtifactTabPath(artifact),
160
242
  );
161
- setIsOpen(true);
243
+ requestOpenChange(true);
162
244
  },
163
- [editorsStore],
245
+ [editorsStore, requestOpenChange],
164
246
  );
165
247
 
166
248
  const pinArtifact = useCallback(
@@ -179,9 +261,9 @@ export function useWorkflowExecutionPanel({
179
261
  FILE_CHANGE_DOCUMENT_ENTRY_ID,
180
262
  fileChangeTabPath(change),
181
263
  );
182
- setIsOpen(true);
264
+ requestOpenChange(true);
183
265
  },
184
- [editorsStore],
266
+ [editorsStore, requestOpenChange],
185
267
  );
186
268
 
187
269
  const pinFileChange = useCallback(
@@ -2,6 +2,7 @@
2
2
 
3
3
  import { useCallback, useMemo, useRef, useState } from "react";
4
4
  import { useStigmer } from "../hooks.js";
5
+ import { isUnimplemented } from "../internal/isUnimplemented.js";
5
6
  import { parseWorkflowYaml } from "./serialize-workflow-yaml.js";
6
7
 
7
8
  /** Options for a single save invocation. */
@@ -57,7 +58,7 @@ export function useWorkflowSave(org: string): UseWorkflowSaveReturn {
57
58
  const wrapped =
58
59
  err instanceof Error ? err : new Error(String(err));
59
60
 
60
- if (isUnimplementedError(err)) {
61
+ if (isUnimplemented(err)) {
61
62
  setError(
62
63
  new Error(
63
64
  "Workflow save is not yet available on this server. " +
@@ -77,17 +78,3 @@ export function useWorkflowSave(org: string): UseWorkflowSaveReturn {
77
78
 
78
79
  return useMemo(() => ({ save, isSaving, error }), [save, isSaving, error]);
79
80
  }
80
-
81
- /**
82
- * Detect gRPC UNIMPLEMENTED (code 12) from a Connect error or
83
- * a StigmerError wrapping one. The SDK's CODE_MAP doesn't include
84
- * Unimplemented so it surfaces as "unknown" — check connectCode.
85
- */
86
- function isUnimplementedError(err: unknown): boolean {
87
- if (!err || typeof err !== "object") return false;
88
- if ("connectCode" in err && (err as { connectCode: number }).connectCode === 12) {
89
- return true;
90
- }
91
- const msg = (err as { message?: string }).message ?? "";
92
- return msg.includes("[unimplemented]") || msg.includes("UNIMPLEMENTED");
93
- }
@@ -58,6 +58,22 @@ export function taskKindToString(kind: WorkflowTaskKind): string {
58
58
  return TASK_KIND_STRINGS.get(kind) ?? `unknown_${kind}`;
59
59
  }
60
60
 
61
+ /**
62
+ * Canonical kind key for a graph node.
63
+ *
64
+ * Task nodes resolve to their `WorkflowTaskKind` enum name; the start/end
65
+ * sentinels resolve to their pseudo-kind (`__start__` / `__end__`), which
66
+ * doubles as their node id and their key in the visual registry. Sentinels
67
+ * carry enum value 0, which `taskKindToString` would render as its internal
68
+ * `unknown_*` fallback — routing them through here keeps that fallback out
69
+ * of every user-visible surface (oss#581).
70
+ */
71
+ export function graphNodeKindString(node: WorkflowGraphNode): string {
72
+ return node.id === START_NODE_ID || node.id === END_NODE_ID
73
+ ? node.id
74
+ : taskKindToString(node.kind);
75
+ }
76
+
61
77
  export function stringToTaskKind(str: string): WorkflowTaskKind {
62
78
  return STRING_TO_TASK_KIND.get(str) ?? WorkflowTaskKind.workflow_task_kind_unspecified;
63
79
  }
@@ -148,7 +164,6 @@ export function yamlToGraph(yaml: string): WorkflowGraphModel {
148
164
  for (const task of tasks) {
149
165
  const config = (task.task_config ?? task.taskConfig ?? {}) as JsonObject;
150
166
  const kindEnum = stringToTaskKind(task.kind);
151
- const kindStr = kindEnum !== WorkflowTaskKind.workflow_task_kind_unspecified ? task.kind : task.kind;
152
167
 
153
168
  nodes.push({
154
169
  id: task.name,
@@ -469,6 +484,13 @@ export interface NodeExecutionState {
469
484
  export interface CanvasTaskNodeData extends Record<string, unknown> {
470
485
  taskName: string;
471
486
  kind: WorkflowTaskKind;
487
+ /**
488
+ * Canonical kind key (see {@link graphNodeKindString}): the
489
+ * `WorkflowTaskKind` enum name for task nodes, or the `__start__` /
490
+ * `__end__` pseudo-kind for sentinels — never `taskKindToString`'s
491
+ * internal `unknown_*` fallback. Rendered as the `data-task-kind` DOM
492
+ * attribute on task nodes only; sentinels omit that attribute.
493
+ */
472
494
  kindString: string;
473
495
  category: TopologyNodeCategory;
474
496
  visualClass: VisualClass;
@@ -511,8 +533,8 @@ export function toReactFlowElements(graph: WorkflowGraphModel): {
511
533
  } {
512
534
  const nodes: Node[] = graph.nodes.map((node) => {
513
535
  const isSentinel = node.id === START_NODE_ID || node.id === END_NODE_ID;
514
- const kindString = taskKindToString(node.kind);
515
- const visualSpec = getVisualSpec(isSentinel ? node.id : kindString);
536
+ const kindString = graphNodeKindString(node);
537
+ const visualSpec = getVisualSpec(kindString);
516
538
  return {
517
539
  id: node.id,
518
540
  type: CANVAS_TASK_NODE_TYPE,