@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
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
// Composition test for the execution-level HITL surfaces (S10/T06):
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
// exactly as in the reconciliation
|
|
1
|
+
// Composition test for the execution-level HITL surfaces (S10/T06/T07):
|
|
2
|
+
// gating AGENT_CALL cards carry the child's INLINE TRANSCRIPT as their
|
|
3
|
+
// decision surface — the child's gates decide inside it (the transcript's
|
|
4
|
+
// own suite covers the ApprovalCard rendering and workflow-RPC routing) —
|
|
5
|
+
// and the viewer's single useWorkflowExecutionActions instance is what
|
|
6
|
+
// reaches every card. Data hooks and heavy leaves (React Flow graph, the
|
|
7
|
+
// streaming transcript) are mocked exactly as in the reconciliation
|
|
8
|
+
// harness; this file proves the seams.
|
|
8
9
|
//
|
|
9
10
|
// REALISTIC FIXTURES (a hard S10 requirement): the gated task states are
|
|
10
11
|
// produced by the REAL store derivation from REAL event shapes — an
|
|
@@ -12,20 +13,11 @@
|
|
|
12
13
|
// (D-T02-14). S9's hand-crafted `waiting_approval` states masked that
|
|
13
14
|
// production never emitted them for child gates; deriving through the store
|
|
14
15
|
// keeps these tests honest about the production path.
|
|
15
|
-
//
|
|
16
|
-
// GUARDRAIL (S5 rationale): the entire render runs WITHOUT a StigmerProvider.
|
|
17
|
-
// Any component reaching for a client hook (the child's agentExecution.*
|
|
18
|
-
// submit path) would throw — so a passing render plus the workflow actions
|
|
19
|
-
// spy receiving the decision proves gates route through the WORKFLOW-level
|
|
20
|
-
// RPC only. (WorkflowFileReviewList streams its child itself and therefore
|
|
21
|
-
// NEEDS the provider — it is stubbed at the module seam here; its own suite
|
|
22
|
-
// covers the real child-derived rendering.)
|
|
23
16
|
|
|
24
17
|
import { describe, it, expect, vi, afterEach, beforeEach } from "vitest";
|
|
25
|
-
import { render, screen,
|
|
18
|
+
import { render, screen, cleanup, within } from "@testing-library/react";
|
|
26
19
|
import { create } from "@bufbuild/protobuf";
|
|
27
20
|
import { WorkflowExecutionSchema } from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/api_pb";
|
|
28
|
-
import type { WorkflowPendingApproval, WorkflowPendingFileReview } from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/api_pb";
|
|
29
21
|
import {
|
|
30
22
|
ExecutionPhase,
|
|
31
23
|
WorkflowTaskStatus,
|
|
@@ -39,10 +31,7 @@ import {
|
|
|
39
31
|
} from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/event_pb";
|
|
40
32
|
import type { WorkflowExecutionEvent } from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/event_pb";
|
|
41
33
|
import { WorkflowTaskKind } from "@stigmer/protos/ai/stigmer/agentic/workflow/v1/enum_pb";
|
|
42
|
-
import {
|
|
43
|
-
ApprovalAction,
|
|
44
|
-
ExecutionPhase as AgentExecutionPhase,
|
|
45
|
-
} from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
34
|
+
import { ExecutionPhase as AgentExecutionPhase } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
46
35
|
import type { DerivedCostSummary } from "../../internal/store/workflow-execution-event-store";
|
|
47
36
|
import { WorkflowExecutionEventStore } from "../../internal/store/workflow-execution-event-store";
|
|
48
37
|
import { useWorkflowExecution } from "../useWorkflowExecution";
|
|
@@ -50,7 +39,7 @@ import { useWorkflowExecutionEventStream } from "../useWorkflowExecutionEventStr
|
|
|
50
39
|
import { useWorkflowExecutionArtifacts } from "../useWorkflowExecutionArtifacts";
|
|
51
40
|
import { useWorkflowExecutionFileChanges } from "../useWorkflowExecutionFileChanges";
|
|
52
41
|
import { useWorkflowExecutionActions } from "../useWorkflowExecutionActions";
|
|
53
|
-
import type {
|
|
42
|
+
import type { WorkflowAgentCallTranscriptProps } from "../WorkflowAgentCallTranscript";
|
|
54
43
|
import { WorkflowExecutionViewer } from "../WorkflowExecutionViewer";
|
|
55
44
|
|
|
56
45
|
vi.mock("../useWorkflowExecution", () => ({
|
|
@@ -76,43 +65,29 @@ vi.mock("../execution-comparison/ExecutionComparisonPicker", () => ({
|
|
|
76
65
|
ExecutionComparisonPicker: () => null,
|
|
77
66
|
}));
|
|
78
67
|
|
|
79
|
-
//
|
|
80
|
-
//
|
|
81
|
-
//
|
|
82
|
-
//
|
|
83
|
-
vi.mock("../
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
{pendingFileReviews.map((ref) => (
|
|
93
|
-
<button
|
|
94
|
-
key={ref.childAgentExecutionId}
|
|
95
|
-
type="button"
|
|
96
|
-
onClick={() =>
|
|
97
|
-
onSubmitFileDecision(
|
|
98
|
-
ref.childAgentExecutionId,
|
|
99
|
-
ref.changeSetId[0] ?? "",
|
|
100
|
-
1 as never,
|
|
101
|
-
)
|
|
102
|
-
}
|
|
103
|
-
>
|
|
104
|
-
decide-files-{ref.childAgentExecutionId}
|
|
105
|
-
</button>
|
|
106
|
-
))}
|
|
107
|
-
</div>
|
|
68
|
+
// Fetches and streams its child (its own suite covers that, including the
|
|
69
|
+
// ApprovalCard rendering and the workflow-RPC routing guardrail) — stubbed
|
|
70
|
+
// to a probe recording the seam under test here: which child each card
|
|
71
|
+
// bound, and whether the viewer's hitl bundle reached it.
|
|
72
|
+
vi.mock("../WorkflowAgentCallTranscript", () => ({
|
|
73
|
+
WorkflowAgentCallTranscript: vi.fn(
|
|
74
|
+
({ childExecutionId, hitl }: WorkflowAgentCallTranscriptProps) => (
|
|
75
|
+
<div
|
|
76
|
+
data-testid="transcript-probe"
|
|
77
|
+
data-child-id={childExecutionId}
|
|
78
|
+
data-interactive={hitl ? "true" : "false"}
|
|
79
|
+
/>
|
|
80
|
+
),
|
|
108
81
|
),
|
|
109
82
|
}));
|
|
83
|
+
import { WorkflowAgentCallTranscript } from "../WorkflowAgentCallTranscript";
|
|
110
84
|
|
|
111
85
|
const mockedUseWorkflowExecution = vi.mocked(useWorkflowExecution);
|
|
112
86
|
const mockedUseEventStream = vi.mocked(useWorkflowExecutionEventStream);
|
|
113
87
|
const mockedUseArtifacts = vi.mocked(useWorkflowExecutionArtifacts);
|
|
114
88
|
const mockedUseFileChanges = vi.mocked(useWorkflowExecutionFileChanges);
|
|
115
89
|
const mockedUseActions = vi.mocked(useWorkflowExecutionActions);
|
|
90
|
+
const mockedTranscript = vi.mocked(WorkflowAgentCallTranscript);
|
|
116
91
|
|
|
117
92
|
const COST_SUMMARY: DerivedCostSummary = {
|
|
118
93
|
costConsumedMicros: 0n,
|
|
@@ -192,16 +167,8 @@ function buildGatedStore(): WorkflowExecutionEventStore {
|
|
|
192
167
|
return store;
|
|
193
168
|
}
|
|
194
169
|
|
|
195
|
-
/**
|
|
196
|
-
|
|
197
|
-
* call-agent orchestrator's UpdateWorkflowTaskApprovalStatus write). Task
|
|
198
|
-
* snapshots carry `agent_execution_id` metadata — the inspector's
|
|
199
|
-
* event-less path for resolving the AGENT_CALL child.
|
|
200
|
-
*/
|
|
201
|
-
function makeExecutionWithGates(overrides?: {
|
|
202
|
-
pendingApprovals?: unknown[];
|
|
203
|
-
pendingFileReviews?: unknown[];
|
|
204
|
-
}) {
|
|
170
|
+
/** The parent snapshot both gated children surfaced onto. */
|
|
171
|
+
function makeExecutionWithGates() {
|
|
205
172
|
return create(WorkflowExecutionSchema, {
|
|
206
173
|
metadata: { id: "wex_1", name: "nightly-report" },
|
|
207
174
|
spec: { workflowId: "wf_1" },
|
|
@@ -222,52 +189,25 @@ function makeExecutionWithGates(overrides?: {
|
|
|
222
189
|
metadata: { agent_execution_id: "agx_child_b" },
|
|
223
190
|
},
|
|
224
191
|
],
|
|
225
|
-
pendingApprovals: (overrides?.pendingApprovals ?? [
|
|
226
|
-
{
|
|
227
|
-
childAgentExecutionId: "agx_child_a",
|
|
228
|
-
approval: {
|
|
229
|
-
toolCallId: "tc_delete",
|
|
230
|
-
toolName: "delete_file",
|
|
231
|
-
argsPreview: '{"path":"/tmp/x"}',
|
|
232
|
-
},
|
|
233
|
-
},
|
|
234
|
-
{
|
|
235
|
-
childAgentExecutionId: "agx_child_b",
|
|
236
|
-
approval: {
|
|
237
|
-
toolCallId: "tc_shell",
|
|
238
|
-
toolName: "shell",
|
|
239
|
-
argsPreview: '{"command":"npm test"}',
|
|
240
|
-
},
|
|
241
|
-
},
|
|
242
|
-
]) as WorkflowPendingApproval[],
|
|
243
|
-
pendingFileReviews: (overrides?.pendingFileReviews ??
|
|
244
|
-
[]) as WorkflowPendingFileReview[],
|
|
245
192
|
},
|
|
246
193
|
});
|
|
247
194
|
}
|
|
248
195
|
|
|
249
|
-
function mockActions(
|
|
250
|
-
submitApproval?: ReturnType<typeof vi.fn>;
|
|
251
|
-
submitFileDecision?: ReturnType<typeof vi.fn>;
|
|
252
|
-
approvalSubmittingToolCallIds?: ReadonlySet<string>;
|
|
253
|
-
approvalErrorsByToolCallId?: ReadonlyMap<string, Error>;
|
|
254
|
-
}) {
|
|
196
|
+
function mockActions() {
|
|
255
197
|
return {
|
|
256
198
|
cancel: vi.fn(),
|
|
257
199
|
terminate: vi.fn(),
|
|
258
200
|
pause: vi.fn(),
|
|
259
201
|
resume: vi.fn(),
|
|
260
202
|
recover: vi.fn(),
|
|
261
|
-
submitApproval:
|
|
203
|
+
submitApproval: vi.fn(),
|
|
262
204
|
submitTaskApproval: vi.fn(),
|
|
263
|
-
submitFileDecision:
|
|
205
|
+
submitFileDecision: vi.fn(),
|
|
264
206
|
isSubmitting: false,
|
|
265
207
|
error: null,
|
|
266
208
|
clearError: vi.fn(),
|
|
267
|
-
approvalSubmittingToolCallIds:
|
|
268
|
-
|
|
269
|
-
approvalErrorsByToolCallId:
|
|
270
|
-
overrides?.approvalErrorsByToolCallId ?? new Map<string, Error>(),
|
|
209
|
+
approvalSubmittingToolCallIds: new Set<string>(),
|
|
210
|
+
approvalErrorsByToolCallId: new Map<string, Error>(),
|
|
271
211
|
taskApprovalSubmittingTaskNames: new Set<string>(),
|
|
272
212
|
taskApprovalErrorsByTaskName: new Map<string, Error>(),
|
|
273
213
|
fileDecisionSubmittingKeys: new Set<string>(),
|
|
@@ -275,13 +215,10 @@ function mockActions(overrides?: {
|
|
|
275
215
|
} as unknown as ReturnType<typeof useWorkflowExecutionActions>;
|
|
276
216
|
}
|
|
277
217
|
|
|
278
|
-
function arrange(
|
|
279
|
-
actions = mockActions(),
|
|
280
|
-
executionOverrides?: Parameters<typeof makeExecutionWithGates>[0],
|
|
281
|
-
) {
|
|
218
|
+
function arrange(actions = mockActions()) {
|
|
282
219
|
const store = buildGatedStore();
|
|
283
220
|
mockedUseWorkflowExecution.mockReturnValue({
|
|
284
|
-
execution: makeExecutionWithGates(
|
|
221
|
+
execution: makeExecutionWithGates(),
|
|
285
222
|
isLoading: false,
|
|
286
223
|
error: null,
|
|
287
224
|
refetch: vi.fn(),
|
|
@@ -325,149 +262,73 @@ function cardRootOf(taskName: string): HTMLElement {
|
|
|
325
262
|
return root;
|
|
326
263
|
}
|
|
327
264
|
|
|
328
|
-
describe("WorkflowExecutionViewer in-thread HITL (S10/T06)", () => {
|
|
265
|
+
describe("WorkflowExecutionViewer in-thread HITL (S10/T06/T07)", () => {
|
|
329
266
|
beforeEach(() => {
|
|
330
267
|
vi.clearAllMocks();
|
|
331
268
|
localStorage.clear();
|
|
332
269
|
});
|
|
333
270
|
afterEach(cleanup);
|
|
334
271
|
|
|
335
|
-
it("each gating card carries its own child's
|
|
272
|
+
it("each gating card carries its own child's INTERACTIVE transcript inline; the boundary never opens the panel", () => {
|
|
336
273
|
arrange();
|
|
337
274
|
render(<WorkflowExecutionViewer executionId="wex_1" />);
|
|
338
275
|
|
|
339
|
-
// Both tasks crossed into waiting_approval at mount
|
|
340
|
-
//
|
|
341
|
-
//
|
|
276
|
+
// Both tasks crossed into waiting_approval at mount (derived by the
|
|
277
|
+
// REAL store from real agent_call_progress events — D-T02-14). The
|
|
278
|
+
// panel stays closed — the cards ARE the (only) decision surface, and
|
|
279
|
+
// selection died with the Inspect drill-down.
|
|
342
280
|
expect(screen.queryByRole("tab", { name: /Approval/ })).toBeNull();
|
|
343
281
|
expect(document.querySelector("[aria-pressed]")).toBeNull();
|
|
344
282
|
|
|
345
|
-
// Per-
|
|
346
|
-
//
|
|
347
|
-
//
|
|
348
|
-
const
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
});
|
|
353
|
-
expect(
|
|
354
|
-
within(deleteCard).getByRole("button", { name: "Approve all file deletions" }),
|
|
355
|
-
).toBeTruthy();
|
|
356
|
-
expect(cardA.queryByRole("alert", { name: "Approval required for shell" })).toBeNull();
|
|
357
|
-
|
|
358
|
-
const shellCard = cardB.getByRole("alert", {
|
|
359
|
-
name: "Approval required for shell",
|
|
360
|
-
});
|
|
361
|
-
expect(within(shellCard).getByRole("button", { name: "Approve" })).toBeTruthy();
|
|
362
|
-
expect(within(shellCard).getByRole("button", { name: "Skip" })).toBeTruthy();
|
|
363
|
-
expect(within(shellCard).getByRole("button", { name: "Reject" })).toBeTruthy();
|
|
364
|
-
expect(
|
|
365
|
-
within(shellCard).getByRole("button", { name: "Approve all shell commands" }),
|
|
366
|
-
).toBeTruthy();
|
|
367
|
-
// The rich preview the retired thin card never had.
|
|
368
|
-
expect(shellCard.textContent).toContain("npm test");
|
|
369
|
-
});
|
|
370
|
-
|
|
371
|
-
it("routes every in-card decision through the workflow-level actions instance with the gate's toolCallId", () => {
|
|
372
|
-
const submitApproval = vi.fn();
|
|
373
|
-
arrange(mockActions({ submitApproval }));
|
|
374
|
-
render(<WorkflowExecutionViewer executionId="wex_1" />);
|
|
375
|
-
|
|
376
|
-
fireEvent.click(
|
|
377
|
-
within(cardRootOf("call-helper-b")).getByRole("button", {
|
|
378
|
-
name: "Approve all shell commands",
|
|
379
|
-
}),
|
|
283
|
+
// Per-card scoping: each card mounts ITS child's transcript, made
|
|
284
|
+
// interactive by the gate (the hitl bundle reached it) — the child's
|
|
285
|
+
// ApprovalCards render inside it (the transcript's own suite).
|
|
286
|
+
const probeIn = (taskName: string) =>
|
|
287
|
+
within(cardRootOf(taskName)).getByTestId("transcript-probe");
|
|
288
|
+
expect(probeIn("call-helper-a").getAttribute("data-child-id")).toBe(
|
|
289
|
+
"agx_child_a",
|
|
380
290
|
);
|
|
381
|
-
|
|
382
|
-
|
|
291
|
+
expect(probeIn("call-helper-a").getAttribute("data-interactive")).toBe(
|
|
292
|
+
"true",
|
|
293
|
+
);
|
|
294
|
+
expect(probeIn("call-helper-b").getAttribute("data-child-id")).toBe(
|
|
295
|
+
"agx_child_b",
|
|
296
|
+
);
|
|
297
|
+
expect(probeIn("call-helper-b").getAttribute("data-interactive")).toBe(
|
|
298
|
+
"true",
|
|
383
299
|
);
|
|
384
|
-
|
|
385
|
-
expect(submitApproval).toHaveBeenNthCalledWith(1, "tc_shell", ApprovalAction.APPROVE_ALL, undefined);
|
|
386
|
-
expect(submitApproval).toHaveBeenNthCalledWith(2, "tc_delete", ApprovalAction.REJECT, undefined);
|
|
387
300
|
});
|
|
388
301
|
|
|
389
|
-
it("each
|
|
390
|
-
arrange();
|
|
302
|
+
it("hands each transcript the viewer's SINGLE actions instance — decisions route through the workflow-level RPCs (S5 guardrail)", () => {
|
|
303
|
+
const actions = arrange();
|
|
391
304
|
render(<WorkflowExecutionViewer executionId="wex_1" />);
|
|
392
305
|
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
306
|
+
// Identity, not equivalence: the transcript submits through the SAME
|
|
307
|
+
// workflow-level handlers every other surface uses, so in-flight and
|
|
308
|
+
// error state can never fork — and never the child's agentExecution.*
|
|
309
|
+
// path (checked exhaustively in WorkflowAgentCallTranscript.test.tsx).
|
|
310
|
+
for (const call of mockedTranscript.mock.calls) {
|
|
311
|
+
const hitl = call[0].hitl!;
|
|
312
|
+
expect(hitl.submitApproval).toBe(actions.submitApproval);
|
|
313
|
+
expect(hitl.submitFileDecision).toBe(actions.submitFileDecision);
|
|
314
|
+
expect(hitl.approvalSubmittingToolCallIds).toBe(
|
|
315
|
+
actions.approvalSubmittingToolCallIds,
|
|
316
|
+
);
|
|
317
|
+
expect(hitl.approvalErrorsByToolCallId).toBe(
|
|
318
|
+
actions.approvalErrorsByToolCallId,
|
|
319
|
+
);
|
|
320
|
+
}
|
|
400
321
|
});
|
|
401
322
|
|
|
402
|
-
it("
|
|
403
|
-
|
|
404
|
-
// adjacency for leak detection.
|
|
405
|
-
arrange(
|
|
406
|
-
mockActions({
|
|
407
|
-
approvalSubmittingToolCallIds: new Set(["tc_shell"]),
|
|
408
|
-
approvalErrorsByToolCallId: new Map([
|
|
409
|
-
["tc_delete", new Error("gate already resolved")],
|
|
410
|
-
]),
|
|
411
|
-
}),
|
|
412
|
-
{
|
|
413
|
-
pendingApprovals: [
|
|
414
|
-
{
|
|
415
|
-
childAgentExecutionId: "agx_child_b",
|
|
416
|
-
approval: {
|
|
417
|
-
toolCallId: "tc_delete",
|
|
418
|
-
toolName: "delete_file",
|
|
419
|
-
argsPreview: '{"path":"/tmp/x"}',
|
|
420
|
-
},
|
|
421
|
-
},
|
|
422
|
-
{
|
|
423
|
-
childAgentExecutionId: "agx_child_b",
|
|
424
|
-
approval: {
|
|
425
|
-
toolCallId: "tc_shell",
|
|
426
|
-
toolName: "shell",
|
|
427
|
-
argsPreview: '{"command":"npm test"}',
|
|
428
|
-
},
|
|
429
|
-
},
|
|
430
|
-
],
|
|
431
|
-
},
|
|
432
|
-
);
|
|
433
|
-
const { container } = render(<WorkflowExecutionViewer executionId="wex_1" />);
|
|
434
|
-
|
|
435
|
-
// In-flight: only the shell gate's actions are disabled.
|
|
436
|
-
const shellCard = screen.getByRole("alert", { name: "Approval required for shell" });
|
|
437
|
-
const deleteCard = screen.getByRole("alert", { name: "Approval required for delete_file" });
|
|
438
|
-
expect(
|
|
439
|
-
(within(shellCard).getByRole("button", { name: "Approve" }) as HTMLButtonElement).disabled,
|
|
440
|
-
).toBe(true);
|
|
441
|
-
expect(
|
|
442
|
-
(within(deleteCard).getByRole("button", { name: "Approve" }) as HTMLButtonElement).disabled,
|
|
443
|
-
).toBe(false);
|
|
444
|
-
|
|
445
|
-
// Error: in-card on the failing gate only — never the lifecycle banner
|
|
446
|
-
// (actions.error is null, so no banner exists at all).
|
|
447
|
-
const errors = container.querySelectorAll('[data-cursor-target="approval-error"]');
|
|
448
|
-
expect(errors).toHaveLength(1);
|
|
449
|
-
expect(deleteCard.contains(errors[0]!)).toBe(true);
|
|
450
|
-
expect(screen.queryByRole("button", { name: "Dismiss" })).toBeNull();
|
|
451
|
-
});
|
|
452
|
-
|
|
453
|
-
it("file reviews render on their own card, child-scoped, wired to the workflow-level submit", () => {
|
|
454
|
-
const submitFileDecision = vi.fn();
|
|
455
|
-
arrange(mockActions({ submitFileDecision }), {
|
|
456
|
-
pendingApprovals: [],
|
|
457
|
-
pendingFileReviews: [
|
|
458
|
-
{ childAgentExecutionId: "agx_child_a", changeSetId: ["cs_1"] },
|
|
459
|
-
{ childAgentExecutionId: "agx_child_b", changeSetId: ["cs_2"] },
|
|
460
|
-
],
|
|
461
|
-
});
|
|
323
|
+
it("renders each child's transcript on exactly ONE surface — its own card (no document tab, no Inspect duplicate)", () => {
|
|
324
|
+
arrange();
|
|
462
325
|
render(<WorkflowExecutionViewer executionId="wex_1" />);
|
|
463
326
|
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
expect(
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
fireEvent.click(cardB.getByText("decide-files-agx_child_b"));
|
|
471
|
-
expect(submitFileDecision).toHaveBeenCalledWith("agx_child_b", "cs_2", 1);
|
|
327
|
+
const probes = screen.getAllByTestId("transcript-probe");
|
|
328
|
+
expect(probes).toHaveLength(2);
|
|
329
|
+
expect(
|
|
330
|
+
new Set(probes.map((p) => p.getAttribute("data-child-id"))).size,
|
|
331
|
+
).toBe(2);
|
|
332
|
+
expect(screen.queryByRole("button", { name: "Open transcript" })).toBeNull();
|
|
472
333
|
});
|
|
473
334
|
});
|
|
@@ -79,19 +79,19 @@ vi.mock("../execution-comparison/ExecutionComparisonPicker", () => ({
|
|
|
79
79
|
ExecutionComparisonPicker: () => null,
|
|
80
80
|
}));
|
|
81
81
|
|
|
82
|
-
// The child transcript
|
|
83
|
-
// that); here it only proves the thread
|
|
84
|
-
//
|
|
85
|
-
vi.mock("../
|
|
86
|
-
|
|
82
|
+
// The inline child transcript fetches and streams (its own suite covers
|
|
83
|
+
// that); here it only proves the thread mounts it in the AGENT_CALL card
|
|
84
|
+
// with the right child identity (T07).
|
|
85
|
+
vi.mock("../WorkflowAgentCallTranscript", () => ({
|
|
86
|
+
WorkflowAgentCallTranscript: ({
|
|
87
87
|
childExecutionId,
|
|
88
|
-
|
|
88
|
+
agentSlug,
|
|
89
89
|
}: {
|
|
90
90
|
childExecutionId: string;
|
|
91
|
-
|
|
91
|
+
agentSlug?: string;
|
|
92
92
|
}) => (
|
|
93
|
-
<div data-testid="agent-
|
|
94
|
-
{childExecutionId}:{
|
|
93
|
+
<div data-testid="agent-transcript-stub">
|
|
94
|
+
{childExecutionId}:{agentSlug ?? ""}
|
|
95
95
|
</div>
|
|
96
96
|
),
|
|
97
97
|
}));
|
|
@@ -437,7 +437,7 @@ describe("WorkflowExecutionViewer (center-column Thread|Graph toggle, S9)", () =
|
|
|
437
437
|
).toHaveBeenCalledWith("review-gate", "ship", undefined, undefined);
|
|
438
438
|
});
|
|
439
439
|
|
|
440
|
-
it("an AGENT_CALL card's
|
|
440
|
+
it("an AGENT_CALL card renders the child's inline transcript in the thread — no document tab, no launcher (T07)", () => {
|
|
441
441
|
// Add a settled agent-call task carrying its child execution id. The
|
|
442
442
|
// stream stage must not be "complete" with zero events, or the viewer's
|
|
443
443
|
// snapshot fallback would replace these derived states (its documented
|
|
@@ -464,13 +464,14 @@ describe("WorkflowExecutionViewer (center-column Thread|Graph toggle, S9)", () =
|
|
|
464
464
|
} as unknown as ReturnType<typeof useWorkflowExecutionEventStream>);
|
|
465
465
|
renderViewer();
|
|
466
466
|
|
|
467
|
-
//
|
|
468
|
-
//
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
expect(screen.getByTestId("agent-doc-stub").textContent).toBe(
|
|
472
|
-
"aex_child_1:call-writer",
|
|
467
|
+
// The transcript is IN the card body, bound to the right child, with
|
|
468
|
+
// no launcher gesture in between — the card is the single home.
|
|
469
|
+
expect(screen.getByTestId("agent-transcript-stub").textContent).toBe(
|
|
470
|
+
"aex_child_1:blog-writer",
|
|
473
471
|
);
|
|
472
|
+
expect(
|
|
473
|
+
screen.queryByRole("button", { name: "Open transcript" }),
|
|
474
|
+
).toBeNull();
|
|
474
475
|
});
|
|
475
476
|
|
|
476
477
|
it("keeps exactly one aria-live announcer across both center views", () => {
|
|
@@ -10,6 +10,7 @@ function makeDecision(
|
|
|
10
10
|
return {
|
|
11
11
|
outcome: "approve",
|
|
12
12
|
reviewer: "alice",
|
|
13
|
+
reviewerActor: null,
|
|
13
14
|
respondedAt: "2026-06-02T07:40:08Z",
|
|
14
15
|
comment: "",
|
|
15
16
|
formData: null,
|
|
@@ -57,11 +58,60 @@ describe("WorkflowTaskApprovalSummary", () => {
|
|
|
57
58
|
});
|
|
58
59
|
|
|
59
60
|
describe("decision metadata", () => {
|
|
60
|
-
it("renders the reviewer", () => {
|
|
61
|
+
it("renders the reviewer's display name with avatar and email tooltip when enriched", () => {
|
|
62
|
+
render(
|
|
63
|
+
<WorkflowTaskApprovalSummary
|
|
64
|
+
{...baseProps}
|
|
65
|
+
decision={makeDecision({
|
|
66
|
+
reviewer: "ida_01abc",
|
|
67
|
+
reviewerActor: {
|
|
68
|
+
id: "ida_01abc",
|
|
69
|
+
displayName: "Ada Lovelace",
|
|
70
|
+
email: "ada@example.com",
|
|
71
|
+
avatar: "https://example.com/ada.png",
|
|
72
|
+
},
|
|
73
|
+
})}
|
|
74
|
+
/>,
|
|
75
|
+
);
|
|
76
|
+
const name = screen.getByText("Ada Lovelace");
|
|
77
|
+
expect(name.getAttribute("title")).toBe("ada@example.com");
|
|
78
|
+
expect(document.querySelector('img[src="https://example.com/ada.png"]')).toBeTruthy();
|
|
79
|
+
// The raw identity is never shown when a display identity exists.
|
|
80
|
+
expect(screen.queryByText("ida_01abc")).toBeNull();
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it("falls back to the email when the actor has no display name", () => {
|
|
84
|
+
render(
|
|
85
|
+
<WorkflowTaskApprovalSummary
|
|
86
|
+
{...baseProps}
|
|
87
|
+
decision={makeDecision({
|
|
88
|
+
reviewer: "ida_01abc",
|
|
89
|
+
reviewerActor: {
|
|
90
|
+
id: "ida_01abc",
|
|
91
|
+
displayName: "",
|
|
92
|
+
email: "ada@example.com",
|
|
93
|
+
avatar: "",
|
|
94
|
+
},
|
|
95
|
+
})}
|
|
96
|
+
/>,
|
|
97
|
+
);
|
|
98
|
+
expect(screen.getByText("ada@example.com")).toBeTruthy();
|
|
99
|
+
expect(screen.queryByText("ida_01abc")).toBeNull();
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
it("renders a de-emphasized raw id for legacy unenriched records", () => {
|
|
61
103
|
render(
|
|
62
104
|
<WorkflowTaskApprovalSummary {...baseProps} decision={makeDecision({ reviewer: "bob" })} />,
|
|
63
105
|
);
|
|
64
|
-
|
|
106
|
+
const raw = screen.getByText("bob");
|
|
107
|
+
expect(raw.className).toContain("font-mono");
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
it("omits the 'by' segment entirely for unattributed decisions", () => {
|
|
111
|
+
render(
|
|
112
|
+
<WorkflowTaskApprovalSummary {...baseProps} decision={makeDecision({ reviewer: "" })} />,
|
|
113
|
+
);
|
|
114
|
+
expect(screen.queryByText(/^by/)).toBeNull();
|
|
65
115
|
});
|
|
66
116
|
|
|
67
117
|
it("renders the wait duration when present", () => {
|