@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
|
@@ -20,6 +20,7 @@ import {
|
|
|
20
20
|
validateKbLayout,
|
|
21
21
|
validateKbRootName,
|
|
22
22
|
normalizeSkillRoot,
|
|
23
|
+
type KbLayout,
|
|
23
24
|
} from '@bevel-software/platform-shared';
|
|
24
25
|
|
|
25
26
|
/**
|
|
@@ -29,6 +30,10 @@ import {
|
|
|
29
30
|
*/
|
|
30
31
|
afterEach(() => configureKbLayout({ ...DEFAULT_KB_LAYOUT }));
|
|
31
32
|
|
|
33
|
+
/** The helpers under the browser's configured layout — the shape these cases were written against. */
|
|
34
|
+
const validateGuideName = (name: string, roots: KbLayout = DEFAULT_KB_LAYOUT) => validateAgentsFileName(name, roots);
|
|
35
|
+
const platformFile = (path: string) => isPlatformFile(path, currentKbLayout());
|
|
36
|
+
|
|
32
37
|
describe('KB layout — validation', () => {
|
|
33
38
|
test('accepts the defaults and any three distinct plain folder names', () => {
|
|
34
39
|
expect(validateKbLayout({ ...DEFAULT_KB_LAYOUT })).toBeNull();
|
|
@@ -100,12 +105,12 @@ describe('KB layout — configuration', () => {
|
|
|
100
105
|
|
|
101
106
|
test('the derived sets follow the configured names rather than snapshotting the defaults', () => {
|
|
102
107
|
configureKbLayout({ knowledgeBaseDir: 'docs', skillsDir: 'skills', pluginsDir: 'plugins' });
|
|
103
|
-
expect(ontologyRoots()).toEqual(['docs', 'Data']);
|
|
104
|
-
expect(reservedRootDirNames().has('plugins')).toBe(true);
|
|
105
|
-
expect(reservedRootDirNames().has('Plugins')).toBe(false);
|
|
106
|
-
// Path rules read the
|
|
107
|
-
expect(pluginOfPath('plugins/GTM/skills/x/SKILL.md')).toBe('GTM');
|
|
108
|
-
expect(pluginOfPath('Plugins/GTM/skills/x/SKILL.md')).toBeNull();
|
|
108
|
+
expect(ontologyRoots(currentKbLayout())).toEqual(['docs', 'Data']);
|
|
109
|
+
expect(reservedRootDirNames(currentKbLayout()).has('plugins')).toBe(true);
|
|
110
|
+
expect(reservedRootDirNames(currentKbLayout()).has('Plugins')).toBe(false);
|
|
111
|
+
// Path rules read the configured name too.
|
|
112
|
+
expect(pluginOfPath('plugins/GTM/skills/x/SKILL.md', currentKbLayout())).toBe('GTM');
|
|
113
|
+
expect(pluginOfPath('Plugins/GTM/skills/x/SKILL.md', currentKbLayout())).toBeNull();
|
|
109
114
|
});
|
|
110
115
|
|
|
111
116
|
test('throws on an invalid layout and leaves the current one untouched', () => {
|
|
@@ -137,7 +142,7 @@ describe('KB layout — the agent guide\'s file name', () => {
|
|
|
137
142
|
});
|
|
138
143
|
|
|
139
144
|
test('accepts a plain markdown name and applies it to the live binding', () => {
|
|
140
|
-
expect(
|
|
145
|
+
expect(validateGuideName('HEXIS.md')).toBeNull();
|
|
141
146
|
configureKbLayout({ ...DEFAULT_KB_LAYOUT, agentsFile: 'HEXIS.md' });
|
|
142
147
|
expect(AGENTS_FILE).toBe('HEXIS.md');
|
|
143
148
|
expect(currentKbLayout().agentsFile).toBe('HEXIS.md');
|
|
@@ -145,30 +150,30 @@ describe('KB layout — the agent guide\'s file name', () => {
|
|
|
145
150
|
|
|
146
151
|
test('refuses every shape that is not one markdown file name of its own', () => {
|
|
147
152
|
// A folder path: the guide is read from the repository root and nowhere else.
|
|
148
|
-
expect(
|
|
149
|
-
expect(
|
|
153
|
+
expect(validateGuideName('guides/HEXIS.md')).toMatch(/single file name/);
|
|
154
|
+
expect(validateGuideName('guides\\HEXIS.md')).toMatch(/single file name/);
|
|
150
155
|
// Not markdown: the per-file access rules apply to `.md` alone.
|
|
151
|
-
expect(
|
|
156
|
+
expect(validateGuideName('HEXIS.txt')).toMatch(/end in \.md/);
|
|
152
157
|
// Nothing at all.
|
|
153
|
-
expect(
|
|
154
|
-
expect(
|
|
158
|
+
expect(validateGuideName('')).toMatch(/required/);
|
|
159
|
+
expect(validateGuideName(' ')).toMatch(/required/);
|
|
155
160
|
// A dot-file every scanner skips — including the one that draws the tree.
|
|
156
|
-
expect(
|
|
161
|
+
expect(validateGuideName('.hidden.md')).toMatch(/start with a dot/);
|
|
157
162
|
// The guide's own pre-rename name stays legacy content.
|
|
158
|
-
expect(
|
|
159
|
-
expect(
|
|
163
|
+
expect(validateGuideName('CLAUDE.md')).toMatch(/pre-rename name/);
|
|
164
|
+
expect(validateGuideName('claude.md')).toMatch(/pre-rename name/);
|
|
160
165
|
// The other platform files: two platform roles on one path.
|
|
161
|
-
expect(
|
|
162
|
-
expect(
|
|
163
|
-
expect(
|
|
164
|
-
expect(
|
|
166
|
+
expect(validateGuideName('access.md')).toMatch(/platform file name/);
|
|
167
|
+
expect(validateGuideName('roles.yaml')).toMatch(/platform file name/);
|
|
168
|
+
expect(validateGuideName('.bevelignore')).toMatch(/platform file name/);
|
|
169
|
+
expect(validateGuideName('mcp-description.md')).toMatch(/platform file name/);
|
|
165
170
|
// The rule every path component passes.
|
|
166
|
-
expect(
|
|
167
|
-
expect(
|
|
171
|
+
expect(validateGuideName('CON.md')).not.toBeNull();
|
|
172
|
+
expect(validateGuideName('a:b.md')).not.toBeNull();
|
|
168
173
|
});
|
|
169
174
|
|
|
170
175
|
test('refuses the name of a root folder, whichever of the two the save names', () => {
|
|
171
|
-
expect(
|
|
176
|
+
expect(validateGuideName('Plugins.md', { ...DEFAULT_KB_LAYOUT, pluginsDir: 'Plugins.md' }))
|
|
172
177
|
.toMatch(/already the plugins folder/);
|
|
173
178
|
// Case-insensitively, like the folders are to each other: one entry on a
|
|
174
179
|
// case-insensitive disk.
|
|
@@ -197,16 +202,16 @@ describe('KB layout — the agent guide\'s file name', () => {
|
|
|
197
202
|
'.bevelignore',
|
|
198
203
|
'AGENTS.md',
|
|
199
204
|
]);
|
|
200
|
-
expect(
|
|
205
|
+
expect(platformFile('AGENTS.md')).toBe(true);
|
|
201
206
|
|
|
202
207
|
configureKbLayout({ ...DEFAULT_KB_LAYOUT, agentsFile: 'HEXIS.md' });
|
|
203
|
-
expect(platformFileNames()).toEqual(['access.md', 'roles.yaml', '.bevelignore', 'HEXIS.md']);
|
|
208
|
+
expect(platformFileNames(currentKbLayout())).toEqual(['access.md', 'roles.yaml', '.bevelignore', 'HEXIS.md']);
|
|
204
209
|
// The guide the platform writes is immovable and undeletable…
|
|
205
|
-
expect(
|
|
210
|
+
expect(platformFile('HEXIS.md')).toBe(true);
|
|
206
211
|
// …and the customer's own AGENTS.md is a page like any other.
|
|
207
|
-
expect(
|
|
212
|
+
expect(platformFile('AGENTS.md')).toBe(false);
|
|
208
213
|
// Still root-only, as `roles.yaml` is: a nested copy is content.
|
|
209
|
-
expect(
|
|
214
|
+
expect(platformFile('KnowledgeBase/HEXIS.md')).toBe(false);
|
|
210
215
|
});
|
|
211
216
|
|
|
212
217
|
test('the pointer sentence is one sentence, naming the guide twice, from one place', () => {
|
|
@@ -215,7 +220,7 @@ describe('KB layout — the agent guide\'s file name', () => {
|
|
|
215
220
|
"it is the platform's guide to its layout, files and rules.",
|
|
216
221
|
);
|
|
217
222
|
configureKbLayout({ ...DEFAULT_KB_LAYOUT, agentsFile: 'HEXIS.md' });
|
|
218
|
-
expect(agentsFilePointerSentence()).toContain('HEXIS.md');
|
|
223
|
+
expect(agentsFilePointerSentence(currentKbLayout().agentsFile)).toContain('HEXIS.md');
|
|
219
224
|
});
|
|
220
225
|
|
|
221
226
|
/**
|
|
@@ -226,7 +231,7 @@ describe('KB layout — the agent guide\'s file name', () => {
|
|
|
226
231
|
*/
|
|
227
232
|
test('the pointer sentence links correctly for a name full of markdown punctuation', () => {
|
|
228
233
|
const name = 'Our [Agent] Guide (v2).md';
|
|
229
|
-
expect(
|
|
234
|
+
expect(validateGuideName(name)).toBeNull();
|
|
230
235
|
const sentence = agentsFilePointerSentence(name);
|
|
231
236
|
// The label cannot end early: the brackets in it are escaped…
|
|
232
237
|
expect(sentence).toContain('[Our \\[Agent\\] Guide (v2).md]');
|
|
@@ -240,7 +245,7 @@ describe('KB layout — the agent guide\'s file name', () => {
|
|
|
240
245
|
test('the pointer sentence encodes a name that would otherwise open a URL fragment', () => {
|
|
241
246
|
// `#` is legal in a filename and opens a fragment in a URL: `./#2 Guide.md`
|
|
242
247
|
// links to the customer's OWN file with a fragment, not to the guide.
|
|
243
|
-
expect(
|
|
248
|
+
expect(validateGuideName('#2 Guide.md')).toBeNull();
|
|
244
249
|
expect(agentsFilePointerSentence('#2 Guide.md')).toContain('(./%232%20Guide.md)');
|
|
245
250
|
// `%` is legal too, and an unencoded one is a malformed escape.
|
|
246
251
|
expect(agentsFilePointerSentence('100%.md')).toContain('(./100%25.md)');
|
|
@@ -4,6 +4,7 @@ import { FileChangeNotifier } from '../../modules/kb-fs/file-change-notifier.js'
|
|
|
4
4
|
import { WorkflowEventBus } from '../../modules/workflow/event-bus.js';
|
|
5
5
|
import { registerCatalogCacheInvalidation } from '../catalog-cache-invalidation.js';
|
|
6
6
|
import { workspaceIdForBranch } from '../../shared/workspace-id.js';
|
|
7
|
+
import { testKbContext } from '../../__tests__/kb-context.js';
|
|
7
8
|
|
|
8
9
|
const KB_DIR = 'knowledge-base';
|
|
9
10
|
|
|
@@ -25,7 +26,7 @@ function setup() {
|
|
|
25
26
|
const off = registerCatalogCacheInvalidation({
|
|
26
27
|
eventBus,
|
|
27
28
|
fileChangeNotifier,
|
|
28
|
-
kbDirName: KB_DIR,
|
|
29
|
+
kb: testKbContext({ kbDirName: KB_DIR }),
|
|
29
30
|
catalogs,
|
|
30
31
|
accessControl,
|
|
31
32
|
});
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { createShutdown, holdCommitWorkerLease, withStartupTask, type LeasedWorker } from '../lifecycle.js';
|
|
2
|
+
import { createShutdown, holdCommitWorkerLease, stopCore, withStartupTask, type LeasedWorker } from '../lifecycle.js';
|
|
3
|
+
import { BevelSecretsVariableLoader, registerBevelSecretsVariableLoader } from '../../modules/secrets-vault/secrets-variable-loader.js';
|
|
3
4
|
import type { AdvisoryLease } from '../../modules/database/advisory-lock.js';
|
|
4
5
|
|
|
5
6
|
/** A lease the suite scripts: what each `tryAcquire` answers, and a way to lose it. */
|
|
@@ -367,3 +368,79 @@ describe('createShutdown', () => {
|
|
|
367
368
|
expect(d.order.filter((step) => step === 'db.end')).toHaveLength(1);
|
|
368
369
|
});
|
|
369
370
|
});
|
|
371
|
+
|
|
372
|
+
describe('stopCore', () => {
|
|
373
|
+
function graph() {
|
|
374
|
+
const order: string[] = [];
|
|
375
|
+
return {
|
|
376
|
+
order,
|
|
377
|
+
core: {
|
|
378
|
+
commitWorker: {
|
|
379
|
+
async stop() {
|
|
380
|
+
order.push('commitWorker.stop');
|
|
381
|
+
},
|
|
382
|
+
},
|
|
383
|
+
backgroundJobs: {
|
|
384
|
+
stopSweeping() {
|
|
385
|
+
order.push('backgroundJobs.stopSweeping');
|
|
386
|
+
},
|
|
387
|
+
async drain() {
|
|
388
|
+
order.push('backgroundJobs.drain');
|
|
389
|
+
},
|
|
390
|
+
},
|
|
391
|
+
startupRetry: {
|
|
392
|
+
stop() {
|
|
393
|
+
order.push('startupRetry.stop');
|
|
394
|
+
},
|
|
395
|
+
},
|
|
396
|
+
db: {
|
|
397
|
+
$client: {
|
|
398
|
+
async end() {
|
|
399
|
+
order.push('db.end');
|
|
400
|
+
},
|
|
401
|
+
},
|
|
402
|
+
},
|
|
403
|
+
secretsScope: 'acme/t_acme',
|
|
404
|
+
log: () => undefined,
|
|
405
|
+
},
|
|
406
|
+
};
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
it('stops a graph without a server: sweeps and the retry first, the worker, then the pool', async () => {
|
|
410
|
+
const g = graph();
|
|
411
|
+
await stopCore(g.core as never);
|
|
412
|
+
expect(g.order).toEqual([
|
|
413
|
+
'backgroundJobs.stopSweeping',
|
|
414
|
+
'startupRetry.stop',
|
|
415
|
+
'backgroundJobs.drain',
|
|
416
|
+
'commitWorker.stop',
|
|
417
|
+
'db.end',
|
|
418
|
+
]);
|
|
419
|
+
});
|
|
420
|
+
|
|
421
|
+
it('forgets the graph\'s secrets scope, so a descriptor that outlives it resolves nothing', async () => {
|
|
422
|
+
const g = graph();
|
|
423
|
+
registerBevelSecretsVariableLoader(
|
|
424
|
+
{ resolve: async () => 'sk-live' } as never,
|
|
425
|
+
g.core.secretsScope,
|
|
426
|
+
);
|
|
427
|
+
const loader = new BevelSecretsVariableLoader('user-1', g.core.secretsScope);
|
|
428
|
+
expect(await loader.get('weather_KEY')).toBe('sk-live');
|
|
429
|
+
await stopCore(g.core as never);
|
|
430
|
+
expect(await loader.get('weather_KEY')).toBeNull();
|
|
431
|
+
});
|
|
432
|
+
|
|
433
|
+
it('stops a graph that never left a retry asking and never registered a scope', async () => {
|
|
434
|
+
const g = graph();
|
|
435
|
+
const core = { ...g.core, startupRetry: null, secretsScope: undefined };
|
|
436
|
+
await stopCore(core as never);
|
|
437
|
+
expect(g.order).toEqual(['backgroundJobs.stopSweeping', 'backgroundJobs.drain', 'commitWorker.stop', 'db.end']);
|
|
438
|
+
});
|
|
439
|
+
|
|
440
|
+
it('does not wait past the budget for a worker that never stops, and still ends the pool', async () => {
|
|
441
|
+
const g = graph();
|
|
442
|
+
const core = { ...g.core, commitWorker: { stop: () => new Promise<void>(() => undefined) } };
|
|
443
|
+
await stopCore(core as never, { deadlineMs: 50 });
|
|
444
|
+
expect(g.order).toEqual(['backgroundJobs.stopSweeping', 'startupRetry.stop', 'backgroundJobs.drain', 'db.end']);
|
|
445
|
+
});
|
|
446
|
+
});
|
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import { describe, expect, it } from 'vitest';
|
|
2
2
|
import { DEFAULT_BRANCH } from '@bevel-software/platform-shared';
|
|
3
3
|
import { publicConfig } from '../public-config.js';
|
|
4
|
+
import { testKbContext } from '../../__tests__/kb-context.js';
|
|
4
5
|
|
|
5
6
|
describe('GET /api/config payload', () => {
|
|
6
|
-
const body = publicConfig(
|
|
7
|
+
const body = publicConfig(testKbContext(), {
|
|
8
|
+
marketplaceGitUrl: 'https://kb.acme.com/git/marketplace.git',
|
|
9
|
+
mcpUrl: 'https://kb.acme.com/api/mcp',
|
|
10
|
+
});
|
|
7
11
|
|
|
8
12
|
it('advertises the agent-instructions capability, which the local bridge keys on', () => {
|
|
9
13
|
expect(body.agentInstructions).toBe(true);
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { DEFAULT_BRANCH, PLUGINS_DIR, SKILLS_DIR } from '@bevel-software/platform-shared';
|
|
2
1
|
import type { FileChangeNotifier } from '../modules/kb-fs/file-change-notifier.js';
|
|
3
2
|
import type { WorkflowEventBus } from '../modules/workflow/event-bus.js';
|
|
4
|
-
import {
|
|
3
|
+
import type { KbContext } from '../shared/kb-context.js';
|
|
5
4
|
|
|
6
5
|
/**
|
|
7
6
|
* A catalog that scans the DEFAULT branch's working tree and caches the result
|
|
@@ -26,8 +25,12 @@ export interface InvalidatableCatalog {
|
|
|
26
25
|
export function registerCatalogCacheInvalidation(deps: {
|
|
27
26
|
eventBus: WorkflowEventBus;
|
|
28
27
|
fileChangeNotifier: FileChangeNotifier;
|
|
29
|
-
/**
|
|
30
|
-
|
|
28
|
+
/**
|
|
29
|
+
* The KB folder inside the workspace (`paths` are workspace-relative), the
|
|
30
|
+
* released branch, and the roots the catalogs read — read per event, never
|
|
31
|
+
* captured: a deployment may rename the roots from the setup screen.
|
|
32
|
+
*/
|
|
33
|
+
kb: Pick<KbContext, 'kbDirName' | 'defaultBranch' | 'defaultWorkspaceId' | 'layout'>;
|
|
31
34
|
catalogs: InvalidatableCatalog[];
|
|
32
35
|
/**
|
|
33
36
|
* The read gate every one of those catalogs is FILTERED through, dropped on
|
|
@@ -44,13 +47,13 @@ export function registerCatalogCacheInvalidation(deps: {
|
|
|
44
47
|
*/
|
|
45
48
|
accessControl: { invalidate(workspaceId: string): void };
|
|
46
49
|
}): () => void {
|
|
47
|
-
const { eventBus, fileChangeNotifier,
|
|
50
|
+
const { eventBus, fileChangeNotifier, kb, catalogs, accessControl } = deps;
|
|
48
51
|
const invalidateAll = () => {
|
|
49
52
|
for (const c of catalogs) c.invalidate();
|
|
50
53
|
// Scoped to the branch the catalogs read, and no wider: a drop here costs
|
|
51
54
|
// the next reader one model load, so it must not reach workspaces this
|
|
52
55
|
// event says nothing about.
|
|
53
|
-
accessControl.invalidate(
|
|
56
|
+
accessControl.invalidate(kb.defaultWorkspaceId());
|
|
54
57
|
};
|
|
55
58
|
|
|
56
59
|
// Subscriber A — COMMIT-time freshness: a committed change drops the affected
|
|
@@ -61,17 +64,19 @@ export function registerCatalogCacheInvalidation(deps: {
|
|
|
61
64
|
// service it belongs to — the caches are independent, so the split preserves
|
|
62
65
|
// behavior.)
|
|
63
66
|
const offFiles = fileChangeNotifier.onFilesChanged(({ branch, paths }) => {
|
|
64
|
-
if (branch !==
|
|
67
|
+
if (branch !== kb.defaultBranch) return;
|
|
65
68
|
// Skills, tools, the plugin index and the link index all read `Plugins/`
|
|
66
69
|
// or `Skills/`, so one touch check drives every cache. An access grant
|
|
67
70
|
// lands as a default-branch change to `Plugins/<plugin>/access.md` or a
|
|
68
71
|
// skill folder's `access.md`, so this is also what makes a newly-granted
|
|
69
72
|
// plugin or link unlock within one round-trip instead of one TTL. Both
|
|
70
|
-
// names are
|
|
71
|
-
//
|
|
73
|
+
// names are read per event rather than captured: a deployment may rename
|
|
74
|
+
// the roots.
|
|
75
|
+
const { kbDirName, layout } = kb;
|
|
72
76
|
if (
|
|
73
77
|
paths.some(
|
|
74
|
-
(p) =>
|
|
78
|
+
(p) =>
|
|
79
|
+
p.startsWith(`${kbDirName}/${layout.pluginsDir}/`) || p.startsWith(`${kbDirName}/${layout.skillsDir}/`),
|
|
75
80
|
)
|
|
76
81
|
) {
|
|
77
82
|
invalidateAll();
|
|
@@ -100,7 +105,7 @@ export function registerCatalogCacheInvalidation(deps: {
|
|
|
100
105
|
if (event.kind !== 'fs-tree-changed' && event.kind !== 'git-sync-recovered') return;
|
|
101
106
|
// Both events declare `branch`, so no `in` guard: the kind check above has
|
|
102
107
|
// already narrowed the union to the two that carry one.
|
|
103
|
-
if (event.branch !==
|
|
108
|
+
if (event.branch !== kb.defaultBranch) return;
|
|
104
109
|
invalidateAll();
|
|
105
110
|
});
|
|
106
111
|
|
package/src/core/core-ports.ts
CHANGED
|
@@ -6,6 +6,7 @@ import type {
|
|
|
6
6
|
import type { ILlmUsageMeter } from '../modules/tool-auth/llm-usage-meter.js';
|
|
7
7
|
import type { AuthProviderPlugin } from '../modules/auth/auth.routes.js';
|
|
8
8
|
import type { IErasureParticipant } from '../modules/auth/account-erasure.service.js';
|
|
9
|
+
import type { IAccountAdmission } from '../modules/auth/account-admission.js';
|
|
9
10
|
import type { OnServerStart } from '../modules/workspace/startup/on-server-start.js';
|
|
10
11
|
|
|
11
12
|
/**
|
|
@@ -98,6 +99,24 @@ export interface CorePorts {
|
|
|
98
99
|
* contract each step signs up to). Core default: `[]`.
|
|
99
100
|
*/
|
|
100
101
|
kbStartupSteps?: readonly OnServerStart[];
|
|
102
|
+
/**
|
|
103
|
+
* Mirror this composition's branch model and knowledge-base layout onto the
|
|
104
|
+
* shared package's PROCESS-WIDE live bindings (`DEFAULT_BRANCH`,
|
|
105
|
+
* `PLUGINS_DIR`, …), for an overlay that still reads them. Core itself
|
|
106
|
+
* reads only `CoreServices.kb`. Default true, so an overlay behaves as it
|
|
107
|
+
* did; a host that serves several knowledge bases in one process passes
|
|
108
|
+
* false, since there is no single value to put there.
|
|
109
|
+
*/
|
|
110
|
+
mirrorSharedBindings?: boolean;
|
|
111
|
+
/**
|
|
112
|
+
* Whether a NEW account may be provisioned, asked before the row is
|
|
113
|
+
* inserted on every path that creates one (a first SSO sign-in, an admin
|
|
114
|
+
* creating an account, the owner's bootstrap sign-in, an embed identity).
|
|
115
|
+
* Core default: everyone is admitted. A host that sells seats answers
|
|
116
|
+
* from its plan; a refusal carries the port's own words to the person or
|
|
117
|
+
* admin who asked. See `modules/auth/account-admission.ts`.
|
|
118
|
+
*/
|
|
119
|
+
accountAdmission?: IAccountAdmission;
|
|
101
120
|
}
|
|
102
121
|
|
|
103
122
|
/**
|
|
@@ -1,16 +1,11 @@
|
|
|
1
1
|
import express from 'express';
|
|
2
|
-
import { logger } from '../shared/logging.js';
|
|
3
|
-
|
|
4
|
-
const startupLog = logger('kb-startup');
|
|
5
|
-
const crLog = logger('cr');
|
|
6
2
|
import cors from 'cors';
|
|
7
3
|
import path from 'node:path';
|
|
8
4
|
import type { Router, RequestHandler } from 'express';
|
|
9
5
|
import { createAuthRoutes } from '../modules/auth/auth.routes.js';
|
|
10
6
|
import { createWorkspaceRoutes } from '../modules/workspace/workspace.routes.js';
|
|
11
7
|
import { createGitInternalsRouteGuard } from '../modules/workspace/git-internals.middleware.js';
|
|
12
|
-
import {
|
|
13
|
-
import { printable } from '../shared/printable.js';
|
|
8
|
+
import { startCore } from './lifecycle.js';
|
|
14
9
|
import { createDiffRoutes } from '../modules/diff/diff.routes.js';
|
|
15
10
|
import { createWorkflowRoutes } from '../modules/workflow/workflow.routes.js';
|
|
16
11
|
import { createEventsRoutes } from '../modules/workflow/events.routes.js';
|
|
@@ -73,7 +68,6 @@ import type { AuthUser } from '@bevel-software/platform-shared';
|
|
|
73
68
|
import { GIT_SHA } from '../version.js';
|
|
74
69
|
import { publicConfig } from './public-config.js';
|
|
75
70
|
import { createReadiness } from './readiness.js';
|
|
76
|
-
import { KbRemoteUnreachableError } from '../modules/workspace/startup/kb-startup-runner.js';
|
|
77
71
|
import { createAgentInstructionsRoutes } from '../modules/agent-instructions/index.js';
|
|
78
72
|
import type { CoreServices } from './create-core-services.js';
|
|
79
73
|
|
|
@@ -143,7 +137,11 @@ export interface ServerExtensions {
|
|
|
143
137
|
export async function createCoreServer(
|
|
144
138
|
core: CoreServices,
|
|
145
139
|
ext: ServerExtensions = {},
|
|
146
|
-
opts: {
|
|
140
|
+
opts: {
|
|
141
|
+
staticDir?: string;
|
|
142
|
+
/** Run {@link startCore} at the usual point of the mount order. Default true. */
|
|
143
|
+
boot?: boolean;
|
|
144
|
+
} = {},
|
|
147
145
|
): Promise<ExpressApp> {
|
|
148
146
|
const app = express();
|
|
149
147
|
|
|
@@ -277,7 +275,7 @@ export async function createCoreServer(
|
|
|
277
275
|
* on purpose; see `publicConfig` for what it discloses and why.
|
|
278
276
|
*/
|
|
279
277
|
app.get('/api/config', (_req, res) => {
|
|
280
|
-
res.json(publicConfig({ marketplaceGitUrl: marketplaceGitUrl.toString(), mcpUrl: mcpResourceUrl.toString() }));
|
|
278
|
+
res.json(publicConfig(core.kb, { marketplaceGitUrl: marketplaceGitUrl.toString(), mcpUrl: mcpResourceUrl.toString() }));
|
|
281
279
|
});
|
|
282
280
|
|
|
283
281
|
// The per-user marketplace as a git remote. Outside `/api` and ahead of
|
|
@@ -310,93 +308,12 @@ export async function createCoreServer(
|
|
|
310
308
|
}),
|
|
311
309
|
);
|
|
312
310
|
|
|
313
|
-
//
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
//
|
|
317
|
-
//
|
|
318
|
-
|
|
319
|
-
// setup never finished — or whose remote is down — is exactly one whose
|
|
320
|
-
// strays would otherwise go unmentioned. A diagnostic never stops a boot, so
|
|
321
|
-
// an unreadable workspaces root is logged and the boot carries on.
|
|
322
|
-
try {
|
|
323
|
-
await noteBesideCheckout(core.config.workspacesRoot, core.kbDirName);
|
|
324
|
-
} catch (err) {
|
|
325
|
-
// `printable`, because the message quotes a path off the disk (an ENOENT
|
|
326
|
-
// or EACCES names the file it failed on) and a name carrying a control
|
|
327
|
-
// character would forge a second line of the operator's log.
|
|
328
|
-
startupLog.warn('could not look for content beside the checkouts:', {
|
|
329
|
-
detail: printable(err instanceof Error ? err.message : String(err)),
|
|
330
|
-
});
|
|
331
|
-
}
|
|
332
|
-
|
|
333
|
-
// The KB startup phase — AFTER the distribution's onBoot, because a FATAL
|
|
334
|
-
// template finding raised there must stop the boot before anything seeds
|
|
335
|
-
// from that template; the runner then brings every branch up to this build
|
|
336
|
-
// before any route can serve KB content. Throws to stop the boot (the
|
|
337
|
-
// container's restart policy is the retry) — see kb-startup-runner.ts.
|
|
338
|
-
//
|
|
339
|
-
// Runs in the booting process whether or not it holds the commit-worker
|
|
340
|
-
// lease, so on a redeploy it overlaps the outgoing holder's commits for the
|
|
341
|
-
// seconds it takes — the documented window at `holdCommitWorkerLease`.
|
|
342
|
-
try {
|
|
343
|
-
await core.kbStartupRunner.runAll();
|
|
344
|
-
} catch (err) {
|
|
345
|
-
// The one failure a boot survives: the remote cannot be reached. That
|
|
346
|
-
// says nothing about the knowledge base — what we would write is not
|
|
347
|
-
// known to be wrong, we cannot get there — so refusing to boot only took
|
|
348
|
-
// away the login and setup screens an operator needs to fix it (a
|
|
349
|
-
// rotated token, say). The deployment comes up GATED: the setup routes
|
|
350
|
-
// read the runner's standing failure and keep the app shut, the setup
|
|
351
|
-
// screen shows why, saving it retries, and the runner keeps trying on
|
|
352
|
-
// its own. Every other failure still stops the boot, because it means
|
|
353
|
-
// the template or a step would write something wrong.
|
|
354
|
-
if (!(err instanceof KbRemoteUnreachableError)) throw err;
|
|
355
|
-
startupLog.error('booting UNMAINTAINED and gated — the knowledge-base remote could not be reached:', {
|
|
356
|
-
detail: err.message,
|
|
357
|
-
});
|
|
358
|
-
core.kbStartupRunner.retryUntilMaintained();
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
// Close change requests whose source branch has been deleted. SEQUENCED
|
|
362
|
-
// AFTER the startup phase above, for two reasons: the sweep's fresh fetch
|
|
363
|
-
// lazily bootstraps and fetches the same default-branch clone the runner
|
|
364
|
-
// maintains (kicking it off earlier races the runner's clone/fetch of that
|
|
365
|
-
// very directory), and on a brand-new deployment it would run before the
|
|
366
|
-
// empty remote is seeded, fail its clone, swallow the error, and leave
|
|
367
|
-
// deleted-branch CRs open for the whole process. Still not awaited from
|
|
368
|
-
// here on: a slow or unreachable remote must not hold up the server —
|
|
369
|
-
// nothing downstream depends on the result, and the requests it closes
|
|
370
|
-
// have been unusable since the branch went away, so landing a few seconds
|
|
371
|
-
// into uptime is soon enough. Errors are swallowed inside the sweep, which
|
|
372
|
-
// fails safe by closing nothing.
|
|
373
|
-
void core.workflowService
|
|
374
|
-
.closeChangeRequestsWithDeletedBranches()
|
|
375
|
-
.then((n) => {
|
|
376
|
-
if (n > 0) {
|
|
377
|
-
crLog.info(`closed ${n} change request${n === 1 ? '' : 's'} with a deleted branch`);
|
|
378
|
-
}
|
|
379
|
-
})
|
|
380
|
-
.catch((err) => crLog.warn('deleted-branch sweep failed:', { err }));
|
|
381
|
-
|
|
382
|
-
// Recorded join requests that are still owed, resumed — now, and then on a
|
|
383
|
-
// timer. SEQUENCED AFTER the startup phase for the same reason as the sweep
|
|
384
|
-
// above: the work needs the default-branch clone the runner maintains and
|
|
385
|
-
// the plugin catalog read from it, and a sweep that ran first would refuse
|
|
386
|
-
// every row for a knowledge base that simply was not ready — telling people
|
|
387
|
-
// their request could not be sent when nothing had gone wrong with it.
|
|
388
|
-
//
|
|
389
|
-
// ON A TIMER rather than at boot alone, because boot cannot cover the
|
|
390
|
-
// redeploy: this process sweeps while the outgoing one still holds a
|
|
391
|
-
// record, skips it (correctly — two servers must not do git on one branch),
|
|
392
|
-
// and the outgoing process then exits mid-work. Nothing else would look at
|
|
393
|
-
// that row again. The requester cannot prompt it either: a pending record
|
|
394
|
-
// shows them the "Requested" card, not a button.
|
|
395
|
-
//
|
|
396
|
-
// Not awaited, and nothing to report here but the failure to read the table
|
|
397
|
-
// at all: a first request from a person is a full clone, nothing else at
|
|
398
|
-
// boot depends on it, and each row records its own outcome.
|
|
399
|
-
core.pluginJoinRequestJobs.startSweeping();
|
|
311
|
+
// The graph's boot side effects — the distribution's onBoot, the
|
|
312
|
+
// knowledge-base startup phase, the sweeps — live in `startCore` so a host
|
|
313
|
+
// that activates a graph on demand can run and later undo them. Here, at
|
|
314
|
+
// this point in the mount order, for a single-tenant deployment; a caller
|
|
315
|
+
// that has already started the graph (or will) passes `boot: false`.
|
|
316
|
+
if (opts.boot ?? true) await startCore(core, ext);
|
|
400
317
|
|
|
401
318
|
// Auth routes (unprotected — login endpoint must be accessible)
|
|
402
319
|
app.use(
|
|
@@ -468,6 +385,7 @@ export async function createCoreServer(
|
|
|
468
385
|
stateSecret: core.config.jwtSecret,
|
|
469
386
|
publicBackendUrl: core.config.publicBackendUrl,
|
|
470
387
|
publicFrontendUrl: core.config.publicFrontendUrl,
|
|
388
|
+
kb: core.kb,
|
|
471
389
|
};
|
|
472
390
|
app.use('/api', createSecretsVaultPublicRoutes(secretsVaultRoutesDeps));
|
|
473
391
|
|
|
@@ -508,16 +426,16 @@ export async function createCoreServer(
|
|
|
508
426
|
const sessionOntologyGate = {
|
|
509
427
|
service: core.sessionOntologyService,
|
|
510
428
|
enabled: core.config.ontologySessionBlock,
|
|
511
|
-
|
|
429
|
+
kb: core.kb,
|
|
512
430
|
recoveryBotEmail: RECOVERY_BOT_EMAIL,
|
|
513
431
|
hooks: core.workflowService.hooks,
|
|
514
432
|
};
|
|
515
433
|
// A skill's `allowed-tools`, checked against what the caller can see — on
|
|
516
434
|
// every save surface (agent write tools, the app's PUT /file) and on
|
|
517
435
|
// `get_skill`. Warnings only; it never refuses a save.
|
|
518
|
-
const allowedToolsChecker = new AllowedToolsChecker(core.toolRegistry, core.toolManualService, core.
|
|
519
|
-
registerWorkflowTools(core.toolRegistry, toolsRouter, ta, th, core.
|
|
520
|
-
registerWorkspaceTools(core.toolRegistry, toolsRouter, ta, th, core.spillStore, core.docExtractService, core.accessControl, core.
|
|
436
|
+
const allowedToolsChecker = new AllowedToolsChecker(core.toolRegistry, core.toolManualService, core.kb);
|
|
437
|
+
registerWorkflowTools(core.toolRegistry, toolsRouter, ta, th, core.kb);
|
|
438
|
+
registerWorkspaceTools(core.toolRegistry, toolsRouter, ta, th, core.spillStore, core.docExtractService, core.accessControl, core.kb, sessionOntologyGate, core.routineWritePolicy, core.sessionSink, allowedToolsChecker, core.changeGate);
|
|
521
439
|
registerSkillsTools(core.toolRegistry, toolsRouter, ta, th, core.skillService, allowedToolsChecker);
|
|
522
440
|
// Definitions only: the endpoints they describe are the app's own plugin
|
|
523
441
|
// creation routes, mounted below behind the key-or-session gate.
|
|
@@ -527,6 +445,7 @@ export async function createCoreServer(
|
|
|
527
445
|
// The vault satisfies the module's local VariableStatusPort — `list_tool_setup`
|
|
528
446
|
// reports configuration booleans only; secret values never ride through tools.
|
|
529
447
|
variableStatus: core.secretsVaultService,
|
|
448
|
+
kb: core.kb,
|
|
530
449
|
});
|
|
531
450
|
// Overlay tool registrations (defs + module-hosted endpoints).
|
|
532
451
|
ext.tools?.({
|
|
@@ -552,7 +471,7 @@ export async function createCoreServer(
|
|
|
552
471
|
{
|
|
553
472
|
workspaceService: core.workspaceService,
|
|
554
473
|
accessControl: core.accessControl,
|
|
555
|
-
|
|
474
|
+
kb: core.kb,
|
|
556
475
|
disk: core.disk,
|
|
557
476
|
pluginIndex: core.pluginIndexService,
|
|
558
477
|
},
|
|
@@ -631,7 +550,7 @@ export async function createCoreServer(
|
|
|
631
550
|
core.workflowService,
|
|
632
551
|
core.eventBus,
|
|
633
552
|
core.accessControl,
|
|
634
|
-
core.
|
|
553
|
+
core.kb,
|
|
635
554
|
core.creatorAccess,
|
|
636
555
|
core.adminAccess,
|
|
637
556
|
core.disk,
|
|
@@ -669,13 +588,13 @@ export async function createCoreServer(
|
|
|
669
588
|
core.workflowService,
|
|
670
589
|
core.eventBus,
|
|
671
590
|
core.db,
|
|
672
|
-
core.
|
|
591
|
+
core.kb,
|
|
673
592
|
[core.config.adminEmail],
|
|
674
593
|
));
|
|
675
594
|
app.use(
|
|
676
595
|
'/api',
|
|
677
596
|
core.authMiddleware,
|
|
678
|
-
createSkillsRoutes(core.skillService, core.pendingSkillsService, core.pluginLinkIndex, core.accessControl, allowedToolsChecker),
|
|
597
|
+
createSkillsRoutes(core.skillService, core.kb, core.pendingSkillsService, core.pluginLinkIndex, core.accessControl, allowedToolsChecker),
|
|
679
598
|
);
|
|
680
599
|
// Asking for write on a shared skill — the join-request machinery pointed
|
|
681
600
|
// at a skill folder. Same JWT gate, same fail-closed shape.
|
|
@@ -688,7 +607,7 @@ export async function createCoreServer(
|
|
|
688
607
|
workflow: core.workflowService,
|
|
689
608
|
workspaceService: core.workspaceService,
|
|
690
609
|
joinRequests: core.joinRequestsService,
|
|
691
|
-
|
|
610
|
+
kb: core.kb,
|
|
692
611
|
resolveUser: async (req) =>
|
|
693
612
|
req.userId ? ((await core.authService.getUserById(req.userId)) ?? null) : null,
|
|
694
613
|
}),
|
|
@@ -707,6 +626,7 @@ export async function createCoreServer(
|
|
|
707
626
|
core.pluginJoinRequestJobs,
|
|
708
627
|
core.pluginProvisionService,
|
|
709
628
|
async (req) => (req.userId ? ((await core.authService.getUserById(req.userId)) ?? null) : null),
|
|
629
|
+
core.kb,
|
|
710
630
|
core.pluginLinksService,
|
|
711
631
|
core.pluginRenameService,
|
|
712
632
|
));
|
|
@@ -716,7 +636,7 @@ export async function createCoreServer(
|
|
|
716
636
|
app.use(
|
|
717
637
|
'/api',
|
|
718
638
|
core.authMiddleware,
|
|
719
|
-
createTeamsRoutes(core.accessControl, core.pluginIndexService, core.skillService, core.toolManualService),
|
|
639
|
+
createTeamsRoutes(core.accessControl, core.pluginIndexService, core.skillService, core.toolManualService, core.kb),
|
|
720
640
|
);
|
|
721
641
|
// Admin-status resolver (CORE — see the note in admin-access.routes.ts;
|
|
722
642
|
// the full admin router is an enterprise `ext.authed` extension).
|
|
@@ -768,6 +688,7 @@ export async function createCoreServer(
|
|
|
768
688
|
core.settings,
|
|
769
689
|
core.adminAccess,
|
|
770
690
|
core.kbStartupRunner,
|
|
691
|
+
core.kb,
|
|
771
692
|
{
|
|
772
693
|
// Same address family as the MCP endpoint above, userinfo stripped for
|
|
773
694
|
// the same reason: this string is handed to admins to paste elsewhere.
|