@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
|
@@ -17,10 +17,12 @@
|
|
|
17
17
|
* Every chain opens with Authorize; create and delete run the shared
|
|
18
18
|
* tuple-lifecycle steps against the composed lifecycle; getByReference
|
|
19
19
|
* loads, then authorizes the loaded app exactly as `get` would
|
|
20
|
-
* (AuthorizeResolvedTarget). listByOrg
|
|
21
|
-
* list read scope
|
|
22
|
-
*
|
|
23
|
-
*
|
|
20
|
+
* (AuthorizeResolvedTarget). listByOrg narrows the organization's apps
|
|
21
|
+
* through the composed list read scope to the ones a `get` would return:
|
|
22
|
+
* the model shows a channel app to the organization's admins and explicit
|
|
23
|
+
* grants, never to plain members or viewers, and never to a creator who is
|
|
24
|
+
* no longer an admin (fga/model/agentic/channel_app.fga,
|
|
25
|
+
* stigmer/stigmer#1384, #1409). Per-RPC
|
|
24
26
|
* posture: docs/authorization-coverage.md §13.
|
|
25
27
|
*
|
|
26
28
|
* Proven by channelapp.conformance.test.ts (CONFORMANCE_TARGET=local)
|
|
@@ -47,6 +49,8 @@ import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/
|
|
|
47
49
|
|
|
48
50
|
import type { Logger } from "../../boot/logger.js";
|
|
49
51
|
import type { Authorizer } from "../../extensions/authorizer.js";
|
|
52
|
+
import type { ListReadScope } from "../../extensions/list-read-scope.js";
|
|
53
|
+
import { restrictListByReadScope } from "../../extensions/list-read-scope.js";
|
|
50
54
|
import type { ResourceAuthorizationLifecycle } from "../../extensions/resource-authorization.js";
|
|
51
55
|
import type { SecretService } from "../../encryption/encryption.js";
|
|
52
56
|
import { apiResourceKindKey } from "../../pipeline/interceptors/apiresource.js";
|
|
@@ -111,6 +115,8 @@ export interface ChannelAppControllerDeps {
|
|
|
111
115
|
/** The composed tuple-lifecycle driver — undefined = the shared steps no-op (C2). */
|
|
112
116
|
readonly authorizationLifecycle: ResourceAuthorizationLifecycle | undefined;
|
|
113
117
|
readonly secretService: SecretService;
|
|
118
|
+
/** The composed list read scope — listByOrg narrows through it; undefined = the OSS full scan (stigmer/stigmer#1384). */
|
|
119
|
+
readonly listReadScope: ListReadScope | undefined;
|
|
114
120
|
}
|
|
115
121
|
|
|
116
122
|
/** Registers both channelapp services on the router (routes stage). */
|
|
@@ -394,8 +400,8 @@ async function getByReference(
|
|
|
394
400
|
const LIST_RESULT_KEY = "listResult";
|
|
395
401
|
|
|
396
402
|
/**
|
|
397
|
-
* ListByOrg —
|
|
398
|
-
* entry redacted. No pagination — the set is small by nature (typically
|
|
403
|
+
* ListByOrg — the ChannelApps of an organization the caller may view,
|
|
404
|
+
* newest-first, every entry redacted. No pagination — the set is small by nature (typically
|
|
399
405
|
* one app per provider per org), the OAuthApp listByOrg posture.
|
|
400
406
|
*/
|
|
401
407
|
async function listByOrg(
|
|
@@ -420,7 +426,7 @@ async function listByOrg(
|
|
|
420
426
|
),
|
|
421
427
|
)
|
|
422
428
|
.addStep(newValidateProtoStep())
|
|
423
|
-
.addStep(newListByOrgStep(deps.store, deps.logger))
|
|
429
|
+
.addStep(newListByOrgStep(deps.store, deps.listReadScope, deps.logger))
|
|
424
430
|
.build()
|
|
425
431
|
.execute(reqCtx);
|
|
426
432
|
|
|
@@ -436,12 +442,19 @@ async function listByOrg(
|
|
|
436
442
|
|
|
437
443
|
/**
|
|
438
444
|
* ListByOrg — Go list_by_org.go's domain step: full scan, malformed rows
|
|
439
|
-
* skipped with a warning, org equality filter,
|
|
440
|
-
* by spec-audit created_at descending
|
|
441
|
-
* entries before untimestamped ones).
|
|
445
|
+
* skipped with a warning, org equality filter, narrowed to the caller's
|
|
446
|
+
* apps, per-item redaction, sorted by spec-audit created_at descending
|
|
447
|
+
* (seconds then nanos; timestamped entries before untimestamped ones).
|
|
448
|
+
* The org predicate stays the step's own because with no scope composed
|
|
449
|
+
* the helper returns its input unchanged and never reads the org (the
|
|
450
|
+
* trusted-local full scan); with one, the scope is the last per-row
|
|
451
|
+
* predicate, so a composed driver is asked about the org's apps, never
|
|
452
|
+
* every tenant's, and only the kept apps are redacted (the OAuthApp
|
|
453
|
+
* list's order).
|
|
442
454
|
*/
|
|
443
455
|
function newListByOrgStep(
|
|
444
456
|
store: Store,
|
|
457
|
+
listReadScope: ListReadScope | undefined,
|
|
445
458
|
logger: Logger,
|
|
446
459
|
): PipelineStep<typeof ChannelAppQueryController.method.listByOrg.input> {
|
|
447
460
|
return {
|
|
@@ -460,7 +473,7 @@ function newListByOrgStep(
|
|
|
460
473
|
throw internalError(error, "failed to list ChannelApps");
|
|
461
474
|
}
|
|
462
475
|
|
|
463
|
-
const
|
|
476
|
+
const requested: ChannelApp[] = [];
|
|
464
477
|
for (const bytes of rows) {
|
|
465
478
|
let app: ChannelApp;
|
|
466
479
|
try {
|
|
@@ -472,8 +485,18 @@ function newListByOrgStep(
|
|
|
472
485
|
if ((app.metadata?.org ?? "") !== org) {
|
|
473
486
|
continue;
|
|
474
487
|
}
|
|
488
|
+
requested.push(app);
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
const apps = await restrictListByReadScope(
|
|
492
|
+
listReadScope,
|
|
493
|
+
ctx.callerIdentity,
|
|
494
|
+
ApiResourceKind.channel_app,
|
|
495
|
+
requested,
|
|
496
|
+
"",
|
|
497
|
+
);
|
|
498
|
+
for (const app of apps) {
|
|
475
499
|
redactChannelApp(app);
|
|
476
|
-
apps.push(app);
|
|
477
500
|
}
|
|
478
501
|
|
|
479
502
|
apps.sort((a, b) =>
|
|
@@ -38,6 +38,7 @@ import type { ComposedServer } from "../../../boot/compose.js";
|
|
|
38
38
|
import { createLogger } from "../../../boot/logger.js";
|
|
39
39
|
import { ENCRYPTED_PREFIX, isCiphertextShaped } from "../../../encryption/encryption.js";
|
|
40
40
|
import { REDACTED_MARKER } from "../constants.js";
|
|
41
|
+
import { seedOrganizations } from "../../organization/__tests__/support.js";
|
|
41
42
|
|
|
42
43
|
const silentLogger = createLogger({ level: "error", pretty: false, write: () => {} });
|
|
43
44
|
|
|
@@ -84,6 +85,18 @@ async function startServer(env: Record<string, string>): Promise<TestServer> {
|
|
|
84
85
|
const transport: Transport = createGrpcTransport({
|
|
85
86
|
baseUrl: `http://127.0.0.1:${port}`,
|
|
86
87
|
});
|
|
88
|
+
await seedOrganizations(transport, [
|
|
89
|
+
ORG,
|
|
90
|
+
"other-org",
|
|
91
|
+
"personal-org-a",
|
|
92
|
+
"personal-org-b",
|
|
93
|
+
"personal-org-c",
|
|
94
|
+
"personal-org-d",
|
|
95
|
+
"read-org",
|
|
96
|
+
"vis-org-a",
|
|
97
|
+
"vis-org-b",
|
|
98
|
+
"list-org",
|
|
99
|
+
]);
|
|
87
100
|
return {
|
|
88
101
|
server,
|
|
89
102
|
command: createClient(EnvironmentCommandController, transport),
|
|
@@ -61,6 +61,7 @@ import {
|
|
|
61
61
|
deleteExecutionContextForExecution,
|
|
62
62
|
} from "../temporal/delete-execution-context.js";
|
|
63
63
|
import { executionContextSearchExtractor } from "../search-extractor.js";
|
|
64
|
+
import { seedOrganizations } from "../../organization/__tests__/support.js";
|
|
64
65
|
|
|
65
66
|
const silentLogger = createLogger({
|
|
66
67
|
level: "error",
|
|
@@ -112,6 +113,7 @@ async function startServer(env: Record<string, string>): Promise<TestServer> {
|
|
|
112
113
|
const transport: Transport = createGrpcTransport({
|
|
113
114
|
baseUrl: `http://127.0.0.1:${port}`,
|
|
114
115
|
});
|
|
116
|
+
await seedOrganizations(transport, [ORG, "test-org"]);
|
|
115
117
|
return {
|
|
116
118
|
server,
|
|
117
119
|
command: createClient(ExecutionContextCommandController, transport),
|
|
@@ -229,7 +229,8 @@ export function newLoadByExecutionIdStep(
|
|
|
229
229
|
* Ordered before the duplicate check so an unauthorized caller learns
|
|
230
230
|
* nothing about which execution ids exist.
|
|
231
231
|
*
|
|
232
|
-
* OSS byte-identity: the
|
|
232
|
+
* OSS byte-identity: the trusted-local authorizer allows every check on
|
|
233
|
+
* an Organization that exists (trusted-local-authorizer.ts), so the
|
|
233
234
|
* single-user posture is unchanged (the rosters prove it).
|
|
234
235
|
*/
|
|
235
236
|
export function newAuthorizeExecutionContextCreateStep(
|
|
@@ -350,3 +350,82 @@ describe("buildPrincipalAccessList", () => {
|
|
|
350
350
|
]);
|
|
351
351
|
});
|
|
352
352
|
});
|
|
353
|
+
|
|
354
|
+
describe("buildPrincipalAccessList: only the organization's people", () => {
|
|
355
|
+
/** An agent in acme: alice (a member) and dave (no role in acme) each hold a viewer grant. */
|
|
356
|
+
async function sharedAgent() {
|
|
357
|
+
const store = fakeIamPolicyStore();
|
|
358
|
+
await store.save(
|
|
359
|
+
row(
|
|
360
|
+
scopeLink(
|
|
361
|
+
{ kind: "agent", id: "a1" },
|
|
362
|
+
{ kind: "organization", id: "acme" },
|
|
363
|
+
),
|
|
364
|
+
),
|
|
365
|
+
);
|
|
366
|
+
await store.save(row(orgRole("ida_alice", "member", "acme")));
|
|
367
|
+
await store.save(row(orgRole("ida_dave", "member", "globex")));
|
|
368
|
+
for (const account of ["ida_alice", "ida_dave"]) {
|
|
369
|
+
await store.save(
|
|
370
|
+
row(
|
|
371
|
+
triple({ kind: "identity_account", id: account }, "viewer", {
|
|
372
|
+
kind: "agent",
|
|
373
|
+
id: "a1",
|
|
374
|
+
}),
|
|
375
|
+
),
|
|
376
|
+
);
|
|
377
|
+
}
|
|
378
|
+
await store.save(
|
|
379
|
+
row(
|
|
380
|
+
triple({ kind: "team", id: "tm_1", relation: "member" }, "viewer", {
|
|
381
|
+
kind: "agent",
|
|
382
|
+
id: "a1",
|
|
383
|
+
}),
|
|
384
|
+
),
|
|
385
|
+
);
|
|
386
|
+
return store;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
it("leaves out a person who holds no role in the resource's organization, and keeps teams", async () => {
|
|
390
|
+
const store = await sharedAgent();
|
|
391
|
+
const entries = await buildPrincipalAccessList(store, nobody, undefined, [
|
|
392
|
+
{ kind: "agent", id: "a1" },
|
|
393
|
+
]);
|
|
394
|
+
expect(
|
|
395
|
+
entries.map((e) => `${e.principal?.kind}:${e.principal?.id}`),
|
|
396
|
+
).toEqual(["identity_account:ida_alice", "team:tm_1"]);
|
|
397
|
+
});
|
|
398
|
+
|
|
399
|
+
it("reads the organization from the walked hierarchy the same way", async () => {
|
|
400
|
+
const store = await sharedAgent();
|
|
401
|
+
const entries = await buildPrincipalAccessList(store, nobody, undefined, [
|
|
402
|
+
{ kind: "agent", id: "a1" },
|
|
403
|
+
{ kind: "organization", id: "acme" },
|
|
404
|
+
]);
|
|
405
|
+
expect(entries.map((e) => e.principal?.id)).toEqual(["ida_alice", "tm_1"]);
|
|
406
|
+
});
|
|
407
|
+
|
|
408
|
+
it("an organization's own list is its roles and is never filtered", async () => {
|
|
409
|
+
const store = await sharedAgent();
|
|
410
|
+
const entries = await buildPrincipalAccessList(store, nobody, undefined, [
|
|
411
|
+
{ kind: "organization", id: "globex" },
|
|
412
|
+
]);
|
|
413
|
+
expect(entries.map((e) => e.principal?.id)).toEqual(["ida_dave"]);
|
|
414
|
+
});
|
|
415
|
+
|
|
416
|
+
it("a resource no organization holds is listed as its rows say", async () => {
|
|
417
|
+
const store = fakeIamPolicyStore();
|
|
418
|
+
await store.save(
|
|
419
|
+
row(
|
|
420
|
+
triple({ kind: "identity_account", id: "ida_dave" }, "viewer", {
|
|
421
|
+
kind: "agent",
|
|
422
|
+
id: "loose",
|
|
423
|
+
}),
|
|
424
|
+
),
|
|
425
|
+
);
|
|
426
|
+
const entries = await buildPrincipalAccessList(store, nobody, undefined, [
|
|
427
|
+
{ kind: "agent", id: "loose" },
|
|
428
|
+
]);
|
|
429
|
+
expect(entries.map((e) => e.principal?.id)).toEqual(["ida_dave"]);
|
|
430
|
+
});
|
|
431
|
+
});
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pins the one definition of an access row and the one conversion from a
|
|
3
|
+
* caller to the actor a change record carries (change.ts). An access row
|
|
4
|
+
* names a person or an audience written as a userset; a row naming a
|
|
5
|
+
* resource with no relation is a structural link and is never recorded.
|
|
6
|
+
* The actor keeps the caller's id and class and drops everything else, so
|
|
7
|
+
* a permission history holds no email, display name or token.
|
|
8
|
+
*/
|
|
9
|
+
import { describe, expect, it } from "vitest";
|
|
10
|
+
|
|
11
|
+
import type { CallerIdentity } from "../../../extensions/identity.js";
|
|
12
|
+
import { grantsAccess, policyActorOf } from "../change.js";
|
|
13
|
+
import { triple } from "./support.js";
|
|
14
|
+
|
|
15
|
+
describe("grantsAccess", () => {
|
|
16
|
+
const agent = { kind: "agent", id: "agt_01hzzzzzzzzzzzzzzzzzzzzzzz" };
|
|
17
|
+
|
|
18
|
+
it.each([
|
|
19
|
+
["a person", { kind: "identity_account", id: "ida_1" }, true],
|
|
20
|
+
[
|
|
21
|
+
"a team's members",
|
|
22
|
+
{ kind: "team", id: "tm_1", relation: "member" },
|
|
23
|
+
true,
|
|
24
|
+
],
|
|
25
|
+
[
|
|
26
|
+
"an organization's viewers",
|
|
27
|
+
{ kind: "organization", id: "acme", relation: "viewer" },
|
|
28
|
+
true,
|
|
29
|
+
],
|
|
30
|
+
[
|
|
31
|
+
"an identity provider's platform users",
|
|
32
|
+
{ kind: "identity_provider", id: "idp_1", relation: "platform_user" },
|
|
33
|
+
true,
|
|
34
|
+
],
|
|
35
|
+
["a parent organization", { kind: "organization", id: "acme" }, false],
|
|
36
|
+
["a blueprint (default instance)", { kind: "agent", id: "agt_2" }, false],
|
|
37
|
+
[
|
|
38
|
+
"an identity provider (managed organization)",
|
|
39
|
+
{ kind: "identity_provider", id: "idp_1" },
|
|
40
|
+
false,
|
|
41
|
+
],
|
|
42
|
+
])("a row naming %s: %s", (_name, principal, expected) => {
|
|
43
|
+
expect(grantsAccess(triple(principal, "viewer", agent))).toBe(expected);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
describe("policyActorOf", () => {
|
|
48
|
+
it("keeps the caller's id and class and nothing else", () => {
|
|
49
|
+
const caller: CallerIdentity = {
|
|
50
|
+
identityId: "ida_1",
|
|
51
|
+
callerClass: "internal",
|
|
52
|
+
issuer: "https://issuer.example.com",
|
|
53
|
+
rawToken: "secret",
|
|
54
|
+
email: "alice@example.com",
|
|
55
|
+
displayName: "Alice",
|
|
56
|
+
origin: "in-process",
|
|
57
|
+
};
|
|
58
|
+
expect(policyActorOf(caller)).toStrictEqual({
|
|
59
|
+
id: "ida_1",
|
|
60
|
+
callerClass: "internal",
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
});
|
|
@@ -93,7 +93,12 @@ import {
|
|
|
93
93
|
import { registerIamPolicyServices } from "../controller.js";
|
|
94
94
|
import { newIamPolicyGrantPath } from "../grant-path.js";
|
|
95
95
|
import { newOrganizationOnlyGrantScope } from "../grant-scope.js";
|
|
96
|
-
import {
|
|
96
|
+
import {
|
|
97
|
+
NO_RECORDED_CREATORS,
|
|
98
|
+
fakeIamPolicyStore,
|
|
99
|
+
orgRole,
|
|
100
|
+
triple,
|
|
101
|
+
} from "./support.js";
|
|
97
102
|
|
|
98
103
|
const silent = createLogger({ level: "error", pretty: false, write: () => {} });
|
|
99
104
|
|
|
@@ -225,6 +230,7 @@ async function harness(options: {
|
|
|
225
230
|
const authorizer = recordingAuthorizer();
|
|
226
231
|
const engine = options.engine === true ? recordingEngine() : undefined;
|
|
227
232
|
const grantPath = newIamPolicyGrantPath({
|
|
233
|
+
creators: NO_RECORDED_CREATORS,
|
|
228
234
|
policies,
|
|
229
235
|
lifecycle: undefined,
|
|
230
236
|
logger: silent,
|
|
@@ -350,6 +356,31 @@ describe("the three system RPCs (Q-OR-7, Q-S5-10)", () => {
|
|
|
350
356
|
});
|
|
351
357
|
});
|
|
352
358
|
|
|
359
|
+
describe("each lane hands the store its own door and its caller", () => {
|
|
360
|
+
const member = orgRole(OPERATOR_ID, "member", "acme");
|
|
361
|
+
|
|
362
|
+
it("create records a grant and delete a revoke, both as the chain's caller", async () => {
|
|
363
|
+
const h = await harness({ caller: alice });
|
|
364
|
+
await h.command.create(member);
|
|
365
|
+
await h.command.delete(member);
|
|
366
|
+
const actor = { id: alice.identityId, callerClass: "user" };
|
|
367
|
+
expect(h.policies.changes.map((change) => [change.op, change.record])).toEqual([
|
|
368
|
+
["save", { actor, cause: "grant", organizationId: "acme" }],
|
|
369
|
+
["delete", { actor, cause: "revoke", organizationId: "acme" }],
|
|
370
|
+
]);
|
|
371
|
+
});
|
|
372
|
+
|
|
373
|
+
it("bootstrapPolicy records a structural change and cleanupResourcePolicies a deleted resource", async () => {
|
|
374
|
+
const h = await harness({ caller: machine });
|
|
375
|
+
await h.command.bootstrapPolicy(member);
|
|
376
|
+
await h.command.cleanupResourcePolicies(ref("organization", "acme"));
|
|
377
|
+
expect(h.policies.changes.map((change) => change.record?.cause)).toEqual([
|
|
378
|
+
"structural",
|
|
379
|
+
"resource_deleted",
|
|
380
|
+
]);
|
|
381
|
+
});
|
|
382
|
+
});
|
|
383
|
+
|
|
353
384
|
describe("checkMyPermission (Q-OR-8, Q-S5-3)", () => {
|
|
354
385
|
const platform = ref("platform", "stigmer");
|
|
355
386
|
const acme = ref("organization", "acme");
|
|
@@ -957,9 +988,14 @@ describe("owner is assigned by owners, on the three caller lanes", () => {
|
|
|
957
988
|
h: Harness,
|
|
958
989
|
roles: ReadonlyArray<readonly [string, string]>,
|
|
959
990
|
): Promise<void> {
|
|
960
|
-
const path = newIamPolicyGrantPath({
|
|
991
|
+
const path = newIamPolicyGrantPath({
|
|
992
|
+
creators: NO_RECORDED_CREATORS,
|
|
993
|
+
policies: h.policies,
|
|
994
|
+
lifecycle: undefined,
|
|
995
|
+
logger: silent,
|
|
996
|
+
});
|
|
961
997
|
for (const [account, role] of roles) {
|
|
962
|
-
await path.grant(orgRole(account, role, "acme"), internal);
|
|
998
|
+
await path.grant(orgRole(account, role, "acme"), internal, "grant");
|
|
963
999
|
}
|
|
964
1000
|
}
|
|
965
1001
|
|