@bevel-software/platform-core-backend 0.20.0 → 0.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/catalog-cache-invalidation.d.ts +7 -2
- package/dist/core/catalog-cache-invalidation.d.ts.map +1 -1
- package/dist/core/catalog-cache-invalidation.js +8 -9
- package/dist/core/catalog-cache-invalidation.js.map +1 -1
- package/dist/core/core-ports.d.ts +19 -0
- package/dist/core/core-ports.d.ts.map +1 -1
- package/dist/core/core-ports.js.map +1 -1
- package/dist/core/create-core-server.d.ts +2 -0
- package/dist/core/create-core-server.d.ts.map +1 -1
- package/dist/core/create-core-server.js +23 -105
- package/dist/core/create-core-server.js.map +1 -1
- package/dist/core/create-core-services.d.ts +30 -5
- package/dist/core/create-core-services.d.ts.map +1 -1
- package/dist/core/create-core-services.js +136 -81
- package/dist/core/create-core-services.js.map +1 -1
- package/dist/core/lifecycle.d.ts +74 -28
- package/dist/core/lifecycle.d.ts.map +1 -1
- package/dist/core/lifecycle.js +157 -20
- package/dist/core/lifecycle.js.map +1 -1
- package/dist/core/public-config.d.ts +5 -1
- package/dist/core/public-config.d.ts.map +1 -1
- package/dist/core/public-config.js +7 -5
- package/dist/core/public-config.js.map +1 -1
- package/dist/core-config.d.ts +95 -1
- package/dist/core-config.d.ts.map +1 -1
- package/dist/core-config.js +24 -8
- package/dist/core-config.js.map +1 -1
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -3
- package/dist/index.js.map +1 -1
- package/dist/modules/access/access-control.service.d.ts +18 -1
- package/dist/modules/access/access-control.service.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.js +19 -8
- package/dist/modules/access/access-control.service.js.map +1 -1
- package/dist/modules/access/access.routes.d.ts +2 -1
- package/dist/modules/access/access.routes.d.ts.map +1 -1
- package/dist/modules/access/access.routes.js +10 -10
- package/dist/modules/access/access.routes.js.map +1 -1
- package/dist/modules/access/change-read-gate.d.ts +6 -3
- package/dist/modules/access/change-read-gate.d.ts.map +1 -1
- package/dist/modules/access/change-read-gate.js +9 -6
- package/dist/modules/access/change-read-gate.js.map +1 -1
- package/dist/modules/access/creator-access.d.ts +4 -2
- package/dist/modules/access/creator-access.d.ts.map +1 -1
- package/dist/modules/access/creator-access.js +7 -4
- package/dist/modules/access/creator-access.js.map +1 -1
- package/dist/modules/agent-instructions/read-preamble.d.ts +2 -1
- package/dist/modules/agent-instructions/read-preamble.d.ts.map +1 -1
- package/dist/modules/agent-instructions/read-preamble.js +6 -9
- package/dist/modules/agent-instructions/read-preamble.js.map +1 -1
- package/dist/modules/auth/account-admission.d.ts +40 -0
- package/dist/modules/auth/account-admission.d.ts.map +1 -0
- package/dist/modules/auth/account-admission.js +17 -0
- package/dist/modules/auth/account-admission.js.map +1 -0
- package/dist/modules/auth/account.routes.d.ts.map +1 -1
- package/dist/modules/auth/account.routes.js +4 -1
- package/dist/modules/auth/account.routes.js.map +1 -1
- package/dist/modules/auth/auth.service.d.ts +19 -1
- package/dist/modules/auth/auth.service.d.ts.map +1 -1
- package/dist/modules/auth/auth.service.js +33 -1
- package/dist/modules/auth/auth.service.js.map +1 -1
- package/dist/modules/auth/oidc-auth-provider.d.ts.map +1 -1
- package/dist/modules/auth/oidc-auth-provider.js +9 -0
- package/dist/modules/auth/oidc-auth-provider.js.map +1 -1
- package/dist/modules/connection-probe/connection-probe.service.d.ts +13 -1
- package/dist/modules/connection-probe/connection-probe.service.d.ts.map +1 -1
- package/dist/modules/connection-probe/connection-probe.service.js +10 -2
- package/dist/modules/connection-probe/connection-probe.service.js.map +1 -1
- package/dist/modules/database/advisory-lock.d.ts +17 -0
- package/dist/modules/database/advisory-lock.d.ts.map +1 -1
- package/dist/modules/database/advisory-lock.js +24 -3
- package/dist/modules/database/advisory-lock.js.map +1 -1
- package/dist/modules/database/connection.d.ts +67 -2
- package/dist/modules/database/connection.d.ts.map +1 -1
- package/dist/modules/database/connection.js +118 -12
- package/dist/modules/database/connection.js.map +1 -1
- package/dist/modules/database/migrate.d.ts +1 -1
- package/dist/modules/database/migrate.d.ts.map +1 -1
- package/dist/modules/database/migrate.js +27 -3
- package/dist/modules/database/migrate.js.map +1 -1
- package/dist/modules/kb-fs/branch-name.d.ts +0 -1
- package/dist/modules/kb-fs/branch-name.d.ts.map +1 -1
- package/dist/modules/kb-fs/branch-name.js +3 -3
- package/dist/modules/kb-fs/branch-name.js.map +1 -1
- package/dist/modules/kb-fs/clone-config.d.ts +9 -8
- package/dist/modules/kb-fs/clone-config.d.ts.map +1 -1
- package/dist/modules/kb-fs/clone-config.js +14 -12
- package/dist/modules/kb-fs/clone-config.js.map +1 -1
- package/dist/modules/mcp/mcp.service.d.ts +7 -0
- package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
- package/dist/modules/mcp/mcp.service.js +4 -4
- package/dist/modules/mcp/mcp.service.js.map +1 -1
- package/dist/modules/plugins/compile/marketplace-compiler.service.d.ts +4 -4
- package/dist/modules/plugins/compile/marketplace-compiler.service.d.ts.map +1 -1
- package/dist/modules/plugins/compile/marketplace-compiler.service.js +7 -10
- package/dist/modules/plugins/compile/marketplace-compiler.service.js.map +1 -1
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.d.ts +4 -1
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.d.ts.map +1 -1
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.js +5 -3
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.js.map +1 -1
- package/dist/modules/plugins/discovery/kb-plugin-source.d.ts +6 -1
- package/dist/modules/plugins/discovery/kb-plugin-source.d.ts.map +1 -1
- package/dist/modules/plugins/discovery/kb-plugin-source.js +14 -9
- package/dist/modules/plugins/discovery/kb-plugin-source.js.map +1 -1
- package/dist/modules/plugins/discovery/native.source.d.ts +4 -1
- package/dist/modules/plugins/discovery/native.source.d.ts.map +1 -1
- package/dist/modules/plugins/discovery/native.source.js +4 -2
- package/dist/modules/plugins/discovery/native.source.js.map +1 -1
- package/dist/modules/plugins/index.d.ts +1 -1
- package/dist/modules/plugins/index.d.ts.map +1 -1
- package/dist/modules/plugins/index.js +1 -1
- package/dist/modules/plugins/index.js.map +1 -1
- package/dist/modules/plugins/join-request-jobs.service.d.ts +3 -1
- package/dist/modules/plugins/join-request-jobs.service.d.ts.map +1 -1
- package/dist/modules/plugins/join-request-jobs.service.js +6 -6
- package/dist/modules/plugins/join-request-jobs.service.js.map +1 -1
- package/dist/modules/plugins/join-requests.service.d.ts +3 -1
- package/dist/modules/plugins/join-requests.service.d.ts.map +1 -1
- package/dist/modules/plugins/join-requests.service.js +9 -8
- package/dist/modules/plugins/join-requests.service.js.map +1 -1
- package/dist/modules/plugins/plugin-links.d.ts +65 -10
- package/dist/modules/plugins/plugin-links.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-links.js +136 -31
- package/dist/modules/plugins/plugin-links.js.map +1 -1
- package/dist/modules/plugins/plugin-links.service.d.ts +107 -5
- package/dist/modules/plugins/plugin-links.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-links.service.js +151 -21
- package/dist/modules/plugins/plugin-links.service.js.map +1 -1
- package/dist/modules/plugins/plugin-provision.service.d.ts +10 -3
- package/dist/modules/plugins/plugin-provision.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-provision.service.js +33 -26
- package/dist/modules/plugins/plugin-provision.service.js.map +1 -1
- package/dist/modules/plugins/plugin-rename.service.d.ts +4 -2
- package/dist/modules/plugins/plugin-rename.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-rename.service.js +10 -12
- package/dist/modules/plugins/plugin-rename.service.js.map +1 -1
- package/dist/modules/plugins/plugins.routes.d.ts +3 -0
- package/dist/modules/plugins/plugins.routes.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.routes.js +45 -15
- package/dist/modules/plugins/plugins.routes.js.map +1 -1
- package/dist/modules/plugins/plugins.service.d.ts +4 -4
- package/dist/modules/plugins/plugins.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.service.js +7 -10
- package/dist/modules/plugins/plugins.service.js.map +1 -1
- package/dist/modules/plugins/teams.routes.d.ts +4 -1
- package/dist/modules/plugins/teams.routes.d.ts.map +1 -1
- package/dist/modules/plugins/teams.routes.js +11 -9
- package/dist/modules/plugins/teams.routes.js.map +1 -1
- package/dist/modules/secrets-vault/index.d.ts +1 -1
- package/dist/modules/secrets-vault/index.d.ts.map +1 -1
- package/dist/modules/secrets-vault/index.js +1 -1
- package/dist/modules/secrets-vault/index.js.map +1 -1
- package/dist/modules/secrets-vault/secrets-variable-loader.d.ts +29 -11
- package/dist/modules/secrets-vault/secrets-variable-loader.d.ts.map +1 -1
- package/dist/modules/secrets-vault/secrets-variable-loader.js +46 -21
- package/dist/modules/secrets-vault/secrets-variable-loader.js.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.routes.d.ts +3 -0
- package/dist/modules/secrets-vault/secrets-vault.routes.d.ts.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.routes.js +4 -6
- package/dist/modules/secrets-vault/secrets-vault.routes.js.map +1 -1
- package/dist/modules/settings/deployment-settings.service.d.ts +12 -8
- package/dist/modules/settings/deployment-settings.service.d.ts.map +1 -1
- package/dist/modules/settings/deployment-settings.service.js +20 -22
- package/dist/modules/settings/deployment-settings.service.js.map +1 -1
- package/dist/modules/settings/setup.routes.d.ts +9 -2
- package/dist/modules/settings/setup.routes.d.ts.map +1 -1
- package/dist/modules/settings/setup.routes.js +20 -14
- package/dist/modules/settings/setup.routes.js.map +1 -1
- package/dist/modules/skills/allowed-tools-check.d.ts +4 -3
- package/dist/modules/skills/allowed-tools-check.d.ts.map +1 -1
- package/dist/modules/skills/allowed-tools-check.js +8 -8
- package/dist/modules/skills/allowed-tools-check.js.map +1 -1
- package/dist/modules/skills/pending-skills.service.d.ts +3 -1
- package/dist/modules/skills/pending-skills.service.d.ts.map +1 -1
- package/dist/modules/skills/pending-skills.service.js +9 -6
- package/dist/modules/skills/pending-skills.service.js.map +1 -1
- package/dist/modules/skills/skill-access-requests.routes.d.ts +2 -1
- package/dist/modules/skills/skill-access-requests.routes.d.ts.map +1 -1
- package/dist/modules/skills/skill-access-requests.routes.js +6 -6
- package/dist/modules/skills/skill-access-requests.routes.js.map +1 -1
- package/dist/modules/skills/skills.routes.d.ts +4 -1
- package/dist/modules/skills/skills.routes.d.ts.map +1 -1
- package/dist/modules/skills/skills.routes.js +4 -4
- package/dist/modules/skills/skills.routes.js.map +1 -1
- package/dist/modules/skills/skills.service.d.ts +4 -2
- package/dist/modules/skills/skills.service.d.ts.map +1 -1
- package/dist/modules/skills/skills.service.js +13 -11
- package/dist/modules/skills/skills.service.js.map +1 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.d.ts +2 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.d.ts.map +1 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.js +6 -5
- package/dist/modules/tool-manuals/mcp-json-discovery.js.map +1 -1
- package/dist/modules/tool-manuals/mcp-server-edit.service.d.ts +4 -2
- package/dist/modules/tool-manuals/mcp-server-edit.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/mcp-server-edit.service.js +12 -10
- package/dist/modules/tool-manuals/mcp-server-edit.service.js.map +1 -1
- package/dist/modules/tool-manuals/pending-tools.service.d.ts +3 -1
- package/dist/modules/tool-manuals/pending-tools.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/pending-tools.service.js +19 -16
- package/dist/modules/tool-manuals/pending-tools.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-delete.service.d.ts +4 -2
- package/dist/modules/tool-manuals/tool-delete.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-delete.service.js +14 -12
- package/dist/modules/tool-manuals/tool-delete.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.routes.d.ts +3 -1
- package/dist/modules/tool-manuals/tool-manuals.routes.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.routes.js +7 -7
- package/dist/modules/tool-manuals/tool-manuals.routes.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts +4 -2
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.js +15 -12
- package/dist/modules/tool-manuals/tool-manuals.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts +3 -0
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.js +4 -6
- package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.d.ts +3 -2
- package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +1 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.js +9 -9
- package/dist/modules/workflow/agent-tools/workflow.tools.js.map +1 -1
- package/dist/modules/workflow/git/git.service.d.ts +11 -5
- package/dist/modules/workflow/git/git.service.d.ts.map +1 -1
- package/dist/modules/workflow/git/git.service.js +23 -14
- package/dist/modules/workflow/git/git.service.js.map +1 -1
- package/dist/modules/workflow/git/node-git-runner.d.ts +26 -2
- package/dist/modules/workflow/git/node-git-runner.d.ts.map +1 -1
- package/dist/modules/workflow/git/node-git-runner.js +35 -5
- package/dist/modules/workflow/git/node-git-runner.js.map +1 -1
- package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts.map +1 -1
- package/dist/modules/workflow/review-workflow/review-workflow.service.js +9 -4
- package/dist/modules/workflow/review-workflow/review-workflow.service.js.map +1 -1
- package/dist/modules/workflow/session-ontology.service.d.ts +6 -1
- package/dist/modules/workflow/session-ontology.service.d.ts.map +1 -1
- package/dist/modules/workflow/session-ontology.service.js +6 -2
- package/dist/modules/workflow/session-ontology.service.js.map +1 -1
- package/dist/modules/workflow/workflow.service.d.ts +8 -3
- package/dist/modules/workflow/workflow.service.d.ts.map +1 -1
- package/dist/modules/workflow/workflow.service.js +33 -23
- package/dist/modules/workflow/workflow.service.js.map +1 -1
- package/dist/modules/workspace/session-ontology.gate.d.ts +3 -1
- package/dist/modules/workspace/session-ontology.gate.d.ts.map +1 -1
- package/dist/modules/workspace/session-ontology.gate.js +3 -3
- package/dist/modules/workspace/session-ontology.gate.js.map +1 -1
- package/dist/modules/workspace/startup/kb-git.d.ts +4 -3
- package/dist/modules/workspace/startup/kb-git.d.ts.map +1 -1
- package/dist/modules/workspace/startup/kb-git.js +15 -13
- package/dist/modules/workspace/startup/kb-git.js.map +1 -1
- package/dist/modules/workspace/startup/kb-startup-runner.d.ts +5 -8
- package/dist/modules/workspace/startup/kb-startup-runner.d.ts.map +1 -1
- package/dist/modules/workspace/startup/kb-startup-runner.js +35 -38
- package/dist/modules/workspace/startup/kb-startup-runner.js.map +1 -1
- package/dist/modules/workspace/startup/steps/groups-to-plugins.step.d.ts +7 -1
- package/dist/modules/workspace/startup/steps/groups-to-plugins.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/groups-to-plugins.step.js +23 -16
- package/dist/modules/workspace/startup/steps/groups-to-plugins.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/personal-spaces.step.d.ts +7 -1
- package/dist/modules/workspace/startup/steps/personal-spaces.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/personal-spaces.step.js +12 -5
- package/dist/modules/workspace/startup/steps/personal-spaces.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/plugin-display-names.step.d.ts +7 -1
- package/dist/modules/workspace/startup/steps/plugin-display-names.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/plugin-display-names.step.js +12 -5
- package/dist/modules/workspace/startup/steps/plugin-display-names.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.d.ts +7 -1
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.js +12 -5
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/seed-tree.d.ts +4 -1
- package/dist/modules/workspace/startup/steps/seed-tree.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/seed-tree.js +14 -11
- package/dist/modules/workspace/startup/steps/seed-tree.js.map +1 -1
- package/dist/modules/workspace/startup/steps/template-files.step.d.ts +17 -3
- package/dist/modules/workspace/startup/steps/template-files.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/template-files.step.js +36 -30
- package/dist/modules/workspace/startup/steps/template-files.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/template-source.d.ts +6 -1
- package/dist/modules/workspace/startup/steps/template-source.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/template-source.js +10 -6
- package/dist/modules/workspace/startup/steps/template-source.js.map +1 -1
- package/dist/modules/workspace/workspace.routes.d.ts +2 -1
- package/dist/modules/workspace/workspace.routes.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.routes.js +8 -7
- package/dist/modules/workspace/workspace.routes.js.map +1 -1
- package/dist/modules/workspace/workspace.service.d.ts +18 -12
- package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.service.js +32 -28
- package/dist/modules/workspace/workspace.service.js.map +1 -1
- package/dist/modules/workspace/workspace.tools.d.ts +2 -1
- package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.tools.js +20 -18
- package/dist/modules/workspace/workspace.tools.js.map +1 -1
- package/dist/modules/workspace/write-denial.d.ts +3 -2
- package/dist/modules/workspace/write-denial.d.ts.map +1 -1
- package/dist/modules/workspace/write-denial.js +6 -5
- package/dist/modules/workspace/write-denial.js.map +1 -1
- package/dist/shared/git.contract.d.ts +52 -7
- package/dist/shared/git.contract.d.ts.map +1 -1
- package/dist/shared/git.contract.js +30 -8
- package/dist/shared/git.contract.js.map +1 -1
- package/dist/shared/kb-context.d.ts +76 -0
- package/dist/shared/kb-context.d.ts.map +1 -0
- package/dist/shared/kb-context.js +108 -0
- package/dist/shared/kb-context.js.map +1 -0
- package/dist/shared/kb-layout.d.ts +3 -2
- package/dist/shared/kb-layout.d.ts.map +1 -1
- package/dist/shared/kb-layout.js +4 -3
- package/dist/shared/kb-layout.js.map +1 -1
- package/dist/shared/kb-layout.test.js +35 -27
- package/dist/shared/kb-layout.test.js.map +1 -1
- package/dist/shared/pending-proposals.d.ts +4 -1
- package/dist/shared/pending-proposals.d.ts.map +1 -1
- package/dist/shared/pending-proposals.js +3 -4
- package/dist/shared/pending-proposals.js.map +1 -1
- package/dist/shared/redact-secret.d.ts +5 -5
- package/dist/shared/redact-secret.js +5 -5
- package/dist/tenancy/index.d.ts +13 -0
- package/dist/tenancy/index.d.ts.map +1 -0
- package/dist/tenancy/index.js +13 -0
- package/dist/tenancy/index.js.map +1 -0
- package/dist/tenancy/static-tenant-source.d.ts +98 -0
- package/dist/tenancy/static-tenant-source.d.ts.map +1 -0
- package/dist/tenancy/static-tenant-source.js +220 -0
- package/dist/tenancy/static-tenant-source.js.map +1 -0
- package/dist/tenancy/tenant-host.d.ts +80 -0
- package/dist/tenancy/tenant-host.d.ts.map +1 -0
- package/dist/tenancy/tenant-host.js +217 -0
- package/dist/tenancy/tenant-host.js.map +1 -0
- package/dist/tenancy/tenant-runtime.d.ts +91 -0
- package/dist/tenancy/tenant-runtime.d.ts.map +1 -0
- package/dist/tenancy/tenant-runtime.js +174 -0
- package/dist/tenancy/tenant-runtime.js.map +1 -0
- package/dist/tenancy/tenant-secrets.d.ts +24 -0
- package/dist/tenancy/tenant-secrets.d.ts.map +1 -0
- package/dist/tenancy/tenant-secrets.js +30 -0
- package/dist/tenancy/tenant-secrets.js.map +1 -0
- package/dist/tenancy/tenant-source.contract.d.ts +45 -0
- package/dist/tenancy/tenant-source.contract.d.ts.map +1 -0
- package/dist/tenancy/tenant-source.contract.js +21 -0
- package/dist/tenancy/tenant-source.contract.js.map +1 -0
- package/migrations/0000_core_init.sql +14 -14
- package/migrations/0003_deployment_settings.sql +1 -1
- package/migrations/0005_github_facade.sql +1 -1
- package/migrations/0012_agent_audit.sql +6 -6
- package/package.json +3 -3
- package/src/__tests__/branch-model.test.ts +7 -6
- package/src/__tests__/kb-context.ts +30 -0
- package/src/__tests__/kb-layout-config.test.ts +35 -30
- package/src/core/__tests__/catalog-cache-invalidation.test.ts +2 -1
- package/src/core/__tests__/lifecycle.test.ts +78 -1
- package/src/core/__tests__/public-config.test.ts +5 -1
- package/src/core/catalog-cache-invalidation.ts +16 -11
- package/src/core/core-ports.ts +19 -0
- package/src/core/create-core-server.ts +27 -106
- package/src/core/create-core-services.ts +180 -95
- package/src/core/lifecycle.ts +214 -29
- package/src/core/public-config.ts +8 -5
- package/src/core-config.ts +107 -8
- package/src/index.ts +25 -2
- package/src/modules/access/__tests__/access-control.admin-root-floor.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.batch.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.folder-governs.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.group-grant.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.overrides.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.proposal-branch.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.prospective.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.revoke.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.unknown-email.test.ts +2 -1
- package/src/modules/access/__tests__/change-read-gate.test.ts +13 -11
- package/src/modules/access/__tests__/creator-access.test.ts +3 -2
- package/src/modules/access/__tests__/roles.routes.test.ts +2 -1
- package/src/modules/access/access-control.service.ts +20 -6
- package/src/modules/access/access.routes.ts +10 -13
- package/src/modules/access/change-read-gate.ts +10 -4
- package/src/modules/access/creator-access.ts +7 -2
- package/src/modules/agent-instructions/__tests__/read-preamble.test.ts +13 -12
- package/src/modules/agent-instructions/read-preamble.ts +10 -12
- package/src/modules/auth/__tests__/account.routes.test.ts +15 -0
- package/src/modules/auth/__tests__/auth.service.test.ts +60 -0
- package/src/modules/auth/account-admission.ts +44 -0
- package/src/modules/auth/account.routes.ts +4 -1
- package/src/modules/auth/auth.service.ts +33 -1
- package/src/modules/auth/oidc-auth-provider.ts +9 -0
- package/src/modules/connection-probe/connection-probe.service.ts +7 -1
- package/src/modules/database/__tests__/advisory-lock.test.ts +23 -1
- package/src/modules/database/__tests__/connection.test.ts +98 -0
- package/src/modules/database/__tests__/migrations-unqualified.test.ts +32 -0
- package/src/modules/database/advisory-lock.ts +28 -4
- package/src/modules/database/connection.ts +143 -13
- package/src/modules/database/migrate.ts +48 -14
- package/src/modules/diff/__tests__/diff.service.seed-atomicity.test.ts +2 -1
- package/src/modules/diff/__tests__/diff.service.test.ts +2 -1
- package/src/modules/kb-fs/__tests__/branch-name.test.ts +6 -6
- package/src/modules/kb-fs/__tests__/clone-config.test.ts +24 -20
- package/src/modules/kb-fs/branch-name.ts +3 -3
- package/src/modules/kb-fs/clone-config.ts +15 -12
- package/src/modules/marketplace/__tests__/marketplace-repo.head.test.ts +2 -1
- package/src/modules/mcp/mcp.service.ts +11 -4
- package/src/modules/plugins/__tests__/bundle-dialect.e2e.test.ts +12 -11
- package/src/modules/plugins/__tests__/bundle-dialect.test.ts +2 -1
- package/src/modules/plugins/__tests__/compile-marketplace.test.ts +6 -4
- package/src/modules/plugins/__tests__/join-request-jobs.service.test.ts +2 -1
- package/src/modules/plugins/__tests__/join-requests.service.test.ts +2 -1
- package/src/modules/plugins/__tests__/plugin-creation-display-name.test.ts +4 -3
- package/src/modules/plugins/__tests__/plugin-index.service.test.ts +6 -4
- package/src/modules/plugins/__tests__/plugin-links.service.test.ts +220 -5
- package/src/modules/plugins/__tests__/plugin-provision.service.test.ts +3 -1
- package/src/modules/plugins/__tests__/plugin-rename.service.test.ts +7 -6
- package/src/modules/plugins/__tests__/plugins.routes.test.ts +11 -2
- package/src/modules/plugins/__tests__/teams.routes.test.ts +2 -1
- package/src/modules/plugins/compile/marketplace-compiler.service.ts +7 -9
- package/src/modules/plugins/discovery/__tests__/kb-plugin-source.test.ts +20 -16
- package/src/modules/plugins/discovery/bundle-dialect/bundle.source.ts +9 -2
- package/src/modules/plugins/discovery/kb-plugin-source.ts +15 -8
- package/src/modules/plugins/discovery/native.source.ts +4 -1
- package/src/modules/plugins/index.ts +1 -1
- package/src/modules/plugins/join-request-jobs.service.ts +8 -7
- package/src/modules/plugins/join-requests.service.ts +7 -7
- package/src/modules/plugins/plugin-links.service.ts +192 -19
- package/src/modules/plugins/plugin-links.ts +147 -27
- package/src/modules/plugins/plugin-provision.service.ts +54 -27
- package/src/modules/plugins/plugin-rename.service.ts +10 -10
- package/src/modules/plugins/plugins.routes.ts +45 -15
- package/src/modules/plugins/plugins.service.ts +7 -11
- package/src/modules/plugins/teams.routes.ts +16 -8
- package/src/modules/secrets-vault/__tests__/connect-pending.route.test.ts +7 -0
- package/src/modules/secrets-vault/__tests__/secrets-variable-loader.test.ts +40 -0
- package/src/modules/secrets-vault/__tests__/tool-owner-gate.route.test.ts +2 -0
- package/src/modules/secrets-vault/index.ts +2 -0
- package/src/modules/secrets-vault/secrets-variable-loader.ts +51 -21
- package/src/modules/secrets-vault/secrets-vault.routes.ts +7 -6
- package/src/modules/settings/__tests__/deployment-settings.service.test.ts +24 -11
- package/src/modules/settings/__tests__/git-root-folders.test.ts +2 -1
- package/src/modules/settings/__tests__/setup.routes.boot-failure.test.ts +2 -1
- package/src/modules/settings/__tests__/setup.routes.layout-phase.test.ts +7 -4
- package/src/modules/settings/__tests__/setup.routes.oidc.test.ts +2 -0
- package/src/modules/settings/__tests__/setup.routes.sync-status.test.ts +2 -0
- package/src/modules/settings/__tests__/setup.routes.test.ts +33 -52
- package/src/modules/settings/deployment-settings.service.ts +21 -20
- package/src/modules/settings/setup.routes.ts +26 -16
- package/src/modules/skills/__tests__/allowed-tools-check.test.ts +11 -10
- package/src/modules/skills/__tests__/allowed-tools-warn.tools.test.ts +4 -3
- package/src/modules/skills/__tests__/pending-skills.service.test.ts +3 -1
- package/src/modules/skills/__tests__/skill-access-requests.routes.test.ts +2 -1
- package/src/modules/skills/__tests__/skills.routes.warnings.test.ts +2 -1
- package/src/modules/skills/__tests__/skills.service.test.ts +3 -2
- package/src/modules/skills/allowed-tools-check.ts +7 -6
- package/src/modules/skills/pending-skills.service.ts +9 -8
- package/src/modules/skills/skill-access-requests.routes.ts +7 -7
- package/src/modules/skills/skills.routes.ts +4 -3
- package/src/modules/skills/skills.service.ts +13 -9
- package/src/modules/tool-helpers/__tests__/agent-roles-write.test.ts +3 -2
- package/src/modules/tool-helpers/__tests__/phase4-tools.test.ts +3 -2
- package/src/modules/tool-manuals/__tests__/mcp-json-discovery.test.ts +17 -12
- package/src/modules/tool-manuals/__tests__/mcp-server-edit.service.test.ts +2 -1
- package/src/modules/tool-manuals/__tests__/pending-tools.service.test.ts +4 -1
- package/src/modules/tool-manuals/__tests__/tool-delete.service.test.ts +2 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.archive.route.test.ts +2 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.cli.test.ts +5 -4
- package/src/modules/tool-manuals/__tests__/tool-manuals.detail.route.test.ts +2 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.invalid.routes.test.ts +4 -2
- package/src/modules/tool-manuals/__tests__/tool-manuals.invalid.test.ts +13 -5
- package/src/modules/tool-manuals/__tests__/tool-manuals.mcp-oauth.test.ts +2 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.restart.test.ts +9 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.service.test.ts +3 -2
- package/src/modules/tool-manuals/__tests__/tool-manuals.tools.test.ts +2 -0
- package/src/modules/tool-manuals/mcp-json-discovery.ts +6 -4
- package/src/modules/tool-manuals/mcp-server-edit.service.ts +13 -11
- package/src/modules/tool-manuals/pending-tools.service.ts +19 -16
- package/src/modules/tool-manuals/tool-delete.service.ts +13 -10
- package/src/modules/tool-manuals/tool-manuals.routes.ts +10 -8
- package/src/modules/tool-manuals/tool-manuals.service.ts +15 -13
- package/src/modules/tool-manuals/tool-manuals.tools.ts +7 -6
- package/src/modules/workflow/__tests__/apply-failure.test.ts +2 -1
- package/src/modules/workflow/__tests__/merge-announces-tree.test.ts +14 -26
- package/src/modules/workflow/__tests__/preserve-roles-yaml.test.ts +2 -1
- package/src/modules/workflow/__tests__/session-ontology.service.test.ts +3 -2
- package/src/modules/workflow/__tests__/workflow.routes.lock-path.test.ts +2 -1
- package/src/modules/workflow/__tests__/workflow.service.branch-in-use.test.ts +3 -10
- package/src/modules/workflow/__tests__/workflow.service.commitFileWhileLocked.test.ts +2 -1
- package/src/modules/workflow/__tests__/workflow.service.deleted-branch-sweep.test.ts +3 -10
- package/src/modules/workflow/__tests__/workflow.service.facade.test.ts +28 -27
- package/src/modules/workflow/__tests__/workflow.service.folder-proposals.test.ts +2 -1
- package/src/modules/workflow/__tests__/workflow.service.platform-restore.test.ts +2 -1
- package/src/modules/workflow/__tests__/workflow.service.read-gate.test.ts +3 -2
- package/src/modules/workflow/__tests__/workflow.service.releaseLock.test.ts +2 -1
- package/src/modules/workflow/__tests__/workflow.service.sync.test.ts +5 -4
- package/src/modules/workflow/__tests__/workflow.service.update-from-target.test.ts +2 -1
- package/src/modules/workflow/agent-tools/__tests__/workflow.tools.test.ts +2 -1
- package/src/modules/workflow/agent-tools/workflow.tools.ts +11 -9
- package/src/modules/workflow/git/__tests__/git.service.accessGating.test.ts +5 -4
- package/src/modules/workflow/git/__tests__/git.service.changedFilesForPr.test.ts +12 -11
- package/src/modules/workflow/git/__tests__/git.service.commitChanges.test.ts +9 -8
- package/src/modules/workflow/git/__tests__/git.service.commitFile.strayPath.test.ts +8 -7
- package/src/modules/workflow/git/__tests__/git.service.commitFile.test.ts +6 -5
- package/src/modules/workflow/git/__tests__/git.service.createBranch.test.ts +3 -2
- package/src/modules/workflow/git/__tests__/git.service.deleteBranch.test.ts +3 -2
- package/src/modules/workflow/git/__tests__/git.service.diffFileAtCommit.test.ts +7 -6
- package/src/modules/workflow/git/__tests__/git.service.diffFileBetweenBranches.test.ts +16 -15
- package/src/modules/workflow/git/__tests__/git.service.fileContentsAtCommit.test.ts +3 -2
- package/src/modules/workflow/git/__tests__/git.service.forkPoint.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.history-guards.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.list-branches.test.ts +10 -9
- package/src/modules/workflow/git/__tests__/git.service.listTrackedFiles.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.logForFile.test.ts +6 -5
- package/src/modules/workflow/git/__tests__/git.service.mergeChangeRequest.test.ts +9 -8
- package/src/modules/workflow/git/__tests__/git.service.pendingChanges.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.postMergePull.test.ts +4 -3
- package/src/modules/workflow/git/__tests__/git.service.pull.test.ts +9 -8
- package/src/modules/workflow/git/__tests__/git.service.readFileAtRef.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.revertPathsAndPush.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.status.test.ts +4 -3
- package/src/modules/workflow/git/__tests__/git.service.syncFromRemote.test.ts +8 -7
- package/src/modules/workflow/git/__tests__/node-git-runner.test.ts +41 -3
- package/src/modules/workflow/git/git.service.ts +24 -13
- package/src/modules/workflow/git/node-git-runner.ts +37 -4
- package/src/modules/workflow/review-workflow/review-workflow.service.ts +9 -6
- package/src/modules/workflow/session-ontology.service.ts +7 -2
- package/src/modules/workflow/workflow.service.ts +31 -24
- package/src/modules/workspace/__tests__/file-stat-access.test.ts +3 -2
- package/src/modules/workspace/__tests__/git-internals.security.test.ts +10 -9
- package/src/modules/workspace/__tests__/session-ontology.gate.test.ts +4 -2
- package/src/modules/workspace/__tests__/workspace-paths-inside-the-repo.test.ts +3 -2
- package/src/modules/workspace/__tests__/workspace.routes.branch-errors.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.create-grant.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.delete.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.download-implies-read.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.download.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.file-writes.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.folders.test.ts +5 -4
- package/src/modules/workspace/__tests__/workspace.routes.move-platform-files.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.read-gate.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.service.ensure-remotes-fetched.test.ts +2 -2
- package/src/modules/workspace/__tests__/workspace.service.list-cloned.test.ts +6 -5
- package/src/modules/workspace/__tests__/workspace.service.move-never-overwrites.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.service.read-filter.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.service.test.ts +84 -50
- package/src/modules/workspace/__tests__/workspace.service.unknown-branch.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.tools.agents-file.test.ts +10 -7
- package/src/modules/workspace/__tests__/workspace.tools.branch-errors.test.ts +4 -3
- package/src/modules/workspace/__tests__/workspace.tools.test.ts +9 -8
- package/src/modules/workspace/__tests__/write-denial.test.ts +5 -4
- package/src/modules/workspace/session-ontology.gate.ts +6 -4
- package/src/modules/workspace/startup/__tests__/kb-startup-runner.degraded.test.ts +6 -2
- package/src/modules/workspace/startup/__tests__/kb-startup-runner.test.ts +29 -21
- package/src/modules/workspace/startup/kb-git.ts +15 -22
- package/src/modules/workspace/startup/kb-startup-runner.ts +40 -46
- package/src/modules/workspace/startup/steps/__tests__/steps.test.ts +104 -98
- package/src/modules/workspace/startup/steps/groups-to-plugins.step.ts +24 -16
- package/src/modules/workspace/startup/steps/personal-spaces.step.ts +14 -5
- package/src/modules/workspace/startup/steps/plugin-display-names.step.ts +13 -5
- package/src/modules/workspace/startup/steps/plugin-manifests.step.ts +14 -5
- package/src/modules/workspace/startup/steps/seed-tree.ts +11 -9
- package/src/modules/workspace/startup/steps/template-files.step.ts +43 -34
- package/src/modules/workspace/startup/steps/template-source.ts +8 -5
- package/src/modules/workspace/workspace.routes.ts +8 -7
- package/src/modules/workspace/workspace.service.ts +30 -27
- package/src/modules/workspace/workspace.tools.ts +21 -20
- package/src/modules/workspace/write-denial.ts +7 -5
- package/src/shared/__tests__/kb-layout.plugin.test.ts +19 -16
- package/src/shared/git.contract.ts +70 -8
- package/src/shared/kb-context.ts +130 -0
- package/src/shared/kb-layout.test.ts +37 -27
- package/src/shared/kb-layout.ts +4 -3
- package/src/shared/pending-proposals.ts +7 -4
- package/src/shared/redact-secret.ts +5 -5
- package/src/tenancy/__tests__/static-tenant-source.test.ts +177 -0
- package/src/tenancy/__tests__/tenant-host.test.ts +372 -0
- package/src/tenancy/__tests__/tenant-runtime.test.ts +221 -0
- package/src/tenancy/__tests__/tenant-secrets.test.ts +35 -0
- package/src/tenancy/index.ts +35 -0
- package/src/tenancy/static-tenant-source.ts +296 -0
- package/src/tenancy/tenant-host.ts +261 -0
- package/src/tenancy/tenant-runtime.ts +208 -0
- package/src/tenancy/tenant-secrets.ts +41 -0
- package/src/tenancy/tenant-source.contract.ts +59 -0
package/src/core/lifecycle.ts
CHANGED
|
@@ -1,8 +1,17 @@
|
|
|
1
1
|
import type { Server } from 'node:http';
|
|
2
|
-
import type
|
|
2
|
+
import { closeDb, type Database } from '../modules/database/connection.js';
|
|
3
3
|
import type { AdvisoryLease } from '../modules/database/advisory-lock.js';
|
|
4
|
+
import { KbRemoteUnreachableError, type KbStartupRunner } from '../modules/workspace/startup/kb-startup-runner.js';
|
|
5
|
+
import { noteBesideCheckout } from '../modules/workspace/startup/beside-checkout.js';
|
|
6
|
+
import { unregisterBevelSecretsVariableLoader } from '../modules/secrets-vault/secrets-variable-loader.js';
|
|
7
|
+
import type { WorkflowService } from '../modules/workflow/workflow.service.js';
|
|
8
|
+
import type { PluginJoinRequestJobs } from '../modules/plugins/join-request-jobs.service.js';
|
|
9
|
+
import { printable } from '../shared/printable.js';
|
|
4
10
|
import { logger } from '../shared/logging.js';
|
|
5
11
|
|
|
12
|
+
const startupLog = logger('kb-startup');
|
|
13
|
+
const crLog = logger('cr');
|
|
14
|
+
|
|
6
15
|
/**
|
|
7
16
|
* The process lifecycle: who may drain the commit queue, and how the process
|
|
8
17
|
* stops.
|
|
@@ -193,25 +202,166 @@ export function withStartupTask(
|
|
|
193
202
|
};
|
|
194
203
|
}
|
|
195
204
|
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
205
|
+
/**
|
|
206
|
+
* What one knowledge base's graph needs of itself to be STARTED: the boot
|
|
207
|
+
* side effects that used to run inside `createCoreServer`, named so a host
|
|
208
|
+
* can run them for a graph it builds on demand, and stop them again.
|
|
209
|
+
*/
|
|
210
|
+
export interface BootableCore {
|
|
211
|
+
config: { workspacesRoot: string };
|
|
212
|
+
kbDirName: string;
|
|
213
|
+
kbStartupRunner: Pick<KbStartupRunner, 'runAll' | 'retryUntilMaintained'>;
|
|
214
|
+
workflowService: Pick<WorkflowService, 'closeChangeRequestsWithDeletedBranches'>;
|
|
215
|
+
pluginJoinRequestJobs: Pick<PluginJoinRequestJobs, 'startSweeping'>;
|
|
216
|
+
/**
|
|
217
|
+
* The startup phase's retry, when the boot survived an unreachable remote
|
|
218
|
+
* and is asking again on a timer; null otherwise. Set by {@link startCore},
|
|
219
|
+
* stopped by {@link stopCore}.
|
|
220
|
+
*/
|
|
221
|
+
startupRetry: { stop(): void } | null;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Bring a built graph up: the distribution's boot hook, the note about what
|
|
226
|
+
* sits beside a checkout, the knowledge-base startup phase with its
|
|
227
|
+
* unreachable-remote fallback, the deleted-branch sweep and the join-request
|
|
228
|
+
* jobs. `createCoreServer` runs this for a single-tenant deployment; a host
|
|
229
|
+
* serving several knowledge bases runs it when a tenant is activated.
|
|
230
|
+
*
|
|
231
|
+
* Throws to stop the boot on every failure but an unreachable remote — the
|
|
232
|
+
* container's restart policy is the retry — see `kb-startup-runner.ts`.
|
|
233
|
+
*/
|
|
234
|
+
export async function startCore<C extends BootableCore>(
|
|
235
|
+
core: C,
|
|
236
|
+
ext: { onBoot?(core: C): Promise<void> | void } = {},
|
|
237
|
+
): Promise<void> {
|
|
238
|
+
// Overlay boot-time side effects (startup reconciles, periodic sweeps).
|
|
239
|
+
await ext.onBoot?.(core);
|
|
240
|
+
|
|
241
|
+
// What is already sitting beside a checkout, named once per boot and touched
|
|
242
|
+
// by nothing. Outside the KB startup phase below on purpose: that phase is
|
|
243
|
+
// gated on the branch model and the repository URL, and a deployment whose
|
|
244
|
+
// setup never finished — or whose remote is down — is exactly one whose
|
|
245
|
+
// strays would otherwise go unmentioned. A diagnostic never stops a boot, so
|
|
246
|
+
// an unreadable workspaces root is logged and the boot carries on.
|
|
247
|
+
try {
|
|
248
|
+
await noteBesideCheckout(core.config.workspacesRoot, core.kbDirName);
|
|
249
|
+
} catch (err) {
|
|
250
|
+
// `printable`, because the message quotes a path off the disk (an ENOENT
|
|
251
|
+
// or EACCES names the file it failed on) and a name carrying a control
|
|
252
|
+
// character would forge a second line of the operator's log.
|
|
253
|
+
startupLog.warn('could not look for content beside the checkouts:', {
|
|
254
|
+
detail: printable(err instanceof Error ? err.message : String(err)),
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
// The KB startup phase — AFTER the distribution's onBoot, because a FATAL
|
|
259
|
+
// template finding raised there must stop the boot before anything seeds
|
|
260
|
+
// from that template; the runner then brings every branch up to this build
|
|
261
|
+
// before any route can serve KB content. Throws to stop the boot (the
|
|
262
|
+
// container's restart policy is the retry) — see kb-startup-runner.ts.
|
|
263
|
+
//
|
|
264
|
+
// Runs in the booting process whether or not it holds the commit-worker
|
|
265
|
+
// lease, so on a redeploy it overlaps the outgoing holder's commits for the
|
|
266
|
+
// seconds it takes — the documented window at `holdCommitWorkerLease`.
|
|
267
|
+
try {
|
|
268
|
+
await core.kbStartupRunner.runAll();
|
|
269
|
+
} catch (err) {
|
|
270
|
+
// The one failure a boot survives: the remote cannot be reached. That
|
|
271
|
+
// says nothing about the knowledge base — what we would write is not
|
|
272
|
+
// known to be wrong, we cannot get there — so refusing to boot only took
|
|
273
|
+
// away the login and setup screens an operator needs to fix it (a
|
|
274
|
+
// rotated token, say). The deployment comes up GATED: the setup routes
|
|
275
|
+
// read the runner's standing failure and keep the app shut, the setup
|
|
276
|
+
// screen shows why, saving it retries, and the runner keeps trying on
|
|
277
|
+
// its own. Every other failure still stops the boot, because it means
|
|
278
|
+
// the template or a step would write something wrong.
|
|
279
|
+
if (!(err instanceof KbRemoteUnreachableError)) throw err;
|
|
280
|
+
startupLog.error('booting UNMAINTAINED and gated — the knowledge-base remote could not be reached:', {
|
|
281
|
+
detail: err.message,
|
|
282
|
+
});
|
|
283
|
+
// Kept on the graph so that stopping the graph stops the asking: a
|
|
284
|
+
// retry that outlived its graph would clone into a workspaces folder
|
|
285
|
+
// nobody serves any more.
|
|
286
|
+
core.startupRetry = core.kbStartupRunner.retryUntilMaintained();
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
// Close change requests whose source branch has been deleted. SEQUENCED
|
|
290
|
+
// AFTER the startup phase above, for two reasons: the sweep's fresh fetch
|
|
291
|
+
// lazily bootstraps and fetches the same default-branch clone the runner
|
|
292
|
+
// maintains (kicking it off earlier races the runner's clone/fetch of that
|
|
293
|
+
// very directory), and on a brand-new deployment it would run before the
|
|
294
|
+
// empty remote is seeded, fail its clone, swallow the error, and leave
|
|
295
|
+
// deleted-branch CRs open for the whole process. Still not awaited from
|
|
296
|
+
// here on: a slow or unreachable remote must not hold up the server —
|
|
297
|
+
// nothing downstream depends on the result, and the requests it closes
|
|
298
|
+
// have been unusable since the branch went away, so landing a few seconds
|
|
299
|
+
// into uptime is soon enough. Errors are swallowed inside the sweep, which
|
|
300
|
+
// fails safe by closing nothing.
|
|
301
|
+
void core.workflowService
|
|
302
|
+
.closeChangeRequestsWithDeletedBranches()
|
|
303
|
+
.then((n) => {
|
|
304
|
+
if (n > 0) {
|
|
305
|
+
crLog.info(`closed ${n} change request${n === 1 ? '' : 's'} with a deleted branch`);
|
|
306
|
+
}
|
|
307
|
+
})
|
|
308
|
+
.catch((err) => crLog.warn('deleted-branch sweep failed:', { err }));
|
|
309
|
+
|
|
310
|
+
// Recorded join requests that are still owed, resumed — now, and then on a
|
|
311
|
+
// timer. SEQUENCED AFTER the startup phase for the same reason as the sweep
|
|
312
|
+
// above: the work needs the default-branch clone the runner maintains and
|
|
313
|
+
// the plugin catalog read from it, and a sweep that ran first would refuse
|
|
314
|
+
// every row for a knowledge base that simply was not ready — telling people
|
|
315
|
+
// their request could not be sent when nothing had gone wrong with it.
|
|
316
|
+
//
|
|
317
|
+
// ON A TIMER rather than at boot alone, because boot cannot cover the
|
|
318
|
+
// redeploy: this process sweeps while the outgoing one still holds a
|
|
319
|
+
// record, skips it (correctly — two servers must not do git on one branch),
|
|
320
|
+
// and the outgoing process then exits mid-work. Nothing else would look at
|
|
321
|
+
// that row again. The requester cannot prompt it either: a pending record
|
|
322
|
+
// shows them the "Requested" card, not a button.
|
|
323
|
+
//
|
|
324
|
+
// Not awaited, and nothing to report here but the failure to read the table
|
|
325
|
+
// at all: a first request from a person is a full clone, nothing else at
|
|
326
|
+
// boot depends on it, and each row records its own outcome.
|
|
327
|
+
core.pluginJoinRequestJobs.startSweeping();
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
/**
|
|
331
|
+
* What one knowledge base's graph holds that must be let go of when it
|
|
332
|
+
* stops: the pieces {@link stopCore} winds down, in the order it winds
|
|
333
|
+
* them down. `createShutdown` takes the same, plus the listening server.
|
|
334
|
+
*/
|
|
335
|
+
export interface CoreStopDeps {
|
|
199
336
|
/** The lease loop from {@link holdCommitWorkerLease}: its stop finishes the in-flight commit and releases the lease. */
|
|
200
337
|
commitWorker: Pick<LeaseLoopHandle, 'stop'>;
|
|
201
338
|
/**
|
|
202
339
|
* Background work to wind down before the pool goes — the join-request
|
|
203
|
-
* sweep and its jobs, today. The timer is stopped
|
|
204
|
-
*
|
|
205
|
-
*
|
|
206
|
-
*
|
|
207
|
-
* yet passes nothing.
|
|
340
|
+
* sweep and its jobs, today. The timer is stopped first so nothing new is
|
|
341
|
+
* scheduled, then the jobs already running are awaited (within the budget)
|
|
342
|
+
* so the pool is not ended under a clone or a push that is still writing
|
|
343
|
+
* to it. Optional: a caller that has not built them yet passes nothing.
|
|
208
344
|
*/
|
|
209
345
|
backgroundJobs?: { stopSweeping(): void; drain(): Promise<void> };
|
|
346
|
+
/** The startup phase's retry, if the boot left one asking — see {@link BootableCore.startupRetry}. */
|
|
347
|
+
startupRetry?: { stop(): void } | null;
|
|
210
348
|
/** The database — its pool is ended last, once nothing above can still need it. */
|
|
211
349
|
db: Pick<Database, '$client'>;
|
|
350
|
+
/**
|
|
351
|
+
* The scope this graph's secrets vault was registered under with the UTCP
|
|
352
|
+
* variable loader (see `secrets-variable-loader.ts`); forgotten on stop so
|
|
353
|
+
* a descriptor that outlives the graph resolves nothing. Optional: a
|
|
354
|
+
* single-tenant process exits right after, and has nothing to forget.
|
|
355
|
+
*/
|
|
356
|
+
secretsScope?: string;
|
|
212
357
|
log?: (message: string) => void;
|
|
213
358
|
}
|
|
214
359
|
|
|
360
|
+
export interface ShutdownDeps extends CoreStopDeps {
|
|
361
|
+
/** The listening server — stops accepting, then drops what is connected. */
|
|
362
|
+
server: Pick<Server, 'close' | 'closeAllConnections'>;
|
|
363
|
+
}
|
|
364
|
+
|
|
215
365
|
export interface ShutdownOptions {
|
|
216
366
|
/**
|
|
217
367
|
* Total time the sequence may take. Default 8s: Docker's `stop_grace_period`
|
|
@@ -261,6 +411,60 @@ async function bounded(promise: Promise<unknown>, ms: number, label: string, log
|
|
|
261
411
|
* died mid-commit, now the exception rather than the rule.
|
|
262
412
|
* 3. End the pool.
|
|
263
413
|
*/
|
|
414
|
+
/**
|
|
415
|
+
* Let go of everything a graph holds, in order, within `remaining()`.
|
|
416
|
+
* The order is the point — see {@link createShutdown} for why each step
|
|
417
|
+
* sits where it does.
|
|
418
|
+
*/
|
|
419
|
+
async function releaseCore(deps: CoreStopDeps, remaining: () => number, log: (m: string) => void): Promise<void> {
|
|
420
|
+
// First, and BEFORE the commit worker is stopped. Stopping that worker
|
|
421
|
+
// awaits an in-flight commit and can spend most of the remaining budget
|
|
422
|
+
// doing it; a sweep tick firing inside that window reads the still-open
|
|
423
|
+
// pool and starts fresh clone/commit/push work that the end of the
|
|
424
|
+
// sequence then kills mid-git. Nothing new can be recorded once the
|
|
425
|
+
// server is closed (or the tenant is no longer routed to), so this is the
|
|
426
|
+
// earliest point the interval is dead weight. Synchronous and unfailing
|
|
427
|
+
// — it just clears an interval — so it needs no budget of its own.
|
|
428
|
+
deps.backgroundJobs?.stopSweeping();
|
|
429
|
+
// A startup phase still asking for an unreachable remote stops asking:
|
|
430
|
+
// synchronous, and nothing after it must be able to clone into a
|
|
431
|
+
// workspaces folder that is about to belong to nobody.
|
|
432
|
+
deps.startupRetry?.stop();
|
|
433
|
+
// Clearing the interval stops future ticks; it does nothing to a job a
|
|
434
|
+
// tick already started, which holds a claim it heartbeats through the
|
|
435
|
+
// pool and is mid-clone or mid-push. Awaited here, in the budget: a job
|
|
436
|
+
// that finishes releases or marks its row; one that cannot in time is
|
|
437
|
+
// killed with the process and its claim goes stale for the next sweep
|
|
438
|
+
// — which is the recovery every crash already gets.
|
|
439
|
+
if (deps.backgroundJobs) {
|
|
440
|
+
await bounded(deps.backgroundJobs.drain(), remaining(), 'finishing the background jobs', log);
|
|
441
|
+
}
|
|
442
|
+
await bounded(deps.commitWorker.stop(), remaining(), 'stopping the commit worker', log);
|
|
443
|
+
if (deps.secretsScope !== undefined) unregisterBevelSecretsVariableLoader(deps.secretsScope);
|
|
444
|
+
await bounded(closeDb(deps.db), remaining(), 'ending the database pool', log);
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
export interface StopCoreOptions {
|
|
448
|
+
/** Total time the stop may take. Default: the shutdown's 8s. */
|
|
449
|
+
deadlineMs?: number;
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
/**
|
|
453
|
+
* Stop one knowledge base's graph without stopping the process: the
|
|
454
|
+
* shutdown sequence minus closing the server. What a host runs when it
|
|
455
|
+
* evicts a tenant, and what {@link createShutdown} runs after the server
|
|
456
|
+
* has closed. Bounded like the shutdown, so a step that hangs cannot hold
|
|
457
|
+
* the host's event loop hostage.
|
|
458
|
+
*/
|
|
459
|
+
export async function stopCore(core: CoreStopDeps, opts: StopCoreOptions = {}): Promise<void> {
|
|
460
|
+
const log = core.log ?? ((message: string) => logger('lifecycle').info(message));
|
|
461
|
+
const deadlineMs = opts.deadlineMs ?? DEFAULT_SHUTDOWN_DEADLINE_MS;
|
|
462
|
+
const startedAt = Date.now();
|
|
463
|
+
const remaining = () => Math.max(0, deadlineMs - (Date.now() - startedAt));
|
|
464
|
+
await releaseCore(core, remaining, log);
|
|
465
|
+
log(`graph stopped in ${Date.now() - startedAt}ms`);
|
|
466
|
+
}
|
|
467
|
+
|
|
264
468
|
export function createShutdown(
|
|
265
469
|
deps: ShutdownDeps,
|
|
266
470
|
opts: ShutdownOptions = {},
|
|
@@ -284,26 +488,7 @@ export function createShutdown(
|
|
|
284
488
|
'closing the server',
|
|
285
489
|
log,
|
|
286
490
|
);
|
|
287
|
-
|
|
288
|
-
// Stopping that worker awaits an in-flight commit and can spend most of
|
|
289
|
-
// the remaining budget doing it; a sweep tick firing inside that window
|
|
290
|
-
// reads the still-open pool and starts fresh clone/commit/push work that
|
|
291
|
-
// the `process.exit()` at the end of the sequence then kills mid-git.
|
|
292
|
-
// Nothing new can be recorded once the server is closed, so this is the
|
|
293
|
-
// earliest point the interval is dead weight. Synchronous and unfailing
|
|
294
|
-
// — it just clears an interval — so it needs no budget of its own.
|
|
295
|
-
deps.backgroundJobs?.stopSweeping();
|
|
296
|
-
// Clearing the interval stops future ticks; it does nothing to a job a
|
|
297
|
-
// tick already started, which holds a claim it heartbeats through the
|
|
298
|
-
// pool and is mid-clone or mid-push. Awaited here, in the budget: a job
|
|
299
|
-
// that finishes releases or marks its row; one that cannot in time is
|
|
300
|
-
// killed with the process and its claim goes stale for the next sweep
|
|
301
|
-
// — which is the recovery every crash already gets.
|
|
302
|
-
if (deps.backgroundJobs) {
|
|
303
|
-
await bounded(deps.backgroundJobs.drain(), remaining(), 'finishing the background jobs', log);
|
|
304
|
-
}
|
|
305
|
-
await bounded(deps.commitWorker.stop(), remaining(), 'stopping the commit worker', log);
|
|
306
|
-
await bounded(deps.db.$client.end(), remaining(), 'ending the database pool', log);
|
|
491
|
+
await releaseCore(deps, remaining, log);
|
|
307
492
|
|
|
308
493
|
log(`shutdown complete in ${Date.now() - startedAt}ms`);
|
|
309
494
|
})();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { KbContext } from '../shared/kb-context.js';
|
|
2
2
|
|
|
3
3
|
/** The two addresses the server derives once and hands to {@link publicConfig}. */
|
|
4
4
|
export interface PublicConfigAddresses {
|
|
@@ -24,19 +24,22 @@ export interface PublicConfigAddresses {
|
|
|
24
24
|
* means a rebuild.
|
|
25
25
|
*
|
|
26
26
|
* A pure function of its inputs, so the payload is testable without a server.
|
|
27
|
+
* `kb` is read at call time, not captured: the branch model arrives from the
|
|
28
|
+
* setup screen on a fresh deployment, and the next `/api/config` after that
|
|
29
|
+
* save has to carry it.
|
|
27
30
|
*/
|
|
28
|
-
export function publicConfig({ marketplaceGitUrl, mcpUrl }: PublicConfigAddresses) {
|
|
31
|
+
export function publicConfig(kb: KbContext, { marketplaceGitUrl, mcpUrl }: PublicConfigAddresses) {
|
|
29
32
|
return {
|
|
30
33
|
branchModel: {
|
|
31
|
-
defaultBranch:
|
|
32
|
-
protectedBranches: [...
|
|
34
|
+
defaultBranch: kb.defaultBranch,
|
|
35
|
+
protectedBranches: [...kb.protectedBranches],
|
|
33
36
|
},
|
|
34
37
|
/**
|
|
35
38
|
* The three renameable KB roots, for the same reason as the branch
|
|
36
39
|
* model: the file tree, the library router and every path rule read
|
|
37
40
|
* them, and they used to be compile-time constants.
|
|
38
41
|
*/
|
|
39
|
-
kbLayout:
|
|
42
|
+
kbLayout: kb.layout,
|
|
40
43
|
/**
|
|
41
44
|
* The per-user marketplace git remote (see modules/marketplace). Same
|
|
42
45
|
* derivation as `mcpUrl`: our address, userinfo stripped; the caller
|
package/src/core-config.ts
CHANGED
|
@@ -4,6 +4,7 @@ import { fileURLToPath } from 'node:url';
|
|
|
4
4
|
import { defaultKbTemplateDir } from './assets.js';
|
|
5
5
|
import { assertKeyDecodesTo32Bytes } from './shared/token-crypto.js';
|
|
6
6
|
import { DEFAULT_GIT_TIMEOUT_MS } from './modules/workflow/git/node-git-runner.js';
|
|
7
|
+
import { DEFAULT_DB_SCHEMA, assertSchemaName } from './modules/database/connection.js';
|
|
7
8
|
import { logger } from './shared/logging.js';
|
|
8
9
|
|
|
9
10
|
const log = logger('config');
|
|
@@ -57,6 +58,88 @@ export function withoutUserinfo(url: string): string {
|
|
|
57
58
|
return url.replace(/^([a-z][a-z0-9+.-]*:\/\/)[^/?#]*@/i, '$1');
|
|
58
59
|
}
|
|
59
60
|
|
|
61
|
+
/**
|
|
62
|
+
* Everything ONE knowledge base's service graph is built from — the values
|
|
63
|
+
* that differ between two knowledge bases a process might host. A
|
|
64
|
+
* single-tenant deployment reads them from the environment ({@link CoreConfig});
|
|
65
|
+
* a host serving several builds one of these per tenant from its registry.
|
|
66
|
+
* `createCoreServices` takes this shape, so the two are the same code path.
|
|
67
|
+
*
|
|
68
|
+
* `port`, `nodeEnv` and `trustProxy` are process facts a graph still needs
|
|
69
|
+
* (the loopback address the MCP proxy dials, cookie flags, the proxy hop
|
|
70
|
+
* count its Express app trusts), so they appear here as well as on
|
|
71
|
+
* {@link ProcessConfig}: a tenant's config carries the values of the process
|
|
72
|
+
* it runs in.
|
|
73
|
+
*/
|
|
74
|
+
export interface TenantConfig {
|
|
75
|
+
readonly port: number;
|
|
76
|
+
readonly databaseUrl: string;
|
|
77
|
+
/** The Postgres schema this knowledge base's tables live in. `public` for a single-tenant deployment. */
|
|
78
|
+
readonly dbSchema: string;
|
|
79
|
+
readonly nodeEnv: string;
|
|
80
|
+
readonly tenantId: string;
|
|
81
|
+
/** The credential prefixes derived from `tenantId` — see the getters on {@link CoreConfig}. */
|
|
82
|
+
readonly externalApiKeyPrefix: string;
|
|
83
|
+
readonly internalTokenPrefix: string;
|
|
84
|
+
readonly uploadTokenPrefix: string;
|
|
85
|
+
readonly mcpOAuthTokenPrefix: string;
|
|
86
|
+
readonly workspacesRoot: string;
|
|
87
|
+
readonly backupsRoot: string;
|
|
88
|
+
readonly spillRoot: string;
|
|
89
|
+
readonly docExtractCacheRoot: string;
|
|
90
|
+
readonly jwtSecret: string;
|
|
91
|
+
readonly adminEmail: string;
|
|
92
|
+
readonly adminPassword: string;
|
|
93
|
+
readonly oidcIssuerUrl: string;
|
|
94
|
+
readonly oidcClientId: string;
|
|
95
|
+
readonly oidcClientSecret: string;
|
|
96
|
+
readonly oidcScopes: string;
|
|
97
|
+
readonly oidcProviderLabel: string;
|
|
98
|
+
readonly kbRepoUrl: string;
|
|
99
|
+
readonly kbDirName: string;
|
|
100
|
+
readonly gitUsername: string;
|
|
101
|
+
readonly gitToken: string;
|
|
102
|
+
readonly kbTemplateDir: string;
|
|
103
|
+
readonly ontologySessionBlock: boolean;
|
|
104
|
+
readonly updateCheckEnabled: boolean;
|
|
105
|
+
readonly loginPasswordEnabled: boolean;
|
|
106
|
+
readonly allowedEmailDomains: string[];
|
|
107
|
+
readonly secretsEncKey: string;
|
|
108
|
+
readonly internalTokenSecret: string;
|
|
109
|
+
readonly trustProxy: string;
|
|
110
|
+
readonly gitTimeoutMs: number;
|
|
111
|
+
readonly publicBackendUrl: string;
|
|
112
|
+
readonly publicFrontendUrl: string;
|
|
113
|
+
readonly configuredPublicFrontendUrl: string | null;
|
|
114
|
+
/**
|
|
115
|
+
* Where this graph's own REST surface is reached from inside the process
|
|
116
|
+
* (the MCP proxy dials it, and seeds it into the UTCP manuals it builds).
|
|
117
|
+
* Unset, `http://127.0.0.1:<port>`; a tenant host names its tenant on the
|
|
118
|
+
* path — see `tenancy/tenant-host.ts`.
|
|
119
|
+
*/
|
|
120
|
+
readonly loopbackBaseUrl?: string;
|
|
121
|
+
/**
|
|
122
|
+
* The environment the deployment settings (repository, git credential,
|
|
123
|
+
* branch model, SSO, sync secret, …) resolve against before the stored
|
|
124
|
+
* layer. Unset, the process's own. A tenant host builds one per tenant
|
|
125
|
+
* from its record, so a variable set on the host process never reaches
|
|
126
|
+
* every tenant and a record's values behave as environment-pinned ones.
|
|
127
|
+
*/
|
|
128
|
+
readonly settingsEnv?: NodeJS.ProcessEnv;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* What the PROCESS is configured with, independent of how many knowledge
|
|
133
|
+
* bases it serves: where it listens, which proxy hops it trusts, and the
|
|
134
|
+
* environment name. A single-tenant deployment's {@link CoreConfig} is both
|
|
135
|
+
* this and its one tenant's {@link TenantConfig}.
|
|
136
|
+
*/
|
|
137
|
+
export interface ProcessConfig {
|
|
138
|
+
readonly port: number;
|
|
139
|
+
readonly nodeEnv: string;
|
|
140
|
+
readonly trustProxy: string;
|
|
141
|
+
}
|
|
142
|
+
|
|
60
143
|
/**
|
|
61
144
|
* Configuration for the CORE platform: the git-backed workspace/workflow,
|
|
62
145
|
* skills, tools, secrets vault, access control, and the MCP surface. Contains
|
|
@@ -64,9 +147,16 @@ export function withoutUserinfo(url: string): string {
|
|
|
64
147
|
* `AppConfig` (config.ts), which extends this class. A core-only deployment
|
|
65
148
|
* boots from exactly these env vars.
|
|
66
149
|
*/
|
|
67
|
-
export class CoreConfig {
|
|
150
|
+
export class CoreConfig implements TenantConfig, ProcessConfig {
|
|
68
151
|
readonly port: number;
|
|
69
152
|
readonly databaseUrl: string;
|
|
153
|
+
/**
|
|
154
|
+
* The Postgres schema this deployment's tables live in (`DB_SCHEMA`,
|
|
155
|
+
* default `public`). Set it to host this knowledge base beside others in
|
|
156
|
+
* one database, each on a schema of its own; see
|
|
157
|
+
* `modules/database/connection.ts` for what that changes.
|
|
158
|
+
*/
|
|
159
|
+
readonly dbSchema: string;
|
|
70
160
|
readonly nodeEnv: string;
|
|
71
161
|
/**
|
|
72
162
|
* Tenant slug injected into every credential prefix so a deploy can brand its
|
|
@@ -155,6 +245,13 @@ export class CoreConfig {
|
|
|
155
245
|
* credential-helper shell snippet.
|
|
156
246
|
*/
|
|
157
247
|
readonly gitUsername: string;
|
|
248
|
+
/**
|
|
249
|
+
* The git token the environment supplied (`GIT_TOKEN`, or the legacy
|
|
250
|
+
* `GITHUB_TOKEN` / `GH_TOKEN`), or `''`. The setup screen's stored token is
|
|
251
|
+
* read through the settings service instead; the composition root folds
|
|
252
|
+
* the two into the runner's credentials, environment first.
|
|
253
|
+
*/
|
|
254
|
+
readonly gitToken: string;
|
|
158
255
|
/**
|
|
159
256
|
* Filesystem path to the KB seed template (the `kb-template/` folder shipped
|
|
160
257
|
* inside this package — see `defaultKbTemplateDir()`). The seeder reads this
|
|
@@ -282,6 +379,7 @@ export class CoreConfig {
|
|
|
282
379
|
constructor() {
|
|
283
380
|
this.port = parseInt(process.env.PORT || '3001', 10);
|
|
284
381
|
this.databaseUrl = resolveDatabaseUrl();
|
|
382
|
+
this.dbSchema = assertSchemaName((process.env.DB_SCHEMA || DEFAULT_DB_SCHEMA).trim());
|
|
285
383
|
this.nodeEnv = process.env.NODE_ENV || 'development';
|
|
286
384
|
this.tenantId = (process.env.TENANT_ID || 'bevel').trim().toLowerCase();
|
|
287
385
|
if (!/^[a-z0-9]+$/.test(this.tenantId)) {
|
|
@@ -352,13 +450,14 @@ export class CoreConfig {
|
|
|
352
450
|
this.kbRepoUrl = (process.env.KB_REPO_URL || '').trim();
|
|
353
451
|
this.kbDirName = (process.env.KB_DIR_NAME || '').trim();
|
|
354
452
|
// Provider-neutral git token: operators can set GIT_TOKEN (or the legacy
|
|
355
|
-
// GITHUB_TOKEN / GH_TOKEN).
|
|
356
|
-
//
|
|
357
|
-
//
|
|
358
|
-
//
|
|
359
|
-
//
|
|
360
|
-
|
|
361
|
-
|
|
453
|
+
// GITHUB_TOKEN / GH_TOKEN). Read here, never written back: the git runner
|
|
454
|
+
// hands the token in effect to each child it spawns, so the process
|
|
455
|
+
// environment does not need to carry it, and a server hosting several
|
|
456
|
+
// knowledge bases could not carry all of theirs. GIT_TOKEN takes
|
|
457
|
+
// PRECEDENCE: it's the provider-neutral name, so setting it must override
|
|
458
|
+
// a stale legacy GITHUB_TOKEN (e.g. when switching the KB from GitHub to
|
|
459
|
+
// GitLab), not be shadowed by it.
|
|
460
|
+
this.gitToken = (process.env.GIT_TOKEN || process.env.GITHUB_TOKEN || process.env.GH_TOKEN || '').trim();
|
|
362
461
|
this.gitUsername = (process.env.GIT_USERNAME || 'x-access-token').trim();
|
|
363
462
|
// Interpolated into the credential-helper shell snippet, so reject anything
|
|
364
463
|
// that isn't a plain token — no quotes, spaces, or shell metacharacters.
|
package/src/index.ts
CHANGED
|
@@ -17,7 +17,9 @@
|
|
|
17
17
|
* Finer-grained internals are available via the `./modules/*` subpath exports.
|
|
18
18
|
*/
|
|
19
19
|
|
|
20
|
-
export { CoreConfig } from './core-config.js';
|
|
20
|
+
export { CoreConfig, resolveDatabaseUrl, type TenantConfig, type ProcessConfig } from './core-config.js';
|
|
21
|
+
// Serving several knowledge bases from one process — see docs/multi-tenant.md.
|
|
22
|
+
export * from './tenancy/index.js';
|
|
21
23
|
export { createCoreServices, type CoreServices } from './core/create-core-services.js';
|
|
22
24
|
export {
|
|
23
25
|
createCoreServer,
|
|
@@ -33,9 +35,14 @@ export type { ILogger, LogFields } from './shared/logger.contract.js';
|
|
|
33
35
|
// handle type `CoreServices.commitWorker` carries.
|
|
34
36
|
export {
|
|
35
37
|
createShutdown,
|
|
38
|
+
startCore,
|
|
39
|
+
stopCore,
|
|
36
40
|
withStartupTask,
|
|
41
|
+
type BootableCore,
|
|
42
|
+
type CoreStopDeps,
|
|
37
43
|
type ShutdownDeps,
|
|
38
44
|
type ShutdownOptions,
|
|
45
|
+
type StopCoreOptions,
|
|
39
46
|
type LeaseLoopHandle,
|
|
40
47
|
type LeasedWorker,
|
|
41
48
|
} from './core/lifecycle.js';
|
|
@@ -46,7 +53,16 @@ export {
|
|
|
46
53
|
runCoreMigrations,
|
|
47
54
|
runEnterpriseMigrations,
|
|
48
55
|
} from './modules/database/migrate.js';
|
|
49
|
-
export {
|
|
56
|
+
export {
|
|
57
|
+
getDb,
|
|
58
|
+
createDb,
|
|
59
|
+
closeDb,
|
|
60
|
+
dbSchemaOf,
|
|
61
|
+
assertSchemaName,
|
|
62
|
+
DEFAULT_DB_SCHEMA,
|
|
63
|
+
type Database,
|
|
64
|
+
type DbOptions,
|
|
65
|
+
} from './modules/database/connection.js';
|
|
50
66
|
|
|
51
67
|
// Build identity surfaced by GET /api/health.
|
|
52
68
|
export { GIT_SHA, resolveGitSha } from './version.js';
|
|
@@ -85,6 +101,13 @@ export type {
|
|
|
85
101
|
export type { ILlmUsageMeter } from './modules/tool-auth/llm-usage-meter.js';
|
|
86
102
|
export type { AuthProviderPlugin } from './modules/auth/auth.routes.js';
|
|
87
103
|
export type { IErasureParticipant } from './modules/auth/account-erasure.service.js';
|
|
104
|
+
export {
|
|
105
|
+
AccountAdmissionRefusedError,
|
|
106
|
+
admitEveryone,
|
|
107
|
+
type AccountAdmissionVerdict,
|
|
108
|
+
type AccountProvisionReason,
|
|
109
|
+
type IAccountAdmission,
|
|
110
|
+
} from './modules/auth/account-admission.js';
|
|
88
111
|
export {
|
|
89
112
|
WorkflowHooks,
|
|
90
113
|
type CommitValidationHook,
|
|
@@ -21,6 +21,7 @@ import {
|
|
|
21
21
|
import { createAccessRoutes } from '../access.routes.js';
|
|
22
22
|
import { AccessDeniedError } from '../../access-model/access-errors.js';
|
|
23
23
|
import { workspaceIdForBranch } from '../../../shared/workspace-id.js';
|
|
24
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
24
25
|
|
|
25
26
|
/**
|
|
26
27
|
* The Admin write floor at the repository root, and the eligible lists that
|
|
@@ -287,7 +288,7 @@ describe('Admin write floor at the repository root', () => {
|
|
|
287
288
|
} as unknown as WorkflowService,
|
|
288
289
|
{ emit: () => {} } as unknown as WorkflowEventBus,
|
|
289
290
|
usersDbDouble(),
|
|
290
|
-
KB,
|
|
291
|
+
testKbContext({ kbDirName: KB }),
|
|
291
292
|
),
|
|
292
293
|
);
|
|
293
294
|
server = await new Promise<Server>((resolve) => {
|
|
@@ -10,6 +10,7 @@ import type { WorkflowService } from '../../workflow/workflow.service.js';
|
|
|
10
10
|
import type { WorkflowEventBus } from '../../workflow/event-bus.js';
|
|
11
11
|
import { createAccessRoutes } from '../access.routes.js';
|
|
12
12
|
import { usersDbDouble } from './users-db-double.js';
|
|
13
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
13
14
|
|
|
14
15
|
/**
|
|
15
16
|
* HTTP contract for `POST /access/batch` — the verb dispatch. Existing callers
|
|
@@ -59,7 +60,7 @@ async function makeHarness(): Promise<Harness> {
|
|
|
59
60
|
{} as unknown as WorkflowService,
|
|
60
61
|
{ emit: vi.fn() } as unknown as WorkflowEventBus,
|
|
61
62
|
usersDbDouble(),
|
|
62
|
-
KB,
|
|
63
|
+
testKbContext({ kbDirName: KB }),
|
|
63
64
|
),
|
|
64
65
|
);
|
|
65
66
|
|
|
@@ -15,6 +15,7 @@ import type { WorkflowEventBus } from '../../workflow/event-bus.js';
|
|
|
15
15
|
import { createAccessRoutes } from '../access.routes.js';
|
|
16
16
|
import { usersDbDouble } from './users-db-double.js';
|
|
17
17
|
import { AccessMutationError, AccessMutationService } from '../access-mutation.service.js';
|
|
18
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
18
19
|
|
|
19
20
|
/**
|
|
20
21
|
* A file that cannot carry frontmatter is never written by an access mutation.
|
|
@@ -158,7 +159,7 @@ describe('access mutations on a file that cannot carry frontmatter', () => {
|
|
|
158
159
|
workflowService,
|
|
159
160
|
{ emit: vi.fn() } as unknown as WorkflowEventBus,
|
|
160
161
|
usersDbDouble(),
|
|
161
|
-
KB,
|
|
162
|
+
testKbContext({ kbDirName: KB }),
|
|
162
163
|
),
|
|
163
164
|
);
|
|
164
165
|
server = await new Promise<Server>((resolve) => {
|
|
@@ -10,6 +10,7 @@ import type { WorkflowService } from '../../workflow/workflow.service.js';
|
|
|
10
10
|
import type { WorkflowEventBus } from '../../workflow/event-bus.js';
|
|
11
11
|
import { createAccessRoutes } from '../access.routes.js';
|
|
12
12
|
import { usersDbDouble } from './users-db-double.js';
|
|
13
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
13
14
|
|
|
14
15
|
/**
|
|
15
16
|
* HTTP-level contract tests for GROUP and ROLE principals on the share
|
|
@@ -87,7 +88,7 @@ async function makeHarness(opts: {
|
|
|
87
88
|
(req as unknown as { userId: string }).userId = USER.id;
|
|
88
89
|
next();
|
|
89
90
|
});
|
|
90
|
-
app.use('/api', createAccessRoutes(accessControl, workspaceService, authService, workflowService, eventBus, db, KB));
|
|
91
|
+
app.use('/api', createAccessRoutes(accessControl, workspaceService, authService, workflowService, eventBus, db, testKbContext({ kbDirName: KB })));
|
|
91
92
|
|
|
92
93
|
const server = await new Promise<Server>((resolve) => {
|
|
93
94
|
const s = app.listen(0, () => resolve(s));
|
|
@@ -11,6 +11,7 @@ import type { WorkflowService } from '../../workflow/workflow.service.js';
|
|
|
11
11
|
import type { WorkflowEventBus } from '../../workflow/event-bus.js';
|
|
12
12
|
import { createAccessRoutes } from '../access.routes.js';
|
|
13
13
|
import { usersDbDouble } from './users-db-double.js';
|
|
14
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
14
15
|
|
|
15
16
|
/**
|
|
16
17
|
* HTTP contract for `GET /access/overrides`. The scan itself is covered in
|
|
@@ -97,7 +98,7 @@ async function makeHarness(opts: {
|
|
|
97
98
|
});
|
|
98
99
|
app.use(
|
|
99
100
|
'/api',
|
|
100
|
-
createAccessRoutes(accessControl, workspaceService, authService, workflowService, eventBus, db, KB),
|
|
101
|
+
createAccessRoutes(accessControl, workspaceService, authService, workflowService, eventBus, db, testKbContext({ kbDirName: KB })),
|
|
101
102
|
);
|
|
102
103
|
|
|
103
104
|
const server = await new Promise<Server>((resolve) => {
|
|
@@ -16,6 +16,7 @@ import { usersDbDouble } from './users-db-double.js';
|
|
|
16
16
|
import { AccessControlService } from '../access-control.service.js';
|
|
17
17
|
import { createAccessRoutes } from '../access.routes.js';
|
|
18
18
|
import { branchForWorkspaceId, workspaceIdForBranch } from '../../../shared/workspace-id.js';
|
|
19
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
19
20
|
|
|
20
21
|
/**
|
|
21
22
|
* Manage access on a file that exists ONLY on a change request's branch.
|
|
@@ -136,7 +137,7 @@ describe('access routes on a proposal branch (real git)', () => {
|
|
|
136
137
|
workflowService,
|
|
137
138
|
{ emit: () => {} } as unknown as WorkflowEventBus,
|
|
138
139
|
usersDbDouble(),
|
|
139
|
-
KB,
|
|
140
|
+
testKbContext({ kbDirName: KB }),
|
|
140
141
|
),
|
|
141
142
|
);
|
|
142
143
|
server = await new Promise<Server>((resolve) => {
|
|
@@ -11,6 +11,7 @@ import type { WorkflowEventBus } from '../../workflow/event-bus.js';
|
|
|
11
11
|
import type { Database } from '../../database/connection.js';
|
|
12
12
|
import { createAccessRoutes } from '../access.routes.js';
|
|
13
13
|
import { WorkflowDomainError } from '../../../shared/domain-errors.js';
|
|
14
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
14
15
|
|
|
15
16
|
/**
|
|
16
17
|
* HTTP contract for `GET /access/prospective` — what the move confirmation
|
|
@@ -67,7 +68,7 @@ async function makeHarness(opts: { canRead?: boolean } = {}): Promise<Harness> {
|
|
|
67
68
|
{} as unknown as WorkflowService,
|
|
68
69
|
{ emit: vi.fn() } as unknown as WorkflowEventBus,
|
|
69
70
|
{} as unknown as Database,
|
|
70
|
-
KB,
|
|
71
|
+
testKbContext({ kbDirName: KB }),
|
|
71
72
|
),
|
|
72
73
|
);
|
|
73
74
|
|