@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,250 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach } from "vitest";
2
- import { renderHook, waitFor, act } from "@testing-library/react";
3
- import type { ReactNode } from "react";
4
- import { create } from "@bufbuild/protobuf";
5
- import {
6
- RecordConditionOp,
7
- RecordEnvelopeSchema,
8
- RecordFilterSchema,
9
- RecordListSchema,
10
- RecordSortDirection,
11
- type FindRecordsRequest,
12
- } from "@stigmer/protos/ai/stigmer/agentic/datastore/v1/record_io_pb";
13
- import { StigmerContext } from "../../context";
14
- import { FetchCacheContext } from "../../internal/FetchCacheProvider";
15
- import { useRecordCollection, type RecordColumnDef } from "../useRecordCollection";
16
-
17
- function envelope(id: string, fields: Record<string, unknown> = {}) {
18
- return create(RecordEnvelopeSchema, { id, fields: fields as never });
19
- }
20
-
21
- function recordList(records: ReturnType<typeof envelope>[], total: number) {
22
- return create(RecordListSchema, { records, total, limit: 25, offset: 0 });
23
- }
24
-
25
- function createMockStigmer(findRecords: (req: FindRecordsRequest) => Promise<unknown>) {
26
- return { datastore: { findRecords } } as never;
27
- }
28
-
29
- function wrapper(client: unknown) {
30
- return function Wrapper({ children }: { children: ReactNode }) {
31
- return (
32
- <FetchCacheContext.Provider value={null}>
33
- <StigmerContext.Provider value={client as never}>
34
- {children}
35
- </StigmerContext.Provider>
36
- </FetchCacheContext.Provider>
37
- );
38
- };
39
- }
40
-
41
- const COLUMNS: readonly RecordColumnDef[] = [
42
- { id: "slot_date", header: "Date", cell: (r) => String(r.fields?.["slot_date"] ?? "") },
43
- { id: "status", header: "Status", cell: (r) => String(r.fields?.["status"] ?? ""), sortable: true },
44
- ];
45
-
46
- const SCOPE = { org: "acme", datastore: "clinic", collection: "bookings" } as const;
47
-
48
- describe("useRecordCollection", () => {
49
- beforeEach(() => {
50
- vi.restoreAllMocks();
51
- });
52
-
53
- it("fetches records and reports totals", async () => {
54
- const findRecords = vi
55
- .fn()
56
- .mockResolvedValue(recordList([envelope("dsr_1"), envelope("dsr_2")], 51));
57
- const { result } = renderHook(
58
- () => useRecordCollection({ ...SCOPE, columns: COLUMNS }),
59
- { wrapper: wrapper(createMockStigmer(findRecords)) },
60
- );
61
-
62
- await waitFor(() => expect(result.current.isLoading).toBe(false));
63
-
64
- expect(result.current.records).toHaveLength(2);
65
- expect(result.current.total).toBe(51);
66
- expect(result.current.totalPages).toBe(3); // 51 records at page size 25
67
- expect(result.current.currentPage).toBe(1);
68
- });
69
-
70
- it("translates page/pageSize into RPC limit/offset", async () => {
71
- const findRecords = vi.fn().mockResolvedValue(recordList([], 0));
72
- renderHook(
73
- () => useRecordCollection({ ...SCOPE, page: 3, pageSize: 10, columns: COLUMNS }),
74
- { wrapper: wrapper(createMockStigmer(findRecords)) },
75
- );
76
-
77
- await waitFor(() => expect(findRecords).toHaveBeenCalled());
78
- expect(findRecords).toHaveBeenCalledWith(
79
- expect.objectContaining({ limit: 10, offset: 20 }),
80
- );
81
- });
82
-
83
- it("caps the page size at the RPC max of 100 — one surface, one limit", async () => {
84
- const findRecords = vi.fn().mockResolvedValue(recordList([], 0));
85
- renderHook(
86
- () => useRecordCollection({ ...SCOPE, pageSize: 500, columns: COLUMNS }),
87
- { wrapper: wrapper(createMockStigmer(findRecords)) },
88
- );
89
-
90
- await waitFor(() => expect(findRecords).toHaveBeenCalled());
91
- expect(findRecords).toHaveBeenCalledWith(expect.objectContaining({ limit: 100 }));
92
- });
93
-
94
- it("threads the partition into every fetch (DD-010)", async () => {
95
- const findRecords = vi.fn().mockResolvedValue(recordList([], 0));
96
- renderHook(
97
- () => useRecordCollection({ ...SCOPE, partition: "dr-alt", columns: COLUMNS }),
98
- { wrapper: wrapper(createMockStigmer(findRecords)) },
99
- );
100
-
101
- await waitFor(() => expect(findRecords).toHaveBeenCalled());
102
- expect(findRecords).toHaveBeenCalledWith(
103
- expect.objectContaining({ partition: "dr-alt" }),
104
- );
105
- });
106
-
107
- it("passes the typed proto filter through without adding grammar", async () => {
108
- const filter = create(RecordFilterSchema, {
109
- conditions: [
110
- { field: "status", op: RecordConditionOp.eq, value: { kind: { case: "stringValue", value: "confirmed" } } },
111
- ],
112
- });
113
- const findRecords = vi.fn().mockResolvedValue(recordList([], 0));
114
- renderHook(
115
- () => useRecordCollection({ ...SCOPE, filter, columns: COLUMNS }),
116
- { wrapper: wrapper(createMockStigmer(findRecords)) },
117
- );
118
-
119
- await waitFor(() => expect(findRecords).toHaveBeenCalled());
120
- const request = findRecords.mock.calls[0][0] as FindRecordsRequest;
121
- expect(request.filter?.conditions).toHaveLength(1);
122
- expect(request.filter?.conditions[0].field).toBe("status");
123
- });
124
-
125
- it("builds RecordOrderBy from the controlled sort", async () => {
126
- const findRecords = vi.fn().mockResolvedValue(recordList([], 0));
127
- renderHook(
128
- () =>
129
- useRecordCollection({
130
- ...SCOPE,
131
- sort: { id: "slot_date", direction: "desc" },
132
- columns: COLUMNS,
133
- }),
134
- { wrapper: wrapper(createMockStigmer(findRecords)) },
135
- );
136
-
137
- await waitFor(() => expect(findRecords).toHaveBeenCalled());
138
- const request = findRecords.mock.calls[0][0] as FindRecordsRequest;
139
- expect(request.orderBy?.field).toBe("slot_date");
140
- expect(request.orderBy?.direction).toBe(RecordSortDirection.desc);
141
- });
142
-
143
- it("reports header sort clicks through onSortChange", async () => {
144
- const findRecords = vi.fn().mockResolvedValue(recordList([envelope("dsr_1")], 1));
145
- const onSortChange = vi.fn();
146
- const { result } = renderHook(
147
- () => useRecordCollection({ ...SCOPE, sort: null, onSortChange, columns: COLUMNS }),
148
- { wrapper: wrapper(createMockStigmer(findRecords)) },
149
- );
150
-
151
- await waitFor(() => expect(result.current.isLoading).toBe(false));
152
-
153
- const statusColumn = result.current.table!
154
- .getHeaderGroups()[0]
155
- .headers.find((h) => h.id === "status")!;
156
- act(() => statusColumn.column.toggleSorting(false));
157
-
158
- expect(onSortChange).toHaveBeenCalledWith({ id: "status", direction: "asc" });
159
- });
160
-
161
- it("produces a table keyed by envelope id", async () => {
162
- const findRecords = vi
163
- .fn()
164
- .mockResolvedValue(recordList([envelope("dsr_a"), envelope("dsr_b")], 2));
165
- const { result } = renderHook(
166
- () => useRecordCollection({ ...SCOPE, columns: COLUMNS }),
167
- { wrapper: wrapper(createMockStigmer(findRecords)) },
168
- );
169
-
170
- await waitFor(() => expect(result.current.isLoading).toBe(false));
171
- expect(result.current.table!.getRowModel().rows.map((r) => r.id)).toEqual([
172
- "dsr_a",
173
- "dsr_b",
174
- ]);
175
- });
176
-
177
- it("returns a null table when no columns are provided", async () => {
178
- const findRecords = vi.fn().mockResolvedValue(recordList([], 0));
179
- const { result } = renderHook(() => useRecordCollection({ ...SCOPE }), {
180
- wrapper: wrapper(createMockStigmer(findRecords)),
181
- });
182
-
183
- await waitFor(() => expect(result.current.isLoading).toBe(false));
184
- expect(result.current.table).toBeNull();
185
- });
186
-
187
- it("skips fetching when the scope is incomplete", () => {
188
- const findRecords = vi.fn();
189
- const { result } = renderHook(
190
- () =>
191
- useRecordCollection({
192
- org: "acme",
193
- datastore: "clinic",
194
- collection: null,
195
- columns: COLUMNS,
196
- }),
197
- { wrapper: wrapper(createMockStigmer(findRecords)) },
198
- );
199
-
200
- expect(result.current.isLoading).toBe(false);
201
- expect(findRecords).not.toHaveBeenCalled();
202
- });
203
-
204
- it("surfaces the record-layer denial verbatim — never a silently empty grid", async () => {
205
- const denial = new Error("you are not allowed to read records in bookings");
206
- const findRecords = vi.fn().mockRejectedValue(denial);
207
- const { result } = renderHook(
208
- () => useRecordCollection({ ...SCOPE, columns: COLUMNS }),
209
- { wrapper: wrapper(createMockStigmer(findRecords)) },
210
- );
211
-
212
- await waitFor(() => expect(result.current.isLoading).toBe(false));
213
- expect(result.current.error?.message).toBe(
214
- "you are not allowed to read records in bookings",
215
- );
216
- });
217
-
218
- it("refetch re-runs the current query", async () => {
219
- const findRecords = vi.fn().mockResolvedValue(recordList([envelope("dsr_1")], 1));
220
- const { result } = renderHook(
221
- () => useRecordCollection({ ...SCOPE, columns: COLUMNS }),
222
- { wrapper: wrapper(createMockStigmer(findRecords)) },
223
- );
224
-
225
- await waitFor(() => expect(result.current.isLoading).toBe(false));
226
- expect(findRecords).toHaveBeenCalledTimes(1);
227
-
228
- act(() => result.current.refetch());
229
- await waitFor(() => expect(findRecords).toHaveBeenCalledTimes(2));
230
- });
231
-
232
- it("re-fetches when the filter changes", async () => {
233
- const findRecords = vi.fn().mockResolvedValue(recordList([], 0));
234
- const { rerender } = renderHook(
235
- ({ filter }: { filter?: ReturnType<typeof create<typeof RecordFilterSchema>> }) =>
236
- useRecordCollection({ ...SCOPE, filter, columns: COLUMNS }),
237
- { wrapper: wrapper(createMockStigmer(findRecords)), initialProps: {} },
238
- );
239
-
240
- await waitFor(() => expect(findRecords).toHaveBeenCalledTimes(1));
241
-
242
- rerender({
243
- filter: create(RecordFilterSchema, {
244
- conditions: [{ field: "status", op: RecordConditionOp.is_null }],
245
- }),
246
- });
247
-
248
- await waitFor(() => expect(findRecords).toHaveBeenCalledTimes(2));
249
- });
250
- });
@@ -1,85 +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 {
6
- RecordEnvelopeSchema,
7
- RecordListSchema,
8
- } from "@stigmer/protos/ai/stigmer/agentic/datastore/v1/record_io_pb";
9
- import { StigmerContext } from "../../context";
10
- import { FetchCacheContext } from "../../internal/FetchCacheProvider";
11
- import { useRecordList } from "../useRecordList";
12
-
13
- function wrapper(client: unknown) {
14
- return function Wrapper({ children }: { children: ReactNode }) {
15
- return (
16
- <FetchCacheContext.Provider value={null}>
17
- <StigmerContext.Provider value={client as never}>
18
- {children}
19
- </StigmerContext.Provider>
20
- </FetchCacheContext.Provider>
21
- );
22
- };
23
- }
24
-
25
- const SCOPE = { org: "acme", datastore: "clinic", collection: "bookings" } as const;
26
-
27
- describe("useRecordList", () => {
28
- beforeEach(() => vi.restoreAllMocks());
29
-
30
- it("fetches a page of records", async () => {
31
- const list = create(RecordListSchema, {
32
- records: [create(RecordEnvelopeSchema, { id: "dsr_1" })],
33
- total: 1,
34
- });
35
- const findRecords = vi.fn().mockResolvedValue(list);
36
- const client = { datastore: { findRecords } } as never;
37
-
38
- const { result } = renderHook(() => useRecordList({ ...SCOPE }), {
39
- wrapper: wrapper(client),
40
- });
41
-
42
- await waitFor(() => expect(result.current.isLoading).toBe(false));
43
- expect(result.current.records).toHaveLength(1);
44
- expect(result.current.total).toBe(1);
45
- expect(findRecords).toHaveBeenCalledWith(
46
- expect.objectContaining({
47
- org: "acme",
48
- datastore: "clinic",
49
- collection: "bookings",
50
- partition: "",
51
- limit: 0, // unset — the server applies its default of 25
52
- offset: 0,
53
- }),
54
- );
55
- });
56
-
57
- it("skips fetching when params is null", () => {
58
- const findRecords = vi.fn();
59
- const client = { datastore: { findRecords } } as never;
60
-
61
- const { result } = renderHook(() => useRecordList(null), {
62
- wrapper: wrapper(client),
63
- });
64
-
65
- expect(result.current.isLoading).toBe(false);
66
- expect(result.current.records).toEqual([]);
67
- expect(findRecords).not.toHaveBeenCalled();
68
- });
69
-
70
- it("surfaces the record-layer denial verbatim", async () => {
71
- const denial = new Error("you are not allowed to read records in bookings");
72
- const client = {
73
- datastore: { findRecords: vi.fn().mockRejectedValue(denial) },
74
- } as never;
75
-
76
- const { result } = renderHook(() => useRecordList({ ...SCOPE }), {
77
- wrapper: wrapper(client),
78
- });
79
-
80
- await waitFor(() => expect(result.current.isLoading).toBe(false));
81
- expect(result.current.error?.message).toBe(
82
- "you are not allowed to read records in bookings",
83
- );
84
- });
85
- });
@@ -1,111 +0,0 @@
1
- export { useDatastore } from "./useDatastore.js";
2
- export type { UseDatastoreReturn } from "./useDatastore.js";
3
-
4
- export { useDatastoreList } from "./useDatastoreList.js";
5
- export type {
6
- UseDatastoreListOptions,
7
- UseDatastoreListReturn,
8
- } from "./useDatastoreList.js";
9
-
10
- export { useDatastoreCount } from "./useDatastoreCount.js";
11
- export type {
12
- UseDatastoreCountOptions,
13
- UseDatastoreCountReturn,
14
- } from "./useDatastoreCount.js";
15
-
16
- export { useDatastoreSearch } from "./useDatastoreSearch.js";
17
- export type {
18
- UseDatastoreSearchOptions,
19
- UseDatastoreSearchReturn,
20
- } from "./useDatastoreSearch.js";
21
-
22
- export { useDatastoreDescription, DEFAULT_PARTITION } from "./useDatastoreDescription.js";
23
- export type { UseDatastoreDescriptionReturn } from "./useDatastoreDescription.js";
24
-
25
- export { useRecordList } from "./useRecordList.js";
26
- export type {
27
- RecordScope,
28
- UseRecordListParams,
29
- UseRecordListReturn,
30
- } from "./useRecordList.js";
31
-
32
- export { useInsertRecord } from "./useInsertRecord.js";
33
- export type {
34
- InsertRecordArgs,
35
- UseInsertRecordReturn,
36
- } from "./useInsertRecord.js";
37
-
38
- export { useUpdateRecord } from "./useUpdateRecord.js";
39
- export type {
40
- UpdateRecordArgs,
41
- UseUpdateRecordReturn,
42
- } from "./useUpdateRecord.js";
43
-
44
- export { useDeleteRecord } from "./useDeleteRecord.js";
45
- export type {
46
- DeleteRecordArgs,
47
- UseDeleteRecordReturn,
48
- } from "./useDeleteRecord.js";
49
-
50
- export { useRecordCollection } from "./useRecordCollection.js";
51
- export type {
52
- RecordColumnDef,
53
- UseRecordCollectionOptions,
54
- UseRecordCollectionReturn,
55
- } from "./useRecordCollection.js";
56
-
57
- export { useDeleteDatastore } from "./useDeleteDatastore.js";
58
- export type {
59
- DeleteDatastoreArgs,
60
- UseDeleteDatastoreReturn,
61
- } from "./useDeleteDatastore.js";
62
-
63
- export {
64
- buildUpdateFields,
65
- coerceFieldValue,
66
- formatFieldValue,
67
- formatSystemTimestamp,
68
- isListOperator,
69
- isSortableField,
70
- isValuelessOperator,
71
- operatorsForField,
72
- OPERATOR_LABELS,
73
- RESERVED_FIELD_NAMES,
74
- SYSTEM_FIELD_OPERATORS,
75
- } from "./recordValues.js";
76
- export type { CoerceResult } from "./recordValues.js";
77
-
78
- export {
79
- buildRecordFilter,
80
- filterableFields,
81
- formatConditionChip,
82
- isConditionComplete,
83
- } from "./recordFilter.js";
84
- export type { FilterableField, RecordConditionDraft } from "./recordFilter.js";
85
-
86
- export { FieldValueControl, FIELD_INPUT_CLASSES } from "./FieldValueControl.js";
87
- export type { FieldValueControlProps } from "./FieldValueControl.js";
88
-
89
- export { CollectionSchemaView, formatSubject } from "./CollectionSchemaView.js";
90
- export type { CollectionSchemaViewProps } from "./CollectionSchemaView.js";
91
-
92
- export { DatastoreSyncReport } from "./DatastoreSyncReport.js";
93
- export type { DatastoreSyncReportProps } from "./DatastoreSyncReport.js";
94
-
95
- export { RecordFilterBuilder } from "./RecordFilterBuilder.js";
96
- export type { RecordFilterBuilderProps } from "./RecordFilterBuilder.js";
97
-
98
- export { RecordFormPanel } from "./RecordFormPanel.js";
99
- export type { RecordFormPanelProps } from "./RecordFormPanel.js";
100
-
101
- export { CollectionRecordsBrowser } from "./CollectionRecordsBrowser.js";
102
- export type { CollectionRecordsBrowserProps } from "./CollectionRecordsBrowser.js";
103
-
104
- export { DeleteDatastoreDialog } from "./DeleteDatastoreDialog.js";
105
- export type { DeleteDatastoreDialogProps } from "./DeleteDatastoreDialog.js";
106
-
107
- export { DatastoreDetailView, DatastoreIcon } from "./DatastoreDetailView.js";
108
- export type {
109
- DatastoreDetailTab,
110
- DatastoreDetailViewProps,
111
- } from "./DatastoreDetailView.js";
@@ -1,154 +0,0 @@
1
- // The records-specific filter model (DD-008 SD-3) — typed 1:1 against
2
- // `RecordConditionOp`.
3
- //
4
- // Deliberately NOT the workbench `FilterDef`/`FilterValue` model: its
5
- // `string | string[]` value shape cannot carry typed values or
6
- // value-less null operators, and its operator set includes `contains`,
7
- // which `findRecords` cannot serve. Welding a server-grammar contract
8
- // onto a client-filter model would couple two contracts that evolve
9
- // independently — so this model mirrors the RPC grammar exactly and can
10
- // express nothing the RPC cannot serve (DD-008 invariant 2).
11
-
12
- import { create, fromJson, type JsonValue } from "@bufbuild/protobuf";
13
- import { ValueSchema } from "@bufbuild/protobuf/wkt";
14
- import {
15
- RecordConditionOp,
16
- RecordConditionSchema,
17
- RecordFilterSchema,
18
- type RecordFilter,
19
- } from "@stigmer/protos/ai/stigmer/agentic/datastore/v1/record_io_pb";
20
- import {
21
- FieldType,
22
- type CollectionDeclaration,
23
- type FieldDeclaration,
24
- } from "@stigmer/protos/ai/stigmer/agentic/datastore/v1/spec_pb";
25
- import {
26
- isListOperator,
27
- isValuelessOperator,
28
- OPERATOR_LABELS,
29
- SYSTEM_FIELD_OPERATORS,
30
- operatorsForField,
31
- } from "./recordValues.js";
32
-
33
- /**
34
- * One draft condition in the filter builder — the client-side twin of
35
- * the proto `RecordCondition`, with plain JSON values (converted to
36
- * `google.protobuf.Value` only at request-build time).
37
- */
38
- export interface RecordConditionDraft {
39
- /** Declared field name, or a filterable system field (`id`, `created_at`, `updated_at`). */
40
- readonly field: string;
41
- /** Comparison operator — must be admitted by the field's operator set. */
42
- readonly op: RecordConditionOp;
43
- /** Scalar comparison value. Absent for `is_null`/`not_null` and list operators. */
44
- readonly value?: JsonValue;
45
- /** Comparison values for `is_in`/`not_in`. */
46
- readonly values?: readonly JsonValue[];
47
- }
48
-
49
- /**
50
- * A field the builder can offer: a declared filterable field or a
51
- * filterable system field, with the exact operator set the server
52
- * admits for it.
53
- */
54
- export interface FilterableField {
55
- readonly name: string;
56
- /** The declaration, or `undefined` for system fields. */
57
- readonly declaration?: FieldDeclaration;
58
- /** The field type driving the value control (system fields use fixed types). */
59
- readonly type: FieldType;
60
- readonly operators: readonly RecordConditionOp[];
61
- }
62
-
63
- /**
64
- * The fields a collection's filter builder offers: declared filterable
65
- * fields (json is not filterable) followed by the filterable system
66
- * fields. `id` conditions take string values; the audit timestamps take
67
- * RFC 3339 timestamps — both ride the `timestamp`/`string` value
68
- * controls.
69
- *
70
- * `readableFields` is the caller's column-level read access from
71
- * `describeDatastore` (the read verb's `readable_fields`; empty means
72
- * every field). When restricted, unreadable declared fields are not
73
- * offered — the server refuses conditions on them (the existence-oracle
74
- * guard), and the builder must stay structurally unable to express an
75
- * unservable filter (DD-008 invariant 2). System fields are always
76
- * readable and always offered.
77
- */
78
- export function filterableFields(
79
- collection: CollectionDeclaration,
80
- readableFields?: readonly string[],
81
- ): FilterableField[] {
82
- const readable =
83
- readableFields !== undefined && readableFields.length > 0 ? new Set(readableFields) : null;
84
- const declared: FilterableField[] = [];
85
- for (const field of collection.fields) {
86
- const operators = operatorsForField(field);
87
- if (operators.length === 0) continue; // json — not filterable
88
- if (readable !== null && !readable.has(field.name)) continue; // not readable under the grant
89
- declared.push({ name: field.name, declaration: field, type: field.type, operators });
90
- }
91
- return [
92
- ...declared,
93
- { name: "id", type: FieldType.string, operators: SYSTEM_FIELD_OPERATORS.get("id")! },
94
- {
95
- name: "created_at",
96
- type: FieldType.timestamp,
97
- operators: SYSTEM_FIELD_OPERATORS.get("created_at")!,
98
- },
99
- {
100
- name: "updated_at",
101
- type: FieldType.timestamp,
102
- operators: SYSTEM_FIELD_OPERATORS.get("updated_at")!,
103
- },
104
- ];
105
- }
106
-
107
- /**
108
- * Whether a draft is complete enough to serve: value-less operators
109
- * need nothing, list operators need at least one value, scalar
110
- * operators need a value.
111
- */
112
- export function isConditionComplete(draft: RecordConditionDraft): boolean {
113
- if (draft.op === RecordConditionOp.record_condition_op_unspecified) return false;
114
- if (isValuelessOperator(draft.op)) return true;
115
- if (isListOperator(draft.op)) return (draft.values?.length ?? 0) > 0;
116
- return draft.value !== undefined;
117
- }
118
-
119
- /**
120
- * Build the proto `RecordFilter` from complete drafts. Returns
121
- * `undefined` for an empty set (an absent filter, not an empty one, is
122
- * the RPC's "no filter").
123
- */
124
- export function buildRecordFilter(
125
- conditions: readonly RecordConditionDraft[],
126
- ): RecordFilter | undefined {
127
- const complete = conditions.filter(isConditionComplete);
128
- if (complete.length === 0) return undefined;
129
- return create(RecordFilterSchema, {
130
- conditions: complete.map((draft) =>
131
- create(RecordConditionSchema, {
132
- field: draft.field,
133
- op: draft.op,
134
- value: draft.value !== undefined ? fromJson(ValueSchema, draft.value) : undefined,
135
- values: (draft.values ?? []).map((v) => fromJson(ValueSchema, v)),
136
- }),
137
- ),
138
- });
139
- }
140
-
141
- /** Chip text for an active condition, e.g. `status = confirmed` or `notes is empty`. */
142
- export function formatConditionChip(draft: RecordConditionDraft): string {
143
- const op = OPERATOR_LABELS.get(draft.op) ?? "?";
144
- if (isValuelessOperator(draft.op)) return `${draft.field} ${op}`;
145
- if (isListOperator(draft.op)) {
146
- return `${draft.field} ${op} [${(draft.values ?? []).map(formatChipValue).join(", ")}]`;
147
- }
148
- return `${draft.field} ${op} ${formatChipValue(draft.value)}`;
149
- }
150
-
151
- function formatChipValue(value: JsonValue | undefined): string {
152
- if (value === undefined || value === null) return "";
153
- return typeof value === "string" ? value : JSON.stringify(value);
154
- }