@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,73 +1,65 @@
|
|
|
1
1
|
// Behavior tests for the WorkflowTaskThread organism: progress header,
|
|
2
2
|
// per-variant card previews, the expand gesture (T06: headers expand or are
|
|
3
|
-
// plain rows — selection died with the Inspect drill-down), the
|
|
4
|
-
// transcript
|
|
5
|
-
// HITL section (S10/T06 —
|
|
3
|
+
// plain rows — selection died with the Inspect drill-down), the inline
|
|
4
|
+
// AGENT_CALL transcript body (T07), empty states (DD-006), and the
|
|
5
|
+
// in-thread HITL section (S10/T06 — the in-card human_input review gate).
|
|
6
6
|
//
|
|
7
7
|
// GUARDRAIL (S5 rationale): the entire file renders WITHOUT a StigmerProvider.
|
|
8
8
|
// Any component reaching for a client hook (the child's agentExecution.*
|
|
9
9
|
// submit path) would throw — so a passing render plus the hitl spies
|
|
10
10
|
// receiving decisions proves in-card gates route through the WORKFLOW-level
|
|
11
|
-
// wiring only. (
|
|
12
|
-
// NEEDS the provider — it is stubbed at the module seam here; its
|
|
13
|
-
// covers the real
|
|
14
|
-
// path is provider-free by design
|
|
15
|
-
// for artifact-backed payloads —
|
|
16
|
-
// gate.)
|
|
11
|
+
// wiring only. (WorkflowAgentCallTranscript streams its child itself and
|
|
12
|
+
// therefore NEEDS the provider — it is stubbed at the module seam here; its
|
|
13
|
+
// own suite covers the real transcript rendering, viewport gating, and RPC
|
|
14
|
+
// routing. The review gate's inline-payload path is provider-free by design
|
|
15
|
+
// — useReviewPayload touches the client only for artifact-backed payloads —
|
|
16
|
+
// so the human_input tests exercise the REAL gate.)
|
|
17
17
|
|
|
18
18
|
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
|
|
19
19
|
import { render, screen, fireEvent, cleanup, within } from "@testing-library/react";
|
|
20
20
|
import { create } from "@bufbuild/protobuf";
|
|
21
21
|
import { WorkflowTaskKind } from "@stigmer/protos/ai/stigmer/agentic/workflow/v1/enum_pb";
|
|
22
|
-
import {
|
|
23
|
-
WorkflowPendingApprovalSchema,
|
|
24
|
-
WorkflowPendingFileReviewSchema,
|
|
25
|
-
} from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/api_pb";
|
|
26
|
-
import type {
|
|
27
|
-
WorkflowPendingApproval,
|
|
28
|
-
WorkflowPendingFileReview,
|
|
29
|
-
WorkflowTask,
|
|
30
|
-
} from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/api_pb";
|
|
22
|
+
import type { WorkflowTask } from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/api_pb";
|
|
31
23
|
import {
|
|
32
24
|
ApprovalRequestedPayloadSchema,
|
|
33
25
|
ApprovalResolvedPayloadSchema,
|
|
34
26
|
} from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/event_pb";
|
|
35
|
-
import { ApprovalAction } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
36
27
|
import type { DerivedTaskState } from "../../internal/store/workflow-execution-event-store";
|
|
37
|
-
import type {
|
|
28
|
+
import type { WorkflowAgentCallTranscriptProps } from "../WorkflowAgentCallTranscript";
|
|
38
29
|
import { formatMetaChips } from "../format-utils";
|
|
39
30
|
import { WorkflowTaskThread, type WorkflowThreadHitl } from "../thread/WorkflowTaskThread";
|
|
40
31
|
|
|
41
32
|
// Streams its child (needs the provider this guardrail file deliberately
|
|
42
|
-
// omits) — stubbed to prove the seam:
|
|
43
|
-
//
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
)
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
33
|
+
// omits) — stubbed to prove the card-side seam: which child it is bound
|
|
34
|
+
// to, whether the hitl bundle reached it, and the pop-out wiring. The real
|
|
35
|
+
// component's behavior lives in WorkflowAgentCallTranscript.test.tsx.
|
|
36
|
+
vi.mock("../WorkflowAgentCallTranscript", () => ({
|
|
37
|
+
WorkflowAgentCallTranscript: vi.fn(
|
|
38
|
+
({
|
|
39
|
+
childExecutionId,
|
|
40
|
+
agentSlug,
|
|
41
|
+
hitl,
|
|
42
|
+
onNavigateToAgentExecution,
|
|
43
|
+
}: WorkflowAgentCallTranscriptProps) => (
|
|
44
|
+
<div
|
|
45
|
+
data-testid="agent-call-transcript-probe"
|
|
46
|
+
data-child-id={childExecutionId}
|
|
47
|
+
data-agent-slug={agentSlug ?? ""}
|
|
48
|
+
data-interactive={hitl ? "true" : "false"}
|
|
49
|
+
>
|
|
50
|
+
{onNavigateToAgentExecution && (
|
|
51
|
+
<button
|
|
52
|
+
type="button"
|
|
53
|
+
onClick={() => onNavigateToAgentExecution(childExecutionId)}
|
|
54
|
+
>
|
|
55
|
+
probe-pop-out-{childExecutionId}
|
|
56
|
+
</button>
|
|
57
|
+
)}
|
|
58
|
+
</div>
|
|
59
|
+
),
|
|
69
60
|
),
|
|
70
61
|
}));
|
|
62
|
+
import { WorkflowAgentCallTranscript } from "../WorkflowAgentCallTranscript";
|
|
71
63
|
|
|
72
64
|
// Spy-wrapped passthrough: every card render calls formatMetaChips with the
|
|
73
65
|
// item's own metric fields, so its call log is a per-card render probe (the
|
|
@@ -280,8 +272,8 @@ describe("WorkflowTaskThread", () => {
|
|
|
280
272
|
expect(container.querySelector("[aria-pressed]")).toBeNull();
|
|
281
273
|
});
|
|
282
274
|
|
|
283
|
-
it("renders
|
|
284
|
-
const
|
|
275
|
+
it("renders the child's inline transcript as an AGENT_CALL card's body — no button, no I/O summary (T07)", () => {
|
|
276
|
+
const onNavigateToAgentExecution = vi.fn();
|
|
285
277
|
render(
|
|
286
278
|
<WorkflowTaskThread
|
|
287
279
|
taskStates={statesOf(
|
|
@@ -297,16 +289,61 @@ describe("WorkflowTaskThread", () => {
|
|
|
297
289
|
)}
|
|
298
290
|
totalTasks={1}
|
|
299
291
|
isRunning={false}
|
|
300
|
-
|
|
292
|
+
onNavigateToAgentExecution={onNavigateToAgentExecution}
|
|
293
|
+
taskSnapshotsByName={
|
|
294
|
+
new Map([
|
|
295
|
+
[
|
|
296
|
+
"call-writer",
|
|
297
|
+
{
|
|
298
|
+
taskName: "call-writer",
|
|
299
|
+
// The old summary body's source — must NOT render (T07):
|
|
300
|
+
// the transcript IS the body.
|
|
301
|
+
output: { agent_execution_id: "aex_child_1", final_text: "done" },
|
|
302
|
+
artifactIds: [],
|
|
303
|
+
} as unknown as WorkflowTask,
|
|
304
|
+
],
|
|
305
|
+
])
|
|
306
|
+
}
|
|
301
307
|
/>,
|
|
302
308
|
);
|
|
303
309
|
|
|
304
|
-
//
|
|
305
|
-
|
|
310
|
+
// The card body IS the child transcript, bound to the right child…
|
|
311
|
+
const probe = screen.getByTestId("agent-call-transcript-probe");
|
|
312
|
+
expect(probe.getAttribute("data-child-id")).toBe("aex_child_1");
|
|
313
|
+
expect(probe.getAttribute("data-agent-slug")).toBe("blog-writer");
|
|
314
|
+
// …with no expand chevron, no launcher button, and none of the old
|
|
315
|
+
// id/final_text summary Struct.
|
|
306
316
|
expect(screen.queryByRole("button", { name: "Expand call-writer" })).toBeNull();
|
|
317
|
+
expect(screen.queryByRole("button", { name: "Open transcript" })).toBeNull();
|
|
318
|
+
expect(screen.queryByText("Output")).toBeNull();
|
|
319
|
+
expect(screen.queryByText(/final_text|done/)).toBeNull();
|
|
320
|
+
|
|
321
|
+
// The deep-dive pop-out routes through the host's navigation.
|
|
322
|
+
fireEvent.click(screen.getByText("probe-pop-out-aex_child_1"));
|
|
323
|
+
expect(onNavigateToAgentExecution).toHaveBeenCalledWith("aex_child_1");
|
|
324
|
+
});
|
|
325
|
+
|
|
326
|
+
it("falls back to the generic error body for an AGENT_CALL that failed before spawning a child (T07)", () => {
|
|
327
|
+
render(
|
|
328
|
+
<WorkflowTaskThread
|
|
329
|
+
taskStates={statesOf(
|
|
330
|
+
taskState({
|
|
331
|
+
taskName: "call-broken",
|
|
332
|
+
taskKind: WorkflowTaskKind.agent_call,
|
|
333
|
+
status: "failed",
|
|
334
|
+
childExecutionId: "", // never spawned — agent resolution failed
|
|
335
|
+
error: "agent not found: org/missing-agent\nresolution trace",
|
|
336
|
+
}),
|
|
337
|
+
)}
|
|
338
|
+
totalTasks={1}
|
|
339
|
+
isRunning={false}
|
|
340
|
+
/>,
|
|
341
|
+
);
|
|
307
342
|
|
|
308
|
-
|
|
309
|
-
expect(
|
|
343
|
+
// No child → no transcript to render…
|
|
344
|
+
expect(screen.queryByTestId("agent-call-transcript-probe")).toBeNull();
|
|
345
|
+
// …but the failure must still surface in full (the correctness case).
|
|
346
|
+
expect(screen.getByText(/resolution trace/)).toBeTruthy();
|
|
310
347
|
});
|
|
311
348
|
|
|
312
349
|
it("renders the task's output in the always-visible body from the snapshot (T04)", () => {
|
|
@@ -604,33 +641,6 @@ function makeHitl(overrides: Partial<WorkflowThreadHitl> = {}): WorkflowThreadHi
|
|
|
604
641
|
};
|
|
605
642
|
}
|
|
606
643
|
|
|
607
|
-
function pendingApproval(
|
|
608
|
-
childId: string,
|
|
609
|
-
toolCallId: string,
|
|
610
|
-
toolName = "delete_repository",
|
|
611
|
-
): WorkflowPendingApproval {
|
|
612
|
-
return create(WorkflowPendingApprovalSchema, {
|
|
613
|
-
childAgentExecutionId: childId,
|
|
614
|
-
approval: {
|
|
615
|
-
toolCallId,
|
|
616
|
-
toolName,
|
|
617
|
-
message: `Run ${toolName}?`,
|
|
618
|
-
argsPreview: '{"target": "acme/repo"}',
|
|
619
|
-
requestedAt: "2026-07-16T00:00:00Z",
|
|
620
|
-
},
|
|
621
|
-
});
|
|
622
|
-
}
|
|
623
|
-
|
|
624
|
-
function pendingFileReview(
|
|
625
|
-
childId: string,
|
|
626
|
-
changeSetIds: string[] = ["cs-1"],
|
|
627
|
-
): WorkflowPendingFileReview {
|
|
628
|
-
return create(WorkflowPendingFileReviewSchema, {
|
|
629
|
-
childAgentExecutionId: childId,
|
|
630
|
-
changeSetId: changeSetIds,
|
|
631
|
-
});
|
|
632
|
-
}
|
|
633
|
-
|
|
634
644
|
/** A gating AGENT_CALL task bound to its child execution. */
|
|
635
645
|
function gatedAgentCall(taskName: string, childId: string): DerivedTaskState {
|
|
636
646
|
return taskState({
|
|
@@ -667,93 +677,73 @@ function gatedHumanInput(
|
|
|
667
677
|
});
|
|
668
678
|
}
|
|
669
679
|
|
|
670
|
-
describe("WorkflowTaskThread — in-thread HITL (S10)", () => {
|
|
671
|
-
it("
|
|
672
|
-
const hitl = makeHitl();
|
|
680
|
+
describe("WorkflowTaskThread — in-thread HITL (S10/T07)", () => {
|
|
681
|
+
it("hands the hitl bundle to a GATING agent-call card's transcript — the child's gates decide inside it (T07)", () => {
|
|
673
682
|
render(
|
|
674
683
|
<WorkflowTaskThread
|
|
675
684
|
taskStates={statesOf(gatedAgentCall("call-helper", "aex_1"))}
|
|
676
685
|
totalTasks={1}
|
|
677
686
|
isRunning
|
|
678
|
-
hitl={
|
|
679
|
-
pendingApprovals={[pendingApproval("aex_1", "tc-1")]}
|
|
687
|
+
hitl={makeHitl()}
|
|
680
688
|
/>,
|
|
681
689
|
);
|
|
682
690
|
|
|
683
|
-
//
|
|
684
|
-
//
|
|
691
|
+
// No separate HITL section, no "waiting for approval" interstitial —
|
|
692
|
+
// the transcript IS the decision surface, and it became interactive.
|
|
693
|
+
const probe = screen.getByTestId("agent-call-transcript-probe");
|
|
694
|
+
expect(probe.getAttribute("data-child-id")).toBe("aex_1");
|
|
695
|
+
expect(probe.getAttribute("data-interactive")).toBe("true");
|
|
696
|
+
expect(screen.queryByText(/waiting for an approval/)).toBeNull();
|
|
685
697
|
expect(
|
|
686
698
|
screen.queryByRole("button", { name: "Expand call-helper" }),
|
|
687
699
|
).toBeNull();
|
|
688
|
-
const card = screen.getByRole("alert", {
|
|
689
|
-
name: "Approval required for delete_repository",
|
|
690
|
-
});
|
|
691
|
-
expect(card).toBeTruthy();
|
|
692
|
-
|
|
693
|
-
fireEvent.click(within(card).getByRole("button", { name: "Approve" }));
|
|
694
|
-
expect(hitl.submitApproval).toHaveBeenCalledWith(
|
|
695
|
-
"tc-1",
|
|
696
|
-
ApprovalAction.APPROVE,
|
|
697
|
-
undefined,
|
|
698
|
-
);
|
|
699
700
|
});
|
|
700
701
|
|
|
701
|
-
it("
|
|
702
|
-
|
|
702
|
+
it("keeps a NON-gating agent-call transcript read-only (the hitl scoping)", () => {
|
|
703
|
+
render(
|
|
703
704
|
<WorkflowTaskThread
|
|
704
705
|
taskStates={statesOf(
|
|
705
|
-
|
|
706
|
-
|
|
706
|
+
taskState({
|
|
707
|
+
taskName: "call-writer",
|
|
708
|
+
taskKind: WorkflowTaskKind.agent_call,
|
|
709
|
+
status: "running",
|
|
710
|
+
childExecutionId: "aex_2",
|
|
711
|
+
}),
|
|
707
712
|
)}
|
|
708
|
-
totalTasks={
|
|
713
|
+
totalTasks={1}
|
|
709
714
|
isRunning
|
|
710
715
|
hitl={makeHitl()}
|
|
711
|
-
pendingApprovals={[
|
|
712
|
-
pendingApproval("aex_a", "tc-a", "tool_for_a"),
|
|
713
|
-
pendingApproval("aex_b", "tc-b", "tool_for_b"),
|
|
714
|
-
]}
|
|
715
716
|
/>,
|
|
716
717
|
);
|
|
717
718
|
|
|
719
|
+
// The thread scopes the bundle to waiting_approval cards only (DD-010),
|
|
720
|
+
// so a merely-running child's transcript stays read-only.
|
|
718
721
|
expect(
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
).
|
|
723
|
-
expect(
|
|
724
|
-
within(cardRootOf(container, "call-b")).getByRole("alert", {
|
|
725
|
-
name: "Approval required for tool_for_b",
|
|
726
|
-
}),
|
|
727
|
-
).toBeTruthy();
|
|
728
|
-
expect(
|
|
729
|
-
within(cardRootOf(container, "call-a")).queryByRole("alert", {
|
|
730
|
-
name: "Approval required for tool_for_b",
|
|
731
|
-
}),
|
|
732
|
-
).toBeNull();
|
|
722
|
+
screen
|
|
723
|
+
.getByTestId("agent-call-transcript-probe")
|
|
724
|
+
.getAttribute("data-interactive"),
|
|
725
|
+
).toBe("false");
|
|
733
726
|
});
|
|
734
727
|
|
|
735
|
-
it("
|
|
736
|
-
const
|
|
737
|
-
render(
|
|
728
|
+
it("binds each parallel gating child to its own card's transcript", () => {
|
|
729
|
+
const { container } = render(
|
|
738
730
|
<WorkflowTaskThread
|
|
739
|
-
taskStates={statesOf(
|
|
740
|
-
|
|
731
|
+
taskStates={statesOf(
|
|
732
|
+
gatedAgentCall("call-a", "aex_a"),
|
|
733
|
+
gatedAgentCall("call-b", "aex_b"),
|
|
734
|
+
)}
|
|
735
|
+
totalTasks={2}
|
|
741
736
|
isRunning
|
|
742
|
-
hitl={
|
|
743
|
-
pendingFileReviews={[
|
|
744
|
-
pendingFileReview("aex_1", ["cs-1"]),
|
|
745
|
-
// Another child's reference must NOT reach this card's list.
|
|
746
|
-
pendingFileReview("aex_other", ["cs-9"]),
|
|
747
|
-
]}
|
|
737
|
+
hitl={makeHitl()}
|
|
748
738
|
/>,
|
|
749
739
|
);
|
|
750
740
|
|
|
751
|
-
const
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
expect(
|
|
741
|
+
const probeIn = (taskName: string) =>
|
|
742
|
+
within(cardRootOf(container, taskName)).getByTestId(
|
|
743
|
+
"agent-call-transcript-probe",
|
|
744
|
+
);
|
|
745
|
+
expect(probeIn("call-a").getAttribute("data-child-id")).toBe("aex_a");
|
|
746
|
+
expect(probeIn("call-b").getAttribute("data-child-id")).toBe("aex_b");
|
|
757
747
|
});
|
|
758
748
|
|
|
759
749
|
it("renders the FULL review gate on a pending human_input card and routes the decision through the workflow-level submit (T06)", () => {
|
|
@@ -847,28 +837,7 @@ describe("WorkflowTaskThread — in-thread HITL (S10)", () => {
|
|
|
847
837
|
expect(screen.queryByRole("form")).toBeNull();
|
|
848
838
|
});
|
|
849
839
|
|
|
850
|
-
it("
|
|
851
|
-
const onOpenAgentExecution = vi.fn();
|
|
852
|
-
render(
|
|
853
|
-
<WorkflowTaskThread
|
|
854
|
-
taskStates={statesOf(gatedAgentCall("call-helper", "aex_1"))}
|
|
855
|
-
totalTasks={1}
|
|
856
|
-
isRunning
|
|
857
|
-
onOpenAgentExecution={onOpenAgentExecution}
|
|
858
|
-
hitl={makeHitl()}
|
|
859
|
-
pendingApprovals={[]}
|
|
860
|
-
pendingFileReviews={[]}
|
|
861
|
-
/>,
|
|
862
|
-
);
|
|
863
|
-
|
|
864
|
-
expect(
|
|
865
|
-
screen.getByText(/The called agent is waiting for an approval/),
|
|
866
|
-
).toBeTruthy();
|
|
867
|
-
fireEvent.click(screen.getByRole("button", { name: "Open transcript" }));
|
|
868
|
-
expect(onOpenAgentExecution).toHaveBeenCalledWith("aex_1", "call-helper");
|
|
869
|
-
});
|
|
870
|
-
|
|
871
|
-
it("stays read-only when hitl is omitted (DD-011), even with gates surfaced", () => {
|
|
840
|
+
it("stays read-only when hitl is omitted (DD-011), even while gating", () => {
|
|
872
841
|
render(
|
|
873
842
|
<WorkflowTaskThread
|
|
874
843
|
taskStates={statesOf(
|
|
@@ -877,31 +846,15 @@ describe("WorkflowTaskThread — in-thread HITL (S10)", () => {
|
|
|
877
846
|
)}
|
|
878
847
|
totalTasks={2}
|
|
879
848
|
isRunning
|
|
880
|
-
pendingApprovals={[pendingApproval("aex_1", "tc-1")]}
|
|
881
849
|
/>,
|
|
882
850
|
);
|
|
883
851
|
|
|
884
|
-
expect(
|
|
852
|
+
expect(
|
|
853
|
+
screen
|
|
854
|
+
.getByTestId("agent-call-transcript-probe")
|
|
855
|
+
.getAttribute("data-interactive"),
|
|
856
|
+
).toBe("false");
|
|
885
857
|
expect(screen.queryByRole("form")).toBeNull();
|
|
886
|
-
expect(screen.queryByText(/waiting for an approval/)).toBeNull();
|
|
887
|
-
});
|
|
888
|
-
|
|
889
|
-
it("surfaces a gate's failed decision in-card, keyed to its toolCallId", () => {
|
|
890
|
-
render(
|
|
891
|
-
<WorkflowTaskThread
|
|
892
|
-
taskStates={statesOf(gatedAgentCall("call-helper", "aex_1"))}
|
|
893
|
-
totalTasks={1}
|
|
894
|
-
isRunning
|
|
895
|
-
hitl={makeHitl({
|
|
896
|
-
approvalErrorsByToolCallId: new Map([
|
|
897
|
-
["tc-1", new Error("boom-42: gate submit failed")],
|
|
898
|
-
]),
|
|
899
|
-
})}
|
|
900
|
-
pendingApprovals={[pendingApproval("aex_1", "tc-1")]}
|
|
901
|
-
/>,
|
|
902
|
-
);
|
|
903
|
-
|
|
904
|
-
expect(screen.getByText(/boom-42: gate submit failed/)).toBeTruthy();
|
|
905
858
|
});
|
|
906
859
|
|
|
907
860
|
it("re-renders only the gating card when gate state churns (sibling memo probe)", () => {
|
|
@@ -911,7 +864,6 @@ describe("WorkflowTaskThread — in-thread HITL (S10)", () => {
|
|
|
911
864
|
taskState({ taskName: "settled", durationMs: 7_777 }),
|
|
912
865
|
gatedAgentCall("call-helper", "aex_1"),
|
|
913
866
|
);
|
|
914
|
-
const approvals = [pendingApproval("aex_1", "tc-1")];
|
|
915
867
|
|
|
916
868
|
const { rerender } = render(
|
|
917
869
|
<WorkflowTaskThread
|
|
@@ -919,7 +871,6 @@ describe("WorkflowTaskThread — in-thread HITL (S10)", () => {
|
|
|
919
871
|
totalTasks={2}
|
|
920
872
|
isRunning
|
|
921
873
|
hitl={makeHitl()}
|
|
922
|
-
pendingApprovals={approvals}
|
|
923
874
|
/>,
|
|
924
875
|
);
|
|
925
876
|
|
|
@@ -934,7 +885,6 @@ describe("WorkflowTaskThread — in-thread HITL (S10)", () => {
|
|
|
934
885
|
totalTasks={2}
|
|
935
886
|
isRunning
|
|
936
887
|
hitl={makeHitl({ approvalSubmittingToolCallIds: new Set(["tc-1"]) })}
|
|
937
|
-
pendingApprovals={approvals}
|
|
938
888
|
/>,
|
|
939
889
|
);
|
|
940
890
|
|
|
@@ -944,4 +894,37 @@ describe("WorkflowTaskThread — in-thread HITL (S10)", () => {
|
|
|
944
894
|
// …but the settled sibling bailed (DD-009/DD-010).
|
|
945
895
|
expect(renderedDurations).not.toContain(7_777);
|
|
946
896
|
});
|
|
897
|
+
|
|
898
|
+
it("hands the churned hitl bundle through to the gating transcript (T07)", () => {
|
|
899
|
+
const taskStates = statesOf(gatedAgentCall("call-helper", "aex_1"));
|
|
900
|
+
const { rerender } = render(
|
|
901
|
+
<WorkflowTaskThread
|
|
902
|
+
taskStates={taskStates}
|
|
903
|
+
totalTasks={1}
|
|
904
|
+
isRunning
|
|
905
|
+
hitl={makeHitl()}
|
|
906
|
+
/>,
|
|
907
|
+
);
|
|
908
|
+
|
|
909
|
+
const transcriptProbe = vi.mocked(WorkflowAgentCallTranscript);
|
|
910
|
+
transcriptProbe.mockClear();
|
|
911
|
+
const churned = makeHitl({
|
|
912
|
+
approvalSubmittingToolCallIds: new Set(["tc-1"]),
|
|
913
|
+
});
|
|
914
|
+
rerender(
|
|
915
|
+
<WorkflowTaskThread
|
|
916
|
+
taskStates={taskStates}
|
|
917
|
+
totalTasks={1}
|
|
918
|
+
isRunning
|
|
919
|
+
hitl={churned}
|
|
920
|
+
/>,
|
|
921
|
+
);
|
|
922
|
+
|
|
923
|
+
// The in-flight Set must reach the transcript so the gate's spinner
|
|
924
|
+
// shows inside it — the bundle is passed through by reference.
|
|
925
|
+
const latest = transcriptProbe.mock.calls.at(-1)![0];
|
|
926
|
+
expect(latest.hitl?.approvalSubmittingToolCallIds).toBe(
|
|
927
|
+
churned.approvalSubmittingToolCallIds,
|
|
928
|
+
);
|
|
929
|
+
});
|
|
947
930
|
});
|
|
@@ -370,10 +370,10 @@ describe("ExecutionBadge agent activity", () => {
|
|
|
370
370
|
|
|
371
371
|
// NOTE: the "AgentCallTab view switching" suite that lived here tested the
|
|
372
372
|
// tab's embedded-thumbnail subscription gating. S4 replaced the thumbnail
|
|
373
|
-
// with a launcher
|
|
374
|
-
//
|
|
375
|
-
//
|
|
376
|
-
//
|
|
373
|
+
// with a launcher, and T07 replaced the launcher's document tab with the
|
|
374
|
+
// inline in-card transcript; the transcript's fetch/stream lifecycle is
|
|
375
|
+
// covered by useLiveAgentExecution.test.tsx +
|
|
376
|
+
// WorkflowAgentCallTranscript.test.tsx.
|
|
377
377
|
|
|
378
378
|
// ---------------------------------------------------------------------------
|
|
379
379
|
// Inspector Approval tab visibility
|
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
import {
|
|
11
11
|
deriveTaskApprovalRequest,
|
|
12
12
|
deriveTaskApprovalDecision,
|
|
13
|
+
deriveTaskReviewer,
|
|
13
14
|
} from "../task-detail/task-approval";
|
|
14
15
|
|
|
15
16
|
// ---------------------------------------------------------------------------
|
|
@@ -146,4 +147,122 @@ describe("deriveTaskApprovalDecision", () => {
|
|
|
146
147
|
expect(decision!.outcome).toBe("approve");
|
|
147
148
|
expect(decision!.autoResolved).toBe(true);
|
|
148
149
|
});
|
|
150
|
+
|
|
151
|
+
it("reads the reviewer_actor display snapshot from the task output", () => {
|
|
152
|
+
const decision = deriveTaskApprovalDecision(null, {
|
|
153
|
+
outcome: "approve",
|
|
154
|
+
reviewer: "ida_01abc",
|
|
155
|
+
reviewer_actor: {
|
|
156
|
+
id: "ida_01abc",
|
|
157
|
+
display_name: "Ada Lovelace",
|
|
158
|
+
email: "ada@example.com",
|
|
159
|
+
avatar: "https://example.com/ada.png",
|
|
160
|
+
},
|
|
161
|
+
} as JsonObject);
|
|
162
|
+
expect(decision!.reviewerActor).toEqual({
|
|
163
|
+
id: "ida_01abc",
|
|
164
|
+
displayName: "Ada Lovelace",
|
|
165
|
+
email: "ada@example.com",
|
|
166
|
+
avatar: "https://example.com/ada.png",
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
it("falls back to the event's resolvedByActor during the finalizing window", () => {
|
|
171
|
+
const decision = deriveTaskApprovalDecision(
|
|
172
|
+
makeResolution({
|
|
173
|
+
resolvedBy: "ida_01abc",
|
|
174
|
+
resolvedByActor: {
|
|
175
|
+
id: "ida_01abc",
|
|
176
|
+
displayName: "Ada Lovelace",
|
|
177
|
+
email: "ada@example.com",
|
|
178
|
+
avatar: "",
|
|
179
|
+
} as never,
|
|
180
|
+
}),
|
|
181
|
+
undefined,
|
|
182
|
+
);
|
|
183
|
+
expect(decision!.reviewerActor).toEqual({
|
|
184
|
+
id: "ida_01abc",
|
|
185
|
+
displayName: "Ada Lovelace",
|
|
186
|
+
email: "ada@example.com",
|
|
187
|
+
avatar: "",
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
it("leaves reviewerActor null for unenriched records", () => {
|
|
192
|
+
const decision = deriveTaskApprovalDecision(null, {
|
|
193
|
+
outcome: "approve",
|
|
194
|
+
reviewer: "ida_01abc",
|
|
195
|
+
} as JsonObject);
|
|
196
|
+
expect(decision!.reviewerActor).toBeNull();
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
describe("deriveTaskReviewer", () => {
|
|
201
|
+
const base = {
|
|
202
|
+
outcome: "approve",
|
|
203
|
+
respondedAt: null,
|
|
204
|
+
comment: "",
|
|
205
|
+
formData: null,
|
|
206
|
+
waitDurationMs: 0,
|
|
207
|
+
autoResolved: false,
|
|
208
|
+
};
|
|
209
|
+
|
|
210
|
+
it("prefers the display name, carrying email and avatar for the chip", () => {
|
|
211
|
+
const view = deriveTaskReviewer({
|
|
212
|
+
...base,
|
|
213
|
+
reviewer: "ida_01abc",
|
|
214
|
+
reviewerActor: {
|
|
215
|
+
id: "ida_01abc",
|
|
216
|
+
displayName: "Ada Lovelace",
|
|
217
|
+
email: "ada@example.com",
|
|
218
|
+
avatar: "https://example.com/ada.png",
|
|
219
|
+
},
|
|
220
|
+
});
|
|
221
|
+
expect(view).toEqual({
|
|
222
|
+
label: "Ada Lovelace",
|
|
223
|
+
email: "ada@example.com",
|
|
224
|
+
avatar: "https://example.com/ada.png",
|
|
225
|
+
isRawId: false,
|
|
226
|
+
});
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
it("falls back to email when no display name exists", () => {
|
|
230
|
+
const view = deriveTaskReviewer({
|
|
231
|
+
...base,
|
|
232
|
+
reviewer: "ida_01abc",
|
|
233
|
+
reviewerActor: {
|
|
234
|
+
id: "ida_01abc",
|
|
235
|
+
displayName: "",
|
|
236
|
+
email: "ada@example.com",
|
|
237
|
+
avatar: "",
|
|
238
|
+
},
|
|
239
|
+
});
|
|
240
|
+
expect(view!.label).toBe("ada@example.com");
|
|
241
|
+
// Email equals the label — no redundant secondary display.
|
|
242
|
+
expect(view!.email).toBe("");
|
|
243
|
+
expect(view!.isRawId).toBe(false);
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
it("falls back to the raw id for legacy records, flagged for de-emphasis", () => {
|
|
247
|
+
const view = deriveTaskReviewer({
|
|
248
|
+
...base,
|
|
249
|
+
reviewer: "ida_01abc",
|
|
250
|
+
reviewerActor: null,
|
|
251
|
+
});
|
|
252
|
+
expect(view).toEqual({
|
|
253
|
+
label: "ida_01abc",
|
|
254
|
+
email: "",
|
|
255
|
+
avatar: "",
|
|
256
|
+
isRawId: true,
|
|
257
|
+
});
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
it("returns null for unattributed decisions so the 'by' segment is omitted", () => {
|
|
261
|
+
const view = deriveTaskReviewer({
|
|
262
|
+
...base,
|
|
263
|
+
reviewer: "",
|
|
264
|
+
reviewerActor: null,
|
|
265
|
+
});
|
|
266
|
+
expect(view).toBeNull();
|
|
267
|
+
});
|
|
149
268
|
});
|