@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
package/settings/settings-nav.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AppWindow, BarChart3, Box, Building2, CreditCard, KeyRound, Link, MessageSquare, Plug, ShieldCheck, Users, } from "lucide-react";
|
|
1
|
+
import { AppWindow, BarChart3, Box, Building2, CreditCard, KeyRound, Link, MessageSquare, MousePointerClick, Plug, Scale, ShieldCheck, Users, } from "lucide-react";
|
|
2
2
|
/** Canonical settings sidebar/grouped navigation model. */
|
|
3
3
|
export const SETTINGS_NAV_GROUPS = [
|
|
4
4
|
{
|
|
@@ -43,4 +43,35 @@ export const SETTINGS_NAV_GROUPS = [
|
|
|
43
43
|
],
|
|
44
44
|
},
|
|
45
45
|
];
|
|
46
|
+
/**
|
|
47
|
+
* Stigmer-internal platform-operator navigation group.
|
|
48
|
+
*
|
|
49
|
+
* Deliberately NOT part of {@link SETTINGS_NAV_GROUPS}: that constant
|
|
50
|
+
* means "groups every signed-in user sees", and its members must never
|
|
51
|
+
* change based on who is looking. This group is appended for platform
|
|
52
|
+
* operators only — use {@link useSettingsNavGroups} to get the
|
|
53
|
+
* permission-aware list instead of composing the two by hand.
|
|
54
|
+
*
|
|
55
|
+
* Every item here declares its `requiredPermission`; the hook filters
|
|
56
|
+
* per item (fail-closed), so an operator holding one platform permission
|
|
57
|
+
* but not another sees exactly their slice of this group.
|
|
58
|
+
*/
|
|
59
|
+
export const PLATFORM_SETTINGS_NAV_GROUP = {
|
|
60
|
+
label: "Platform",
|
|
61
|
+
description: "Stigmer-internal operations. Visible to platform operators only.",
|
|
62
|
+
items: [
|
|
63
|
+
{
|
|
64
|
+
href: "/settings/pricing-governance",
|
|
65
|
+
label: "Pricing Governance",
|
|
66
|
+
icon: Scale,
|
|
67
|
+
requiredPermission: "can_manage_model_pricing",
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
href: "/settings/cursor-accounts",
|
|
71
|
+
label: "Cursor Accounts",
|
|
72
|
+
icon: MousePointerClick,
|
|
73
|
+
requiredPermission: "can_manage_cursor_accounts",
|
|
74
|
+
},
|
|
75
|
+
],
|
|
76
|
+
};
|
|
46
77
|
//# sourceMappingURL=settings-nav.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-nav.js","sourceRoot":"","sources":["../../src/settings/settings-nav.ts"],"names":[],"mappings":"AACA,OAAO,EACL,SAAS,EACT,SAAS,EACT,GAAG,EACH,SAAS,EACT,UAAU,EACV,QAAQ,EACR,IAAI,EACJ,aAAa,EACb,IAAI,EACJ,WAAW,EACX,KAAK,GACN,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"settings-nav.js","sourceRoot":"","sources":["../../src/settings/settings-nav.ts"],"names":[],"mappings":"AACA,OAAO,EACL,SAAS,EACT,SAAS,EACT,GAAG,EACH,SAAS,EACT,UAAU,EACV,QAAQ,EACR,IAAI,EACJ,aAAa,EACb,iBAAiB,EACjB,IAAI,EACJ,KAAK,EACL,WAAW,EACX,KAAK,GACN,MAAM,cAAc,CAAC;AAiCtB,2DAA2D;AAC3D,MAAM,CAAC,MAAM,mBAAmB,GAAgC;IAC9D;QACE,KAAK,EAAE,cAAc;QACrB,WAAW,EACT,kEAAkE;QACpE,KAAK,EAAE;YACL,EAAE,IAAI,EAAE,uBAAuB,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,EAAE;YACxE,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE;YAC5D,EAAE,IAAI,EAAE,uBAAuB,EAAE,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,EAAE;YACnE;gBACE,IAAI,EAAE,8BAA8B;gBACpC,KAAK,EAAE,oBAAoB;gBAC3B,IAAI,EAAE,WAAW;aAClB;SACF;KACF;IACD;QACE,KAAK,EAAE,eAAe;QACtB,WAAW,EACT,mFAAmF;QACrF,KAAK,EAAE;YACL,EAAE,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE;YACjE;gBACE,IAAI,EAAE,4BAA4B;gBAClC,KAAK,EAAE,kBAAkB;gBACzB,IAAI,EAAE,IAAI;aACX;YACD,EAAE,IAAI,EAAE,wBAAwB,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,GAAG,EAAE;YACpE,EAAE,IAAI,EAAE,sBAAsB,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,EAAE;YACtE;gBACE,IAAI,EAAE,wBAAwB;gBAC9B,KAAK,EAAE,cAAc;gBACrB,IAAI,EAAE,aAAa;aACpB;SACF;KACF;IACD;QACE,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,sCAAsC;QACnD,KAAK,EAAE;YACL,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE;YACjE,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE;SAC7D;KACF;CACF,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAqB;IAC3D,KAAK,EAAE,UAAU;IACjB,WAAW,EACT,kEAAkE;IACpE,KAAK,EAAE;QACL;YACE,IAAI,EAAE,8BAA8B;YACpC,KAAK,EAAE,oBAAoB;YAC3B,IAAI,EAAE,KAAK;YACX,kBAAkB,EAAE,0BAA0B;SAC/C;QACD;YACE,IAAI,EAAE,2BAA2B;YACjC,KAAK,EAAE,iBAAiB;YACxB,IAAI,EAAE,iBAAiB;YACvB,kBAAkB,EAAE,4BAA4B;SACjD;KACF;CACF,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { type SettingsNavGroup } from "./settings-nav.js";
|
|
2
|
+
/**
|
|
3
|
+
* Permission-aware settings navigation: {@link SETTINGS_NAV_GROUPS}
|
|
4
|
+
* for everyone, plus the {@link PLATFORM_SETTINGS_NAV_GROUP} items the
|
|
5
|
+
* caller's platform permissions unlock (per-item `requiredPermission`,
|
|
6
|
+
* checked against `platform:stigmer`). The group appears when at least
|
|
7
|
+
* one of its items is visible.
|
|
8
|
+
*
|
|
9
|
+
* The checks run fail-closed — the opposite of the `useCheckPermission`
|
|
10
|
+
* default — because navigation is *discoverability*, not *capability*:
|
|
11
|
+
* an action gate can safely fail open (the server re-checks every
|
|
12
|
+
* request), but an operator-only nav entry must not appear while the
|
|
13
|
+
* check is loading, when it errors, or on deployments where the IAM
|
|
14
|
+
* service (and the surface it points to) does not exist.
|
|
15
|
+
*
|
|
16
|
+
* Implementation note: hooks must be called unconditionally, so each
|
|
17
|
+
* distinct platform permission gets its own static check below. When a
|
|
18
|
+
* new platform surface adds a new permission, add its check to
|
|
19
|
+
* PLATFORM_PERMISSION_CHECKS' shape here — the exhaustiveness guard in
|
|
20
|
+
* the tests catches a forgotten one.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```tsx
|
|
24
|
+
* const groups = useSettingsNavGroups();
|
|
25
|
+
* return groups.map((group) => <NavGroup key={group.label} group={group} />);
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
export declare function useSettingsNavGroups(): readonly SettingsNavGroup[];
|
|
29
|
+
//# sourceMappingURL=useSettingsNavGroups.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSettingsNavGroups.d.ts","sourceRoot":"","sources":["../../src/settings/useSettingsNavGroups.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,KAAK,gBAAgB,EACtB,MAAM,mBAAmB,CAAC;AAS3B;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,oBAAoB,IAAI,SAAS,gBAAgB,EAAE,CAqClE"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useMemo } from "react";
|
|
3
|
+
import { useCheckPermission } from "../iam-policy/useCheckPermission.js";
|
|
4
|
+
import { PLATFORM_SETTINGS_NAV_GROUP, SETTINGS_NAV_GROUPS, } from "./settings-nav.js";
|
|
5
|
+
/**
|
|
6
|
+
* The `platform` singleton — platform-level permissions are always
|
|
7
|
+
* checked against this one resource (mirrors the server-side
|
|
8
|
+
* `resource_id = "stigmer"` RPC config).
|
|
9
|
+
*/
|
|
10
|
+
const PLATFORM_RESOURCE = { kind: "platform", id: "stigmer" };
|
|
11
|
+
/**
|
|
12
|
+
* Permission-aware settings navigation: {@link SETTINGS_NAV_GROUPS}
|
|
13
|
+
* for everyone, plus the {@link PLATFORM_SETTINGS_NAV_GROUP} items the
|
|
14
|
+
* caller's platform permissions unlock (per-item `requiredPermission`,
|
|
15
|
+
* checked against `platform:stigmer`). The group appears when at least
|
|
16
|
+
* one of its items is visible.
|
|
17
|
+
*
|
|
18
|
+
* The checks run fail-closed — the opposite of the `useCheckPermission`
|
|
19
|
+
* default — because navigation is *discoverability*, not *capability*:
|
|
20
|
+
* an action gate can safely fail open (the server re-checks every
|
|
21
|
+
* request), but an operator-only nav entry must not appear while the
|
|
22
|
+
* check is loading, when it errors, or on deployments where the IAM
|
|
23
|
+
* service (and the surface it points to) does not exist.
|
|
24
|
+
*
|
|
25
|
+
* Implementation note: hooks must be called unconditionally, so each
|
|
26
|
+
* distinct platform permission gets its own static check below. When a
|
|
27
|
+
* new platform surface adds a new permission, add its check to
|
|
28
|
+
* PLATFORM_PERMISSION_CHECKS' shape here — the exhaustiveness guard in
|
|
29
|
+
* the tests catches a forgotten one.
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```tsx
|
|
33
|
+
* const groups = useSettingsNavGroups();
|
|
34
|
+
* return groups.map((group) => <NavGroup key={group.label} group={group} />);
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export function useSettingsNavGroups() {
|
|
38
|
+
const pricing = useCheckPermission(PLATFORM_RESOURCE, "can_manage_model_pricing", { fail: "closed" });
|
|
39
|
+
const cursorAccounts = useCheckPermission(PLATFORM_RESOURCE, "can_manage_cursor_accounts", { fail: "closed" });
|
|
40
|
+
const pricingAllowed = pricing.allowed;
|
|
41
|
+
const cursorAccountsAllowed = cursorAccounts.allowed;
|
|
42
|
+
return useMemo(() => {
|
|
43
|
+
const verdicts = {
|
|
44
|
+
can_manage_model_pricing: pricingAllowed,
|
|
45
|
+
can_manage_cursor_accounts: cursorAccountsAllowed,
|
|
46
|
+
};
|
|
47
|
+
const visibleItems = PLATFORM_SETTINGS_NAV_GROUP.items.filter(
|
|
48
|
+
// Fail closed on both axes: an item with no declared permission or
|
|
49
|
+
// with a permission this hook does not check yet stays hidden.
|
|
50
|
+
(item) => item.requiredPermission !== undefined &&
|
|
51
|
+
verdicts[item.requiredPermission] === true);
|
|
52
|
+
if (visibleItems.length === 0) {
|
|
53
|
+
return SETTINGS_NAV_GROUPS;
|
|
54
|
+
}
|
|
55
|
+
return [
|
|
56
|
+
...SETTINGS_NAV_GROUPS,
|
|
57
|
+
{ ...PLATFORM_SETTINGS_NAV_GROUP, items: visibleItems },
|
|
58
|
+
];
|
|
59
|
+
}, [pricingAllowed, cursorAccountsAllowed]);
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=useSettingsNavGroups.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSettingsNavGroups.js","sourceRoot":"","sources":["../../src/settings/useSettingsNavGroups.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EACL,2BAA2B,EAC3B,mBAAmB,GAEpB,MAAM,mBAAmB,CAAC;AAE3B;;;;GAIG;AACH,MAAM,iBAAiB,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,SAAS,EAAW,CAAC;AAEvE;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,UAAU,oBAAoB;IAClC,MAAM,OAAO,GAAG,kBAAkB,CAChC,iBAAiB,EACjB,0BAA0B,EAC1B,EAAE,IAAI,EAAE,QAAQ,EAAE,CACnB,CAAC;IACF,MAAM,cAAc,GAAG,kBAAkB,CACvC,iBAAiB,EACjB,4BAA4B,EAC5B,EAAE,IAAI,EAAE,QAAQ,EAAE,CACnB,CAAC;IAEF,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IACvC,MAAM,qBAAqB,GAAG,cAAc,CAAC,OAAO,CAAC;IAErD,OAAO,OAAO,CAAC,GAAG,EAAE;QAClB,MAAM,QAAQ,GAA4B;YACxC,wBAAwB,EAAE,cAAc;YACxC,0BAA0B,EAAE,qBAAqB;SAClD,CAAC;QAEF,MAAM,YAAY,GAAG,2BAA2B,CAAC,KAAK,CAAC,MAAM;QAC3D,mEAAmE;QACnE,+DAA+D;QAC/D,CAAC,IAAI,EAAE,EAAE,CACP,IAAI,CAAC,kBAAkB,KAAK,SAAS;YACrC,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,IAAI,CAC7C,CAAC;QAEF,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,mBAAmB,CAAC;QAC7B,CAAC;QACD,OAAO;YACL,GAAG,mBAAmB;YACtB,EAAE,GAAG,2BAA2B,EAAE,KAAK,EAAE,YAAY,EAAE;SACxD,CAAC;IACJ,CAAC,EAAE,CAAC,cAAc,EAAE,qBAAqB,CAAC,CAAC,CAAC;AAC9C,CAAC"}
|
|
@@ -2,9 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
import { useMemo } from "react";
|
|
4
4
|
import { cn } from "@stigmer/theme";
|
|
5
|
-
import { getUserMessage } from "@stigmer/sdk";
|
|
5
|
+
import { buildAgentProto, getUserMessage, serializeManifest } from "@stigmer/sdk";
|
|
6
6
|
import type { AgentInput } from "@stigmer/sdk";
|
|
7
|
-
import { serializeAgentInputYaml } from "../../library/serialize-resource-yaml.js";
|
|
8
7
|
import type { AgentWizardData } from "./types.js";
|
|
9
8
|
|
|
10
9
|
/** Props for {@link ReviewStep}. */
|
|
@@ -30,7 +29,7 @@ export function ReviewStep({
|
|
|
30
29
|
}: ReviewStepProps) {
|
|
31
30
|
const agentInput = useMemo(() => buildAgentInput(org, data), [org, data]);
|
|
32
31
|
const yamlPreview = useMemo(
|
|
33
|
-
() =>
|
|
32
|
+
() => serializeManifest(buildAgentProto(agentInput)),
|
|
34
33
|
[agentInput],
|
|
35
34
|
);
|
|
36
35
|
|
package/src/billing/index.ts
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
// Billing — the customer-facing surface: subscription plans, credit
|
|
2
|
+
// balance and ledger, payment methods, usage reports, and customer model
|
|
3
|
+
// pricing. The platform-operator pricing surface (registry baseline
|
|
4
|
+
// authoring, override sign-offs) lives in ../pricing-governance.
|
|
5
|
+
|
|
1
6
|
// Data hooks
|
|
2
7
|
export { useBillingAccount } from "./useBillingAccount.js";
|
|
3
8
|
export type { UseBillingAccountReturn } from "./useBillingAccount.js";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
3
|
import { useCallback, useState } from "react";
|
|
4
|
-
import { KeyRound, MessageSquare, MoreHorizontal, Trash2 } from "lucide-react";
|
|
4
|
+
import { FileCode2, KeyRound, MessageSquare, MoreHorizontal, Trash2 } from "lucide-react";
|
|
5
5
|
import { cn } from "@stigmer/theme";
|
|
6
6
|
import { getUserMessage } from "@stigmer/sdk";
|
|
7
7
|
import type { Agent } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/api_pb";
|
|
@@ -17,6 +17,7 @@ import { useChannelAppList } from "../channel-app/useChannelAppList.js";
|
|
|
17
17
|
import { useCheckPermission } from "../iam-policy/useCheckPermission.js";
|
|
18
18
|
import { ConfirmDialog } from "../resource-detail/ConfirmDialog.js";
|
|
19
19
|
import { useConfirmAction } from "../resource-detail/useConfirmAction.js";
|
|
20
|
+
import { EditResourceYamlDialog } from "../manifest/EditResourceYamlDialog.js";
|
|
20
21
|
import { useDeploymentMode } from "../deployment-mode.js";
|
|
21
22
|
import { CloudFeatureNotice } from "../internal/CloudFeatureNotice.js";
|
|
22
23
|
import { ChannelConversationsDialog } from "./ChannelConversationsDialog.js";
|
|
@@ -147,6 +148,9 @@ export function AgentChannelsPanel({
|
|
|
147
148
|
const [viewingConversations, setViewingConversations] =
|
|
148
149
|
useState<AgentChannel | null>(null);
|
|
149
150
|
|
|
151
|
+
// The channel being edited as YAML (the kind-agnostic manifest flow).
|
|
152
|
+
const [editingYaml, setEditingYaml] = useState<AgentChannel | null>(null);
|
|
153
|
+
|
|
150
154
|
const handleConnect = useCallback(
|
|
151
155
|
(channel: AgentChannel | null, provider: ChannelProviderDescriptor) => {
|
|
152
156
|
// Only redirect-style installs need the host hand-off (they open a
|
|
@@ -289,6 +293,7 @@ export function AgentChannelsPanel({
|
|
|
289
293
|
onDeleteClick={() => void handleDelete(channel)}
|
|
290
294
|
onEditCredentials={() => setEditingCredentials(channel)}
|
|
291
295
|
onViewConversations={() => setViewingConversations(channel)}
|
|
296
|
+
onEditYaml={() => setEditingYaml(channel)}
|
|
292
297
|
refetch={refetch}
|
|
293
298
|
/>
|
|
294
299
|
);
|
|
@@ -344,6 +349,17 @@ export function AgentChannelsPanel({
|
|
|
344
349
|
/>
|
|
345
350
|
)}
|
|
346
351
|
|
|
352
|
+
{editingYaml && (
|
|
353
|
+
<EditResourceYamlDialog
|
|
354
|
+
open
|
|
355
|
+
onOpenChange={(open) => {
|
|
356
|
+
if (!open) setEditingYaml(null);
|
|
357
|
+
}}
|
|
358
|
+
resource={editingYaml}
|
|
359
|
+
onApplied={refetch}
|
|
360
|
+
/>
|
|
361
|
+
)}
|
|
362
|
+
|
|
347
363
|
<ConfirmDialog
|
|
348
364
|
state={confirmState}
|
|
349
365
|
onConfirm={handleConfirm}
|
|
@@ -367,6 +383,7 @@ interface ChannelCardProps {
|
|
|
367
383
|
readonly onDeleteClick: () => void;
|
|
368
384
|
readonly onEditCredentials: () => void;
|
|
369
385
|
readonly onViewConversations: () => void;
|
|
386
|
+
readonly onEditYaml: () => void;
|
|
370
387
|
readonly refetch: () => void;
|
|
371
388
|
}
|
|
372
389
|
|
|
@@ -379,6 +396,7 @@ function ChannelCard({
|
|
|
379
396
|
onDeleteClick,
|
|
380
397
|
onEditCredentials,
|
|
381
398
|
onViewConversations,
|
|
399
|
+
onEditYaml,
|
|
382
400
|
refetch,
|
|
383
401
|
}: ChannelCardProps) {
|
|
384
402
|
const meta = channel.metadata;
|
|
@@ -503,6 +521,14 @@ function ChannelCard({
|
|
|
503
521
|
Tool credentials
|
|
504
522
|
</ActionMenu.Item>
|
|
505
523
|
)}
|
|
524
|
+
{canEdit && (
|
|
525
|
+
<ActionMenu.Item
|
|
526
|
+
icon={<FileCode2 />}
|
|
527
|
+
onSelect={onEditYaml}
|
|
528
|
+
>
|
|
529
|
+
Edit YAML
|
|
530
|
+
</ActionMenu.Item>
|
|
531
|
+
)}
|
|
506
532
|
{canDelete && (
|
|
507
533
|
<ActionMenu.Item
|
|
508
534
|
icon={<Trash2 />}
|
|
@@ -470,7 +470,7 @@ export interface SessionComposerProps {
|
|
|
470
470
|
*
|
|
471
471
|
* @example
|
|
472
472
|
* ```tsx
|
|
473
|
-
* const yaml =
|
|
473
|
+
* const yaml = serializeManifest(agent);
|
|
474
474
|
* const file = new File([yaml], "my-agent.yaml", { type: "text/yaml" });
|
|
475
475
|
*
|
|
476
476
|
* <SessionComposer
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { useState } from "react";
|
|
4
|
+
import { create } from "@bufbuild/protobuf";
|
|
5
|
+
import { cn } from "@stigmer/theme";
|
|
6
|
+
import { getUserMessage } from "@stigmer/sdk";
|
|
7
|
+
import {
|
|
8
|
+
CursorAccountSchema,
|
|
9
|
+
type CursorAccount,
|
|
10
|
+
} from "@stigmer/protos/ai/stigmer/platform/cursoraccount/v1/cursor_account_pb";
|
|
11
|
+
import { Button } from "../button/index.js";
|
|
12
|
+
import { Field, INPUT_CLASSES } from "../internal/form-primitives.js";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* The redaction marker the server uses for stored secrets. Sending it
|
|
16
|
+
* back on update means "keep the stored admin key".
|
|
17
|
+
*/
|
|
18
|
+
const REDACTED = "***REDACTED***";
|
|
19
|
+
|
|
20
|
+
/** Props for {@link CursorAccountEditor}. */
|
|
21
|
+
export interface CursorAccountEditorProps {
|
|
22
|
+
/** The account to edit, or `null` to create a new one. */
|
|
23
|
+
readonly initial: CursorAccount | null;
|
|
24
|
+
/** `true` while the save is in flight. */
|
|
25
|
+
readonly isSubmitting: boolean;
|
|
26
|
+
/** Error from the last failed save, or `null`. */
|
|
27
|
+
readonly submitError: Error | null;
|
|
28
|
+
/** Called with the assembled account on submit. */
|
|
29
|
+
readonly onSubmit: (account: CursorAccount) => void;
|
|
30
|
+
/** Called when the operator cancels. */
|
|
31
|
+
readonly onCancel: () => void;
|
|
32
|
+
/** Additional CSS class names. */
|
|
33
|
+
readonly className?: string;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Create/edit form for one Cursor account: identity, team Admin API key,
|
|
38
|
+
* enablement, and dedicated-org assignments. The account's class is
|
|
39
|
+
* derived (DD-008): listed org ids make it DEDICATED to them, an empty
|
|
40
|
+
* list makes it a shared-pool account — there is no flag to manage.
|
|
41
|
+
*
|
|
42
|
+
* Admin-key semantics mirror the server contract: on edit the field
|
|
43
|
+
* shows the redaction marker and submitting it unchanged keeps the
|
|
44
|
+
* stored key; typing anything else rotates it (validated live against
|
|
45
|
+
* Cursor before persisting). Member keys are NOT edited here — they have
|
|
46
|
+
* their own panel with per-key add/remove/enable.
|
|
47
|
+
*
|
|
48
|
+
* The optional team invite link (Cursor dashboard → Invite Members →
|
|
49
|
+
* Copy Invite Link) round-trips readable — no marker — and powers the
|
|
50
|
+
* coverage table's "Copy invite" action for off-team key owners.
|
|
51
|
+
*/
|
|
52
|
+
export function CursorAccountEditor({
|
|
53
|
+
initial,
|
|
54
|
+
isSubmitting,
|
|
55
|
+
submitError,
|
|
56
|
+
onSubmit,
|
|
57
|
+
onCancel,
|
|
58
|
+
className,
|
|
59
|
+
}: CursorAccountEditorProps) {
|
|
60
|
+
const isCreate = initial === null;
|
|
61
|
+
const [displayName, setDisplayName] = useState(initial?.displayName ?? "");
|
|
62
|
+
const [adminApiKey, setAdminApiKey] = useState(isCreate ? "" : REDACTED);
|
|
63
|
+
const [enabled, setEnabled] = useState(initial?.enabled ?? true);
|
|
64
|
+
// UI state is the positive ("on-demand enabled", Cursor's own wording and
|
|
65
|
+
// team default); the proto field is the negative so absence means
|
|
66
|
+
// "assume Cursor's default" on documents that predate the field.
|
|
67
|
+
const [onDemandEnabled, setOnDemandEnabled] = useState(
|
|
68
|
+
!(initial?.onDemandUsageDisabled ?? false),
|
|
69
|
+
);
|
|
70
|
+
const [orgIdsText, setOrgIdsText] = useState(
|
|
71
|
+
(initial?.orgIds ?? []).join("\n"),
|
|
72
|
+
);
|
|
73
|
+
// Unlike the admin key, the invite link round-trips readable (the
|
|
74
|
+
// server decrypts it on read — operators must be able to copy it), so
|
|
75
|
+
// there is no redaction-marker dance: edit the value directly.
|
|
76
|
+
const [teamInviteLink, setTeamInviteLink] = useState(
|
|
77
|
+
initial?.teamInviteLink ?? "",
|
|
78
|
+
);
|
|
79
|
+
|
|
80
|
+
const canSubmit =
|
|
81
|
+
displayName.trim() !== "" && adminApiKey.trim() !== "" && !isSubmitting;
|
|
82
|
+
|
|
83
|
+
const handleSubmit = (e: React.FormEvent) => {
|
|
84
|
+
e.preventDefault();
|
|
85
|
+
if (!canSubmit) return;
|
|
86
|
+
onSubmit(
|
|
87
|
+
create(CursorAccountSchema, {
|
|
88
|
+
accountId: initial?.accountId ?? "",
|
|
89
|
+
displayName: displayName.trim(),
|
|
90
|
+
adminApiKey: adminApiKey.trim(),
|
|
91
|
+
enabled,
|
|
92
|
+
// is_platform_default is deprecated (DD-008): the shared pool is
|
|
93
|
+
// derived from empty org_ids, so current clients never write it.
|
|
94
|
+
onDemandUsageDisabled: !onDemandEnabled,
|
|
95
|
+
teamInviteLink: teamInviteLink.trim(),
|
|
96
|
+
orgIds: orgIdsText
|
|
97
|
+
.split(/[\s,]+/)
|
|
98
|
+
.map((s) => s.trim())
|
|
99
|
+
.filter((s) => s !== ""),
|
|
100
|
+
}),
|
|
101
|
+
);
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
return (
|
|
105
|
+
<form className={cn("max-w-xl space-y-3", className)} onSubmit={handleSubmit}>
|
|
106
|
+
<h3 className="text-sm font-semibold text-foreground">
|
|
107
|
+
{isCreate ? "Add Cursor account" : `Edit ${initial.displayName}`}
|
|
108
|
+
</h3>
|
|
109
|
+
|
|
110
|
+
<Field label="Display name" required>
|
|
111
|
+
<input
|
|
112
|
+
className={INPUT_CLASSES}
|
|
113
|
+
value={displayName}
|
|
114
|
+
onChange={(e) => setDisplayName(e.target.value)}
|
|
115
|
+
placeholder="e.g. scenar.ai team"
|
|
116
|
+
disabled={isSubmitting}
|
|
117
|
+
/>
|
|
118
|
+
</Field>
|
|
119
|
+
|
|
120
|
+
<Field label="Team Admin API key" required>
|
|
121
|
+
<input
|
|
122
|
+
className={INPUT_CLASSES}
|
|
123
|
+
type="password"
|
|
124
|
+
value={adminApiKey}
|
|
125
|
+
onChange={(e) => setAdminApiKey(e.target.value)}
|
|
126
|
+
placeholder="key from Cursor dashboard → API → Team tab"
|
|
127
|
+
disabled={isSubmitting}
|
|
128
|
+
autoComplete="off"
|
|
129
|
+
/>
|
|
130
|
+
</Field>
|
|
131
|
+
{!isCreate && (
|
|
132
|
+
<p className="text-[11px] text-muted-foreground">
|
|
133
|
+
Leave the masked value untouched to keep the stored key; typing a
|
|
134
|
+
new key rotates it (validated against Cursor before saving).
|
|
135
|
+
</p>
|
|
136
|
+
)}
|
|
137
|
+
|
|
138
|
+
<Field label="Team invite link">
|
|
139
|
+
<input
|
|
140
|
+
className={INPUT_CLASSES}
|
|
141
|
+
type="url"
|
|
142
|
+
value={teamInviteLink}
|
|
143
|
+
onChange={(e) => setTeamInviteLink(e.target.value)}
|
|
144
|
+
placeholder="https://… (Cursor dashboard → Invite Members → Copy Invite Link)"
|
|
145
|
+
disabled={isSubmitting}
|
|
146
|
+
autoComplete="off"
|
|
147
|
+
spellCheck={false}
|
|
148
|
+
/>
|
|
149
|
+
</Field>
|
|
150
|
+
<p className="text-[11px] text-muted-foreground">
|
|
151
|
+
Optional. Powers one-click "Copy invite" on coverage rows
|
|
152
|
+
whose key owner is not on the team. The link is long-lived and
|
|
153
|
+
joinable by anyone holding it (each join consumes a paid seat) —
|
|
154
|
+
share it deliberately, and revoke or rotate it from the Cursor
|
|
155
|
+
dashboard. Leave empty to clear.
|
|
156
|
+
</p>
|
|
157
|
+
|
|
158
|
+
<Field label="Dedicated organization ids">
|
|
159
|
+
<textarea
|
|
160
|
+
className={cn(INPUT_CLASSES, "min-h-16 font-mono")}
|
|
161
|
+
value={orgIdsText}
|
|
162
|
+
onChange={(e) => setOrgIdsText(e.target.value)}
|
|
163
|
+
placeholder={"one org id per line\n(leave empty for a shared-pool account)"}
|
|
164
|
+
disabled={isSubmitting}
|
|
165
|
+
/>
|
|
166
|
+
</Field>
|
|
167
|
+
<p className="text-[11px] text-muted-foreground">
|
|
168
|
+
Listing org ids DEDICATES this account to them: their sessions use
|
|
169
|
+
only this account's keys and fail with a clear message when it
|
|
170
|
+
runs dry. Leaving this empty makes the account part of the shared
|
|
171
|
+
pool that serves every other org — pool sessions may move between
|
|
172
|
+
pool accounts when one is depleted. Each org may appear in at most
|
|
173
|
+
one account.
|
|
174
|
+
</p>
|
|
175
|
+
|
|
176
|
+
<div className="space-y-2">
|
|
177
|
+
<div>
|
|
178
|
+
<label className="flex items-center gap-1.5 text-xs text-foreground">
|
|
179
|
+
<input
|
|
180
|
+
type="checkbox"
|
|
181
|
+
checked={enabled}
|
|
182
|
+
onChange={(e) => setEnabled(e.target.checked)}
|
|
183
|
+
disabled={isSubmitting}
|
|
184
|
+
/>
|
|
185
|
+
Enabled for key selection
|
|
186
|
+
</label>
|
|
187
|
+
<p className="mt-0.5 pl-[1.375rem] text-[11px] text-muted-foreground">
|
|
188
|
+
Leave checked for accounts that should serve traffic. Unchecking
|
|
189
|
+
drains the account: new sessions stop routing here immediately,
|
|
190
|
+
but sessions already pinned to one of its keys keep working.
|
|
191
|
+
</p>
|
|
192
|
+
</div>
|
|
193
|
+
<div>
|
|
194
|
+
<label className="flex items-center gap-1.5 text-xs text-foreground">
|
|
195
|
+
<input
|
|
196
|
+
type="checkbox"
|
|
197
|
+
checked={onDemandEnabled}
|
|
198
|
+
onChange={(e) => setOnDemandEnabled(e.target.checked)}
|
|
199
|
+
disabled={isSubmitting}
|
|
200
|
+
/>
|
|
201
|
+
On-demand usage enabled (as configured in the Cursor dashboard)
|
|
202
|
+
</label>
|
|
203
|
+
<p className="mt-0.5 pl-[1.375rem] text-[11px] text-muted-foreground">
|
|
204
|
+
Declared here because Cursor's Admin API cannot report the
|
|
205
|
+
team's on-demand setting. Uncheck only when the dashboard has
|
|
206
|
+
on-demand usage OFF: new sessions then avoid member keys whose
|
|
207
|
+
included third-party (API) pool is nearly spent, since such keys
|
|
208
|
+
can no longer serve third-party models at all.
|
|
209
|
+
</p>
|
|
210
|
+
</div>
|
|
211
|
+
</div>
|
|
212
|
+
|
|
213
|
+
{submitError && (
|
|
214
|
+
<p className="text-destructive text-xs" role="alert">
|
|
215
|
+
{getUserMessage(submitError)}
|
|
216
|
+
</p>
|
|
217
|
+
)}
|
|
218
|
+
|
|
219
|
+
<div className="flex gap-2">
|
|
220
|
+
<Button type="submit" size="sm" disabled={!canSubmit}>
|
|
221
|
+
{isSubmitting ? "Saving…" : isCreate ? "Create account" : "Save changes"}
|
|
222
|
+
</Button>
|
|
223
|
+
<Button type="button" size="sm" variant="outline" onClick={onCancel} disabled={isSubmitting}>
|
|
224
|
+
Cancel
|
|
225
|
+
</Button>
|
|
226
|
+
</div>
|
|
227
|
+
</form>
|
|
228
|
+
);
|
|
229
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { cn } from "@stigmer/theme";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* The access-denied state for the Cursor-accounts operator surface.
|
|
7
|
+
* Server-side authorization (`can_manage_cursor_accounts` on
|
|
8
|
+
* `platform:stigmer`) is the real gate — this is the honest, designed
|
|
9
|
+
* face of that denial for anyone who navigates to the operator route
|
|
10
|
+
* without the permission, instead of a raw RPC error string.
|
|
11
|
+
*/
|
|
12
|
+
export function CursorAccountsAccessNotice({
|
|
13
|
+
className,
|
|
14
|
+
}: {
|
|
15
|
+
readonly className?: string;
|
|
16
|
+
}) {
|
|
17
|
+
return (
|
|
18
|
+
<div
|
|
19
|
+
className={cn(
|
|
20
|
+
"rounded-lg border border-border bg-card px-4 py-6 text-center",
|
|
21
|
+
className,
|
|
22
|
+
)}
|
|
23
|
+
role="status"
|
|
24
|
+
>
|
|
25
|
+
<p className="text-xs font-semibold text-foreground">
|
|
26
|
+
Platform operator access required
|
|
27
|
+
</p>
|
|
28
|
+
<p className="mx-auto mt-1 max-w-md text-xs text-muted-foreground">
|
|
29
|
+
Cursor account management is a Stigmer-internal surface holding
|
|
30
|
+
provider credentials and team spend. It needs the platform operator
|
|
31
|
+
role — organization roles do not grant it. If you believe you should
|
|
32
|
+
have access, contact a platform operator.
|
|
33
|
+
</p>
|
|
34
|
+
</div>
|
|
35
|
+
);
|
|
36
|
+
}
|