@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,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reading one archive entry under a real cap. Declared sizes are client
|
|
3
|
+
* claims, so every gate that opens an entry bounds the ACTUAL inflated
|
|
4
|
+
* output (`maxOutputLength`), verifies the CRC the way Go's checksumReader
|
|
5
|
+
* does on every read, and opens only the two methods the platform
|
|
6
|
+
* registers (stored, deflated). The skill gate did this for SKILL.md alone;
|
|
7
|
+
* a plugin reads many documents through the same discipline, so the read
|
|
8
|
+
* lives here and each kind keeps its own sentences: the outcome is a typed
|
|
9
|
+
* failure, never prose, because the skill's copy is byte-pinned wire
|
|
10
|
+
* contract and a plugin's names a different document.
|
|
11
|
+
*
|
|
12
|
+
* Proven by __tests__/inflate.test.ts and, through composition, by the
|
|
13
|
+
* skill gate's zip-gate.test.ts.
|
|
14
|
+
*/
|
|
15
|
+
import { inflateRawSync } from "node:zlib";
|
|
16
|
+
|
|
17
|
+
import { crc32 } from "@stigmer/zip-structure";
|
|
18
|
+
import type { ZipStructuralEntry } from "@stigmer/zip-structure";
|
|
19
|
+
|
|
20
|
+
/** ZIP compression methods the gate can open (Go registers the same two). */
|
|
21
|
+
const METHOD_STORED = 0;
|
|
22
|
+
const METHOD_DEFLATED = 8;
|
|
23
|
+
|
|
24
|
+
export type InflateFailureKind =
|
|
25
|
+
/** The inflated output passed `maxSize`. */
|
|
26
|
+
| "too-large"
|
|
27
|
+
/** zlib refused the payload; `detail` carries its message. */
|
|
28
|
+
| "read-failed"
|
|
29
|
+
/** A compression method neither Go nor this gate registers. */
|
|
30
|
+
| "unsupported-method"
|
|
31
|
+
/** The inflated bytes do not match the entry's CRC. */
|
|
32
|
+
| "checksum";
|
|
33
|
+
|
|
34
|
+
/** A typed refusal; the kind that called maps it to its pinned sentence. */
|
|
35
|
+
export class InflateError extends Error {
|
|
36
|
+
constructor(
|
|
37
|
+
readonly kind: InflateFailureKind,
|
|
38
|
+
readonly detail: string,
|
|
39
|
+
) {
|
|
40
|
+
super(`${kind}: ${detail}`);
|
|
41
|
+
this.name = "InflateError";
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Inflates one entry to at most `maxSize` bytes and verifies its CRC.
|
|
47
|
+
* The cap bounds the actual output, not the declaration.
|
|
48
|
+
*/
|
|
49
|
+
export function inflateEntry(
|
|
50
|
+
entry: ZipStructuralEntry,
|
|
51
|
+
maxSize: number,
|
|
52
|
+
): Uint8Array {
|
|
53
|
+
let content: Uint8Array;
|
|
54
|
+
switch (entry.compressionMethod) {
|
|
55
|
+
case METHOD_STORED:
|
|
56
|
+
content = entry.compressedData;
|
|
57
|
+
break;
|
|
58
|
+
case METHOD_DEFLATED:
|
|
59
|
+
try {
|
|
60
|
+
content = new Uint8Array(
|
|
61
|
+
inflateRawSync(entry.compressedData, {
|
|
62
|
+
maxOutputLength: maxSize + 1,
|
|
63
|
+
}),
|
|
64
|
+
);
|
|
65
|
+
} catch (error) {
|
|
66
|
+
if (isOutputLengthError(error)) {
|
|
67
|
+
throw new InflateError(
|
|
68
|
+
"too-large",
|
|
69
|
+
`output exceeds ${maxSize} bytes`,
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
throw new InflateError(
|
|
73
|
+
"read-failed",
|
|
74
|
+
error instanceof Error ? error.message : String(error),
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
break;
|
|
78
|
+
default:
|
|
79
|
+
// Go: File.Open returns ErrAlgorithm for methods without a registered
|
|
80
|
+
// decompressor; each kind pins the text via its own %w-shaped arm.
|
|
81
|
+
throw new InflateError(
|
|
82
|
+
"unsupported-method",
|
|
83
|
+
"zip: unsupported compression algorithm",
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (content.length > maxSize) {
|
|
88
|
+
throw new InflateError("too-large", `output exceeds ${maxSize} bytes`);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
if (crc32(content) !== entry.crc32) {
|
|
92
|
+
// Go's checksumReader: stdlib ErrChecksum via the read-error arm.
|
|
93
|
+
throw new InflateError("checksum", "zip: checksum error");
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return content;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/** node:zlib's maxOutputLength violation (the output-cap arm). */
|
|
100
|
+
function isOutputLengthError(error: unknown): boolean {
|
|
101
|
+
return (
|
|
102
|
+
error instanceof Error &&
|
|
103
|
+
(("code" in error &&
|
|
104
|
+
(error as { code?: string }).code === "ERR_BUFFER_TOO_LARGE") ||
|
|
105
|
+
error.message.includes("maxOutputLength"))
|
|
106
|
+
);
|
|
107
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The platform's archive limits — one home for every ZIP-bomb budget the
|
|
3
|
+
* server applies to a pushed archive, whichever kind it becomes. Skills
|
|
4
|
+
* carried these alone until plugins arrived (also pushed as a ZIP); the
|
|
5
|
+
* values stay byte-pinned to the retired Go gate's (pkg/domain/skill/storage/
|
|
6
|
+
* zip_extractor.go), because every sentence quoting them is wire contract
|
|
7
|
+
* and the transfer lane refuses over-limit declarations by them before a
|
|
8
|
+
* byte moves.
|
|
9
|
+
*
|
|
10
|
+
* A per-kind cap that is NOT an archive budget (the 1 MB SKILL.md
|
|
11
|
+
* extraction cap) stays with its kind: it bounds one document, not the
|
|
12
|
+
* archive.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* The compressed-archive ceiling. The platform's artifact size limit, not
|
|
17
|
+
* just an extraction guard: createArtifactUploadUrl enforces it before any
|
|
18
|
+
* bytes move and clients quote it in fail-loud size errors (#675).
|
|
19
|
+
*/
|
|
20
|
+
export const MAX_ZIP_SIZE = 100 * 1024 * 1024;
|
|
21
|
+
|
|
22
|
+
/** Total declared-uncompressed budget across all entries (ZIP-bomb guard). */
|
|
23
|
+
export const MAX_UNCOMPRESSED_SIZE = 500 * 1024 * 1024;
|
|
24
|
+
|
|
25
|
+
/** Per-file declared compression ratio ceiling (ZIP-bomb guard). */
|
|
26
|
+
export const MAX_COMPRESSION_RATIO = 100;
|
|
27
|
+
|
|
28
|
+
/** Entry-count ceiling. */
|
|
29
|
+
export const MAX_FILES = 10_000;
|
|
30
|
+
|
|
31
|
+
/** The budgets `validateArchiveStructure` applies; the platform's by default. */
|
|
32
|
+
export interface ArchiveLimits {
|
|
33
|
+
readonly maxFiles: number;
|
|
34
|
+
readonly maxUncompressedSize: number;
|
|
35
|
+
readonly maxCompressionRatio: number;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export const PLATFORM_ARCHIVE_LIMITS: ArchiveLimits = {
|
|
39
|
+
maxFiles: MAX_FILES,
|
|
40
|
+
maxUncompressedSize: MAX_UNCOMPRESSED_SIZE,
|
|
41
|
+
maxCompressionRatio: MAX_COMPRESSION_RATIO,
|
|
42
|
+
};
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Opening a pushed archive — the kind-agnostic half of the ZIP gate every
|
|
3
|
+
* archive-shaped push runs (skills, plugins). Two steps, both pure over the
|
|
4
|
+
* bytes: `openArchive` bounds the compressed size, hashes the bytes (the
|
|
5
|
+
* content-addressed version identity), parses the central directory and
|
|
6
|
+
* applies the safearchive prefilter; `validateArchiveStructure` walks the
|
|
7
|
+
* pre-filtered entries in the retired Go gate's exact order (empty
|
|
8
|
+
* archive, file count, then per entry the filename control-character rule,
|
|
9
|
+
* the running declared-uncompressed budget and the per-file ratio cap).
|
|
10
|
+
*
|
|
11
|
+
* What a KIND requires of the entries (a root SKILL.md, a plugin manifest)
|
|
12
|
+
* is not here: the walk accepts an `onEntry` observer so a kind tracks what
|
|
13
|
+
* it needs in the same pass and rules on it afterwards, which keeps the
|
|
14
|
+
* observable error order the skill gate's tests pin.
|
|
15
|
+
*
|
|
16
|
+
* Error text is wire-visible contract: the sentences below are the Go
|
|
17
|
+
* gate's verbatim, wrapped by each kind's push step into its own
|
|
18
|
+
* InvalidArgument arm. Only declared sizes are judged here; inflating an
|
|
19
|
+
* entry under a real cap is `inflate.ts`'s job.
|
|
20
|
+
*
|
|
21
|
+
* Proven by the skill gate's __tests__/zip-gate.test.ts (which composes
|
|
22
|
+
* these) and by __tests__/open.test.ts for the plugin-shaped path.
|
|
23
|
+
*/
|
|
24
|
+
import { createHash } from "node:crypto";
|
|
25
|
+
|
|
26
|
+
import { parseZipStructure } from "@stigmer/zip-structure";
|
|
27
|
+
import type { ZipStructuralEntry } from "@stigmer/zip-structure";
|
|
28
|
+
|
|
29
|
+
import type { ArchiveLimits } from "./limits.js";
|
|
30
|
+
import { MAX_ZIP_SIZE } from "./limits.js";
|
|
31
|
+
import { applyEntryPrefilter } from "./prefilter.js";
|
|
32
|
+
import type { PrefilteredEntry } from "./prefilter.js";
|
|
33
|
+
|
|
34
|
+
/** A parsed, pre-filtered archive with its content-addressed identity. */
|
|
35
|
+
export interface OpenedArchive {
|
|
36
|
+
/** SHA-256 hex of the archive bytes. */
|
|
37
|
+
readonly hash: string;
|
|
38
|
+
/** The entries a kind may read, names sanitised, shadows dropped. */
|
|
39
|
+
readonly entries: readonly PrefilteredEntry[];
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Bounds, hashes, parses and pre-filters. Throws plain Errors with
|
|
44
|
+
* byte-pinned messages; the caller owns the gRPC code.
|
|
45
|
+
*/
|
|
46
|
+
export function openArchive(
|
|
47
|
+
bytes: Uint8Array,
|
|
48
|
+
maxZipSize: number = MAX_ZIP_SIZE,
|
|
49
|
+
): OpenedArchive {
|
|
50
|
+
if (bytes.length > maxZipSize) {
|
|
51
|
+
throw new Error(
|
|
52
|
+
`ZIP file too large: ${bytes.length} bytes (max: ${maxZipSize})`,
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const hash = calculateHash(bytes);
|
|
57
|
+
|
|
58
|
+
let entries: readonly ZipStructuralEntry[];
|
|
59
|
+
try {
|
|
60
|
+
entries = parseZipStructure(bytes);
|
|
61
|
+
} catch {
|
|
62
|
+
// Go's zip.NewReader surfaces stdlib ErrFormat here; its text is what
|
|
63
|
+
// clients see via the %w chain, so it is pinned verbatim.
|
|
64
|
+
throw new Error("invalid ZIP file: zip: not a valid zip file");
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// safearchive MaximumSecurityMode rewrites the entry list before any
|
|
68
|
+
// validation sees it — sanitized names, shadowed/special/8.3 entries
|
|
69
|
+
// dropped.
|
|
70
|
+
return { hash, entries: applyEntryPrefilter(entries) };
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* The structural walk: empty archive, file-count cap, then per entry the
|
|
75
|
+
* control-character rule, the running declared-uncompressed budget
|
|
76
|
+
* (fail-fast) and the per-file compression-ratio cap. `onEntry` sees each
|
|
77
|
+
* sanitised name in order so a kind can track its own requirements.
|
|
78
|
+
*/
|
|
79
|
+
export function validateArchiveStructure(
|
|
80
|
+
entries: readonly PrefilteredEntry[],
|
|
81
|
+
limits: ArchiveLimits,
|
|
82
|
+
onEntry?: (name: string) => void,
|
|
83
|
+
): void {
|
|
84
|
+
if (entries.length === 0) {
|
|
85
|
+
throw new Error("ZIP file is empty");
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (entries.length > limits.maxFiles) {
|
|
89
|
+
throw new Error(
|
|
90
|
+
`too many files in ZIP: ${entries.length} (max: ${limits.maxFiles})`,
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
let totalUncompressedSize = 0;
|
|
95
|
+
|
|
96
|
+
for (const { name, entry } of entries) {
|
|
97
|
+
onEntry?.(name);
|
|
98
|
+
|
|
99
|
+
// Reject null bytes and control characters in entry names (code
|
|
100
|
+
// points, not UTF-16 units — Go ranges over runes).
|
|
101
|
+
for (const ch of name) {
|
|
102
|
+
const codePoint = ch.codePointAt(0)!;
|
|
103
|
+
if (codePoint < 32 || codePoint === 127) {
|
|
104
|
+
throw new Error(`invalid character in filename: ${name}`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Track the declared uncompressed total (fail fast once exceeded).
|
|
109
|
+
totalUncompressedSize += entry.uncompressedSize;
|
|
110
|
+
if (totalUncompressedSize > limits.maxUncompressedSize) {
|
|
111
|
+
throw new Error(
|
|
112
|
+
`total uncompressed size too large: ${totalUncompressedSize} bytes (max: ${limits.maxUncompressedSize})`,
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Per-file compression ratio (ZIP-bomb guard); integer division as Go.
|
|
117
|
+
if (entry.compressedSize > 0) {
|
|
118
|
+
const ratio = Math.floor(entry.uncompressedSize / entry.compressedSize);
|
|
119
|
+
if (ratio > limits.maxCompressionRatio) {
|
|
120
|
+
throw new Error(
|
|
121
|
+
`suspicious compression ratio in ${name}: ${ratio}:1 (max: ${limits.maxCompressionRatio}:1)`,
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/** SHA-256 hex of the archive bytes (Go CalculateHash). */
|
|
129
|
+
export function calculateHash(data: Uint8Array): string {
|
|
130
|
+
return createHash("sha256").update(data).digest("hex");
|
|
131
|
+
}
|
|
@@ -28,6 +28,11 @@
|
|
|
28
28
|
* bits; FAT/NTFS/VFAT creators carry MSDOS bits that can never encode a
|
|
29
29
|
* symlink or special file; unknown creators decode to a regular file.
|
|
30
30
|
*
|
|
31
|
+
* Shared by every archive gate the server runs (skills, plugins): the
|
|
32
|
+
* filter describes what an archive IS before any kind reads it, so it
|
|
33
|
+
* lives with the archive plumbing rather than with the first kind that
|
|
34
|
+
* needed it.
|
|
35
|
+
*
|
|
31
36
|
* Proven by __tests__/prefilter.test.ts (byte-crafted fixtures per DD-001).
|
|
32
37
|
*/
|
|
33
38
|
import type { ZipStructuralEntry } from "@stigmer/zip-structure";
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Writing a deterministic archive. The server writes ZIPs for one reason: a
|
|
3
|
+
* plugin's skills are pushed through the skill pipeline as archives of
|
|
4
|
+
* their own, and a skill's version IS the SHA-256 of its archive bytes, so
|
|
5
|
+
* the same files must always produce the same bytes or every re-install
|
|
6
|
+
* would mint a new skill version out of nothing. Determinism comes from
|
|
7
|
+
* three choices, each mirrored from the CLI's skill packager
|
|
8
|
+
* (client-apps/cli/src/resources/skill.ts): entries sorted by path, one
|
|
9
|
+
* fixed DOS-epoch mtime on every entry (fflate would otherwise stamp the
|
|
10
|
+
* wall clock), and one fixed deflate level.
|
|
11
|
+
*
|
|
12
|
+
* fflate is the ratified server dependency for ZIP work (see
|
|
13
|
+
* domain/agentexecution/artifacts.ts); this module is its one write site.
|
|
14
|
+
*
|
|
15
|
+
* Proven by __tests__/write.test.ts: two writes of the same files are
|
|
16
|
+
* byte-equal, entry order does not matter, and the result round-trips
|
|
17
|
+
* through the server's own reader.
|
|
18
|
+
*/
|
|
19
|
+
import { zipSync } from "fflate";
|
|
20
|
+
|
|
21
|
+
/** One file to write: a plugin-relative POSIX path and its bytes. */
|
|
22
|
+
export interface ArchiveFile {
|
|
23
|
+
readonly path: string;
|
|
24
|
+
readonly bytes: Uint8Array;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* fflate stamps the archive's creation time into every entry when no mtime
|
|
29
|
+
* is given; pinning the DOS epoch removes the one source of byte-level
|
|
30
|
+
* variance. Local-field construction is deliberate: DOS timestamps are
|
|
31
|
+
* local time, and this instant is representable in every zone.
|
|
32
|
+
*/
|
|
33
|
+
const DETERMINISTIC_ZIP_MTIME = new Date(1980, 0, 1);
|
|
34
|
+
|
|
35
|
+
/** The CLI's level; changing it would move every digest in the field. */
|
|
36
|
+
const DEFLATE_LEVEL = 6;
|
|
37
|
+
|
|
38
|
+
/** Writes `files` as one deflated archive whose bytes depend on the files alone. */
|
|
39
|
+
export function writeArchive(files: ReadonlyArray<ArchiveFile>): Uint8Array {
|
|
40
|
+
const sorted = [...files].sort((a, b) =>
|
|
41
|
+
a.path < b.path ? -1 : a.path > b.path ? 1 : 0,
|
|
42
|
+
);
|
|
43
|
+
const tree: Record<string, Uint8Array> = {};
|
|
44
|
+
for (const file of sorted) {
|
|
45
|
+
if (file.path in tree) {
|
|
46
|
+
throw new Error(`archive path '${file.path}' listed twice`);
|
|
47
|
+
}
|
|
48
|
+
tree[file.path] = file.bytes;
|
|
49
|
+
}
|
|
50
|
+
return zipSync(tree, {
|
|
51
|
+
level: DEFLATE_LEVEL,
|
|
52
|
+
mtime: DETERMINISTIC_ZIP_MTIME,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# authorization/ — the built-in authorizer
|
|
2
|
+
|
|
3
|
+
Open source's own `Authorizer`, organization directory, schedule fire caller and
|
|
4
|
+
`ListReadScope`, composed when a server runs under an authentication posture and
|
|
5
|
+
no unit registers its own — the **built-in posture** (`posture.ts`; the other
|
|
6
|
+
two are the trusted-local laptop's permissive default and a unit's own
|
|
7
|
+
Authorizer). It is not a domain: it drives ports the registry declares
|
|
8
|
+
(`extensions/authorizer.ts`, `extensions/organization-directory.ts`,
|
|
9
|
+
`extensions/schedule-fire-caller.ts`, `extensions/list-read-scope.ts`) by
|
|
10
|
+
reading aggregates it does not own — resources through the generic `Store`,
|
|
11
|
+
accounts through the `IdentityAccountStore` port, roles through the
|
|
12
|
+
`IamPolicyStore` port — and writes nothing.
|
|
13
|
+
|
|
14
|
+
The idea, once: in the cloud, authorization is the OpenFGA model evaluated over
|
|
15
|
+
stored tuples, and every tuple is derived from a row by
|
|
16
|
+
`kind_meta.authorization` except the one that is a fact, the IamPolicy row. So
|
|
17
|
+
open source evaluates the same model over the same tuples, derived from the row
|
|
18
|
+
when a check asks instead of stored. One meaning of authorization in both
|
|
19
|
+
editions; the cloud stores what open source computes.
|
|
20
|
+
|
|
21
|
+
## Parts
|
|
22
|
+
|
|
23
|
+
- `model/rewrite.ts` — the four relation-rewrite forms the 27 `.fga` files use
|
|
24
|
+
(`this` with its type restrictions, `computed`, `from`, `union`), the
|
|
25
|
+
builders, and `declareKind`, which refuses a transcript that cannot be right
|
|
26
|
+
at module load.
|
|
27
|
+
- `model/<kind>.ts` — one transcript per open-source kind (twenty-three), the
|
|
28
|
+
`.fga` file's relations in the file's order, its path in the header.
|
|
29
|
+
`model/index.ts` registers them in `fga.mod` order and answers by kind or by
|
|
30
|
+
FGA type name. Two relations no row carries as a `kind_meta` fact have a
|
|
31
|
+
`derived` rule beside their transcript: `default_of` on the two instance kinds
|
|
32
|
+
(`model/default-of.ts`, from the blueprint's `status.default_instance_id`) and
|
|
33
|
+
`execution_viewer` on the workflow instance (from
|
|
34
|
+
`spec.execution_visibility`).
|
|
35
|
+
- `tuples.ts` — the tuple vocabulary (object, relation, subject; the string
|
|
36
|
+
notation), the `Person` type (the caller as the model sees them: account id
|
|
37
|
+
plus the aliases a creator stamp may carry), `CheckContext` (the
|
|
38
|
+
`allow_public` parameter: `allow: true` on a point check, `false` in a listing
|
|
39
|
+
— the cloud's own posture).
|
|
40
|
+
- `person.ts` — the one construction of a `Person`: `resolvePerson` reads the
|
|
41
|
+
caller's account through the port the way whoAmI does, `personFor` builds the
|
|
42
|
+
aliases (the account id and the issuer subject; an email is nobody's) and
|
|
43
|
+
refuses an identity that names no person. Every driver resolves the caller
|
|
44
|
+
here.
|
|
45
|
+
- `evaluator.ts` — OpenFGA's check over a model and a tuple source: type
|
|
46
|
+
restrictions enforced on direct tuples (model drift fails closed), a memo per
|
|
47
|
+
(object, relation), OpenFGA's depth bound, cycles and undeclared targets as
|
|
48
|
+
faults, never silent denials.
|
|
49
|
+
- `facts.ts` — `RowFacts`, what a row carries that its tuples derive from: the
|
|
50
|
+
seam's `RowAuthorizationFacts` with the kind beside them. Two producers, one
|
|
51
|
+
resolver: a loaded row (`rowFactsOf`) and a list candidate (`rowFactsOfEntry`
|
|
52
|
+
over the `ListEntryMeta` the lanes' helper builds) both read through the
|
|
53
|
+
pipeline leaf `pipeline/steps/authorization-facts.ts`, the read-time twin of
|
|
54
|
+
the tuple lifecycle's create-time resolution, pinned equal to it.
|
|
55
|
+
- `derived-tuples.ts` — the derivation (the cloud driver's shapes, from the
|
|
56
|
+
facts) and the source that joins it with the person's IamPolicy rows, read
|
|
57
|
+
once per source. The two edition-specific facts live here: the organization's
|
|
58
|
+
owner is a row, and a stamp that names no person is no tuple. A source may be
|
|
59
|
+
seeded with candidates' facts (the list scope), so a seeded object's tuples
|
|
60
|
+
derive without a read of its row; a `derived` rule still reads the row it
|
|
61
|
+
needs.
|
|
62
|
+
- `store-test-kit.ts` — runs an OpenFGA store test (`.fga.yaml`) against the
|
|
63
|
+
evaluator, vitest-free, exported from the barrel. Open source runs it over
|
|
64
|
+
pinned copies of the cloud's own model tests (`__tests__/fixtures/fga/`, a
|
|
65
|
+
byte-exact mirror of the cloud's `fga/tests/`); the cloud runs it over the
|
|
66
|
+
live files at the re-pin. What it does not run it reports in three reasons: a
|
|
67
|
+
target kind the model does not declare, a `list_objects` assertion, and an
|
|
68
|
+
assertion whose walk read a grant through a type the model does not declare
|
|
69
|
+
(the cloud's platform tenancy, `identity_provider#platform_user`).
|
|
70
|
+
|
|
71
|
+
- `authorizer.ts` — the `Authorizer` driver, arm for arm the cloud's
|
|
72
|
+
(`stigmer-cloud src/authorizer/fga-authorizer.ts`): the four pre-check denials
|
|
73
|
+
with the Java copy; a kind this edition does not serve denied (so nobody sets
|
|
74
|
+
public visibility on a self-host); the target loaded once through the source;
|
|
75
|
+
`not-found` for a missing row except on the kinds the cloud never probes
|
|
76
|
+
(`NOT_FOUND_EXEMPT_KINDS`: `identity_account`, `iam_policy` — account ids
|
|
77
|
+
cannot be enumerated); the model's answer with an empty reason on a denial so
|
|
78
|
+
the annotation's copy wins; every fault `unavailable`, never a denial and
|
|
79
|
+
never a throw.
|
|
80
|
+
- `organization-directory.ts` — `findMyOrganizations` as the cloud answers it
|
|
81
|
+
(`listObjectIds(can_view, organization)`): the organizations the person's rows
|
|
82
|
+
name, kept when `can_view` holds; the `internal` class sees all (the
|
|
83
|
+
in-process authorization skip); enumeration refused.
|
|
84
|
+
- `schedule-fire-caller.ts` — a fire acts as the schedule's creator, resolved
|
|
85
|
+
from the row's stamp as an account id or as the 3.14.x raw subject; a stamp
|
|
86
|
+
that names no person is the seam's deterministic refusal, which the RunStarter
|
|
87
|
+
counts against the schedule instead of retrying forever.
|
|
88
|
+
- `list-read-scope.ts` — the `ListReadScope` driver, the cloud's twin
|
|
89
|
+
(`stigmer-cloud src/iam/list-read-scope.ts`): every candidate a list lane
|
|
90
|
+
offers is answered by `can_view` under the listing context (`allow: false`,
|
|
91
|
+
the public wildcard suppressed) — one evaluator walk per candidate over one
|
|
92
|
+
source seeded with the candidates' facts, so no candidate row is read twice
|
|
93
|
+
and a parent hop reads each distinct parent once; the enumeration verb
|
|
94
|
+
(search, recent activity, the two execution summaries — the console library
|
|
95
|
+
rides it) scans the kind and evaluates the same way, a row that does not
|
|
96
|
+
decode skipped; the `internal` class keeps everything (the in-process skip); a
|
|
97
|
+
fault throws and is never an empty answer; an undeclared kind is a consumer
|
|
98
|
+
bug, loud.
|
|
99
|
+
- `posture.ts` — the three postures, named once for the composition root and the
|
|
100
|
+
boot log.
|
|
101
|
+
|
|
102
|
+
## Proof
|
|
103
|
+
|
|
104
|
+
`__tests__/store-tests.test.ts` is the proof that this evaluator answers the
|
|
105
|
+
cloud's model the cloud's way: every `checkRelation` assertion of all twenty
|
|
106
|
+
documents on a declared kind, in the documents' own words, with what is not run
|
|
107
|
+
pinned as a named list. `__tests__/facts.test.ts` pins that the derivation reads
|
|
108
|
+
a row to the same links and shapes the tuple lifecycle writes from, for every
|
|
109
|
+
kind. `model/__tests__/registry.test.ts` pins the declared set to the
|
|
110
|
+
open-source tier and each kind's wire permissions to its file;
|
|
111
|
+
`__tests__/wire-permissions.test.ts` pins that every static `(kind, permission)`
|
|
112
|
+
a served RPC asks about is a declared relation. The rest pin the machinery:
|
|
113
|
+
alias matching, the wildcard's condition, the memo, the bounds, the source and
|
|
114
|
+
the two derived rules on both store drivers. The four drivers are pinned arm by
|
|
115
|
+
arm on both store drivers (`__tests__/authorizer.test.ts`,
|
|
116
|
+
`organization-directory.test.ts`, `schedule-fire-caller.test.ts`,
|
|
117
|
+
`list-read-scope.test.ts` — the adversarial cells first: the outsider, the
|
|
118
|
+
viewer rung, the admin who does not read members' conversations, the orphaned
|
|
119
|
+
execution, the memory with no subject), the posture at the wire over three real
|
|
120
|
+
boots (`extensions/__tests__/built-in-authorization-composed.test.ts`, the list
|
|
121
|
+
lanes included, and the two-boot proof that the sole person's lists are
|
|
122
|
+
byte-identical with and without the scope), and the scope's cost is measured
|
|
123
|
+
rather than assumed (`list-read-scope.measure.test.ts`, gated on
|
|
124
|
+
`AUTHORIZATION_MEASURE=1`).
|