@bevel-software/platform-core-backend 0.20.0 → 0.22.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 +55 -107
- package/dist/core/create-core-server.js.map +1 -1
- package/dist/core/create-core-services.d.ts +41 -4
- package/dist/core/create-core-services.d.ts.map +1 -1
- package/dist/core/create-core-services.js +183 -82
- 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-requests.contract.d.ts +75 -0
- package/dist/modules/access/access-requests.contract.d.ts.map +1 -0
- package/dist/modules/access/access-requests.contract.js +20 -0
- package/dist/modules/access/access-requests.contract.js.map +1 -0
- package/dist/modules/access/access-requests.routes.d.ts +35 -0
- package/dist/modules/access/access-requests.routes.d.ts.map +1 -0
- package/dist/modules/access/access-requests.routes.js +237 -0
- package/dist/modules/access/access-requests.routes.js.map +1 -0
- package/dist/modules/access/access-requests.service.d.ts +123 -0
- package/dist/modules/access/access-requests.service.d.ts.map +1 -0
- package/dist/modules/access/access-requests.service.js +337 -0
- package/dist/modules/access/access-requests.service.js.map +1 -0
- 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/access-model/access-grammar.d.ts +12 -0
- package/dist/modules/access-model/access-grammar.d.ts.map +1 -1
- package/dist/modules/access-model/access-grammar.js +24 -0
- package/dist/modules/access-model/access-grammar.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 +45 -2
- package/dist/modules/auth/auth.service.d.ts.map +1 -1
- package/dist/modules/auth/auth.service.js +44 -3
- 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/github-app/github-app.client.d.ts +101 -0
- package/dist/modules/github-app/github-app.client.d.ts.map +1 -0
- package/dist/modules/github-app/github-app.client.js +222 -0
- package/dist/modules/github-app/github-app.client.js.map +1 -0
- package/dist/modules/github-app/github-app.connection.d.ts +102 -0
- package/dist/modules/github-app/github-app.connection.d.ts.map +1 -0
- package/dist/modules/github-app/github-app.connection.js +185 -0
- package/dist/modules/github-app/github-app.connection.js.map +1 -0
- package/dist/modules/github-app/github-app.routes.d.ts +59 -0
- package/dist/modules/github-app/github-app.routes.d.ts.map +1 -0
- package/dist/modules/github-app/github-app.routes.js +323 -0
- package/dist/modules/github-app/github-app.routes.js.map +1 -0
- package/dist/modules/github-app/index.d.ts +4 -0
- package/dist/modules/github-app/index.d.ts.map +1 -0
- package/dist/modules/github-app/index.js +4 -0
- package/dist/modules/github-app/index.js.map +1 -0
- 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/kb-fs/remote-url.d.ts +22 -0
- package/dist/modules/kb-fs/remote-url.d.ts.map +1 -0
- package/dist/modules/kb-fs/remote-url.js +35 -0
- package/dist/modules/kb-fs/remote-url.js.map +1 -0
- 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-proposals.d.ts +17 -5
- package/dist/modules/plugins/join-proposals.d.ts.map +1 -1
- package/dist/modules/plugins/join-proposals.js +76 -22
- package/dist/modules/plugins/join-proposals.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 +113 -18
- package/dist/modules/plugins/join-requests.service.d.ts.map +1 -1
- package/dist/modules/plugins/join-requests.service.js +178 -33
- 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 +48 -17
- 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 +34 -9
- package/dist/modules/settings/deployment-settings.service.d.ts.map +1 -1
- package/dist/modules/settings/deployment-settings.service.js +113 -26
- package/dist/modules/settings/deployment-settings.service.js.map +1 -1
- package/dist/modules/settings/managed-repository.d.ts +43 -0
- package/dist/modules/settings/managed-repository.d.ts.map +1 -0
- package/dist/modules/settings/managed-repository.js +60 -0
- package/dist/modules/settings/managed-repository.js.map +1 -0
- package/dist/modules/settings/repository-source.d.ts +128 -0
- package/dist/modules/settings/repository-source.d.ts.map +1 -0
- package/dist/modules/settings/repository-source.js +150 -0
- package/dist/modules/settings/repository-source.js.map +1 -0
- package/dist/modules/settings/setup.routes.d.ts +34 -4
- package/dist/modules/settings/setup.routes.d.ts.map +1 -1
- package/dist/modules/settings/setup.routes.js +198 -18
- 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 +8 -9
- package/dist/modules/skills/skill-access-requests.routes.d.ts.map +1 -1
- package/dist/modules/skills/skill-access-requests.routes.js +26 -65
- 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-helpers/tool-context.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool-context.js +15 -0
- package/dist/modules/tool-helpers/tool-context.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 +47 -11
- package/dist/modules/workflow/agent-tools/workflow.tools.js.map +1 -1
- package/dist/modules/workflow/git/git.service.d.ts +14 -6
- package/dist/modules/workflow/git/git.service.d.ts.map +1 -1
- package/dist/modules/workflow/git/git.service.js +40 -18
- 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 +40 -5
- package/dist/modules/workflow/git/node-git-runner.js.map +1 -1
- package/dist/modules/workflow/git/pull-request.service.d.ts +45 -0
- package/dist/modules/workflow/git/pull-request.service.d.ts.map +1 -1
- package/dist/modules/workflow/git/pull-request.service.js +99 -0
- package/dist/modules/workflow/git/pull-request.service.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.routes.d.ts.map +1 -1
- package/dist/modules/workflow/workflow.routes.js +3 -1
- package/dist/modules/workflow/workflow.routes.js.map +1 -1
- package/dist/modules/workflow/workflow.service.d.ts +42 -10
- package/dist/modules/workflow/workflow.service.d.ts.map +1 -1
- package/dist/modules/workflow/workflow.service.js +181 -71
- 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 +70 -7
- package/dist/modules/workspace/startup/kb-startup-runner.d.ts.map +1 -1
- package/dist/modules/workspace/startup/kb-startup-runner.js +183 -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 +49 -29
- 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 +48 -20
- 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/domain-errors.d.ts +39 -0
- package/dist/shared/domain-errors.d.ts.map +1 -1
- package/dist/shared/domain-errors.js +55 -0
- package/dist/shared/domain-errors.js.map +1 -1
- package/dist/shared/git.contract.d.ts +62 -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 +64 -107
- package/src/core/create-core-services.ts +238 -96
- 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-requests.recut.test.ts +134 -0
- package/src/modules/access/__tests__/access-requests.routes.test.ts +610 -0
- 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-requests.contract.ts +93 -0
- package/src/modules/access/access-requests.routes.ts +286 -0
- package/src/modules/access/access-requests.service.ts +420 -0
- 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/access-model/access-grammar.ts +22 -0
- 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 +98 -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 +61 -2
- 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/github-app/__tests__/github-app.test.ts +848 -0
- package/src/modules/github-app/github-app.client.ts +268 -0
- package/src/modules/github-app/github-app.connection.ts +204 -0
- package/src/modules/github-app/github-app.routes.ts +359 -0
- package/src/modules/github-app/index.ts +19 -0
- 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/__tests__/remote-url.test.ts +38 -0
- package/src/modules/kb-fs/branch-name.ts +3 -3
- package/src/modules/kb-fs/clone-config.ts +15 -12
- package/src/modules/kb-fs/remote-url.ts +35 -0
- 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-proposals.test.ts +100 -19
- package/src/modules/plugins/__tests__/join-request-jobs.service.test.ts +2 -1
- package/src/modules/plugins/__tests__/join-requests.service.test.ts +28 -11
- package/src/modules/plugins/__tests__/join-requests.settlement.test.ts +371 -0
- 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 +12 -3
- 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-proposals.ts +87 -19
- package/src/modules/plugins/join-request-jobs.service.ts +8 -7
- package/src/modules/plugins/join-requests.service.ts +203 -43
- 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 +48 -17
- 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__/repository-source.test.ts +191 -0
- package/src/modules/settings/__tests__/setup.routes.boot-failure.test.ts +2 -1
- package/src/modules/settings/__tests__/setup.routes.git-mode.test.ts +353 -0
- package/src/modules/settings/__tests__/setup.routes.github-app.test.ts +282 -0
- package/src/modules/settings/__tests__/setup.routes.layout-phase.test.ts +7 -4
- package/src/modules/settings/__tests__/setup.routes.managed-phase.test.ts +233 -0
- 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 +130 -23
- package/src/modules/settings/managed-repository.ts +68 -0
- package/src/modules/settings/repository-source.ts +197 -0
- package/src/modules/settings/setup.routes.ts +233 -19
- 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 +7 -2
- 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 +29 -79
- 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-helpers/tool-context.ts +15 -0
- 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 +11 -2
- 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 +187 -35
- 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 +148 -41
- package/src/modules/workflow/agent-tools/__tests__/workflow.tools.test.ts +143 -2
- package/src/modules/workflow/agent-tools/workflow.tools.ts +60 -12
- 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 +130 -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/__tests__/pull-request.service.getPrDetail.test.ts +145 -2
- package/src/modules/workflow/git/__tests__/pull-request.service.viewer-can-delete.test.ts +166 -0
- package/src/modules/workflow/git/git.service.ts +49 -17
- package/src/modules/workflow/git/node-git-runner.ts +43 -4
- package/src/modules/workflow/git/pull-request.service.ts +119 -0
- 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.routes.ts +3 -1
- package/src/modules/workflow/workflow.service.ts +201 -76
- 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 +45 -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 +237 -10
- package/src/modules/workspace/__tests__/workspace.tools.test.ts +44 -11
- 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 +240 -21
- package/src/modules/workspace/startup/kb-git.ts +15 -22
- package/src/modules/workspace/startup/kb-startup-runner.ts +198 -45
- 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 +47 -28
- package/src/modules/workspace/workspace.tools.ts +56 -20
- package/src/modules/workspace/write-denial.ts +7 -5
- package/src/shared/__tests__/kb-layout.plugin.test.ts +19 -16
- package/src/shared/domain-errors.ts +58 -0
- package/src/shared/git.contract.ts +80 -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
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import fs from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { coreMigrationsDir } from '../../../assets.js';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* A knowledge base hosted beside others lives in a schema of its own, found
|
|
8
|
+
* through `search_path`. A migration that spells `public.` runs against the
|
|
9
|
+
* wrong schema there — creating the table in `public`, or guarding on a
|
|
10
|
+
* constraint that lives elsewhere — and the tenant that runs it is the first
|
|
11
|
+
* to find out. So no migration may name a schema: this reads every file the
|
|
12
|
+
* runner would, so the rule cannot be forgotten by the next one.
|
|
13
|
+
*/
|
|
14
|
+
describe('core migrations', () => {
|
|
15
|
+
it('never qualify a table with a schema', async () => {
|
|
16
|
+
const dir = coreMigrationsDir();
|
|
17
|
+
const files = (await fs.readdir(dir)).filter((name) => name.endsWith('.sql')).sort();
|
|
18
|
+
expect(files.length).toBeGreaterThan(0);
|
|
19
|
+
const offenders: string[] = [];
|
|
20
|
+
for (const name of files) {
|
|
21
|
+
const text = await fs.readFile(path.join(dir, name), 'utf8');
|
|
22
|
+
text.split('\n').forEach((line, i) => {
|
|
23
|
+
// Bare (`public.users`) and quoted (`"public"."users"`) alike: the
|
|
24
|
+
// quoted spelling is what drizzle generates, and it is what a live
|
|
25
|
+
// two-tenant run found still pointing every tenant's foreign keys at
|
|
26
|
+
// a `public.users` that does not exist there.
|
|
27
|
+
if (/\bpublic"?\./.test(line)) offenders.push(`${name}:${i + 1}: ${line.trim()}`);
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
expect(offenders).toEqual([]);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { crc32 } from 'node:zlib';
|
|
1
2
|
import pg from 'pg';
|
|
2
3
|
import type { Database } from './connection.js';
|
|
3
4
|
|
|
@@ -84,6 +85,23 @@ export const AdvisoryLock = {
|
|
|
84
85
|
|
|
85
86
|
export type AdvisoryLockId = (typeof AdvisoryLock)[keyof typeof AdvisoryLock];
|
|
86
87
|
|
|
88
|
+
/**
|
|
89
|
+
* The second integer of a lock: the lock id, folded with the knowledge base
|
|
90
|
+
* it belongs to. A process serving several knowledge bases from one database
|
|
91
|
+
* runs several commit workers and several migration runs, and each must
|
|
92
|
+
* exclude only its own kind: the migrations lock of tenant A has nothing to
|
|
93
|
+
* say to tenant B's. An empty `tenantKey` is the single-tenant deployment
|
|
94
|
+
* and keeps the ids that were always used, so a redeploy's outgoing process
|
|
95
|
+
* on the older build still contends for the same lock.
|
|
96
|
+
*
|
|
97
|
+
* `crc32` for a stable 32-bit spread of the key; XOR keeps every value
|
|
98
|
+
* inside `int4`. Two tenants whose keys collide serialise against each other
|
|
99
|
+
* and nothing worse: an over-locking, never an under-locking.
|
|
100
|
+
*/
|
|
101
|
+
export function advisoryLockKey(lock: AdvisoryLockId, tenantKey = ''): number {
|
|
102
|
+
return tenantKey ? lock ^ crc32(tenantKey) : lock;
|
|
103
|
+
}
|
|
104
|
+
|
|
87
105
|
/** How long to wait for the lock before giving up and failing the boot. */
|
|
88
106
|
const DEFAULT_WAIT_MS = 60_000;
|
|
89
107
|
|
|
@@ -138,9 +156,10 @@ export async function withAdvisoryLock<T>(
|
|
|
138
156
|
db: Database,
|
|
139
157
|
lock: AdvisoryLockId,
|
|
140
158
|
fn: () => Promise<T>,
|
|
141
|
-
opts: { waitMs?: number } = {},
|
|
159
|
+
opts: { waitMs?: number; tenantKey?: string } = {},
|
|
142
160
|
): Promise<T> {
|
|
143
161
|
const waitMs = opts.waitMs ?? DEFAULT_WAIT_MS;
|
|
162
|
+
const key = advisoryLockKey(lock, opts.tenantKey);
|
|
144
163
|
const client = await db.$client.connect();
|
|
145
164
|
// A statement that did not answer in time is STILL RUNNING on this
|
|
146
165
|
// connection — `bounded` gives up waiting, it cannot take the statement
|
|
@@ -170,7 +189,7 @@ export async function withAdvisoryLock<T>(
|
|
|
170
189
|
// parameter. `true` makes the setting transaction-local, so the
|
|
171
190
|
// `rollback` below reverts it.
|
|
172
191
|
await onWire(client.query("select set_config('lock_timeout', $1, true)", [String(waitMs)]), 'setting lock_timeout');
|
|
173
|
-
await client.query('select pg_advisory_xact_lock($1, $2)', [LOCK_NAMESPACE,
|
|
192
|
+
await client.query('select pg_advisory_xact_lock($1, $2)', [LOCK_NAMESPACE, key]);
|
|
174
193
|
} catch (err) {
|
|
175
194
|
if (isLockTimeout(err)) {
|
|
176
195
|
throw new Error(
|
|
@@ -215,6 +234,8 @@ export interface LeaseClient {
|
|
|
215
234
|
}
|
|
216
235
|
|
|
217
236
|
export interface AdvisoryLeaseOptions {
|
|
237
|
+
/** The knowledge base this lease belongs to — see {@link advisoryLockKey}. Empty: the single-tenant ids. */
|
|
238
|
+
tenantKey?: string;
|
|
218
239
|
/** How the lease opens its connection. Default: a `pg.Client` on the pool's connection string. */
|
|
219
240
|
connect?: () => Promise<LeaseClient>;
|
|
220
241
|
/** Bound on the connect and on each query, so an unreachable or half-dead database fails rather than waits. Default 10s. */
|
|
@@ -290,7 +311,7 @@ export class AdvisoryLease {
|
|
|
290
311
|
try {
|
|
291
312
|
const { rows } = await client.query('select pg_try_advisory_lock($1, $2) as held', [
|
|
292
313
|
LOCK_NAMESPACE,
|
|
293
|
-
this.lock,
|
|
314
|
+
advisoryLockKey(this.lock, this.opts.tenantKey),
|
|
294
315
|
]);
|
|
295
316
|
if (rows[0]?.held !== true) {
|
|
296
317
|
await client.end().catch(() => undefined);
|
|
@@ -315,7 +336,10 @@ export class AdvisoryLease {
|
|
|
315
336
|
this.heldFlag = false;
|
|
316
337
|
if (!client) return;
|
|
317
338
|
try {
|
|
318
|
-
await client.query('select pg_advisory_unlock($1, $2)', [
|
|
339
|
+
await client.query('select pg_advisory_unlock($1, $2)', [
|
|
340
|
+
LOCK_NAMESPACE,
|
|
341
|
+
advisoryLockKey(this.lock, this.opts.tenantKey),
|
|
342
|
+
]);
|
|
319
343
|
} catch {
|
|
320
344
|
// Ending the session below releases the lock regardless.
|
|
321
345
|
} finally {
|
|
@@ -1,23 +1,153 @@
|
|
|
1
|
+
import { sql } from 'drizzle-orm';
|
|
1
2
|
import { drizzle } from 'drizzle-orm/node-postgres';
|
|
2
3
|
import pg from 'pg';
|
|
3
4
|
import * as schema from './schema.js';
|
|
4
5
|
|
|
5
|
-
|
|
6
|
+
/**
|
|
7
|
+
* One database, one schema per knowledge base.
|
|
8
|
+
*
|
|
9
|
+
* A single-tenant deployment keeps `public`, exactly as before this option
|
|
10
|
+
* existed: no `search_path` is set for it, so an operator's own default
|
|
11
|
+
* (`"$user", public`) is honoured, and the migration ledger stays where
|
|
12
|
+
* drizzle put it. A knowledge base hosted beside others gets a schema of its
|
|
13
|
+
* own: every connection of its pool starts with `search_path` pointing at it,
|
|
14
|
+
* so the unqualified table names the schema module and the migrations use
|
|
15
|
+
* resolve there and nowhere else. Isolation is then a Postgres object, and a
|
|
16
|
+
* tenant leaves as `pg_dump -n <schema>`.
|
|
17
|
+
*/
|
|
18
|
+
export const DEFAULT_DB_SCHEMA = 'public';
|
|
6
19
|
|
|
7
|
-
|
|
20
|
+
/**
|
|
21
|
+
* A schema name this module will put into `search_path`: a plain lowercase
|
|
22
|
+
* identifier, at most Postgres's 63 characters. Validated rather than quoted,
|
|
23
|
+
* because the name also travels into `CREATE SCHEMA` and a `pg_dump`
|
|
24
|
+
* invocation, and a name that needs quoting in one of them is a name that
|
|
25
|
+
* will be spelled wrong in another.
|
|
26
|
+
*/
|
|
27
|
+
export function assertSchemaName(name: string): string {
|
|
28
|
+
if (!/^[a-z][a-z0-9_]{0,62}$/.test(name)) {
|
|
29
|
+
throw new Error(
|
|
30
|
+
`Database schema name must be a lowercase identifier ([a-z][a-z0-9_]*, at most 63 characters); got "${name}"`,
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
// Names Postgres or drizzle already own. `pg_*` would fail at CREATE
|
|
34
|
+
// SCHEMA anyway; `information_schema` would not, and `drizzle` is where a
|
|
35
|
+
// deployment on the default schema keeps its migration ledger, so a
|
|
36
|
+
// knowledge base placed there would share that ledger's home.
|
|
37
|
+
if (name.startsWith('pg_') || name === 'information_schema' || name === 'drizzle') {
|
|
38
|
+
throw new Error(`Database schema name "${name}" is reserved`);
|
|
39
|
+
}
|
|
40
|
+
return name;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Prove that this handle's connections really search `schema` first, by
|
|
45
|
+
* asking the server. The schema is set as a startup parameter, and a
|
|
46
|
+
* transaction- or statement-mode pooler in front of the database (PgBouncer
|
|
47
|
+
* in those modes, RDS Proxy) either refuses that parameter or resets it
|
|
48
|
+
* between transactions; every unqualified table name would then resolve to
|
|
49
|
+
* `public`, and tenants would read each other's rows without a single
|
|
50
|
+
* error. So a graph refuses to come up on a handle that lost its schema,
|
|
51
|
+
* which is the failure an operator can see. Only session pooling is
|
|
52
|
+
* supported in front of a process that serves several knowledge bases.
|
|
53
|
+
*/
|
|
54
|
+
export async function assertSearchPath(db: Pick<Database, 'execute'>, schema: string): Promise<void> {
|
|
55
|
+
const result = await db.execute(sql`select current_schema() as schema`);
|
|
56
|
+
const current = (result.rows[0] as { schema?: string } | undefined)?.schema ?? null;
|
|
57
|
+
if (current !== schema) {
|
|
58
|
+
throw new Error(
|
|
59
|
+
`Database connections search "${current ?? '(none)'}" first, not the configured schema "${schema}". ` +
|
|
60
|
+
'A transaction-mode pooler in front of Postgres drops the search_path startup parameter; ' +
|
|
61
|
+
'use session pooling, or connect directly.',
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export interface DbOptions {
|
|
67
|
+
/** The schema the pool's connections search first. Default {@link DEFAULT_DB_SCHEMA}. */
|
|
68
|
+
schema?: string;
|
|
69
|
+
/**
|
|
70
|
+
* Connections the pool may hold. `pg`'s default (10) suits a process that
|
|
71
|
+
* serves one knowledge base; a process serving many keeps each pool small,
|
|
72
|
+
* since the database's `max_connections` is shared by all of them.
|
|
73
|
+
*/
|
|
74
|
+
max?: number;
|
|
75
|
+
/** How long an idle connection is kept before the pool closes it. Default: `pg`'s. */
|
|
76
|
+
idleTimeoutMillis?: number;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* A bounded handshake: `pg` waits forever by default for a NEW connection to
|
|
81
|
+
* come up, so a database that accepts the socket and never finishes the
|
|
82
|
+
* handshake would hold a boot (the migration lock is the first thing that
|
|
83
|
+
* asks) with nothing to say and nothing for the restart policy to see. Half
|
|
84
|
+
* a minute is generous for a handshake and short enough for a failed boot to
|
|
85
|
+
* be visible. It bounds only that: a checkout queued behind a saturated pool,
|
|
86
|
+
* or a query on a connection that stopped answering, is the caller's to
|
|
87
|
+
* bound — the advisory lock does.
|
|
88
|
+
*/
|
|
89
|
+
const CONNECT_TIMEOUT_MS = 30_000;
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* A NEW pool on `databaseUrl`, searching `opts.schema` first. Not cached:
|
|
93
|
+
* the caller owns it and ends it with {@link closeDb}. The composition root
|
|
94
|
+
* of a process that serves one knowledge base goes through {@link getDb}
|
|
95
|
+
* instead, which caches.
|
|
96
|
+
*/
|
|
97
|
+
export function createDb(databaseUrl: string, opts: DbOptions = {}) {
|
|
98
|
+
const dbSchema = assertSchemaName(opts.schema ?? DEFAULT_DB_SCHEMA);
|
|
99
|
+
const pool = new pg.Pool({
|
|
100
|
+
connectionString: databaseUrl,
|
|
101
|
+
connectionTimeoutMillis: CONNECT_TIMEOUT_MS,
|
|
102
|
+
max: opts.max,
|
|
103
|
+
idleTimeoutMillis: opts.idleTimeoutMillis,
|
|
104
|
+
// A startup parameter, applied by the server to every connection this
|
|
105
|
+
// pool opens — not a `SET` run after connecting, which a pooled
|
|
106
|
+
// connection could outlive. The default schema sets nothing, so an
|
|
107
|
+
// operator's own `search_path` stays in force there.
|
|
108
|
+
...(dbSchema === DEFAULT_DB_SCHEMA ? {} : { options: `-c search_path=${dbSchema}` }),
|
|
109
|
+
});
|
|
110
|
+
const db = drizzle(pool, { schema });
|
|
111
|
+
schemas.set(db, dbSchema);
|
|
112
|
+
return db;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export type Database = ReturnType<typeof createDb>;
|
|
116
|
+
|
|
117
|
+
/** The schema a database handle searches first — for the callers that name it in DDL. */
|
|
118
|
+
export function dbSchemaOf(db: Pick<Database, '$client'>): string {
|
|
119
|
+
return schemas.get(db as Database) ?? DEFAULT_DB_SCHEMA;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const schemas = new WeakMap<Database, string>();
|
|
123
|
+
const cache = new Map<string, Database>();
|
|
124
|
+
|
|
125
|
+
const cacheKey = (databaseUrl: string, dbSchema: string) => `${dbSchema}\u0000${databaseUrl}`;
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* The process's pool on `databaseUrl` for `opts.schema`, created on first
|
|
129
|
+
* use and shared afterwards. One per (url, schema): two handles on the same
|
|
130
|
+
* schema would be two pools competing for the same connection budget.
|
|
131
|
+
*/
|
|
132
|
+
export function getDb(databaseUrl: string, opts: DbOptions = {}): Database {
|
|
133
|
+
const dbSchema = assertSchemaName(opts.schema ?? DEFAULT_DB_SCHEMA);
|
|
134
|
+
const key = cacheKey(databaseUrl, dbSchema);
|
|
135
|
+
let db = cache.get(key);
|
|
8
136
|
if (!db) {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
// the handshake would hold a boot (the migration lock is the first thing
|
|
12
|
-
// that asks) with nothing to say and nothing for the restart policy to
|
|
13
|
-
// see. Half a minute is generous for a handshake and short enough for a
|
|
14
|
-
// failed boot to be visible. It bounds only that: a checkout queued
|
|
15
|
-
// behind a saturated pool, or a query on a connection that stopped
|
|
16
|
-
// answering, is the caller's to bound — the advisory lock does.
|
|
17
|
-
const pool = new pg.Pool({ connectionString: databaseUrl, connectionTimeoutMillis: 30_000 });
|
|
18
|
-
db = drizzle(pool, { schema });
|
|
137
|
+
db = createDb(databaseUrl, opts);
|
|
138
|
+
cache.set(key, db);
|
|
19
139
|
}
|
|
20
140
|
return db;
|
|
21
141
|
}
|
|
22
142
|
|
|
23
|
-
|
|
143
|
+
/**
|
|
144
|
+
* End a handle's pool and forget it, so a later {@link getDb} for the same
|
|
145
|
+
* schema opens a fresh one rather than handing out a pool that was ended.
|
|
146
|
+
* The last step of stopping a knowledge base's graph.
|
|
147
|
+
*/
|
|
148
|
+
export async function closeDb(db: Pick<Database, '$client'>): Promise<void> {
|
|
149
|
+
for (const [key, cached] of cache) {
|
|
150
|
+
if (cached === db) cache.delete(key);
|
|
151
|
+
}
|
|
152
|
+
await db.$client.end();
|
|
153
|
+
}
|
|
@@ -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();
|