@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
|
@@ -32,7 +32,13 @@
|
|
|
32
32
|
*
|
|
33
33
|
* - No scope composed = the OSS full scan, byte-identical (the four
|
|
34
34
|
* local conformance rosters pin it; the org argument is then not
|
|
35
|
-
* consulted either).
|
|
35
|
+
* consulted either). That is the trusted-local posture. Under the
|
|
36
|
+
* built-in authorization posture (src/authorization/posture.ts — an
|
|
37
|
+
* authentication posture with no unit Authorizer) open source
|
|
38
|
+
* composes its own scope (src/authorization/list-read-scope.ts): the
|
|
39
|
+
* cloud's model, evaluated per candidate over the facts the candidate
|
|
40
|
+
* carries, so a self-host's lists show a person what a `get` would
|
|
41
|
+
* let them read. A unit's registered scope wins in every posture.
|
|
36
42
|
* - A scope only NARROWS. It never reorders, never adds; sort/filter
|
|
37
43
|
* tails, per-lane org intersection, and empty-set semantics (empty
|
|
38
44
|
* list, proto default instance, kind-skipped) stay consumer-owned
|
|
@@ -71,21 +77,76 @@
|
|
|
71
77
|
* untouched with the org unconsulted (the first line above). Two lanes
|
|
72
78
|
* have no org on the wire (`session.list`, `apiKey.findAll`) and offer
|
|
73
79
|
* the kind until P1 entry 12 pages them.
|
|
80
|
+
* - A KIND WHOSE AUTHORIZATION IS ITS PARENT'S CARRIES THAT PARENT ON
|
|
81
|
+
* EVERY CANDIDATE (stigmer-cloud 20260913.04 T04, Q-LB-33..36). When
|
|
82
|
+
* `kind_meta` declares PARENT scope with INHERITED owner
|
|
83
|
+
* (`inheritedAuthorizationParentOf`; today agent_execution → session),
|
|
84
|
+
* the helper fills `ListEntryMeta.authorizationParent` from the row's
|
|
85
|
+
* spec through the same read the tuple lifecycle wrote the parent link
|
|
86
|
+
* with. A driver MAY answer the parent's question in place of the
|
|
87
|
+
* child's: by the model's construction the two answers are identical
|
|
88
|
+
* (the child's `owner`, `viewer` and `can_view` are all `from` the
|
|
89
|
+
* parent), and the parent's resolution is direct tuples where the
|
|
90
|
+
* child's walks the parent's whole set (OpenFGA's learned `weight2`
|
|
91
|
+
* strategy read the founder's 423 sessions per execution; that is what
|
|
92
|
+
* rolled back twice on 2026-09-14). A driver that ignores the field is
|
|
93
|
+
* still correct. The one observable difference is stated, not hidden:
|
|
94
|
+
* a row whose parent tuple never landed (the create chain's "row
|
|
95
|
+
* survives, tuple write failed" state, healed by retry) is hidden by
|
|
96
|
+
* the child's check and shown by the parent's — the row's truth, read
|
|
97
|
+
* from the field the tuple was derived from, and no widening: nobody
|
|
98
|
+
* reaches a parent through it who could not create the row in it.
|
|
99
|
+
* - EVERY CANDIDATE CARRIES THE ROW'S AUTHORIZATION FACTS (the
|
|
100
|
+
* built-in scope's entry): the creator stamp, the visibility level
|
|
101
|
+
* and every parent link the tuple lifecycle would have written — the
|
|
102
|
+
* `RowAuthorizationFacts` the row's tuples derive from, read by the
|
|
103
|
+
* one structural resolver the built-in authorizer reads a loaded row
|
|
104
|
+
* through (pipeline/steps/authorization-facts.ts). A driver that
|
|
105
|
+
* evaluates the model over a candidate therefore needs no second
|
|
106
|
+
* read of a row the lane already decoded; a driver that asks an
|
|
107
|
+
* engine ignores the facts and is byte-neutral. The facts are
|
|
108
|
+
* REQUIRED on the candidate, never optional: both are always on the
|
|
109
|
+
* row the helper holds, and an optional field would let a driver
|
|
110
|
+
* silently skip the check.
|
|
74
111
|
*/
|
|
75
112
|
import type { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
|
|
113
|
+
import type { ApiResourceVisibility } from "@stigmer/protos/ai/stigmer/commons/apiresource/enum_pb";
|
|
114
|
+
import type { ApiResourceAudit } from "@stigmer/protos/ai/stigmer/commons/apiresource/status_pb";
|
|
115
|
+
|
|
116
|
+
// The only VALUE imports from extensions/ into pipeline/ (every other
|
|
117
|
+
// crossing is a type): three pure leaf modules that import nothing but
|
|
118
|
+
// protos and each other, so there is no cycle. Deliberate — one resolver
|
|
119
|
+
// for the tuple writer, the point-check driver and the list reader beats
|
|
120
|
+
// a copy in the seam.
|
|
121
|
+
import { inheritedAuthorizationParentOf } from "../pipeline/apiresource-meta.js";
|
|
122
|
+
import { rowAuthorizationFactsOf } from "../pipeline/steps/authorization-facts.js";
|
|
76
123
|
|
|
77
124
|
import type { CallerIdentity } from "./identity.js";
|
|
125
|
+
import type {
|
|
126
|
+
ResolvedParentLink,
|
|
127
|
+
RowAuthorizationFacts,
|
|
128
|
+
} from "./resource-authorization.js";
|
|
78
129
|
|
|
79
130
|
/**
|
|
80
|
-
* The candidate
|
|
81
|
-
*
|
|
82
|
-
*
|
|
83
|
-
* the consumer-owned intersection, so a driver can log or assert on
|
|
131
|
+
* The candidate a post-scan lane offers the scope: the row's authorization
|
|
132
|
+
* facts (the header's last contract line), the labels the cloud driver's
|
|
133
|
+
* guest cookie rule keys on (org rides along in the facts for symmetry
|
|
134
|
+
* with the consumer-owned intersection, so a driver can log or assert on
|
|
135
|
+
* it), and the parent for kinds whose authorization is their parent's.
|
|
84
136
|
*/
|
|
85
|
-
export interface ListEntryMeta {
|
|
86
|
-
readonly id: string;
|
|
87
|
-
readonly org: string;
|
|
137
|
+
export interface ListEntryMeta extends RowAuthorizationFacts {
|
|
88
138
|
readonly labels: Readonly<Record<string, string>>;
|
|
139
|
+
/**
|
|
140
|
+
* OPTIONAL (added 20260913.04 T04): the parent this row's authorization
|
|
141
|
+
* IS — present only for a kind whose `kind_meta` is PARENT scope with
|
|
142
|
+
* INHERITED owner (the header's contract line), the same
|
|
143
|
+
* `ResolvedParentLink` the tuple lifecycle wrote for the row and one of
|
|
144
|
+
* the candidate's own `parentLinks`, named again as the designation a
|
|
145
|
+
* driver may answer in place of the child. Absent for every other kind,
|
|
146
|
+
* and absent when the row's spec does not name its parent — a driver
|
|
147
|
+
* then asks about the row itself, never drops it.
|
|
148
|
+
*/
|
|
149
|
+
readonly authorizationParent?: ResolvedParentLink;
|
|
89
150
|
}
|
|
90
151
|
|
|
91
152
|
/** The scope contract (single-instance point, ExtensionDrivers.listReadScope). */
|
|
@@ -117,14 +178,21 @@ export interface ListReadScope {
|
|
|
117
178
|
|
|
118
179
|
/**
|
|
119
180
|
* The shape every stored API resource message presents to the shared
|
|
120
|
-
* helper — the metadata fields the scope's candidates are built from
|
|
181
|
+
* helper — the metadata fields the scope's candidates are built from, the
|
|
182
|
+
* spec the parents are read from (structurally, by `kind_meta`'s
|
|
183
|
+
* `spec_field`; typed loosely because the field differs per kind and the
|
|
184
|
+
* read is `parentIdOf`'s), and the audit the creator stamp is read from
|
|
185
|
+
* (the one generated type every kind's status carries it as).
|
|
121
186
|
*/
|
|
122
187
|
export interface ScopedListResource {
|
|
123
188
|
metadata?: {
|
|
124
189
|
id?: string;
|
|
125
190
|
org?: string;
|
|
126
191
|
labels?: Record<string, string>;
|
|
192
|
+
visibility?: ApiResourceVisibility;
|
|
127
193
|
};
|
|
194
|
+
spec?: object;
|
|
195
|
+
status?: { audit?: ApiResourceAudit };
|
|
128
196
|
}
|
|
129
197
|
|
|
130
198
|
/**
|
|
@@ -141,8 +209,13 @@ export interface ScopedListResource {
|
|
|
141
209
|
* permission-bounded across orgs, verified per lane in the entry's
|
|
142
210
|
* census — lanes Java does not org-narrow pass ""), then to the kept
|
|
143
211
|
* ids. The same set either way (both are per-row predicates); the
|
|
144
|
-
* order is the header's last contract line: the scope sees
|
|
145
|
-
* rows, not the kind's
|
|
212
|
+
* order is the header's second-to-last contract line: the scope sees
|
|
213
|
+
* the org's rows, not the kind's;
|
|
214
|
+
* - every candidate carries the row's authorization facts, and the
|
|
215
|
+
* candidates of a kind whose authorization is its parent's name that
|
|
216
|
+
* parent again as `authorizationParent` — one of the facts' parent
|
|
217
|
+
* links, picked by the relation `kind_meta` declares, resolved once
|
|
218
|
+
* per call and read once per row.
|
|
146
219
|
*/
|
|
147
220
|
export async function restrictListByReadScope<T extends ScopedListResource>(
|
|
148
221
|
scope: ListReadScope | undefined,
|
|
@@ -158,11 +231,38 @@ export async function restrictListByReadScope<T extends ScopedListResource>(
|
|
|
158
231
|
requestOrg === ""
|
|
159
232
|
? resources
|
|
160
233
|
: resources.filter((resource) => resource.metadata?.org === requestOrg);
|
|
161
|
-
const
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
234
|
+
const parentOf = authorizationParentReader(kind);
|
|
235
|
+
const entries: ListEntryMeta[] = offered.map((resource) => {
|
|
236
|
+
const entry: ListEntryMeta = {
|
|
237
|
+
...rowAuthorizationFactsOf(kind, resource),
|
|
238
|
+
labels: resource.metadata?.labels ?? {},
|
|
239
|
+
};
|
|
240
|
+
const authorizationParent = parentOf(entry.parentLinks);
|
|
241
|
+
return authorizationParent === undefined
|
|
242
|
+
? entry
|
|
243
|
+
: { ...entry, authorizationParent };
|
|
244
|
+
});
|
|
166
245
|
const keptIds = await scope.restrictListEntries(caller, kind, entries);
|
|
167
246
|
return offered.filter((resource) => keptIds.has(resource.metadata?.id ?? ""));
|
|
168
247
|
}
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* The per-row parent picker for `kind`: a constant `undefined` for the 27
|
|
251
|
+
* kinds whose authorization is their own, and for the kind whose
|
|
252
|
+
* authorization is its parent's, the link among the row's own parent
|
|
253
|
+
* links that carries the declared relation — or undefined for a row whose
|
|
254
|
+
* spec does not name it (never a throw: a list is not a create).
|
|
255
|
+
* `kind_meta` is consulted once per call, not once per row.
|
|
256
|
+
*/
|
|
257
|
+
function authorizationParentReader(
|
|
258
|
+
kind: ApiResourceKind,
|
|
259
|
+
): (
|
|
260
|
+
parentLinks: ReadonlyArray<ResolvedParentLink>,
|
|
261
|
+
) => ResolvedParentLink | undefined {
|
|
262
|
+
const parent = inheritedAuthorizationParentOf(kind);
|
|
263
|
+
if (parent === undefined) {
|
|
264
|
+
return () => undefined;
|
|
265
|
+
}
|
|
266
|
+
return (parentLinks) =>
|
|
267
|
+
parentLinks.find((link) => link.relation === parent.relation);
|
|
268
|
+
}
|
|
@@ -5,19 +5,23 @@
|
|
|
5
5
|
* conformance capability flags, and this port is their ONE seam:
|
|
6
6
|
*
|
|
7
7
|
* - `find` (org enumeration; capability `organizationEnumeration`):
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
8
|
+
* the trusted-local laptop enumerates freely; the cloud — and open
|
|
9
|
+
* source under the built-in authorization posture — refuses with
|
|
10
|
+
* UNIMPLEMENTED (no caller may list organizations they hold no role
|
|
11
|
+
* in; `find` is skip-authorization by annotation, so the refusal is
|
|
12
|
+
* the only thing standing between a member and every row).
|
|
13
|
+
* - `findMyOrganizations` (capability `multiTenant`): the trusted-local
|
|
14
|
+
* laptop answers ALL organizations (single-user semantics); the cloud
|
|
15
|
+
* and the built-in directory filter to what the caller may view.
|
|
14
16
|
* - `getByExternalOrgId` (capability `externalOrgLookup`): deliberately
|
|
15
17
|
* absent from the OSS partial registration (UNIMPLEMENTED by
|
|
16
18
|
* construction); the cloud resolves external IdP org ids.
|
|
17
19
|
*
|
|
18
|
-
* No directory composed = the
|
|
19
|
-
*
|
|
20
|
-
*
|
|
20
|
+
* No directory composed = the trusted-local behavior, byte-identical; the
|
|
21
|
+
* built-in directory (authorization/organization-directory.ts) composes
|
|
22
|
+
* under the built-in posture, a unit's under its own. The controller stays
|
|
23
|
+
* the ONE owner of its chains — the directory answers policy questions
|
|
24
|
+
* and id lookups; it never handles RPCs.
|
|
21
25
|
*/
|
|
22
26
|
import type { CallerIdentity } from "./identity.js";
|
|
23
27
|
|
|
@@ -55,6 +55,7 @@
|
|
|
55
55
|
*/
|
|
56
56
|
import type { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
|
|
57
57
|
import type { OwnerAttributionType } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/authorization_config_pb";
|
|
58
|
+
import type { ApiResourceVisibility } from "@stigmer/protos/ai/stigmer/commons/apiresource/enum_pb";
|
|
58
59
|
import type { IamPolicy } from "@stigmer/protos/ai/stigmer/iam/iampolicy/v1/api_pb";
|
|
59
60
|
import type { IamPolicySpec } from "@stigmer/protos/ai/stigmer/iam/iampolicy/v1/spec_pb";
|
|
60
61
|
|
|
@@ -90,6 +91,39 @@ export interface ResolvedParentLink {
|
|
|
90
91
|
readonly parentId: string;
|
|
91
92
|
}
|
|
92
93
|
|
|
94
|
+
/**
|
|
95
|
+
* The facts a stored row carries that its authorization tuples derive
|
|
96
|
+
* from — the row-side vocabulary of `kind_meta.authorization`, read back
|
|
97
|
+
* from a row rather than resolved at its create. The lifecycle derives a
|
|
98
|
+
* `ResourceCreatedEvent` from the same facts on the way in; a list lane
|
|
99
|
+
* offers them on every candidate (`ListEntryMeta`, list-read-scope.ts);
|
|
100
|
+
* the built-in authorizer derives a loaded row's tuples from them. One
|
|
101
|
+
* shape, read by one structural resolver
|
|
102
|
+
* (pipeline/steps/authorization-facts.ts), so a driver that evaluates the
|
|
103
|
+
* model over a candidate needs no second read of the row.
|
|
104
|
+
*
|
|
105
|
+
* Read-side facts are lenient where the create-time resolution is strict:
|
|
106
|
+
* a legacy row that names no organization or no parent carries none (an
|
|
107
|
+
* empty `org`, a link absent from `parentLinks`) and a stamp that names
|
|
108
|
+
* nobody is the empty string — a fact about the row, never a fault of the
|
|
109
|
+
* read.
|
|
110
|
+
*/
|
|
111
|
+
export interface RowAuthorizationFacts {
|
|
112
|
+
readonly id: string;
|
|
113
|
+
/** `metadata.org`; "" for kinds outside organization scope and for legacy rows that never named one. */
|
|
114
|
+
readonly org: string;
|
|
115
|
+
/** `metadata.visibility` as stored; unspecified when the row never set one. */
|
|
116
|
+
readonly visibility: ApiResourceVisibility;
|
|
117
|
+
/** `status.audit.spec_audit.created_by.id` as stamped; "" when absent. Classified by the reader, not here. */
|
|
118
|
+
readonly createdBy: string;
|
|
119
|
+
/**
|
|
120
|
+
* The scope link and every configured additional parent, in the tuple
|
|
121
|
+
* lifecycle's order, from the row's own fields; a parent the row does
|
|
122
|
+
* not name is absent, never a fault.
|
|
123
|
+
*/
|
|
124
|
+
readonly parentLinks: ReadonlyArray<ResolvedParentLink>;
|
|
125
|
+
}
|
|
126
|
+
|
|
93
127
|
/** Fired synchronously after a resource row is first persisted. */
|
|
94
128
|
export interface ResourceCreatedEvent {
|
|
95
129
|
readonly kind: ApiResourceKind;
|
|
@@ -2,32 +2,63 @@
|
|
|
2
2
|
* The schedule-fire caller seam (stigmer-cloud#572) — WHO a schedule fire
|
|
3
3
|
* acts as when the RunStarter re-enters the execution create pipeline.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
5
|
+
* With no driver composed a fire enters as the in-process `internal`
|
|
6
|
+
* class — the trusted-local laptop's lane, where the one caller is the
|
|
7
|
+
* server's operator and attribution has nobody to separate. Under an
|
|
8
|
+
* authentication posture that lane is wrong: the internal class carries
|
|
9
|
+
* the operator's email or `"system"`, which no enforcing evaluator
|
|
10
|
+
* recognizes as a person, so the fired session would belong to nobody
|
|
11
|
+
* (the FGA model's own words — "without it a scheduled run is invisible
|
|
12
|
+
* to every human, including the schedule's owner"). Two drivers answer
|
|
13
|
+
* it: the cloud edition mints a schedule JWT per fire (sub = the org's
|
|
14
|
+
* system-schedule account, claim = the firing Schedule id) so the run
|
|
15
|
+
* reaches the schedule's viewer set through the session#schedule link;
|
|
16
|
+
* open source, under the built-in authorization posture, makes the fire
|
|
17
|
+
* act as the schedule's CREATOR (authorization/schedule-fire-caller.ts),
|
|
18
|
+
* so the run and its session are that person's. The fire then propagates
|
|
19
|
+
* the identity through the R5 caller-propagation header exactly like the
|
|
20
|
+
* other request-origin in-process creates.
|
|
17
21
|
*
|
|
18
22
|
* Single-instance point. The mint is per fire — the schedule id is a
|
|
19
|
-
* claim of the minted credential, never a cached field
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
+
* claim of the minted credential, never a cached field. Two failure
|
|
24
|
+
* shapes, and the RunStarter tells them apart by type, the store-fault
|
|
25
|
+
* precedent (`ResourceNotFoundError` is checked with `instanceof`; every
|
|
26
|
+
* other fault is infrastructure):
|
|
27
|
+
*
|
|
28
|
+
* - any other thrown error is an INFRASTRUCTURE fault: the RunStarter
|
|
29
|
+
* lets it propagate, so the tick activity retries (the deterministic
|
|
30
|
+
* execution name absorbs the retry) and a manual trigger surfaces
|
|
31
|
+
* the failure to its caller;
|
|
32
|
+
* - `ScheduleFireCallerRefusedError` is a DETERMINISTIC refusal — this
|
|
33
|
+
* fire can act as nobody, and no retry will change that (a schedule
|
|
34
|
+
* stamped by no person this server knows). The RunStarter answers
|
|
35
|
+
* the `refused` outcome the way it answers a launch gate's refusal:
|
|
36
|
+
* the failure streak counts it and pauses the schedule with the
|
|
37
|
+
* reason, so the person who scheduled it sees why in the console
|
|
38
|
+
* instead of a tick failing quietly forever.
|
|
23
39
|
*/
|
|
24
40
|
import type { CallerIdentity } from "./identity.js";
|
|
25
41
|
|
|
26
42
|
export interface ScheduleFireCallerMint {
|
|
27
43
|
/**
|
|
28
44
|
* Mints the caller identity one fire acts as. `rawToken` must carry the
|
|
29
|
-
* edition's verifiable credential for the identity
|
|
30
|
-
* fire-scoped claims
|
|
45
|
+
* edition's verifiable credential for the identity when the edition
|
|
46
|
+
* reads fire-scoped claims from it downstream (the cloud does — the
|
|
47
|
+
* schedule id); an edition that propagates the identity in-process and
|
|
48
|
+
* reads nothing off the token leaves it empty (open source does).
|
|
31
49
|
*/
|
|
32
50
|
mintFireCaller(org: string, scheduleId: string): Promise<CallerIdentity>;
|
|
33
51
|
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* The mint's deterministic refusal (the module header): thrown by a
|
|
55
|
+
* driver when the fire can act as nobody and retrying cannot help. The
|
|
56
|
+
* message is the reason the schedule's status carries, so it is written
|
|
57
|
+
* for the person who scheduled the run.
|
|
58
|
+
*/
|
|
59
|
+
export class ScheduleFireCallerRefusedError extends Error {
|
|
60
|
+
constructor(reason: string) {
|
|
61
|
+
super(reason);
|
|
62
|
+
this.name = "ScheduleFireCallerRefusedError";
|
|
63
|
+
}
|
|
64
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -148,14 +148,64 @@ export type { AuthorizationQueryEngine } from "./extensions/authorization-querie
|
|
|
148
148
|
export type { IdentityFederation } from "./extensions/identity-federation.js";
|
|
149
149
|
export type { AccountsBySubject } from "./domain/identityaccount/resolve.js";
|
|
150
150
|
export { identityIdForSubject } from "./domain/identityaccount/resolve.js";
|
|
151
|
+
// The built-in authorizer's model seams: the kind
|
|
152
|
+
// declarations (transcripts of the cloud's `.fga` files), the evaluator,
|
|
153
|
+
// and the OpenFGA store-test kit — exported so the cloud's drift test
|
|
154
|
+
// compares the live model against the transcripts and runs its live
|
|
155
|
+
// store tests through the evaluator, both from the published package.
|
|
156
|
+
// The drivers themselves are composed by the root and are not exported.
|
|
157
|
+
export type {
|
|
158
|
+
DerivedRelation,
|
|
159
|
+
KindDeclaration,
|
|
160
|
+
Rewrite,
|
|
161
|
+
SubjectType,
|
|
162
|
+
} from "./authorization/model/rewrite.js";
|
|
163
|
+
export type { Model } from "./authorization/model/index.js";
|
|
164
|
+
export {
|
|
165
|
+
builtInModel,
|
|
166
|
+
declarationFor,
|
|
167
|
+
newModel,
|
|
168
|
+
} from "./authorization/model/index.js";
|
|
169
|
+
export type {
|
|
170
|
+
CheckContext,
|
|
171
|
+
ObjectRef,
|
|
172
|
+
Person,
|
|
173
|
+
Subject,
|
|
174
|
+
Tuple,
|
|
175
|
+
TupleSource,
|
|
176
|
+
} from "./authorization/tuples.js";
|
|
177
|
+
export type { EvaluationFault } from "./authorization/evaluator.js";
|
|
178
|
+
export {
|
|
179
|
+
AuthorizationEvaluationError,
|
|
180
|
+
MAX_RESOLUTION_DEPTH,
|
|
181
|
+
checkRelation,
|
|
182
|
+
} from "./authorization/evaluator.js";
|
|
183
|
+
export type {
|
|
184
|
+
StoreTestCase,
|
|
185
|
+
StoreTestDocument,
|
|
186
|
+
StoreTestKit,
|
|
187
|
+
StoreTestSkip,
|
|
188
|
+
StoreTestSkipReason,
|
|
189
|
+
} from "./authorization/store-test-kit.js";
|
|
190
|
+
export {
|
|
191
|
+
parseStoreTestDocument,
|
|
192
|
+
storeTestCases,
|
|
193
|
+
} from "./authorization/store-test-kit.js";
|
|
194
|
+
// The kinds whose missing row the built-in authorizer denies instead of
|
|
195
|
+
// answering not-found — the cloud's probe exemption over the open-source
|
|
196
|
+
// tier; exported so the cloud's drift test pins the two sets equal.
|
|
197
|
+
export { NOT_FOUND_EXEMPT_KINDS } from "./authorization/authorizer.js";
|
|
151
198
|
export type {
|
|
152
199
|
ListReadScope,
|
|
153
200
|
ListEntryMeta,
|
|
154
201
|
} from "./extensions/list-read-scope.js";
|
|
155
202
|
// The stigmer-cloud#572 seam: the identity a schedule fire acts as
|
|
156
203
|
// (drivers.scheduleFireCaller) — the composition mints it per fire; the
|
|
157
|
-
// RunStarter propagates it through the R5 in-process header.
|
|
204
|
+
// RunStarter propagates it through the R5 in-process header. A mint that
|
|
205
|
+
// can act as nobody throws the seam's typed refusal, which the RunStarter
|
|
206
|
+
// counts against the schedule instead of retrying.
|
|
158
207
|
export type { ScheduleFireCallerMint } from "./extensions/schedule-fire-caller.js";
|
|
208
|
+
export { ScheduleFireCallerRefusedError } from "./extensions/schedule-fire-caller.js";
|
|
159
209
|
// The 20260830.03 seam: the visitor-sanitization policy the serving
|
|
160
210
|
// chain's error boundary consumes (drivers.visitorErrorPolicy) — the
|
|
161
211
|
// composition supplies WHO is on the anonymous surface and WHAT copy
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pins `inheritedAuthorizationParentOf` (pipeline/apiresource-meta.ts):
|
|
3
|
+
* the kind_meta question "is this kind's authorization its parent's
|
|
4
|
+
* whole?", answered by the PARENT-scope + INHERITED-owner pair and by
|
|
5
|
+
* nothing else (stigmer-cloud 20260913.04 T04, Q-LB-34).
|
|
6
|
+
*
|
|
7
|
+
* The table below is the WHOLE kind enum, on purpose. The list read scope
|
|
8
|
+
* carries `authorizationParent` for exactly the kinds this function names,
|
|
9
|
+
* and a composed driver asks its authorization backend about the parent
|
|
10
|
+
* in the child's place — so a second kind joining the set is a change in
|
|
11
|
+
* what that driver checks, and must arrive as a reviewed edit of this
|
|
12
|
+
* table, never as a silent consequence of a kind_meta edit. Kinds with
|
|
13
|
+
* additional parents whose inheritance is partial (workflow_execution's
|
|
14
|
+
* opt-in `execution_viewer from workflow_instance`, agent_instance's
|
|
15
|
+
* `viewer from default_of`) own themselves and are pinned as `undefined`.
|
|
16
|
+
*/
|
|
17
|
+
import { describe, expect, it } from "vitest";
|
|
18
|
+
|
|
19
|
+
import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
|
|
20
|
+
|
|
21
|
+
import { inheritedAuthorizationParentOf } from "../apiresource-meta.js";
|
|
22
|
+
|
|
23
|
+
describe("inheritedAuthorizationParentOf — the parent a kind's authorization is", () => {
|
|
24
|
+
it("agent_execution's authorization is its session's: relation `session`, spec field `session_id`", () => {
|
|
25
|
+
const parent = inheritedAuthorizationParentOf(
|
|
26
|
+
ApiResourceKind.agent_execution,
|
|
27
|
+
);
|
|
28
|
+
expect(parent).toBeDefined();
|
|
29
|
+
expect(parent?.kind).toBe("session");
|
|
30
|
+
expect(parent?.relation).toBe("session");
|
|
31
|
+
expect(parent?.specField).toBe("session_id");
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it("every other kind's authorization is its own (the whole enum, pinned)", () => {
|
|
35
|
+
const inherited = Object.values(ApiResourceKind)
|
|
36
|
+
.filter((value): value is ApiResourceKind => typeof value === "number")
|
|
37
|
+
.filter((kind) => kind !== ApiResourceKind.api_resource_kind_unknown)
|
|
38
|
+
.filter((kind) => inheritedAuthorizationParentOf(kind) !== undefined)
|
|
39
|
+
.map((kind) => ApiResourceKind[kind]);
|
|
40
|
+
expect(inherited).toEqual(["agent_execution"]);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it.each([
|
|
44
|
+
ApiResourceKind.workflow_execution,
|
|
45
|
+
ApiResourceKind.agent_instance,
|
|
46
|
+
ApiResourceKind.workflow_instance,
|
|
47
|
+
ApiResourceKind.memory,
|
|
48
|
+
])("a kind with an additional, partial parent owns itself: %s", (kind) => {
|
|
49
|
+
expect(inheritedAuthorizationParentOf(kind)).toBeUndefined();
|
|
50
|
+
});
|
|
51
|
+
});
|
|
@@ -157,9 +157,7 @@ describe("R5: caller propagation through the in-process transport", () => {
|
|
|
157
157
|
},
|
|
158
158
|
},
|
|
159
159
|
);
|
|
160
|
-
expect(seen).toEqual([
|
|
161
|
-
{ ...caller, origin: "in-process" },
|
|
162
|
-
]);
|
|
160
|
+
expect(seen).toEqual([{ ...caller, origin: "in-process" }]);
|
|
163
161
|
});
|
|
164
162
|
|
|
165
163
|
it("mints the internal class when nothing was propagated (the daemon default)", async () => {
|
|
@@ -8,9 +8,12 @@
|
|
|
8
8
|
* instances) but never to GRANT anything. Where a grant-shaped decision is
|
|
9
9
|
* needed, key it on server-owned state instead (e.g. the parent blueprint's
|
|
10
10
|
* status.default_instance_id, written only by the create/self-heal flows).
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
11
|
+
* Every write boundary runs GuardReservedLabels over the namespace
|
|
12
|
+
* (pipeline/steps/guard-reserved-labels.ts), but the open-source
|
|
13
|
+
* authorizer's permissive default ALLOWS reserved-label writes by design
|
|
14
|
+
* (the self-hosted operator owns the store), which is why a restrict-shaped
|
|
15
|
+
* predicate here still pairs the label with server-owned state: the
|
|
16
|
+
* plugin-managed guard refuses only beside an existing plugin row.
|
|
14
17
|
*/
|
|
15
18
|
import type { ApiResourceMetadata } from "@stigmer/protos/ai/stigmer/commons/apiresource/metadata_pb";
|
|
16
19
|
|
|
@@ -44,6 +47,31 @@ export const SYSTEM_MANAGED_LABEL = `${RESERVED_LABEL_PREFIX}system-managed`;
|
|
|
44
47
|
*/
|
|
45
48
|
export const RESERVED_LABEL_TRUE = "true";
|
|
46
49
|
|
|
50
|
+
/**
|
|
51
|
+
* The plugin that materialised a resource: the label's value is the
|
|
52
|
+
* plugin's id (`plg_...`), never its slug, because `findAllByLabel` is
|
|
53
|
+
* org-agnostic and two organizations may both install `thermos`. Written
|
|
54
|
+
* only by the plugin controller (in-process, as the installing caller);
|
|
55
|
+
* membership is derived on read from it and stored nowhere else.
|
|
56
|
+
*/
|
|
57
|
+
export const PLUGIN_LABEL = `${RESERVED_LABEL_PREFIX}plugin`;
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* The archive digest a member was last materialised from — the per-child
|
|
61
|
+
* convergence marker. A re-push compares every member's value with the
|
|
62
|
+
* head's digest before deciding it has nothing to do, so a member another
|
|
63
|
+
* lane deleted or an older install left behind is re-materialised.
|
|
64
|
+
*/
|
|
65
|
+
export const PLUGIN_VERSION_LABEL = `${RESERVED_LABEL_PREFIX}plugin-version`;
|
|
66
|
+
|
|
67
|
+
/** The plugin id a resource's labels claim, or undefined when unlabelled. */
|
|
68
|
+
export function pluginIdOf(
|
|
69
|
+
metadata: ApiResourceMetadata | undefined,
|
|
70
|
+
): string | undefined {
|
|
71
|
+
const value = metadata?.labels[PLUGIN_LABEL];
|
|
72
|
+
return value === undefined || value === "" ? undefined : value;
|
|
73
|
+
}
|
|
74
|
+
|
|
47
75
|
/**
|
|
48
76
|
* Whether the metadata carries the DEFAULT_INSTANCE_LABEL marker
|
|
49
77
|
* (undefined-safe) — Go IsDefaultInstance.
|
|
@@ -53,6 +53,11 @@ import {
|
|
|
53
53
|
kind_meta,
|
|
54
54
|
} from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
|
|
55
55
|
import type { ApiResourceKindMeta } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
|
|
56
|
+
import {
|
|
57
|
+
AuthorizationScopeType,
|
|
58
|
+
OwnerAttributionType,
|
|
59
|
+
} from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/authorization_config_pb";
|
|
60
|
+
import type { ParentRelationConfig } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/authorization_config_pb";
|
|
56
61
|
import type { IamRole } from "@stigmer/protos/ai/stigmer/iam/v1/enum_pb";
|
|
57
62
|
import { ServerEdition } from "@stigmer/protos/ai/stigmer/platform/v1/server_info_pb";
|
|
58
63
|
|
|
@@ -65,6 +70,38 @@ export function getKindMeta(kind: ApiResourceKind): ApiResourceKindMeta {
|
|
|
65
70
|
return getOption(valueDesc, kind_meta);
|
|
66
71
|
}
|
|
67
72
|
|
|
73
|
+
/**
|
|
74
|
+
* The parent a kind's authorization IS — the `kind_meta` declaration that
|
|
75
|
+
* a kind's permissions are its parent's whole, not its own: PARENT scope
|
|
76
|
+
* (the one structural link is to that parent) AND INHERITED owner (no
|
|
77
|
+
* owner tuple of its own; `owner from <parent>` in the FGA model).
|
|
78
|
+
* Undefined for every other kind, including kinds with additional parents
|
|
79
|
+
* whose inheritance is partial (a workflow_execution's opt-in
|
|
80
|
+
* `execution_viewer from workflow_instance` sits beside its own owner).
|
|
81
|
+
*
|
|
82
|
+
* Today exactly one kind answers: agent_execution → session (its
|
|
83
|
+
* `can_view` is `viewer or can_view from session`, and `viewer` is the
|
|
84
|
+
* session's). The list read scope reads this to carry the parent on every
|
|
85
|
+
* candidate (`ListEntryMeta.authorizationParent`, 20260913.04 T04), so a
|
|
86
|
+
* composed driver may ask its authorization backend about the parent —
|
|
87
|
+
* direct tuples — instead of the child, whose resolution walks the
|
|
88
|
+
* parent's whole set. A second kind declaring the pair gets the behavior
|
|
89
|
+
* from this declaration alone; the table pin in __tests__ makes that a
|
|
90
|
+
* reviewed change.
|
|
91
|
+
*/
|
|
92
|
+
export function inheritedAuthorizationParentOf(
|
|
93
|
+
kind: ApiResourceKind,
|
|
94
|
+
): ParentRelationConfig | undefined {
|
|
95
|
+
const config = getKindMeta(kind).authorization;
|
|
96
|
+
if (
|
|
97
|
+
config?.scopeType !== AuthorizationScopeType.PARENT ||
|
|
98
|
+
config.ownerType !== OwnerAttributionType.INHERITED
|
|
99
|
+
) {
|
|
100
|
+
return undefined;
|
|
101
|
+
}
|
|
102
|
+
return config.parent;
|
|
103
|
+
}
|
|
104
|
+
|
|
68
105
|
/** Go GetIdPrefix: e.g. agent → "agt". */
|
|
69
106
|
export function getIdPrefix(kind: ApiResourceKind): string {
|
|
70
107
|
return getKindMeta(kind).idPrefix;
|
package/src/pipeline/errors.ts
CHANGED
|
@@ -24,7 +24,10 @@ export function invalidArgumentError(message: string): ConnectError {
|
|
|
24
24
|
|
|
25
25
|
/** Go AlreadyExistsError: "%s already exists: %s". */
|
|
26
26
|
export function alreadyExistsError(resource: string, id: string): ConnectError {
|
|
27
|
-
return new ConnectError(
|
|
27
|
+
return new ConnectError(
|
|
28
|
+
`${resource} already exists: ${id}`,
|
|
29
|
+
Code.AlreadyExists,
|
|
30
|
+
);
|
|
28
31
|
}
|
|
29
32
|
|
|
30
33
|
/**
|
|
@@ -109,10 +112,7 @@ export function goWrappedStatusError(
|
|
|
109
112
|
prefix: string,
|
|
110
113
|
error: ConnectError,
|
|
111
114
|
): ConnectError {
|
|
112
|
-
return new ConnectError(
|
|
113
|
-
`${prefix}: ${goGrpcErrorText(error)}`,
|
|
114
|
-
error.code,
|
|
115
|
-
);
|
|
115
|
+
return new ConnectError(`${prefix}: ${goGrpcErrorText(error)}`, error.code);
|
|
116
116
|
}
|
|
117
117
|
|
|
118
118
|
/**
|
|
@@ -55,7 +55,6 @@ import path from "node:path";
|
|
|
55
55
|
|
|
56
56
|
import { getOption, hasOption } from "@bufbuild/protobuf";
|
|
57
57
|
import type { DescService } from "@bufbuild/protobuf";
|
|
58
|
-
import type { ConnectRouter } from "@connectrpc/connect";
|
|
59
58
|
import { afterAll, beforeAll, describe, expect, it } from "vitest";
|
|
60
59
|
|
|
61
60
|
import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
|
|
@@ -71,6 +70,7 @@ import { loadConfig } from "../../../boot/config.js";
|
|
|
71
70
|
import { composeServer } from "../../../boot/compose.js";
|
|
72
71
|
import type { ComposedServer } from "../../../boot/compose.js";
|
|
73
72
|
import { createLogger } from "../../../boot/logger.js";
|
|
73
|
+
import { servedServices } from "../../../extensions/__tests__/composed-support.js";
|
|
74
74
|
|
|
75
75
|
/** One annotated method as the invariant reads it. */
|
|
76
76
|
interface AnnotationTarget {
|
|
@@ -80,25 +80,6 @@ interface AnnotationTarget {
|
|
|
80
80
|
readonly skipsResolution: boolean;
|
|
81
81
|
}
|
|
82
82
|
|
|
83
|
-
/** Replays the composed routes into a recorder and returns the served services. */
|
|
84
|
-
function servedServices(
|
|
85
|
-
routes: (router: ConnectRouter) => void,
|
|
86
|
-
): DescService[] {
|
|
87
|
-
const served: DescService[] = [];
|
|
88
|
-
const recorder = {
|
|
89
|
-
handlers: [],
|
|
90
|
-
service(desc: DescService) {
|
|
91
|
-
served.push(desc);
|
|
92
|
-
return recorder;
|
|
93
|
-
},
|
|
94
|
-
rpc() {
|
|
95
|
-
return recorder;
|
|
96
|
-
},
|
|
97
|
-
};
|
|
98
|
-
routes(recorder as unknown as ConnectRouter);
|
|
99
|
-
return served;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
83
|
/** Every `rpc.config`-annotated method of the given services, read once. */
|
|
103
84
|
function annotationTargets(services: DescService[]): AnnotationTarget[] {
|
|
104
85
|
const targets: AnnotationTarget[] = [];
|