@stigmer/server 3.15.3-dev.20260914121148 → 3.16.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/README.md +3 -3
- package/dist/archive/content-store.d.ts +35 -0
- package/dist/archive/content-store.d.ts.map +1 -0
- package/dist/archive/content-store.js +98 -0
- package/dist/archive/content-store.js.map +1 -0
- package/dist/archive/inflate.d.ts +22 -0
- package/dist/archive/inflate.d.ts.map +1 -0
- package/dist/archive/inflate.js +75 -0
- package/dist/archive/inflate.js.map +1 -0
- package/dist/archive/limits.d.ts +33 -0
- package/dist/archive/limits.d.ts.map +1 -0
- package/dist/archive/limits.js +31 -0
- package/dist/archive/limits.js.map +1 -0
- package/dist/archive/open.d.ts +24 -0
- package/dist/archive/open.d.ts.map +1 -0
- package/dist/archive/open.js +93 -0
- package/dist/archive/open.js.map +1 -0
- package/dist/{domain/skill/storage → archive}/prefilter.d.ts +5 -0
- package/dist/archive/prefilter.d.ts.map +1 -0
- package/dist/archive/prefilter.js.map +1 -0
- package/dist/archive/write.d.ts +8 -0
- package/dist/archive/write.d.ts.map +1 -0
- package/dist/archive/write.js +44 -0
- package/dist/archive/write.js.map +1 -0
- package/dist/authorization/authorizer.d.ts +98 -0
- package/dist/authorization/authorizer.d.ts.map +1 -0
- package/dist/authorization/authorizer.js +156 -0
- package/dist/authorization/authorizer.js.map +1 -0
- package/dist/authorization/derived-tuples.d.ts +42 -0
- package/dist/authorization/derived-tuples.d.ts.map +1 -0
- package/dist/authorization/derived-tuples.js +240 -0
- package/dist/authorization/derived-tuples.js.map +1 -0
- package/dist/authorization/evaluator.d.ts +66 -0
- package/dist/authorization/evaluator.d.ts.map +1 -0
- package/dist/authorization/evaluator.js +153 -0
- package/dist/authorization/evaluator.js.map +1 -0
- package/dist/authorization/facts.d.ts +29 -0
- package/dist/authorization/facts.d.ts.map +1 -0
- package/dist/authorization/facts.js +17 -0
- package/dist/authorization/facts.js.map +1 -0
- package/dist/authorization/lane-admission.d.ts +50 -0
- package/dist/authorization/lane-admission.d.ts.map +1 -0
- package/dist/authorization/lane-admission.js +13 -0
- package/dist/authorization/lane-admission.js.map +1 -0
- package/dist/authorization/list-read-scope.d.ts +18 -0
- package/dist/authorization/list-read-scope.d.ts.map +1 -0
- package/dist/authorization/list-read-scope.js +155 -0
- package/dist/authorization/list-read-scope.js.map +1 -0
- package/dist/authorization/model/agent.d.ts +2 -0
- package/dist/authorization/model/agent.d.ts.map +1 -0
- package/dist/authorization/model/agent.js +42 -0
- package/dist/authorization/model/agent.js.map +1 -0
- package/dist/authorization/model/agent_channel.d.ts +2 -0
- package/dist/authorization/model/agent_channel.d.ts.map +1 -0
- package/dist/authorization/model/agent_channel.js +38 -0
- package/dist/authorization/model/agent_channel.js.map +1 -0
- package/dist/authorization/model/agent_execution.d.ts +2 -0
- package/dist/authorization/model/agent_execution.d.ts.map +1 -0
- package/dist/authorization/model/agent_execution.js +25 -0
- package/dist/authorization/model/agent_execution.js.map +1 -0
- package/dist/authorization/model/agent_instance.d.ts +2 -0
- package/dist/authorization/model/agent_instance.d.ts.map +1 -0
- package/dist/authorization/model/agent_instance.js +47 -0
- package/dist/authorization/model/agent_instance.js.map +1 -0
- package/dist/authorization/model/agent_share.d.ts +2 -0
- package/dist/authorization/model/agent_share.d.ts.map +1 -0
- package/dist/authorization/model/agent_share.js +29 -0
- package/dist/authorization/model/agent_share.js.map +1 -0
- package/dist/authorization/model/api_key.d.ts +2 -0
- package/dist/authorization/model/api_key.d.ts.map +1 -0
- package/dist/authorization/model/api_key.js +27 -0
- package/dist/authorization/model/api_key.js.map +1 -0
- package/dist/authorization/model/artifact.d.ts +2 -0
- package/dist/authorization/model/artifact.d.ts.map +1 -0
- package/dist/authorization/model/artifact.js +27 -0
- package/dist/authorization/model/artifact.js.map +1 -0
- package/dist/authorization/model/channel_app.d.ts +2 -0
- package/dist/authorization/model/channel_app.d.ts.map +1 -0
- package/dist/authorization/model/channel_app.js +28 -0
- package/dist/authorization/model/channel_app.js.map +1 -0
- package/dist/authorization/model/default-of.d.ts +38 -0
- package/dist/authorization/model/default-of.d.ts.map +1 -0
- package/dist/authorization/model/default-of.js +39 -0
- package/dist/authorization/model/default-of.js.map +1 -0
- package/dist/authorization/model/environment.d.ts +2 -0
- package/dist/authorization/model/environment.d.ts.map +1 -0
- package/dist/authorization/model/environment.js +33 -0
- package/dist/authorization/model/environment.js.map +1 -0
- package/dist/authorization/model/execution_context.d.ts +2 -0
- package/dist/authorization/model/execution_context.d.ts.map +1 -0
- package/dist/authorization/model/execution_context.js +19 -0
- package/dist/authorization/model/execution_context.js.map +1 -0
- package/dist/authorization/model/iam_policy.d.ts +2 -0
- package/dist/authorization/model/iam_policy.d.ts.map +1 -0
- package/dist/authorization/model/iam_policy.js +31 -0
- package/dist/authorization/model/iam_policy.js.map +1 -0
- package/dist/authorization/model/identity_account.d.ts +2 -0
- package/dist/authorization/model/identity_account.d.ts.map +1 -0
- package/dist/authorization/model/identity_account.js +25 -0
- package/dist/authorization/model/identity_account.js.map +1 -0
- package/dist/authorization/model/index.d.ts +36 -0
- package/dist/authorization/model/index.d.ts.map +1 -0
- package/dist/authorization/model/index.js +72 -0
- package/dist/authorization/model/index.js.map +1 -0
- package/dist/authorization/model/mcp_server.d.ts +2 -0
- package/dist/authorization/model/mcp_server.d.ts.map +1 -0
- package/dist/authorization/model/mcp_server.js +37 -0
- package/dist/authorization/model/mcp_server.js.map +1 -0
- package/dist/authorization/model/memory.d.ts +2 -0
- package/dist/authorization/model/memory.d.ts.map +1 -0
- package/dist/authorization/model/memory.js +26 -0
- package/dist/authorization/model/memory.js.map +1 -0
- package/dist/authorization/model/oauth_app.d.ts +2 -0
- package/dist/authorization/model/oauth_app.d.ts.map +1 -0
- package/dist/authorization/model/oauth_app.js +30 -0
- package/dist/authorization/model/oauth_app.js.map +1 -0
- package/dist/authorization/model/organization.d.ts +2 -0
- package/dist/authorization/model/organization.d.ts.map +1 -0
- package/dist/authorization/model/organization.js +54 -0
- package/dist/authorization/model/organization.js.map +1 -0
- package/dist/authorization/model/plugin.d.ts +2 -0
- package/dist/authorization/model/plugin.d.ts.map +1 -0
- package/dist/authorization/model/plugin.js +44 -0
- package/dist/authorization/model/plugin.js.map +1 -0
- package/dist/authorization/model/project.d.ts +2 -0
- package/dist/authorization/model/project.d.ts.map +1 -0
- package/dist/authorization/model/project.js +32 -0
- package/dist/authorization/model/project.js.map +1 -0
- package/dist/authorization/model/rewrite.d.ts +127 -0
- package/dist/authorization/model/rewrite.d.ts.map +1 -0
- package/dist/authorization/model/rewrite.js +82 -0
- package/dist/authorization/model/rewrite.js.map +1 -0
- package/dist/authorization/model/schedule.d.ts +2 -0
- package/dist/authorization/model/schedule.d.ts.map +1 -0
- package/dist/authorization/model/schedule.js +29 -0
- package/dist/authorization/model/schedule.js.map +1 -0
- package/dist/authorization/model/session.d.ts +2 -0
- package/dist/authorization/model/session.d.ts.map +1 -0
- package/dist/authorization/model/session.js +38 -0
- package/dist/authorization/model/session.js.map +1 -0
- package/dist/authorization/model/skill.d.ts +2 -0
- package/dist/authorization/model/skill.d.ts.map +1 -0
- package/dist/authorization/model/skill.js +38 -0
- package/dist/authorization/model/skill.js.map +1 -0
- package/dist/authorization/model/workflow.d.ts +2 -0
- package/dist/authorization/model/workflow.d.ts.map +1 -0
- package/dist/authorization/model/workflow.js +38 -0
- package/dist/authorization/model/workflow.js.map +1 -0
- package/dist/authorization/model/workflow_execution.d.ts +2 -0
- package/dist/authorization/model/workflow_execution.d.ts.map +1 -0
- package/dist/authorization/model/workflow_execution.js +32 -0
- package/dist/authorization/model/workflow_execution.js.map +1 -0
- package/dist/authorization/model/workflow_instance.d.ts +2 -0
- package/dist/authorization/model/workflow_instance.d.ts.map +1 -0
- package/dist/authorization/model/workflow_instance.js +92 -0
- package/dist/authorization/model/workflow_instance.js.map +1 -0
- package/dist/authorization/organization-directory.d.ts +13 -0
- package/dist/authorization/organization-directory.d.ts.map +1 -0
- package/dist/authorization/organization-directory.js +83 -0
- package/dist/authorization/organization-directory.js.map +1 -0
- package/dist/authorization/person.d.ts +42 -0
- package/dist/authorization/person.d.ts.map +1 -0
- package/dist/authorization/person.js +19 -0
- package/dist/authorization/person.js.map +1 -0
- package/dist/authorization/posture.d.ts +38 -0
- package/dist/authorization/posture.d.ts.map +1 -0
- package/dist/authorization/posture.js +7 -0
- package/dist/authorization/posture.js.map +1 -0
- package/dist/authorization/schedule-fire-caller.d.ts +12 -0
- package/dist/authorization/schedule-fire-caller.d.ts.map +1 -0
- package/dist/authorization/schedule-fire-caller.js +67 -0
- package/dist/authorization/schedule-fire-caller.js.map +1 -0
- package/dist/authorization/store-test-kit.d.ts +68 -0
- package/dist/authorization/store-test-kit.d.ts.map +1 -0
- package/dist/authorization/store-test-kit.js +311 -0
- package/dist/authorization/store-test-kit.js.map +1 -0
- package/dist/authorization/tuples.d.ts +115 -0
- package/dist/authorization/tuples.d.ts.map +1 -0
- package/dist/authorization/tuples.js +83 -0
- package/dist/authorization/tuples.js.map +1 -0
- package/dist/boot/compose.d.ts.map +1 -1
- package/dist/boot/compose.js +220 -43
- package/dist/boot/compose.js.map +1 -1
- package/dist/boot/inprocess.d.ts +12 -0
- package/dist/boot/inprocess.d.ts.map +1 -1
- package/dist/boot/inprocess.js +68 -21
- package/dist/boot/inprocess.js.map +1 -1
- package/dist/domain/agent/controller.d.ts.map +1 -1
- package/dist/domain/agent/controller.js +9 -0
- package/dist/domain/agent/controller.js.map +1 -1
- package/dist/domain/executioncontext/resolve-values-for-caller.d.ts +33 -14
- package/dist/domain/executioncontext/resolve-values-for-caller.d.ts.map +1 -1
- package/dist/domain/executioncontext/resolve-values-for-caller.js +32 -8
- package/dist/domain/executioncontext/resolve-values-for-caller.js.map +1 -1
- package/dist/domain/iampolicy/constants.d.ts +11 -0
- package/dist/domain/iampolicy/constants.d.ts.map +1 -1
- package/dist/domain/iampolicy/constants.js +11 -0
- package/dist/domain/iampolicy/constants.js.map +1 -1
- package/dist/domain/iampolicy/membership.d.ts +72 -1
- package/dist/domain/iampolicy/membership.d.ts.map +1 -1
- package/dist/domain/iampolicy/membership.js +141 -56
- package/dist/domain/iampolicy/membership.js.map +1 -1
- package/dist/domain/identityaccount/actor.d.ts +41 -0
- package/dist/domain/identityaccount/actor.d.ts.map +1 -0
- package/dist/domain/identityaccount/actor.js +34 -0
- package/dist/domain/identityaccount/actor.js.map +1 -0
- package/dist/domain/identityaccount/resolve.d.ts +19 -0
- package/dist/domain/identityaccount/resolve.d.ts.map +1 -1
- package/dist/domain/identityaccount/resolve.js +12 -0
- package/dist/domain/identityaccount/resolve.js.map +1 -1
- package/dist/domain/mcpserver/connect-execution-id.d.ts +5 -0
- package/dist/domain/mcpserver/connect-execution-id.d.ts.map +1 -0
- package/dist/domain/mcpserver/connect-execution-id.js +32 -0
- package/dist/domain/mcpserver/connect-execution-id.js.map +1 -0
- package/dist/domain/mcpserver/connect.d.ts +28 -2
- package/dist/domain/mcpserver/connect.d.ts.map +1 -1
- package/dist/domain/mcpserver/connect.js +27 -7
- package/dist/domain/mcpserver/connect.js.map +1 -1
- package/dist/domain/mcpserver/controller.d.ts.map +1 -1
- package/dist/domain/mcpserver/controller.js +9 -0
- package/dist/domain/mcpserver/controller.js.map +1 -1
- package/dist/domain/mcpserver/engine.d.ts +9 -3
- 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.js +1 -1
- package/dist/domain/mcpserver/start-connect.js.map +1 -1
- package/dist/domain/platform/controller.d.ts +24 -11
- package/dist/domain/platform/controller.d.ts.map +1 -1
- package/dist/domain/platform/controller.js.map +1 -1
- package/dist/domain/plugin/archive.d.ts +37 -0
- package/dist/domain/plugin/archive.d.ts.map +1 -0
- package/dist/domain/plugin/archive.js +50 -0
- package/dist/domain/plugin/archive.js.map +1 -0
- package/dist/domain/plugin/constants.d.ts +38 -0
- package/dist/domain/plugin/constants.d.ts.map +1 -0
- package/dist/domain/plugin/constants.js +46 -0
- package/dist/domain/plugin/constants.js.map +1 -0
- package/dist/domain/plugin/controller.d.ts +25 -0
- package/dist/domain/plugin/controller.d.ts.map +1 -0
- package/dist/domain/plugin/controller.js +493 -0
- package/dist/domain/plugin/controller.js.map +1 -0
- package/dist/domain/plugin/materialize/agent.d.ts +13 -0
- package/dist/domain/plugin/materialize/agent.d.ts.map +1 -0
- package/dist/domain/plugin/materialize/agent.js +128 -0
- package/dist/domain/plugin/materialize/agent.js.map +1 -0
- package/dist/domain/plugin/materialize/default-agent-instructions.d.ts +22 -0
- package/dist/domain/plugin/materialize/default-agent-instructions.d.ts.map +1 -0
- package/dist/domain/plugin/materialize/default-agent-instructions.js +31 -0
- package/dist/domain/plugin/materialize/default-agent-instructions.js.map +1 -0
- package/dist/domain/plugin/materialize/identity.d.ts +28 -0
- package/dist/domain/plugin/materialize/identity.d.ts.map +1 -0
- package/dist/domain/plugin/materialize/identity.js +40 -0
- package/dist/domain/plugin/materialize/identity.js.map +1 -0
- package/dist/domain/plugin/materialize/mcp-servers.d.ts +15 -0
- package/dist/domain/plugin/materialize/mcp-servers.d.ts.map +1 -0
- package/dist/domain/plugin/materialize/mcp-servers.js +131 -0
- package/dist/domain/plugin/materialize/mcp-servers.js.map +1 -0
- package/dist/domain/plugin/materialize/plan.d.ts +24 -0
- package/dist/domain/plugin/materialize/plan.d.ts.map +1 -0
- package/dist/domain/plugin/materialize/plan.js +77 -0
- package/dist/domain/plugin/materialize/plan.js.map +1 -0
- package/dist/domain/plugin/materialize/ports.d.ts +42 -0
- package/dist/domain/plugin/materialize/ports.d.ts.map +1 -0
- package/dist/domain/plugin/materialize/ports.js +2 -0
- package/dist/domain/plugin/materialize/ports.js.map +1 -0
- package/dist/domain/plugin/materialize/skills.d.ts +12 -0
- package/dist/domain/plugin/materialize/skills.d.ts.map +1 -0
- package/dist/domain/plugin/materialize/skills.js +44 -0
- package/dist/domain/plugin/materialize/skills.js.map +1 -0
- package/dist/domain/plugin/materialize/workflows.d.ts +15 -0
- package/dist/domain/plugin/materialize/workflows.d.ts.map +1 -0
- package/dist/domain/plugin/materialize/workflows.js +31 -0
- package/dist/domain/plugin/materialize/workflows.js.map +1 -0
- package/dist/domain/plugin/members.d.ts +42 -0
- package/dist/domain/plugin/members.d.ts.map +1 -0
- package/dist/domain/plugin/members.js +97 -0
- package/dist/domain/plugin/members.js.map +1 -0
- package/dist/domain/plugin/overlay/documents.d.ts +31 -0
- package/dist/domain/plugin/overlay/documents.d.ts.map +1 -0
- package/dist/domain/plugin/overlay/documents.js +38 -0
- package/dist/domain/plugin/overlay/documents.js.map +1 -0
- package/dist/domain/plugin/overlay/parse.d.ts +16 -0
- package/dist/domain/plugin/overlay/parse.d.ts.map +1 -0
- package/dist/domain/plugin/overlay/parse.js +79 -0
- package/dist/domain/plugin/overlay/parse.js.map +1 -0
- package/dist/domain/plugin/overlay/sanitize.d.ts +10 -0
- package/dist/domain/plugin/overlay/sanitize.d.ts.map +1 -0
- package/dist/domain/plugin/overlay/sanitize.js +103 -0
- package/dist/domain/plugin/overlay/sanitize.js.map +1 -0
- package/dist/domain/plugin/push.d.ts +133 -0
- package/dist/domain/plugin/push.d.ts.map +1 -0
- package/dist/domain/plugin/push.js +800 -0
- package/dist/domain/plugin/push.js.map +1 -0
- package/dist/domain/plugin/search-extractor.d.ts +3 -0
- package/dist/domain/plugin/search-extractor.d.ts.map +1 -0
- package/dist/domain/plugin/search-extractor.js +41 -0
- package/dist/domain/plugin/search-extractor.js.map +1 -0
- package/dist/domain/skill/constants.d.ts +6 -11
- package/dist/domain/skill/constants.d.ts.map +1 -1
- package/dist/domain/skill/constants.js +6 -11
- package/dist/domain/skill/constants.js.map +1 -1
- package/dist/domain/skill/controller.d.ts.map +1 -1
- package/dist/domain/skill/controller.js +33 -30
- package/dist/domain/skill/controller.js.map +1 -1
- package/dist/domain/skill/push.d.ts +9 -10
- package/dist/domain/skill/push.d.ts.map +1 -1
- package/dist/domain/skill/push.js +53 -122
- package/dist/domain/skill/push.js.map +1 -1
- package/dist/domain/skill/search-extractor.d.ts.map +1 -1
- package/dist/domain/skill/search-extractor.js.map +1 -1
- package/dist/domain/skill/storage/artifact-storage.d.ts +26 -29
- package/dist/domain/skill/storage/artifact-storage.d.ts.map +1 -1
- package/dist/domain/skill/storage/artifact-storage.js +6 -103
- package/dist/domain/skill/storage/artifact-storage.js.map +1 -1
- package/dist/domain/skill/storage/zip-gate.d.ts +1 -2
- package/dist/domain/skill/storage/zip-gate.d.ts.map +1 -1
- package/dist/domain/skill/storage/zip-gate.js +56 -126
- package/dist/domain/skill/storage/zip-gate.js.map +1 -1
- package/dist/domain/skill/version-resolution.d.ts +5 -5
- package/dist/domain/skill/version-resolution.d.ts.map +1 -1
- package/dist/domain/skill/version-resolution.js +34 -216
- package/dist/domain/skill/version-resolution.js.map +1 -1
- package/dist/domain/workflow/controller.d.ts.map +1 -1
- package/dist/domain/workflow/controller.js +30 -3
- package/dist/domain/workflow/controller.js.map +1 -1
- package/dist/domain/workflow/registry/data/task-kind-registry.json +1 -0
- package/dist/domain/workflowexecution/phases.d.ts +21 -0
- package/dist/domain/workflowexecution/phases.d.ts.map +1 -0
- package/dist/domain/workflowexecution/phases.js +31 -0
- package/dist/domain/workflowexecution/phases.js.map +1 -0
- package/dist/extensions/authorizer.d.ts +10 -5
- package/dist/extensions/authorizer.d.ts.map +1 -1
- package/dist/extensions/drivers.d.ts +4 -1
- package/dist/extensions/drivers.d.ts.map +1 -1
- package/dist/extensions/list-read-scope.d.ts +47 -20
- package/dist/extensions/list-read-scope.d.ts.map +1 -1
- package/dist/extensions/list-read-scope.js +20 -24
- package/dist/extensions/list-read-scope.js.map +1 -1
- package/dist/extensions/organization-directory.d.ts +13 -9
- package/dist/extensions/organization-directory.d.ts.map +1 -1
- package/dist/extensions/organization-directory.js.map +1 -1
- package/dist/extensions/resource-authorization.d.ts +33 -0
- package/dist/extensions/resource-authorization.d.ts.map +1 -1
- package/dist/extensions/schedule-fire-caller.d.ts +45 -18
- package/dist/extensions/schedule-fire-caller.d.ts.map +1 -1
- package/dist/extensions/schedule-fire-caller.js +12 -1
- package/dist/extensions/schedule-fire-caller.js.map +1 -1
- package/dist/identity/oidc-verifier.js +8 -1
- package/dist/identity/oidc-verifier.js.map +1 -1
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/pipeline/apiresource-labels.d.ts +23 -3
- package/dist/pipeline/apiresource-labels.d.ts.map +1 -1
- package/dist/pipeline/apiresource-labels.js +20 -0
- package/dist/pipeline/apiresource-labels.js.map +1 -1
- package/dist/pipeline/apiresource-meta.d.ts +15 -0
- package/dist/pipeline/apiresource-meta.d.ts.map +1 -1
- package/dist/pipeline/apiresource-meta.js +34 -0
- package/dist/pipeline/apiresource-meta.js.map +1 -1
- package/dist/pipeline/errors.d.ts.map +1 -1
- package/dist/pipeline/errors.js.map +1 -1
- package/dist/pipeline/steps/authorization-facts.d.ts +12 -0
- package/dist/pipeline/steps/authorization-facts.d.ts.map +1 -0
- package/dist/pipeline/steps/authorization-facts.js +100 -0
- package/dist/pipeline/steps/authorization-facts.js.map +1 -0
- package/dist/pipeline/steps/delete.d.ts.map +1 -1
- package/dist/pipeline/steps/delete.js +1 -1
- package/dist/pipeline/steps/delete.js.map +1 -1
- package/dist/pipeline/steps/duplicate.d.ts.map +1 -1
- package/dist/pipeline/steps/duplicate.js.map +1 -1
- package/dist/pipeline/steps/guard-memory-capture.d.ts.map +1 -1
- package/dist/pipeline/steps/guard-memory-capture.js +5 -3
- package/dist/pipeline/steps/guard-memory-capture.js.map +1 -1
- package/dist/pipeline/steps/guard-plugin-managed.d.ts +12 -0
- package/dist/pipeline/steps/guard-plugin-managed.d.ts.map +1 -0
- package/dist/pipeline/steps/guard-plugin-managed.js +96 -0
- package/dist/pipeline/steps/guard-plugin-managed.js.map +1 -0
- package/dist/pipeline/steps/guard-reserved-labels.d.ts +16 -2
- package/dist/pipeline/steps/guard-reserved-labels.d.ts.map +1 -1
- package/dist/pipeline/steps/guard-reserved-labels.js +11 -7
- package/dist/pipeline/steps/guard-reserved-labels.js.map +1 -1
- package/dist/pipeline/steps/helpers.d.ts.map +1 -1
- package/dist/pipeline/steps/helpers.js.map +1 -1
- package/dist/pipeline/steps/index-search.d.ts.map +1 -1
- package/dist/pipeline/steps/index-search.js.map +1 -1
- package/dist/pipeline/steps/load-existing.d.ts.map +1 -1
- package/dist/pipeline/steps/load-existing.js +1 -1
- package/dist/pipeline/steps/load-existing.js.map +1 -1
- package/dist/pipeline/steps/references.d.ts +16 -0
- package/dist/pipeline/steps/references.d.ts.map +1 -1
- package/dist/pipeline/steps/references.js +18 -0
- package/dist/pipeline/steps/references.js.map +1 -1
- package/dist/pipeline/steps/resolve-artifact-source.d.ts +35 -0
- package/dist/pipeline/steps/resolve-artifact-source.d.ts.map +1 -0
- package/dist/pipeline/steps/resolve-artifact-source.js +27 -0
- package/dist/pipeline/steps/resolve-artifact-source.js.map +1 -0
- package/dist/pipeline/steps/server-stamped-reserved-labels.d.ts.map +1 -1
- package/dist/pipeline/steps/server-stamped-reserved-labels.js.map +1 -1
- package/dist/pipeline/steps/slug.d.ts.map +1 -1
- package/dist/pipeline/steps/slug.js.map +1 -1
- package/dist/pipeline/steps/validate-visibility.d.ts +9 -0
- package/dist/pipeline/steps/validate-visibility.d.ts.map +1 -1
- package/dist/pipeline/steps/validate-visibility.js +6 -1
- package/dist/pipeline/steps/validate-visibility.js.map +1 -1
- package/dist/pipeline/steps/validation.d.ts.map +1 -1
- package/dist/pipeline/steps/validation.js.map +1 -1
- package/dist/pipeline/steps/version-archive.d.ts +63 -0
- package/dist/pipeline/steps/version-archive.d.ts.map +1 -0
- package/dist/pipeline/steps/version-archive.js +129 -0
- package/dist/pipeline/steps/version-archive.js.map +1 -0
- package/dist/pipeline/steps/version-history.d.ts +49 -0
- package/dist/pipeline/steps/version-history.d.ts.map +1 -0
- package/dist/pipeline/steps/version-history.js +229 -0
- package/dist/pipeline/steps/version-history.js.map +1 -0
- package/dist/pipeline/steps/visibility-gates.d.ts +8 -0
- package/dist/pipeline/steps/visibility-gates.d.ts.map +1 -1
- package/dist/pipeline/steps/visibility-gates.js +7 -2
- package/dist/pipeline/steps/visibility-gates.js.map +1 -1
- package/dist/query/search/registry.d.ts.map +1 -1
- package/dist/query/search/registry.js +2 -0
- package/dist/query/search/registry.js.map +1 -1
- package/dist/runnerauth/bound-execution.d.ts +27 -0
- package/dist/runnerauth/bound-execution.d.ts.map +1 -0
- package/dist/runnerauth/bound-execution.js +137 -0
- package/dist/runnerauth/bound-execution.js.map +1 -0
- package/dist/runnerauth/built-in-runner-credential-provider.d.ts +28 -0
- package/dist/runnerauth/built-in-runner-credential-provider.d.ts.map +1 -0
- package/dist/runnerauth/built-in-runner-credential-provider.js +217 -0
- package/dist/runnerauth/built-in-runner-credential-provider.js.map +1 -0
- package/dist/runnerauth/constants.d.ts +63 -0
- package/dist/runnerauth/constants.d.ts.map +1 -0
- package/dist/runnerauth/constants.js +63 -0
- package/dist/runnerauth/constants.js.map +1 -0
- package/dist/runnerauth/dispatch-credential.d.ts +38 -0
- package/dist/runnerauth/dispatch-credential.d.ts.map +1 -0
- package/dist/runnerauth/dispatch-credential.js +17 -0
- package/dist/runnerauth/dispatch-credential.js.map +1 -0
- package/dist/runnerauth/runner-credential-provider.d.ts +49 -11
- package/dist/runnerauth/runner-credential-provider.d.ts.map +1 -1
- package/dist/runnerauth/runner-credential-provider.js +16 -4
- package/dist/runnerauth/runner-credential-provider.js.map +1 -1
- package/dist/runnerauth/runner-subject-verifier.d.ts +14 -0
- package/dist/runnerauth/runner-subject-verifier.d.ts.map +1 -0
- package/dist/runnerauth/runner-subject-verifier.js +115 -0
- package/dist/runnerauth/runner-subject-verifier.js.map +1 -0
- package/dist/runnerauth/runnerauth.d.ts +33 -4
- package/dist/runnerauth/runnerauth.d.ts.map +1 -1
- package/dist/runnerauth/runnerauth.js +131 -35
- package/dist/runnerauth/runnerauth.js.map +1 -1
- package/dist/temporal/agentexecution/engine-client.d.ts +13 -0
- package/dist/temporal/agentexecution/engine-client.d.ts.map +1 -1
- package/dist/temporal/agentexecution/engine-client.js +10 -2
- package/dist/temporal/agentexecution/engine-client.js.map +1 -1
- package/dist/temporal/agentexecution/workflow-input.d.ts +13 -0
- package/dist/temporal/agentexecution/workflow-input.d.ts.map +1 -1
- package/dist/temporal/agentexecution/workflows/invoke-agent-execution.d.ts.map +1 -1
- package/dist/temporal/agentexecution/workflows/invoke-agent-execution.js +35 -31
- package/dist/temporal/agentexecution/workflows/invoke-agent-execution.js.map +1 -1
- package/dist/temporal/schedule/run-starter.d.ts +1 -1
- package/dist/temporal/schedule/run-starter.d.ts.map +1 -1
- package/dist/temporal/schedule/run-starter.js +14 -1
- package/dist/temporal/schedule/run-starter.js.map +1 -1
- package/dist/temporal/workflowexecution/engine-client.d.ts +24 -0
- package/dist/temporal/workflowexecution/engine-client.d.ts.map +1 -1
- package/dist/temporal/workflowexecution/engine-client.js +26 -19
- package/dist/temporal/workflowexecution/engine-client.js.map +1 -1
- package/dist/temporal/workflowexecution/workflow-input.d.ts +14 -0
- package/dist/temporal/workflowexecution/workflow-input.d.ts.map +1 -1
- package/package.json +5 -4
- package/src/archive/__tests__/archive.test.ts +233 -0
- package/src/{domain/skill → archive}/__tests__/prefilter.test.ts +1 -1
- package/src/archive/content-store.ts +132 -0
- package/src/archive/inflate.ts +107 -0
- package/src/archive/limits.ts +42 -0
- package/src/archive/open.ts +131 -0
- package/src/{domain/skill/storage → archive}/prefilter.ts +5 -0
- package/src/archive/write.ts +54 -0
- package/src/authorization/README.md +124 -0
- package/src/authorization/__tests__/authorizer.test.ts +719 -0
- package/src/authorization/__tests__/derived-tuples.test.ts +802 -0
- package/src/authorization/__tests__/drivers.ts +70 -0
- package/src/authorization/__tests__/evaluator.test.ts +359 -0
- package/src/authorization/__tests__/facts.test.ts +155 -0
- package/src/authorization/__tests__/fixtures/fga/agent-channel-owner.fga.yaml +112 -0
- package/src/authorization/__tests__/fixtures/fga/agent-share-owner.fga.yaml +109 -0
- package/src/authorization/__tests__/fixtures/fga/artifact-org-and-owner.fga.yaml +128 -0
- package/src/authorization/__tests__/fixtures/fga/blueprint-private-visibility.fga.yaml +410 -0
- package/src/authorization/__tests__/fixtures/fga/channel-app-owner.fga.yaml +125 -0
- package/src/authorization/__tests__/fixtures/fga/channel-participation.fga.yaml +201 -0
- package/src/authorization/__tests__/fixtures/fga/channel-session-visibility.fga.yaml +187 -0
- package/src/authorization/__tests__/fixtures/fga/cross-org-share-creation.fga.yaml +98 -0
- package/src/authorization/__tests__/fixtures/fga/default-instance-inheritance.fga.yaml +271 -0
- package/src/authorization/__tests__/fixtures/fga/memory-subject-only.fga.yaml +72 -0
- package/src/authorization/__tests__/fixtures/fga/org-admin-owner-inheritance.fga.yaml +328 -0
- package/src/authorization/__tests__/fixtures/fga/org-shared-environment.fga.yaml +144 -0
- package/src/authorization/__tests__/fixtures/fga/platform-visibility.fga.yaml +223 -0
- package/src/authorization/__tests__/fixtures/fga/provider-standing-viewer.fga.yaml +40 -0
- package/src/authorization/__tests__/fixtures/fga/public-visibility-setter.fga.yaml +52 -0
- package/src/authorization/__tests__/fixtures/fga/reserved-label-writer.fga.yaml +41 -0
- package/src/authorization/__tests__/fixtures/fga/schedule-owner.fga.yaml +113 -0
- package/src/authorization/__tests__/fixtures/fga/schedule-session-visibility.fga.yaml +214 -0
- package/src/authorization/__tests__/fixtures/fga/session-personal-resource.fga.yaml +117 -0
- package/src/authorization/__tests__/fixtures/fga/workflow-execution-sharing.fga.yaml +192 -0
- package/src/authorization/__tests__/lane-admission.test.ts +115 -0
- package/src/authorization/__tests__/list-read-scope.measure.test.ts +317 -0
- package/src/authorization/__tests__/list-read-scope.test.ts +796 -0
- package/src/authorization/__tests__/organization-directory.test.ts +236 -0
- package/src/authorization/__tests__/person.test.ts +114 -0
- package/src/authorization/__tests__/posture.test.ts +25 -0
- package/src/authorization/__tests__/schedule-fire-caller.test.ts +134 -0
- package/src/authorization/__tests__/store-tests.test.ts +306 -0
- package/src/authorization/__tests__/support.ts +101 -0
- package/src/authorization/__tests__/tuples.test.ts +62 -0
- package/src/authorization/__tests__/wire-permissions.test.ts +154 -0
- package/src/authorization/authorizer.ts +208 -0
- package/src/authorization/derived-tuples.ts +384 -0
- package/src/authorization/evaluator.ts +283 -0
- package/src/authorization/facts.ts +47 -0
- package/src/authorization/lane-admission.ts +73 -0
- package/src/authorization/list-read-scope.ts +216 -0
- package/src/authorization/model/__tests__/registry.test.ts +317 -0
- package/src/authorization/model/agent.ts +64 -0
- package/src/authorization/model/agent_channel.ts +49 -0
- package/src/authorization/model/agent_execution.ts +33 -0
- package/src/authorization/model/agent_instance.ts +66 -0
- package/src/authorization/model/agent_share.ts +40 -0
- package/src/authorization/model/api_key.ts +28 -0
- package/src/authorization/model/artifact.ts +38 -0
- package/src/authorization/model/channel_app.ts +39 -0
- package/src/authorization/model/default-of.ts +99 -0
- package/src/authorization/model/environment.ts +48 -0
- package/src/authorization/model/execution_context.ts +20 -0
- package/src/authorization/model/iam_policy.ts +42 -0
- package/src/authorization/model/identity_account.ts +26 -0
- package/src/authorization/model/index.ts +108 -0
- package/src/authorization/model/mcp_server.ts +59 -0
- package/src/authorization/model/memory.ts +27 -0
- package/src/authorization/model/oauth_app.ts +42 -0
- package/src/authorization/model/organization.ts +55 -0
- package/src/authorization/model/plugin.ts +66 -0
- package/src/authorization/model/project.ts +47 -0
- package/src/authorization/model/rewrite.ts +213 -0
- package/src/authorization/model/schedule.ts +40 -0
- package/src/authorization/model/session.ts +50 -0
- package/src/authorization/model/skill.ts +60 -0
- package/src/authorization/model/workflow.ts +60 -0
- package/src/authorization/model/workflow_execution.ts +44 -0
- package/src/authorization/model/workflow_instance.ts +122 -0
- package/src/authorization/organization-directory.ts +114 -0
- package/src/authorization/person.ts +68 -0
- package/src/authorization/posture.ts +49 -0
- package/src/authorization/schedule-fire-caller.ts +87 -0
- package/src/authorization/store-test-kit.ts +454 -0
- package/src/authorization/tuples.ts +190 -0
- package/src/boot/compose.ts +246 -52
- package/src/boot/inprocess.ts +115 -31
- package/src/domain/agent/controller.ts +11 -0
- package/src/domain/executioncontext/__tests__/executioncontext.test.ts +104 -0
- package/src/domain/executioncontext/__tests__/resolve-values-capability.test.ts +33 -4
- package/src/domain/executioncontext/resolve-values-for-caller.ts +79 -22
- package/src/domain/iampolicy/__tests__/membership.test.ts +357 -3
- package/src/domain/iampolicy/constants.ts +12 -0
- package/src/domain/iampolicy/membership.ts +221 -66
- package/src/domain/identityaccount/__tests__/account-for-stamp.test.ts +111 -0
- package/src/domain/identityaccount/actor.ts +84 -0
- package/src/domain/identityaccount/resolve.ts +31 -0
- package/src/domain/mcpserver/__tests__/connect.test.ts +17 -2
- package/src/domain/mcpserver/connect-execution-id.ts +34 -0
- package/src/domain/mcpserver/connect.ts +38 -3
- package/src/domain/mcpserver/controller.ts +11 -0
- package/src/domain/mcpserver/engine.ts +9 -3
- package/src/domain/mcpserver/start-connect.ts +1 -1
- package/src/domain/platform/controller.ts +24 -11
- package/src/domain/plugin/__tests__/materialize.test.ts +303 -0
- package/src/domain/plugin/__tests__/overlay-parse.test.ts +85 -0
- package/src/domain/plugin/__tests__/plugin.test.ts +796 -0
- package/src/domain/plugin/__tests__/sanitize.test.ts +174 -0
- package/src/domain/plugin/archive.ts +89 -0
- package/src/domain/plugin/constants.ts +53 -0
- package/src/domain/plugin/controller.ts +913 -0
- package/src/domain/plugin/materialize/agent.ts +186 -0
- package/src/domain/plugin/materialize/default-agent-instructions.ts +59 -0
- package/src/domain/plugin/materialize/identity.ts +67 -0
- package/src/domain/plugin/materialize/mcp-servers.ts +175 -0
- package/src/domain/plugin/materialize/plan.ts +124 -0
- package/src/domain/plugin/materialize/ports.ts +53 -0
- package/src/domain/plugin/materialize/skills.ts +68 -0
- package/src/domain/plugin/materialize/workflows.ts +51 -0
- package/src/domain/plugin/members.ts +180 -0
- package/src/domain/plugin/overlay/documents.ts +78 -0
- package/src/domain/plugin/overlay/parse.ts +115 -0
- package/src/domain/plugin/overlay/sanitize.ts +151 -0
- package/src/domain/plugin/push.ts +1062 -0
- package/src/domain/plugin/search-extractor.ts +60 -0
- package/src/domain/skill/constants.ts +11 -14
- package/src/domain/skill/controller.ts +44 -36
- package/src/domain/skill/push.ts +61 -156
- package/src/domain/skill/search-extractor.ts +3 -1
- package/src/domain/skill/storage/artifact-storage.ts +23 -124
- package/src/domain/skill/storage/zip-gate.ts +58 -154
- package/src/domain/skill/version-resolution.ts +67 -269
- package/src/domain/workflow/controller.ts +38 -4
- package/src/domain/workflow/registry/data/task-kind-registry.json +1 -0
- package/src/domain/workflowexecution/__tests__/phases.test.ts +58 -0
- package/src/domain/workflowexecution/phases.ts +33 -0
- package/src/extensions/__tests__/built-in-authorization-composed.test.ts +835 -0
- package/src/extensions/__tests__/composed-support.ts +32 -1
- package/src/extensions/__tests__/extension-composition.test.ts +42 -1
- package/src/extensions/__tests__/list-read-scope.test.ts +137 -33
- package/src/extensions/__tests__/role-reconciliation-composed.test.ts +209 -0
- package/src/extensions/__tests__/tier-truthfulness.test.ts +6 -14
- package/src/extensions/authorizer.ts +10 -5
- package/src/extensions/drivers.ts +4 -1
- package/src/extensions/list-read-scope.ts +67 -45
- package/src/extensions/organization-directory.ts +13 -9
- package/src/extensions/resource-authorization.ts +34 -0
- package/src/extensions/schedule-fire-caller.ts +49 -18
- package/src/identity/__tests__/oidc-verifier.test.ts +22 -0
- package/src/identity/oidc-verifier.ts +8 -1
- package/src/index.ts +51 -1
- package/src/pipeline/__tests__/kind-by-id-prefix.test.ts +75 -0
- package/src/pipeline/__tests__/router-transport.test.ts +1 -3
- package/src/pipeline/apiresource-labels.ts +31 -3
- package/src/pipeline/apiresource-meta.ts +41 -0
- package/src/pipeline/errors.ts +5 -5
- package/src/pipeline/steps/__tests__/authorize-annotation-completeness.test.ts +1 -20
- package/src/pipeline/steps/__tests__/guard-memory-capture.test.ts +58 -44
- package/src/pipeline/steps/__tests__/guard-plugin-managed.test.ts +151 -0
- package/src/pipeline/steps/__tests__/guard-reserved-labels.test.ts +83 -8
- package/src/pipeline/steps/authorization-facts.ts +131 -0
- package/src/pipeline/steps/delete.ts +11 -3
- package/src/pipeline/steps/duplicate.ts +8 -2
- package/src/pipeline/steps/guard-memory-capture.ts +5 -3
- package/src/pipeline/steps/guard-plugin-managed.ts +133 -0
- package/src/pipeline/steps/guard-reserved-labels.ts +29 -8
- package/src/pipeline/steps/helpers.ts +4 -1
- package/src/pipeline/steps/index-search.ts +28 -15
- package/src/pipeline/steps/load-existing.ts +12 -3
- package/src/pipeline/steps/references.ts +36 -2
- package/src/pipeline/steps/resolve-artifact-source.ts +66 -0
- package/src/pipeline/steps/server-stamped-reserved-labels.ts +2 -1
- package/src/pipeline/steps/slug.ts +7 -2
- package/src/pipeline/steps/validate-visibility.ts +9 -2
- package/src/pipeline/steps/validation.ts +3 -1
- package/src/pipeline/steps/version-archive.ts +225 -0
- package/src/pipeline/steps/version-history.ts +362 -0
- package/src/pipeline/steps/visibility-gates.ts +12 -9
- package/src/query/README.md +1 -1
- package/src/query/search/__tests__/criteria.test.ts +6 -7
- package/src/query/search/__tests__/query-store.test.ts +9 -2
- package/src/query/search/__tests__/registry.test.ts +6 -4
- package/src/query/search/registry.ts +6 -1
- package/src/runnerauth/__tests__/bound-execution.test.ts +334 -0
- package/src/runnerauth/__tests__/built-in-runner-credential-provider.test.ts +516 -0
- package/src/runnerauth/__tests__/dispatch-credential.test.ts +94 -0
- package/src/runnerauth/__tests__/runner-credential-provider.test.ts +27 -0
- package/src/runnerauth/__tests__/runner-subject-composed.test.ts +497 -0
- package/src/runnerauth/__tests__/runner-subject-verifier.test.ts +541 -0
- package/src/runnerauth/bound-execution.ts +270 -0
- package/src/runnerauth/built-in-runner-credential-provider.ts +300 -0
- package/src/runnerauth/constants.ts +74 -0
- package/src/runnerauth/dispatch-credential.ts +63 -0
- package/src/runnerauth/runner-credential-provider.ts +60 -11
- package/src/runnerauth/runner-subject-verifier.ts +152 -0
- package/src/runnerauth/runnerauth.ts +148 -38
- package/src/temporal/agentexecution/__tests__/engine-client.test.ts +107 -38
- package/src/temporal/agentexecution/__tests__/invoke-workflow.test.ts +105 -2
- package/src/temporal/agentexecution/engine-client.ts +27 -2
- package/src/temporal/agentexecution/workflow-input.ts +13 -0
- package/src/temporal/agentexecution/workflows/invoke-agent-execution.ts +90 -44
- package/src/temporal/schedule/__tests__/run-starter.test.ts +86 -24
- package/src/temporal/schedule/run-starter.ts +31 -8
- package/src/temporal/workflowexecution/__tests__/engine-client.test.ts +139 -33
- package/src/temporal/workflowexecution/engine-client.ts +48 -21
- package/src/temporal/workflowexecution/workflow-input.ts +14 -0
- package/dist/domain/skill/storage/prefilter.d.ts.map +0 -1
- package/dist/domain/skill/storage/prefilter.js.map +0 -1
- /package/dist/{domain/skill/storage → archive}/prefilter.js +0 -0
|
@@ -13,10 +13,22 @@
|
|
|
13
13
|
* on every other token, so the OSS lanes composed ahead of it keep their
|
|
14
14
|
* claims. Lifted from identity-account-composed.test.ts (20260911.11 slice
|
|
15
15
|
* 3) when a second composed proof needed the same shape (20260913.01 S1).
|
|
16
|
+
*
|
|
17
|
+
* `servedServices` reads what a composed server ROUTES without binding a
|
|
18
|
+
* port: compose.ts hands one `routes` closure to both transports, and
|
|
19
|
+
* replaying it into a recording router yields the served service
|
|
20
|
+
* descriptors — the enumeration the tier-truthfulness, annotation and
|
|
21
|
+
* wire-permission invariants all stand on, kept here so each does not
|
|
22
|
+
* carry its own recorder.
|
|
16
23
|
*/
|
|
17
24
|
import path from "node:path";
|
|
18
25
|
|
|
19
|
-
import type {
|
|
26
|
+
import type { DescService } from "@bufbuild/protobuf";
|
|
27
|
+
import type {
|
|
28
|
+
ConnectRouter,
|
|
29
|
+
Interceptor,
|
|
30
|
+
Transport,
|
|
31
|
+
} from "@connectrpc/connect";
|
|
20
32
|
import { createGrpcTransport } from "@connectrpc/connect-node";
|
|
21
33
|
|
|
22
34
|
import { createLogger } from "../../boot/logger.js";
|
|
@@ -78,6 +90,25 @@ export function bearer(token: string): Interceptor {
|
|
|
78
90
|
};
|
|
79
91
|
}
|
|
80
92
|
|
|
93
|
+
/** Replays a composed server's `routes` closure into a recorder and returns the services it serves. */
|
|
94
|
+
export function servedServices(
|
|
95
|
+
routes: (router: ConnectRouter) => void,
|
|
96
|
+
): DescService[] {
|
|
97
|
+
const served: DescService[] = [];
|
|
98
|
+
const recorder = {
|
|
99
|
+
handlers: [],
|
|
100
|
+
service(desc: DescService) {
|
|
101
|
+
served.push(desc);
|
|
102
|
+
return recorder;
|
|
103
|
+
},
|
|
104
|
+
rpc() {
|
|
105
|
+
return recorder;
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
routes(recorder as unknown as ConnectRouter);
|
|
109
|
+
return served;
|
|
110
|
+
}
|
|
111
|
+
|
|
81
112
|
/** A gRPC transport to the composed server on `port`, presenting `token` when given. */
|
|
82
113
|
export function transportFor(port: number, token?: string): Transport {
|
|
83
114
|
return createGrpcTransport({
|
|
@@ -544,7 +544,13 @@ describe("extension composition (require-authentication posture)", () => {
|
|
|
544
544
|
};
|
|
545
545
|
expect(parsed.posture).toBe("required");
|
|
546
546
|
expect(parsed.source).toBe("extension 'fake-identity'");
|
|
547
|
-
|
|
547
|
+
// A unit that declares the posture and brings verifiers but NO
|
|
548
|
+
// Authorizer is the BUILT-IN authorization posture: open source
|
|
549
|
+
// composes its Authorizer, and with it the runner-subject verifier
|
|
550
|
+
// between the API-key lane and the unit's own (runnerauth/
|
|
551
|
+
// runner-subject-verifier.ts). A unit with its own Authorizer gets
|
|
552
|
+
// neither (runner-subject-composed.test.ts pins that chain).
|
|
553
|
+
expect(parsed.verifiers).toBe("apikey, runner, fake-verifier");
|
|
548
554
|
});
|
|
549
555
|
|
|
550
556
|
it("a declared posture whose unit registers no verifier of its own is a boot throw naming the unit — the API-key lane alone cannot bootstrap", async () => {
|
|
@@ -573,6 +579,41 @@ describe("extension composition (require-authentication posture)", () => {
|
|
|
573
579
|
rmSync(orphanDir, { recursive: true, force: true });
|
|
574
580
|
}
|
|
575
581
|
});
|
|
582
|
+
|
|
583
|
+
it("a wider edition under the posture with no Authorizer is a boot throw — the built-in authorizer enforces the open-source kinds only", async () => {
|
|
584
|
+
const enterpriseDir = mkdtempSync(
|
|
585
|
+
path.join(tmpdir(), "require-auth-edition-"),
|
|
586
|
+
);
|
|
587
|
+
try {
|
|
588
|
+
await expect(
|
|
589
|
+
composeServer({
|
|
590
|
+
config: loadConfig({
|
|
591
|
+
STIGMER_MODEL_REGISTRY_REFRESH: "off",
|
|
592
|
+
DB_PATH: path.join(enterpriseDir, "stigmer.db"),
|
|
593
|
+
ARTIFACT_LOCAL_BASE_PATH: path.join(enterpriseDir, "artifacts"),
|
|
594
|
+
}),
|
|
595
|
+
logger: createLogger({
|
|
596
|
+
level: "error",
|
|
597
|
+
pretty: false,
|
|
598
|
+
write: () => {},
|
|
599
|
+
}),
|
|
600
|
+
extensions: [
|
|
601
|
+
{
|
|
602
|
+
...requiringExtension,
|
|
603
|
+
name: "enterprise-without-authorizer",
|
|
604
|
+
edition: ServerEdition.enterprise,
|
|
605
|
+
},
|
|
606
|
+
],
|
|
607
|
+
portOverride: 0,
|
|
608
|
+
host: "127.0.0.1",
|
|
609
|
+
}),
|
|
610
|
+
).rejects.toThrowError(
|
|
611
|
+
/serves edition 'enterprise' under the require-authentication posture but registers no Authorizer/,
|
|
612
|
+
);
|
|
613
|
+
} finally {
|
|
614
|
+
rmSync(enterpriseDir, { recursive: true, force: true });
|
|
615
|
+
}
|
|
616
|
+
});
|
|
576
617
|
});
|
|
577
618
|
|
|
578
619
|
/**
|
|
@@ -13,27 +13,67 @@
|
|
|
13
13
|
* offered the org's rows and never the kind's — the same result set,
|
|
14
14
|
* a fraction of the candidates);
|
|
15
15
|
* - the candidates carry {id, org, labels} — the driver's guest
|
|
16
|
-
* cookie rule keys on labels
|
|
16
|
+
* cookie rule keys on labels — and the row's AUTHORIZATION FACTS
|
|
17
|
+
* (creator stamp, visibility level, every parent link), read by the
|
|
18
|
+
* one structural resolver the built-in authorizer reads a loaded row
|
|
19
|
+
* through, so a driver that evaluates the model over a candidate
|
|
20
|
+
* needs no second read of the row;
|
|
17
21
|
* - a kind whose authorization is its parent's (kind_meta PARENT scope
|
|
18
22
|
* + INHERITED owner; agent_execution → session) carries
|
|
19
23
|
* `authorizationParent` on every candidate whose spec names it, the
|
|
20
|
-
* same ResolvedParentLink the tuple lifecycle wrote
|
|
21
|
-
*
|
|
22
|
-
* T04);
|
|
24
|
+
* same ResolvedParentLink the tuple lifecycle wrote and one of the
|
|
25
|
+
* candidate's own parent links; every other kind and every parentless
|
|
26
|
+
* row carries none (stigmer-cloud 20260913.04 T04);
|
|
23
27
|
* - a scope failure PROPAGATES — never an empty result (the outage
|
|
24
28
|
* contract: empty means "authorized to see nothing", outage means
|
|
25
29
|
* INTERNAL through the caller's sanitized arm).
|
|
26
30
|
*/
|
|
31
|
+
import { create } from "@bufbuild/protobuf";
|
|
27
32
|
import { describe, expect, it } from "vitest";
|
|
28
33
|
|
|
29
34
|
import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
|
|
35
|
+
import { ApiResourceVisibility } from "@stigmer/protos/ai/stigmer/commons/apiresource/enum_pb";
|
|
36
|
+
import { ApiResourceAuditSchema } from "@stigmer/protos/ai/stigmer/commons/apiresource/status_pb";
|
|
30
37
|
|
|
31
38
|
import { testCallerIdentity } from "../../pipeline/__tests__/support.js";
|
|
32
39
|
import type { ListEntryMeta, ListReadScope } from "../list-read-scope.js";
|
|
33
40
|
import { restrictListByReadScope } from "../list-read-scope.js";
|
|
41
|
+
import type { ResolvedParentLink } from "../resource-authorization.js";
|
|
34
42
|
|
|
35
43
|
const caller = testCallerIdentity();
|
|
36
44
|
|
|
45
|
+
function organizationLink(org: string): ResolvedParentLink {
|
|
46
|
+
return {
|
|
47
|
+
relation: "organization",
|
|
48
|
+
parentKind: ApiResourceKind.organization,
|
|
49
|
+
parentId: org,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
function sessionLink(session: string): ResolvedParentLink {
|
|
54
|
+
return {
|
|
55
|
+
relation: "session",
|
|
56
|
+
parentKind: ApiResourceKind.session,
|
|
57
|
+
parentId: session,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** The candidate a row with no audit and no visibility set becomes. */
|
|
62
|
+
function bareFacts(
|
|
63
|
+
id: string,
|
|
64
|
+
org: string,
|
|
65
|
+
parentLinks: ReadonlyArray<ResolvedParentLink>,
|
|
66
|
+
): ListEntryMeta {
|
|
67
|
+
return {
|
|
68
|
+
id,
|
|
69
|
+
org,
|
|
70
|
+
labels: {},
|
|
71
|
+
createdBy: "",
|
|
72
|
+
visibility: ApiResourceVisibility.api_resource_visibility_unspecified,
|
|
73
|
+
parentLinks,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
|
|
37
77
|
function row(id: string, org: string, labels: Record<string, string> = {}) {
|
|
38
78
|
return { metadata: { id, org, labels } };
|
|
39
79
|
}
|
|
@@ -155,9 +195,76 @@ describe("restrictListByReadScope", () => {
|
|
|
155
195
|
id: "ses_a",
|
|
156
196
|
org: "acme",
|
|
157
197
|
labels: { "stigmer.ai/guest-cookie-id": "ck_1" },
|
|
198
|
+
createdBy: "",
|
|
199
|
+
visibility: ApiResourceVisibility.api_resource_visibility_unspecified,
|
|
200
|
+
parentLinks: [organizationLink("acme")],
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
id: "ses_b",
|
|
204
|
+
org: "acme",
|
|
205
|
+
labels: {},
|
|
206
|
+
createdBy: "",
|
|
207
|
+
visibility: ApiResourceVisibility.api_resource_visibility_unspecified,
|
|
208
|
+
parentLinks: [organizationLink("acme")],
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
id: "ses_c",
|
|
212
|
+
org: "rival",
|
|
213
|
+
labels: {},
|
|
214
|
+
createdBy: "",
|
|
215
|
+
visibility: ApiResourceVisibility.api_resource_visibility_unspecified,
|
|
216
|
+
parentLinks: [organizationLink("rival")],
|
|
217
|
+
},
|
|
218
|
+
]);
|
|
219
|
+
});
|
|
220
|
+
|
|
221
|
+
it("a candidate carries the row's authorization facts — the creator stamp, the visibility level and every parent link — read by the one resolver the point-check driver reads through", async () => {
|
|
222
|
+
let seen: ReadonlyArray<ListEntryMeta> = [];
|
|
223
|
+
const recording: ListReadScope = {
|
|
224
|
+
authorizedResourceIds: () => Promise.resolve(new Set<string>()),
|
|
225
|
+
restrictListEntries: (_caller, _kind, entries) => {
|
|
226
|
+
seen = entries;
|
|
227
|
+
return Promise.resolve(new Set<string>());
|
|
228
|
+
},
|
|
229
|
+
};
|
|
230
|
+
await restrictListByReadScope(
|
|
231
|
+
recording,
|
|
232
|
+
caller,
|
|
233
|
+
ApiResourceKind.agent_instance,
|
|
234
|
+
[
|
|
235
|
+
{
|
|
236
|
+
metadata: {
|
|
237
|
+
id: "ai_1",
|
|
238
|
+
org: "acme",
|
|
239
|
+
labels: {},
|
|
240
|
+
visibility: ApiResourceVisibility.visibility_org,
|
|
241
|
+
},
|
|
242
|
+
spec: { agentId: "agt_1" },
|
|
243
|
+
status: {
|
|
244
|
+
audit: create(ApiResourceAuditSchema, {
|
|
245
|
+
specAudit: { createdBy: { id: "ida_carol" } },
|
|
246
|
+
}),
|
|
247
|
+
},
|
|
248
|
+
},
|
|
249
|
+
],
|
|
250
|
+
"",
|
|
251
|
+
);
|
|
252
|
+
expect(seen).toEqual([
|
|
253
|
+
{
|
|
254
|
+
id: "ai_1",
|
|
255
|
+
org: "acme",
|
|
256
|
+
labels: {},
|
|
257
|
+
createdBy: "ida_carol",
|
|
258
|
+
visibility: ApiResourceVisibility.visibility_org,
|
|
259
|
+
parentLinks: [
|
|
260
|
+
organizationLink("acme"),
|
|
261
|
+
{
|
|
262
|
+
relation: "agent",
|
|
263
|
+
parentKind: ApiResourceKind.agent,
|
|
264
|
+
parentId: "agt_1",
|
|
265
|
+
},
|
|
266
|
+
],
|
|
158
267
|
},
|
|
159
|
-
{ id: "ses_b", org: "acme", labels: {} },
|
|
160
|
-
{ id: "ses_c", org: "rival", labels: {} },
|
|
161
268
|
]);
|
|
162
269
|
});
|
|
163
270
|
|
|
@@ -198,36 +305,21 @@ describe("restrictListByReadScope", () => {
|
|
|
198
305
|
"",
|
|
199
306
|
);
|
|
200
307
|
expect(kept.map((r) => r.metadata.id)).toEqual(["aex_1", "aex_3"]);
|
|
308
|
+
// The parent is one of the row's parent links — resolved once, named
|
|
309
|
+
// twice: as the link the derivation reads and as the designation a
|
|
310
|
+
// driver may answer in place of the child.
|
|
201
311
|
expect(seen[0]).toEqual([
|
|
202
312
|
{
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
labels: {},
|
|
206
|
-
authorizationParent: {
|
|
207
|
-
relation: "session",
|
|
208
|
-
parentKind: ApiResourceKind.session,
|
|
209
|
-
parentId: "ses_a",
|
|
210
|
-
},
|
|
313
|
+
...bareFacts("aex_1", "acme", [sessionLink("ses_a")]),
|
|
314
|
+
authorizationParent: sessionLink("ses_a"),
|
|
211
315
|
},
|
|
212
316
|
{
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
labels: {},
|
|
216
|
-
authorizationParent: {
|
|
217
|
-
relation: "session",
|
|
218
|
-
parentKind: ApiResourceKind.session,
|
|
219
|
-
parentId: "ses_a",
|
|
220
|
-
},
|
|
317
|
+
...bareFacts("aex_2", "acme", [sessionLink("ses_a")]),
|
|
318
|
+
authorizationParent: sessionLink("ses_a"),
|
|
221
319
|
},
|
|
222
320
|
{
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
labels: {},
|
|
226
|
-
authorizationParent: {
|
|
227
|
-
relation: "session",
|
|
228
|
-
parentKind: ApiResourceKind.session,
|
|
229
|
-
parentId: "ses_b",
|
|
230
|
-
},
|
|
321
|
+
...bareFacts("aex_3", "acme", [sessionLink("ses_b")]),
|
|
322
|
+
authorizationParent: sessionLink("ses_b"),
|
|
231
323
|
},
|
|
232
324
|
]);
|
|
233
325
|
});
|
|
@@ -250,8 +342,8 @@ describe("restrictListByReadScope", () => {
|
|
|
250
342
|
"aex_specless",
|
|
251
343
|
]);
|
|
252
344
|
expect(seen[0]).toEqual([
|
|
253
|
-
|
|
254
|
-
|
|
345
|
+
bareFacts("aex_orphan", "acme", []),
|
|
346
|
+
bareFacts("aex_specless", "acme", []),
|
|
255
347
|
]);
|
|
256
348
|
});
|
|
257
349
|
|
|
@@ -272,7 +364,19 @@ describe("restrictListByReadScope", () => {
|
|
|
272
364
|
runs,
|
|
273
365
|
"",
|
|
274
366
|
);
|
|
275
|
-
|
|
367
|
+
// The instance IS a parent link (the derivation walks
|
|
368
|
+
// `execution_viewer from workflow_instance` through it); it is not
|
|
369
|
+
// the parent the kind's authorization is.
|
|
370
|
+
expect(seen[0]).toEqual([
|
|
371
|
+
bareFacts("wex_1", "acme", [
|
|
372
|
+
organizationLink("acme"),
|
|
373
|
+
{
|
|
374
|
+
relation: "workflow_instance",
|
|
375
|
+
parentKind: ApiResourceKind.workflow_instance,
|
|
376
|
+
parentId: "wfi_1",
|
|
377
|
+
},
|
|
378
|
+
]),
|
|
379
|
+
]);
|
|
276
380
|
});
|
|
277
381
|
|
|
278
382
|
it("no scope composed = the input unchanged, the parent never resolved", async () => {
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pins the built-in posture's boot reconciliation END TO END: a database
|
|
3
|
+
* whose people were provisioned before organization roles existed (the
|
|
4
|
+
* 3.15.x self-host with OIDC on) is given, at its first boot under the
|
|
5
|
+
* enforcing posture, exactly the rows those people's first sign-ins would
|
|
6
|
+
* have written — once, and never again.
|
|
7
|
+
*
|
|
8
|
+
* Three boots over ONE data directory, the shape proven by behaviour over
|
|
9
|
+
* real boots:
|
|
10
|
+
* 1. A fresh server: the founder provisions and founds an organization
|
|
11
|
+
* (the owner row, 2b's lifecycle), the member provisions afterwards
|
|
12
|
+
* (the member row, the hook). Then the 3.15.x shape is made
|
|
13
|
+
* literally on the store the server used: every role row deleted and
|
|
14
|
+
* the reconciliation marker deleted. Accounts, organization and
|
|
15
|
+
* blueprint stay.
|
|
16
|
+
* 2. The same directory boots again: the rows are back — the founder
|
|
17
|
+
* `owner`, the member `member` — each written AS the account it names
|
|
18
|
+
* (the audit actor), `findMyOrganizations` answers the organization
|
|
19
|
+
* to both, and the marker is set.
|
|
20
|
+
* 3. The founder revokes everyone, the member first and then themself,
|
|
21
|
+
* and the directory boots once more: NO row returns. The marker, not
|
|
22
|
+
* "zero rows", is what makes the reconciliation one-shot — a revoked
|
|
23
|
+
* founder is not handed the organization back by a reboot.
|
|
24
|
+
*
|
|
25
|
+
* The unit vouches for unsigned JWT-shaped tokens and declares the
|
|
26
|
+
* require-authentication posture with no Authorizer (composed-support.ts;
|
|
27
|
+
* the open-source OIDC self-host's shape, the same recipe
|
|
28
|
+
* built-in-authorization-composed.test.ts boots). The per-arm proofs of
|
|
29
|
+
* the reconciliation (order, the machine account, the fault, the half-run
|
|
30
|
+
* database) are domain/iampolicy/__tests__/membership.test.ts; this file
|
|
31
|
+
* is the upgrade's definition of done at the wire.
|
|
32
|
+
*/
|
|
33
|
+
import { mkdtempSync, rmSync } from "node:fs";
|
|
34
|
+
import { tmpdir } from "node:os";
|
|
35
|
+
import path from "node:path";
|
|
36
|
+
|
|
37
|
+
import { fromBinary } from "@bufbuild/protobuf";
|
|
38
|
+
import { createClient } from "@connectrpc/connect";
|
|
39
|
+
import { afterAll, beforeAll, describe, expect, it } from "vitest";
|
|
40
|
+
|
|
41
|
+
import { AgentCommandController } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/command_pb";
|
|
42
|
+
import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
|
|
43
|
+
import { ApiResourceVisibility } from "@stigmer/protos/ai/stigmer/commons/apiresource/enum_pb";
|
|
44
|
+
import { IamPolicySchema } from "@stigmer/protos/ai/stigmer/iam/iampolicy/v1/api_pb";
|
|
45
|
+
import { IamPolicyCommandController } from "@stigmer/protos/ai/stigmer/iam/iampolicy/v1/command_pb";
|
|
46
|
+
import { IdentityAccountCommandController } from "@stigmer/protos/ai/stigmer/iam/identityaccount/v1/command_pb";
|
|
47
|
+
import { OrganizationCommandController } from "@stigmer/protos/ai/stigmer/tenancy/organization/v1/command_pb";
|
|
48
|
+
import { OrganizationQueryController } from "@stigmer/protos/ai/stigmer/tenancy/organization/v1/query_pb";
|
|
49
|
+
|
|
50
|
+
import { loadConfig } from "../../boot/config.js";
|
|
51
|
+
import { composeServer } from "../../boot/compose.js";
|
|
52
|
+
import type { ComposedServer } from "../../boot/compose.js";
|
|
53
|
+
import { ROLES_RECONCILED_KEY } from "../../domain/iampolicy/constants.js";
|
|
54
|
+
import { accountIdFor } from "../../domain/identityaccount/constants.js";
|
|
55
|
+
import type { Store } from "../../store/interface.js";
|
|
56
|
+
import type { ServerExtension } from "../registry.js";
|
|
57
|
+
import {
|
|
58
|
+
baseConfig,
|
|
59
|
+
fakeJwt,
|
|
60
|
+
fakeVerifier,
|
|
61
|
+
silentLogger,
|
|
62
|
+
transportFor,
|
|
63
|
+
} from "./composed-support.js";
|
|
64
|
+
|
|
65
|
+
const FOUNDER = "fake|founder";
|
|
66
|
+
const MEMBER = "fake|member";
|
|
67
|
+
const ORG = "reconciled-org";
|
|
68
|
+
|
|
69
|
+
/** `relation@organization` per principal, sorted — the whole role state of the store in one readable shape. */
|
|
70
|
+
async function rolesIn(store: Store): Promise<ReadonlyArray<string>> {
|
|
71
|
+
const rows = await store.listResources(ApiResourceKind.iam_policy);
|
|
72
|
+
return rows
|
|
73
|
+
.map((bytes) => fromBinary(IamPolicySchema, bytes))
|
|
74
|
+
.map(
|
|
75
|
+
(row) =>
|
|
76
|
+
`${row.spec?.principal?.id}:${row.spec?.relation}@${row.spec?.resource?.id}` +
|
|
77
|
+
`|by:${row.status?.audit?.specAudit?.createdBy?.id ?? ""}`,
|
|
78
|
+
)
|
|
79
|
+
.sort();
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
describe("role reconciliation (composed server, OIDC with no unit Authorizer, three boots over one directory)", () => {
|
|
83
|
+
let dir: string;
|
|
84
|
+
let server: ComposedServer;
|
|
85
|
+
let port: number;
|
|
86
|
+
|
|
87
|
+
const unit: ServerExtension = {
|
|
88
|
+
name: "fake-oidc-only",
|
|
89
|
+
requireAuthentication: true,
|
|
90
|
+
identityVerifiers: [fakeVerifier],
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
async function boot(): Promise<void> {
|
|
94
|
+
server = await composeServer({
|
|
95
|
+
config: loadConfig(baseConfig(dir)),
|
|
96
|
+
logger: silentLogger,
|
|
97
|
+
extensions: [unit],
|
|
98
|
+
portOverride: 0,
|
|
99
|
+
host: "127.0.0.1",
|
|
100
|
+
});
|
|
101
|
+
port = await server.start();
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
const asFounder = () =>
|
|
105
|
+
transportFor(port, fakeJwt(FOUNDER, "founder@example.com"));
|
|
106
|
+
const asMember = () =>
|
|
107
|
+
transportFor(port, fakeJwt(MEMBER, "member@example.com"));
|
|
108
|
+
|
|
109
|
+
const founderId = accountIdFor(FOUNDER);
|
|
110
|
+
const memberId = accountIdFor(MEMBER);
|
|
111
|
+
const expectedRows = [
|
|
112
|
+
`${founderId}:owner@${ORG}|by:${founderId}`,
|
|
113
|
+
`${memberId}:member@${ORG}|by:${memberId}`,
|
|
114
|
+
];
|
|
115
|
+
|
|
116
|
+
beforeAll(async () => {
|
|
117
|
+
dir = mkdtempSync(path.join(tmpdir(), "role-reconciliation-"));
|
|
118
|
+
await boot();
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
afterAll(async () => {
|
|
122
|
+
await server.shutdown();
|
|
123
|
+
rmSync(dir, { recursive: true, force: true });
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
it("boot 1: the fresh server writes the rows at sign-in, and the marker is set from the first boot", async () => {
|
|
127
|
+
await createClient(
|
|
128
|
+
IdentityAccountCommandController,
|
|
129
|
+
asFounder(),
|
|
130
|
+
).provisionMyAccount({});
|
|
131
|
+
await createClient(OrganizationCommandController, asFounder()).create({
|
|
132
|
+
apiVersion: "tenancy.stigmer.ai/v1",
|
|
133
|
+
kind: "Organization",
|
|
134
|
+
metadata: { name: ORG, slug: ORG, org: "" },
|
|
135
|
+
spec: { description: ORG },
|
|
136
|
+
});
|
|
137
|
+
await createClient(AgentCommandController, asFounder()).create({
|
|
138
|
+
apiVersion: "agentic.stigmer.ai/v1",
|
|
139
|
+
kind: "Agent",
|
|
140
|
+
metadata: {
|
|
141
|
+
name: "shared",
|
|
142
|
+
org: ORG,
|
|
143
|
+
visibility: ApiResourceVisibility.visibility_org,
|
|
144
|
+
},
|
|
145
|
+
spec: { instructions: "a conformant instruction body" },
|
|
146
|
+
});
|
|
147
|
+
await createClient(
|
|
148
|
+
IdentityAccountCommandController,
|
|
149
|
+
asMember(),
|
|
150
|
+
).provisionMyAccount({});
|
|
151
|
+
|
|
152
|
+
expect(await rolesIn(server.store)).toEqual(expectedRows);
|
|
153
|
+
expect(
|
|
154
|
+
await server.store.bootstrapState.get(ROLES_RECONCILED_KEY),
|
|
155
|
+
).not.toBe("");
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
it("boot 2: over the 3.15.x shape — accounts and no rows, no marker — the rows come back as each person's own, and the marker is set", async () => {
|
|
159
|
+
// The 3.15.x database, made literally on the store the server used.
|
|
160
|
+
await server.store.deleteResourcesByKind(ApiResourceKind.iam_policy);
|
|
161
|
+
await server.store.bootstrapState.delete(ROLES_RECONCILED_KEY);
|
|
162
|
+
expect(await rolesIn(server.store)).toEqual([]);
|
|
163
|
+
await server.shutdown();
|
|
164
|
+
|
|
165
|
+
await boot();
|
|
166
|
+
|
|
167
|
+
expect(await rolesIn(server.store)).toEqual(expectedRows);
|
|
168
|
+
expect(
|
|
169
|
+
await server.store.bootstrapState.get(ROLES_RECONCILED_KEY),
|
|
170
|
+
).not.toBe("");
|
|
171
|
+
const founderOrgs = await createClient(
|
|
172
|
+
OrganizationQueryController,
|
|
173
|
+
asFounder(),
|
|
174
|
+
).findMyOrganizations({});
|
|
175
|
+
const memberOrgs = await createClient(
|
|
176
|
+
OrganizationQueryController,
|
|
177
|
+
asMember(),
|
|
178
|
+
).findMyOrganizations({});
|
|
179
|
+
expect(founderOrgs.entries.map((entry) => entry.metadata?.id)).toEqual([
|
|
180
|
+
ORG,
|
|
181
|
+
]);
|
|
182
|
+
expect(memberOrgs.entries.map((entry) => entry.metadata?.id)).toEqual([
|
|
183
|
+
ORG,
|
|
184
|
+
]);
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
it("boot 3: every role revoked after the marker stays revoked — a reboot hands nothing back", async () => {
|
|
188
|
+
const policies = createClient(IamPolicyCommandController, asFounder());
|
|
189
|
+
await policies.revokeOrgAccess({
|
|
190
|
+
identityAccountId: memberId,
|
|
191
|
+
organizationId: ORG,
|
|
192
|
+
});
|
|
193
|
+
await policies.revokeOrgAccess({
|
|
194
|
+
identityAccountId: founderId,
|
|
195
|
+
organizationId: ORG,
|
|
196
|
+
});
|
|
197
|
+
expect(await rolesIn(server.store)).toEqual([]);
|
|
198
|
+
await server.shutdown();
|
|
199
|
+
|
|
200
|
+
await boot();
|
|
201
|
+
|
|
202
|
+
expect(await rolesIn(server.store)).toEqual([]);
|
|
203
|
+
const founderOrgs = await createClient(
|
|
204
|
+
OrganizationQueryController,
|
|
205
|
+
asFounder(),
|
|
206
|
+
).findMyOrganizations({});
|
|
207
|
+
expect(founderOrgs.entries).toEqual([]);
|
|
208
|
+
});
|
|
209
|
+
});
|
|
@@ -35,7 +35,6 @@ import { mkdtempSync, rmSync } from "node:fs";
|
|
|
35
35
|
import { tmpdir } from "node:os";
|
|
36
36
|
import path from "node:path";
|
|
37
37
|
|
|
38
|
-
import type { DescService } from "@bufbuild/protobuf";
|
|
39
38
|
import type { ConnectRouter } from "@connectrpc/connect";
|
|
40
39
|
import { afterAll, beforeAll, describe, expect, it } from "vitest";
|
|
41
40
|
|
|
@@ -49,6 +48,7 @@ import { composeServer } from "../../boot/compose.js";
|
|
|
49
48
|
import type { ComposedServer } from "../../boot/compose.js";
|
|
50
49
|
import { createLogger } from "../../boot/logger.js";
|
|
51
50
|
import { getKindMeta } from "../../pipeline/apiresource-meta.js";
|
|
51
|
+
import { servedServices } from "./composed-support.js";
|
|
52
52
|
|
|
53
53
|
/** The registry as the check reads it: every kind with kind_meta, by tier. */
|
|
54
54
|
interface KindEntry {
|
|
@@ -134,23 +134,15 @@ function tierViolations(
|
|
|
134
134
|
return violations;
|
|
135
135
|
}
|
|
136
136
|
|
|
137
|
-
/**
|
|
137
|
+
/** The kind segments of the services a composed server routes. */
|
|
138
138
|
function servedKindSegments(
|
|
139
139
|
routes: (router: ConnectRouter) => void,
|
|
140
140
|
): Set<string> {
|
|
141
141
|
const served = new Set<string>();
|
|
142
|
-
const
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
if (segment !== undefined) served.add(segment);
|
|
147
|
-
return recorder;
|
|
148
|
-
},
|
|
149
|
-
rpc() {
|
|
150
|
-
return recorder;
|
|
151
|
-
},
|
|
152
|
-
};
|
|
153
|
-
routes(recorder as unknown as ConnectRouter);
|
|
142
|
+
for (const desc of servedServices(routes)) {
|
|
143
|
+
const segment = kindSegmentOf(desc.typeName);
|
|
144
|
+
if (segment !== undefined) served.add(segment);
|
|
145
|
+
}
|
|
154
146
|
return served;
|
|
155
147
|
}
|
|
156
148
|
|
|
@@ -41,7 +41,9 @@ export interface AuthzCheck {
|
|
|
41
41
|
* (stigmer#224: a nonexistent id answers NOT_FOUND, never
|
|
42
42
|
* PERMISSION_DENIED). Only meaningful with a known kind and a non-empty
|
|
43
43
|
* resource id — anything else is an authorizer contract bug and surfaces
|
|
44
|
-
* as INTERNAL. The OSS permissive default never emits it
|
|
44
|
+
* as INTERNAL. The OSS permissive default never emits it; the built-in
|
|
45
|
+
* authorizer (authorization/authorizer.ts) emits it for a missing target
|
|
46
|
+
* of every kind but the ones the cloud never probes.
|
|
45
47
|
*/
|
|
46
48
|
export type AuthzDecision =
|
|
47
49
|
| { readonly kind: "allow" }
|
|
@@ -54,10 +56,13 @@ export type AuthzDecision =
|
|
|
54
56
|
|
|
55
57
|
/**
|
|
56
58
|
* The pure decision interface. Exactly ONE implementation is composed per
|
|
57
|
-
* server (the resolver enforces it)
|
|
58
|
-
* (
|
|
59
|
-
*
|
|
60
|
-
*
|
|
59
|
+
* server (the resolver enforces it), selected by the authorization posture
|
|
60
|
+
* (authorization/posture.ts): an extension's (the cloud registers OpenFGA);
|
|
61
|
+
* open source's built-in authorizer under an authentication posture (the
|
|
62
|
+
* cloud's model evaluated over tuples derived from the row); or the
|
|
63
|
+
* permissive single-team default on the trusted-local laptop (O2). Write
|
|
64
|
+
* concerns — tuple seeding on create — are NOT authorization checks; they
|
|
65
|
+
* ride the post-persist gate slots (blueprint §5b item 4).
|
|
61
66
|
*/
|
|
62
67
|
export interface Authorizer {
|
|
63
68
|
authorize(caller: CallerIdentity, check: AuthzCheck): Promise<AuthzDecision>;
|
|
@@ -128,7 +128,10 @@ export interface ExtensionDrivers {
|
|
|
128
128
|
* read — the census of docs/authorization-coverage.md — narrows to the
|
|
129
129
|
* caller's authorized rows: post-scan lanes through
|
|
130
130
|
* restrictListByReadScope, the search/activity/summary lanes through
|
|
131
|
-
* the enumeration verb. When absent
|
|
131
|
+
* the enumeration verb. When absent under the built-in authorization
|
|
132
|
+
* posture, open source composes its own (src/authorization/
|
|
133
|
+
* list-read-scope.ts — the model evaluated per candidate); when absent
|
|
134
|
+
* under trusted-local, the OSS full scan — byte-identical.
|
|
132
135
|
*/
|
|
133
136
|
readonly listReadScope?: ListReadScope;
|
|
134
137
|
/**
|