@bevel-software/platform-core-backend 0.19.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 +45 -105
- package/dist/core/create-core-server.js.map +1 -1
- package/dist/core/create-core-services.d.ts +33 -5
- package/dist/core/create-core-services.d.ts.map +1 -1
- package/dist/core/create-core-services.js +146 -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.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/audit/agent-audit.service.d.ts +54 -0
- package/dist/modules/audit/agent-audit.service.d.ts.map +1 -0
- package/dist/modules/audit/agent-audit.service.js +290 -0
- package/dist/modules/audit/agent-audit.service.js.map +1 -0
- package/dist/modules/audit/agent-rest-audit.middleware.d.ts +40 -0
- package/dist/modules/audit/agent-rest-audit.middleware.d.ts.map +1 -0
- package/dist/modules/audit/agent-rest-audit.middleware.js +75 -0
- package/dist/modules/audit/agent-rest-audit.middleware.js.map +1 -0
- package/dist/modules/audit/audit.contract.d.ts +145 -0
- package/dist/modules/audit/audit.contract.d.ts.map +1 -0
- package/dist/modules/audit/audit.contract.js +35 -0
- package/dist/modules/audit/audit.contract.js.map +1 -0
- package/dist/modules/audit/audit.routes.d.ts +21 -0
- package/dist/modules/audit/audit.routes.d.ts.map +1 -0
- package/dist/modules/audit/audit.routes.js +157 -0
- package/dist/modules/audit/audit.routes.js.map +1 -0
- package/dist/modules/audit/event-classifier.d.ts +52 -0
- package/dist/modules/audit/event-classifier.d.ts.map +1 -0
- package/dist/modules/audit/event-classifier.js +123 -0
- package/dist/modules/audit/event-classifier.js.map +1 -0
- package/dist/modules/audit/index.d.ts +7 -0
- package/dist/modules/audit/index.d.ts.map +1 -0
- package/dist/modules/audit/index.js +7 -0
- package/dist/modules/audit/index.js.map +1 -0
- package/dist/modules/audit/request-audit.d.ts +57 -0
- package/dist/modules/audit/request-audit.d.ts.map +1 -0
- package/dist/modules/audit/request-audit.js +117 -0
- package/dist/modules/audit/request-audit.js.map +1 -0
- 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/core-schema.d.ts +414 -0
- package/dist/modules/database/core-schema.d.ts.map +1 -1
- package/dist/modules/database/core-schema.js +99 -0
- package/dist/modules/database/core-schema.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/diff/diff.service.d.ts.map +1 -1
- package/dist/modules/diff/diff.service.js +6 -1
- package/dist/modules/diff/diff.service.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/kb-fs/git-guarded-filesystem.d.ts +9 -1
- package/dist/modules/kb-fs/git-guarded-filesystem.d.ts.map +1 -1
- package/dist/modules/kb-fs/git-guarded-filesystem.js +16 -3
- package/dist/modules/kb-fs/git-guarded-filesystem.js.map +1 -1
- package/dist/modules/mcp/mcp-auth.middleware.d.ts +1 -0
- package/dist/modules/mcp/mcp-auth.middleware.d.ts.map +1 -1
- package/dist/modules/mcp/mcp-auth.middleware.js +32 -0
- package/dist/modules/mcp/mcp-auth.middleware.js.map +1 -1
- package/dist/modules/mcp/mcp.routes.d.ts.map +1 -1
- package/dist/modules/mcp/mcp.routes.js +8 -1
- package/dist/modules/mcp/mcp.routes.js.map +1 -1
- package/dist/modules/mcp/mcp.service.d.ts +16 -1
- package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
- package/dist/modules/mcp/mcp.service.js +52 -9
- package/dist/modules/mcp/mcp.service.js.map +1 -1
- package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts +59 -0
- package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts.map +1 -1
- package/dist/modules/mcp/oauth/bevel-oauth-provider.js +180 -8
- package/dist/modules/mcp/oauth/bevel-oauth-provider.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 +22 -10
- package/dist/modules/settings/deployment-settings.service.d.ts.map +1 -1
- package/dist/modules/settings/deployment-settings.service.js +52 -28
- 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-auth/external-api-key.interface.d.ts +21 -5
- package/dist/modules/tool-auth/external-api-key.interface.d.ts.map +1 -1
- package/dist/modules/tool-auth/external-api-key.interface.js.map +1 -1
- package/dist/modules/tool-auth/external-api-key.service.d.ts +1 -0
- package/dist/modules/tool-auth/external-api-key.service.d.ts.map +1 -1
- package/dist/modules/tool-auth/external-api-key.service.js +22 -9
- package/dist/modules/tool-auth/external-api-key.service.js.map +1 -1
- package/dist/modules/tool-auth/internal-token.service.d.ts +10 -0
- package/dist/modules/tool-auth/internal-token.service.d.ts.map +1 -1
- package/dist/modules/tool-auth/internal-token.service.js +1 -0
- package/dist/modules/tool-auth/internal-token.service.js.map +1 -1
- package/dist/modules/tool-auth/tool-auth.middleware.d.ts +8 -0
- package/dist/modules/tool-auth/tool-auth.middleware.d.ts.map +1 -1
- package/dist/modules/tool-auth/tool-auth.middleware.js +9 -1
- package/dist/modules/tool-auth/tool-auth.middleware.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 +26 -12
- package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.service.js +41 -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 +69 -31
- 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-internals.d.ts +7 -1
- package/dist/shared/git-internals.d.ts.map +1 -1
- package/dist/shared/git-internals.js +67 -9
- package/dist/shared/git-internals.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 +41 -0
- package/migrations/0013_agent_identity_and_key_soft_delete.sql +29 -0
- package/migrations/meta/0012_snapshot.json +2247 -0
- package/migrations/meta/0013_snapshot.json +2259 -0
- package/migrations/meta/_journal.json +14 -0
- package/package.json +4 -4
- 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 +55 -106
- package/src/core/create-core-services.ts +193 -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/audit/__tests__/agent-audit.service.test.ts +370 -0
- package/src/modules/audit/__tests__/agent-rest-audit.middleware.test.ts +113 -0
- package/src/modules/audit/__tests__/audit.routes.test.ts +201 -0
- package/src/modules/audit/__tests__/event-classifier.test.ts +121 -0
- package/src/modules/audit/agent-audit.service.ts +316 -0
- package/src/modules/audit/agent-rest-audit.middleware.ts +83 -0
- package/src/modules/audit/audit.contract.ts +164 -0
- package/src/modules/audit/audit.routes.ts +168 -0
- package/src/modules/audit/event-classifier.ts +155 -0
- package/src/modules/audit/index.ts +14 -0
- package/src/modules/audit/request-audit.ts +141 -0
- 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/core-schema.ts +104 -0
- 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/diff/diff.service.ts +6 -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/kb-fs/git-guarded-filesystem.ts +16 -3
- package/src/modules/marketplace/__tests__/marketplace-repo.head.test.ts +2 -1
- package/src/modules/mcp/__tests__/bevel-oauth-provider.test.ts +183 -13
- package/src/modules/mcp/__tests__/mcp-auth.middleware.test.ts +60 -2
- package/src/modules/mcp/__tests__/mcp.routes.local-token.test.ts +24 -4
- package/src/modules/mcp/__tests__/mcp.routes.stateless.test.ts +1 -1
- package/src/modules/mcp/__tests__/mcp.service.test.ts +120 -3
- package/src/modules/mcp/mcp-auth.middleware.ts +31 -0
- package/src/modules/mcp/mcp.routes.ts +11 -1
- package/src/modules/mcp/mcp.service.ts +73 -8
- package/src/modules/mcp/oauth/bevel-oauth-provider.ts +184 -6
- 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 +59 -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 +68 -28
- 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-auth/__tests__/external-api-key.service.test.ts +29 -8
- package/src/modules/tool-auth/__tests__/internal-token.service.test.ts +6 -0
- package/src/modules/tool-auth/external-api-key.interface.ts +22 -5
- package/src/modules/tool-auth/external-api-key.service.ts +25 -8
- package/src/modules/tool-auth/internal-token.service.ts +11 -0
- package/src/modules/tool-auth/tool-auth.middleware.ts +17 -1
- 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 +144 -52
- 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 +39 -27
- package/src/modules/workspace/workspace.tools.ts +68 -31
- package/src/modules/workspace/write-denial.ts +7 -5
- package/src/shared/__tests__/git-internals.test.ts +41 -0
- package/src/shared/__tests__/kb-layout.plugin.test.ts +19 -16
- package/src/shared/git-internals.ts +61 -6
- package/src/shared/git.contract.ts +70 -8
- package/src/shared/kb-context.ts +130 -0
- package/src/shared/kb-layout.test.ts +37 -27
- package/src/shared/kb-layout.ts +4 -3
- package/src/shared/pending-proposals.ts +7 -4
- package/src/shared/redact-secret.ts +5 -5
- package/src/tenancy/__tests__/static-tenant-source.test.ts +177 -0
- package/src/tenancy/__tests__/tenant-host.test.ts +372 -0
- package/src/tenancy/__tests__/tenant-runtime.test.ts +221 -0
- package/src/tenancy/__tests__/tenant-secrets.test.ts +35 -0
- package/src/tenancy/index.ts +35 -0
- package/src/tenancy/static-tenant-source.ts +296 -0
- package/src/tenancy/tenant-host.ts +261 -0
- package/src/tenancy/tenant-runtime.ts +208 -0
- package/src/tenancy/tenant-secrets.ts +41 -0
- package/src/tenancy/tenant-source.contract.ts +59 -0
- package/dist/modules/access/access-errors.d.ts +0 -34
- package/dist/modules/access/access-errors.d.ts.map +0 -1
- package/dist/modules/access/access-errors.js +0 -40
- package/dist/modules/access/access-errors.js.map +0 -1
- package/dist/modules/access/access-splice.d.ts +0 -140
- package/dist/modules/access/access-splice.d.ts.map +0 -1
- package/dist/modules/access/access-splice.js +0 -389
- package/dist/modules/access/access-splice.js.map +0 -1
- package/dist/modules/access/group-files.d.ts +0 -83
- package/dist/modules/access/group-files.d.ts.map +0 -1
- package/dist/modules/access/group-files.js +0 -167
- package/dist/modules/access/group-files.js.map +0 -1
- package/dist/modules/access/kb-read-filter.d.ts +0 -41
- package/dist/modules/access/kb-read-filter.d.ts.map +0 -1
- package/dist/modules/access/kb-read-filter.js +0 -60
- package/dist/modules/access/kb-read-filter.js.map +0 -1
- package/dist/modules/access/render-roles-yaml.d.ts +0 -22
- package/dist/modules/access/render-roles-yaml.d.ts.map +0 -1
- package/dist/modules/access/render-roles-yaml.js +0 -56
- package/dist/modules/access/render-roles-yaml.js.map +0 -1
- package/dist/modules/access/roles-yaml-guard.d.ts +0 -56
- package/dist/modules/access/roles-yaml-guard.d.ts.map +0 -1
- package/dist/modules/access/roles-yaml-guard.js +0 -79
- package/dist/modules/access/roles-yaml-guard.js.map +0 -1
- package/dist/modules/diff/diff-paths.d.ts +0 -2
- package/dist/modules/diff/diff-paths.d.ts.map +0 -1
- package/dist/modules/diff/diff-paths.js +0 -9
- package/dist/modules/diff/diff-paths.js.map +0 -1
- package/dist/modules/groups/group-provision.service.d.ts +0 -130
- package/dist/modules/groups/group-provision.service.d.ts.map +0 -1
- package/dist/modules/groups/group-provision.service.js +0 -288
- package/dist/modules/groups/group-provision.service.js.map +0 -1
- package/dist/modules/groups/groups.contract.d.ts +0 -106
- package/dist/modules/groups/groups.contract.d.ts.map +0 -1
- package/dist/modules/groups/groups.contract.js +0 -36
- package/dist/modules/groups/groups.contract.js.map +0 -1
- package/dist/modules/groups/groups.routes.d.ts +0 -42
- package/dist/modules/groups/groups.routes.d.ts.map +0 -1
- package/dist/modules/groups/groups.routes.js +0 -379
- package/dist/modules/groups/groups.routes.js.map +0 -1
- package/dist/modules/groups/groups.service.d.ts +0 -60
- package/dist/modules/groups/groups.service.d.ts.map +0 -1
- package/dist/modules/groups/groups.service.js +0 -172
- package/dist/modules/groups/groups.service.js.map +0 -1
- package/dist/modules/groups/index.d.ts +0 -7
- package/dist/modules/groups/index.d.ts.map +0 -1
- package/dist/modules/groups/index.js +0 -6
- package/dist/modules/groups/index.js.map +0 -1
- package/dist/modules/groups/join-proposals.d.ts +0 -53
- package/dist/modules/groups/join-proposals.d.ts.map +0 -1
- package/dist/modules/groups/join-proposals.js +0 -67
- package/dist/modules/groups/join-proposals.js.map +0 -1
- package/dist/modules/groups/join-requests.service.d.ts +0 -81
- package/dist/modules/groups/join-requests.service.d.ts.map +0 -1
- package/dist/modules/groups/join-requests.service.js +0 -135
- package/dist/modules/groups/join-requests.service.js.map +0 -1
- package/dist/modules/mcp/mcp-session-store.d.ts +0 -74
- package/dist/modules/mcp/mcp-session-store.d.ts.map +0 -1
- package/dist/modules/mcp/mcp-session-store.js +0 -131
- package/dist/modules/mcp/mcp-session-store.js.map +0 -1
- package/dist/modules/workflow/file-change-notifier.d.ts +0 -38
- package/dist/modules/workflow/file-change-notifier.d.ts.map +0 -1
- package/dist/modules/workflow/file-change-notifier.js +0 -22
- package/dist/modules/workflow/file-change-notifier.js.map +0 -1
- package/dist/modules/workflow/git/branch-name.d.ts +0 -10
- package/dist/modules/workflow/git/branch-name.d.ts.map +0 -1
- package/dist/modules/workflow/git/branch-name.js +0 -76
- package/dist/modules/workflow/git/branch-name.js.map +0 -1
- package/dist/modules/workflow/git/clone-config.d.ts +0 -61
- package/dist/modules/workflow/git/clone-config.d.ts.map +0 -1
- package/dist/modules/workflow/git/clone-config.js +0 -69
- package/dist/modules/workflow/git/clone-config.js.map +0 -1
- package/dist/modules/workflow/git/mutex.d.ts +0 -11
- package/dist/modules/workflow/git/mutex.d.ts.map +0 -1
- package/dist/modules/workflow/git/mutex.js +0 -23
- package/dist/modules/workflow/git/mutex.js.map +0 -1
- package/dist/modules/workflow/locking-filesystem.d.ts +0 -137
- package/dist/modules/workflow/locking-filesystem.d.ts.map +0 -1
- package/dist/modules/workflow/locking-filesystem.js +0 -553
- package/dist/modules/workflow/locking-filesystem.js.map +0 -1
- package/dist/modules/workflow/read-only-filesystem.d.ts +0 -24
- package/dist/modules/workflow/read-only-filesystem.d.ts.map +0 -1
- package/dist/modules/workflow/read-only-filesystem.js +0 -39
- package/dist/modules/workflow/read-only-filesystem.js.map +0 -1
- package/dist/modules/workflow/workflow.errors.d.ts +0 -197
- package/dist/modules/workflow/workflow.errors.d.ts.map +0 -1
- package/dist/modules/workflow/workflow.errors.js +0 -298
- package/dist/modules/workflow/workflow.errors.js.map +0 -1
- package/dist/modules/workspace/bevel-ignore.d.ts +0 -30
- package/dist/modules/workspace/bevel-ignore.d.ts.map +0 -1
- package/dist/modules/workspace/bevel-ignore.js +0 -61
- package/dist/modules/workspace/bevel-ignore.js.map +0 -1
- package/dist/modules/workspace/kb-seed.interface.d.ts +0 -36
- package/dist/modules/workspace/kb-seed.interface.d.ts.map +0 -1
- package/dist/modules/workspace/kb-seed.interface.js +0 -2
- package/dist/modules/workspace/kb-seed.interface.js.map +0 -1
- package/dist/modules/workspace/kb-seed.service.d.ts +0 -125
- package/dist/modules/workspace/kb-seed.service.d.ts.map +0 -1
- package/dist/modules/workspace/kb-seed.service.js +0 -535
- package/dist/modules/workspace/kb-seed.service.js.map +0 -1
- package/dist/modules/workspace/plugins-migration.d.ts +0 -50
- package/dist/modules/workspace/plugins-migration.d.ts.map +0 -1
- package/dist/modules/workspace/plugins-migration.js +0 -379
- package/dist/modules/workspace/plugins-migration.js.map +0 -1
- package/dist/shared/fs-errors.d.ts +0 -8
- package/dist/shared/fs-errors.d.ts.map +0 -1
- package/dist/shared/fs-errors.js +0 -11
- package/dist/shared/fs-errors.js.map +0 -1
- package/dist/shared/fs-walk.d.ts +0 -23
- package/dist/shared/fs-walk.d.ts.map +0 -1
- package/dist/shared/fs-walk.js +0 -42
- package/dist/shared/fs-walk.js.map +0 -1
- package/dist/shared/hash-email.d.ts +0 -11
- package/dist/shared/hash-email.d.ts.map +0 -1
- package/dist/shared/hash-email.js +0 -14
- package/dist/shared/hash-email.js.map +0 -1
- package/dist/shared/kb-walk.d.ts +0 -52
- package/dist/shared/kb-walk.d.ts.map +0 -1
- package/dist/shared/kb-walk.js +0 -76
- package/dist/shared/kb-walk.js.map +0 -1
|
@@ -21,6 +21,8 @@ export {
|
|
|
21
21
|
} from './secrets-vault.contract.js';
|
|
22
22
|
export {
|
|
23
23
|
registerBevelSecretsVariableLoader,
|
|
24
|
+
unregisterBevelSecretsVariableLoader,
|
|
24
25
|
bevelSecretsLoaderConfig,
|
|
25
26
|
BEVEL_SECRETS_LOADER_TYPE,
|
|
27
|
+
DEFAULT_SECRETS_SCOPE,
|
|
26
28
|
} from './secrets-variable-loader.js';
|
|
@@ -18,29 +18,43 @@ const log = logger('secrets-vault');
|
|
|
18
18
|
* The `UtcpClient.create` path re-validates the whole config through the
|
|
19
19
|
* serializer registry, so a loader can't be handed in as a bare live object — it
|
|
20
20
|
* must round-trip through a registered serializer. We therefore put a plain
|
|
21
|
-
* descriptor `{ variable_loader_type, user_id }` in `load_variables_from`
|
|
22
|
-
* {@link bevelSecretsLoaderConfig}) and let the registered serializer
|
|
23
|
-
* live loader bound to the
|
|
24
|
-
*
|
|
25
|
-
*
|
|
21
|
+
* descriptor `{ variable_loader_type, user_id, scope }` in `load_variables_from`
|
|
22
|
+
* (via {@link bevelSecretsLoaderConfig}) and let the registered serializer
|
|
23
|
+
* rebuild a live loader bound to the vault registered under that scope.
|
|
24
|
+
*
|
|
25
|
+
* ONE VAULT PER SCOPE, NOT PER PROCESS. The serializer registry is UTCP's and
|
|
26
|
+
* process-wide, but a process can host several knowledge bases, each with a
|
|
27
|
+
* vault of its own, and a user id is only unique within one of them. So the
|
|
28
|
+
* descriptor names the scope its vault was registered under, and a loader
|
|
29
|
+
* reads through that vault alone: two knowledge bases whose users both stored
|
|
30
|
+
* `weather_WEATHER_KEY` never see each other's value. A single-tenant
|
|
31
|
+
* deployment registers under {@link DEFAULT_SECRETS_SCOPE} and names nothing.
|
|
32
|
+
* Swapping the vault backend (e.g. to a client's external secret manager) is
|
|
33
|
+
* just a different `ISecretsVaultService` passed to
|
|
34
|
+
* {@link registerBevelSecretsVariableLoader}.
|
|
26
35
|
*/
|
|
27
36
|
export const BEVEL_SECRETS_LOADER_TYPE = 'bevel_secrets';
|
|
28
37
|
|
|
38
|
+
/** The scope a deployment that hosts one knowledge base registers under. */
|
|
39
|
+
export const DEFAULT_SECRETS_SCOPE = 'default';
|
|
40
|
+
|
|
29
41
|
/**
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
42
|
+
* The vaults the reconstructed loaders read through, by scope. A composition
|
|
43
|
+
* root registers its vault before any client is built; a graph that is torn
|
|
44
|
+
* down unregisters it so a stale descriptor resolves nothing.
|
|
33
45
|
*/
|
|
34
|
-
|
|
46
|
+
const vaults = new Map<string, ISecretsVaultService>();
|
|
35
47
|
|
|
36
48
|
export class BevelSecretsVariableLoader implements VariableLoader {
|
|
37
49
|
readonly variable_loader_type = BEVEL_SECRETS_LOADER_TYPE;
|
|
38
50
|
readonly user_id: string;
|
|
51
|
+
readonly scope: string;
|
|
39
52
|
// VariableLoader is an open shape; allow arbitrary extra props.
|
|
40
53
|
[key: string]: unknown;
|
|
41
54
|
|
|
42
|
-
constructor(userId: string) {
|
|
55
|
+
constructor(userId: string, scope: string = DEFAULT_SECRETS_SCOPE) {
|
|
43
56
|
this.user_id = userId;
|
|
57
|
+
this.scope = scope;
|
|
44
58
|
}
|
|
45
59
|
|
|
46
60
|
/**
|
|
@@ -52,9 +66,10 @@ export class BevelSecretsVariableLoader implements VariableLoader {
|
|
|
52
66
|
* harvest a secret the user configured for a different manual.
|
|
53
67
|
*/
|
|
54
68
|
async get(effectiveKey: string): Promise<string | null> {
|
|
55
|
-
|
|
69
|
+
const vault = vaults.get(this.scope);
|
|
70
|
+
if (!vault || !this.user_id) return null;
|
|
56
71
|
try {
|
|
57
|
-
return await
|
|
72
|
+
return await vault.resolve(this.user_id, effectiveKey);
|
|
58
73
|
} catch (err) {
|
|
59
74
|
// Log the fault so a backend failure is distinguishable from a merely
|
|
60
75
|
// unset secret (resolve returning null) when troubleshooting.
|
|
@@ -66,15 +81,18 @@ export class BevelSecretsVariableLoader implements VariableLoader {
|
|
|
66
81
|
|
|
67
82
|
class BevelSecretsVariableLoaderSerializer extends Serializer<VariableLoader> {
|
|
68
83
|
toDict(obj: VariableLoader): Record<string, unknown> {
|
|
84
|
+
const loader = obj as BevelSecretsVariableLoader;
|
|
69
85
|
return {
|
|
70
86
|
variable_loader_type: BEVEL_SECRETS_LOADER_TYPE,
|
|
71
|
-
user_id:
|
|
87
|
+
user_id: loader.user_id ?? '',
|
|
88
|
+
scope: loader.scope ?? DEFAULT_SECRETS_SCOPE,
|
|
72
89
|
};
|
|
73
90
|
}
|
|
74
91
|
|
|
75
92
|
validateDict(obj: Record<string, unknown>): VariableLoader {
|
|
76
93
|
const userId = typeof obj.user_id === 'string' ? obj.user_id : '';
|
|
77
|
-
|
|
94
|
+
const scope = typeof obj.scope === 'string' && obj.scope ? obj.scope : DEFAULT_SECRETS_SCOPE;
|
|
95
|
+
return new BevelSecretsVariableLoader(userId, scope);
|
|
78
96
|
}
|
|
79
97
|
}
|
|
80
98
|
|
|
@@ -91,14 +109,26 @@ VariableLoaderSerializer.registerVariableLoader(
|
|
|
91
109
|
);
|
|
92
110
|
|
|
93
111
|
/**
|
|
94
|
-
* Bind the
|
|
95
|
-
*
|
|
112
|
+
* Bind the vault the loaders of `scope` read through. Called once per
|
|
113
|
+
* knowledge base at composition time; before it runs, loaders of that scope
|
|
114
|
+
* resolve to null.
|
|
96
115
|
*/
|
|
97
|
-
export function registerBevelSecretsVariableLoader(
|
|
98
|
-
|
|
116
|
+
export function registerBevelSecretsVariableLoader(
|
|
117
|
+
secretsVault: ISecretsVaultService,
|
|
118
|
+
scope: string = DEFAULT_SECRETS_SCOPE,
|
|
119
|
+
): void {
|
|
120
|
+
vaults.set(scope, secretsVault);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/** Forget a scope's vault — the last step of tearing a knowledge base's graph down. */
|
|
124
|
+
export function unregisterBevelSecretsVariableLoader(scope: string = DEFAULT_SECRETS_SCOPE): void {
|
|
125
|
+
vaults.delete(scope);
|
|
99
126
|
}
|
|
100
127
|
|
|
101
|
-
/**
|
|
102
|
-
|
|
103
|
-
|
|
128
|
+
/**
|
|
129
|
+
* The plain descriptor to place in a `UtcpClientConfig.load_variables_from`
|
|
130
|
+
* for a given user of the knowledge base registered under `scope`.
|
|
131
|
+
*/
|
|
132
|
+
export function bevelSecretsLoaderConfig(userId: string, scope: string = DEFAULT_SECRETS_SCOPE): Record<string, unknown> {
|
|
133
|
+
return { variable_loader_type: BEVEL_SECRETS_LOADER_TYPE, user_id: userId, scope };
|
|
104
134
|
}
|
|
@@ -3,7 +3,6 @@ import { logger } from '../../shared/logging.js';
|
|
|
3
3
|
|
|
4
4
|
const log = logger('secrets');
|
|
5
5
|
import { createHmac, randomBytes, timingSafeEqual } from 'node:crypto';
|
|
6
|
-
import { DEFAULT_BRANCH } from '@bevel-software/platform-shared';
|
|
7
6
|
import {
|
|
8
7
|
InvalidSecretError,
|
|
9
8
|
SecretNotFoundError,
|
|
@@ -17,11 +16,13 @@ import type { IToolManualService, ToolManualSummary, ToolVariable } from '../too
|
|
|
17
16
|
import type { IConnectionProbeService } from '../connection-probe/connection-probe.contract.js';
|
|
18
17
|
import { utcpNamespacedKey } from '../../shared/utcp-namespace.js';
|
|
19
18
|
import type { IAccessControl } from '../access/access-control.interface.js';
|
|
20
|
-
import {
|
|
19
|
+
import type { KbContext } from '../../shared/kb-context.js';
|
|
21
20
|
import '../auth/auth.middleware.js'; // Express Request augmentation (req.userId / req.userEmail)
|
|
22
21
|
|
|
23
22
|
export interface SecretsVaultRoutesDeps {
|
|
24
23
|
secretsVault: ISecretsVaultService;
|
|
24
|
+
/** The released branch's clone — where the `.tool` files the access verdicts are read from live. */
|
|
25
|
+
kb: Pick<KbContext, 'defaultWorkspaceId'>;
|
|
25
26
|
/** Source of `.tool` manuals + their declared variable scopes (default-branch catalog). */
|
|
26
27
|
toolManualService: IToolManualService;
|
|
27
28
|
/** Gates who may set a tool's ADMIN (shared) secrets — writers of the `.tool` file. */
|
|
@@ -79,16 +80,16 @@ export function isSafeReturnPath(returnTo: unknown): returnTo is string {
|
|
|
79
80
|
* `req.userId` — secrets are private per user. Mounted behind the JWT middleware.
|
|
80
81
|
*/
|
|
81
82
|
export function createSecretsVaultRoutes(deps: SecretsVaultRoutesDeps): express.Router {
|
|
82
|
-
const { secretsVault, toolManualService, accessControl, connectionProbe } = deps;
|
|
83
|
+
const { secretsVault, toolManualService, accessControl, connectionProbe, kb } = deps;
|
|
83
84
|
const router = express.Router();
|
|
84
85
|
// A FUNCTION, not a constant. Routers are constructed at boot, and on a
|
|
85
86
|
// deployment configured through the setup screen the branch model does not
|
|
86
|
-
// exist yet at that moment —
|
|
87
|
-
//
|
|
87
|
+
// exist yet at that moment — the default branch is still ''. The context
|
|
88
|
+
// learns it when setup applies the model, but only reads INSIDE a function
|
|
88
89
|
// body see it; a construction-time capture would keep handing an empty
|
|
89
90
|
// workspace id to the access resolver until the next restart ("Invalid
|
|
90
91
|
// workspace ID" on every /secrets/tools call).
|
|
91
|
-
const defaultWs = () =>
|
|
92
|
+
const defaultWs = () => kb.defaultWorkspaceId();
|
|
92
93
|
|
|
93
94
|
// The vault key = the exact key UTCP looks the var up under (doubles underscores
|
|
94
95
|
// in the manual namespace), so storage and resolution agree for snake_case ids.
|
|
@@ -84,6 +84,41 @@ describe('DeploymentSettingsService — precedence', () => {
|
|
|
84
84
|
});
|
|
85
85
|
});
|
|
86
86
|
|
|
87
|
+
describe('DeploymentSettingsService — a blank that means the default', () => {
|
|
88
|
+
/**
|
|
89
|
+
* The rule everywhere else: a blank field leaves a setting alone. The Audit
|
|
90
|
+
* log's retention window is the exception that declares itself — its
|
|
91
|
+
* readers already treat "unset" as the default, so clearing the field is
|
|
92
|
+
* the one way back to that default, and a blank saves as a clear.
|
|
93
|
+
*/
|
|
94
|
+
it('clears a blank-means-default setting on a blank save and leaves every other blank alone', async () => {
|
|
95
|
+
const { db, rows } = makeDb();
|
|
96
|
+
const settings = new DeploymentSettingsService(db, ENC_KEY);
|
|
97
|
+
await settings.save({ auditRetentionDays: '30', kbRepoUrl: 'https://example.com/stored.git' }, null);
|
|
98
|
+
expect(settings.resolve('auditRetentionDays')).toBe('30');
|
|
99
|
+
|
|
100
|
+
await settings.save({ auditRetentionDays: '', kbRepoUrl: '' }, null);
|
|
101
|
+
|
|
102
|
+
expect(settings.resolve('auditRetentionDays')).toBe('');
|
|
103
|
+
expect(settings.sourceOf('auditRetentionDays')).toBe('unset');
|
|
104
|
+
// The repository address was blank too, and blank still means "leave it".
|
|
105
|
+
expect(settings.resolve('kbRepoUrl')).toBe('https://example.com/stored.git');
|
|
106
|
+
expect(rows.some((r) => r.key === 'kbRepoUrl')).toBe(true);
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
it('holds the retention window to the same rule on save as the runtime reader does', async () => {
|
|
110
|
+
const { db } = makeDb();
|
|
111
|
+
const settings = new DeploymentSettingsService(db, ENC_KEY);
|
|
112
|
+
for (const bad of ['1.5', 'lots', 'ten days']) {
|
|
113
|
+
await expect(settings.save({ auditRetentionDays: bad }, null)).rejects.toBeInstanceOf(SettingsValidationError);
|
|
114
|
+
}
|
|
115
|
+
// A number of days, or zero / negative for "forever" — the reader's rule.
|
|
116
|
+
for (const ok of ['3650', '0', '-1', '99999']) {
|
|
117
|
+
await expect(settings.save({ auditRetentionDays: ok }, null)).resolves.toBeDefined();
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
|
|
87
122
|
describe('DeploymentSettingsService — secrets', () => {
|
|
88
123
|
it('stores the token as ciphertext and reads it back', async () => {
|
|
89
124
|
const { db, rows } = makeDb();
|
|
@@ -114,20 +149,12 @@ describe('DeploymentSettingsService — secrets', () => {
|
|
|
114
149
|
expect(token).not.toHaveProperty('value');
|
|
115
150
|
});
|
|
116
151
|
|
|
117
|
-
it('
|
|
152
|
+
it('keeps a stored token out of the process environment: git reads it per call', async () => {
|
|
118
153
|
const { db } = makeDb();
|
|
119
154
|
const settings = new DeploymentSettingsService(db, ENC_KEY);
|
|
120
155
|
await settings.save({ gitToken: 'ghp_fromsetup' }, null);
|
|
121
|
-
expect(process.env.GITHUB_TOKEN).
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
it('does not overwrite a git token the environment supplied', async () => {
|
|
125
|
-
process.env.GIT_TOKEN = 'ghp_fromenv';
|
|
126
|
-
process.env.GITHUB_TOKEN = 'ghp_fromenv';
|
|
127
|
-
const { db } = makeDb();
|
|
128
|
-
const settings = new DeploymentSettingsService(db, ENC_KEY);
|
|
129
|
-
settings.syncGitTokenEnv();
|
|
130
|
-
expect(process.env.GITHUB_TOKEN).toBe('ghp_fromenv');
|
|
156
|
+
expect(process.env.GITHUB_TOKEN).toBeUndefined();
|
|
157
|
+
expect(settings.resolve('gitToken')).toBe('ghp_fromsetup');
|
|
131
158
|
});
|
|
132
159
|
|
|
133
160
|
it('refuses to store a secret with no encryption key rather than writing plaintext', async () => {
|
|
@@ -493,3 +520,24 @@ describe('DeploymentSettingsService — validation', () => {
|
|
|
493
520
|
).toEqual([]);
|
|
494
521
|
});
|
|
495
522
|
});
|
|
523
|
+
|
|
524
|
+
describe('DeploymentSettingsService — an environment of its own', () => {
|
|
525
|
+
it('resolves the env-first layer from the environment it was given, not the process\'s', async () => {
|
|
526
|
+
process.env.KB_REPO_URL = 'https://host.example/leaks-into-every-tenant.git';
|
|
527
|
+
const { db } = makeDb();
|
|
528
|
+
const own = new DeploymentSettingsService(db, ENC_KEY, undefined, {
|
|
529
|
+
env: { KB_REPO_URL: 'https://github.com/acme/kb.git', GIT_USERNAME: 'oauth2' },
|
|
530
|
+
});
|
|
531
|
+
await own.load();
|
|
532
|
+
expect(own.resolve('kbRepoUrl')).toBe('https://github.com/acme/kb.git');
|
|
533
|
+
expect(own.sourceOf('kbRepoUrl')).toBe('env');
|
|
534
|
+
expect(own.resolve('gitUsername')).toBe('oauth2');
|
|
535
|
+
// What the given environment leaves out is not taken from the process either.
|
|
536
|
+
expect(own.resolve('gitToken')).toBe('');
|
|
537
|
+
expect(own.sourceOf('gitToken')).toBe('unset');
|
|
538
|
+
// A service built without one keeps reading the process, as before.
|
|
539
|
+
const shared = new DeploymentSettingsService(db, ENC_KEY);
|
|
540
|
+
await shared.load();
|
|
541
|
+
expect(shared.resolve('kbRepoUrl')).toBe('https://host.example/leaks-into-every-tenant.git');
|
|
542
|
+
});
|
|
543
|
+
});
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
rootFolderListerFor,
|
|
11
11
|
type GitRunner,
|
|
12
12
|
} from '../git-root-folders.js';
|
|
13
|
-
import type
|
|
13
|
+
import { NO_GIT_CREDENTIALS, type IGitRunner } from '../../../shared/git.contract.js';
|
|
14
14
|
|
|
15
15
|
const LISTING = {
|
|
16
16
|
url: 'https://example.com/acme/kb.git',
|
|
@@ -226,6 +226,7 @@ describe('rootFolderListerFor — the listing runs through the deployment git po
|
|
|
226
226
|
const outcomes = ['', 'KnowledgeBase\0Plugins\0'];
|
|
227
227
|
const port: IGitRunner = {
|
|
228
228
|
defaultTimeoutMs: 1000,
|
|
229
|
+
credentials: NO_GIT_CREDENTIALS,
|
|
229
230
|
run: (async (cwd: string, args: string[], opts: { env?: NodeJS.ProcessEnv; timeoutMs?: number } = {}) => {
|
|
230
231
|
calls.push({ cwd, args, opts });
|
|
231
232
|
return { stdout: outcomes.shift() ?? '', stderr: '' };
|
|
@@ -6,6 +6,7 @@ import { createSetupRoutes } from '../setup.routes.js';
|
|
|
6
6
|
import { DeploymentSettingsService } from '../deployment-settings.service.js';
|
|
7
7
|
import type { Database } from '../../database/connection.js';
|
|
8
8
|
import type { IAdminAccessService } from '../../admin/admin.interface.js';
|
|
9
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
9
10
|
|
|
10
11
|
/**
|
|
11
12
|
* A boot that survived an unreachable remote leaves the RUNNER standing on a
|
|
@@ -68,7 +69,7 @@ function listen(runner: { runAll(): Promise<void>; lastFailure(): string | null
|
|
|
68
69
|
});
|
|
69
70
|
app.use(
|
|
70
71
|
'/api',
|
|
71
|
-
createSetupRoutes(settings, { isAdmin: async () => true } as IAdminAccessService, runner),
|
|
72
|
+
createSetupRoutes(settings, { isAdmin: async () => true } as IAdminAccessService, runner, testKbContext()),
|
|
72
73
|
);
|
|
73
74
|
server = app.listen(0);
|
|
74
75
|
const { port } = server.address() as AddressInfo;
|
|
@@ -7,7 +7,7 @@ import path from 'node:path';
|
|
|
7
7
|
import { promisify } from 'node:util';
|
|
8
8
|
import express from 'express';
|
|
9
9
|
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
10
|
-
import {
|
|
10
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
11
11
|
import { createSetupRoutes } from '../setup.routes.js';
|
|
12
12
|
import { DeploymentSettingsService } from '../deployment-settings.service.js';
|
|
13
13
|
import { KbStartupRunner } from '../../workspace/startup/kb-startup-runner.js';
|
|
@@ -71,7 +71,6 @@ beforeEach(async () => {
|
|
|
71
71
|
afterEach(async () => {
|
|
72
72
|
server?.close();
|
|
73
73
|
server = null;
|
|
74
|
-
configureKbLayout({ ...DEFAULT_KB_LAYOUT });
|
|
75
74
|
for (const k of KB_ENV) {
|
|
76
75
|
const original = savedEnv[k];
|
|
77
76
|
if (original === undefined) delete process.env[k];
|
|
@@ -102,17 +101,20 @@ function boot() {
|
|
|
102
101
|
delete: () => ({ where: () => Promise.resolve() }),
|
|
103
102
|
} as unknown as Database;
|
|
104
103
|
const settings = new DeploymentSettingsService(db, ENC_KEY);
|
|
104
|
+
// ONE context for the step and the routes, as the composition root builds
|
|
105
|
+
// it: the completing save applies the admin's names to it, and the step
|
|
106
|
+
// reads them from it when the phase runs.
|
|
107
|
+
const kb = testKbContext();
|
|
105
108
|
const runner = new KbStartupRunner({
|
|
106
109
|
gitRunner: new NodeGitRunner(),
|
|
107
110
|
kbRepoUrl: () => upstream,
|
|
108
|
-
gitUsername: () => 'x-access-token',
|
|
109
111
|
workspacesRoot: path.join(root, 'workspaces'),
|
|
110
112
|
kbDirName: 'knowledge-base',
|
|
111
113
|
templateDir: defaultKbTemplateDir(),
|
|
112
114
|
defaultBranch: () => BRANCH,
|
|
113
115
|
protectedBranches: () => [BRANCH],
|
|
114
116
|
seedAdminEmails: ['admin@example.com'],
|
|
115
|
-
steps: [new TemplateFilesStep(new NodeFs())],
|
|
117
|
+
steps: [new TemplateFilesStep(new NodeFs(), kb)],
|
|
116
118
|
buildSeedTree: async () => [],
|
|
117
119
|
});
|
|
118
120
|
const app = express();
|
|
@@ -128,6 +130,7 @@ function boot() {
|
|
|
128
130
|
settings,
|
|
129
131
|
{ isAdmin: async () => true } as IAdminAccessService,
|
|
130
132
|
runner,
|
|
133
|
+
kb,
|
|
131
134
|
undefined,
|
|
132
135
|
// The save now proves the connection first; the remote here is local, so
|
|
133
136
|
// the stand-in answers for the host the stored address names.
|
|
@@ -9,6 +9,7 @@ import { OidcAuthProvider, oidcSettingsFrom } from '../../auth/oidc-auth-provide
|
|
|
9
9
|
import type { AuthService } from '../../auth/auth.service.js';
|
|
10
10
|
import type { Database } from '../../database/connection.js';
|
|
11
11
|
import type { IAdminAccessService } from '../../admin/admin.interface.js';
|
|
12
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
12
13
|
|
|
13
14
|
const ENC_KEY = 'kToAi8FXWDpDn3A6yQ/60O39bv05N7XzVOIu/0CJrFc=';
|
|
14
15
|
const ISSUER = 'https://login.example.com/tenant/v2.0';
|
|
@@ -118,6 +119,7 @@ function listen(opts: {
|
|
|
118
119
|
settings,
|
|
119
120
|
{ isAdmin: async () => opts.isAdmin ?? true } as IAdminAccessService,
|
|
120
121
|
{ runAll: async () => {} },
|
|
122
|
+
testKbContext(),
|
|
121
123
|
undefined,
|
|
122
124
|
// No repository in these suites, so the connection check is never reached.
|
|
123
125
|
async () => {
|
|
@@ -7,6 +7,7 @@ import { createSetupRoutes, type LastSyncStatus } from '../setup.routes.js';
|
|
|
7
7
|
import { DeploymentSettingsService } from '../deployment-settings.service.js';
|
|
8
8
|
import type { IAdminAccessService } from '../../admin/admin.interface.js';
|
|
9
9
|
import type { Database } from '../../database/connection.js';
|
|
10
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
10
11
|
|
|
11
12
|
/**
|
|
12
13
|
* The remote-sync facts on `GET /setup/status`: the address a hook calls and
|
|
@@ -41,6 +42,7 @@ function listen(isAdmin: boolean, last: LastSyncStatus | null) {
|
|
|
41
42
|
settings,
|
|
42
43
|
{ isAdmin: async () => isAdmin } as IAdminAccessService,
|
|
43
44
|
{ runAll: async () => {} },
|
|
45
|
+
testKbContext(),
|
|
44
46
|
{ url: 'https://hexis.example.test/api/sync', lastSync: () => last },
|
|
45
47
|
),
|
|
46
48
|
);
|
|
@@ -1,34 +1,10 @@
|
|
|
1
1
|
import type { Server as HttpServer } from 'node:http';
|
|
2
2
|
import type { AddressInfo } from 'node:net';
|
|
3
3
|
import express from 'express';
|
|
4
|
-
import { afterEach, beforeEach, describe, expect, it
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
configureBranchModel,
|
|
9
|
-
configureKbLayout,
|
|
10
|
-
currentKbLayout,
|
|
11
|
-
type KbLayout,
|
|
12
|
-
} from '@bevel-software/platform-shared';
|
|
13
|
-
|
|
14
|
-
/**
|
|
15
|
-
* test-setup configures the branch model from the environment, and nothing
|
|
16
|
-
* unconfigures it; a test that needs the first-run "no branch model yet" state
|
|
17
|
-
* says so here. Everything else is the real module.
|
|
18
|
-
*/
|
|
19
|
-
const branchModel = vi.hoisted(() => ({ pretendUnconfigured: false }));
|
|
20
|
-
vi.mock('@bevel-software/platform-shared', async (importOriginal) => {
|
|
21
|
-
const actual = await importOriginal<typeof import('@bevel-software/platform-shared')>();
|
|
22
|
-
return {
|
|
23
|
-
...actual,
|
|
24
|
-
isBranchModelConfigured: () => !branchModel.pretendUnconfigured && actual.isBranchModelConfigured(),
|
|
25
|
-
// Applying a model configures it, as the real module does.
|
|
26
|
-
configureBranchModel: (model: Parameters<typeof actual.configureBranchModel>[0]) => {
|
|
27
|
-
actual.configureBranchModel(model);
|
|
28
|
-
branchModel.pretendUnconfigured = false;
|
|
29
|
-
},
|
|
30
|
-
};
|
|
31
|
-
});
|
|
4
|
+
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
5
|
+
import type { KbLayout } from '@bevel-software/platform-shared';
|
|
6
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
7
|
+
import type { KbContext } from '../../../shared/kb-context.js';
|
|
32
8
|
import { createSetupRoutes } from '../setup.routes.js';
|
|
33
9
|
import { DeploymentSettingsService } from '../deployment-settings.service.js';
|
|
34
10
|
import type { Database } from '../../database/connection.js';
|
|
@@ -98,6 +74,12 @@ function listen(
|
|
|
98
74
|
runAll: () => Promise<void> = async () => {},
|
|
99
75
|
checkConnection?: (connection: RepositoryConnection) => Promise<ConnectionCheck>,
|
|
100
76
|
listFolders?: (listing: RootFolderListing) => Promise<string[] | null>,
|
|
77
|
+
/**
|
|
78
|
+
* The running graph's knowledge-base context, which the completing save
|
|
79
|
+
* applies the admin's names to. The default is a configured deployment; a
|
|
80
|
+
* suite that needs the first-run "no branch model yet" state passes its own.
|
|
81
|
+
*/
|
|
82
|
+
kb: KbContext = testKbContext(),
|
|
101
83
|
) {
|
|
102
84
|
const db = {
|
|
103
85
|
select: () => ({ from: () => Promise.resolve([]) }),
|
|
@@ -122,6 +104,7 @@ function listen(
|
|
|
122
104
|
// Default no-op: most suites never complete setup, so the runner is
|
|
123
105
|
// never reached. The completion-transition suite passes its own spy.
|
|
124
106
|
{ runAll },
|
|
107
|
+
kb,
|
|
125
108
|
undefined,
|
|
126
109
|
checkConnection,
|
|
127
110
|
listFolders,
|
|
@@ -129,7 +112,7 @@ function listen(
|
|
|
129
112
|
);
|
|
130
113
|
server = app.listen(0);
|
|
131
114
|
const { port } = server.address() as AddressInfo;
|
|
132
|
-
return { base: `http://127.0.0.1:${port}`, settings };
|
|
115
|
+
return { base: `http://127.0.0.1:${port}`, settings, kb };
|
|
133
116
|
}
|
|
134
117
|
|
|
135
118
|
const post = (base: string, path: string, body: unknown) =>
|
|
@@ -576,13 +559,13 @@ describe('POST /setup/settings — the completion transition and the KB startup
|
|
|
576
559
|
*/
|
|
577
560
|
describe('POST /setup/settings — the folder names on the completing save', () => {
|
|
578
561
|
const completing = { kbRepoUrl: 'https://example.com/acme/kb.git', gitToken: 'ghp_x' };
|
|
579
|
-
afterEach(() => configureKbLayout({ ...DEFAULT_KB_LAYOUT }));
|
|
580
562
|
|
|
581
563
|
it('applies them before the phase runs, and asks for no restart over them', async () => {
|
|
582
564
|
const seenByPhase: KbLayout[] = [];
|
|
565
|
+
const kb = testKbContext();
|
|
583
566
|
const { base } = listen(true, async () => {
|
|
584
|
-
seenByPhase.push(
|
|
585
|
-
}, connectedCheck().check);
|
|
567
|
+
seenByPhase.push(kb.layout);
|
|
568
|
+
}, connectedCheck().check, undefined, kb);
|
|
586
569
|
const res = await post(base, '/api/setup/settings', {
|
|
587
570
|
settings: { ...completing, knowledgeBaseDir: 'Docs', skillsDir: 'skills' },
|
|
588
571
|
});
|
|
@@ -592,35 +575,36 @@ describe('POST /setup/settings — the folder names on the completing save', ()
|
|
|
592
575
|
expect(body.restartRequired).toBe(false);
|
|
593
576
|
const applied = { knowledgeBaseDir: 'Docs', skillsDir: 'skills', pluginsDir: 'Plugins', agentsFile: 'AGENTS.md' };
|
|
594
577
|
expect(seenByPhase).toEqual([applied]);
|
|
595
|
-
expect(
|
|
578
|
+
expect(kb.layout).toEqual(applied);
|
|
596
579
|
});
|
|
597
580
|
|
|
598
581
|
it('applies names stored by an earlier, incomplete save', async () => {
|
|
599
582
|
const seenByPhase: KbLayout[] = [];
|
|
583
|
+
const kb = testKbContext();
|
|
600
584
|
const { base } = listen(true, async () => {
|
|
601
|
-
seenByPhase.push(
|
|
602
|
-
}, connectedCheck().check);
|
|
585
|
+
seenByPhase.push(kb.layout);
|
|
586
|
+
}, connectedCheck().check, undefined, kb);
|
|
603
587
|
await post(base, '/api/setup/settings', { settings: { pluginsDir: 'plugins' } });
|
|
604
|
-
expect(
|
|
588
|
+
expect(kb.layout.pluginsDir).toBe('Plugins');
|
|
605
589
|
await post(base, '/api/setup/settings', { settings: completing });
|
|
606
590
|
expect(seenByPhase[0]?.pluginsDir).toBe('plugins');
|
|
607
591
|
});
|
|
608
592
|
|
|
609
593
|
it('leaves them restart-to-apply once setup is complete', async () => {
|
|
610
|
-
const { base } = listen(true, undefined, connectedCheck().check);
|
|
594
|
+
const { base, kb } = listen(true, undefined, connectedCheck().check);
|
|
611
595
|
await post(base, '/api/setup/settings', { settings: completing });
|
|
612
596
|
const res = await post(base, '/api/setup/settings', { settings: { pluginsDir: 'plugins' } });
|
|
613
597
|
expect(res.status).toBe(200);
|
|
614
598
|
expect((await res.json()).restartRequired).toBe(true);
|
|
615
|
-
expect(
|
|
599
|
+
expect(kb.layout.pluginsDir).toBe('Plugins');
|
|
616
600
|
});
|
|
617
601
|
|
|
618
602
|
it('does not replace a layout the process already runs', async () => {
|
|
619
|
-
|
|
603
|
+
const kb = testKbContext({ layout: { knowledgeBaseDir: 'docs', skillsDir: 'skills', pluginsDir: 'plugins' } });
|
|
620
604
|
const seenByPhase: KbLayout[] = [];
|
|
621
605
|
const { base } = listen(true, async () => {
|
|
622
|
-
seenByPhase.push(
|
|
623
|
-
}, connectedCheck().check);
|
|
606
|
+
seenByPhase.push(kb.layout);
|
|
607
|
+
}, connectedCheck().check, undefined, kb);
|
|
624
608
|
const res = await post(base, '/api/setup/settings', {
|
|
625
609
|
settings: { ...completing, skillsDir: 'capabilities' },
|
|
626
610
|
});
|
|
@@ -634,10 +618,11 @@ describe('POST /setup/settings — the folder names on the completing save', ()
|
|
|
634
618
|
try {
|
|
635
619
|
const seenByPhase: KbLayout[] = [];
|
|
636
620
|
let fail = true;
|
|
621
|
+
const kb = testKbContext();
|
|
637
622
|
const { base } = listen(true, async () => {
|
|
638
|
-
seenByPhase.push(
|
|
623
|
+
seenByPhase.push(kb.layout);
|
|
639
624
|
if (fail) throw new Error('remote said no');
|
|
640
|
-
}, connectedCheck().check);
|
|
625
|
+
}, connectedCheck().check, undefined, kb);
|
|
641
626
|
const first = await post(base, '/api/setup/settings', {
|
|
642
627
|
settings: { ...completing, skillsDir: 'skills' },
|
|
643
628
|
});
|
|
@@ -650,7 +635,7 @@ describe('POST /setup/settings — the folder names on the completing save', ()
|
|
|
650
635
|
expect(body.complete).toBe(true);
|
|
651
636
|
expect(body.restartRequired).toBe(false);
|
|
652
637
|
expect(seenByPhase.map((l) => l.skillsDir)).toEqual(['skills', 'capabilities']);
|
|
653
|
-
expect(
|
|
638
|
+
expect(kb.layout.skillsDir).toBe('capabilities');
|
|
654
639
|
} finally {
|
|
655
640
|
console.error = consoleError;
|
|
656
641
|
}
|
|
@@ -671,16 +656,14 @@ describe('POST /setup/settings — the folder names on the completing save', ()
|
|
|
671
656
|
if (value === undefined) delete process.env[key];
|
|
672
657
|
else process.env[key] = value;
|
|
673
658
|
}
|
|
674
|
-
// Whatever the test applied, the rest of the worker runs on the pinned model.
|
|
675
|
-
configureBranchModel(branchModelFromEnv());
|
|
676
659
|
}
|
|
677
660
|
}
|
|
678
661
|
|
|
679
662
|
it('asks for no restart over a branch model the completing save also applied', () =>
|
|
680
663
|
withoutBranchEnv(async () => {
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
const { base } = listen(true, undefined, connectedCheck().check);
|
|
664
|
+
// A fresh deployment: no branch model yet, so the save applies the one it carries.
|
|
665
|
+
const fresh = testKbContext({ branchModel: null });
|
|
666
|
+
const { base, kb } = listen(true, undefined, connectedCheck().check, undefined, fresh);
|
|
684
667
|
const res = await post(base, '/api/setup/settings', {
|
|
685
668
|
settings: {
|
|
686
669
|
...completing,
|
|
@@ -693,9 +676,7 @@ describe('POST /setup/settings — the folder names on the completing save', ()
|
|
|
693
676
|
const body = await res.json();
|
|
694
677
|
expect(body.complete).toBe(true);
|
|
695
678
|
expect(body.restartRequired).toBe(false);
|
|
696
|
-
|
|
697
|
-
branchModel.pretendUnconfigured = false;
|
|
698
|
-
}
|
|
679
|
+
expect(kb.defaultBranch).toBe('production');
|
|
699
680
|
}));
|
|
700
681
|
|
|
701
682
|
it('still asks for a restart over a branch change once a branch model is in effect', () =>
|