@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
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[] = [];
|
|
@@ -60,7 +60,10 @@ function memoryCtx(
|
|
|
60
60
|
|
|
61
61
|
/** A provider whose only relevant surface is the capture capability. */
|
|
62
62
|
function providerWith(
|
|
63
|
-
decide?: (
|
|
63
|
+
decide?: (
|
|
64
|
+
caller: CallerIdentity,
|
|
65
|
+
org: string,
|
|
66
|
+
) => MemoryCaptureDecision | Promise<MemoryCaptureDecision>,
|
|
64
67
|
): RunnerCredentialProvider {
|
|
65
68
|
return {
|
|
66
69
|
isEnabled: () => false,
|
|
@@ -79,8 +82,34 @@ function jwtWith(payload: Record<string, unknown>): string {
|
|
|
79
82
|
return `header.${body}.signature`;
|
|
80
83
|
}
|
|
81
84
|
|
|
85
|
+
async function rejectionOf(run: void | Promise<void>): Promise<unknown> {
|
|
86
|
+
return Promise.resolve(run).then(
|
|
87
|
+
() => {
|
|
88
|
+
throw new Error("expected the step to refuse");
|
|
89
|
+
},
|
|
90
|
+
(error: unknown) => error,
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
|
|
82
94
|
describe("GuardMemoryCapture with the capability composed", () => {
|
|
83
|
-
it("
|
|
95
|
+
it("a capability that answers with a promise is awaited — the built-in provider reads the run's row for the session", async () => {
|
|
96
|
+
const step = newGuardMemoryCaptureStep<typeof MemorySchema>(
|
|
97
|
+
providerWith(() =>
|
|
98
|
+
Promise.resolve({
|
|
99
|
+
verdict: "admit" as const,
|
|
100
|
+
subjectIdentityAccountId: "ida_human",
|
|
101
|
+
provedSessionId: "ses_from_row",
|
|
102
|
+
}),
|
|
103
|
+
),
|
|
104
|
+
);
|
|
105
|
+
const ctx = memoryCtx(SANDBOX_CALLER);
|
|
106
|
+
await step.execute(ctx);
|
|
107
|
+
expect(memoryCaptureCredentialOf(ctx)?.provedSessionId).toBe(
|
|
108
|
+
"ses_from_row",
|
|
109
|
+
);
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
it("admit stashes the proved claims for ResolveMemoryDefaults", async () => {
|
|
84
113
|
const step = newGuardMemoryCaptureStep<typeof MemorySchema>(
|
|
85
114
|
providerWith(() => ({
|
|
86
115
|
verdict: "admit",
|
|
@@ -89,23 +118,18 @@ describe("GuardMemoryCapture with the capability composed", () => {
|
|
|
89
118
|
})),
|
|
90
119
|
);
|
|
91
120
|
const ctx = memoryCtx(SANDBOX_CALLER);
|
|
92
|
-
step.execute(ctx);
|
|
121
|
+
await step.execute(ctx);
|
|
93
122
|
expect(memoryCaptureCredentialOf(ctx)).toEqual({
|
|
94
123
|
subjectIdentityAccountId: "ida_human",
|
|
95
124
|
provedSessionId: "ses_proved",
|
|
96
125
|
});
|
|
97
126
|
});
|
|
98
127
|
|
|
99
|
-
it("refuse answers the byte-pinned PERMISSION_DENIED copy", () => {
|
|
128
|
+
it("refuse answers the byte-pinned PERMISSION_DENIED copy", async () => {
|
|
100
129
|
const step = newGuardMemoryCaptureStep<typeof MemorySchema>(
|
|
101
130
|
providerWith(() => ({ verdict: "refuse" })),
|
|
102
131
|
);
|
|
103
|
-
|
|
104
|
-
try {
|
|
105
|
-
step.execute(memoryCtx(SANDBOX_CALLER));
|
|
106
|
-
} catch (e) {
|
|
107
|
-
error = e;
|
|
108
|
-
}
|
|
132
|
+
const error = await rejectionOf(step.execute(memoryCtx(SANDBOX_CALLER)));
|
|
109
133
|
expect(error).toBeInstanceOf(ConnectError);
|
|
110
134
|
expect((error as ConnectError).code).toBe(Code.PermissionDenied);
|
|
111
135
|
expect((error as ConnectError).rawMessage).toBe(
|
|
@@ -113,7 +137,7 @@ describe("GuardMemoryCapture with the capability composed", () => {
|
|
|
113
137
|
);
|
|
114
138
|
});
|
|
115
139
|
|
|
116
|
-
it("hands the capability the caller and the capture org", () => {
|
|
140
|
+
it("hands the capability the caller and the capture org", async () => {
|
|
117
141
|
const observed: Array<{ caller: CallerIdentity; org: string }> = [];
|
|
118
142
|
const step = newGuardMemoryCaptureStep<typeof MemorySchema>(
|
|
119
143
|
providerWith((caller, org) => {
|
|
@@ -121,11 +145,11 @@ describe("GuardMemoryCapture with the capability composed", () => {
|
|
|
121
145
|
return { verdict: "no-opinion" };
|
|
122
146
|
}),
|
|
123
147
|
);
|
|
124
|
-
step.execute(memoryCtx(SANDBOX_CALLER, "org_zeta"));
|
|
148
|
+
await step.execute(memoryCtx(SANDBOX_CALLER, "org_zeta"));
|
|
125
149
|
expect(observed).toEqual([{ caller: SANDBOX_CALLER, org: "org_zeta" }]);
|
|
126
150
|
});
|
|
127
151
|
|
|
128
|
-
it("an org-mismatch throw from the capability propagates untouched", () => {
|
|
152
|
+
it("an org-mismatch throw from the capability propagates untouched", async () => {
|
|
129
153
|
const mismatch = new ConnectError(
|
|
130
154
|
"memory capture is scoped to the session's organization",
|
|
131
155
|
Code.PermissionDenied,
|
|
@@ -135,16 +159,12 @@ describe("GuardMemoryCapture with the capability composed", () => {
|
|
|
135
159
|
throw mismatch;
|
|
136
160
|
}),
|
|
137
161
|
);
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
} catch (e) {
|
|
142
|
-
error = e;
|
|
143
|
-
}
|
|
144
|
-
expect(error).toBe(mismatch);
|
|
162
|
+
expect(
|
|
163
|
+
await rejectionOf(step.execute(memoryCtx(SANDBOX_CALLER, "org_other"))),
|
|
164
|
+
).toBe(mismatch);
|
|
145
165
|
});
|
|
146
166
|
|
|
147
|
-
it("no-opinion falls through: platform_client_id carriers still refuse", () => {
|
|
167
|
+
it("no-opinion falls through: platform_client_id carriers still refuse", async () => {
|
|
148
168
|
const step = newGuardMemoryCaptureStep<typeof MemorySchema>(
|
|
149
169
|
providerWith(() => ({ verdict: "no-opinion" })),
|
|
150
170
|
);
|
|
@@ -154,18 +174,18 @@ describe("GuardMemoryCapture with the capability composed", () => {
|
|
|
154
174
|
issuer: "stigmer",
|
|
155
175
|
rawToken: jwtWith({ platform_client_id: "pc_1" }),
|
|
156
176
|
};
|
|
157
|
-
expect(
|
|
177
|
+
await expect(step.execute(memoryCtx(minted))).rejects.toThrowError(
|
|
158
178
|
MEMORY_CAPTURE_CALLER_MESSAGE,
|
|
159
179
|
);
|
|
160
180
|
});
|
|
161
181
|
|
|
162
|
-
it("internal and in-process callers never consult the capability", () => {
|
|
182
|
+
it("internal and in-process callers never consult the capability", async () => {
|
|
163
183
|
const step = newGuardMemoryCaptureStep<typeof MemorySchema>(
|
|
164
184
|
providerWith(() => {
|
|
165
185
|
throw new Error("must not be consulted");
|
|
166
186
|
}),
|
|
167
187
|
);
|
|
168
|
-
step.execute(
|
|
188
|
+
await step.execute(
|
|
169
189
|
memoryCtx({
|
|
170
190
|
identityId: "internal",
|
|
171
191
|
callerClass: "internal",
|
|
@@ -173,17 +193,15 @@ describe("GuardMemoryCapture with the capability composed", () => {
|
|
|
173
193
|
rawToken: "",
|
|
174
194
|
}),
|
|
175
195
|
);
|
|
176
|
-
step.execute(memoryCtx({ ...LOCAL_USER, origin: "in-process" }));
|
|
196
|
+
await step.execute(memoryCtx({ ...LOCAL_USER, origin: "in-process" }));
|
|
177
197
|
});
|
|
178
198
|
});
|
|
179
199
|
|
|
180
200
|
describe("GuardMemoryCapture without the capability (the pre-seam gate)", () => {
|
|
181
|
-
it("admits trusted-local and OIDC callers", () => {
|
|
182
|
-
const step = newGuardMemoryCaptureStep<typeof MemorySchema>(
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
step.execute(memoryCtx(LOCAL_USER));
|
|
186
|
-
step.execute(
|
|
201
|
+
it("admits trusted-local and OIDC callers", async () => {
|
|
202
|
+
const step = newGuardMemoryCaptureStep<typeof MemorySchema>(providerWith());
|
|
203
|
+
await step.execute(memoryCtx(LOCAL_USER));
|
|
204
|
+
await step.execute(
|
|
187
205
|
memoryCtx({
|
|
188
206
|
identityId: "ida_oidc",
|
|
189
207
|
callerClass: "user",
|
|
@@ -193,30 +211,26 @@ describe("GuardMemoryCapture without the capability (the pre-seam gate)", () =>
|
|
|
193
211
|
);
|
|
194
212
|
});
|
|
195
213
|
|
|
196
|
-
it("refuses machine callers and platform_client_id carriers", () => {
|
|
197
|
-
const step = newGuardMemoryCaptureStep<typeof MemorySchema>(
|
|
198
|
-
|
|
199
|
-
);
|
|
200
|
-
expect(() =>
|
|
214
|
+
it("refuses machine callers and platform_client_id carriers", async () => {
|
|
215
|
+
const step = newGuardMemoryCaptureStep<typeof MemorySchema>(providerWith());
|
|
216
|
+
await expect(
|
|
201
217
|
step.execute(memoryCtx({ ...LOCAL_USER, callerClass: "machine" })),
|
|
202
|
-
).toThrowError(MEMORY_CAPTURE_CALLER_MESSAGE);
|
|
203
|
-
expect(
|
|
218
|
+
).rejects.toThrowError(MEMORY_CAPTURE_CALLER_MESSAGE);
|
|
219
|
+
await expect(
|
|
204
220
|
step.execute(
|
|
205
221
|
memoryCtx({
|
|
206
222
|
...LOCAL_USER,
|
|
207
223
|
rawToken: jwtWith({ platform_client_id: "pc_1" }),
|
|
208
224
|
}),
|
|
209
225
|
),
|
|
210
|
-
).toThrowError(MEMORY_CAPTURE_CALLER_MESSAGE);
|
|
226
|
+
).rejects.toThrowError(MEMORY_CAPTURE_CALLER_MESSAGE);
|
|
211
227
|
});
|
|
212
228
|
|
|
213
|
-
it("admits a runner-shaped caller — the recorded pre-fix posture", () => {
|
|
229
|
+
it("admits a runner-shaped caller — the recorded pre-fix posture", async () => {
|
|
214
230
|
// With no capability composed the gate cannot classify runner
|
|
215
231
|
// credentials — the single-user OSS posture admits them (the #564
|
|
216
232
|
// narrowing is CLOUD policy, shipped in the cloud capability).
|
|
217
|
-
const step = newGuardMemoryCaptureStep<typeof MemorySchema>(
|
|
218
|
-
|
|
219
|
-
);
|
|
220
|
-
step.execute(memoryCtx(SANDBOX_CALLER));
|
|
233
|
+
const step = newGuardMemoryCaptureStep<typeof MemorySchema>(providerWith());
|
|
234
|
+
await step.execute(memoryCtx(SANDBOX_CALLER));
|
|
221
235
|
});
|
|
222
236
|
});
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pins the plugin-managed write guard's two-fact decision: a stored
|
|
3
|
+
* resource labelled with an EXISTING plugin's id refuses a client write
|
|
4
|
+
* with FAILED_PRECONDITION naming the plugin; a label whose plugin is gone
|
|
5
|
+
* locks nothing; an unlabelled resource passes; in-process and internal
|
|
6
|
+
* callers pass by structure; the request's own labels are never consulted;
|
|
7
|
+
* and the step reads the context key the chain names.
|
|
8
|
+
*/
|
|
9
|
+
import { describe, expect, it } from "vitest";
|
|
10
|
+
import { Code, ConnectError } from "@connectrpc/connect";
|
|
11
|
+
import { create } from "@bufbuild/protobuf";
|
|
12
|
+
|
|
13
|
+
import { AgentSchema } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/api_pb";
|
|
14
|
+
import { PluginSchema } from "@stigmer/protos/ai/stigmer/agentic/plugin/v1/api_pb";
|
|
15
|
+
import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
|
|
16
|
+
|
|
17
|
+
import type { CallerIdentity } from "../../../extensions/identity.js";
|
|
18
|
+
import { PLUGIN_LABEL } from "../../apiresource-labels.js";
|
|
19
|
+
import { RequestContext } from "../../request-context.js";
|
|
20
|
+
import { ResourceNotFoundError } from "../../../store/interface.js";
|
|
21
|
+
import type { Store } from "../../../store/interface.js";
|
|
22
|
+
import { newGuardPluginManagedStep } from "../guard-plugin-managed.js";
|
|
23
|
+
import { EXISTING_RESOURCE_KEY } from "../load-existing.js";
|
|
24
|
+
|
|
25
|
+
const USER: CallerIdentity = {
|
|
26
|
+
identityId: "ida_alice",
|
|
27
|
+
callerClass: "user",
|
|
28
|
+
issuer: "stigmer",
|
|
29
|
+
rawToken: "tok",
|
|
30
|
+
};
|
|
31
|
+
const IN_PROCESS: CallerIdentity = { ...USER, origin: "in-process" };
|
|
32
|
+
const INTERNAL: CallerIdentity = { ...USER, callerClass: "internal" };
|
|
33
|
+
|
|
34
|
+
/** A store that knows one plugin row; everything else is not found. */
|
|
35
|
+
function storeWith(pluginId: string | undefined): Store {
|
|
36
|
+
return {
|
|
37
|
+
getResource: (kind: ApiResourceKind, id: string) => {
|
|
38
|
+
if (kind === ApiResourceKind.plugin && id === pluginId) {
|
|
39
|
+
return Promise.resolve(
|
|
40
|
+
create(PluginSchema, { metadata: { id, slug: "thermos" } }),
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
return Promise.reject(
|
|
44
|
+
new ResourceNotFoundError(`${ApiResourceKind[kind]}/${id}`),
|
|
45
|
+
);
|
|
46
|
+
},
|
|
47
|
+
} as unknown as Store;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function ctxWithStored(
|
|
51
|
+
labels: Record<string, string>,
|
|
52
|
+
caller: CallerIdentity,
|
|
53
|
+
key = EXISTING_RESOURCE_KEY,
|
|
54
|
+
) {
|
|
55
|
+
const ctx = new RequestContext(
|
|
56
|
+
AgentSchema,
|
|
57
|
+
// The REQUEST carries no plugin label: the guard must not read it.
|
|
58
|
+
create(AgentSchema, { metadata: { name: "reviewer", labels: {} } }),
|
|
59
|
+
caller,
|
|
60
|
+
ApiResourceKind.agent,
|
|
61
|
+
);
|
|
62
|
+
ctx.set(
|
|
63
|
+
key,
|
|
64
|
+
create(AgentSchema, {
|
|
65
|
+
metadata: { name: "reviewer", slug: "reviewer", labels },
|
|
66
|
+
}),
|
|
67
|
+
);
|
|
68
|
+
return ctx;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
async function outcome(
|
|
72
|
+
promise: Promise<void> | void,
|
|
73
|
+
): Promise<ConnectError | undefined> {
|
|
74
|
+
try {
|
|
75
|
+
await promise;
|
|
76
|
+
return undefined;
|
|
77
|
+
} catch (error) {
|
|
78
|
+
return error as ConnectError;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
describe("GuardPluginManaged", () => {
|
|
83
|
+
it("refuses a client write to a member whose plugin exists, naming the plugin", async () => {
|
|
84
|
+
const step = newGuardPluginManagedStep<typeof AgentSchema>(
|
|
85
|
+
storeWith("plg_1"),
|
|
86
|
+
);
|
|
87
|
+
const error = await outcome(
|
|
88
|
+
step.execute(ctxWithStored({ [PLUGIN_LABEL]: "plg_1" }, USER)),
|
|
89
|
+
);
|
|
90
|
+
expect(error).toBeInstanceOf(ConnectError);
|
|
91
|
+
expect(error?.code).toBe(Code.FailedPrecondition);
|
|
92
|
+
expect(error?.rawMessage).toBe(
|
|
93
|
+
"agent 'reviewer' is managed by plugin 'thermos'; change the plugin and push it again, or compose your own agent over it",
|
|
94
|
+
);
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
it("locks nothing when the labelled plugin is gone", async () => {
|
|
98
|
+
const step = newGuardPluginManagedStep<typeof AgentSchema>(
|
|
99
|
+
storeWith(undefined),
|
|
100
|
+
);
|
|
101
|
+
expect(
|
|
102
|
+
await outcome(
|
|
103
|
+
step.execute(ctxWithStored({ [PLUGIN_LABEL]: "plg_gone" }, USER)),
|
|
104
|
+
),
|
|
105
|
+
).toBeUndefined();
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it("passes an unlabelled resource without touching the store", async () => {
|
|
109
|
+
const step = newGuardPluginManagedStep<typeof AgentSchema>({
|
|
110
|
+
getResource: () => Promise.reject(new Error("must not be called")),
|
|
111
|
+
} as unknown as Store);
|
|
112
|
+
expect(
|
|
113
|
+
await outcome(step.execute(ctxWithStored({ team: "x" }, USER))),
|
|
114
|
+
).toBeUndefined();
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
it("passes in-process and internal callers by structure", async () => {
|
|
118
|
+
const step = newGuardPluginManagedStep<typeof AgentSchema>(
|
|
119
|
+
storeWith("plg_1"),
|
|
120
|
+
);
|
|
121
|
+
expect(
|
|
122
|
+
await outcome(
|
|
123
|
+
step.execute(ctxWithStored({ [PLUGIN_LABEL]: "plg_1" }, IN_PROCESS)),
|
|
124
|
+
),
|
|
125
|
+
).toBeUndefined();
|
|
126
|
+
expect(
|
|
127
|
+
await outcome(
|
|
128
|
+
step.execute(ctxWithStored({ [PLUGIN_LABEL]: "plg_1" }, INTERNAL)),
|
|
129
|
+
),
|
|
130
|
+
).toBeUndefined();
|
|
131
|
+
});
|
|
132
|
+
|
|
133
|
+
it("reads the stored resource from the key the chain names", async () => {
|
|
134
|
+
const step = newGuardPluginManagedStep<typeof AgentSchema>(
|
|
135
|
+
storeWith("plg_1"),
|
|
136
|
+
{ existingKey: "customKey" },
|
|
137
|
+
);
|
|
138
|
+
const error = await outcome(
|
|
139
|
+
step.execute(
|
|
140
|
+
ctxWithStored({ [PLUGIN_LABEL]: "plg_1" }, USER, "customKey"),
|
|
141
|
+
),
|
|
142
|
+
);
|
|
143
|
+
expect(error?.code).toBe(Code.FailedPrecondition);
|
|
144
|
+
// Under the default key nothing is loaded, so nothing is refused.
|
|
145
|
+
expect(
|
|
146
|
+
await outcome(
|
|
147
|
+
step.execute(ctxWithStored({ [PLUGIN_LABEL]: "plg_1" }, USER)),
|
|
148
|
+
),
|
|
149
|
+
).toBeUndefined();
|
|
150
|
+
});
|
|
151
|
+
});
|
|
@@ -11,7 +11,9 @@ import { describe, expect, it } from "vitest";
|
|
|
11
11
|
import { Code, ConnectError } from "@connectrpc/connect";
|
|
12
12
|
import { create } from "@bufbuild/protobuf";
|
|
13
13
|
|
|
14
|
+
import type { Message } from "@bufbuild/protobuf";
|
|
14
15
|
import { AgentSchema } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/api_pb";
|
|
16
|
+
import { PushSkillRequestSchema } from "@stigmer/protos/ai/stigmer/agentic/skill/v1/io_pb";
|
|
15
17
|
import { EnvironmentSchema } from "@stigmer/protos/ai/stigmer/agentic/environment/v1/api_pb";
|
|
16
18
|
import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
|
|
17
19
|
import { IamPermission } from "@stigmer/protos/ai/stigmer/iam/v1/enum_pb";
|
|
@@ -74,6 +76,75 @@ describe("reservedLabelMutations", () => {
|
|
|
74
76
|
});
|
|
75
77
|
});
|
|
76
78
|
|
|
79
|
+
describe("GuardReservedLabels on a push-shaped chain (named positions)", () => {
|
|
80
|
+
// Skill push builds its resource from an artifact and rides SKILL_KEY /
|
|
81
|
+
// EXISTING_SKILL_KEY rather than newState / EXISTING_RESOURCE_KEY; the
|
|
82
|
+
// positions parameter points the guard at them. Pins that a reserved
|
|
83
|
+
// introduction on the BUILT resource is judged (the request itself has
|
|
84
|
+
// no metadata), that a stored echo under the named existing key passes,
|
|
85
|
+
// and that the in-process origin passes by structure.
|
|
86
|
+
const BUILT_KEY = "builtResource";
|
|
87
|
+
const STORED_KEY = "storedResource";
|
|
88
|
+
function pushCtx(
|
|
89
|
+
labels: Record<string, string>,
|
|
90
|
+
stored?: Record<string, string>,
|
|
91
|
+
caller: CallerIdentity = USER,
|
|
92
|
+
) {
|
|
93
|
+
const ctx = new RequestContext(
|
|
94
|
+
PushSkillRequestSchema,
|
|
95
|
+
create(PushSkillRequestSchema, {
|
|
96
|
+
org: "acme",
|
|
97
|
+
artifact: new Uint8Array(1),
|
|
98
|
+
labels,
|
|
99
|
+
}),
|
|
100
|
+
caller,
|
|
101
|
+
ApiResourceKind.skill,
|
|
102
|
+
);
|
|
103
|
+
ctx.set(
|
|
104
|
+
BUILT_KEY,
|
|
105
|
+
create(AgentSchema, { metadata: { name: "s", labels } }),
|
|
106
|
+
);
|
|
107
|
+
if (stored !== undefined) {
|
|
108
|
+
ctx.set(
|
|
109
|
+
STORED_KEY,
|
|
110
|
+
create(AgentSchema, { metadata: { name: "s", labels: stored } }),
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
return ctx;
|
|
114
|
+
}
|
|
115
|
+
const positioned = (authorizer: Authorizer) =>
|
|
116
|
+
newGuardReservedLabelsStep<typeof PushSkillRequestSchema>(authorizer, {
|
|
117
|
+
stateOf: (ctx) => ctx.get(BUILT_KEY) as Message,
|
|
118
|
+
existingKey: STORED_KEY,
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
it("rejects a reserved introduction read from the named state", async () => {
|
|
122
|
+
const error = await positioned(denying())
|
|
123
|
+
.execute(pushCtx({ "stigmer.ai/plugin": "plg_1" }))
|
|
124
|
+
?.catch((e: unknown) => e);
|
|
125
|
+
expect(error).toBeInstanceOf(ConnectError);
|
|
126
|
+
expect((error as ConnectError).code).toBe(Code.InvalidArgument);
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
it("passes an echo of the label stored under the named existing key", async () => {
|
|
130
|
+
await positioned(denying()).execute(
|
|
131
|
+
pushCtx(
|
|
132
|
+
{ "stigmer.ai/plugin": "plg_1" },
|
|
133
|
+
{ "stigmer.ai/plugin": "plg_1" },
|
|
134
|
+
),
|
|
135
|
+
);
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
it("passes the in-process origin by structure", async () => {
|
|
139
|
+
await positioned(denying()).execute(
|
|
140
|
+
pushCtx({ "stigmer.ai/plugin": "plg_1" }, undefined, {
|
|
141
|
+
...USER,
|
|
142
|
+
origin: "in-process",
|
|
143
|
+
}),
|
|
144
|
+
);
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
|
|
77
148
|
describe("GuardReservedLabels", () => {
|
|
78
149
|
it("rejects an introduction with the byte-pinned copy when denied", async () => {
|
|
79
150
|
const step = newGuardReservedLabelsStep<typeof AgentSchema>(denying());
|
|
@@ -133,9 +204,8 @@ describe("GuardReservedLabels", () => {
|
|
|
133
204
|
});
|
|
134
205
|
|
|
135
206
|
it("the Environment personal-label client contract passes", async () => {
|
|
136
|
-
const step =
|
|
137
|
-
denying()
|
|
138
|
-
);
|
|
207
|
+
const step =
|
|
208
|
+
newGuardReservedLabelsStep<typeof EnvironmentSchema>(denying());
|
|
139
209
|
const ctx = new RequestContext(
|
|
140
210
|
EnvironmentSchema,
|
|
141
211
|
create(EnvironmentSchema, {
|
|
@@ -151,7 +221,12 @@ describe("GuardReservedLabels", () => {
|
|
|
151
221
|
const step = newGuardReservedLabelsStep<typeof AgentSchema>(denying());
|
|
152
222
|
const ctx = agentCtx(
|
|
153
223
|
{ "stigmer.ai/default-instance": "true" },
|
|
154
|
-
{
|
|
224
|
+
{
|
|
225
|
+
identityId: "internal",
|
|
226
|
+
callerClass: "internal",
|
|
227
|
+
issuer: "",
|
|
228
|
+
rawToken: "",
|
|
229
|
+
},
|
|
155
230
|
);
|
|
156
231
|
await expect(Promise.resolve(step.execute(ctx))).resolves.toBeUndefined();
|
|
157
232
|
});
|
|
@@ -166,7 +241,9 @@ describe("GuardReservedLabels", () => {
|
|
|
166
241
|
vouched,
|
|
167
242
|
"stigmer.ai/workflow-execution-id",
|
|
168
243
|
);
|
|
169
|
-
await expect(
|
|
244
|
+
await expect(
|
|
245
|
+
Promise.resolve(step.execute(vouched)),
|
|
246
|
+
).resolves.toBeUndefined();
|
|
170
247
|
|
|
171
248
|
const smuggled = agentCtx({
|
|
172
249
|
"stigmer.ai/workflow-execution-id": "wfe_1",
|
|
@@ -176,9 +253,7 @@ describe("GuardReservedLabels", () => {
|
|
|
176
253
|
smuggled,
|
|
177
254
|
"stigmer.ai/workflow-execution-id",
|
|
178
255
|
);
|
|
179
|
-
const error = await step
|
|
180
|
-
.execute(smuggled)
|
|
181
|
-
?.catch((e: unknown) => e);
|
|
256
|
+
const error = await step.execute(smuggled)?.catch((e: unknown) => e);
|
|
182
257
|
expect(error).toBeInstanceOf(ConnectError);
|
|
183
258
|
expect((error as ConnectError).rawMessage).toContain(
|
|
184
259
|
"stigmer.ai/default-agent",
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The facts a stored row's authorization tuples derive from, read back
|
|
3
|
+
* from the row (`RowAuthorizationFacts`, extensions/resource-authorization.ts)
|
|
4
|
+
* — the read-time twin of the tuple lifecycle's create-time resolution in
|
|
5
|
+
* authorization-tuples.ts, and deliberately not that function: the
|
|
6
|
+
* create-time one throws when a row is missing its organization or its
|
|
7
|
+
* parent (a create must not half-succeed), while a row read back years
|
|
8
|
+
* later is a fact, missing pieces included — an empty organization
|
|
9
|
+
* resolves `admin from organization` to nobody, it does not fault a read.
|
|
10
|
+
* The two cannot drift unnoticed: src/authorization/__tests__/facts.test.ts
|
|
11
|
+
* pins that a well-formed row resolves to the same links through both.
|
|
12
|
+
*
|
|
13
|
+
* Two readers share this one resolver, which is the reason it is a leaf
|
|
14
|
+
* of its own: the list lanes' shared helper (extensions/list-read-scope.ts)
|
|
15
|
+
* builds every candidate's `ListEntryMeta` through it, and the built-in
|
|
16
|
+
* authorizer (src/authorization/facts.ts) derives a loaded row's tuples
|
|
17
|
+
* through it. It imports the two pure leaves it needs (apiresource-meta,
|
|
18
|
+
* shapes) and the protos, and nothing else, so the seam may import it by
|
|
19
|
+
* value without a cycle — the third such leaf, beside those two.
|
|
20
|
+
*
|
|
21
|
+
* Every read is structural (shapes.ts's own premise: protobuf-es messages
|
|
22
|
+
* are plain objects sharing the generated metadata and audit types), so
|
|
23
|
+
* the resolver needs no schema — a list lane holds decoded rows of a kind
|
|
24
|
+
* it names, not their descriptors.
|
|
25
|
+
*/
|
|
26
|
+
import { AuthorizationScopeType } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/authorization_config_pb";
|
|
27
|
+
import type { ParentRelationConfig } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/authorization_config_pb";
|
|
28
|
+
import type { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
|
|
29
|
+
import { ApiResourceVisibility } from "@stigmer/protos/ai/stigmer/commons/apiresource/enum_pb";
|
|
30
|
+
import type { ApiResourceAudit } from "@stigmer/protos/ai/stigmer/commons/apiresource/status_pb";
|
|
31
|
+
|
|
32
|
+
import type {
|
|
33
|
+
ResolvedParentLink,
|
|
34
|
+
RowAuthorizationFacts,
|
|
35
|
+
} from "../../extensions/resource-authorization.js";
|
|
36
|
+
import { getKindEnum, getKindMeta } from "../apiresource-meta.js";
|
|
37
|
+
import { parentIdOf } from "./shapes.js";
|
|
38
|
+
import type { HasMetadataShape } from "./shapes.js";
|
|
39
|
+
|
|
40
|
+
/** The one path every stored API resource keeps its audit under. */
|
|
41
|
+
interface HasAuditShape {
|
|
42
|
+
status?: { audit?: ApiResourceAudit };
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/** The row's facts, read structurally; every absence is the empty value, never a throw. */
|
|
46
|
+
export function rowAuthorizationFactsOf(
|
|
47
|
+
kind: ApiResourceKind,
|
|
48
|
+
resource: object,
|
|
49
|
+
): RowAuthorizationFacts {
|
|
50
|
+
const metadata = (resource as HasMetadataShape).metadata;
|
|
51
|
+
const org = metadata?.org ?? "";
|
|
52
|
+
return {
|
|
53
|
+
id: metadata?.id ?? "",
|
|
54
|
+
org,
|
|
55
|
+
visibility:
|
|
56
|
+
metadata?.visibility ??
|
|
57
|
+
ApiResourceVisibility.api_resource_visibility_unspecified,
|
|
58
|
+
createdBy: createdByOf(resource),
|
|
59
|
+
parentLinks: parentLinksOf(kind, resource, org),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** `status.audit.spec_audit.created_by.id` as stamped — "" when any link is absent. */
|
|
64
|
+
export function createdByOf(resource: object): string {
|
|
65
|
+
return (
|
|
66
|
+
(resource as HasAuditShape).status?.audit?.specAudit?.createdBy?.id ?? ""
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* The scope link and every configured additional parent the row names, in
|
|
72
|
+
* the tuple lifecycle's order. A parent the row does not name is left out.
|
|
73
|
+
*/
|
|
74
|
+
export function parentLinksOf(
|
|
75
|
+
kind: ApiResourceKind,
|
|
76
|
+
resource: object,
|
|
77
|
+
org: string,
|
|
78
|
+
): ReadonlyArray<ResolvedParentLink> {
|
|
79
|
+
const config = getKindMeta(kind).authorization;
|
|
80
|
+
if (config === undefined) {
|
|
81
|
+
return [];
|
|
82
|
+
}
|
|
83
|
+
const links: ResolvedParentLink[] = [];
|
|
84
|
+
switch (config.scopeType) {
|
|
85
|
+
case AuthorizationScopeType.ORGANIZATION:
|
|
86
|
+
if (org !== "") {
|
|
87
|
+
links.push({
|
|
88
|
+
relation: "organization",
|
|
89
|
+
parentKind: getKindEnum("organization"),
|
|
90
|
+
parentId: org,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
break;
|
|
94
|
+
case AuthorizationScopeType.PARENT:
|
|
95
|
+
if (config.parent !== undefined) {
|
|
96
|
+
pushLink(links, resource, config.parent);
|
|
97
|
+
}
|
|
98
|
+
break;
|
|
99
|
+
case AuthorizationScopeType.OWNER_ONLY:
|
|
100
|
+
case AuthorizationScopeType.PLATFORM:
|
|
101
|
+
case AuthorizationScopeType.NONE:
|
|
102
|
+
case AuthorizationScopeType.UNSPECIFIED:
|
|
103
|
+
// No scope link: OWNER_ONLY by design; PLATFORM is dead config in
|
|
104
|
+
// both editions (the lifecycle warns and writes none); NONE and
|
|
105
|
+
// UNSPECIFIED are kinds outside the model.
|
|
106
|
+
break;
|
|
107
|
+
default: {
|
|
108
|
+
const exhaustive: never = config.scopeType;
|
|
109
|
+
throw new Error(`unknown scope type: ${String(exhaustive)}`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
for (const parent of config.additionalParents) {
|
|
113
|
+
pushLink(links, resource, parent);
|
|
114
|
+
}
|
|
115
|
+
return links;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function pushLink(
|
|
119
|
+
links: ResolvedParentLink[],
|
|
120
|
+
resource: object,
|
|
121
|
+
parent: ParentRelationConfig,
|
|
122
|
+
): void {
|
|
123
|
+
const parentId = parentIdOf(resource, parent.specField);
|
|
124
|
+
if (parentId !== "") {
|
|
125
|
+
links.push({
|
|
126
|
+
relation: parent.relation,
|
|
127
|
+
parentKind: getKindEnum(parent.kind),
|
|
128
|
+
parentId,
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
}
|