@bevel-software/platform-core-backend 0.20.0 → 0.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/catalog-cache-invalidation.d.ts +7 -2
- package/dist/core/catalog-cache-invalidation.d.ts.map +1 -1
- package/dist/core/catalog-cache-invalidation.js +8 -9
- package/dist/core/catalog-cache-invalidation.js.map +1 -1
- package/dist/core/core-ports.d.ts +19 -0
- package/dist/core/core-ports.d.ts.map +1 -1
- package/dist/core/core-ports.js.map +1 -1
- package/dist/core/create-core-server.d.ts +2 -0
- package/dist/core/create-core-server.d.ts.map +1 -1
- package/dist/core/create-core-server.js +55 -107
- package/dist/core/create-core-server.js.map +1 -1
- package/dist/core/create-core-services.d.ts +41 -4
- package/dist/core/create-core-services.d.ts.map +1 -1
- package/dist/core/create-core-services.js +183 -82
- package/dist/core/create-core-services.js.map +1 -1
- package/dist/core/lifecycle.d.ts +74 -28
- package/dist/core/lifecycle.d.ts.map +1 -1
- package/dist/core/lifecycle.js +157 -20
- package/dist/core/lifecycle.js.map +1 -1
- package/dist/core/public-config.d.ts +5 -1
- package/dist/core/public-config.d.ts.map +1 -1
- package/dist/core/public-config.js +7 -5
- package/dist/core/public-config.js.map +1 -1
- package/dist/core-config.d.ts +95 -1
- package/dist/core-config.d.ts.map +1 -1
- package/dist/core-config.js +24 -8
- package/dist/core-config.js.map +1 -1
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -3
- package/dist/index.js.map +1 -1
- package/dist/modules/access/access-control.service.d.ts +18 -1
- package/dist/modules/access/access-control.service.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.js +19 -8
- package/dist/modules/access/access-control.service.js.map +1 -1
- package/dist/modules/access/access-requests.contract.d.ts +75 -0
- package/dist/modules/access/access-requests.contract.d.ts.map +1 -0
- package/dist/modules/access/access-requests.contract.js +20 -0
- package/dist/modules/access/access-requests.contract.js.map +1 -0
- package/dist/modules/access/access-requests.routes.d.ts +35 -0
- package/dist/modules/access/access-requests.routes.d.ts.map +1 -0
- package/dist/modules/access/access-requests.routes.js +237 -0
- package/dist/modules/access/access-requests.routes.js.map +1 -0
- package/dist/modules/access/access-requests.service.d.ts +123 -0
- package/dist/modules/access/access-requests.service.d.ts.map +1 -0
- package/dist/modules/access/access-requests.service.js +337 -0
- package/dist/modules/access/access-requests.service.js.map +1 -0
- package/dist/modules/access/access.routes.d.ts +2 -1
- package/dist/modules/access/access.routes.d.ts.map +1 -1
- package/dist/modules/access/access.routes.js +10 -10
- package/dist/modules/access/access.routes.js.map +1 -1
- package/dist/modules/access/change-read-gate.d.ts +6 -3
- package/dist/modules/access/change-read-gate.d.ts.map +1 -1
- package/dist/modules/access/change-read-gate.js +9 -6
- package/dist/modules/access/change-read-gate.js.map +1 -1
- package/dist/modules/access/creator-access.d.ts +4 -2
- package/dist/modules/access/creator-access.d.ts.map +1 -1
- package/dist/modules/access/creator-access.js +7 -4
- package/dist/modules/access/creator-access.js.map +1 -1
- package/dist/modules/access-model/access-grammar.d.ts +12 -0
- package/dist/modules/access-model/access-grammar.d.ts.map +1 -1
- package/dist/modules/access-model/access-grammar.js +24 -0
- package/dist/modules/access-model/access-grammar.js.map +1 -1
- package/dist/modules/agent-instructions/read-preamble.d.ts +2 -1
- package/dist/modules/agent-instructions/read-preamble.d.ts.map +1 -1
- package/dist/modules/agent-instructions/read-preamble.js +6 -9
- package/dist/modules/agent-instructions/read-preamble.js.map +1 -1
- package/dist/modules/auth/account-admission.d.ts +40 -0
- package/dist/modules/auth/account-admission.d.ts.map +1 -0
- package/dist/modules/auth/account-admission.js +17 -0
- package/dist/modules/auth/account-admission.js.map +1 -0
- package/dist/modules/auth/account.routes.d.ts.map +1 -1
- package/dist/modules/auth/account.routes.js +4 -1
- package/dist/modules/auth/account.routes.js.map +1 -1
- package/dist/modules/auth/auth.service.d.ts +45 -2
- package/dist/modules/auth/auth.service.d.ts.map +1 -1
- package/dist/modules/auth/auth.service.js +44 -3
- package/dist/modules/auth/auth.service.js.map +1 -1
- package/dist/modules/auth/oidc-auth-provider.d.ts.map +1 -1
- package/dist/modules/auth/oidc-auth-provider.js +9 -0
- package/dist/modules/auth/oidc-auth-provider.js.map +1 -1
- package/dist/modules/connection-probe/connection-probe.service.d.ts +13 -1
- package/dist/modules/connection-probe/connection-probe.service.d.ts.map +1 -1
- package/dist/modules/connection-probe/connection-probe.service.js +10 -2
- package/dist/modules/connection-probe/connection-probe.service.js.map +1 -1
- package/dist/modules/database/advisory-lock.d.ts +17 -0
- package/dist/modules/database/advisory-lock.d.ts.map +1 -1
- package/dist/modules/database/advisory-lock.js +24 -3
- package/dist/modules/database/advisory-lock.js.map +1 -1
- package/dist/modules/database/connection.d.ts +67 -2
- package/dist/modules/database/connection.d.ts.map +1 -1
- package/dist/modules/database/connection.js +118 -12
- package/dist/modules/database/connection.js.map +1 -1
- package/dist/modules/database/migrate.d.ts +1 -1
- package/dist/modules/database/migrate.d.ts.map +1 -1
- package/dist/modules/database/migrate.js +27 -3
- package/dist/modules/database/migrate.js.map +1 -1
- package/dist/modules/github-app/github-app.client.d.ts +101 -0
- package/dist/modules/github-app/github-app.client.d.ts.map +1 -0
- package/dist/modules/github-app/github-app.client.js +222 -0
- package/dist/modules/github-app/github-app.client.js.map +1 -0
- package/dist/modules/github-app/github-app.connection.d.ts +102 -0
- package/dist/modules/github-app/github-app.connection.d.ts.map +1 -0
- package/dist/modules/github-app/github-app.connection.js +185 -0
- package/dist/modules/github-app/github-app.connection.js.map +1 -0
- package/dist/modules/github-app/github-app.routes.d.ts +59 -0
- package/dist/modules/github-app/github-app.routes.d.ts.map +1 -0
- package/dist/modules/github-app/github-app.routes.js +323 -0
- package/dist/modules/github-app/github-app.routes.js.map +1 -0
- package/dist/modules/github-app/index.d.ts +4 -0
- package/dist/modules/github-app/index.d.ts.map +1 -0
- package/dist/modules/github-app/index.js +4 -0
- package/dist/modules/github-app/index.js.map +1 -0
- package/dist/modules/kb-fs/branch-name.d.ts +0 -1
- package/dist/modules/kb-fs/branch-name.d.ts.map +1 -1
- package/dist/modules/kb-fs/branch-name.js +3 -3
- package/dist/modules/kb-fs/branch-name.js.map +1 -1
- package/dist/modules/kb-fs/clone-config.d.ts +9 -8
- package/dist/modules/kb-fs/clone-config.d.ts.map +1 -1
- package/dist/modules/kb-fs/clone-config.js +14 -12
- package/dist/modules/kb-fs/clone-config.js.map +1 -1
- package/dist/modules/kb-fs/remote-url.d.ts +22 -0
- package/dist/modules/kb-fs/remote-url.d.ts.map +1 -0
- package/dist/modules/kb-fs/remote-url.js +35 -0
- package/dist/modules/kb-fs/remote-url.js.map +1 -0
- package/dist/modules/mcp/mcp.service.d.ts +7 -0
- package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
- package/dist/modules/mcp/mcp.service.js +4 -4
- package/dist/modules/mcp/mcp.service.js.map +1 -1
- package/dist/modules/plugins/compile/marketplace-compiler.service.d.ts +4 -4
- package/dist/modules/plugins/compile/marketplace-compiler.service.d.ts.map +1 -1
- package/dist/modules/plugins/compile/marketplace-compiler.service.js +7 -10
- package/dist/modules/plugins/compile/marketplace-compiler.service.js.map +1 -1
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.d.ts +4 -1
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.d.ts.map +1 -1
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.js +5 -3
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.js.map +1 -1
- package/dist/modules/plugins/discovery/kb-plugin-source.d.ts +6 -1
- package/dist/modules/plugins/discovery/kb-plugin-source.d.ts.map +1 -1
- package/dist/modules/plugins/discovery/kb-plugin-source.js +14 -9
- package/dist/modules/plugins/discovery/kb-plugin-source.js.map +1 -1
- package/dist/modules/plugins/discovery/native.source.d.ts +4 -1
- package/dist/modules/plugins/discovery/native.source.d.ts.map +1 -1
- package/dist/modules/plugins/discovery/native.source.js +4 -2
- package/dist/modules/plugins/discovery/native.source.js.map +1 -1
- package/dist/modules/plugins/index.d.ts +1 -1
- package/dist/modules/plugins/index.d.ts.map +1 -1
- package/dist/modules/plugins/index.js +1 -1
- package/dist/modules/plugins/index.js.map +1 -1
- package/dist/modules/plugins/join-proposals.d.ts +17 -5
- package/dist/modules/plugins/join-proposals.d.ts.map +1 -1
- package/dist/modules/plugins/join-proposals.js +76 -22
- package/dist/modules/plugins/join-proposals.js.map +1 -1
- package/dist/modules/plugins/join-request-jobs.service.d.ts +3 -1
- package/dist/modules/plugins/join-request-jobs.service.d.ts.map +1 -1
- package/dist/modules/plugins/join-request-jobs.service.js +6 -6
- package/dist/modules/plugins/join-request-jobs.service.js.map +1 -1
- package/dist/modules/plugins/join-requests.service.d.ts +113 -18
- package/dist/modules/plugins/join-requests.service.d.ts.map +1 -1
- package/dist/modules/plugins/join-requests.service.js +178 -33
- package/dist/modules/plugins/join-requests.service.js.map +1 -1
- package/dist/modules/plugins/plugin-links.d.ts +65 -10
- package/dist/modules/plugins/plugin-links.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-links.js +136 -31
- package/dist/modules/plugins/plugin-links.js.map +1 -1
- package/dist/modules/plugins/plugin-links.service.d.ts +107 -5
- package/dist/modules/plugins/plugin-links.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-links.service.js +151 -21
- package/dist/modules/plugins/plugin-links.service.js.map +1 -1
- package/dist/modules/plugins/plugin-provision.service.d.ts +10 -3
- package/dist/modules/plugins/plugin-provision.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-provision.service.js +33 -26
- package/dist/modules/plugins/plugin-provision.service.js.map +1 -1
- package/dist/modules/plugins/plugin-rename.service.d.ts +4 -2
- package/dist/modules/plugins/plugin-rename.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-rename.service.js +10 -12
- package/dist/modules/plugins/plugin-rename.service.js.map +1 -1
- package/dist/modules/plugins/plugins.routes.d.ts +3 -0
- package/dist/modules/plugins/plugins.routes.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.routes.js +48 -17
- package/dist/modules/plugins/plugins.routes.js.map +1 -1
- package/dist/modules/plugins/plugins.service.d.ts +4 -4
- package/dist/modules/plugins/plugins.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.service.js +7 -10
- package/dist/modules/plugins/plugins.service.js.map +1 -1
- package/dist/modules/plugins/teams.routes.d.ts +4 -1
- package/dist/modules/plugins/teams.routes.d.ts.map +1 -1
- package/dist/modules/plugins/teams.routes.js +11 -9
- package/dist/modules/plugins/teams.routes.js.map +1 -1
- package/dist/modules/secrets-vault/index.d.ts +1 -1
- package/dist/modules/secrets-vault/index.d.ts.map +1 -1
- package/dist/modules/secrets-vault/index.js +1 -1
- package/dist/modules/secrets-vault/index.js.map +1 -1
- package/dist/modules/secrets-vault/secrets-variable-loader.d.ts +29 -11
- package/dist/modules/secrets-vault/secrets-variable-loader.d.ts.map +1 -1
- package/dist/modules/secrets-vault/secrets-variable-loader.js +46 -21
- package/dist/modules/secrets-vault/secrets-variable-loader.js.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.routes.d.ts +3 -0
- package/dist/modules/secrets-vault/secrets-vault.routes.d.ts.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.routes.js +4 -6
- package/dist/modules/secrets-vault/secrets-vault.routes.js.map +1 -1
- package/dist/modules/settings/deployment-settings.service.d.ts +34 -9
- package/dist/modules/settings/deployment-settings.service.d.ts.map +1 -1
- package/dist/modules/settings/deployment-settings.service.js +113 -26
- package/dist/modules/settings/deployment-settings.service.js.map +1 -1
- package/dist/modules/settings/managed-repository.d.ts +43 -0
- package/dist/modules/settings/managed-repository.d.ts.map +1 -0
- package/dist/modules/settings/managed-repository.js +60 -0
- package/dist/modules/settings/managed-repository.js.map +1 -0
- package/dist/modules/settings/repository-source.d.ts +128 -0
- package/dist/modules/settings/repository-source.d.ts.map +1 -0
- package/dist/modules/settings/repository-source.js +150 -0
- package/dist/modules/settings/repository-source.js.map +1 -0
- package/dist/modules/settings/setup.routes.d.ts +34 -4
- package/dist/modules/settings/setup.routes.d.ts.map +1 -1
- package/dist/modules/settings/setup.routes.js +198 -18
- package/dist/modules/settings/setup.routes.js.map +1 -1
- package/dist/modules/skills/allowed-tools-check.d.ts +4 -3
- package/dist/modules/skills/allowed-tools-check.d.ts.map +1 -1
- package/dist/modules/skills/allowed-tools-check.js +8 -8
- package/dist/modules/skills/allowed-tools-check.js.map +1 -1
- package/dist/modules/skills/pending-skills.service.d.ts +3 -1
- package/dist/modules/skills/pending-skills.service.d.ts.map +1 -1
- package/dist/modules/skills/pending-skills.service.js +9 -6
- package/dist/modules/skills/pending-skills.service.js.map +1 -1
- package/dist/modules/skills/skill-access-requests.routes.d.ts +8 -9
- package/dist/modules/skills/skill-access-requests.routes.d.ts.map +1 -1
- package/dist/modules/skills/skill-access-requests.routes.js +26 -65
- package/dist/modules/skills/skill-access-requests.routes.js.map +1 -1
- package/dist/modules/skills/skills.routes.d.ts +4 -1
- package/dist/modules/skills/skills.routes.d.ts.map +1 -1
- package/dist/modules/skills/skills.routes.js +4 -4
- package/dist/modules/skills/skills.routes.js.map +1 -1
- package/dist/modules/skills/skills.service.d.ts +4 -2
- package/dist/modules/skills/skills.service.d.ts.map +1 -1
- package/dist/modules/skills/skills.service.js +13 -11
- package/dist/modules/skills/skills.service.js.map +1 -1
- package/dist/modules/tool-helpers/tool-context.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool-context.js +15 -0
- package/dist/modules/tool-helpers/tool-context.js.map +1 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.d.ts +2 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.d.ts.map +1 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.js +6 -5
- package/dist/modules/tool-manuals/mcp-json-discovery.js.map +1 -1
- package/dist/modules/tool-manuals/mcp-server-edit.service.d.ts +4 -2
- package/dist/modules/tool-manuals/mcp-server-edit.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/mcp-server-edit.service.js +12 -10
- package/dist/modules/tool-manuals/mcp-server-edit.service.js.map +1 -1
- package/dist/modules/tool-manuals/pending-tools.service.d.ts +3 -1
- package/dist/modules/tool-manuals/pending-tools.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/pending-tools.service.js +19 -16
- package/dist/modules/tool-manuals/pending-tools.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-delete.service.d.ts +4 -2
- package/dist/modules/tool-manuals/tool-delete.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-delete.service.js +14 -12
- package/dist/modules/tool-manuals/tool-delete.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.routes.d.ts +3 -1
- package/dist/modules/tool-manuals/tool-manuals.routes.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.routes.js +7 -7
- package/dist/modules/tool-manuals/tool-manuals.routes.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts +4 -2
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.js +15 -12
- package/dist/modules/tool-manuals/tool-manuals.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts +3 -0
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.js +4 -6
- package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.d.ts +3 -2
- package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +1 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.js +47 -11
- package/dist/modules/workflow/agent-tools/workflow.tools.js.map +1 -1
- package/dist/modules/workflow/git/git.service.d.ts +14 -6
- package/dist/modules/workflow/git/git.service.d.ts.map +1 -1
- package/dist/modules/workflow/git/git.service.js +40 -18
- package/dist/modules/workflow/git/git.service.js.map +1 -1
- package/dist/modules/workflow/git/node-git-runner.d.ts +26 -2
- package/dist/modules/workflow/git/node-git-runner.d.ts.map +1 -1
- package/dist/modules/workflow/git/node-git-runner.js +40 -5
- package/dist/modules/workflow/git/node-git-runner.js.map +1 -1
- package/dist/modules/workflow/git/pull-request.service.d.ts +45 -0
- package/dist/modules/workflow/git/pull-request.service.d.ts.map +1 -1
- package/dist/modules/workflow/git/pull-request.service.js +99 -0
- package/dist/modules/workflow/git/pull-request.service.js.map +1 -1
- package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts.map +1 -1
- package/dist/modules/workflow/review-workflow/review-workflow.service.js +9 -4
- package/dist/modules/workflow/review-workflow/review-workflow.service.js.map +1 -1
- package/dist/modules/workflow/session-ontology.service.d.ts +6 -1
- package/dist/modules/workflow/session-ontology.service.d.ts.map +1 -1
- package/dist/modules/workflow/session-ontology.service.js +6 -2
- package/dist/modules/workflow/session-ontology.service.js.map +1 -1
- package/dist/modules/workflow/workflow.routes.d.ts.map +1 -1
- package/dist/modules/workflow/workflow.routes.js +3 -1
- package/dist/modules/workflow/workflow.routes.js.map +1 -1
- package/dist/modules/workflow/workflow.service.d.ts +42 -10
- package/dist/modules/workflow/workflow.service.d.ts.map +1 -1
- package/dist/modules/workflow/workflow.service.js +181 -71
- package/dist/modules/workflow/workflow.service.js.map +1 -1
- package/dist/modules/workspace/session-ontology.gate.d.ts +3 -1
- package/dist/modules/workspace/session-ontology.gate.d.ts.map +1 -1
- package/dist/modules/workspace/session-ontology.gate.js +3 -3
- package/dist/modules/workspace/session-ontology.gate.js.map +1 -1
- package/dist/modules/workspace/startup/kb-git.d.ts +4 -3
- package/dist/modules/workspace/startup/kb-git.d.ts.map +1 -1
- package/dist/modules/workspace/startup/kb-git.js +15 -13
- package/dist/modules/workspace/startup/kb-git.js.map +1 -1
- package/dist/modules/workspace/startup/kb-startup-runner.d.ts +70 -7
- package/dist/modules/workspace/startup/kb-startup-runner.d.ts.map +1 -1
- package/dist/modules/workspace/startup/kb-startup-runner.js +183 -38
- package/dist/modules/workspace/startup/kb-startup-runner.js.map +1 -1
- package/dist/modules/workspace/startup/steps/groups-to-plugins.step.d.ts +7 -1
- package/dist/modules/workspace/startup/steps/groups-to-plugins.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/groups-to-plugins.step.js +23 -16
- package/dist/modules/workspace/startup/steps/groups-to-plugins.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/personal-spaces.step.d.ts +7 -1
- package/dist/modules/workspace/startup/steps/personal-spaces.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/personal-spaces.step.js +12 -5
- package/dist/modules/workspace/startup/steps/personal-spaces.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/plugin-display-names.step.d.ts +7 -1
- package/dist/modules/workspace/startup/steps/plugin-display-names.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/plugin-display-names.step.js +12 -5
- package/dist/modules/workspace/startup/steps/plugin-display-names.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.d.ts +7 -1
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.js +12 -5
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/seed-tree.d.ts +4 -1
- package/dist/modules/workspace/startup/steps/seed-tree.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/seed-tree.js +14 -11
- package/dist/modules/workspace/startup/steps/seed-tree.js.map +1 -1
- package/dist/modules/workspace/startup/steps/template-files.step.d.ts +17 -3
- package/dist/modules/workspace/startup/steps/template-files.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/template-files.step.js +36 -30
- package/dist/modules/workspace/startup/steps/template-files.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/template-source.d.ts +6 -1
- package/dist/modules/workspace/startup/steps/template-source.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/template-source.js +10 -6
- package/dist/modules/workspace/startup/steps/template-source.js.map +1 -1
- package/dist/modules/workspace/workspace.routes.d.ts +2 -1
- package/dist/modules/workspace/workspace.routes.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.routes.js +8 -7
- package/dist/modules/workspace/workspace.routes.js.map +1 -1
- package/dist/modules/workspace/workspace.service.d.ts +18 -12
- package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.service.js +49 -29
- package/dist/modules/workspace/workspace.service.js.map +1 -1
- package/dist/modules/workspace/workspace.tools.d.ts +2 -1
- package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.tools.js +48 -20
- package/dist/modules/workspace/workspace.tools.js.map +1 -1
- package/dist/modules/workspace/write-denial.d.ts +3 -2
- package/dist/modules/workspace/write-denial.d.ts.map +1 -1
- package/dist/modules/workspace/write-denial.js +6 -5
- package/dist/modules/workspace/write-denial.js.map +1 -1
- package/dist/shared/domain-errors.d.ts +39 -0
- package/dist/shared/domain-errors.d.ts.map +1 -1
- package/dist/shared/domain-errors.js +55 -0
- package/dist/shared/domain-errors.js.map +1 -1
- package/dist/shared/git.contract.d.ts +62 -7
- package/dist/shared/git.contract.d.ts.map +1 -1
- package/dist/shared/git.contract.js +30 -8
- package/dist/shared/git.contract.js.map +1 -1
- package/dist/shared/kb-context.d.ts +76 -0
- package/dist/shared/kb-context.d.ts.map +1 -0
- package/dist/shared/kb-context.js +108 -0
- package/dist/shared/kb-context.js.map +1 -0
- package/dist/shared/kb-layout.d.ts +3 -2
- package/dist/shared/kb-layout.d.ts.map +1 -1
- package/dist/shared/kb-layout.js +4 -3
- package/dist/shared/kb-layout.js.map +1 -1
- package/dist/shared/kb-layout.test.js +35 -27
- package/dist/shared/kb-layout.test.js.map +1 -1
- package/dist/shared/pending-proposals.d.ts +4 -1
- package/dist/shared/pending-proposals.d.ts.map +1 -1
- package/dist/shared/pending-proposals.js +3 -4
- package/dist/shared/pending-proposals.js.map +1 -1
- package/dist/shared/redact-secret.d.ts +5 -5
- package/dist/shared/redact-secret.js +5 -5
- package/dist/tenancy/index.d.ts +13 -0
- package/dist/tenancy/index.d.ts.map +1 -0
- package/dist/tenancy/index.js +13 -0
- package/dist/tenancy/index.js.map +1 -0
- package/dist/tenancy/static-tenant-source.d.ts +98 -0
- package/dist/tenancy/static-tenant-source.d.ts.map +1 -0
- package/dist/tenancy/static-tenant-source.js +220 -0
- package/dist/tenancy/static-tenant-source.js.map +1 -0
- package/dist/tenancy/tenant-host.d.ts +80 -0
- package/dist/tenancy/tenant-host.d.ts.map +1 -0
- package/dist/tenancy/tenant-host.js +217 -0
- package/dist/tenancy/tenant-host.js.map +1 -0
- package/dist/tenancy/tenant-runtime.d.ts +91 -0
- package/dist/tenancy/tenant-runtime.d.ts.map +1 -0
- package/dist/tenancy/tenant-runtime.js +174 -0
- package/dist/tenancy/tenant-runtime.js.map +1 -0
- package/dist/tenancy/tenant-secrets.d.ts +24 -0
- package/dist/tenancy/tenant-secrets.d.ts.map +1 -0
- package/dist/tenancy/tenant-secrets.js +30 -0
- package/dist/tenancy/tenant-secrets.js.map +1 -0
- package/dist/tenancy/tenant-source.contract.d.ts +45 -0
- package/dist/tenancy/tenant-source.contract.d.ts.map +1 -0
- package/dist/tenancy/tenant-source.contract.js +21 -0
- package/dist/tenancy/tenant-source.contract.js.map +1 -0
- package/migrations/0000_core_init.sql +14 -14
- package/migrations/0003_deployment_settings.sql +1 -1
- package/migrations/0005_github_facade.sql +1 -1
- package/migrations/0012_agent_audit.sql +6 -6
- package/package.json +3 -3
- package/src/__tests__/branch-model.test.ts +7 -6
- package/src/__tests__/kb-context.ts +30 -0
- package/src/__tests__/kb-layout-config.test.ts +35 -30
- package/src/core/__tests__/catalog-cache-invalidation.test.ts +2 -1
- package/src/core/__tests__/lifecycle.test.ts +78 -1
- package/src/core/__tests__/public-config.test.ts +5 -1
- package/src/core/catalog-cache-invalidation.ts +16 -11
- package/src/core/core-ports.ts +19 -0
- package/src/core/create-core-server.ts +64 -107
- package/src/core/create-core-services.ts +238 -96
- package/src/core/lifecycle.ts +214 -29
- package/src/core/public-config.ts +8 -5
- package/src/core-config.ts +107 -8
- package/src/index.ts +25 -2
- package/src/modules/access/__tests__/access-control.admin-root-floor.test.ts +2 -1
- package/src/modules/access/__tests__/access-requests.recut.test.ts +134 -0
- package/src/modules/access/__tests__/access-requests.routes.test.ts +610 -0
- package/src/modules/access/__tests__/access.routes.batch.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.folder-governs.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.group-grant.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.overrides.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.proposal-branch.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.prospective.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.revoke.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.unknown-email.test.ts +2 -1
- package/src/modules/access/__tests__/change-read-gate.test.ts +13 -11
- package/src/modules/access/__tests__/creator-access.test.ts +3 -2
- package/src/modules/access/__tests__/roles.routes.test.ts +2 -1
- package/src/modules/access/access-control.service.ts +20 -6
- package/src/modules/access/access-requests.contract.ts +93 -0
- package/src/modules/access/access-requests.routes.ts +286 -0
- package/src/modules/access/access-requests.service.ts +420 -0
- package/src/modules/access/access.routes.ts +10 -13
- package/src/modules/access/change-read-gate.ts +10 -4
- package/src/modules/access/creator-access.ts +7 -2
- package/src/modules/access-model/access-grammar.ts +22 -0
- package/src/modules/agent-instructions/__tests__/read-preamble.test.ts +13 -12
- package/src/modules/agent-instructions/read-preamble.ts +10 -12
- package/src/modules/auth/__tests__/account.routes.test.ts +15 -0
- package/src/modules/auth/__tests__/auth.service.test.ts +98 -0
- package/src/modules/auth/account-admission.ts +44 -0
- package/src/modules/auth/account.routes.ts +4 -1
- package/src/modules/auth/auth.service.ts +61 -2
- package/src/modules/auth/oidc-auth-provider.ts +9 -0
- package/src/modules/connection-probe/connection-probe.service.ts +7 -1
- package/src/modules/database/__tests__/advisory-lock.test.ts +23 -1
- package/src/modules/database/__tests__/connection.test.ts +98 -0
- package/src/modules/database/__tests__/migrations-unqualified.test.ts +32 -0
- package/src/modules/database/advisory-lock.ts +28 -4
- package/src/modules/database/connection.ts +143 -13
- package/src/modules/database/migrate.ts +48 -14
- package/src/modules/diff/__tests__/diff.service.seed-atomicity.test.ts +2 -1
- package/src/modules/diff/__tests__/diff.service.test.ts +2 -1
- package/src/modules/github-app/__tests__/github-app.test.ts +848 -0
- package/src/modules/github-app/github-app.client.ts +268 -0
- package/src/modules/github-app/github-app.connection.ts +204 -0
- package/src/modules/github-app/github-app.routes.ts +359 -0
- package/src/modules/github-app/index.ts +19 -0
- package/src/modules/kb-fs/__tests__/branch-name.test.ts +6 -6
- package/src/modules/kb-fs/__tests__/clone-config.test.ts +24 -20
- package/src/modules/kb-fs/__tests__/remote-url.test.ts +38 -0
- package/src/modules/kb-fs/branch-name.ts +3 -3
- package/src/modules/kb-fs/clone-config.ts +15 -12
- package/src/modules/kb-fs/remote-url.ts +35 -0
- package/src/modules/marketplace/__tests__/marketplace-repo.head.test.ts +2 -1
- package/src/modules/mcp/mcp.service.ts +11 -4
- package/src/modules/plugins/__tests__/bundle-dialect.e2e.test.ts +12 -11
- package/src/modules/plugins/__tests__/bundle-dialect.test.ts +2 -1
- package/src/modules/plugins/__tests__/compile-marketplace.test.ts +6 -4
- package/src/modules/plugins/__tests__/join-proposals.test.ts +100 -19
- package/src/modules/plugins/__tests__/join-request-jobs.service.test.ts +2 -1
- package/src/modules/plugins/__tests__/join-requests.service.test.ts +28 -11
- package/src/modules/plugins/__tests__/join-requests.settlement.test.ts +371 -0
- package/src/modules/plugins/__tests__/plugin-creation-display-name.test.ts +4 -3
- package/src/modules/plugins/__tests__/plugin-index.service.test.ts +6 -4
- package/src/modules/plugins/__tests__/plugin-links.service.test.ts +220 -5
- package/src/modules/plugins/__tests__/plugin-provision.service.test.ts +3 -1
- package/src/modules/plugins/__tests__/plugin-rename.service.test.ts +7 -6
- package/src/modules/plugins/__tests__/plugins.routes.test.ts +12 -3
- package/src/modules/plugins/__tests__/teams.routes.test.ts +2 -1
- package/src/modules/plugins/compile/marketplace-compiler.service.ts +7 -9
- package/src/modules/plugins/discovery/__tests__/kb-plugin-source.test.ts +20 -16
- package/src/modules/plugins/discovery/bundle-dialect/bundle.source.ts +9 -2
- package/src/modules/plugins/discovery/kb-plugin-source.ts +15 -8
- package/src/modules/plugins/discovery/native.source.ts +4 -1
- package/src/modules/plugins/index.ts +1 -1
- package/src/modules/plugins/join-proposals.ts +87 -19
- package/src/modules/plugins/join-request-jobs.service.ts +8 -7
- package/src/modules/plugins/join-requests.service.ts +203 -43
- package/src/modules/plugins/plugin-links.service.ts +192 -19
- package/src/modules/plugins/plugin-links.ts +147 -27
- package/src/modules/plugins/plugin-provision.service.ts +54 -27
- package/src/modules/plugins/plugin-rename.service.ts +10 -10
- package/src/modules/plugins/plugins.routes.ts +48 -17
- package/src/modules/plugins/plugins.service.ts +7 -11
- package/src/modules/plugins/teams.routes.ts +16 -8
- package/src/modules/secrets-vault/__tests__/connect-pending.route.test.ts +7 -0
- package/src/modules/secrets-vault/__tests__/secrets-variable-loader.test.ts +40 -0
- package/src/modules/secrets-vault/__tests__/tool-owner-gate.route.test.ts +2 -0
- package/src/modules/secrets-vault/index.ts +2 -0
- package/src/modules/secrets-vault/secrets-variable-loader.ts +51 -21
- package/src/modules/secrets-vault/secrets-vault.routes.ts +7 -6
- package/src/modules/settings/__tests__/deployment-settings.service.test.ts +24 -11
- package/src/modules/settings/__tests__/git-root-folders.test.ts +2 -1
- package/src/modules/settings/__tests__/repository-source.test.ts +191 -0
- package/src/modules/settings/__tests__/setup.routes.boot-failure.test.ts +2 -1
- package/src/modules/settings/__tests__/setup.routes.git-mode.test.ts +353 -0
- package/src/modules/settings/__tests__/setup.routes.github-app.test.ts +282 -0
- package/src/modules/settings/__tests__/setup.routes.layout-phase.test.ts +7 -4
- package/src/modules/settings/__tests__/setup.routes.managed-phase.test.ts +233 -0
- package/src/modules/settings/__tests__/setup.routes.oidc.test.ts +2 -0
- package/src/modules/settings/__tests__/setup.routes.sync-status.test.ts +2 -0
- package/src/modules/settings/__tests__/setup.routes.test.ts +33 -52
- package/src/modules/settings/deployment-settings.service.ts +130 -23
- package/src/modules/settings/managed-repository.ts +68 -0
- package/src/modules/settings/repository-source.ts +197 -0
- package/src/modules/settings/setup.routes.ts +233 -19
- package/src/modules/skills/__tests__/allowed-tools-check.test.ts +11 -10
- package/src/modules/skills/__tests__/allowed-tools-warn.tools.test.ts +4 -3
- package/src/modules/skills/__tests__/pending-skills.service.test.ts +3 -1
- package/src/modules/skills/__tests__/skill-access-requests.routes.test.ts +7 -2
- package/src/modules/skills/__tests__/skills.routes.warnings.test.ts +2 -1
- package/src/modules/skills/__tests__/skills.service.test.ts +3 -2
- package/src/modules/skills/allowed-tools-check.ts +7 -6
- package/src/modules/skills/pending-skills.service.ts +9 -8
- package/src/modules/skills/skill-access-requests.routes.ts +29 -79
- package/src/modules/skills/skills.routes.ts +4 -3
- package/src/modules/skills/skills.service.ts +13 -9
- package/src/modules/tool-helpers/__tests__/agent-roles-write.test.ts +3 -2
- package/src/modules/tool-helpers/__tests__/phase4-tools.test.ts +3 -2
- package/src/modules/tool-helpers/tool-context.ts +15 -0
- package/src/modules/tool-manuals/__tests__/mcp-json-discovery.test.ts +17 -12
- package/src/modules/tool-manuals/__tests__/mcp-server-edit.service.test.ts +2 -1
- package/src/modules/tool-manuals/__tests__/pending-tools.service.test.ts +4 -1
- package/src/modules/tool-manuals/__tests__/tool-delete.service.test.ts +2 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.archive.route.test.ts +2 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.cli.test.ts +5 -4
- package/src/modules/tool-manuals/__tests__/tool-manuals.detail.route.test.ts +2 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.invalid.routes.test.ts +4 -2
- package/src/modules/tool-manuals/__tests__/tool-manuals.invalid.test.ts +13 -5
- package/src/modules/tool-manuals/__tests__/tool-manuals.mcp-oauth.test.ts +2 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.restart.test.ts +9 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.service.test.ts +3 -2
- package/src/modules/tool-manuals/__tests__/tool-manuals.tools.test.ts +2 -0
- package/src/modules/tool-manuals/mcp-json-discovery.ts +6 -4
- package/src/modules/tool-manuals/mcp-server-edit.service.ts +13 -11
- package/src/modules/tool-manuals/pending-tools.service.ts +19 -16
- package/src/modules/tool-manuals/tool-delete.service.ts +13 -10
- package/src/modules/tool-manuals/tool-manuals.routes.ts +10 -8
- package/src/modules/tool-manuals/tool-manuals.service.ts +15 -13
- package/src/modules/tool-manuals/tool-manuals.tools.ts +7 -6
- package/src/modules/workflow/__tests__/apply-failure.test.ts +11 -2
- package/src/modules/workflow/__tests__/merge-announces-tree.test.ts +14 -26
- package/src/modules/workflow/__tests__/preserve-roles-yaml.test.ts +2 -1
- package/src/modules/workflow/__tests__/session-ontology.service.test.ts +3 -2
- package/src/modules/workflow/__tests__/workflow.routes.lock-path.test.ts +2 -1
- package/src/modules/workflow/__tests__/workflow.service.branch-in-use.test.ts +3 -10
- package/src/modules/workflow/__tests__/workflow.service.commitFileWhileLocked.test.ts +2 -1
- package/src/modules/workflow/__tests__/workflow.service.deleted-branch-sweep.test.ts +3 -10
- package/src/modules/workflow/__tests__/workflow.service.facade.test.ts +187 -35
- package/src/modules/workflow/__tests__/workflow.service.folder-proposals.test.ts +2 -1
- package/src/modules/workflow/__tests__/workflow.service.platform-restore.test.ts +2 -1
- package/src/modules/workflow/__tests__/workflow.service.read-gate.test.ts +3 -2
- package/src/modules/workflow/__tests__/workflow.service.releaseLock.test.ts +2 -1
- package/src/modules/workflow/__tests__/workflow.service.sync.test.ts +5 -4
- package/src/modules/workflow/__tests__/workflow.service.update-from-target.test.ts +148 -41
- package/src/modules/workflow/agent-tools/__tests__/workflow.tools.test.ts +143 -2
- package/src/modules/workflow/agent-tools/workflow.tools.ts +60 -12
- package/src/modules/workflow/git/__tests__/git.service.accessGating.test.ts +5 -4
- package/src/modules/workflow/git/__tests__/git.service.changedFilesForPr.test.ts +12 -11
- package/src/modules/workflow/git/__tests__/git.service.commitChanges.test.ts +9 -8
- package/src/modules/workflow/git/__tests__/git.service.commitFile.strayPath.test.ts +8 -7
- package/src/modules/workflow/git/__tests__/git.service.commitFile.test.ts +6 -5
- package/src/modules/workflow/git/__tests__/git.service.createBranch.test.ts +3 -2
- package/src/modules/workflow/git/__tests__/git.service.deleteBranch.test.ts +3 -2
- package/src/modules/workflow/git/__tests__/git.service.diffFileAtCommit.test.ts +7 -6
- package/src/modules/workflow/git/__tests__/git.service.diffFileBetweenBranches.test.ts +16 -15
- package/src/modules/workflow/git/__tests__/git.service.fileContentsAtCommit.test.ts +3 -2
- package/src/modules/workflow/git/__tests__/git.service.forkPoint.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.history-guards.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.list-branches.test.ts +10 -9
- package/src/modules/workflow/git/__tests__/git.service.listTrackedFiles.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.logForFile.test.ts +6 -5
- package/src/modules/workflow/git/__tests__/git.service.mergeChangeRequest.test.ts +9 -8
- package/src/modules/workflow/git/__tests__/git.service.pendingChanges.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.postMergePull.test.ts +4 -3
- package/src/modules/workflow/git/__tests__/git.service.pull.test.ts +130 -8
- package/src/modules/workflow/git/__tests__/git.service.readFileAtRef.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.revertPathsAndPush.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.status.test.ts +4 -3
- package/src/modules/workflow/git/__tests__/git.service.syncFromRemote.test.ts +8 -7
- package/src/modules/workflow/git/__tests__/node-git-runner.test.ts +41 -3
- package/src/modules/workflow/git/__tests__/pull-request.service.getPrDetail.test.ts +145 -2
- package/src/modules/workflow/git/__tests__/pull-request.service.viewer-can-delete.test.ts +166 -0
- package/src/modules/workflow/git/git.service.ts +49 -17
- package/src/modules/workflow/git/node-git-runner.ts +43 -4
- package/src/modules/workflow/git/pull-request.service.ts +119 -0
- package/src/modules/workflow/review-workflow/review-workflow.service.ts +9 -6
- package/src/modules/workflow/session-ontology.service.ts +7 -2
- package/src/modules/workflow/workflow.routes.ts +3 -1
- package/src/modules/workflow/workflow.service.ts +201 -76
- package/src/modules/workspace/__tests__/file-stat-access.test.ts +3 -2
- package/src/modules/workspace/__tests__/git-internals.security.test.ts +10 -9
- package/src/modules/workspace/__tests__/session-ontology.gate.test.ts +4 -2
- package/src/modules/workspace/__tests__/workspace-paths-inside-the-repo.test.ts +3 -2
- package/src/modules/workspace/__tests__/workspace.routes.branch-errors.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.create-grant.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.delete.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.download-implies-read.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.download.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.file-writes.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.folders.test.ts +5 -4
- package/src/modules/workspace/__tests__/workspace.routes.move-platform-files.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.read-gate.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.service.ensure-remotes-fetched.test.ts +2 -2
- package/src/modules/workspace/__tests__/workspace.service.list-cloned.test.ts +6 -5
- package/src/modules/workspace/__tests__/workspace.service.move-never-overwrites.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.service.read-filter.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.service.test.ts +84 -50
- package/src/modules/workspace/__tests__/workspace.service.unknown-branch.test.ts +45 -1
- package/src/modules/workspace/__tests__/workspace.tools.agents-file.test.ts +10 -7
- package/src/modules/workspace/__tests__/workspace.tools.branch-errors.test.ts +237 -10
- package/src/modules/workspace/__tests__/workspace.tools.test.ts +44 -11
- package/src/modules/workspace/__tests__/write-denial.test.ts +5 -4
- package/src/modules/workspace/session-ontology.gate.ts +6 -4
- package/src/modules/workspace/startup/__tests__/kb-startup-runner.degraded.test.ts +6 -2
- package/src/modules/workspace/startup/__tests__/kb-startup-runner.test.ts +240 -21
- package/src/modules/workspace/startup/kb-git.ts +15 -22
- package/src/modules/workspace/startup/kb-startup-runner.ts +198 -45
- package/src/modules/workspace/startup/steps/__tests__/steps.test.ts +104 -98
- package/src/modules/workspace/startup/steps/groups-to-plugins.step.ts +24 -16
- package/src/modules/workspace/startup/steps/personal-spaces.step.ts +14 -5
- package/src/modules/workspace/startup/steps/plugin-display-names.step.ts +13 -5
- package/src/modules/workspace/startup/steps/plugin-manifests.step.ts +14 -5
- package/src/modules/workspace/startup/steps/seed-tree.ts +11 -9
- package/src/modules/workspace/startup/steps/template-files.step.ts +43 -34
- package/src/modules/workspace/startup/steps/template-source.ts +8 -5
- package/src/modules/workspace/workspace.routes.ts +8 -7
- package/src/modules/workspace/workspace.service.ts +47 -28
- package/src/modules/workspace/workspace.tools.ts +56 -20
- package/src/modules/workspace/write-denial.ts +7 -5
- package/src/shared/__tests__/kb-layout.plugin.test.ts +19 -16
- package/src/shared/domain-errors.ts +58 -0
- package/src/shared/git.contract.ts +80 -8
- package/src/shared/kb-context.ts +130 -0
- package/src/shared/kb-layout.test.ts +37 -27
- package/src/shared/kb-layout.ts +4 -3
- package/src/shared/pending-proposals.ts +7 -4
- package/src/shared/redact-secret.ts +5 -5
- package/src/tenancy/__tests__/static-tenant-source.test.ts +177 -0
- package/src/tenancy/__tests__/tenant-host.test.ts +372 -0
- package/src/tenancy/__tests__/tenant-runtime.test.ts +221 -0
- package/src/tenancy/__tests__/tenant-secrets.test.ts +35 -0
- package/src/tenancy/index.ts +35 -0
- package/src/tenancy/static-tenant-source.ts +296 -0
- package/src/tenancy/tenant-host.ts +261 -0
- package/src/tenancy/tenant-runtime.ts +208 -0
- package/src/tenancy/tenant-secrets.ts +41 -0
- package/src/tenancy/tenant-source.contract.ts +59 -0
|
@@ -173,51 +173,51 @@ CREATE TABLE IF NOT EXISTS "users" (
|
|
|
173
173
|
--> statement-breakpoint
|
|
174
174
|
DO $$ BEGIN
|
|
175
175
|
IF NOT EXISTS (
|
|
176
|
-
SELECT 1 FROM pg_constraint WHERE conname = 'api_tokens_user_id_users_id_fk' AND conrelid = '
|
|
176
|
+
SELECT 1 FROM pg_constraint WHERE conname = 'api_tokens_user_id_users_id_fk' AND conrelid = to_regclass('api_tokens')
|
|
177
177
|
) THEN
|
|
178
|
-
ALTER TABLE "api_tokens" ADD CONSTRAINT "api_tokens_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "
|
|
178
|
+
ALTER TABLE "api_tokens" ADD CONSTRAINT "api_tokens_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE no action ON UPDATE no action;
|
|
179
179
|
END IF;
|
|
180
180
|
END $$;--> statement-breakpoint
|
|
181
181
|
DO $$ BEGIN
|
|
182
182
|
IF NOT EXISTS (
|
|
183
|
-
SELECT 1 FROM pg_constraint WHERE conname = 'file_locks_holder_user_id_users_id_fk' AND conrelid = '
|
|
183
|
+
SELECT 1 FROM pg_constraint WHERE conname = 'file_locks_holder_user_id_users_id_fk' AND conrelid = to_regclass('file_locks')
|
|
184
184
|
) THEN
|
|
185
|
-
ALTER TABLE "file_locks" ADD CONSTRAINT "file_locks_holder_user_id_users_id_fk" FOREIGN KEY ("holder_user_id") REFERENCES "
|
|
185
|
+
ALTER TABLE "file_locks" ADD CONSTRAINT "file_locks_holder_user_id_users_id_fk" FOREIGN KEY ("holder_user_id") REFERENCES "users"("id") ON DELETE no action ON UPDATE no action;
|
|
186
186
|
END IF;
|
|
187
187
|
END $$;--> statement-breakpoint
|
|
188
188
|
DO $$ BEGIN
|
|
189
189
|
IF NOT EXISTS (
|
|
190
|
-
SELECT 1 FROM pg_constraint WHERE conname = 'oauth_auth_codes_client_id_oauth_clients_client_id_fk' AND conrelid = '
|
|
190
|
+
SELECT 1 FROM pg_constraint WHERE conname = 'oauth_auth_codes_client_id_oauth_clients_client_id_fk' AND conrelid = to_regclass('oauth_auth_codes')
|
|
191
191
|
) THEN
|
|
192
|
-
ALTER TABLE "oauth_auth_codes" ADD CONSTRAINT "oauth_auth_codes_client_id_oauth_clients_client_id_fk" FOREIGN KEY ("client_id") REFERENCES "
|
|
192
|
+
ALTER TABLE "oauth_auth_codes" ADD CONSTRAINT "oauth_auth_codes_client_id_oauth_clients_client_id_fk" FOREIGN KEY ("client_id") REFERENCES "oauth_clients"("client_id") ON DELETE no action ON UPDATE no action;
|
|
193
193
|
END IF;
|
|
194
194
|
END $$;--> statement-breakpoint
|
|
195
195
|
DO $$ BEGIN
|
|
196
196
|
IF NOT EXISTS (
|
|
197
|
-
SELECT 1 FROM pg_constraint WHERE conname = 'oauth_auth_codes_user_id_users_id_fk' AND conrelid = '
|
|
197
|
+
SELECT 1 FROM pg_constraint WHERE conname = 'oauth_auth_codes_user_id_users_id_fk' AND conrelid = to_regclass('oauth_auth_codes')
|
|
198
198
|
) THEN
|
|
199
|
-
ALTER TABLE "oauth_auth_codes" ADD CONSTRAINT "oauth_auth_codes_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "
|
|
199
|
+
ALTER TABLE "oauth_auth_codes" ADD CONSTRAINT "oauth_auth_codes_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE no action ON UPDATE no action;
|
|
200
200
|
END IF;
|
|
201
201
|
END $$;--> statement-breakpoint
|
|
202
202
|
DO $$ BEGIN
|
|
203
203
|
IF NOT EXISTS (
|
|
204
|
-
SELECT 1 FROM pg_constraint WHERE conname = 'oauth_tokens_client_id_oauth_clients_client_id_fk' AND conrelid = '
|
|
204
|
+
SELECT 1 FROM pg_constraint WHERE conname = 'oauth_tokens_client_id_oauth_clients_client_id_fk' AND conrelid = to_regclass('oauth_tokens')
|
|
205
205
|
) THEN
|
|
206
|
-
ALTER TABLE "oauth_tokens" ADD CONSTRAINT "oauth_tokens_client_id_oauth_clients_client_id_fk" FOREIGN KEY ("client_id") REFERENCES "
|
|
206
|
+
ALTER TABLE "oauth_tokens" ADD CONSTRAINT "oauth_tokens_client_id_oauth_clients_client_id_fk" FOREIGN KEY ("client_id") REFERENCES "oauth_clients"("client_id") ON DELETE no action ON UPDATE no action;
|
|
207
207
|
END IF;
|
|
208
208
|
END $$;--> statement-breakpoint
|
|
209
209
|
DO $$ BEGIN
|
|
210
210
|
IF NOT EXISTS (
|
|
211
|
-
SELECT 1 FROM pg_constraint WHERE conname = 'oauth_tokens_user_id_users_id_fk' AND conrelid = '
|
|
211
|
+
SELECT 1 FROM pg_constraint WHERE conname = 'oauth_tokens_user_id_users_id_fk' AND conrelid = to_regclass('oauth_tokens')
|
|
212
212
|
) THEN
|
|
213
|
-
ALTER TABLE "oauth_tokens" ADD CONSTRAINT "oauth_tokens_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "
|
|
213
|
+
ALTER TABLE "oauth_tokens" ADD CONSTRAINT "oauth_tokens_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE no action ON UPDATE no action;
|
|
214
214
|
END IF;
|
|
215
215
|
END $$;--> statement-breakpoint
|
|
216
216
|
DO $$ BEGIN
|
|
217
217
|
IF NOT EXISTS (
|
|
218
|
-
SELECT 1 FROM pg_constraint WHERE conname = 'secrets_user_id_users_id_fk' AND conrelid = '
|
|
218
|
+
SELECT 1 FROM pg_constraint WHERE conname = 'secrets_user_id_users_id_fk' AND conrelid = to_regclass('secrets')
|
|
219
219
|
) THEN
|
|
220
|
-
ALTER TABLE "secrets" ADD CONSTRAINT "secrets_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "
|
|
220
|
+
ALTER TABLE "secrets" ADD CONSTRAINT "secrets_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE cascade ON UPDATE no action;
|
|
221
221
|
END IF;
|
|
222
222
|
END $$;--> statement-breakpoint
|
|
223
223
|
CREATE UNIQUE INDEX IF NOT EXISTS "change_requests_number_unq" ON "change_requests" USING btree ("number");--> statement-breakpoint
|
|
@@ -6,4 +6,4 @@ CREATE TABLE "deployment_settings" (
|
|
|
6
6
|
"updated_at" timestamp DEFAULT now() NOT NULL
|
|
7
7
|
);
|
|
8
8
|
--> statement-breakpoint
|
|
9
|
-
ALTER TABLE "deployment_settings" ADD CONSTRAINT "deployment_settings_updated_by_users_id_fk" FOREIGN KEY ("updated_by") REFERENCES "
|
|
9
|
+
ALTER TABLE "deployment_settings" ADD CONSTRAINT "deployment_settings_updated_by_users_id_fk" FOREIGN KEY ("updated_by") REFERENCES "users"("id") ON DELETE set null ON UPDATE no action;
|
|
@@ -22,4 +22,4 @@ CREATE TABLE "github_facade_identity" (
|
|
|
22
22
|
);
|
|
23
23
|
--> statement-breakpoint
|
|
24
24
|
ALTER TABLE "api_tokens" ADD COLUMN "kind" text DEFAULT 'key' NOT NULL;--> statement-breakpoint
|
|
25
|
-
ALTER TABLE "github_facade_codes" ADD CONSTRAINT "github_facade_codes_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "
|
|
25
|
+
ALTER TABLE "github_facade_codes" ADD CONSTRAINT "github_facade_codes_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE cascade ON UPDATE no action;
|
|
@@ -26,16 +26,16 @@ CREATE TABLE "agent_events" (
|
|
|
26
26
|
);
|
|
27
27
|
--> statement-breakpoint
|
|
28
28
|
ALTER TABLE "oauth_tokens" ADD COLUMN "connection_id" uuid;--> statement-breakpoint
|
|
29
|
-
ALTER TABLE "agent_connections" ADD CONSTRAINT "agent_connections_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "
|
|
30
|
-
ALTER TABLE "agent_connections" ADD CONSTRAINT "agent_connections_client_id_oauth_clients_client_id_fk" FOREIGN KEY ("client_id") REFERENCES "
|
|
31
|
-
ALTER TABLE "agent_events" ADD CONSTRAINT "agent_events_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "
|
|
32
|
-
ALTER TABLE "agent_events" ADD CONSTRAINT "agent_events_key_id_api_tokens_id_fk" FOREIGN KEY ("key_id") REFERENCES "
|
|
33
|
-
ALTER TABLE "agent_events" ADD CONSTRAINT "agent_events_connection_id_agent_connections_id_fk" FOREIGN KEY ("connection_id") REFERENCES "
|
|
29
|
+
ALTER TABLE "agent_connections" ADD CONSTRAINT "agent_connections_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
30
|
+
ALTER TABLE "agent_connections" ADD CONSTRAINT "agent_connections_client_id_oauth_clients_client_id_fk" FOREIGN KEY ("client_id") REFERENCES "oauth_clients"("client_id") ON DELETE no action ON UPDATE no action;--> statement-breakpoint
|
|
31
|
+
ALTER TABLE "agent_events" ADD CONSTRAINT "agent_events_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
32
|
+
ALTER TABLE "agent_events" ADD CONSTRAINT "agent_events_key_id_api_tokens_id_fk" FOREIGN KEY ("key_id") REFERENCES "api_tokens"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
33
|
+
ALTER TABLE "agent_events" ADD CONSTRAINT "agent_events_connection_id_agent_connections_id_fk" FOREIGN KEY ("connection_id") REFERENCES "agent_connections"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
34
34
|
CREATE INDEX "agent_connections_by_user" ON "agent_connections" USING btree ("user_id");--> statement-breakpoint
|
|
35
35
|
CREATE UNIQUE INDEX "agent_connections_live_unq" ON "agent_connections" USING btree ("user_id","client_id") WHERE "agent_connections"."revoked_at" is null;--> statement-breakpoint
|
|
36
36
|
CREATE INDEX "agent_events_by_key" ON "agent_events" USING btree ("key_id","at");--> statement-breakpoint
|
|
37
37
|
CREATE INDEX "agent_events_by_connection" ON "agent_events" USING btree ("connection_id","at");--> statement-breakpoint
|
|
38
38
|
CREATE INDEX "agent_events_by_at" ON "agent_events" USING btree ("at");--> statement-breakpoint
|
|
39
39
|
CREATE INDEX "agent_events_by_user" ON "agent_events" USING btree ("user_id");--> statement-breakpoint
|
|
40
|
-
ALTER TABLE "oauth_tokens" ADD CONSTRAINT "oauth_tokens_connection_id_agent_connections_id_fk" FOREIGN KEY ("connection_id") REFERENCES "
|
|
40
|
+
ALTER TABLE "oauth_tokens" ADD CONSTRAINT "oauth_tokens_connection_id_agent_connections_id_fk" FOREIGN KEY ("connection_id") REFERENCES "agent_connections"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint
|
|
41
41
|
CREATE INDEX "oauth_tokens_by_connection" ON "oauth_tokens" USING btree ("connection_id");
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bevel-software/platform-core-backend",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.22.0",
|
|
4
4
|
"description": "Open-source core backend of the Bevel platform: git-backed knowledge workspace, workflow (branches/change requests/locks/SSE), skills, tools, secrets vault, access control and the remote MCP surface.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -52,8 +52,8 @@
|
|
|
52
52
|
"xlsx": "https://cdn.sheetjs.com/xlsx-0.20.3/xlsx-0.20.3.tgz",
|
|
53
53
|
"yaml": "^2.9.0",
|
|
54
54
|
"zod": "^3.24.0",
|
|
55
|
-
"@bevel-software/platform-mcp-core": "0.
|
|
56
|
-
"@bevel-software/platform-shared": "0.
|
|
55
|
+
"@bevel-software/platform-mcp-core": "0.22.0",
|
|
56
|
+
"@bevel-software/platform-shared": "0.22.0"
|
|
57
57
|
},
|
|
58
58
|
"devDependencies": {
|
|
59
59
|
"@types/adm-zip": "^0.5.8",
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { describe, it, expect, afterEach, beforeEach } from 'vitest';
|
|
2
2
|
import {
|
|
3
3
|
configureBranchModel,
|
|
4
|
+
currentBranchModel,
|
|
4
5
|
isBranchModelConfigured,
|
|
5
6
|
isProtectedBranch,
|
|
6
7
|
protectedBranchDisplayName,
|
|
@@ -21,14 +22,14 @@ afterEach(() => configureBranchModel(PAIR));
|
|
|
21
22
|
|
|
22
23
|
describe('configureBranchModel', () => {
|
|
23
24
|
it('applies the model to every export', () => {
|
|
24
|
-
expect(isBranchModelConfigured()).toBe(true);
|
|
25
|
+
expect(isBranchModelConfigured(currentBranchModel())).toBe(true);
|
|
25
26
|
expect(DEFAULT_BRANCH).toBe('target-company-state');
|
|
26
27
|
expect([...PROTECTED_BRANCHES].sort()).toEqual([
|
|
27
28
|
'current-company-state',
|
|
28
29
|
'target-company-state',
|
|
29
30
|
]);
|
|
30
|
-
expect(isProtectedBranch('current-company-state')).toBe(true);
|
|
31
|
-
expect(isProtectedBranch('someone/draft')).toBe(false);
|
|
31
|
+
expect(isProtectedBranch(currentBranchModel(), 'current-company-state')).toBe(true);
|
|
32
|
+
expect(isProtectedBranch(currentBranchModel(), 'someone/draft')).toBe(false);
|
|
32
33
|
});
|
|
33
34
|
|
|
34
35
|
it('accepts the comma/space list the environment supplies', () => {
|
|
@@ -37,10 +38,10 @@ describe('configureBranchModel', () => {
|
|
|
37
38
|
});
|
|
38
39
|
|
|
39
40
|
it('derives display names from the slug', () => {
|
|
40
|
-
expect(protectedBranchDisplayName('target-company-state')).toBe('Target company state');
|
|
41
|
+
expect(protectedBranchDisplayName(currentBranchModel(), 'target-company-state')).toBe('Target company state');
|
|
41
42
|
// Unknown names return null so the caller decides between the raw slug and
|
|
42
43
|
// hiding the affordance — it must not invent a name for a feature branch.
|
|
43
|
-
expect(protectedBranchDisplayName('someone/draft')).toBeNull();
|
|
44
|
+
expect(protectedBranchDisplayName(currentBranchModel(), 'someone/draft')).toBeNull();
|
|
44
45
|
});
|
|
45
46
|
|
|
46
47
|
/**
|
|
@@ -74,6 +75,6 @@ describe('configureBranchModel', () => {
|
|
|
74
75
|
configureBranchModel({ defaultBranch: 'nope', protectedBranches: ['other'] }),
|
|
75
76
|
).toThrow();
|
|
76
77
|
expect(DEFAULT_BRANCH).toBe('target-company-state');
|
|
77
|
-
expect(isProtectedBranch('target-company-state')).toBe(true);
|
|
78
|
+
expect(isProtectedBranch(currentBranchModel(), 'target-company-state')).toBe(true);
|
|
78
79
|
});
|
|
79
80
|
});
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DEFAULT_KB_LAYOUT,
|
|
3
|
+
resolveBranchModel,
|
|
4
|
+
type BranchModel,
|
|
5
|
+
type KbLayout,
|
|
6
|
+
} from '@bevel-software/platform-shared';
|
|
7
|
+
import { KbContext } from '../shared/kb-context.js';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* The knowledge-base context suites hand to the services they construct: the
|
|
11
|
+
* historical two-branch pair `vitest.config.ts` pins (and `test-setup.ts`
|
|
12
|
+
* mirrors onto the shared bindings, for the fixtures that still spell a
|
|
13
|
+
* branch by its binding), the default layout, and `knowledge-base` as the
|
|
14
|
+
* checkout folder. Override any part for a suite that needs another.
|
|
15
|
+
*/
|
|
16
|
+
export const TEST_BRANCH_MODEL: BranchModel = {
|
|
17
|
+
defaultBranch: 'target-company-state',
|
|
18
|
+
protectedBranches: ['current-company-state', 'target-company-state'],
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export function testKbContext(
|
|
22
|
+
overrides: { kbDirName?: string; branchModel?: BranchModel | null; layout?: KbLayout } = {},
|
|
23
|
+
): KbContext {
|
|
24
|
+
const model = overrides.branchModel === undefined ? TEST_BRANCH_MODEL : overrides.branchModel;
|
|
25
|
+
return new KbContext(
|
|
26
|
+
overrides.kbDirName ?? 'knowledge-base',
|
|
27
|
+
model === null ? KbContext.branchModelOrUnconfigured({ defaultBranch: '', protectedBranches: [] }) : resolveBranchModel(model),
|
|
28
|
+
overrides.layout ?? DEFAULT_KB_LAYOUT,
|
|
29
|
+
);
|
|
30
|
+
}
|
|
@@ -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
|
/**
|