@stigmer/server 3.15.3-dev.20260914121148 → 3.15.3-dev.20260916211208
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/archive/content-store.d.ts +35 -0
- package/dist/archive/content-store.d.ts.map +1 -0
- package/dist/archive/content-store.js +98 -0
- package/dist/archive/content-store.js.map +1 -0
- package/dist/archive/inflate.d.ts +22 -0
- package/dist/archive/inflate.d.ts.map +1 -0
- package/dist/archive/inflate.js +75 -0
- package/dist/archive/inflate.js.map +1 -0
- package/dist/archive/limits.d.ts +33 -0
- package/dist/archive/limits.d.ts.map +1 -0
- package/dist/archive/limits.js +31 -0
- package/dist/archive/limits.js.map +1 -0
- package/dist/archive/open.d.ts +24 -0
- package/dist/archive/open.d.ts.map +1 -0
- package/dist/archive/open.js +93 -0
- package/dist/archive/open.js.map +1 -0
- package/dist/{domain/skill/storage → archive}/prefilter.d.ts +5 -0
- package/dist/archive/prefilter.d.ts.map +1 -0
- package/dist/archive/prefilter.js.map +1 -0
- package/dist/archive/write.d.ts +8 -0
- package/dist/archive/write.d.ts.map +1 -0
- package/dist/archive/write.js +44 -0
- package/dist/archive/write.js.map +1 -0
- package/dist/authorization/authorizer.d.ts +98 -0
- package/dist/authorization/authorizer.d.ts.map +1 -0
- package/dist/authorization/authorizer.js +156 -0
- package/dist/authorization/authorizer.js.map +1 -0
- package/dist/authorization/derived-tuples.d.ts +42 -0
- package/dist/authorization/derived-tuples.d.ts.map +1 -0
- package/dist/authorization/derived-tuples.js +240 -0
- package/dist/authorization/derived-tuples.js.map +1 -0
- package/dist/authorization/evaluator.d.ts +66 -0
- package/dist/authorization/evaluator.d.ts.map +1 -0
- package/dist/authorization/evaluator.js +153 -0
- package/dist/authorization/evaluator.js.map +1 -0
- package/dist/authorization/facts.d.ts +29 -0
- package/dist/authorization/facts.d.ts.map +1 -0
- package/dist/authorization/facts.js +17 -0
- package/dist/authorization/facts.js.map +1 -0
- package/dist/authorization/list-read-scope.d.ts +18 -0
- package/dist/authorization/list-read-scope.d.ts.map +1 -0
- package/dist/authorization/list-read-scope.js +155 -0
- package/dist/authorization/list-read-scope.js.map +1 -0
- package/dist/authorization/model/agent.d.ts +2 -0
- package/dist/authorization/model/agent.d.ts.map +1 -0
- package/dist/authorization/model/agent.js +42 -0
- package/dist/authorization/model/agent.js.map +1 -0
- package/dist/authorization/model/agent_channel.d.ts +2 -0
- package/dist/authorization/model/agent_channel.d.ts.map +1 -0
- package/dist/authorization/model/agent_channel.js +38 -0
- package/dist/authorization/model/agent_channel.js.map +1 -0
- package/dist/authorization/model/agent_execution.d.ts +2 -0
- package/dist/authorization/model/agent_execution.d.ts.map +1 -0
- package/dist/authorization/model/agent_execution.js +25 -0
- package/dist/authorization/model/agent_execution.js.map +1 -0
- package/dist/authorization/model/agent_instance.d.ts +2 -0
- package/dist/authorization/model/agent_instance.d.ts.map +1 -0
- package/dist/authorization/model/agent_instance.js +47 -0
- package/dist/authorization/model/agent_instance.js.map +1 -0
- package/dist/authorization/model/agent_share.d.ts +2 -0
- package/dist/authorization/model/agent_share.d.ts.map +1 -0
- package/dist/authorization/model/agent_share.js +29 -0
- package/dist/authorization/model/agent_share.js.map +1 -0
- package/dist/authorization/model/api_key.d.ts +2 -0
- package/dist/authorization/model/api_key.d.ts.map +1 -0
- package/dist/authorization/model/api_key.js +27 -0
- package/dist/authorization/model/api_key.js.map +1 -0
- package/dist/authorization/model/artifact.d.ts +2 -0
- package/dist/authorization/model/artifact.d.ts.map +1 -0
- package/dist/authorization/model/artifact.js +27 -0
- package/dist/authorization/model/artifact.js.map +1 -0
- package/dist/authorization/model/channel_app.d.ts +2 -0
- package/dist/authorization/model/channel_app.d.ts.map +1 -0
- package/dist/authorization/model/channel_app.js +28 -0
- package/dist/authorization/model/channel_app.js.map +1 -0
- package/dist/authorization/model/default-of.d.ts +38 -0
- package/dist/authorization/model/default-of.d.ts.map +1 -0
- package/dist/authorization/model/default-of.js +39 -0
- package/dist/authorization/model/default-of.js.map +1 -0
- package/dist/authorization/model/environment.d.ts +2 -0
- package/dist/authorization/model/environment.d.ts.map +1 -0
- package/dist/authorization/model/environment.js +33 -0
- package/dist/authorization/model/environment.js.map +1 -0
- package/dist/authorization/model/execution_context.d.ts +2 -0
- package/dist/authorization/model/execution_context.d.ts.map +1 -0
- package/dist/authorization/model/execution_context.js +19 -0
- package/dist/authorization/model/execution_context.js.map +1 -0
- package/dist/authorization/model/iam_policy.d.ts +2 -0
- package/dist/authorization/model/iam_policy.d.ts.map +1 -0
- package/dist/authorization/model/iam_policy.js +31 -0
- package/dist/authorization/model/iam_policy.js.map +1 -0
- package/dist/authorization/model/identity_account.d.ts +2 -0
- package/dist/authorization/model/identity_account.d.ts.map +1 -0
- package/dist/authorization/model/identity_account.js +25 -0
- package/dist/authorization/model/identity_account.js.map +1 -0
- package/dist/authorization/model/index.d.ts +36 -0
- package/dist/authorization/model/index.d.ts.map +1 -0
- package/dist/authorization/model/index.js +72 -0
- package/dist/authorization/model/index.js.map +1 -0
- package/dist/authorization/model/mcp_server.d.ts +2 -0
- package/dist/authorization/model/mcp_server.d.ts.map +1 -0
- package/dist/authorization/model/mcp_server.js +37 -0
- package/dist/authorization/model/mcp_server.js.map +1 -0
- package/dist/authorization/model/memory.d.ts +2 -0
- package/dist/authorization/model/memory.d.ts.map +1 -0
- package/dist/authorization/model/memory.js +26 -0
- package/dist/authorization/model/memory.js.map +1 -0
- package/dist/authorization/model/oauth_app.d.ts +2 -0
- package/dist/authorization/model/oauth_app.d.ts.map +1 -0
- package/dist/authorization/model/oauth_app.js +30 -0
- package/dist/authorization/model/oauth_app.js.map +1 -0
- package/dist/authorization/model/organization.d.ts +2 -0
- package/dist/authorization/model/organization.d.ts.map +1 -0
- package/dist/authorization/model/organization.js +54 -0
- package/dist/authorization/model/organization.js.map +1 -0
- package/dist/authorization/model/plugin.d.ts +2 -0
- package/dist/authorization/model/plugin.d.ts.map +1 -0
- package/dist/authorization/model/plugin.js +44 -0
- package/dist/authorization/model/plugin.js.map +1 -0
- package/dist/authorization/model/project.d.ts +2 -0
- package/dist/authorization/model/project.d.ts.map +1 -0
- package/dist/authorization/model/project.js +32 -0
- package/dist/authorization/model/project.js.map +1 -0
- package/dist/authorization/model/rewrite.d.ts +127 -0
- package/dist/authorization/model/rewrite.d.ts.map +1 -0
- package/dist/authorization/model/rewrite.js +82 -0
- package/dist/authorization/model/rewrite.js.map +1 -0
- package/dist/authorization/model/schedule.d.ts +2 -0
- package/dist/authorization/model/schedule.d.ts.map +1 -0
- package/dist/authorization/model/schedule.js +29 -0
- package/dist/authorization/model/schedule.js.map +1 -0
- package/dist/authorization/model/session.d.ts +2 -0
- package/dist/authorization/model/session.d.ts.map +1 -0
- package/dist/authorization/model/session.js +38 -0
- package/dist/authorization/model/session.js.map +1 -0
- package/dist/authorization/model/skill.d.ts +2 -0
- package/dist/authorization/model/skill.d.ts.map +1 -0
- package/dist/authorization/model/skill.js +38 -0
- package/dist/authorization/model/skill.js.map +1 -0
- package/dist/authorization/model/workflow.d.ts +2 -0
- package/dist/authorization/model/workflow.d.ts.map +1 -0
- package/dist/authorization/model/workflow.js +38 -0
- package/dist/authorization/model/workflow.js.map +1 -0
- package/dist/authorization/model/workflow_execution.d.ts +2 -0
- package/dist/authorization/model/workflow_execution.d.ts.map +1 -0
- package/dist/authorization/model/workflow_execution.js +32 -0
- package/dist/authorization/model/workflow_execution.js.map +1 -0
- package/dist/authorization/model/workflow_instance.d.ts +2 -0
- package/dist/authorization/model/workflow_instance.d.ts.map +1 -0
- package/dist/authorization/model/workflow_instance.js +92 -0
- package/dist/authorization/model/workflow_instance.js.map +1 -0
- package/dist/authorization/organization-directory.d.ts +13 -0
- package/dist/authorization/organization-directory.d.ts.map +1 -0
- package/dist/authorization/organization-directory.js +83 -0
- package/dist/authorization/organization-directory.js.map +1 -0
- package/dist/authorization/person.d.ts +42 -0
- package/dist/authorization/person.d.ts.map +1 -0
- package/dist/authorization/person.js +19 -0
- package/dist/authorization/person.js.map +1 -0
- package/dist/authorization/posture.d.ts +38 -0
- package/dist/authorization/posture.d.ts.map +1 -0
- package/dist/authorization/posture.js +7 -0
- package/dist/authorization/posture.js.map +1 -0
- package/dist/authorization/schedule-fire-caller.d.ts +12 -0
- package/dist/authorization/schedule-fire-caller.d.ts.map +1 -0
- package/dist/authorization/schedule-fire-caller.js +67 -0
- package/dist/authorization/schedule-fire-caller.js.map +1 -0
- package/dist/authorization/store-test-kit.d.ts +68 -0
- package/dist/authorization/store-test-kit.d.ts.map +1 -0
- package/dist/authorization/store-test-kit.js +311 -0
- package/dist/authorization/store-test-kit.js.map +1 -0
- package/dist/authorization/tuples.d.ts +115 -0
- package/dist/authorization/tuples.d.ts.map +1 -0
- package/dist/authorization/tuples.js +83 -0
- package/dist/authorization/tuples.js.map +1 -0
- package/dist/boot/compose.d.ts.map +1 -1
- package/dist/boot/compose.js +157 -32
- package/dist/boot/compose.js.map +1 -1
- package/dist/boot/inprocess.d.ts +12 -0
- package/dist/boot/inprocess.d.ts.map +1 -1
- package/dist/boot/inprocess.js +62 -20
- package/dist/boot/inprocess.js.map +1 -1
- package/dist/domain/agent/controller.d.ts.map +1 -1
- package/dist/domain/agent/controller.js +9 -0
- package/dist/domain/agent/controller.js.map +1 -1
- package/dist/domain/iampolicy/constants.d.ts +11 -0
- package/dist/domain/iampolicy/constants.d.ts.map +1 -1
- package/dist/domain/iampolicy/constants.js +11 -0
- package/dist/domain/iampolicy/constants.js.map +1 -1
- package/dist/domain/iampolicy/membership.d.ts +72 -1
- package/dist/domain/iampolicy/membership.d.ts.map +1 -1
- package/dist/domain/iampolicy/membership.js +141 -56
- package/dist/domain/iampolicy/membership.js.map +1 -1
- package/dist/domain/identityaccount/actor.d.ts +26 -0
- package/dist/domain/identityaccount/actor.d.ts.map +1 -0
- package/dist/domain/identityaccount/actor.js +17 -0
- package/dist/domain/identityaccount/actor.js.map +1 -0
- package/dist/domain/mcpserver/controller.d.ts.map +1 -1
- package/dist/domain/mcpserver/controller.js +9 -0
- package/dist/domain/mcpserver/controller.js.map +1 -1
- package/dist/domain/plugin/archive.d.ts +37 -0
- package/dist/domain/plugin/archive.d.ts.map +1 -0
- package/dist/domain/plugin/archive.js +50 -0
- package/dist/domain/plugin/archive.js.map +1 -0
- package/dist/domain/plugin/constants.d.ts +38 -0
- package/dist/domain/plugin/constants.d.ts.map +1 -0
- package/dist/domain/plugin/constants.js +46 -0
- package/dist/domain/plugin/constants.js.map +1 -0
- package/dist/domain/plugin/controller.d.ts +25 -0
- package/dist/domain/plugin/controller.d.ts.map +1 -0
- package/dist/domain/plugin/controller.js +493 -0
- package/dist/domain/plugin/controller.js.map +1 -0
- package/dist/domain/plugin/materialize/agent.d.ts +13 -0
- package/dist/domain/plugin/materialize/agent.d.ts.map +1 -0
- package/dist/domain/plugin/materialize/agent.js +128 -0
- package/dist/domain/plugin/materialize/agent.js.map +1 -0
- package/dist/domain/plugin/materialize/default-agent-instructions.d.ts +22 -0
- package/dist/domain/plugin/materialize/default-agent-instructions.d.ts.map +1 -0
- package/dist/domain/plugin/materialize/default-agent-instructions.js +31 -0
- package/dist/domain/plugin/materialize/default-agent-instructions.js.map +1 -0
- package/dist/domain/plugin/materialize/identity.d.ts +28 -0
- package/dist/domain/plugin/materialize/identity.d.ts.map +1 -0
- package/dist/domain/plugin/materialize/identity.js +40 -0
- package/dist/domain/plugin/materialize/identity.js.map +1 -0
- package/dist/domain/plugin/materialize/mcp-servers.d.ts +15 -0
- package/dist/domain/plugin/materialize/mcp-servers.d.ts.map +1 -0
- package/dist/domain/plugin/materialize/mcp-servers.js +131 -0
- package/dist/domain/plugin/materialize/mcp-servers.js.map +1 -0
- package/dist/domain/plugin/materialize/plan.d.ts +24 -0
- package/dist/domain/plugin/materialize/plan.d.ts.map +1 -0
- package/dist/domain/plugin/materialize/plan.js +77 -0
- package/dist/domain/plugin/materialize/plan.js.map +1 -0
- package/dist/domain/plugin/materialize/ports.d.ts +42 -0
- package/dist/domain/plugin/materialize/ports.d.ts.map +1 -0
- package/dist/domain/plugin/materialize/ports.js +2 -0
- package/dist/domain/plugin/materialize/ports.js.map +1 -0
- package/dist/domain/plugin/materialize/skills.d.ts +12 -0
- package/dist/domain/plugin/materialize/skills.d.ts.map +1 -0
- package/dist/domain/plugin/materialize/skills.js +44 -0
- package/dist/domain/plugin/materialize/skills.js.map +1 -0
- package/dist/domain/plugin/materialize/workflows.d.ts +15 -0
- package/dist/domain/plugin/materialize/workflows.d.ts.map +1 -0
- package/dist/domain/plugin/materialize/workflows.js +31 -0
- package/dist/domain/plugin/materialize/workflows.js.map +1 -0
- package/dist/domain/plugin/members.d.ts +42 -0
- package/dist/domain/plugin/members.d.ts.map +1 -0
- package/dist/domain/plugin/members.js +97 -0
- package/dist/domain/plugin/members.js.map +1 -0
- package/dist/domain/plugin/overlay/documents.d.ts +31 -0
- package/dist/domain/plugin/overlay/documents.d.ts.map +1 -0
- package/dist/domain/plugin/overlay/documents.js +38 -0
- package/dist/domain/plugin/overlay/documents.js.map +1 -0
- package/dist/domain/plugin/overlay/parse.d.ts +16 -0
- package/dist/domain/plugin/overlay/parse.d.ts.map +1 -0
- package/dist/domain/plugin/overlay/parse.js +79 -0
- package/dist/domain/plugin/overlay/parse.js.map +1 -0
- package/dist/domain/plugin/overlay/sanitize.d.ts +10 -0
- package/dist/domain/plugin/overlay/sanitize.d.ts.map +1 -0
- package/dist/domain/plugin/overlay/sanitize.js +101 -0
- package/dist/domain/plugin/overlay/sanitize.js.map +1 -0
- package/dist/domain/plugin/push.d.ts +133 -0
- package/dist/domain/plugin/push.d.ts.map +1 -0
- package/dist/domain/plugin/push.js +800 -0
- package/dist/domain/plugin/push.js.map +1 -0
- package/dist/domain/plugin/search-extractor.d.ts +3 -0
- package/dist/domain/plugin/search-extractor.d.ts.map +1 -0
- package/dist/domain/plugin/search-extractor.js +41 -0
- package/dist/domain/plugin/search-extractor.js.map +1 -0
- package/dist/domain/skill/constants.d.ts +6 -11
- package/dist/domain/skill/constants.d.ts.map +1 -1
- package/dist/domain/skill/constants.js +6 -11
- package/dist/domain/skill/constants.js.map +1 -1
- package/dist/domain/skill/controller.d.ts.map +1 -1
- package/dist/domain/skill/controller.js +33 -30
- package/dist/domain/skill/controller.js.map +1 -1
- package/dist/domain/skill/push.d.ts +9 -10
- package/dist/domain/skill/push.d.ts.map +1 -1
- package/dist/domain/skill/push.js +53 -122
- package/dist/domain/skill/push.js.map +1 -1
- package/dist/domain/skill/search-extractor.d.ts.map +1 -1
- package/dist/domain/skill/search-extractor.js.map +1 -1
- package/dist/domain/skill/storage/artifact-storage.d.ts +26 -29
- package/dist/domain/skill/storage/artifact-storage.d.ts.map +1 -1
- package/dist/domain/skill/storage/artifact-storage.js +6 -103
- package/dist/domain/skill/storage/artifact-storage.js.map +1 -1
- package/dist/domain/skill/storage/zip-gate.d.ts +1 -2
- package/dist/domain/skill/storage/zip-gate.d.ts.map +1 -1
- package/dist/domain/skill/storage/zip-gate.js +56 -126
- package/dist/domain/skill/storage/zip-gate.js.map +1 -1
- package/dist/domain/skill/version-resolution.d.ts +5 -5
- package/dist/domain/skill/version-resolution.d.ts.map +1 -1
- package/dist/domain/skill/version-resolution.js +34 -216
- package/dist/domain/skill/version-resolution.js.map +1 -1
- package/dist/domain/workflow/controller.d.ts.map +1 -1
- package/dist/domain/workflow/controller.js +30 -3
- package/dist/domain/workflow/controller.js.map +1 -1
- package/dist/domain/workflow/registry/data/task-kind-registry.json +1 -0
- package/dist/extensions/authorizer.d.ts +10 -5
- package/dist/extensions/authorizer.d.ts.map +1 -1
- package/dist/extensions/drivers.d.ts +4 -1
- package/dist/extensions/drivers.d.ts.map +1 -1
- package/dist/extensions/list-read-scope.d.ts +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/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/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-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/temporal/schedule/run-starter.d.ts +1 -1
- package/dist/temporal/schedule/run-starter.d.ts.map +1 -1
- package/dist/temporal/schedule/run-starter.js +14 -1
- package/dist/temporal/schedule/run-starter.js.map +1 -1
- package/package.json +5 -4
- package/src/archive/__tests__/archive.test.ts +233 -0
- package/src/{domain/skill → archive}/__tests__/prefilter.test.ts +1 -1
- package/src/archive/content-store.ts +132 -0
- package/src/archive/inflate.ts +107 -0
- package/src/archive/limits.ts +42 -0
- package/src/archive/open.ts +131 -0
- package/src/{domain/skill/storage → archive}/prefilter.ts +5 -0
- package/src/archive/write.ts +54 -0
- package/src/authorization/README.md +124 -0
- package/src/authorization/__tests__/authorizer.test.ts +719 -0
- package/src/authorization/__tests__/derived-tuples.test.ts +802 -0
- package/src/authorization/__tests__/drivers.ts +70 -0
- package/src/authorization/__tests__/evaluator.test.ts +359 -0
- package/src/authorization/__tests__/facts.test.ts +155 -0
- package/src/authorization/__tests__/fixtures/fga/agent-channel-owner.fga.yaml +112 -0
- package/src/authorization/__tests__/fixtures/fga/agent-share-owner.fga.yaml +109 -0
- package/src/authorization/__tests__/fixtures/fga/artifact-org-and-owner.fga.yaml +128 -0
- package/src/authorization/__tests__/fixtures/fga/blueprint-private-visibility.fga.yaml +410 -0
- package/src/authorization/__tests__/fixtures/fga/channel-app-owner.fga.yaml +125 -0
- package/src/authorization/__tests__/fixtures/fga/channel-participation.fga.yaml +201 -0
- package/src/authorization/__tests__/fixtures/fga/channel-session-visibility.fga.yaml +187 -0
- package/src/authorization/__tests__/fixtures/fga/cross-org-share-creation.fga.yaml +98 -0
- package/src/authorization/__tests__/fixtures/fga/default-instance-inheritance.fga.yaml +271 -0
- package/src/authorization/__tests__/fixtures/fga/memory-subject-only.fga.yaml +72 -0
- package/src/authorization/__tests__/fixtures/fga/org-admin-owner-inheritance.fga.yaml +328 -0
- package/src/authorization/__tests__/fixtures/fga/org-shared-environment.fga.yaml +144 -0
- package/src/authorization/__tests__/fixtures/fga/platform-visibility.fga.yaml +223 -0
- package/src/authorization/__tests__/fixtures/fga/provider-standing-viewer.fga.yaml +40 -0
- package/src/authorization/__tests__/fixtures/fga/public-visibility-setter.fga.yaml +52 -0
- package/src/authorization/__tests__/fixtures/fga/reserved-label-writer.fga.yaml +41 -0
- package/src/authorization/__tests__/fixtures/fga/schedule-owner.fga.yaml +113 -0
- package/src/authorization/__tests__/fixtures/fga/schedule-session-visibility.fga.yaml +214 -0
- package/src/authorization/__tests__/fixtures/fga/session-personal-resource.fga.yaml +117 -0
- package/src/authorization/__tests__/fixtures/fga/workflow-execution-sharing.fga.yaml +192 -0
- package/src/authorization/__tests__/list-read-scope.measure.test.ts +317 -0
- package/src/authorization/__tests__/list-read-scope.test.ts +796 -0
- package/src/authorization/__tests__/organization-directory.test.ts +236 -0
- package/src/authorization/__tests__/person.test.ts +114 -0
- package/src/authorization/__tests__/posture.test.ts +25 -0
- package/src/authorization/__tests__/schedule-fire-caller.test.ts +134 -0
- package/src/authorization/__tests__/store-tests.test.ts +306 -0
- package/src/authorization/__tests__/support.ts +101 -0
- package/src/authorization/__tests__/tuples.test.ts +62 -0
- package/src/authorization/__tests__/wire-permissions.test.ts +154 -0
- package/src/authorization/authorizer.ts +208 -0
- package/src/authorization/derived-tuples.ts +384 -0
- package/src/authorization/evaluator.ts +283 -0
- package/src/authorization/facts.ts +47 -0
- package/src/authorization/list-read-scope.ts +216 -0
- package/src/authorization/model/__tests__/registry.test.ts +317 -0
- package/src/authorization/model/agent.ts +64 -0
- package/src/authorization/model/agent_channel.ts +49 -0
- package/src/authorization/model/agent_execution.ts +33 -0
- package/src/authorization/model/agent_instance.ts +66 -0
- package/src/authorization/model/agent_share.ts +40 -0
- package/src/authorization/model/api_key.ts +28 -0
- package/src/authorization/model/artifact.ts +38 -0
- package/src/authorization/model/channel_app.ts +39 -0
- package/src/authorization/model/default-of.ts +99 -0
- package/src/authorization/model/environment.ts +48 -0
- package/src/authorization/model/execution_context.ts +20 -0
- package/src/authorization/model/iam_policy.ts +42 -0
- package/src/authorization/model/identity_account.ts +26 -0
- package/src/authorization/model/index.ts +108 -0
- package/src/authorization/model/mcp_server.ts +59 -0
- package/src/authorization/model/memory.ts +27 -0
- package/src/authorization/model/oauth_app.ts +42 -0
- package/src/authorization/model/organization.ts +55 -0
- package/src/authorization/model/plugin.ts +66 -0
- package/src/authorization/model/project.ts +47 -0
- package/src/authorization/model/rewrite.ts +213 -0
- package/src/authorization/model/schedule.ts +40 -0
- package/src/authorization/model/session.ts +50 -0
- package/src/authorization/model/skill.ts +60 -0
- package/src/authorization/model/workflow.ts +60 -0
- package/src/authorization/model/workflow_execution.ts +44 -0
- package/src/authorization/model/workflow_instance.ts +122 -0
- package/src/authorization/organization-directory.ts +114 -0
- package/src/authorization/person.ts +68 -0
- package/src/authorization/posture.ts +49 -0
- package/src/authorization/schedule-fire-caller.ts +91 -0
- package/src/authorization/store-test-kit.ts +454 -0
- package/src/authorization/tuples.ts +190 -0
- package/src/boot/compose.ts +175 -38
- package/src/boot/inprocess.ts +108 -30
- package/src/domain/agent/controller.ts +11 -0
- package/src/domain/iampolicy/__tests__/membership.test.ts +357 -3
- package/src/domain/iampolicy/constants.ts +12 -0
- package/src/domain/iampolicy/membership.ts +221 -66
- package/src/domain/identityaccount/actor.ts +44 -0
- package/src/domain/mcpserver/controller.ts +11 -0
- package/src/domain/plugin/__tests__/materialize.test.ts +303 -0
- package/src/domain/plugin/__tests__/overlay-parse.test.ts +85 -0
- package/src/domain/plugin/__tests__/plugin.test.ts +681 -0
- package/src/domain/plugin/__tests__/sanitize.test.ts +174 -0
- package/src/domain/plugin/archive.ts +89 -0
- package/src/domain/plugin/constants.ts +53 -0
- package/src/domain/plugin/controller.ts +913 -0
- package/src/domain/plugin/materialize/agent.ts +186 -0
- package/src/domain/plugin/materialize/default-agent-instructions.ts +59 -0
- package/src/domain/plugin/materialize/identity.ts +67 -0
- package/src/domain/plugin/materialize/mcp-servers.ts +175 -0
- package/src/domain/plugin/materialize/plan.ts +124 -0
- package/src/domain/plugin/materialize/ports.ts +53 -0
- package/src/domain/plugin/materialize/skills.ts +68 -0
- package/src/domain/plugin/materialize/workflows.ts +51 -0
- package/src/domain/plugin/members.ts +180 -0
- package/src/domain/plugin/overlay/documents.ts +78 -0
- package/src/domain/plugin/overlay/parse.ts +115 -0
- package/src/domain/plugin/overlay/sanitize.ts +149 -0
- package/src/domain/plugin/push.ts +1062 -0
- package/src/domain/plugin/search-extractor.ts +60 -0
- package/src/domain/skill/constants.ts +11 -14
- package/src/domain/skill/controller.ts +44 -36
- package/src/domain/skill/push.ts +61 -156
- package/src/domain/skill/search-extractor.ts +3 -1
- package/src/domain/skill/storage/artifact-storage.ts +23 -124
- package/src/domain/skill/storage/zip-gate.ts +58 -154
- package/src/domain/skill/version-resolution.ts +67 -269
- package/src/domain/workflow/controller.ts +38 -4
- package/src/domain/workflow/registry/data/task-kind-registry.json +1 -0
- package/src/extensions/__tests__/built-in-authorization-composed.test.ts +835 -0
- package/src/extensions/__tests__/composed-support.ts +32 -1
- package/src/extensions/__tests__/extension-composition.test.ts +35 -0
- package/src/extensions/__tests__/list-read-scope.test.ts +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/index.ts +51 -1
- package/src/pipeline/__tests__/router-transport.test.ts +1 -3
- package/src/pipeline/apiresource-labels.ts +31 -3
- package/src/pipeline/errors.ts +5 -5
- package/src/pipeline/steps/__tests__/authorize-annotation-completeness.test.ts +1 -20
- package/src/pipeline/steps/__tests__/guard-memory-capture.test.ts +3 -9
- package/src/pipeline/steps/__tests__/guard-plugin-managed.test.ts +151 -0
- package/src/pipeline/steps/__tests__/guard-reserved-labels.test.ts +83 -8
- package/src/pipeline/steps/authorization-facts.ts +131 -0
- package/src/pipeline/steps/delete.ts +11 -3
- package/src/pipeline/steps/duplicate.ts +8 -2
- package/src/pipeline/steps/guard-plugin-managed.ts +133 -0
- package/src/pipeline/steps/guard-reserved-labels.ts +29 -8
- package/src/pipeline/steps/helpers.ts +4 -1
- package/src/pipeline/steps/index-search.ts +28 -15
- package/src/pipeline/steps/load-existing.ts +12 -3
- package/src/pipeline/steps/references.ts +36 -2
- package/src/pipeline/steps/resolve-artifact-source.ts +66 -0
- package/src/pipeline/steps/server-stamped-reserved-labels.ts +2 -1
- package/src/pipeline/steps/slug.ts +7 -2
- package/src/pipeline/steps/validate-visibility.ts +9 -2
- package/src/pipeline/steps/validation.ts +3 -1
- package/src/pipeline/steps/version-archive.ts +225 -0
- package/src/pipeline/steps/version-history.ts +362 -0
- package/src/pipeline/steps/visibility-gates.ts +12 -9
- package/src/query/README.md +1 -1
- package/src/query/search/__tests__/criteria.test.ts +6 -7
- package/src/query/search/__tests__/query-store.test.ts +9 -2
- package/src/query/search/__tests__/registry.test.ts +6 -4
- package/src/query/search/registry.ts +6 -1
- package/src/temporal/schedule/__tests__/run-starter.test.ts +86 -24
- package/src/temporal/schedule/run-starter.ts +31 -8
- package/dist/domain/skill/storage/prefilter.d.ts.map +0 -1
- package/dist/domain/skill/storage/prefilter.js.map +0 -1
- /package/dist/{domain/skill/storage → archive}/prefilter.js +0 -0
|
@@ -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 {
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The write side of content-addressed versioning, shared by every kind
|
|
3
|
+
* whose version is the SHA-256 of a pushed archive (skills, plugins): the
|
|
4
|
+
* "archive the head" step a push runs after the head is fully populated,
|
|
5
|
+
* and the best-effort archive cleanup a delete runs before the row. Skills
|
|
6
|
+
* carried both alone (#341, adopted for skills in #475; the Go
|
|
7
|
+
* ArchiveCurrentSkillStep / DeleteSkillArchivesStep port); plugins need the
|
|
8
|
+
* identical semantics over another schema, so the steps live here and each
|
|
9
|
+
* kind names its step (`ArchiveCurrentSkill`, `ArchiveCurrentPlugin`), its
|
|
10
|
+
* context key and where its hash and tag live.
|
|
11
|
+
*
|
|
12
|
+
* The load-bearing semantics, all preserved from the skill port:
|
|
13
|
+
* - repoint-never-duplicate: re-pushing EVER-archived content repoints the
|
|
14
|
+
* head to the existing audit row (an A→B→A re-push must not duplicate
|
|
15
|
+
* A's row);
|
|
16
|
+
* - snapshots archive TAGLESS; the audit tag COLUMN is the tag's only
|
|
17
|
+
* home, assigned through the single-holder setAuditTag primitive —
|
|
18
|
+
* assigned even when the content was already archived, because
|
|
19
|
+
* re-pushing under a new tag is the only retag path;
|
|
20
|
+
* - safe degradation: archive failure clears the version hash from the
|
|
21
|
+
* head (the persisted head never references an unresolvable audit
|
|
22
|
+
* entry); tag-assignment failure clears the live tag.
|
|
23
|
+
*
|
|
24
|
+
* Proven by the skill domain's __tests__/push-degradation.test.ts (the
|
|
25
|
+
* failing-store arms) and both kinds' conformance suites (the
|
|
26
|
+
* content-addressed versioning blocks).
|
|
27
|
+
*/
|
|
28
|
+
import type { DescMessage, MessageShape } from "@bufbuild/protobuf";
|
|
29
|
+
|
|
30
|
+
import type { Logger } from "../../boot/logger.js";
|
|
31
|
+
import type { PipelineStep } from "../pipeline.js";
|
|
32
|
+
import type { RequestContext } from "../request-context.js";
|
|
33
|
+
import { AuditNotFoundError } from "../../store/interface.js";
|
|
34
|
+
import type { Store } from "../../store/interface.js";
|
|
35
|
+
import { RESOURCE_ID_KEY } from "./delete.js";
|
|
36
|
+
import { metadataOf } from "./shapes.js";
|
|
37
|
+
|
|
38
|
+
/** What a content-versioned kind must expose for its head to be archived. */
|
|
39
|
+
export interface ArchiveCurrentVersionBinding<Desc extends DescMessage> {
|
|
40
|
+
/** The step's name in the chain; shared vocabulary, never renamed. */
|
|
41
|
+
readonly stepName: string;
|
|
42
|
+
/** The context key the fully populated head rides. */
|
|
43
|
+
readonly resourceKey: string;
|
|
44
|
+
readonly schema: Desc;
|
|
45
|
+
/** The noun in log lines: "skill", "plugin". */
|
|
46
|
+
readonly noun: string;
|
|
47
|
+
headHashOf(resource: MessageShape<Desc>): string;
|
|
48
|
+
/** Degradation arm: the head must never reference an unresolvable audit row. */
|
|
49
|
+
clearHeadHash(resource: MessageShape<Desc>): void;
|
|
50
|
+
liveTagOf(resource: MessageShape<Desc>): string;
|
|
51
|
+
/** Degradation arm: the live tag must agree with the audit column. */
|
|
52
|
+
clearLiveTag(resource: MessageShape<Desc>): void;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Repoint or archive, then the single-holder tag assignment, each with its
|
|
57
|
+
* safe degradation. Runs AFTER the populate step so the archived snapshot
|
|
58
|
+
* is the fully populated head.
|
|
59
|
+
*/
|
|
60
|
+
export function newArchiveCurrentVersionStep<
|
|
61
|
+
Desc extends DescMessage,
|
|
62
|
+
RequestDesc extends DescMessage,
|
|
63
|
+
>(
|
|
64
|
+
store: Store,
|
|
65
|
+
logger: Logger,
|
|
66
|
+
binding: ArchiveCurrentVersionBinding<Desc>,
|
|
67
|
+
): PipelineStep<RequestDesc> {
|
|
68
|
+
return {
|
|
69
|
+
name: binding.stepName,
|
|
70
|
+
async execute(ctx: RequestContext<RequestDesc>): Promise<void> {
|
|
71
|
+
const resource = ctx.get(binding.resourceKey) as MessageShape<Desc>;
|
|
72
|
+
const versionHash = binding.headHashOf(resource);
|
|
73
|
+
if (versionHash === "") {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
const tag = binding.liveTagOf(resource);
|
|
77
|
+
const resourceId = metadataOf(resource)?.id ?? "";
|
|
78
|
+
const idField = `${binding.noun}Id`;
|
|
79
|
+
|
|
80
|
+
// Repoint, never duplicate: if this content was ever archived, the
|
|
81
|
+
// head simply repoints to the existing row and only the tag
|
|
82
|
+
// assignment below still runs. An unexpected lookup failure degrades
|
|
83
|
+
// to archiving anyway — a possible duplicate row beats a failed push
|
|
84
|
+
// (readers resolve duplicates newest-wins).
|
|
85
|
+
let alreadyArchived = false;
|
|
86
|
+
try {
|
|
87
|
+
await store.getAuditByHash(
|
|
88
|
+
ctx.apiResourceKind,
|
|
89
|
+
resourceId,
|
|
90
|
+
versionHash,
|
|
91
|
+
binding.schema,
|
|
92
|
+
);
|
|
93
|
+
alreadyArchived = true;
|
|
94
|
+
} catch (error) {
|
|
95
|
+
if (!(error instanceof AuditNotFoundError)) {
|
|
96
|
+
logger.warn(
|
|
97
|
+
`Could not check for an existing archived ${binding.noun} version — archiving anyway`,
|
|
98
|
+
{
|
|
99
|
+
[idField]: resourceId,
|
|
100
|
+
versionHash,
|
|
101
|
+
error: error instanceof Error ? error.message : String(error),
|
|
102
|
+
},
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if (!alreadyArchived) {
|
|
108
|
+
// Archive the snapshot tagless: the tag lives only in the audit tag
|
|
109
|
+
// column (the source of truth), assigned below through the
|
|
110
|
+
// single-holder primitive — a later tag move never rewrites this
|
|
111
|
+
// immutable content.
|
|
112
|
+
try {
|
|
113
|
+
await store.saveAudit(
|
|
114
|
+
ctx.apiResourceKind,
|
|
115
|
+
resourceId,
|
|
116
|
+
binding.schema,
|
|
117
|
+
resource,
|
|
118
|
+
versionHash,
|
|
119
|
+
"",
|
|
120
|
+
);
|
|
121
|
+
} catch (error) {
|
|
122
|
+
logger.error(
|
|
123
|
+
`Failed to archive ${binding.noun} version — reverting the version hash to maintain the audit-resolvability invariant`,
|
|
124
|
+
{
|
|
125
|
+
[idField]: resourceId,
|
|
126
|
+
versionHash,
|
|
127
|
+
error: error instanceof Error ? error.message : String(error),
|
|
128
|
+
},
|
|
129
|
+
);
|
|
130
|
+
// Revert: the persisted head must never reference an audit entry
|
|
131
|
+
// that does not exist. The push still succeeds, but without
|
|
132
|
+
// version tracking for this apply.
|
|
133
|
+
binding.clearHeadHash(resource);
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// Assign the requested tag through setAuditTag — the single-holder
|
|
139
|
+
// primitive — so the head version (freshly archived or repointed-to)
|
|
140
|
+
// becomes the tag's sole holder; any prior holder is cleared.
|
|
141
|
+
if (tag !== "") {
|
|
142
|
+
try {
|
|
143
|
+
await store.setAuditTag(
|
|
144
|
+
ctx.apiResourceKind,
|
|
145
|
+
resourceId,
|
|
146
|
+
versionHash,
|
|
147
|
+
tag,
|
|
148
|
+
);
|
|
149
|
+
} catch (error) {
|
|
150
|
+
logger.error(
|
|
151
|
+
`Archived ${binding.noun} version but failed to assign its tag — clearing the live tag to stay consistent with the audit column`,
|
|
152
|
+
{
|
|
153
|
+
[idField]: resourceId,
|
|
154
|
+
versionHash,
|
|
155
|
+
tag,
|
|
156
|
+
error: error instanceof Error ? error.message : String(error),
|
|
157
|
+
},
|
|
158
|
+
);
|
|
159
|
+
// The audit head is now untagged; keep the live head consistent
|
|
160
|
+
// so get / getByReference never advertise a tag the store cannot
|
|
161
|
+
// resolve.
|
|
162
|
+
binding.clearLiveTag(resource);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
if (alreadyArchived) {
|
|
167
|
+
logger.info(
|
|
168
|
+
`${capitalize(binding.noun)} version content already archived — repointed head without a new history row`,
|
|
169
|
+
{ [idField]: resourceId, versionHash, tag },
|
|
170
|
+
);
|
|
171
|
+
} else {
|
|
172
|
+
logger.info(`Archived ${binding.noun} version to audit history`, {
|
|
173
|
+
[idField]: resourceId,
|
|
174
|
+
versionHash,
|
|
175
|
+
tag,
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Best-effort audit cleanup BEFORE the resource row (no FK cascade in the
|
|
184
|
+
* schema, by design): failures log and never block the delete. Reads the
|
|
185
|
+
* id ExtractResourceId set.
|
|
186
|
+
*/
|
|
187
|
+
export function newDeleteVersionArchivesStep<RequestDesc extends DescMessage>(
|
|
188
|
+
store: Store,
|
|
189
|
+
logger: Logger,
|
|
190
|
+
binding: { readonly stepName: string; readonly noun: string },
|
|
191
|
+
): PipelineStep<RequestDesc> {
|
|
192
|
+
return {
|
|
193
|
+
name: binding.stepName,
|
|
194
|
+
async execute(ctx: RequestContext<RequestDesc>): Promise<void> {
|
|
195
|
+
const resourceId = ctx.get(RESOURCE_ID_KEY);
|
|
196
|
+
if (typeof resourceId !== "string") {
|
|
197
|
+
throw new Error(
|
|
198
|
+
"resource id not found in context (ExtractResourceIdStep must run first)",
|
|
199
|
+
);
|
|
200
|
+
}
|
|
201
|
+
const idField = `${binding.noun}Id`;
|
|
202
|
+
try {
|
|
203
|
+
const deletedCount = await store.deleteAuditByResourceId(
|
|
204
|
+
ctx.apiResourceKind,
|
|
205
|
+
resourceId,
|
|
206
|
+
);
|
|
207
|
+
if (deletedCount > 0) {
|
|
208
|
+
logger.info(`Deleted archive records for ${binding.noun}`, {
|
|
209
|
+
[idField]: resourceId,
|
|
210
|
+
count: deletedCount,
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
} catch (error) {
|
|
214
|
+
logger.warn(`failed to delete ${binding.noun} archives (best-effort)`, {
|
|
215
|
+
[idField]: resourceId,
|
|
216
|
+
error: error instanceof Error ? error.message : String(error),
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
},
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
function capitalize(word: string): string {
|
|
224
|
+
return word.charAt(0).toUpperCase() + word.slice(1);
|
|
225
|
+
}
|