@stigmer/react 3.2.3 → 3.4.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/index.d.ts.map +1 -1
- package/billing/index.js +4 -0
- package/billing/index.js.map +1 -1
- 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 +34 -0
- package/cursor-accounts/CursorAccountEditor.d.ts.map +1 -0
- package/cursor-accounts/CursorAccountEditor.js +67 -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 +32 -0
- package/cursor-accounts/CursorAccountsConsole.d.ts.map +1 -0
- package/cursor-accounts/CursorAccountsConsole.js +169 -0
- package/cursor-accounts/CursorAccountsConsole.js.map +1 -0
- package/cursor-accounts/MemberCoverageTable.d.ts +29 -0
- package/cursor-accounts/MemberCoverageTable.d.ts.map +1 -0
- package/cursor-accounts/MemberCoverageTable.js +150 -0
- package/cursor-accounts/MemberCoverageTable.js.map +1 -0
- package/cursor-accounts/MemberKeysPanel.d.ts +25 -0
- package/cursor-accounts/MemberKeysPanel.d.ts.map +1 -0
- package/cursor-accounts/MemberKeysPanel.js +115 -0
- package/cursor-accounts/MemberKeysPanel.js.map +1 -0
- package/cursor-accounts/badges.d.ts +9 -0
- package/cursor-accounts/badges.d.ts.map +1 -0
- package/cursor-accounts/badges.js +10 -0
- package/cursor-accounts/badges.js.map +1 -0
- package/cursor-accounts/cursor-account-coverage.d.ts +41 -0
- package/cursor-accounts/cursor-account-coverage.d.ts.map +1 -0
- package/cursor-accounts/cursor-account-coverage.js +26 -0
- package/cursor-accounts/cursor-account-coverage.js.map +1 -0
- package/cursor-accounts/cursor-account-format.d.ts +23 -0
- package/cursor-accounts/cursor-account-format.d.ts.map +1 -0
- package/cursor-accounts/cursor-account-format.js +41 -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 +223 -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 +37 -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 +62 -0
- package/datastore/recordFilter.d.ts.map +1 -0
- package/datastore/recordFilter.js +104 -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/execution/ExecutionProgress.d.ts.map +1 -1
- package/execution/ExecutionProgress.js +13 -4
- package/execution/ExecutionProgress.js.map +1 -1
- package/execution/MessageThread.d.ts.map +1 -1
- package/execution/MessageThread.js +10 -2
- package/execution/MessageThread.js.map +1 -1
- package/execution/useCreateAgentExecution.d.ts +31 -1
- package/execution/useCreateAgentExecution.d.ts.map +1 -1
- package/execution/useCreateAgentExecution.js +2 -0
- package/execution/useCreateAgentExecution.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 -4
- package/index.d.ts.map +1 -1
- package/index.js +18 -3
- package/index.js.map +1 -1
- package/internal/form-primitives.d.ts +10 -0
- package/internal/form-primitives.d.ts.map +1 -0
- package/internal/form-primitives.js +15 -0
- package/internal/form-primitives.js.map +1 -0
- 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/pricing-governance/BaselineEditor.d.ts +9 -0
- package/pricing-governance/BaselineEditor.d.ts.map +1 -0
- package/pricing-governance/BaselineEditor.js +270 -0
- package/pricing-governance/BaselineEditor.js.map +1 -0
- package/pricing-governance/ModelCatalogPanel.d.ts +28 -0
- package/pricing-governance/ModelCatalogPanel.d.ts.map +1 -0
- package/pricing-governance/ModelCatalogPanel.js +102 -0
- package/pricing-governance/ModelCatalogPanel.js.map +1 -0
- package/pricing-governance/ModelGovernanceDetail.d.ts +8 -0
- package/pricing-governance/ModelGovernanceDetail.d.ts.map +1 -0
- package/pricing-governance/ModelGovernanceDetail.js +64 -0
- package/pricing-governance/ModelGovernanceDetail.js.map +1 -0
- package/pricing-governance/OperatorAccessNotice.d.ts +12 -0
- package/pricing-governance/OperatorAccessNotice.d.ts.map +1 -0
- package/pricing-governance/OperatorAccessNotice.js +15 -0
- package/pricing-governance/OperatorAccessNotice.js.map +1 -0
- package/pricing-governance/PricingGovernanceConsole.d.ts +57 -0
- package/pricing-governance/PricingGovernanceConsole.d.ts.map +1 -0
- package/pricing-governance/PricingGovernanceConsole.js +164 -0
- package/pricing-governance/PricingGovernanceConsole.js.map +1 -0
- package/pricing-governance/PricingGovernancePanel.d.ts +26 -0
- package/pricing-governance/PricingGovernancePanel.d.ts.map +1 -0
- package/pricing-governance/PricingGovernancePanel.js +64 -0
- package/pricing-governance/PricingGovernancePanel.js.map +1 -0
- package/pricing-governance/RetireConfirm.d.ts +9 -0
- package/pricing-governance/RetireConfirm.d.ts.map +1 -0
- package/pricing-governance/RetireConfirm.js +19 -0
- package/pricing-governance/RetireConfirm.js.map +1 -0
- package/pricing-governance/governance-primitives.d.ts +33 -0
- package/pricing-governance/governance-primitives.d.ts.map +1 -0
- package/pricing-governance/governance-primitives.js +43 -0
- package/pricing-governance/governance-primitives.js.map +1 -0
- package/pricing-governance/index.d.ts +19 -0
- package/pricing-governance/index.d.ts.map +1 -0
- package/pricing-governance/index.js +20 -0
- package/pricing-governance/index.js.map +1 -0
- package/pricing-governance/pricing-format.d.ts +12 -0
- package/pricing-governance/pricing-format.d.ts.map +1 -0
- package/pricing-governance/pricing-format.js +50 -0
- package/pricing-governance/pricing-format.js.map +1 -0
- package/pricing-governance/useDecidePricingOverride.d.ts +46 -0
- package/pricing-governance/useDecidePricingOverride.d.ts.map +1 -0
- package/pricing-governance/useDecidePricingOverride.js +44 -0
- package/pricing-governance/useDecidePricingOverride.js.map +1 -0
- package/pricing-governance/useModelGovernanceView.d.ts +103 -0
- package/pricing-governance/useModelGovernanceView.d.ts.map +1 -0
- package/pricing-governance/useModelGovernanceView.js +144 -0
- package/pricing-governance/useModelGovernanceView.js.map +1 -0
- package/pricing-governance/useModelPricingBaselines.d.ts +40 -0
- package/pricing-governance/useModelPricingBaselines.d.ts.map +1 -0
- package/pricing-governance/useModelPricingBaselines.js +32 -0
- package/pricing-governance/useModelPricingBaselines.js.map +1 -0
- package/pricing-governance/usePricingGovernance.d.ts +39 -0
- package/pricing-governance/usePricingGovernance.d.ts.map +1 -0
- package/pricing-governance/usePricingGovernance.js +31 -0
- package/pricing-governance/usePricingGovernance.js.map +1 -0
- package/pricing-governance/useRetireModelPricingBaseline.d.ts +31 -0
- package/pricing-governance/useRetireModelPricingBaseline.d.ts.map +1 -0
- package/pricing-governance/useRetireModelPricingBaseline.js +36 -0
- package/pricing-governance/useRetireModelPricingBaseline.js.map +1 -0
- package/pricing-governance/useUpsertModelPricingBaseline.d.ts +38 -0
- package/pricing-governance/useUpsertModelPricingBaseline.d.ts.map +1 -0
- package/pricing-governance/useUpsertModelPricingBaseline.js +37 -0
- package/pricing-governance/useUpsertModelPricingBaseline.js.map +1 -0
- package/resource-creation/templates/workflow-templates.js +4 -4
- package/session/useCreateSession.d.ts +28 -0
- package/session/useCreateSession.d.ts.map +1 -1
- package/session/useCreateSession.js +2 -1
- package/session/useCreateSession.js.map +1 -1
- package/session/useEditSessionPrep.js +3 -3
- package/session/useEditSessionPrep.js.map +1 -1
- package/session/useNewSessionFlow.d.ts +30 -0
- package/session/useNewSessionFlow.d.ts.map +1 -1
- package/session/useNewSessionFlow.js +7 -1
- package/session/useNewSessionFlow.js.map +1 -1
- package/session/useUpdateSession.d.ts +29 -10
- package/session/useUpdateSession.d.ts.map +1 -1
- package/session/useUpdateSession.js +29 -10
- package/session/useUpdateSession.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/index.ts +5 -0
- package/src/channel/AgentChannelsPanel.tsx +27 -1
- package/src/composer/SessionComposer.tsx +1 -1
- package/src/cursor-accounts/CursorAccountEditor.tsx +229 -0
- package/src/cursor-accounts/CursorAccountsAccessNotice.tsx +36 -0
- package/src/cursor-accounts/CursorAccountsConsole.tsx +454 -0
- package/src/cursor-accounts/MemberCoverageTable.tsx +439 -0
- package/src/cursor-accounts/MemberKeysPanel.tsx +278 -0
- package/src/cursor-accounts/__tests__/CursorAccountsConsole.test.tsx +680 -0
- package/src/cursor-accounts/__tests__/cursor-account-coverage.test.ts +73 -0
- package/src/cursor-accounts/badges.tsx +26 -0
- package/src/cursor-accounts/cursor-account-coverage.ts +71 -0
- package/src/cursor-accounts/cursor-account-format.ts +45 -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 +570 -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 +422 -0
- package/src/datastore/RecordFormPanel.tsx +432 -0
- package/src/datastore/__tests__/CollectionRecordsBrowser.test.tsx +245 -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 +155 -0
- package/src/datastore/__tests__/RecordFormPanel.test.tsx +227 -0
- package/src/datastore/__tests__/recordFilter.test.ts +169 -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 +154 -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/ExecutionProgress.tsx +14 -4
- package/src/execution/MessageThread.tsx +10 -2
- package/src/execution/__tests__/ExecutionProgress.test.tsx +67 -0
- package/src/execution/__tests__/MessageThread.test.tsx +44 -0
- package/src/execution/__tests__/useArtifactInspection.test.tsx +12 -2
- package/src/execution/__tests__/useCreateAgentExecution.test.tsx +86 -0
- package/src/execution/useCreateAgentExecution.ts +41 -6
- 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 +172 -14
- package/src/internal/form-primitives.tsx +40 -0
- 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/pricing-governance/BaselineEditor.tsx +652 -0
- package/src/pricing-governance/ModelCatalogPanel.tsx +283 -0
- package/src/pricing-governance/ModelGovernanceDetail.tsx +289 -0
- package/src/pricing-governance/OperatorAccessNotice.tsx +32 -0
- package/src/pricing-governance/PricingGovernanceConsole.tsx +465 -0
- package/src/pricing-governance/PricingGovernancePanel.tsx +166 -0
- package/src/pricing-governance/RetireConfirm.tsx +82 -0
- package/src/pricing-governance/__tests__/ModelCatalogPanel.test.tsx +253 -0
- package/src/pricing-governance/__tests__/PricingGovernanceConsole.test.tsx +410 -0
- package/src/pricing-governance/__tests__/useModelGovernanceView.test.tsx +308 -0
- package/src/pricing-governance/governance-primitives.tsx +133 -0
- package/src/pricing-governance/index.ts +50 -0
- package/src/pricing-governance/pricing-format.ts +53 -0
- package/src/pricing-governance/useDecidePricingOverride.ts +78 -0
- package/src/pricing-governance/useModelGovernanceView.ts +290 -0
- package/src/pricing-governance/useModelPricingBaselines.ts +69 -0
- package/src/pricing-governance/usePricingGovernance.ts +57 -0
- package/src/pricing-governance/useRetireModelPricingBaseline.ts +65 -0
- package/src/pricing-governance/useUpsertModelPricingBaseline.ts +72 -0
- package/src/resource-creation/templates/workflow-templates.ts +4 -4
- package/src/session/__tests__/useCreateSession.test.tsx +94 -0
- package/src/session/__tests__/useNewSessionFlow.test.tsx +33 -0
- package/src/session/useCreateSession.ts +30 -0
- package/src/session/useEditSessionPrep.ts +3 -3
- package/src/session/useNewSessionFlow.ts +45 -1
- package/src/session/useUpdateSession.ts +29 -10
- 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
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
import { useCallback, useState } from "react";
|
|
4
4
|
import { create } from "@bufbuild/protobuf";
|
|
5
5
|
import { PushSkillFromExecutionArtifactRequestSchema } from "@stigmer/protos/ai/stigmer/agentic/skill/v1/io_pb";
|
|
6
|
+
import { parseManifest } from "@stigmer/sdk";
|
|
6
7
|
import { useStigmer } from "../hooks.js";
|
|
7
8
|
import { toError } from "../internal/toError.js";
|
|
8
|
-
import { parseResourceYaml } from "./parse-resource-yaml.js";
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
11
|
* Result returned after successfully applying a resource to an organization.
|
|
@@ -14,8 +14,8 @@ import { parseResourceYaml } from "./parse-resource-yaml.js";
|
|
|
14
14
|
* link to the resource in the Library (e.g., `/library/agents`).
|
|
15
15
|
*/
|
|
16
16
|
export interface ApplyResourceResult {
|
|
17
|
-
/** The resource kind that was applied. */
|
|
18
|
-
readonly kind:
|
|
17
|
+
/** The resource kind that was applied (`"Agent"`, `"McpServer"`, `"Skill"`, …). */
|
|
18
|
+
readonly kind: string;
|
|
19
19
|
/** The resource name (from response metadata). */
|
|
20
20
|
readonly name: string;
|
|
21
21
|
/** The organization the resource was applied to. */
|
|
@@ -44,14 +44,14 @@ export interface PushSkillParams {
|
|
|
44
44
|
/** Return value of {@link useApplyResource}. */
|
|
45
45
|
export interface UseApplyResourceReturn {
|
|
46
46
|
/**
|
|
47
|
-
* Apply a Stigmer resource YAML
|
|
47
|
+
* Apply a Stigmer resource YAML to an organization.
|
|
48
48
|
*
|
|
49
|
-
* Parses the YAML
|
|
50
|
-
* and
|
|
51
|
-
*
|
|
49
|
+
* Parses the YAML against the kind's generated proto schema via the SDK
|
|
50
|
+
* manifest engine and applies it through `stigmer.manifest.apply()` —
|
|
51
|
+
* any registry-supported kind, full fidelity.
|
|
52
52
|
*
|
|
53
|
-
* The `org` parameter
|
|
54
|
-
* the "Apply to [my-org]" UX intent.
|
|
53
|
+
* The `org` parameter fills in `metadata.org` when the YAML omits it —
|
|
54
|
+
* matching the "Apply to [my-org]" UX intent.
|
|
55
55
|
*
|
|
56
56
|
* @throws Re-throws the original error after setting `error` state, so
|
|
57
57
|
* callers can optionally catch for flow control.
|
|
@@ -93,9 +93,9 @@ export interface UseApplyResourceReturn {
|
|
|
93
93
|
*
|
|
94
94
|
* Handles two parallel apply paths:
|
|
95
95
|
*
|
|
96
|
-
* 1. **YAML resources
|
|
97
|
-
*
|
|
98
|
-
*
|
|
96
|
+
* 1. **YAML resources**: `applyYamlResource(content, org)` parses the YAML
|
|
97
|
+
* against the generated proto schema (SDK manifest engine) and applies
|
|
98
|
+
* it through the kind's `apply` RPC.
|
|
99
99
|
*
|
|
100
100
|
* 2. **Skill packages** (directory artifacts): `pushSkillPackage(params)`
|
|
101
101
|
* delegates to the server-side `pushFromExecutionArtifact` RPC.
|
|
@@ -129,7 +129,7 @@ export interface UseApplyResourceReturn {
|
|
|
129
129
|
* };
|
|
130
130
|
* ```
|
|
131
131
|
*
|
|
132
|
-
* @see {@link
|
|
132
|
+
* @see {@link parseManifest} for the YAML-to-proto conversion
|
|
133
133
|
* @see {@link detectStigmerResource} for YAML resource detection
|
|
134
134
|
* @see {@link useDetectSkillPackage} for skill package detection
|
|
135
135
|
*/
|
|
@@ -146,28 +146,21 @@ export function useApplyResource(): UseApplyResourceReturn {
|
|
|
146
146
|
setError(null);
|
|
147
147
|
|
|
148
148
|
try {
|
|
149
|
-
const
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
kind: "Agent",
|
|
156
|
-
name: agent.metadata?.name ?? parsed.input.name,
|
|
157
|
-
org: agent.metadata?.org ?? org,
|
|
158
|
-
slug: agent.metadata?.slug ?? parsed.input.name,
|
|
159
|
-
};
|
|
160
|
-
}
|
|
161
|
-
case "McpServer": {
|
|
162
|
-
const mcpServer = await stigmer.mcpServer.apply(parsed.input);
|
|
163
|
-
return {
|
|
164
|
-
kind: "McpServer",
|
|
165
|
-
name: mcpServer.metadata?.name ?? parsed.input.name,
|
|
166
|
-
org: mcpServer.metadata?.org ?? org,
|
|
167
|
-
slug: mcpServer.metadata?.slug ?? parsed.input.name,
|
|
168
|
-
};
|
|
169
|
-
}
|
|
149
|
+
const documents = parseManifest(content, { org });
|
|
150
|
+
if (documents.length > 1) {
|
|
151
|
+
throw new Error(
|
|
152
|
+
"This artifact contains multiple resource documents. " +
|
|
153
|
+
"Use Apply YAML in the Library to apply multi-document manifests.",
|
|
154
|
+
);
|
|
170
155
|
}
|
|
156
|
+
|
|
157
|
+
const applied = await stigmer.manifest.apply(documents[0]);
|
|
158
|
+
return {
|
|
159
|
+
kind: applied.yamlKind,
|
|
160
|
+
name: applied.name,
|
|
161
|
+
org: applied.org,
|
|
162
|
+
slug: applied.slug,
|
|
163
|
+
};
|
|
171
164
|
} catch (err) {
|
|
172
165
|
setError(toError(err));
|
|
173
166
|
throw err;
|
|
@@ -3,10 +3,11 @@
|
|
|
3
3
|
import { useCallback, useMemo } from "react";
|
|
4
4
|
import { parse as parseYaml } from "yaml";
|
|
5
5
|
import type { Agent } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/api_pb";
|
|
6
|
+
import type { Datastore } from "@stigmer/protos/ai/stigmer/agentic/datastore/v1/api_pb";
|
|
6
7
|
import type { McpServer } from "@stigmer/protos/ai/stigmer/agentic/mcpserver/v1/api_pb";
|
|
7
8
|
import type { Workflow } from "@stigmer/protos/ai/stigmer/agentic/workflow/v1/api_pb";
|
|
9
|
+
import { serializeManifest } from "@stigmer/sdk";
|
|
8
10
|
import { toast } from "../feedback/toast.js";
|
|
9
|
-
import { serializeAgentYaml, serializeMcpServerYaml } from "./serialize-resource-yaml.js";
|
|
10
11
|
import { serializeWorkflowYaml } from "../workflow/serialize-workflow-yaml.js";
|
|
11
12
|
|
|
12
13
|
// ---------------------------------------------------------------------------
|
|
@@ -16,9 +17,9 @@ import { serializeWorkflowYaml } from "../workflow/serialize-workflow-yaml.js";
|
|
|
16
17
|
/** Options for {@link useExportResource}. */
|
|
17
18
|
export interface UseExportResourceOptions {
|
|
18
19
|
/** The resource kind — determines which serializer is used. */
|
|
19
|
-
readonly kind: "Agent" | "McpServer" | "Workflow";
|
|
20
|
+
readonly kind: "Agent" | "McpServer" | "Workflow" | "Datastore";
|
|
20
21
|
/** The proto resource to export, or `null` when not yet loaded. */
|
|
21
|
-
readonly resource: Agent | McpServer | Workflow | null;
|
|
22
|
+
readonly resource: Agent | McpServer | Workflow | Datastore | null;
|
|
22
23
|
}
|
|
23
24
|
|
|
24
25
|
/** Return value of {@link useExportResource}. */
|
|
@@ -42,16 +43,19 @@ export interface UseExportResourceReturn {
|
|
|
42
43
|
// ---------------------------------------------------------------------------
|
|
43
44
|
|
|
44
45
|
/**
|
|
45
|
-
* Headless export hook for Stigmer resources (Agent, McpServer
|
|
46
|
+
* Headless export hook for Stigmer resources (Agent, McpServer,
|
|
47
|
+
* Workflow, Datastore).
|
|
46
48
|
*
|
|
47
49
|
* Serializes the resource into YAML and JSON formats and provides
|
|
48
50
|
* stable callbacks for copying to clipboard or triggering a file
|
|
49
51
|
* download. All operations are client-side — no additional API calls.
|
|
50
52
|
*
|
|
51
|
-
*
|
|
52
|
-
* (
|
|
53
|
-
*
|
|
54
|
-
*
|
|
53
|
+
* Non-workflow kinds serialize through the SDK manifest engine
|
|
54
|
+
* ({@link serializeManifest}) — the canonical Stigmer resource format
|
|
55
|
+
* (`apiVersion`, `kind`, `metadata`, `spec`, snake_case fields) that
|
|
56
|
+
* round-trips through `parseManifest` and `stigmer apply -f`. Workflows
|
|
57
|
+
* use their own canonical serializer, shared with the workflow Editor
|
|
58
|
+
* tab, so one workflow has exactly one YAML shape across the product.
|
|
55
59
|
*
|
|
56
60
|
* @param options - Resource kind and the proto resource object.
|
|
57
61
|
* @returns Stable callbacks and memoized serialized strings.
|
|
@@ -68,8 +72,8 @@ export interface UseExportResourceReturn {
|
|
|
68
72
|
* <ActionMenu.Item onSelect={downloadYaml}>Download YAML</ActionMenu.Item>
|
|
69
73
|
* ```
|
|
70
74
|
*
|
|
71
|
-
* @see {@link
|
|
72
|
-
* @see {@link
|
|
75
|
+
* @see {@link serializeManifest} for the underlying Agent/McpServer serializer
|
|
76
|
+
* @see {@link serializeWorkflowYaml} for the workflow-canonical serializer
|
|
73
77
|
*/
|
|
74
78
|
export function useExportResource({
|
|
75
79
|
kind,
|
|
@@ -77,15 +81,17 @@ export function useExportResource({
|
|
|
77
81
|
}: UseExportResourceOptions): UseExportResourceReturn {
|
|
78
82
|
const yaml = useMemo<string | null>(() => {
|
|
79
83
|
if (!resource) return null;
|
|
80
|
-
if (kind === "Agent") return serializeAgentYaml(resource as Agent);
|
|
81
84
|
if (kind === "Workflow") return serializeWorkflowYaml(resource as Workflow);
|
|
82
|
-
return
|
|
85
|
+
return serializeManifest(resource);
|
|
83
86
|
}, [kind, resource]);
|
|
84
87
|
|
|
85
88
|
const json = useMemo<string | null>(() => {
|
|
86
|
-
if (!
|
|
87
|
-
|
|
88
|
-
|
|
89
|
+
if (!yaml) return null;
|
|
90
|
+
// Parse the YAML output to re-stringify as JSON — this guarantees the
|
|
91
|
+
// JSON structure is identical to the YAML structure (snake_case
|
|
92
|
+
// fields, no status).
|
|
93
|
+
return JSON.stringify(parseYaml(yaml), null, 2);
|
|
94
|
+
}, [yaml]);
|
|
89
95
|
|
|
90
96
|
const slug = useMemo<string>(() => {
|
|
91
97
|
if (!resource) return "resource";
|
|
@@ -120,31 +126,6 @@ export function useExportResource({
|
|
|
120
126
|
);
|
|
121
127
|
}
|
|
122
128
|
|
|
123
|
-
// ---------------------------------------------------------------------------
|
|
124
|
-
// JSON serialization
|
|
125
|
-
// ---------------------------------------------------------------------------
|
|
126
|
-
|
|
127
|
-
/**
|
|
128
|
-
* Produces a JSON representation of the resource using the same canonical
|
|
129
|
-
* structure as the YAML export (apiVersion, kind, metadata, spec).
|
|
130
|
-
*
|
|
131
|
-
* Internally parses the YAML output to get a clean plain object, then
|
|
132
|
-
* re-stringifies as JSON. This guarantees the JSON structure is identical
|
|
133
|
-
* to the YAML structure (snake_case fields, no status).
|
|
134
|
-
*/
|
|
135
|
-
function serializeResourceJson(
|
|
136
|
-
resource: Agent | McpServer | Workflow,
|
|
137
|
-
kind: "Agent" | "McpServer" | "Workflow",
|
|
138
|
-
): string {
|
|
139
|
-
let yamlStr: string;
|
|
140
|
-
if (kind === "Agent") yamlStr = serializeAgentYaml(resource as Agent);
|
|
141
|
-
else if (kind === "Workflow") yamlStr = serializeWorkflowYaml(resource as Workflow);
|
|
142
|
-
else yamlStr = serializeMcpServerYaml(resource as McpServer);
|
|
143
|
-
|
|
144
|
-
const doc = parseYaml(yamlStr);
|
|
145
|
-
return JSON.stringify(doc, null, 2);
|
|
146
|
-
}
|
|
147
|
-
|
|
148
129
|
// ---------------------------------------------------------------------------
|
|
149
130
|
// Clipboard
|
|
150
131
|
// ---------------------------------------------------------------------------
|
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { lazy, Suspense, useCallback, useEffect, useRef } from "react";
|
|
4
|
+
import { cn } from "@stigmer/theme";
|
|
5
|
+
import { toast } from "../feedback/toast.js";
|
|
6
|
+
import { RedactedSecretsNotice } from "./RedactedSecretsNotice.js";
|
|
7
|
+
import {
|
|
8
|
+
useApplyManifest,
|
|
9
|
+
type ManifestPreviewEntry,
|
|
10
|
+
} from "./useApplyManifest.js";
|
|
11
|
+
|
|
12
|
+
// CodeMirror loads only when the dialog actually opens (DD-013).
|
|
13
|
+
const LazyYamlEditor = lazy(() =>
|
|
14
|
+
import("./YamlEditor.js").then((m) => ({ default: m.YamlEditor })),
|
|
15
|
+
);
|
|
16
|
+
|
|
17
|
+
/** Props for {@link ApplyManifestDialog}. */
|
|
18
|
+
export interface ApplyManifestDialogProps {
|
|
19
|
+
/** Whether the dialog is open. */
|
|
20
|
+
readonly open: boolean;
|
|
21
|
+
/** Called when the dialog should open or close. */
|
|
22
|
+
readonly onOpenChange: (open: boolean) => void;
|
|
23
|
+
/** Target organization slug for documents that omit `metadata.org`. */
|
|
24
|
+
readonly org: string;
|
|
25
|
+
/**
|
|
26
|
+
* Called after every document applied successfully, with the per-document
|
|
27
|
+
* results in apply order. Use for navigation or list refresh.
|
|
28
|
+
*/
|
|
29
|
+
readonly onSuccess?: (entries: readonly ManifestPreviewEntry[]) => void;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Modal dialog for applying a Stigmer resource manifest — paste YAML or
|
|
34
|
+
* upload a file, review what will change, and apply. The console
|
|
35
|
+
* counterpart of `stigmer apply -f`, for every supported resource kind.
|
|
36
|
+
*
|
|
37
|
+
* Workflow:
|
|
38
|
+
* 1. Paste manifest YAML (or JSON) into the editor, or pick a file
|
|
39
|
+
* 2. Each document is validated against its kind's generated proto schema
|
|
40
|
+
* and previewed with a create-or-update badge resolved from server state
|
|
41
|
+
* 3. Apply runs the documents sequentially in dependency order with live
|
|
42
|
+
* per-document status; a failure stops the run and renders inline
|
|
43
|
+
*
|
|
44
|
+
* Multi-document manifests (`---` separators) are supported. Documents
|
|
45
|
+
* that omit `metadata.org` are applied to the active org; documents naming
|
|
46
|
+
* a different org are honored with a warning (matching `stigmer apply`).
|
|
47
|
+
*
|
|
48
|
+
* Uses the native `<dialog>` element for built-in focus trapping, Escape
|
|
49
|
+
* key handling, and backdrop — consistent with {@link ConfirmDialog}.
|
|
50
|
+
*
|
|
51
|
+
* Zero Console dependencies — safe for platform builder embedding.
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* ```tsx
|
|
55
|
+
* <ApplyManifestDialog
|
|
56
|
+
* open={open}
|
|
57
|
+
* onOpenChange={setOpen}
|
|
58
|
+
* org={activeOrg}
|
|
59
|
+
* onSuccess={() => refetchList()}
|
|
60
|
+
* />
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
export function ApplyManifestDialog({
|
|
64
|
+
open,
|
|
65
|
+
onOpenChange,
|
|
66
|
+
org,
|
|
67
|
+
onSuccess,
|
|
68
|
+
}: ApplyManifestDialogProps) {
|
|
69
|
+
const dialogRef = useRef<HTMLDialogElement>(null);
|
|
70
|
+
const fileInputRef = useRef<HTMLInputElement>(null);
|
|
71
|
+
const manifest = useApplyManifest(org);
|
|
72
|
+
const { reset } = manifest;
|
|
73
|
+
|
|
74
|
+
// Sync dialog open state with the native <dialog> element.
|
|
75
|
+
useEffect(() => {
|
|
76
|
+
const dialog = dialogRef.current;
|
|
77
|
+
if (!dialog) return;
|
|
78
|
+
if (open && !dialog.open) {
|
|
79
|
+
dialog.showModal();
|
|
80
|
+
} else if (!open && dialog.open) {
|
|
81
|
+
dialog.close();
|
|
82
|
+
}
|
|
83
|
+
}, [open]);
|
|
84
|
+
|
|
85
|
+
// Start each session clean.
|
|
86
|
+
useEffect(() => {
|
|
87
|
+
if (open) {
|
|
88
|
+
reset();
|
|
89
|
+
if (fileInputRef.current) fileInputRef.current.value = "";
|
|
90
|
+
}
|
|
91
|
+
}, [open, reset]);
|
|
92
|
+
|
|
93
|
+
const handleCancel = useCallback(
|
|
94
|
+
(e: React.SyntheticEvent) => {
|
|
95
|
+
e.preventDefault();
|
|
96
|
+
onOpenChange(false);
|
|
97
|
+
},
|
|
98
|
+
[onOpenChange],
|
|
99
|
+
);
|
|
100
|
+
|
|
101
|
+
const handleFileChange = useCallback(
|
|
102
|
+
(e: React.ChangeEvent<HTMLInputElement>) => {
|
|
103
|
+
const file = e.target.files?.[0];
|
|
104
|
+
if (file) manifest.readFile(file);
|
|
105
|
+
},
|
|
106
|
+
[manifest],
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
const handleApply = useCallback(async () => {
|
|
110
|
+
const allApplied = await manifest.applyAll();
|
|
111
|
+
if (allApplied && manifest.entries) {
|
|
112
|
+
const count = manifest.entries.length;
|
|
113
|
+
toast.success(
|
|
114
|
+
count === 1 ? "Resource applied" : `${count} resources applied`,
|
|
115
|
+
);
|
|
116
|
+
onOpenChange(false);
|
|
117
|
+
onSuccess?.(manifest.entries);
|
|
118
|
+
}
|
|
119
|
+
// On failure the dialog stays open — per-entry status shows what
|
|
120
|
+
// applied and what failed.
|
|
121
|
+
}, [manifest, onOpenChange, onSuccess]);
|
|
122
|
+
|
|
123
|
+
const canApply =
|
|
124
|
+
manifest.entries !== null &&
|
|
125
|
+
manifest.entries.length > 0 &&
|
|
126
|
+
!manifest.isValidating &&
|
|
127
|
+
!manifest.isApplying;
|
|
128
|
+
|
|
129
|
+
return (
|
|
130
|
+
<dialog
|
|
131
|
+
ref={dialogRef}
|
|
132
|
+
onCancel={handleCancel}
|
|
133
|
+
className={cn(
|
|
134
|
+
"fixed inset-0 z-50 m-auto w-full max-w-3xl rounded-lg border border-border bg-popover p-0 text-popover-foreground shadow-lg",
|
|
135
|
+
"backdrop:bg-black/50",
|
|
136
|
+
"open:animate-in open:fade-in-0 open:zoom-in-95",
|
|
137
|
+
)}
|
|
138
|
+
>
|
|
139
|
+
<div className="flex flex-col gap-4 p-6">
|
|
140
|
+
{/* Header */}
|
|
141
|
+
<div className="flex flex-col gap-1">
|
|
142
|
+
<h3 className="text-base font-semibold text-foreground">Apply YAML</h3>
|
|
143
|
+
<p className="text-sm text-muted-foreground">
|
|
144
|
+
Paste a resource manifest or upload a file. Resources are created
|
|
145
|
+
when new and updated when they already exist.
|
|
146
|
+
</p>
|
|
147
|
+
</div>
|
|
148
|
+
|
|
149
|
+
{/* File picker */}
|
|
150
|
+
<input
|
|
151
|
+
ref={fileInputRef}
|
|
152
|
+
type="file"
|
|
153
|
+
accept=".yaml,.yml,.json"
|
|
154
|
+
onChange={handleFileChange}
|
|
155
|
+
className={cn(
|
|
156
|
+
"w-full rounded-md border border-input bg-background px-3 py-2 text-sm text-foreground",
|
|
157
|
+
"file:mr-3 file:rounded-md file:border-0 file:bg-primary file:px-2.5 file:py-1 file:text-xs file:font-medium file:text-primary-foreground",
|
|
158
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
159
|
+
)}
|
|
160
|
+
aria-label="Select manifest file"
|
|
161
|
+
/>
|
|
162
|
+
|
|
163
|
+
{/* Manifest editor */}
|
|
164
|
+
<Suspense fallback={<EditorLoading />}>
|
|
165
|
+
<LazyYamlEditor
|
|
166
|
+
value={manifest.content}
|
|
167
|
+
onChange={manifest.setContent}
|
|
168
|
+
className="h-56"
|
|
169
|
+
/>
|
|
170
|
+
</Suspense>
|
|
171
|
+
|
|
172
|
+
{manifest.hasRedactedSecrets && <RedactedSecretsNotice />}
|
|
173
|
+
|
|
174
|
+
{/* Validation error */}
|
|
175
|
+
{manifest.validationError && (
|
|
176
|
+
<div
|
|
177
|
+
role="alert"
|
|
178
|
+
className="rounded-md border border-destructive bg-card px-3 py-2.5 text-sm text-destructive"
|
|
179
|
+
>
|
|
180
|
+
{manifest.validationError}
|
|
181
|
+
</div>
|
|
182
|
+
)}
|
|
183
|
+
|
|
184
|
+
{/* Per-document preview */}
|
|
185
|
+
{manifest.entries && manifest.entries.length > 0 && (
|
|
186
|
+
<ul className="flex max-h-48 flex-col gap-2 overflow-y-auto" aria-label="Resources to apply">
|
|
187
|
+
{manifest.entries.map((entry, index) => (
|
|
188
|
+
<PreviewRow key={`${entry.document.handler.yamlKind}/${entry.document.org}/${entry.document.slug}/${index}`} entry={entry} />
|
|
189
|
+
))}
|
|
190
|
+
</ul>
|
|
191
|
+
)}
|
|
192
|
+
|
|
193
|
+
{/* Actions */}
|
|
194
|
+
<div className="flex items-center justify-between gap-3">
|
|
195
|
+
<p className="text-xs text-muted-foreground" aria-live="polite">
|
|
196
|
+
{manifest.isValidating ? "Validating…" : ""}
|
|
197
|
+
</p>
|
|
198
|
+
<div className="flex gap-2">
|
|
199
|
+
<button
|
|
200
|
+
type="button"
|
|
201
|
+
onClick={() => onOpenChange(false)}
|
|
202
|
+
disabled={manifest.isApplying}
|
|
203
|
+
className={cn(
|
|
204
|
+
"rounded-md px-3 py-1.5 text-sm font-medium transition-colors",
|
|
205
|
+
"border border-input bg-background text-foreground",
|
|
206
|
+
"hover:bg-accent hover:text-accent-foreground",
|
|
207
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
208
|
+
"disabled:pointer-events-none disabled:opacity-50",
|
|
209
|
+
)}
|
|
210
|
+
>
|
|
211
|
+
Cancel
|
|
212
|
+
</button>
|
|
213
|
+
<button
|
|
214
|
+
type="button"
|
|
215
|
+
onClick={handleApply}
|
|
216
|
+
disabled={!canApply}
|
|
217
|
+
className={cn(
|
|
218
|
+
"rounded-md px-3 py-1.5 text-sm font-medium transition-colors",
|
|
219
|
+
"bg-primary text-primary-foreground hover:bg-primary-hover",
|
|
220
|
+
"focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
|
|
221
|
+
"disabled:pointer-events-none disabled:opacity-50",
|
|
222
|
+
)}
|
|
223
|
+
>
|
|
224
|
+
{manifest.isApplying
|
|
225
|
+
? "Applying…"
|
|
226
|
+
: applyLabel(manifest.entries?.length ?? 0)}
|
|
227
|
+
</button>
|
|
228
|
+
</div>
|
|
229
|
+
</div>
|
|
230
|
+
</div>
|
|
231
|
+
</dialog>
|
|
232
|
+
);
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
function applyLabel(count: number): string {
|
|
236
|
+
if (count <= 1) return "Apply";
|
|
237
|
+
return `Apply ${count} resources`;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
function EditorLoading() {
|
|
241
|
+
return (
|
|
242
|
+
<div className="flex h-56 items-center justify-center rounded-md border border-border bg-muted text-sm text-muted-foreground">
|
|
243
|
+
Loading editor…
|
|
244
|
+
</div>
|
|
245
|
+
);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// ---------------------------------------------------------------------------
|
|
249
|
+
// Per-document preview row
|
|
250
|
+
// ---------------------------------------------------------------------------
|
|
251
|
+
|
|
252
|
+
function PreviewRow({ entry }: { readonly entry: ManifestPreviewEntry }) {
|
|
253
|
+
return (
|
|
254
|
+
<li className="rounded-md border border-border bg-card px-3 py-2">
|
|
255
|
+
<div className="flex items-center gap-2">
|
|
256
|
+
<span className="inline-flex rounded bg-muted px-1.5 py-0.5 text-xs font-medium text-muted-foreground">
|
|
257
|
+
{entry.document.handler.displayName}
|
|
258
|
+
</span>
|
|
259
|
+
<span className="text-sm font-medium text-foreground">
|
|
260
|
+
{entry.document.name}
|
|
261
|
+
</span>
|
|
262
|
+
<ActionBadge entry={entry} />
|
|
263
|
+
<span className="ml-auto text-xs text-muted-foreground">
|
|
264
|
+
{entry.document.org}
|
|
265
|
+
</span>
|
|
266
|
+
</div>
|
|
267
|
+
{entry.document.warning && (
|
|
268
|
+
<p className="mt-1 text-xs text-muted-foreground">{entry.document.warning}</p>
|
|
269
|
+
)}
|
|
270
|
+
{entry.status === "failed" && entry.errorMessage && (
|
|
271
|
+
<p role="alert" className="mt-1 text-xs text-destructive">
|
|
272
|
+
{entry.errorMessage}
|
|
273
|
+
</p>
|
|
274
|
+
)}
|
|
275
|
+
</li>
|
|
276
|
+
);
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
function ActionBadge({ entry }: { readonly entry: ManifestPreviewEntry }) {
|
|
280
|
+
const label = badgeLabel(entry);
|
|
281
|
+
return (
|
|
282
|
+
<span
|
|
283
|
+
className={cn(
|
|
284
|
+
"inline-flex rounded px-1.5 py-0.5 text-xs font-medium",
|
|
285
|
+
entry.status === "failed"
|
|
286
|
+
? "bg-card text-destructive border border-destructive"
|
|
287
|
+
: "bg-muted text-muted-foreground",
|
|
288
|
+
)}
|
|
289
|
+
>
|
|
290
|
+
{label}
|
|
291
|
+
</span>
|
|
292
|
+
);
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
function badgeLabel(entry: ManifestPreviewEntry): string {
|
|
296
|
+
switch (entry.status) {
|
|
297
|
+
case "applying":
|
|
298
|
+
return "Applying…";
|
|
299
|
+
case "applied":
|
|
300
|
+
return "Applied";
|
|
301
|
+
case "failed":
|
|
302
|
+
return "Failed";
|
|
303
|
+
case "skipped":
|
|
304
|
+
return "Skipped";
|
|
305
|
+
case "pending":
|
|
306
|
+
switch (entry.action) {
|
|
307
|
+
case "create":
|
|
308
|
+
return "Will create";
|
|
309
|
+
case "update":
|
|
310
|
+
return "Will update";
|
|
311
|
+
case "unknown":
|
|
312
|
+
return "Create or update";
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
}
|