@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,359 +0,0 @@
1
- // Tests for the client-side projection of the DD-004 canonical value
2
- // contract. The cases mirror the authoritative Go schema tests
3
- // (pkg/domain/datastore/schema) so a drift between projection and
4
- // enforcement shows up here first.
5
-
6
- import { describe, expect, it } from "vitest";
7
- import { create } from "@bufbuild/protobuf";
8
- import {
9
- FieldDeclarationSchema,
10
- FieldType,
11
- } from "@stigmer/protos/ai/stigmer/agentic/datastore/v1/spec_pb";
12
- import { RecordConditionOp } from "@stigmer/protos/ai/stigmer/agentic/datastore/v1/record_io_pb";
13
- import {
14
- buildUpdateFields,
15
- coerceFieldValue,
16
- formatFieldValue,
17
- formatSystemTimestamp,
18
- isListOperator,
19
- isSortableField,
20
- isValuelessOperator,
21
- operatorsForField,
22
- RESERVED_FIELD_NAMES,
23
- SYSTEM_FIELD_OPERATORS,
24
- } from "../recordValues.js";
25
-
26
- function field(overrides: {
27
- name?: string;
28
- type: FieldType;
29
- required?: boolean;
30
- enumValues?: string[];
31
- }) {
32
- return create(FieldDeclarationSchema, {
33
- name: overrides.name ?? "f",
34
- type: overrides.type,
35
- required: overrides.required ?? false,
36
- enumValues: overrides.enumValues ?? [],
37
- });
38
- }
39
-
40
- describe("coerceFieldValue", () => {
41
- it("passes explicit null through for every type (tri-state clear)", () => {
42
- for (const type of [
43
- FieldType.string,
44
- FieldType.integer,
45
- FieldType.number,
46
- FieldType.bool,
47
- FieldType.timestamp,
48
- FieldType.date,
49
- FieldType.time,
50
- FieldType.json,
51
- ]) {
52
- expect(coerceFieldValue(field({ type }), null)).toEqual({ ok: true, value: null });
53
- }
54
- });
55
-
56
- describe("string", () => {
57
- it("accepts a plain string", () => {
58
- expect(coerceFieldValue(field({ type: FieldType.string }), "hello")).toEqual({
59
- ok: true,
60
- value: "hello",
61
- });
62
- });
63
-
64
- it("rejects non-strings", () => {
65
- const r = coerceFieldValue(field({ name: "note", type: FieldType.string }), 5);
66
- expect(r).toEqual({ ok: false, error: 'field "note" must be a string' });
67
- });
68
-
69
- it("enforces enum_values membership", () => {
70
- const f = field({
71
- name: "status",
72
- type: FieldType.string,
73
- enumValues: ["confirmed", "cancelled"],
74
- });
75
- expect(coerceFieldValue(f, "confirmed")).toEqual({ ok: true, value: "confirmed" });
76
- expect(coerceFieldValue(f, "pending")).toEqual({
77
- ok: false,
78
- error: 'field "status" must be one of [confirmed cancelled]',
79
- });
80
- });
81
- });
82
-
83
- describe("integer", () => {
84
- it("accepts integral numbers", () => {
85
- expect(coerceFieldValue(field({ type: FieldType.integer }), 42)).toEqual({
86
- ok: true,
87
- value: 42,
88
- });
89
- expect(coerceFieldValue(field({ type: FieldType.integer }), -7)).toEqual({
90
- ok: true,
91
- value: -7,
92
- });
93
- expect(coerceFieldValue(field({ type: FieldType.integer }), 0)).toEqual({
94
- ok: true,
95
- value: 0,
96
- });
97
- });
98
-
99
- it("rejects fractional, non-numeric, and unsafe values", () => {
100
- const f = field({ name: "n", type: FieldType.integer });
101
- expect(coerceFieldValue(f, 1.5)).toMatchObject({ ok: false });
102
- expect(coerceFieldValue(f, "3")).toMatchObject({ ok: false });
103
- expect(coerceFieldValue(f, Number.MAX_SAFE_INTEGER + 2)).toMatchObject({ ok: false });
104
- });
105
- });
106
-
107
- describe("number", () => {
108
- it("accepts finite numbers", () => {
109
- expect(coerceFieldValue(field({ type: FieldType.number }), 3.14)).toEqual({
110
- ok: true,
111
- value: 3.14,
112
- });
113
- });
114
-
115
- it("rejects non-numbers and non-finite values", () => {
116
- const f = field({ name: "n", type: FieldType.number });
117
- expect(coerceFieldValue(f, "3.14")).toMatchObject({ ok: false });
118
- expect(coerceFieldValue(f, Number.POSITIVE_INFINITY)).toMatchObject({ ok: false });
119
- expect(coerceFieldValue(f, Number.NaN)).toMatchObject({ ok: false });
120
- });
121
- });
122
-
123
- describe("bool", () => {
124
- it("accepts booleans and rejects everything else", () => {
125
- const f = field({ name: "b", type: FieldType.bool });
126
- expect(coerceFieldValue(f, true)).toEqual({ ok: true, value: true });
127
- expect(coerceFieldValue(f, false)).toEqual({ ok: true, value: false });
128
- expect(coerceFieldValue(f, "true")).toMatchObject({ ok: false });
129
- expect(coerceFieldValue(f, 1)).toMatchObject({ ok: false });
130
- });
131
- });
132
-
133
- describe("timestamp", () => {
134
- const f = field({ name: "at", type: FieldType.timestamp });
135
-
136
- it("accepts RFC 3339 UTC and offset forms", () => {
137
- expect(coerceFieldValue(f, "2026-07-21T04:30:00Z")).toEqual({
138
- ok: true,
139
- value: "2026-07-21T04:30:00Z",
140
- });
141
- expect(coerceFieldValue(f, "2026-07-21T04:30:00.123Z")).toMatchObject({ ok: true });
142
- expect(coerceFieldValue(f, "2026-07-21T10:00:00+05:30")).toMatchObject({ ok: true });
143
- });
144
-
145
- it("rejects date-only, missing zone, and garbage", () => {
146
- expect(coerceFieldValue(f, "2026-07-21")).toMatchObject({ ok: false });
147
- expect(coerceFieldValue(f, "2026-07-21T04:30:00")).toMatchObject({ ok: false });
148
- expect(coerceFieldValue(f, "yesterday")).toMatchObject({ ok: false });
149
- expect(coerceFieldValue(f, 1721536200)).toMatchObject({ ok: false });
150
- });
151
- });
152
-
153
- describe("date", () => {
154
- const f = field({ name: "day", type: FieldType.date });
155
-
156
- it("accepts valid YYYY-MM-DD", () => {
157
- expect(coerceFieldValue(f, "2026-07-21")).toEqual({ ok: true, value: "2026-07-21" });
158
- expect(coerceFieldValue(f, "2024-02-29")).toMatchObject({ ok: true }); // leap day
159
- });
160
-
161
- it("rejects impossible dates and other shapes", () => {
162
- expect(coerceFieldValue(f, "2026-02-30")).toMatchObject({ ok: false });
163
- expect(coerceFieldValue(f, "2026-13-01")).toMatchObject({ ok: false });
164
- expect(coerceFieldValue(f, "2023-02-29")).toMatchObject({ ok: false }); // not a leap year
165
- expect(coerceFieldValue(f, "21-07-2026")).toMatchObject({ ok: false });
166
- expect(coerceFieldValue(f, "2026-7-1")).toMatchObject({ ok: false }); // unpadded
167
- });
168
- });
169
-
170
- describe("time", () => {
171
- const f = field({ name: "slot", type: FieldType.time });
172
-
173
- it("canonicalizes HH:MM to HH:MM:SS", () => {
174
- expect(coerceFieldValue(f, "09:30")).toEqual({ ok: true, value: "09:30:00" });
175
- });
176
-
177
- it("passes HH:MM:SS through", () => {
178
- expect(coerceFieldValue(f, "23:59:59")).toEqual({ ok: true, value: "23:59:59" });
179
- });
180
-
181
- it("rejects unpadded, out-of-range, and garbage input", () => {
182
- expect(coerceFieldValue(f, "9:30")).toMatchObject({ ok: false }); // unpadded
183
- expect(coerceFieldValue(f, "24:00")).toMatchObject({ ok: false });
184
- expect(coerceFieldValue(f, "12:60")).toMatchObject({ ok: false });
185
- expect(coerceFieldValue(f, "12:00:60")).toMatchObject({ ok: false });
186
- expect(coerceFieldValue(f, "noon")).toMatchObject({ ok: false });
187
- });
188
- });
189
-
190
- describe("json", () => {
191
- it("passes any JSON value through untouched", () => {
192
- const f = field({ type: FieldType.json });
193
- const nested = { a: [1, "two", { three: true }] };
194
- expect(coerceFieldValue(f, nested)).toEqual({ ok: true, value: nested });
195
- expect(coerceFieldValue(f, [1, 2])).toMatchObject({ ok: true });
196
- expect(coerceFieldValue(f, "plain")).toMatchObject({ ok: true });
197
- });
198
- });
199
-
200
- it("rejects unspecified field types", () => {
201
- expect(
202
- coerceFieldValue(field({ type: FieldType.field_type_unspecified }), "x"),
203
- ).toMatchObject({ ok: false });
204
- });
205
- });
206
-
207
- describe("formatFieldValue", () => {
208
- it("renders null/undefined as empty", () => {
209
- expect(formatFieldValue(FieldType.string, null)).toBe("");
210
- expect(formatFieldValue(FieldType.integer, undefined)).toBe("");
211
- });
212
-
213
- it("trims the stored timestamp's zero fraction", () => {
214
- expect(formatFieldValue(FieldType.timestamp, "2026-07-21T04:30:00.000000000Z")).toBe(
215
- "2026-07-21T04:30:00Z",
216
- );
217
- // Non-zero fractions carry information and stay.
218
- expect(formatFieldValue(FieldType.timestamp, "2026-07-21T04:30:00.500000000Z")).toBe(
219
- "2026-07-21T04:30:00.500000000Z",
220
- );
221
- });
222
-
223
- it("stringifies json values compactly", () => {
224
- expect(formatFieldValue(FieldType.json, { a: 1 })).toBe('{"a":1}');
225
- });
226
-
227
- it("renders scalars canonically", () => {
228
- expect(formatFieldValue(FieldType.bool, true)).toBe("true");
229
- expect(formatFieldValue(FieldType.integer, 42)).toBe("42");
230
- expect(formatFieldValue(FieldType.date, "2026-07-21")).toBe("2026-07-21");
231
- });
232
-
233
- it("formats system timestamps the same way", () => {
234
- expect(formatSystemTimestamp("2026-07-21T04:30:00.000000000Z")).toBe(
235
- "2026-07-21T04:30:00Z",
236
- );
237
- });
238
- });
239
-
240
- describe("operator matrix", () => {
241
- it("string fields get equality operators", () => {
242
- expect(operatorsForField(field({ type: FieldType.string, required: true }))).toEqual([
243
- RecordConditionOp.eq,
244
- RecordConditionOp.neq,
245
- RecordConditionOp.is_in,
246
- RecordConditionOp.not_in,
247
- ]);
248
- });
249
-
250
- it("bool fields get eq/neq only", () => {
251
- expect(operatorsForField(field({ type: FieldType.bool, required: true }))).toEqual([
252
- RecordConditionOp.eq,
253
- RecordConditionOp.neq,
254
- ]);
255
- });
256
-
257
- it("numeric and temporal fields get range operators", () => {
258
- for (const type of [
259
- FieldType.integer,
260
- FieldType.number,
261
- FieldType.timestamp,
262
- FieldType.date,
263
- FieldType.time,
264
- ]) {
265
- expect(operatorsForField(field({ type, required: true }))).toEqual([
266
- RecordConditionOp.eq,
267
- RecordConditionOp.neq,
268
- RecordConditionOp.gt,
269
- RecordConditionOp.gte,
270
- RecordConditionOp.lt,
271
- RecordConditionOp.lte,
272
- ]);
273
- }
274
- });
275
-
276
- it("json fields are not filterable — even optional ones get no null tests", () => {
277
- expect(operatorsForField(field({ type: FieldType.json }))).toEqual([]);
278
- });
279
-
280
- it("optional fields additionally get null tests", () => {
281
- const ops = operatorsForField(field({ type: FieldType.string, required: false }));
282
- expect(ops).toContain(RecordConditionOp.is_null);
283
- expect(ops).toContain(RecordConditionOp.not_null);
284
- });
285
-
286
- it("required fields never get null tests", () => {
287
- const ops = operatorsForField(field({ type: FieldType.string, required: true }));
288
- expect(ops).not.toContain(RecordConditionOp.is_null);
289
- expect(ops).not.toContain(RecordConditionOp.not_null);
290
- });
291
-
292
- it("system fields mirror the server matrix", () => {
293
- expect(SYSTEM_FIELD_OPERATORS.get("id")).toEqual([
294
- RecordConditionOp.eq,
295
- RecordConditionOp.is_in,
296
- ]);
297
- expect(SYSTEM_FIELD_OPERATORS.get("created_at")).toEqual([
298
- RecordConditionOp.gt,
299
- RecordConditionOp.gte,
300
- RecordConditionOp.lt,
301
- RecordConditionOp.lte,
302
- ]);
303
- expect(SYSTEM_FIELD_OPERATORS.get("updated_at")).toEqual(
304
- SYSTEM_FIELD_OPERATORS.get("created_at"),
305
- );
306
- // Not filterable: attribution and ambient scope.
307
- expect(SYSTEM_FIELD_OPERATORS.has("created_by")).toBe(false);
308
- expect(SYSTEM_FIELD_OPERATORS.has("org")).toBe(false);
309
- expect(SYSTEM_FIELD_OPERATORS.has("partition")).toBe(false);
310
- });
311
-
312
- it("classifies operator arity", () => {
313
- expect(isValuelessOperator(RecordConditionOp.is_null)).toBe(true);
314
- expect(isValuelessOperator(RecordConditionOp.not_null)).toBe(true);
315
- expect(isValuelessOperator(RecordConditionOp.eq)).toBe(false);
316
- expect(isListOperator(RecordConditionOp.is_in)).toBe(true);
317
- expect(isListOperator(RecordConditionOp.not_in)).toBe(true);
318
- expect(isListOperator(RecordConditionOp.eq)).toBe(false);
319
- });
320
- });
321
-
322
- describe("isSortableField", () => {
323
- it("declared non-json fields sort; json does not", () => {
324
- expect(isSortableField(field({ type: FieldType.date }))).toBe(true);
325
- expect(isSortableField(field({ type: FieldType.string }))).toBe(true);
326
- expect(isSortableField(field({ type: FieldType.json }))).toBe(false);
327
- expect(isSortableField(field({ type: FieldType.field_type_unspecified }))).toBe(false);
328
- });
329
- });
330
-
331
- describe("buildUpdateFields", () => {
332
- it("carries dirty values and explicit nulls, omits untouched fields", () => {
333
- const payload = buildUpdateFields(
334
- new Map<string, string | null>([
335
- ["patient_phone", "+15550100"],
336
- ["notes", null],
337
- ]),
338
- );
339
- expect(payload).toEqual({ patient_phone: "+15550100", notes: null });
340
- expect("slot_time" in payload).toBe(false);
341
- });
342
-
343
- it("produces an empty object for no edits", () => {
344
- expect(buildUpdateFields(new Map())).toEqual({});
345
- });
346
- });
347
-
348
- describe("RESERVED_FIELD_NAMES", () => {
349
- it("matches the server's reserved set", () => {
350
- expect([...RESERVED_FIELD_NAMES].sort()).toEqual([
351
- "created_at",
352
- "created_by",
353
- "id",
354
- "org",
355
- "partition",
356
- "updated_at",
357
- ]);
358
- });
359
- });
@@ -1,142 +0,0 @@
1
- // Render tests for the two Overview views: the schema view (spec for
2
- // structure — fields, constraints with authored messages, authorization
3
- // summary) and the sync report (status for health).
4
-
5
- import { describe, it, expect, afterEach } from "vitest";
6
- import { render, screen, cleanup } from "@testing-library/react";
7
- import { create } from "@bufbuild/protobuf";
8
- import {
9
- DatastoreSpecSchema,
10
- FieldType,
11
- } from "@stigmer/protos/ai/stigmer/agentic/datastore/v1/spec_pb";
12
- import {
13
- CollectionMaterializationState,
14
- DatastoreStatusSchema,
15
- DatastoreSyncOutcome,
16
- } from "@stigmer/protos/ai/stigmer/agentic/datastore/v1/status_pb";
17
- import { CollectionSchemaView, formatSubject } from "../CollectionSchemaView";
18
- import { DatastoreSyncReport } from "../DatastoreSyncReport";
19
-
20
- afterEach(() => cleanup());
21
-
22
- describe("CollectionSchemaView", () => {
23
- const spec = create(DatastoreSpecSchema, {
24
- timezone: "Asia/Kolkata",
25
- authorization: {
26
- roles: [{ name: "admin" }, { name: "patient" }],
27
- defaultRole: "patient",
28
- bindings: [
29
- {
30
- subject: {
31
- kind: { case: "channelSender", value: { senderKind: "whatsapp", value: "+15550100" } },
32
- },
33
- role: "admin",
34
- },
35
- ],
36
- },
37
- collections: [
38
- {
39
- name: "bookings",
40
- description: "Confirmed appointments",
41
- fields: [
42
- { name: "slot_date", type: FieldType.date, required: true },
43
- {
44
- name: "status",
45
- type: FieldType.string,
46
- enumValues: ["confirmed", "cancelled"],
47
- description: "Booking lifecycle",
48
- },
49
- ],
50
- uniques: [
51
- {
52
- name: "one_confirmed_per_slot",
53
- fields: ["slot_date"],
54
- message: "that slot is already booked",
55
- },
56
- ],
57
- },
58
- ],
59
- });
60
-
61
- it("renders fields, enum values, and required markers", () => {
62
- render(<CollectionSchemaView spec={spec} />);
63
- expect(screen.getByText("slot_date")).toBeTruthy();
64
- expect(screen.getByText(/confirmed \| cancelled/)).toBeTruthy();
65
- expect(screen.getByText("Booking lifecycle")).toBeTruthy();
66
- });
67
-
68
- it("renders constraints with the operator's authored message verbatim", () => {
69
- render(<CollectionSchemaView spec={spec} />);
70
- expect(screen.getByText("one_confirmed_per_slot")).toBeTruthy();
71
- expect(screen.getByText(/that slot is already booked/)).toBeTruthy();
72
- });
73
-
74
- it("summarizes the authorization block: roles, bindings, default_role, timezone", () => {
75
- render(<CollectionSchemaView spec={spec} />);
76
- // "admin" appears as a role chip and as the binding's role.
77
- expect(screen.getAllByText("admin").length).toBeGreaterThan(0);
78
- // "patient" appears as a role chip and as the default_role chip.
79
- expect(screen.getAllByText("patient").length).toBeGreaterThan(0);
80
- expect(screen.getByText("whatsapp:+15550100")).toBeTruthy();
81
- expect(screen.getByText("Asia/Kolkata")).toBeTruthy();
82
- });
83
-
84
- it("states the deny-by-default posture when no default_role is set", () => {
85
- const noDefault = create(DatastoreSpecSchema, {
86
- authorization: { roles: [{ name: "admin" }] },
87
- collections: [{ name: "c", fields: [{ name: "f", type: FieldType.string }] }],
88
- });
89
- render(<CollectionSchemaView spec={noDefault} />);
90
- expect(screen.getByText(/unbound callers are denied/)).toBeTruthy();
91
- });
92
- });
93
-
94
- describe("formatSubject", () => {
95
- it("renders channel senders and principals plainly", () => {
96
- expect(
97
- formatSubject({
98
- kind: { case: "channelSender", value: { senderKind: "whatsapp", value: "+1" } },
99
- } as never),
100
- ).toBe("whatsapp:+1");
101
- expect(
102
- formatSubject({
103
- kind: { case: "principal", value: { kind: "identity_account", id: "ida_1" } },
104
- } as never),
105
- ).toBe("identity_account/ida_1");
106
- expect(formatSubject(undefined)).toBe("unknown");
107
- });
108
- });
109
-
110
- describe("DatastoreSyncReport", () => {
111
- it("renders the outcome badge and per-collection counts", () => {
112
- const status = create(DatastoreStatusSchema, {
113
- lastSyncOutcome: DatastoreSyncOutcome.synced,
114
- collections: [
115
- {
116
- name: "bookings",
117
- state: CollectionMaterializationState.active,
118
- recordCount: 214n,
119
- },
120
- {
121
- name: "old_notes",
122
- state: CollectionMaterializationState.removed,
123
- recordCount: 3n,
124
- },
125
- ],
126
- });
127
- render(<DatastoreSyncReport status={status} />);
128
- expect(screen.getByText("synced")).toBeTruthy();
129
- expect(screen.getByText("214")).toBeTruthy();
130
- expect(screen.getByText("active")).toBeTruthy();
131
- expect(screen.getByText("removed")).toBeTruthy();
132
- });
133
-
134
- it("renders the rejected outcome", () => {
135
- const status = create(DatastoreStatusSchema, {
136
- lastSyncOutcome: DatastoreSyncOutcome.rejected,
137
- });
138
- render(<DatastoreSyncReport status={status} />);
139
- expect(screen.getByText("rejected")).toBeTruthy();
140
- expect(screen.getByText(/No collections have been synced yet/)).toBeTruthy();
141
- });
142
- });
@@ -1,143 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach } from "vitest";
2
- import { renderHook, waitFor } from "@testing-library/react";
3
- import type { ReactNode } from "react";
4
- import { create } from "@bufbuild/protobuf";
5
- import { DatastoreDescriptionSchema } from "@stigmer/protos/ai/stigmer/agentic/datastore/v1/record_io_pb";
6
- import { StigmerContext } from "../../context";
7
- import { FetchCacheContext } from "../../internal/FetchCacheProvider";
8
- import { useDatastoreDescription } from "../useDatastoreDescription";
9
-
10
- function createMockStigmer(overrides: {
11
- describeDatastore?: (...args: unknown[]) => Promise<unknown>;
12
- } = {}) {
13
- return {
14
- datastore: {
15
- describeDatastore:
16
- overrides.describeDatastore ?? vi.fn().mockResolvedValue(null),
17
- },
18
- } as never;
19
- }
20
-
21
- function wrapper(client: unknown) {
22
- return function Wrapper({ children }: { children: ReactNode }) {
23
- return (
24
- <FetchCacheContext.Provider value={null}>
25
- <StigmerContext.Provider value={client as never}>
26
- {children}
27
- </StigmerContext.Provider>
28
- </FetchCacheContext.Provider>
29
- );
30
- };
31
- }
32
-
33
- describe("useDatastoreDescription", () => {
34
- beforeEach(() => {
35
- vi.restoreAllMocks();
36
- });
37
-
38
- it("fetches the description and passes org + datastore through", async () => {
39
- const description = create(DatastoreDescriptionSchema, {
40
- datastore: "clinic",
41
- partitions: ["default", "dr-alt"],
42
- });
43
- const describeDatastore = vi.fn().mockResolvedValue(description);
44
- const client = createMockStigmer({ describeDatastore });
45
-
46
- const { result } = renderHook(() => useDatastoreDescription("acme", "clinic"), {
47
- wrapper: wrapper(client),
48
- });
49
-
50
- await waitFor(() => expect(result.current.isLoading).toBe(false));
51
-
52
- expect(result.current.description).toBe(description);
53
- expect(describeDatastore).toHaveBeenCalledWith(
54
- expect.objectContaining({ org: "acme", datastore: "clinic" }),
55
- );
56
- });
57
-
58
- it("always offers the default partition even when the catalog is empty", async () => {
59
- // The catalog materializes with the first record write; an empty
60
- // datastore reports no partitions but "default" is always addressable.
61
- const description = create(DatastoreDescriptionSchema, {
62
- datastore: "clinic",
63
- partitions: [],
64
- });
65
- const client = createMockStigmer({
66
- describeDatastore: vi.fn().mockResolvedValue(description),
67
- });
68
-
69
- const { result } = renderHook(() => useDatastoreDescription("acme", "clinic"), {
70
- wrapper: wrapper(client),
71
- });
72
-
73
- await waitFor(() => expect(result.current.isLoading).toBe(false));
74
- expect(result.current.partitions).toEqual(["default"]);
75
- });
76
-
77
- it("prepends default when the catalog holds only named partitions", async () => {
78
- const description = create(DatastoreDescriptionSchema, {
79
- datastore: "clinic",
80
- partitions: ["dr-alt"],
81
- });
82
- const client = createMockStigmer({
83
- describeDatastore: vi.fn().mockResolvedValue(description),
84
- });
85
-
86
- const { result } = renderHook(() => useDatastoreDescription("acme", "clinic"), {
87
- wrapper: wrapper(client),
88
- });
89
-
90
- await waitFor(() => expect(result.current.isLoading).toBe(false));
91
- expect(result.current.partitions).toEqual(["default", "dr-alt"]);
92
- });
93
-
94
- it("does not duplicate default when the catalog already carries it", async () => {
95
- const description = create(DatastoreDescriptionSchema, {
96
- datastore: "clinic",
97
- partitions: ["default", "dr-alt"],
98
- });
99
- const client = createMockStigmer({
100
- describeDatastore: vi.fn().mockResolvedValue(description),
101
- });
102
-
103
- const { result } = renderHook(() => useDatastoreDescription("acme", "clinic"), {
104
- wrapper: wrapper(client),
105
- });
106
-
107
- await waitFor(() => expect(result.current.isLoading).toBe(false));
108
- expect(result.current.partitions).toEqual(["default", "dr-alt"]);
109
- });
110
-
111
- it("skips fetching when org or datastore is null", () => {
112
- const describeDatastore = vi.fn();
113
- const client = createMockStigmer({ describeDatastore });
114
-
115
- const { result } = renderHook(() => useDatastoreDescription(null, "clinic"), {
116
- wrapper: wrapper(client),
117
- });
118
-
119
- expect(result.current.isLoading).toBe(false);
120
- expect(result.current.description).toBeNull();
121
- expect(result.current.partitions).toEqual(["default"]);
122
- expect(describeDatastore).not.toHaveBeenCalled();
123
- });
124
-
125
- it("surfaces PERMISSION_DENIED as error — the defensive denied-state branch", async () => {
126
- // A reach-level denial must be catchable and rendered as the
127
- // Records-tab denied panel, never a page-level failure.
128
- const denial = new Error("unauthorized to use records in this datastore");
129
- const client = createMockStigmer({
130
- describeDatastore: vi.fn().mockRejectedValue(denial),
131
- });
132
-
133
- const { result } = renderHook(() => useDatastoreDescription("acme", "clinic"), {
134
- wrapper: wrapper(client),
135
- });
136
-
137
- await waitFor(() => expect(result.current.isLoading).toBe(false));
138
- expect(result.current.error?.message).toBe(
139
- "unauthorized to use records in this datastore",
140
- );
141
- expect(result.current.description).toBeNull();
142
- });
143
- });