@stigmer/react 3.2.2 → 3.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/agent/AgentDetailView.d.ts.map +1 -1
- package/agent/AgentDetailView.js +6 -3
- package/agent/AgentDetailView.js.map +1 -1
- package/agent/steps/ReviewStep.d.ts.map +1 -1
- package/agent/steps/ReviewStep.js +2 -3
- package/agent/steps/ReviewStep.js.map +1 -1
- package/billing/BaselineEditor.d.ts +9 -0
- package/billing/BaselineEditor.d.ts.map +1 -0
- package/billing/BaselineEditor.js +253 -0
- package/billing/BaselineEditor.js.map +1 -0
- package/billing/ModelCatalogPanel.d.ts +28 -0
- package/billing/ModelCatalogPanel.d.ts.map +1 -0
- package/billing/ModelCatalogPanel.js +102 -0
- package/billing/ModelCatalogPanel.js.map +1 -0
- package/billing/ModelGovernanceDetail.d.ts +8 -0
- package/billing/ModelGovernanceDetail.d.ts.map +1 -0
- package/billing/ModelGovernanceDetail.js +64 -0
- package/billing/ModelGovernanceDetail.js.map +1 -0
- package/billing/OperatorAccessNotice.d.ts +12 -0
- package/billing/OperatorAccessNotice.d.ts.map +1 -0
- package/billing/OperatorAccessNotice.js +15 -0
- package/billing/OperatorAccessNotice.js.map +1 -0
- package/billing/PricingGovernanceConsole.d.ts +57 -0
- package/billing/PricingGovernanceConsole.d.ts.map +1 -0
- package/billing/PricingGovernanceConsole.js +164 -0
- package/billing/PricingGovernanceConsole.js.map +1 -0
- package/billing/PricingGovernancePanel.d.ts +26 -0
- package/billing/PricingGovernancePanel.d.ts.map +1 -0
- package/billing/PricingGovernancePanel.js +64 -0
- package/billing/PricingGovernancePanel.js.map +1 -0
- package/billing/RetireConfirm.d.ts +9 -0
- package/billing/RetireConfirm.d.ts.map +1 -0
- package/billing/RetireConfirm.js +19 -0
- package/billing/RetireConfirm.js.map +1 -0
- package/billing/form-primitives.d.ts +18 -0
- package/billing/form-primitives.d.ts.map +1 -0
- package/billing/form-primitives.js +19 -0
- package/billing/form-primitives.js.map +1 -0
- package/billing/governance-primitives.d.ts +33 -0
- package/billing/governance-primitives.d.ts.map +1 -0
- package/billing/governance-primitives.js +43 -0
- package/billing/governance-primitives.js.map +1 -0
- package/billing/index.d.ts +18 -0
- package/billing/index.d.ts.map +1 -1
- package/billing/index.js +9 -0
- package/billing/index.js.map +1 -1
- package/billing/pricing-format.d.ts +12 -0
- package/billing/pricing-format.d.ts.map +1 -0
- package/billing/pricing-format.js +50 -0
- package/billing/pricing-format.js.map +1 -0
- package/billing/useDecidePricingOverride.d.ts +46 -0
- package/billing/useDecidePricingOverride.d.ts.map +1 -0
- package/billing/useDecidePricingOverride.js +44 -0
- package/billing/useDecidePricingOverride.js.map +1 -0
- package/billing/useModelGovernanceView.d.ts +103 -0
- package/billing/useModelGovernanceView.d.ts.map +1 -0
- package/billing/useModelGovernanceView.js +144 -0
- package/billing/useModelGovernanceView.js.map +1 -0
- package/billing/useModelPricingBaselines.d.ts +40 -0
- package/billing/useModelPricingBaselines.d.ts.map +1 -0
- package/billing/useModelPricingBaselines.js +32 -0
- package/billing/useModelPricingBaselines.js.map +1 -0
- package/billing/usePricingGovernance.d.ts +39 -0
- package/billing/usePricingGovernance.d.ts.map +1 -0
- package/billing/usePricingGovernance.js +31 -0
- package/billing/usePricingGovernance.js.map +1 -0
- package/billing/useRetireModelPricingBaseline.d.ts +31 -0
- package/billing/useRetireModelPricingBaseline.d.ts.map +1 -0
- package/billing/useRetireModelPricingBaseline.js +36 -0
- package/billing/useRetireModelPricingBaseline.js.map +1 -0
- package/billing/useUpsertModelPricingBaseline.d.ts +38 -0
- package/billing/useUpsertModelPricingBaseline.d.ts.map +1 -0
- package/billing/useUpsertModelPricingBaseline.js +37 -0
- package/billing/useUpsertModelPricingBaseline.js.map +1 -0
- package/channel/AgentChannelsPanel.d.ts.map +1 -1
- package/channel/AgentChannelsPanel.js +11 -5
- package/channel/AgentChannelsPanel.js.map +1 -1
- package/composer/SessionComposer.d.ts +1 -1
- package/cursor-accounts/CursorAccountEditor.d.ts +28 -0
- package/cursor-accounts/CursorAccountEditor.d.ts.map +1 -0
- package/cursor-accounts/CursorAccountEditor.js +51 -0
- package/cursor-accounts/CursorAccountEditor.js.map +1 -0
- package/cursor-accounts/CursorAccountsAccessNotice.d.ts +11 -0
- package/cursor-accounts/CursorAccountsAccessNotice.d.ts.map +1 -0
- package/cursor-accounts/CursorAccountsAccessNotice.js +14 -0
- package/cursor-accounts/CursorAccountsAccessNotice.js.map +1 -0
- package/cursor-accounts/CursorAccountsConsole.d.ts +28 -0
- package/cursor-accounts/CursorAccountsConsole.d.ts.map +1 -0
- package/cursor-accounts/CursorAccountsConsole.js +275 -0
- package/cursor-accounts/CursorAccountsConsole.js.map +1 -0
- package/cursor-accounts/cursor-account-format.d.ts +10 -0
- package/cursor-accounts/cursor-account-format.d.ts.map +1 -0
- package/cursor-accounts/cursor-account-format.js +26 -0
- package/cursor-accounts/cursor-account-format.js.map +1 -0
- package/cursor-accounts/index.d.ts +18 -0
- package/cursor-accounts/index.d.ts.map +1 -0
- package/cursor-accounts/index.js +13 -0
- package/cursor-accounts/index.js.map +1 -0
- package/cursor-accounts/useCursorAccountView.d.ts +30 -0
- package/cursor-accounts/useCursorAccountView.d.ts.map +1 -0
- package/cursor-accounts/useCursorAccountView.js +25 -0
- package/cursor-accounts/useCursorAccountView.js.map +1 -0
- package/cursor-accounts/useCursorAccounts.d.ts +33 -0
- package/cursor-accounts/useCursorAccounts.d.ts.map +1 -0
- package/cursor-accounts/useCursorAccounts.js +25 -0
- package/cursor-accounts/useCursorAccounts.js.map +1 -0
- package/cursor-accounts/useCursorMemberKeyActions.d.ts +49 -0
- package/cursor-accounts/useCursorMemberKeyActions.d.ts.map +1 -0
- package/cursor-accounts/useCursorMemberKeyActions.js +38 -0
- package/cursor-accounts/useCursorMemberKeyActions.js.map +1 -0
- package/cursor-accounts/useDeleteCursorAccount.d.ts +30 -0
- package/cursor-accounts/useDeleteCursorAccount.d.ts.map +1 -0
- package/cursor-accounts/useDeleteCursorAccount.js +32 -0
- package/cursor-accounts/useDeleteCursorAccount.js.map +1 -0
- package/cursor-accounts/useSyncCursorAccount.d.ts +23 -0
- package/cursor-accounts/useSyncCursorAccount.d.ts.map +1 -0
- package/cursor-accounts/useSyncCursorAccount.js +31 -0
- package/cursor-accounts/useSyncCursorAccount.js.map +1 -0
- package/cursor-accounts/useUpsertCursorAccount.d.ts +26 -0
- package/cursor-accounts/useUpsertCursorAccount.d.ts.map +1 -0
- package/cursor-accounts/useUpsertCursorAccount.js +34 -0
- package/cursor-accounts/useUpsertCursorAccount.js.map +1 -0
- package/datastore/CollectionRecordsBrowser.d.ts +34 -0
- package/datastore/CollectionRecordsBrowser.d.ts.map +1 -0
- package/datastore/CollectionRecordsBrowser.js +209 -0
- package/datastore/CollectionRecordsBrowser.js.map +1 -0
- package/datastore/CollectionSchemaView.d.ts +29 -0
- package/datastore/CollectionSchemaView.d.ts.map +1 -0
- package/datastore/CollectionSchemaView.js +93 -0
- package/datastore/CollectionSchemaView.js.map +1 -0
- package/datastore/DatastoreDetailView.d.ts +44 -0
- package/datastore/DatastoreDetailView.d.ts.map +1 -0
- package/datastore/DatastoreDetailView.js +76 -0
- package/datastore/DatastoreDetailView.js.map +1 -0
- package/datastore/DatastoreSyncReport.d.ts +19 -0
- package/datastore/DatastoreSyncReport.d.ts.map +1 -0
- package/datastore/DatastoreSyncReport.js +45 -0
- package/datastore/DatastoreSyncReport.js.map +1 -0
- package/datastore/DeleteDatastoreDialog.d.ts +35 -0
- package/datastore/DeleteDatastoreDialog.d.ts.map +1 -0
- package/datastore/DeleteDatastoreDialog.js +90 -0
- package/datastore/DeleteDatastoreDialog.js.map +1 -0
- package/datastore/FieldValueControl.d.ts +55 -0
- package/datastore/FieldValueControl.d.ts.map +1 -0
- package/datastore/FieldValueControl.js +138 -0
- package/datastore/FieldValueControl.js.map +1 -0
- package/datastore/RecordFilterBuilder.d.ts +30 -0
- package/datastore/RecordFilterBuilder.d.ts.map +1 -0
- package/datastore/RecordFilterBuilder.js +122 -0
- package/datastore/RecordFilterBuilder.js.map +1 -0
- package/datastore/RecordFormPanel.d.ts +45 -0
- package/datastore/RecordFormPanel.d.ts.map +1 -0
- package/datastore/RecordFormPanel.js +215 -0
- package/datastore/RecordFormPanel.js.map +1 -0
- package/datastore/index.d.ts +43 -0
- package/datastore/index.d.ts.map +1 -0
- package/datastore/index.js +22 -0
- package/datastore/index.js.map +1 -0
- package/datastore/recordFilter.d.ts +54 -0
- package/datastore/recordFilter.d.ts.map +1 -0
- package/datastore/recordFilter.js +93 -0
- package/datastore/recordFilter.js.map +1 -0
- package/datastore/recordValues.d.ts +85 -0
- package/datastore/recordValues.d.ts.map +1 -0
- package/datastore/recordValues.js +282 -0
- package/datastore/recordValues.js.map +1 -0
- package/datastore/useDatastore.d.ts +39 -0
- package/datastore/useDatastore.d.ts.map +1 -0
- package/datastore/useDatastore.js +44 -0
- package/datastore/useDatastore.js.map +1 -0
- package/datastore/useDatastoreCount.d.ts +48 -0
- package/datastore/useDatastoreCount.d.ts.map +1 -0
- package/datastore/useDatastoreCount.js +27 -0
- package/datastore/useDatastoreCount.js.map +1 -0
- package/datastore/useDatastoreDescription.d.ts +54 -0
- package/datastore/useDatastoreDescription.d.ts.map +1 -0
- package/datastore/useDatastoreDescription.js +50 -0
- package/datastore/useDatastoreDescription.js.map +1 -0
- package/datastore/useDatastoreList.d.ts +57 -0
- package/datastore/useDatastoreList.d.ts.map +1 -0
- package/datastore/useDatastoreList.js +29 -0
- package/datastore/useDatastoreList.js.map +1 -0
- package/datastore/useDatastoreSearch.d.ts +19 -0
- package/datastore/useDatastoreSearch.d.ts.map +1 -0
- package/datastore/useDatastoreSearch.js +22 -0
- package/datastore/useDatastoreSearch.js.map +1 -0
- package/datastore/useDeleteDatastore.d.ts +53 -0
- package/datastore/useDeleteDatastore.d.ts.map +1 -0
- package/datastore/useDeleteDatastore.js +40 -0
- package/datastore/useDeleteDatastore.js.map +1 -0
- package/datastore/useDeleteRecord.d.ts +34 -0
- package/datastore/useDeleteRecord.d.ts.map +1 -0
- package/datastore/useDeleteRecord.js +43 -0
- package/datastore/useDeleteRecord.js.map +1 -0
- package/datastore/useInsertRecord.d.ts +50 -0
- package/datastore/useInsertRecord.d.ts.map +1 -0
- package/datastore/useInsertRecord.js +55 -0
- package/datastore/useInsertRecord.js.map +1 -0
- package/datastore/useRecordCollection.d.ts +104 -0
- package/datastore/useRecordCollection.d.ts.map +1 -0
- package/datastore/useRecordCollection.js +136 -0
- package/datastore/useRecordCollection.js.map +1 -0
- package/datastore/useRecordList.d.ts +66 -0
- package/datastore/useRecordList.d.ts.map +1 -0
- package/datastore/useRecordList.js +58 -0
- package/datastore/useRecordList.js.map +1 -0
- package/datastore/useUpdateRecord.d.ts +52 -0
- package/datastore/useUpdateRecord.d.ts.map +1 -0
- package/datastore/useUpdateRecord.js +55 -0
- package/datastore/useUpdateRecord.js.map +1 -0
- package/environment/EnvironmentListPanel.d.ts.map +1 -1
- package/environment/EnvironmentListPanel.js +12 -7
- package/environment/EnvironmentListPanel.js.map +1 -1
- package/execution/index.d.ts +1 -2
- package/execution/index.d.ts.map +1 -1
- package/execution/index.js +0 -1
- package/execution/index.js.map +1 -1
- package/execution/useLiveAgentExecution.d.ts +17 -1
- package/execution/useLiveAgentExecution.d.ts.map +1 -1
- package/execution/useLiveAgentExecution.js +19 -4
- package/execution/useLiveAgentExecution.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 +16 -10
- package/index.d.ts.map +1 -1
- package/index.js +16 -5
- package/index.js.map +1 -1
- package/internal/useInViewport.d.ts +24 -0
- package/internal/useInViewport.d.ts.map +1 -0
- package/internal/useInViewport.js +49 -0
- package/internal/useInViewport.js.map +1 -0
- package/library/VisibilitySelector.d.ts +22 -6
- package/library/VisibilitySelector.d.ts.map +1 -1
- package/library/VisibilitySelector.js +12 -4
- package/library/VisibilitySelector.js.map +1 -1
- package/library/index.d.ts +1 -8
- 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/McpServerDetailView.d.ts.map +1 -1
- package/mcp-server/McpServerDetailView.js +4 -3
- package/mcp-server/McpServerDetailView.js.map +1 -1
- package/mcp-server/steps/ReviewStep.d.ts.map +1 -1
- package/mcp-server/steps/ReviewStep.js +2 -3
- package/mcp-server/steps/ReviewStep.js.map +1 -1
- package/package.json +4 -4
- package/resource-creation/templates/workflow-templates.js +4 -4
- package/session/SessionViewer.js +8 -1
- package/session/SessionViewer.js.map +1 -1
- package/session/audience.d.ts +6 -1
- package/session/audience.d.ts.map +1 -1
- package/session/useEditSessionPrep.js +3 -3
- package/session/useEditSessionPrep.js.map +1 -1
- package/settings/index.d.ts +2 -1
- package/settings/index.d.ts.map +1 -1
- package/settings/index.js +2 -1
- package/settings/index.js.map +1 -1
- package/settings/settings-nav.d.ts +22 -0
- package/settings/settings-nav.d.ts.map +1 -1
- package/settings/settings-nav.js +32 -1
- package/settings/settings-nav.js.map +1 -1
- package/settings/useSettingsNavGroups.d.ts +29 -0
- package/settings/useSettingsNavGroups.d.ts.map +1 -0
- package/settings/useSettingsNavGroups.js +61 -0
- package/settings/useSettingsNavGroups.js.map +1 -0
- package/skill/SkillDetailView.d.ts.map +1 -1
- package/skill/SkillDetailView.js +4 -3
- package/skill/SkillDetailView.js.map +1 -1
- package/src/access/__tests__/useManageAccess.test.tsx +104 -0
- package/src/agent/AgentDetailView.tsx +9 -3
- package/src/agent/steps/ReviewStep.tsx +2 -3
- package/src/billing/BaselineEditor.tsx +619 -0
- package/src/billing/ModelCatalogPanel.tsx +283 -0
- package/src/billing/ModelGovernanceDetail.tsx +289 -0
- package/src/billing/OperatorAccessNotice.tsx +32 -0
- package/src/billing/PricingGovernanceConsole.tsx +465 -0
- package/src/billing/PricingGovernancePanel.tsx +166 -0
- package/src/billing/RetireConfirm.tsx +82 -0
- package/src/billing/__tests__/ModelCatalogPanel.test.tsx +253 -0
- package/src/billing/__tests__/PricingGovernanceConsole.test.tsx +410 -0
- package/src/billing/__tests__/useModelGovernanceView.test.tsx +308 -0
- package/src/billing/form-primitives.tsx +68 -0
- package/src/billing/governance-primitives.tsx +133 -0
- package/src/billing/index.ts +37 -0
- package/src/billing/pricing-format.ts +53 -0
- package/src/billing/useDecidePricingOverride.ts +78 -0
- package/src/billing/useModelGovernanceView.ts +290 -0
- package/src/billing/useModelPricingBaselines.ts +69 -0
- package/src/billing/usePricingGovernance.ts +57 -0
- package/src/billing/useRetireModelPricingBaseline.ts +65 -0
- package/src/billing/useUpsertModelPricingBaseline.ts +72 -0
- package/src/channel/AgentChannelsPanel.tsx +27 -1
- package/src/composer/SessionComposer.tsx +1 -1
- package/src/cursor-accounts/CursorAccountEditor.tsx +181 -0
- package/src/cursor-accounts/CursorAccountsAccessNotice.tsx +36 -0
- package/src/cursor-accounts/CursorAccountsConsole.tsx +810 -0
- package/src/cursor-accounts/__tests__/CursorAccountsConsole.test.tsx +384 -0
- package/src/cursor-accounts/cursor-account-format.ts +29 -0
- package/src/cursor-accounts/index.ts +29 -0
- package/src/cursor-accounts/useCursorAccountView.ts +49 -0
- package/src/cursor-accounts/useCursorAccounts.ts +49 -0
- package/src/cursor-accounts/useCursorMemberKeyActions.ts +106 -0
- package/src/cursor-accounts/useDeleteCursorAccount.ts +62 -0
- package/src/cursor-accounts/useSyncCursorAccount.ts +54 -0
- package/src/cursor-accounts/useUpsertCursorAccount.ts +57 -0
- package/src/datastore/CollectionRecordsBrowser.tsx +544 -0
- package/src/datastore/CollectionSchemaView.tsx +247 -0
- package/src/datastore/DatastoreDetailView.tsx +201 -0
- package/src/datastore/DatastoreSyncReport.tsx +105 -0
- package/src/datastore/DeleteDatastoreDialog.tsx +202 -0
- package/src/datastore/FieldValueControl.tsx +289 -0
- package/src/datastore/RecordFilterBuilder.tsx +411 -0
- package/src/datastore/RecordFormPanel.tsx +432 -0
- package/src/datastore/__tests__/CollectionRecordsBrowser.test.tsx +207 -0
- package/src/datastore/__tests__/DeleteDatastoreDialog.test.tsx +133 -0
- package/src/datastore/__tests__/FieldValueControl.test.tsx +160 -0
- package/src/datastore/__tests__/RecordFilterBuilder.test.tsx +141 -0
- package/src/datastore/__tests__/RecordFormPanel.test.tsx +227 -0
- package/src/datastore/__tests__/recordFilter.test.ts +156 -0
- package/src/datastore/__tests__/recordMutations.test.tsx +195 -0
- package/src/datastore/__tests__/recordValues.test.ts +359 -0
- package/src/datastore/__tests__/schemaAndSyncViews.test.tsx +142 -0
- package/src/datastore/__tests__/useDatastoreDescription.test.tsx +143 -0
- package/src/datastore/__tests__/useRecordCollection.test.tsx +250 -0
- package/src/datastore/__tests__/useRecordList.test.tsx +85 -0
- package/src/datastore/index.ts +111 -0
- package/src/datastore/recordFilter.ts +140 -0
- package/src/datastore/recordValues.ts +327 -0
- package/src/datastore/useDatastore.ts +67 -0
- package/src/datastore/useDatastoreCount.ts +67 -0
- package/src/datastore/useDatastoreDescription.ts +90 -0
- package/src/datastore/useDatastoreList.ts +79 -0
- package/src/datastore/useDatastoreSearch.ts +39 -0
- package/src/datastore/useDeleteDatastore.ts +87 -0
- package/src/datastore/useDeleteRecord.ts +77 -0
- package/src/datastore/useInsertRecord.ts +92 -0
- package/src/datastore/useRecordCollection.ts +256 -0
- package/src/datastore/useRecordList.ts +131 -0
- package/src/datastore/useUpdateRecord.ts +95 -0
- package/src/environment/EnvironmentListPanel.tsx +24 -0
- package/src/execution/__tests__/useArtifactInspection.test.tsx +12 -2
- package/src/execution/__tests__/useLiveAgentExecution.test.tsx +125 -0
- package/src/execution/index.ts +4 -7
- package/src/execution/useLiveAgentExecution.ts +41 -3
- 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 +167 -18
- package/src/internal/__tests__/useInViewport.test.tsx +115 -0
- package/src/internal/useInViewport.ts +63 -0
- package/src/library/VisibilitySelector.tsx +50 -9
- package/src/library/__tests__/VisibilitySelector.test.tsx +38 -0
- package/src/library/index.ts +4 -21
- 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/McpServerDetailView.tsx +7 -3
- package/src/mcp-server/steps/ReviewStep.tsx +2 -3
- package/src/resource-creation/templates/workflow-templates.ts +4 -4
- package/src/session/SessionViewer.tsx +7 -1
- package/src/session/__tests__/audienceWiring.test.tsx +31 -1
- package/src/session/audience.ts +6 -1
- package/src/session/useEditSessionPrep.ts +3 -3
- package/src/settings/__tests__/useSettingsNavGroups.test.tsx +138 -0
- package/src/settings/index.ts +5 -1
- package/src/settings/settings-nav.ts +43 -0
- package/src/settings/useSettingsNavGroups.ts +81 -0
- package/src/skill/SkillDetailView.tsx +7 -3
- package/src/workflow/WorkflowAgentCallTranscript.tsx +279 -0
- package/src/workflow/WorkflowDetailView.tsx +7 -3
- package/src/workflow/WorkflowExecutionViewer.tsx +20 -77
- package/src/workflow/WorkflowTaskApprovalSummary.tsx +45 -8
- package/src/workflow/WorkflowYamlEditor.tsx +6 -270
- package/src/workflow/__tests__/WorkflowAgentCallTranscript.liveregion.test.tsx +124 -0
- package/src/workflow/__tests__/{WorkflowAgentExecutionDocument.test.tsx → WorkflowAgentCallTranscript.test.tsx} +146 -121
- package/src/workflow/__tests__/WorkflowExecutionViewer.approvals.test.tsx +81 -220
- package/src/workflow/__tests__/WorkflowExecutionViewer.reconciliation.test.tsx +17 -16
- package/src/workflow/__tests__/WorkflowTaskApprovalSummary.test.tsx +52 -2
- package/src/workflow/__tests__/WorkflowTaskThread.test.tsx +168 -185
- package/src/workflow/__tests__/agent-call-live-experience.test.ts +4 -4
- package/src/workflow/__tests__/task-approval.test.ts +119 -0
- package/src/workflow/__tests__/task-presentation.test.ts +35 -1
- package/src/workflow/__tests__/useWorkflowExecutionPanel.test.ts +0 -57
- package/src/workflow/index.ts +6 -3
- package/src/workflow/task-detail/index.ts +3 -0
- package/src/workflow/task-detail/task-approval.ts +95 -1
- package/src/workflow/thread/WorkflowTaskThread.tsx +96 -252
- package/src/workflow/thread/task-presentation.ts +8 -2
- package/src/workflow/useWorkflowExecutionPanel.ts +0 -47
- package/styles.css +1 -1
- package/workflow/CanvasTransitionEdge.d.ts +1 -1
- package/workflow/WorkflowAgentCallTranscript.d.ts +87 -0
- package/workflow/WorkflowAgentCallTranscript.d.ts.map +1 -0
- package/workflow/WorkflowAgentCallTranscript.js +98 -0
- package/workflow/WorkflowAgentCallTranscript.js.map +1 -0
- package/workflow/WorkflowDetailView.d.ts.map +1 -1
- package/workflow/WorkflowDetailView.js +4 -3
- package/workflow/WorkflowDetailView.js.map +1 -1
- package/workflow/WorkflowExecutionViewer.d.ts.map +1 -1
- package/workflow/WorkflowExecutionViewer.js +23 -52
- package/workflow/WorkflowExecutionViewer.js.map +1 -1
- package/workflow/WorkflowTaskApprovalSummary.d.ts +1 -1
- package/workflow/WorkflowTaskApprovalSummary.d.ts.map +1 -1
- package/workflow/WorkflowTaskApprovalSummary.js +18 -1
- package/workflow/WorkflowTaskApprovalSummary.js.map +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/workflow/index.d.ts +2 -2
- package/workflow/index.d.ts.map +1 -1
- package/workflow/index.js +2 -2
- package/workflow/index.js.map +1 -1
- package/workflow/task-detail/index.d.ts +1 -1
- package/workflow/task-detail/index.d.ts.map +1 -1
- package/workflow/task-detail/index.js +1 -1
- package/workflow/task-detail/index.js.map +1 -1
- package/workflow/task-detail/task-approval.d.ts +44 -1
- package/workflow/task-detail/task-approval.d.ts.map +1 -1
- package/workflow/task-detail/task-approval.js +47 -0
- package/workflow/task-detail/task-approval.js.map +1 -1
- package/workflow/thread/WorkflowTaskThread.d.ts +17 -25
- package/workflow/thread/WorkflowTaskThread.d.ts.map +1 -1
- package/workflow/thread/WorkflowTaskThread.js +60 -105
- package/workflow/thread/WorkflowTaskThread.js.map +1 -1
- package/workflow/thread/task-presentation.d.ts.map +1 -1
- package/workflow/thread/task-presentation.js +7 -2
- package/workflow/thread/task-presentation.js.map +1 -1
- package/workflow/useWorkflowExecutionPanel.d.ts +0 -12
- package/workflow/useWorkflowExecutionPanel.d.ts.map +1 -1
- package/workflow/useWorkflowExecutionPanel.js +0 -12
- package/workflow/useWorkflowExecutionPanel.js.map +1 -1
- package/execution/agent-execution-document.d.ts +0 -31
- package/execution/agent-execution-document.d.ts.map +0 -1
- package/execution/agent-execution-document.js +0 -48
- package/execution/agent-execution-document.js.map +0 -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/execution/__tests__/agent-execution-document.test.ts +0 -45
- package/src/execution/agent-execution-document.ts +0 -54
- 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/src/workflow/WorkflowAgentExecutionDocument.tsx +0 -283
- package/workflow/WorkflowAgentExecutionDocument.d.ts +0 -79
- package/workflow/WorkflowAgentExecutionDocument.d.ts.map +0 -1
- package/workflow/WorkflowAgentExecutionDocument.js +0 -87
- package/workflow/WorkflowAgentExecutionDocument.js.map +0 -1
package/src/session/audience.ts
CHANGED
|
@@ -19,7 +19,12 @@
|
|
|
19
19
|
* behavioral, not just cosmetic — the organisms also skip the
|
|
20
20
|
* org-level reads a guest principal cannot make (default-agent
|
|
21
21
|
* resolution, session→agent derivation, personal environments) and
|
|
22
|
-
* never fall back to the org's default agent.
|
|
22
|
+
* never fall back to the org's default agent. Approval mechanics are
|
|
23
|
+
* also withheld (DD-014): the HITL gate protects the ORG's tools and
|
|
24
|
+
* an anonymous visitor is not its trustee — guest executions run in
|
|
25
|
+
* unattended approval mode server-side (gated tools auto-skip and the
|
|
26
|
+
* agent explains in plain language), so tool-approval vocabulary never
|
|
27
|
+
* reaches a guest.
|
|
23
28
|
* - `"observer"` — a read-only transcript for someone watching a
|
|
24
29
|
* conversation they cannot participate in, e.g. a channel connector
|
|
25
30
|
* or org admin reviewing a Slack/WhatsApp conversation the channel
|
|
@@ -7,7 +7,7 @@ import { useStigmer } from "../hooks.js";
|
|
|
7
7
|
import { useAgent } from "../agent/index.js";
|
|
8
8
|
import { useMcpServer } from "../mcp-server/index.js";
|
|
9
9
|
import { useSkill } from "../skill/index.js";
|
|
10
|
-
import {
|
|
10
|
+
import { serializeManifest } from "@stigmer/sdk";
|
|
11
11
|
import type { DraftResourceType } from "./draft.js";
|
|
12
12
|
|
|
13
13
|
/** Return value of {@link useEditSessionPrep}. */
|
|
@@ -64,7 +64,7 @@ export function useEditSessionPrep(
|
|
|
64
64
|
if (draftType === "agent" && editAgent) {
|
|
65
65
|
built.current = true;
|
|
66
66
|
try {
|
|
67
|
-
const yaml =
|
|
67
|
+
const yaml = serializeManifest(editAgent);
|
|
68
68
|
const slug = editAgent.metadata?.slug ?? "agent";
|
|
69
69
|
setFiles([new File([yaml], `${slug}.yaml`, { type: "text/yaml" })]);
|
|
70
70
|
} catch {
|
|
@@ -75,7 +75,7 @@ export function useEditSessionPrep(
|
|
|
75
75
|
if (draftType === "mcp-server" && editMcpServer) {
|
|
76
76
|
built.current = true;
|
|
77
77
|
try {
|
|
78
|
-
const yaml =
|
|
78
|
+
const yaml = serializeManifest(editMcpServer);
|
|
79
79
|
const slug = editMcpServer.metadata?.slug ?? "mcp-server";
|
|
80
80
|
setFiles([new File([yaml], `${slug}.yaml`, { type: "text/yaml" })]);
|
|
81
81
|
} catch {
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { describe, it, expect, vi, afterEach } from "vitest";
|
|
2
|
+
import { cleanup, fireEvent, render, screen } from "@testing-library/react";
|
|
3
|
+
import { useRef, useState } from "react";
|
|
4
|
+
import { SETTINGS_NAV_GROUPS, PLATFORM_SETTINGS_NAV_GROUP } from "../settings-nav";
|
|
5
|
+
import { useSettingsNavGroups } from "../useSettingsNavGroups";
|
|
6
|
+
|
|
7
|
+
// Drive the nav gate through the permission hook. The fail-closed
|
|
8
|
+
// semantics themselves are covered by useCheckPermission's own suite —
|
|
9
|
+
// here we assert the nav hook's per-item composition of the verdicts.
|
|
10
|
+
// Verdicts are keyed by relation so each platform permission can be
|
|
11
|
+
// granted independently.
|
|
12
|
+
let verdicts: Record<string, boolean> = {};
|
|
13
|
+
let checkedRelations: string[] = [];
|
|
14
|
+
let lastCheckArgs: readonly unknown[] = [];
|
|
15
|
+
|
|
16
|
+
vi.mock("../../iam-policy/useCheckPermission", () => ({
|
|
17
|
+
useCheckPermission: (
|
|
18
|
+
...args: [unknown, string, { fail?: string } | undefined]
|
|
19
|
+
) => {
|
|
20
|
+
lastCheckArgs = args;
|
|
21
|
+
checkedRelations.push(args[1]);
|
|
22
|
+
return { allowed: verdicts[args[1]] === true, isLoading: false, error: null };
|
|
23
|
+
},
|
|
24
|
+
}));
|
|
25
|
+
|
|
26
|
+
afterEach(() => {
|
|
27
|
+
cleanup();
|
|
28
|
+
verdicts = {};
|
|
29
|
+
checkedRelations = [];
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
function GroupsProbe() {
|
|
33
|
+
const groups = useSettingsNavGroups();
|
|
34
|
+
const platform = groups.find((g) => g.label === PLATFORM_SETTINGS_NAV_GROUP.label);
|
|
35
|
+
return (
|
|
36
|
+
<div
|
|
37
|
+
data-testid="groups"
|
|
38
|
+
data-labels={groups.map((g) => g.label).join(",")}
|
|
39
|
+
data-platform-items={platform?.items.map((i) => i.label).join(",") ?? ""}
|
|
40
|
+
/>
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const BASE_LABELS = SETTINGS_NAV_GROUPS.map((g) => g.label).join(",");
|
|
45
|
+
|
|
46
|
+
describe("useSettingsNavGroups", () => {
|
|
47
|
+
it("appends the full Platform group when the operator holds every platform permission", () => {
|
|
48
|
+
verdicts = {
|
|
49
|
+
can_manage_model_pricing: true,
|
|
50
|
+
can_manage_cursor_accounts: true,
|
|
51
|
+
};
|
|
52
|
+
render(<GroupsProbe />);
|
|
53
|
+
|
|
54
|
+
const el = screen.getByTestId("groups");
|
|
55
|
+
expect(el.getAttribute("data-labels")).toBe(
|
|
56
|
+
`${BASE_LABELS},${PLATFORM_SETTINGS_NAV_GROUP.label}`,
|
|
57
|
+
);
|
|
58
|
+
expect(el.getAttribute("data-platform-items")).toBe(
|
|
59
|
+
"Pricing Governance,Cursor Accounts",
|
|
60
|
+
);
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
it("filters per item: pricing-only operator sees only Pricing Governance", () => {
|
|
64
|
+
verdicts = { can_manage_model_pricing: true };
|
|
65
|
+
render(<GroupsProbe />);
|
|
66
|
+
|
|
67
|
+
expect(screen.getByTestId("groups").getAttribute("data-platform-items")).toBe(
|
|
68
|
+
"Pricing Governance",
|
|
69
|
+
);
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it("filters per item: cursor-accounts-only operator sees only Cursor Accounts", () => {
|
|
73
|
+
verdicts = { can_manage_cursor_accounts: true };
|
|
74
|
+
render(<GroupsProbe />);
|
|
75
|
+
|
|
76
|
+
expect(screen.getByTestId("groups").getAttribute("data-platform-items")).toBe(
|
|
77
|
+
"Cursor Accounts",
|
|
78
|
+
);
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
it("returns exactly the base groups when not authorized", () => {
|
|
82
|
+
function IdentityProbe() {
|
|
83
|
+
const groups = useSettingsNavGroups();
|
|
84
|
+
return (
|
|
85
|
+
<div
|
|
86
|
+
data-testid="identity"
|
|
87
|
+
data-is-base={String(groups === SETTINGS_NAV_GROUPS)}
|
|
88
|
+
/>
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
render(<IdentityProbe />);
|
|
92
|
+
|
|
93
|
+
// Not just equivalent — the same array, no needless copy.
|
|
94
|
+
expect(screen.getByTestId("identity").getAttribute("data-is-base")).toBe("true");
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
it("checks every declared platform permission on platform:stigmer, fail-closed", () => {
|
|
98
|
+
render(<GroupsProbe />);
|
|
99
|
+
|
|
100
|
+
// Exhaustiveness guard: every requiredPermission declared on the
|
|
101
|
+
// platform group must have a corresponding hook check — a new
|
|
102
|
+
// platform surface that forgets to add its check fails here.
|
|
103
|
+
const declared = PLATFORM_SETTINGS_NAV_GROUP.items.map(
|
|
104
|
+
(item) => item.requiredPermission,
|
|
105
|
+
);
|
|
106
|
+
for (const permission of declared) {
|
|
107
|
+
expect(permission, "platform items must declare requiredPermission").toBeDefined();
|
|
108
|
+
expect(checkedRelations).toContain(permission);
|
|
109
|
+
}
|
|
110
|
+
expect(lastCheckArgs[0]).toEqual({ kind: "platform", id: "stigmer" });
|
|
111
|
+
expect(lastCheckArgs[2]).toEqual({ fail: "closed" });
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
it("keeps the array reference stable across re-renders", () => {
|
|
115
|
+
verdicts = {
|
|
116
|
+
can_manage_model_pricing: true,
|
|
117
|
+
can_manage_cursor_accounts: true,
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
function StabilityProbe() {
|
|
121
|
+
const groups = useSettingsNavGroups();
|
|
122
|
+
const first = useRef(groups);
|
|
123
|
+
const [, force] = useState(0);
|
|
124
|
+
return (
|
|
125
|
+
<button
|
|
126
|
+
data-testid="stability"
|
|
127
|
+
data-stable={String(first.current === groups)}
|
|
128
|
+
onClick={() => force((n) => n + 1)}
|
|
129
|
+
/>
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
render(<StabilityProbe />);
|
|
134
|
+
const el = screen.getByTestId("stability");
|
|
135
|
+
fireEvent.click(el);
|
|
136
|
+
expect(el.getAttribute("data-stable")).toBe("true");
|
|
137
|
+
});
|
|
138
|
+
});
|
package/src/settings/index.ts
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export {
|
|
2
|
+
SETTINGS_NAV_GROUPS,
|
|
3
|
+
PLATFORM_SETTINGS_NAV_GROUP,
|
|
4
|
+
} from "./settings-nav.js";
|
|
2
5
|
export type { SettingsNavItem, SettingsNavGroup } from "./settings-nav.js";
|
|
6
|
+
export { useSettingsNavGroups } from "./useSettingsNavGroups.js";
|
|
3
7
|
|
|
4
8
|
export { ApiKeysSection } from "./ApiKeysSection.js";
|
|
5
9
|
export { BillingSection } from "./BillingSection.js";
|
|
@@ -8,7 +8,9 @@ import {
|
|
|
8
8
|
KeyRound,
|
|
9
9
|
Link,
|
|
10
10
|
MessageSquare,
|
|
11
|
+
MousePointerClick,
|
|
11
12
|
Plug,
|
|
13
|
+
Scale,
|
|
12
14
|
ShieldCheck,
|
|
13
15
|
Users,
|
|
14
16
|
} from "lucide-react";
|
|
@@ -24,6 +26,14 @@ export interface SettingsNavItem {
|
|
|
24
26
|
/** Optional CSS class name applied to the icon. */
|
|
25
27
|
className?: string;
|
|
26
28
|
}>;
|
|
29
|
+
/**
|
|
30
|
+
* Platform-level permission (on `platform:stigmer`) required for this
|
|
31
|
+
* entry to appear. Only meaningful inside
|
|
32
|
+
* {@link PLATFORM_SETTINGS_NAV_GROUP} — items in the base groups are
|
|
33
|
+
* visible to every signed-in user and leave this unset.
|
|
34
|
+
* {@link useSettingsNavGroups} checks it fail-closed.
|
|
35
|
+
*/
|
|
36
|
+
readonly requiredPermission?: string;
|
|
27
37
|
}
|
|
28
38
|
|
|
29
39
|
/** Grouping model used to render settings navigation sections. */
|
|
@@ -82,3 +92,36 @@ export const SETTINGS_NAV_GROUPS: readonly SettingsNavGroup[] = [
|
|
|
82
92
|
],
|
|
83
93
|
},
|
|
84
94
|
];
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Stigmer-internal platform-operator navigation group.
|
|
98
|
+
*
|
|
99
|
+
* Deliberately NOT part of {@link SETTINGS_NAV_GROUPS}: that constant
|
|
100
|
+
* means "groups every signed-in user sees", and its members must never
|
|
101
|
+
* change based on who is looking. This group is appended for platform
|
|
102
|
+
* operators only — use {@link useSettingsNavGroups} to get the
|
|
103
|
+
* permission-aware list instead of composing the two by hand.
|
|
104
|
+
*
|
|
105
|
+
* Every item here declares its `requiredPermission`; the hook filters
|
|
106
|
+
* per item (fail-closed), so an operator holding one platform permission
|
|
107
|
+
* but not another sees exactly their slice of this group.
|
|
108
|
+
*/
|
|
109
|
+
export const PLATFORM_SETTINGS_NAV_GROUP: SettingsNavGroup = {
|
|
110
|
+
label: "Platform",
|
|
111
|
+
description:
|
|
112
|
+
"Stigmer-internal operations. Visible to platform operators only.",
|
|
113
|
+
items: [
|
|
114
|
+
{
|
|
115
|
+
href: "/settings/pricing-governance",
|
|
116
|
+
label: "Pricing Governance",
|
|
117
|
+
icon: Scale,
|
|
118
|
+
requiredPermission: "can_manage_model_pricing",
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
href: "/settings/cursor-accounts",
|
|
122
|
+
label: "Cursor Accounts",
|
|
123
|
+
icon: MousePointerClick,
|
|
124
|
+
requiredPermission: "can_manage_cursor_accounts",
|
|
125
|
+
},
|
|
126
|
+
],
|
|
127
|
+
};
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { useMemo } from "react";
|
|
4
|
+
import { useCheckPermission } from "../iam-policy/useCheckPermission.js";
|
|
5
|
+
import {
|
|
6
|
+
PLATFORM_SETTINGS_NAV_GROUP,
|
|
7
|
+
SETTINGS_NAV_GROUPS,
|
|
8
|
+
type SettingsNavGroup,
|
|
9
|
+
} from "./settings-nav.js";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* The `platform` singleton — platform-level permissions are always
|
|
13
|
+
* checked against this one resource (mirrors the server-side
|
|
14
|
+
* `resource_id = "stigmer"` RPC config).
|
|
15
|
+
*/
|
|
16
|
+
const PLATFORM_RESOURCE = { kind: "platform", id: "stigmer" } as const;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Permission-aware settings navigation: {@link SETTINGS_NAV_GROUPS}
|
|
20
|
+
* for everyone, plus the {@link PLATFORM_SETTINGS_NAV_GROUP} items the
|
|
21
|
+
* caller's platform permissions unlock (per-item `requiredPermission`,
|
|
22
|
+
* checked against `platform:stigmer`). The group appears when at least
|
|
23
|
+
* one of its items is visible.
|
|
24
|
+
*
|
|
25
|
+
* The checks run fail-closed — the opposite of the `useCheckPermission`
|
|
26
|
+
* default — because navigation is *discoverability*, not *capability*:
|
|
27
|
+
* an action gate can safely fail open (the server re-checks every
|
|
28
|
+
* request), but an operator-only nav entry must not appear while the
|
|
29
|
+
* check is loading, when it errors, or on deployments where the IAM
|
|
30
|
+
* service (and the surface it points to) does not exist.
|
|
31
|
+
*
|
|
32
|
+
* Implementation note: hooks must be called unconditionally, so each
|
|
33
|
+
* distinct platform permission gets its own static check below. When a
|
|
34
|
+
* new platform surface adds a new permission, add its check to
|
|
35
|
+
* PLATFORM_PERMISSION_CHECKS' shape here — the exhaustiveness guard in
|
|
36
|
+
* the tests catches a forgotten one.
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```tsx
|
|
40
|
+
* const groups = useSettingsNavGroups();
|
|
41
|
+
* return groups.map((group) => <NavGroup key={group.label} group={group} />);
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
export function useSettingsNavGroups(): readonly SettingsNavGroup[] {
|
|
45
|
+
const pricing = useCheckPermission(
|
|
46
|
+
PLATFORM_RESOURCE,
|
|
47
|
+
"can_manage_model_pricing",
|
|
48
|
+
{ fail: "closed" },
|
|
49
|
+
);
|
|
50
|
+
const cursorAccounts = useCheckPermission(
|
|
51
|
+
PLATFORM_RESOURCE,
|
|
52
|
+
"can_manage_cursor_accounts",
|
|
53
|
+
{ fail: "closed" },
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
const pricingAllowed = pricing.allowed;
|
|
57
|
+
const cursorAccountsAllowed = cursorAccounts.allowed;
|
|
58
|
+
|
|
59
|
+
return useMemo(() => {
|
|
60
|
+
const verdicts: Record<string, boolean> = {
|
|
61
|
+
can_manage_model_pricing: pricingAllowed,
|
|
62
|
+
can_manage_cursor_accounts: cursorAccountsAllowed,
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
const visibleItems = PLATFORM_SETTINGS_NAV_GROUP.items.filter(
|
|
66
|
+
// Fail closed on both axes: an item with no declared permission or
|
|
67
|
+
// with a permission this hook does not check yet stays hidden.
|
|
68
|
+
(item) =>
|
|
69
|
+
item.requiredPermission !== undefined &&
|
|
70
|
+
verdicts[item.requiredPermission] === true,
|
|
71
|
+
);
|
|
72
|
+
|
|
73
|
+
if (visibleItems.length === 0) {
|
|
74
|
+
return SETTINGS_NAV_GROUPS;
|
|
75
|
+
}
|
|
76
|
+
return [
|
|
77
|
+
...SETTINGS_NAV_GROUPS,
|
|
78
|
+
{ ...PLATFORM_SETTINGS_NAV_GROUP, items: visibleItems },
|
|
79
|
+
];
|
|
80
|
+
}, [pricingAllowed, cursorAccountsAllowed]);
|
|
81
|
+
}
|
|
@@ -254,10 +254,14 @@ export function SkillDetailView({
|
|
|
254
254
|
statusLabel: status ? skillStateLabel(status.state) : undefined,
|
|
255
255
|
};
|
|
256
256
|
|
|
257
|
-
// Inline visibility is
|
|
258
|
-
//
|
|
257
|
+
// Inline visibility is at-a-glance AND a shortcut into the Manage access
|
|
258
|
+
// dialog — the single writer for both access axes. The chip is navigation
|
|
259
|
+
// only; it stays a static badge for users who cannot view access.
|
|
259
260
|
const visibilityControl = meta ? (
|
|
260
|
-
<VisibilityBadge
|
|
261
|
+
<VisibilityBadge
|
|
262
|
+
visibility={meta.visibility}
|
|
263
|
+
onClick={access.action ? access.open : undefined}
|
|
264
|
+
/>
|
|
261
265
|
) : undefined;
|
|
262
266
|
|
|
263
267
|
const mergedActions = access.action
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// The inline child-transcript body of an AGENT_CALL task card (T07): the
|
|
4
|
+
// card IS the session experience — live while running, full history when
|
|
5
|
+
// settled — replacing the S4 "Open transcript" document tab.
|
|
6
|
+
|
|
7
|
+
import { memo, useCallback, useMemo } from "react";
|
|
8
|
+
import type { AgentExecution } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
|
|
9
|
+
import {
|
|
10
|
+
FileChangeSetStatus,
|
|
11
|
+
type FileDecisionAction,
|
|
12
|
+
} from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
13
|
+
import type { FileChangeSet } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/filereview_pb";
|
|
14
|
+
import { displayFileChangeSets } from "@stigmer/sdk";
|
|
15
|
+
import { cn } from "@stigmer/theme";
|
|
16
|
+
import { useLiveAgentExecution } from "../execution/useLiveAgentExecution.js";
|
|
17
|
+
import { MessageThread } from "../execution/MessageThread.js";
|
|
18
|
+
import { ThreadSkeleton } from "../execution/ThreadSkeleton.js";
|
|
19
|
+
import { FileReviewDock } from "../execution/FileReviewDock.js";
|
|
20
|
+
import type { FileDecisionOptions } from "../execution/useFileReview.js";
|
|
21
|
+
import { isTerminalPhase } from "../execution/execution-phases.js";
|
|
22
|
+
import { useInViewport } from "../internal/useInViewport.js";
|
|
23
|
+
import type { UseWorkflowExecutionActionsReturn } from "./useWorkflowExecutionActions.js";
|
|
24
|
+
|
|
25
|
+
/** Stable empty list so the thread's memoized rows keep identity (DD-010). */
|
|
26
|
+
const EMPTY_EXECUTIONS: readonly AgentExecution[] = [];
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* The HITL wiring for an inline child transcript: the slice of
|
|
30
|
+
* {@link UseWorkflowExecutionActionsReturn} needed to submit child-gate
|
|
31
|
+
* decisions at the WORKFLOW level.
|
|
32
|
+
*
|
|
33
|
+
* A `Pick` (not a new shape) so the bundle can never drift from the actions
|
|
34
|
+
* hook — the viewer builds it from its single `useWorkflowExecutionActions`
|
|
35
|
+
* instance, so a gate's in-flight spinner or failure is identical wherever
|
|
36
|
+
* that gate is shown.
|
|
37
|
+
*/
|
|
38
|
+
export type WorkflowAgentExecutionHitl = Pick<
|
|
39
|
+
UseWorkflowExecutionActionsReturn,
|
|
40
|
+
| "submitApproval"
|
|
41
|
+
| "approvalSubmittingToolCallIds"
|
|
42
|
+
| "approvalErrorsByToolCallId"
|
|
43
|
+
| "submitFileDecision"
|
|
44
|
+
| "fileDecisionSubmittingKeys"
|
|
45
|
+
| "fileDecisionErrorsByKey"
|
|
46
|
+
>;
|
|
47
|
+
|
|
48
|
+
/** Props for {@link WorkflowAgentCallTranscript}. */
|
|
49
|
+
export interface WorkflowAgentCallTranscriptProps {
|
|
50
|
+
/** ID of the child AgentExecution whose transcript to render. */
|
|
51
|
+
readonly childExecutionId: string;
|
|
52
|
+
/** Slug of the agent the task called, when known (labels the region). */
|
|
53
|
+
readonly agentSlug?: string;
|
|
54
|
+
/**
|
|
55
|
+
* Workflow-level HITL handlers. When provided, the transcript is
|
|
56
|
+
* interactive: tool-approval gates render their decision cards inline on
|
|
57
|
+
* the gated rows, and pending file reviews dock at the bottom. When
|
|
58
|
+
* omitted, the transcript is read-only — gates show status only
|
|
59
|
+
* (backward compatible, DD-011).
|
|
60
|
+
*/
|
|
61
|
+
readonly hitl?: WorkflowAgentExecutionHitl;
|
|
62
|
+
/**
|
|
63
|
+
* Open the child execution as a standalone page — the deep-dive escape
|
|
64
|
+
* hatch now that the card is the transcript's single home. Host-routed
|
|
65
|
+
* (DD-004).
|
|
66
|
+
*/
|
|
67
|
+
readonly onNavigateToAgentExecution?: (agentExecutionId: string) => void;
|
|
68
|
+
/** Additional CSS classes for the root element. */
|
|
69
|
+
readonly className?: string;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* A child AgentExecution's full transcript rendered inline in the
|
|
74
|
+
* AGENT_CALL task card — the session-grade `MessageThread` (tool calls,
|
|
75
|
+
* sub-agents, plan cards, and — with {@link
|
|
76
|
+
* WorkflowAgentCallTranscriptProps.hitl | hitl} — in-place HITL), streaming
|
|
77
|
+
* live while the child runs and serving the full history once settled.
|
|
78
|
+
*
|
|
79
|
+
* BOUNDED, NOT FULL-HEIGHT. The transcript caps at a generous viewport
|
|
80
|
+
* fraction and owns its own scroll + auto-follow inside that box
|
|
81
|
+
* (`MessageThread`'s scroll machine is reused unchanged). Once a transcript
|
|
82
|
+
* hits its cap it stops growing, so the card height stabilizes and the
|
|
83
|
+
* OUTER thread's auto-follow stops chasing it — the bound fixes both the
|
|
84
|
+
* inner and the outer scroll ergonomics at once.
|
|
85
|
+
*
|
|
86
|
+
* VIEWPORT-GATED STREAMING. Every mounted card fetches its (DD-014-cached)
|
|
87
|
+
* snapshot so the body renders immediately, but the live subscription opens
|
|
88
|
+
* only while the card is on-screen (`useInViewport` → the hook's `live`
|
|
89
|
+
* gate). Off-screen running children pause their stream and keep the
|
|
90
|
+
* last-streamed snapshot visible (never a rewind); scrolling back — or
|
|
91
|
+
* toggling back from the CSS-hidden Graph view — re-attaches in place. This
|
|
92
|
+
* preserves the bounded-concurrency intent of the S4 single-active-tab
|
|
93
|
+
* design (DD-LIVE-006) for fan-out workflows: N concurrent children cost at
|
|
94
|
+
* most the streams the user can actually see.
|
|
95
|
+
*
|
|
96
|
+
* MINIMAL CHROME. The card header already owns the task's identity and
|
|
97
|
+
* metrics (the `agentCallLine` preview: slug, current tool, message/tool
|
|
98
|
+
* counts, plus duration/cost chips and the running/settled status glyph).
|
|
99
|
+
* The transcript adds only what the header cannot express: a
|
|
100
|
+
* `Reconnecting…` notice for the CHILD stream and the "Open standalone"
|
|
101
|
+
* pop-out. Body = purely the conversation.
|
|
102
|
+
*
|
|
103
|
+
* HITL ROUTING. Child gates are decided through the WORKFLOW-level RPCs
|
|
104
|
+
* (`WorkflowExecution.submitApproval` / `submitFileDecision`), never the
|
|
105
|
+
* child's own `agentExecution.*` submit path. The two paths are
|
|
106
|
+
* server-equivalent (the workflow RPC forwards to the child), but they
|
|
107
|
+
* differ in authorization: the workflow RPC checks `can_edit` on the
|
|
108
|
+
* workflow execution — the resource the operator owns — while the child
|
|
109
|
+
* path checks the runner-spawned AgentExecution, which the operator may
|
|
110
|
+
* not (the S5 rationale).
|
|
111
|
+
*
|
|
112
|
+
* FILE-REVIEW DOCK. Pending (AWAITING_REVIEW) sets derive from the CHILD's
|
|
113
|
+
* own live stream — the freshest source this component already holds — not
|
|
114
|
+
* from the parent's `status.pending_file_reviews`, which is fetched once
|
|
115
|
+
* and may lag a mid-run gate. Docked below the thread so a decision the
|
|
116
|
+
* child is blocked on can never scroll out of view; settled sets render as
|
|
117
|
+
* read-only records in-thread (`showFileReviewRecords`) — the two surfaces
|
|
118
|
+
* partition by the same pending test `MessageThread` uses.
|
|
119
|
+
*
|
|
120
|
+
* All visual properties flow through `--stgm-*` tokens (DD-005).
|
|
121
|
+
*/
|
|
122
|
+
export const WorkflowAgentCallTranscript = memo(
|
|
123
|
+
function WorkflowAgentCallTranscript({
|
|
124
|
+
childExecutionId,
|
|
125
|
+
agentSlug,
|
|
126
|
+
hitl,
|
|
127
|
+
onNavigateToAgentExecution,
|
|
128
|
+
className,
|
|
129
|
+
}: WorkflowAgentCallTranscriptProps) {
|
|
130
|
+
const { ref: viewportRef, isVisible } = useInViewport();
|
|
131
|
+
const {
|
|
132
|
+
execution,
|
|
133
|
+
phase,
|
|
134
|
+
isLoading,
|
|
135
|
+
isReconnecting,
|
|
136
|
+
error,
|
|
137
|
+
reconnect,
|
|
138
|
+
} = useLiveAgentExecution(childExecutionId, { live: isVisible });
|
|
139
|
+
|
|
140
|
+
// Pending file reviews from the child's own (streamed) status — see the
|
|
141
|
+
// component doc for why the parent's pending_file_reviews is not the
|
|
142
|
+
// source. Terminal executions never dock: their AWAITING_REVIEW sets
|
|
143
|
+
// are settled history and render as in-thread records instead.
|
|
144
|
+
const terminal = isTerminalPhase(phase);
|
|
145
|
+
const pendingReviewSets = useMemo<readonly FileChangeSet[]>(() => {
|
|
146
|
+
if (terminal) return [];
|
|
147
|
+
return displayFileChangeSets(execution?.status).filter(
|
|
148
|
+
(cs) =>
|
|
149
|
+
cs.status === FileChangeSetStatus.AWAITING_REVIEW &&
|
|
150
|
+
cs.changes.length > 0,
|
|
151
|
+
);
|
|
152
|
+
}, [execution?.status, terminal]);
|
|
153
|
+
|
|
154
|
+
// Bind the child id into the dock's card-level submit signature. Deps
|
|
155
|
+
// are the specific method (DD-010), so the callback survives unrelated
|
|
156
|
+
// in-flight churn on the actions instance.
|
|
157
|
+
const submitFileDecision = hitl?.submitFileDecision;
|
|
158
|
+
const handleFileDecision = useCallback(
|
|
159
|
+
(changeSetId: string, action: FileDecisionAction, options?: FileDecisionOptions) => {
|
|
160
|
+
submitFileDecision?.(childExecutionId, changeSetId, action, options);
|
|
161
|
+
},
|
|
162
|
+
[submitFileDecision, childExecutionId],
|
|
163
|
+
);
|
|
164
|
+
|
|
165
|
+
const showBar = isReconnecting || !!onNavigateToAgentExecution;
|
|
166
|
+
|
|
167
|
+
return (
|
|
168
|
+
<div
|
|
169
|
+
ref={viewportRef}
|
|
170
|
+
role="group"
|
|
171
|
+
aria-label={
|
|
172
|
+
agentSlug ? `Transcript of agent ${agentSlug}` : "Agent transcript"
|
|
173
|
+
}
|
|
174
|
+
className={cn("flex max-h-[60vh] min-w-0 flex-col", className)}
|
|
175
|
+
>
|
|
176
|
+
{/* Only what the card header cannot express: the child stream's
|
|
177
|
+
reconnecting state and the standalone pop-out. */}
|
|
178
|
+
{showBar && (
|
|
179
|
+
<div className="flex min-w-0 shrink-0 items-center gap-3 pb-1.5">
|
|
180
|
+
{isReconnecting && (
|
|
181
|
+
<span className="text-xs text-muted-foreground">Reconnecting…</span>
|
|
182
|
+
)}
|
|
183
|
+
{onNavigateToAgentExecution && (
|
|
184
|
+
<button
|
|
185
|
+
type="button"
|
|
186
|
+
onClick={() => onNavigateToAgentExecution(childExecutionId)}
|
|
187
|
+
className="ml-auto inline-flex shrink-0 items-center gap-1.5 text-xs font-medium text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:rounded-sm"
|
|
188
|
+
>
|
|
189
|
+
<PopOutIcon />
|
|
190
|
+
Open standalone
|
|
191
|
+
</button>
|
|
192
|
+
)}
|
|
193
|
+
</div>
|
|
194
|
+
)}
|
|
195
|
+
|
|
196
|
+
{/* The thread owns the scrolling inside the bounded box (its
|
|
197
|
+
auto-scroll machine + jump-to-latest need the scroll container);
|
|
198
|
+
min-h-0 lets the flex slot shrink to the cap. */}
|
|
199
|
+
<div className="min-h-0 min-w-0 flex-1">
|
|
200
|
+
{execution ? (
|
|
201
|
+
<MessageThread
|
|
202
|
+
executions={EMPTY_EXECUTIONS}
|
|
203
|
+
activeStreamExecution={execution}
|
|
204
|
+
onApprovalSubmit={hitl?.submitApproval}
|
|
205
|
+
submittingApprovalIds={hitl?.approvalSubmittingToolCallIds}
|
|
206
|
+
approvalErrors={hitl?.approvalErrorsByToolCallId}
|
|
207
|
+
showFileReviewRecords={hitl != null}
|
|
208
|
+
className="h-full"
|
|
209
|
+
/>
|
|
210
|
+
) : isLoading ? (
|
|
211
|
+
<ThreadSkeleton className="py-2" />
|
|
212
|
+
) : error ? (
|
|
213
|
+
<div
|
|
214
|
+
role="alert"
|
|
215
|
+
className="flex flex-col items-start gap-2 py-2"
|
|
216
|
+
>
|
|
217
|
+
<p className="text-xs text-destructive">{error.message}</p>
|
|
218
|
+
<button
|
|
219
|
+
type="button"
|
|
220
|
+
onClick={reconnect}
|
|
221
|
+
className="rounded border border-border px-3 py-1.5 text-xs font-medium text-foreground hover:bg-muted focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
|
|
222
|
+
>
|
|
223
|
+
Retry
|
|
224
|
+
</button>
|
|
225
|
+
</div>
|
|
226
|
+
) : (
|
|
227
|
+
<div role="status" className="flex flex-col gap-1 py-2">
|
|
228
|
+
<p className="text-xs font-medium text-foreground">
|
|
229
|
+
This agent execution is no longer available.
|
|
230
|
+
</p>
|
|
231
|
+
<p className="text-xs text-muted-foreground">
|
|
232
|
+
It may have been removed, or the workflow run predates
|
|
233
|
+
transcript retention.
|
|
234
|
+
</p>
|
|
235
|
+
</div>
|
|
236
|
+
)}
|
|
237
|
+
</div>
|
|
238
|
+
|
|
239
|
+
{/* Pending file reviews dock below the thread, inside the bounded
|
|
240
|
+
box — the decision the child is blocked on can never scroll out
|
|
241
|
+
of view. Same shape as the session's composer dock. */}
|
|
242
|
+
{hitl && pendingReviewSets.length > 0 && (
|
|
243
|
+
<FileReviewDock
|
|
244
|
+
changeSets={pendingReviewSets}
|
|
245
|
+
onSubmit={handleFileDecision}
|
|
246
|
+
submittingDecisionKeys={hitl.fileDecisionSubmittingKeys}
|
|
247
|
+
decisionErrors={hitl.fileDecisionErrorsByKey}
|
|
248
|
+
className="shrink-0"
|
|
249
|
+
/>
|
|
250
|
+
)}
|
|
251
|
+
</div>
|
|
252
|
+
);
|
|
253
|
+
},
|
|
254
|
+
);
|
|
255
|
+
|
|
256
|
+
// ---------------------------------------------------------------------------
|
|
257
|
+
// Inline SVG icons (SDK independence — no lucide dependency)
|
|
258
|
+
// ---------------------------------------------------------------------------
|
|
259
|
+
|
|
260
|
+
function PopOutIcon() {
|
|
261
|
+
return (
|
|
262
|
+
<svg
|
|
263
|
+
width="12"
|
|
264
|
+
height="12"
|
|
265
|
+
viewBox="0 0 12 12"
|
|
266
|
+
fill="none"
|
|
267
|
+
stroke="currentColor"
|
|
268
|
+
strokeWidth="1.3"
|
|
269
|
+
strokeLinecap="round"
|
|
270
|
+
strokeLinejoin="round"
|
|
271
|
+
className="shrink-0"
|
|
272
|
+
aria-hidden="true"
|
|
273
|
+
>
|
|
274
|
+
<path d="M10.5 4.5V1.5H7.5" />
|
|
275
|
+
<path d="M10.5 1.5L6 6" />
|
|
276
|
+
<path d="M8.5 7v3a1 1 0 0 1-1 1h-5a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1h3" />
|
|
277
|
+
</svg>
|
|
278
|
+
);
|
|
279
|
+
}
|
|
@@ -289,10 +289,14 @@ export function WorkflowDetailView({
|
|
|
289
289
|
<ValidationIndicator state={validationState} />
|
|
290
290
|
) : undefined;
|
|
291
291
|
|
|
292
|
-
// Inline visibility is
|
|
293
|
-
//
|
|
292
|
+
// Inline visibility is at-a-glance AND a shortcut into the Manage access
|
|
293
|
+
// dialog — the single writer for both access axes. The chip is navigation
|
|
294
|
+
// only; it stays a static badge for users who cannot view access.
|
|
294
295
|
const visibilityControl = meta ? (
|
|
295
|
-
<VisibilityBadge
|
|
296
|
+
<VisibilityBadge
|
|
297
|
+
visibility={meta.visibility}
|
|
298
|
+
onClick={access.action ? access.open : undefined}
|
|
299
|
+
/>
|
|
296
300
|
) : undefined;
|
|
297
301
|
|
|
298
302
|
const mergedActions = access.action
|