@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,306 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runs the cloud's own OpenFGA store tests against the built-in
|
|
3
|
+
* evaluator: the documents under fixtures/fga/ are pinned copies of
|
|
4
|
+
* stigmer-cloud's `fga/tests/*.fga.yaml` (each header names its source
|
|
5
|
+
* and commit), written by the model's authors and run against real
|
|
6
|
+
* OpenFGA in the cloud's CI. Every `check` assertion on a kind this
|
|
7
|
+
* edition declares must answer the same here — the proof that "the model
|
|
8
|
+
* evaluated over derived tuples" means the SAME model.
|
|
9
|
+
*
|
|
10
|
+
* What is not run is reported, never dropped: a check that targets a kind
|
|
11
|
+
* this edition does not serve, every `list_objects` assertion (the list
|
|
12
|
+
* scope's proof), and an assertion whose walk read a grant through a
|
|
13
|
+
* type this edition does not declare come back from the kit as a skipped
|
|
14
|
+
* set this file pins entry by entry, so a fixture that gains a scenario
|
|
15
|
+
* is a visible diff here and not a silently smaller proof. The second
|
|
16
|
+
* describe below pins the walk-dependent reason's own behaviour over a
|
|
17
|
+
* throwaway model, so the kit is proven and not only used.
|
|
18
|
+
*
|
|
19
|
+
* The cloud re-runs the LIVE documents through the same kit at the
|
|
20
|
+
* re-pin (the drift test's second table), which is what makes the pinned
|
|
21
|
+
* copies safe to hold.
|
|
22
|
+
*/
|
|
23
|
+
import { readdirSync, readFileSync } from "node:fs";
|
|
24
|
+
import { fileURLToPath } from "node:url";
|
|
25
|
+
|
|
26
|
+
import yaml from "js-yaml";
|
|
27
|
+
import { describe, expect, it } from "vitest";
|
|
28
|
+
|
|
29
|
+
import { AgentSchema } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/api_pb";
|
|
30
|
+
import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
|
|
31
|
+
|
|
32
|
+
import { builtInModel, newModel } from "../model/index.js";
|
|
33
|
+
import {
|
|
34
|
+
computed,
|
|
35
|
+
declareKind,
|
|
36
|
+
direct,
|
|
37
|
+
objectOf,
|
|
38
|
+
union,
|
|
39
|
+
usersetOf,
|
|
40
|
+
} from "../model/rewrite.js";
|
|
41
|
+
import type { StoreTestDocument, StoreTestSkip } from "../store-test-kit.js";
|
|
42
|
+
import { parseStoreTestDocument, storeTestCases } from "../store-test-kit.js";
|
|
43
|
+
|
|
44
|
+
const FIXTURES = new URL("./fixtures/fga/", import.meta.url);
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Every document the cloud's `fga/tests/` folder holds, by file name — the
|
|
48
|
+
* fixtures folder is a byte-exact mirror of it; a file added to either
|
|
49
|
+
* without a line here fails.
|
|
50
|
+
*/
|
|
51
|
+
const DOCUMENTS = [
|
|
52
|
+
"agent-channel-owner.fga.yaml",
|
|
53
|
+
"agent-share-owner.fga.yaml",
|
|
54
|
+
"artifact-org-and-owner.fga.yaml",
|
|
55
|
+
"blueprint-private-visibility.fga.yaml",
|
|
56
|
+
"channel-app-owner.fga.yaml",
|
|
57
|
+
"channel-participation.fga.yaml",
|
|
58
|
+
"channel-session-visibility.fga.yaml",
|
|
59
|
+
"cross-org-share-creation.fga.yaml",
|
|
60
|
+
"default-instance-inheritance.fga.yaml",
|
|
61
|
+
"memory-subject-only.fga.yaml",
|
|
62
|
+
"org-admin-owner-inheritance.fga.yaml",
|
|
63
|
+
"org-shared-environment.fga.yaml",
|
|
64
|
+
"platform-visibility.fga.yaml",
|
|
65
|
+
"provider-standing-viewer.fga.yaml",
|
|
66
|
+
"public-visibility-setter.fga.yaml",
|
|
67
|
+
"reserved-label-writer.fga.yaml",
|
|
68
|
+
"schedule-owner.fga.yaml",
|
|
69
|
+
"schedule-session-visibility.fga.yaml",
|
|
70
|
+
"session-personal-resource.fga.yaml",
|
|
71
|
+
"workflow-execution-sharing.fga.yaml",
|
|
72
|
+
] as const;
|
|
73
|
+
|
|
74
|
+
function skipLine(skip: StoreTestSkip): string {
|
|
75
|
+
const relation = skip.relation === undefined ? "" : ` ${skip.relation}`;
|
|
76
|
+
const types = skip.types === undefined ? "" : ` (${skip.types.join(", ")})`;
|
|
77
|
+
return `${skip.document} :: ${skip.test} :: ${skip.subject}${relation} ${skip.object} :: ${skip.reason}${types}`;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Every assertion the kit did not run, pinned, in the kit's three
|
|
82
|
+
* reasons. `list-objects` lines are the list scope's proof and run when
|
|
83
|
+
* it lands. `undeclared-kind` lines target `platform`, a kind this
|
|
84
|
+
* edition never serves (the driver refuses it before any evaluation).
|
|
85
|
+
* `undeclared-subject-type` lines are the checks whose walk read the
|
|
86
|
+
* cloud's platform-tenancy grant, `identity_provider:<idp>#platform_user`
|
|
87
|
+
* — a userset on a kind this edition does not declare, so the answer here
|
|
88
|
+
* (nobody) is not the oracle's and is not asserted; the cloud runs the
|
|
89
|
+
* same lines over its full model at the re-pin.
|
|
90
|
+
*/
|
|
91
|
+
const SKIPPED_PINNED: ReadonlyArray<string> = [
|
|
92
|
+
// list-objects
|
|
93
|
+
"agent-channel-owner :: listing channels reflects ownership and grants, not membership :: identity_account:alice <agent_channel> :: list-objects",
|
|
94
|
+
"agent-channel-owner :: listing channels reflects ownership and grants, not membership :: identity_account:carol <agent_channel> :: list-objects",
|
|
95
|
+
"agent-channel-owner :: listing channels reflects ownership and grants, not membership :: identity_account:mallory <agent_channel> :: list-objects",
|
|
96
|
+
"agent-share-owner :: listing shares reflects ownership and grants, not membership :: identity_account:alice <agent_share> :: list-objects",
|
|
97
|
+
"agent-share-owner :: listing shares reflects ownership and grants, not membership :: identity_account:carol <agent_share> :: list-objects",
|
|
98
|
+
"agent-share-owner :: listing shares reflects ownership and grants, not membership :: identity_account:mallory <agent_share> :: list-objects",
|
|
99
|
+
"artifact-org-and-owner :: listing reflects org inheritance plus creator ownership :: identity_account:acme-guest <artifact> :: list-objects",
|
|
100
|
+
"artifact-org-and-owner :: listing reflects org inheritance plus creator ownership :: identity_account:eve <artifact> :: list-objects",
|
|
101
|
+
"artifact-org-and-owner :: listing reflects org inheritance plus creator ownership :: identity_account:victor <artifact> :: list-objects",
|
|
102
|
+
"blueprint-private-visibility :: org admin's listable agents include private ones (T08) :: identity_account:oscar <agent> :: list-objects",
|
|
103
|
+
"blueprint-private-visibility :: org member's listable agents exclude private ones (wildcard suppressed) :: identity_account:dave <agent> :: list-objects",
|
|
104
|
+
"blueprint-private-visibility :: org viewer's listable agents are exactly the viewer-shaped org-visible ones :: identity_account:vera <agent> :: list-objects",
|
|
105
|
+
"blueprint-private-visibility :: owner's listable agents include everything they authored :: identity_account:carol <agent> :: list-objects",
|
|
106
|
+
"channel-app-owner :: listing channel apps reflects ownership and grants, not membership :: identity_account:alice <channel_app> :: list-objects",
|
|
107
|
+
"channel-app-owner :: listing channel apps reflects ownership and grants, not membership :: identity_account:carol <channel_app> :: list-objects",
|
|
108
|
+
"channel-app-owner :: listing channel apps reflects ownership and grants, not membership :: identity_account:mallory <channel_app> :: list-objects",
|
|
109
|
+
"channel-participation :: list viewable and participable channels resolve per grant (drives listConversations) :: identity_account:carol <agent_channel> :: list-objects",
|
|
110
|
+
"channel-participation :: list viewable and participable channels resolve per grant (drives listConversations) :: identity_account:dave <agent_channel> :: list-objects",
|
|
111
|
+
"channel-participation :: list viewable and participable channels resolve per grant (drives listConversations) :: identity_account:trina <agent_channel> :: list-objects",
|
|
112
|
+
"channel-session-visibility :: list viewable sessions resolves the channel chain (drives listByChannel) :: identity_account:alice <session> :: list-objects",
|
|
113
|
+
"channel-session-visibility :: list viewable sessions resolves the channel chain (drives listByChannel) :: identity_account:bob <session> :: list-objects",
|
|
114
|
+
"channel-session-visibility :: list viewable sessions resolves the channel chain (drives listByChannel) :: identity_account:carol <session> :: list-objects",
|
|
115
|
+
"default-instance-inheritance :: list managed-org member's viewable agent instances resolves the default_of chain :: identity_account:alice <agent_instance> :: list-objects",
|
|
116
|
+
"memory-subject-only :: list-objects returns only the subject's own records :: identity_account:alice <memory> :: list-objects",
|
|
117
|
+
"memory-subject-only :: list-objects returns only the subject's own records :: identity_account:mallory <memory> :: list-objects",
|
|
118
|
+
"org-admin-owner-inheritance :: admin's listable resources include private blueprints, never personal kinds :: identity_account:ana <agent> :: list-objects",
|
|
119
|
+
"org-admin-owner-inheritance :: admin's listable resources include private blueprints, never personal kinds :: identity_account:ana <agent_instance> :: list-objects",
|
|
120
|
+
"org-admin-owner-inheritance :: admin's listable resources include private blueprints, never personal kinds :: identity_account:ana <session> :: list-objects",
|
|
121
|
+
"org-shared-environment :: org-members-can-list-shared-environments-only :: identity_account:dave <environment> :: list-objects",
|
|
122
|
+
"platform-visibility :: list managed-org member's viewable agents includes only the shared one :: identity_account:alice <agent> :: list-objects",
|
|
123
|
+
"schedule-owner :: listing schedules reflects ownership and grants, not membership :: identity_account:alice <schedule> :: list-objects",
|
|
124
|
+
"schedule-owner :: listing schedules reflects ownership and grants, not membership :: identity_account:carol <schedule> :: list-objects",
|
|
125
|
+
"schedule-owner :: listing schedules reflects ownership and grants, not membership :: identity_account:mallory <schedule> :: list-objects",
|
|
126
|
+
"schedule-session-visibility :: list viewable sessions resolves the schedule chain :: identity_account:alice <session> :: list-objects",
|
|
127
|
+
"schedule-session-visibility :: list viewable sessions resolves the schedule chain :: identity_account:bob <session> :: list-objects",
|
|
128
|
+
"schedule-session-visibility :: list viewable sessions resolves the schedule chain :: identity_account:carol <session> :: list-objects",
|
|
129
|
+
"workflow-execution-sharing :: list a teammate's viewable runs reflects both sharing axes :: identity_account:bob <workflow_execution> :: list-objects",
|
|
130
|
+
// undeclared-kind: platform
|
|
131
|
+
"provider-standing-viewer :: operator may view provider standing, tenants may not :: identity_account:mallory platform:stigmer :: undeclared-kind",
|
|
132
|
+
"provider-standing-viewer :: operator may view provider standing, tenants may not :: identity_account:opal platform:stigmer :: undeclared-kind",
|
|
133
|
+
"public-visibility-setter :: operators may set public visibility, tenants may not :: identity_account:machine platform:stigmer :: undeclared-kind",
|
|
134
|
+
"public-visibility-setter :: operators may set public visibility, tenants may not :: identity_account:mallory platform:stigmer :: undeclared-kind",
|
|
135
|
+
"public-visibility-setter :: operators may set public visibility, tenants may not :: identity_account:opal platform:stigmer :: undeclared-kind",
|
|
136
|
+
"reserved-label-writer :: operator may write reserved labels, tenants may not :: identity_account:machine platform:stigmer :: undeclared-kind",
|
|
137
|
+
"reserved-label-writer :: operator may write reserved labels, tenants may not :: identity_account:mallory platform:stigmer :: undeclared-kind",
|
|
138
|
+
// undeclared-subject-type: identity_provider#platform_user
|
|
139
|
+
"default-instance-inheritance :: managed-org member reaches the default instance of a platform-shared agent :: identity_account:alice can_execute agent_instance:sara-default :: undeclared-subject-type (identity_provider)",
|
|
140
|
+
"default-instance-inheritance :: managed-org member reaches the default instance of a platform-shared agent :: identity_account:alice can_view agent_instance:sara-default :: undeclared-subject-type (identity_provider)",
|
|
141
|
+
"default-instance-inheritance :: managed-org member reaches the default instance of a platform-shared workflow :: identity_account:alice can_execute workflow_instance:onboarding-default :: undeclared-subject-type (identity_provider)",
|
|
142
|
+
"default-instance-inheritance :: managed-org member reaches the default instance of a platform-shared workflow :: identity_account:alice can_view workflow_instance:onboarding-default :: undeclared-subject-type (identity_provider)",
|
|
143
|
+
"default-instance-inheritance :: outsiders get nothing from the default_of link :: identity_account:mallory can_execute agent_instance:sara-default :: undeclared-subject-type (identity_provider)",
|
|
144
|
+
"default-instance-inheritance :: outsiders get nothing from the default_of link :: identity_account:mallory can_view agent_instance:sara-default :: undeclared-subject-type (identity_provider)",
|
|
145
|
+
"platform-visibility :: managed-org members can view and execute a platform-shared agent :: identity_account:alice can_create_instance agent:sara :: undeclared-subject-type (identity_provider)",
|
|
146
|
+
"platform-visibility :: managed-org members can view and execute a platform-shared agent :: identity_account:alice can_execute agent:sara :: undeclared-subject-type (identity_provider)",
|
|
147
|
+
"platform-visibility :: managed-org members can view and execute a platform-shared agent :: identity_account:alice can_view agent:sara :: undeclared-subject-type (identity_provider)",
|
|
148
|
+
"platform-visibility :: managed-org members can view and execute a platform-shared agent :: identity_account:bob can_execute agent:sara :: undeclared-subject-type (identity_provider)",
|
|
149
|
+
"platform-visibility :: managed-org members can view and execute a platform-shared agent :: identity_account:bob can_view agent:sara :: undeclared-subject-type (identity_provider)",
|
|
150
|
+
"platform-visibility :: outsiders and unrelated orgs get nothing from platform visibility :: identity_account:mallory can_create_instance agent:sara :: undeclared-subject-type (identity_provider)",
|
|
151
|
+
"platform-visibility :: outsiders and unrelated orgs get nothing from platform visibility :: identity_account:mallory can_execute agent:sara :: undeclared-subject-type (identity_provider)",
|
|
152
|
+
"platform-visibility :: outsiders and unrelated orgs get nothing from platform visibility :: identity_account:mallory can_view agent:sara :: undeclared-subject-type (identity_provider)",
|
|
153
|
+
"platform-visibility :: platform-shared mcp_server is usable by managed-org members :: identity_account:alice can_connect mcp_server:github :: undeclared-subject-type (identity_provider)",
|
|
154
|
+
"platform-visibility :: platform-shared mcp_server is usable by managed-org members :: identity_account:alice can_use mcp_server:github :: undeclared-subject-type (identity_provider)",
|
|
155
|
+
"platform-visibility :: platform-shared mcp_server is usable by managed-org members :: identity_account:alice can_view mcp_server:github :: undeclared-subject-type (identity_provider)",
|
|
156
|
+
"platform-visibility :: platform-shared skill is usable by managed-org members :: identity_account:alice can_use skill:research :: undeclared-subject-type (identity_provider)",
|
|
157
|
+
"platform-visibility :: platform-shared skill is usable by managed-org members :: identity_account:alice can_view skill:research :: undeclared-subject-type (identity_provider)",
|
|
158
|
+
"platform-visibility :: platform-shared workflow is viewable and executable by managed-org members :: identity_account:alice can_execute workflow:onboarding :: undeclared-subject-type (identity_provider)",
|
|
159
|
+
"platform-visibility :: platform-shared workflow is viewable and executable by managed-org members :: identity_account:alice can_view workflow:onboarding :: undeclared-subject-type (identity_provider)",
|
|
160
|
+
];
|
|
161
|
+
|
|
162
|
+
describe("the cloud's OpenFGA store tests over the built-in evaluator", () => {
|
|
163
|
+
it("the fixtures folder holds exactly the documents this file pins", () => {
|
|
164
|
+
expect(
|
|
165
|
+
readdirSync(FIXTURES)
|
|
166
|
+
.filter((name) => name.endsWith(".fga.yaml"))
|
|
167
|
+
.sort(),
|
|
168
|
+
).toEqual([...DOCUMENTS]);
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
const kits = DOCUMENTS.map((name) => {
|
|
172
|
+
const document = parseStoreTestDocument(
|
|
173
|
+
yaml.load(readFileSync(fileURLToPath(new URL(name, FIXTURES)), "utf8")),
|
|
174
|
+
name,
|
|
175
|
+
);
|
|
176
|
+
return { document, kit: storeTestCases(document, builtInModel) };
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
for (const { document, kit } of kits) {
|
|
180
|
+
if (kit.cases.length === 0) {
|
|
181
|
+
// Every check targets a kind this edition does not declare (the
|
|
182
|
+
// platform documents); reported as skipped, pinned below.
|
|
183
|
+
it.skip(`${document.name}: no check targets a declared kind`, () => {});
|
|
184
|
+
continue;
|
|
185
|
+
}
|
|
186
|
+
describe(document.name, () => {
|
|
187
|
+
for (const storeTestCase of kit.cases) {
|
|
188
|
+
it(storeTestCase.name, storeTestCase.run);
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// Declared after every case: a kit's `skipped` is complete once its
|
|
194
|
+
// cases have run (the walk-dependent reason is decided per assertion).
|
|
195
|
+
it("reports every assertion it did not run, and the list is the pinned one", () => {
|
|
196
|
+
const skipped = kits.flatMap(({ kit }) => kit.skipped.map(skipLine));
|
|
197
|
+
expect(skipped.sort()).toEqual([...SKIPPED_PINNED].sort());
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* The kit's walk-dependent skip, proven over a throwaway model shaped
|
|
203
|
+
* like a blueprint whose `viewer` line reads, in order, a direct person,
|
|
204
|
+
* `owner`, then a userset on a type the model does not declare — the
|
|
205
|
+
* platform-tenancy shape — so each arm below settles at a different point
|
|
206
|
+
* of the union.
|
|
207
|
+
*/
|
|
208
|
+
describe("the kit skips an assertion whose walk read a type the model does not declare", () => {
|
|
209
|
+
const model = newModel([
|
|
210
|
+
declareKind({
|
|
211
|
+
kind: ApiResourceKind.agent,
|
|
212
|
+
schema: AgentSchema,
|
|
213
|
+
source: "fga/model/agentic/agent.fga",
|
|
214
|
+
relations: [
|
|
215
|
+
["owner", direct(objectOf("identity_account"))],
|
|
216
|
+
[
|
|
217
|
+
"platform_viewer",
|
|
218
|
+
direct(usersetOf("identity_provider", "platform_user")),
|
|
219
|
+
],
|
|
220
|
+
[
|
|
221
|
+
"viewer",
|
|
222
|
+
union(
|
|
223
|
+
direct(objectOf("identity_account")),
|
|
224
|
+
computed("owner"),
|
|
225
|
+
computed("platform_viewer"),
|
|
226
|
+
),
|
|
227
|
+
],
|
|
228
|
+
["can_view", computed("viewer")],
|
|
229
|
+
["can_edit", computed("owner")],
|
|
230
|
+
],
|
|
231
|
+
}),
|
|
232
|
+
]);
|
|
233
|
+
|
|
234
|
+
const document: StoreTestDocument = {
|
|
235
|
+
name: "throwaway",
|
|
236
|
+
tuples: [
|
|
237
|
+
{ user: "identity_account:carol", relation: "owner", object: "agent:a" },
|
|
238
|
+
{
|
|
239
|
+
user: "identity_provider:idp#platform_user",
|
|
240
|
+
relation: "platform_viewer",
|
|
241
|
+
object: "agent:a",
|
|
242
|
+
},
|
|
243
|
+
{ user: "identity_account:carol", relation: "owner", object: "agent:b" },
|
|
244
|
+
],
|
|
245
|
+
tests: [
|
|
246
|
+
{
|
|
247
|
+
name: "arms",
|
|
248
|
+
check: [
|
|
249
|
+
// The owner: `viewer` settles on the direct line; `can_edit` never reads platform_viewer.
|
|
250
|
+
{
|
|
251
|
+
user: "identity_account:carol",
|
|
252
|
+
object: "agent:a",
|
|
253
|
+
assertions: { can_view: true, can_edit: true },
|
|
254
|
+
},
|
|
255
|
+
// A stranger: the union walks to platform_viewer and reads the undeclared userset.
|
|
256
|
+
{
|
|
257
|
+
user: "identity_account:mallory",
|
|
258
|
+
object: "agent:a",
|
|
259
|
+
assertions: { can_view: false, can_edit: false },
|
|
260
|
+
},
|
|
261
|
+
// No such tuple on this object: the same stranger's walk reads nothing undeclared.
|
|
262
|
+
{
|
|
263
|
+
user: "identity_account:mallory",
|
|
264
|
+
object: "agent:b",
|
|
265
|
+
assertions: { can_view: false },
|
|
266
|
+
},
|
|
267
|
+
],
|
|
268
|
+
list_objects: [],
|
|
269
|
+
},
|
|
270
|
+
],
|
|
271
|
+
};
|
|
272
|
+
|
|
273
|
+
it("runs the arms the walk settles before the undeclared type, skips exactly the one that read it — whatever it would have answered", async () => {
|
|
274
|
+
const kit = storeTestCases(document, model);
|
|
275
|
+
expect(kit.skipped).toEqual([]);
|
|
276
|
+
for (const storeTestCase of kit.cases) {
|
|
277
|
+
await storeTestCase.run();
|
|
278
|
+
}
|
|
279
|
+
expect(kit.skipped.map(skipLine)).toEqual([
|
|
280
|
+
"throwaway :: arms :: identity_account:mallory can_view agent:a :: undeclared-subject-type (identity_provider)",
|
|
281
|
+
]);
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
it("asserts the arms it runs: a wrong expectation on a settled arm still fails", async () => {
|
|
285
|
+
const wrong: StoreTestDocument = {
|
|
286
|
+
...document,
|
|
287
|
+
tests: [
|
|
288
|
+
{
|
|
289
|
+
name: "wrong",
|
|
290
|
+
check: [
|
|
291
|
+
{
|
|
292
|
+
user: "identity_account:carol",
|
|
293
|
+
object: "agent:a",
|
|
294
|
+
assertions: { can_edit: false },
|
|
295
|
+
},
|
|
296
|
+
],
|
|
297
|
+
list_objects: [],
|
|
298
|
+
},
|
|
299
|
+
],
|
|
300
|
+
};
|
|
301
|
+
const kit = storeTestCases(wrong, model);
|
|
302
|
+
await expect(kit.cases[0]?.run()).rejects.toThrow(
|
|
303
|
+
/expected false, got true/,
|
|
304
|
+
);
|
|
305
|
+
});
|
|
306
|
+
});
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fixtures the authorization module's tests share: a stored row of any
|
|
3
|
+
* declared kind with the facts the derivation reads set through the
|
|
4
|
+
* kind's own schema — every resource carries `metadata` of the one shared
|
|
5
|
+
* type and its audit under `status.audit`, so one builder serves every
|
|
6
|
+
* declaration.
|
|
7
|
+
*
|
|
8
|
+
* A row's parent fields are filled from `kind_meta` itself: for the
|
|
9
|
+
* kind's scope parent and every additional parent, the spec field the
|
|
10
|
+
* config names gets `<parentKind>-1`, resolved to the field's generated
|
|
11
|
+
* name through the schema descriptor (the reflection idiom
|
|
12
|
+
* pipeline/steps/shapes.ts documents) so this file keeps no copy of the
|
|
13
|
+
* config and no name transform of its own. A well-formed row for every
|
|
14
|
+
* kind is what the create-time resolver demands (it throws on a missing
|
|
15
|
+
* parent), which is what lets the parity pin run over all of them.
|
|
16
|
+
* `spec` and `status` overrides sit on top for the arms that need a
|
|
17
|
+
* pointer or a level set.
|
|
18
|
+
*/
|
|
19
|
+
import { create } from "@bufbuild/protobuf";
|
|
20
|
+
import type { DescMessage, Message } from "@bufbuild/protobuf";
|
|
21
|
+
|
|
22
|
+
import type { ApiResourceVisibility } from "@stigmer/protos/ai/stigmer/commons/apiresource/enum_pb";
|
|
23
|
+
|
|
24
|
+
import {
|
|
25
|
+
getKindEnum,
|
|
26
|
+
getKindMeta,
|
|
27
|
+
kindEnumName,
|
|
28
|
+
} from "../../pipeline/apiresource-meta.js";
|
|
29
|
+
import type { KindDeclaration } from "../model/rewrite.js";
|
|
30
|
+
|
|
31
|
+
export interface FixtureRowFacts {
|
|
32
|
+
readonly id: string;
|
|
33
|
+
readonly org: string;
|
|
34
|
+
readonly visibility: ApiResourceVisibility;
|
|
35
|
+
readonly createdBy: string;
|
|
36
|
+
/** Spec fields set over the parent defaults, by generated field name. */
|
|
37
|
+
readonly spec?: Readonly<Record<string, unknown>>;
|
|
38
|
+
/** Status fields set beside the audit, by generated field name. */
|
|
39
|
+
readonly status?: Readonly<Record<string, unknown>>;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** The id the fixture gives the parent of `parentKind`: `<type>-1`. */
|
|
43
|
+
export function fixtureParentId(parentKind: string): string {
|
|
44
|
+
return `${kindEnumName(getKindEnum(parentKind))}-1`;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** A row of `declaration.kind` carrying exactly the given facts, its parents filled. */
|
|
48
|
+
export function fixtureRow(
|
|
49
|
+
declaration: KindDeclaration,
|
|
50
|
+
facts: FixtureRowFacts,
|
|
51
|
+
): Message {
|
|
52
|
+
// Typed loosely on purpose: the schema is any declared kind's, and
|
|
53
|
+
// protobuf-es only knows the field set of a concrete schema. Every kind
|
|
54
|
+
// shares these two paths (`metadata`, `status.audit`), which is the
|
|
55
|
+
// premise the derivation itself rests on.
|
|
56
|
+
const init: Record<string, unknown> = {
|
|
57
|
+
metadata: {
|
|
58
|
+
id: facts.id,
|
|
59
|
+
name: facts.id,
|
|
60
|
+
org: facts.org,
|
|
61
|
+
visibility: facts.visibility,
|
|
62
|
+
},
|
|
63
|
+
spec: { ...parentFieldsOf(declaration), ...facts.spec },
|
|
64
|
+
status: {
|
|
65
|
+
audit: { specAudit: { createdBy: { id: facts.createdBy } } },
|
|
66
|
+
...facts.status,
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
return create(declaration.schema, init);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** `kind_meta`'s parent spec fields for the kind, by generated name, each naming `<parentKind>-1`. */
|
|
73
|
+
function parentFieldsOf(declaration: KindDeclaration): Record<string, string> {
|
|
74
|
+
const config = getKindMeta(declaration.kind).authorization;
|
|
75
|
+
const spec = specSchemaOf(declaration.schema);
|
|
76
|
+
const fields: Record<string, string> = {};
|
|
77
|
+
if (config === undefined || spec === undefined) {
|
|
78
|
+
return fields;
|
|
79
|
+
}
|
|
80
|
+
const parents = [
|
|
81
|
+
...(config.parent === undefined ? [] : [config.parent]),
|
|
82
|
+
...config.additionalParents,
|
|
83
|
+
];
|
|
84
|
+
for (const parent of parents) {
|
|
85
|
+
const field = spec.fields.find((f) => f.name === parent.specField);
|
|
86
|
+
if (field === undefined) {
|
|
87
|
+
throw new Error(
|
|
88
|
+
`${declaration.type}: kind_meta names spec field '${parent.specField}', which ${spec.typeName} does not have`,
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
fields[field.localName] = fixtureParentId(parent.kind);
|
|
92
|
+
}
|
|
93
|
+
return fields;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function specSchemaOf(schema: DescMessage): DescMessage | undefined {
|
|
97
|
+
const spec = schema.fields.find((f) => f.name === "spec");
|
|
98
|
+
return spec !== undefined && spec.fieldKind === "message"
|
|
99
|
+
? spec.message
|
|
100
|
+
: undefined;
|
|
101
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pins the tuple vocabulary's contract: the string notation the cloud's
|
|
3
|
+
* store tests and the IamPolicy proto share round-trips through parse and
|
|
4
|
+
* format. The person's construction is person.test.ts's.
|
|
5
|
+
*/
|
|
6
|
+
import { describe, expect, it } from "vitest";
|
|
7
|
+
|
|
8
|
+
import {
|
|
9
|
+
formatSubject,
|
|
10
|
+
formatTuple,
|
|
11
|
+
parseObjectRef,
|
|
12
|
+
parseSubject,
|
|
13
|
+
} from "../tuples.js";
|
|
14
|
+
|
|
15
|
+
describe("the string notation", () => {
|
|
16
|
+
it("parses an object, a userset and the wildcard, and an id may carry a colon (issuer subjects do)", () => {
|
|
17
|
+
expect(parseObjectRef("agent:agt_1")).toEqual({
|
|
18
|
+
type: "agent",
|
|
19
|
+
id: "agt_1",
|
|
20
|
+
});
|
|
21
|
+
expect(parseObjectRef("identity_account:auth0|c:d")).toEqual({
|
|
22
|
+
type: "identity_account",
|
|
23
|
+
id: "auth0|c:d",
|
|
24
|
+
});
|
|
25
|
+
expect(parseSubject("organization:acme#viewer")).toEqual({
|
|
26
|
+
form: "userset",
|
|
27
|
+
object: { type: "organization", id: "acme" },
|
|
28
|
+
relation: "viewer",
|
|
29
|
+
});
|
|
30
|
+
expect(parseSubject("identity_account:*")).toEqual({
|
|
31
|
+
form: "wildcard",
|
|
32
|
+
type: "identity_account",
|
|
33
|
+
condition: undefined,
|
|
34
|
+
});
|
|
35
|
+
expect(parseSubject("identity_account:ida_x")).toEqual({
|
|
36
|
+
form: "object",
|
|
37
|
+
object: { type: "identity_account", id: "ida_x" },
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it("refuses text with no type", () => {
|
|
42
|
+
expect(() => parseObjectRef("nonsense")).toThrow("not an object reference");
|
|
43
|
+
expect(() => parseObjectRef(":id")).toThrow("not an object reference");
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it("formats a tuple in the proto's notation, the condition spelled after `with`", () => {
|
|
47
|
+
expect(
|
|
48
|
+
formatTuple({
|
|
49
|
+
object: parseObjectRef("agent:a"),
|
|
50
|
+
relation: "viewer",
|
|
51
|
+
subject: {
|
|
52
|
+
form: "wildcard",
|
|
53
|
+
type: "identity_account",
|
|
54
|
+
condition: "allow_public",
|
|
55
|
+
},
|
|
56
|
+
}),
|
|
57
|
+
).toBe("agent:a#viewer@identity_account:* with allow_public");
|
|
58
|
+
expect(formatSubject(parseSubject("organization:acme#member"))).toBe(
|
|
59
|
+
"organization:acme#member",
|
|
60
|
+
);
|
|
61
|
+
});
|
|
62
|
+
});
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pins that every question the wire can ask this edition's authorizer
|
|
3
|
+
* has a line in the model: for every `rpc.config`-annotated method the
|
|
4
|
+
* open-source server SERVES whose annotation names a static kind this
|
|
5
|
+
* edition serves, the permission is a relation that kind's transcript
|
|
6
|
+
* declares. A relation the kind does not define answers `deny` here
|
|
7
|
+
* (evaluator.ts) — an RPC annotated with such a pair would refuse every
|
|
8
|
+
* caller, green on the permissive `local*` targets and dark only under
|
|
9
|
+
* enforcement, so the gap is caught at the registry instead of on a
|
|
10
|
+
* self-host.
|
|
11
|
+
*
|
|
12
|
+
* Scope follows authorize-annotation-completeness.test.ts: the empty
|
|
13
|
+
* composition's routes, replayed into a recorder, are exactly the methods
|
|
14
|
+
* the OSS Authorize step governs. Outside the pin, each for a stated
|
|
15
|
+
* reason: `is_public` and `is_skip_authorization` methods (the annotation
|
|
16
|
+
* is never resolved); a kind the edition does not serve (`platform`; the
|
|
17
|
+
* driver refuses it before any evaluation, so under the built-in posture
|
|
18
|
+
* nobody holds a platform permission); a kind named by
|
|
19
|
+
* `resource_kind_path` (the IamPolicy lane's — the kind is the request's,
|
|
20
|
+
* and the target's own declaration answers at run time).
|
|
21
|
+
*/
|
|
22
|
+
import { mkdtempSync, rmSync } from "node:fs";
|
|
23
|
+
import { tmpdir } from "node:os";
|
|
24
|
+
import path from "node:path";
|
|
25
|
+
|
|
26
|
+
import { getOption, hasOption } from "@bufbuild/protobuf";
|
|
27
|
+
import { afterAll, beforeAll, describe, expect, it } from "vitest";
|
|
28
|
+
|
|
29
|
+
import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
|
|
30
|
+
import {
|
|
31
|
+
config as rpcAuthorizationConfig,
|
|
32
|
+
is_public,
|
|
33
|
+
is_skip_authorization,
|
|
34
|
+
} from "@stigmer/protos/ai/stigmer/commons/rpc/method_options_pb";
|
|
35
|
+
import { IamPermission } from "@stigmer/protos/ai/stigmer/iam/v1/enum_pb";
|
|
36
|
+
import { ServerEdition } from "@stigmer/protos/ai/stigmer/platform/v1/server_info_pb";
|
|
37
|
+
|
|
38
|
+
import { loadConfig } from "../../boot/config.js";
|
|
39
|
+
import { composeServer } from "../../boot/compose.js";
|
|
40
|
+
import type { ComposedServer } from "../../boot/compose.js";
|
|
41
|
+
import {
|
|
42
|
+
baseConfig,
|
|
43
|
+
servedServices,
|
|
44
|
+
silentLogger,
|
|
45
|
+
} from "../../extensions/__tests__/composed-support.js";
|
|
46
|
+
import {
|
|
47
|
+
kindEnumName,
|
|
48
|
+
kindServedByEdition,
|
|
49
|
+
} from "../../pipeline/apiresource-meta.js";
|
|
50
|
+
import { declarationFor } from "../model/index.js";
|
|
51
|
+
|
|
52
|
+
/** One annotated, served, statically-targeted method: the question the wire asks. */
|
|
53
|
+
interface WireQuestion {
|
|
54
|
+
readonly method: string;
|
|
55
|
+
readonly kind: ApiResourceKind;
|
|
56
|
+
readonly permission: string;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
describe("every static (kind, permission) the served RPCs ask about is a declared relation", () => {
|
|
60
|
+
let dir: string;
|
|
61
|
+
let server: ComposedServer;
|
|
62
|
+
|
|
63
|
+
beforeAll(async () => {
|
|
64
|
+
dir = mkdtempSync(path.join(tmpdir(), "wire-permissions-test-"));
|
|
65
|
+
server = await composeServer({
|
|
66
|
+
config: loadConfig(baseConfig(dir)),
|
|
67
|
+
logger: silentLogger,
|
|
68
|
+
portOverride: 0,
|
|
69
|
+
host: "127.0.0.1",
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
afterAll(async () => {
|
|
74
|
+
await server.shutdown();
|
|
75
|
+
rmSync(dir, { recursive: true, force: true });
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
function wireQuestions(): WireQuestion[] {
|
|
79
|
+
const questions: WireQuestion[] = [];
|
|
80
|
+
for (const service of servedServices(server.routes)) {
|
|
81
|
+
for (const method of service.methods) {
|
|
82
|
+
if (
|
|
83
|
+
!hasOption(method, rpcAuthorizationConfig) ||
|
|
84
|
+
getOption(method, is_public) ||
|
|
85
|
+
getOption(method, is_skip_authorization)
|
|
86
|
+
) {
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
const config = getOption(method, rpcAuthorizationConfig);
|
|
90
|
+
if (
|
|
91
|
+
config.resourceKind === ApiResourceKind.api_resource_kind_unknown ||
|
|
92
|
+
!kindServedByEdition(config.resourceKind, ServerEdition.oss)
|
|
93
|
+
) {
|
|
94
|
+
continue;
|
|
95
|
+
}
|
|
96
|
+
questions.push({
|
|
97
|
+
method: `${service.typeName}/${method.name}`,
|
|
98
|
+
kind: config.resourceKind,
|
|
99
|
+
permission: IamPermission[config.permission] ?? "",
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return questions;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
it("names a declared relation for every question, with none undeclared", () => {
|
|
107
|
+
const questions = wireQuestions();
|
|
108
|
+
expect(questions.length).toBeGreaterThan(60);
|
|
109
|
+
const undeclared = questions
|
|
110
|
+
.filter(
|
|
111
|
+
(q) => declarationFor(q.kind)?.relations.has(q.permission) !== true,
|
|
112
|
+
)
|
|
113
|
+
.map(
|
|
114
|
+
(q) =>
|
|
115
|
+
`${q.method} asks ${q.permission} on ${kindEnumName(q.kind)}, which its transcript does not declare`,
|
|
116
|
+
);
|
|
117
|
+
expect(undeclared).toEqual([]);
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
it("asks about every served kind the model declares except the two no RPC targets statically", () => {
|
|
121
|
+
// iam_policy's RPCs target the policy's RESOURCE (`resource_kind_path`
|
|
122
|
+
// or the load-then-authorize `get`); execution_context's RPCs are
|
|
123
|
+
// `is_skip_authorization` lanes (or unannotated) whose handlers gate on
|
|
124
|
+
// the runner's execution-scoped token. Every other declared kind is
|
|
125
|
+
// asked about by at least one static annotation.
|
|
126
|
+
const asked = new Set(wireQuestions().map((q) => kindEnumName(q.kind)));
|
|
127
|
+
expect([...asked].sort()).toEqual(
|
|
128
|
+
[
|
|
129
|
+
"agent",
|
|
130
|
+
"agent_channel",
|
|
131
|
+
"agent_execution",
|
|
132
|
+
"agent_instance",
|
|
133
|
+
"agent_share",
|
|
134
|
+
"api_key",
|
|
135
|
+
"artifact",
|
|
136
|
+
"channel_app",
|
|
137
|
+
"environment",
|
|
138
|
+
"identity_account",
|
|
139
|
+
"mcp_server",
|
|
140
|
+
"memory",
|
|
141
|
+
"oauth_app",
|
|
142
|
+
"organization",
|
|
143
|
+
"plugin",
|
|
144
|
+
"project",
|
|
145
|
+
"schedule",
|
|
146
|
+
"session",
|
|
147
|
+
"skill",
|
|
148
|
+
"workflow",
|
|
149
|
+
"workflow_execution",
|
|
150
|
+
"workflow_instance",
|
|
151
|
+
].sort(),
|
|
152
|
+
);
|
|
153
|
+
});
|
|
154
|
+
});
|