@stigmer/server 3.15.3-dev.20260914121148 → 3.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/archive/content-store.d.ts +35 -0
- package/dist/archive/content-store.d.ts.map +1 -0
- package/dist/archive/content-store.js +98 -0
- package/dist/archive/content-store.js.map +1 -0
- package/dist/archive/inflate.d.ts +22 -0
- package/dist/archive/inflate.d.ts.map +1 -0
- package/dist/archive/inflate.js +75 -0
- package/dist/archive/inflate.js.map +1 -0
- package/dist/archive/limits.d.ts +33 -0
- package/dist/archive/limits.d.ts.map +1 -0
- package/dist/archive/limits.js +31 -0
- package/dist/archive/limits.js.map +1 -0
- package/dist/archive/open.d.ts +24 -0
- package/dist/archive/open.d.ts.map +1 -0
- package/dist/archive/open.js +93 -0
- package/dist/archive/open.js.map +1 -0
- package/dist/{domain/skill/storage → archive}/prefilter.d.ts +5 -0
- package/dist/archive/prefilter.d.ts.map +1 -0
- package/dist/archive/prefilter.js.map +1 -0
- package/dist/archive/write.d.ts +8 -0
- package/dist/archive/write.d.ts.map +1 -0
- package/dist/archive/write.js +44 -0
- package/dist/archive/write.js.map +1 -0
- package/dist/authorization/authorizer.d.ts +98 -0
- package/dist/authorization/authorizer.d.ts.map +1 -0
- package/dist/authorization/authorizer.js +156 -0
- package/dist/authorization/authorizer.js.map +1 -0
- package/dist/authorization/derived-tuples.d.ts +42 -0
- package/dist/authorization/derived-tuples.d.ts.map +1 -0
- package/dist/authorization/derived-tuples.js +240 -0
- package/dist/authorization/derived-tuples.js.map +1 -0
- package/dist/authorization/evaluator.d.ts +66 -0
- package/dist/authorization/evaluator.d.ts.map +1 -0
- package/dist/authorization/evaluator.js +153 -0
- package/dist/authorization/evaluator.js.map +1 -0
- package/dist/authorization/facts.d.ts +29 -0
- package/dist/authorization/facts.d.ts.map +1 -0
- package/dist/authorization/facts.js +17 -0
- package/dist/authorization/facts.js.map +1 -0
- package/dist/authorization/lane-admission.d.ts +50 -0
- package/dist/authorization/lane-admission.d.ts.map +1 -0
- package/dist/authorization/lane-admission.js +13 -0
- package/dist/authorization/lane-admission.js.map +1 -0
- package/dist/authorization/list-read-scope.d.ts +18 -0
- package/dist/authorization/list-read-scope.d.ts.map +1 -0
- package/dist/authorization/list-read-scope.js +155 -0
- package/dist/authorization/list-read-scope.js.map +1 -0
- package/dist/authorization/model/agent.d.ts +2 -0
- package/dist/authorization/model/agent.d.ts.map +1 -0
- package/dist/authorization/model/agent.js +42 -0
- package/dist/authorization/model/agent.js.map +1 -0
- package/dist/authorization/model/agent_channel.d.ts +2 -0
- package/dist/authorization/model/agent_channel.d.ts.map +1 -0
- package/dist/authorization/model/agent_channel.js +38 -0
- package/dist/authorization/model/agent_channel.js.map +1 -0
- package/dist/authorization/model/agent_execution.d.ts +2 -0
- package/dist/authorization/model/agent_execution.d.ts.map +1 -0
- package/dist/authorization/model/agent_execution.js +25 -0
- package/dist/authorization/model/agent_execution.js.map +1 -0
- package/dist/authorization/model/agent_instance.d.ts +2 -0
- package/dist/authorization/model/agent_instance.d.ts.map +1 -0
- package/dist/authorization/model/agent_instance.js +47 -0
- package/dist/authorization/model/agent_instance.js.map +1 -0
- package/dist/authorization/model/agent_share.d.ts +2 -0
- package/dist/authorization/model/agent_share.d.ts.map +1 -0
- package/dist/authorization/model/agent_share.js +29 -0
- package/dist/authorization/model/agent_share.js.map +1 -0
- package/dist/authorization/model/api_key.d.ts +2 -0
- package/dist/authorization/model/api_key.d.ts.map +1 -0
- package/dist/authorization/model/api_key.js +27 -0
- package/dist/authorization/model/api_key.js.map +1 -0
- package/dist/authorization/model/artifact.d.ts +2 -0
- package/dist/authorization/model/artifact.d.ts.map +1 -0
- package/dist/authorization/model/artifact.js +27 -0
- package/dist/authorization/model/artifact.js.map +1 -0
- package/dist/authorization/model/channel_app.d.ts +2 -0
- package/dist/authorization/model/channel_app.d.ts.map +1 -0
- package/dist/authorization/model/channel_app.js +28 -0
- package/dist/authorization/model/channel_app.js.map +1 -0
- package/dist/authorization/model/default-of.d.ts +38 -0
- package/dist/authorization/model/default-of.d.ts.map +1 -0
- package/dist/authorization/model/default-of.js +39 -0
- package/dist/authorization/model/default-of.js.map +1 -0
- package/dist/authorization/model/environment.d.ts +2 -0
- package/dist/authorization/model/environment.d.ts.map +1 -0
- package/dist/authorization/model/environment.js +33 -0
- package/dist/authorization/model/environment.js.map +1 -0
- package/dist/authorization/model/execution_context.d.ts +2 -0
- package/dist/authorization/model/execution_context.d.ts.map +1 -0
- package/dist/authorization/model/execution_context.js +19 -0
- package/dist/authorization/model/execution_context.js.map +1 -0
- package/dist/authorization/model/iam_policy.d.ts +2 -0
- package/dist/authorization/model/iam_policy.d.ts.map +1 -0
- package/dist/authorization/model/iam_policy.js +31 -0
- package/dist/authorization/model/iam_policy.js.map +1 -0
- package/dist/authorization/model/identity_account.d.ts +2 -0
- package/dist/authorization/model/identity_account.d.ts.map +1 -0
- package/dist/authorization/model/identity_account.js +25 -0
- package/dist/authorization/model/identity_account.js.map +1 -0
- package/dist/authorization/model/index.d.ts +36 -0
- package/dist/authorization/model/index.d.ts.map +1 -0
- package/dist/authorization/model/index.js +72 -0
- package/dist/authorization/model/index.js.map +1 -0
- package/dist/authorization/model/mcp_server.d.ts +2 -0
- package/dist/authorization/model/mcp_server.d.ts.map +1 -0
- package/dist/authorization/model/mcp_server.js +37 -0
- package/dist/authorization/model/mcp_server.js.map +1 -0
- package/dist/authorization/model/memory.d.ts +2 -0
- package/dist/authorization/model/memory.d.ts.map +1 -0
- package/dist/authorization/model/memory.js +26 -0
- package/dist/authorization/model/memory.js.map +1 -0
- package/dist/authorization/model/oauth_app.d.ts +2 -0
- package/dist/authorization/model/oauth_app.d.ts.map +1 -0
- package/dist/authorization/model/oauth_app.js +30 -0
- package/dist/authorization/model/oauth_app.js.map +1 -0
- package/dist/authorization/model/organization.d.ts +2 -0
- package/dist/authorization/model/organization.d.ts.map +1 -0
- package/dist/authorization/model/organization.js +54 -0
- package/dist/authorization/model/organization.js.map +1 -0
- package/dist/authorization/model/plugin.d.ts +2 -0
- package/dist/authorization/model/plugin.d.ts.map +1 -0
- package/dist/authorization/model/plugin.js +44 -0
- package/dist/authorization/model/plugin.js.map +1 -0
- package/dist/authorization/model/project.d.ts +2 -0
- package/dist/authorization/model/project.d.ts.map +1 -0
- package/dist/authorization/model/project.js +32 -0
- package/dist/authorization/model/project.js.map +1 -0
- package/dist/authorization/model/rewrite.d.ts +127 -0
- package/dist/authorization/model/rewrite.d.ts.map +1 -0
- package/dist/authorization/model/rewrite.js +82 -0
- package/dist/authorization/model/rewrite.js.map +1 -0
- package/dist/authorization/model/schedule.d.ts +2 -0
- package/dist/authorization/model/schedule.d.ts.map +1 -0
- package/dist/authorization/model/schedule.js +29 -0
- package/dist/authorization/model/schedule.js.map +1 -0
- package/dist/authorization/model/session.d.ts +2 -0
- package/dist/authorization/model/session.d.ts.map +1 -0
- package/dist/authorization/model/session.js +38 -0
- package/dist/authorization/model/session.js.map +1 -0
- package/dist/authorization/model/skill.d.ts +2 -0
- package/dist/authorization/model/skill.d.ts.map +1 -0
- package/dist/authorization/model/skill.js +38 -0
- package/dist/authorization/model/skill.js.map +1 -0
- package/dist/authorization/model/workflow.d.ts +2 -0
- package/dist/authorization/model/workflow.d.ts.map +1 -0
- package/dist/authorization/model/workflow.js +38 -0
- package/dist/authorization/model/workflow.js.map +1 -0
- package/dist/authorization/model/workflow_execution.d.ts +2 -0
- package/dist/authorization/model/workflow_execution.d.ts.map +1 -0
- package/dist/authorization/model/workflow_execution.js +32 -0
- package/dist/authorization/model/workflow_execution.js.map +1 -0
- package/dist/authorization/model/workflow_instance.d.ts +2 -0
- package/dist/authorization/model/workflow_instance.d.ts.map +1 -0
- package/dist/authorization/model/workflow_instance.js +92 -0
- package/dist/authorization/model/workflow_instance.js.map +1 -0
- package/dist/authorization/organization-directory.d.ts +13 -0
- package/dist/authorization/organization-directory.d.ts.map +1 -0
- package/dist/authorization/organization-directory.js +83 -0
- package/dist/authorization/organization-directory.js.map +1 -0
- package/dist/authorization/person.d.ts +42 -0
- package/dist/authorization/person.d.ts.map +1 -0
- package/dist/authorization/person.js +19 -0
- package/dist/authorization/person.js.map +1 -0
- package/dist/authorization/posture.d.ts +38 -0
- package/dist/authorization/posture.d.ts.map +1 -0
- package/dist/authorization/posture.js +7 -0
- package/dist/authorization/posture.js.map +1 -0
- package/dist/authorization/schedule-fire-caller.d.ts +12 -0
- package/dist/authorization/schedule-fire-caller.d.ts.map +1 -0
- package/dist/authorization/schedule-fire-caller.js +67 -0
- package/dist/authorization/schedule-fire-caller.js.map +1 -0
- package/dist/authorization/store-test-kit.d.ts +68 -0
- package/dist/authorization/store-test-kit.d.ts.map +1 -0
- package/dist/authorization/store-test-kit.js +311 -0
- package/dist/authorization/store-test-kit.js.map +1 -0
- package/dist/authorization/tuples.d.ts +115 -0
- package/dist/authorization/tuples.d.ts.map +1 -0
- package/dist/authorization/tuples.js +83 -0
- package/dist/authorization/tuples.js.map +1 -0
- package/dist/boot/compose.d.ts.map +1 -1
- package/dist/boot/compose.js +220 -43
- package/dist/boot/compose.js.map +1 -1
- package/dist/boot/inprocess.d.ts +12 -0
- package/dist/boot/inprocess.d.ts.map +1 -1
- package/dist/boot/inprocess.js +68 -21
- package/dist/boot/inprocess.js.map +1 -1
- package/dist/domain/agent/controller.d.ts.map +1 -1
- package/dist/domain/agent/controller.js +9 -0
- package/dist/domain/agent/controller.js.map +1 -1
- package/dist/domain/executioncontext/resolve-values-for-caller.d.ts +33 -14
- package/dist/domain/executioncontext/resolve-values-for-caller.d.ts.map +1 -1
- package/dist/domain/executioncontext/resolve-values-for-caller.js +32 -8
- package/dist/domain/executioncontext/resolve-values-for-caller.js.map +1 -1
- package/dist/domain/iampolicy/constants.d.ts +11 -0
- package/dist/domain/iampolicy/constants.d.ts.map +1 -1
- package/dist/domain/iampolicy/constants.js +11 -0
- package/dist/domain/iampolicy/constants.js.map +1 -1
- package/dist/domain/iampolicy/membership.d.ts +72 -1
- package/dist/domain/iampolicy/membership.d.ts.map +1 -1
- package/dist/domain/iampolicy/membership.js +141 -56
- package/dist/domain/iampolicy/membership.js.map +1 -1
- package/dist/domain/identityaccount/actor.d.ts +41 -0
- package/dist/domain/identityaccount/actor.d.ts.map +1 -0
- package/dist/domain/identityaccount/actor.js +34 -0
- package/dist/domain/identityaccount/actor.js.map +1 -0
- package/dist/domain/identityaccount/resolve.d.ts +19 -0
- package/dist/domain/identityaccount/resolve.d.ts.map +1 -1
- package/dist/domain/identityaccount/resolve.js +12 -0
- package/dist/domain/identityaccount/resolve.js.map +1 -1
- package/dist/domain/mcpserver/connect-execution-id.d.ts +5 -0
- package/dist/domain/mcpserver/connect-execution-id.d.ts.map +1 -0
- package/dist/domain/mcpserver/connect-execution-id.js +32 -0
- package/dist/domain/mcpserver/connect-execution-id.js.map +1 -0
- package/dist/domain/mcpserver/connect.d.ts +28 -2
- package/dist/domain/mcpserver/connect.d.ts.map +1 -1
- package/dist/domain/mcpserver/connect.js +27 -7
- package/dist/domain/mcpserver/connect.js.map +1 -1
- package/dist/domain/mcpserver/controller.d.ts.map +1 -1
- package/dist/domain/mcpserver/controller.js +9 -0
- package/dist/domain/mcpserver/controller.js.map +1 -1
- package/dist/domain/mcpserver/engine.d.ts +9 -3
- package/dist/domain/mcpserver/engine.d.ts.map +1 -1
- package/dist/domain/mcpserver/engine.js.map +1 -1
- package/dist/domain/mcpserver/start-connect.js +1 -1
- package/dist/domain/mcpserver/start-connect.js.map +1 -1
- package/dist/domain/platform/controller.d.ts +24 -11
- package/dist/domain/platform/controller.d.ts.map +1 -1
- package/dist/domain/platform/controller.js.map +1 -1
- package/dist/domain/plugin/archive.d.ts +37 -0
- package/dist/domain/plugin/archive.d.ts.map +1 -0
- package/dist/domain/plugin/archive.js +50 -0
- package/dist/domain/plugin/archive.js.map +1 -0
- package/dist/domain/plugin/constants.d.ts +38 -0
- package/dist/domain/plugin/constants.d.ts.map +1 -0
- package/dist/domain/plugin/constants.js +46 -0
- package/dist/domain/plugin/constants.js.map +1 -0
- package/dist/domain/plugin/controller.d.ts +25 -0
- package/dist/domain/plugin/controller.d.ts.map +1 -0
- package/dist/domain/plugin/controller.js +493 -0
- package/dist/domain/plugin/controller.js.map +1 -0
- package/dist/domain/plugin/materialize/agent.d.ts +13 -0
- package/dist/domain/plugin/materialize/agent.d.ts.map +1 -0
- package/dist/domain/plugin/materialize/agent.js +128 -0
- package/dist/domain/plugin/materialize/agent.js.map +1 -0
- package/dist/domain/plugin/materialize/default-agent-instructions.d.ts +22 -0
- package/dist/domain/plugin/materialize/default-agent-instructions.d.ts.map +1 -0
- package/dist/domain/plugin/materialize/default-agent-instructions.js +31 -0
- package/dist/domain/plugin/materialize/default-agent-instructions.js.map +1 -0
- package/dist/domain/plugin/materialize/identity.d.ts +28 -0
- package/dist/domain/plugin/materialize/identity.d.ts.map +1 -0
- package/dist/domain/plugin/materialize/identity.js +40 -0
- package/dist/domain/plugin/materialize/identity.js.map +1 -0
- package/dist/domain/plugin/materialize/mcp-servers.d.ts +15 -0
- package/dist/domain/plugin/materialize/mcp-servers.d.ts.map +1 -0
- package/dist/domain/plugin/materialize/mcp-servers.js +131 -0
- package/dist/domain/plugin/materialize/mcp-servers.js.map +1 -0
- package/dist/domain/plugin/materialize/plan.d.ts +24 -0
- package/dist/domain/plugin/materialize/plan.d.ts.map +1 -0
- package/dist/domain/plugin/materialize/plan.js +77 -0
- package/dist/domain/plugin/materialize/plan.js.map +1 -0
- package/dist/domain/plugin/materialize/ports.d.ts +42 -0
- package/dist/domain/plugin/materialize/ports.d.ts.map +1 -0
- package/dist/domain/plugin/materialize/ports.js +2 -0
- package/dist/domain/plugin/materialize/ports.js.map +1 -0
- package/dist/domain/plugin/materialize/skills.d.ts +12 -0
- package/dist/domain/plugin/materialize/skills.d.ts.map +1 -0
- package/dist/domain/plugin/materialize/skills.js +44 -0
- package/dist/domain/plugin/materialize/skills.js.map +1 -0
- package/dist/domain/plugin/materialize/workflows.d.ts +15 -0
- package/dist/domain/plugin/materialize/workflows.d.ts.map +1 -0
- package/dist/domain/plugin/materialize/workflows.js +31 -0
- package/dist/domain/plugin/materialize/workflows.js.map +1 -0
- package/dist/domain/plugin/members.d.ts +42 -0
- package/dist/domain/plugin/members.d.ts.map +1 -0
- package/dist/domain/plugin/members.js +97 -0
- package/dist/domain/plugin/members.js.map +1 -0
- package/dist/domain/plugin/overlay/documents.d.ts +31 -0
- package/dist/domain/plugin/overlay/documents.d.ts.map +1 -0
- package/dist/domain/plugin/overlay/documents.js +38 -0
- package/dist/domain/plugin/overlay/documents.js.map +1 -0
- package/dist/domain/plugin/overlay/parse.d.ts +16 -0
- package/dist/domain/plugin/overlay/parse.d.ts.map +1 -0
- package/dist/domain/plugin/overlay/parse.js +79 -0
- package/dist/domain/plugin/overlay/parse.js.map +1 -0
- package/dist/domain/plugin/overlay/sanitize.d.ts +10 -0
- package/dist/domain/plugin/overlay/sanitize.d.ts.map +1 -0
- package/dist/domain/plugin/overlay/sanitize.js +103 -0
- package/dist/domain/plugin/overlay/sanitize.js.map +1 -0
- package/dist/domain/plugin/push.d.ts +133 -0
- package/dist/domain/plugin/push.d.ts.map +1 -0
- package/dist/domain/plugin/push.js +800 -0
- package/dist/domain/plugin/push.js.map +1 -0
- package/dist/domain/plugin/search-extractor.d.ts +3 -0
- package/dist/domain/plugin/search-extractor.d.ts.map +1 -0
- package/dist/domain/plugin/search-extractor.js +41 -0
- package/dist/domain/plugin/search-extractor.js.map +1 -0
- package/dist/domain/skill/constants.d.ts +6 -11
- package/dist/domain/skill/constants.d.ts.map +1 -1
- package/dist/domain/skill/constants.js +6 -11
- package/dist/domain/skill/constants.js.map +1 -1
- package/dist/domain/skill/controller.d.ts.map +1 -1
- package/dist/domain/skill/controller.js +33 -30
- package/dist/domain/skill/controller.js.map +1 -1
- package/dist/domain/skill/push.d.ts +9 -10
- package/dist/domain/skill/push.d.ts.map +1 -1
- package/dist/domain/skill/push.js +53 -122
- package/dist/domain/skill/push.js.map +1 -1
- package/dist/domain/skill/search-extractor.d.ts.map +1 -1
- package/dist/domain/skill/search-extractor.js.map +1 -1
- package/dist/domain/skill/storage/artifact-storage.d.ts +26 -29
- package/dist/domain/skill/storage/artifact-storage.d.ts.map +1 -1
- package/dist/domain/skill/storage/artifact-storage.js +6 -103
- package/dist/domain/skill/storage/artifact-storage.js.map +1 -1
- package/dist/domain/skill/storage/zip-gate.d.ts +1 -2
- package/dist/domain/skill/storage/zip-gate.d.ts.map +1 -1
- package/dist/domain/skill/storage/zip-gate.js +56 -126
- package/dist/domain/skill/storage/zip-gate.js.map +1 -1
- package/dist/domain/skill/version-resolution.d.ts +5 -5
- package/dist/domain/skill/version-resolution.d.ts.map +1 -1
- package/dist/domain/skill/version-resolution.js +34 -216
- package/dist/domain/skill/version-resolution.js.map +1 -1
- package/dist/domain/workflow/controller.d.ts.map +1 -1
- package/dist/domain/workflow/controller.js +30 -3
- package/dist/domain/workflow/controller.js.map +1 -1
- package/dist/domain/workflow/registry/data/task-kind-registry.json +1 -0
- package/dist/domain/workflowexecution/phases.d.ts +21 -0
- package/dist/domain/workflowexecution/phases.d.ts.map +1 -0
- package/dist/domain/workflowexecution/phases.js +31 -0
- package/dist/domain/workflowexecution/phases.js.map +1 -0
- package/dist/extensions/authorizer.d.ts +10 -5
- package/dist/extensions/authorizer.d.ts.map +1 -1
- package/dist/extensions/drivers.d.ts +4 -1
- package/dist/extensions/drivers.d.ts.map +1 -1
- package/dist/extensions/list-read-scope.d.ts +47 -20
- package/dist/extensions/list-read-scope.d.ts.map +1 -1
- package/dist/extensions/list-read-scope.js +20 -24
- package/dist/extensions/list-read-scope.js.map +1 -1
- package/dist/extensions/organization-directory.d.ts +13 -9
- package/dist/extensions/organization-directory.d.ts.map +1 -1
- package/dist/extensions/organization-directory.js.map +1 -1
- package/dist/extensions/resource-authorization.d.ts +33 -0
- package/dist/extensions/resource-authorization.d.ts.map +1 -1
- package/dist/extensions/schedule-fire-caller.d.ts +45 -18
- package/dist/extensions/schedule-fire-caller.d.ts.map +1 -1
- package/dist/extensions/schedule-fire-caller.js +12 -1
- package/dist/extensions/schedule-fire-caller.js.map +1 -1
- package/dist/identity/oidc-verifier.js +8 -1
- package/dist/identity/oidc-verifier.js.map +1 -1
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/pipeline/apiresource-labels.d.ts +23 -3
- package/dist/pipeline/apiresource-labels.d.ts.map +1 -1
- package/dist/pipeline/apiresource-labels.js +20 -0
- package/dist/pipeline/apiresource-labels.js.map +1 -1
- package/dist/pipeline/apiresource-meta.d.ts +15 -0
- package/dist/pipeline/apiresource-meta.d.ts.map +1 -1
- package/dist/pipeline/apiresource-meta.js +34 -0
- package/dist/pipeline/apiresource-meta.js.map +1 -1
- package/dist/pipeline/errors.d.ts.map +1 -1
- package/dist/pipeline/errors.js.map +1 -1
- package/dist/pipeline/steps/authorization-facts.d.ts +12 -0
- package/dist/pipeline/steps/authorization-facts.d.ts.map +1 -0
- package/dist/pipeline/steps/authorization-facts.js +100 -0
- package/dist/pipeline/steps/authorization-facts.js.map +1 -0
- package/dist/pipeline/steps/delete.d.ts.map +1 -1
- package/dist/pipeline/steps/delete.js +1 -1
- package/dist/pipeline/steps/delete.js.map +1 -1
- package/dist/pipeline/steps/duplicate.d.ts.map +1 -1
- package/dist/pipeline/steps/duplicate.js.map +1 -1
- package/dist/pipeline/steps/guard-memory-capture.d.ts.map +1 -1
- package/dist/pipeline/steps/guard-memory-capture.js +5 -3
- package/dist/pipeline/steps/guard-memory-capture.js.map +1 -1
- package/dist/pipeline/steps/guard-plugin-managed.d.ts +12 -0
- package/dist/pipeline/steps/guard-plugin-managed.d.ts.map +1 -0
- package/dist/pipeline/steps/guard-plugin-managed.js +96 -0
- package/dist/pipeline/steps/guard-plugin-managed.js.map +1 -0
- package/dist/pipeline/steps/guard-reserved-labels.d.ts +16 -2
- package/dist/pipeline/steps/guard-reserved-labels.d.ts.map +1 -1
- package/dist/pipeline/steps/guard-reserved-labels.js +11 -7
- package/dist/pipeline/steps/guard-reserved-labels.js.map +1 -1
- package/dist/pipeline/steps/helpers.d.ts.map +1 -1
- package/dist/pipeline/steps/helpers.js.map +1 -1
- package/dist/pipeline/steps/index-search.d.ts.map +1 -1
- package/dist/pipeline/steps/index-search.js.map +1 -1
- package/dist/pipeline/steps/load-existing.d.ts.map +1 -1
- package/dist/pipeline/steps/load-existing.js +1 -1
- package/dist/pipeline/steps/load-existing.js.map +1 -1
- package/dist/pipeline/steps/references.d.ts +16 -0
- package/dist/pipeline/steps/references.d.ts.map +1 -1
- package/dist/pipeline/steps/references.js +18 -0
- package/dist/pipeline/steps/references.js.map +1 -1
- package/dist/pipeline/steps/resolve-artifact-source.d.ts +35 -0
- package/dist/pipeline/steps/resolve-artifact-source.d.ts.map +1 -0
- package/dist/pipeline/steps/resolve-artifact-source.js +27 -0
- package/dist/pipeline/steps/resolve-artifact-source.js.map +1 -0
- package/dist/pipeline/steps/server-stamped-reserved-labels.d.ts.map +1 -1
- package/dist/pipeline/steps/server-stamped-reserved-labels.js.map +1 -1
- package/dist/pipeline/steps/slug.d.ts.map +1 -1
- package/dist/pipeline/steps/slug.js.map +1 -1
- package/dist/pipeline/steps/validate-visibility.d.ts +9 -0
- package/dist/pipeline/steps/validate-visibility.d.ts.map +1 -1
- package/dist/pipeline/steps/validate-visibility.js +6 -1
- package/dist/pipeline/steps/validate-visibility.js.map +1 -1
- package/dist/pipeline/steps/validation.d.ts.map +1 -1
- package/dist/pipeline/steps/validation.js.map +1 -1
- package/dist/pipeline/steps/version-archive.d.ts +63 -0
- package/dist/pipeline/steps/version-archive.d.ts.map +1 -0
- package/dist/pipeline/steps/version-archive.js +129 -0
- package/dist/pipeline/steps/version-archive.js.map +1 -0
- package/dist/pipeline/steps/version-history.d.ts +49 -0
- package/dist/pipeline/steps/version-history.d.ts.map +1 -0
- package/dist/pipeline/steps/version-history.js +229 -0
- package/dist/pipeline/steps/version-history.js.map +1 -0
- package/dist/pipeline/steps/visibility-gates.d.ts +8 -0
- package/dist/pipeline/steps/visibility-gates.d.ts.map +1 -1
- package/dist/pipeline/steps/visibility-gates.js +7 -2
- package/dist/pipeline/steps/visibility-gates.js.map +1 -1
- package/dist/query/search/registry.d.ts.map +1 -1
- package/dist/query/search/registry.js +2 -0
- package/dist/query/search/registry.js.map +1 -1
- package/dist/runnerauth/bound-execution.d.ts +27 -0
- package/dist/runnerauth/bound-execution.d.ts.map +1 -0
- package/dist/runnerauth/bound-execution.js +137 -0
- package/dist/runnerauth/bound-execution.js.map +1 -0
- package/dist/runnerauth/built-in-runner-credential-provider.d.ts +28 -0
- package/dist/runnerauth/built-in-runner-credential-provider.d.ts.map +1 -0
- package/dist/runnerauth/built-in-runner-credential-provider.js +217 -0
- package/dist/runnerauth/built-in-runner-credential-provider.js.map +1 -0
- package/dist/runnerauth/constants.d.ts +63 -0
- package/dist/runnerauth/constants.d.ts.map +1 -0
- package/dist/runnerauth/constants.js +63 -0
- package/dist/runnerauth/constants.js.map +1 -0
- package/dist/runnerauth/dispatch-credential.d.ts +38 -0
- package/dist/runnerauth/dispatch-credential.d.ts.map +1 -0
- package/dist/runnerauth/dispatch-credential.js +17 -0
- package/dist/runnerauth/dispatch-credential.js.map +1 -0
- package/dist/runnerauth/runner-credential-provider.d.ts +49 -11
- package/dist/runnerauth/runner-credential-provider.d.ts.map +1 -1
- package/dist/runnerauth/runner-credential-provider.js +16 -4
- package/dist/runnerauth/runner-credential-provider.js.map +1 -1
- package/dist/runnerauth/runner-subject-verifier.d.ts +14 -0
- package/dist/runnerauth/runner-subject-verifier.d.ts.map +1 -0
- package/dist/runnerauth/runner-subject-verifier.js +115 -0
- package/dist/runnerauth/runner-subject-verifier.js.map +1 -0
- package/dist/runnerauth/runnerauth.d.ts +33 -4
- package/dist/runnerauth/runnerauth.d.ts.map +1 -1
- package/dist/runnerauth/runnerauth.js +131 -35
- package/dist/runnerauth/runnerauth.js.map +1 -1
- package/dist/temporal/agentexecution/engine-client.d.ts +13 -0
- package/dist/temporal/agentexecution/engine-client.d.ts.map +1 -1
- package/dist/temporal/agentexecution/engine-client.js +10 -2
- package/dist/temporal/agentexecution/engine-client.js.map +1 -1
- package/dist/temporal/agentexecution/workflow-input.d.ts +13 -0
- package/dist/temporal/agentexecution/workflow-input.d.ts.map +1 -1
- package/dist/temporal/agentexecution/workflows/invoke-agent-execution.d.ts.map +1 -1
- package/dist/temporal/agentexecution/workflows/invoke-agent-execution.js +35 -31
- package/dist/temporal/agentexecution/workflows/invoke-agent-execution.js.map +1 -1
- package/dist/temporal/schedule/run-starter.d.ts +1 -1
- package/dist/temporal/schedule/run-starter.d.ts.map +1 -1
- package/dist/temporal/schedule/run-starter.js +14 -1
- package/dist/temporal/schedule/run-starter.js.map +1 -1
- package/dist/temporal/workflowexecution/engine-client.d.ts +24 -0
- package/dist/temporal/workflowexecution/engine-client.d.ts.map +1 -1
- package/dist/temporal/workflowexecution/engine-client.js +26 -19
- package/dist/temporal/workflowexecution/engine-client.js.map +1 -1
- package/dist/temporal/workflowexecution/workflow-input.d.ts +14 -0
- package/dist/temporal/workflowexecution/workflow-input.d.ts.map +1 -1
- package/package.json +5 -4
- package/src/archive/__tests__/archive.test.ts +233 -0
- package/src/{domain/skill → archive}/__tests__/prefilter.test.ts +1 -1
- package/src/archive/content-store.ts +132 -0
- package/src/archive/inflate.ts +107 -0
- package/src/archive/limits.ts +42 -0
- package/src/archive/open.ts +131 -0
- package/src/{domain/skill/storage → archive}/prefilter.ts +5 -0
- package/src/archive/write.ts +54 -0
- package/src/authorization/README.md +124 -0
- package/src/authorization/__tests__/authorizer.test.ts +719 -0
- package/src/authorization/__tests__/derived-tuples.test.ts +802 -0
- package/src/authorization/__tests__/drivers.ts +70 -0
- package/src/authorization/__tests__/evaluator.test.ts +359 -0
- package/src/authorization/__tests__/facts.test.ts +155 -0
- package/src/authorization/__tests__/fixtures/fga/agent-channel-owner.fga.yaml +112 -0
- package/src/authorization/__tests__/fixtures/fga/agent-share-owner.fga.yaml +109 -0
- package/src/authorization/__tests__/fixtures/fga/artifact-org-and-owner.fga.yaml +128 -0
- package/src/authorization/__tests__/fixtures/fga/blueprint-private-visibility.fga.yaml +410 -0
- package/src/authorization/__tests__/fixtures/fga/channel-app-owner.fga.yaml +125 -0
- package/src/authorization/__tests__/fixtures/fga/channel-participation.fga.yaml +201 -0
- package/src/authorization/__tests__/fixtures/fga/channel-session-visibility.fga.yaml +187 -0
- package/src/authorization/__tests__/fixtures/fga/cross-org-share-creation.fga.yaml +98 -0
- package/src/authorization/__tests__/fixtures/fga/default-instance-inheritance.fga.yaml +271 -0
- package/src/authorization/__tests__/fixtures/fga/memory-subject-only.fga.yaml +72 -0
- package/src/authorization/__tests__/fixtures/fga/org-admin-owner-inheritance.fga.yaml +328 -0
- package/src/authorization/__tests__/fixtures/fga/org-shared-environment.fga.yaml +144 -0
- package/src/authorization/__tests__/fixtures/fga/platform-visibility.fga.yaml +223 -0
- package/src/authorization/__tests__/fixtures/fga/provider-standing-viewer.fga.yaml +40 -0
- package/src/authorization/__tests__/fixtures/fga/public-visibility-setter.fga.yaml +52 -0
- package/src/authorization/__tests__/fixtures/fga/reserved-label-writer.fga.yaml +41 -0
- package/src/authorization/__tests__/fixtures/fga/schedule-owner.fga.yaml +113 -0
- package/src/authorization/__tests__/fixtures/fga/schedule-session-visibility.fga.yaml +214 -0
- package/src/authorization/__tests__/fixtures/fga/session-personal-resource.fga.yaml +117 -0
- package/src/authorization/__tests__/fixtures/fga/workflow-execution-sharing.fga.yaml +192 -0
- package/src/authorization/__tests__/lane-admission.test.ts +115 -0
- package/src/authorization/__tests__/list-read-scope.measure.test.ts +317 -0
- package/src/authorization/__tests__/list-read-scope.test.ts +796 -0
- package/src/authorization/__tests__/organization-directory.test.ts +236 -0
- package/src/authorization/__tests__/person.test.ts +114 -0
- package/src/authorization/__tests__/posture.test.ts +25 -0
- package/src/authorization/__tests__/schedule-fire-caller.test.ts +134 -0
- package/src/authorization/__tests__/store-tests.test.ts +306 -0
- package/src/authorization/__tests__/support.ts +101 -0
- package/src/authorization/__tests__/tuples.test.ts +62 -0
- package/src/authorization/__tests__/wire-permissions.test.ts +154 -0
- package/src/authorization/authorizer.ts +208 -0
- package/src/authorization/derived-tuples.ts +384 -0
- package/src/authorization/evaluator.ts +283 -0
- package/src/authorization/facts.ts +47 -0
- package/src/authorization/lane-admission.ts +73 -0
- package/src/authorization/list-read-scope.ts +216 -0
- package/src/authorization/model/__tests__/registry.test.ts +317 -0
- package/src/authorization/model/agent.ts +64 -0
- package/src/authorization/model/agent_channel.ts +49 -0
- package/src/authorization/model/agent_execution.ts +33 -0
- package/src/authorization/model/agent_instance.ts +66 -0
- package/src/authorization/model/agent_share.ts +40 -0
- package/src/authorization/model/api_key.ts +28 -0
- package/src/authorization/model/artifact.ts +38 -0
- package/src/authorization/model/channel_app.ts +39 -0
- package/src/authorization/model/default-of.ts +99 -0
- package/src/authorization/model/environment.ts +48 -0
- package/src/authorization/model/execution_context.ts +20 -0
- package/src/authorization/model/iam_policy.ts +42 -0
- package/src/authorization/model/identity_account.ts +26 -0
- package/src/authorization/model/index.ts +108 -0
- package/src/authorization/model/mcp_server.ts +59 -0
- package/src/authorization/model/memory.ts +27 -0
- package/src/authorization/model/oauth_app.ts +42 -0
- package/src/authorization/model/organization.ts +55 -0
- package/src/authorization/model/plugin.ts +66 -0
- package/src/authorization/model/project.ts +47 -0
- package/src/authorization/model/rewrite.ts +213 -0
- package/src/authorization/model/schedule.ts +40 -0
- package/src/authorization/model/session.ts +50 -0
- package/src/authorization/model/skill.ts +60 -0
- package/src/authorization/model/workflow.ts +60 -0
- package/src/authorization/model/workflow_execution.ts +44 -0
- package/src/authorization/model/workflow_instance.ts +122 -0
- package/src/authorization/organization-directory.ts +114 -0
- package/src/authorization/person.ts +68 -0
- package/src/authorization/posture.ts +49 -0
- package/src/authorization/schedule-fire-caller.ts +87 -0
- package/src/authorization/store-test-kit.ts +454 -0
- package/src/authorization/tuples.ts +190 -0
- package/src/boot/compose.ts +246 -52
- package/src/boot/inprocess.ts +115 -31
- package/src/domain/agent/controller.ts +11 -0
- package/src/domain/executioncontext/__tests__/executioncontext.test.ts +104 -0
- package/src/domain/executioncontext/__tests__/resolve-values-capability.test.ts +33 -4
- package/src/domain/executioncontext/resolve-values-for-caller.ts +79 -22
- package/src/domain/iampolicy/__tests__/membership.test.ts +357 -3
- package/src/domain/iampolicy/constants.ts +12 -0
- package/src/domain/iampolicy/membership.ts +221 -66
- package/src/domain/identityaccount/__tests__/account-for-stamp.test.ts +111 -0
- package/src/domain/identityaccount/actor.ts +84 -0
- package/src/domain/identityaccount/resolve.ts +31 -0
- package/src/domain/mcpserver/__tests__/connect.test.ts +17 -2
- package/src/domain/mcpserver/connect-execution-id.ts +34 -0
- package/src/domain/mcpserver/connect.ts +38 -3
- package/src/domain/mcpserver/controller.ts +11 -0
- package/src/domain/mcpserver/engine.ts +9 -3
- package/src/domain/mcpserver/start-connect.ts +1 -1
- package/src/domain/platform/controller.ts +24 -11
- package/src/domain/plugin/__tests__/materialize.test.ts +303 -0
- package/src/domain/plugin/__tests__/overlay-parse.test.ts +85 -0
- package/src/domain/plugin/__tests__/plugin.test.ts +796 -0
- package/src/domain/plugin/__tests__/sanitize.test.ts +174 -0
- package/src/domain/plugin/archive.ts +89 -0
- package/src/domain/plugin/constants.ts +53 -0
- package/src/domain/plugin/controller.ts +913 -0
- package/src/domain/plugin/materialize/agent.ts +186 -0
- package/src/domain/plugin/materialize/default-agent-instructions.ts +59 -0
- package/src/domain/plugin/materialize/identity.ts +67 -0
- package/src/domain/plugin/materialize/mcp-servers.ts +175 -0
- package/src/domain/plugin/materialize/plan.ts +124 -0
- package/src/domain/plugin/materialize/ports.ts +53 -0
- package/src/domain/plugin/materialize/skills.ts +68 -0
- package/src/domain/plugin/materialize/workflows.ts +51 -0
- package/src/domain/plugin/members.ts +180 -0
- package/src/domain/plugin/overlay/documents.ts +78 -0
- package/src/domain/plugin/overlay/parse.ts +115 -0
- package/src/domain/plugin/overlay/sanitize.ts +151 -0
- package/src/domain/plugin/push.ts +1062 -0
- package/src/domain/plugin/search-extractor.ts +60 -0
- package/src/domain/skill/constants.ts +11 -14
- package/src/domain/skill/controller.ts +44 -36
- package/src/domain/skill/push.ts +61 -156
- package/src/domain/skill/search-extractor.ts +3 -1
- package/src/domain/skill/storage/artifact-storage.ts +23 -124
- package/src/domain/skill/storage/zip-gate.ts +58 -154
- package/src/domain/skill/version-resolution.ts +67 -269
- package/src/domain/workflow/controller.ts +38 -4
- package/src/domain/workflow/registry/data/task-kind-registry.json +1 -0
- package/src/domain/workflowexecution/__tests__/phases.test.ts +58 -0
- package/src/domain/workflowexecution/phases.ts +33 -0
- package/src/extensions/__tests__/built-in-authorization-composed.test.ts +835 -0
- package/src/extensions/__tests__/composed-support.ts +32 -1
- package/src/extensions/__tests__/extension-composition.test.ts +42 -1
- package/src/extensions/__tests__/list-read-scope.test.ts +137 -33
- package/src/extensions/__tests__/role-reconciliation-composed.test.ts +209 -0
- package/src/extensions/__tests__/tier-truthfulness.test.ts +6 -14
- package/src/extensions/authorizer.ts +10 -5
- package/src/extensions/drivers.ts +4 -1
- package/src/extensions/list-read-scope.ts +67 -45
- package/src/extensions/organization-directory.ts +13 -9
- package/src/extensions/resource-authorization.ts +34 -0
- package/src/extensions/schedule-fire-caller.ts +49 -18
- package/src/identity/__tests__/oidc-verifier.test.ts +22 -0
- package/src/identity/oidc-verifier.ts +8 -1
- package/src/index.ts +51 -1
- package/src/pipeline/__tests__/kind-by-id-prefix.test.ts +75 -0
- package/src/pipeline/__tests__/router-transport.test.ts +1 -3
- package/src/pipeline/apiresource-labels.ts +31 -3
- package/src/pipeline/apiresource-meta.ts +41 -0
- package/src/pipeline/errors.ts +5 -5
- package/src/pipeline/steps/__tests__/authorize-annotation-completeness.test.ts +1 -20
- package/src/pipeline/steps/__tests__/guard-memory-capture.test.ts +58 -44
- package/src/pipeline/steps/__tests__/guard-plugin-managed.test.ts +151 -0
- package/src/pipeline/steps/__tests__/guard-reserved-labels.test.ts +83 -8
- package/src/pipeline/steps/authorization-facts.ts +131 -0
- package/src/pipeline/steps/delete.ts +11 -3
- package/src/pipeline/steps/duplicate.ts +8 -2
- package/src/pipeline/steps/guard-memory-capture.ts +5 -3
- package/src/pipeline/steps/guard-plugin-managed.ts +133 -0
- package/src/pipeline/steps/guard-reserved-labels.ts +29 -8
- package/src/pipeline/steps/helpers.ts +4 -1
- package/src/pipeline/steps/index-search.ts +28 -15
- package/src/pipeline/steps/load-existing.ts +12 -3
- package/src/pipeline/steps/references.ts +36 -2
- package/src/pipeline/steps/resolve-artifact-source.ts +66 -0
- package/src/pipeline/steps/server-stamped-reserved-labels.ts +2 -1
- package/src/pipeline/steps/slug.ts +7 -2
- package/src/pipeline/steps/validate-visibility.ts +9 -2
- package/src/pipeline/steps/validation.ts +3 -1
- package/src/pipeline/steps/version-archive.ts +225 -0
- package/src/pipeline/steps/version-history.ts +362 -0
- package/src/pipeline/steps/visibility-gates.ts +12 -9
- package/src/query/README.md +1 -1
- package/src/query/search/__tests__/criteria.test.ts +6 -7
- package/src/query/search/__tests__/query-store.test.ts +9 -2
- package/src/query/search/__tests__/registry.test.ts +6 -4
- package/src/query/search/registry.ts +6 -1
- package/src/runnerauth/__tests__/bound-execution.test.ts +334 -0
- package/src/runnerauth/__tests__/built-in-runner-credential-provider.test.ts +516 -0
- package/src/runnerauth/__tests__/dispatch-credential.test.ts +94 -0
- package/src/runnerauth/__tests__/runner-credential-provider.test.ts +27 -0
- package/src/runnerauth/__tests__/runner-subject-composed.test.ts +497 -0
- package/src/runnerauth/__tests__/runner-subject-verifier.test.ts +541 -0
- package/src/runnerauth/bound-execution.ts +270 -0
- package/src/runnerauth/built-in-runner-credential-provider.ts +300 -0
- package/src/runnerauth/constants.ts +74 -0
- package/src/runnerauth/dispatch-credential.ts +63 -0
- package/src/runnerauth/runner-credential-provider.ts +60 -11
- package/src/runnerauth/runner-subject-verifier.ts +152 -0
- package/src/runnerauth/runnerauth.ts +148 -38
- package/src/temporal/agentexecution/__tests__/engine-client.test.ts +107 -38
- package/src/temporal/agentexecution/__tests__/invoke-workflow.test.ts +105 -2
- package/src/temporal/agentexecution/engine-client.ts +27 -2
- package/src/temporal/agentexecution/workflow-input.ts +13 -0
- package/src/temporal/agentexecution/workflows/invoke-agent-execution.ts +90 -44
- package/src/temporal/schedule/__tests__/run-starter.test.ts +86 -24
- package/src/temporal/schedule/run-starter.ts +31 -8
- package/src/temporal/workflowexecution/__tests__/engine-client.test.ts +139 -33
- package/src/temporal/workflowexecution/engine-client.ts +48 -21
- package/src/temporal/workflowexecution/workflow-input.ts +14 -0
- package/dist/domain/skill/storage/prefilter.d.ts.map +0 -1
- package/dist/domain/skill/storage/prefilter.js.map +0 -1
- /package/dist/{domain/skill/storage → archive}/prefilter.js +0 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The synthetic execution id of an MCP connect — the ONE home for its
|
|
3
|
+
* shape, built here by the connect lane and recognized here by the
|
|
4
|
+
* runner-credential lane, so the two can never drift apart.
|
|
5
|
+
*
|
|
6
|
+
* A connect is not an execution: it has no AgentExecution or
|
|
7
|
+
* WorkflowExecution row. What it has is an ephemeral ExecutionContext
|
|
8
|
+
* (connect.ts `createConnectExecutionContext`) whose `spec.execution_id`
|
|
9
|
+
* must name SOMETHING for the decrypt lane's binding check
|
|
10
|
+
* (executioncontext/resolve-values-for-caller.ts: the token's
|
|
11
|
+
* `execution_id` claim must equal the EC's), and this id is that
|
|
12
|
+
* something — an id that names no resource kind, so the contract's
|
|
13
|
+
* `kind_meta` prefix table (pipeline/apiresource-meta.ts) cannot mistake
|
|
14
|
+
* it for a row. The runner-credential lane reads it the other way round
|
|
15
|
+
* (runnerauth/bound-execution.ts `boundExecutionKindOf`): an id this
|
|
16
|
+
* predicate recognizes is a connect binding, resolved through the EC row
|
|
17
|
+
* whose `spec.execution_id` it is. Keep the builder and the predicate
|
|
18
|
+
* together; a second copy of the prefix anywhere would be the drift this
|
|
19
|
+
* module exists to prevent.
|
|
20
|
+
*/
|
|
21
|
+
import { randomUUID } from "node:crypto";
|
|
22
|
+
|
|
23
|
+
/** The prefix every connect execution id carries — no resource kind's id starts with it. */
|
|
24
|
+
const CONNECT_EXECUTION_ID_PREFIX = "connect-";
|
|
25
|
+
|
|
26
|
+
/** One connect's execution id: the server it discovers plus eight hex of entropy per attempt. */
|
|
27
|
+
export function newConnectExecutionId(mcpServerId: string): string {
|
|
28
|
+
return `${CONNECT_EXECUTION_ID_PREFIX}${mcpServerId}-${randomUUID().slice(0, 8)}`;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** Whether `executionId` is a connect's — the runner-credential lane's recognition of the third binding. */
|
|
32
|
+
export function isConnectExecutionId(executionId: string): boolean {
|
|
33
|
+
return executionId.startsWith(CONNECT_EXECUTION_ID_PREFIX);
|
|
34
|
+
}
|
|
@@ -17,7 +17,6 @@
|
|
|
17
17
|
import { create } from "@bufbuild/protobuf";
|
|
18
18
|
import type { MessageInitShape } from "@bufbuild/protobuf";
|
|
19
19
|
import { Code, ConnectError } from "@connectrpc/connect";
|
|
20
|
-
import { randomUUID } from "node:crypto";
|
|
21
20
|
|
|
22
21
|
import type {
|
|
23
22
|
EnvironmentList,
|
|
@@ -62,6 +61,7 @@ import type {
|
|
|
62
61
|
} from "../../store/interface.js";
|
|
63
62
|
import { ResourceNotFoundError } from "../../store/interface.js";
|
|
64
63
|
import { resolveOAuthAppRef } from "../oauthapp/refresolution.js";
|
|
64
|
+
import { newConnectExecutionId } from "./connect-execution-id.js";
|
|
65
65
|
import {
|
|
66
66
|
persistConnectFailure,
|
|
67
67
|
persistConnectResult,
|
|
@@ -169,10 +169,21 @@ export interface ConnectEnvironmentReader {
|
|
|
169
169
|
/**
|
|
170
170
|
* The ExecutionContext lifecycle surface for the ephemeral connect EC —
|
|
171
171
|
* Go's downstream executioncontext client (create + delete).
|
|
172
|
+
*
|
|
173
|
+
* `create` takes the connecting caller and the composition creates the
|
|
174
|
+
* row AS THAT PERSON (boot/inprocess.ts, the `asCaller` lane of ruling
|
|
175
|
+
* R5), never under the internal class: the row's creator stamp is what
|
|
176
|
+
* the runner-subject verifier resolves the connect's person from when
|
|
177
|
+
* the runner presents the connect token under the built-in posture
|
|
178
|
+
* (runnerauth/bound-execution.ts, the `mcp-connect` binding). A row
|
|
179
|
+
* stamped `internal` would name nobody, and the credentialed connect
|
|
180
|
+
* would be refused at identity on every enforcing self-host. `delete`
|
|
181
|
+
* stays the server's own act: the row is the lane's, whoever asked.
|
|
172
182
|
*/
|
|
173
183
|
export interface ConnectExecutionContextClient {
|
|
174
184
|
create(
|
|
175
185
|
executionContext: MessageInitShape<typeof ExecutionContextSchema>,
|
|
186
|
+
caller: CallerIdentity,
|
|
176
187
|
): Promise<ExecutionContext>;
|
|
177
188
|
delete(
|
|
178
189
|
input: MessageInitShape<typeof ApiResourceDeleteInputSchema>,
|
|
@@ -272,7 +283,7 @@ export async function connect(
|
|
|
272
283
|
input,
|
|
273
284
|
);
|
|
274
285
|
|
|
275
|
-
const prepared = await prepareConnect(deps, mcpServer, input);
|
|
286
|
+
const prepared = await prepareConnect(deps, mcpServer, input, identity);
|
|
276
287
|
|
|
277
288
|
try {
|
|
278
289
|
let run: ConnectRun;
|
|
@@ -385,11 +396,28 @@ export async function connect(
|
|
|
385
396
|
* read the caller's grant and secrets, which a background task has no
|
|
386
397
|
* request context to do (the same constraint that scopes
|
|
387
398
|
* startBestEffortConnect to env-less servers).
|
|
399
|
+
*
|
|
400
|
+
* A connect's discovery runs on the runner with TWO credentials, and the
|
|
401
|
+
* split is deliberate. The runner's own process credential reads the
|
|
402
|
+
* McpServer's metadata — under the built-in posture that credential is
|
|
403
|
+
* the operator's API key, and the operator is an organization admin
|
|
404
|
+
* (deploy/helm/stigmer: the signed-in operator mints the runner's key),
|
|
405
|
+
* whom the model makes an owner of every McpServer in the organization
|
|
406
|
+
* (authorization/model/mcp_server.ts), so a member's private server is
|
|
407
|
+
* readable. The connect token minted below reads the SECRETS: it is
|
|
408
|
+
* bound to this connect's ExecutionContext, and under the built-in
|
|
409
|
+
* posture the runner-subject verifier resolves its bearer to the person
|
|
410
|
+
* that row was created by — which is why the row is created as `identity`
|
|
411
|
+
* and not as the server. The end state where every RPC of a discovery
|
|
412
|
+
* acts as the person (the cloud's connect-sandbox shape) needs a row an
|
|
413
|
+
* env-less connect would also create; it creates none today, so that is
|
|
414
|
+
* a design act of its own, not a widening to make here.
|
|
388
415
|
*/
|
|
389
416
|
export async function prepareConnect(
|
|
390
417
|
deps: McpServerConnectDeps,
|
|
391
418
|
mcpServer: McpServer,
|
|
392
419
|
input: ConnectInput,
|
|
420
|
+
identity: CallerIdentity,
|
|
393
421
|
): Promise<PreparedConnect> {
|
|
394
422
|
const mcpServerId = mcpServer.metadata?.id ?? "";
|
|
395
423
|
const callerOrg = input.org;
|
|
@@ -402,7 +430,7 @@ export async function prepareConnect(
|
|
|
402
430
|
await refreshOAuthTokenIfNeeded(deps, mcpServer, callerOrg);
|
|
403
431
|
}
|
|
404
432
|
|
|
405
|
-
const executionId =
|
|
433
|
+
const executionId = newConnectExecutionId(mcpServerId);
|
|
406
434
|
|
|
407
435
|
const ecResourceId = await createConnectExecutionContext(
|
|
408
436
|
deps,
|
|
@@ -410,6 +438,7 @@ export async function prepareConnect(
|
|
|
410
438
|
executionId,
|
|
411
439
|
callerOrg,
|
|
412
440
|
input.runtimeEnv,
|
|
441
|
+
identity,
|
|
413
442
|
);
|
|
414
443
|
|
|
415
444
|
const workflowInput: ConnectWorkflowInput = {
|
|
@@ -464,6 +493,10 @@ export async function prepareConnect(
|
|
|
464
493
|
* sources: OAuth-managed variables from the grant's managed environment,
|
|
465
494
|
* the remainder from the user's personal environment. Returns "" when the
|
|
466
495
|
* MCP server has no env declarations and no runtime_env.
|
|
496
|
+
*
|
|
497
|
+
* The row is created as `caller`, the person connecting (see the
|
|
498
|
+
* ConnectExecutionContextClient doc): its creator stamp is the connect
|
|
499
|
+
* token's person under the built-in posture.
|
|
467
500
|
*/
|
|
468
501
|
async function createConnectExecutionContext(
|
|
469
502
|
deps: McpServerConnectDeps,
|
|
@@ -471,6 +504,7 @@ async function createConnectExecutionContext(
|
|
|
471
504
|
executionId: string,
|
|
472
505
|
callerOrg: string,
|
|
473
506
|
runtimeEnv: { [key: string]: ExecutionValue },
|
|
507
|
+
caller: CallerIdentity,
|
|
474
508
|
): Promise<string> {
|
|
475
509
|
let ecData: { [key: string]: ExecutionValue };
|
|
476
510
|
|
|
@@ -540,6 +574,7 @@ async function createConnectExecutionContext(
|
|
|
540
574
|
data: ecData,
|
|
541
575
|
},
|
|
542
576
|
}),
|
|
577
|
+
caller,
|
|
543
578
|
);
|
|
544
579
|
} catch (error) {
|
|
545
580
|
throw internalError(error, "failed to create connect ExecutionContext");
|
|
@@ -77,6 +77,7 @@ import {
|
|
|
77
77
|
EXISTING_RESOURCE_KEY,
|
|
78
78
|
newLoadExistingStep,
|
|
79
79
|
} from "../../pipeline/steps/load-existing.js";
|
|
80
|
+
import { newGuardPluginManagedStep } from "../../pipeline/steps/guard-plugin-managed.js";
|
|
80
81
|
import {
|
|
81
82
|
SHOULD_CREATE_KEY,
|
|
82
83
|
newLoadForApplyStep,
|
|
@@ -269,6 +270,10 @@ async function update(
|
|
|
269
270
|
.addStep(newValidateProtoStep())
|
|
270
271
|
.addStep(newResolveSlugStep())
|
|
271
272
|
.addStep(newLoadExistingStep(deps.store))
|
|
273
|
+
// A resource a plugin materialised is the plugin's to redefine; a client
|
|
274
|
+
// write is refused naming the plugin (GuardPluginManaged, keyed on the
|
|
275
|
+
// STORED labels and the plugin row's existence).
|
|
276
|
+
.addStep(newGuardPluginManagedStep(deps.store))
|
|
272
277
|
.addStep(newBuildUpdateStateStep())
|
|
273
278
|
.addStep(newGuardReservedLabelsStep(deps.authorizer))
|
|
274
279
|
.addStep(newValidateDefaultEnabledToolsStep())
|
|
@@ -374,6 +379,7 @@ async function deleteMcpServer(
|
|
|
374
379
|
)
|
|
375
380
|
.addStep(newValidateProtoStep())
|
|
376
381
|
.addStep(newLoadExistingForDeleteStep(deps.store, McpServerSchema))
|
|
382
|
+
.addStep(newGuardPluginManagedStep(deps.store))
|
|
377
383
|
.addStep(newDeleteResourceStep(deps.store))
|
|
378
384
|
.addStep(
|
|
379
385
|
newCleanupIamPoliciesStep(deps.authorizationLifecycle, deps.logger),
|
|
@@ -426,6 +432,11 @@ async function updateVisibility(
|
|
|
426
432
|
)
|
|
427
433
|
.addStep(newValidateProtoStep())
|
|
428
434
|
.addStep(newLoadMcpServerForVisibilityUpdateStep(deps.store))
|
|
435
|
+
.addStep(
|
|
436
|
+
newGuardPluginManagedStep(deps.store, {
|
|
437
|
+
existingKey: UPDATE_VISIBILITY_MCP_SERVER_KEY,
|
|
438
|
+
}),
|
|
439
|
+
)
|
|
429
440
|
.addStep(
|
|
430
441
|
newRecordVisibilityBeforeUpdateStep(UPDATE_VISIBILITY_MCP_SERVER_KEY),
|
|
431
442
|
)
|
|
@@ -26,9 +26,15 @@
|
|
|
26
26
|
* read RPC redacts secrets unless the caller presents an execution-scoped
|
|
27
27
|
* runner token, and the discovery activity has no execution of its own to
|
|
28
28
|
* exchange for one — the capability travels with the work item. It is a
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
29
|
+
* short-TTL token bound to this connect flow's ephemeral EC (deleted when
|
|
30
|
+
* the connect settles, on the blocking lane and the async one alike) and
|
|
31
|
+
* useless once either expires. What it unlocks depends on the posture:
|
|
32
|
+
* under trusted-local it is a decrypt-lane discriminator and nothing more;
|
|
33
|
+
* under the built-in authorization posture the same token also admits its
|
|
34
|
+
* bearer AS THE PERSON who asked for the connect, on every RPC, for as
|
|
35
|
+
* long as the EC row exists (runnerauth/runnerauth.ts, the two lanes by
|
|
36
|
+
* posture; runnerauth/bound-execution.ts, the `mcp-connect` binding). It
|
|
37
|
+
* sits in Temporal history in the clear like every server-written input.
|
|
32
38
|
*/
|
|
33
39
|
export interface ConnectWorkflowInput {
|
|
34
40
|
readonly mcp_server_id: string;
|
|
@@ -118,7 +118,7 @@ export async function startConnect(
|
|
|
118
118
|
}
|
|
119
119
|
}
|
|
120
120
|
|
|
121
|
-
const prepared = await prepareConnect(deps, mcpServer, input);
|
|
121
|
+
const prepared = await prepareConnect(deps, mcpServer, input, identity);
|
|
122
122
|
|
|
123
123
|
// Taken before the start so the advisory describes the queue the run is
|
|
124
124
|
// about to join. Warn-only by design: a worker may be booting (the
|
|
@@ -10,21 +10,34 @@
|
|
|
10
10
|
* composed-server pattern).
|
|
11
11
|
*
|
|
12
12
|
* getRunnerScopedToken is the mint side of the runner-token lane
|
|
13
|
-
* (oss#535) — the seam src/runnerauth
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
13
|
+
* (oss#535) — the seam src/runnerauth/. What the token IS depends on the
|
|
14
|
+
* server's posture, and so does who may obtain one:
|
|
15
|
+
*
|
|
16
|
+
* - Under trusted-local (the laptop: one caller, nothing to separate)
|
|
17
|
+
* the arms below mint a clocked token for any caller naming an
|
|
18
|
+
* execution. The token is the LANE DISCRIMINATOR that lets the
|
|
19
|
+
* ExecutionContext read RPCs redact by default without breaking the
|
|
20
|
+
* runner, not a trust boundary — there is no identity for it to
|
|
21
|
+
* change.
|
|
22
|
+
* - Under the built-in authorization posture the same token is an
|
|
23
|
+
* IDENTITY: the runner-subject verifier admits its bearer as the
|
|
24
|
+
* human whose run it is (runnerauth/runner-subject-verifier.ts). A
|
|
25
|
+
* mint for anyone would be impersonation, so the built-in provider
|
|
26
|
+
* defines exchangeScopedToken and this controller delegates to it:
|
|
27
|
+
* the run credential is minted for the run's own person and nobody
|
|
28
|
+
* else (runnerauth/built-in-runner-credential-provider.ts). Runs get
|
|
29
|
+
* their credential from the dispatch itself (the engine clients put
|
|
30
|
+
* it on the workflow input); this exchange is the runner's fallback.
|
|
19
31
|
*
|
|
20
32
|
* The C4 capability delegation (20260827.09, gate ruling Q1): when the
|
|
21
33
|
* composed provider defines exchangeScopedToken / bootstrapCredentials,
|
|
22
34
|
* this controller delegates the exchange arms and the bootstrap
|
|
23
|
-
* credential fields to it wholesale —
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
* suites pin that
|
|
35
|
+
* credential fields to it wholesale — per-arm caller gating, row
|
|
36
|
+
* authorization, and multi-lane minting are POLICY, not contract, and
|
|
37
|
+
* live behind the seam (the cloud's four-arm exchange; open source's
|
|
38
|
+
* built-in gate). With neither defined (the trusted-local default), every
|
|
39
|
+
* arm below behaves exactly as before; the conformance suites pin that
|
|
40
|
+
* byte-identity.
|
|
28
41
|
*/
|
|
29
42
|
import type { ConnectRouter, HandlerContext } from "@connectrpc/connect";
|
|
30
43
|
import { create } from "@bufbuild/protobuf";
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pins the pure half of a push — what the plan says a package becomes,
|
|
3
|
+
* before any write: the composed agent's instructions (the versioned
|
|
4
|
+
* template, snapshot-pinned), a sub-agent's mcp_access naming server
|
|
5
|
+
* SLUGS while `model_override` stays empty and the hint becomes a warning,
|
|
6
|
+
* a built-in name becoming a warning, an MCP-only package planning no
|
|
7
|
+
* agent, the `mcpServers` key-to-slug rule, a skill archive rooted at its
|
|
8
|
+
* SKILL.md with the plugin's labels on the request, a version the tag
|
|
9
|
+
* pattern rejects becoming a warning, an overlay that redefines the
|
|
10
|
+
* transport refused, and the convergence and drop rules over members.
|
|
11
|
+
*/
|
|
12
|
+
import { describe, expect, it } from "vitest";
|
|
13
|
+
|
|
14
|
+
import {
|
|
15
|
+
inMemoryPluginFiles,
|
|
16
|
+
readPluginPackage,
|
|
17
|
+
} from "@stigmer/plugin-package";
|
|
18
|
+
import type { PluginPackage } from "@stigmer/plugin-package";
|
|
19
|
+
import { cursorPlugin, openPlugin } from "@stigmer/plugin-package/testing";
|
|
20
|
+
import type { PluginFixture } from "@stigmer/plugin-package/testing";
|
|
21
|
+
import { create } from "@bufbuild/protobuf";
|
|
22
|
+
import { McpServerSchema } from "@stigmer/protos/ai/stigmer/agentic/mcpserver/v1/api_pb";
|
|
23
|
+
import {
|
|
24
|
+
McpServerSpecSchema,
|
|
25
|
+
StdioServerConfigSchema,
|
|
26
|
+
} from "@stigmer/protos/ai/stigmer/agentic/mcpserver/v1/spec_pb";
|
|
27
|
+
import { ApiResourceKind } from "@stigmer/protos/ai/stigmer/commons/apiresource/apiresourcekind/api_resource_kind_pb";
|
|
28
|
+
import { ApiResourceVisibility } from "@stigmer/protos/ai/stigmer/commons/apiresource/enum_pb";
|
|
29
|
+
|
|
30
|
+
import { inflateEntry } from "../../../archive/inflate.js";
|
|
31
|
+
import { openArchive } from "../../../archive/open.js";
|
|
32
|
+
import {
|
|
33
|
+
PLUGIN_LABEL,
|
|
34
|
+
PLUGIN_VERSION_LABEL,
|
|
35
|
+
} from "../../../pipeline/apiresource-labels.js";
|
|
36
|
+
import {
|
|
37
|
+
DEFAULT_AGENT_INSTRUCTIONS_VERSION,
|
|
38
|
+
renderDefaultAgentInstructions,
|
|
39
|
+
} from "../materialize/default-agent-instructions.js";
|
|
40
|
+
import type { PluginIdentity } from "../materialize/identity.js";
|
|
41
|
+
import { McpServerOverlayError } from "../materialize/mcp-servers.js";
|
|
42
|
+
import { planMaterialization } from "../materialize/plan.js";
|
|
43
|
+
import { droppedMembers, membersConverge } from "../members.js";
|
|
44
|
+
import type { Member } from "../members.js";
|
|
45
|
+
|
|
46
|
+
const IDENTITY: PluginIdentity = {
|
|
47
|
+
org: "acme",
|
|
48
|
+
id: "plg_1",
|
|
49
|
+
slug: "thermos",
|
|
50
|
+
name: "thermos",
|
|
51
|
+
digest: "d".repeat(64),
|
|
52
|
+
visibility: ApiResourceVisibility.visibility_org,
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
function read(fixture: PluginFixture): PluginPackage {
|
|
56
|
+
const outcome = readPluginPackage(inMemoryPluginFiles(fixture));
|
|
57
|
+
if (!outcome.ok) {
|
|
58
|
+
throw new Error(outcome.errors.map((e) => e.message).join("\n"));
|
|
59
|
+
}
|
|
60
|
+
return outcome.plugin;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const thermos = cursorPlugin({
|
|
64
|
+
name: "thermos",
|
|
65
|
+
version: "1.2.0",
|
|
66
|
+
description: "Code review with a thermonuclear standard",
|
|
67
|
+
skills: [
|
|
68
|
+
{
|
|
69
|
+
name: "thermo-review",
|
|
70
|
+
description: "Review code thoroughly",
|
|
71
|
+
body: "# Review",
|
|
72
|
+
files: { "references/checklist.md": "- read it all" },
|
|
73
|
+
},
|
|
74
|
+
],
|
|
75
|
+
agents: [
|
|
76
|
+
{
|
|
77
|
+
file: "reviewer",
|
|
78
|
+
frontmatter: {
|
|
79
|
+
name: "reviewer",
|
|
80
|
+
description: "Reviews",
|
|
81
|
+
model: "sonnet",
|
|
82
|
+
},
|
|
83
|
+
body: "You review pull requests with care.",
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
file: "explore",
|
|
87
|
+
frontmatter: { name: "explore", description: "Shadows a built-in" },
|
|
88
|
+
body: "You explore the repository far and wide.",
|
|
89
|
+
},
|
|
90
|
+
],
|
|
91
|
+
mcpServers: {
|
|
92
|
+
my_github: {
|
|
93
|
+
type: "http",
|
|
94
|
+
url: "https://api.githubcopilot.com/mcp/",
|
|
95
|
+
headers: { Authorization: "Bearer ${GITHUB_TOKEN}" },
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
variables: { GITHUB_TOKEN: { type: "string", title: "Token" } },
|
|
99
|
+
required: ["GITHUB_TOKEN"],
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
describe("renderDefaultAgentInstructions", () => {
|
|
103
|
+
it("renders the versioned template for the package", () => {
|
|
104
|
+
expect(DEFAULT_AGENT_INSTRUCTIONS_VERSION).toBe(1);
|
|
105
|
+
expect(renderDefaultAgentInstructions(read(thermos))).toBe(
|
|
106
|
+
[
|
|
107
|
+
"You are thermos: Code review with a thermonuclear standard",
|
|
108
|
+
"",
|
|
109
|
+
"Your skills:",
|
|
110
|
+
"- thermo-review: Review code thoroughly",
|
|
111
|
+
"",
|
|
112
|
+
"Your tools come from these MCP servers:",
|
|
113
|
+
"- my_github",
|
|
114
|
+
"",
|
|
115
|
+
"Before acting on a task a skill covers, read that skill and follow it. " +
|
|
116
|
+
"Use the tools your servers provide rather than guessing at their results. " +
|
|
117
|
+
"When you finish, state what you did and what you could not do.",
|
|
118
|
+
].join("\n"),
|
|
119
|
+
);
|
|
120
|
+
});
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
describe("planMaterialization", () => {
|
|
124
|
+
const pkg = read(thermos);
|
|
125
|
+
const plan = planMaterialization(
|
|
126
|
+
pkg,
|
|
127
|
+
inMemoryPluginFiles(thermos),
|
|
128
|
+
{ workflows: [], mcpServers: [] },
|
|
129
|
+
IDENTITY,
|
|
130
|
+
"first",
|
|
131
|
+
);
|
|
132
|
+
|
|
133
|
+
it("plans one skill, one server and one agent, in materialisation order", () => {
|
|
134
|
+
expect(
|
|
135
|
+
plan.members.map((m) => `${ApiResourceKind[m.kind]}:${m.slug}`),
|
|
136
|
+
).toEqual(["skill:thermo-review", "mcp_server:mygithub", "agent:thermos"]);
|
|
137
|
+
expect(plan.tag).toBe("1.2.0");
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
it("writes the skill's archive rooted at SKILL.md and stamps the plugin's labels on the request", () => {
|
|
141
|
+
const skill = plan.skills[0]!;
|
|
142
|
+
expect(skill.request.labels).toEqual({
|
|
143
|
+
[PLUGIN_LABEL]: "plg_1",
|
|
144
|
+
[PLUGIN_VERSION_LABEL]: "d".repeat(64),
|
|
145
|
+
});
|
|
146
|
+
expect(skill.request.tag).toBe("1.2.0");
|
|
147
|
+
expect(skill.request.message).toBe("first");
|
|
148
|
+
const { entries } = openArchive(skill.request.artifact);
|
|
149
|
+
expect(entries.map((e) => e.name)).toEqual([
|
|
150
|
+
"SKILL.md",
|
|
151
|
+
"references/checklist.md",
|
|
152
|
+
]);
|
|
153
|
+
expect(
|
|
154
|
+
new TextDecoder().decode(inflateEntry(entries[0]!.entry, 1 << 20)),
|
|
155
|
+
).toContain("name: thermo-review");
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
it("names servers by slug everywhere a sub-agent or usage refers to them", () => {
|
|
159
|
+
expect(plan.mcpServers[0]).toMatchObject({
|
|
160
|
+
name: "my_github",
|
|
161
|
+
slug: "mygithub",
|
|
162
|
+
});
|
|
163
|
+
expect(
|
|
164
|
+
plan.mcpServers[0]!.resource.spec?.env["GITHUB_TOKEN"],
|
|
165
|
+
).toMatchObject({ isSecret: true, optional: false });
|
|
166
|
+
const agent = plan.agent!.resource;
|
|
167
|
+
expect(
|
|
168
|
+
agent.spec?.mcpServerUsages.map((u) => u.mcpServerRef?.slug),
|
|
169
|
+
).toEqual(["mygithub"]);
|
|
170
|
+
expect(
|
|
171
|
+
agent.spec?.subAgents.map((s) => s.mcpAccess.map((a) => a.mcpServer)),
|
|
172
|
+
).toEqual([["mygithub"], ["mygithub"]]);
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
it("records a model hint and a built-in name as warnings and never sets model_override", () => {
|
|
176
|
+
expect(
|
|
177
|
+
plan.agent!.resource.spec?.subAgents.map((s) => s.modelOverride),
|
|
178
|
+
).toEqual(["", ""]);
|
|
179
|
+
expect(plan.warnings.map((w) => `${w.kind}:${w.path}`)).toEqual(
|
|
180
|
+
expect.arrayContaining([
|
|
181
|
+
"model-hint-unresolved:agents/reviewer.md",
|
|
182
|
+
"sub-agent-name-builtin:agents/explore.md",
|
|
183
|
+
]),
|
|
184
|
+
);
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
it("plans no agent for an MCP-only package", () => {
|
|
188
|
+
const mcpOnly = openPlugin({
|
|
189
|
+
name: "github",
|
|
190
|
+
mcpServers: {
|
|
191
|
+
github: { type: "streamable-http", url: "https://example.com/mcp" },
|
|
192
|
+
},
|
|
193
|
+
});
|
|
194
|
+
const onlyPlan = planMaterialization(
|
|
195
|
+
read(mcpOnly),
|
|
196
|
+
inMemoryPluginFiles(mcpOnly),
|
|
197
|
+
{ workflows: [], mcpServers: [] },
|
|
198
|
+
IDENTITY,
|
|
199
|
+
"",
|
|
200
|
+
);
|
|
201
|
+
expect(onlyPlan.agent).toBeUndefined();
|
|
202
|
+
expect(onlyPlan.members.map((m) => ApiResourceKind[m.kind])).toEqual([
|
|
203
|
+
"mcp_server",
|
|
204
|
+
]);
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
it("warns and leaves the tag empty when the manifest version does not fit the tag pattern", () => {
|
|
208
|
+
const built = cursorPlugin({
|
|
209
|
+
name: "b",
|
|
210
|
+
version: "1.0.0+build.7",
|
|
211
|
+
skills: [{ name: "s" }],
|
|
212
|
+
});
|
|
213
|
+
const builtPlan = planMaterialization(
|
|
214
|
+
read(built),
|
|
215
|
+
inMemoryPluginFiles(built),
|
|
216
|
+
{ workflows: [], mcpServers: [] },
|
|
217
|
+
IDENTITY,
|
|
218
|
+
"",
|
|
219
|
+
);
|
|
220
|
+
expect(builtPlan.tag).toBe("");
|
|
221
|
+
expect(builtPlan.warnings.map((w) => w.kind)).toContain(
|
|
222
|
+
"version-not-taggable",
|
|
223
|
+
);
|
|
224
|
+
expect(builtPlan.skills[0]!.request.tag).toBe("");
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
it("refuses a server overlay that redefines the transport", () => {
|
|
228
|
+
const overlay = create(McpServerSchema, {
|
|
229
|
+
spec: create(McpServerSpecSchema, {
|
|
230
|
+
serverType: {
|
|
231
|
+
case: "stdio",
|
|
232
|
+
value: create(StdioServerConfigSchema, { command: "npx" }),
|
|
233
|
+
},
|
|
234
|
+
}),
|
|
235
|
+
});
|
|
236
|
+
expect(() =>
|
|
237
|
+
planMaterialization(
|
|
238
|
+
pkg,
|
|
239
|
+
inMemoryPluginFiles(thermos),
|
|
240
|
+
{
|
|
241
|
+
workflows: [],
|
|
242
|
+
mcpServers: [
|
|
243
|
+
{
|
|
244
|
+
path: "ai.stigmer/mcp-servers/my_github.yaml",
|
|
245
|
+
server: "my_github",
|
|
246
|
+
resource: overlay,
|
|
247
|
+
},
|
|
248
|
+
],
|
|
249
|
+
},
|
|
250
|
+
IDENTITY,
|
|
251
|
+
"",
|
|
252
|
+
),
|
|
253
|
+
).toThrow(McpServerOverlayError);
|
|
254
|
+
});
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
describe("members: convergence and drops", () => {
|
|
258
|
+
const digest = "d".repeat(64);
|
|
259
|
+
const stored: Member[] = [
|
|
260
|
+
{
|
|
261
|
+
kind: ApiResourceKind.skill,
|
|
262
|
+
id: "skl_1",
|
|
263
|
+
slug: "thermo-review",
|
|
264
|
+
name: "thermo-review",
|
|
265
|
+
version: digest,
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
kind: ApiResourceKind.agent,
|
|
269
|
+
id: "agt_1",
|
|
270
|
+
slug: "thermos",
|
|
271
|
+
name: "thermos",
|
|
272
|
+
version: digest,
|
|
273
|
+
},
|
|
274
|
+
];
|
|
275
|
+
const planned = [
|
|
276
|
+
{
|
|
277
|
+
kind: ApiResourceKind.skill,
|
|
278
|
+
slug: "thermo-review",
|
|
279
|
+
name: "thermo-review",
|
|
280
|
+
},
|
|
281
|
+
{ kind: ApiResourceKind.agent, slug: "thermos", name: "thermos" },
|
|
282
|
+
];
|
|
283
|
+
|
|
284
|
+
it("converges only when every planned member is present and stamped with the digest", () => {
|
|
285
|
+
expect(membersConverge(stored, planned, digest)).toBe(true);
|
|
286
|
+
expect(membersConverge(stored, planned, "e".repeat(64))).toBe(false);
|
|
287
|
+
expect(membersConverge(stored.slice(1), planned, digest)).toBe(false);
|
|
288
|
+
expect(
|
|
289
|
+
membersConverge(
|
|
290
|
+
[...stored, { ...stored[0]!, slug: "extra", id: "skl_2" }],
|
|
291
|
+
planned,
|
|
292
|
+
digest,
|
|
293
|
+
),
|
|
294
|
+
).toBe(false);
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
it("drops the members the plan no longer names", () => {
|
|
298
|
+
expect(droppedMembers(stored, planned.slice(1)).map((m) => m.slug)).toEqual(
|
|
299
|
+
["thermo-review"],
|
|
300
|
+
);
|
|
301
|
+
expect(droppedMembers(stored, planned)).toEqual([]);
|
|
302
|
+
});
|
|
303
|
+
});
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pins the overlay parser as the server twin of the SDK's strict manifest
|
|
3
|
+
* parse: a document the CLI accepts parses (camelCase and proto field
|
|
4
|
+
* names both), an unknown field refuses naming the path, a wrong `kind`
|
|
5
|
+
* refuses, a missing `kind` refuses, an empty or non-mapping document
|
|
6
|
+
* refuses, a foreign `metadata.org` refuses while an empty or matching
|
|
7
|
+
* one passes, and malformed YAML refuses with the parser's message.
|
|
8
|
+
*/
|
|
9
|
+
import { describe, expect, it } from "vitest";
|
|
10
|
+
|
|
11
|
+
import { AgentSchema } from "@stigmer/protos/ai/stigmer/agentic/agent/v1/api_pb";
|
|
12
|
+
|
|
13
|
+
import { OverlayParseError, parseOverlayDocument } from "../overlay/parse.js";
|
|
14
|
+
|
|
15
|
+
const encoder = new TextEncoder();
|
|
16
|
+
const AGENT = { schema: AgentSchema, yamlKind: "Agent", org: "acme" };
|
|
17
|
+
|
|
18
|
+
function parse(text: string) {
|
|
19
|
+
return parseOverlayDocument(
|
|
20
|
+
"ai.stigmer/agent.yaml",
|
|
21
|
+
encoder.encode(text),
|
|
22
|
+
AGENT,
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function refusal(text: string): string {
|
|
27
|
+
try {
|
|
28
|
+
parse(text);
|
|
29
|
+
} catch (error) {
|
|
30
|
+
expect(error).toBeInstanceOf(OverlayParseError);
|
|
31
|
+
return (error as OverlayParseError).message;
|
|
32
|
+
}
|
|
33
|
+
throw new Error("expected a refusal");
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
describe("parseOverlayDocument", () => {
|
|
37
|
+
it("parses a document the CLI accepts, in either field casing", () => {
|
|
38
|
+
const agent = parse(
|
|
39
|
+
"apiVersion: agentic.stigmer.ai/v1\nkind: Agent\nmetadata:\n name: thermos\nspec:\n instructions: Long enough instructions here.\n skill_refs:\n - slug: a\n skillRefs:\n - slug: b\n",
|
|
40
|
+
);
|
|
41
|
+
expect(agent.metadata?.name).toBe("thermos");
|
|
42
|
+
expect(agent.spec?.skillRefs.map((r) => r.slug)).toContain("b");
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
it("refuses an unknown field, naming the document", () => {
|
|
46
|
+
expect(
|
|
47
|
+
refusal("kind: Agent\nmetadata:\n name: t\nspec:\n colour: blue\n"),
|
|
48
|
+
).toContain("overlay document 'ai.stigmer/agent.yaml': invalid Agent:");
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it("refuses a kind other than the one its location holds", () => {
|
|
52
|
+
expect(refusal("kind: Workflow\nmetadata:\n name: t\n")).toBe(
|
|
53
|
+
"overlay document 'ai.stigmer/agent.yaml': kind 'Workflow' is not the Agent this location holds",
|
|
54
|
+
);
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it("refuses a missing kind", () => {
|
|
58
|
+
expect(refusal("metadata:\n name: t\n")).toContain(
|
|
59
|
+
"missing the required 'kind' field (expected kind: Agent)",
|
|
60
|
+
);
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
it("refuses an empty or non-mapping document", () => {
|
|
64
|
+
expect(refusal(" \n")).toContain("the document is empty");
|
|
65
|
+
expect(refusal("- a\n- b\n")).toContain("expected a mapping document");
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it("refuses a foreign org and accepts an empty or matching one", () => {
|
|
69
|
+
expect(
|
|
70
|
+
refusal("kind: Agent\nmetadata:\n name: t\n org: other\n"),
|
|
71
|
+
).toContain(
|
|
72
|
+
"metadata.org 'other' is not the organization the plugin is installed into ('acme')",
|
|
73
|
+
);
|
|
74
|
+
expect(
|
|
75
|
+
parse("kind: Agent\nmetadata:\n name: t\n org: acme\n").metadata?.org,
|
|
76
|
+
).toBe("acme");
|
|
77
|
+
expect(parse("kind: Agent\nmetadata:\n name: t\n").metadata?.org).toBe("");
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
it("refuses malformed YAML with the parser's message", () => {
|
|
81
|
+
expect(refusal("kind: Agent\nmetadata: [unclosed\n")).toContain(
|
|
82
|
+
"invalid YAML:",
|
|
83
|
+
);
|
|
84
|
+
});
|
|
85
|
+
});
|