@stigmer/server 3.15.3-dev.20260914100347 → 3.15.3-dev.20260916211208
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/archive/content-store.d.ts +35 -0
- package/dist/archive/content-store.d.ts.map +1 -0
- package/dist/archive/content-store.js +98 -0
- package/dist/archive/content-store.js.map +1 -0
- package/dist/archive/inflate.d.ts +22 -0
- package/dist/archive/inflate.d.ts.map +1 -0
- package/dist/archive/inflate.js +75 -0
- package/dist/archive/inflate.js.map +1 -0
- package/dist/archive/limits.d.ts +33 -0
- package/dist/archive/limits.d.ts.map +1 -0
- package/dist/archive/limits.js +31 -0
- package/dist/archive/limits.js.map +1 -0
- package/dist/archive/open.d.ts +24 -0
- package/dist/archive/open.d.ts.map +1 -0
- package/dist/archive/open.js +93 -0
- package/dist/archive/open.js.map +1 -0
- package/dist/{domain/skill/storage → archive}/prefilter.d.ts +5 -0
- package/dist/archive/prefilter.d.ts.map +1 -0
- package/dist/archive/prefilter.js.map +1 -0
- package/dist/archive/write.d.ts +8 -0
- package/dist/archive/write.d.ts.map +1 -0
- package/dist/archive/write.js +44 -0
- package/dist/archive/write.js.map +1 -0
- package/dist/authorization/authorizer.d.ts +98 -0
- package/dist/authorization/authorizer.d.ts.map +1 -0
- package/dist/authorization/authorizer.js +156 -0
- package/dist/authorization/authorizer.js.map +1 -0
- package/dist/authorization/derived-tuples.d.ts +42 -0
- package/dist/authorization/derived-tuples.d.ts.map +1 -0
- package/dist/authorization/derived-tuples.js +240 -0
- package/dist/authorization/derived-tuples.js.map +1 -0
- package/dist/authorization/evaluator.d.ts +66 -0
- package/dist/authorization/evaluator.d.ts.map +1 -0
- package/dist/authorization/evaluator.js +153 -0
- package/dist/authorization/evaluator.js.map +1 -0
- package/dist/authorization/facts.d.ts +29 -0
- package/dist/authorization/facts.d.ts.map +1 -0
- package/dist/authorization/facts.js +17 -0
- package/dist/authorization/facts.js.map +1 -0
- package/dist/authorization/list-read-scope.d.ts +18 -0
- package/dist/authorization/list-read-scope.d.ts.map +1 -0
- package/dist/authorization/list-read-scope.js +155 -0
- package/dist/authorization/list-read-scope.js.map +1 -0
- package/dist/authorization/model/agent.d.ts +2 -0
- package/dist/authorization/model/agent.d.ts.map +1 -0
- package/dist/authorization/model/agent.js +42 -0
- package/dist/authorization/model/agent.js.map +1 -0
- package/dist/authorization/model/agent_channel.d.ts +2 -0
- package/dist/authorization/model/agent_channel.d.ts.map +1 -0
- package/dist/authorization/model/agent_channel.js +38 -0
- package/dist/authorization/model/agent_channel.js.map +1 -0
- package/dist/authorization/model/agent_execution.d.ts +2 -0
- package/dist/authorization/model/agent_execution.d.ts.map +1 -0
- package/dist/authorization/model/agent_execution.js +25 -0
- package/dist/authorization/model/agent_execution.js.map +1 -0
- package/dist/authorization/model/agent_instance.d.ts +2 -0
- package/dist/authorization/model/agent_instance.d.ts.map +1 -0
- package/dist/authorization/model/agent_instance.js +47 -0
- package/dist/authorization/model/agent_instance.js.map +1 -0
- package/dist/authorization/model/agent_share.d.ts +2 -0
- package/dist/authorization/model/agent_share.d.ts.map +1 -0
- package/dist/authorization/model/agent_share.js +29 -0
- package/dist/authorization/model/agent_share.js.map +1 -0
- package/dist/authorization/model/api_key.d.ts +2 -0
- package/dist/authorization/model/api_key.d.ts.map +1 -0
- package/dist/authorization/model/api_key.js +27 -0
- package/dist/authorization/model/api_key.js.map +1 -0
- package/dist/authorization/model/artifact.d.ts +2 -0
- package/dist/authorization/model/artifact.d.ts.map +1 -0
- package/dist/authorization/model/artifact.js +27 -0
- package/dist/authorization/model/artifact.js.map +1 -0
- package/dist/authorization/model/channel_app.d.ts +2 -0
- package/dist/authorization/model/channel_app.d.ts.map +1 -0
- package/dist/authorization/model/channel_app.js +28 -0
- package/dist/authorization/model/channel_app.js.map +1 -0
- package/dist/authorization/model/default-of.d.ts +38 -0
- package/dist/authorization/model/default-of.d.ts.map +1 -0
- package/dist/authorization/model/default-of.js +39 -0
- package/dist/authorization/model/default-of.js.map +1 -0
- package/dist/authorization/model/environment.d.ts +2 -0
- package/dist/authorization/model/environment.d.ts.map +1 -0
- package/dist/authorization/model/environment.js +33 -0
- package/dist/authorization/model/environment.js.map +1 -0
- package/dist/authorization/model/execution_context.d.ts +2 -0
- package/dist/authorization/model/execution_context.d.ts.map +1 -0
- package/dist/authorization/model/execution_context.js +19 -0
- package/dist/authorization/model/execution_context.js.map +1 -0
- package/dist/authorization/model/iam_policy.d.ts +2 -0
- package/dist/authorization/model/iam_policy.d.ts.map +1 -0
- package/dist/authorization/model/iam_policy.js +31 -0
- package/dist/authorization/model/iam_policy.js.map +1 -0
- package/dist/authorization/model/identity_account.d.ts +2 -0
- package/dist/authorization/model/identity_account.d.ts.map +1 -0
- package/dist/authorization/model/identity_account.js +25 -0
- package/dist/authorization/model/identity_account.js.map +1 -0
- package/dist/authorization/model/index.d.ts +36 -0
- package/dist/authorization/model/index.d.ts.map +1 -0
- package/dist/authorization/model/index.js +72 -0
- package/dist/authorization/model/index.js.map +1 -0
- package/dist/authorization/model/mcp_server.d.ts +2 -0
- package/dist/authorization/model/mcp_server.d.ts.map +1 -0
- package/dist/authorization/model/mcp_server.js +37 -0
- package/dist/authorization/model/mcp_server.js.map +1 -0
- package/dist/authorization/model/memory.d.ts +2 -0
- package/dist/authorization/model/memory.d.ts.map +1 -0
- package/dist/authorization/model/memory.js +26 -0
- package/dist/authorization/model/memory.js.map +1 -0
- package/dist/authorization/model/oauth_app.d.ts +2 -0
- package/dist/authorization/model/oauth_app.d.ts.map +1 -0
- package/dist/authorization/model/oauth_app.js +30 -0
- package/dist/authorization/model/oauth_app.js.map +1 -0
- package/dist/authorization/model/organization.d.ts +2 -0
- package/dist/authorization/model/organization.d.ts.map +1 -0
- package/dist/authorization/model/organization.js +54 -0
- package/dist/authorization/model/organization.js.map +1 -0
- package/dist/authorization/model/plugin.d.ts +2 -0
- package/dist/authorization/model/plugin.d.ts.map +1 -0
- package/dist/authorization/model/plugin.js +44 -0
- package/dist/authorization/model/plugin.js.map +1 -0
- package/dist/authorization/model/project.d.ts +2 -0
- package/dist/authorization/model/project.d.ts.map +1 -0
- package/dist/authorization/model/project.js +32 -0
- package/dist/authorization/model/project.js.map +1 -0
- package/dist/authorization/model/rewrite.d.ts +127 -0
- package/dist/authorization/model/rewrite.d.ts.map +1 -0
- package/dist/authorization/model/rewrite.js +82 -0
- package/dist/authorization/model/rewrite.js.map +1 -0
- package/dist/authorization/model/schedule.d.ts +2 -0
- package/dist/authorization/model/schedule.d.ts.map +1 -0
- package/dist/authorization/model/schedule.js +29 -0
- package/dist/authorization/model/schedule.js.map +1 -0
- package/dist/authorization/model/session.d.ts +2 -0
- package/dist/authorization/model/session.d.ts.map +1 -0
- package/dist/authorization/model/session.js +38 -0
- package/dist/authorization/model/session.js.map +1 -0
- package/dist/authorization/model/skill.d.ts +2 -0
- package/dist/authorization/model/skill.d.ts.map +1 -0
- package/dist/authorization/model/skill.js +38 -0
- package/dist/authorization/model/skill.js.map +1 -0
- package/dist/authorization/model/workflow.d.ts +2 -0
- package/dist/authorization/model/workflow.d.ts.map +1 -0
- package/dist/authorization/model/workflow.js +38 -0
- package/dist/authorization/model/workflow.js.map +1 -0
- package/dist/authorization/model/workflow_execution.d.ts +2 -0
- package/dist/authorization/model/workflow_execution.d.ts.map +1 -0
- package/dist/authorization/model/workflow_execution.js +32 -0
- package/dist/authorization/model/workflow_execution.js.map +1 -0
- package/dist/authorization/model/workflow_instance.d.ts +2 -0
- package/dist/authorization/model/workflow_instance.d.ts.map +1 -0
- package/dist/authorization/model/workflow_instance.js +92 -0
- package/dist/authorization/model/workflow_instance.js.map +1 -0
- package/dist/authorization/organization-directory.d.ts +13 -0
- package/dist/authorization/organization-directory.d.ts.map +1 -0
- package/dist/authorization/organization-directory.js +83 -0
- package/dist/authorization/organization-directory.js.map +1 -0
- package/dist/authorization/person.d.ts +42 -0
- package/dist/authorization/person.d.ts.map +1 -0
- package/dist/authorization/person.js +19 -0
- package/dist/authorization/person.js.map +1 -0
- package/dist/authorization/posture.d.ts +38 -0
- package/dist/authorization/posture.d.ts.map +1 -0
- package/dist/authorization/posture.js +7 -0
- package/dist/authorization/posture.js.map +1 -0
- package/dist/authorization/schedule-fire-caller.d.ts +12 -0
- package/dist/authorization/schedule-fire-caller.d.ts.map +1 -0
- package/dist/authorization/schedule-fire-caller.js +67 -0
- package/dist/authorization/schedule-fire-caller.js.map +1 -0
- package/dist/authorization/store-test-kit.d.ts +68 -0
- package/dist/authorization/store-test-kit.d.ts.map +1 -0
- package/dist/authorization/store-test-kit.js +311 -0
- package/dist/authorization/store-test-kit.js.map +1 -0
- package/dist/authorization/tuples.d.ts +115 -0
- package/dist/authorization/tuples.d.ts.map +1 -0
- package/dist/authorization/tuples.js +83 -0
- package/dist/authorization/tuples.js.map +1 -0
- package/dist/boot/compose.d.ts.map +1 -1
- package/dist/boot/compose.js +157 -32
- package/dist/boot/compose.js.map +1 -1
- package/dist/boot/inprocess.d.ts +12 -0
- package/dist/boot/inprocess.d.ts.map +1 -1
- package/dist/boot/inprocess.js +62 -20
- package/dist/boot/inprocess.js.map +1 -1
- package/dist/domain/agent/controller.d.ts.map +1 -1
- package/dist/domain/agent/controller.js +9 -0
- package/dist/domain/agent/controller.js.map +1 -1
- package/dist/domain/iampolicy/constants.d.ts +11 -0
- package/dist/domain/iampolicy/constants.d.ts.map +1 -1
- package/dist/domain/iampolicy/constants.js +11 -0
- package/dist/domain/iampolicy/constants.js.map +1 -1
- package/dist/domain/iampolicy/membership.d.ts +72 -1
- package/dist/domain/iampolicy/membership.d.ts.map +1 -1
- package/dist/domain/iampolicy/membership.js +141 -56
- package/dist/domain/iampolicy/membership.js.map +1 -1
- package/dist/domain/identityaccount/actor.d.ts +26 -0
- package/dist/domain/identityaccount/actor.d.ts.map +1 -0
- package/dist/domain/identityaccount/actor.js +17 -0
- package/dist/domain/identityaccount/actor.js.map +1 -0
- package/dist/domain/mcpserver/controller.d.ts.map +1 -1
- package/dist/domain/mcpserver/controller.js +9 -0
- package/dist/domain/mcpserver/controller.js.map +1 -1
- package/dist/domain/plugin/archive.d.ts +37 -0
- package/dist/domain/plugin/archive.d.ts.map +1 -0
- package/dist/domain/plugin/archive.js +50 -0
- package/dist/domain/plugin/archive.js.map +1 -0
- package/dist/domain/plugin/constants.d.ts +38 -0
- package/dist/domain/plugin/constants.d.ts.map +1 -0
- package/dist/domain/plugin/constants.js +46 -0
- package/dist/domain/plugin/constants.js.map +1 -0
- package/dist/domain/plugin/controller.d.ts +25 -0
- package/dist/domain/plugin/controller.d.ts.map +1 -0
- package/dist/domain/plugin/controller.js +493 -0
- package/dist/domain/plugin/controller.js.map +1 -0
- package/dist/domain/plugin/materialize/agent.d.ts +13 -0
- package/dist/domain/plugin/materialize/agent.d.ts.map +1 -0
- package/dist/domain/plugin/materialize/agent.js +128 -0
- package/dist/domain/plugin/materialize/agent.js.map +1 -0
- package/dist/domain/plugin/materialize/default-agent-instructions.d.ts +22 -0
- package/dist/domain/plugin/materialize/default-agent-instructions.d.ts.map +1 -0
- package/dist/domain/plugin/materialize/default-agent-instructions.js +31 -0
- package/dist/domain/plugin/materialize/default-agent-instructions.js.map +1 -0
- package/dist/domain/plugin/materialize/identity.d.ts +28 -0
- package/dist/domain/plugin/materialize/identity.d.ts.map +1 -0
- package/dist/domain/plugin/materialize/identity.js +40 -0
- package/dist/domain/plugin/materialize/identity.js.map +1 -0
- package/dist/domain/plugin/materialize/mcp-servers.d.ts +15 -0
- package/dist/domain/plugin/materialize/mcp-servers.d.ts.map +1 -0
- package/dist/domain/plugin/materialize/mcp-servers.js +131 -0
- package/dist/domain/plugin/materialize/mcp-servers.js.map +1 -0
- package/dist/domain/plugin/materialize/plan.d.ts +24 -0
- package/dist/domain/plugin/materialize/plan.d.ts.map +1 -0
- package/dist/domain/plugin/materialize/plan.js +77 -0
- package/dist/domain/plugin/materialize/plan.js.map +1 -0
- package/dist/domain/plugin/materialize/ports.d.ts +42 -0
- package/dist/domain/plugin/materialize/ports.d.ts.map +1 -0
- package/dist/domain/plugin/materialize/ports.js +2 -0
- package/dist/domain/plugin/materialize/ports.js.map +1 -0
- package/dist/domain/plugin/materialize/skills.d.ts +12 -0
- package/dist/domain/plugin/materialize/skills.d.ts.map +1 -0
- package/dist/domain/plugin/materialize/skills.js +44 -0
- package/dist/domain/plugin/materialize/skills.js.map +1 -0
- package/dist/domain/plugin/materialize/workflows.d.ts +15 -0
- package/dist/domain/plugin/materialize/workflows.d.ts.map +1 -0
- package/dist/domain/plugin/materialize/workflows.js +31 -0
- package/dist/domain/plugin/materialize/workflows.js.map +1 -0
- package/dist/domain/plugin/members.d.ts +42 -0
- package/dist/domain/plugin/members.d.ts.map +1 -0
- package/dist/domain/plugin/members.js +97 -0
- package/dist/domain/plugin/members.js.map +1 -0
- package/dist/domain/plugin/overlay/documents.d.ts +31 -0
- package/dist/domain/plugin/overlay/documents.d.ts.map +1 -0
- package/dist/domain/plugin/overlay/documents.js +38 -0
- package/dist/domain/plugin/overlay/documents.js.map +1 -0
- package/dist/domain/plugin/overlay/parse.d.ts +16 -0
- package/dist/domain/plugin/overlay/parse.d.ts.map +1 -0
- package/dist/domain/plugin/overlay/parse.js +79 -0
- package/dist/domain/plugin/overlay/parse.js.map +1 -0
- package/dist/domain/plugin/overlay/sanitize.d.ts +10 -0
- package/dist/domain/plugin/overlay/sanitize.d.ts.map +1 -0
- package/dist/domain/plugin/overlay/sanitize.js +101 -0
- package/dist/domain/plugin/overlay/sanitize.js.map +1 -0
- package/dist/domain/plugin/push.d.ts +133 -0
- package/dist/domain/plugin/push.d.ts.map +1 -0
- package/dist/domain/plugin/push.js +800 -0
- package/dist/domain/plugin/push.js.map +1 -0
- package/dist/domain/plugin/search-extractor.d.ts +3 -0
- package/dist/domain/plugin/search-extractor.d.ts.map +1 -0
- package/dist/domain/plugin/search-extractor.js +41 -0
- package/dist/domain/plugin/search-extractor.js.map +1 -0
- package/dist/domain/skill/constants.d.ts +6 -11
- package/dist/domain/skill/constants.d.ts.map +1 -1
- package/dist/domain/skill/constants.js +6 -11
- package/dist/domain/skill/constants.js.map +1 -1
- package/dist/domain/skill/controller.d.ts.map +1 -1
- package/dist/domain/skill/controller.js +33 -30
- package/dist/domain/skill/controller.js.map +1 -1
- package/dist/domain/skill/push.d.ts +9 -10
- package/dist/domain/skill/push.d.ts.map +1 -1
- package/dist/domain/skill/push.js +53 -122
- package/dist/domain/skill/push.js.map +1 -1
- package/dist/domain/skill/search-extractor.d.ts.map +1 -1
- package/dist/domain/skill/search-extractor.js.map +1 -1
- package/dist/domain/skill/storage/artifact-storage.d.ts +26 -29
- package/dist/domain/skill/storage/artifact-storage.d.ts.map +1 -1
- package/dist/domain/skill/storage/artifact-storage.js +6 -103
- package/dist/domain/skill/storage/artifact-storage.js.map +1 -1
- package/dist/domain/skill/storage/zip-gate.d.ts +1 -2
- package/dist/domain/skill/storage/zip-gate.d.ts.map +1 -1
- package/dist/domain/skill/storage/zip-gate.js +56 -126
- package/dist/domain/skill/storage/zip-gate.js.map +1 -1
- package/dist/domain/skill/version-resolution.d.ts +5 -5
- package/dist/domain/skill/version-resolution.d.ts.map +1 -1
- package/dist/domain/skill/version-resolution.js +34 -216
- package/dist/domain/skill/version-resolution.js.map +1 -1
- package/dist/domain/workflow/controller.d.ts.map +1 -1
- package/dist/domain/workflow/controller.js +30 -3
- package/dist/domain/workflow/controller.js.map +1 -1
- package/dist/domain/workflow/registry/data/task-kind-registry.json +1 -0
- package/dist/extensions/authorizer.d.ts +10 -5
- package/dist/extensions/authorizer.d.ts.map +1 -1
- package/dist/extensions/drivers.d.ts +4 -1
- package/dist/extensions/drivers.d.ts.map +1 -1
- package/dist/extensions/list-read-scope.d.ts +75 -11
- package/dist/extensions/list-read-scope.d.ts.map +1 -1
- package/dist/extensions/list-read-scope.js +40 -7
- package/dist/extensions/list-read-scope.js.map +1 -1
- package/dist/extensions/organization-directory.d.ts +13 -9
- package/dist/extensions/organization-directory.d.ts.map +1 -1
- package/dist/extensions/organization-directory.js.map +1 -1
- package/dist/extensions/resource-authorization.d.ts +33 -0
- package/dist/extensions/resource-authorization.d.ts.map +1 -1
- package/dist/extensions/schedule-fire-caller.d.ts +45 -18
- package/dist/extensions/schedule-fire-caller.d.ts.map +1 -1
- package/dist/extensions/schedule-fire-caller.js +12 -1
- package/dist/extensions/schedule-fire-caller.js.map +1 -1
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/pipeline/apiresource-labels.d.ts +23 -3
- package/dist/pipeline/apiresource-labels.d.ts.map +1 -1
- package/dist/pipeline/apiresource-labels.js +20 -0
- package/dist/pipeline/apiresource-labels.js.map +1 -1
- package/dist/pipeline/apiresource-meta.d.ts +21 -0
- package/dist/pipeline/apiresource-meta.d.ts.map +1 -1
- package/dist/pipeline/apiresource-meta.js +28 -0
- package/dist/pipeline/apiresource-meta.js.map +1 -1
- package/dist/pipeline/errors.d.ts.map +1 -1
- package/dist/pipeline/errors.js.map +1 -1
- package/dist/pipeline/steps/authorization-facts.d.ts +12 -0
- package/dist/pipeline/steps/authorization-facts.d.ts.map +1 -0
- package/dist/pipeline/steps/authorization-facts.js +100 -0
- package/dist/pipeline/steps/authorization-facts.js.map +1 -0
- package/dist/pipeline/steps/authorization-tuples.d.ts.map +1 -1
- package/dist/pipeline/steps/authorization-tuples.js +7 -26
- package/dist/pipeline/steps/authorization-tuples.js.map +1 -1
- package/dist/pipeline/steps/delete.d.ts.map +1 -1
- package/dist/pipeline/steps/delete.js +1 -1
- package/dist/pipeline/steps/delete.js.map +1 -1
- package/dist/pipeline/steps/duplicate.d.ts.map +1 -1
- package/dist/pipeline/steps/duplicate.js.map +1 -1
- package/dist/pipeline/steps/guard-plugin-managed.d.ts +12 -0
- package/dist/pipeline/steps/guard-plugin-managed.d.ts.map +1 -0
- package/dist/pipeline/steps/guard-plugin-managed.js +96 -0
- package/dist/pipeline/steps/guard-plugin-managed.js.map +1 -0
- package/dist/pipeline/steps/guard-reserved-labels.d.ts +16 -2
- package/dist/pipeline/steps/guard-reserved-labels.d.ts.map +1 -1
- package/dist/pipeline/steps/guard-reserved-labels.js +11 -7
- package/dist/pipeline/steps/guard-reserved-labels.js.map +1 -1
- package/dist/pipeline/steps/helpers.d.ts.map +1 -1
- package/dist/pipeline/steps/helpers.js.map +1 -1
- package/dist/pipeline/steps/index-search.d.ts.map +1 -1
- package/dist/pipeline/steps/index-search.js.map +1 -1
- package/dist/pipeline/steps/load-existing.d.ts.map +1 -1
- package/dist/pipeline/steps/load-existing.js +1 -1
- package/dist/pipeline/steps/load-existing.js.map +1 -1
- package/dist/pipeline/steps/references.d.ts +16 -0
- package/dist/pipeline/steps/references.d.ts.map +1 -1
- package/dist/pipeline/steps/references.js +18 -0
- package/dist/pipeline/steps/references.js.map +1 -1
- package/dist/pipeline/steps/resolve-artifact-source.d.ts +35 -0
- package/dist/pipeline/steps/resolve-artifact-source.d.ts.map +1 -0
- package/dist/pipeline/steps/resolve-artifact-source.js +27 -0
- package/dist/pipeline/steps/resolve-artifact-source.js.map +1 -0
- package/dist/pipeline/steps/server-stamped-reserved-labels.d.ts.map +1 -1
- package/dist/pipeline/steps/server-stamped-reserved-labels.js.map +1 -1
- package/dist/pipeline/steps/shapes.d.ts +18 -0
- package/dist/pipeline/steps/shapes.d.ts.map +1 -1
- package/dist/pipeline/steps/shapes.js +29 -0
- package/dist/pipeline/steps/shapes.js.map +1 -1
- package/dist/pipeline/steps/slug.d.ts.map +1 -1
- package/dist/pipeline/steps/slug.js.map +1 -1
- package/dist/pipeline/steps/validate-visibility.d.ts +9 -0
- package/dist/pipeline/steps/validate-visibility.d.ts.map +1 -1
- package/dist/pipeline/steps/validate-visibility.js +6 -1
- package/dist/pipeline/steps/validate-visibility.js.map +1 -1
- package/dist/pipeline/steps/validation.d.ts.map +1 -1
- package/dist/pipeline/steps/validation.js.map +1 -1
- package/dist/pipeline/steps/version-archive.d.ts +63 -0
- package/dist/pipeline/steps/version-archive.d.ts.map +1 -0
- package/dist/pipeline/steps/version-archive.js +129 -0
- package/dist/pipeline/steps/version-archive.js.map +1 -0
- package/dist/pipeline/steps/version-history.d.ts +49 -0
- package/dist/pipeline/steps/version-history.d.ts.map +1 -0
- package/dist/pipeline/steps/version-history.js +229 -0
- package/dist/pipeline/steps/version-history.js.map +1 -0
- package/dist/pipeline/steps/visibility-gates.d.ts +8 -0
- package/dist/pipeline/steps/visibility-gates.d.ts.map +1 -1
- package/dist/pipeline/steps/visibility-gates.js +7 -2
- package/dist/pipeline/steps/visibility-gates.js.map +1 -1
- package/dist/query/search/registry.d.ts.map +1 -1
- package/dist/query/search/registry.js +2 -0
- package/dist/query/search/registry.js.map +1 -1
- package/dist/temporal/schedule/run-starter.d.ts +1 -1
- package/dist/temporal/schedule/run-starter.d.ts.map +1 -1
- package/dist/temporal/schedule/run-starter.js +14 -1
- package/dist/temporal/schedule/run-starter.js.map +1 -1
- package/package.json +5 -4
- package/src/archive/__tests__/archive.test.ts +233 -0
- package/src/{domain/skill → archive}/__tests__/prefilter.test.ts +1 -1
- package/src/archive/content-store.ts +132 -0
- package/src/archive/inflate.ts +107 -0
- package/src/archive/limits.ts +42 -0
- package/src/archive/open.ts +131 -0
- package/src/{domain/skill/storage → archive}/prefilter.ts +5 -0
- package/src/archive/write.ts +54 -0
- package/src/authorization/README.md +124 -0
- package/src/authorization/__tests__/authorizer.test.ts +719 -0
- package/src/authorization/__tests__/derived-tuples.test.ts +802 -0
- package/src/authorization/__tests__/drivers.ts +70 -0
- package/src/authorization/__tests__/evaluator.test.ts +359 -0
- package/src/authorization/__tests__/facts.test.ts +155 -0
- package/src/authorization/__tests__/fixtures/fga/agent-channel-owner.fga.yaml +112 -0
- package/src/authorization/__tests__/fixtures/fga/agent-share-owner.fga.yaml +109 -0
- package/src/authorization/__tests__/fixtures/fga/artifact-org-and-owner.fga.yaml +128 -0
- package/src/authorization/__tests__/fixtures/fga/blueprint-private-visibility.fga.yaml +410 -0
- package/src/authorization/__tests__/fixtures/fga/channel-app-owner.fga.yaml +125 -0
- package/src/authorization/__tests__/fixtures/fga/channel-participation.fga.yaml +201 -0
- package/src/authorization/__tests__/fixtures/fga/channel-session-visibility.fga.yaml +187 -0
- package/src/authorization/__tests__/fixtures/fga/cross-org-share-creation.fga.yaml +98 -0
- package/src/authorization/__tests__/fixtures/fga/default-instance-inheritance.fga.yaml +271 -0
- package/src/authorization/__tests__/fixtures/fga/memory-subject-only.fga.yaml +72 -0
- package/src/authorization/__tests__/fixtures/fga/org-admin-owner-inheritance.fga.yaml +328 -0
- package/src/authorization/__tests__/fixtures/fga/org-shared-environment.fga.yaml +144 -0
- package/src/authorization/__tests__/fixtures/fga/platform-visibility.fga.yaml +223 -0
- package/src/authorization/__tests__/fixtures/fga/provider-standing-viewer.fga.yaml +40 -0
- package/src/authorization/__tests__/fixtures/fga/public-visibility-setter.fga.yaml +52 -0
- package/src/authorization/__tests__/fixtures/fga/reserved-label-writer.fga.yaml +41 -0
- package/src/authorization/__tests__/fixtures/fga/schedule-owner.fga.yaml +113 -0
- package/src/authorization/__tests__/fixtures/fga/schedule-session-visibility.fga.yaml +214 -0
- package/src/authorization/__tests__/fixtures/fga/session-personal-resource.fga.yaml +117 -0
- package/src/authorization/__tests__/fixtures/fga/workflow-execution-sharing.fga.yaml +192 -0
- package/src/authorization/__tests__/list-read-scope.measure.test.ts +317 -0
- package/src/authorization/__tests__/list-read-scope.test.ts +796 -0
- package/src/authorization/__tests__/organization-directory.test.ts +236 -0
- package/src/authorization/__tests__/person.test.ts +114 -0
- package/src/authorization/__tests__/posture.test.ts +25 -0
- package/src/authorization/__tests__/schedule-fire-caller.test.ts +134 -0
- package/src/authorization/__tests__/store-tests.test.ts +306 -0
- package/src/authorization/__tests__/support.ts +101 -0
- package/src/authorization/__tests__/tuples.test.ts +62 -0
- package/src/authorization/__tests__/wire-permissions.test.ts +154 -0
- package/src/authorization/authorizer.ts +208 -0
- package/src/authorization/derived-tuples.ts +384 -0
- package/src/authorization/evaluator.ts +283 -0
- package/src/authorization/facts.ts +47 -0
- package/src/authorization/list-read-scope.ts +216 -0
- package/src/authorization/model/__tests__/registry.test.ts +317 -0
- package/src/authorization/model/agent.ts +64 -0
- package/src/authorization/model/agent_channel.ts +49 -0
- package/src/authorization/model/agent_execution.ts +33 -0
- package/src/authorization/model/agent_instance.ts +66 -0
- package/src/authorization/model/agent_share.ts +40 -0
- package/src/authorization/model/api_key.ts +28 -0
- package/src/authorization/model/artifact.ts +38 -0
- package/src/authorization/model/channel_app.ts +39 -0
- package/src/authorization/model/default-of.ts +99 -0
- package/src/authorization/model/environment.ts +48 -0
- package/src/authorization/model/execution_context.ts +20 -0
- package/src/authorization/model/iam_policy.ts +42 -0
- package/src/authorization/model/identity_account.ts +26 -0
- package/src/authorization/model/index.ts +108 -0
- package/src/authorization/model/mcp_server.ts +59 -0
- package/src/authorization/model/memory.ts +27 -0
- package/src/authorization/model/oauth_app.ts +42 -0
- package/src/authorization/model/organization.ts +55 -0
- package/src/authorization/model/plugin.ts +66 -0
- package/src/authorization/model/project.ts +47 -0
- package/src/authorization/model/rewrite.ts +213 -0
- package/src/authorization/model/schedule.ts +40 -0
- package/src/authorization/model/session.ts +50 -0
- package/src/authorization/model/skill.ts +60 -0
- package/src/authorization/model/workflow.ts +60 -0
- package/src/authorization/model/workflow_execution.ts +44 -0
- package/src/authorization/model/workflow_instance.ts +122 -0
- package/src/authorization/organization-directory.ts +114 -0
- package/src/authorization/person.ts +68 -0
- package/src/authorization/posture.ts +49 -0
- package/src/authorization/schedule-fire-caller.ts +91 -0
- package/src/authorization/store-test-kit.ts +454 -0
- package/src/authorization/tuples.ts +190 -0
- package/src/boot/compose.ts +175 -38
- package/src/boot/inprocess.ts +108 -30
- package/src/domain/agent/controller.ts +11 -0
- package/src/domain/iampolicy/__tests__/membership.test.ts +357 -3
- package/src/domain/iampolicy/constants.ts +12 -0
- package/src/domain/iampolicy/membership.ts +221 -66
- package/src/domain/identityaccount/actor.ts +44 -0
- package/src/domain/mcpserver/controller.ts +11 -0
- package/src/domain/plugin/__tests__/materialize.test.ts +303 -0
- package/src/domain/plugin/__tests__/overlay-parse.test.ts +85 -0
- package/src/domain/plugin/__tests__/plugin.test.ts +681 -0
- package/src/domain/plugin/__tests__/sanitize.test.ts +174 -0
- package/src/domain/plugin/archive.ts +89 -0
- package/src/domain/plugin/constants.ts +53 -0
- package/src/domain/plugin/controller.ts +913 -0
- package/src/domain/plugin/materialize/agent.ts +186 -0
- package/src/domain/plugin/materialize/default-agent-instructions.ts +59 -0
- package/src/domain/plugin/materialize/identity.ts +67 -0
- package/src/domain/plugin/materialize/mcp-servers.ts +175 -0
- package/src/domain/plugin/materialize/plan.ts +124 -0
- package/src/domain/plugin/materialize/ports.ts +53 -0
- package/src/domain/plugin/materialize/skills.ts +68 -0
- package/src/domain/plugin/materialize/workflows.ts +51 -0
- package/src/domain/plugin/members.ts +180 -0
- package/src/domain/plugin/overlay/documents.ts +78 -0
- package/src/domain/plugin/overlay/parse.ts +115 -0
- package/src/domain/plugin/overlay/sanitize.ts +149 -0
- package/src/domain/plugin/push.ts +1062 -0
- package/src/domain/plugin/search-extractor.ts +60 -0
- package/src/domain/skill/constants.ts +11 -14
- package/src/domain/skill/controller.ts +44 -36
- package/src/domain/skill/push.ts +61 -156
- package/src/domain/skill/search-extractor.ts +3 -1
- package/src/domain/skill/storage/artifact-storage.ts +23 -124
- package/src/domain/skill/storage/zip-gate.ts +58 -154
- package/src/domain/skill/version-resolution.ts +67 -269
- package/src/domain/workflow/controller.ts +38 -4
- package/src/domain/workflow/registry/data/task-kind-registry.json +1 -0
- package/src/extensions/__tests__/built-in-authorization-composed.test.ts +835 -0
- package/src/extensions/__tests__/composed-support.ts +32 -1
- package/src/extensions/__tests__/extension-composition.test.ts +35 -0
- package/src/extensions/__tests__/list-read-scope.test.ts +245 -3
- package/src/extensions/__tests__/role-reconciliation-composed.test.ts +209 -0
- package/src/extensions/__tests__/tier-truthfulness.test.ts +6 -14
- package/src/extensions/authorizer.ts +10 -5
- package/src/extensions/drivers.ts +4 -1
- package/src/extensions/list-read-scope.ts +116 -16
- package/src/extensions/organization-directory.ts +13 -9
- package/src/extensions/resource-authorization.ts +34 -0
- package/src/extensions/schedule-fire-caller.ts +49 -18
- package/src/index.ts +51 -1
- package/src/pipeline/__tests__/inherited-authorization-parent.test.ts +51 -0
- package/src/pipeline/__tests__/router-transport.test.ts +1 -3
- package/src/pipeline/apiresource-labels.ts +31 -3
- package/src/pipeline/apiresource-meta.ts +37 -0
- package/src/pipeline/errors.ts +5 -5
- package/src/pipeline/steps/__tests__/authorize-annotation-completeness.test.ts +1 -20
- package/src/pipeline/steps/__tests__/guard-memory-capture.test.ts +3 -9
- package/src/pipeline/steps/__tests__/guard-plugin-managed.test.ts +151 -0
- package/src/pipeline/steps/__tests__/guard-reserved-labels.test.ts +83 -8
- package/src/pipeline/steps/authorization-facts.ts +131 -0
- package/src/pipeline/steps/authorization-tuples.ts +7 -28
- package/src/pipeline/steps/delete.ts +11 -3
- package/src/pipeline/steps/duplicate.ts +8 -2
- package/src/pipeline/steps/guard-plugin-managed.ts +133 -0
- package/src/pipeline/steps/guard-reserved-labels.ts +29 -8
- package/src/pipeline/steps/helpers.ts +4 -1
- package/src/pipeline/steps/index-search.ts +28 -15
- package/src/pipeline/steps/load-existing.ts +12 -3
- package/src/pipeline/steps/references.ts +36 -2
- package/src/pipeline/steps/resolve-artifact-source.ts +66 -0
- package/src/pipeline/steps/server-stamped-reserved-labels.ts +2 -1
- package/src/pipeline/steps/shapes.ts +31 -0
- package/src/pipeline/steps/slug.ts +7 -2
- package/src/pipeline/steps/validate-visibility.ts +9 -2
- package/src/pipeline/steps/validation.ts +3 -1
- package/src/pipeline/steps/version-archive.ts +225 -0
- package/src/pipeline/steps/version-history.ts +362 -0
- package/src/pipeline/steps/visibility-gates.ts +12 -9
- package/src/query/README.md +1 -1
- package/src/query/search/__tests__/criteria.test.ts +6 -7
- package/src/query/search/__tests__/query-store.test.ts +9 -2
- package/src/query/search/__tests__/registry.test.ts +6 -4
- package/src/query/search/registry.ts +6 -1
- package/src/temporal/schedule/__tests__/run-starter.test.ts +86 -24
- package/src/temporal/schedule/run-starter.ts +31 -8
- package/dist/domain/skill/storage/prefilter.d.ts.map +0 -1
- package/dist/domain/skill/storage/prefilter.js.map +0 -1
- /package/dist/{domain/skill/storage → archive}/prefilter.js +0 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skills from a plugin: one `PushSkillRequest` per `skills/<name>/SKILL.md`,
|
|
3
|
+
* each an archive of its own written from the plugin's files. The library
|
|
4
|
+
* lists a skill's files PLUGIN-relative (`skills/x/SKILL.md`), so the writer
|
|
5
|
+
* strips `dir + "/"` to put SKILL.md at the archive root, where the skill
|
|
6
|
+
* gate requires it; a Claude root-single-skill plugin (`dir === ""`) is the
|
|
7
|
+
* whole package as one skill, manifests included, harmless under the caps.
|
|
8
|
+
*
|
|
9
|
+
* The skill's identity is the frontmatter's, exactly as a CLI push: the
|
|
10
|
+
* slug planned here is `generateSlug(name)`, the same function
|
|
11
|
+
* ResolveSlugForPush runs, so the plan and the pushed skill agree by
|
|
12
|
+
* construction. The tag is the plugin's version (when it fits the tag
|
|
13
|
+
* pattern), so a skill's history reads like its plugin's.
|
|
14
|
+
*/
|
|
15
|
+
import { create } from "@bufbuild/protobuf";
|
|
16
|
+
|
|
17
|
+
import type {
|
|
18
|
+
PluginFiles,
|
|
19
|
+
PluginPackage,
|
|
20
|
+
PluginSkill,
|
|
21
|
+
} from "@stigmer/plugin-package";
|
|
22
|
+
import { PushSkillRequestSchema } from "@stigmer/protos/ai/stigmer/agentic/skill/v1/io_pb";
|
|
23
|
+
import type { PushSkillRequest } from "@stigmer/protos/ai/stigmer/agentic/skill/v1/io_pb";
|
|
24
|
+
|
|
25
|
+
import { writeArchive } from "../../../archive/write.js";
|
|
26
|
+
import { generateSlug } from "../../../pipeline/steps/slug.js";
|
|
27
|
+
import { memberLabels } from "./identity.js";
|
|
28
|
+
import type { PluginIdentity } from "./identity.js";
|
|
29
|
+
|
|
30
|
+
export interface PlannedSkill {
|
|
31
|
+
readonly name: string;
|
|
32
|
+
readonly slug: string;
|
|
33
|
+
readonly request: PushSkillRequest;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** The slug a plugin skill will have once pushed; the plan checks it before any write. */
|
|
37
|
+
export function skillSlugOf(skill: PluginSkill): string {
|
|
38
|
+
return generateSlug(skill.name);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function planSkills(
|
|
42
|
+
plugin: PluginPackage,
|
|
43
|
+
files: PluginFiles,
|
|
44
|
+
identity: PluginIdentity,
|
|
45
|
+
tag: string,
|
|
46
|
+
message: string,
|
|
47
|
+
): PlannedSkill[] {
|
|
48
|
+
return plugin.skills.map((skill) => {
|
|
49
|
+
const prefix = skill.dir === "" ? "" : `${skill.dir}/`;
|
|
50
|
+
const archive = writeArchive(
|
|
51
|
+
skill.files.map((path) => ({
|
|
52
|
+
path: path.startsWith(prefix) ? path.slice(prefix.length) : path,
|
|
53
|
+
bytes: files.read(path),
|
|
54
|
+
})),
|
|
55
|
+
);
|
|
56
|
+
return {
|
|
57
|
+
name: skill.name,
|
|
58
|
+
slug: skillSlugOf(skill),
|
|
59
|
+
request: create(PushSkillRequestSchema, {
|
|
60
|
+
org: identity.org,
|
|
61
|
+
artifact: archive,
|
|
62
|
+
tag,
|
|
63
|
+
message,
|
|
64
|
+
labels: memberLabels(identity),
|
|
65
|
+
}),
|
|
66
|
+
};
|
|
67
|
+
});
|
|
68
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflows from a plugin: the author's `ai.stigmer/workflows/<name>.yaml`
|
|
3
|
+
* documents, applied as written. Only Stigmer reads this folder (other
|
|
4
|
+
* clients have no workflow), so there is nothing portable to layer; the
|
|
5
|
+
* file stem is the workflow's name and slug, and the workflow chain's own
|
|
6
|
+
* validation (ValidateWorkflowSpec, ValidateReferences) judges the spec
|
|
7
|
+
* exactly as it would a `stigmer apply`.
|
|
8
|
+
*/
|
|
9
|
+
import { create } from "@bufbuild/protobuf";
|
|
10
|
+
|
|
11
|
+
import { WorkflowSchema } from "@stigmer/protos/ai/stigmer/agentic/workflow/v1/api_pb";
|
|
12
|
+
import type { Workflow } from "@stigmer/protos/ai/stigmer/agentic/workflow/v1/api_pb";
|
|
13
|
+
|
|
14
|
+
import { generateSlug } from "../../../pipeline/steps/slug.js";
|
|
15
|
+
import { memberMetadata } from "./identity.js";
|
|
16
|
+
import type { PluginIdentity } from "./identity.js";
|
|
17
|
+
|
|
18
|
+
export interface PlannedWorkflow {
|
|
19
|
+
readonly name: string;
|
|
20
|
+
readonly slug: string;
|
|
21
|
+
readonly resource: Workflow;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** One parsed overlay workflow: its file stem and the document. */
|
|
25
|
+
export interface OverlayWorkflow {
|
|
26
|
+
readonly name: string;
|
|
27
|
+
readonly resource: Workflow;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function workflowSlugOf(name: string): string {
|
|
31
|
+
return generateSlug(name);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function planWorkflows(
|
|
35
|
+
overlays: readonly OverlayWorkflow[],
|
|
36
|
+
identity: PluginIdentity,
|
|
37
|
+
): PlannedWorkflow[] {
|
|
38
|
+
return overlays.map(({ name, resource }) => {
|
|
39
|
+
const slug = workflowSlugOf(name);
|
|
40
|
+
return {
|
|
41
|
+
name,
|
|
42
|
+
slug,
|
|
43
|
+
resource: create(WorkflowSchema, {
|
|
44
|
+
apiVersion: "agentic.stigmer.ai/v1",
|
|
45
|
+
kind: "Workflow",
|
|
46
|
+
metadata: memberMetadata(identity, { name, slug }, resource.metadata),
|
|
47
|
+
spec: resource.spec,
|
|
48
|
+
}),
|
|
49
|
+
};
|
|
50
|
+
});
|
|
51
|
+
}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Membership, derived on read. A plugin stores no member list: its members
|
|
3
|
+
* are the resources of the four child kinds whose `stigmer.ai/plugin` label
|
|
4
|
+
* carries the plugin's id, found by `findAllByLabel` per kind (four whole-
|
|
5
|
+
* kind scans; a label index is the remedy when a cloud organization grows
|
|
6
|
+
* past what the scan tolerates) and filtered to the plugin's organization.
|
|
7
|
+
* Nothing is stored twice, so nothing can drift — the ownerReference
|
|
8
|
+
* pattern.
|
|
9
|
+
*
|
|
10
|
+
* The same module answers the two questions a push asks before any write:
|
|
11
|
+
* which planned slugs are already held in the organization, and by whom
|
|
12
|
+
* (this plugin: an upgrade; another plugin or an unmanaged resource: a
|
|
13
|
+
* refusal naming the holder); and whether the plugin's members already
|
|
14
|
+
* converge on the head's digest (every planned member present, each
|
|
15
|
+
* carrying `stigmer.ai/plugin-version` equal to it), which is what lets a
|
|
16
|
+
* re-push of the same archive return without a child write.
|
|
17
|
+
*
|
|
18
|
+
* Proven by __tests__/members.test.ts and the conformance suite's
|
|
19
|
+
* listMembers, collision and reconcile arms.
|
|
20
|
+
*/
|
|
21
|
+
import { fromBinary } from "@bufbuild/protobuf";
|
|
22
|
+
import type { DescMessage, MessageShape } from "@bufbuild/protobuf";
|
|
23
|
+
|
|
24
|
+
import { AgentSchema } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/api_pb";
|
|
25
|
+
import { McpServerSchema } from "@stigmer/protos/ai/stigmer/agentic/mcpserver/v1/api_pb";
|
|
26
|
+
import { SkillSchema } from "@stigmer/protos/ai/stigmer/agentic/skill/v1/api_pb";
|
|
27
|
+
import { WorkflowSchema } from "@stigmer/protos/ai/stigmer/agentic/workflow/v1/api_pb";
|
|
28
|
+
import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
|
|
29
|
+
import type { ApiResourceMetadata } from "@stigmer/protos/ai/stigmer/commons/apiresource/metadata_pb";
|
|
30
|
+
|
|
31
|
+
import {
|
|
32
|
+
PLUGIN_LABEL,
|
|
33
|
+
PLUGIN_VERSION_LABEL,
|
|
34
|
+
pluginIdOf,
|
|
35
|
+
} from "../../pipeline/apiresource-labels.js";
|
|
36
|
+
import { findResourceBySlug } from "../../pipeline/steps/helpers.js";
|
|
37
|
+
import { metadataOf } from "../../pipeline/steps/shapes.js";
|
|
38
|
+
import type { Store } from "../../store/interface.js";
|
|
39
|
+
|
|
40
|
+
/** The four kinds a plugin materialises, in materialisation order. */
|
|
41
|
+
export const MEMBER_KINDS: ReadonlyArray<{
|
|
42
|
+
readonly kind: ApiResourceKind;
|
|
43
|
+
readonly schema: DescMessage;
|
|
44
|
+
}> = [
|
|
45
|
+
{ kind: ApiResourceKind.skill, schema: SkillSchema },
|
|
46
|
+
{ kind: ApiResourceKind.mcp_server, schema: McpServerSchema },
|
|
47
|
+
{ kind: ApiResourceKind.agent, schema: AgentSchema },
|
|
48
|
+
{ kind: ApiResourceKind.workflow, schema: WorkflowSchema },
|
|
49
|
+
];
|
|
50
|
+
|
|
51
|
+
/** A member as the store holds it. */
|
|
52
|
+
export interface Member {
|
|
53
|
+
readonly kind: ApiResourceKind;
|
|
54
|
+
readonly id: string;
|
|
55
|
+
readonly slug: string;
|
|
56
|
+
readonly name: string;
|
|
57
|
+
/** The `stigmer.ai/plugin-version` value it was last materialised from. */
|
|
58
|
+
readonly version: string;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** A member the plan intends to exist after this push. */
|
|
62
|
+
export interface PlannedMember {
|
|
63
|
+
readonly kind: ApiResourceKind;
|
|
64
|
+
readonly slug: string;
|
|
65
|
+
readonly name: string;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function memberOf(
|
|
69
|
+
kind: ApiResourceKind,
|
|
70
|
+
metadata: ApiResourceMetadata,
|
|
71
|
+
): Member {
|
|
72
|
+
return {
|
|
73
|
+
kind,
|
|
74
|
+
id: metadata.id,
|
|
75
|
+
slug: metadata.slug,
|
|
76
|
+
name: metadata.name,
|
|
77
|
+
version: metadata.labels[PLUGIN_VERSION_LABEL] ?? "",
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/** Every member of the plugin in its organization, in materialisation order. */
|
|
82
|
+
export async function findMembers(
|
|
83
|
+
store: Store,
|
|
84
|
+
pluginId: string,
|
|
85
|
+
org: string,
|
|
86
|
+
): Promise<Member[]> {
|
|
87
|
+
const members: Member[] = [];
|
|
88
|
+
for (const { kind, schema } of MEMBER_KINDS) {
|
|
89
|
+
const raws = await store.findAllByLabel(
|
|
90
|
+
kind,
|
|
91
|
+
PLUGIN_LABEL,
|
|
92
|
+
pluginId,
|
|
93
|
+
schema,
|
|
94
|
+
);
|
|
95
|
+
for (const raw of raws) {
|
|
96
|
+
// findAllByLabel already unmarshaled every returned row to match the
|
|
97
|
+
// label, so a decode failure here is store corruption; propagate.
|
|
98
|
+
const metadata = metadataOf(fromBinary(schema, raw));
|
|
99
|
+
if (metadata !== undefined && metadata.org === org) {
|
|
100
|
+
members.push(memberOf(kind, metadata));
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
return members;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/** Who holds a planned slug in the organization today. */
|
|
108
|
+
export type SlugHolder =
|
|
109
|
+
| { readonly held: false }
|
|
110
|
+
| {
|
|
111
|
+
readonly held: true;
|
|
112
|
+
readonly byPlugin: string | undefined;
|
|
113
|
+
readonly holder: Member;
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
export async function slugHolder(
|
|
117
|
+
store: Store,
|
|
118
|
+
planned: PlannedMember,
|
|
119
|
+
org: string,
|
|
120
|
+
): Promise<SlugHolder> {
|
|
121
|
+
const entry = MEMBER_KINDS.find(
|
|
122
|
+
(candidate) => candidate.kind === planned.kind,
|
|
123
|
+
);
|
|
124
|
+
if (entry === undefined) {
|
|
125
|
+
throw new Error(
|
|
126
|
+
`kind ${ApiResourceKind[planned.kind]} is not a plugin member kind`,
|
|
127
|
+
);
|
|
128
|
+
}
|
|
129
|
+
const existing: MessageShape<DescMessage> | undefined =
|
|
130
|
+
await findResourceBySlug(
|
|
131
|
+
store,
|
|
132
|
+
planned.kind,
|
|
133
|
+
entry.schema,
|
|
134
|
+
planned.slug,
|
|
135
|
+
org,
|
|
136
|
+
);
|
|
137
|
+
const metadata = existing === undefined ? undefined : metadataOf(existing);
|
|
138
|
+
if (metadata === undefined) {
|
|
139
|
+
return { held: false };
|
|
140
|
+
}
|
|
141
|
+
return {
|
|
142
|
+
held: true,
|
|
143
|
+
byPlugin: pluginIdOf(metadata),
|
|
144
|
+
holder: memberOf(planned.kind, metadata),
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Whether the stored members already ARE the plan at this digest: every
|
|
150
|
+
* planned member present, none extra, each stamped with the digest.
|
|
151
|
+
*/
|
|
152
|
+
export function membersConverge(
|
|
153
|
+
existing: readonly Member[],
|
|
154
|
+
planned: readonly PlannedMember[],
|
|
155
|
+
digest: string,
|
|
156
|
+
): boolean {
|
|
157
|
+
if (existing.length !== planned.length) {
|
|
158
|
+
return false;
|
|
159
|
+
}
|
|
160
|
+
const byKey = new Map(
|
|
161
|
+
existing.map((member) => [`${member.kind}:${member.slug}`, member]),
|
|
162
|
+
);
|
|
163
|
+
return planned.every((member) => {
|
|
164
|
+
const found = byKey.get(`${member.kind}:${member.slug}`);
|
|
165
|
+
return found !== undefined && found.version === digest;
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/** Members the new plan no longer names — removed on upgrade. */
|
|
170
|
+
export function droppedMembers(
|
|
171
|
+
existing: readonly Member[],
|
|
172
|
+
planned: readonly PlannedMember[],
|
|
173
|
+
): Member[] {
|
|
174
|
+
const keep = new Set(
|
|
175
|
+
planned.map((member) => `${member.kind}:${member.slug}`),
|
|
176
|
+
);
|
|
177
|
+
return existing.filter(
|
|
178
|
+
(member) => !keep.has(`${member.kind}:${member.slug}`),
|
|
179
|
+
);
|
|
180
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The plugin's Stigmer overlay, parsed: the three document families under
|
|
3
|
+
* `ai.stigmer/` as protos, each still carrying the path it came from so
|
|
4
|
+
* every later sentence can point at the file. `parseOverlays` is the one
|
|
5
|
+
* place the library's byte-and-path documents meet the schemas; the
|
|
6
|
+
* sanitiser and the materialisers read the result and never the bytes.
|
|
7
|
+
*/
|
|
8
|
+
import type { StigmerOverlay } from "@stigmer/plugin-package";
|
|
9
|
+
import { AgentSchema } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/api_pb";
|
|
10
|
+
import type { Agent } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/api_pb";
|
|
11
|
+
import { McpServerSchema } from "@stigmer/protos/ai/stigmer/agentic/mcpserver/v1/api_pb";
|
|
12
|
+
import type { McpServer } from "@stigmer/protos/ai/stigmer/agentic/mcpserver/v1/api_pb";
|
|
13
|
+
import { WorkflowSchema } from "@stigmer/protos/ai/stigmer/agentic/workflow/v1/api_pb";
|
|
14
|
+
import type { Workflow } from "@stigmer/protos/ai/stigmer/agentic/workflow/v1/api_pb";
|
|
15
|
+
|
|
16
|
+
import { parseOverlayDocument } from "./parse.js";
|
|
17
|
+
|
|
18
|
+
export interface ParsedOverlayDocument<T> {
|
|
19
|
+
readonly path: string;
|
|
20
|
+
readonly resource: T;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export interface ParsedOverlayWorkflow extends ParsedOverlayDocument<Workflow> {
|
|
24
|
+
/** The file stem: the workflow's name. */
|
|
25
|
+
readonly name: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface ParsedOverlayMcpServer extends ParsedOverlayDocument<McpServer> {
|
|
29
|
+
/** The `mcpServers` key this overlay layers over. */
|
|
30
|
+
readonly server: string;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface ParsedOverlays {
|
|
34
|
+
readonly agent?: ParsedOverlayDocument<Agent>;
|
|
35
|
+
readonly workflows: readonly ParsedOverlayWorkflow[];
|
|
36
|
+
readonly mcpServers: readonly ParsedOverlayMcpServer[];
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** Parses every overlay document strictly; the first refusal stops the read. */
|
|
40
|
+
export function parseOverlays(
|
|
41
|
+
overlay: StigmerOverlay,
|
|
42
|
+
org: string,
|
|
43
|
+
): ParsedOverlays {
|
|
44
|
+
return {
|
|
45
|
+
...(overlay.agent !== undefined && {
|
|
46
|
+
agent: {
|
|
47
|
+
path: overlay.agent.path,
|
|
48
|
+
resource: parseOverlayDocument(
|
|
49
|
+
overlay.agent.path,
|
|
50
|
+
overlay.agent.bytes,
|
|
51
|
+
{
|
|
52
|
+
schema: AgentSchema,
|
|
53
|
+
yamlKind: "Agent",
|
|
54
|
+
org,
|
|
55
|
+
},
|
|
56
|
+
),
|
|
57
|
+
},
|
|
58
|
+
}),
|
|
59
|
+
workflows: overlay.workflows.map((document) => ({
|
|
60
|
+
path: document.path,
|
|
61
|
+
name: document.name,
|
|
62
|
+
resource: parseOverlayDocument(document.path, document.bytes, {
|
|
63
|
+
schema: WorkflowSchema,
|
|
64
|
+
yamlKind: "Workflow",
|
|
65
|
+
org,
|
|
66
|
+
}),
|
|
67
|
+
})),
|
|
68
|
+
mcpServers: overlay.mcpServers.map((document) => ({
|
|
69
|
+
path: document.path,
|
|
70
|
+
server: document.server,
|
|
71
|
+
resource: parseOverlayDocument(document.path, document.bytes, {
|
|
72
|
+
schema: McpServerSchema,
|
|
73
|
+
yamlKind: "McpServer",
|
|
74
|
+
org,
|
|
75
|
+
}),
|
|
76
|
+
})),
|
|
77
|
+
};
|
|
78
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Strict YAML → proto for the documents under a plugin's `ai.stigmer/`
|
|
3
|
+
* folder: `agent.yaml`, `workflows/<name>.yaml`, `mcp-servers/<server>.yaml`.
|
|
4
|
+
* The library (`@stigmer/plugin-package`) hands them over as bytes because
|
|
5
|
+
* it is proto-free; this module is where they become resources.
|
|
6
|
+
*
|
|
7
|
+
* It is the server twin of the SDK's manifest parser
|
|
8
|
+
* (sdk/typescript/src/manifest/parse.ts), which is the strictness contract
|
|
9
|
+
* every `stigmer apply` document already meets and which the server cannot
|
|
10
|
+
* import (the dependency direction runs the other way). The twin makes the
|
|
11
|
+
* same core call — `fromJson(schema, value, { ignoreUnknownFields: false })`,
|
|
12
|
+
* the call the workflow converter's unmarshal.ts makes too — so a document
|
|
13
|
+
* the CLI accepts is one the server accepts, and a typo the CLI refuses is
|
|
14
|
+
* refused here with the document's path in the sentence. Two rules are
|
|
15
|
+
* stricter than the SDK's, on purpose: the document's `kind` must be the
|
|
16
|
+
* one its location promises (an `agent.yaml` holding a Workflow is a
|
|
17
|
+
* mistake, not a choice), and a `metadata.org` other than the installing
|
|
18
|
+
* organization is refused rather than honoured with a warning, because an
|
|
19
|
+
* overlay is materialised on the caller's behalf and must not reach across
|
|
20
|
+
* organizations.
|
|
21
|
+
*
|
|
22
|
+
* Protovalidate is not run here: it runs where it always runs, in the
|
|
23
|
+
* child's own chain when the resource is applied.
|
|
24
|
+
*
|
|
25
|
+
* Proven by __tests__/overlay-parse.test.ts against the documents the CLI
|
|
26
|
+
* accepts and refuses.
|
|
27
|
+
*/
|
|
28
|
+
import { fromJson } from "@bufbuild/protobuf";
|
|
29
|
+
import type { DescMessage, JsonValue, MessageShape } from "@bufbuild/protobuf";
|
|
30
|
+
import { load as loadYaml } from "js-yaml";
|
|
31
|
+
|
|
32
|
+
import { metadataOf } from "../../../pipeline/steps/shapes.js";
|
|
33
|
+
|
|
34
|
+
/** One refusal, phrased for the author with the document's path. */
|
|
35
|
+
export class OverlayParseError extends Error {
|
|
36
|
+
constructor(
|
|
37
|
+
readonly path: string,
|
|
38
|
+
reason: string,
|
|
39
|
+
) {
|
|
40
|
+
super(`overlay document '${path}': ${reason}`);
|
|
41
|
+
this.name = "OverlayParseError";
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export interface OverlayExpectation<Desc extends DescMessage> {
|
|
46
|
+
readonly schema: Desc;
|
|
47
|
+
/** The YAML `kind` the location promises: "Agent", "Workflow", "McpServer". */
|
|
48
|
+
readonly yamlKind: string;
|
|
49
|
+
/** The organization the plugin is installed into; the document's must be empty or equal. */
|
|
50
|
+
readonly org: string;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** Parses one overlay document into its proto, strictly. */
|
|
54
|
+
export function parseOverlayDocument<Desc extends DescMessage>(
|
|
55
|
+
path: string,
|
|
56
|
+
bytes: Uint8Array,
|
|
57
|
+
expectation: OverlayExpectation<Desc>,
|
|
58
|
+
): MessageShape<Desc> {
|
|
59
|
+
const text = new TextDecoder("utf-8", { fatal: false }).decode(bytes);
|
|
60
|
+
if (text.trim() === "") {
|
|
61
|
+
throw new OverlayParseError(path, "the document is empty");
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
let value: unknown;
|
|
65
|
+
try {
|
|
66
|
+
value = loadYaml(text);
|
|
67
|
+
} catch (error) {
|
|
68
|
+
throw new OverlayParseError(
|
|
69
|
+
path,
|
|
70
|
+
`invalid YAML: ${error instanceof Error ? error.message : String(error)}`,
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
74
|
+
throw new OverlayParseError(
|
|
75
|
+
path,
|
|
76
|
+
"expected a mapping document with apiVersion, kind, metadata, and spec",
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const kind = (value as Record<string, unknown>).kind;
|
|
81
|
+
if (kind !== expectation.yamlKind) {
|
|
82
|
+
throw new OverlayParseError(
|
|
83
|
+
path,
|
|
84
|
+
kind === undefined || kind === ""
|
|
85
|
+
? `missing the required 'kind' field (expected kind: ${expectation.yamlKind})`
|
|
86
|
+
: `kind '${String(kind)}' is not the ${expectation.yamlKind} this location holds`,
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
let message: MessageShape<Desc>;
|
|
91
|
+
try {
|
|
92
|
+
message = fromJson(expectation.schema, value as JsonValue, {
|
|
93
|
+
ignoreUnknownFields: false,
|
|
94
|
+
});
|
|
95
|
+
} catch (error) {
|
|
96
|
+
throw new OverlayParseError(
|
|
97
|
+
path,
|
|
98
|
+
`invalid ${expectation.yamlKind}: ${error instanceof Error ? error.message : String(error)}`,
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
const metadata = metadataOf(message);
|
|
103
|
+
if (
|
|
104
|
+
metadata !== undefined &&
|
|
105
|
+
metadata.org !== "" &&
|
|
106
|
+
metadata.org !== expectation.org
|
|
107
|
+
) {
|
|
108
|
+
throw new OverlayParseError(
|
|
109
|
+
path,
|
|
110
|
+
`metadata.org '${metadata.org}' is not the organization the plugin is installed into ('${expectation.org}')`,
|
|
111
|
+
);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
return message;
|
|
115
|
+
}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The sanitiser: what an overlay author may NOT say about the resources a
|
|
3
|
+
* plugin materialises on the installing caller's behalf. The materialisers
|
|
4
|
+
* write those resources through the in-process lane, and the in-process
|
|
5
|
+
* lane passes GuardReservedLabels structurally (the controller stamps the
|
|
6
|
+
* membership labels by design), so this module is the one place plugin-
|
|
7
|
+
* provided metadata is judged before it can ride that lane. Without it an
|
|
8
|
+
* archive could carry `stigmer.ai/default-agent: "true"` in its agent
|
|
9
|
+
* overlay and become every organization's default agent.
|
|
10
|
+
*
|
|
11
|
+
* Four rules, each one sentence with the document's path:
|
|
12
|
+
* - a `stigmer.ai/*` label costs `can_write_reserved_labels` on
|
|
13
|
+
* `platform:stigmer`, the same check GuardReservedLabels runs and the
|
|
14
|
+
* same lazy consultation of the one composed Authorizer (the
|
|
15
|
+
* open-source permissive default allows; an enforcing authorizer
|
|
16
|
+
* denies with PERMISSION_DENIED naming the keys);
|
|
17
|
+
* - `metadata.id` is the server's to mint, never an author's;
|
|
18
|
+
* - the agent overlay's name is the plugin's, a server overlay's name is
|
|
19
|
+
* its `mcpServers` key, a workflow overlay's name is its file stem: an
|
|
20
|
+
* overlay describes ONE resource the plugin owns, and a name that says
|
|
21
|
+
* otherwise is a mistake the author should hear about;
|
|
22
|
+
* - a foreign `metadata.org` was already refused by the parser.
|
|
23
|
+
*
|
|
24
|
+
* The plugin's own two labels are stamped after this runs, so they never
|
|
25
|
+
* appear here. Proven by __tests__/sanitize.test.ts under a denying and an
|
|
26
|
+
* allowing authorizer.
|
|
27
|
+
*/
|
|
28
|
+
import { Code, ConnectError } from "@connectrpc/connect";
|
|
29
|
+
|
|
30
|
+
import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
|
|
31
|
+
import type { ApiResourceMetadata } from "@stigmer/protos/ai/stigmer/commons/apiresource/metadata_pb";
|
|
32
|
+
import { IamPermission } from "@stigmer/protos/ai/stigmer/iam/v1/enum_pb";
|
|
33
|
+
|
|
34
|
+
import type { Authorizer } from "../../../extensions/authorizer.js";
|
|
35
|
+
import type { CallerIdentity } from "../../../extensions/identity.js";
|
|
36
|
+
import { RESERVED_LABEL_PREFIX } from "../../../pipeline/apiresource-labels.js";
|
|
37
|
+
import {
|
|
38
|
+
internalError,
|
|
39
|
+
invalidArgumentError,
|
|
40
|
+
} from "../../../pipeline/errors.js";
|
|
41
|
+
import { generateSlug } from "../../../pipeline/steps/slug.js";
|
|
42
|
+
import type { ParsedOverlays } from "./documents.js";
|
|
43
|
+
|
|
44
|
+
/** The plugin the overlays describe, as the sanitiser needs it. */
|
|
45
|
+
export interface OverlaySubject {
|
|
46
|
+
readonly pluginName: string;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/** Refuses what an author may not say; returns when every document is clean. */
|
|
50
|
+
export async function sanitizeOverlays(
|
|
51
|
+
overlays: ParsedOverlays,
|
|
52
|
+
subject: OverlaySubject,
|
|
53
|
+
authorizer: Authorizer,
|
|
54
|
+
caller: CallerIdentity,
|
|
55
|
+
): Promise<void> {
|
|
56
|
+
const reservedKeys = new Map<string, string[]>();
|
|
57
|
+
|
|
58
|
+
const judge = (
|
|
59
|
+
path: string,
|
|
60
|
+
metadata: ApiResourceMetadata | undefined,
|
|
61
|
+
expectedName: string,
|
|
62
|
+
): void => {
|
|
63
|
+
if (metadata === undefined) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
if (metadata.id !== "") {
|
|
67
|
+
throw invalidArgumentError(
|
|
68
|
+
`overlay document '${path}' sets metadata.id; a plugin's resources take their ids from the server`,
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
if (metadata.name !== "" && metadata.name !== expectedName) {
|
|
72
|
+
throw invalidArgumentError(
|
|
73
|
+
`overlay document '${path}' names '${metadata.name}' but describes '${expectedName}'; leave metadata.name empty or make them agree`,
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
if (metadata.slug !== "" && metadata.slug !== generateSlug(expectedName)) {
|
|
77
|
+
throw invalidArgumentError(
|
|
78
|
+
`overlay document '${path}' sets slug '${metadata.slug}' but describes '${expectedName}'; leave metadata.slug empty or make them agree`,
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
const reserved = Object.keys(metadata.labels)
|
|
82
|
+
.filter((key) => key.startsWith(RESERVED_LABEL_PREFIX))
|
|
83
|
+
.sort();
|
|
84
|
+
if (reserved.length > 0) {
|
|
85
|
+
reservedKeys.set(path, reserved);
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
if (overlays.agent !== undefined) {
|
|
90
|
+
judge(
|
|
91
|
+
overlays.agent.path,
|
|
92
|
+
overlays.agent.resource.metadata,
|
|
93
|
+
subject.pluginName,
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
for (const document of overlays.mcpServers) {
|
|
97
|
+
judge(document.path, document.resource.metadata, document.server);
|
|
98
|
+
}
|
|
99
|
+
for (const document of overlays.workflows) {
|
|
100
|
+
judge(document.path, document.resource.metadata, document.name);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
if (reservedKeys.size === 0) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Lazy operator check — only an archive that actually carries a reserved
|
|
108
|
+
// key ever reaches the Authorizer, exactly as GuardReservedLabels does.
|
|
109
|
+
let decision;
|
|
110
|
+
try {
|
|
111
|
+
decision = await authorizer.authorize(caller, {
|
|
112
|
+
permission: IamPermission.can_write_reserved_labels,
|
|
113
|
+
resourceKind: ApiResourceKind.platform,
|
|
114
|
+
resourceId: "stigmer",
|
|
115
|
+
});
|
|
116
|
+
} catch (error) {
|
|
117
|
+
throw internalError(
|
|
118
|
+
error instanceof Error ? error : new Error(String(error)),
|
|
119
|
+
"reserved-label validation could not be completed",
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
switch (decision.kind) {
|
|
123
|
+
case "allow":
|
|
124
|
+
return;
|
|
125
|
+
case "deny":
|
|
126
|
+
case "not-found": {
|
|
127
|
+
const listed = [...reservedKeys.entries()]
|
|
128
|
+
.map(([path, keys]) => `${path}: ${keys.join(", ")}`)
|
|
129
|
+
.join("; ");
|
|
130
|
+
throw new ConnectError(
|
|
131
|
+
`Labels in the reserved '${RESERVED_LABEL_PREFIX}' namespace are platform-managed and ` +
|
|
132
|
+
`cannot be set by a plugin (${listed}). Remove them from the plugin's ai.stigmer/ documents.`,
|
|
133
|
+
Code.PermissionDenied,
|
|
134
|
+
);
|
|
135
|
+
}
|
|
136
|
+
case "unavailable":
|
|
137
|
+
throw internalError(
|
|
138
|
+
decision.cause,
|
|
139
|
+
"reserved-label validation could not be completed",
|
|
140
|
+
);
|
|
141
|
+
default: {
|
|
142
|
+
const exhaustive: never = decision;
|
|
143
|
+
throw internalError(
|
|
144
|
+
new Error(`unknown decision ${JSON.stringify(exhaustive)}`),
|
|
145
|
+
"reserved-label validation could not be completed",
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|