@stigmer/react 3.2.3 → 3.3.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 (402) hide show
  1. package/agent/steps/ReviewStep.d.ts.map +1 -1
  2. package/agent/steps/ReviewStep.js +2 -3
  3. package/agent/steps/ReviewStep.js.map +1 -1
  4. package/billing/BaselineEditor.d.ts +9 -0
  5. package/billing/BaselineEditor.d.ts.map +1 -0
  6. package/billing/BaselineEditor.js +253 -0
  7. package/billing/BaselineEditor.js.map +1 -0
  8. package/billing/ModelCatalogPanel.d.ts +28 -0
  9. package/billing/ModelCatalogPanel.d.ts.map +1 -0
  10. package/billing/ModelCatalogPanel.js +102 -0
  11. package/billing/ModelCatalogPanel.js.map +1 -0
  12. package/billing/ModelGovernanceDetail.d.ts +8 -0
  13. package/billing/ModelGovernanceDetail.d.ts.map +1 -0
  14. package/billing/ModelGovernanceDetail.js +64 -0
  15. package/billing/ModelGovernanceDetail.js.map +1 -0
  16. package/billing/OperatorAccessNotice.d.ts +12 -0
  17. package/billing/OperatorAccessNotice.d.ts.map +1 -0
  18. package/billing/OperatorAccessNotice.js +15 -0
  19. package/billing/OperatorAccessNotice.js.map +1 -0
  20. package/billing/PricingGovernanceConsole.d.ts +57 -0
  21. package/billing/PricingGovernanceConsole.d.ts.map +1 -0
  22. package/billing/PricingGovernanceConsole.js +164 -0
  23. package/billing/PricingGovernanceConsole.js.map +1 -0
  24. package/billing/PricingGovernancePanel.d.ts +26 -0
  25. package/billing/PricingGovernancePanel.d.ts.map +1 -0
  26. package/billing/PricingGovernancePanel.js +64 -0
  27. package/billing/PricingGovernancePanel.js.map +1 -0
  28. package/billing/RetireConfirm.d.ts +9 -0
  29. package/billing/RetireConfirm.d.ts.map +1 -0
  30. package/billing/RetireConfirm.js +19 -0
  31. package/billing/RetireConfirm.js.map +1 -0
  32. package/billing/form-primitives.d.ts +18 -0
  33. package/billing/form-primitives.d.ts.map +1 -0
  34. package/billing/form-primitives.js +19 -0
  35. package/billing/form-primitives.js.map +1 -0
  36. package/billing/governance-primitives.d.ts +33 -0
  37. package/billing/governance-primitives.d.ts.map +1 -0
  38. package/billing/governance-primitives.js +43 -0
  39. package/billing/governance-primitives.js.map +1 -0
  40. package/billing/index.d.ts +18 -0
  41. package/billing/index.d.ts.map +1 -1
  42. package/billing/index.js +9 -0
  43. package/billing/index.js.map +1 -1
  44. package/billing/pricing-format.d.ts +12 -0
  45. package/billing/pricing-format.d.ts.map +1 -0
  46. package/billing/pricing-format.js +50 -0
  47. package/billing/pricing-format.js.map +1 -0
  48. package/billing/useDecidePricingOverride.d.ts +46 -0
  49. package/billing/useDecidePricingOverride.d.ts.map +1 -0
  50. package/billing/useDecidePricingOverride.js +44 -0
  51. package/billing/useDecidePricingOverride.js.map +1 -0
  52. package/billing/useModelGovernanceView.d.ts +103 -0
  53. package/billing/useModelGovernanceView.d.ts.map +1 -0
  54. package/billing/useModelGovernanceView.js +144 -0
  55. package/billing/useModelGovernanceView.js.map +1 -0
  56. package/billing/useModelPricingBaselines.d.ts +40 -0
  57. package/billing/useModelPricingBaselines.d.ts.map +1 -0
  58. package/billing/useModelPricingBaselines.js +32 -0
  59. package/billing/useModelPricingBaselines.js.map +1 -0
  60. package/billing/usePricingGovernance.d.ts +39 -0
  61. package/billing/usePricingGovernance.d.ts.map +1 -0
  62. package/billing/usePricingGovernance.js +31 -0
  63. package/billing/usePricingGovernance.js.map +1 -0
  64. package/billing/useRetireModelPricingBaseline.d.ts +31 -0
  65. package/billing/useRetireModelPricingBaseline.d.ts.map +1 -0
  66. package/billing/useRetireModelPricingBaseline.js +36 -0
  67. package/billing/useRetireModelPricingBaseline.js.map +1 -0
  68. package/billing/useUpsertModelPricingBaseline.d.ts +38 -0
  69. package/billing/useUpsertModelPricingBaseline.d.ts.map +1 -0
  70. package/billing/useUpsertModelPricingBaseline.js +37 -0
  71. package/billing/useUpsertModelPricingBaseline.js.map +1 -0
  72. package/channel/AgentChannelsPanel.d.ts.map +1 -1
  73. package/channel/AgentChannelsPanel.js +11 -5
  74. package/channel/AgentChannelsPanel.js.map +1 -1
  75. package/composer/SessionComposer.d.ts +1 -1
  76. package/cursor-accounts/CursorAccountEditor.d.ts +28 -0
  77. package/cursor-accounts/CursorAccountEditor.d.ts.map +1 -0
  78. package/cursor-accounts/CursorAccountEditor.js +51 -0
  79. package/cursor-accounts/CursorAccountEditor.js.map +1 -0
  80. package/cursor-accounts/CursorAccountsAccessNotice.d.ts +11 -0
  81. package/cursor-accounts/CursorAccountsAccessNotice.d.ts.map +1 -0
  82. package/cursor-accounts/CursorAccountsAccessNotice.js +14 -0
  83. package/cursor-accounts/CursorAccountsAccessNotice.js.map +1 -0
  84. package/cursor-accounts/CursorAccountsConsole.d.ts +28 -0
  85. package/cursor-accounts/CursorAccountsConsole.d.ts.map +1 -0
  86. package/cursor-accounts/CursorAccountsConsole.js +275 -0
  87. package/cursor-accounts/CursorAccountsConsole.js.map +1 -0
  88. package/cursor-accounts/cursor-account-format.d.ts +10 -0
  89. package/cursor-accounts/cursor-account-format.d.ts.map +1 -0
  90. package/cursor-accounts/cursor-account-format.js +26 -0
  91. package/cursor-accounts/cursor-account-format.js.map +1 -0
  92. package/cursor-accounts/index.d.ts +18 -0
  93. package/cursor-accounts/index.d.ts.map +1 -0
  94. package/cursor-accounts/index.js +13 -0
  95. package/cursor-accounts/index.js.map +1 -0
  96. package/cursor-accounts/useCursorAccountView.d.ts +30 -0
  97. package/cursor-accounts/useCursorAccountView.d.ts.map +1 -0
  98. package/cursor-accounts/useCursorAccountView.js +25 -0
  99. package/cursor-accounts/useCursorAccountView.js.map +1 -0
  100. package/cursor-accounts/useCursorAccounts.d.ts +33 -0
  101. package/cursor-accounts/useCursorAccounts.d.ts.map +1 -0
  102. package/cursor-accounts/useCursorAccounts.js +25 -0
  103. package/cursor-accounts/useCursorAccounts.js.map +1 -0
  104. package/cursor-accounts/useCursorMemberKeyActions.d.ts +49 -0
  105. package/cursor-accounts/useCursorMemberKeyActions.d.ts.map +1 -0
  106. package/cursor-accounts/useCursorMemberKeyActions.js +38 -0
  107. package/cursor-accounts/useCursorMemberKeyActions.js.map +1 -0
  108. package/cursor-accounts/useDeleteCursorAccount.d.ts +30 -0
  109. package/cursor-accounts/useDeleteCursorAccount.d.ts.map +1 -0
  110. package/cursor-accounts/useDeleteCursorAccount.js +32 -0
  111. package/cursor-accounts/useDeleteCursorAccount.js.map +1 -0
  112. package/cursor-accounts/useSyncCursorAccount.d.ts +23 -0
  113. package/cursor-accounts/useSyncCursorAccount.d.ts.map +1 -0
  114. package/cursor-accounts/useSyncCursorAccount.js +31 -0
  115. package/cursor-accounts/useSyncCursorAccount.js.map +1 -0
  116. package/cursor-accounts/useUpsertCursorAccount.d.ts +26 -0
  117. package/cursor-accounts/useUpsertCursorAccount.d.ts.map +1 -0
  118. package/cursor-accounts/useUpsertCursorAccount.js +34 -0
  119. package/cursor-accounts/useUpsertCursorAccount.js.map +1 -0
  120. package/datastore/CollectionRecordsBrowser.d.ts +34 -0
  121. package/datastore/CollectionRecordsBrowser.d.ts.map +1 -0
  122. package/datastore/CollectionRecordsBrowser.js +209 -0
  123. package/datastore/CollectionRecordsBrowser.js.map +1 -0
  124. package/datastore/CollectionSchemaView.d.ts +29 -0
  125. package/datastore/CollectionSchemaView.d.ts.map +1 -0
  126. package/datastore/CollectionSchemaView.js +93 -0
  127. package/datastore/CollectionSchemaView.js.map +1 -0
  128. package/datastore/DatastoreDetailView.d.ts +44 -0
  129. package/datastore/DatastoreDetailView.d.ts.map +1 -0
  130. package/datastore/DatastoreDetailView.js +76 -0
  131. package/datastore/DatastoreDetailView.js.map +1 -0
  132. package/datastore/DatastoreSyncReport.d.ts +19 -0
  133. package/datastore/DatastoreSyncReport.d.ts.map +1 -0
  134. package/datastore/DatastoreSyncReport.js +45 -0
  135. package/datastore/DatastoreSyncReport.js.map +1 -0
  136. package/datastore/DeleteDatastoreDialog.d.ts +35 -0
  137. package/datastore/DeleteDatastoreDialog.d.ts.map +1 -0
  138. package/datastore/DeleteDatastoreDialog.js +90 -0
  139. package/datastore/DeleteDatastoreDialog.js.map +1 -0
  140. package/datastore/FieldValueControl.d.ts +55 -0
  141. package/datastore/FieldValueControl.d.ts.map +1 -0
  142. package/datastore/FieldValueControl.js +138 -0
  143. package/datastore/FieldValueControl.js.map +1 -0
  144. package/datastore/RecordFilterBuilder.d.ts +30 -0
  145. package/datastore/RecordFilterBuilder.d.ts.map +1 -0
  146. package/datastore/RecordFilterBuilder.js +122 -0
  147. package/datastore/RecordFilterBuilder.js.map +1 -0
  148. package/datastore/RecordFormPanel.d.ts +45 -0
  149. package/datastore/RecordFormPanel.d.ts.map +1 -0
  150. package/datastore/RecordFormPanel.js +215 -0
  151. package/datastore/RecordFormPanel.js.map +1 -0
  152. package/datastore/index.d.ts +43 -0
  153. package/datastore/index.d.ts.map +1 -0
  154. package/datastore/index.js +22 -0
  155. package/datastore/index.js.map +1 -0
  156. package/datastore/recordFilter.d.ts +54 -0
  157. package/datastore/recordFilter.d.ts.map +1 -0
  158. package/datastore/recordFilter.js +93 -0
  159. package/datastore/recordFilter.js.map +1 -0
  160. package/datastore/recordValues.d.ts +85 -0
  161. package/datastore/recordValues.d.ts.map +1 -0
  162. package/datastore/recordValues.js +282 -0
  163. package/datastore/recordValues.js.map +1 -0
  164. package/datastore/useDatastore.d.ts +39 -0
  165. package/datastore/useDatastore.d.ts.map +1 -0
  166. package/datastore/useDatastore.js +44 -0
  167. package/datastore/useDatastore.js.map +1 -0
  168. package/datastore/useDatastoreCount.d.ts +48 -0
  169. package/datastore/useDatastoreCount.d.ts.map +1 -0
  170. package/datastore/useDatastoreCount.js +27 -0
  171. package/datastore/useDatastoreCount.js.map +1 -0
  172. package/datastore/useDatastoreDescription.d.ts +54 -0
  173. package/datastore/useDatastoreDescription.d.ts.map +1 -0
  174. package/datastore/useDatastoreDescription.js +50 -0
  175. package/datastore/useDatastoreDescription.js.map +1 -0
  176. package/datastore/useDatastoreList.d.ts +57 -0
  177. package/datastore/useDatastoreList.d.ts.map +1 -0
  178. package/datastore/useDatastoreList.js +29 -0
  179. package/datastore/useDatastoreList.js.map +1 -0
  180. package/datastore/useDatastoreSearch.d.ts +19 -0
  181. package/datastore/useDatastoreSearch.d.ts.map +1 -0
  182. package/datastore/useDatastoreSearch.js +22 -0
  183. package/datastore/useDatastoreSearch.js.map +1 -0
  184. package/datastore/useDeleteDatastore.d.ts +53 -0
  185. package/datastore/useDeleteDatastore.d.ts.map +1 -0
  186. package/datastore/useDeleteDatastore.js +40 -0
  187. package/datastore/useDeleteDatastore.js.map +1 -0
  188. package/datastore/useDeleteRecord.d.ts +34 -0
  189. package/datastore/useDeleteRecord.d.ts.map +1 -0
  190. package/datastore/useDeleteRecord.js +43 -0
  191. package/datastore/useDeleteRecord.js.map +1 -0
  192. package/datastore/useInsertRecord.d.ts +50 -0
  193. package/datastore/useInsertRecord.d.ts.map +1 -0
  194. package/datastore/useInsertRecord.js +55 -0
  195. package/datastore/useInsertRecord.js.map +1 -0
  196. package/datastore/useRecordCollection.d.ts +104 -0
  197. package/datastore/useRecordCollection.d.ts.map +1 -0
  198. package/datastore/useRecordCollection.js +136 -0
  199. package/datastore/useRecordCollection.js.map +1 -0
  200. package/datastore/useRecordList.d.ts +66 -0
  201. package/datastore/useRecordList.d.ts.map +1 -0
  202. package/datastore/useRecordList.js +58 -0
  203. package/datastore/useRecordList.js.map +1 -0
  204. package/datastore/useUpdateRecord.d.ts +52 -0
  205. package/datastore/useUpdateRecord.d.ts.map +1 -0
  206. package/datastore/useUpdateRecord.js +55 -0
  207. package/datastore/useUpdateRecord.js.map +1 -0
  208. package/environment/EnvironmentListPanel.d.ts.map +1 -1
  209. package/environment/EnvironmentListPanel.js +12 -7
  210. package/environment/EnvironmentListPanel.js.map +1 -1
  211. package/iam-policy/index.d.ts +1 -1
  212. package/iam-policy/index.d.ts.map +1 -1
  213. package/iam-policy/index.js.map +1 -1
  214. package/iam-policy/useCheckPermission.d.ts +32 -11
  215. package/iam-policy/useCheckPermission.d.ts.map +1 -1
  216. package/iam-policy/useCheckPermission.js +24 -19
  217. package/iam-policy/useCheckPermission.js.map +1 -1
  218. package/index.d.ts +12 -6
  219. package/index.d.ts.map +1 -1
  220. package/index.js +14 -3
  221. package/index.js.map +1 -1
  222. package/library/index.d.ts +0 -7
  223. package/library/index.d.ts.map +1 -1
  224. package/library/index.js +0 -4
  225. package/library/index.js.map +1 -1
  226. package/library/useApplyResource.d.ts +12 -12
  227. package/library/useApplyResource.d.ts.map +1 -1
  228. package/library/useApplyResource.js +16 -25
  229. package/library/useApplyResource.js.map +1 -1
  230. package/library/useExportResource.d.ts +13 -9
  231. package/library/useExportResource.d.ts.map +1 -1
  232. package/library/useExportResource.js +18 -36
  233. package/library/useExportResource.js.map +1 -1
  234. package/manifest/ApplyManifestDialog.d.ts +48 -0
  235. package/manifest/ApplyManifestDialog.d.ts.map +1 -0
  236. package/manifest/ApplyManifestDialog.js +135 -0
  237. package/manifest/ApplyManifestDialog.js.map +1 -0
  238. package/manifest/EditResourceYamlDialog.d.ts +51 -0
  239. package/manifest/EditResourceYamlDialog.d.ts.map +1 -0
  240. package/manifest/EditResourceYamlDialog.js +104 -0
  241. package/manifest/EditResourceYamlDialog.js.map +1 -0
  242. package/manifest/RedactedSecretsNotice.d.ts +14 -0
  243. package/manifest/RedactedSecretsNotice.d.ts.map +1 -0
  244. package/manifest/RedactedSecretsNotice.js +14 -0
  245. package/manifest/RedactedSecretsNotice.js.map +1 -0
  246. package/manifest/YamlEditor.d.ts +44 -0
  247. package/manifest/YamlEditor.d.ts.map +1 -0
  248. package/manifest/YamlEditor.js +216 -0
  249. package/manifest/YamlEditor.js.map +1 -0
  250. package/manifest/index.d.ts +13 -0
  251. package/manifest/index.d.ts.map +1 -0
  252. package/manifest/index.js +13 -0
  253. package/manifest/index.js.map +1 -0
  254. package/manifest/useApplyManifest.d.ts +82 -0
  255. package/manifest/useApplyManifest.d.ts.map +1 -0
  256. package/manifest/useApplyManifest.js +180 -0
  257. package/manifest/useApplyManifest.js.map +1 -0
  258. package/manifest/useEditResourceYaml.d.ts +106 -0
  259. package/manifest/useEditResourceYaml.d.ts.map +1 -0
  260. package/manifest/useEditResourceYaml.js +168 -0
  261. package/manifest/useEditResourceYaml.js.map +1 -0
  262. package/mcp-server/steps/ReviewStep.d.ts.map +1 -1
  263. package/mcp-server/steps/ReviewStep.js +2 -3
  264. package/mcp-server/steps/ReviewStep.js.map +1 -1
  265. package/package.json +4 -4
  266. package/resource-creation/templates/workflow-templates.js +4 -4
  267. package/session/useEditSessionPrep.js +3 -3
  268. package/session/useEditSessionPrep.js.map +1 -1
  269. package/settings/index.d.ts +2 -1
  270. package/settings/index.d.ts.map +1 -1
  271. package/settings/index.js +2 -1
  272. package/settings/index.js.map +1 -1
  273. package/settings/settings-nav.d.ts +22 -0
  274. package/settings/settings-nav.d.ts.map +1 -1
  275. package/settings/settings-nav.js +32 -1
  276. package/settings/settings-nav.js.map +1 -1
  277. package/settings/useSettingsNavGroups.d.ts +29 -0
  278. package/settings/useSettingsNavGroups.d.ts.map +1 -0
  279. package/settings/useSettingsNavGroups.js +61 -0
  280. package/settings/useSettingsNavGroups.js.map +1 -0
  281. package/src/agent/steps/ReviewStep.tsx +2 -3
  282. package/src/billing/BaselineEditor.tsx +619 -0
  283. package/src/billing/ModelCatalogPanel.tsx +283 -0
  284. package/src/billing/ModelGovernanceDetail.tsx +289 -0
  285. package/src/billing/OperatorAccessNotice.tsx +32 -0
  286. package/src/billing/PricingGovernanceConsole.tsx +465 -0
  287. package/src/billing/PricingGovernancePanel.tsx +166 -0
  288. package/src/billing/RetireConfirm.tsx +82 -0
  289. package/src/billing/__tests__/ModelCatalogPanel.test.tsx +253 -0
  290. package/src/billing/__tests__/PricingGovernanceConsole.test.tsx +410 -0
  291. package/src/billing/__tests__/useModelGovernanceView.test.tsx +308 -0
  292. package/src/billing/form-primitives.tsx +68 -0
  293. package/src/billing/governance-primitives.tsx +133 -0
  294. package/src/billing/index.ts +37 -0
  295. package/src/billing/pricing-format.ts +53 -0
  296. package/src/billing/useDecidePricingOverride.ts +78 -0
  297. package/src/billing/useModelGovernanceView.ts +290 -0
  298. package/src/billing/useModelPricingBaselines.ts +69 -0
  299. package/src/billing/usePricingGovernance.ts +57 -0
  300. package/src/billing/useRetireModelPricingBaseline.ts +65 -0
  301. package/src/billing/useUpsertModelPricingBaseline.ts +72 -0
  302. package/src/channel/AgentChannelsPanel.tsx +27 -1
  303. package/src/composer/SessionComposer.tsx +1 -1
  304. package/src/cursor-accounts/CursorAccountEditor.tsx +181 -0
  305. package/src/cursor-accounts/CursorAccountsAccessNotice.tsx +36 -0
  306. package/src/cursor-accounts/CursorAccountsConsole.tsx +810 -0
  307. package/src/cursor-accounts/__tests__/CursorAccountsConsole.test.tsx +384 -0
  308. package/src/cursor-accounts/cursor-account-format.ts +29 -0
  309. package/src/cursor-accounts/index.ts +29 -0
  310. package/src/cursor-accounts/useCursorAccountView.ts +49 -0
  311. package/src/cursor-accounts/useCursorAccounts.ts +49 -0
  312. package/src/cursor-accounts/useCursorMemberKeyActions.ts +106 -0
  313. package/src/cursor-accounts/useDeleteCursorAccount.ts +62 -0
  314. package/src/cursor-accounts/useSyncCursorAccount.ts +54 -0
  315. package/src/cursor-accounts/useUpsertCursorAccount.ts +57 -0
  316. package/src/datastore/CollectionRecordsBrowser.tsx +544 -0
  317. package/src/datastore/CollectionSchemaView.tsx +247 -0
  318. package/src/datastore/DatastoreDetailView.tsx +201 -0
  319. package/src/datastore/DatastoreSyncReport.tsx +105 -0
  320. package/src/datastore/DeleteDatastoreDialog.tsx +202 -0
  321. package/src/datastore/FieldValueControl.tsx +289 -0
  322. package/src/datastore/RecordFilterBuilder.tsx +411 -0
  323. package/src/datastore/RecordFormPanel.tsx +432 -0
  324. package/src/datastore/__tests__/CollectionRecordsBrowser.test.tsx +207 -0
  325. package/src/datastore/__tests__/DeleteDatastoreDialog.test.tsx +133 -0
  326. package/src/datastore/__tests__/FieldValueControl.test.tsx +160 -0
  327. package/src/datastore/__tests__/RecordFilterBuilder.test.tsx +141 -0
  328. package/src/datastore/__tests__/RecordFormPanel.test.tsx +227 -0
  329. package/src/datastore/__tests__/recordFilter.test.ts +156 -0
  330. package/src/datastore/__tests__/recordMutations.test.tsx +195 -0
  331. package/src/datastore/__tests__/recordValues.test.ts +359 -0
  332. package/src/datastore/__tests__/schemaAndSyncViews.test.tsx +142 -0
  333. package/src/datastore/__tests__/useDatastoreDescription.test.tsx +143 -0
  334. package/src/datastore/__tests__/useRecordCollection.test.tsx +250 -0
  335. package/src/datastore/__tests__/useRecordList.test.tsx +85 -0
  336. package/src/datastore/index.ts +111 -0
  337. package/src/datastore/recordFilter.ts +140 -0
  338. package/src/datastore/recordValues.ts +327 -0
  339. package/src/datastore/useDatastore.ts +67 -0
  340. package/src/datastore/useDatastoreCount.ts +67 -0
  341. package/src/datastore/useDatastoreDescription.ts +90 -0
  342. package/src/datastore/useDatastoreList.ts +79 -0
  343. package/src/datastore/useDatastoreSearch.ts +39 -0
  344. package/src/datastore/useDeleteDatastore.ts +87 -0
  345. package/src/datastore/useDeleteRecord.ts +77 -0
  346. package/src/datastore/useInsertRecord.ts +92 -0
  347. package/src/datastore/useRecordCollection.ts +256 -0
  348. package/src/datastore/useRecordList.ts +131 -0
  349. package/src/datastore/useUpdateRecord.ts +95 -0
  350. package/src/environment/EnvironmentListPanel.tsx +24 -0
  351. package/src/execution/__tests__/useArtifactInspection.test.tsx +12 -2
  352. package/src/iam-policy/__tests__/useCheckPermission.test.tsx +221 -0
  353. package/src/iam-policy/index.ts +1 -0
  354. package/src/iam-policy/useCheckPermission.ts +45 -19
  355. package/src/index.ts +163 -13
  356. package/src/library/index.ts +0 -20
  357. package/src/library/useApplyResource.ts +27 -34
  358. package/src/library/useExportResource.ts +21 -40
  359. package/src/manifest/ApplyManifestDialog.tsx +315 -0
  360. package/src/manifest/EditResourceYamlDialog.tsx +265 -0
  361. package/src/manifest/RedactedSecretsNotice.tsx +30 -0
  362. package/src/manifest/YamlEditor.tsx +272 -0
  363. package/src/manifest/__tests__/EditResourceYamlDialog.test.tsx +118 -0
  364. package/src/manifest/__tests__/useApplyManifest.test.tsx +237 -0
  365. package/src/manifest/__tests__/useEditResourceYaml.test.tsx +252 -0
  366. package/src/manifest/index.ts +33 -0
  367. package/src/manifest/useApplyManifest.ts +270 -0
  368. package/src/manifest/useEditResourceYaml.ts +273 -0
  369. package/src/mcp-server/steps/ReviewStep.tsx +2 -3
  370. package/src/resource-creation/templates/workflow-templates.ts +4 -4
  371. package/src/session/useEditSessionPrep.ts +3 -3
  372. package/src/settings/__tests__/useSettingsNavGroups.test.tsx +138 -0
  373. package/src/settings/index.ts +5 -1
  374. package/src/settings/settings-nav.ts +43 -0
  375. package/src/settings/useSettingsNavGroups.ts +81 -0
  376. package/src/workflow/WorkflowYamlEditor.tsx +6 -270
  377. package/styles.css +1 -1
  378. package/workflow/CanvasTransitionEdge.d.ts +1 -1
  379. package/workflow/WorkflowYamlEditor.d.ts +2 -42
  380. package/workflow/WorkflowYamlEditor.d.ts.map +1 -1
  381. package/workflow/WorkflowYamlEditor.js +5 -214
  382. package/workflow/WorkflowYamlEditor.js.map +1 -1
  383. package/library/ImportResourceDialog.d.ts +0 -43
  384. package/library/ImportResourceDialog.d.ts.map +0 -1
  385. package/library/ImportResourceDialog.js +0 -90
  386. package/library/ImportResourceDialog.js.map +0 -1
  387. package/library/parse-resource-yaml.d.ts +0 -63
  388. package/library/parse-resource-yaml.d.ts.map +0 -1
  389. package/library/parse-resource-yaml.js +0 -407
  390. package/library/parse-resource-yaml.js.map +0 -1
  391. package/library/serialize-resource-yaml.d.ts +0 -103
  392. package/library/serialize-resource-yaml.d.ts.map +0 -1
  393. package/library/serialize-resource-yaml.js +0 -565
  394. package/library/serialize-resource-yaml.js.map +0 -1
  395. package/library/useImportResource.d.ts +0 -84
  396. package/library/useImportResource.d.ts.map +0 -1
  397. package/library/useImportResource.js +0 -188
  398. package/library/useImportResource.js.map +0 -1
  399. package/src/library/ImportResourceDialog.tsx +0 -227
  400. package/src/library/parse-resource-yaml.ts +0 -630
  401. package/src/library/serialize-resource-yaml.ts +0 -756
  402. package/src/library/useImportResource.ts +0 -253
@@ -0,0 +1,247 @@
1
+ "use client";
2
+
3
+ import { cn } from "@stigmer/theme";
4
+ import { toJson } from "@bufbuild/protobuf";
5
+ import { ValueSchema } from "@bufbuild/protobuf/wkt";
6
+ import {
7
+ FieldType,
8
+ type CollectionDeclaration,
9
+ type DatastoreAuthorization,
10
+ type DatastoreSpec,
11
+ type DatastoreSubject,
12
+ } from "@stigmer/protos/ai/stigmer/agentic/datastore/v1/spec_pb";
13
+ import { Section } from "../resource-detail/Section.js";
14
+ import { formatFieldValue } from "./recordValues.js";
15
+
16
+ /** Props for {@link CollectionSchemaView}. */
17
+ export interface CollectionSchemaViewProps {
18
+ /** The datastore spec — the authoritative source for structure (DD-008 SD-5). */
19
+ readonly spec: DatastoreSpec;
20
+ /** Additional CSS classes for the root container. */
21
+ readonly className?: string;
22
+ }
23
+
24
+ /**
25
+ * Structural view of a datastore's declared schema, rendered from the
26
+ * loaded resource spec: per-collection typed field tables, the declared
27
+ * constraints with their authored messages (the operator's own copy —
28
+ * the same bytes agents relay), and the authorization block summary
29
+ * (roles, bindings, `default_role` — operator-facing state the
30
+ * describe projection deliberately excludes).
31
+ *
32
+ * Read-only by design: schema changes go through YAML apply, the one
33
+ * write path for structure.
34
+ *
35
+ * All visual properties flow through `--stgm-*` design tokens.
36
+ * Zero Console dependencies — safe for platform builder embedding.
37
+ */
38
+ export function CollectionSchemaView({ spec, className }: CollectionSchemaViewProps) {
39
+ return (
40
+ <div className={cn("flex flex-col gap-6", className)}>
41
+ <AuthorizationSummary authorization={spec.authorization} timezone={spec.timezone} />
42
+ {spec.collections.map((coll) => (
43
+ <CollectionSchema key={coll.name} collection={coll} />
44
+ ))}
45
+ </div>
46
+ );
47
+ }
48
+
49
+ // ---------------------------------------------------------------------------
50
+ // Authorization block summary
51
+ // ---------------------------------------------------------------------------
52
+
53
+ function AuthorizationSummary({
54
+ authorization,
55
+ timezone,
56
+ }: {
57
+ readonly authorization: DatastoreAuthorization | undefined;
58
+ readonly timezone: string;
59
+ }) {
60
+ const roles = authorization?.roles ?? [];
61
+ const bindings = authorization?.bindings ?? [];
62
+ const defaultRole = authorization?.defaultRole ?? "";
63
+
64
+ return (
65
+ <Section title="Authorization">
66
+ <div className="flex flex-col gap-3 p-3 text-sm">
67
+ <div className="flex flex-wrap items-center gap-2">
68
+ <span className="text-xs font-medium text-muted-foreground">Roles</span>
69
+ {roles.length === 0 ? (
70
+ <span className="text-xs text-muted-foreground">none declared</span>
71
+ ) : (
72
+ roles.map((r) => (
73
+ <span
74
+ key={r.name}
75
+ className="rounded-full bg-muted px-2 py-0.5 text-xs font-medium text-foreground"
76
+ >
77
+ {r.name}
78
+ </span>
79
+ ))
80
+ )}
81
+ </div>
82
+ <div className="flex flex-wrap items-center gap-2">
83
+ <span className="text-xs font-medium text-muted-foreground">Default role</span>
84
+ {defaultRole ? (
85
+ <span className="rounded-full bg-muted px-2 py-0.5 text-xs font-medium text-foreground">
86
+ {defaultRole}
87
+ </span>
88
+ ) : (
89
+ <span className="text-xs text-muted-foreground">
90
+ none — unbound callers are denied
91
+ </span>
92
+ )}
93
+ </div>
94
+ {bindings.length > 0 && (
95
+ <div className="flex flex-col gap-1">
96
+ <span className="text-xs font-medium text-muted-foreground">
97
+ Bindings ({bindings.length})
98
+ </span>
99
+ <ul className="flex flex-col gap-0.5">
100
+ {bindings.map((b, i) => (
101
+ <li key={i} className="text-xs text-foreground">
102
+ <code className="font-mono">{formatSubject(b.subject)}</code>
103
+ <span className="text-muted-foreground"> → </span>
104
+ {b.role}
105
+ </li>
106
+ ))}
107
+ </ul>
108
+ </div>
109
+ )}
110
+ {timezone && (
111
+ <div className="flex items-center gap-2">
112
+ <span className="text-xs font-medium text-muted-foreground">Timezone</span>
113
+ <span className="text-xs text-foreground">{timezone}</span>
114
+ </div>
115
+ )}
116
+ </div>
117
+ </Section>
118
+ );
119
+ }
120
+
121
+ /**
122
+ * Plain kind+value rendering of a datastore subject (DD-008 SD-3: the
123
+ * grant system is the privacy boundary; display is honest).
124
+ */
125
+ export function formatSubject(subject: DatastoreSubject | undefined): string {
126
+ switch (subject?.kind.case) {
127
+ case "channelSender": {
128
+ const s = subject.kind.value;
129
+ return `${s.senderKind}:${s.value}`;
130
+ }
131
+ case "principal": {
132
+ const p = subject.kind.value;
133
+ return `${p.kind}/${p.id}`;
134
+ }
135
+ default:
136
+ return "unknown";
137
+ }
138
+ }
139
+
140
+ // ---------------------------------------------------------------------------
141
+ // Per-collection schema
142
+ // ---------------------------------------------------------------------------
143
+
144
+ const CONSTRAINT_KIND_LABELS = {
145
+ uniques: "unique",
146
+ checks: "check",
147
+ exists: "exists",
148
+ notExists: "not exists",
149
+ } as const;
150
+
151
+ function CollectionSchema({ collection }: { readonly collection: CollectionDeclaration }) {
152
+ const constraints = [
153
+ ...collection.uniques.map((c) => ({
154
+ kind: CONSTRAINT_KIND_LABELS.uniques,
155
+ name: c.name,
156
+ fields: c.fields.join(", "),
157
+ message: c.message,
158
+ })),
159
+ ...collection.checks.map((c) => ({
160
+ kind: CONSTRAINT_KIND_LABELS.checks,
161
+ name: c.name,
162
+ fields: "",
163
+ message: c.message,
164
+ })),
165
+ ...collection.exists.map((c) => ({
166
+ kind: CONSTRAINT_KIND_LABELS.exists,
167
+ name: c.name,
168
+ fields: c.collection,
169
+ message: c.message,
170
+ })),
171
+ ...collection.notExists.map((c) => ({
172
+ kind: CONSTRAINT_KIND_LABELS.notExists,
173
+ name: c.name,
174
+ fields: c.collection,
175
+ message: c.message,
176
+ })),
177
+ ];
178
+
179
+ return (
180
+ <Section title={collection.name} count={collection.fields.length}>
181
+ <div className="flex flex-col">
182
+ {collection.description && (
183
+ <p className="border-b border-border px-3 py-2 text-xs text-muted-foreground">
184
+ {collection.description}
185
+ </p>
186
+ )}
187
+
188
+ <table className="w-full text-left text-xs">
189
+ <thead>
190
+ <tr className="border-b border-border text-muted-foreground">
191
+ <th scope="col" className="px-3 py-2 font-medium">Field</th>
192
+ <th scope="col" className="px-3 py-2 font-medium">Type</th>
193
+ <th scope="col" className="px-3 py-2 font-medium">Required</th>
194
+ <th scope="col" className="px-3 py-2 font-medium">Default</th>
195
+ <th scope="col" className="px-3 py-2 font-medium">Description</th>
196
+ </tr>
197
+ </thead>
198
+ <tbody>
199
+ {collection.fields.map((f) => (
200
+ <tr key={f.name} className="border-b border-border last:border-b-0">
201
+ <td className="px-3 py-2 font-mono text-foreground">{f.name}</td>
202
+ <td className="px-3 py-2 text-foreground">
203
+ {FieldType[f.type]}
204
+ {f.enumValues.length > 0 && (
205
+ <span className="text-muted-foreground">
206
+ {" "}
207
+ ({f.enumValues.join(" | ")})
208
+ </span>
209
+ )}
210
+ </td>
211
+ <td className="px-3 py-2 text-muted-foreground">{f.required ? "yes" : ""}</td>
212
+ <td className="px-3 py-2 font-mono text-muted-foreground">
213
+ {f.default !== undefined
214
+ ? formatFieldValue(f.type, toJson(ValueSchema, f.default))
215
+ : ""}
216
+ </td>
217
+ <td className="px-3 py-2 text-muted-foreground">{f.description}</td>
218
+ </tr>
219
+ ))}
220
+ </tbody>
221
+ </table>
222
+
223
+ {constraints.length > 0 && (
224
+ <div className="border-t border-border">
225
+ <h4 className="px-3 pt-2 text-xs font-medium uppercase tracking-wider text-muted-foreground">
226
+ Constraints
227
+ </h4>
228
+ <ul className="flex flex-col gap-1 p-3">
229
+ {constraints.map((c) => (
230
+ <li key={`${c.kind}:${c.name}`} className="flex flex-wrap items-baseline gap-2 text-xs">
231
+ <span className="rounded bg-muted px-1.5 py-0.5 font-medium text-muted-foreground">
232
+ {c.kind}
233
+ </span>
234
+ <code className="font-mono text-foreground">{c.name}</code>
235
+ {c.fields && <span className="text-muted-foreground">({c.fields})</span>}
236
+ {c.message && (
237
+ <span className="text-muted-foreground">— “{c.message}”</span>
238
+ )}
239
+ </li>
240
+ ))}
241
+ </ul>
242
+ </div>
243
+ )}
244
+ </div>
245
+ </Section>
246
+ );
247
+ }
@@ -0,0 +1,201 @@
1
+ "use client";
2
+
3
+ import { useEffect, useState } from "react";
4
+ import { cn } from "@stigmer/theme";
5
+ import { timestampDate } from "@bufbuild/protobuf/wkt";
6
+ import type { Datastore } from "@stigmer/protos/ai/stigmer/agentic/datastore/v1/api_pb";
7
+ import { ErrorMessage } from "../error/ErrorMessage.js";
8
+ import { ResourceDetailShell } from "../resource-detail/ResourceDetailShell.js";
9
+ import type { DetailAction, ResourceHeaderMeta } from "../resource-detail/types.js";
10
+ import { CollectionRecordsBrowser } from "./CollectionRecordsBrowser.js";
11
+ import { CollectionSchemaView } from "./CollectionSchemaView.js";
12
+ import { DatastoreSyncReport } from "./DatastoreSyncReport.js";
13
+ import { useDatastore } from "./useDatastore.js";
14
+
15
+ /** The detail view's tabs. */
16
+ export type DatastoreDetailTab = "overview" | "records";
17
+
18
+ /** Props for {@link DatastoreDetailView}. */
19
+ export interface DatastoreDetailViewProps {
20
+ /** Organization slug. */
21
+ readonly org: string;
22
+ /** Datastore slug. */
23
+ readonly slug: string;
24
+ /** Primary action rendered as a visible button. */
25
+ readonly primaryAction?: DetailAction;
26
+ /** Overflow actions (Edit YAML / Export / Delete — assembled at the page level). */
27
+ readonly actions?: readonly DetailAction[];
28
+ /** Called when the datastore loads or reloads (e.g. breadcrumb label sync). */
29
+ readonly onResourceLoad?: (datastore: Datastore) => void;
30
+ /** Initial tab for uncontrolled usage. @default "overview" */
31
+ readonly defaultTab?: DatastoreDetailTab;
32
+ /** Controlled active tab. Uncontrolled (internal state) when omitted. */
33
+ readonly activeTab?: DatastoreDetailTab;
34
+ /** Tab-change callback for controlled usage. */
35
+ readonly onTabChange?: (tab: DatastoreDetailTab) => void;
36
+ /** Additional CSS classes for the root container. */
37
+ readonly className?: string;
38
+ }
39
+
40
+ /**
41
+ * Self-contained detail view for a Datastore — the Library-resource
42
+ * home (DD-008 SD-1): an **Overview** tab (schema, authorization
43
+ * summary, and the sync-report health strip — all from the loaded
44
+ * resource, the authoritative source for structure and health) and a
45
+ * **Records** tab (the browser, whose caller-effective verbs come from
46
+ * `describeDatastore`). No version-history affordance —
47
+ * `is_versioned: false` (DD-003).
48
+ *
49
+ * Handles loading, error, and not-found states automatically.
50
+ * Zero Console dependencies — safe for platform builder embedding.
51
+ * All visual properties flow through `--stgm-*` design tokens.
52
+ */
53
+ export function DatastoreDetailView({
54
+ org,
55
+ slug,
56
+ primaryAction,
57
+ actions,
58
+ onResourceLoad,
59
+ defaultTab = "overview",
60
+ activeTab,
61
+ onTabChange,
62
+ className,
63
+ }: DatastoreDetailViewProps) {
64
+ const { datastore, isLoading, error, refetch } = useDatastore(org, slug);
65
+
66
+ const [internalTab, setInternalTab] = useState<DatastoreDetailTab>(defaultTab);
67
+ const tab = activeTab ?? internalTab;
68
+ const setTab = onTabChange ?? setInternalTab;
69
+
70
+ useEffect(() => {
71
+ if (datastore) onResourceLoad?.(datastore);
72
+ }, [datastore, onResourceLoad]);
73
+
74
+ if (isLoading) return <LoadingSkeleton className={className} />;
75
+ if (error)
76
+ return <ErrorMessage error={error} retry={refetch} className={className} />;
77
+ if (!datastore) return <NotFoundState className={className} />;
78
+
79
+ const meta = datastore.metadata;
80
+ const spec = datastore.spec;
81
+ const status = datastore.status;
82
+ const specAudit = status?.audit?.specAudit;
83
+
84
+ const headerMeta: ResourceHeaderMeta = {
85
+ name: meta?.name || meta?.slug || "Untitled",
86
+ id: meta?.id || "",
87
+ org: meta?.org,
88
+ slug: meta?.slug,
89
+ description: spec?.description,
90
+ icon: <DatastoreIcon className="size-6 text-muted-foreground" />,
91
+ createdAt: specAudit?.createdAt ? timestampDate(specAudit.createdAt) : null,
92
+ updatedAt: specAudit?.updatedAt ? timestampDate(specAudit.updatedAt) : null,
93
+ };
94
+
95
+ return (
96
+ <ResourceDetailShell
97
+ header={headerMeta}
98
+ primaryAction={primaryAction}
99
+ actions={actions}
100
+ tabs={[
101
+ { id: "overview", label: "Overview" },
102
+ { id: "records", label: "Records" },
103
+ ]}
104
+ activeTab={tab}
105
+ onTabChange={(id) => setTab(id as DatastoreDetailTab)}
106
+ tabsAriaLabel="Datastore sections"
107
+ className={className}
108
+ >
109
+ {tab === "overview" ? (
110
+ <div className="flex flex-col gap-6">
111
+ {status && <DatastoreSyncReport status={status} />}
112
+ {spec && <CollectionSchemaView spec={spec} />}
113
+ </div>
114
+ ) : (
115
+ spec &&
116
+ meta && (
117
+ <CollectionRecordsBrowser
118
+ org={meta.org}
119
+ datastoreSlug={meta.slug}
120
+ spec={spec}
121
+ />
122
+ )
123
+ )}
124
+ </ResourceDetailShell>
125
+ );
126
+ }
127
+
128
+ // ---------------------------------------------------------------------------
129
+ // Non-happy states
130
+ // ---------------------------------------------------------------------------
131
+
132
+ function LoadingSkeleton({ className }: { readonly className?: string }) {
133
+ return (
134
+ <div
135
+ className={cn("flex flex-col gap-6", className)}
136
+ aria-busy="true"
137
+ aria-label="Loading datastore details"
138
+ >
139
+ <div className="flex items-start gap-3">
140
+ <div className="mt-1 size-6 shrink-0 animate-pulse rounded bg-muted" />
141
+ <div className="flex-1 space-y-2">
142
+ <div className="h-5 w-48 animate-pulse rounded bg-muted" />
143
+ <div className="h-3 w-64 animate-pulse rounded bg-muted" />
144
+ </div>
145
+ </div>
146
+ <div className="space-y-2">
147
+ <div className="h-3 w-28 animate-pulse rounded bg-muted" />
148
+ <div
149
+ className="animate-pulse rounded-lg border border-border bg-muted-faint"
150
+ style={{ height: "160px" }}
151
+ />
152
+ </div>
153
+ <div className="space-y-2">
154
+ <div className="h-3 w-20 animate-pulse rounded bg-muted" />
155
+ <div
156
+ className="animate-pulse rounded-lg border border-border bg-muted-faint"
157
+ style={{ height: "240px" }}
158
+ />
159
+ </div>
160
+ </div>
161
+ );
162
+ }
163
+
164
+ function NotFoundState({ className }: { readonly className?: string }) {
165
+ return (
166
+ <div
167
+ role="status"
168
+ className={cn("flex flex-col items-center gap-2 py-12 text-center", className)}
169
+ >
170
+ <DatastoreIcon className="size-10 text-muted-foreground-faint" />
171
+ <p className="text-sm font-medium text-muted-foreground">Datastore not found</p>
172
+ <p className="text-xs text-muted-foreground-subtle">
173
+ This datastore doesn&apos;t exist or you don&apos;t have access to it.
174
+ </p>
175
+ </div>
176
+ );
177
+ }
178
+
179
+ // ---------------------------------------------------------------------------
180
+ // Icon (inline SVG — no icon-library dependency)
181
+ // ---------------------------------------------------------------------------
182
+
183
+ /** Database-cylinder icon shared by the detail view's states. */
184
+ export function DatastoreIcon({ className }: { readonly className?: string }) {
185
+ return (
186
+ <svg
187
+ className={className}
188
+ viewBox="0 0 24 24"
189
+ fill="none"
190
+ stroke="currentColor"
191
+ strokeWidth="1.5"
192
+ strokeLinecap="round"
193
+ strokeLinejoin="round"
194
+ aria-hidden="true"
195
+ >
196
+ <ellipse cx="12" cy="5" rx="8" ry="3" />
197
+ <path d="M4 5v6c0 1.66 3.58 3 8 3s8-1.34 8-3V5" />
198
+ <path d="M4 11v6c0 1.66 3.58 3 8 3s8-1.34 8-3v-6" />
199
+ </svg>
200
+ );
201
+ }
@@ -0,0 +1,105 @@
1
+ "use client";
2
+
3
+ import { timestampDate } from "@bufbuild/protobuf/wkt";
4
+ import {
5
+ CollectionMaterializationState,
6
+ DatastoreSyncOutcome,
7
+ type DatastoreStatus,
8
+ } from "@stigmer/protos/ai/stigmer/agentic/datastore/v1/status_pb";
9
+ import { Section } from "../resource-detail/Section.js";
10
+ import { StatusBadge } from "../resource-workbench/components/StatusBadge.js";
11
+
12
+ /** Props for {@link DatastoreSyncReport}. */
13
+ export interface DatastoreSyncReportProps {
14
+ /** The datastore status — the authoritative source for health (DD-008 SD-5). */
15
+ readonly status: DatastoreStatus;
16
+ /** Additional CSS classes for the root container. */
17
+ readonly className?: string;
18
+ }
19
+
20
+ /**
21
+ * The Overview health strip: projects `DatastoreStatus` — last apply
22
+ * outcome, per-collection materialization state, and record counts —
23
+ * so the operator can confirm an apply landed without leaving the
24
+ * console (the cutover choreography's verification surface, DD-009).
25
+ *
26
+ * All visual properties flow through `--stgm-*` design tokens.
27
+ * Zero Console dependencies — safe for platform builder embedding.
28
+ */
29
+ export function DatastoreSyncReport({ status, className }: DatastoreSyncReportProps) {
30
+ const syncedAt = status.lastSyncedAt
31
+ ? timestampDate(status.lastSyncedAt).toLocaleString()
32
+ : null;
33
+
34
+ return (
35
+ <Section title="Sync report" className={className}>
36
+ <div className="flex flex-col">
37
+ <div className="flex flex-wrap items-center gap-2 border-b border-border px-3 py-2">
38
+ <SyncOutcomeBadge outcome={status.lastSyncOutcome} />
39
+ {syncedAt && (
40
+ <span className="text-xs text-muted-foreground">last synced {syncedAt}</span>
41
+ )}
42
+ </div>
43
+ {status.collections.length === 0 ? (
44
+ <p className="px-3 py-2 text-xs text-muted-foreground">
45
+ No collections have been synced yet.
46
+ </p>
47
+ ) : (
48
+ <table className="w-full text-left text-xs">
49
+ <thead>
50
+ <tr className="border-b border-border text-muted-foreground">
51
+ <th scope="col" className="px-3 py-2 font-medium">Collection</th>
52
+ <th scope="col" className="px-3 py-2 font-medium">State</th>
53
+ <th scope="col" className="px-3 py-2 text-right font-medium">Records</th>
54
+ </tr>
55
+ </thead>
56
+ <tbody>
57
+ {status.collections.map((coll) => (
58
+ <tr key={coll.name} className="border-b border-border last:border-b-0">
59
+ <td className="px-3 py-2 font-mono text-foreground">{coll.name}</td>
60
+ <td className="px-3 py-2">
61
+ <MaterializationBadge state={coll.state} />
62
+ </td>
63
+ <td className="px-3 py-2 text-right tabular-nums text-foreground">
64
+ {String(coll.recordCount)}
65
+ </td>
66
+ </tr>
67
+ ))}
68
+ </tbody>
69
+ </table>
70
+ )}
71
+ </div>
72
+ </Section>
73
+ );
74
+ }
75
+
76
+ function SyncOutcomeBadge({ outcome }: { readonly outcome: DatastoreSyncOutcome }) {
77
+ switch (outcome) {
78
+ case DatastoreSyncOutcome.synced:
79
+ return <StatusBadge phase="ready" label="synced" />;
80
+ case DatastoreSyncOutcome.rejected:
81
+ return <StatusBadge phase="failed" label="rejected" />;
82
+ default:
83
+ return <StatusBadge phase="draft" label="never synced" />;
84
+ }
85
+ }
86
+
87
+ function MaterializationBadge({ state }: { readonly state: CollectionMaterializationState }) {
88
+ switch (state) {
89
+ case CollectionMaterializationState.active:
90
+ return <StatusBadge phase="ready" label="active" />;
91
+ case CollectionMaterializationState.pending:
92
+ return <StatusBadge phase="pending" label="pending" />;
93
+ case CollectionMaterializationState.removed:
94
+ // Removed from the spec; data retained until datastore delete.
95
+ return (
96
+ <StatusBadge
97
+ phase="disabled"
98
+ label="removed"
99
+ tooltip="Removed from the spec — records retained until the datastore is deleted"
100
+ />
101
+ );
102
+ default:
103
+ return <StatusBadge phase="draft" label="unknown" />;
104
+ }
105
+ }