@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
|
@@ -15,7 +15,11 @@ import type { DescMessage, MessageShape } from "@bufbuild/protobuf";
|
|
|
15
15
|
import { ResourceNotFoundError } from "../../store/interface.js";
|
|
16
16
|
import type { Store } from "../../store/interface.js";
|
|
17
17
|
import { getKindName } from "../apiresource-meta.js";
|
|
18
|
-
import {
|
|
18
|
+
import {
|
|
19
|
+
internalError,
|
|
20
|
+
invalidArgumentError,
|
|
21
|
+
notFoundError,
|
|
22
|
+
} from "../errors.js";
|
|
19
23
|
import type { PipelineStep } from "../pipeline.js";
|
|
20
24
|
import type { RequestContext } from "../request-context.js";
|
|
21
25
|
import { EXISTING_RESOURCE_KEY } from "./load-existing.js";
|
|
@@ -24,7 +28,9 @@ import { idValueOf } from "./shapes.js";
|
|
|
24
28
|
/** Context key for the extracted id (Go ResourceIdKey). */
|
|
25
29
|
export const RESOURCE_ID_KEY = "resourceId";
|
|
26
30
|
|
|
27
|
-
export function newExtractResourceIdStep<
|
|
31
|
+
export function newExtractResourceIdStep<
|
|
32
|
+
Desc extends DescMessage,
|
|
33
|
+
>(): PipelineStep<Desc> {
|
|
28
34
|
return {
|
|
29
35
|
name: "ExtractResourceId",
|
|
30
36
|
execute(ctx: RequestContext<Desc>): void {
|
|
@@ -90,7 +96,9 @@ function requireResourceId<Desc extends DescMessage>(
|
|
|
90
96
|
const id = ctx.get(RESOURCE_ID_KEY);
|
|
91
97
|
if (typeof id !== "string" || id === "") {
|
|
92
98
|
throw internalError(
|
|
93
|
-
new Error(
|
|
99
|
+
new Error(
|
|
100
|
+
"resource id not found in context (ExtractResourceId must run first)",
|
|
101
|
+
),
|
|
94
102
|
"delete pipeline ordering",
|
|
95
103
|
);
|
|
96
104
|
}
|
|
@@ -24,10 +24,16 @@ export function newCheckDuplicateStep<Desc extends DescMessage>(
|
|
|
24
24
|
const metadata = metadataOf(ctx.newState);
|
|
25
25
|
if (metadata === undefined) {
|
|
26
26
|
// Established by earlier steps — a server-side programming error.
|
|
27
|
-
throw internalError(
|
|
27
|
+
throw internalError(
|
|
28
|
+
new Error("resource metadata is nil"),
|
|
29
|
+
"duplicate check",
|
|
30
|
+
);
|
|
28
31
|
}
|
|
29
32
|
if (metadata.slug === "") {
|
|
30
|
-
throw internalError(
|
|
33
|
+
throw internalError(
|
|
34
|
+
new Error("resource slug is empty"),
|
|
35
|
+
"duplicate check",
|
|
36
|
+
);
|
|
31
37
|
}
|
|
32
38
|
|
|
33
39
|
let existing;
|
|
@@ -59,7 +59,7 @@ export function newGuardMemoryCaptureStep<Desc extends DescMessage>(
|
|
|
59
59
|
): PipelineStep<Desc> {
|
|
60
60
|
return {
|
|
61
61
|
name: "GuardMemoryCapture",
|
|
62
|
-
execute(ctx: RequestContext<Desc>): void {
|
|
62
|
+
async execute(ctx: RequestContext<Desc>): Promise<void> {
|
|
63
63
|
const caller = ctx.callerIdentity;
|
|
64
64
|
if (caller.callerClass === "internal" || caller.origin === "in-process") {
|
|
65
65
|
// Server-composed traversals are not capture requests from a
|
|
@@ -72,9 +72,11 @@ export function newGuardMemoryCaptureStep<Desc extends DescMessage>(
|
|
|
72
72
|
// arm checks it against the token's own claim (and throws its
|
|
73
73
|
// byte-pinned refusal itself). Empty when the request carries
|
|
74
74
|
// none; Java requires metadata.org before its org-match arm, so
|
|
75
|
-
// an empty value can only ever narrow.
|
|
75
|
+
// an empty value can only ever narrow. Awaited because the
|
|
76
|
+
// built-in provider reads the bound execution's row for the
|
|
77
|
+
// session and org the cloud's token carries as claims.
|
|
76
78
|
const org = metadataOf(ctx.newState)?.org ?? "";
|
|
77
|
-
const decision = decide.call(provider, caller, org);
|
|
79
|
+
const decision = await decide.call(provider, caller, org);
|
|
78
80
|
switch (decision.verdict) {
|
|
79
81
|
case "admit":
|
|
80
82
|
ctx.set(MEMORY_CAPTURE_CREDENTIAL_KEY, {
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GuardPluginManaged — the write boundary for resources a plugin
|
|
3
|
+
* materialised. A plugin's skills, MCP servers, agent and workflows are
|
|
4
|
+
* ordinary resources in the organization, labelled `stigmer.ai/plugin:
|
|
5
|
+
* <plugin id>` by the controller that installed them; the plugin owns
|
|
6
|
+
* their definition, so a client edit would be silently overwritten by the
|
|
7
|
+
* next upgrade and a client delete would leave the plugin claiming a
|
|
8
|
+
* member it no longer has. Customisation is composition: the user writes
|
|
9
|
+
* their own agent over the plugin's skills and servers, which stay readable
|
|
10
|
+
* and usable by everyone the visibility admits.
|
|
11
|
+
*
|
|
12
|
+
* Two facts decide, together (the apiresource-labels.ts doctrine: a label
|
|
13
|
+
* restricts only beside server-owned state):
|
|
14
|
+
* - the STORED resource carries the plugin label — the request's labels
|
|
15
|
+
* are never consulted, so a client cannot detach a child by omitting
|
|
16
|
+
* the label on an update;
|
|
17
|
+
* - AND the plugin row it names exists. A label whose plugin is gone (a
|
|
18
|
+
* cascade that failed part-way; a label a self-hosted operator stamped
|
|
19
|
+
* by hand under the permissive authorizer) leaves the resource editable
|
|
20
|
+
* and deletable, so nothing can be locked forever.
|
|
21
|
+
*
|
|
22
|
+
* Server-composed writes pass by structure: the plugin controller is the
|
|
23
|
+
* one writer of these resources and rides the in-process lane as the
|
|
24
|
+
* installing caller (`origin: "in-process"`), exactly the arm
|
|
25
|
+
* GuardReservedLabels passes. Operational RPCs (connect, OAuth flows,
|
|
26
|
+
* instances, sessions, executions) never splice this step: they read or
|
|
27
|
+
* enrich a server, they do not redefine it.
|
|
28
|
+
*
|
|
29
|
+
* Placement: after the chain's load of the stored resource (LoadExisting,
|
|
30
|
+
* LoadExistingForDelete, a kind's visibility loader, skill push's
|
|
31
|
+
* FindExistingBySlug), before any state is built or persisted. The
|
|
32
|
+
* refusal is FAILED_PRECONDITION with the plugin named, so the user knows
|
|
33
|
+
* which door to use instead.
|
|
34
|
+
*
|
|
35
|
+
* Proven by __tests__/guard-plugin-managed.test.ts and the plugin
|
|
36
|
+
* conformance suite's managed-child arms.
|
|
37
|
+
*/
|
|
38
|
+
import { Code, ConnectError } from "@connectrpc/connect";
|
|
39
|
+
import type { DescMessage, Message } from "@bufbuild/protobuf";
|
|
40
|
+
|
|
41
|
+
import { PluginSchema } from "@stigmer/protos/ai/stigmer/agentic/plugin/v1/api_pb";
|
|
42
|
+
import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
|
|
43
|
+
|
|
44
|
+
import { pluginIdOf } from "../apiresource-labels.js";
|
|
45
|
+
import { internalError } from "../errors.js";
|
|
46
|
+
import type { PipelineStep } from "../pipeline.js";
|
|
47
|
+
import type { RequestContext } from "../request-context.js";
|
|
48
|
+
import { ResourceNotFoundError } from "../../store/interface.js";
|
|
49
|
+
import type { Store } from "../../store/interface.js";
|
|
50
|
+
import { EXISTING_RESOURCE_KEY } from "./load-existing.js";
|
|
51
|
+
import { metadataOf } from "./shapes.js";
|
|
52
|
+
|
|
53
|
+
/** The kinds a plugin materialises; the noun opens the refusal sentence. */
|
|
54
|
+
const MANAGED_KIND_NOUNS: ReadonlyMap<ApiResourceKind, string> = new Map([
|
|
55
|
+
[ApiResourceKind.skill, "skill"],
|
|
56
|
+
[ApiResourceKind.mcp_server, "MCP server"],
|
|
57
|
+
[ApiResourceKind.agent, "agent"],
|
|
58
|
+
[ApiResourceKind.workflow, "workflow"],
|
|
59
|
+
]);
|
|
60
|
+
|
|
61
|
+
/** The one sentence a refused mutation carries; the CLI and console render it as is. */
|
|
62
|
+
export function pluginManagedRefusal(
|
|
63
|
+
kind: ApiResourceKind,
|
|
64
|
+
slug: string,
|
|
65
|
+
pluginSlug: string,
|
|
66
|
+
): string {
|
|
67
|
+
const noun =
|
|
68
|
+
MANAGED_KIND_NOUNS.get(kind) ?? ApiResourceKind[kind] ?? String(kind);
|
|
69
|
+
return (
|
|
70
|
+
`${noun} '${slug}' is managed by plugin '${pluginSlug}'; change the plugin and ` +
|
|
71
|
+
"push it again, or compose your own agent over it"
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export interface GuardPluginManagedPositions {
|
|
76
|
+
/** The context key the stored resource rides; defaults to EXISTING_RESOURCE_KEY. */
|
|
77
|
+
readonly existingKey?: string;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export function newGuardPluginManagedStep<Desc extends DescMessage>(
|
|
81
|
+
store: Store,
|
|
82
|
+
positions: GuardPluginManagedPositions = {},
|
|
83
|
+
): PipelineStep<Desc> {
|
|
84
|
+
const existingKey = positions.existingKey ?? EXISTING_RESOURCE_KEY;
|
|
85
|
+
return {
|
|
86
|
+
name: "GuardPluginManaged",
|
|
87
|
+
async execute(ctx: RequestContext<Desc>): Promise<void> {
|
|
88
|
+
if (
|
|
89
|
+
ctx.callerIdentity.callerClass === "internal" ||
|
|
90
|
+
ctx.callerIdentity.origin === "in-process"
|
|
91
|
+
) {
|
|
92
|
+
// The plugin controller's own materialisation, upgrade and cascade
|
|
93
|
+
// writes; the same structural pass GuardReservedLabels takes.
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const existing = ctx.get(existingKey);
|
|
97
|
+
if (existing === undefined) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const metadata = metadataOf(existing as Message);
|
|
101
|
+
const pluginId = pluginIdOf(metadata);
|
|
102
|
+
if (pluginId === undefined) {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
let pluginSlug: string;
|
|
107
|
+
try {
|
|
108
|
+
const plugin = await store.getResource(
|
|
109
|
+
ApiResourceKind.plugin,
|
|
110
|
+
pluginId,
|
|
111
|
+
PluginSchema,
|
|
112
|
+
);
|
|
113
|
+
pluginSlug = plugin.metadata?.slug ?? pluginId;
|
|
114
|
+
} catch (error) {
|
|
115
|
+
if (error instanceof ResourceNotFoundError) {
|
|
116
|
+
// A dangling label locks nothing: the plugin that would own this
|
|
117
|
+
// resource is gone, so the resource is the user's again.
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
throw internalError(error, "plugin ownership could not be checked");
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
throw new ConnectError(
|
|
124
|
+
pluginManagedRefusal(
|
|
125
|
+
ctx.apiResourceKind,
|
|
126
|
+
metadata?.slug ?? "",
|
|
127
|
+
pluginSlug,
|
|
128
|
+
),
|
|
129
|
+
Code.FailedPrecondition,
|
|
130
|
+
);
|
|
131
|
+
},
|
|
132
|
+
};
|
|
133
|
+
}
|
|
@@ -40,12 +40,15 @@
|
|
|
40
40
|
*
|
|
41
41
|
* Placement: after BuildNewState/BuildUpdateState — the step inspects the
|
|
42
42
|
* state that will persist, and update chains have LoadExisting's stored
|
|
43
|
-
* labels for echo detection.
|
|
43
|
+
* labels for echo detection. A push-shaped chain (skill push, whose
|
|
44
|
+
* PushSkillRequest carries `labels`) places it after its populate step and
|
|
45
|
+
* names its own positions (GuardReservedLabelsPositions), since its
|
|
46
|
+
* resource rides a domain key, not newState. The infrastructure-failure arm answers a
|
|
44
47
|
* sanitized INTERNAL (the TS store-fault doctrine, #478) where Java
|
|
45
48
|
* echoes raw exception text — an unpinned outage-lane difference.
|
|
46
49
|
*/
|
|
47
50
|
import { Code, ConnectError } from "@connectrpc/connect";
|
|
48
|
-
import type { DescMessage } from "@bufbuild/protobuf";
|
|
51
|
+
import type { DescMessage, Message } from "@bufbuild/protobuf";
|
|
49
52
|
|
|
50
53
|
import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
|
|
51
54
|
import { IamPermission } from "@stigmer/protos/ai/stigmer/iam/v1/enum_pb";
|
|
@@ -69,9 +72,7 @@ export const RESERVED_LABEL_PREFIX = "stigmer.ai/";
|
|
|
69
72
|
const CLIENT_CONTRACT_ALLOWLIST: ReadonlyMap<
|
|
70
73
|
ApiResourceKind,
|
|
71
74
|
ReadonlySet<string>
|
|
72
|
-
> = new Map([
|
|
73
|
-
[ApiResourceKind.environment, new Set(["stigmer.ai/personal"])],
|
|
74
|
-
]);
|
|
75
|
+
> = new Map([[ApiResourceKind.environment, new Set(["stigmer.ai/personal"])]]);
|
|
75
76
|
|
|
76
77
|
/**
|
|
77
78
|
* The reserved keys `requested` would introduce or change relative to
|
|
@@ -91,9 +92,27 @@ export function reservedLabelMutations(
|
|
|
91
92
|
return mutations.sort();
|
|
92
93
|
}
|
|
93
94
|
|
|
95
|
+
/**
|
|
96
|
+
* Where the guard finds the state that will persist and the stored state
|
|
97
|
+
* it is judged against. The create and update chains carry both in the
|
|
98
|
+
* shared positions (`ctx.newState`, EXISTING_RESOURCE_KEY); a push-shaped
|
|
99
|
+
* chain builds its resource from an artifact and rides its own keys, so
|
|
100
|
+
* it names them here. Defaults are the shared positions.
|
|
101
|
+
*/
|
|
102
|
+
export interface GuardReservedLabelsPositions<Desc extends DescMessage> {
|
|
103
|
+
/** The resource about to persist; defaults to the chain's newState. */
|
|
104
|
+
readonly stateOf?: (ctx: RequestContext<Desc>) => Message | undefined;
|
|
105
|
+
/** The context key the stored resource rides; defaults to EXISTING_RESOURCE_KEY. */
|
|
106
|
+
readonly existingKey?: string;
|
|
107
|
+
}
|
|
108
|
+
|
|
94
109
|
export function newGuardReservedLabelsStep<Desc extends DescMessage>(
|
|
95
110
|
authorizer: Authorizer,
|
|
111
|
+
positions: GuardReservedLabelsPositions<Desc> = {},
|
|
96
112
|
): PipelineStep<Desc> {
|
|
113
|
+
const stateOf =
|
|
114
|
+
positions.stateOf ?? ((ctx: RequestContext<Desc>) => ctx.newState);
|
|
115
|
+
const existingKey = positions.existingKey ?? EXISTING_RESOURCE_KEY;
|
|
97
116
|
return {
|
|
98
117
|
name: "GuardReservedLabels",
|
|
99
118
|
async execute(ctx: RequestContext<Desc>): Promise<void> {
|
|
@@ -108,12 +127,14 @@ export function newGuardReservedLabelsStep<Desc extends DescMessage>(
|
|
|
108
127
|
// identity for attribution (ruling R5).
|
|
109
128
|
return;
|
|
110
129
|
}
|
|
111
|
-
const
|
|
112
|
-
const
|
|
130
|
+
const state = stateOf(ctx);
|
|
131
|
+
const requested =
|
|
132
|
+
state === undefined ? {} : (metadataOf(state)?.labels ?? {});
|
|
133
|
+
const existing = ctx.get(existingKey);
|
|
113
134
|
const stored =
|
|
114
135
|
existing === undefined
|
|
115
136
|
? {}
|
|
116
|
-
: (metadataOf(existing as
|
|
137
|
+
: (metadataOf(existing as Message)?.labels ?? {});
|
|
117
138
|
|
|
118
139
|
const allowlist =
|
|
119
140
|
CLIENT_CONTRACT_ALLOWLIST.get(ctx.apiResourceKind) ?? new Set();
|
|
@@ -109,7 +109,10 @@ export function requireOrgForReference(
|
|
|
109
109
|
scopeType = meta.authorization?.scopeType;
|
|
110
110
|
kindName = meta.name;
|
|
111
111
|
} catch (error) {
|
|
112
|
-
throw internalError(
|
|
112
|
+
throw internalError(
|
|
113
|
+
error,
|
|
114
|
+
"failed to resolve kind metadata for reference org check",
|
|
115
|
+
);
|
|
113
116
|
}
|
|
114
117
|
// protobuf-es strips the shared enum prefix: proto
|
|
115
118
|
// AUTHORIZATION_SCOPE_TYPE_ORGANIZATION generates as ORGANIZATION.
|
|
@@ -37,26 +37,34 @@ export function newIndexSearchStep<Desc extends DescMessage>(
|
|
|
37
37
|
const resource = ctx.newState;
|
|
38
38
|
const metadata = metadataOf(resource);
|
|
39
39
|
if (metadata === undefined || metadata.id === "") {
|
|
40
|
-
logger.warn(
|
|
40
|
+
logger.warn(
|
|
41
|
+
"IndexSearch: resource has no metadata or ID, skipping indexing",
|
|
42
|
+
);
|
|
41
43
|
return;
|
|
42
44
|
}
|
|
43
45
|
|
|
44
46
|
const entry = extractor.getSearchIndexEntry(resource);
|
|
45
47
|
if (entry === undefined) {
|
|
46
|
-
logger.warn(
|
|
47
|
-
|
|
48
|
-
|
|
48
|
+
logger.warn(
|
|
49
|
+
"IndexSearch: extractor returned no entry, skipping indexing",
|
|
50
|
+
{
|
|
51
|
+
id: metadata.id,
|
|
52
|
+
},
|
|
53
|
+
);
|
|
49
54
|
return;
|
|
50
55
|
}
|
|
51
56
|
|
|
52
57
|
try {
|
|
53
58
|
await store.upsertSearchIndex(ctx.apiResourceKind, metadata.id, entry);
|
|
54
59
|
} catch (error) {
|
|
55
|
-
logger.warn(
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
+
logger.warn(
|
|
61
|
+
"IndexSearch: failed to update search index (best-effort)",
|
|
62
|
+
{
|
|
63
|
+
id: metadata.id,
|
|
64
|
+
kind: apiResourceKindName(ctx.apiResourceKind),
|
|
65
|
+
error: error instanceof Error ? error.message : String(error),
|
|
66
|
+
},
|
|
67
|
+
);
|
|
60
68
|
}
|
|
61
69
|
},
|
|
62
70
|
};
|
|
@@ -72,18 +80,23 @@ export function newDeleteSearchIndexStep<Desc extends DescMessage>(
|
|
|
72
80
|
const id = ctx.get(RESOURCE_ID_KEY);
|
|
73
81
|
if (typeof id !== "string" || id === "") {
|
|
74
82
|
throw internalError(
|
|
75
|
-
new Error(
|
|
83
|
+
new Error(
|
|
84
|
+
"resource id not found in context (ExtractResourceId must run first)",
|
|
85
|
+
),
|
|
76
86
|
"delete search index ordering",
|
|
77
87
|
);
|
|
78
88
|
}
|
|
79
89
|
try {
|
|
80
90
|
await store.deleteSearchIndex(ctx.apiResourceKind, id);
|
|
81
91
|
} catch (error) {
|
|
82
|
-
logger.warn(
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
92
|
+
logger.warn(
|
|
93
|
+
"DeleteSearchIndex: failed to remove search index entry (best-effort)",
|
|
94
|
+
{
|
|
95
|
+
id,
|
|
96
|
+
kind: apiResourceKindName(ctx.apiResourceKind),
|
|
97
|
+
error: error instanceof Error ? error.message : String(error),
|
|
98
|
+
},
|
|
99
|
+
);
|
|
87
100
|
}
|
|
88
101
|
},
|
|
89
102
|
};
|
|
@@ -15,7 +15,11 @@ import type { DescMessage, MessageShape } from "@bufbuild/protobuf";
|
|
|
15
15
|
import { ResourceNotFoundError } from "../../store/interface.js";
|
|
16
16
|
import type { Store } from "../../store/interface.js";
|
|
17
17
|
import { getKindName } from "../apiresource-meta.js";
|
|
18
|
-
import {
|
|
18
|
+
import {
|
|
19
|
+
internalError,
|
|
20
|
+
invalidArgumentError,
|
|
21
|
+
notFoundError,
|
|
22
|
+
} from "../errors.js";
|
|
19
23
|
import type { PipelineStep } from "../pipeline.js";
|
|
20
24
|
import type { RequestContext } from "../request-context.js";
|
|
21
25
|
import { findResourceBySlug } from "./helpers.js";
|
|
@@ -32,7 +36,10 @@ export function newLoadExistingStep<Desc extends DescMessage>(
|
|
|
32
36
|
async execute(ctx: RequestContext<Desc>): Promise<void> {
|
|
33
37
|
const metadata = metadataOf(ctx.newState);
|
|
34
38
|
if (metadata === undefined) {
|
|
35
|
-
throw internalError(
|
|
39
|
+
throw internalError(
|
|
40
|
+
new Error("resource metadata is nil"),
|
|
41
|
+
"load existing",
|
|
42
|
+
);
|
|
36
43
|
}
|
|
37
44
|
|
|
38
45
|
let existing: MessageShape<Desc>;
|
|
@@ -64,7 +71,9 @@ export function newLoadExistingStep<Desc extends DescMessage>(
|
|
|
64
71
|
// Populate the id so merge and persist have it.
|
|
65
72
|
metadata.id = metadataOf(existing)?.id ?? "";
|
|
66
73
|
} else {
|
|
67
|
-
throw invalidArgumentError(
|
|
74
|
+
throw invalidArgumentError(
|
|
75
|
+
"resource id or slug is required for update",
|
|
76
|
+
);
|
|
68
77
|
}
|
|
69
78
|
|
|
70
79
|
ctx.set(EXISTING_RESOURCE_KEY, existing);
|
|
@@ -31,13 +31,18 @@ import { messageFieldByName, metadataOf } from "./shapes.js";
|
|
|
31
31
|
const API_RESOURCE_REFERENCE_TYPE =
|
|
32
32
|
"ai.stigmer.commons.apiresource.ApiResourceReference";
|
|
33
33
|
|
|
34
|
-
export function newNormalizeReferencesStep<
|
|
34
|
+
export function newNormalizeReferencesStep<
|
|
35
|
+
Desc extends DescMessage,
|
|
36
|
+
>(): PipelineStep<Desc> {
|
|
35
37
|
return {
|
|
36
38
|
name: "NormalizeReferences",
|
|
37
39
|
execute(ctx: RequestContext<Desc>): void {
|
|
38
40
|
const metadata = metadataOf(ctx.newState);
|
|
39
41
|
if (metadata === undefined) {
|
|
40
|
-
throw internalError(
|
|
42
|
+
throw internalError(
|
|
43
|
+
new Error("resource metadata is nil"),
|
|
44
|
+
"normalize references",
|
|
45
|
+
);
|
|
41
46
|
}
|
|
42
47
|
// No org to resolve from — skip silently; required-org validation is
|
|
43
48
|
// the validation step's responsibility, not this one's.
|
|
@@ -100,6 +105,35 @@ export function newValidateReferencesStep<Desc extends DescMessage>(
|
|
|
100
105
|
};
|
|
101
106
|
}
|
|
102
107
|
|
|
108
|
+
/** One reference a spec carries, as the walker reads it. */
|
|
109
|
+
export interface SpecReference {
|
|
110
|
+
readonly kind: ApiResourceKind;
|
|
111
|
+
readonly slug: string;
|
|
112
|
+
readonly org: string;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Every ApiResourceReference in a resource's spec — the same walk
|
|
117
|
+
* ValidateReferences runs, exported for the readers that ask the reverse
|
|
118
|
+
* question ("who references this?"): the plugin delete guard scans an
|
|
119
|
+
* organization's agents and workflows for references to a member it is
|
|
120
|
+
* about to remove.
|
|
121
|
+
*/
|
|
122
|
+
export function collectSpecReferences(
|
|
123
|
+
schema: DescMessage,
|
|
124
|
+
msg: Parameters<typeof reflect>[1],
|
|
125
|
+
): SpecReference[] {
|
|
126
|
+
const refs: SpecReference[] = [];
|
|
127
|
+
forEachSpecReference(schema, msg, (ref) => {
|
|
128
|
+
refs.push({
|
|
129
|
+
kind: numberField(ref, "kind") as ApiResourceKind,
|
|
130
|
+
slug: stringField(ref, "slug"),
|
|
131
|
+
org: stringField(ref, "org"),
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
return refs;
|
|
135
|
+
}
|
|
136
|
+
|
|
103
137
|
/**
|
|
104
138
|
* Walks the resource's spec and invokes fn on every ApiResourceReference
|
|
105
139
|
* (singular, repeated, and map-valued message fields, recursively) —
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ResolveArtifactSource — materialises the archive bytes of a push-shaped
|
|
3
|
+
* request from whichever source it carries: inline bytes pass through; an
|
|
4
|
+
* upload reference is consumed HERE, which retires the single-use
|
|
5
|
+
* reference whatever happens downstream. Proto validation has already
|
|
6
|
+
* guaranteed exactly one source. Downstream steps read the bytes from the
|
|
7
|
+
* context key and never touch the request's fields, so the two sources
|
|
8
|
+
* are indistinguishable past this point.
|
|
9
|
+
*
|
|
10
|
+
* Skills carried this step alone (the Go ResolveArtifactSource port);
|
|
11
|
+
* plugins are pushed the same two ways over the same upload slots (one
|
|
12
|
+
* upload surface, as boot/compose.ts wires it), so the step lives
|
|
13
|
+
* here and each kind names its lane-absent sentence and the request
|
|
14
|
+
* fields it reads.
|
|
15
|
+
*
|
|
16
|
+
* The unusable-reference arm is INVALID_ARGUMENT, not a server fault: an
|
|
17
|
+
* unknown, expired, already consumed, or minted-but-never-uploaded
|
|
18
|
+
* reference all mean the client must re-mint and re-upload.
|
|
19
|
+
*/
|
|
20
|
+
import type { DescMessage, MessageShape } from "@bufbuild/protobuf";
|
|
21
|
+
|
|
22
|
+
import type { UploadSlots } from "../../domain/skill/transfer/slots.js";
|
|
23
|
+
import { failedPreconditionError, invalidArgumentError } from "../errors.js";
|
|
24
|
+
import type { PipelineStep } from "../pipeline.js";
|
|
25
|
+
import type { RequestContext } from "../request-context.js";
|
|
26
|
+
|
|
27
|
+
/** Where the resolved bytes ride for every downstream step. */
|
|
28
|
+
export const ARTIFACT_BYTES_KEY = "pushArtifactBytes";
|
|
29
|
+
|
|
30
|
+
export interface ArtifactSourceBinding<Desc extends DescMessage> {
|
|
31
|
+
/** The request's two sources; exactly one is set by proto validation. */
|
|
32
|
+
source(input: MessageShape<Desc>): {
|
|
33
|
+
readonly artifact: Uint8Array;
|
|
34
|
+
readonly artifactUploadRef: string;
|
|
35
|
+
};
|
|
36
|
+
/** The FailedPrecondition copy when no lane is configured; each kind pins its own. */
|
|
37
|
+
readonly laneNotConfigured: string;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function newResolveArtifactSourceStep<Desc extends DescMessage>(
|
|
41
|
+
slots: UploadSlots | undefined,
|
|
42
|
+
binding: ArtifactSourceBinding<Desc>,
|
|
43
|
+
): PipelineStep<Desc> {
|
|
44
|
+
return {
|
|
45
|
+
name: "ResolveArtifactSource",
|
|
46
|
+
async execute(ctx: RequestContext<Desc>): Promise<void> {
|
|
47
|
+
const { artifact, artifactUploadRef } = binding.source(ctx.input);
|
|
48
|
+
if (artifactUploadRef === "") {
|
|
49
|
+
ctx.set(ARTIFACT_BYTES_KEY, artifact);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
if (slots === undefined) {
|
|
53
|
+
throw failedPreconditionError(binding.laneNotConfigured);
|
|
54
|
+
}
|
|
55
|
+
let data: Uint8Array;
|
|
56
|
+
try {
|
|
57
|
+
data = await slots.consume(artifactUploadRef);
|
|
58
|
+
} catch (error) {
|
|
59
|
+
throw invalidArgumentError(
|
|
60
|
+
`artifact_upload_ref not usable: ${error instanceof Error ? error.message : String(error)} — request a new upload URL via createArtifactUploadUrl`,
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
ctx.set(ARTIFACT_BYTES_KEY, data);
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
}
|
|
@@ -36,7 +36,8 @@ export function recordServerStampedReservedLabels<Desc extends DescMessage>(
|
|
|
36
36
|
...keys: ReadonlyArray<string>
|
|
37
37
|
): void {
|
|
38
38
|
const existing = ctx.get(STAMPED_KEYS_CONTEXT_KEY);
|
|
39
|
-
const stamped =
|
|
39
|
+
const stamped =
|
|
40
|
+
existing instanceof Set ? (existing as Set<string>) : new Set<string>();
|
|
40
41
|
for (const key of keys) {
|
|
41
42
|
stamped.add(key);
|
|
42
43
|
}
|
|
@@ -14,14 +14,19 @@ import type { PipelineStep } from "../pipeline.js";
|
|
|
14
14
|
import type { RequestContext } from "../request-context.js";
|
|
15
15
|
import { metadataOf } from "./shapes.js";
|
|
16
16
|
|
|
17
|
-
export function newResolveSlugStep<
|
|
17
|
+
export function newResolveSlugStep<
|
|
18
|
+
Desc extends DescMessage,
|
|
19
|
+
>(): PipelineStep<Desc> {
|
|
18
20
|
return {
|
|
19
21
|
name: "ResolveSlug",
|
|
20
22
|
execute(ctx: RequestContext<Desc>): void {
|
|
21
23
|
const metadata = metadataOf(ctx.newState);
|
|
22
24
|
if (metadata === undefined) {
|
|
23
25
|
// A server-side programming error, not bad client input (Go).
|
|
24
|
-
throw internalError(
|
|
26
|
+
throw internalError(
|
|
27
|
+
new Error("resource metadata is nil"),
|
|
28
|
+
"slug resolution",
|
|
29
|
+
);
|
|
25
30
|
}
|
|
26
31
|
if (metadata.slug !== "") {
|
|
27
32
|
return; // already set — idempotent
|
|
@@ -34,7 +34,9 @@ import type { PipelineStep } from "../pipeline.js";
|
|
|
34
34
|
import type { RequestContext } from "../request-context.js";
|
|
35
35
|
import { metadataOf } from "./shapes.js";
|
|
36
36
|
|
|
37
|
-
export function newValidateVisibilityStep<
|
|
37
|
+
export function newValidateVisibilityStep<
|
|
38
|
+
Desc extends DescMessage,
|
|
39
|
+
>(): PipelineStep<Desc> {
|
|
38
40
|
return {
|
|
39
41
|
name: "ValidateVisibility",
|
|
40
42
|
execute(ctx: RequestContext<Desc>): void {
|
|
@@ -72,7 +74,12 @@ export function rejectDefaultInstanceVisibilityUpdate(): never {
|
|
|
72
74
|
}
|
|
73
75
|
|
|
74
76
|
/** Go rejectUnsupportedVisibility (the shared level check + copy). */
|
|
75
|
-
|
|
77
|
+
/**
|
|
78
|
+
* The one sentence for a level a kind does not support. Exported for the
|
|
79
|
+
* push-shaped chains whose requested level rides the request rather than
|
|
80
|
+
* a resource's metadata (plugin push), so the copy stays in one place.
|
|
81
|
+
*/
|
|
82
|
+
export function rejectUnsupportedVisibility(
|
|
76
83
|
kind: ApiResourceKind,
|
|
77
84
|
visibility: ApiResourceVisibility,
|
|
78
85
|
): void {
|
|
@@ -23,7 +23,9 @@ export function validator(): Validator {
|
|
|
23
23
|
return sharedValidator;
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
-
export function newValidateProtoStep<
|
|
26
|
+
export function newValidateProtoStep<
|
|
27
|
+
Desc extends DescMessage,
|
|
28
|
+
>(): PipelineStep<Desc> {
|
|
27
29
|
return {
|
|
28
30
|
name: "ValidateProto",
|
|
29
31
|
execute(ctx: RequestContext<Desc>): void {
|