@stigmer/react 3.11.0 → 3.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (559) hide show
  1. package/activity/useRecentActivity.d.ts +3 -2
  2. package/activity/useRecentActivity.d.ts.map +1 -1
  3. package/activity/useRecentActivity.js +3 -2
  4. package/activity/useRecentActivity.js.map +1 -1
  5. package/agent/AgentDetailView.d.ts +2 -12
  6. package/agent/AgentDetailView.d.ts.map +1 -1
  7. package/agent/AgentDetailView.js +10 -42
  8. package/agent/AgentDetailView.js.map +1 -1
  9. package/agent/internal/agentToInput.d.ts.map +1 -1
  10. package/agent/internal/agentToInput.js +0 -8
  11. package/agent/internal/agentToInput.js.map +1 -1
  12. package/agent-instance/AgentInstanceList.d.ts.map +1 -1
  13. package/agent-instance/AgentInstanceList.js +2 -1
  14. package/agent-instance/AgentInstanceList.js.map +1 -1
  15. package/api-key/ApiKeyListPanel.d.ts.map +1 -1
  16. package/api-key/ApiKeyListPanel.js +2 -1
  17. package/api-key/ApiKeyListPanel.js.map +1 -1
  18. package/attachment/AttachmentChipList.d.ts.map +1 -1
  19. package/attachment/AttachmentChipList.js +9 -8
  20. package/attachment/AttachmentChipList.js.map +1 -1
  21. package/attachment/AttachmentImageLightbox.d.ts.map +1 -1
  22. package/attachment/AttachmentImageLightbox.js +1 -1
  23. package/attachment/AttachmentImageLightbox.js.map +1 -1
  24. package/channel/AgentChannelsPanel.d.ts.map +1 -1
  25. package/channel/AgentChannelsPanel.js +2 -1
  26. package/channel/AgentChannelsPanel.js.map +1 -1
  27. package/channel/ChannelConversationsDialog.d.ts.map +1 -1
  28. package/channel/ChannelConversationsDialog.js +2 -1
  29. package/channel/ChannelConversationsDialog.js.map +1 -1
  30. package/channel/ChannelTemplatesDialog.d.ts.map +1 -1
  31. package/channel/ChannelTemplatesDialog.js +2 -1
  32. package/channel/ChannelTemplatesDialog.js.map +1 -1
  33. package/channel-app/internal.d.ts.map +1 -1
  34. package/channel-app/internal.js +2 -1
  35. package/channel-app/internal.js.map +1 -1
  36. package/composer/ComposerToolbar.d.ts.map +1 -1
  37. package/composer/ComposerToolbar.js +10 -7
  38. package/composer/ComposerToolbar.js.map +1 -1
  39. package/composer/ConfigureMenu.d.ts.map +1 -1
  40. package/composer/ConfigureMenu.js +2 -1
  41. package/composer/ConfigureMenu.js.map +1 -1
  42. package/composer/ContextChip.d.ts.map +1 -1
  43. package/composer/ContextChip.js +2 -1
  44. package/composer/ContextChip.js.map +1 -1
  45. package/composer/ContextPopover.d.ts.map +1 -1
  46. package/composer/ContextPopover.js +2 -1
  47. package/composer/ContextPopover.js.map +1 -1
  48. package/composer/SessionComposer.d.ts +13 -0
  49. package/composer/SessionComposer.d.ts.map +1 -1
  50. package/composer/SessionComposer.js +12 -2
  51. package/composer/SessionComposer.js.map +1 -1
  52. package/conversation/ConversationMediaAttachment.d.ts.map +1 -1
  53. package/conversation/ConversationMediaAttachment.js +2 -1
  54. package/conversation/ConversationMediaAttachment.js.map +1 -1
  55. package/conversation/ConversationTimelineView.d.ts.map +1 -1
  56. package/conversation/ConversationTimelineView.js +14 -4
  57. package/conversation/ConversationTimelineView.js.map +1 -1
  58. package/conversation/conversationPresentation.d.ts +28 -0
  59. package/conversation/conversationPresentation.d.ts.map +1 -1
  60. package/conversation/conversationPresentation.js +38 -1
  61. package/conversation/conversationPresentation.js.map +1 -1
  62. package/cursor-accounts/MemberCoverageTable.d.ts.map +1 -1
  63. package/cursor-accounts/MemberCoverageTable.js +6 -5
  64. package/cursor-accounts/MemberCoverageTable.js.map +1 -1
  65. package/dashboard/DashboardKPICards.d.ts.map +1 -1
  66. package/dashboard/DashboardKPICards.js +3 -1
  67. package/dashboard/DashboardKPICards.js.map +1 -1
  68. package/dependency-graph/DependencyTreeNode.d.ts.map +1 -1
  69. package/dependency-graph/DependencyTreeNode.js +1 -7
  70. package/dependency-graph/DependencyTreeNode.js.map +1 -1
  71. package/dependency-graph/types.d.ts +8 -20
  72. package/dependency-graph/types.d.ts.map +1 -1
  73. package/dependency-graph/useDependencyGraph.d.ts.map +1 -1
  74. package/dependency-graph/useDependencyGraph.js +2 -20
  75. package/dependency-graph/useDependencyGraph.js.map +1 -1
  76. package/environment/EnvironmentVariableEditor.d.ts.map +1 -1
  77. package/environment/EnvironmentVariableEditor.js +2 -1
  78. package/environment/EnvironmentVariableEditor.js.map +1 -1
  79. package/execution/ApprovalCard.d.ts.map +1 -1
  80. package/execution/ApprovalCard.js +1 -1
  81. package/execution/ApprovalCard.js.map +1 -1
  82. package/execution/ArtifactRowView.d.ts.map +1 -1
  83. package/execution/ArtifactRowView.js +2 -1
  84. package/execution/ArtifactRowView.js.map +1 -1
  85. package/execution/FilePathLink.d.ts +4 -4
  86. package/execution/FilePathLink.d.ts.map +1 -1
  87. package/execution/FilePathLink.js +4 -4
  88. package/execution/FilePathLink.js.map +1 -1
  89. package/execution/McpToolDetail.d.ts.map +1 -1
  90. package/execution/McpToolDetail.js +2 -1
  91. package/execution/McpToolDetail.js.map +1 -1
  92. package/execution/MessageAttachments.d.ts.map +1 -1
  93. package/execution/MessageAttachments.js +10 -8
  94. package/execution/MessageAttachments.js.map +1 -1
  95. package/execution/MessageEntry.d.ts.map +1 -1
  96. package/execution/MessageEntry.js +2 -1
  97. package/execution/MessageEntry.js.map +1 -1
  98. package/execution/PlanArtifactCard.d.ts.map +1 -1
  99. package/execution/PlanArtifactCard.js +7 -4
  100. package/execution/PlanArtifactCard.js.map +1 -1
  101. package/execution/ToolCallDetail.d.ts.map +1 -1
  102. package/execution/ToolCallDetail.js +1 -1
  103. package/execution/ToolCallDetail.js.map +1 -1
  104. package/execution/ToolCallItem.d.ts.map +1 -1
  105. package/execution/ToolCallItem.js +5 -1
  106. package/execution/ToolCallItem.js.map +1 -1
  107. package/execution/WriteBackCard.d.ts.map +1 -1
  108. package/execution/WriteBackCard.js +6 -4
  109. package/execution/WriteBackCard.js.map +1 -1
  110. package/execution/artifact-row-item.d.ts +1 -1
  111. package/execution/artifact-row-item.d.ts.map +1 -1
  112. package/file-reference/FileReferenceChipList.d.ts.map +1 -1
  113. package/file-reference/FileReferenceChipList.js +6 -1
  114. package/file-reference/FileReferenceChipList.js.map +1 -1
  115. package/iam-policy/OrgMembersPanel.d.ts.map +1 -1
  116. package/iam-policy/OrgMembersPanel.js +6 -5
  117. package/iam-policy/OrgMembersPanel.js.map +1 -1
  118. package/iam-policy/ProviderBadge.d.ts.map +1 -1
  119. package/iam-policy/ProviderBadge.js +3 -2
  120. package/iam-policy/ProviderBadge.js.map +1 -1
  121. package/iam-policy/RoleSelector.d.ts.map +1 -1
  122. package/iam-policy/RoleSelector.js +1 -1
  123. package/iam-policy/RoleSelector.js.map +1 -1
  124. package/identity-provider/IdentityProviderListPanel.d.ts.map +1 -1
  125. package/identity-provider/IdentityProviderListPanel.js +2 -1
  126. package/identity-provider/IdentityProviderListPanel.js.map +1 -1
  127. package/index.d.ts +0 -2
  128. package/index.d.ts.map +1 -1
  129. package/index.js +0 -6
  130. package/index.js.map +1 -1
  131. package/internal/truncated-text.d.ts +17 -0
  132. package/internal/truncated-text.d.ts.map +1 -0
  133. package/internal/truncated-text.js +27 -0
  134. package/internal/truncated-text.js.map +1 -0
  135. package/invitation/InvitationManager.d.ts.map +1 -1
  136. package/invitation/InvitationManager.js +4 -3
  137. package/invitation/InvitationManager.js.map +1 -1
  138. package/library/ScopeToggle.d.ts.map +1 -1
  139. package/library/ScopeToggle.js +10 -2
  140. package/library/ScopeToggle.js.map +1 -1
  141. package/library/VisibilitySelector.d.ts.map +1 -1
  142. package/library/VisibilitySelector.js +2 -1
  143. package/library/VisibilitySelector.js.map +1 -1
  144. package/library/useExportResource.d.ts +3 -4
  145. package/library/useExportResource.d.ts.map +1 -1
  146. package/library/useExportResource.js +1 -1
  147. package/library/useExportResource.js.map +1 -1
  148. package/manifest/EditResourceYamlDialog.d.ts.map +1 -1
  149. package/manifest/EditResourceYamlDialog.js.map +1 -1
  150. package/mcp-server/McpServerConfigPanel.d.ts +30 -1
  151. package/mcp-server/McpServerConfigPanel.d.ts.map +1 -1
  152. package/mcp-server/McpServerConfigPanel.js +18 -8
  153. package/mcp-server/McpServerConfigPanel.js.map +1 -1
  154. package/mcp-server/McpServerConnectDialog.d.ts +12 -1
  155. package/mcp-server/McpServerConnectDialog.d.ts.map +1 -1
  156. package/mcp-server/McpServerConnectDialog.js +8 -7
  157. package/mcp-server/McpServerConnectDialog.js.map +1 -1
  158. package/mcp-server/McpServerDetailView.d.ts.map +1 -1
  159. package/mcp-server/McpServerDetailView.js +4 -4
  160. package/mcp-server/McpServerDetailView.js.map +1 -1
  161. package/mcp-server/McpServerPicker.d.ts.map +1 -1
  162. package/mcp-server/McpServerPicker.js +86 -5
  163. package/mcp-server/McpServerPicker.js.map +1 -1
  164. package/mcp-server/McpToolSelector.d.ts.map +1 -1
  165. package/mcp-server/McpToolSelector.js +2 -1
  166. package/mcp-server/McpToolSelector.js.map +1 -1
  167. package/mcp-server/VendorApprovalBlockedNotice.d.ts +77 -0
  168. package/mcp-server/VendorApprovalBlockedNotice.d.ts.map +1 -0
  169. package/mcp-server/VendorApprovalBlockedNotice.js +62 -0
  170. package/mcp-server/VendorApprovalBlockedNotice.js.map +1 -0
  171. package/mcp-server/mcpServerSetupReducer.d.ts +18 -0
  172. package/mcp-server/mcpServerSetupReducer.d.ts.map +1 -1
  173. package/mcp-server/mcpServerSetupReducer.js +6 -0
  174. package/mcp-server/mcpServerSetupReducer.js.map +1 -1
  175. package/mcp-server/useMcpServerSetup.d.ts.map +1 -1
  176. package/mcp-server/useMcpServerSetup.js +7 -0
  177. package/mcp-server/useMcpServerSetup.js.map +1 -1
  178. package/oauth-app/OAuthAppListPanel.d.ts.map +1 -1
  179. package/oauth-app/OAuthAppListPanel.js +2 -1
  180. package/oauth-app/OAuthAppListPanel.js.map +1 -1
  181. package/package.json +4 -4
  182. package/platform-client/PlatformClientListPanel.d.ts.map +1 -1
  183. package/platform-client/PlatformClientListPanel.js +3 -2
  184. package/platform-client/PlatformClientListPanel.js.map +1 -1
  185. package/pricing-governance/BaselineEditor.d.ts.map +1 -1
  186. package/pricing-governance/BaselineEditor.js +7 -1
  187. package/pricing-governance/BaselineEditor.js.map +1 -1
  188. package/pricing-governance/ModelCatalogPanel.d.ts.map +1 -1
  189. package/pricing-governance/ModelCatalogPanel.js +2 -1
  190. package/pricing-governance/ModelCatalogPanel.js.map +1 -1
  191. package/pricing-governance/PricingGovernanceConsole.d.ts.map +1 -1
  192. package/pricing-governance/PricingGovernanceConsole.js +2 -1
  193. package/pricing-governance/PricingGovernanceConsole.js.map +1 -1
  194. package/pricing-governance/PricingGovernancePanel.d.ts.map +1 -1
  195. package/pricing-governance/PricingGovernancePanel.js +2 -1
  196. package/pricing-governance/PricingGovernancePanel.js.map +1 -1
  197. package/resource-workbench/components/StatusBadge.d.ts.map +1 -1
  198. package/resource-workbench/components/StatusBadge.js +2 -1
  199. package/resource-workbench/components/StatusBadge.js.map +1 -1
  200. package/schedule/CadenceField.d.ts.map +1 -1
  201. package/schedule/CadenceField.js +15 -8
  202. package/schedule/CadenceField.js.map +1 -1
  203. package/schedule/ScheduleRunsTable.d.ts.map +1 -1
  204. package/schedule/ScheduleRunsTable.js +3 -2
  205. package/schedule/ScheduleRunsTable.js.map +1 -1
  206. package/session/PlanEditor.d.ts.map +1 -1
  207. package/session/PlanEditor.js +3 -5
  208. package/session/PlanEditor.js.map +1 -1
  209. package/sharing/AgentShareList.d.ts.map +1 -1
  210. package/sharing/AgentShareList.js +3 -1
  211. package/sharing/AgentShareList.js.map +1 -1
  212. package/sharing/ShareAgentDialog.d.ts.map +1 -1
  213. package/sharing/ShareAgentDialog.js +2 -1
  214. package/sharing/ShareAgentDialog.js.map +1 -1
  215. package/skill/SkillDetailView.d.ts.map +1 -1
  216. package/skill/SkillDetailView.js +3 -2
  217. package/skill/SkillDetailView.js.map +1 -1
  218. package/src/__tests__/helpers/open-menu.ts +88 -0
  219. package/src/__tests__/portal-container.test.tsx +3 -3
  220. package/src/activity/useRecentActivity.ts +3 -2
  221. package/src/agent/AgentDetailView.tsx +6 -130
  222. package/src/agent/internal/__tests__/agentToInput.test.ts +2 -11
  223. package/src/agent/internal/agentToInput.ts +0 -11
  224. package/src/agent-instance/AgentInstanceList.tsx +5 -6
  225. package/src/agent-instance/__tests__/AgentInstanceList.test.tsx +5 -4
  226. package/src/api-key/ApiKeyListPanel.tsx +11 -3
  227. package/src/attachment/AttachmentChipList.tsx +74 -65
  228. package/src/attachment/AttachmentImageLightbox.tsx +5 -4
  229. package/src/attachment/__tests__/AttachmentChipList.test.tsx +4 -3
  230. package/src/channel/AgentChannelsPanel.tsx +5 -6
  231. package/src/channel/ChannelConversationsDialog.tsx +5 -3
  232. package/src/channel/ChannelTemplatesDialog.tsx +5 -6
  233. package/src/channel/__tests__/AgentChannelsPanel.test.tsx +14 -9
  234. package/src/channel-app/internal.tsx +5 -6
  235. package/src/composer/ComposerToolbar.tsx +122 -90
  236. package/src/composer/ConfigureMenu.tsx +33 -24
  237. package/src/composer/ContextChip.tsx +2 -3
  238. package/src/composer/ContextPopover.tsx +27 -18
  239. package/src/composer/SessionComposer.tsx +41 -9
  240. package/src/composer/__tests__/SessionComposer-agentSetupError.test.tsx +124 -0
  241. package/src/composer/__tests__/SessionComposer-lockAgent.test.tsx +4 -9
  242. package/src/conversation/ConversationMediaAttachment.tsx +2 -2
  243. package/src/conversation/ConversationTimelineView.tsx +19 -2
  244. package/src/conversation/__tests__/ConversationTimelineView.test.tsx +106 -3
  245. package/src/conversation/conversationPresentation.ts +52 -1
  246. package/src/cursor-accounts/MemberCoverageTable.tsx +15 -13
  247. package/src/cursor-accounts/__tests__/CursorAccountsConsole.test.tsx +4 -4
  248. package/src/dashboard/DashboardKPICards.tsx +2 -1
  249. package/src/dependency-graph/DependencyTreeNode.tsx +1 -7
  250. package/src/dependency-graph/__tests__/useDependencyGraph.test.ts +18 -34
  251. package/src/dependency-graph/types.ts +8 -20
  252. package/src/dependency-graph/useDependencyGraph.ts +2 -22
  253. package/src/environment/EnvironmentVariableEditor.tsx +17 -6
  254. package/src/execution/ApprovalCard.tsx +1 -3
  255. package/src/execution/ArtifactRowView.tsx +68 -48
  256. package/src/execution/FilePathLink.tsx +43 -27
  257. package/src/execution/McpToolDetail.tsx +6 -2
  258. package/src/execution/MessageAttachments.tsx +57 -41
  259. package/src/execution/MessageEntry.tsx +22 -15
  260. package/src/execution/PlanArtifactCard.tsx +25 -18
  261. package/src/execution/ToolCallDetail.tsx +1 -4
  262. package/src/execution/ToolCallItem.tsx +18 -7
  263. package/src/execution/WriteBackCard.tsx +38 -29
  264. package/src/execution/__tests__/ArtifactRow.test.tsx +6 -2
  265. package/src/execution/__tests__/ArtifactRowView.test.tsx +5 -2
  266. package/src/execution/__tests__/FilePathLink.test.tsx +10 -6
  267. package/src/execution/__tests__/FileReviewCard.test.tsx +2 -1
  268. package/src/execution/__tests__/MessageEntry-attachments.test.tsx +3 -2
  269. package/src/execution/__tests__/MessageThread.test.tsx +6 -1
  270. package/src/execution/__tests__/artifact-row-tooltips.layout.test.tsx +115 -0
  271. package/src/execution/artifact-row-item.ts +1 -1
  272. package/src/file-reference/FileReferenceChipList.tsx +29 -17
  273. package/src/file-reference/__tests__/FileReferenceChipList.test.tsx +5 -2
  274. package/src/iam-policy/OrgMembersPanel.tsx +26 -19
  275. package/src/iam-policy/ProviderBadge.tsx +17 -10
  276. package/src/iam-policy/RoleSelector.tsx +0 -1
  277. package/src/identity-provider/IdentityProviderListPanel.tsx +11 -3
  278. package/src/index.ts +0 -82
  279. package/src/internal/__tests__/truncated-text.layout.test.tsx +68 -0
  280. package/src/internal/__tests__/truncated-text.test.tsx +33 -0
  281. package/src/internal/truncated-text.tsx +81 -0
  282. package/src/invitation/InvitationManager.tsx +18 -5
  283. package/src/library/ScopeToggle.tsx +14 -2
  284. package/src/library/VisibilitySelector.tsx +21 -14
  285. package/src/library/useExportResource.ts +3 -4
  286. package/src/manifest/EditResourceYamlDialog.tsx +1 -2
  287. package/src/manifest/__tests__/ApplyManifestDialog.test.tsx +2 -2
  288. package/src/manifest/__tests__/EditResourceYamlDialog.test.tsx +9 -9
  289. package/src/mcp-server/McpServerConfigPanel.tsx +79 -37
  290. package/src/mcp-server/McpServerConnectDialog.tsx +41 -5
  291. package/src/mcp-server/McpServerDetailView.tsx +23 -39
  292. package/src/mcp-server/McpServerPicker.tsx +99 -7
  293. package/src/mcp-server/McpToolSelector.tsx +12 -7
  294. package/src/mcp-server/VendorApprovalBlockedNotice.tsx +221 -0
  295. package/src/mcp-server/__tests__/McpServerPicker.test.tsx +504 -0
  296. package/src/mcp-server/__tests__/VendorApprovalBlocked.surfaces.test.tsx +321 -0
  297. package/src/mcp-server/__tests__/VendorApprovalBlockedNotice.test.tsx +154 -0
  298. package/src/mcp-server/mcpServerSetupReducer.ts +24 -0
  299. package/src/mcp-server/useMcpServerSetup.ts +9 -0
  300. package/src/oauth-app/OAuthAppListPanel.tsx +11 -3
  301. package/src/platform-client/PlatformClientListPanel.tsx +35 -18
  302. package/src/pricing-governance/BaselineEditor.tsx +20 -0
  303. package/src/pricing-governance/ModelCatalogPanel.tsx +9 -5
  304. package/src/pricing-governance/PricingGovernanceConsole.tsx +9 -5
  305. package/src/pricing-governance/PricingGovernancePanel.tsx +13 -4
  306. package/src/pricing-governance/__tests__/ModelCatalogPanel.test.tsx +37 -0
  307. package/src/resource-workbench/components/StatusBadge.tsx +7 -3
  308. package/src/schedule/CadenceField.tsx +38 -27
  309. package/src/schedule/ScheduleRunsTable.tsx +23 -11
  310. package/src/schedule/__tests__/cadence-tooltips.layout.test.tsx +86 -0
  311. package/src/session/PlanEditor.tsx +9 -8
  312. package/src/sharing/AgentShareList.tsx +28 -22
  313. package/src/sharing/ShareAgentDialog.tsx +5 -6
  314. package/src/sharing/__tests__/AgentShareList.test.tsx +4 -4
  315. package/src/skill/SkillDetailView.tsx +23 -12
  316. package/src/version-history/VersionTimelineEntry.tsx +21 -12
  317. package/src/workflow/CanvasTransitionEdge.tsx +23 -16
  318. package/src/workflow/ExecutionActiveTaskIndicator.tsx +74 -59
  319. package/src/workflow/TaskPickerPopover.tsx +0 -1
  320. package/src/workflow/WorkflowCanvasEditor.tsx +95 -64
  321. package/src/workflow/WorkflowNode.tsx +13 -6
  322. package/src/workflow/WorkflowTaskApprovalSummary.tsx +18 -11
  323. package/src/workflow/WorkflowTaskList.tsx +2 -2
  324. package/src/workflow/WorkflowVersionBadge.tsx +33 -18
  325. package/src/workflow/WorkflowVersionTimeline.tsx +7 -6
  326. package/src/workflow/__tests__/WorkflowTaskApprovalSummary.test.tsx +3 -1
  327. package/src/workflow/__tests__/structured-data-viewer.test.tsx +5 -2
  328. package/src/workflow/execution-comparison/ExecutionComparisonView.tsx +5 -3
  329. package/src/workflow/execution-comparison/TaskComparisonTable.tsx +12 -5
  330. package/src/workflow/execution-history/ExecutionHistoryTable.tsx +24 -15
  331. package/src/workflow/inspector/InspectorHeader.tsx +20 -11
  332. package/src/workflow/inspector/NestedTaskList.tsx +18 -11
  333. package/src/workflow/inspector/WorkflowSummaryPanel.tsx +5 -3
  334. package/src/workflow/inspector/tabs/BranchesTab.tsx +61 -31
  335. package/src/workflow/instance/WorkflowInstanceList.tsx +5 -6
  336. package/src/workflow/instance/__tests__/WorkflowInstanceList.test.tsx +5 -4
  337. package/src/workflow/node-shell/DiffBadge.tsx +18 -11
  338. package/src/workflow/node-shell/ExecutionBadge.tsx +73 -46
  339. package/src/workflow/node-shell/NodeActions.tsx +128 -94
  340. package/src/workflow/task-detail/StructuredDataViewer.tsx +4 -2
  341. package/src/workspace/EditorTabs.tsx +102 -85
  342. package/src/workspace/ExplorerTree.tsx +47 -30
  343. package/src/workspace/FileViewer.tsx +11 -3
  344. package/src/workspace/PanelChip.tsx +32 -23
  345. package/src/workspace/WorkspaceEditor.tsx +21 -9
  346. package/src/workspace/WorkspaceSummary.tsx +21 -12
  347. package/src/workspace/WorkspaceSurface.tsx +86 -61
  348. package/src/workspace/__tests__/EditorTabs.test.tsx +5 -2
  349. package/src/workspace/__tests__/WorkspaceSurface.test.tsx +5 -2
  350. package/styles.css +1 -1
  351. package/version-history/VersionTimelineEntry.d.ts.map +1 -1
  352. package/version-history/VersionTimelineEntry.js +2 -1
  353. package/version-history/VersionTimelineEntry.js.map +1 -1
  354. package/workflow/CanvasTransitionEdge.d.ts +1 -1
  355. package/workflow/CanvasTransitionEdge.d.ts.map +1 -1
  356. package/workflow/CanvasTransitionEdge.js +3 -2
  357. package/workflow/CanvasTransitionEdge.js.map +1 -1
  358. package/workflow/ExecutionActiveTaskIndicator.d.ts.map +1 -1
  359. package/workflow/ExecutionActiveTaskIndicator.js +12 -11
  360. package/workflow/ExecutionActiveTaskIndicator.js.map +1 -1
  361. package/workflow/TaskPickerPopover.js +1 -1
  362. package/workflow/TaskPickerPopover.js.map +1 -1
  363. package/workflow/WorkflowCanvasEditor.d.ts.map +1 -1
  364. package/workflow/WorkflowCanvasEditor.js +9 -2
  365. package/workflow/WorkflowCanvasEditor.js.map +1 -1
  366. package/workflow/WorkflowNode.d.ts.map +1 -1
  367. package/workflow/WorkflowNode.js +2 -1
  368. package/workflow/WorkflowNode.js.map +1 -1
  369. package/workflow/WorkflowTaskApprovalSummary.d.ts.map +1 -1
  370. package/workflow/WorkflowTaskApprovalSummary.js +6 -4
  371. package/workflow/WorkflowTaskApprovalSummary.js.map +1 -1
  372. package/workflow/WorkflowTaskList.js +2 -2
  373. package/workflow/WorkflowTaskList.js.map +1 -1
  374. package/workflow/WorkflowVersionBadge.d.ts.map +1 -1
  375. package/workflow/WorkflowVersionBadge.js +2 -1
  376. package/workflow/WorkflowVersionBadge.js.map +1 -1
  377. package/workflow/WorkflowVersionTimeline.d.ts.map +1 -1
  378. package/workflow/WorkflowVersionTimeline.js +2 -1
  379. package/workflow/WorkflowVersionTimeline.js.map +1 -1
  380. package/workflow/execution-comparison/ExecutionComparisonView.d.ts.map +1 -1
  381. package/workflow/execution-comparison/ExecutionComparisonView.js +2 -1
  382. package/workflow/execution-comparison/ExecutionComparisonView.js.map +1 -1
  383. package/workflow/execution-comparison/TaskComparisonTable.d.ts.map +1 -1
  384. package/workflow/execution-comparison/TaskComparisonTable.js +2 -1
  385. package/workflow/execution-comparison/TaskComparisonTable.js.map +1 -1
  386. package/workflow/execution-history/ExecutionHistoryTable.d.ts.map +1 -1
  387. package/workflow/execution-history/ExecutionHistoryTable.js +6 -4
  388. package/workflow/execution-history/ExecutionHistoryTable.js.map +1 -1
  389. package/workflow/inspector/InspectorHeader.d.ts.map +1 -1
  390. package/workflow/inspector/InspectorHeader.js +4 -2
  391. package/workflow/inspector/InspectorHeader.js.map +1 -1
  392. package/workflow/inspector/NestedTaskList.d.ts.map +1 -1
  393. package/workflow/inspector/NestedTaskList.js +2 -1
  394. package/workflow/inspector/NestedTaskList.js.map +1 -1
  395. package/workflow/inspector/WorkflowSummaryPanel.d.ts.map +1 -1
  396. package/workflow/inspector/WorkflowSummaryPanel.js +2 -1
  397. package/workflow/inspector/WorkflowSummaryPanel.js.map +1 -1
  398. package/workflow/inspector/tabs/BranchesTab.d.ts.map +1 -1
  399. package/workflow/inspector/tabs/BranchesTab.js +5 -2
  400. package/workflow/inspector/tabs/BranchesTab.js.map +1 -1
  401. package/workflow/instance/WorkflowInstanceList.d.ts.map +1 -1
  402. package/workflow/instance/WorkflowInstanceList.js +2 -1
  403. package/workflow/instance/WorkflowInstanceList.js.map +1 -1
  404. package/workflow/node-shell/DiffBadge.d.ts.map +1 -1
  405. package/workflow/node-shell/DiffBadge.js +3 -2
  406. package/workflow/node-shell/DiffBadge.js.map +1 -1
  407. package/workflow/node-shell/ExecutionBadge.d.ts.map +1 -1
  408. package/workflow/node-shell/ExecutionBadge.js +5 -4
  409. package/workflow/node-shell/ExecutionBadge.js.map +1 -1
  410. package/workflow/node-shell/NodeActions.d.ts.map +1 -1
  411. package/workflow/node-shell/NodeActions.js +12 -11
  412. package/workflow/node-shell/NodeActions.js.map +1 -1
  413. package/workflow/task-detail/StructuredDataViewer.d.ts.map +1 -1
  414. package/workflow/task-detail/StructuredDataViewer.js +5 -1
  415. package/workflow/task-detail/StructuredDataViewer.js.map +1 -1
  416. package/workspace/EditorTabs.d.ts.map +1 -1
  417. package/workspace/EditorTabs.js +38 -37
  418. package/workspace/EditorTabs.js.map +1 -1
  419. package/workspace/ExplorerTree.d.ts.map +1 -1
  420. package/workspace/ExplorerTree.js +2 -1
  421. package/workspace/ExplorerTree.js.map +1 -1
  422. package/workspace/FileViewer.d.ts.map +1 -1
  423. package/workspace/FileViewer.js +2 -1
  424. package/workspace/FileViewer.js.map +1 -1
  425. package/workspace/PanelChip.d.ts.map +1 -1
  426. package/workspace/PanelChip.js +2 -1
  427. package/workspace/PanelChip.js.map +1 -1
  428. package/workspace/WorkspaceEditor.d.ts.map +1 -1
  429. package/workspace/WorkspaceEditor.js +2 -1
  430. package/workspace/WorkspaceEditor.js.map +1 -1
  431. package/workspace/WorkspaceSummary.d.ts.map +1 -1
  432. package/workspace/WorkspaceSummary.js +7 -2
  433. package/workspace/WorkspaceSummary.js.map +1 -1
  434. package/workspace/WorkspaceSurface.d.ts.map +1 -1
  435. package/workspace/WorkspaceSurface.js +12 -11
  436. package/workspace/WorkspaceSurface.js.map +1 -1
  437. package/datastore/CollectionRecordsBrowser.d.ts +0 -34
  438. package/datastore/CollectionRecordsBrowser.d.ts.map +0 -1
  439. package/datastore/CollectionRecordsBrowser.js +0 -223
  440. package/datastore/CollectionRecordsBrowser.js.map +0 -1
  441. package/datastore/CollectionSchemaView.d.ts +0 -29
  442. package/datastore/CollectionSchemaView.d.ts.map +0 -1
  443. package/datastore/CollectionSchemaView.js +0 -93
  444. package/datastore/CollectionSchemaView.js.map +0 -1
  445. package/datastore/DatastoreDetailView.d.ts +0 -44
  446. package/datastore/DatastoreDetailView.d.ts.map +0 -1
  447. package/datastore/DatastoreDetailView.js +0 -76
  448. package/datastore/DatastoreDetailView.js.map +0 -1
  449. package/datastore/DatastoreSyncReport.d.ts +0 -19
  450. package/datastore/DatastoreSyncReport.d.ts.map +0 -1
  451. package/datastore/DatastoreSyncReport.js +0 -45
  452. package/datastore/DatastoreSyncReport.js.map +0 -1
  453. package/datastore/DeleteDatastoreDialog.d.ts +0 -35
  454. package/datastore/DeleteDatastoreDialog.d.ts.map +0 -1
  455. package/datastore/DeleteDatastoreDialog.js +0 -90
  456. package/datastore/DeleteDatastoreDialog.js.map +0 -1
  457. package/datastore/FieldValueControl.d.ts +0 -55
  458. package/datastore/FieldValueControl.d.ts.map +0 -1
  459. package/datastore/FieldValueControl.js +0 -138
  460. package/datastore/FieldValueControl.js.map +0 -1
  461. package/datastore/RecordFilterBuilder.d.ts +0 -37
  462. package/datastore/RecordFilterBuilder.d.ts.map +0 -1
  463. package/datastore/RecordFilterBuilder.js +0 -122
  464. package/datastore/RecordFilterBuilder.js.map +0 -1
  465. package/datastore/RecordFormPanel.d.ts +0 -45
  466. package/datastore/RecordFormPanel.d.ts.map +0 -1
  467. package/datastore/RecordFormPanel.js +0 -215
  468. package/datastore/RecordFormPanel.js.map +0 -1
  469. package/datastore/index.d.ts +0 -43
  470. package/datastore/index.d.ts.map +0 -1
  471. package/datastore/index.js +0 -22
  472. package/datastore/index.js.map +0 -1
  473. package/datastore/recordFilter.d.ts +0 -62
  474. package/datastore/recordFilter.d.ts.map +0 -1
  475. package/datastore/recordFilter.js +0 -104
  476. package/datastore/recordFilter.js.map +0 -1
  477. package/datastore/recordValues.d.ts +0 -85
  478. package/datastore/recordValues.d.ts.map +0 -1
  479. package/datastore/recordValues.js +0 -282
  480. package/datastore/recordValues.js.map +0 -1
  481. package/datastore/useDatastore.d.ts +0 -39
  482. package/datastore/useDatastore.d.ts.map +0 -1
  483. package/datastore/useDatastore.js +0 -44
  484. package/datastore/useDatastore.js.map +0 -1
  485. package/datastore/useDatastoreCount.d.ts +0 -50
  486. package/datastore/useDatastoreCount.d.ts.map +0 -1
  487. package/datastore/useDatastoreCount.js +0 -27
  488. package/datastore/useDatastoreCount.js.map +0 -1
  489. package/datastore/useDatastoreDescription.d.ts +0 -54
  490. package/datastore/useDatastoreDescription.d.ts.map +0 -1
  491. package/datastore/useDatastoreDescription.js +0 -50
  492. package/datastore/useDatastoreDescription.js.map +0 -1
  493. package/datastore/useDatastoreList.d.ts +0 -57
  494. package/datastore/useDatastoreList.d.ts.map +0 -1
  495. package/datastore/useDatastoreList.js +0 -29
  496. package/datastore/useDatastoreList.js.map +0 -1
  497. package/datastore/useDatastoreSearch.d.ts +0 -19
  498. package/datastore/useDatastoreSearch.d.ts.map +0 -1
  499. package/datastore/useDatastoreSearch.js +0 -22
  500. package/datastore/useDatastoreSearch.js.map +0 -1
  501. package/datastore/useDeleteDatastore.d.ts +0 -53
  502. package/datastore/useDeleteDatastore.d.ts.map +0 -1
  503. package/datastore/useDeleteDatastore.js +0 -40
  504. package/datastore/useDeleteDatastore.js.map +0 -1
  505. package/datastore/useDeleteRecord.d.ts +0 -34
  506. package/datastore/useDeleteRecord.d.ts.map +0 -1
  507. package/datastore/useDeleteRecord.js +0 -43
  508. package/datastore/useDeleteRecord.js.map +0 -1
  509. package/datastore/useInsertRecord.d.ts +0 -50
  510. package/datastore/useInsertRecord.d.ts.map +0 -1
  511. package/datastore/useInsertRecord.js +0 -55
  512. package/datastore/useInsertRecord.js.map +0 -1
  513. package/datastore/useRecordCollection.d.ts +0 -104
  514. package/datastore/useRecordCollection.d.ts.map +0 -1
  515. package/datastore/useRecordCollection.js +0 -136
  516. package/datastore/useRecordCollection.js.map +0 -1
  517. package/datastore/useRecordList.d.ts +0 -66
  518. package/datastore/useRecordList.d.ts.map +0 -1
  519. package/datastore/useRecordList.js +0 -58
  520. package/datastore/useRecordList.js.map +0 -1
  521. package/datastore/useUpdateRecord.d.ts +0 -52
  522. package/datastore/useUpdateRecord.d.ts.map +0 -1
  523. package/datastore/useUpdateRecord.js +0 -55
  524. package/datastore/useUpdateRecord.js.map +0 -1
  525. package/src/agent/__tests__/AgentDetailView.datastores.test.tsx +0 -166
  526. package/src/datastore/CollectionRecordsBrowser.tsx +0 -570
  527. package/src/datastore/CollectionSchemaView.tsx +0 -247
  528. package/src/datastore/DatastoreDetailView.tsx +0 -201
  529. package/src/datastore/DatastoreSyncReport.tsx +0 -105
  530. package/src/datastore/DeleteDatastoreDialog.tsx +0 -202
  531. package/src/datastore/FieldValueControl.tsx +0 -289
  532. package/src/datastore/RecordFilterBuilder.tsx +0 -422
  533. package/src/datastore/RecordFormPanel.tsx +0 -432
  534. package/src/datastore/__tests__/CollectionRecordsBrowser.test.tsx +0 -245
  535. package/src/datastore/__tests__/DeleteDatastoreDialog.test.tsx +0 -133
  536. package/src/datastore/__tests__/FieldValueControl.test.tsx +0 -160
  537. package/src/datastore/__tests__/RecordFilterBuilder.test.tsx +0 -155
  538. package/src/datastore/__tests__/RecordFormPanel.test.tsx +0 -227
  539. package/src/datastore/__tests__/recordFilter.test.ts +0 -169
  540. package/src/datastore/__tests__/recordMutations.test.tsx +0 -195
  541. package/src/datastore/__tests__/recordValues.test.ts +0 -359
  542. package/src/datastore/__tests__/schemaAndSyncViews.test.tsx +0 -142
  543. package/src/datastore/__tests__/useDatastoreDescription.test.tsx +0 -143
  544. package/src/datastore/__tests__/useRecordCollection.test.tsx +0 -250
  545. package/src/datastore/__tests__/useRecordList.test.tsx +0 -85
  546. package/src/datastore/index.ts +0 -111
  547. package/src/datastore/recordFilter.ts +0 -154
  548. package/src/datastore/recordValues.ts +0 -327
  549. package/src/datastore/useDatastore.ts +0 -67
  550. package/src/datastore/useDatastoreCount.ts +0 -69
  551. package/src/datastore/useDatastoreDescription.ts +0 -90
  552. package/src/datastore/useDatastoreList.ts +0 -79
  553. package/src/datastore/useDatastoreSearch.ts +0 -39
  554. package/src/datastore/useDeleteDatastore.ts +0 -87
  555. package/src/datastore/useDeleteRecord.ts +0 -77
  556. package/src/datastore/useInsertRecord.ts +0 -92
  557. package/src/datastore/useRecordCollection.ts +0 -256
  558. package/src/datastore/useRecordList.ts +0 -131
  559. package/src/datastore/useUpdateRecord.ts +0 -95
@@ -1,202 +0,0 @@
1
- "use client";
2
-
3
- import { useCallback, useEffect, useMemo, useRef, useState } from "react";
4
- import { cn } from "@stigmer/theme";
5
- import { getUserMessage } from "@stigmer/sdk";
6
- import type { Datastore } from "@stigmer/protos/ai/stigmer/agentic/datastore/v1/api_pb";
7
- import { toast } from "../feedback/toast.js";
8
- import { FIELD_INPUT_CLASSES } from "./FieldValueControl.js";
9
- import { useDeleteDatastore } from "./useDeleteDatastore.js";
10
-
11
- /** Props for {@link DeleteDatastoreDialog}. */
12
- export interface DeleteDatastoreDialogProps {
13
- /** Whether the dialog is open. */
14
- readonly open: boolean;
15
- /** Called when the dialog requests to close. */
16
- readonly onOpenChange: (open: boolean) => void;
17
- /** The loaded datastore (metadata + status feed the counts). */
18
- readonly datastore: Datastore | null;
19
- /** Called after a successful delete (navigate away). */
20
- readonly onDeleted?: () => void;
21
- }
22
-
23
- /**
24
- * The guarded delete flow for the platform's only record-destroying
25
- * resource action (DD-008 SD-6) — a status-informed acknowledgment
26
- * replacing the generic one-shot confirm:
27
- *
28
- * - Counts are pre-filled from the already-loaded `status` ("holds N
29
- * records across M collections").
30
- * - A **non-empty** datastore requires **typing the datastore slug** to
31
- * arm the delete — the strongest-friction confirm. Arming sends the
32
- * `force` acknowledgment.
33
- * - An **empty** datastore keeps the standard destructive confirm.
34
- * - The server's guards stay authoritative: on refusal (agent
35
- * references, count drift) the `FAILED_PRECONDITION` message renders
36
- * **verbatim** inside the dialog with fresh server counts — the
37
- * console renders the guard, never pre-empts it. The agent-reference
38
- * block names the referencing agents; detaching them is the operator's
39
- * next step, and the block is deliberately not acknowledgeable-through.
40
- *
41
- * All visual properties flow through `--stgm-*` design tokens.
42
- * Zero Console dependencies — safe for platform builder embedding.
43
- */
44
- export function DeleteDatastoreDialog({
45
- open,
46
- onOpenChange,
47
- datastore,
48
- onDeleted,
49
- }: DeleteDatastoreDialogProps) {
50
- const dialogRef = useRef<HTMLDialogElement>(null);
51
- const { deleteDatastore, isDeleting, error, clearError } = useDeleteDatastore();
52
- const [slugInput, setSlugInput] = useState("");
53
-
54
- const slug = datastore?.metadata?.slug ?? "";
55
- const resourceId = datastore?.metadata?.id ?? "";
56
-
57
- // BigInt literals (0n) are avoided: consumer apps compile SDK sources
58
- // with targets below ES2020.
59
- const { totalRecords, nonEmptyCollections } = useMemo(() => {
60
- let records = BigInt(0);
61
- let collections = 0;
62
- for (const coll of datastore?.status?.collections ?? []) {
63
- if (coll.recordCount > BigInt(0)) {
64
- records += coll.recordCount;
65
- collections += 1;
66
- }
67
- }
68
- return { totalRecords: records, nonEmptyCollections: collections };
69
- }, [datastore]);
70
-
71
- const isEmpty = totalRecords === BigInt(0);
72
- const armed = isEmpty || slugInput === slug;
73
-
74
- useEffect(() => {
75
- if (open) {
76
- setSlugInput("");
77
- clearError();
78
- }
79
- }, [open, clearError]);
80
-
81
- useEffect(() => {
82
- const dialog = dialogRef.current;
83
- if (!dialog) return;
84
- if (open && !dialog.open) dialog.showModal();
85
- else if (!open && dialog.open) dialog.close();
86
- }, [open]);
87
-
88
- const handleDialogCancel = useCallback(
89
- (e: React.SyntheticEvent) => {
90
- e.preventDefault();
91
- onOpenChange(false);
92
- },
93
- [onOpenChange],
94
- );
95
-
96
- const handleDelete = useCallback(async () => {
97
- if (!resourceId || !armed) return;
98
- try {
99
- // A non-empty delete carries force — the acknowledgment the
100
- // slug-typing arms. Empty datastores need no acknowledgment.
101
- await deleteDatastore({ resourceId, force: !isEmpty });
102
- toast.success(`Datastore "${slug}" deleted`);
103
- onOpenChange(false);
104
- onDeleted?.();
105
- } catch {
106
- // The guard's message renders inline via `error` — with fresh
107
- // counts on drift; the server stays authoritative.
108
- }
109
- }, [resourceId, armed, isEmpty, deleteDatastore, slug, onOpenChange, onDeleted]);
110
-
111
- if (!open || !datastore) return null;
112
-
113
- return (
114
- <dialog
115
- ref={dialogRef}
116
- onCancel={handleDialogCancel}
117
- aria-label={`Delete datastore ${slug}`}
118
- className={cn(
119
- "stg:fixed stg:inset-0 stg:z-50 stg:m-auto stg:w-full stg:max-w-md stg:rounded-lg stg:border stg:border-border stg:bg-popover stg:p-0 stg:text-popover-foreground stg:shadow-lg",
120
- "stg:backdrop:bg-black/50",
121
- "stg:open:animate-in stg:open:fade-in-0 stg:open:zoom-in-95",
122
- )}
123
- >
124
- <div className="stg:flex stg:flex-col stg:gap-4 stg:p-6">
125
- <div className="stg:flex stg:flex-col stg:gap-1.5">
126
- <h3 className="stg:text-base stg:font-semibold stg:text-foreground">
127
- Delete datastore “{slug}”?
128
- </h3>
129
- {isEmpty ? (
130
- <p className="stg:text-sm stg:text-muted-foreground">
131
- This datastore holds no records. Its declared collections will be
132
- removed. This cannot be undone.
133
- </p>
134
- ) : (
135
- <p className="stg:text-sm stg:text-muted-foreground">
136
- “{slug}” holds{" "}
137
- <strong className="stg:font-semibold stg:text-foreground">
138
- {String(totalRecords)} record{totalRecords === BigInt(1) ? "" : "s"}
139
- </strong>{" "}
140
- across{" "}
141
- <strong className="stg:font-semibold stg:text-foreground">
142
- {nonEmptyCollections} collection{nonEmptyCollections === 1 ? "" : "s"}
143
- </strong>
144
- . Deleting the datastore destroys them all. This cannot be undone.
145
- </p>
146
- )}
147
- </div>
148
-
149
- {error && (
150
- <div
151
- role="alert"
152
- className="stg:rounded-md stg:border stg:border-destructive stg:bg-card stg:px-3 stg:py-2 stg:text-sm stg:text-destructive"
153
- >
154
- {getUserMessage(error)}
155
- </div>
156
- )}
157
-
158
- {!isEmpty && (
159
- <label className="stg:flex stg:flex-col stg:gap-1 stg:text-xs stg:font-medium stg:text-muted-foreground">
160
- Type <span className="stg:font-mono stg:text-foreground">{slug}</span> to confirm
161
- <input
162
- type="text"
163
- className={FIELD_INPUT_CLASSES}
164
- value={slugInput}
165
- onChange={(e) => setSlugInput(e.target.value)}
166
- autoComplete="off"
167
- spellCheck={false}
168
- aria-label={`Type ${slug} to confirm deletion`}
169
- />
170
- </label>
171
- )}
172
-
173
- <div className="stg:flex stg:justify-end stg:gap-2">
174
- <button
175
- type="button"
176
- onClick={() => onOpenChange(false)}
177
- className={cn(
178
- "stg:rounded-md stg:border stg:border-input stg:bg-background stg:px-3 stg:py-1.5 stg:text-sm stg:font-medium stg:text-foreground",
179
- "stg:hover:bg-accent stg:hover:text-accent-foreground",
180
- "stg:focus-visible:outline-none stg:focus-visible:ring-2 stg:focus-visible:ring-ring",
181
- )}
182
- >
183
- Cancel
184
- </button>
185
- <button
186
- type="button"
187
- onClick={handleDelete}
188
- disabled={!armed || isDeleting}
189
- className={cn(
190
- "stg:rounded-md stg:bg-destructive stg:px-3 stg:py-1.5 stg:text-sm stg:font-medium stg:text-destructive-foreground",
191
- "stg:hover:bg-destructive-hover",
192
- "stg:focus-visible:outline-none stg:focus-visible:ring-2 stg:focus-visible:ring-ring",
193
- "stg:disabled:pointer-events-none stg:disabled:opacity-50",
194
- )}
195
- >
196
- {isDeleting ? "Deleting…" : "Delete datastore"}
197
- </button>
198
- </div>
199
- </div>
200
- </dialog>
201
- );
202
- }
@@ -1,289 +0,0 @@
1
- "use client";
2
-
3
- import { useCallback, useState } from "react";
4
- import { cn } from "@stigmer/theme";
5
- import type { JsonValue } from "@bufbuild/protobuf";
6
- import {
7
- FieldType,
8
- type FieldDeclaration,
9
- } from "@stigmer/protos/ai/stigmer/agentic/datastore/v1/spec_pb";
10
-
11
- /**
12
- * Standard input styling for datastore value controls — the
13
- * token-compliant idiom (semantic Tailwind classes over `--stgm-*`
14
- * tokens; no pixel font sizes, no hex fallbacks).
15
- */
16
- export const FIELD_INPUT_CLASSES = cn(
17
- "stg:w-full stg:rounded-md stg:border stg:border-input stg:bg-background stg:px-2.5 stg:py-1.5 stg:text-xs stg:text-foreground",
18
- "stg:placeholder:text-muted-foreground",
19
- "stg:focus-visible:outline-none stg:focus-visible:ring-1 stg:focus-visible:ring-ring",
20
- "stg:disabled:pointer-events-none stg:disabled:opacity-50",
21
- );
22
-
23
- /** Props for {@link FieldValueControl}. */
24
- export interface FieldValueControlProps {
25
- /** The field declaration driving the control type. */
26
- readonly field: FieldDeclaration;
27
- /**
28
- * Current value in its canonical encoding (DD-004), or `undefined`
29
- * when empty/unset. The control never receives explicit `null` — the
30
- * clear affordance is the owner's (a form row renders it; the control
31
- * only edits values).
32
- */
33
- readonly value: JsonValue | undefined;
34
- /**
35
- * Called with the canonical value on every valid edit, or `undefined`
36
- * when the input empties. Invalid intermediate states (half-typed
37
- * JSON, unparseable numbers) stay local to the control and are never
38
- * emitted — the precedent set by the workflow config form.
39
- */
40
- readonly onChange: (value: JsonValue | undefined) => void;
41
- /** Disables the input. */
42
- readonly disabled?: boolean;
43
- /** DOM id for external `<label htmlFor>` wiring. */
44
- readonly id?: string;
45
- /** Accessible name when no external label is wired. */
46
- readonly "aria-label"?: string;
47
- }
48
-
49
- /**
50
- * The typed value control for a declared datastore field — one
51
- * controlled input per `FieldType`, emitting canonical encodings
52
- * (DD-004). Shared by `RecordFormPanel` (field editing) and
53
- * `RecordFilterBuilder` (condition values), so a field always offers
54
- * the same input affordance everywhere.
55
- *
56
- * Type dispatch:
57
- * - `string` — text input; enum-select when `enum_values` declared
58
- * - `integer` / `number` — numeric input (step 1 / any)
59
- * - `bool` — select with true/false (a checkbox conflates
60
- * "false" with "unset", which the tri-state
61
- * write model must not do)
62
- * - `date` — native date picker (emits `YYYY-MM-DD`)
63
- * - `time` — native time picker (emits zero-padded `HH:MM[:SS]`)
64
- * - `timestamp` — native datetime-local picker in the operator's
65
- * zone, converted to RFC 3339 UTC
66
- * - `json` — mono textarea with local parse state; only
67
- * valid JSON is emitted
68
- */
69
- export function FieldValueControl(props: FieldValueControlProps) {
70
- const { field } = props;
71
- switch (field.type) {
72
- case FieldType.string:
73
- return field.enumValues.length > 0 ? <EnumControl {...props} /> : <StringControl {...props} />;
74
- case FieldType.integer:
75
- case FieldType.number:
76
- return <NumberControl {...props} />;
77
- case FieldType.bool:
78
- return <BoolControl {...props} />;
79
- case FieldType.date:
80
- return <DateControl {...props} />;
81
- case FieldType.time:
82
- return <TimeControl {...props} />;
83
- case FieldType.timestamp:
84
- return <TimestampControl {...props} />;
85
- case FieldType.json:
86
- default:
87
- return <JsonControl {...props} />;
88
- }
89
- }
90
-
91
- // ---------------------------------------------------------------------------
92
- // Per-type controls
93
- // ---------------------------------------------------------------------------
94
-
95
- function StringControl({ value, onChange, disabled, id, "aria-label": ariaLabel }: FieldValueControlProps) {
96
- return (
97
- <input
98
- id={id}
99
- type="text"
100
- className={FIELD_INPUT_CLASSES}
101
- value={typeof value === "string" ? value : ""}
102
- onChange={(e) => onChange(e.target.value === "" ? undefined : e.target.value)}
103
- disabled={disabled}
104
- aria-label={ariaLabel}
105
- />
106
- );
107
- }
108
-
109
- function EnumControl({ field, value, onChange, disabled, id, "aria-label": ariaLabel }: FieldValueControlProps) {
110
- return (
111
- <select
112
- id={id}
113
- className={FIELD_INPUT_CLASSES}
114
- value={typeof value === "string" ? value : ""}
115
- onChange={(e) => onChange(e.target.value === "" ? undefined : e.target.value)}
116
- disabled={disabled}
117
- aria-label={ariaLabel}
118
- >
119
- <option value="">— Select —</option>
120
- {field.enumValues.map((v) => (
121
- <option key={v} value={v}>
122
- {v}
123
- </option>
124
- ))}
125
- </select>
126
- );
127
- }
128
-
129
- function NumberControl({ field, value, onChange, disabled, id, "aria-label": ariaLabel }: FieldValueControlProps) {
130
- const isInteger = field.type === FieldType.integer;
131
- return (
132
- <input
133
- id={id}
134
- type="number"
135
- step={isInteger ? 1 : "any"}
136
- className={FIELD_INPUT_CLASSES}
137
- value={typeof value === "number" ? value : ""}
138
- onChange={(e) => {
139
- const raw = e.target.value;
140
- if (raw === "") {
141
- onChange(undefined);
142
- return;
143
- }
144
- const parsed = isInteger ? Number.parseInt(raw, 10) : Number.parseFloat(raw);
145
- if (!Number.isNaN(parsed)) onChange(parsed);
146
- }}
147
- disabled={disabled}
148
- aria-label={ariaLabel}
149
- />
150
- );
151
- }
152
-
153
- function BoolControl({ value, onChange, disabled, id, "aria-label": ariaLabel }: FieldValueControlProps) {
154
- return (
155
- <select
156
- id={id}
157
- className={FIELD_INPUT_CLASSES}
158
- value={value === true ? "true" : value === false ? "false" : ""}
159
- onChange={(e) => {
160
- const v = e.target.value;
161
- onChange(v === "" ? undefined : v === "true");
162
- }}
163
- disabled={disabled}
164
- aria-label={ariaLabel}
165
- >
166
- <option value="">— Select —</option>
167
- <option value="true">true</option>
168
- <option value="false">false</option>
169
- </select>
170
- );
171
- }
172
-
173
- function DateControl({ value, onChange, disabled, id, "aria-label": ariaLabel }: FieldValueControlProps) {
174
- return (
175
- <input
176
- id={id}
177
- type="date"
178
- className={FIELD_INPUT_CLASSES}
179
- value={typeof value === "string" ? value : ""}
180
- onChange={(e) => onChange(e.target.value === "" ? undefined : e.target.value)}
181
- disabled={disabled}
182
- aria-label={ariaLabel}
183
- />
184
- );
185
- }
186
-
187
- function TimeControl({ value, onChange, disabled, id, "aria-label": ariaLabel }: FieldValueControlProps) {
188
- return (
189
- <input
190
- id={id}
191
- type="time"
192
- step={1}
193
- className={FIELD_INPUT_CLASSES}
194
- value={typeof value === "string" ? value : ""}
195
- onChange={(e) => onChange(e.target.value === "" ? undefined : e.target.value)}
196
- disabled={disabled}
197
- aria-label={ariaLabel}
198
- />
199
- );
200
- }
201
-
202
- function TimestampControl({ value, onChange, disabled, id, "aria-label": ariaLabel }: FieldValueControlProps) {
203
- return (
204
- <input
205
- id={id}
206
- type="datetime-local"
207
- step={1}
208
- className={FIELD_INPUT_CLASSES}
209
- value={typeof value === "string" ? utcToLocalInput(value) : ""}
210
- onChange={(e) => {
211
- const raw = e.target.value;
212
- onChange(raw === "" ? undefined : localInputToUtc(raw));
213
- }}
214
- disabled={disabled}
215
- aria-label={ariaLabel}
216
- />
217
- );
218
- }
219
-
220
- /**
221
- * Canonical RFC 3339 UTC → the datetime-local widget's value (the
222
- * operator's local zone, no zone suffix). Unparseable input renders
223
- * empty rather than throwing — the value may be mid-edit.
224
- */
225
- function utcToLocalInput(canonical: string): string {
226
- const ms = Date.parse(canonical);
227
- if (Number.isNaN(ms)) return "";
228
- const d = new Date(ms);
229
- const pad = (n: number) => String(n).padStart(2, "0");
230
- return (
231
- `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}` +
232
- `T${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`
233
- );
234
- }
235
-
236
- /** The widget's local value → canonical RFC 3339 UTC. */
237
- function localInputToUtc(local: string): string {
238
- const ms = Date.parse(local); // no zone suffix — parsed as local time
239
- if (Number.isNaN(ms)) return local; // let coercion report it on submit
240
- return new Date(ms).toISOString().replace(/\.000Z$/, "Z");
241
- }
242
-
243
- function JsonControl({ value, onChange, disabled, id, "aria-label": ariaLabel }: FieldValueControlProps) {
244
- const initial = value !== undefined ? JSON.stringify(value, null, 2) : "";
245
- const [raw, setRaw] = useState(initial);
246
- const [parseError, setParseError] = useState<string | null>(null);
247
-
248
- const handleChange = useCallback(
249
- (e: React.ChangeEvent<HTMLTextAreaElement>) => {
250
- const text = e.target.value;
251
- setRaw(text);
252
- if (text.trim() === "") {
253
- setParseError(null);
254
- onChange(undefined);
255
- return;
256
- }
257
- try {
258
- const parsed = JSON.parse(text) as JsonValue;
259
- setParseError(null);
260
- onChange(parsed);
261
- } catch {
262
- // Invalid JSON stays local — never emitted.
263
- setParseError("Invalid JSON");
264
- }
265
- },
266
- [onChange],
267
- );
268
-
269
- return (
270
- <div className="stg:flex stg:flex-col stg:gap-1">
271
- <textarea
272
- id={id}
273
- rows={4}
274
- className={cn(FIELD_INPUT_CLASSES, "stg:resize-y stg:font-mono")}
275
- value={raw}
276
- onChange={handleChange}
277
- placeholder="{}"
278
- disabled={disabled}
279
- aria-label={ariaLabel}
280
- aria-invalid={parseError !== null}
281
- />
282
- {parseError && (
283
- <span role="alert" className="stg:text-xs stg:text-destructive">
284
- {parseError}
285
- </span>
286
- )}
287
- </div>
288
- );
289
- }