@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
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
2
|
import { logger } from '../shared/logging.js';
|
|
3
|
-
|
|
3
|
+
// The browser-side live bindings, imported here and nowhere else in this
|
|
4
|
+
// package: `mirrorSharedBindings` below keeps them in step with `kb` for an
|
|
5
|
+
// overlay that still reads them. Core's own modules read only `KbContext`.
|
|
6
|
+
// eslint-disable-next-line no-restricted-imports
|
|
7
|
+
import { configureBranchModel, configureKbLayout } from '@bevel-software/platform-shared';
|
|
8
|
+
import { sql } from 'drizzle-orm';
|
|
9
|
+
import { DEFAULT_DB_SCHEMA, assertSearchPath } from '../modules/database/connection.js';
|
|
10
|
+
import { DEFAULT_SECRETS_SCOPE } from '../modules/secrets-vault/secrets-variable-loader.js';
|
|
11
|
+
import { KbContext } from '../shared/kb-context.js';
|
|
4
12
|
import { getDb } from '../modules/database/connection.js';
|
|
5
13
|
import { runCoreMigrations } from '../modules/database/migrate.js';
|
|
6
14
|
import { coreMigrationsDir } from '../assets.js';
|
|
@@ -18,6 +26,9 @@ import { DeploymentSettingsService } from '../modules/settings/deployment-settin
|
|
|
18
26
|
import { KbSyncService } from '../modules/kb-sync/kb-sync.service.js';
|
|
19
27
|
import { NodeFs } from '../modules/kb-fs/node-fs.js';
|
|
20
28
|
import { assertKbDirNameFree } from '../modules/kb-fs/repo-path.js';
|
|
29
|
+
import { ManagedRepository, MANAGED_DEFAULT_BRANCH } from '../modules/settings/managed-repository.js';
|
|
30
|
+
import { RepositorySource } from '../modules/settings/repository-source.js';
|
|
31
|
+
import { GitHubAppConnection } from '../modules/github-app/index.js';
|
|
21
32
|
import { AdvisoryLease, AdvisoryLock } from '../modules/database/advisory-lock.js';
|
|
22
33
|
import { holdCommitWorkerLease, withStartupTask } from './lifecycle.js';
|
|
23
34
|
/** The hosted MCP endpoint at a deployment address, with any userinfo stripped. */
|
|
@@ -98,7 +109,21 @@ export async function createCoreServices(config, ports = {}) {
|
|
|
98
109
|
// (see `git-version.ts`): every clone, fetch and refresh below depends on it,
|
|
99
110
|
// so an unsupported binary is better surfaced here than at the first merge.
|
|
100
111
|
await assertGitVersion();
|
|
101
|
-
|
|
112
|
+
// What tells this knowledge base's locks, migration ledger and secrets
|
|
113
|
+
// loader apart from another's in the same process and database. Empty for
|
|
114
|
+
// the default schema, so a single-tenant deployment keeps the lock ids and
|
|
115
|
+
// the ledger it always had.
|
|
116
|
+
const tenantKey = config.dbSchema === DEFAULT_DB_SCHEMA ? '' : config.dbSchema;
|
|
117
|
+
const db = getDb(config.databaseUrl, { schema: config.dbSchema });
|
|
118
|
+
// A schema of its own is created on first use, so a tenant's first
|
|
119
|
+
// activation needs nothing done by hand; `public` always exists. Then the
|
|
120
|
+
// server is asked whether the connections really search that schema: a
|
|
121
|
+
// pooler that dropped the startup parameter would otherwise land every
|
|
122
|
+
// tenant's tables in `public`, silently — see `assertSearchPath`.
|
|
123
|
+
if (tenantKey) {
|
|
124
|
+
await db.execute(sql.raw(`create schema if not exists "${config.dbSchema}"`));
|
|
125
|
+
await assertSearchPath(db, config.dbSchema);
|
|
126
|
+
}
|
|
102
127
|
// Migrations must run BEFORE any service that reads or writes a managed
|
|
103
128
|
// table. `PendingCommitsService.startupReconcile` (called later in this
|
|
104
129
|
// function) hits `pending_commits` — on a fresh DB, deferring migrations to
|
|
@@ -114,40 +139,12 @@ export async function createCoreServices(config, ports = {}) {
|
|
|
114
139
|
// is resolved through them, and a fresh install has none of it in the
|
|
115
140
|
// environment. `load()` is env-first, so an existing deployment sees exactly
|
|
116
141
|
// what it saw before — a stored row only answers where a variable is silent.
|
|
117
|
-
const settings = new DeploymentSettingsService(db, config.secretsEncKey);
|
|
142
|
+
const settings = new DeploymentSettingsService(db, config.secretsEncKey, undefined, { env: config.settingsEnv });
|
|
118
143
|
await settings.load();
|
|
119
|
-
/**
|
|
120
|
-
* The branch model, before anything reads it. It used to be applied at import
|
|
121
|
-
* time from the environment, which is what forced the frontend to bake it
|
|
122
|
-
* into its bundle; it now comes through the settings store like the rest of
|
|
123
|
-
* the deployment's configuration (environment first, as always).
|
|
124
|
-
*
|
|
125
|
-
* UNCONFIGURED IS ALLOWED, and that is the point: a fresh deployment has no
|
|
126
|
-
* branch model, and refusing to boot would take away the setup screen where
|
|
127
|
-
* one gets entered. What reads it before then is the setup path itself, which
|
|
128
|
-
* does not need it — the bootstrap admin is recognised without a workspace.
|
|
129
|
-
* `isComplete` keeps the rest of the app behind the gate until it is set, and
|
|
130
|
-
* the setting is restart-to-apply because services take the value at
|
|
131
|
-
* construction.
|
|
132
|
-
*/
|
|
133
|
-
const branchModel = {
|
|
134
|
-
defaultBranch: settings.resolve('defaultBranch'),
|
|
135
|
-
protectedBranches: settings.resolve('protectedBranches'),
|
|
136
|
-
};
|
|
137
|
-
if (!validateBranchModel(branchModel))
|
|
138
|
-
configureBranchModel(branchModel);
|
|
139
144
|
// The layout variables that were retired this release, folded into their
|
|
140
145
|
// saved settings before anything reads the layout — so the boot that imports
|
|
141
146
|
// them also RUNS on the imported names rather than on the defaults.
|
|
142
147
|
await settings.importLegacyLayoutEnv();
|
|
143
|
-
// The KB layout — the three renameable roots and the agent guide's file name
|
|
144
|
-
// — applied the same way and at the same moment, before any service captures
|
|
145
|
-
// one of them. Unlike the branch model it always resolves (every name has a
|
|
146
|
-
// default), so an invalid value is a real misconfiguration and stops the boot.
|
|
147
|
-
configureKbLayout(settings.resolveKbLayout());
|
|
148
|
-
// A token supplied through the setup screen has to reach the credential
|
|
149
|
-
// helper, which reads `$GITHUB_TOKEN` at call time.
|
|
150
|
-
settings.syncGitTokenEnv();
|
|
151
148
|
// `kbDirName` is read ONCE and threaded into a dozen services as a plain
|
|
152
149
|
// string, which is why changing it needs a restart (the setting says so).
|
|
153
150
|
// The remote URL and username are read per-operation instead, so an admin
|
|
@@ -158,14 +155,96 @@ export async function createCoreServices(config, ports = {}) {
|
|
|
158
155
|
// unnameable. Both are operator settings, so the collision is refused here,
|
|
159
156
|
// by name, before any service captures either.
|
|
160
157
|
assertKbDirNameFree(kbDirName, settings.resolveKbLayout());
|
|
158
|
+
/**
|
|
159
|
+
* The knowledge base's context — the checkout folder, the branch model and
|
|
160
|
+
* the layout — built before any service, and handed to each one that reads
|
|
161
|
+
* a name from it (see `shared/kb-context.ts`). The values come through the
|
|
162
|
+
* settings store like the rest of the deployment's configuration
|
|
163
|
+
* (environment first, as always).
|
|
164
|
+
*
|
|
165
|
+
* The branch model: UNCONFIGURED IS ALLOWED, and that is the point. A fresh
|
|
166
|
+
* deployment has no branch model, and refusing to boot would take away the
|
|
167
|
+
* setup screen where one gets entered. What reads it before then is the
|
|
168
|
+
* setup path itself, which does not need it — the bootstrap admin is
|
|
169
|
+
* recognised without a workspace. `isComplete` keeps the rest of the app
|
|
170
|
+
* behind the gate until it is set, and the save that completes setup applies
|
|
171
|
+
* it to this very object, which every service reads at use rather than
|
|
172
|
+
* capturing at construction.
|
|
173
|
+
*
|
|
174
|
+
* The layout — the three renameable roots and the agent guide's file name —
|
|
175
|
+
* always resolves (every name has a default), so an invalid value is a real
|
|
176
|
+
* misconfiguration and stops the boot.
|
|
177
|
+
*/
|
|
178
|
+
const kb = new KbContext(kbDirName, KbContext.branchModelOrUnconfigured({
|
|
179
|
+
defaultBranch: settings.resolve('defaultBranch'),
|
|
180
|
+
protectedBranches: settings.resolve('protectedBranches'),
|
|
181
|
+
}), settings.resolveKbLayout());
|
|
182
|
+
// The shared package's process-wide live bindings, kept in step with `kb`
|
|
183
|
+
// for an overlay that still reads them — now, and again when the setup-
|
|
184
|
+
// completing save applies a model or a layout. Nothing in this package
|
|
185
|
+
// reads them; a host serving several knowledge bases turns this off.
|
|
186
|
+
if (ports.mirrorSharedBindings !== false) {
|
|
187
|
+
const mirrorBranchModel = () => {
|
|
188
|
+
if (kb.isBranchModelConfigured()) {
|
|
189
|
+
configureBranchModel({ defaultBranch: kb.defaultBranch, protectedBranches: [...kb.protectedBranches] });
|
|
190
|
+
}
|
|
191
|
+
};
|
|
192
|
+
const mirrorLayout = () => configureKbLayout(kb.layout);
|
|
193
|
+
mirrorBranchModel();
|
|
194
|
+
mirrorLayout();
|
|
195
|
+
kb.onBranchModelApplied(mirrorBranchModel);
|
|
196
|
+
kb.onLayoutApplied(mirrorLayout);
|
|
197
|
+
}
|
|
161
198
|
// The disk: one walk, one probe, for every reader below.
|
|
162
199
|
const disk = new NodeFs();
|
|
200
|
+
// What git authenticates with, read on every call: the username and token
|
|
201
|
+
// the setup screen stored, or the environment's. Environment first for the
|
|
202
|
+
// token, as for every setting (`resolve` is env-first); the legacy
|
|
203
|
+
// `GITHUB_TOKEN` / `GH_TOKEN` spellings only through `config`, since the
|
|
204
|
+
// settings catalogue knows `GIT_TOKEN` alone. Handed to the runner, which
|
|
205
|
+
// puts the token into each child's environment — never into this
|
|
206
|
+
// process's, which several knowledge bases may share.
|
|
207
|
+
//
|
|
208
|
+
// Both come from the repository source, which is the one place that knows
|
|
209
|
+
// a deployment can be given its repository in more than one way; what
|
|
210
|
+
// comes back is the address and the credential, as it always was.
|
|
211
|
+
const managedRepository = new ManagedRepository(path.join(config.backupsRoot, 'managed-repository'));
|
|
212
|
+
const githubApp = new GitHubAppConnection({
|
|
213
|
+
read: (key) => settings.resolve(key),
|
|
214
|
+
sourceOf: (key) => settings.sourceOf(key),
|
|
215
|
+
});
|
|
216
|
+
const repositorySource = new RepositorySource({
|
|
217
|
+
read: (key) => settings.resolve(key),
|
|
218
|
+
fallback: { username: config.gitUsername, token: config.gitToken },
|
|
219
|
+
managed: managedRepository,
|
|
220
|
+
githubApp,
|
|
221
|
+
});
|
|
222
|
+
const gitCredentialsInEffect = repositorySource.credentials;
|
|
163
223
|
// How git is run, for every module that runs it: one environment, one buffer
|
|
164
224
|
// ceiling, one error shape, and — the reason it exists — one deadline, so a
|
|
165
225
|
// git that never returns cannot hold a workspace (and with it the commit
|
|
166
226
|
// queue) open indefinitely. See `shared/git.contract.ts`.
|
|
167
|
-
const gitRunner = new NodeGitRunner(config.gitTimeoutMs);
|
|
168
|
-
|
|
227
|
+
const gitRunner = new NodeGitRunner(config.gitTimeoutMs, gitCredentialsInEffect);
|
|
228
|
+
// A deployment that keeps its own repository has it before anything asks
|
|
229
|
+
// for it: one that chose the mode through the environment never passes
|
|
230
|
+
// through the save that would have created it, and the startup phase's
|
|
231
|
+
// first question would be asked of a folder that is not there. Left to
|
|
232
|
+
// that phase to report if it cannot be made: its failures are classified
|
|
233
|
+
// and shown on the setup screen, where a throw here would take the screen
|
|
234
|
+
// down with the boot.
|
|
235
|
+
if (repositorySource.mode() === 'managed') {
|
|
236
|
+
await managedRepository
|
|
237
|
+
.ensure(gitRunner, settings.resolve('defaultBranch') || MANAGED_DEFAULT_BRANCH)
|
|
238
|
+
.catch((err) => logger('setup').error('the managed repository could not be created:', { err }));
|
|
239
|
+
}
|
|
240
|
+
// One reached through a GitHub App has a token in hand before anything
|
|
241
|
+
// reads it: a working copy's credential helper is stamped according to
|
|
242
|
+
// whether there is a token, by code that cannot wait for one. A failure is
|
|
243
|
+
// the startup phase's to report, for the same reason as above.
|
|
244
|
+
if (repositorySource.mode() === 'github-app') {
|
|
245
|
+
await githubApp.prepare().catch(() => undefined);
|
|
246
|
+
}
|
|
247
|
+
const workspaceService = new WorkspaceService(config.workspacesRoot, () => repositorySource.url(), kb, disk, gitRunner);
|
|
169
248
|
// The KB startup phase: every seeding, scaffolding and migration concern,
|
|
170
249
|
// run through one runner at the deployment's quiet moments (boot + setup
|
|
171
250
|
// completion) instead of lazily on branch loads. Root folders this
|
|
@@ -181,18 +260,18 @@ export async function createCoreServices(config, ports = {}) {
|
|
|
181
260
|
// read-only, needs no remote, and must be said even on a deployment whose
|
|
182
261
|
// setup never finished — so `noteBesideCheckout` runs once from the server
|
|
183
262
|
// builder, ahead of this gated phase.)
|
|
184
|
-
new GroupsToPluginsStep(disk),
|
|
185
|
-
new PluginManifestsStep(disk),
|
|
263
|
+
new GroupsToPluginsStep(disk, kb),
|
|
264
|
+
new PluginManifestsStep(disk, kb),
|
|
186
265
|
// After the manifests step: a folder that only just got its manifest got
|
|
187
266
|
// one the renderer wrote, which already carries the display name — the
|
|
188
267
|
// backfill then has nothing to do for it. Ordered the other way, the
|
|
189
268
|
// backfill would walk a tree still missing those manifests.
|
|
190
|
-
new PluginDisplayNamesStep(disk),
|
|
191
|
-
new PersonalSpacesStep(disk),
|
|
269
|
+
new PluginDisplayNamesStep(disk, kb),
|
|
270
|
+
new PersonalSpacesStep(disk, kb),
|
|
192
271
|
// A getter, not a value: the step is built here, while the process may
|
|
193
272
|
// still hold the defaults, and the save that completes first-run setup
|
|
194
273
|
// applies the admin's answer afterwards.
|
|
195
|
-
new TemplateFilesStep(disk, extraDirs, () => settings.resolveAgentsFileLink()),
|
|
274
|
+
new TemplateFilesStep(disk, kb, extraDirs, () => settings.resolveAgentsFileLink()),
|
|
196
275
|
new RolesYamlStep(disk, [config.adminEmail]),
|
|
197
276
|
...(ports.kbStartupSteps ?? []),
|
|
198
277
|
];
|
|
@@ -200,19 +279,21 @@ export async function createCoreServices(config, ports = {}) {
|
|
|
200
279
|
// Getters, not values: the remote and the branch model can arrive from the
|
|
201
280
|
// setup screen after this object exists, and the setup-completion run is
|
|
202
281
|
// the first thing that needs them.
|
|
203
|
-
kbRepoUrl: () =>
|
|
204
|
-
gitUsername: () => settings.resolve('gitUsername') || 'x-access-token',
|
|
205
|
-
gitToken: () => settings.resolve('gitToken'),
|
|
282
|
+
kbRepoUrl: () => repositorySource.url(),
|
|
206
283
|
workspacesRoot: config.workspacesRoot,
|
|
284
|
+
// Under the backups root, a persistent volume of its own and one nothing
|
|
285
|
+
// sweeps: a working copy of a repository that was replaced is kept there,
|
|
286
|
+
// never deleted (see the runner's `reconcileClonesWithConfiguredRepository`).
|
|
287
|
+
setAsideRoot: path.join(config.backupsRoot, 'replaced-working-copies'),
|
|
207
288
|
kbDirName,
|
|
208
289
|
templateDir: config.kbTemplateDir,
|
|
209
|
-
defaultBranch: () =>
|
|
210
|
-
protectedBranches: () => [...
|
|
290
|
+
defaultBranch: () => kb.defaultBranch,
|
|
291
|
+
protectedBranches: () => [...kb.protectedBranches],
|
|
211
292
|
// The deployment owner is the initial Admin of a freshly seeded KB — the
|
|
212
293
|
// same answer `SEED_ADMIN_EMAILS` used to ask for a second time.
|
|
213
294
|
seedAdminEmails: [config.adminEmail],
|
|
214
295
|
steps: kbStartupSteps,
|
|
215
|
-
buildSeedTree: buildSeedTree(disk, config.kbTemplateDir, extraDirs, [config.adminEmail]),
|
|
296
|
+
buildSeedTree: buildSeedTree(disk, config.kbTemplateDir, extraDirs, [config.adminEmail], kb),
|
|
216
297
|
gitRunner,
|
|
217
298
|
});
|
|
218
299
|
// Shared, workspace-independent store for oversized `call_tool_chain` results,
|
|
@@ -227,43 +308,43 @@ export async function createCoreServices(config, ports = {}) {
|
|
|
227
308
|
// gate cannot disagree about who the owner is. They did: the owner could
|
|
228
309
|
// open App roles and then be refused the save, with the UI showing
|
|
229
310
|
// them as an admin and the gate saying "Eligible: Admin".
|
|
230
|
-
const accessControl = new AccessControlService(workspaceService, kbDirName, disk, [config.adminEmail], gitRunner);
|
|
311
|
+
const accessControl = new AccessControlService(workspaceService, kbDirName, disk, [config.adminEmail], gitRunner, kb);
|
|
231
312
|
// Creator read-grant on creation: read is default-deny and the roots grant
|
|
232
313
|
// it to nobody, so every surface that starts a new folder at a root (human
|
|
233
314
|
// routes, agent tools, upload apply) consults this planner to keep the new
|
|
234
315
|
// folder visible to its creator.
|
|
235
|
-
const creatorAccess = new CreatorAccessService(workspaceService, accessControl,
|
|
316
|
+
const creatorAccess = new CreatorAccessService(workspaceService, accessControl, kb, disk);
|
|
236
317
|
// Read-before-write: the gate every lock acquire asks, on every branch —
|
|
237
318
|
// nothing is created, changed or removed where its author cannot read,
|
|
238
319
|
// except that new folder at a root (see `access-model/change-gate.ts`).
|
|
239
|
-
const changeGate = new ChangeReadGate(workspaceService, accessControl,
|
|
320
|
+
const changeGate = new ChangeReadGate(workspaceService, accessControl, kb, disk);
|
|
240
321
|
// Ontology-session boundary: records each agent run's touched ontologies and
|
|
241
322
|
// blocks writes once a run has crossed ontologies. Postgres-backed so the
|
|
242
323
|
// boundary survives a restart.
|
|
243
|
-
const sessionOntologyService = new SessionOntologyService(db);
|
|
324
|
+
const sessionOntologyService = new SessionOntologyService(db, kb);
|
|
244
325
|
// Per-run write restriction (by file extension). Shared by the workspace tool
|
|
245
326
|
// surface (which enforces it) and the routine runner (which sets it for
|
|
246
327
|
// dashboard-only `watchlist_check` runs). In-memory: a restriction lives only for
|
|
247
328
|
// one run, unlike the Postgres-backed ontology touched-set above.
|
|
248
329
|
const routineWritePolicy = new RoutineWritePolicyService();
|
|
249
330
|
// Skills: discovered from the default-branch workspace only (global catalog).
|
|
250
|
-
const skillService = new SkillService(workspaceService, accessControl,
|
|
331
|
+
const skillService = new SkillService(workspaceService, accessControl, kb, disk);
|
|
251
332
|
// Tool manuals: user-authored `*.tool` files under `Plugins/` in the default
|
|
252
333
|
// branch — access-controlled like Skills, served to external agents via
|
|
253
334
|
// `GET /api/agent/all-tools` and registered on the MCP proxy's UTCP client.
|
|
254
335
|
// Where plugins come from: one walk of the plugins root that reads every
|
|
255
336
|
// plugin folder in whichever file shape it carries (see
|
|
256
337
|
// modules/plugins/discovery). Nothing to configure, nothing to document.
|
|
257
|
-
const pluginSource = new KbPluginSource(disk);
|
|
258
|
-
const toolManualService = new ToolManualService(workspaceService, accessControl,
|
|
338
|
+
const pluginSource = new KbPluginSource(disk, kb);
|
|
339
|
+
const toolManualService = new ToolManualService(workspaceService, accessControl, kb, disk, pluginSource);
|
|
259
340
|
// Plugins: the folders under `Plugins/` that carry a
|
|
260
341
|
// team's skills AND the tools they need. Enumerated for EVERY authenticated
|
|
261
342
|
// caller — a plugin they cannot read still exists for them, as a locked one —
|
|
262
343
|
// with the counts read off the two catalogs above rather than a second scan.
|
|
263
344
|
// The link index resolves manifests against the released catalog, and the
|
|
264
345
|
// plugin index counts through it (inline + linked), so it comes first.
|
|
265
|
-
const pluginLinkIndex = new PluginLinkIndex(workspaceService, skillService, accessControl,
|
|
266
|
-
const pluginIndexService = new PluginIndexService(workspaceService, accessControl, skillService, toolManualService,
|
|
346
|
+
const pluginLinkIndex = new PluginLinkIndex(workspaceService, skillService, accessControl, kb, pluginSource);
|
|
347
|
+
const pluginIndexService = new PluginIndexService(workspaceService, accessControl, skillService, toolManualService, kb, pluginSource, Date.now, pluginLinkIndex);
|
|
267
348
|
// Auth service — resolves identities for login, PR author attribution, and
|
|
268
349
|
// access lookups. (Change requests now store the author email directly, so
|
|
269
350
|
// PullRequestService no longer depends on it for attribution.)
|
|
@@ -275,7 +356,7 @@ export async function createCoreServices(config, ports = {}) {
|
|
|
275
356
|
adminPassword: config.adminPassword,
|
|
276
357
|
allowedEmailDomains: parseDomainList(settings.resolve('allowedEmailDomains')),
|
|
277
358
|
loginPasswordEnabled: config.loginPasswordEnabled,
|
|
278
|
-
});
|
|
359
|
+
}, ports.accountAdmission);
|
|
279
360
|
const authMiddleware = createAuthMiddleware(authService);
|
|
280
361
|
// Shared mutex so git and diff operations on the same workspace serialize
|
|
281
362
|
// against each other — a backup-reseed races a concurrent commit otherwise.
|
|
@@ -287,7 +368,7 @@ export async function createCoreServices(config, ports = {}) {
|
|
|
287
368
|
// this function returns. Core registers none: no commit-time validation
|
|
288
369
|
// (advisory anyway) and no ontology write block.
|
|
289
370
|
const workflowHooks = new WorkflowHooks();
|
|
290
|
-
const gitService = new GitService(workspaceService, workflowHooks,
|
|
371
|
+
const gitService = new GitService(workspaceService, workflowHooks, kb, workspaceMutex, accessControl, gitRunner);
|
|
291
372
|
// `get_skill` with a `version` reads the skill out of the default branch's
|
|
292
373
|
// history; the skill service is built before git exists, so git is handed
|
|
293
374
|
// to it here.
|
|
@@ -338,7 +419,7 @@ export async function createCoreServices(config, ports = {}) {
|
|
|
338
419
|
// id-repair keeps the id namespace collision-free. Subscribers are registered
|
|
339
420
|
// below, once the reacting services exist.
|
|
340
421
|
const fileChangeNotifier = new FileChangeNotifier();
|
|
341
|
-
const workflowService = new WorkflowService(db, gitService, pullRequestService, reviewWorkflowService, workspaceService, accessControl, fileLockService, pendingCommitsService,
|
|
422
|
+
const workflowService = new WorkflowService(db, gitService, pullRequestService, reviewWorkflowService, workspaceService, accessControl, fileLockService, pendingCommitsService, kb, changeGate, eventBus, fileChangeNotifier,
|
|
342
423
|
// Exposed as `workflowService.hooks` — the SAME instance GitService and
|
|
343
424
|
// the session-ontology gate consult, so enterprise registrations against
|
|
344
425
|
// it reach every hook point.
|
|
@@ -347,7 +428,10 @@ export async function createCoreServices(config, ports = {}) {
|
|
|
347
428
|
// (the request's branch vs the default branch), so it holds no state — it
|
|
348
429
|
// only needs to read files at refs and to close a request whose proposals
|
|
349
430
|
// have all landed.
|
|
350
|
-
const joinRequestsService = new JoinRequestsService(workspaceService, workflowService
|
|
431
|
+
const joinRequestsService = new JoinRequestsService(workspaceService, workflowService, kb,
|
|
432
|
+
// Read-only: the one question a request asks of the resolver is whether
|
|
433
|
+
// the person it names already holds what it proposes.
|
|
434
|
+
accessControl);
|
|
351
435
|
// The OTHER half of a join request: the row the subscribe endpoint writes
|
|
352
436
|
// before it answers, and the branch/clone/commit/push/change-request work
|
|
353
437
|
// that runs against it afterwards. The row is what lets the click be
|
|
@@ -356,7 +440,7 @@ export async function createCoreServices(config, ports = {}) {
|
|
|
356
440
|
const pluginJoinRequestJobs = new PluginJoinRequestJobs(new DbJoinRequestStore(db), {
|
|
357
441
|
workflow: workflowService,
|
|
358
442
|
workspaceService,
|
|
359
|
-
|
|
443
|
+
kb,
|
|
360
444
|
// A record keys on the plugin's primary FOLDER below the root, which the
|
|
361
445
|
// catalog is the only thing that can turn back into a path and a name
|
|
362
446
|
// people read. Null once nothing answers to the key — a deleted plugin,
|
|
@@ -382,16 +466,16 @@ export async function createCoreServices(config, ports = {}) {
|
|
|
382
466
|
});
|
|
383
467
|
// Links land as ordinary default-branch commits and change what the plugin
|
|
384
468
|
// index counts, so a link drops that cache too.
|
|
385
|
-
const pluginLinksService = new PluginLinksService(workspaceService, workflowService, accessControl, skillService, pluginLinkIndex,
|
|
469
|
+
const pluginLinksService = new PluginLinksService(workspaceService, workflowService, accessControl, skillService, pluginLinkIndex, kb, eventBus, () => pluginIndexService.invalidate());
|
|
386
470
|
// A rename rewrites grants across the knowledge base in one batch commit,
|
|
387
471
|
// then drops every cache that keyed on the old identity.
|
|
388
|
-
const pluginRenameService = new PluginRenameService(workspaceService, workflowService, accessControl, pluginSource, disk,
|
|
472
|
+
const pluginRenameService = new PluginRenameService(workspaceService, workflowService, accessControl, pluginSource, disk, kb, eventBus, () => {
|
|
389
473
|
pluginIndexService.invalidate();
|
|
390
474
|
pluginLinkIndex.invalidate();
|
|
391
475
|
});
|
|
392
476
|
// Source → distribution. The marketplace's identity is fixed for now; the
|
|
393
477
|
// per-user git endpoint and any mirror both compile through this.
|
|
394
|
-
const marketplaceCompiler = new MarketplaceCompilerService(workspaceService, accessControl, skillService, pluginLinkIndex,
|
|
478
|
+
const marketplaceCompiler = new MarketplaceCompilerService(workspaceService, accessControl, skillService, pluginLinkIndex, kb, {
|
|
395
479
|
name: 'hexis',
|
|
396
480
|
owner: 'Hexis',
|
|
397
481
|
description: 'Skills and plugins from this knowledge base',
|
|
@@ -411,23 +495,23 @@ export async function createCoreServices(config, ports = {}) {
|
|
|
411
495
|
// spans a plugin's mcp.json AND plugin.json extensions block, and this is
|
|
412
496
|
// the ONE writer that rewrites both entries and commits them together (see
|
|
413
497
|
// McpServerEditService).
|
|
414
|
-
const mcpServerEditService = new McpServerEditService(workspaceService, workflowService, accessControl, toolManualService,
|
|
498
|
+
const mcpServerEditService = new McpServerEditService(workspaceService, workflowService, accessControl, toolManualService, kb, disk);
|
|
415
499
|
// Plugin provisioning — the one privileged door that brings `Plugins/<name>/`
|
|
416
500
|
// folders into existence (named plugins and personal folders alike). Commits
|
|
417
501
|
// INLINE through the same pipeline the pending-commits worker uses, so the
|
|
418
502
|
// folder's rules are at HEAD before the endpoint answers.
|
|
419
|
-
const pluginProvisionService = new PluginProvisionService(workspaceService, workflowService, accessControl,
|
|
503
|
+
const pluginProvisionService = new PluginProvisionService(workspaceService, workflowService, accessControl, kb, eventBus, pluginSource, disk);
|
|
420
504
|
// Pending skills: the other half of the catalog — skills that exist only on
|
|
421
505
|
// an open change request's branch. Built here rather than beside
|
|
422
506
|
// `skillService` because it needs the workflow service, which does not exist
|
|
423
507
|
// that early; it holds no state of its own, so where it is constructed is the
|
|
424
508
|
// only thing the ordering decides.
|
|
425
|
-
const pendingSkillsService = new PendingSkillsService(workspaceService, accessControl, skillService, workflowService);
|
|
509
|
+
const pendingSkillsService = new PendingSkillsService(workspaceService, accessControl, skillService, workflowService, kb);
|
|
426
510
|
// The same missing half, for tools: a `.tool` manual or an `mcp.json` server
|
|
427
511
|
// an agent proposes is nowhere in the product until its change request
|
|
428
512
|
// merges. Built here for the same reason — it needs the workflow service —
|
|
429
513
|
// and stateless for the same reason.
|
|
430
|
-
const pendingToolsService = new PendingToolsService(workspaceService, accessControl, toolManualService, workflowService);
|
|
514
|
+
const pendingToolsService = new PendingToolsService(workspaceService, accessControl, toolManualService, workflowService, kb);
|
|
431
515
|
// Catalog freshness: the skill / tool-manual / plugin-index caches all scan
|
|
432
516
|
// the DEFAULT branch's working tree, and all three go stale on the same
|
|
433
517
|
// events (a commit, a working-tree write, a merge) — as does the access
|
|
@@ -437,13 +521,13 @@ export async function createCoreServices(config, ports = {}) {
|
|
|
437
521
|
registerCatalogCacheInvalidation({
|
|
438
522
|
eventBus,
|
|
439
523
|
fileChangeNotifier,
|
|
440
|
-
|
|
524
|
+
kb,
|
|
441
525
|
catalogs: [toolManualService, skillService, pluginIndexService, pluginLinkIndex],
|
|
442
526
|
accessControl,
|
|
443
527
|
});
|
|
444
528
|
// Admin = `Admin` role in roles.yaml, resolved through the access model on the
|
|
445
529
|
// default branch (no env allow-list).
|
|
446
|
-
const adminAccess = new AdminAccessService(accessControl, workspaceService, () =>
|
|
530
|
+
const adminAccess = new AdminAccessService(accessControl, workspaceService, () => kb.defaultBranch,
|
|
447
531
|
// The deployment owner administers accounts/roles even before the KB's
|
|
448
532
|
// roles.yaml lists them, and whatever the sign-in method — this list is
|
|
449
533
|
// consulted before any roles.yaml lookup, so it holds for SSO too.
|
|
@@ -467,21 +551,24 @@ export async function createCoreServices(config, ports = {}) {
|
|
|
467
551
|
// `resolve` reads the shared (admin) row or the caller's own per-user row.
|
|
468
552
|
(key) => toolManualService.scopeOfVariable(key));
|
|
469
553
|
// Register the `bevel-secrets` UTCP variable loader against this vault so any
|
|
470
|
-
// UTCP client can resolve `${VAR}` from the caller's secrets at tool-call
|
|
471
|
-
|
|
554
|
+
// UTCP client can resolve `${VAR}` from the caller's secrets at tool-call
|
|
555
|
+
// time — under this knowledge base's scope, since the loader registry is
|
|
556
|
+
// UTCP's and process-wide while the vault is this graph's.
|
|
557
|
+
const secretsScope = tenantKey ? `${config.tenantId}/${config.dbSchema}` : DEFAULT_SECRETS_SCOPE;
|
|
558
|
+
registerBevelSecretsVariableLoader(secretsVaultService, secretsScope);
|
|
472
559
|
// Deleting ONE tool from its page — the owner's verb, the other end of the
|
|
473
560
|
// promise that made them the owner. Built here because it is the one service
|
|
474
561
|
// that spans both halves of a tool: the definition (a `.tool` file or an
|
|
475
562
|
// mcp.json entry) and the credentials stored under its name, which is why it
|
|
476
563
|
// can only exist once the vault does.
|
|
477
|
-
const toolDeleteService = new ToolDeleteService(workspaceService, workflowService, accessControl, toolManualService, skillService, pluginIndexService, pluginSource, secretsVaultService,
|
|
564
|
+
const toolDeleteService = new ToolDeleteService(workspaceService, workflowService, accessControl, toolManualService, skillService, pluginIndexService, pluginSource, secretsVaultService, kb, disk);
|
|
478
565
|
// The credential probe: whether a tool's stored credential actually WORKS, as
|
|
479
566
|
// distinct from whether one is stored. Built here — after the vault and the
|
|
480
567
|
// tool catalog — because a probe needs both: the catalog to know what to
|
|
481
568
|
// call, the vault to resolve the credential to call it with. Holds no state
|
|
482
569
|
// and takes no `db`: a verdict is returned to the caller that asked for it and
|
|
483
570
|
// never outlives their page (see `ProbeVerdict`).
|
|
484
|
-
const connectionProbeService = new ConnectionProbeService(toolManualService, secretsVaultService);
|
|
571
|
+
const connectionProbeService = new ConnectionProbeService(toolManualService, secretsVaultService, secretsScope);
|
|
485
572
|
// Zero-config OAuth for bare `type: mcp` `.tool`s: when the remote server
|
|
486
573
|
// demands OAuth (MCP authorization spec), discover its authorization server,
|
|
487
574
|
// dynamically register a public PKCE client, and persist the provider as the
|
|
@@ -541,7 +628,7 @@ export async function createCoreServices(config, ports = {}) {
|
|
|
541
628
|
// for readers, and the preamble is a broadcast). One reader, two consumers:
|
|
542
629
|
// the proxy below composes in-process per request; the agent-facing route
|
|
543
630
|
// serves the same composition to the local bridge and the frontend card.
|
|
544
|
-
const readPreamble = () => readAgentPreamble(workspaceService,
|
|
631
|
+
const readPreamble = () => readAgentPreamble(workspaceService, kb, disk);
|
|
545
632
|
// The Audit log. Records through the proxy below (every call an external
|
|
546
633
|
// agent makes), reads keys through the key service so their shape is
|
|
547
634
|
// defined once, and prunes past the retention setting — read per sweep, so
|
|
@@ -551,7 +638,7 @@ export async function createCoreServices(config, ports = {}) {
|
|
|
551
638
|
// Loopback to our own REST tool surface — 127.0.0.1 (not localhost) to pin
|
|
552
639
|
// IPv4 and dodge resolver ambiguity. The proxy authenticates each call with
|
|
553
640
|
// the caller's own connection key.
|
|
554
|
-
loopbackBaseUrl: `http://127.0.0.1:${config.port}`,
|
|
641
|
+
loopbackBaseUrl: config.loopbackBaseUrl ?? `http://127.0.0.1:${config.port}`,
|
|
555
642
|
// Manual namespace + UTCP variable prefix (KNOWLEDGE_BASE_API_URL / …).
|
|
556
643
|
manualName: 'KNOWLEDGE_BASE',
|
|
557
644
|
// Oversized chain results spill here too — an external MCP caller has no
|
|
@@ -560,6 +647,7 @@ export async function createCoreServices(config, ports = {}) {
|
|
|
560
647
|
// For the needs-authorization setup link surfaced to external agents.
|
|
561
648
|
publicFrontendUrl: config.publicFrontendUrl,
|
|
562
649
|
readAgentPreamble: readPreamble,
|
|
650
|
+
secretsScope,
|
|
563
651
|
},
|
|
564
652
|
// Pre-dispatch per-user credential check: the vault answers "has this caller
|
|
565
653
|
// set it?" and the manual catalog answers "which user-scoped vars does this
|
|
@@ -665,12 +753,6 @@ export async function createCoreServices(config, ports = {}) {
|
|
|
665
753
|
},
|
|
666
754
|
});
|
|
667
755
|
const leased = withStartupTask(pendingCommitsWorker, reconcileQueue);
|
|
668
|
-
// Not `start()`: the worker runs only while this process holds the
|
|
669
|
-
// commit-worker lease. On a redeploy the outgoing container still holds it,
|
|
670
|
-
// so this one serves requests and declines to drain until that one exits;
|
|
671
|
-
// then it takes the lease and starts. Two processes draining one shared
|
|
672
|
-
// clone volume is the failure this prevents — see `core/lifecycle.ts`.
|
|
673
|
-
const commitWorker = holdCommitWorkerLease(new AdvisoryLease(db, AdvisoryLock.CommitWorker), leased);
|
|
674
756
|
// SSO providers. The array REFERENCE is shared with the caller's port — an
|
|
675
757
|
// overlay pushes its own plugins into it after construction (they mount when
|
|
676
758
|
// the server is built, later). Core contributes the generic OIDC provider.
|
|
@@ -711,7 +793,7 @@ export async function createCoreServices(config, ports = {}) {
|
|
|
711
793
|
eventBus,
|
|
712
794
|
kbDirName,
|
|
713
795
|
bot,
|
|
714
|
-
defaultBranchOf: () =>
|
|
796
|
+
defaultBranchOf: () => kb.defaultBranch,
|
|
715
797
|
}),
|
|
716
798
|
debounceMs: opts?.debounceMs,
|
|
717
799
|
log: opts?.log ?? ((message) => logger('directory-sync').warn(message)),
|
|
@@ -720,22 +802,41 @@ export async function createCoreServices(config, ports = {}) {
|
|
|
720
802
|
// Groups — the "who you are" principal sets. Manual-mode CRUD on
|
|
721
803
|
// groups.yaml, IdP-mode refusals, and the connect-time retirement the
|
|
722
804
|
// directory token route drives.
|
|
723
|
-
const groupsAdminService = new GroupsAdminService(workspaceService, workflowService, accessControl, kbDirName, () =>
|
|
805
|
+
const groupsAdminService = new GroupsAdminService(workspaceService, workflowService, accessControl, kbDirName, () => kb.defaultBranch, eventBus);
|
|
724
806
|
// Account deletion's optional half: the erased address out of roles.yaml,
|
|
725
807
|
// groups.yaml and every access rule, in one commit on the default branch.
|
|
726
808
|
// The deployment owner is never removed this way.
|
|
727
|
-
const userAccessRemovalService = new UserAccessRemovalService(workspaceService, workflowService, accessControl, disk, kbDirName, () =>
|
|
809
|
+
const userAccessRemovalService = new UserAccessRemovalService(workspaceService, workflowService, accessControl, disk, kbDirName, () => kb.defaultBranch, eventBus, [config.adminEmail]);
|
|
810
|
+
// THE LAST THING STARTED, once everything above is built: the lease loop
|
|
811
|
+
// is the one piece of this function that keeps running on its own, and a
|
|
812
|
+
// throw anywhere after it would leave a loop holding — or forever asking
|
|
813
|
+
// for — this knowledge base's lock with no graph to stop it. Single-tenant
|
|
814
|
+
// never noticed (the process exited with the throw); a host that retries
|
|
815
|
+
// an activation would. Not `start()`: the worker runs only while this
|
|
816
|
+
// process holds the commit-worker lease. On a redeploy the outgoing
|
|
817
|
+
// container still holds it, so this one serves requests and declines to
|
|
818
|
+
// drain until that one exits; then it takes the lease and starts. Two
|
|
819
|
+
// processes draining one shared clone volume is the failure this prevents
|
|
820
|
+
// — see `core/lifecycle.ts`.
|
|
821
|
+
const commitWorker = holdCommitWorkerLease(new AdvisoryLease(db, AdvisoryLock.CommitWorker, { tenantKey }), leased);
|
|
728
822
|
return {
|
|
729
823
|
config,
|
|
730
824
|
db,
|
|
731
825
|
gitRunner,
|
|
732
826
|
commitWorker,
|
|
827
|
+
startupRetry: null,
|
|
828
|
+
tenantKey,
|
|
829
|
+
secretsScope,
|
|
733
830
|
disk,
|
|
734
831
|
mcpServerEditService,
|
|
735
832
|
toolDeleteService,
|
|
736
833
|
workspaceService,
|
|
737
834
|
kbStartupRunner,
|
|
835
|
+
repositorySource,
|
|
836
|
+
managedRepository,
|
|
837
|
+
githubApp,
|
|
738
838
|
settings,
|
|
839
|
+
kb,
|
|
739
840
|
kbDirName,
|
|
740
841
|
spillStore,
|
|
741
842
|
docExtractService,
|