@stigmer/server 3.15.3-dev.20260914100347 → 3.15.3-dev.20260916211208
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/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 +157 -32
- 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 +62 -20
- 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/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 +26 -0
- package/dist/domain/identityaccount/actor.d.ts.map +1 -0
- package/dist/domain/identityaccount/actor.js +17 -0
- package/dist/domain/identityaccount/actor.js.map +1 -0
- 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/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 +101 -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/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 +75 -11
- package/dist/extensions/list-read-scope.d.ts.map +1 -1
- package/dist/extensions/list-read-scope.js +40 -7
- 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/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 +21 -0
- package/dist/pipeline/apiresource-meta.d.ts.map +1 -1
- package/dist/pipeline/apiresource-meta.js +28 -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/authorization-tuples.d.ts.map +1 -1
- package/dist/pipeline/steps/authorization-tuples.js +7 -26
- package/dist/pipeline/steps/authorization-tuples.js.map +1 -1
- 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-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/shapes.d.ts +18 -0
- package/dist/pipeline/steps/shapes.d.ts.map +1 -1
- package/dist/pipeline/steps/shapes.js +29 -0
- package/dist/pipeline/steps/shapes.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/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/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__/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/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 +91 -0
- package/src/authorization/store-test-kit.ts +454 -0
- package/src/authorization/tuples.ts +190 -0
- package/src/boot/compose.ts +175 -38
- package/src/boot/inprocess.ts +108 -30
- package/src/domain/agent/controller.ts +11 -0
- 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/actor.ts +44 -0
- package/src/domain/mcpserver/controller.ts +11 -0
- 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 +681 -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 +149 -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/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 +35 -0
- package/src/extensions/__tests__/list-read-scope.test.ts +245 -3
- 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 +116 -16
- 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/index.ts +51 -1
- package/src/pipeline/__tests__/inherited-authorization-parent.test.ts +51 -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 +37 -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 +3 -9
- 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/authorization-tuples.ts +7 -28
- package/src/pipeline/steps/delete.ts +11 -3
- package/src/pipeline/steps/duplicate.ts +8 -2
- 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/shapes.ts +31 -0
- 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/temporal/schedule/__tests__/run-starter.test.ts +86 -24
- package/src/temporal/schedule/run-starter.ts +31 -8
- 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({
|
|
@@ -573,6 +573,41 @@ describe("extension composition (require-authentication posture)", () => {
|
|
|
573
573
|
rmSync(orphanDir, { recursive: true, force: true });
|
|
574
574
|
}
|
|
575
575
|
});
|
|
576
|
+
|
|
577
|
+
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 () => {
|
|
578
|
+
const enterpriseDir = mkdtempSync(
|
|
579
|
+
path.join(tmpdir(), "require-auth-edition-"),
|
|
580
|
+
);
|
|
581
|
+
try {
|
|
582
|
+
await expect(
|
|
583
|
+
composeServer({
|
|
584
|
+
config: loadConfig({
|
|
585
|
+
STIGMER_MODEL_REGISTRY_REFRESH: "off",
|
|
586
|
+
DB_PATH: path.join(enterpriseDir, "stigmer.db"),
|
|
587
|
+
ARTIFACT_LOCAL_BASE_PATH: path.join(enterpriseDir, "artifacts"),
|
|
588
|
+
}),
|
|
589
|
+
logger: createLogger({
|
|
590
|
+
level: "error",
|
|
591
|
+
pretty: false,
|
|
592
|
+
write: () => {},
|
|
593
|
+
}),
|
|
594
|
+
extensions: [
|
|
595
|
+
{
|
|
596
|
+
...requiringExtension,
|
|
597
|
+
name: "enterprise-without-authorizer",
|
|
598
|
+
edition: ServerEdition.enterprise,
|
|
599
|
+
},
|
|
600
|
+
],
|
|
601
|
+
portOverride: 0,
|
|
602
|
+
host: "127.0.0.1",
|
|
603
|
+
}),
|
|
604
|
+
).rejects.toThrowError(
|
|
605
|
+
/serves edition 'enterprise' under the require-authentication posture but registers no Authorizer/,
|
|
606
|
+
);
|
|
607
|
+
} finally {
|
|
608
|
+
rmSync(enterpriseDir, { recursive: true, force: true });
|
|
609
|
+
}
|
|
610
|
+
});
|
|
576
611
|
});
|
|
577
612
|
|
|
578
613
|
/**
|
|
@@ -13,21 +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;
|
|
21
|
+
* - a kind whose authorization is its parent's (kind_meta PARENT scope
|
|
22
|
+
* + INHERITED owner; agent_execution → session) carries
|
|
23
|
+
* `authorizationParent` on every candidate whose spec names it, the
|
|
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);
|
|
17
27
|
* - a scope failure PROPAGATES — never an empty result (the outage
|
|
18
28
|
* contract: empty means "authorized to see nothing", outage means
|
|
19
29
|
* INTERNAL through the caller's sanitized arm).
|
|
20
30
|
*/
|
|
31
|
+
import { create } from "@bufbuild/protobuf";
|
|
21
32
|
import { describe, expect, it } from "vitest";
|
|
22
33
|
|
|
23
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";
|
|
24
37
|
|
|
25
38
|
import { testCallerIdentity } from "../../pipeline/__tests__/support.js";
|
|
26
39
|
import type { ListEntryMeta, ListReadScope } from "../list-read-scope.js";
|
|
27
40
|
import { restrictListByReadScope } from "../list-read-scope.js";
|
|
41
|
+
import type { ResolvedParentLink } from "../resource-authorization.js";
|
|
28
42
|
|
|
29
43
|
const caller = testCallerIdentity();
|
|
30
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
|
+
|
|
31
77
|
function row(id: string, org: string, labels: Record<string, string> = {}) {
|
|
32
78
|
return { metadata: { id, org, labels } };
|
|
33
79
|
}
|
|
@@ -149,12 +195,208 @@ describe("restrictListByReadScope", () => {
|
|
|
149
195
|
id: "ses_a",
|
|
150
196
|
org: "acme",
|
|
151
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
|
+
],
|
|
152
267
|
},
|
|
153
|
-
{ id: "ses_b", org: "acme", labels: {} },
|
|
154
|
-
{ id: "ses_c", org: "rival", labels: {} },
|
|
155
268
|
]);
|
|
156
269
|
});
|
|
157
270
|
|
|
271
|
+
describe("authorizationParent — the parent a kind's authorization is (20260913.04 T04)", () => {
|
|
272
|
+
function recordingScope(keep: ReadonlyArray<string>) {
|
|
273
|
+
const seen: ReadonlyArray<ListEntryMeta>[] = [];
|
|
274
|
+
const scope: ListReadScope = {
|
|
275
|
+
authorizedResourceIds: () => Promise.resolve(new Set<string>()),
|
|
276
|
+
restrictListEntries: (_caller, _kind, entries) => {
|
|
277
|
+
seen.push(entries);
|
|
278
|
+
return Promise.resolve(new Set(keep));
|
|
279
|
+
},
|
|
280
|
+
};
|
|
281
|
+
return { scope, seen };
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
it("an agent_execution candidate carries its session as the ResolvedParentLink the tuple lifecycle wrote", async () => {
|
|
285
|
+
const executions = [
|
|
286
|
+
{
|
|
287
|
+
metadata: { id: "aex_1", org: "acme", labels: {} },
|
|
288
|
+
spec: { sessionId: "ses_a" },
|
|
289
|
+
},
|
|
290
|
+
{
|
|
291
|
+
metadata: { id: "aex_2", org: "acme", labels: {} },
|
|
292
|
+
spec: { sessionId: "ses_a" },
|
|
293
|
+
},
|
|
294
|
+
{
|
|
295
|
+
metadata: { id: "aex_3", org: "acme", labels: {} },
|
|
296
|
+
spec: { sessionId: "ses_b" },
|
|
297
|
+
},
|
|
298
|
+
];
|
|
299
|
+
const { scope, seen } = recordingScope(["aex_1", "aex_3"]);
|
|
300
|
+
const kept = await restrictListByReadScope(
|
|
301
|
+
scope,
|
|
302
|
+
caller,
|
|
303
|
+
ApiResourceKind.agent_execution,
|
|
304
|
+
executions,
|
|
305
|
+
"",
|
|
306
|
+
);
|
|
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.
|
|
311
|
+
expect(seen[0]).toEqual([
|
|
312
|
+
{
|
|
313
|
+
...bareFacts("aex_1", "acme", [sessionLink("ses_a")]),
|
|
314
|
+
authorizationParent: sessionLink("ses_a"),
|
|
315
|
+
},
|
|
316
|
+
{
|
|
317
|
+
...bareFacts("aex_2", "acme", [sessionLink("ses_a")]),
|
|
318
|
+
authorizationParent: sessionLink("ses_a"),
|
|
319
|
+
},
|
|
320
|
+
{
|
|
321
|
+
...bareFacts("aex_3", "acme", [sessionLink("ses_b")]),
|
|
322
|
+
authorizationParent: sessionLink("ses_b"),
|
|
323
|
+
},
|
|
324
|
+
]);
|
|
325
|
+
});
|
|
326
|
+
|
|
327
|
+
it("a row whose spec does not name its parent carries no parent — offered as itself, never dropped", async () => {
|
|
328
|
+
const executions = [
|
|
329
|
+
{ metadata: { id: "aex_orphan", org: "acme", labels: {} }, spec: {} },
|
|
330
|
+
{ metadata: { id: "aex_specless", org: "acme", labels: {} } },
|
|
331
|
+
];
|
|
332
|
+
const { scope, seen } = recordingScope(["aex_orphan", "aex_specless"]);
|
|
333
|
+
const kept = await restrictListByReadScope(
|
|
334
|
+
scope,
|
|
335
|
+
caller,
|
|
336
|
+
ApiResourceKind.agent_execution,
|
|
337
|
+
executions,
|
|
338
|
+
"",
|
|
339
|
+
);
|
|
340
|
+
expect(kept.map((r) => r.metadata.id)).toEqual([
|
|
341
|
+
"aex_orphan",
|
|
342
|
+
"aex_specless",
|
|
343
|
+
]);
|
|
344
|
+
expect(seen[0]).toEqual([
|
|
345
|
+
bareFacts("aex_orphan", "acme", []),
|
|
346
|
+
bareFacts("aex_specless", "acme", []),
|
|
347
|
+
]);
|
|
348
|
+
});
|
|
349
|
+
|
|
350
|
+
it("a kind whose authorization is its own carries no parent even when its spec names one", async () => {
|
|
351
|
+
// A workflow_execution links its workflow_instance (an additional
|
|
352
|
+
// parent, partial opt-in inheritance) and owns itself: not the pair.
|
|
353
|
+
const runs = [
|
|
354
|
+
{
|
|
355
|
+
metadata: { id: "wex_1", org: "acme", labels: {} },
|
|
356
|
+
spec: { workflowInstanceId: "wfi_1" },
|
|
357
|
+
},
|
|
358
|
+
];
|
|
359
|
+
const { scope, seen } = recordingScope(["wex_1"]);
|
|
360
|
+
await restrictListByReadScope(
|
|
361
|
+
scope,
|
|
362
|
+
caller,
|
|
363
|
+
ApiResourceKind.workflow_execution,
|
|
364
|
+
runs,
|
|
365
|
+
"",
|
|
366
|
+
);
|
|
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
|
+
]);
|
|
380
|
+
});
|
|
381
|
+
|
|
382
|
+
it("no scope composed = the input unchanged, the parent never resolved", async () => {
|
|
383
|
+
const executions = [
|
|
384
|
+
{
|
|
385
|
+
metadata: { id: "aex_1", org: "acme", labels: {} },
|
|
386
|
+
spec: { sessionId: "ses_a" },
|
|
387
|
+
},
|
|
388
|
+
];
|
|
389
|
+
const kept = await restrictListByReadScope(
|
|
390
|
+
undefined,
|
|
391
|
+
caller,
|
|
392
|
+
ApiResourceKind.agent_execution,
|
|
393
|
+
executions,
|
|
394
|
+
"acme",
|
|
395
|
+
);
|
|
396
|
+
expect(kept).toEqual(executions);
|
|
397
|
+
});
|
|
398
|
+
});
|
|
399
|
+
|
|
158
400
|
it("a scope failure propagates — never an empty result", async () => {
|
|
159
401
|
const failing: ListReadScope = {
|
|
160
402
|
authorizedResourceIds: () => Promise.reject(new Error("fga down")),
|
|
@@ -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
|
/**
|