@stigmer/server 3.40.0 → 3.41.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/dist/authorization/authorizer.d.ts +16 -10
- package/dist/authorization/authorizer.d.ts.map +1 -1
- package/dist/authorization/authorizer.js +17 -9
- package/dist/authorization/authorizer.js.map +1 -1
- package/dist/authorization/derived-tuples.d.ts +7 -3
- package/dist/authorization/derived-tuples.d.ts.map +1 -1
- package/dist/authorization/derived-tuples.js +62 -6
- package/dist/authorization/derived-tuples.js.map +1 -1
- package/dist/authorization/evaluator.d.ts +11 -7
- package/dist/authorization/evaluator.d.ts.map +1 -1
- package/dist/authorization/evaluator.js +16 -10
- package/dist/authorization/evaluator.js.map +1 -1
- package/dist/authorization/list-read-scope.d.ts +4 -0
- package/dist/authorization/list-read-scope.d.ts.map +1 -1
- package/dist/authorization/list-read-scope.js +1 -0
- package/dist/authorization/list-read-scope.js.map +1 -1
- package/dist/authorization/model/data/authorization-model.json +830 -67
- package/dist/authorization/model/execution-viewer.d.ts.map +1 -1
- package/dist/authorization/model/execution-viewer.js +26 -24
- package/dist/authorization/model/execution-viewer.js.map +1 -1
- package/dist/authorization/model/index.d.ts +4 -1
- package/dist/authorization/model/index.d.ts.map +1 -1
- package/dist/authorization/model/index.js +4 -1
- package/dist/authorization/model/index.js.map +1 -1
- package/dist/authorization/model/rewrite.d.ts +5 -3
- package/dist/authorization/model/rewrite.d.ts.map +1 -1
- package/dist/authorization/organization-directory.d.ts +44 -0
- package/dist/authorization/organization-directory.d.ts.map +1 -1
- package/dist/authorization/organization-directory.js +1 -0
- package/dist/authorization/organization-directory.js.map +1 -1
- package/dist/authorization/person.d.ts +14 -1
- package/dist/authorization/person.d.ts.map +1 -1
- package/dist/authorization/person.js +16 -0
- package/dist/authorization/person.js.map +1 -1
- package/dist/authorization/policy-check.d.ts +52 -0
- package/dist/authorization/policy-check.d.ts.map +1 -0
- package/dist/authorization/policy-check.js +35 -0
- package/dist/authorization/policy-check.js.map +1 -0
- package/dist/authorization/posture.d.ts +30 -4
- package/dist/authorization/posture.d.ts.map +1 -1
- package/dist/authorization/posture.js +58 -0
- package/dist/authorization/posture.js.map +1 -1
- package/dist/authorization/resource-creators.d.ts +4 -0
- package/dist/authorization/resource-creators.d.ts.map +1 -0
- package/dist/authorization/resource-creators.js +44 -0
- package/dist/authorization/resource-creators.js.map +1 -0
- package/dist/authorization/trusted-local-authorizer.d.ts +9 -0
- package/dist/authorization/trusted-local-authorizer.d.ts.map +1 -0
- package/dist/authorization/trusted-local-authorizer.js +70 -0
- package/dist/authorization/trusted-local-authorizer.js.map +1 -0
- package/dist/authorization/tuples.d.ts +12 -0
- package/dist/authorization/tuples.d.ts.map +1 -1
- package/dist/authorization/tuples.js +3 -0
- package/dist/authorization/tuples.js.map +1 -1
- package/dist/boot/compose.d.ts.map +1 -1
- package/dist/boot/compose.js +133 -43
- package/dist/boot/compose.js.map +1 -1
- package/dist/boot/config.d.ts +22 -7
- package/dist/boot/config.d.ts.map +1 -1
- package/dist/boot/config.js +2 -1
- package/dist/boot/config.js.map +1 -1
- package/dist/boot/inprocess.d.ts.map +1 -1
- package/dist/boot/inprocess.js +10 -4
- package/dist/boot/inprocess.js.map +1 -1
- package/dist/boot/list-indexes.d.ts.map +1 -1
- package/dist/boot/list-indexes.js +6 -1
- package/dist/boot/list-indexes.js.map +1 -1
- package/dist/boot/logger.d.ts +3 -1
- package/dist/boot/logger.d.ts.map +1 -1
- package/dist/boot/logger.js +3 -1
- package/dist/boot/logger.js.map +1 -1
- package/dist/boot/oauth-redirect-uri.d.ts +33 -12
- package/dist/boot/oauth-redirect-uri.d.ts.map +1 -1
- package/dist/boot/oauth-redirect-uri.js +43 -14
- package/dist/boot/oauth-redirect-uri.js.map +1 -1
- package/dist/boot/skill-transfer-origin.d.ts +46 -14
- package/dist/boot/skill-transfer-origin.d.ts.map +1 -1
- package/dist/boot/skill-transfer-origin.js +53 -13
- package/dist/boot/skill-transfer-origin.js.map +1 -1
- package/dist/domain/agentchannel/steps.d.ts +8 -6
- package/dist/domain/agentchannel/steps.d.ts.map +1 -1
- package/dist/domain/agentchannel/steps.js +9 -7
- package/dist/domain/agentchannel/steps.js.map +1 -1
- package/dist/domain/agentexecution/controller.d.ts +7 -0
- package/dist/domain/agentexecution/controller.d.ts.map +1 -1
- package/dist/domain/agentexecution/controller.js +1 -1
- package/dist/domain/agentexecution/controller.js.map +1 -1
- package/dist/domain/agentexecution/create-steps.d.ts +26 -12
- package/dist/domain/agentexecution/create-steps.d.ts.map +1 -1
- package/dist/domain/agentexecution/create-steps.js +61 -43
- package/dist/domain/agentexecution/create-steps.js.map +1 -1
- package/dist/domain/agentexecution/submit-approval.d.ts.map +1 -1
- package/dist/domain/agentexecution/submit-approval.js +9 -6
- package/dist/domain/agentexecution/submit-approval.js.map +1 -1
- package/dist/domain/agentexecution/submit-file-decision.d.ts.map +1 -1
- package/dist/domain/agentexecution/submit-file-decision.js +5 -4
- package/dist/domain/agentexecution/submit-file-decision.js.map +1 -1
- package/dist/domain/agentshare/steps.d.ts +5 -3
- package/dist/domain/agentshare/steps.d.ts.map +1 -1
- package/dist/domain/agentshare/steps.js +6 -4
- package/dist/domain/agentshare/steps.js.map +1 -1
- package/dist/domain/apikey/verifier.d.ts +7 -0
- package/dist/domain/apikey/verifier.d.ts.map +1 -1
- package/dist/domain/apikey/verifier.js +34 -1
- package/dist/domain/apikey/verifier.js.map +1 -1
- package/dist/domain/channelapp/controller.d.ts +9 -4
- package/dist/domain/channelapp/controller.d.ts.map +1 -1
- package/dist/domain/channelapp/controller.js +19 -9
- package/dist/domain/channelapp/controller.js.map +1 -1
- package/dist/domain/executioncontext/steps.d.ts +2 -1
- package/dist/domain/executioncontext/steps.d.ts.map +1 -1
- package/dist/domain/executioncontext/steps.js +2 -1
- package/dist/domain/executioncontext/steps.js.map +1 -1
- package/dist/domain/iampolicy/access-lists.d.ts.map +1 -1
- package/dist/domain/iampolicy/access-lists.js +57 -2
- package/dist/domain/iampolicy/access-lists.js.map +1 -1
- package/dist/domain/iampolicy/change.d.ts +53 -0
- package/dist/domain/iampolicy/change.d.ts.map +1 -0
- package/dist/domain/iampolicy/change.js +44 -0
- package/dist/domain/iampolicy/change.js.map +1 -0
- package/dist/domain/iampolicy/constants.d.ts +6 -0
- package/dist/domain/iampolicy/constants.d.ts.map +1 -1
- package/dist/domain/iampolicy/constants.js +6 -0
- package/dist/domain/iampolicy/constants.js.map +1 -1
- package/dist/domain/iampolicy/controller.d.ts.map +1 -1
- package/dist/domain/iampolicy/controller.js +9 -5
- package/dist/domain/iampolicy/controller.js.map +1 -1
- package/dist/domain/iampolicy/grant-path.d.ts +31 -13
- package/dist/domain/iampolicy/grant-path.d.ts.map +1 -1
- package/dist/domain/iampolicy/grant-path.js +216 -19
- package/dist/domain/iampolicy/grant-path.js.map +1 -1
- package/dist/domain/iampolicy/membership.d.ts +11 -3
- package/dist/domain/iampolicy/membership.d.ts.map +1 -1
- package/dist/domain/iampolicy/membership.js +18 -13
- package/dist/domain/iampolicy/membership.js.map +1 -1
- package/dist/domain/iampolicy/resource-store.d.ts.map +1 -1
- package/dist/domain/iampolicy/resource-store.js +4 -0
- package/dist/domain/iampolicy/resource-store.js.map +1 -1
- package/dist/domain/iampolicy/role-lifecycle.d.ts.map +1 -1
- package/dist/domain/iampolicy/role-lifecycle.js +2 -2
- package/dist/domain/iampolicy/role-lifecycle.js.map +1 -1
- package/dist/domain/iampolicy/roles.d.ts.map +1 -1
- package/dist/domain/iampolicy/roles.js +7 -0
- package/dist/domain/iampolicy/roles.js.map +1 -1
- package/dist/domain/iampolicy/steps.d.ts +4 -3
- package/dist/domain/iampolicy/steps.d.ts.map +1 -1
- package/dist/domain/iampolicy/steps.js +7 -7
- package/dist/domain/iampolicy/steps.js.map +1 -1
- package/dist/domain/iampolicy/store-contract.d.ts.map +1 -1
- package/dist/domain/iampolicy/store-contract.js +22 -1
- package/dist/domain/iampolicy/store-contract.js.map +1 -1
- package/dist/domain/iampolicy/store.d.ts +18 -5
- package/dist/domain/iampolicy/store.d.ts.map +1 -1
- package/dist/domain/iampolicy/store.js.map +1 -1
- package/dist/domain/identityaccount/constants.d.ts +15 -0
- package/dist/domain/identityaccount/constants.d.ts.map +1 -1
- package/dist/domain/identityaccount/constants.js +17 -0
- package/dist/domain/identityaccount/constants.js.map +1 -1
- package/dist/domain/identityaccount/controller.d.ts.map +1 -1
- package/dist/domain/identityaccount/controller.js +17 -6
- package/dist/domain/identityaccount/controller.js.map +1 -1
- package/dist/domain/identityaccount/resolve.d.ts +47 -0
- package/dist/domain/identityaccount/resolve.d.ts.map +1 -1
- package/dist/domain/identityaccount/resolve.js +38 -1
- package/dist/domain/identityaccount/resolve.js.map +1 -1
- package/dist/domain/identityaccount/resource-store.d.ts.map +1 -1
- package/dist/domain/identityaccount/resource-store.js +11 -1
- package/dist/domain/identityaccount/resource-store.js.map +1 -1
- package/dist/domain/identityaccount/steps.d.ts +2 -1
- package/dist/domain/identityaccount/steps.d.ts.map +1 -1
- package/dist/domain/identityaccount/steps.js +4 -3
- package/dist/domain/identityaccount/steps.js.map +1 -1
- package/dist/domain/identityaccount/store-contract.js +2 -2
- package/dist/domain/identityaccount/store-contract.js.map +1 -1
- package/dist/domain/identityaccount/store.d.ts +6 -1
- package/dist/domain/identityaccount/store.d.ts.map +1 -1
- package/dist/domain/mcpserver/connect-sandbox.d.ts +67 -0
- package/dist/domain/mcpserver/connect-sandbox.d.ts.map +1 -0
- package/dist/domain/mcpserver/connect-sandbox.js +64 -0
- package/dist/domain/mcpserver/connect-sandbox.js.map +1 -0
- package/dist/domain/mcpserver/connect.d.ts +42 -10
- package/dist/domain/mcpserver/connect.d.ts.map +1 -1
- package/dist/domain/mcpserver/connect.js +147 -40
- package/dist/domain/mcpserver/connect.js.map +1 -1
- package/dist/domain/mcpserver/controller.js +4 -2
- package/dist/domain/mcpserver/controller.js.map +1 -1
- package/dist/domain/mcpserver/engine.d.ts +26 -7
- package/dist/domain/mcpserver/engine.d.ts.map +1 -1
- package/dist/domain/mcpserver/engine.js.map +1 -1
- package/dist/domain/mcpserver/start-connect.d.ts +5 -0
- package/dist/domain/mcpserver/start-connect.d.ts.map +1 -1
- package/dist/domain/mcpserver/start-connect.js +38 -15
- package/dist/domain/mcpserver/start-connect.js.map +1 -1
- package/dist/domain/memory/controller.js +2 -1
- package/dist/domain/memory/controller.js.map +1 -1
- package/dist/domain/memory/list-index.d.ts +2 -0
- package/dist/domain/memory/list-index.d.ts.map +1 -0
- package/dist/domain/memory/list-index.js +31 -0
- package/dist/domain/memory/list-index.js.map +1 -0
- package/dist/domain/memory/queries.d.ts +10 -0
- package/dist/domain/memory/queries.d.ts.map +1 -0
- package/dist/domain/memory/queries.js +54 -0
- package/dist/domain/memory/queries.js.map +1 -0
- package/dist/domain/memory/steps.d.ts +13 -11
- package/dist/domain/memory/steps.d.ts.map +1 -1
- package/dist/domain/memory/steps.js +26 -57
- package/dist/domain/memory/steps.js.map +1 -1
- package/dist/domain/organization/steps.d.ts.map +1 -1
- package/dist/domain/organization/steps.js +1 -1
- package/dist/domain/organization/steps.js.map +1 -1
- package/dist/domain/platformclient/mint.d.ts.map +1 -1
- package/dist/domain/platformclient/mint.js +2 -2
- package/dist/domain/platformclient/mint.js.map +1 -1
- package/dist/domain/platformclient/verifier.d.ts.map +1 -1
- package/dist/domain/platformclient/verifier.js +6 -3
- package/dist/domain/platformclient/verifier.js.map +1 -1
- package/dist/domain/plugin/push.d.ts.map +1 -1
- package/dist/domain/plugin/push.js +1 -0
- package/dist/domain/plugin/push.js.map +1 -1
- package/dist/domain/schedule/steps.d.ts +3 -1
- package/dist/domain/schedule/steps.d.ts.map +1 -1
- package/dist/domain/schedule/steps.js +3 -1
- package/dist/domain/schedule/steps.js.map +1 -1
- package/dist/domain/skill/push.d.ts.map +1 -1
- package/dist/domain/skill/push.js +1 -0
- package/dist/domain/skill/push.js.map +1 -1
- package/dist/domain/workflow/registry/data/task-kind-registry.json +27 -1
- package/dist/domain/workflowexecution/submit-approval.d.ts +5 -2
- package/dist/domain/workflowexecution/submit-approval.d.ts.map +1 -1
- package/dist/domain/workflowexecution/submit-approval.js +1 -1
- package/dist/domain/workflowexecution/submit-approval.js.map +1 -1
- package/dist/domain/workflowexecution/submit-file-decision.d.ts +5 -2
- package/dist/domain/workflowexecution/submit-file-decision.d.ts.map +1 -1
- package/dist/domain/workflowexecution/submit-file-decision.js +1 -1
- package/dist/domain/workflowexecution/submit-file-decision.js.map +1 -1
- package/dist/domain/workflowexecution/submit-workflow-task-approval.d.ts.map +1 -1
- package/dist/domain/workflowexecution/submit-workflow-task-approval.js +12 -1
- package/dist/domain/workflowexecution/submit-workflow-task-approval.js.map +1 -1
- package/dist/domain/workflowinstance/controller.d.ts +6 -3
- package/dist/domain/workflowinstance/controller.d.ts.map +1 -1
- package/dist/domain/workflowinstance/controller.js +12 -7
- package/dist/domain/workflowinstance/controller.js.map +1 -1
- package/dist/domain/workflowinstance/steps.d.ts +31 -0
- package/dist/domain/workflowinstance/steps.d.ts.map +1 -1
- package/dist/domain/workflowinstance/steps.js +88 -1
- package/dist/domain/workflowinstance/steps.js.map +1 -1
- package/dist/extensions/composed-services.d.ts +56 -0
- package/dist/extensions/composed-services.d.ts.map +1 -0
- package/dist/extensions/composed-services.js +2 -0
- package/dist/extensions/composed-services.js.map +1 -0
- package/dist/extensions/drivers.d.ts +32 -1
- package/dist/extensions/drivers.d.ts.map +1 -1
- package/dist/extensions/identity.d.ts +4 -1
- package/dist/extensions/identity.d.ts.map +1 -1
- package/dist/extensions/identity.js +4 -1
- package/dist/extensions/identity.js.map +1 -1
- package/dist/extensions/registry.d.ts +37 -0
- package/dist/extensions/registry.d.ts.map +1 -1
- package/dist/extensions/registry.js +50 -0
- package/dist/extensions/registry.js.map +1 -1
- package/dist/extensions/resource-authorization.d.ts +78 -0
- package/dist/extensions/resource-authorization.d.ts.map +1 -1
- package/dist/extensions/resource-row-reader.d.ts +43 -0
- package/dist/extensions/resource-row-reader.d.ts.map +1 -0
- package/dist/extensions/resource-row-reader.js +2 -0
- package/dist/extensions/resource-row-reader.js.map +1 -0
- package/dist/extensions/visitor-classifier.d.ts +41 -0
- package/dist/extensions/visitor-classifier.d.ts.map +1 -0
- package/dist/extensions/visitor-classifier.js +2 -0
- package/dist/extensions/visitor-classifier.js.map +1 -0
- package/dist/identity/oidc-userinfo.d.ts +6 -1
- package/dist/identity/oidc-userinfo.d.ts.map +1 -1
- package/dist/identity/oidc-userinfo.js.map +1 -1
- package/dist/identity/oidc-verifier.d.ts.map +1 -1
- package/dist/identity/oidc-verifier.js +37 -8
- package/dist/identity/oidc-verifier.js.map +1 -1
- package/dist/index.d.ts +14 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -9
- package/dist/index.js.map +1 -1
- package/dist/pipeline/errors.d.ts +8 -0
- package/dist/pipeline/errors.d.ts.map +1 -1
- package/dist/pipeline/errors.js +25 -16
- package/dist/pipeline/errors.js.map +1 -1
- package/dist/pipeline/interceptors/auth.d.ts +17 -9
- package/dist/pipeline/interceptors/auth.d.ts.map +1 -1
- package/dist/pipeline/interceptors/auth.js +17 -9
- package/dist/pipeline/interceptors/auth.js.map +1 -1
- package/dist/pipeline/steps/authorization-tuples.d.ts +23 -1
- package/dist/pipeline/steps/authorization-tuples.d.ts.map +1 -1
- package/dist/pipeline/steps/authorization-tuples.js +42 -0
- package/dist/pipeline/steps/authorization-tuples.js.map +1 -1
- package/dist/pipeline/steps/authorize.d.ts +6 -5
- package/dist/pipeline/steps/authorize.d.ts.map +1 -1
- package/dist/pipeline/steps/authorize.js +6 -5
- package/dist/pipeline/steps/authorize.js.map +1 -1
- package/dist/pipeline/steps/defaults.d.ts +12 -0
- package/dist/pipeline/steps/defaults.d.ts.map +1 -1
- package/dist/pipeline/steps/defaults.js +42 -7
- package/dist/pipeline/steps/defaults.js.map +1 -1
- package/dist/pipeline/steps/guard-memory-capture.d.ts +13 -15
- package/dist/pipeline/steps/guard-memory-capture.d.ts.map +1 -1
- package/dist/pipeline/steps/guard-memory-capture.js +2 -3
- package/dist/pipeline/steps/guard-memory-capture.js.map +1 -1
- package/dist/runnerauth/built-in-runner-credential-provider.d.ts +0 -2
- package/dist/runnerauth/built-in-runner-credential-provider.d.ts.map +1 -1
- package/dist/runnerauth/built-in-runner-credential-provider.js +8 -17
- package/dist/runnerauth/built-in-runner-credential-provider.js.map +1 -1
- package/dist/runnerauth/runner-credential-provider.d.ts +17 -7
- package/dist/runnerauth/runner-credential-provider.d.ts.map +1 -1
- package/dist/runnerauth/runner-credential-provider.js.map +1 -1
- package/dist/sandbox/docker.d.ts.map +1 -1
- package/dist/sandbox/docker.js +3 -0
- package/dist/sandbox/docker.js.map +1 -1
- package/dist/sandbox/kubernetes.d.ts.map +1 -1
- package/dist/sandbox/kubernetes.js +3 -0
- package/dist/sandbox/kubernetes.js.map +1 -1
- package/dist/sandbox/local-process.d.ts.map +1 -1
- package/dist/sandbox/local-process.js +4 -0
- package/dist/sandbox/local-process.js.map +1 -1
- package/dist/sandbox/provisioner.d.ts +18 -6
- package/dist/sandbox/provisioner.d.ts.map +1 -1
- package/dist/sandbox/provisioner.js.map +1 -1
- package/dist/temporal/manager.d.ts +5 -0
- package/dist/temporal/manager.d.ts.map +1 -1
- package/dist/temporal/manager.js +9 -0
- package/dist/temporal/manager.js.map +1 -1
- package/dist/temporal/mcpserver/engine-client.d.ts +2 -2
- package/dist/temporal/mcpserver/engine-client.d.ts.map +1 -1
- package/dist/temporal/mcpserver/engine-client.js +6 -4
- package/dist/temporal/mcpserver/engine-client.js.map +1 -1
- package/dist/temporal/mcpserver/names.d.ts +13 -2
- package/dist/temporal/mcpserver/names.d.ts.map +1 -1
- package/dist/temporal/mcpserver/names.js +15 -2
- package/dist/temporal/mcpserver/names.js.map +1 -1
- package/dist/temporal/sdk-logger.d.ts +74 -0
- package/dist/temporal/sdk-logger.d.ts.map +1 -0
- package/dist/temporal/sdk-logger.js +143 -0
- package/dist/temporal/sdk-logger.js.map +1 -0
- package/package.json +6 -6
- package/src/authorization/README.md +18 -6
- package/src/authorization/__tests__/authorizer.test.ts +5 -1
- package/src/authorization/__tests__/derived-tuples.test.ts +26 -0
- package/src/authorization/__tests__/evaluator.test.ts +4 -0
- package/src/authorization/__tests__/list-read-scope.test.ts +11 -5
- package/src/authorization/__tests__/store-tests.test.ts +3 -1
- package/src/authorization/__tests__/trusted-local-authorizer.test.ts +155 -0
- package/src/authorization/__tests__/unit-owned-kinds.test.ts +420 -0
- package/src/authorization/__tests__/wire-permissions.test.ts +31 -2
- package/src/authorization/authorizer.ts +21 -10
- package/src/authorization/derived-tuples.ts +92 -18
- package/src/authorization/evaluator.ts +30 -15
- package/src/authorization/list-read-scope.ts +4 -0
- package/src/authorization/model/__tests__/registry.test.ts +23 -0
- package/src/authorization/model/data/authorization-model.json +830 -67
- package/src/authorization/model/execution-viewer.ts +32 -27
- package/src/authorization/model/index.ts +4 -1
- package/src/authorization/model/rewrite.ts +5 -3
- package/src/authorization/organization-directory.ts +4 -0
- package/src/authorization/person.ts +32 -1
- package/src/authorization/policy-check.ts +105 -0
- package/src/authorization/posture.ts +45 -4
- package/src/authorization/resource-creators.ts +48 -0
- package/src/authorization/trusted-local-authorizer.ts +91 -0
- package/src/authorization/tuples.ts +17 -0
- package/src/boot/__tests__/compose.test.ts +120 -4
- package/src/boot/__tests__/list-indexes.test.ts +4 -0
- package/src/boot/__tests__/oauth-redirect-uri.test.ts +121 -10
- package/src/boot/__tests__/skill-transfer-origin.test.ts +96 -25
- package/src/boot/compose.ts +154 -61
- package/src/boot/config.ts +28 -12
- package/src/boot/inprocess.ts +18 -4
- package/src/boot/list-indexes.ts +6 -1
- package/src/boot/logger.ts +3 -1
- package/src/boot/oauth-redirect-uri.ts +62 -17
- package/src/boot/skill-transfer-origin.ts +71 -16
- package/src/domain/agent/__tests__/agent.test.ts +42 -1
- package/src/domain/agentchannel/__tests__/agentchannel.test.ts +9 -0
- package/src/domain/agentchannel/__tests__/channel-runtime.test.ts +2 -0
- package/src/domain/agentchannel/__tests__/create-authorization.test.ts +7 -6
- package/src/domain/agentchannel/steps.ts +9 -7
- package/src/domain/agentexecution/__tests__/agentexecution.test.ts +148 -56
- package/src/domain/agentexecution/__tests__/create-steps.test.ts +175 -12
- package/src/domain/agentexecution/__tests__/file-review-seed.ts +91 -0
- package/src/domain/agentexecution/controller.ts +8 -0
- package/src/domain/agentexecution/create-steps.ts +74 -44
- package/src/domain/agentexecution/submit-approval.ts +9 -6
- package/src/domain/agentexecution/submit-file-decision.ts +5 -4
- package/src/domain/agentinstance/__tests__/agentinstance.test.ts +2 -0
- package/src/domain/agentshare/__tests__/agentshare.test.ts +17 -0
- package/src/domain/agentshare/__tests__/create-authorization.test.ts +5 -4
- package/src/domain/agentshare/steps.ts +6 -4
- package/src/domain/apikey/__tests__/verifier.test.ts +73 -1
- package/src/domain/apikey/verifier.ts +45 -1
- package/src/domain/artifact/__tests__/artifact.test.ts +13 -24
- package/src/domain/channelapp/__tests__/channelapp.test.ts +7 -0
- package/src/domain/channelapp/controller.ts +35 -12
- package/src/domain/environment/__tests__/environment.test.ts +13 -0
- package/src/domain/executioncontext/__tests__/executioncontext.test.ts +2 -0
- package/src/domain/executioncontext/steps.ts +2 -1
- package/src/domain/iampolicy/__tests__/access-lists.test.ts +79 -0
- package/src/domain/iampolicy/__tests__/change.test.ts +63 -0
- package/src/domain/iampolicy/__tests__/controller.test.ts +39 -3
- package/src/domain/iampolicy/__tests__/grant-path.test.ts +595 -27
- package/src/domain/iampolicy/__tests__/iampolicy.test.ts +33 -2
- package/src/domain/iampolicy/__tests__/membership.test.ts +47 -5
- package/src/domain/iampolicy/__tests__/resource-store.test.ts +1 -0
- package/src/domain/iampolicy/__tests__/role-lifecycle.test.ts +41 -8
- package/src/domain/iampolicy/__tests__/roles.test.ts +3 -2
- package/src/domain/iampolicy/__tests__/steps.test.ts +75 -6
- package/src/domain/iampolicy/__tests__/support.ts +68 -4
- package/src/domain/iampolicy/access-lists.ts +70 -2
- package/src/domain/iampolicy/change.ts +109 -0
- package/src/domain/iampolicy/constants.ts +8 -0
- package/src/domain/iampolicy/controller.ts +17 -3
- package/src/domain/iampolicy/grant-path.ts +349 -31
- package/src/domain/iampolicy/membership.ts +32 -12
- package/src/domain/iampolicy/resource-store.ts +4 -0
- package/src/domain/iampolicy/role-lifecycle.ts +2 -0
- package/src/domain/iampolicy/roles.ts +8 -0
- package/src/domain/iampolicy/steps.ts +15 -5
- package/src/domain/iampolicy/store-contract.ts +37 -1
- package/src/domain/iampolicy/store.ts +19 -5
- package/src/domain/identityaccount/__tests__/resolve.test.ts +246 -2
- package/src/domain/identityaccount/__tests__/resource-store.test.ts +1 -1
- package/src/domain/identityaccount/constants.ts +20 -0
- package/src/domain/identityaccount/controller.ts +20 -5
- package/src/domain/identityaccount/resolve.ts +80 -1
- package/src/domain/identityaccount/resource-store.ts +14 -1
- package/src/domain/identityaccount/steps.ts +4 -3
- package/src/domain/identityaccount/store-contract.ts +4 -4
- package/src/domain/identityaccount/store.ts +6 -1
- package/src/domain/mcpserver/__tests__/connect-authorization.test.ts +1 -0
- package/src/domain/mcpserver/__tests__/connect.test.ts +358 -15
- package/src/domain/mcpserver/__tests__/mcpserver.test.ts +2 -0
- package/src/domain/mcpserver/__tests__/oauth-handshake.test.ts +2 -0
- package/src/domain/mcpserver/__tests__/store-faults.test.ts +2 -0
- package/src/domain/mcpserver/connect-sandbox.ts +135 -0
- package/src/domain/mcpserver/connect.ts +226 -56
- package/src/domain/mcpserver/controller.ts +8 -2
- package/src/domain/mcpserver/engine.ts +24 -6
- package/src/domain/mcpserver/start-connect.ts +49 -10
- package/src/domain/memory/__tests__/memory.test.ts +92 -22
- package/src/domain/memory/__tests__/queries.test.ts +173 -0
- package/src/domain/memory/controller.ts +2 -1
- package/src/domain/memory/list-index.ts +32 -0
- package/src/domain/memory/queries.ts +72 -0
- package/src/domain/memory/steps.ts +26 -63
- package/src/domain/oauthapp/__tests__/oauthapp.test.ts +14 -0
- package/src/domain/organization/__tests__/support.ts +41 -0
- package/src/domain/organization/steps.ts +1 -0
- package/src/domain/platformclient/mint.ts +6 -2
- package/src/domain/platformclient/verifier.ts +6 -3
- package/src/domain/plugin/__tests__/plugin.test.ts +11 -24
- package/src/domain/plugin/push.ts +1 -0
- package/src/domain/schedule/__tests__/schedule.composed.test.ts +2 -0
- package/src/domain/schedule/steps.ts +3 -1
- package/src/domain/session/__tests__/session.test.ts +2 -0
- package/src/domain/skill/__tests__/skill.test.ts +7 -25
- package/src/domain/skill/push.ts +1 -0
- package/src/domain/workflow/__tests__/workflow.test.ts +2 -0
- package/src/domain/workflow/registry/data/task-kind-registry.json +27 -1
- package/src/domain/workflowexecution/__tests__/forward-attribution-composed.test.ts +270 -0
- package/src/domain/workflowexecution/__tests__/submit-workflow-task-approval.test.ts +196 -0
- package/src/domain/workflowexecution/__tests__/workflowexecution.test.ts +3 -57
- package/src/domain/workflowexecution/submit-approval.ts +9 -2
- package/src/domain/workflowexecution/submit-file-decision.ts +6 -1
- package/src/domain/workflowexecution/submit-workflow-task-approval.ts +23 -5
- package/src/domain/workflowinstance/controller.ts +27 -9
- package/src/domain/workflowinstance/steps.ts +123 -1
- package/src/extensions/__tests__/apikey-before-sign-in-composed.test.ts +172 -0
- package/src/extensions/__tests__/built-in-authorization-composed.test.ts +80 -1
- package/src/extensions/__tests__/composed-services-composed.test.ts +236 -0
- package/src/extensions/__tests__/extension-composition.test.ts +229 -16
- package/src/extensions/__tests__/identity-account-composed.test.ts +84 -4
- package/src/extensions/__tests__/list-read-scope-composed.test.ts +41 -1
- package/src/extensions/__tests__/registry.test.ts +147 -1
- package/src/extensions/__tests__/secret-cleanup-composed.test.ts +2 -0
- package/src/extensions/__tests__/visitor-classifier-points.test.ts +42 -0
- package/src/extensions/composed-services.ts +61 -0
- package/src/extensions/drivers.ts +33 -1
- package/src/extensions/identity.ts +4 -1
- package/src/extensions/registry.ts +105 -0
- package/src/extensions/resource-authorization.ts +87 -0
- package/src/extensions/resource-row-reader.ts +43 -0
- package/src/extensions/visitor-classifier.ts +41 -0
- package/src/identity/__tests__/oidc-verifier.test.ts +38 -12
- package/src/identity/oidc-userinfo.ts +6 -1
- package/src/identity/oidc-verifier.ts +42 -8
- package/src/index.ts +61 -6
- package/src/pipeline/__tests__/steps.test.ts +31 -4
- package/src/pipeline/errors.ts +30 -16
- package/src/pipeline/interceptors/auth.ts +17 -9
- package/src/pipeline/steps/__tests__/authorization-tuples.test.ts +20 -0
- package/src/pipeline/steps/__tests__/guard-memory-capture.test.ts +72 -15
- package/src/pipeline/steps/authorization-tuples.ts +54 -0
- package/src/pipeline/steps/authorize.ts +6 -5
- package/src/pipeline/steps/defaults.ts +52 -7
- package/src/pipeline/steps/guard-memory-capture.ts +15 -20
- package/src/runnerauth/__tests__/built-in-runner-credential-provider.test.ts +1 -1
- package/src/runnerauth/__tests__/runner-subject-composed.test.ts +13 -0
- package/src/runnerauth/bound-execution.ts +2 -2
- package/src/runnerauth/built-in-runner-credential-provider.ts +8 -21
- package/src/runnerauth/runner-credential-provider.ts +17 -7
- package/src/sandbox/__tests__/docker.integration.test.ts +4 -0
- package/src/sandbox/__tests__/kubernetes.test.ts +18 -1
- package/src/sandbox/__tests__/local-process.integration.test.ts +4 -0
- package/src/sandbox/__tests__/provisioner.test.ts +1 -0
- package/src/sandbox/docker.ts +3 -0
- package/src/sandbox/kubernetes.ts +3 -0
- package/src/sandbox/local-process.ts +4 -0
- package/src/sandbox/provisioner.ts +18 -6
- package/src/store/postgres/__tests__/support.ts +11 -2
- package/src/temporal/README.md +1 -0
- package/src/temporal/__tests__/manager.test.ts +56 -4
- package/src/temporal/__tests__/sdk-log-workflows.ts +26 -0
- package/src/temporal/__tests__/sdk-logger.e2e.test.ts +150 -0
- package/src/temporal/__tests__/sdk-logger.test.ts +238 -0
- package/src/temporal/manager.ts +9 -0
- package/src/temporal/mcpserver/engine-client.ts +8 -3
- package/src/temporal/mcpserver/names.ts +16 -2
- package/src/temporal/sdk-logger.ts +173 -0
- package/dist/authorization/lane-admission.d.ts +0 -50
- package/dist/authorization/lane-admission.d.ts.map +0 -1
- package/dist/authorization/lane-admission.js +0 -13
- package/dist/authorization/lane-admission.js.map +0 -1
- package/src/authorization/__tests__/lane-admission.test.ts +0 -115
- package/src/authorization/lane-admission.ts +0 -73
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pins who a workflow-forwarded HITL decision names (stigmer#1385), over a
|
|
3
|
+
* real boot: a composition verifier and no require-authentication, so the
|
|
4
|
+
* posture stays trusted-local while a presented token is a signed-in
|
|
5
|
+
* person. One boot then holds both identities the forward could carry:
|
|
6
|
+
*
|
|
7
|
+
* - Erin decides through the workflow with her token. The workflow chain
|
|
8
|
+
* forwards over the in-process transport as the server acting for her,
|
|
9
|
+
* so the child agent execution records HER as the approver and the
|
|
10
|
+
* file reviewer — not the in-process default, which is the
|
|
11
|
+
* trusted-local operator and is what every forward named before this
|
|
12
|
+
* fix (the workflow API promises the caller identity propagates).
|
|
13
|
+
* - A tokenless decision on an agent run directly is the laptop's
|
|
14
|
+
* operator, recorded as its audit actor is (the trusted-local arm).
|
|
15
|
+
*
|
|
16
|
+
* The child's authorization is not re-run as Erin — the forward stays the
|
|
17
|
+
* server's own act — so the seeded child needs no session she owns. The
|
|
18
|
+
* direct-call arms (every action, APPROVE_ALL's co-pending calls, both
|
|
19
|
+
* file-decision scopes) are pinned in
|
|
20
|
+
* domain/agentexecution/__tests__/agentexecution.test.ts.
|
|
21
|
+
*/
|
|
22
|
+
import { mkdtempSync, rmSync } from "node:fs";
|
|
23
|
+
import { tmpdir } from "node:os";
|
|
24
|
+
import path from "node:path";
|
|
25
|
+
|
|
26
|
+
import { create } from "@bufbuild/protobuf";
|
|
27
|
+
import type { MessageInitShape } from "@bufbuild/protobuf";
|
|
28
|
+
import { createClient } from "@connectrpc/connect";
|
|
29
|
+
import { afterAll, beforeAll, describe, expect, it } from "vitest";
|
|
30
|
+
|
|
31
|
+
import { AgentExecutionSchema } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
|
|
32
|
+
import type {
|
|
33
|
+
AgentExecution,
|
|
34
|
+
AgentExecutionStatusSchema,
|
|
35
|
+
} from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
|
|
36
|
+
import { AgentExecutionCommandController } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/command_pb";
|
|
37
|
+
import {
|
|
38
|
+
ApprovalAction,
|
|
39
|
+
ExecutionPhase as AgentExecutionPhase,
|
|
40
|
+
FileDecisionAction,
|
|
41
|
+
FileDecisionScope,
|
|
42
|
+
ToolCallStatus,
|
|
43
|
+
} from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
44
|
+
import {
|
|
45
|
+
WorkflowExecutionSchema,
|
|
46
|
+
WorkflowPendingApprovalSchema,
|
|
47
|
+
WorkflowPendingFileReviewSchema,
|
|
48
|
+
} from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/api_pb";
|
|
49
|
+
import type { WorkflowExecutionStatusSchema } from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/api_pb";
|
|
50
|
+
import { WorkflowExecutionCommandController } from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/command_pb";
|
|
51
|
+
import { ExecutionPhase } from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/enum_pb";
|
|
52
|
+
import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
|
|
53
|
+
|
|
54
|
+
import { loadConfig } from "../../../boot/config.js";
|
|
55
|
+
import { composeServer } from "../../../boot/compose.js";
|
|
56
|
+
import type { ComposedServer } from "../../../boot/compose.js";
|
|
57
|
+
import type { ServerExtension } from "../../../extensions/registry.js";
|
|
58
|
+
import {
|
|
59
|
+
baseConfig,
|
|
60
|
+
fakeJwt,
|
|
61
|
+
fakeVerifier,
|
|
62
|
+
silentLogger,
|
|
63
|
+
transportFor,
|
|
64
|
+
} from "../../../extensions/__tests__/composed-support.js";
|
|
65
|
+
import { trustedLocalIdentity } from "../../../pipeline/interceptors/auth.js";
|
|
66
|
+
import { fileReviewSeed } from "../../agentexecution/__tests__/file-review-seed.js";
|
|
67
|
+
|
|
68
|
+
const ERIN = "fake|erin";
|
|
69
|
+
const ORG = "forward-attribution-org";
|
|
70
|
+
|
|
71
|
+
describe("a workflow-forwarded decision names the person who made it (composed server)", () => {
|
|
72
|
+
let dir: string;
|
|
73
|
+
let server: ComposedServer;
|
|
74
|
+
let port: number;
|
|
75
|
+
let counter = 0;
|
|
76
|
+
|
|
77
|
+
const asErin = () =>
|
|
78
|
+
createClient(
|
|
79
|
+
WorkflowExecutionCommandController,
|
|
80
|
+
transportFor(port, fakeJwt(ERIN, "erin@example.com")),
|
|
81
|
+
);
|
|
82
|
+
|
|
83
|
+
beforeAll(async () => {
|
|
84
|
+
dir = mkdtempSync(path.join(tmpdir(), "wfexec-forward-attribution-"));
|
|
85
|
+
// A verifier and nothing else: no require-authentication and no
|
|
86
|
+
// Authorizer, so the posture is trusted-local and tokenless requests
|
|
87
|
+
// still reach the laptop's operator.
|
|
88
|
+
const unit: ServerExtension = {
|
|
89
|
+
name: "fake-verifier-only",
|
|
90
|
+
identityVerifiers: [fakeVerifier],
|
|
91
|
+
};
|
|
92
|
+
server = await composeServer({
|
|
93
|
+
config: loadConfig(baseConfig(dir)),
|
|
94
|
+
logger: silentLogger,
|
|
95
|
+
extensions: [unit],
|
|
96
|
+
portOverride: 0,
|
|
97
|
+
host: "127.0.0.1",
|
|
98
|
+
});
|
|
99
|
+
port = await server.start();
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
afterAll(async () => {
|
|
103
|
+
await server.shutdown();
|
|
104
|
+
rmSync(dir, { recursive: true, force: true });
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
function nextId(prefix: string): string {
|
|
108
|
+
counter += 1;
|
|
109
|
+
return `${prefix}_${counter}`;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
async function saveChild(
|
|
113
|
+
id: string,
|
|
114
|
+
status: MessageInitShape<typeof AgentExecutionStatusSchema>,
|
|
115
|
+
): Promise<void> {
|
|
116
|
+
const slug = id.replaceAll("_", "-");
|
|
117
|
+
await server.store.saveResource(
|
|
118
|
+
ApiResourceKind.agent_execution,
|
|
119
|
+
id,
|
|
120
|
+
AgentExecutionSchema,
|
|
121
|
+
create(AgentExecutionSchema, {
|
|
122
|
+
apiVersion: "agentic.stigmer.ai/v1",
|
|
123
|
+
kind: "AgentExecution",
|
|
124
|
+
metadata: { id, name: slug, slug, org: ORG },
|
|
125
|
+
spec: { message: "Say hello." },
|
|
126
|
+
status,
|
|
127
|
+
}),
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
async function saveParent(
|
|
132
|
+
status: MessageInitShape<typeof WorkflowExecutionStatusSchema>,
|
|
133
|
+
): Promise<string> {
|
|
134
|
+
const id = nextId("wfexec_fwd");
|
|
135
|
+
const slug = id.replaceAll("_", "-");
|
|
136
|
+
await server.store.saveResource(
|
|
137
|
+
ApiResourceKind.workflow_execution,
|
|
138
|
+
id,
|
|
139
|
+
WorkflowExecutionSchema,
|
|
140
|
+
create(WorkflowExecutionSchema, {
|
|
141
|
+
apiVersion: "agentic.stigmer.ai/v1",
|
|
142
|
+
kind: "WorkflowExecution",
|
|
143
|
+
metadata: { id, name: slug, slug, org: ORG },
|
|
144
|
+
spec: { workflowId: `wf_${id}`, workflowInstanceId: `wfi_${id}` },
|
|
145
|
+
status,
|
|
146
|
+
}),
|
|
147
|
+
);
|
|
148
|
+
return id;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
async function loadChild(id: string): Promise<AgentExecution> {
|
|
152
|
+
return server.store.getResource(
|
|
153
|
+
ApiResourceKind.agent_execution,
|
|
154
|
+
id,
|
|
155
|
+
AgentExecutionSchema,
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
it("an approval forwarded through the workflow records the person on the child", async () => {
|
|
160
|
+
const childId = nextId("aexec_fwd_gated");
|
|
161
|
+
await saveChild(childId, {
|
|
162
|
+
phase: AgentExecutionPhase.EXECUTION_WAITING_FOR_APPROVAL,
|
|
163
|
+
messages: [
|
|
164
|
+
{
|
|
165
|
+
toolCalls: [
|
|
166
|
+
{
|
|
167
|
+
id: "tc-fwd",
|
|
168
|
+
name: "Write",
|
|
169
|
+
status: ToolCallStatus.TOOL_CALL_WAITING_APPROVAL,
|
|
170
|
+
requiresApproval: true,
|
|
171
|
+
},
|
|
172
|
+
],
|
|
173
|
+
},
|
|
174
|
+
],
|
|
175
|
+
});
|
|
176
|
+
const parentId = await saveParent({
|
|
177
|
+
phase: ExecutionPhase.EXECUTION_IN_PROGRESS,
|
|
178
|
+
pendingApprovals: [
|
|
179
|
+
create(WorkflowPendingApprovalSchema, {
|
|
180
|
+
approval: { toolCallId: "tc-fwd", toolName: "Write" },
|
|
181
|
+
childAgentExecutionId: childId,
|
|
182
|
+
}),
|
|
183
|
+
],
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
await asErin().submitApproval({
|
|
187
|
+
executionId: parentId,
|
|
188
|
+
toolCallId: "tc-fwd",
|
|
189
|
+
action: ApprovalAction.APPROVE,
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
const child = await loadChild(childId);
|
|
193
|
+
const tc = child.status?.messages[0]?.toolCalls[0];
|
|
194
|
+
expect(tc?.approvalAction).toBe(ApprovalAction.APPROVE);
|
|
195
|
+
expect(tc?.approvedBy, "the person, not the in-process default").toBe(ERIN);
|
|
196
|
+
const decided = (child.status?.approvalEventStream?.events ?? []).find(
|
|
197
|
+
(ev) =>
|
|
198
|
+
ev.approvalRequestId === "tc-fwd" && ev.payload.case === "decided",
|
|
199
|
+
);
|
|
200
|
+
expect(
|
|
201
|
+
decided?.payload.case === "decided"
|
|
202
|
+
? decided.payload.value.decidedBy
|
|
203
|
+
: undefined,
|
|
204
|
+
).toBe(ERIN);
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
it("a file decision forwarded through the workflow records the person as the reviewer", async () => {
|
|
208
|
+
const childId = nextId("aexec_fwd_review");
|
|
209
|
+
const changeSetId = nextId("cs_fwd");
|
|
210
|
+
const { status, aggregate } = fileReviewSeed(childId, changeSetId);
|
|
211
|
+
await saveChild(childId, status);
|
|
212
|
+
const parentId = await saveParent({
|
|
213
|
+
phase: ExecutionPhase.EXECUTION_IN_PROGRESS,
|
|
214
|
+
pendingFileReviews: [
|
|
215
|
+
create(WorkflowPendingFileReviewSchema, {
|
|
216
|
+
childAgentExecutionId: childId,
|
|
217
|
+
changeSetId: [changeSetId],
|
|
218
|
+
}),
|
|
219
|
+
],
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
await asErin().submitFileDecision({
|
|
223
|
+
executionId: parentId,
|
|
224
|
+
childAgentExecutionId: childId,
|
|
225
|
+
changeSetId,
|
|
226
|
+
scope: FileDecisionScope.CHANGE_SET,
|
|
227
|
+
action: FileDecisionAction.APPROVE,
|
|
228
|
+
expectedDigest: aggregate,
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
const child = await loadChild(childId);
|
|
232
|
+
const decisions =
|
|
233
|
+
child.status?.fileChangeSets.find((cs) => cs.id === changeSetId)
|
|
234
|
+
?.decisions ?? [];
|
|
235
|
+
expect(decisions).toHaveLength(1);
|
|
236
|
+
expect(decisions[0]?.reviewerId).toBe(ERIN);
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
it("a tokenless decision on the agent run is the laptop's operator", async () => {
|
|
240
|
+
const childId = nextId("aexec_local");
|
|
241
|
+
await saveChild(childId, {
|
|
242
|
+
phase: AgentExecutionPhase.EXECUTION_WAITING_FOR_APPROVAL,
|
|
243
|
+
messages: [
|
|
244
|
+
{
|
|
245
|
+
toolCalls: [
|
|
246
|
+
{
|
|
247
|
+
id: "tc-local",
|
|
248
|
+
name: "Write",
|
|
249
|
+
status: ToolCallStatus.TOOL_CALL_WAITING_APPROVAL,
|
|
250
|
+
requiresApproval: true,
|
|
251
|
+
},
|
|
252
|
+
],
|
|
253
|
+
},
|
|
254
|
+
],
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
const result = await createClient(
|
|
258
|
+
AgentExecutionCommandController,
|
|
259
|
+
transportFor(port),
|
|
260
|
+
).submitApproval({
|
|
261
|
+
agentExecutionId: childId,
|
|
262
|
+
toolCallId: "tc-local",
|
|
263
|
+
action: ApprovalAction.APPROVE,
|
|
264
|
+
});
|
|
265
|
+
|
|
266
|
+
expect(result.status?.messages[0]?.toolCalls[0]?.approvedBy).toBe(
|
|
267
|
+
trustedLocalIdentity().identityId,
|
|
268
|
+
);
|
|
269
|
+
});
|
|
270
|
+
});
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pins who a workflow human_input decision names (stigmer#1415): the
|
|
3
|
+
* reviewer and reviewer_actor that submitWorkflowTaskApproval puts on the
|
|
4
|
+
* relay signal are the caller the chain authorized, never the client's
|
|
5
|
+
* `reviewer` field. One arm per caller shape the editions produce — a
|
|
6
|
+
* person with and without a client-supplied name, a PlatformClient user
|
|
7
|
+
* token (a person spoken for by a third-party client), and a composition's
|
|
8
|
+
* own lane class — each read from the payload the stub engine recorded.
|
|
9
|
+
* The validation and phase arms, and the engineless refusal, are pinned
|
|
10
|
+
* over the wire in workflowexecution.test.ts.
|
|
11
|
+
*/
|
|
12
|
+
import { newPermissiveSingleTeamAuthorizer } from "../../../pipeline/steps/authorize.js";
|
|
13
|
+
import { testCallerIdentity } from "../../../pipeline/__tests__/support.js";
|
|
14
|
+
import { mkdtempSync, rmSync } from "node:fs";
|
|
15
|
+
import { tmpdir } from "node:os";
|
|
16
|
+
import path from "node:path";
|
|
17
|
+
|
|
18
|
+
import { create } from "@bufbuild/protobuf";
|
|
19
|
+
import { afterAll, beforeAll, describe, expect, it } from "vitest";
|
|
20
|
+
|
|
21
|
+
import { WorkflowExecutionSchema } from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/api_pb";
|
|
22
|
+
import {
|
|
23
|
+
ExecutionPhase,
|
|
24
|
+
WorkflowTaskStatus,
|
|
25
|
+
WorkflowTaskType,
|
|
26
|
+
} from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/enum_pb";
|
|
27
|
+
import { SubmitWorkflowTaskApprovalInputSchema } from "@stigmer/protos/ai/stigmer/agentic/workflowexecution/v1/io_pb";
|
|
28
|
+
import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
|
|
29
|
+
|
|
30
|
+
import { createLogger } from "../../../boot/logger.js";
|
|
31
|
+
import type { CallerIdentity } from "../../../extensions/identity.js";
|
|
32
|
+
import { SqliteStore } from "../../../store/sqlite/store.js";
|
|
33
|
+
|
|
34
|
+
import {
|
|
35
|
+
HUMAN_INPUT_SIGNAL_PREFIX,
|
|
36
|
+
RELAY_SIGNAL_CHANNEL_NAME,
|
|
37
|
+
} from "../constants.js";
|
|
38
|
+
import { submitWorkflowTaskApproval } from "../submit-workflow-task-approval.js";
|
|
39
|
+
import { stubConnectedEngine } from "./engine-stub.js";
|
|
40
|
+
|
|
41
|
+
const GATE = "manager_approval";
|
|
42
|
+
|
|
43
|
+
const silentLogger = createLogger({
|
|
44
|
+
level: "error",
|
|
45
|
+
pretty: false,
|
|
46
|
+
write: () => {},
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
let dir: string;
|
|
50
|
+
let store: SqliteStore;
|
|
51
|
+
let counter = 0;
|
|
52
|
+
|
|
53
|
+
beforeAll(() => {
|
|
54
|
+
dir = mkdtempSync(path.join(tmpdir(), "wfexec-task-approval-"));
|
|
55
|
+
store = SqliteStore.open(path.join(dir, "test.db"));
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
afterAll(async () => {
|
|
59
|
+
await store.close();
|
|
60
|
+
rmSync(dir, { recursive: true, force: true });
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
/** A running execution whose one task is a human_input gate awaiting a decision. */
|
|
64
|
+
async function seedGate(): Promise<string> {
|
|
65
|
+
counter += 1;
|
|
66
|
+
const id = `wfx_gate_${counter}`;
|
|
67
|
+
await store.saveResource(
|
|
68
|
+
ApiResourceKind.workflow_execution,
|
|
69
|
+
id,
|
|
70
|
+
WorkflowExecutionSchema,
|
|
71
|
+
create(WorkflowExecutionSchema, {
|
|
72
|
+
metadata: { id, name: id, org: "acme" },
|
|
73
|
+
spec: {
|
|
74
|
+
workflowId: `wf_${counter}`,
|
|
75
|
+
workflowInstanceId: `wfi_${counter}`,
|
|
76
|
+
},
|
|
77
|
+
status: {
|
|
78
|
+
phase: ExecutionPhase.EXECUTION_IN_PROGRESS,
|
|
79
|
+
temporalWorkflowId: `temporal_${counter}`,
|
|
80
|
+
tasks: [
|
|
81
|
+
{
|
|
82
|
+
taskName: GATE,
|
|
83
|
+
taskType: WorkflowTaskType.WORKFLOW_TASK_APPROVAL,
|
|
84
|
+
status: WorkflowTaskStatus.WORKFLOW_TASK_WAITING_APPROVAL,
|
|
85
|
+
},
|
|
86
|
+
],
|
|
87
|
+
},
|
|
88
|
+
}),
|
|
89
|
+
);
|
|
90
|
+
return id;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** Submits a decision as `caller` and returns the human_input payload the engine was handed. */
|
|
94
|
+
async function decide(
|
|
95
|
+
caller: CallerIdentity,
|
|
96
|
+
clientReviewer = "",
|
|
97
|
+
): Promise<Record<string, unknown>> {
|
|
98
|
+
const engine = stubConnectedEngine();
|
|
99
|
+
await submitWorkflowTaskApproval(
|
|
100
|
+
{
|
|
101
|
+
store,
|
|
102
|
+
logger: silentLogger,
|
|
103
|
+
authorizer: newPermissiveSingleTeamAuthorizer(),
|
|
104
|
+
engineState: () => engine.state,
|
|
105
|
+
},
|
|
106
|
+
create(SubmitWorkflowTaskApprovalInputSchema, {
|
|
107
|
+
executionId: await seedGate(),
|
|
108
|
+
taskName: GATE,
|
|
109
|
+
outcome: "approve",
|
|
110
|
+
reviewer: clientReviewer,
|
|
111
|
+
}),
|
|
112
|
+
caller,
|
|
113
|
+
);
|
|
114
|
+
|
|
115
|
+
const starts = engine.calls.filter(
|
|
116
|
+
(call) => call.method === "signalWithStart",
|
|
117
|
+
);
|
|
118
|
+
expect(starts).toHaveLength(1);
|
|
119
|
+
const [, channel, envelope] = starts[0]!.args as [
|
|
120
|
+
unknown,
|
|
121
|
+
string,
|
|
122
|
+
{ signalName: string; payload: Record<string, unknown> },
|
|
123
|
+
];
|
|
124
|
+
expect(channel).toBe(RELAY_SIGNAL_CHANNEL_NAME);
|
|
125
|
+
expect(envelope.signalName).toBe(HUMAN_INPUT_SIGNAL_PREFIX + GATE);
|
|
126
|
+
return envelope.payload;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
describe("submitWorkflowTaskApproval reviewer attribution (stigmer#1415)", () => {
|
|
130
|
+
it("a person who names no reviewer is recorded as themselves, with their display snapshot", async () => {
|
|
131
|
+
const payload = await decide(
|
|
132
|
+
testCallerIdentity({
|
|
133
|
+
identityId: "ia_erin",
|
|
134
|
+
email: "erin@example.com",
|
|
135
|
+
displayName: "Erin Example",
|
|
136
|
+
}),
|
|
137
|
+
);
|
|
138
|
+
|
|
139
|
+
expect(payload["outcome"]).toBe("approve");
|
|
140
|
+
expect(payload["reviewer"]).toBe("ia_erin");
|
|
141
|
+
expect(payload["reviewer_actor"]).toEqual({
|
|
142
|
+
id: "ia_erin",
|
|
143
|
+
display_name: "Erin Example",
|
|
144
|
+
email: "erin@example.com",
|
|
145
|
+
avatar: "",
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
it("a person who names someone else is still recorded as themselves", async () => {
|
|
150
|
+
const payload = await decide(
|
|
151
|
+
testCallerIdentity({ identityId: "ia_erin", email: "erin@example.com" }),
|
|
152
|
+
"ia_someone_else",
|
|
153
|
+
);
|
|
154
|
+
|
|
155
|
+
expect(payload["reviewer"]).toBe("ia_erin");
|
|
156
|
+
expect(payload["reviewer_actor"]).toEqual({
|
|
157
|
+
id: "ia_erin",
|
|
158
|
+
display_name: "",
|
|
159
|
+
email: "erin@example.com",
|
|
160
|
+
avatar: "",
|
|
161
|
+
});
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
it("a PlatformClient user token records the end user it names, not the client", async () => {
|
|
165
|
+
const payload = await decide(
|
|
166
|
+
testCallerIdentity({
|
|
167
|
+
identityId: "ia_end_user",
|
|
168
|
+
email: "user@partner.example",
|
|
169
|
+
platformClientId: "pcl_partner",
|
|
170
|
+
}),
|
|
171
|
+
);
|
|
172
|
+
|
|
173
|
+
expect(payload["reviewer"]).toBe("ia_end_user");
|
|
174
|
+
expect(payload["reviewer_actor"]).toEqual({
|
|
175
|
+
id: "ia_end_user",
|
|
176
|
+
display_name: "",
|
|
177
|
+
email: "user@partner.example",
|
|
178
|
+
avatar: "",
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
it("a composition's own lane class is attributed to its principal, whatever it sends", async () => {
|
|
183
|
+
const payload = await decide(
|
|
184
|
+
testCallerIdentity({ identityId: "ia_broker", callerClass: "channel" }),
|
|
185
|
+
"U_SLACK_USER",
|
|
186
|
+
);
|
|
187
|
+
|
|
188
|
+
expect(payload["reviewer"]).toBe("ia_broker");
|
|
189
|
+
expect(payload["reviewer_actor"]).toEqual({
|
|
190
|
+
id: "ia_broker",
|
|
191
|
+
display_name: "",
|
|
192
|
+
email: "",
|
|
193
|
+
avatar: "",
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
});
|
|
@@ -41,14 +41,9 @@ import { afterAll, beforeAll, describe, expect, it, vi } from "vitest";
|
|
|
41
41
|
import { AgentExecutionSchema } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/api_pb";
|
|
42
42
|
import {
|
|
43
43
|
ApprovalAction,
|
|
44
|
-
DiffCompleteness,
|
|
45
|
-
ExecutionPhase as AgentExecutionPhase,
|
|
46
|
-
FileChangeKind,
|
|
47
44
|
FileDecisionAction,
|
|
48
45
|
FileDecisionScope,
|
|
49
|
-
FileReviewEventType,
|
|
50
46
|
} from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
|
|
51
|
-
import { CapturedFileChangeSchema } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/filereview_pb";
|
|
52
47
|
import { WorkflowSchema } from "@stigmer/protos/ai/stigmer/agentic/workflow/v1/api_pb";
|
|
53
48
|
import {
|
|
54
49
|
WorkflowExecutionSchema,
|
|
@@ -77,10 +72,7 @@ import { loadConfig } from "../../../boot/config.js";
|
|
|
77
72
|
import { composeServer } from "../../../boot/compose.js";
|
|
78
73
|
import type { ComposedServer } from "../../../boot/compose.js";
|
|
79
74
|
import { createLogger } from "../../../boot/logger.js";
|
|
80
|
-
import {
|
|
81
|
-
aggregateDigest,
|
|
82
|
-
fileDigest,
|
|
83
|
-
} from "../../agentexecution/filereview/digest.js";
|
|
75
|
+
import { fileReviewSeed } from "../../agentexecution/__tests__/file-review-seed.js";
|
|
84
76
|
import type { WorkflowExecutionEventRecord } from "../../../store/interface.js";
|
|
85
77
|
|
|
86
78
|
const silentLogger = createLogger({
|
|
@@ -1254,20 +1246,6 @@ describe("submitApproval over the wire (forwarding through the REAL in-process e
|
|
|
1254
1246
|
});
|
|
1255
1247
|
|
|
1256
1248
|
describe("submitFileDecision over the wire (propagation through the REAL in-process edge)", () => {
|
|
1257
|
-
function buildChange() {
|
|
1258
|
-
const change = create(CapturedFileChangeSchema, {
|
|
1259
|
-
id: "fc-1",
|
|
1260
|
-
pathBefore: "src/a.ts",
|
|
1261
|
-
pathAfter: "src/a.ts",
|
|
1262
|
-
kind: FileChangeKind.MODIFY,
|
|
1263
|
-
beforeSha256: "a".repeat(64),
|
|
1264
|
-
afterSha256: "b".repeat(64),
|
|
1265
|
-
diffComplete: true,
|
|
1266
|
-
});
|
|
1267
|
-
change.fileDigest = fileDigest(change);
|
|
1268
|
-
return change;
|
|
1269
|
-
}
|
|
1270
|
-
|
|
1271
1249
|
async function seedChildWithLedger(): Promise<{
|
|
1272
1250
|
childId: string;
|
|
1273
1251
|
changeSetId: string;
|
|
@@ -1276,8 +1254,7 @@ describe("submitFileDecision over the wire (propagation through the REAL in-proc
|
|
|
1276
1254
|
counter += 1;
|
|
1277
1255
|
const childId = `aexec_wf_child_${counter}`;
|
|
1278
1256
|
const changeSetId = `cs_wf_${counter}`;
|
|
1279
|
-
const
|
|
1280
|
-
const aggregate = aggregateDigest([change]);
|
|
1257
|
+
const { status, aggregate } = fileReviewSeed(childId, changeSetId);
|
|
1281
1258
|
await server.store.saveResource(
|
|
1282
1259
|
ApiResourceKind.agent_execution,
|
|
1283
1260
|
childId,
|
|
@@ -1292,38 +1269,7 @@ describe("submitFileDecision over the wire (propagation through the REAL in-proc
|
|
|
1292
1269
|
org: ORG,
|
|
1293
1270
|
},
|
|
1294
1271
|
spec: { message: "Say hello." },
|
|
1295
|
-
status
|
|
1296
|
-
phase: AgentExecutionPhase.EXECUTION_WAITING_FOR_APPROVAL,
|
|
1297
|
-
fileReviewEventStream: {
|
|
1298
|
-
executionId: childId,
|
|
1299
|
-
events: [
|
|
1300
|
-
{
|
|
1301
|
-
eventId: `${changeSetId}:${changeSetId}:BASELINE`,
|
|
1302
|
-
changeSetId,
|
|
1303
|
-
eventType: FileReviewEventType.BASELINE_CAPTURED,
|
|
1304
|
-
actor: "runner",
|
|
1305
|
-
payload: {
|
|
1306
|
-
case: "baselineCaptured",
|
|
1307
|
-
value: { turnId: "turn-1", harnessId: "harness-1" },
|
|
1308
|
-
},
|
|
1309
|
-
},
|
|
1310
|
-
{
|
|
1311
|
-
eventId: `${changeSetId}:${changeSetId}:CANDIDATE`,
|
|
1312
|
-
changeSetId,
|
|
1313
|
-
eventType: FileReviewEventType.CANDIDATE_CAPTURED,
|
|
1314
|
-
actor: "runner",
|
|
1315
|
-
payload: {
|
|
1316
|
-
case: "candidateCaptured",
|
|
1317
|
-
value: {
|
|
1318
|
-
changes: [change],
|
|
1319
|
-
aggregateDigest: aggregate,
|
|
1320
|
-
diffCompleteness: DiffCompleteness.COMPLETE,
|
|
1321
|
-
},
|
|
1322
|
-
},
|
|
1323
|
-
},
|
|
1324
|
-
],
|
|
1325
|
-
},
|
|
1326
|
-
},
|
|
1272
|
+
status,
|
|
1327
1273
|
}),
|
|
1328
1274
|
);
|
|
1329
1275
|
return { childId, changeSetId, aggregate };
|
|
@@ -45,10 +45,16 @@ import type { Store } from "../../store/interface.js";
|
|
|
45
45
|
* The narrow agentexecution forwarding edge (Go
|
|
46
46
|
* AgentExecutionApprovalClient) — method-segregated from the
|
|
47
47
|
* file-decision edge so each handler depends only on the RPC it uses;
|
|
48
|
-
* the in-process agentexecution controller satisfies both.
|
|
48
|
+
* the in-process agentexecution controller satisfies both. `caller` is
|
|
49
|
+
* the identity this chain authorized: the child records it as the
|
|
50
|
+
* decider (stigmer/stigmer#1385), so a decision made through a workflow
|
|
51
|
+
* names the same person as one made on the agent run directly.
|
|
49
52
|
*/
|
|
50
53
|
export interface AgentExecutionApprovalForwarder {
|
|
51
|
-
submitApproval(
|
|
54
|
+
submitApproval(
|
|
55
|
+
input: AgentSubmitApprovalInput,
|
|
56
|
+
caller: CallerIdentity,
|
|
57
|
+
): Promise<AgentExecution>;
|
|
52
58
|
}
|
|
53
59
|
export type AgentExecutionApprovalForwarderProvider =
|
|
54
60
|
() => AgentExecutionApprovalForwarder;
|
|
@@ -159,6 +165,7 @@ export async function submitApproval(
|
|
|
159
165
|
action: ctx.input.action,
|
|
160
166
|
comment: ctx.input.comment,
|
|
161
167
|
}),
|
|
168
|
+
ctx.callerIdentity,
|
|
162
169
|
);
|
|
163
170
|
} catch (error) {
|
|
164
171
|
// Flattened to Unavailable; Go's %v embeds the child's grpc-go
|
|
@@ -42,11 +42,15 @@ import type { Store } from "../../store/interface.js";
|
|
|
42
42
|
/**
|
|
43
43
|
* The narrow agentexecution file-decision edge (Go
|
|
44
44
|
* AgentExecutionFileDecisionClient) — method-segregated from the approval
|
|
45
|
-
* edge; the in-process agentexecution controller satisfies both.
|
|
45
|
+
* edge; the in-process agentexecution controller satisfies both. `caller`
|
|
46
|
+
* is the identity this chain authorized, which the child records as the
|
|
47
|
+
* reviewer (the contract on SubmitWorkflowFileDecisionInput: the caller
|
|
48
|
+
* identity propagates; stigmer/stigmer#1385).
|
|
46
49
|
*/
|
|
47
50
|
export interface AgentExecutionFileDecisionForwarder {
|
|
48
51
|
submitFileDecision(
|
|
49
52
|
input: AgentSubmitFileDecisionInput,
|
|
53
|
+
caller: CallerIdentity,
|
|
50
54
|
): Promise<AgentExecution>;
|
|
51
55
|
}
|
|
52
56
|
export type AgentExecutionFileDecisionForwarderProvider =
|
|
@@ -154,6 +158,7 @@ export async function submitFileDecision(
|
|
|
154
158
|
reason: ctx.input.reason,
|
|
155
159
|
acknowledgeUnreviewable: ctx.input.acknowledgeUnreviewable,
|
|
156
160
|
}),
|
|
161
|
+
ctx.callerIdentity,
|
|
157
162
|
);
|
|
158
163
|
} catch (error) {
|
|
159
164
|
// Propagate the child's STATUS unchanged (code + message) — its
|
|
@@ -10,10 +10,17 @@
|
|
|
10
10
|
* carries status.temporal_workflow_id (NOT spec.workflow_id — every other
|
|
11
11
|
* sender passes the spec reference).
|
|
12
12
|
*
|
|
13
|
-
* Reviewer attribution:
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* caller.
|
|
13
|
+
* Reviewer attribution (stigmer#1415): the decision names the principal
|
|
14
|
+
* the chain authorized, the id `auditActorFor` stamps as `created_by.id`,
|
|
15
|
+
* with that caller's display snapshot as `reviewer_actor`, in every
|
|
16
|
+
* edition and for every caller class. The client-supplied
|
|
17
|
+
* `SubmitWorkflowTaskApprovalInput.reviewer` is never read: a person's
|
|
18
|
+
* value is spoofable, and no caller in either edition decides on someone
|
|
19
|
+
* else's behalf, so delegated attribution waits for the lane that needs it
|
|
20
|
+
* and is keyed on that lane's own class (the io.proto field comment). On a
|
|
21
|
+
* laptop the reviewer is the trusted-local operator, exactly as every
|
|
22
|
+
* laptop resource's `created_by` is. The runner carries both keys opaquely
|
|
23
|
+
* into the task output and the approval_resolved event.
|
|
17
24
|
*/
|
|
18
25
|
import type { JsonValue } from "@bufbuild/protobuf";
|
|
19
26
|
|
|
@@ -38,6 +45,7 @@ import {
|
|
|
38
45
|
import { newPipeline } from "../../pipeline/pipeline.js";
|
|
39
46
|
import type { Authorizer } from "../../extensions/authorizer.js";
|
|
40
47
|
import { newAuthorizeStep } from "../../pipeline/steps/authorize.js";
|
|
48
|
+
import { auditActorFor } from "../../pipeline/steps/defaults.js";
|
|
41
49
|
import type { CallerIdentity } from "../../extensions/identity.js";
|
|
42
50
|
import { RequestContext } from "../../pipeline/request-context.js";
|
|
43
51
|
import { ResourceNotFoundError } from "../../store/interface.js";
|
|
@@ -160,9 +168,18 @@ export async function submitWorkflowTaskApproval(
|
|
|
160
168
|
const humanInputSignalName =
|
|
161
169
|
HUMAN_INPUT_SIGNAL_PREFIX + ctx.input.taskName;
|
|
162
170
|
|
|
171
|
+
const reviewer = auditActorFor(ctx.callerIdentity);
|
|
163
172
|
const signalPayload: Record<string, JsonValue> = {
|
|
164
173
|
outcome: ctx.input.outcome,
|
|
165
|
-
reviewer:
|
|
174
|
+
reviewer: reviewer.id,
|
|
175
|
+
// The runner's HumanInputReviewerActor keys (snake_case, as the
|
|
176
|
+
// rest of the payload); the actor's platform_client_id has no slot.
|
|
177
|
+
reviewer_actor: {
|
|
178
|
+
id: reviewer.id,
|
|
179
|
+
display_name: reviewer.displayName,
|
|
180
|
+
email: reviewer.email,
|
|
181
|
+
avatar: reviewer.avatar,
|
|
182
|
+
},
|
|
166
183
|
// Go time.Now().UTC().Format(time.RFC3339): seconds precision.
|
|
167
184
|
responded_at: new Date().toISOString().replace(/\.\d{3}Z$/, "Z"),
|
|
168
185
|
};
|
|
@@ -204,6 +221,7 @@ export async function submitWorkflowTaskApproval(
|
|
|
204
221
|
executionId,
|
|
205
222
|
taskName: ctx.input.taskName,
|
|
206
223
|
outcome: ctx.input.outcome,
|
|
224
|
+
reviewer: reviewer.id,
|
|
207
225
|
signalName: humanInputSignalName,
|
|
208
226
|
},
|
|
209
227
|
);
|