@bevel-software/platform-core-backend 0.20.0 → 0.21.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/dist/core/catalog-cache-invalidation.d.ts +7 -2
- package/dist/core/catalog-cache-invalidation.d.ts.map +1 -1
- package/dist/core/catalog-cache-invalidation.js +8 -9
- package/dist/core/catalog-cache-invalidation.js.map +1 -1
- package/dist/core/core-ports.d.ts +19 -0
- package/dist/core/core-ports.d.ts.map +1 -1
- package/dist/core/core-ports.js.map +1 -1
- package/dist/core/create-core-server.d.ts +2 -0
- package/dist/core/create-core-server.d.ts.map +1 -1
- package/dist/core/create-core-server.js +23 -105
- package/dist/core/create-core-server.js.map +1 -1
- package/dist/core/create-core-services.d.ts +30 -5
- package/dist/core/create-core-services.d.ts.map +1 -1
- package/dist/core/create-core-services.js +136 -81
- package/dist/core/create-core-services.js.map +1 -1
- package/dist/core/lifecycle.d.ts +74 -28
- package/dist/core/lifecycle.d.ts.map +1 -1
- package/dist/core/lifecycle.js +157 -20
- package/dist/core/lifecycle.js.map +1 -1
- package/dist/core/public-config.d.ts +5 -1
- package/dist/core/public-config.d.ts.map +1 -1
- package/dist/core/public-config.js +7 -5
- package/dist/core/public-config.js.map +1 -1
- package/dist/core-config.d.ts +95 -1
- package/dist/core-config.d.ts.map +1 -1
- package/dist/core-config.js +24 -8
- package/dist/core-config.js.map +1 -1
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -3
- package/dist/index.js.map +1 -1
- package/dist/modules/access/access-control.service.d.ts +18 -1
- package/dist/modules/access/access-control.service.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.js +19 -8
- package/dist/modules/access/access-control.service.js.map +1 -1
- package/dist/modules/access/access.routes.d.ts +2 -1
- package/dist/modules/access/access.routes.d.ts.map +1 -1
- package/dist/modules/access/access.routes.js +10 -10
- package/dist/modules/access/access.routes.js.map +1 -1
- package/dist/modules/access/change-read-gate.d.ts +6 -3
- package/dist/modules/access/change-read-gate.d.ts.map +1 -1
- package/dist/modules/access/change-read-gate.js +9 -6
- package/dist/modules/access/change-read-gate.js.map +1 -1
- package/dist/modules/access/creator-access.d.ts +4 -2
- package/dist/modules/access/creator-access.d.ts.map +1 -1
- package/dist/modules/access/creator-access.js +7 -4
- package/dist/modules/access/creator-access.js.map +1 -1
- package/dist/modules/agent-instructions/read-preamble.d.ts +2 -1
- package/dist/modules/agent-instructions/read-preamble.d.ts.map +1 -1
- package/dist/modules/agent-instructions/read-preamble.js +6 -9
- package/dist/modules/agent-instructions/read-preamble.js.map +1 -1
- package/dist/modules/auth/account-admission.d.ts +40 -0
- package/dist/modules/auth/account-admission.d.ts.map +1 -0
- package/dist/modules/auth/account-admission.js +17 -0
- package/dist/modules/auth/account-admission.js.map +1 -0
- package/dist/modules/auth/account.routes.d.ts.map +1 -1
- package/dist/modules/auth/account.routes.js +4 -1
- package/dist/modules/auth/account.routes.js.map +1 -1
- package/dist/modules/auth/auth.service.d.ts +19 -1
- package/dist/modules/auth/auth.service.d.ts.map +1 -1
- package/dist/modules/auth/auth.service.js +33 -1
- package/dist/modules/auth/auth.service.js.map +1 -1
- package/dist/modules/auth/oidc-auth-provider.d.ts.map +1 -1
- package/dist/modules/auth/oidc-auth-provider.js +9 -0
- package/dist/modules/auth/oidc-auth-provider.js.map +1 -1
- package/dist/modules/connection-probe/connection-probe.service.d.ts +13 -1
- package/dist/modules/connection-probe/connection-probe.service.d.ts.map +1 -1
- package/dist/modules/connection-probe/connection-probe.service.js +10 -2
- package/dist/modules/connection-probe/connection-probe.service.js.map +1 -1
- package/dist/modules/database/advisory-lock.d.ts +17 -0
- package/dist/modules/database/advisory-lock.d.ts.map +1 -1
- package/dist/modules/database/advisory-lock.js +24 -3
- package/dist/modules/database/advisory-lock.js.map +1 -1
- package/dist/modules/database/connection.d.ts +67 -2
- package/dist/modules/database/connection.d.ts.map +1 -1
- package/dist/modules/database/connection.js +118 -12
- package/dist/modules/database/connection.js.map +1 -1
- package/dist/modules/database/migrate.d.ts +1 -1
- package/dist/modules/database/migrate.d.ts.map +1 -1
- package/dist/modules/database/migrate.js +27 -3
- package/dist/modules/database/migrate.js.map +1 -1
- package/dist/modules/kb-fs/branch-name.d.ts +0 -1
- package/dist/modules/kb-fs/branch-name.d.ts.map +1 -1
- package/dist/modules/kb-fs/branch-name.js +3 -3
- package/dist/modules/kb-fs/branch-name.js.map +1 -1
- package/dist/modules/kb-fs/clone-config.d.ts +9 -8
- package/dist/modules/kb-fs/clone-config.d.ts.map +1 -1
- package/dist/modules/kb-fs/clone-config.js +14 -12
- package/dist/modules/kb-fs/clone-config.js.map +1 -1
- package/dist/modules/mcp/mcp.service.d.ts +7 -0
- package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
- package/dist/modules/mcp/mcp.service.js +4 -4
- package/dist/modules/mcp/mcp.service.js.map +1 -1
- package/dist/modules/plugins/compile/marketplace-compiler.service.d.ts +4 -4
- package/dist/modules/plugins/compile/marketplace-compiler.service.d.ts.map +1 -1
- package/dist/modules/plugins/compile/marketplace-compiler.service.js +7 -10
- package/dist/modules/plugins/compile/marketplace-compiler.service.js.map +1 -1
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.d.ts +4 -1
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.d.ts.map +1 -1
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.js +5 -3
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.js.map +1 -1
- package/dist/modules/plugins/discovery/kb-plugin-source.d.ts +6 -1
- package/dist/modules/plugins/discovery/kb-plugin-source.d.ts.map +1 -1
- package/dist/modules/plugins/discovery/kb-plugin-source.js +14 -9
- package/dist/modules/plugins/discovery/kb-plugin-source.js.map +1 -1
- package/dist/modules/plugins/discovery/native.source.d.ts +4 -1
- package/dist/modules/plugins/discovery/native.source.d.ts.map +1 -1
- package/dist/modules/plugins/discovery/native.source.js +4 -2
- package/dist/modules/plugins/discovery/native.source.js.map +1 -1
- package/dist/modules/plugins/index.d.ts +1 -1
- package/dist/modules/plugins/index.d.ts.map +1 -1
- package/dist/modules/plugins/index.js +1 -1
- package/dist/modules/plugins/index.js.map +1 -1
- package/dist/modules/plugins/join-request-jobs.service.d.ts +3 -1
- package/dist/modules/plugins/join-request-jobs.service.d.ts.map +1 -1
- package/dist/modules/plugins/join-request-jobs.service.js +6 -6
- package/dist/modules/plugins/join-request-jobs.service.js.map +1 -1
- package/dist/modules/plugins/join-requests.service.d.ts +3 -1
- package/dist/modules/plugins/join-requests.service.d.ts.map +1 -1
- package/dist/modules/plugins/join-requests.service.js +9 -8
- package/dist/modules/plugins/join-requests.service.js.map +1 -1
- package/dist/modules/plugins/plugin-links.d.ts +65 -10
- package/dist/modules/plugins/plugin-links.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-links.js +136 -31
- package/dist/modules/plugins/plugin-links.js.map +1 -1
- package/dist/modules/plugins/plugin-links.service.d.ts +107 -5
- package/dist/modules/plugins/plugin-links.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-links.service.js +151 -21
- package/dist/modules/plugins/plugin-links.service.js.map +1 -1
- package/dist/modules/plugins/plugin-provision.service.d.ts +10 -3
- package/dist/modules/plugins/plugin-provision.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-provision.service.js +33 -26
- package/dist/modules/plugins/plugin-provision.service.js.map +1 -1
- package/dist/modules/plugins/plugin-rename.service.d.ts +4 -2
- package/dist/modules/plugins/plugin-rename.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-rename.service.js +10 -12
- package/dist/modules/plugins/plugin-rename.service.js.map +1 -1
- package/dist/modules/plugins/plugins.routes.d.ts +3 -0
- package/dist/modules/plugins/plugins.routes.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.routes.js +45 -15
- package/dist/modules/plugins/plugins.routes.js.map +1 -1
- package/dist/modules/plugins/plugins.service.d.ts +4 -4
- package/dist/modules/plugins/plugins.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.service.js +7 -10
- package/dist/modules/plugins/plugins.service.js.map +1 -1
- package/dist/modules/plugins/teams.routes.d.ts +4 -1
- package/dist/modules/plugins/teams.routes.d.ts.map +1 -1
- package/dist/modules/plugins/teams.routes.js +11 -9
- package/dist/modules/plugins/teams.routes.js.map +1 -1
- package/dist/modules/secrets-vault/index.d.ts +1 -1
- package/dist/modules/secrets-vault/index.d.ts.map +1 -1
- package/dist/modules/secrets-vault/index.js +1 -1
- package/dist/modules/secrets-vault/index.js.map +1 -1
- package/dist/modules/secrets-vault/secrets-variable-loader.d.ts +29 -11
- package/dist/modules/secrets-vault/secrets-variable-loader.d.ts.map +1 -1
- package/dist/modules/secrets-vault/secrets-variable-loader.js +46 -21
- package/dist/modules/secrets-vault/secrets-variable-loader.js.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.routes.d.ts +3 -0
- package/dist/modules/secrets-vault/secrets-vault.routes.d.ts.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.routes.js +4 -6
- package/dist/modules/secrets-vault/secrets-vault.routes.js.map +1 -1
- package/dist/modules/settings/deployment-settings.service.d.ts +12 -8
- package/dist/modules/settings/deployment-settings.service.d.ts.map +1 -1
- package/dist/modules/settings/deployment-settings.service.js +20 -22
- package/dist/modules/settings/deployment-settings.service.js.map +1 -1
- package/dist/modules/settings/setup.routes.d.ts +9 -2
- package/dist/modules/settings/setup.routes.d.ts.map +1 -1
- package/dist/modules/settings/setup.routes.js +20 -14
- package/dist/modules/settings/setup.routes.js.map +1 -1
- package/dist/modules/skills/allowed-tools-check.d.ts +4 -3
- package/dist/modules/skills/allowed-tools-check.d.ts.map +1 -1
- package/dist/modules/skills/allowed-tools-check.js +8 -8
- package/dist/modules/skills/allowed-tools-check.js.map +1 -1
- package/dist/modules/skills/pending-skills.service.d.ts +3 -1
- package/dist/modules/skills/pending-skills.service.d.ts.map +1 -1
- package/dist/modules/skills/pending-skills.service.js +9 -6
- package/dist/modules/skills/pending-skills.service.js.map +1 -1
- package/dist/modules/skills/skill-access-requests.routes.d.ts +2 -1
- package/dist/modules/skills/skill-access-requests.routes.d.ts.map +1 -1
- package/dist/modules/skills/skill-access-requests.routes.js +6 -6
- package/dist/modules/skills/skill-access-requests.routes.js.map +1 -1
- package/dist/modules/skills/skills.routes.d.ts +4 -1
- package/dist/modules/skills/skills.routes.d.ts.map +1 -1
- package/dist/modules/skills/skills.routes.js +4 -4
- package/dist/modules/skills/skills.routes.js.map +1 -1
- package/dist/modules/skills/skills.service.d.ts +4 -2
- package/dist/modules/skills/skills.service.d.ts.map +1 -1
- package/dist/modules/skills/skills.service.js +13 -11
- package/dist/modules/skills/skills.service.js.map +1 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.d.ts +2 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.d.ts.map +1 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.js +6 -5
- package/dist/modules/tool-manuals/mcp-json-discovery.js.map +1 -1
- package/dist/modules/tool-manuals/mcp-server-edit.service.d.ts +4 -2
- package/dist/modules/tool-manuals/mcp-server-edit.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/mcp-server-edit.service.js +12 -10
- package/dist/modules/tool-manuals/mcp-server-edit.service.js.map +1 -1
- package/dist/modules/tool-manuals/pending-tools.service.d.ts +3 -1
- package/dist/modules/tool-manuals/pending-tools.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/pending-tools.service.js +19 -16
- package/dist/modules/tool-manuals/pending-tools.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-delete.service.d.ts +4 -2
- package/dist/modules/tool-manuals/tool-delete.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-delete.service.js +14 -12
- package/dist/modules/tool-manuals/tool-delete.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.routes.d.ts +3 -1
- package/dist/modules/tool-manuals/tool-manuals.routes.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.routes.js +7 -7
- package/dist/modules/tool-manuals/tool-manuals.routes.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts +4 -2
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.js +15 -12
- package/dist/modules/tool-manuals/tool-manuals.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts +3 -0
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.js +4 -6
- package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.d.ts +3 -2
- package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +1 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.js +9 -9
- package/dist/modules/workflow/agent-tools/workflow.tools.js.map +1 -1
- package/dist/modules/workflow/git/git.service.d.ts +11 -5
- package/dist/modules/workflow/git/git.service.d.ts.map +1 -1
- package/dist/modules/workflow/git/git.service.js +23 -14
- package/dist/modules/workflow/git/git.service.js.map +1 -1
- package/dist/modules/workflow/git/node-git-runner.d.ts +26 -2
- package/dist/modules/workflow/git/node-git-runner.d.ts.map +1 -1
- package/dist/modules/workflow/git/node-git-runner.js +35 -5
- package/dist/modules/workflow/git/node-git-runner.js.map +1 -1
- package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts.map +1 -1
- package/dist/modules/workflow/review-workflow/review-workflow.service.js +9 -4
- package/dist/modules/workflow/review-workflow/review-workflow.service.js.map +1 -1
- package/dist/modules/workflow/session-ontology.service.d.ts +6 -1
- package/dist/modules/workflow/session-ontology.service.d.ts.map +1 -1
- package/dist/modules/workflow/session-ontology.service.js +6 -2
- package/dist/modules/workflow/session-ontology.service.js.map +1 -1
- package/dist/modules/workflow/workflow.service.d.ts +8 -3
- package/dist/modules/workflow/workflow.service.d.ts.map +1 -1
- package/dist/modules/workflow/workflow.service.js +33 -23
- package/dist/modules/workflow/workflow.service.js.map +1 -1
- package/dist/modules/workspace/session-ontology.gate.d.ts +3 -1
- package/dist/modules/workspace/session-ontology.gate.d.ts.map +1 -1
- package/dist/modules/workspace/session-ontology.gate.js +3 -3
- package/dist/modules/workspace/session-ontology.gate.js.map +1 -1
- package/dist/modules/workspace/startup/kb-git.d.ts +4 -3
- package/dist/modules/workspace/startup/kb-git.d.ts.map +1 -1
- package/dist/modules/workspace/startup/kb-git.js +15 -13
- package/dist/modules/workspace/startup/kb-git.js.map +1 -1
- package/dist/modules/workspace/startup/kb-startup-runner.d.ts +5 -8
- package/dist/modules/workspace/startup/kb-startup-runner.d.ts.map +1 -1
- package/dist/modules/workspace/startup/kb-startup-runner.js +35 -38
- package/dist/modules/workspace/startup/kb-startup-runner.js.map +1 -1
- package/dist/modules/workspace/startup/steps/groups-to-plugins.step.d.ts +7 -1
- package/dist/modules/workspace/startup/steps/groups-to-plugins.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/groups-to-plugins.step.js +23 -16
- package/dist/modules/workspace/startup/steps/groups-to-plugins.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/personal-spaces.step.d.ts +7 -1
- package/dist/modules/workspace/startup/steps/personal-spaces.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/personal-spaces.step.js +12 -5
- package/dist/modules/workspace/startup/steps/personal-spaces.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/plugin-display-names.step.d.ts +7 -1
- package/dist/modules/workspace/startup/steps/plugin-display-names.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/plugin-display-names.step.js +12 -5
- package/dist/modules/workspace/startup/steps/plugin-display-names.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.d.ts +7 -1
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.js +12 -5
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/seed-tree.d.ts +4 -1
- package/dist/modules/workspace/startup/steps/seed-tree.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/seed-tree.js +14 -11
- package/dist/modules/workspace/startup/steps/seed-tree.js.map +1 -1
- package/dist/modules/workspace/startup/steps/template-files.step.d.ts +17 -3
- package/dist/modules/workspace/startup/steps/template-files.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/template-files.step.js +36 -30
- package/dist/modules/workspace/startup/steps/template-files.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/template-source.d.ts +6 -1
- package/dist/modules/workspace/startup/steps/template-source.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/template-source.js +10 -6
- package/dist/modules/workspace/startup/steps/template-source.js.map +1 -1
- package/dist/modules/workspace/workspace.routes.d.ts +2 -1
- package/dist/modules/workspace/workspace.routes.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.routes.js +8 -7
- package/dist/modules/workspace/workspace.routes.js.map +1 -1
- package/dist/modules/workspace/workspace.service.d.ts +18 -12
- package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.service.js +32 -28
- package/dist/modules/workspace/workspace.service.js.map +1 -1
- package/dist/modules/workspace/workspace.tools.d.ts +2 -1
- package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.tools.js +20 -18
- package/dist/modules/workspace/workspace.tools.js.map +1 -1
- package/dist/modules/workspace/write-denial.d.ts +3 -2
- package/dist/modules/workspace/write-denial.d.ts.map +1 -1
- package/dist/modules/workspace/write-denial.js +6 -5
- package/dist/modules/workspace/write-denial.js.map +1 -1
- package/dist/shared/git.contract.d.ts +52 -7
- package/dist/shared/git.contract.d.ts.map +1 -1
- package/dist/shared/git.contract.js +30 -8
- package/dist/shared/git.contract.js.map +1 -1
- package/dist/shared/kb-context.d.ts +76 -0
- package/dist/shared/kb-context.d.ts.map +1 -0
- package/dist/shared/kb-context.js +108 -0
- package/dist/shared/kb-context.js.map +1 -0
- package/dist/shared/kb-layout.d.ts +3 -2
- package/dist/shared/kb-layout.d.ts.map +1 -1
- package/dist/shared/kb-layout.js +4 -3
- package/dist/shared/kb-layout.js.map +1 -1
- package/dist/shared/kb-layout.test.js +35 -27
- package/dist/shared/kb-layout.test.js.map +1 -1
- package/dist/shared/pending-proposals.d.ts +4 -1
- package/dist/shared/pending-proposals.d.ts.map +1 -1
- package/dist/shared/pending-proposals.js +3 -4
- package/dist/shared/pending-proposals.js.map +1 -1
- package/dist/shared/redact-secret.d.ts +5 -5
- package/dist/shared/redact-secret.js +5 -5
- package/dist/tenancy/index.d.ts +13 -0
- package/dist/tenancy/index.d.ts.map +1 -0
- package/dist/tenancy/index.js +13 -0
- package/dist/tenancy/index.js.map +1 -0
- package/dist/tenancy/static-tenant-source.d.ts +98 -0
- package/dist/tenancy/static-tenant-source.d.ts.map +1 -0
- package/dist/tenancy/static-tenant-source.js +220 -0
- package/dist/tenancy/static-tenant-source.js.map +1 -0
- package/dist/tenancy/tenant-host.d.ts +80 -0
- package/dist/tenancy/tenant-host.d.ts.map +1 -0
- package/dist/tenancy/tenant-host.js +217 -0
- package/dist/tenancy/tenant-host.js.map +1 -0
- package/dist/tenancy/tenant-runtime.d.ts +91 -0
- package/dist/tenancy/tenant-runtime.d.ts.map +1 -0
- package/dist/tenancy/tenant-runtime.js +174 -0
- package/dist/tenancy/tenant-runtime.js.map +1 -0
- package/dist/tenancy/tenant-secrets.d.ts +24 -0
- package/dist/tenancy/tenant-secrets.d.ts.map +1 -0
- package/dist/tenancy/tenant-secrets.js +30 -0
- package/dist/tenancy/tenant-secrets.js.map +1 -0
- package/dist/tenancy/tenant-source.contract.d.ts +45 -0
- package/dist/tenancy/tenant-source.contract.d.ts.map +1 -0
- package/dist/tenancy/tenant-source.contract.js +21 -0
- package/dist/tenancy/tenant-source.contract.js.map +1 -0
- package/migrations/0000_core_init.sql +14 -14
- package/migrations/0003_deployment_settings.sql +1 -1
- package/migrations/0005_github_facade.sql +1 -1
- package/migrations/0012_agent_audit.sql +6 -6
- package/package.json +3 -3
- package/src/__tests__/branch-model.test.ts +7 -6
- package/src/__tests__/kb-context.ts +30 -0
- package/src/__tests__/kb-layout-config.test.ts +35 -30
- package/src/core/__tests__/catalog-cache-invalidation.test.ts +2 -1
- package/src/core/__tests__/lifecycle.test.ts +78 -1
- package/src/core/__tests__/public-config.test.ts +5 -1
- package/src/core/catalog-cache-invalidation.ts +16 -11
- package/src/core/core-ports.ts +19 -0
- package/src/core/create-core-server.ts +27 -106
- package/src/core/create-core-services.ts +180 -95
- package/src/core/lifecycle.ts +214 -29
- package/src/core/public-config.ts +8 -5
- package/src/core-config.ts +107 -8
- package/src/index.ts +25 -2
- package/src/modules/access/__tests__/access-control.admin-root-floor.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.batch.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.folder-governs.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.group-grant.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.overrides.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.proposal-branch.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.prospective.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.revoke.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.unknown-email.test.ts +2 -1
- package/src/modules/access/__tests__/change-read-gate.test.ts +13 -11
- package/src/modules/access/__tests__/creator-access.test.ts +3 -2
- package/src/modules/access/__tests__/roles.routes.test.ts +2 -1
- package/src/modules/access/access-control.service.ts +20 -6
- package/src/modules/access/access.routes.ts +10 -13
- package/src/modules/access/change-read-gate.ts +10 -4
- package/src/modules/access/creator-access.ts +7 -2
- package/src/modules/agent-instructions/__tests__/read-preamble.test.ts +13 -12
- package/src/modules/agent-instructions/read-preamble.ts +10 -12
- package/src/modules/auth/__tests__/account.routes.test.ts +15 -0
- package/src/modules/auth/__tests__/auth.service.test.ts +60 -0
- package/src/modules/auth/account-admission.ts +44 -0
- package/src/modules/auth/account.routes.ts +4 -1
- package/src/modules/auth/auth.service.ts +33 -1
- package/src/modules/auth/oidc-auth-provider.ts +9 -0
- package/src/modules/connection-probe/connection-probe.service.ts +7 -1
- package/src/modules/database/__tests__/advisory-lock.test.ts +23 -1
- package/src/modules/database/__tests__/connection.test.ts +98 -0
- package/src/modules/database/__tests__/migrations-unqualified.test.ts +32 -0
- package/src/modules/database/advisory-lock.ts +28 -4
- package/src/modules/database/connection.ts +143 -13
- package/src/modules/database/migrate.ts +48 -14
- package/src/modules/diff/__tests__/diff.service.seed-atomicity.test.ts +2 -1
- package/src/modules/diff/__tests__/diff.service.test.ts +2 -1
- package/src/modules/kb-fs/__tests__/branch-name.test.ts +6 -6
- package/src/modules/kb-fs/__tests__/clone-config.test.ts +24 -20
- package/src/modules/kb-fs/branch-name.ts +3 -3
- package/src/modules/kb-fs/clone-config.ts +15 -12
- package/src/modules/marketplace/__tests__/marketplace-repo.head.test.ts +2 -1
- package/src/modules/mcp/mcp.service.ts +11 -4
- package/src/modules/plugins/__tests__/bundle-dialect.e2e.test.ts +12 -11
- package/src/modules/plugins/__tests__/bundle-dialect.test.ts +2 -1
- package/src/modules/plugins/__tests__/compile-marketplace.test.ts +6 -4
- package/src/modules/plugins/__tests__/join-request-jobs.service.test.ts +2 -1
- package/src/modules/plugins/__tests__/join-requests.service.test.ts +2 -1
- package/src/modules/plugins/__tests__/plugin-creation-display-name.test.ts +4 -3
- package/src/modules/plugins/__tests__/plugin-index.service.test.ts +6 -4
- package/src/modules/plugins/__tests__/plugin-links.service.test.ts +220 -5
- package/src/modules/plugins/__tests__/plugin-provision.service.test.ts +3 -1
- package/src/modules/plugins/__tests__/plugin-rename.service.test.ts +7 -6
- package/src/modules/plugins/__tests__/plugins.routes.test.ts +11 -2
- package/src/modules/plugins/__tests__/teams.routes.test.ts +2 -1
- package/src/modules/plugins/compile/marketplace-compiler.service.ts +7 -9
- package/src/modules/plugins/discovery/__tests__/kb-plugin-source.test.ts +20 -16
- package/src/modules/plugins/discovery/bundle-dialect/bundle.source.ts +9 -2
- package/src/modules/plugins/discovery/kb-plugin-source.ts +15 -8
- package/src/modules/plugins/discovery/native.source.ts +4 -1
- package/src/modules/plugins/index.ts +1 -1
- package/src/modules/plugins/join-request-jobs.service.ts +8 -7
- package/src/modules/plugins/join-requests.service.ts +7 -7
- package/src/modules/plugins/plugin-links.service.ts +192 -19
- package/src/modules/plugins/plugin-links.ts +147 -27
- package/src/modules/plugins/plugin-provision.service.ts +54 -27
- package/src/modules/plugins/plugin-rename.service.ts +10 -10
- package/src/modules/plugins/plugins.routes.ts +45 -15
- package/src/modules/plugins/plugins.service.ts +7 -11
- package/src/modules/plugins/teams.routes.ts +16 -8
- package/src/modules/secrets-vault/__tests__/connect-pending.route.test.ts +7 -0
- package/src/modules/secrets-vault/__tests__/secrets-variable-loader.test.ts +40 -0
- package/src/modules/secrets-vault/__tests__/tool-owner-gate.route.test.ts +2 -0
- package/src/modules/secrets-vault/index.ts +2 -0
- package/src/modules/secrets-vault/secrets-variable-loader.ts +51 -21
- package/src/modules/secrets-vault/secrets-vault.routes.ts +7 -6
- package/src/modules/settings/__tests__/deployment-settings.service.test.ts +24 -11
- package/src/modules/settings/__tests__/git-root-folders.test.ts +2 -1
- package/src/modules/settings/__tests__/setup.routes.boot-failure.test.ts +2 -1
- package/src/modules/settings/__tests__/setup.routes.layout-phase.test.ts +7 -4
- package/src/modules/settings/__tests__/setup.routes.oidc.test.ts +2 -0
- package/src/modules/settings/__tests__/setup.routes.sync-status.test.ts +2 -0
- package/src/modules/settings/__tests__/setup.routes.test.ts +33 -52
- package/src/modules/settings/deployment-settings.service.ts +21 -20
- package/src/modules/settings/setup.routes.ts +26 -16
- package/src/modules/skills/__tests__/allowed-tools-check.test.ts +11 -10
- package/src/modules/skills/__tests__/allowed-tools-warn.tools.test.ts +4 -3
- package/src/modules/skills/__tests__/pending-skills.service.test.ts +3 -1
- package/src/modules/skills/__tests__/skill-access-requests.routes.test.ts +2 -1
- package/src/modules/skills/__tests__/skills.routes.warnings.test.ts +2 -1
- package/src/modules/skills/__tests__/skills.service.test.ts +3 -2
- package/src/modules/skills/allowed-tools-check.ts +7 -6
- package/src/modules/skills/pending-skills.service.ts +9 -8
- package/src/modules/skills/skill-access-requests.routes.ts +7 -7
- package/src/modules/skills/skills.routes.ts +4 -3
- package/src/modules/skills/skills.service.ts +13 -9
- package/src/modules/tool-helpers/__tests__/agent-roles-write.test.ts +3 -2
- package/src/modules/tool-helpers/__tests__/phase4-tools.test.ts +3 -2
- package/src/modules/tool-manuals/__tests__/mcp-json-discovery.test.ts +17 -12
- package/src/modules/tool-manuals/__tests__/mcp-server-edit.service.test.ts +2 -1
- package/src/modules/tool-manuals/__tests__/pending-tools.service.test.ts +4 -1
- package/src/modules/tool-manuals/__tests__/tool-delete.service.test.ts +2 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.archive.route.test.ts +2 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.cli.test.ts +5 -4
- package/src/modules/tool-manuals/__tests__/tool-manuals.detail.route.test.ts +2 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.invalid.routes.test.ts +4 -2
- package/src/modules/tool-manuals/__tests__/tool-manuals.invalid.test.ts +13 -5
- package/src/modules/tool-manuals/__tests__/tool-manuals.mcp-oauth.test.ts +2 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.restart.test.ts +9 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.service.test.ts +3 -2
- package/src/modules/tool-manuals/__tests__/tool-manuals.tools.test.ts +2 -0
- package/src/modules/tool-manuals/mcp-json-discovery.ts +6 -4
- package/src/modules/tool-manuals/mcp-server-edit.service.ts +13 -11
- package/src/modules/tool-manuals/pending-tools.service.ts +19 -16
- package/src/modules/tool-manuals/tool-delete.service.ts +13 -10
- package/src/modules/tool-manuals/tool-manuals.routes.ts +10 -8
- package/src/modules/tool-manuals/tool-manuals.service.ts +15 -13
- package/src/modules/tool-manuals/tool-manuals.tools.ts +7 -6
- package/src/modules/workflow/__tests__/apply-failure.test.ts +2 -1
- package/src/modules/workflow/__tests__/merge-announces-tree.test.ts +14 -26
- package/src/modules/workflow/__tests__/preserve-roles-yaml.test.ts +2 -1
- package/src/modules/workflow/__tests__/session-ontology.service.test.ts +3 -2
- package/src/modules/workflow/__tests__/workflow.routes.lock-path.test.ts +2 -1
- package/src/modules/workflow/__tests__/workflow.service.branch-in-use.test.ts +3 -10
- package/src/modules/workflow/__tests__/workflow.service.commitFileWhileLocked.test.ts +2 -1
- package/src/modules/workflow/__tests__/workflow.service.deleted-branch-sweep.test.ts +3 -10
- package/src/modules/workflow/__tests__/workflow.service.facade.test.ts +28 -27
- package/src/modules/workflow/__tests__/workflow.service.folder-proposals.test.ts +2 -1
- package/src/modules/workflow/__tests__/workflow.service.platform-restore.test.ts +2 -1
- package/src/modules/workflow/__tests__/workflow.service.read-gate.test.ts +3 -2
- package/src/modules/workflow/__tests__/workflow.service.releaseLock.test.ts +2 -1
- package/src/modules/workflow/__tests__/workflow.service.sync.test.ts +5 -4
- package/src/modules/workflow/__tests__/workflow.service.update-from-target.test.ts +2 -1
- package/src/modules/workflow/agent-tools/__tests__/workflow.tools.test.ts +2 -1
- package/src/modules/workflow/agent-tools/workflow.tools.ts +11 -9
- package/src/modules/workflow/git/__tests__/git.service.accessGating.test.ts +5 -4
- package/src/modules/workflow/git/__tests__/git.service.changedFilesForPr.test.ts +12 -11
- package/src/modules/workflow/git/__tests__/git.service.commitChanges.test.ts +9 -8
- package/src/modules/workflow/git/__tests__/git.service.commitFile.strayPath.test.ts +8 -7
- package/src/modules/workflow/git/__tests__/git.service.commitFile.test.ts +6 -5
- package/src/modules/workflow/git/__tests__/git.service.createBranch.test.ts +3 -2
- package/src/modules/workflow/git/__tests__/git.service.deleteBranch.test.ts +3 -2
- package/src/modules/workflow/git/__tests__/git.service.diffFileAtCommit.test.ts +7 -6
- package/src/modules/workflow/git/__tests__/git.service.diffFileBetweenBranches.test.ts +16 -15
- package/src/modules/workflow/git/__tests__/git.service.fileContentsAtCommit.test.ts +3 -2
- package/src/modules/workflow/git/__tests__/git.service.forkPoint.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.history-guards.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.list-branches.test.ts +10 -9
- package/src/modules/workflow/git/__tests__/git.service.listTrackedFiles.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.logForFile.test.ts +6 -5
- package/src/modules/workflow/git/__tests__/git.service.mergeChangeRequest.test.ts +9 -8
- package/src/modules/workflow/git/__tests__/git.service.pendingChanges.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.postMergePull.test.ts +4 -3
- package/src/modules/workflow/git/__tests__/git.service.pull.test.ts +9 -8
- package/src/modules/workflow/git/__tests__/git.service.readFileAtRef.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.revertPathsAndPush.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.status.test.ts +4 -3
- package/src/modules/workflow/git/__tests__/git.service.syncFromRemote.test.ts +8 -7
- package/src/modules/workflow/git/__tests__/node-git-runner.test.ts +41 -3
- package/src/modules/workflow/git/git.service.ts +24 -13
- package/src/modules/workflow/git/node-git-runner.ts +37 -4
- package/src/modules/workflow/review-workflow/review-workflow.service.ts +9 -6
- package/src/modules/workflow/session-ontology.service.ts +7 -2
- package/src/modules/workflow/workflow.service.ts +31 -24
- package/src/modules/workspace/__tests__/file-stat-access.test.ts +3 -2
- package/src/modules/workspace/__tests__/git-internals.security.test.ts +10 -9
- package/src/modules/workspace/__tests__/session-ontology.gate.test.ts +4 -2
- package/src/modules/workspace/__tests__/workspace-paths-inside-the-repo.test.ts +3 -2
- package/src/modules/workspace/__tests__/workspace.routes.branch-errors.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.create-grant.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.delete.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.download-implies-read.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.download.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.file-writes.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.folders.test.ts +5 -4
- package/src/modules/workspace/__tests__/workspace.routes.move-platform-files.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.read-gate.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.service.ensure-remotes-fetched.test.ts +2 -2
- package/src/modules/workspace/__tests__/workspace.service.list-cloned.test.ts +6 -5
- package/src/modules/workspace/__tests__/workspace.service.move-never-overwrites.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.service.read-filter.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.service.test.ts +84 -50
- package/src/modules/workspace/__tests__/workspace.service.unknown-branch.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.tools.agents-file.test.ts +10 -7
- package/src/modules/workspace/__tests__/workspace.tools.branch-errors.test.ts +4 -3
- package/src/modules/workspace/__tests__/workspace.tools.test.ts +9 -8
- package/src/modules/workspace/__tests__/write-denial.test.ts +5 -4
- package/src/modules/workspace/session-ontology.gate.ts +6 -4
- package/src/modules/workspace/startup/__tests__/kb-startup-runner.degraded.test.ts +6 -2
- package/src/modules/workspace/startup/__tests__/kb-startup-runner.test.ts +29 -21
- package/src/modules/workspace/startup/kb-git.ts +15 -22
- package/src/modules/workspace/startup/kb-startup-runner.ts +40 -46
- package/src/modules/workspace/startup/steps/__tests__/steps.test.ts +104 -98
- package/src/modules/workspace/startup/steps/groups-to-plugins.step.ts +24 -16
- package/src/modules/workspace/startup/steps/personal-spaces.step.ts +14 -5
- package/src/modules/workspace/startup/steps/plugin-display-names.step.ts +13 -5
- package/src/modules/workspace/startup/steps/plugin-manifests.step.ts +14 -5
- package/src/modules/workspace/startup/steps/seed-tree.ts +11 -9
- package/src/modules/workspace/startup/steps/template-files.step.ts +43 -34
- package/src/modules/workspace/startup/steps/template-source.ts +8 -5
- package/src/modules/workspace/workspace.routes.ts +8 -7
- package/src/modules/workspace/workspace.service.ts +30 -27
- package/src/modules/workspace/workspace.tools.ts +21 -20
- package/src/modules/workspace/write-denial.ts +7 -5
- package/src/shared/__tests__/kb-layout.plugin.test.ts +19 -16
- package/src/shared/git.contract.ts +70 -8
- package/src/shared/kb-context.ts +130 -0
- package/src/shared/kb-layout.test.ts +37 -27
- package/src/shared/kb-layout.ts +4 -3
- package/src/shared/pending-proposals.ts +7 -4
- package/src/shared/redact-secret.ts +5 -5
- package/src/tenancy/__tests__/static-tenant-source.test.ts +177 -0
- package/src/tenancy/__tests__/tenant-host.test.ts +372 -0
- package/src/tenancy/__tests__/tenant-runtime.test.ts +221 -0
- package/src/tenancy/__tests__/tenant-secrets.test.ts +35 -0
- package/src/tenancy/index.ts +35 -0
- package/src/tenancy/static-tenant-source.ts +296 -0
- package/src/tenancy/tenant-host.ts +261 -0
- package/src/tenancy/tenant-runtime.ts +208 -0
- package/src/tenancy/tenant-secrets.ts +41 -0
- package/src/tenancy/tenant-source.contract.ts +59 -0
|
@@ -13,6 +13,7 @@ import { execFile } from 'node:child_process';
|
|
|
13
13
|
import { promisify } from 'node:util';
|
|
14
14
|
import { WorkflowHooks } from '../../workflow/workflow-hooks.js';
|
|
15
15
|
import { GitService } from '../../workflow/git/git.service.js';
|
|
16
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
16
17
|
|
|
17
18
|
const execFileAsync = promisify(execFile);
|
|
18
19
|
|
|
@@ -53,7 +54,7 @@ describe('SkillService', () => {
|
|
|
53
54
|
} as unknown as IAccessControl;
|
|
54
55
|
|
|
55
56
|
const svc = (access: IAccessControl = allowAll) =>
|
|
56
|
-
new SkillService(workspaceService, access, KB_DIR, new NodeFs());
|
|
57
|
+
new SkillService(workspaceService, access, testKbContext({ kbDirName: KB_DIR }), new NodeFs());
|
|
57
58
|
|
|
58
59
|
beforeEach(async () => {
|
|
59
60
|
root = await mkdtemp(join(tmpdir(), 'skills-'));
|
|
@@ -377,7 +378,7 @@ describe('SkillService', () => {
|
|
|
377
378
|
|
|
378
379
|
const versioned = (access: IAccessControl = allowAll) => {
|
|
379
380
|
const service = svc(access);
|
|
380
|
-
service.setHistory(new GitService(workspaceService, new WorkflowHooks(), KB_DIR));
|
|
381
|
+
service.setHistory(new GitService(workspaceService, new WorkflowHooks(), testKbContext({ kbDirName: KB_DIR })));
|
|
381
382
|
return service;
|
|
382
383
|
};
|
|
383
384
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { PLUGINS_DIR, SKILLS_DIR } from '@bevel-software/platform-shared';
|
|
2
1
|
import { logger } from '../../shared/logging.js';
|
|
2
|
+
import type { KbContext } from '../../shared/kb-context.js';
|
|
3
3
|
import type { IToolRegistry } from '../tool-registry/tool.contract.js';
|
|
4
4
|
import {
|
|
5
5
|
EXTERNAL_KB_MANUAL_NAME,
|
|
@@ -236,11 +236,12 @@ function editDistance(a: string, b: string): number {
|
|
|
236
236
|
* Accepts the workspace spelling (`<kbDirName>/Plugins/…`) the save
|
|
237
237
|
* surfaces receive.
|
|
238
238
|
*/
|
|
239
|
-
export function skillFileRepoPath(
|
|
239
|
+
export function skillFileRepoPath(kb: Pick<KbContext, 'kbDirName' | 'layout'>, workspacePath: string): string | null {
|
|
240
240
|
const parts = workspacePath.split('/').filter((p) => p && p !== '.');
|
|
241
|
-
if (parts[0] === kbDirName) parts.shift();
|
|
241
|
+
if (parts[0] === kb.kbDirName) parts.shift();
|
|
242
242
|
if (parts.length < 3 || parts[parts.length - 1] !== 'SKILL.md') return null;
|
|
243
|
-
|
|
243
|
+
const { pluginsDir, skillsDir } = kb.layout;
|
|
244
|
+
return parts[0] === pluginsDir || parts[0] === skillsDir ? parts.join('/') : null;
|
|
244
245
|
}
|
|
245
246
|
|
|
246
247
|
/** What the save surfaces and `get_skill` depend on. */
|
|
@@ -267,7 +268,7 @@ export class AllowedToolsChecker implements IAllowedToolsChecker {
|
|
|
267
268
|
constructor(
|
|
268
269
|
private readonly registry: Pick<IToolRegistry, 'listExternal'>,
|
|
269
270
|
private readonly manuals: Pick<IToolManualService, 'listAccessible' | 'getDetail'>,
|
|
270
|
-
private readonly
|
|
271
|
+
private readonly kb: Pick<KbContext, 'kbDirName' | 'layout'>,
|
|
271
272
|
/**
|
|
272
273
|
* The cap `getDetail` applies to a manual's capabilities. Taken from the
|
|
273
274
|
* projection itself: a copy of the number here would silently start
|
|
@@ -300,7 +301,7 @@ export class AllowedToolsChecker implements IAllowedToolsChecker {
|
|
|
300
301
|
* fail because a check could not run).
|
|
301
302
|
*/
|
|
302
303
|
private declaredTools(workspacePath: string, content: string): readonly string[] | undefined {
|
|
303
|
-
if (skillFileRepoPath(this.
|
|
304
|
+
if (skillFileRepoPath(this.kb, workspacePath) === null) return undefined;
|
|
304
305
|
try {
|
|
305
306
|
return parseSkillFrontmatter(content).allowedTools;
|
|
306
307
|
} catch (err) {
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
PLUGINS_DIR,
|
|
3
|
-
SKILLS_DIR,
|
|
4
|
-
} from '@bevel-software/platform-shared';
|
|
1
|
+
import type { KbLayout } from '@bevel-software/platform-shared';
|
|
5
2
|
import { type WorkspaceService } from '../workspace/workspace.service.js';
|
|
6
3
|
import type { IAccessControl } from '../access/access-control.interface.js';
|
|
4
|
+
import type { KbContext } from '../../shared/kb-context.js';
|
|
7
5
|
import { resolveDeclaredId } from '../../shared/frontmatter-id.js';
|
|
8
6
|
import { visibleProposedFiles } from '../../shared/pending-proposals.js';
|
|
9
7
|
import { isSafeSkillName, parseSkillFrontmatter } from './skills.service.js';
|
|
@@ -40,6 +38,7 @@ export class PendingSkillsService implements IPendingSkillService {
|
|
|
40
38
|
private readonly accessControl: IAccessControl,
|
|
41
39
|
private readonly skillService: ISkillService,
|
|
42
40
|
private readonly workflow: IWorkflowService,
|
|
41
|
+
private readonly kb: KbContext,
|
|
43
42
|
) {}
|
|
44
43
|
|
|
45
44
|
async listPendingSkills(userEmail: string): Promise<PendingSkill[]> {
|
|
@@ -54,14 +53,16 @@ export class PendingSkillsService implements IPendingSkillService {
|
|
|
54
53
|
return [];
|
|
55
54
|
}
|
|
56
55
|
|
|
56
|
+
const layout = this.kb.layout;
|
|
57
57
|
const proposed = await visibleProposedFiles(
|
|
58
58
|
{
|
|
59
59
|
workspaceService: this.workspaceService,
|
|
60
60
|
accessControl: this.accessControl,
|
|
61
61
|
workflow: this.workflow,
|
|
62
|
+
kb: this.kb,
|
|
62
63
|
},
|
|
63
64
|
userEmail,
|
|
64
|
-
(p) => isSkillDoc(p) && !released.has(folderOf(p)),
|
|
65
|
+
(p) => isSkillDoc(p, layout) && !released.has(folderOf(p)),
|
|
65
66
|
);
|
|
66
67
|
|
|
67
68
|
const out: PendingSkill[] = proposed.map(({ cr, path, content, isAuthor }) => {
|
|
@@ -96,12 +97,12 @@ export class PendingSkillsService implements IPendingSkillService {
|
|
|
96
97
|
* catalog already supports. `Plugins/<plugin>/SKILL.md` is NOT a skill — a plugin
|
|
97
98
|
* folder is not itself one.
|
|
98
99
|
*/
|
|
99
|
-
function isSkillDoc(repoRelPath: string): boolean {
|
|
100
|
+
function isSkillDoc(repoRelPath: string, layout: KbLayout): boolean {
|
|
100
101
|
const segments = repoRelPath.split('/');
|
|
101
102
|
if (segments[segments.length - 1] !== SKILL_DOC) return false;
|
|
102
103
|
// Under `Skills/` a skill may sit directly below the root: `Skills/<skill>/SKILL.md`.
|
|
103
|
-
if (segments[0] ===
|
|
104
|
-
return segments.length >= 4 && segments[0] ===
|
|
104
|
+
if (segments[0] === layout.skillsDir) return segments.length >= 3;
|
|
105
|
+
return segments.length >= 4 && segments[0] === layout.pluginsDir;
|
|
105
106
|
}
|
|
106
107
|
|
|
107
108
|
/** The skill folder holding a SKILL.md. */
|
|
@@ -4,7 +4,6 @@ import { logger } from '../../shared/logging.js';
|
|
|
4
4
|
const log = logger('skills');
|
|
5
5
|
import '../auth/auth.middleware.js'; // Express Request.userId / userEmail augmentation
|
|
6
6
|
import {
|
|
7
|
-
DEFAULT_BRANCH,
|
|
8
7
|
joinBranchFor,
|
|
9
8
|
type AuthUser,
|
|
10
9
|
type IWorkflowService,
|
|
@@ -14,7 +13,7 @@ import { spliceGrant } from '../access-model/access-splice.js';
|
|
|
14
13
|
import { WorkflowDomainError } from '../../shared/domain-errors.js';
|
|
15
14
|
import { domainErrorBody } from '../../shared/http-errors.js';
|
|
16
15
|
import { isAbsence } from '../../shared/fs.contract.js';
|
|
17
|
-
import {
|
|
16
|
+
import type { KbContext } from '../../shared/kb-context.js';
|
|
18
17
|
import type { WorkspaceService } from '../workspace/workspace.service.js';
|
|
19
18
|
import type { JoinRequestsService } from '../plugins/join-requests.service.js';
|
|
20
19
|
import type { ISkillService } from './skills.contract.js';
|
|
@@ -46,12 +45,13 @@ export function createSkillAccessRequestRoutes(deps: {
|
|
|
46
45
|
workflow: IWorkflowService;
|
|
47
46
|
workspaceService: WorkspaceService;
|
|
48
47
|
joinRequests: JoinRequestsService;
|
|
49
|
-
|
|
48
|
+
kb: KbContext;
|
|
50
49
|
resolveUser: (req: express.Request) => Promise<AuthUser | null>;
|
|
51
50
|
}): express.Router {
|
|
52
|
-
const { skillService, accessControl, workflow, workspaceService, joinRequests,
|
|
51
|
+
const { skillService, accessControl, workflow, workspaceService, joinRequests, kb, resolveUser } = deps;
|
|
52
|
+
const { kbDirName } = kb;
|
|
53
53
|
const router = express.Router();
|
|
54
|
-
const wsId = () =>
|
|
54
|
+
const wsId = () => kb.defaultWorkspaceId();
|
|
55
55
|
const rulesOf = (folder: string) => `${folder}/access.md`;
|
|
56
56
|
|
|
57
57
|
/** The skill the caller may read, by name — or null after answering 404. */
|
|
@@ -108,7 +108,7 @@ export function createSkillAccessRequestRoutes(deps: {
|
|
|
108
108
|
);
|
|
109
109
|
if (!(await branchExists())) {
|
|
110
110
|
try {
|
|
111
|
-
await workflow.createBranch(wsId(), branch,
|
|
111
|
+
await workflow.createBranch(wsId(), branch, kb.defaultBranch);
|
|
112
112
|
} catch (err) {
|
|
113
113
|
if (!(await branchExists())) throw err;
|
|
114
114
|
}
|
|
@@ -133,7 +133,7 @@ export function createSkillAccessRequestRoutes(deps: {
|
|
|
133
133
|
}
|
|
134
134
|
const detail = await workflow.openChangeRequest(ws.id, user, {
|
|
135
135
|
sourceBranch: branch,
|
|
136
|
-
targetBranch:
|
|
136
|
+
targetBranch: kb.defaultBranch,
|
|
137
137
|
title: `Access request: ${name}`,
|
|
138
138
|
description:
|
|
139
139
|
`${user.name} asked to edit the skill ${name}. An editor of the skill accepts by ` +
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import express from 'express';
|
|
2
|
-
import { DEFAULT_BRANCH } from '@bevel-software/platform-shared';
|
|
3
2
|
import '../auth/auth.middleware.js'; // Express Request.userId / userEmail augmentation
|
|
4
|
-
import {
|
|
3
|
+
import type { KbContext } from '../../shared/kb-context.js';
|
|
5
4
|
import type { IPendingSkillService, ISkillService, PluginMembership } from './skills.contract.js';
|
|
6
5
|
import type { IAllowedToolsChecker } from './allowed-tools-check.js';
|
|
7
6
|
|
|
@@ -37,6 +36,8 @@ export interface SkillMembershipGate {
|
|
|
37
36
|
*/
|
|
38
37
|
export function createSkillsRoutes(
|
|
39
38
|
skillService: ISkillService,
|
|
39
|
+
/** The released branch's clone — where the discoverability verdicts are read. */
|
|
40
|
+
kb: Pick<KbContext, 'defaultWorkspaceId'>,
|
|
40
41
|
pendingSkills?: IPendingSkillService,
|
|
41
42
|
links?: SkillMembershipSource,
|
|
42
43
|
/**
|
|
@@ -75,7 +76,7 @@ export function createSkillsRoutes(
|
|
|
75
76
|
const folders = [...membership.byPlugin.entries()];
|
|
76
77
|
const verdicts = folders.length
|
|
77
78
|
? await gate.canReadBatch(
|
|
78
|
-
|
|
79
|
+
kb.defaultWorkspaceId(),
|
|
79
80
|
email,
|
|
80
81
|
folders.map(([, p]) => `${p.folder}/access.md`),
|
|
81
82
|
)
|
|
@@ -4,9 +4,8 @@ import { logger } from '../../shared/logging.js';
|
|
|
4
4
|
const log = logger('skills');
|
|
5
5
|
import fs from 'node:fs/promises';
|
|
6
6
|
import { parseDocument } from 'yaml';
|
|
7
|
-
import { DEFAULT_BRANCH, PLUGINS_DIR, SKILLS_DIR } from '@bevel-software/platform-shared';
|
|
8
7
|
import type { WorkspaceService } from '../workspace/workspace.service.js';
|
|
9
|
-
import {
|
|
8
|
+
import type { KbContext } from '../../shared/kb-context.js';
|
|
10
9
|
import type { IAccessControl } from '../access/access-control.interface.js';
|
|
11
10
|
import { extractFrontmatter, resolveDeclaredId, dedupeById } from '../../shared/frontmatter-id.js';
|
|
12
11
|
import type { IgnoreRules, ITreeWalker } from '../../shared/fs.contract.js';
|
|
@@ -54,13 +53,17 @@ export class SkillService implements ISkillService {
|
|
|
54
53
|
constructor(
|
|
55
54
|
private readonly workspaceService: WorkspaceService,
|
|
56
55
|
private readonly accessControl: IAccessControl,
|
|
57
|
-
private readonly
|
|
56
|
+
private readonly kb: KbContext,
|
|
58
57
|
private readonly disk: ITreeWalker,
|
|
59
58
|
now: () => number = Date.now,
|
|
60
59
|
) {
|
|
61
60
|
this.cache = new TtlCache(CACHE_TTL_MS, now);
|
|
62
61
|
}
|
|
63
62
|
|
|
63
|
+
private get kbDirName(): string {
|
|
64
|
+
return this.kb.kbDirName;
|
|
65
|
+
}
|
|
66
|
+
|
|
64
67
|
/** Attach the history source a `version` is answered from. */
|
|
65
68
|
setHistory(history: SkillHistorySource): void {
|
|
66
69
|
this.history = history;
|
|
@@ -92,7 +95,7 @@ export class SkillService implements ISkillService {
|
|
|
92
95
|
const found = (await this.scan()).find((s) => s.summary.name === name);
|
|
93
96
|
if (!found) return { ok: false, error: 'not_found' };
|
|
94
97
|
|
|
95
|
-
const wsId =
|
|
98
|
+
const wsId = this.kb.defaultWorkspaceId();
|
|
96
99
|
// Through `readable`, not a bare `canRead`: the two gates must never
|
|
97
100
|
// disagree. `canRead` reads a file's own frontmatter rules off disk on
|
|
98
101
|
// every call while `canReadBatch` resolves them through a per-workspace
|
|
@@ -213,7 +216,7 @@ export class SkillService implements ISkillService {
|
|
|
213
216
|
*/
|
|
214
217
|
private async readable(userEmail: string, skillFolders: string[]): Promise<Map<string, boolean>> {
|
|
215
218
|
return this.accessControl.canReadBatch(
|
|
216
|
-
|
|
219
|
+
this.kb.defaultWorkspaceId(),
|
|
217
220
|
userEmail,
|
|
218
221
|
skillFolders.map((p) => `${p}/SKILL.md`),
|
|
219
222
|
);
|
|
@@ -238,7 +241,7 @@ export class SkillService implements ISkillService {
|
|
|
238
241
|
// be read.
|
|
239
242
|
let wsId: string;
|
|
240
243
|
try {
|
|
241
|
-
wsId = (await this.workspaceService.getOrCreateForBranch(
|
|
244
|
+
wsId = (await this.workspaceService.getOrCreateForBranch(this.kb.defaultBranch)).id;
|
|
242
245
|
} catch {
|
|
243
246
|
return [];
|
|
244
247
|
}
|
|
@@ -314,15 +317,16 @@ export class SkillService implements ISkillService {
|
|
|
314
317
|
// Each root starts its own ignore stack (the walk extends it with the
|
|
315
318
|
// root's own file first). Order is cosmetic: the sort below is by name
|
|
316
319
|
// then path, so a same-named pair resolves the same way regardless.
|
|
317
|
-
|
|
318
|
-
await walkRoot(
|
|
320
|
+
const { skillsDir, pluginsDir } = this.kb.layout;
|
|
321
|
+
await walkRoot(skillsDir);
|
|
322
|
+
await walkRoot(pluginsDir);
|
|
319
323
|
// A skill's id (frontmatter `id`/`name`, else folder name) is how getSkill()
|
|
320
324
|
// resolves it, so it must be unique. Sort by (name, root, path) for a
|
|
321
325
|
// deterministic winner — the shared root FIRST, since `Skills/` is a
|
|
322
326
|
// skill's canonical home and a same-named inline copy is the stale one —
|
|
323
327
|
// then REFUSE later duplicates via the shared dedup — the same rule tools
|
|
324
328
|
// use (no silent auto-suffix that would rebind an id under the caller).
|
|
325
|
-
const rootRank = (p: string) => (p ===
|
|
329
|
+
const rootRank = (p: string) => (p === skillsDir || p.startsWith(`${skillsDir}/`) ? 0 : 1);
|
|
326
330
|
out.sort(
|
|
327
331
|
(a, b) =>
|
|
328
332
|
a.summary.name.localeCompare(b.summary.name) ||
|
|
@@ -16,6 +16,7 @@ import { SpillStore } from '../../workspace/spill-store.js';
|
|
|
16
16
|
import { DocExtractService } from '../../workspace/file-readers/doc-extract.service.js';
|
|
17
17
|
import { NEW_ROLE_GUIDANCE } from '../../access-model/roles-yaml-guard.js';
|
|
18
18
|
import { loadActiveGroups } from '../../access/access-control.service.js';
|
|
19
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
19
20
|
|
|
20
21
|
/**
|
|
21
22
|
* The agent's file tools over the production context resolver and a real
|
|
@@ -68,10 +69,10 @@ async function start(): Promise<string> {
|
|
|
68
69
|
canWriteBatchAtRef: async () => null,
|
|
69
70
|
canReadBatch: async (_w: string, _u: string, paths: string[]) => new Map(paths.map((p) => [p, true])),
|
|
70
71
|
} as never;
|
|
71
|
-
registerWorkspaceTools(registry, router, toolAuth, createToolHandlerFactory(resolve), new SpillStore(path.join(os.tmpdir(), 'bevel-test-spills')), new DocExtractService(docCache), allowAll, KB, {
|
|
72
|
+
registerWorkspaceTools(registry, router, toolAuth, createToolHandlerFactory(resolve), new SpillStore(path.join(os.tmpdir(), 'bevel-test-spills')), new DocExtractService(docCache), allowAll, testKbContext({ kbDirName: KB }), {
|
|
72
73
|
service: {} as never,
|
|
73
74
|
enabled: false, // ontology boundary not under test here
|
|
74
|
-
kbDirName: KB,
|
|
75
|
+
kb: testKbContext({ kbDirName: KB }),
|
|
75
76
|
recoveryBotEmail: 'recovery-bot@bevel.local',
|
|
76
77
|
hooks: new WorkflowHooks(),
|
|
77
78
|
}, new RoutineWritePolicyService(), {} as never);
|
|
@@ -12,6 +12,7 @@ import { RoutineWritePolicyService } from '../../workspace/routine-write-policy.
|
|
|
12
12
|
import { WorkflowHooks } from '../../workflow/workflow-hooks.js';
|
|
13
13
|
import { SpillStore } from '../../workspace/spill-store.js';
|
|
14
14
|
import { DocExtractService } from '../../workspace/file-readers/doc-extract.service.js';
|
|
15
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
15
16
|
|
|
16
17
|
const WS = 'target-company-state';
|
|
17
18
|
let recorded: unknown[][] = [];
|
|
@@ -63,10 +64,10 @@ async function start(): Promise<string> {
|
|
|
63
64
|
// kb (citation) tools alongside the workspace tools. Those registrations —
|
|
64
65
|
// and their web_search / submit_feedback / cite_kb_node cases — moved to
|
|
65
66
|
// the enterprise repo with their modules; core registers only core tools.
|
|
66
|
-
registerWorkspaceTools(registry, router, toolAuth, th, new SpillStore('/tmp/bevel-test-spills'), new DocExtractService('/tmp/bevel-test-doc-extract'), accessControl,
|
|
67
|
+
registerWorkspaceTools(registry, router, toolAuth, th, new SpillStore('/tmp/bevel-test-spills'), new DocExtractService('/tmp/bevel-test-doc-extract'), accessControl, testKbContext(), {
|
|
67
68
|
service: {} as never,
|
|
68
69
|
enabled: false, // ontology boundary not under test here
|
|
69
|
-
|
|
70
|
+
kb: testKbContext(),
|
|
70
71
|
recoveryBotEmail: 'recovery-bot@bevel.local',
|
|
71
72
|
hooks: new WorkflowHooks(),
|
|
72
73
|
}, new RoutineWritePolicyService(), {} as never /* sessionSink — start_session not exercised here */);
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import { describe, expect, it, vi, afterEach } from 'vitest';
|
|
2
|
+
import { DEFAULT_KB_LAYOUT } from '@bevel-software/platform-shared';
|
|
2
3
|
import { descriptorsFromMcpJson, judgeMcpServerEntry } from '../mcp-json-discovery.js';
|
|
3
4
|
|
|
4
5
|
afterEach(() => vi.restoreAllMocks());
|
|
5
6
|
|
|
7
|
+
/** The reader under the default layout, which these cases are written against. */
|
|
8
|
+
const fromMcpJson = (folder: string, mcpJson: string, manifest: string | null) =>
|
|
9
|
+
descriptorsFromMcpJson(folder, mcpJson, manifest, DEFAULT_KB_LAYOUT);
|
|
10
|
+
|
|
6
11
|
describe('judgeMcpServerEntry', () => {
|
|
7
12
|
it('keeps every accepted header and env key — one spelled __proto__ included', () => {
|
|
8
13
|
// Parsed from text, as a repository file is: JSON.parse makes `__proto__`
|
|
@@ -44,7 +49,7 @@ const MANIFEST = JSON.stringify({
|
|
|
44
49
|
|
|
45
50
|
describe('descriptorsFromMcpJson', () => {
|
|
46
51
|
it('synthesizes descriptors keyed by server name, path at mcp.json', () => {
|
|
47
|
-
const out =
|
|
52
|
+
const out = fromMcpJson(
|
|
48
53
|
'GTM',
|
|
49
54
|
JSON.stringify({ mcpServers: { notion: { type: 'streamable-http', url: 'https://mcp.notion.com/mcp' } } }),
|
|
50
55
|
null,
|
|
@@ -63,7 +68,7 @@ describe('descriptorsFromMcpJson', () => {
|
|
|
63
68
|
it('refuses an sse server rather than rebuilding it as a transport it is not', () => {
|
|
64
69
|
// The pinned MCP client has no sse transport; emitting `http` for an sse
|
|
65
70
|
// server configures a handshake the server does not speak.
|
|
66
|
-
const out =
|
|
71
|
+
const out = fromMcpJson(
|
|
67
72
|
'GTM',
|
|
68
73
|
JSON.stringify({ mcpServers: { legacy: { type: 'sse', url: 'https://mcp.legacy.example/sse' } } }),
|
|
69
74
|
null,
|
|
@@ -72,7 +77,7 @@ describe('descriptorsFromMcpJson', () => {
|
|
|
72
77
|
});
|
|
73
78
|
|
|
74
79
|
it('merges extension auth over mcp.json literals and carries variables + description', () => {
|
|
75
|
-
const out =
|
|
80
|
+
const out = fromMcpJson(
|
|
76
81
|
'GTM',
|
|
77
82
|
JSON.stringify({
|
|
78
83
|
mcpServers: { vendor: { type: 'streamable-http', url: 'https://v.example/mcp', headers: { 'X-V': '2' } } },
|
|
@@ -87,7 +92,7 @@ describe('descriptorsFromMcpJson', () => {
|
|
|
87
92
|
});
|
|
88
93
|
|
|
89
94
|
it('marks extension-flagged servers and every stdio server local-only', () => {
|
|
90
|
-
const out =
|
|
95
|
+
const out = fromMcpJson(
|
|
91
96
|
'GTM',
|
|
92
97
|
JSON.stringify({
|
|
93
98
|
mcpServers: {
|
|
@@ -105,7 +110,7 @@ describe('descriptorsFromMcpJson', () => {
|
|
|
105
110
|
|
|
106
111
|
it('skips a malformed entry without losing its siblings', () => {
|
|
107
112
|
vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
108
|
-
const out =
|
|
113
|
+
const out = fromMcpJson(
|
|
109
114
|
'GTM',
|
|
110
115
|
JSON.stringify({
|
|
111
116
|
mcpServers: {
|
|
@@ -123,7 +128,7 @@ describe('descriptorsFromMcpJson', () => {
|
|
|
123
128
|
it('ignores malformed extension headers instead of spreading them into keys', () => {
|
|
124
129
|
// A string spread into the merge would scatter its indices ('0', '1', …)
|
|
125
130
|
// into header names; a malformed extension must cost its own data only.
|
|
126
|
-
const out =
|
|
131
|
+
const out = fromMcpJson(
|
|
127
132
|
'GTM',
|
|
128
133
|
JSON.stringify({
|
|
129
134
|
mcpServers: { vendor: { type: 'streamable-http', url: 'https://v.example/mcp', headers: { 'X-V': '2' } } },
|
|
@@ -142,7 +147,7 @@ describe('descriptorsFromMcpJson', () => {
|
|
|
142
147
|
// A dropped declaration would silently re-scope a credential (undeclared
|
|
143
148
|
// defaults to the shared admin row), so a bad entry takes the SERVER
|
|
144
149
|
// offline — never just the entry, and never its siblings.
|
|
145
|
-
const out =
|
|
150
|
+
const out = fromMcpJson(
|
|
146
151
|
'GTM',
|
|
147
152
|
JSON.stringify({
|
|
148
153
|
mcpServers: {
|
|
@@ -165,7 +170,7 @@ describe('descriptorsFromMcpJson', () => {
|
|
|
165
170
|
it('applies the .tool declaration rules: no reserved names, no duplicates, gated OAuth URLs, string authParams', () => {
|
|
166
171
|
vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
167
172
|
const declare = (variables: unknown) =>
|
|
168
|
-
|
|
173
|
+
fromMcpJson(
|
|
169
174
|
'GTM',
|
|
170
175
|
JSON.stringify({ mcpServers: { vendor: { type: 'streamable-http', url: 'https://v.example/mcp' } } }),
|
|
171
176
|
JSON.stringify({
|
|
@@ -197,7 +202,7 @@ describe('descriptorsFromMcpJson', () => {
|
|
|
197
202
|
});
|
|
198
203
|
|
|
199
204
|
it('trims a padded oauth clientId like the .tool parser does', () => {
|
|
200
|
-
const out =
|
|
205
|
+
const out = fromMcpJson(
|
|
201
206
|
'GTM',
|
|
202
207
|
JSON.stringify({ mcpServers: { vendor: { type: 'streamable-http', url: 'https://v.example/mcp' } } }),
|
|
203
208
|
JSON.stringify({
|
|
@@ -225,7 +230,7 @@ describe('descriptorsFromMcpJson', () => {
|
|
|
225
230
|
it('accepts a client-id-only sign-in (endpoints discovered later), refuses half a pair, carries pkce/resource', () => {
|
|
226
231
|
vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
227
232
|
const declare = (oauth: unknown) =>
|
|
228
|
-
|
|
233
|
+
fromMcpJson(
|
|
229
234
|
'GTM',
|
|
230
235
|
JSON.stringify({ mcpServers: { vendor: { type: 'streamable-http', url: 'https://v.example/mcp' } } }),
|
|
231
236
|
JSON.stringify({
|
|
@@ -262,9 +267,9 @@ describe('descriptorsFromMcpJson', () => {
|
|
|
262
267
|
|
|
263
268
|
it('yields nothing for an unparsable file, quietly for an absent extensions block', () => {
|
|
264
269
|
vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
265
|
-
expect(
|
|
270
|
+
expect(fromMcpJson('GTM', '{ not json', null)).toEqual([]);
|
|
266
271
|
expect(
|
|
267
|
-
|
|
272
|
+
fromMcpJson('GTM', JSON.stringify({ mcpServers: {} }), '{ also not json'),
|
|
268
273
|
).toEqual([]);
|
|
269
274
|
});
|
|
270
275
|
});
|
|
@@ -9,6 +9,7 @@ import type { WorkspaceService } from '../../workspace/workspace.service.js';
|
|
|
9
9
|
import type { IAccessControl } from '../../access/access-control.interface.js';
|
|
10
10
|
import type { IToolManualService, ToolManualSummary } from '../tool-manuals.contract.js';
|
|
11
11
|
import { McpServerEditService } from '../mcp-server-edit.service.js';
|
|
12
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
12
13
|
|
|
13
14
|
const KB = 'knowledge-base';
|
|
14
15
|
const USER: AuthUser = { id: 'u-1', email: 'ali@example.com', name: 'Ali' } as AuthUser;
|
|
@@ -77,7 +78,7 @@ beforeEach(async () => {
|
|
|
77
78
|
}),
|
|
78
79
|
} as unknown as IToolManualService;
|
|
79
80
|
|
|
80
|
-
svc = new McpServerEditService(workspaceService, commits, accessControl, toolManuals, KB, new NodeFs());
|
|
81
|
+
svc = new McpServerEditService(workspaceService, commits, accessControl, toolManuals, testKbContext({ kbDirName: KB }), new NodeFs());
|
|
81
82
|
});
|
|
82
83
|
|
|
83
84
|
afterEach(async () => {
|
|
@@ -5,6 +5,7 @@ import { hashEmail } from '../../../shared/email-identity.js';
|
|
|
5
5
|
import type { WorkspaceService } from '../../workspace/workspace.service.js';
|
|
6
6
|
import type { IAccessControl } from '../../access/access-control.interface.js';
|
|
7
7
|
import type { IToolManualService, ToolManualSummary } from '../tool-manuals.contract.js';
|
|
8
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
8
9
|
|
|
9
10
|
/**
|
|
10
11
|
* The half of the tool catalog that is NOT on the default branch.
|
|
@@ -93,7 +94,7 @@ function harness(opts: {
|
|
|
93
94
|
listChangeRequests: async () => opts.crs,
|
|
94
95
|
} as unknown as IWorkflowService;
|
|
95
96
|
|
|
96
|
-
return new PendingToolsService(workspaceService, accessControl, toolManuals, workflow);
|
|
97
|
+
return new PendingToolsService(workspaceService, accessControl, toolManuals, workflow, testKbContext());
|
|
97
98
|
}
|
|
98
99
|
|
|
99
100
|
const ADMIN_WRITES = { [TOOL_PATH]: [ADMIN] };
|
|
@@ -370,6 +371,7 @@ describe('PendingToolsService', () => {
|
|
|
370
371
|
{} as unknown as IAccessControl,
|
|
371
372
|
{ listAllSummaries: async () => [] } as unknown as IToolManualService,
|
|
372
373
|
workflow,
|
|
374
|
+
testKbContext(),
|
|
373
375
|
);
|
|
374
376
|
await expect(svc.listPendingTools(AUTHOR)).resolves.toEqual([]);
|
|
375
377
|
});
|
|
@@ -384,6 +386,7 @@ describe('PendingToolsService', () => {
|
|
|
384
386
|
},
|
|
385
387
|
} as unknown as IToolManualService,
|
|
386
388
|
{ listChangeRequests: async () => [cr()] } as unknown as IWorkflowService,
|
|
389
|
+
testKbContext(),
|
|
387
390
|
);
|
|
388
391
|
await expect(svc.listPendingTools(AUTHOR)).resolves.toEqual([]);
|
|
389
392
|
});
|
|
@@ -12,6 +12,7 @@ import type { IPluginIndexService, PluginCatalogEntry } from '../../plugins/plug
|
|
|
12
12
|
import type { PluginSource, Discovery } from '../../plugins/discovery/plugin-source.js';
|
|
13
13
|
import type { IToolManualService, ToolManualSummary } from '../tool-manuals.contract.js';
|
|
14
14
|
import { ToolDeleteError, ToolDeleteService } from '../tool-delete.service.js';
|
|
15
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
15
16
|
|
|
16
17
|
/**
|
|
17
18
|
* Deleting one tool, over a real temp KB: the two shapes a tool comes in (a
|
|
@@ -147,7 +148,7 @@ function build(
|
|
|
147
148
|
pluginIndex,
|
|
148
149
|
opts.source ?? discovery([]),
|
|
149
150
|
vault as never,
|
|
150
|
-
KB,
|
|
151
|
+
testKbContext({ kbDirName: KB }),
|
|
151
152
|
new NodeFs(),
|
|
152
153
|
);
|
|
153
154
|
}
|
|
@@ -11,6 +11,7 @@ import { workspaceIdForBranch } from '../../../shared/workspace-id.js';
|
|
|
11
11
|
import type { WorkspaceService } from '../../workspace/workspace.service.js';
|
|
12
12
|
import type { IAccessControl } from '../../access/access-control.interface.js';
|
|
13
13
|
import type { IToolManualService } from '../tool-manuals.contract.js';
|
|
14
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
14
15
|
|
|
15
16
|
/**
|
|
16
17
|
* `GET /agent/plugins/:folder/archive` — error taxonomy of the plugin-folder
|
|
@@ -47,7 +48,7 @@ async function baseUrl(pluginIndex?: { catalog(): Promise<{ name: string; folder
|
|
|
47
48
|
{} as unknown as IToolManualService,
|
|
48
49
|
manualAuth,
|
|
49
50
|
async () => 'ali@example.com',
|
|
50
|
-
{ workspaceService, accessControl, kbDirName: KB, disk: new NodeFs(), pluginIndex: pluginIndex as never },
|
|
51
|
+
{ workspaceService, accessControl, kb: testKbContext({ kbDirName: KB }), disk: new NodeFs(), pluginIndex: pluginIndex as never },
|
|
51
52
|
),
|
|
52
53
|
);
|
|
53
54
|
httpServer = await new Promise<HttpServer>((resolve) => {
|
|
@@ -15,6 +15,7 @@ import { workspaceIdForBranch } from '../../../shared/workspace-id.js';
|
|
|
15
15
|
import { utcpNamespacePrefix } from '../../../shared/utcp-namespace.js';
|
|
16
16
|
import type { WorkspaceService } from '../../workspace/workspace.service.js';
|
|
17
17
|
import type { IAccessControl } from '../../access/access-control.interface.js';
|
|
18
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
18
19
|
|
|
19
20
|
const KB_DIR = 'knowledge-base';
|
|
20
21
|
const wsId = workspaceIdForBranch(DEFAULT_BRANCH);
|
|
@@ -146,7 +147,7 @@ describe('a shell `.tool` in a workspace', () => {
|
|
|
146
147
|
afterEach(() => rm(root, { recursive: true, force: true }));
|
|
147
148
|
|
|
148
149
|
test('is listed to local consumers and withheld from remote ones', async () => {
|
|
149
|
-
const svc = new ToolManualService(workspaceService, allowAll, KB_DIR, disk, new KbPluginSource(disk));
|
|
150
|
+
const svc = new ToolManualService(workspaceService, allowAll, testKbContext({ kbDirName: KB_DIR }), disk, new KbPluginSource(disk, testKbContext({ kbDirName: KB_DIR })));
|
|
150
151
|
// `list_local_tools` names it, so the local server knows to materialize it.
|
|
151
152
|
expect(await svc.listLocalOnly('user@x.eu')).toEqual([{ slug: 'git', name: 'git', path: 'Plugins/git.tool' }]);
|
|
152
153
|
// The hosted proxy's manual set excludes it entirely.
|
|
@@ -157,7 +158,7 @@ describe('a shell `.tool` in a workspace', () => {
|
|
|
157
158
|
test('its embedded cli tools survive manual serialization', async () => {
|
|
158
159
|
// The whole point of registering the serializer: without it the manual body
|
|
159
160
|
// fails validation and the local server gets nothing to run.
|
|
160
|
-
const svc = new ToolManualService(workspaceService, allowAll, KB_DIR, disk, new KbPluginSource(disk));
|
|
161
|
+
const svc = new ToolManualService(workspaceService, allowAll, testKbContext({ kbDirName: KB_DIR }), disk, new KbPluginSource(disk, testKbContext({ kbDirName: KB_DIR })));
|
|
161
162
|
const manual = await svc.resolveInlineManual('user@x.eu', 'git');
|
|
162
163
|
expect(manual).not.toBeNull();
|
|
163
164
|
const tools = (manual as { tools: { name: string; tool_call_template: { call_template_type: string } }[] }).tools;
|
|
@@ -206,7 +207,7 @@ describe('manual namespaces are unique, not merely manual names', () => {
|
|
|
206
207
|
}
|
|
207
208
|
|
|
208
209
|
const names = async (): Promise<string[]> =>
|
|
209
|
-
(await new ToolManualService(workspaceService, allowAll, KB_DIR, disk, new KbPluginSource(disk)).listAllSummaries()).map((m) => m.name).sort();
|
|
210
|
+
(await new ToolManualService(workspaceService, allowAll, testKbContext({ kbDirName: KB_DIR }), disk, new KbPluginSource(disk, testKbContext({ kbDirName: KB_DIR }))).listAllSummaries()).map((m) => m.name).sort();
|
|
210
211
|
|
|
211
212
|
it('keeps two manuals whose namespaces genuinely differ', async () => {
|
|
212
213
|
// Underscore-doubling is injective, so `a_b` (a__b_) and `a__b` (a____b_)
|
|
@@ -243,7 +244,7 @@ describe('manual namespaces are unique, not merely manual names', () => {
|
|
|
243
244
|
await writeMcpServer('Vendor', 'a-b');
|
|
244
245
|
await writeTool('a.tool', 'a_b');
|
|
245
246
|
await writeTool('c.tool', 'other');
|
|
246
|
-
const kept = await new ToolManualService(workspaceService, allowAll, KB_DIR, disk, new KbPluginSource(disk)).listAllSummaries();
|
|
247
|
+
const kept = await new ToolManualService(workspaceService, allowAll, testKbContext({ kbDirName: KB_DIR }), disk, new KbPluginSource(disk, testKbContext({ kbDirName: KB_DIR }))).listAllSummaries();
|
|
247
248
|
const namespaces = kept.map((m) => utcpNamespacePrefix(m.name));
|
|
248
249
|
expect(new Set(namespaces).size).toBe(namespaces.length);
|
|
249
250
|
});
|
|
@@ -16,6 +16,7 @@ import { workspaceIdForBranch } from '../../../shared/workspace-id.js';
|
|
|
16
16
|
import type { WorkspaceService } from '../../workspace/workspace.service.js';
|
|
17
17
|
import type { IAccessControl } from '../../access/access-control.interface.js';
|
|
18
18
|
import type { IToolManualService, ToolManualDetail } from '../tool-manuals.contract.js';
|
|
19
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
19
20
|
|
|
20
21
|
/**
|
|
21
22
|
* `GET /api/tools/:slug` — the browser tool page's detail read. Two halves:
|
|
@@ -165,7 +166,7 @@ describe('ToolManualService.getDetail — capabilities + access', () => {
|
|
|
165
166
|
canReadBatch: async (_w: string, _e: string, paths: string[]) => new Map(paths.map((p) => [p, false])),
|
|
166
167
|
} as unknown as IAccessControl;
|
|
167
168
|
|
|
168
|
-
const svc = (access: IAccessControl = allowAll) => new ToolManualService(workspaceService, access, KB_DIR, disk, new KbPluginSource(disk));
|
|
169
|
+
const svc = (access: IAccessControl = allowAll) => new ToolManualService(workspaceService, access, testKbContext({ kbDirName: KB_DIR }), disk, new KbPluginSource(disk, testKbContext({ kbDirName: KB_DIR })));
|
|
169
170
|
|
|
170
171
|
/** Write one `.tool` into a fresh temp KB and return the service over it. */
|
|
171
172
|
async function withTool(file: string, content: string): Promise<void> {
|
|
@@ -13,6 +13,7 @@ import { ToolManualService } from '../tool-manuals.service.js';
|
|
|
13
13
|
import { workspaceIdForBranch } from '../../../shared/workspace-id.js';
|
|
14
14
|
import type { WorkspaceService } from '../../workspace/workspace.service.js';
|
|
15
15
|
import type { IAccessControl } from '../../access/access-control.interface.js';
|
|
16
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
16
17
|
|
|
17
18
|
/**
|
|
18
19
|
* THE TWO HTTP SURFACES, over a real catalog.
|
|
@@ -80,9 +81,9 @@ async function baseUrlAs(email: string | undefined): Promise<{ base: string; ser
|
|
|
80
81
|
const service = new ToolManualService(
|
|
81
82
|
workspaceService,
|
|
82
83
|
accessControl,
|
|
83
|
-
KB_DIR,
|
|
84
|
+
testKbContext({ kbDirName: KB_DIR }),
|
|
84
85
|
disk,
|
|
85
|
-
new KbPluginSource(disk),
|
|
86
|
+
new KbPluginSource(disk, testKbContext({ kbDirName: KB_DIR })),
|
|
86
87
|
() => clock,
|
|
87
88
|
);
|
|
88
89
|
const app = express();
|
|
@@ -98,6 +99,7 @@ async function baseUrlAs(email: string | undefined): Promise<{ base: string; ser
|
|
|
98
99
|
app.use(
|
|
99
100
|
'/api',
|
|
100
101
|
createSecretsVaultRoutes({
|
|
102
|
+
kb: testKbContext({ kbDirName: KB_DIR }),
|
|
101
103
|
secretsVault: { statusFor: async () => [] } as unknown as Parameters<
|
|
102
104
|
typeof createSecretsVaultRoutes
|
|
103
105
|
>[0]['secretsVault'],
|