@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.
- package/agent/steps/ReviewStep.d.ts.map +1 -1
- package/agent/steps/ReviewStep.js +2 -3
- package/agent/steps/ReviewStep.js.map +1 -1
- package/billing/BaselineEditor.d.ts +9 -0
- package/billing/BaselineEditor.d.ts.map +1 -0
- package/billing/BaselineEditor.js +253 -0
- package/billing/BaselineEditor.js.map +1 -0
- package/billing/ModelCatalogPanel.d.ts +28 -0
- package/billing/ModelCatalogPanel.d.ts.map +1 -0
- package/billing/ModelCatalogPanel.js +102 -0
- package/billing/ModelCatalogPanel.js.map +1 -0
- package/billing/ModelGovernanceDetail.d.ts +8 -0
- package/billing/ModelGovernanceDetail.d.ts.map +1 -0
- package/billing/ModelGovernanceDetail.js +64 -0
- package/billing/ModelGovernanceDetail.js.map +1 -0
- package/billing/OperatorAccessNotice.d.ts +12 -0
- package/billing/OperatorAccessNotice.d.ts.map +1 -0
- package/billing/OperatorAccessNotice.js +15 -0
- package/billing/OperatorAccessNotice.js.map +1 -0
- package/billing/PricingGovernanceConsole.d.ts +57 -0
- package/billing/PricingGovernanceConsole.d.ts.map +1 -0
- package/billing/PricingGovernanceConsole.js +164 -0
- package/billing/PricingGovernanceConsole.js.map +1 -0
- package/billing/PricingGovernancePanel.d.ts +26 -0
- package/billing/PricingGovernancePanel.d.ts.map +1 -0
- package/billing/PricingGovernancePanel.js +64 -0
- package/billing/PricingGovernancePanel.js.map +1 -0
- package/billing/RetireConfirm.d.ts +9 -0
- package/billing/RetireConfirm.d.ts.map +1 -0
- package/billing/RetireConfirm.js +19 -0
- package/billing/RetireConfirm.js.map +1 -0
- package/billing/form-primitives.d.ts +18 -0
- package/billing/form-primitives.d.ts.map +1 -0
- package/billing/form-primitives.js +19 -0
- package/billing/form-primitives.js.map +1 -0
- package/billing/governance-primitives.d.ts +33 -0
- package/billing/governance-primitives.d.ts.map +1 -0
- package/billing/governance-primitives.js +43 -0
- package/billing/governance-primitives.js.map +1 -0
- package/billing/index.d.ts +18 -0
- package/billing/index.d.ts.map +1 -1
- package/billing/index.js +9 -0
- package/billing/index.js.map +1 -1
- package/billing/pricing-format.d.ts +12 -0
- package/billing/pricing-format.d.ts.map +1 -0
- package/billing/pricing-format.js +50 -0
- package/billing/pricing-format.js.map +1 -0
- package/billing/useDecidePricingOverride.d.ts +46 -0
- package/billing/useDecidePricingOverride.d.ts.map +1 -0
- package/billing/useDecidePricingOverride.js +44 -0
- package/billing/useDecidePricingOverride.js.map +1 -0
- package/billing/useModelGovernanceView.d.ts +103 -0
- package/billing/useModelGovernanceView.d.ts.map +1 -0
- package/billing/useModelGovernanceView.js +144 -0
- package/billing/useModelGovernanceView.js.map +1 -0
- package/billing/useModelPricingBaselines.d.ts +40 -0
- package/billing/useModelPricingBaselines.d.ts.map +1 -0
- package/billing/useModelPricingBaselines.js +32 -0
- package/billing/useModelPricingBaselines.js.map +1 -0
- package/billing/usePricingGovernance.d.ts +39 -0
- package/billing/usePricingGovernance.d.ts.map +1 -0
- package/billing/usePricingGovernance.js +31 -0
- package/billing/usePricingGovernance.js.map +1 -0
- package/billing/useRetireModelPricingBaseline.d.ts +31 -0
- package/billing/useRetireModelPricingBaseline.d.ts.map +1 -0
- package/billing/useRetireModelPricingBaseline.js +36 -0
- package/billing/useRetireModelPricingBaseline.js.map +1 -0
- package/billing/useUpsertModelPricingBaseline.d.ts +38 -0
- package/billing/useUpsertModelPricingBaseline.d.ts.map +1 -0
- package/billing/useUpsertModelPricingBaseline.js +37 -0
- package/billing/useUpsertModelPricingBaseline.js.map +1 -0
- package/channel/AgentChannelsPanel.d.ts.map +1 -1
- package/channel/AgentChannelsPanel.js +11 -5
- package/channel/AgentChannelsPanel.js.map +1 -1
- package/composer/SessionComposer.d.ts +1 -1
- package/cursor-accounts/CursorAccountEditor.d.ts +28 -0
- package/cursor-accounts/CursorAccountEditor.d.ts.map +1 -0
- package/cursor-accounts/CursorAccountEditor.js +51 -0
- package/cursor-accounts/CursorAccountEditor.js.map +1 -0
- package/cursor-accounts/CursorAccountsAccessNotice.d.ts +11 -0
- package/cursor-accounts/CursorAccountsAccessNotice.d.ts.map +1 -0
- package/cursor-accounts/CursorAccountsAccessNotice.js +14 -0
- package/cursor-accounts/CursorAccountsAccessNotice.js.map +1 -0
- package/cursor-accounts/CursorAccountsConsole.d.ts +28 -0
- package/cursor-accounts/CursorAccountsConsole.d.ts.map +1 -0
- package/cursor-accounts/CursorAccountsConsole.js +275 -0
- package/cursor-accounts/CursorAccountsConsole.js.map +1 -0
- package/cursor-accounts/cursor-account-format.d.ts +10 -0
- package/cursor-accounts/cursor-account-format.d.ts.map +1 -0
- package/cursor-accounts/cursor-account-format.js +26 -0
- package/cursor-accounts/cursor-account-format.js.map +1 -0
- package/cursor-accounts/index.d.ts +18 -0
- package/cursor-accounts/index.d.ts.map +1 -0
- package/cursor-accounts/index.js +13 -0
- package/cursor-accounts/index.js.map +1 -0
- package/cursor-accounts/useCursorAccountView.d.ts +30 -0
- package/cursor-accounts/useCursorAccountView.d.ts.map +1 -0
- package/cursor-accounts/useCursorAccountView.js +25 -0
- package/cursor-accounts/useCursorAccountView.js.map +1 -0
- package/cursor-accounts/useCursorAccounts.d.ts +33 -0
- package/cursor-accounts/useCursorAccounts.d.ts.map +1 -0
- package/cursor-accounts/useCursorAccounts.js +25 -0
- package/cursor-accounts/useCursorAccounts.js.map +1 -0
- package/cursor-accounts/useCursorMemberKeyActions.d.ts +49 -0
- package/cursor-accounts/useCursorMemberKeyActions.d.ts.map +1 -0
- package/cursor-accounts/useCursorMemberKeyActions.js +38 -0
- package/cursor-accounts/useCursorMemberKeyActions.js.map +1 -0
- package/cursor-accounts/useDeleteCursorAccount.d.ts +30 -0
- package/cursor-accounts/useDeleteCursorAccount.d.ts.map +1 -0
- package/cursor-accounts/useDeleteCursorAccount.js +32 -0
- package/cursor-accounts/useDeleteCursorAccount.js.map +1 -0
- package/cursor-accounts/useSyncCursorAccount.d.ts +23 -0
- package/cursor-accounts/useSyncCursorAccount.d.ts.map +1 -0
- package/cursor-accounts/useSyncCursorAccount.js +31 -0
- package/cursor-accounts/useSyncCursorAccount.js.map +1 -0
- package/cursor-accounts/useUpsertCursorAccount.d.ts +26 -0
- package/cursor-accounts/useUpsertCursorAccount.d.ts.map +1 -0
- package/cursor-accounts/useUpsertCursorAccount.js +34 -0
- package/cursor-accounts/useUpsertCursorAccount.js.map +1 -0
- package/datastore/CollectionRecordsBrowser.d.ts +34 -0
- package/datastore/CollectionRecordsBrowser.d.ts.map +1 -0
- package/datastore/CollectionRecordsBrowser.js +209 -0
- package/datastore/CollectionRecordsBrowser.js.map +1 -0
- package/datastore/CollectionSchemaView.d.ts +29 -0
- package/datastore/CollectionSchemaView.d.ts.map +1 -0
- package/datastore/CollectionSchemaView.js +93 -0
- package/datastore/CollectionSchemaView.js.map +1 -0
- package/datastore/DatastoreDetailView.d.ts +44 -0
- package/datastore/DatastoreDetailView.d.ts.map +1 -0
- package/datastore/DatastoreDetailView.js +76 -0
- package/datastore/DatastoreDetailView.js.map +1 -0
- package/datastore/DatastoreSyncReport.d.ts +19 -0
- package/datastore/DatastoreSyncReport.d.ts.map +1 -0
- package/datastore/DatastoreSyncReport.js +45 -0
- package/datastore/DatastoreSyncReport.js.map +1 -0
- package/datastore/DeleteDatastoreDialog.d.ts +35 -0
- package/datastore/DeleteDatastoreDialog.d.ts.map +1 -0
- package/datastore/DeleteDatastoreDialog.js +90 -0
- package/datastore/DeleteDatastoreDialog.js.map +1 -0
- package/datastore/FieldValueControl.d.ts +55 -0
- package/datastore/FieldValueControl.d.ts.map +1 -0
- package/datastore/FieldValueControl.js +138 -0
- package/datastore/FieldValueControl.js.map +1 -0
- package/datastore/RecordFilterBuilder.d.ts +30 -0
- package/datastore/RecordFilterBuilder.d.ts.map +1 -0
- package/datastore/RecordFilterBuilder.js +122 -0
- package/datastore/RecordFilterBuilder.js.map +1 -0
- package/datastore/RecordFormPanel.d.ts +45 -0
- package/datastore/RecordFormPanel.d.ts.map +1 -0
- package/datastore/RecordFormPanel.js +215 -0
- package/datastore/RecordFormPanel.js.map +1 -0
- package/datastore/index.d.ts +43 -0
- package/datastore/index.d.ts.map +1 -0
- package/datastore/index.js +22 -0
- package/datastore/index.js.map +1 -0
- package/datastore/recordFilter.d.ts +54 -0
- package/datastore/recordFilter.d.ts.map +1 -0
- package/datastore/recordFilter.js +93 -0
- package/datastore/recordFilter.js.map +1 -0
- package/datastore/recordValues.d.ts +85 -0
- package/datastore/recordValues.d.ts.map +1 -0
- package/datastore/recordValues.js +282 -0
- package/datastore/recordValues.js.map +1 -0
- package/datastore/useDatastore.d.ts +39 -0
- package/datastore/useDatastore.d.ts.map +1 -0
- package/datastore/useDatastore.js +44 -0
- package/datastore/useDatastore.js.map +1 -0
- package/datastore/useDatastoreCount.d.ts +48 -0
- package/datastore/useDatastoreCount.d.ts.map +1 -0
- package/datastore/useDatastoreCount.js +27 -0
- package/datastore/useDatastoreCount.js.map +1 -0
- package/datastore/useDatastoreDescription.d.ts +54 -0
- package/datastore/useDatastoreDescription.d.ts.map +1 -0
- package/datastore/useDatastoreDescription.js +50 -0
- package/datastore/useDatastoreDescription.js.map +1 -0
- package/datastore/useDatastoreList.d.ts +57 -0
- package/datastore/useDatastoreList.d.ts.map +1 -0
- package/datastore/useDatastoreList.js +29 -0
- package/datastore/useDatastoreList.js.map +1 -0
- package/datastore/useDatastoreSearch.d.ts +19 -0
- package/datastore/useDatastoreSearch.d.ts.map +1 -0
- package/datastore/useDatastoreSearch.js +22 -0
- package/datastore/useDatastoreSearch.js.map +1 -0
- package/datastore/useDeleteDatastore.d.ts +53 -0
- package/datastore/useDeleteDatastore.d.ts.map +1 -0
- package/datastore/useDeleteDatastore.js +40 -0
- package/datastore/useDeleteDatastore.js.map +1 -0
- package/datastore/useDeleteRecord.d.ts +34 -0
- package/datastore/useDeleteRecord.d.ts.map +1 -0
- package/datastore/useDeleteRecord.js +43 -0
- package/datastore/useDeleteRecord.js.map +1 -0
- package/datastore/useInsertRecord.d.ts +50 -0
- package/datastore/useInsertRecord.d.ts.map +1 -0
- package/datastore/useInsertRecord.js +55 -0
- package/datastore/useInsertRecord.js.map +1 -0
- package/datastore/useRecordCollection.d.ts +104 -0
- package/datastore/useRecordCollection.d.ts.map +1 -0
- package/datastore/useRecordCollection.js +136 -0
- package/datastore/useRecordCollection.js.map +1 -0
- package/datastore/useRecordList.d.ts +66 -0
- package/datastore/useRecordList.d.ts.map +1 -0
- package/datastore/useRecordList.js +58 -0
- package/datastore/useRecordList.js.map +1 -0
- package/datastore/useUpdateRecord.d.ts +52 -0
- package/datastore/useUpdateRecord.d.ts.map +1 -0
- package/datastore/useUpdateRecord.js +55 -0
- package/datastore/useUpdateRecord.js.map +1 -0
- package/environment/EnvironmentListPanel.d.ts.map +1 -1
- package/environment/EnvironmentListPanel.js +12 -7
- package/environment/EnvironmentListPanel.js.map +1 -1
- package/iam-policy/index.d.ts +1 -1
- package/iam-policy/index.d.ts.map +1 -1
- package/iam-policy/index.js.map +1 -1
- package/iam-policy/useCheckPermission.d.ts +32 -11
- package/iam-policy/useCheckPermission.d.ts.map +1 -1
- package/iam-policy/useCheckPermission.js +24 -19
- package/iam-policy/useCheckPermission.js.map +1 -1
- package/index.d.ts +12 -6
- package/index.d.ts.map +1 -1
- package/index.js +14 -3
- package/index.js.map +1 -1
- package/library/index.d.ts +0 -7
- package/library/index.d.ts.map +1 -1
- package/library/index.js +0 -4
- package/library/index.js.map +1 -1
- package/library/useApplyResource.d.ts +12 -12
- package/library/useApplyResource.d.ts.map +1 -1
- package/library/useApplyResource.js +16 -25
- package/library/useApplyResource.js.map +1 -1
- package/library/useExportResource.d.ts +13 -9
- package/library/useExportResource.d.ts.map +1 -1
- package/library/useExportResource.js +18 -36
- package/library/useExportResource.js.map +1 -1
- package/manifest/ApplyManifestDialog.d.ts +48 -0
- package/manifest/ApplyManifestDialog.d.ts.map +1 -0
- package/manifest/ApplyManifestDialog.js +135 -0
- package/manifest/ApplyManifestDialog.js.map +1 -0
- package/manifest/EditResourceYamlDialog.d.ts +51 -0
- package/manifest/EditResourceYamlDialog.d.ts.map +1 -0
- package/manifest/EditResourceYamlDialog.js +104 -0
- package/manifest/EditResourceYamlDialog.js.map +1 -0
- package/manifest/RedactedSecretsNotice.d.ts +14 -0
- package/manifest/RedactedSecretsNotice.d.ts.map +1 -0
- package/manifest/RedactedSecretsNotice.js +14 -0
- package/manifest/RedactedSecretsNotice.js.map +1 -0
- package/manifest/YamlEditor.d.ts +44 -0
- package/manifest/YamlEditor.d.ts.map +1 -0
- package/manifest/YamlEditor.js +216 -0
- package/manifest/YamlEditor.js.map +1 -0
- package/manifest/index.d.ts +13 -0
- package/manifest/index.d.ts.map +1 -0
- package/manifest/index.js +13 -0
- package/manifest/index.js.map +1 -0
- package/manifest/useApplyManifest.d.ts +82 -0
- package/manifest/useApplyManifest.d.ts.map +1 -0
- package/manifest/useApplyManifest.js +180 -0
- package/manifest/useApplyManifest.js.map +1 -0
- package/manifest/useEditResourceYaml.d.ts +106 -0
- package/manifest/useEditResourceYaml.d.ts.map +1 -0
- package/manifest/useEditResourceYaml.js +168 -0
- package/manifest/useEditResourceYaml.js.map +1 -0
- package/mcp-server/steps/ReviewStep.d.ts.map +1 -1
- package/mcp-server/steps/ReviewStep.js +2 -3
- package/mcp-server/steps/ReviewStep.js.map +1 -1
- package/package.json +4 -4
- package/resource-creation/templates/workflow-templates.js +4 -4
- package/session/useEditSessionPrep.js +3 -3
- package/session/useEditSessionPrep.js.map +1 -1
- package/settings/index.d.ts +2 -1
- package/settings/index.d.ts.map +1 -1
- package/settings/index.js +2 -1
- package/settings/index.js.map +1 -1
- package/settings/settings-nav.d.ts +22 -0
- package/settings/settings-nav.d.ts.map +1 -1
- package/settings/settings-nav.js +32 -1
- package/settings/settings-nav.js.map +1 -1
- package/settings/useSettingsNavGroups.d.ts +29 -0
- package/settings/useSettingsNavGroups.d.ts.map +1 -0
- package/settings/useSettingsNavGroups.js +61 -0
- package/settings/useSettingsNavGroups.js.map +1 -0
- package/src/agent/steps/ReviewStep.tsx +2 -3
- package/src/billing/BaselineEditor.tsx +619 -0
- package/src/billing/ModelCatalogPanel.tsx +283 -0
- package/src/billing/ModelGovernanceDetail.tsx +289 -0
- package/src/billing/OperatorAccessNotice.tsx +32 -0
- package/src/billing/PricingGovernanceConsole.tsx +465 -0
- package/src/billing/PricingGovernancePanel.tsx +166 -0
- package/src/billing/RetireConfirm.tsx +82 -0
- package/src/billing/__tests__/ModelCatalogPanel.test.tsx +253 -0
- package/src/billing/__tests__/PricingGovernanceConsole.test.tsx +410 -0
- package/src/billing/__tests__/useModelGovernanceView.test.tsx +308 -0
- package/src/billing/form-primitives.tsx +68 -0
- package/src/billing/governance-primitives.tsx +133 -0
- package/src/billing/index.ts +37 -0
- package/src/billing/pricing-format.ts +53 -0
- package/src/billing/useDecidePricingOverride.ts +78 -0
- package/src/billing/useModelGovernanceView.ts +290 -0
- package/src/billing/useModelPricingBaselines.ts +69 -0
- package/src/billing/usePricingGovernance.ts +57 -0
- package/src/billing/useRetireModelPricingBaseline.ts +65 -0
- package/src/billing/useUpsertModelPricingBaseline.ts +72 -0
- package/src/channel/AgentChannelsPanel.tsx +27 -1
- package/src/composer/SessionComposer.tsx +1 -1
- package/src/cursor-accounts/CursorAccountEditor.tsx +181 -0
- package/src/cursor-accounts/CursorAccountsAccessNotice.tsx +36 -0
- package/src/cursor-accounts/CursorAccountsConsole.tsx +810 -0
- package/src/cursor-accounts/__tests__/CursorAccountsConsole.test.tsx +384 -0
- package/src/cursor-accounts/cursor-account-format.ts +29 -0
- package/src/cursor-accounts/index.ts +29 -0
- package/src/cursor-accounts/useCursorAccountView.ts +49 -0
- package/src/cursor-accounts/useCursorAccounts.ts +49 -0
- package/src/cursor-accounts/useCursorMemberKeyActions.ts +106 -0
- package/src/cursor-accounts/useDeleteCursorAccount.ts +62 -0
- package/src/cursor-accounts/useSyncCursorAccount.ts +54 -0
- package/src/cursor-accounts/useUpsertCursorAccount.ts +57 -0
- package/src/datastore/CollectionRecordsBrowser.tsx +544 -0
- package/src/datastore/CollectionSchemaView.tsx +247 -0
- package/src/datastore/DatastoreDetailView.tsx +201 -0
- package/src/datastore/DatastoreSyncReport.tsx +105 -0
- package/src/datastore/DeleteDatastoreDialog.tsx +202 -0
- package/src/datastore/FieldValueControl.tsx +289 -0
- package/src/datastore/RecordFilterBuilder.tsx +411 -0
- package/src/datastore/RecordFormPanel.tsx +432 -0
- package/src/datastore/__tests__/CollectionRecordsBrowser.test.tsx +207 -0
- package/src/datastore/__tests__/DeleteDatastoreDialog.test.tsx +133 -0
- package/src/datastore/__tests__/FieldValueControl.test.tsx +160 -0
- package/src/datastore/__tests__/RecordFilterBuilder.test.tsx +141 -0
- package/src/datastore/__tests__/RecordFormPanel.test.tsx +227 -0
- package/src/datastore/__tests__/recordFilter.test.ts +156 -0
- package/src/datastore/__tests__/recordMutations.test.tsx +195 -0
- package/src/datastore/__tests__/recordValues.test.ts +359 -0
- package/src/datastore/__tests__/schemaAndSyncViews.test.tsx +142 -0
- package/src/datastore/__tests__/useDatastoreDescription.test.tsx +143 -0
- package/src/datastore/__tests__/useRecordCollection.test.tsx +250 -0
- package/src/datastore/__tests__/useRecordList.test.tsx +85 -0
- package/src/datastore/index.ts +111 -0
- package/src/datastore/recordFilter.ts +140 -0
- package/src/datastore/recordValues.ts +327 -0
- package/src/datastore/useDatastore.ts +67 -0
- package/src/datastore/useDatastoreCount.ts +67 -0
- package/src/datastore/useDatastoreDescription.ts +90 -0
- package/src/datastore/useDatastoreList.ts +79 -0
- package/src/datastore/useDatastoreSearch.ts +39 -0
- package/src/datastore/useDeleteDatastore.ts +87 -0
- package/src/datastore/useDeleteRecord.ts +77 -0
- package/src/datastore/useInsertRecord.ts +92 -0
- package/src/datastore/useRecordCollection.ts +256 -0
- package/src/datastore/useRecordList.ts +131 -0
- package/src/datastore/useUpdateRecord.ts +95 -0
- package/src/environment/EnvironmentListPanel.tsx +24 -0
- package/src/execution/__tests__/useArtifactInspection.test.tsx +12 -2
- package/src/iam-policy/__tests__/useCheckPermission.test.tsx +221 -0
- package/src/iam-policy/index.ts +1 -0
- package/src/iam-policy/useCheckPermission.ts +45 -19
- package/src/index.ts +163 -13
- package/src/library/index.ts +0 -20
- package/src/library/useApplyResource.ts +27 -34
- package/src/library/useExportResource.ts +21 -40
- package/src/manifest/ApplyManifestDialog.tsx +315 -0
- package/src/manifest/EditResourceYamlDialog.tsx +265 -0
- package/src/manifest/RedactedSecretsNotice.tsx +30 -0
- package/src/manifest/YamlEditor.tsx +272 -0
- package/src/manifest/__tests__/EditResourceYamlDialog.test.tsx +118 -0
- package/src/manifest/__tests__/useApplyManifest.test.tsx +237 -0
- package/src/manifest/__tests__/useEditResourceYaml.test.tsx +252 -0
- package/src/manifest/index.ts +33 -0
- package/src/manifest/useApplyManifest.ts +270 -0
- package/src/manifest/useEditResourceYaml.ts +273 -0
- package/src/mcp-server/steps/ReviewStep.tsx +2 -3
- package/src/resource-creation/templates/workflow-templates.ts +4 -4
- package/src/session/useEditSessionPrep.ts +3 -3
- package/src/settings/__tests__/useSettingsNavGroups.test.tsx +138 -0
- package/src/settings/index.ts +5 -1
- package/src/settings/settings-nav.ts +43 -0
- package/src/settings/useSettingsNavGroups.ts +81 -0
- package/src/workflow/WorkflowYamlEditor.tsx +6 -270
- package/styles.css +1 -1
- package/workflow/CanvasTransitionEdge.d.ts +1 -1
- package/workflow/WorkflowYamlEditor.d.ts +2 -42
- package/workflow/WorkflowYamlEditor.d.ts.map +1 -1
- package/workflow/WorkflowYamlEditor.js +5 -214
- package/workflow/WorkflowYamlEditor.js.map +1 -1
- package/library/ImportResourceDialog.d.ts +0 -43
- package/library/ImportResourceDialog.d.ts.map +0 -1
- package/library/ImportResourceDialog.js +0 -90
- package/library/ImportResourceDialog.js.map +0 -1
- package/library/parse-resource-yaml.d.ts +0 -63
- package/library/parse-resource-yaml.d.ts.map +0 -1
- package/library/parse-resource-yaml.js +0 -407
- package/library/parse-resource-yaml.js.map +0 -1
- package/library/serialize-resource-yaml.d.ts +0 -103
- package/library/serialize-resource-yaml.d.ts.map +0 -1
- package/library/serialize-resource-yaml.js +0 -565
- package/library/serialize-resource-yaml.js.map +0 -1
- package/library/useImportResource.d.ts +0 -84
- package/library/useImportResource.d.ts.map +0 -1
- package/library/useImportResource.js +0 -188
- package/library/useImportResource.js.map +0 -1
- package/src/library/ImportResourceDialog.tsx +0 -227
- package/src/library/parse-resource-yaml.ts +0 -630
- package/src/library/serialize-resource-yaml.ts +0 -756
- 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't exist or you don'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
|
+
}
|