@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
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The built-in Authorizer — open source's driver for the one
|
|
3
|
+
* authorization decision seam (extensions/authorizer.ts), composed under
|
|
4
|
+
* the built-in posture (posture.ts): the cloud's model evaluated over the
|
|
5
|
+
* tuples this row would have had, derived on the fly (evaluator.ts over
|
|
6
|
+
* derived-tuples.ts). Every arm below mirrors the cloud's driver
|
|
7
|
+
* (stigmer-cloud src/authorizer/fga-authorizer.ts) by name and copy, so
|
|
8
|
+
* the two editions answer one question the same way and the drift test
|
|
9
|
+
* can pin the arms and not only the model.
|
|
10
|
+
*
|
|
11
|
+
* The arms, in order:
|
|
12
|
+
* 1. The cloud's four pre-checks with the Java service's copy, each a
|
|
13
|
+
* `deny` with the reason: an unspecified permission, an empty
|
|
14
|
+
* identity, an empty resource id, the unknown kind. No wire caller
|
|
15
|
+
* reaches the unknown kind since the kind refusals landed; the
|
|
16
|
+
* arm is the backstop, not a path.
|
|
17
|
+
* 2. A kind this edition does not serve is `deny` (`kindServedByEdition`,
|
|
18
|
+
* the predicate 2b's `checkMyPermission` arm 1 uses, so the console
|
|
19
|
+
* and the server agree by construction). `platform` is the one that
|
|
20
|
+
* arrives, through `can_set_public_visibility` — under the built-in
|
|
21
|
+
* posture nobody sets public visibility, the model's own reason for
|
|
22
|
+
* making it a platform operator's act.
|
|
23
|
+
* 3. The caller as a person (person.ts) and one derived tuple source for
|
|
24
|
+
* them; the target loaded ONCE through the source's memoised loader,
|
|
25
|
+
* so the read that decides not-found is the read the derivation
|
|
26
|
+
* uses.
|
|
27
|
+
* 4. A missing target is `not-found` — the Authorize step answers the
|
|
28
|
+
* load-first chain's NOT_FOUND (stigmer#224) — EXCEPT for the kinds
|
|
29
|
+
* the cloud never probes (NOT_FOUND_EXEMPT_KINDS): there a missing
|
|
30
|
+
* row is evaluated like any other and denies, so an authenticated
|
|
31
|
+
* member cannot learn which account ids exist. Present or exempt, the
|
|
32
|
+
* row is then evaluated: the cloud asks OpenFGA whether or not the row
|
|
33
|
+
* exists, and so does this driver.
|
|
34
|
+
* 5. `checkRelation` with the point-check context (`allow: true`: a
|
|
35
|
+
* public resource reads for any authenticated caller, the cloud's
|
|
36
|
+
* posture). True is `allow`; false is `deny` with an EMPTY reason, so
|
|
37
|
+
* the method annotation's byte-pinned `error_msg` wins on the wire,
|
|
38
|
+
* exactly the cloud's genuine-denial path.
|
|
39
|
+
*
|
|
40
|
+
* Faults. Everything past the pre-checks runs under one guard: a store
|
|
41
|
+
* fault, a person that names nobody (`personFor`), an evaluation fault
|
|
42
|
+
* (a cycle, the depth bound, an undeclared target — a registry gap the
|
|
43
|
+
* edition pin makes unreachable) all answer `unavailable` with the cause,
|
|
44
|
+
* which the Authorize step maps to INTERNAL. A denial is never a softened
|
|
45
|
+
* outage and an outage is never a denial; the driver itself never throws.
|
|
46
|
+
*
|
|
47
|
+
* Logging. One debug line per deny and per not-found, naming the person's
|
|
48
|
+
* account id, the permission and the object — what an operator needs to
|
|
49
|
+
* answer "why can Alice not see this" — and never the token. Allows are
|
|
50
|
+
* silent; they are the common case.
|
|
51
|
+
*
|
|
52
|
+
* Cost, per check (measured at slice 4): the target row (1), the caller's
|
|
53
|
+
* account (1 primary-key read; 2 for a caller a composition verifier left
|
|
54
|
+
* idp-shaped), the person's IamPolicy rows (1 scan of the port, once per
|
|
55
|
+
* source), and one row per parent hop the model walks.
|
|
56
|
+
*/
|
|
57
|
+
import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
|
|
58
|
+
import type { ServerEdition } from "@stigmer/protos/ai/stigmer/platform/v1/server_info_pb";
|
|
59
|
+
import type { Logger } from "../boot/logger.js";
|
|
60
|
+
import type { IamPolicyStore } from "../domain/iampolicy/store.js";
|
|
61
|
+
import type { Authorizer } from "../extensions/authorizer.js";
|
|
62
|
+
import type { Store } from "../store/interface.js";
|
|
63
|
+
import type { Model } from "./model/index.js";
|
|
64
|
+
import type { AccountsByCaller } from "./person.js";
|
|
65
|
+
/**
|
|
66
|
+
* Kinds whose missing row is a denial, never `not-found` (arm 4): the
|
|
67
|
+
* cloud's `PROBE_EXEMPT_KINDS` restricted to the kinds this edition
|
|
68
|
+
* serves — `platform`, `identity_provider`, `platform_client` and
|
|
69
|
+
* `invitation` are refused by arm 2 before any row is asked about. The
|
|
70
|
+
* cloud's drift test pins the two sets equal over the open-source tier.
|
|
71
|
+
*
|
|
72
|
+
* `iam_policy` is reachable as a target through the IamPolicy RPCs' own
|
|
73
|
+
* `resource.kind` (a caller may name it); the grant scope refuses such a
|
|
74
|
+
* target after the Authorize step in both editions, and the arm here
|
|
75
|
+
* keeps the wire the same on the way there.
|
|
76
|
+
*/
|
|
77
|
+
export declare const NOT_FOUND_EXEMPT_KINDS: ReadonlySet<ApiResourceKind>;
|
|
78
|
+
/** The Java RequestAuthorizationService's pre-check copy, byte for byte (the cloud renders the same). */
|
|
79
|
+
export declare const UNKNOWN_PERMISSION_DENY_REASON = "authorization cannot be performed with unknown permission";
|
|
80
|
+
export declare const EMPTY_IDENTITY_DENY_REASON = "authorization cannot be performed on empty identity string";
|
|
81
|
+
export declare const EMPTY_RESOURCE_ID_DENY_REASON = "authorization cannot be performed on empty api-resource-id";
|
|
82
|
+
export declare const UNKNOWN_KIND_DENY_REASON = "authorization cannot be performed on unknown api-resource-kind";
|
|
83
|
+
/** This edition's own arm; the cloud has no unserved kind to deny. */
|
|
84
|
+
export declare const UNSERVED_KIND_DENY_REASON = "authorization cannot be performed on a kind this edition does not serve";
|
|
85
|
+
export interface BuiltInAuthorizerDeps {
|
|
86
|
+
readonly store: Store;
|
|
87
|
+
/** The port the grant path writes through — the person's rows are read from the same instance. */
|
|
88
|
+
readonly policies: IamPolicyStore;
|
|
89
|
+
/** The account port: the caller's account, and identity_account targets. */
|
|
90
|
+
readonly accounts: AccountsByCaller;
|
|
91
|
+
/** The served edition (`extensions.edition`); the built-in posture pins it to `oss` at boot. */
|
|
92
|
+
readonly edition: ServerEdition;
|
|
93
|
+
readonly logger: Logger;
|
|
94
|
+
/** The declarations to evaluate; the built-in model unless a test says otherwise. */
|
|
95
|
+
readonly model?: Model;
|
|
96
|
+
}
|
|
97
|
+
export declare function newBuiltInAuthorizer(deps: BuiltInAuthorizerDeps): Authorizer;
|
|
98
|
+
//# sourceMappingURL=authorizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authorizer.d.ts","sourceRoot":"","sources":["../../src/authorization/authorizer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,qFAAqF,CAAC;AAEtH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uDAAuD,CAAC;AAE3F,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EACV,UAAU,EAGX,MAAM,6BAA6B,CAAC;AAMrC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAGnD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAKpD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,sBAAsB,EAAE,WAAW,CAAC,eAAe,CAG9D,CAAC;AAEH,yGAAyG;AACzG,eAAO,MAAM,8BAA8B,8DACkB,CAAC;AAC9D,eAAO,MAAM,0BAA0B,+DACuB,CAAC;AAC/D,eAAO,MAAM,6BAA6B,+DACoB,CAAC;AAC/D,eAAO,MAAM,wBAAwB,mEAC6B,CAAC;AACnE,sEAAsE;AACtE,eAAO,MAAM,yBAAyB,4EACqC,CAAC;AAE5E,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,kGAAkG;IAClG,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,4EAA4E;IAC5E,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IACpC,gGAAgG;IAChG,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,qFAAqF;IACrF,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;CACxB;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,qBAAqB,GAAG,UAAU,CA8E5E"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The built-in Authorizer — open source's driver for the one
|
|
3
|
+
* authorization decision seam (extensions/authorizer.ts), composed under
|
|
4
|
+
* the built-in posture (posture.ts): the cloud's model evaluated over the
|
|
5
|
+
* tuples this row would have had, derived on the fly (evaluator.ts over
|
|
6
|
+
* derived-tuples.ts). Every arm below mirrors the cloud's driver
|
|
7
|
+
* (stigmer-cloud src/authorizer/fga-authorizer.ts) by name and copy, so
|
|
8
|
+
* the two editions answer one question the same way and the drift test
|
|
9
|
+
* can pin the arms and not only the model.
|
|
10
|
+
*
|
|
11
|
+
* The arms, in order:
|
|
12
|
+
* 1. The cloud's four pre-checks with the Java service's copy, each a
|
|
13
|
+
* `deny` with the reason: an unspecified permission, an empty
|
|
14
|
+
* identity, an empty resource id, the unknown kind. No wire caller
|
|
15
|
+
* reaches the unknown kind since the kind refusals landed; the
|
|
16
|
+
* arm is the backstop, not a path.
|
|
17
|
+
* 2. A kind this edition does not serve is `deny` (`kindServedByEdition`,
|
|
18
|
+
* the predicate 2b's `checkMyPermission` arm 1 uses, so the console
|
|
19
|
+
* and the server agree by construction). `platform` is the one that
|
|
20
|
+
* arrives, through `can_set_public_visibility` — under the built-in
|
|
21
|
+
* posture nobody sets public visibility, the model's own reason for
|
|
22
|
+
* making it a platform operator's act.
|
|
23
|
+
* 3. The caller as a person (person.ts) and one derived tuple source for
|
|
24
|
+
* them; the target loaded ONCE through the source's memoised loader,
|
|
25
|
+
* so the read that decides not-found is the read the derivation
|
|
26
|
+
* uses.
|
|
27
|
+
* 4. A missing target is `not-found` — the Authorize step answers the
|
|
28
|
+
* load-first chain's NOT_FOUND (stigmer#224) — EXCEPT for the kinds
|
|
29
|
+
* the cloud never probes (NOT_FOUND_EXEMPT_KINDS): there a missing
|
|
30
|
+
* row is evaluated like any other and denies, so an authenticated
|
|
31
|
+
* member cannot learn which account ids exist. Present or exempt, the
|
|
32
|
+
* row is then evaluated: the cloud asks OpenFGA whether or not the row
|
|
33
|
+
* exists, and so does this driver.
|
|
34
|
+
* 5. `checkRelation` with the point-check context (`allow: true`: a
|
|
35
|
+
* public resource reads for any authenticated caller, the cloud's
|
|
36
|
+
* posture). True is `allow`; false is `deny` with an EMPTY reason, so
|
|
37
|
+
* the method annotation's byte-pinned `error_msg` wins on the wire,
|
|
38
|
+
* exactly the cloud's genuine-denial path.
|
|
39
|
+
*
|
|
40
|
+
* Faults. Everything past the pre-checks runs under one guard: a store
|
|
41
|
+
* fault, a person that names nobody (`personFor`), an evaluation fault
|
|
42
|
+
* (a cycle, the depth bound, an undeclared target — a registry gap the
|
|
43
|
+
* edition pin makes unreachable) all answer `unavailable` with the cause,
|
|
44
|
+
* which the Authorize step maps to INTERNAL. A denial is never a softened
|
|
45
|
+
* outage and an outage is never a denial; the driver itself never throws.
|
|
46
|
+
*
|
|
47
|
+
* Logging. One debug line per deny and per not-found, naming the person's
|
|
48
|
+
* account id, the permission and the object — what an operator needs to
|
|
49
|
+
* answer "why can Alice not see this" — and never the token. Allows are
|
|
50
|
+
* silent; they are the common case.
|
|
51
|
+
*
|
|
52
|
+
* Cost, per check (measured at slice 4): the target row (1), the caller's
|
|
53
|
+
* account (1 primary-key read; 2 for a caller a composition verifier left
|
|
54
|
+
* idp-shaped), the person's IamPolicy rows (1 scan of the port, once per
|
|
55
|
+
* source), and one row per parent hop the model walks.
|
|
56
|
+
*/
|
|
57
|
+
import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
|
|
58
|
+
import { IamPermission } from "@stigmer/protos/ai/stigmer/iam/v1/enum_pb";
|
|
59
|
+
import { kindEnumName, kindServedByEdition, } from "../pipeline/apiresource-meta.js";
|
|
60
|
+
import { newDerivedTupleSource } from "./derived-tuples.js";
|
|
61
|
+
import { checkRelation } from "./evaluator.js";
|
|
62
|
+
import { builtInModel } from "./model/index.js";
|
|
63
|
+
import { resolvePerson } from "./person.js";
|
|
64
|
+
import { formatObjectRef } from "./tuples.js";
|
|
65
|
+
/**
|
|
66
|
+
* Kinds whose missing row is a denial, never `not-found` (arm 4): the
|
|
67
|
+
* cloud's `PROBE_EXEMPT_KINDS` restricted to the kinds this edition
|
|
68
|
+
* serves — `platform`, `identity_provider`, `platform_client` and
|
|
69
|
+
* `invitation` are refused by arm 2 before any row is asked about. The
|
|
70
|
+
* cloud's drift test pins the two sets equal over the open-source tier.
|
|
71
|
+
*
|
|
72
|
+
* `iam_policy` is reachable as a target through the IamPolicy RPCs' own
|
|
73
|
+
* `resource.kind` (a caller may name it); the grant scope refuses such a
|
|
74
|
+
* target after the Authorize step in both editions, and the arm here
|
|
75
|
+
* keeps the wire the same on the way there.
|
|
76
|
+
*/
|
|
77
|
+
export const NOT_FOUND_EXEMPT_KINDS = new Set([
|
|
78
|
+
ApiResourceKind.identity_account,
|
|
79
|
+
ApiResourceKind.iam_policy,
|
|
80
|
+
]);
|
|
81
|
+
/** The Java RequestAuthorizationService's pre-check copy, byte for byte (the cloud renders the same). */
|
|
82
|
+
export const UNKNOWN_PERMISSION_DENY_REASON = "authorization cannot be performed with unknown permission";
|
|
83
|
+
export const EMPTY_IDENTITY_DENY_REASON = "authorization cannot be performed on empty identity string";
|
|
84
|
+
export const EMPTY_RESOURCE_ID_DENY_REASON = "authorization cannot be performed on empty api-resource-id";
|
|
85
|
+
export const UNKNOWN_KIND_DENY_REASON = "authorization cannot be performed on unknown api-resource-kind";
|
|
86
|
+
/** This edition's own arm; the cloud has no unserved kind to deny. */
|
|
87
|
+
export const UNSERVED_KIND_DENY_REASON = "authorization cannot be performed on a kind this edition does not serve";
|
|
88
|
+
export function newBuiltInAuthorizer(deps) {
|
|
89
|
+
const model = deps.model ?? builtInModel;
|
|
90
|
+
return {
|
|
91
|
+
async authorize(caller, check) {
|
|
92
|
+
if (check.permission === IamPermission.unspecified) {
|
|
93
|
+
return deny(UNKNOWN_PERMISSION_DENY_REASON);
|
|
94
|
+
}
|
|
95
|
+
if (caller.identityId === "") {
|
|
96
|
+
return deny(EMPTY_IDENTITY_DENY_REASON);
|
|
97
|
+
}
|
|
98
|
+
if (check.resourceId === "") {
|
|
99
|
+
return deny(EMPTY_RESOURCE_ID_DENY_REASON);
|
|
100
|
+
}
|
|
101
|
+
if (check.resourceKind === ApiResourceKind.api_resource_kind_unknown) {
|
|
102
|
+
return deny(UNKNOWN_KIND_DENY_REASON);
|
|
103
|
+
}
|
|
104
|
+
if (!kindServedByEdition(check.resourceKind, deps.edition)) {
|
|
105
|
+
return deny(UNSERVED_KIND_DENY_REASON);
|
|
106
|
+
}
|
|
107
|
+
const object = {
|
|
108
|
+
type: kindEnumName(check.resourceKind),
|
|
109
|
+
id: check.resourceId,
|
|
110
|
+
};
|
|
111
|
+
const relation = IamPermission[check.permission];
|
|
112
|
+
try {
|
|
113
|
+
const person = await resolvePerson(deps.accounts, caller);
|
|
114
|
+
const source = newDerivedTupleSource({
|
|
115
|
+
store: deps.store,
|
|
116
|
+
policies: deps.policies,
|
|
117
|
+
accounts: deps.accounts,
|
|
118
|
+
model,
|
|
119
|
+
}, person);
|
|
120
|
+
const row = await source.loader.load(object);
|
|
121
|
+
if (row === undefined &&
|
|
122
|
+
!NOT_FOUND_EXEMPT_KINDS.has(check.resourceKind)) {
|
|
123
|
+
deps.logger.debug("authorization target not found", {
|
|
124
|
+
account: person.accountId,
|
|
125
|
+
permission: relation,
|
|
126
|
+
object: formatObjectRef(object),
|
|
127
|
+
});
|
|
128
|
+
return { kind: "not-found" };
|
|
129
|
+
}
|
|
130
|
+
const allowed = await checkRelation({ model, source }, object, relation, person, { allow: true });
|
|
131
|
+
if (allowed) {
|
|
132
|
+
return { kind: "allow" };
|
|
133
|
+
}
|
|
134
|
+
deps.logger.debug("authorization denied", {
|
|
135
|
+
account: person.accountId,
|
|
136
|
+
permission: relation,
|
|
137
|
+
object: formatObjectRef(object),
|
|
138
|
+
});
|
|
139
|
+
// Empty on purpose: the Authorize step then surfaces the method
|
|
140
|
+
// annotation's byte-pinned error_msg (or its fallback copy), the
|
|
141
|
+
// cloud's genuine-denial path.
|
|
142
|
+
return deny("");
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
return {
|
|
146
|
+
kind: "unavailable",
|
|
147
|
+
cause: error instanceof Error ? error : new Error(String(error)),
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
},
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
function deny(reason) {
|
|
154
|
+
return { kind: "deny", reason };
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=authorizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authorizer.js","sourceRoot":"","sources":["../../src/authorization/authorizer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
|
|
2
|
+
import type { IamPolicyStore } from "../domain/iampolicy/store.js";
|
|
3
|
+
import type { IdentityAccountStore } from "../domain/identityaccount/store.js";
|
|
4
|
+
import type { Store } from "../store/interface.js";
|
|
5
|
+
import type { RowFacts } from "./facts.js";
|
|
6
|
+
import type { Model } from "./model/index.js";
|
|
7
|
+
import type { Person, RowLoader, Tuple, TupleSource } from "./tuples.js";
|
|
8
|
+
/**
|
|
9
|
+
* Kinds whose `[identity_account]` owner is recorded as an IamPolicy row
|
|
10
|
+
* by this edition (the module header): the derivation writes no owner
|
|
11
|
+
* tuple for them. Mirrors role-lifecycle.ts's create arm, which writes
|
|
12
|
+
* the row for `organization` and nothing else.
|
|
13
|
+
*/
|
|
14
|
+
export declare const ROW_RECORDED_OWNER_KINDS: ReadonlySet<ApiResourceKind>;
|
|
15
|
+
/** The tuples a row stands for, in the cloud driver's shapes and order. */
|
|
16
|
+
export declare function deriveTuples(facts: RowFacts): ReadonlyArray<Tuple>;
|
|
17
|
+
export interface DerivedTupleSourceDeps {
|
|
18
|
+
readonly store: Store;
|
|
19
|
+
/** The port the grant path writes through — the rows are read from the same instance. */
|
|
20
|
+
readonly policies: IamPolicyStore;
|
|
21
|
+
/** The account port — an `identity_account` object is read through it, never the generic Store (the module header). */
|
|
22
|
+
readonly accounts: Pick<IdentityAccountStore, "findById">;
|
|
23
|
+
/** The declarations to derive with; the built-in model unless a test says otherwise. */
|
|
24
|
+
readonly model?: Model;
|
|
25
|
+
}
|
|
26
|
+
export interface DerivedTupleSource extends TupleSource {
|
|
27
|
+
/** The memoised row reads, exposed for a declaration's `derived` rules and for tests. */
|
|
28
|
+
readonly loader: RowLoader;
|
|
29
|
+
/**
|
|
30
|
+
* The person's own IamPolicy rows as tuples — the ONE read of them this
|
|
31
|
+
* source makes, shared with `tuplesOf`. A list-shaped consumer (the
|
|
32
|
+
* organization directory; the list scope) reads its candidate objects
|
|
33
|
+
* from here instead of scanning the port a second time.
|
|
34
|
+
*/
|
|
35
|
+
personTuples(): Promise<ReadonlyArray<Tuple>>;
|
|
36
|
+
}
|
|
37
|
+
export interface DerivedTupleSourceSeed {
|
|
38
|
+
/** Objects whose facts the caller already holds; their rows are not read for derivation. */
|
|
39
|
+
readonly facts: ReadonlyArray<RowFacts>;
|
|
40
|
+
}
|
|
41
|
+
export declare function newDerivedTupleSource(deps: DerivedTupleSourceDeps, person: Person, seed?: DerivedTupleSourceSeed): DerivedTupleSource;
|
|
42
|
+
//# sourceMappingURL=derived-tuples.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derived-tuples.d.ts","sourceRoot":"","sources":["../../src/authorization/derived-tuples.ts"],"names":[],"mappings":"AAiEA,OAAO,EAAE,eAAe,EAAE,MAAM,qFAAqF,CAAC;AAKtH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAQ/E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAEnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,KAAK,EAEV,MAAM,EACN,SAAS,EAET,KAAK,EACL,WAAW,EACZ,MAAM,aAAa,CAAC;AAOrB;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,EAAE,WAAW,CAAC,eAAe,CAEhE,CAAC;AAMH,2EAA2E;AAC3E,wBAAgB,YAAY,CAAC,KAAK,EAAE,QAAQ,GAAG,aAAa,CAAC,KAAK,CAAC,CAuDlE;AAoCD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,yFAAyF;IACzF,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,uHAAuH;IACvH,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,oBAAoB,EAAE,UAAU,CAAC,CAAC;IAC1D,wFAAwF;IACxF,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;CACxB;AAED,MAAM,WAAW,kBAAmB,SAAQ,WAAW;IACrD,yFAAyF;IACzF,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B;;;;;OAKG;IACH,YAAY,IAAI,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;CAC/C;AAED,MAAM,WAAW,sBAAsB;IACrC,4FAA4F;IAC5F,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;CACzC;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,sBAAsB,EAC5B,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,sBAAsB,GAC5B,kBAAkB,CAoFpB"}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
|
|
2
|
+
import { OwnerAttributionType } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/authorization_config_pb";
|
|
3
|
+
import { isPersonStamp } from "../domain/iampolicy/membership.js";
|
|
4
|
+
import { getKindMeta, kindByEnumName, kindEnumName, } from "../pipeline/apiresource-meta.js";
|
|
5
|
+
import { visibilityShapesFor } from "../pipeline/steps/authorization-tuples.js";
|
|
6
|
+
import { ResourceNotFoundError } from "../store/interface.js";
|
|
7
|
+
import { rowFactsOf } from "./facts.js";
|
|
8
|
+
import { builtInModel } from "./model/index.js";
|
|
9
|
+
import { ACCOUNT_TYPE, ALLOW_PUBLIC_CONDITION, formatObjectRef, } from "./tuples.js";
|
|
10
|
+
/**
|
|
11
|
+
* Kinds whose `[identity_account]` owner is recorded as an IamPolicy row
|
|
12
|
+
* by this edition (the module header): the derivation writes no owner
|
|
13
|
+
* tuple for them. Mirrors role-lifecycle.ts's create arm, which writes
|
|
14
|
+
* the row for `organization` and nothing else.
|
|
15
|
+
*/
|
|
16
|
+
export const ROW_RECORDED_OWNER_KINDS = new Set([
|
|
17
|
+
ApiResourceKind.organization,
|
|
18
|
+
]);
|
|
19
|
+
function account(id) {
|
|
20
|
+
return { form: "object", object: { type: ACCOUNT_TYPE, id } };
|
|
21
|
+
}
|
|
22
|
+
/** The tuples a row stands for, in the cloud driver's shapes and order. */
|
|
23
|
+
export function deriveTuples(facts) {
|
|
24
|
+
const object = { type: kindEnumName(facts.kind), id: facts.id };
|
|
25
|
+
const config = getKindMeta(facts.kind).authorization;
|
|
26
|
+
if (config === undefined) {
|
|
27
|
+
return [];
|
|
28
|
+
}
|
|
29
|
+
const tuples = [];
|
|
30
|
+
for (const link of facts.parentLinks) {
|
|
31
|
+
tuples.push({
|
|
32
|
+
object,
|
|
33
|
+
relation: link.relation,
|
|
34
|
+
subject: {
|
|
35
|
+
form: "object",
|
|
36
|
+
object: { type: kindEnumName(link.parentKind), id: link.parentId },
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
const stampIsPerson = isPersonStamp(facts.createdBy);
|
|
41
|
+
switch (config.ownerType) {
|
|
42
|
+
case OwnerAttributionType.DIRECT:
|
|
43
|
+
if (stampIsPerson && !ROW_RECORDED_OWNER_KINDS.has(facts.kind)) {
|
|
44
|
+
tuples.push({
|
|
45
|
+
object,
|
|
46
|
+
relation: "owner",
|
|
47
|
+
subject: account(facts.createdBy),
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
break;
|
|
51
|
+
case OwnerAttributionType.SELF:
|
|
52
|
+
tuples.push({ object, relation: "owner", subject: account(facts.id) });
|
|
53
|
+
break;
|
|
54
|
+
case OwnerAttributionType.INHERITED:
|
|
55
|
+
case OwnerAttributionType.NONE:
|
|
56
|
+
case OwnerAttributionType.UNSPECIFIED:
|
|
57
|
+
// Inherited: the model walks `owner from <parent>`; none: the kind has no owner.
|
|
58
|
+
break;
|
|
59
|
+
default: {
|
|
60
|
+
const exhaustive = config.ownerType;
|
|
61
|
+
throw new Error(`unknown owner attribution: ${String(exhaustive)}`);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (config.requiresCreatorTuple && stampIsPerson) {
|
|
65
|
+
tuples.push({
|
|
66
|
+
object,
|
|
67
|
+
relation: "creator",
|
|
68
|
+
subject: account(facts.createdBy),
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
for (const shape of visibilityShapesFor(facts.kind, facts.visibility)) {
|
|
72
|
+
const subject = visibilitySubject(shape, facts.org);
|
|
73
|
+
if (subject !== undefined) {
|
|
74
|
+
tuples.push({ object, relation: "viewer", subject });
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return tuples;
|
|
78
|
+
}
|
|
79
|
+
/** The driver's grant table for a visibility shape; undefined where this edition writes nothing. */
|
|
80
|
+
function visibilitySubject(shape, org) {
|
|
81
|
+
switch (shape) {
|
|
82
|
+
case "org-viewer":
|
|
83
|
+
// No organization to point at (a legacy row): no userset.
|
|
84
|
+
return org === ""
|
|
85
|
+
? undefined
|
|
86
|
+
: {
|
|
87
|
+
form: "userset",
|
|
88
|
+
object: { type: "organization", id: org },
|
|
89
|
+
relation: "viewer",
|
|
90
|
+
};
|
|
91
|
+
case "public-viewer":
|
|
92
|
+
return {
|
|
93
|
+
form: "wildcard",
|
|
94
|
+
type: ACCOUNT_TYPE,
|
|
95
|
+
condition: ALLOW_PUBLIC_CONDITION,
|
|
96
|
+
};
|
|
97
|
+
case "platform-viewer":
|
|
98
|
+
return undefined;
|
|
99
|
+
default: {
|
|
100
|
+
const exhaustive = shape;
|
|
101
|
+
throw new Error(`unknown visibility shape: ${String(exhaustive)}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
export function newDerivedTupleSource(deps, person, seed) {
|
|
106
|
+
const model = deps.model ?? builtInModel;
|
|
107
|
+
const rows = new Map();
|
|
108
|
+
const derived = new Map();
|
|
109
|
+
const seeded = new Map();
|
|
110
|
+
for (const facts of seed?.facts ?? []) {
|
|
111
|
+
seeded.set(formatObjectRef({ type: kindEnumName(facts.kind), id: facts.id }), facts);
|
|
112
|
+
}
|
|
113
|
+
let personRows;
|
|
114
|
+
const loader = {
|
|
115
|
+
load(object) {
|
|
116
|
+
const key = formatObjectRef(object);
|
|
117
|
+
const held = rows.get(key);
|
|
118
|
+
if (held !== undefined) {
|
|
119
|
+
return held;
|
|
120
|
+
}
|
|
121
|
+
const loading = loadRow(deps, model, object);
|
|
122
|
+
rows.set(key, loading);
|
|
123
|
+
return loading;
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
function derivedTuplesOf(object) {
|
|
127
|
+
const key = formatObjectRef(object);
|
|
128
|
+
const held = derived.get(key);
|
|
129
|
+
if (held !== undefined) {
|
|
130
|
+
return held;
|
|
131
|
+
}
|
|
132
|
+
const declaration = model.byType(object.type);
|
|
133
|
+
const known = seeded.get(key);
|
|
134
|
+
let deriving;
|
|
135
|
+
if (declaration === undefined) {
|
|
136
|
+
deriving = Promise.resolve([]);
|
|
137
|
+
}
|
|
138
|
+
else if (known !== undefined) {
|
|
139
|
+
deriving = Promise.resolve(deriveTuples(known));
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
deriving = loader
|
|
143
|
+
.load(object)
|
|
144
|
+
.then((row) => row === undefined
|
|
145
|
+
? []
|
|
146
|
+
: deriveTuples(rowFactsOf(declaration.kind, row)));
|
|
147
|
+
}
|
|
148
|
+
derived.set(key, deriving);
|
|
149
|
+
return deriving;
|
|
150
|
+
}
|
|
151
|
+
function rowTuples() {
|
|
152
|
+
if (personRows === undefined) {
|
|
153
|
+
personRows = deps.policies
|
|
154
|
+
.findByPrincipal(ACCOUNT_TYPE, person.accountId)
|
|
155
|
+
.then((found) => found.map(tupleOfRow));
|
|
156
|
+
}
|
|
157
|
+
return personRows;
|
|
158
|
+
}
|
|
159
|
+
return {
|
|
160
|
+
loader,
|
|
161
|
+
personTuples: rowTuples,
|
|
162
|
+
async tuplesOf(object, relation) {
|
|
163
|
+
const onPair = (tuple) => tuple.relation === relation &&
|
|
164
|
+
tuple.object.type === object.type &&
|
|
165
|
+
tuple.object.id === object.id;
|
|
166
|
+
const fromRows = (await rowTuples()).filter(onPair);
|
|
167
|
+
const declaration = model.byType(object.type);
|
|
168
|
+
if (declaration === undefined) {
|
|
169
|
+
return fromRows;
|
|
170
|
+
}
|
|
171
|
+
const fromRow = (await derivedTuplesOf(object)).filter(onPair);
|
|
172
|
+
const rule = declaration.derived.get(relation);
|
|
173
|
+
if (rule === undefined) {
|
|
174
|
+
return [...fromRows, ...fromRow];
|
|
175
|
+
}
|
|
176
|
+
const row = await loader.load(object);
|
|
177
|
+
const fromRule = row === undefined ? [] : await rule(object, row, loader);
|
|
178
|
+
return [...fromRows, ...fromRow, ...fromRule];
|
|
179
|
+
},
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
/** The decoded row for an object, or undefined when the kind is not declared or the row does not exist. */
|
|
183
|
+
async function loadRow(deps, model, object) {
|
|
184
|
+
const declaration = model.byType(object.type);
|
|
185
|
+
const kind = kindByEnumName(object.type);
|
|
186
|
+
if (declaration === undefined ||
|
|
187
|
+
kind === ApiResourceKind.api_resource_kind_unknown ||
|
|
188
|
+
object.id === "") {
|
|
189
|
+
return undefined;
|
|
190
|
+
}
|
|
191
|
+
if (kind === ApiResourceKind.identity_account) {
|
|
192
|
+
return deps.accounts.findById(object.id);
|
|
193
|
+
}
|
|
194
|
+
try {
|
|
195
|
+
return await deps.store.getResource(kind, object.id, declaration.schema);
|
|
196
|
+
}
|
|
197
|
+
catch (error) {
|
|
198
|
+
if (error instanceof ResourceNotFoundError) {
|
|
199
|
+
return undefined;
|
|
200
|
+
}
|
|
201
|
+
throw error;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
/** An IamPolicy row as the tuple it records: `resource#relation@principal`. */
|
|
205
|
+
function tupleOfRow(row) {
|
|
206
|
+
const spec = row.spec;
|
|
207
|
+
const principal = spec?.principal;
|
|
208
|
+
const resource = spec?.resource;
|
|
209
|
+
const object = {
|
|
210
|
+
type: resource?.kind ?? "",
|
|
211
|
+
id: resource?.id ?? "",
|
|
212
|
+
};
|
|
213
|
+
const principalObject = {
|
|
214
|
+
type: principal?.kind ?? "",
|
|
215
|
+
id: principal?.id ?? "",
|
|
216
|
+
};
|
|
217
|
+
let subject;
|
|
218
|
+
if (principal !== undefined && principal.relation !== "") {
|
|
219
|
+
subject = {
|
|
220
|
+
form: "userset",
|
|
221
|
+
object: principalObject,
|
|
222
|
+
relation: principal.relation,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
else if (principalObject.id === "*") {
|
|
226
|
+
// A wildcard row carries no condition of its own; the evaluator
|
|
227
|
+
// honours it only where a line admits an unconditioned wildcard,
|
|
228
|
+
// which no line in the model does.
|
|
229
|
+
subject = {
|
|
230
|
+
form: "wildcard",
|
|
231
|
+
type: principalObject.type,
|
|
232
|
+
condition: undefined,
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
subject = { form: "object", object: principalObject };
|
|
237
|
+
}
|
|
238
|
+
return { object, relation: spec?.relation ?? "", subject };
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=derived-tuples.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"derived-tuples.js","sourceRoot":"","sources":["../../src/authorization/derived-tuples.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The evaluator — OpenFGA's check, over the built-in model and a tuple
|
|
3
|
+
* source, small because the model uses four rewrite forms and nothing
|
|
4
|
+
* else (model/rewrite.ts). `checkRelation(object, relation, person, context)`
|
|
5
|
+
* answers "does this person hold this relation on this object" the way
|
|
6
|
+
* the cloud's engine answers it over stored tuples, so the two editions
|
|
7
|
+
* share one meaning of authorization.
|
|
8
|
+
*
|
|
9
|
+
* The walk, in the order a `.fga` line reads:
|
|
10
|
+
* - `this`: the tuples on (object, relation). A tuple counts only if
|
|
11
|
+
* its subject's TYPE is in the line's restriction list — the check
|
|
12
|
+
* OpenFGA makes at write time, made here at read time, so a derived
|
|
13
|
+
* tuple the model no longer admits denies instead of allowing. An
|
|
14
|
+
* object subject matches when it names one of the person's aliases;
|
|
15
|
+
* a userset subject is resolved on its own object; the wildcard is
|
|
16
|
+
* honoured only under its condition (`allow_public` reads the
|
|
17
|
+
* context's `allow`; an unknown condition is a fault).
|
|
18
|
+
* - `computed`: the same object, another relation.
|
|
19
|
+
* - `from`: every object the tupleset relation links to (again within
|
|
20
|
+
* the tupleset line's type restriction), resolved for the relation.
|
|
21
|
+
* - `union`: the first true member wins; members are tried in the
|
|
22
|
+
* line's order, so the cheap arms the model lists first (the person's
|
|
23
|
+
* own owner tuple) are read before the hops.
|
|
24
|
+
*
|
|
25
|
+
* Bounds and faults. Every (object, relation) pair is resolved once per
|
|
26
|
+
* check (the memo — a diamond such as `owner` reached through `viewer`
|
|
27
|
+
* and through `can_edit` reads the source once). A pair re-entered while
|
|
28
|
+
* it is being resolved is a cycle in the declarations, which is a bug,
|
|
29
|
+
* and a resolution deeper than MAX_RESOLUTION_DEPTH is the same class of
|
|
30
|
+
* bug; both throw, because the alternative — a quiet `false` — would turn
|
|
31
|
+
* a broken transcript into a lockout nobody can see. A kind the model does
|
|
32
|
+
* not declare is a fault as the check's TARGET (the driver refuses
|
|
33
|
+
* unserved kinds before evaluation, so reaching here is a registry gap)
|
|
34
|
+
* and simply an object with no relations when reached through a tuple
|
|
35
|
+
* (`identity_provider#platform_user`, which no open-source tuple names).
|
|
36
|
+
* A relation the kind does not declare is `false` — the ruled answer for
|
|
37
|
+
* a wire question the model has no line for, where OpenFGA
|
|
38
|
+
* itself answers a validation error.
|
|
39
|
+
*
|
|
40
|
+
* The evaluator does no I/O of its own and knows no store: the source
|
|
41
|
+
* owns every read, and a fault it raises propagates through untouched,
|
|
42
|
+
* so the driver above can fold it into `unavailable` and never into a
|
|
43
|
+
* denial.
|
|
44
|
+
*/
|
|
45
|
+
import type { Model } from "./model/index.js";
|
|
46
|
+
import type { CheckContext, ObjectRef, Person, TupleSource } from "./tuples.js";
|
|
47
|
+
/**
|
|
48
|
+
* OpenFGA's default resolution-depth limit (its `resolveNodeLimit`), so
|
|
49
|
+
* the bound here is the oracle's own and not a number chosen locally. The
|
|
50
|
+
* deepest real chain in the model is under ten: an instance's `viewer
|
|
51
|
+
* from default_of` to its blueprint, the blueprint's `admin from
|
|
52
|
+
* organization`, then the organization's four-rung ladder.
|
|
53
|
+
*/
|
|
54
|
+
export declare const MAX_RESOLUTION_DEPTH = 25;
|
|
55
|
+
export type EvaluationFault = "undeclared-target-kind" | "resolution-depth-exceeded" | "resolution-cycle" | "unknown-condition";
|
|
56
|
+
/** A fault in the model or its evaluation — never a denial; the driver maps it to `unavailable`. */
|
|
57
|
+
export declare class AuthorizationEvaluationError extends Error {
|
|
58
|
+
readonly reason: EvaluationFault;
|
|
59
|
+
constructor(reason: EvaluationFault, message: string);
|
|
60
|
+
}
|
|
61
|
+
export interface EvaluationDeps {
|
|
62
|
+
readonly model: Model;
|
|
63
|
+
readonly source: TupleSource;
|
|
64
|
+
}
|
|
65
|
+
export declare function checkRelation(deps: EvaluationDeps, object: ObjectRef, relation: string, person: Person, context: CheckContext): Promise<boolean>;
|
|
66
|
+
//# sourceMappingURL=evaluator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluator.d.ts","sourceRoot":"","sources":["../../src/authorization/evaluator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,KAAK,EACV,YAAY,EACZ,SAAS,EACT,MAAM,EAEN,WAAW,EACZ,MAAM,aAAa,CAAC;AAQrB;;;;;;GAMG;AACH,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC,MAAM,MAAM,eAAe,GACvB,wBAAwB,GACxB,2BAA2B,GAC3B,kBAAkB,GAClB,mBAAmB,CAAC;AAExB,oGAAoG;AACpG,qBAAa,4BAA6B,SAAQ,KAAK;IACrD,QAAQ,CAAC,MAAM,EAAE,eAAe,CAAC;gBAErB,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM;CAKrD;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;CAC9B;AAED,wBAAsB,aAAa,CACjC,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,SAAS,EACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,OAAO,CAAC,CAQlB"}
|