@bevel-software/platform-core-backend 0.20.0 → 0.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/catalog-cache-invalidation.d.ts +7 -2
- package/dist/core/catalog-cache-invalidation.d.ts.map +1 -1
- package/dist/core/catalog-cache-invalidation.js +8 -9
- package/dist/core/catalog-cache-invalidation.js.map +1 -1
- package/dist/core/core-ports.d.ts +19 -0
- package/dist/core/core-ports.d.ts.map +1 -1
- package/dist/core/core-ports.js.map +1 -1
- package/dist/core/create-core-server.d.ts +2 -0
- package/dist/core/create-core-server.d.ts.map +1 -1
- package/dist/core/create-core-server.js +23 -105
- package/dist/core/create-core-server.js.map +1 -1
- package/dist/core/create-core-services.d.ts +30 -5
- package/dist/core/create-core-services.d.ts.map +1 -1
- package/dist/core/create-core-services.js +136 -81
- package/dist/core/create-core-services.js.map +1 -1
- package/dist/core/lifecycle.d.ts +74 -28
- package/dist/core/lifecycle.d.ts.map +1 -1
- package/dist/core/lifecycle.js +157 -20
- package/dist/core/lifecycle.js.map +1 -1
- package/dist/core/public-config.d.ts +5 -1
- package/dist/core/public-config.d.ts.map +1 -1
- package/dist/core/public-config.js +7 -5
- package/dist/core/public-config.js.map +1 -1
- package/dist/core-config.d.ts +95 -1
- package/dist/core-config.d.ts.map +1 -1
- package/dist/core-config.js +24 -8
- package/dist/core-config.js.map +1 -1
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -3
- package/dist/index.js.map +1 -1
- package/dist/modules/access/access-control.service.d.ts +18 -1
- package/dist/modules/access/access-control.service.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.js +19 -8
- package/dist/modules/access/access-control.service.js.map +1 -1
- package/dist/modules/access/access.routes.d.ts +2 -1
- package/dist/modules/access/access.routes.d.ts.map +1 -1
- package/dist/modules/access/access.routes.js +10 -10
- package/dist/modules/access/access.routes.js.map +1 -1
- package/dist/modules/access/change-read-gate.d.ts +6 -3
- package/dist/modules/access/change-read-gate.d.ts.map +1 -1
- package/dist/modules/access/change-read-gate.js +9 -6
- package/dist/modules/access/change-read-gate.js.map +1 -1
- package/dist/modules/access/creator-access.d.ts +4 -2
- package/dist/modules/access/creator-access.d.ts.map +1 -1
- package/dist/modules/access/creator-access.js +7 -4
- package/dist/modules/access/creator-access.js.map +1 -1
- package/dist/modules/agent-instructions/read-preamble.d.ts +2 -1
- package/dist/modules/agent-instructions/read-preamble.d.ts.map +1 -1
- package/dist/modules/agent-instructions/read-preamble.js +6 -9
- package/dist/modules/agent-instructions/read-preamble.js.map +1 -1
- package/dist/modules/auth/account-admission.d.ts +40 -0
- package/dist/modules/auth/account-admission.d.ts.map +1 -0
- package/dist/modules/auth/account-admission.js +17 -0
- package/dist/modules/auth/account-admission.js.map +1 -0
- package/dist/modules/auth/account.routes.d.ts.map +1 -1
- package/dist/modules/auth/account.routes.js +4 -1
- package/dist/modules/auth/account.routes.js.map +1 -1
- package/dist/modules/auth/auth.service.d.ts +19 -1
- package/dist/modules/auth/auth.service.d.ts.map +1 -1
- package/dist/modules/auth/auth.service.js +33 -1
- package/dist/modules/auth/auth.service.js.map +1 -1
- package/dist/modules/auth/oidc-auth-provider.d.ts.map +1 -1
- package/dist/modules/auth/oidc-auth-provider.js +9 -0
- package/dist/modules/auth/oidc-auth-provider.js.map +1 -1
- package/dist/modules/connection-probe/connection-probe.service.d.ts +13 -1
- package/dist/modules/connection-probe/connection-probe.service.d.ts.map +1 -1
- package/dist/modules/connection-probe/connection-probe.service.js +10 -2
- package/dist/modules/connection-probe/connection-probe.service.js.map +1 -1
- package/dist/modules/database/advisory-lock.d.ts +17 -0
- package/dist/modules/database/advisory-lock.d.ts.map +1 -1
- package/dist/modules/database/advisory-lock.js +24 -3
- package/dist/modules/database/advisory-lock.js.map +1 -1
- package/dist/modules/database/connection.d.ts +67 -2
- package/dist/modules/database/connection.d.ts.map +1 -1
- package/dist/modules/database/connection.js +118 -12
- package/dist/modules/database/connection.js.map +1 -1
- package/dist/modules/database/migrate.d.ts +1 -1
- package/dist/modules/database/migrate.d.ts.map +1 -1
- package/dist/modules/database/migrate.js +27 -3
- package/dist/modules/database/migrate.js.map +1 -1
- package/dist/modules/kb-fs/branch-name.d.ts +0 -1
- package/dist/modules/kb-fs/branch-name.d.ts.map +1 -1
- package/dist/modules/kb-fs/branch-name.js +3 -3
- package/dist/modules/kb-fs/branch-name.js.map +1 -1
- package/dist/modules/kb-fs/clone-config.d.ts +9 -8
- package/dist/modules/kb-fs/clone-config.d.ts.map +1 -1
- package/dist/modules/kb-fs/clone-config.js +14 -12
- package/dist/modules/kb-fs/clone-config.js.map +1 -1
- package/dist/modules/mcp/mcp.service.d.ts +7 -0
- package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
- package/dist/modules/mcp/mcp.service.js +4 -4
- package/dist/modules/mcp/mcp.service.js.map +1 -1
- package/dist/modules/plugins/compile/marketplace-compiler.service.d.ts +4 -4
- package/dist/modules/plugins/compile/marketplace-compiler.service.d.ts.map +1 -1
- package/dist/modules/plugins/compile/marketplace-compiler.service.js +7 -10
- package/dist/modules/plugins/compile/marketplace-compiler.service.js.map +1 -1
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.d.ts +4 -1
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.d.ts.map +1 -1
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.js +5 -3
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.js.map +1 -1
- package/dist/modules/plugins/discovery/kb-plugin-source.d.ts +6 -1
- package/dist/modules/plugins/discovery/kb-plugin-source.d.ts.map +1 -1
- package/dist/modules/plugins/discovery/kb-plugin-source.js +14 -9
- package/dist/modules/plugins/discovery/kb-plugin-source.js.map +1 -1
- package/dist/modules/plugins/discovery/native.source.d.ts +4 -1
- package/dist/modules/plugins/discovery/native.source.d.ts.map +1 -1
- package/dist/modules/plugins/discovery/native.source.js +4 -2
- package/dist/modules/plugins/discovery/native.source.js.map +1 -1
- package/dist/modules/plugins/index.d.ts +1 -1
- package/dist/modules/plugins/index.d.ts.map +1 -1
- package/dist/modules/plugins/index.js +1 -1
- package/dist/modules/plugins/index.js.map +1 -1
- package/dist/modules/plugins/join-request-jobs.service.d.ts +3 -1
- package/dist/modules/plugins/join-request-jobs.service.d.ts.map +1 -1
- package/dist/modules/plugins/join-request-jobs.service.js +6 -6
- package/dist/modules/plugins/join-request-jobs.service.js.map +1 -1
- package/dist/modules/plugins/join-requests.service.d.ts +3 -1
- package/dist/modules/plugins/join-requests.service.d.ts.map +1 -1
- package/dist/modules/plugins/join-requests.service.js +9 -8
- package/dist/modules/plugins/join-requests.service.js.map +1 -1
- package/dist/modules/plugins/plugin-links.d.ts +65 -10
- package/dist/modules/plugins/plugin-links.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-links.js +136 -31
- package/dist/modules/plugins/plugin-links.js.map +1 -1
- package/dist/modules/plugins/plugin-links.service.d.ts +107 -5
- package/dist/modules/plugins/plugin-links.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-links.service.js +151 -21
- package/dist/modules/plugins/plugin-links.service.js.map +1 -1
- package/dist/modules/plugins/plugin-provision.service.d.ts +10 -3
- package/dist/modules/plugins/plugin-provision.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-provision.service.js +33 -26
- package/dist/modules/plugins/plugin-provision.service.js.map +1 -1
- package/dist/modules/plugins/plugin-rename.service.d.ts +4 -2
- package/dist/modules/plugins/plugin-rename.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-rename.service.js +10 -12
- package/dist/modules/plugins/plugin-rename.service.js.map +1 -1
- package/dist/modules/plugins/plugins.routes.d.ts +3 -0
- package/dist/modules/plugins/plugins.routes.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.routes.js +45 -15
- package/dist/modules/plugins/plugins.routes.js.map +1 -1
- package/dist/modules/plugins/plugins.service.d.ts +4 -4
- package/dist/modules/plugins/plugins.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.service.js +7 -10
- package/dist/modules/plugins/plugins.service.js.map +1 -1
- package/dist/modules/plugins/teams.routes.d.ts +4 -1
- package/dist/modules/plugins/teams.routes.d.ts.map +1 -1
- package/dist/modules/plugins/teams.routes.js +11 -9
- package/dist/modules/plugins/teams.routes.js.map +1 -1
- package/dist/modules/secrets-vault/index.d.ts +1 -1
- package/dist/modules/secrets-vault/index.d.ts.map +1 -1
- package/dist/modules/secrets-vault/index.js +1 -1
- package/dist/modules/secrets-vault/index.js.map +1 -1
- package/dist/modules/secrets-vault/secrets-variable-loader.d.ts +29 -11
- package/dist/modules/secrets-vault/secrets-variable-loader.d.ts.map +1 -1
- package/dist/modules/secrets-vault/secrets-variable-loader.js +46 -21
- package/dist/modules/secrets-vault/secrets-variable-loader.js.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.routes.d.ts +3 -0
- package/dist/modules/secrets-vault/secrets-vault.routes.d.ts.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.routes.js +4 -6
- package/dist/modules/secrets-vault/secrets-vault.routes.js.map +1 -1
- package/dist/modules/settings/deployment-settings.service.d.ts +12 -8
- package/dist/modules/settings/deployment-settings.service.d.ts.map +1 -1
- package/dist/modules/settings/deployment-settings.service.js +20 -22
- package/dist/modules/settings/deployment-settings.service.js.map +1 -1
- package/dist/modules/settings/setup.routes.d.ts +9 -2
- package/dist/modules/settings/setup.routes.d.ts.map +1 -1
- package/dist/modules/settings/setup.routes.js +20 -14
- package/dist/modules/settings/setup.routes.js.map +1 -1
- package/dist/modules/skills/allowed-tools-check.d.ts +4 -3
- package/dist/modules/skills/allowed-tools-check.d.ts.map +1 -1
- package/dist/modules/skills/allowed-tools-check.js +8 -8
- package/dist/modules/skills/allowed-tools-check.js.map +1 -1
- package/dist/modules/skills/pending-skills.service.d.ts +3 -1
- package/dist/modules/skills/pending-skills.service.d.ts.map +1 -1
- package/dist/modules/skills/pending-skills.service.js +9 -6
- package/dist/modules/skills/pending-skills.service.js.map +1 -1
- package/dist/modules/skills/skill-access-requests.routes.d.ts +2 -1
- package/dist/modules/skills/skill-access-requests.routes.d.ts.map +1 -1
- package/dist/modules/skills/skill-access-requests.routes.js +6 -6
- package/dist/modules/skills/skill-access-requests.routes.js.map +1 -1
- package/dist/modules/skills/skills.routes.d.ts +4 -1
- package/dist/modules/skills/skills.routes.d.ts.map +1 -1
- package/dist/modules/skills/skills.routes.js +4 -4
- package/dist/modules/skills/skills.routes.js.map +1 -1
- package/dist/modules/skills/skills.service.d.ts +4 -2
- package/dist/modules/skills/skills.service.d.ts.map +1 -1
- package/dist/modules/skills/skills.service.js +13 -11
- package/dist/modules/skills/skills.service.js.map +1 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.d.ts +2 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.d.ts.map +1 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.js +6 -5
- package/dist/modules/tool-manuals/mcp-json-discovery.js.map +1 -1
- package/dist/modules/tool-manuals/mcp-server-edit.service.d.ts +4 -2
- package/dist/modules/tool-manuals/mcp-server-edit.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/mcp-server-edit.service.js +12 -10
- package/dist/modules/tool-manuals/mcp-server-edit.service.js.map +1 -1
- package/dist/modules/tool-manuals/pending-tools.service.d.ts +3 -1
- package/dist/modules/tool-manuals/pending-tools.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/pending-tools.service.js +19 -16
- package/dist/modules/tool-manuals/pending-tools.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-delete.service.d.ts +4 -2
- package/dist/modules/tool-manuals/tool-delete.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-delete.service.js +14 -12
- package/dist/modules/tool-manuals/tool-delete.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.routes.d.ts +3 -1
- package/dist/modules/tool-manuals/tool-manuals.routes.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.routes.js +7 -7
- package/dist/modules/tool-manuals/tool-manuals.routes.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts +4 -2
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.js +15 -12
- package/dist/modules/tool-manuals/tool-manuals.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts +3 -0
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.js +4 -6
- package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.d.ts +3 -2
- package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +1 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.js +9 -9
- package/dist/modules/workflow/agent-tools/workflow.tools.js.map +1 -1
- package/dist/modules/workflow/git/git.service.d.ts +11 -5
- package/dist/modules/workflow/git/git.service.d.ts.map +1 -1
- package/dist/modules/workflow/git/git.service.js +23 -14
- package/dist/modules/workflow/git/git.service.js.map +1 -1
- package/dist/modules/workflow/git/node-git-runner.d.ts +26 -2
- package/dist/modules/workflow/git/node-git-runner.d.ts.map +1 -1
- package/dist/modules/workflow/git/node-git-runner.js +35 -5
- package/dist/modules/workflow/git/node-git-runner.js.map +1 -1
- package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts.map +1 -1
- package/dist/modules/workflow/review-workflow/review-workflow.service.js +9 -4
- package/dist/modules/workflow/review-workflow/review-workflow.service.js.map +1 -1
- package/dist/modules/workflow/session-ontology.service.d.ts +6 -1
- package/dist/modules/workflow/session-ontology.service.d.ts.map +1 -1
- package/dist/modules/workflow/session-ontology.service.js +6 -2
- package/dist/modules/workflow/session-ontology.service.js.map +1 -1
- package/dist/modules/workflow/workflow.service.d.ts +8 -3
- package/dist/modules/workflow/workflow.service.d.ts.map +1 -1
- package/dist/modules/workflow/workflow.service.js +33 -23
- package/dist/modules/workflow/workflow.service.js.map +1 -1
- package/dist/modules/workspace/session-ontology.gate.d.ts +3 -1
- package/dist/modules/workspace/session-ontology.gate.d.ts.map +1 -1
- package/dist/modules/workspace/session-ontology.gate.js +3 -3
- package/dist/modules/workspace/session-ontology.gate.js.map +1 -1
- package/dist/modules/workspace/startup/kb-git.d.ts +4 -3
- package/dist/modules/workspace/startup/kb-git.d.ts.map +1 -1
- package/dist/modules/workspace/startup/kb-git.js +15 -13
- package/dist/modules/workspace/startup/kb-git.js.map +1 -1
- package/dist/modules/workspace/startup/kb-startup-runner.d.ts +5 -8
- package/dist/modules/workspace/startup/kb-startup-runner.d.ts.map +1 -1
- package/dist/modules/workspace/startup/kb-startup-runner.js +35 -38
- package/dist/modules/workspace/startup/kb-startup-runner.js.map +1 -1
- package/dist/modules/workspace/startup/steps/groups-to-plugins.step.d.ts +7 -1
- package/dist/modules/workspace/startup/steps/groups-to-plugins.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/groups-to-plugins.step.js +23 -16
- package/dist/modules/workspace/startup/steps/groups-to-plugins.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/personal-spaces.step.d.ts +7 -1
- package/dist/modules/workspace/startup/steps/personal-spaces.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/personal-spaces.step.js +12 -5
- package/dist/modules/workspace/startup/steps/personal-spaces.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/plugin-display-names.step.d.ts +7 -1
- package/dist/modules/workspace/startup/steps/plugin-display-names.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/plugin-display-names.step.js +12 -5
- package/dist/modules/workspace/startup/steps/plugin-display-names.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.d.ts +7 -1
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.js +12 -5
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/seed-tree.d.ts +4 -1
- package/dist/modules/workspace/startup/steps/seed-tree.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/seed-tree.js +14 -11
- package/dist/modules/workspace/startup/steps/seed-tree.js.map +1 -1
- package/dist/modules/workspace/startup/steps/template-files.step.d.ts +17 -3
- package/dist/modules/workspace/startup/steps/template-files.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/template-files.step.js +36 -30
- package/dist/modules/workspace/startup/steps/template-files.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/template-source.d.ts +6 -1
- package/dist/modules/workspace/startup/steps/template-source.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/template-source.js +10 -6
- package/dist/modules/workspace/startup/steps/template-source.js.map +1 -1
- package/dist/modules/workspace/workspace.routes.d.ts +2 -1
- package/dist/modules/workspace/workspace.routes.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.routes.js +8 -7
- package/dist/modules/workspace/workspace.routes.js.map +1 -1
- package/dist/modules/workspace/workspace.service.d.ts +18 -12
- package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.service.js +32 -28
- package/dist/modules/workspace/workspace.service.js.map +1 -1
- package/dist/modules/workspace/workspace.tools.d.ts +2 -1
- package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.tools.js +20 -18
- package/dist/modules/workspace/workspace.tools.js.map +1 -1
- package/dist/modules/workspace/write-denial.d.ts +3 -2
- package/dist/modules/workspace/write-denial.d.ts.map +1 -1
- package/dist/modules/workspace/write-denial.js +6 -5
- package/dist/modules/workspace/write-denial.js.map +1 -1
- package/dist/shared/git.contract.d.ts +52 -7
- package/dist/shared/git.contract.d.ts.map +1 -1
- package/dist/shared/git.contract.js +30 -8
- package/dist/shared/git.contract.js.map +1 -1
- package/dist/shared/kb-context.d.ts +76 -0
- package/dist/shared/kb-context.d.ts.map +1 -0
- package/dist/shared/kb-context.js +108 -0
- package/dist/shared/kb-context.js.map +1 -0
- package/dist/shared/kb-layout.d.ts +3 -2
- package/dist/shared/kb-layout.d.ts.map +1 -1
- package/dist/shared/kb-layout.js +4 -3
- package/dist/shared/kb-layout.js.map +1 -1
- package/dist/shared/kb-layout.test.js +35 -27
- package/dist/shared/kb-layout.test.js.map +1 -1
- package/dist/shared/pending-proposals.d.ts +4 -1
- package/dist/shared/pending-proposals.d.ts.map +1 -1
- package/dist/shared/pending-proposals.js +3 -4
- package/dist/shared/pending-proposals.js.map +1 -1
- package/dist/shared/redact-secret.d.ts +5 -5
- package/dist/shared/redact-secret.js +5 -5
- package/dist/tenancy/index.d.ts +13 -0
- package/dist/tenancy/index.d.ts.map +1 -0
- package/dist/tenancy/index.js +13 -0
- package/dist/tenancy/index.js.map +1 -0
- package/dist/tenancy/static-tenant-source.d.ts +98 -0
- package/dist/tenancy/static-tenant-source.d.ts.map +1 -0
- package/dist/tenancy/static-tenant-source.js +220 -0
- package/dist/tenancy/static-tenant-source.js.map +1 -0
- package/dist/tenancy/tenant-host.d.ts +80 -0
- package/dist/tenancy/tenant-host.d.ts.map +1 -0
- package/dist/tenancy/tenant-host.js +217 -0
- package/dist/tenancy/tenant-host.js.map +1 -0
- package/dist/tenancy/tenant-runtime.d.ts +91 -0
- package/dist/tenancy/tenant-runtime.d.ts.map +1 -0
- package/dist/tenancy/tenant-runtime.js +174 -0
- package/dist/tenancy/tenant-runtime.js.map +1 -0
- package/dist/tenancy/tenant-secrets.d.ts +24 -0
- package/dist/tenancy/tenant-secrets.d.ts.map +1 -0
- package/dist/tenancy/tenant-secrets.js +30 -0
- package/dist/tenancy/tenant-secrets.js.map +1 -0
- package/dist/tenancy/tenant-source.contract.d.ts +45 -0
- package/dist/tenancy/tenant-source.contract.d.ts.map +1 -0
- package/dist/tenancy/tenant-source.contract.js +21 -0
- package/dist/tenancy/tenant-source.contract.js.map +1 -0
- package/migrations/0000_core_init.sql +14 -14
- package/migrations/0003_deployment_settings.sql +1 -1
- package/migrations/0005_github_facade.sql +1 -1
- package/migrations/0012_agent_audit.sql +6 -6
- package/package.json +3 -3
- package/src/__tests__/branch-model.test.ts +7 -6
- package/src/__tests__/kb-context.ts +30 -0
- package/src/__tests__/kb-layout-config.test.ts +35 -30
- package/src/core/__tests__/catalog-cache-invalidation.test.ts +2 -1
- package/src/core/__tests__/lifecycle.test.ts +78 -1
- package/src/core/__tests__/public-config.test.ts +5 -1
- package/src/core/catalog-cache-invalidation.ts +16 -11
- package/src/core/core-ports.ts +19 -0
- package/src/core/create-core-server.ts +27 -106
- package/src/core/create-core-services.ts +180 -95
- package/src/core/lifecycle.ts +214 -29
- package/src/core/public-config.ts +8 -5
- package/src/core-config.ts +107 -8
- package/src/index.ts +25 -2
- package/src/modules/access/__tests__/access-control.admin-root-floor.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.batch.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.folder-governs.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.group-grant.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.overrides.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.proposal-branch.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.prospective.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.revoke.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.unknown-email.test.ts +2 -1
- package/src/modules/access/__tests__/change-read-gate.test.ts +13 -11
- package/src/modules/access/__tests__/creator-access.test.ts +3 -2
- package/src/modules/access/__tests__/roles.routes.test.ts +2 -1
- package/src/modules/access/access-control.service.ts +20 -6
- package/src/modules/access/access.routes.ts +10 -13
- package/src/modules/access/change-read-gate.ts +10 -4
- package/src/modules/access/creator-access.ts +7 -2
- package/src/modules/agent-instructions/__tests__/read-preamble.test.ts +13 -12
- package/src/modules/agent-instructions/read-preamble.ts +10 -12
- package/src/modules/auth/__tests__/account.routes.test.ts +15 -0
- package/src/modules/auth/__tests__/auth.service.test.ts +60 -0
- package/src/modules/auth/account-admission.ts +44 -0
- package/src/modules/auth/account.routes.ts +4 -1
- package/src/modules/auth/auth.service.ts +33 -1
- package/src/modules/auth/oidc-auth-provider.ts +9 -0
- package/src/modules/connection-probe/connection-probe.service.ts +7 -1
- package/src/modules/database/__tests__/advisory-lock.test.ts +23 -1
- package/src/modules/database/__tests__/connection.test.ts +98 -0
- package/src/modules/database/__tests__/migrations-unqualified.test.ts +32 -0
- package/src/modules/database/advisory-lock.ts +28 -4
- package/src/modules/database/connection.ts +143 -13
- package/src/modules/database/migrate.ts +48 -14
- package/src/modules/diff/__tests__/diff.service.seed-atomicity.test.ts +2 -1
- package/src/modules/diff/__tests__/diff.service.test.ts +2 -1
- package/src/modules/kb-fs/__tests__/branch-name.test.ts +6 -6
- package/src/modules/kb-fs/__tests__/clone-config.test.ts +24 -20
- package/src/modules/kb-fs/branch-name.ts +3 -3
- package/src/modules/kb-fs/clone-config.ts +15 -12
- package/src/modules/marketplace/__tests__/marketplace-repo.head.test.ts +2 -1
- package/src/modules/mcp/mcp.service.ts +11 -4
- package/src/modules/plugins/__tests__/bundle-dialect.e2e.test.ts +12 -11
- package/src/modules/plugins/__tests__/bundle-dialect.test.ts +2 -1
- package/src/modules/plugins/__tests__/compile-marketplace.test.ts +6 -4
- package/src/modules/plugins/__tests__/join-request-jobs.service.test.ts +2 -1
- package/src/modules/plugins/__tests__/join-requests.service.test.ts +2 -1
- package/src/modules/plugins/__tests__/plugin-creation-display-name.test.ts +4 -3
- package/src/modules/plugins/__tests__/plugin-index.service.test.ts +6 -4
- package/src/modules/plugins/__tests__/plugin-links.service.test.ts +220 -5
- package/src/modules/plugins/__tests__/plugin-provision.service.test.ts +3 -1
- package/src/modules/plugins/__tests__/plugin-rename.service.test.ts +7 -6
- package/src/modules/plugins/__tests__/plugins.routes.test.ts +11 -2
- package/src/modules/plugins/__tests__/teams.routes.test.ts +2 -1
- package/src/modules/plugins/compile/marketplace-compiler.service.ts +7 -9
- package/src/modules/plugins/discovery/__tests__/kb-plugin-source.test.ts +20 -16
- package/src/modules/plugins/discovery/bundle-dialect/bundle.source.ts +9 -2
- package/src/modules/plugins/discovery/kb-plugin-source.ts +15 -8
- package/src/modules/plugins/discovery/native.source.ts +4 -1
- package/src/modules/plugins/index.ts +1 -1
- package/src/modules/plugins/join-request-jobs.service.ts +8 -7
- package/src/modules/plugins/join-requests.service.ts +7 -7
- package/src/modules/plugins/plugin-links.service.ts +192 -19
- package/src/modules/plugins/plugin-links.ts +147 -27
- package/src/modules/plugins/plugin-provision.service.ts +54 -27
- package/src/modules/plugins/plugin-rename.service.ts +10 -10
- package/src/modules/plugins/plugins.routes.ts +45 -15
- package/src/modules/plugins/plugins.service.ts +7 -11
- package/src/modules/plugins/teams.routes.ts +16 -8
- package/src/modules/secrets-vault/__tests__/connect-pending.route.test.ts +7 -0
- package/src/modules/secrets-vault/__tests__/secrets-variable-loader.test.ts +40 -0
- package/src/modules/secrets-vault/__tests__/tool-owner-gate.route.test.ts +2 -0
- package/src/modules/secrets-vault/index.ts +2 -0
- package/src/modules/secrets-vault/secrets-variable-loader.ts +51 -21
- package/src/modules/secrets-vault/secrets-vault.routes.ts +7 -6
- package/src/modules/settings/__tests__/deployment-settings.service.test.ts +24 -11
- package/src/modules/settings/__tests__/git-root-folders.test.ts +2 -1
- package/src/modules/settings/__tests__/setup.routes.boot-failure.test.ts +2 -1
- package/src/modules/settings/__tests__/setup.routes.layout-phase.test.ts +7 -4
- package/src/modules/settings/__tests__/setup.routes.oidc.test.ts +2 -0
- package/src/modules/settings/__tests__/setup.routes.sync-status.test.ts +2 -0
- package/src/modules/settings/__tests__/setup.routes.test.ts +33 -52
- package/src/modules/settings/deployment-settings.service.ts +21 -20
- package/src/modules/settings/setup.routes.ts +26 -16
- package/src/modules/skills/__tests__/allowed-tools-check.test.ts +11 -10
- package/src/modules/skills/__tests__/allowed-tools-warn.tools.test.ts +4 -3
- package/src/modules/skills/__tests__/pending-skills.service.test.ts +3 -1
- package/src/modules/skills/__tests__/skill-access-requests.routes.test.ts +2 -1
- package/src/modules/skills/__tests__/skills.routes.warnings.test.ts +2 -1
- package/src/modules/skills/__tests__/skills.service.test.ts +3 -2
- package/src/modules/skills/allowed-tools-check.ts +7 -6
- package/src/modules/skills/pending-skills.service.ts +9 -8
- package/src/modules/skills/skill-access-requests.routes.ts +7 -7
- package/src/modules/skills/skills.routes.ts +4 -3
- package/src/modules/skills/skills.service.ts +13 -9
- package/src/modules/tool-helpers/__tests__/agent-roles-write.test.ts +3 -2
- package/src/modules/tool-helpers/__tests__/phase4-tools.test.ts +3 -2
- package/src/modules/tool-manuals/__tests__/mcp-json-discovery.test.ts +17 -12
- package/src/modules/tool-manuals/__tests__/mcp-server-edit.service.test.ts +2 -1
- package/src/modules/tool-manuals/__tests__/pending-tools.service.test.ts +4 -1
- package/src/modules/tool-manuals/__tests__/tool-delete.service.test.ts +2 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.archive.route.test.ts +2 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.cli.test.ts +5 -4
- package/src/modules/tool-manuals/__tests__/tool-manuals.detail.route.test.ts +2 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.invalid.routes.test.ts +4 -2
- package/src/modules/tool-manuals/__tests__/tool-manuals.invalid.test.ts +13 -5
- package/src/modules/tool-manuals/__tests__/tool-manuals.mcp-oauth.test.ts +2 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.restart.test.ts +9 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.service.test.ts +3 -2
- package/src/modules/tool-manuals/__tests__/tool-manuals.tools.test.ts +2 -0
- package/src/modules/tool-manuals/mcp-json-discovery.ts +6 -4
- package/src/modules/tool-manuals/mcp-server-edit.service.ts +13 -11
- package/src/modules/tool-manuals/pending-tools.service.ts +19 -16
- package/src/modules/tool-manuals/tool-delete.service.ts +13 -10
- package/src/modules/tool-manuals/tool-manuals.routes.ts +10 -8
- package/src/modules/tool-manuals/tool-manuals.service.ts +15 -13
- package/src/modules/tool-manuals/tool-manuals.tools.ts +7 -6
- package/src/modules/workflow/__tests__/apply-failure.test.ts +2 -1
- package/src/modules/workflow/__tests__/merge-announces-tree.test.ts +14 -26
- package/src/modules/workflow/__tests__/preserve-roles-yaml.test.ts +2 -1
- package/src/modules/workflow/__tests__/session-ontology.service.test.ts +3 -2
- package/src/modules/workflow/__tests__/workflow.routes.lock-path.test.ts +2 -1
- package/src/modules/workflow/__tests__/workflow.service.branch-in-use.test.ts +3 -10
- package/src/modules/workflow/__tests__/workflow.service.commitFileWhileLocked.test.ts +2 -1
- package/src/modules/workflow/__tests__/workflow.service.deleted-branch-sweep.test.ts +3 -10
- package/src/modules/workflow/__tests__/workflow.service.facade.test.ts +28 -27
- package/src/modules/workflow/__tests__/workflow.service.folder-proposals.test.ts +2 -1
- package/src/modules/workflow/__tests__/workflow.service.platform-restore.test.ts +2 -1
- package/src/modules/workflow/__tests__/workflow.service.read-gate.test.ts +3 -2
- package/src/modules/workflow/__tests__/workflow.service.releaseLock.test.ts +2 -1
- package/src/modules/workflow/__tests__/workflow.service.sync.test.ts +5 -4
- package/src/modules/workflow/__tests__/workflow.service.update-from-target.test.ts +2 -1
- package/src/modules/workflow/agent-tools/__tests__/workflow.tools.test.ts +2 -1
- package/src/modules/workflow/agent-tools/workflow.tools.ts +11 -9
- package/src/modules/workflow/git/__tests__/git.service.accessGating.test.ts +5 -4
- package/src/modules/workflow/git/__tests__/git.service.changedFilesForPr.test.ts +12 -11
- package/src/modules/workflow/git/__tests__/git.service.commitChanges.test.ts +9 -8
- package/src/modules/workflow/git/__tests__/git.service.commitFile.strayPath.test.ts +8 -7
- package/src/modules/workflow/git/__tests__/git.service.commitFile.test.ts +6 -5
- package/src/modules/workflow/git/__tests__/git.service.createBranch.test.ts +3 -2
- package/src/modules/workflow/git/__tests__/git.service.deleteBranch.test.ts +3 -2
- package/src/modules/workflow/git/__tests__/git.service.diffFileAtCommit.test.ts +7 -6
- package/src/modules/workflow/git/__tests__/git.service.diffFileBetweenBranches.test.ts +16 -15
- package/src/modules/workflow/git/__tests__/git.service.fileContentsAtCommit.test.ts +3 -2
- package/src/modules/workflow/git/__tests__/git.service.forkPoint.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.history-guards.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.list-branches.test.ts +10 -9
- package/src/modules/workflow/git/__tests__/git.service.listTrackedFiles.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.logForFile.test.ts +6 -5
- package/src/modules/workflow/git/__tests__/git.service.mergeChangeRequest.test.ts +9 -8
- package/src/modules/workflow/git/__tests__/git.service.pendingChanges.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.postMergePull.test.ts +4 -3
- package/src/modules/workflow/git/__tests__/git.service.pull.test.ts +9 -8
- package/src/modules/workflow/git/__tests__/git.service.readFileAtRef.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.revertPathsAndPush.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.status.test.ts +4 -3
- package/src/modules/workflow/git/__tests__/git.service.syncFromRemote.test.ts +8 -7
- package/src/modules/workflow/git/__tests__/node-git-runner.test.ts +41 -3
- package/src/modules/workflow/git/git.service.ts +24 -13
- package/src/modules/workflow/git/node-git-runner.ts +37 -4
- package/src/modules/workflow/review-workflow/review-workflow.service.ts +9 -6
- package/src/modules/workflow/session-ontology.service.ts +7 -2
- package/src/modules/workflow/workflow.service.ts +31 -24
- package/src/modules/workspace/__tests__/file-stat-access.test.ts +3 -2
- package/src/modules/workspace/__tests__/git-internals.security.test.ts +10 -9
- package/src/modules/workspace/__tests__/session-ontology.gate.test.ts +4 -2
- package/src/modules/workspace/__tests__/workspace-paths-inside-the-repo.test.ts +3 -2
- package/src/modules/workspace/__tests__/workspace.routes.branch-errors.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.create-grant.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.delete.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.download-implies-read.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.download.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.file-writes.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.folders.test.ts +5 -4
- package/src/modules/workspace/__tests__/workspace.routes.move-platform-files.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.read-gate.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.service.ensure-remotes-fetched.test.ts +2 -2
- package/src/modules/workspace/__tests__/workspace.service.list-cloned.test.ts +6 -5
- package/src/modules/workspace/__tests__/workspace.service.move-never-overwrites.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.service.read-filter.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.service.test.ts +84 -50
- package/src/modules/workspace/__tests__/workspace.service.unknown-branch.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.tools.agents-file.test.ts +10 -7
- package/src/modules/workspace/__tests__/workspace.tools.branch-errors.test.ts +4 -3
- package/src/modules/workspace/__tests__/workspace.tools.test.ts +9 -8
- package/src/modules/workspace/__tests__/write-denial.test.ts +5 -4
- package/src/modules/workspace/session-ontology.gate.ts +6 -4
- package/src/modules/workspace/startup/__tests__/kb-startup-runner.degraded.test.ts +6 -2
- package/src/modules/workspace/startup/__tests__/kb-startup-runner.test.ts +29 -21
- package/src/modules/workspace/startup/kb-git.ts +15 -22
- package/src/modules/workspace/startup/kb-startup-runner.ts +40 -46
- package/src/modules/workspace/startup/steps/__tests__/steps.test.ts +104 -98
- package/src/modules/workspace/startup/steps/groups-to-plugins.step.ts +24 -16
- package/src/modules/workspace/startup/steps/personal-spaces.step.ts +14 -5
- package/src/modules/workspace/startup/steps/plugin-display-names.step.ts +13 -5
- package/src/modules/workspace/startup/steps/plugin-manifests.step.ts +14 -5
- package/src/modules/workspace/startup/steps/seed-tree.ts +11 -9
- package/src/modules/workspace/startup/steps/template-files.step.ts +43 -34
- package/src/modules/workspace/startup/steps/template-source.ts +8 -5
- package/src/modules/workspace/workspace.routes.ts +8 -7
- package/src/modules/workspace/workspace.service.ts +30 -27
- package/src/modules/workspace/workspace.tools.ts +21 -20
- package/src/modules/workspace/write-denial.ts +7 -5
- package/src/shared/__tests__/kb-layout.plugin.test.ts +19 -16
- package/src/shared/git.contract.ts +70 -8
- package/src/shared/kb-context.ts +130 -0
- package/src/shared/kb-layout.test.ts +37 -27
- package/src/shared/kb-layout.ts +4 -3
- package/src/shared/pending-proposals.ts +7 -4
- package/src/shared/redact-secret.ts +5 -5
- package/src/tenancy/__tests__/static-tenant-source.test.ts +177 -0
- package/src/tenancy/__tests__/tenant-host.test.ts +372 -0
- package/src/tenancy/__tests__/tenant-runtime.test.ts +221 -0
- package/src/tenancy/__tests__/tenant-secrets.test.ts +35 -0
- package/src/tenancy/index.ts +35 -0
- package/src/tenancy/static-tenant-source.ts +296 -0
- package/src/tenancy/tenant-host.ts +261 -0
- package/src/tenancy/tenant-runtime.ts +208 -0
- package/src/tenancy/tenant-secrets.ts +41 -0
- package/src/tenancy/tenant-source.contract.ts +59 -0
|
@@ -2,7 +2,8 @@ import express from 'express';
|
|
|
2
2
|
import { afterEach, describe, expect, it } from 'vitest';
|
|
3
3
|
import { join } from 'node:path';
|
|
4
4
|
import { tmpdir } from 'node:os';
|
|
5
|
-
import { DEFAULT_KB_LAYOUT
|
|
5
|
+
import { DEFAULT_KB_LAYOUT } from '@bevel-software/platform-shared';
|
|
6
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
6
7
|
import { ToolRegistry } from '../../tool-registry/tool-registry.js';
|
|
7
8
|
import { createToolHandlerFactory } from '../../tool-helpers/tool-handler.js';
|
|
8
9
|
import type { ToolAuth } from '../../tool-auth/tool-auth.middleware.js';
|
|
@@ -24,6 +25,8 @@ import { registerWorkspaceTools } from '../workspace.tools.js';
|
|
|
24
25
|
* for it.
|
|
25
26
|
*/
|
|
26
27
|
const KB_DIR = 'knowledge-base';
|
|
28
|
+
/** The context the tools read; a case applies a deployment's own names to it. */
|
|
29
|
+
const kb = testKbContext({ kbDirName: KB_DIR });
|
|
27
30
|
|
|
28
31
|
/** Every workspace tool's description, keyed by name, under the layout in effect. */
|
|
29
32
|
async function descriptions(registry: ToolRegistry = new ToolRegistry()): Promise<Map<string, string>> {
|
|
@@ -37,11 +40,11 @@ async function descriptions(registry: ToolRegistry = new ToolRegistry()): Promis
|
|
|
37
40
|
new SpillStore(join(tmpdir(), 'bevel-test-spills')),
|
|
38
41
|
new DocExtractService(join(tmpdir(), 'bevel-test-doc-extract')),
|
|
39
42
|
{} as unknown as IAccessControl,
|
|
40
|
-
|
|
43
|
+
kb,
|
|
41
44
|
{
|
|
42
45
|
service: {} as never,
|
|
43
46
|
enabled: false,
|
|
44
|
-
|
|
47
|
+
kb,
|
|
45
48
|
recoveryBotEmail: 'recovery-bot@bevel.local',
|
|
46
49
|
hooks: new WorkflowHooks(),
|
|
47
50
|
},
|
|
@@ -57,7 +60,7 @@ async function listed(registry: ToolRegistry): Promise<Map<string, string>> {
|
|
|
57
60
|
return new Map(tools.map((t) => [t.name, t.description ?? '']));
|
|
58
61
|
}
|
|
59
62
|
|
|
60
|
-
afterEach(() =>
|
|
63
|
+
afterEach(() => kb.applyLayout({ ...DEFAULT_KB_LAYOUT }));
|
|
61
64
|
|
|
62
65
|
describe('the conventions note every workspace tool carries', () => {
|
|
63
66
|
it('names AGENTS.md, and CLAUDE.md beside it, under the default name', async () => {
|
|
@@ -71,7 +74,7 @@ describe('the conventions note every workspace tool carries', () => {
|
|
|
71
74
|
});
|
|
72
75
|
|
|
73
76
|
it('names the configured file first and the organisation\'s own AGENTS.md second', async () => {
|
|
74
|
-
|
|
77
|
+
kb.applyLayout({ ...DEFAULT_KB_LAYOUT, agentsFile: 'HEXIS.md' });
|
|
75
78
|
const byName = await descriptions();
|
|
76
79
|
const note = byName.get('grep') ?? '';
|
|
77
80
|
expect(note).toContain('read `HEXIS.md` at the KB root, then `AGENTS.md` if it also exists');
|
|
@@ -83,7 +86,7 @@ describe('the conventions note every workspace tool carries', () => {
|
|
|
83
86
|
});
|
|
84
87
|
|
|
85
88
|
it('describes the platform files under the configured name, and no longer under AGENTS.md', async () => {
|
|
86
|
-
|
|
89
|
+
kb.applyLayout({ ...DEFAULT_KB_LAYOUT, agentsFile: 'HEXIS.md' });
|
|
87
90
|
const byName = await descriptions();
|
|
88
91
|
const stat = byName.get('file_stat') ?? '';
|
|
89
92
|
expect(stat).toContain('`access.md`, `roles.yaml`, `.bevelignore`, `HEXIS.md`');
|
|
@@ -117,7 +120,7 @@ describe('the conventions note every workspace tool carries', () => {
|
|
|
117
120
|
const atMount = await descriptions(registry);
|
|
118
121
|
expect(atMount.get('grep')).toContain('read `AGENTS.md` at the KB root');
|
|
119
122
|
|
|
120
|
-
|
|
123
|
+
kb.applyLayout({ ...DEFAULT_KB_LAYOUT, agentsFile: 'HEXIS.md' });
|
|
121
124
|
|
|
122
125
|
const now = await listed(registry);
|
|
123
126
|
expect(now.get('grep')).toContain('read `HEXIS.md` at the KB root, then `AGENTS.md` if it also exists');
|
|
@@ -6,6 +6,7 @@ import { join } from 'node:path';
|
|
|
6
6
|
import { promisify } from 'node:util';
|
|
7
7
|
import express from 'express';
|
|
8
8
|
import { afterEach, describe, expect, it } from 'vitest';
|
|
9
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
9
10
|
import { NodeFs } from '../../kb-fs/node-fs.js';
|
|
10
11
|
import { ToolRegistry } from '../../tool-registry/tool-registry.js';
|
|
11
12
|
import { createToolHandlerFactory } from '../../tool-helpers/tool-handler.js';
|
|
@@ -109,7 +110,7 @@ describe('workspace tools — a branch that cannot be opened', () => {
|
|
|
109
110
|
workspaces = new WorkspaceService(
|
|
110
111
|
workspacesRoot,
|
|
111
112
|
opts.repoUrl === 'unreachable' ? join(root, 'no-such-repo.git') : upstream,
|
|
112
|
-
KB_DIR,
|
|
113
|
+
testKbContext({ kbDirName: KB_DIR }),
|
|
113
114
|
new NodeFs(),
|
|
114
115
|
);
|
|
115
116
|
|
|
@@ -138,11 +139,11 @@ describe('workspace tools — a branch that cannot be opened', () => {
|
|
|
138
139
|
new SpillStore(spillRoot),
|
|
139
140
|
new DocExtractService(docCacheDir),
|
|
140
141
|
allowAll,
|
|
141
|
-
KB_DIR,
|
|
142
|
+
testKbContext({ kbDirName: KB_DIR }),
|
|
142
143
|
{
|
|
143
144
|
service: {} as never,
|
|
144
145
|
enabled: false,
|
|
145
|
-
kbDirName: KB_DIR,
|
|
146
|
+
kb: testKbContext({ kbDirName: KB_DIR }),
|
|
146
147
|
recoveryBotEmail: 'recovery-bot@bevel.local',
|
|
147
148
|
hooks: new WorkflowHooks(),
|
|
148
149
|
},
|
|
@@ -7,6 +7,7 @@ import { promisify } from 'node:util';
|
|
|
7
7
|
import AdmZip from 'adm-zip';
|
|
8
8
|
import express from 'express';
|
|
9
9
|
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
10
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
10
11
|
import { LocalFilesystem } from '@mastra/core/workspace';
|
|
11
12
|
import { ToolRegistry } from '../../tool-registry/tool-registry.js';
|
|
12
13
|
import { createToolHandlerFactory } from '../../tool-helpers/tool-handler.js';
|
|
@@ -218,10 +219,10 @@ async function start(
|
|
|
218
219
|
const app = express();
|
|
219
220
|
app.use(express.json());
|
|
220
221
|
const router = express.Router();
|
|
221
|
-
registerWorkspaceTools(registry, router, fakeAuth, toolHandler, new SpillStore(join(tmpdir(), 'bevel-test-spills')), new DocExtractService(docCacheDir), access, KB_DIR, {
|
|
222
|
+
registerWorkspaceTools(registry, router, fakeAuth, toolHandler, new SpillStore(join(tmpdir(), 'bevel-test-spills')), new DocExtractService(docCacheDir), access, testKbContext({ kbDirName: KB_DIR }), {
|
|
222
223
|
service: {} as never,
|
|
223
224
|
enabled: false, // these tests predate and don't exercise the ontology boundary
|
|
224
|
-
kbDirName: KB_DIR,
|
|
225
|
+
kb: testKbContext({ kbDirName: KB_DIR }),
|
|
225
226
|
recoveryBotEmail: 'recovery-bot@bevel.local',
|
|
226
227
|
hooks: new WorkflowHooks(),
|
|
227
228
|
}, writePolicy, {} as never /* sessionSink — start_session not exercised here */);
|
|
@@ -1831,8 +1832,8 @@ describe('start_session', () => {
|
|
|
1831
1832
|
const router = express.Router();
|
|
1832
1833
|
registerWorkspaceTools(
|
|
1833
1834
|
registry, router, auth, toolHandler,
|
|
1834
|
-
new SpillStore(join(tmpdir(), 'bevel-test-spills')), new DocExtractService(join(tmpdir(), 'bevel-test-doc-extract')), allowAll, KB_DIR,
|
|
1835
|
-
{ service: {} as never, enabled: false, kbDirName: KB_DIR, recoveryBotEmail: 'recovery-bot@bevel.local', hooks: new WorkflowHooks() },
|
|
1835
|
+
new SpillStore(join(tmpdir(), 'bevel-test-spills')), new DocExtractService(join(tmpdir(), 'bevel-test-doc-extract')), allowAll, testKbContext({ kbDirName: KB_DIR }),
|
|
1836
|
+
{ service: {} as never, enabled: false, kb: testKbContext({ kbDirName: KB_DIR }), recoveryBotEmail: 'recovery-bot@bevel.local', hooks: new WorkflowHooks() },
|
|
1836
1837
|
new RoutineWritePolicyService(),
|
|
1837
1838
|
sink ?? fakeSessionSink,
|
|
1838
1839
|
);
|
|
@@ -1956,8 +1957,8 @@ describe('start_session', () => {
|
|
|
1956
1957
|
const noopAuth: express.RequestHandler = (_req, _res, next) => next();
|
|
1957
1958
|
registerWorkspaceTools(
|
|
1958
1959
|
registry, router, noopAuth, (() => () => {}) as never,
|
|
1959
|
-
new SpillStore(join(tmpdir(), 'bevel-test-spills')), new DocExtractService(join(tmpdir(), 'bevel-test-doc-extract')), allowAll, KB_DIR,
|
|
1960
|
-
{ service: {} as never, enabled: false, kbDirName: KB_DIR, recoveryBotEmail: 'recovery-bot@bevel.local', hooks: new WorkflowHooks() },
|
|
1960
|
+
new SpillStore(join(tmpdir(), 'bevel-test-spills')), new DocExtractService(join(tmpdir(), 'bevel-test-doc-extract')), allowAll, testKbContext({ kbDirName: KB_DIR }),
|
|
1961
|
+
{ service: {} as never, enabled: false, kb: testKbContext({ kbDirName: KB_DIR }), recoveryBotEmail: 'recovery-bot@bevel.local', hooks: new WorkflowHooks() },
|
|
1961
1962
|
new RoutineWritePolicyService(),
|
|
1962
1963
|
{} as never,
|
|
1963
1964
|
);
|
|
@@ -1998,8 +1999,8 @@ describe('branch is a required parameter in the tool contract', () => {
|
|
|
1998
1999
|
new SpillStore(join(tmpdir(), 'bevel-test-spills')),
|
|
1999
2000
|
new DocExtractService(join(tmpdir(), 'bevel-test-doc-extract')),
|
|
2000
2001
|
allowAll,
|
|
2001
|
-
KB_DIR,
|
|
2002
|
-
{ service: {} as never, enabled: false, kbDirName: KB_DIR, recoveryBotEmail: 'recovery-bot@bevel.local', hooks: new WorkflowHooks() },
|
|
2002
|
+
testKbContext({ kbDirName: KB_DIR }),
|
|
2003
|
+
{ service: {} as never, enabled: false, kb: testKbContext({ kbDirName: KB_DIR }), recoveryBotEmail: 'recovery-bot@bevel.local', hooks: new WorkflowHooks() },
|
|
2003
2004
|
new RoutineWritePolicyService(),
|
|
2004
2005
|
{} as never,
|
|
2005
2006
|
);
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
2
3
|
import { writeDenial } from '../write-denial.js';
|
|
3
4
|
import { AccessDeniedError } from '../../access-model/access-errors.js';
|
|
4
5
|
import type { ChangeReadVerdict, IChangeReadGate } from '../../access-model/change-gate.js';
|
|
@@ -34,7 +35,7 @@ describe('writeDenial asks the read gate about the refused path as the refuser s
|
|
|
34
35
|
eligibleUsers: [],
|
|
35
36
|
targetKind: 'dir',
|
|
36
37
|
});
|
|
37
|
-
const out = await writeDenial(err, INPUT, noAccess, KB, gate);
|
|
38
|
+
const out = await writeDenial(err, INPUT, noAccess, testKbContext({ kbDirName: KB }), gate);
|
|
38
39
|
expect(judge).toHaveBeenCalledWith(
|
|
39
40
|
'target-company-state',
|
|
40
41
|
'alice@example.com',
|
|
@@ -48,7 +49,7 @@ describe('writeDenial asks the read gate about the refused path as the refuser s
|
|
|
48
49
|
it('a refusal that says nothing about its kind is judged as a file', async () => {
|
|
49
50
|
const { gate, judge } = gateThat({ allowed: false, unreadable: 'KnowledgeBase' });
|
|
50
51
|
const err = new AccessDeniedError({ path: `${KB}/KnowledgeBase/loose.md`, eligibleRoles: [], eligibleUsers: [] });
|
|
51
|
-
const out = await writeDenial(err, INPUT, noAccess, KB, gate);
|
|
52
|
+
const out = await writeDenial(err, INPUT, noAccess, testKbContext({ kbDirName: KB }), gate);
|
|
52
53
|
expect(judge).toHaveBeenCalledWith(expect.any(String), 'alice@example.com', `${KB}/KnowledgeBase/loose.md`, 'file');
|
|
53
54
|
expect(out.details).toMatchObject({
|
|
54
55
|
kind: 'write-denied',
|
|
@@ -60,7 +61,7 @@ describe('writeDenial asks the read gate about the refused path as the refuser s
|
|
|
60
61
|
it('without a gate the read verdict alone decides, as before', async () => {
|
|
61
62
|
const accessControl = { canRead: vi.fn(async () => true) } as unknown as IAccessControl;
|
|
62
63
|
const err = new AccessDeniedError({ path: `${KB}/KnowledgeBase/Sales/deal.md`, eligibleRoles: [], eligibleUsers: [] });
|
|
63
|
-
const out = await writeDenial(err, INPUT, accessControl, KB);
|
|
64
|
+
const out = await writeDenial(err, INPUT, accessControl, testKbContext({ kbDirName: KB }));
|
|
64
65
|
expect(accessControl.canRead).toHaveBeenCalledWith('target-company-state', 'alice@example.com', 'KnowledgeBase/Sales/deal.md');
|
|
65
66
|
expect(out.details).toMatchObject({ kind: 'write-denied', canPropose: true });
|
|
66
67
|
});
|
|
@@ -68,7 +69,7 @@ describe('writeDenial asks the read gate about the refused path as the refuser s
|
|
|
68
69
|
it('a gate that cannot answer refuses to offer the route', async () => {
|
|
69
70
|
const gate: IChangeReadGate = { judge: vi.fn(async () => { throw new Error('git down'); }), assertMayChange: vi.fn() };
|
|
70
71
|
const err = new AccessDeniedError({ path: `${KB}/KnowledgeBase/Sales/deal.md`, eligibleRoles: [], eligibleUsers: [] });
|
|
71
|
-
const out = await writeDenial(err, INPUT, noAccess, KB, gate);
|
|
72
|
+
const out = await writeDenial(err, INPUT, noAccess, testKbContext({ kbDirName: KB }), gate);
|
|
72
73
|
expect(out.details).toMatchObject({ canPropose: false });
|
|
73
74
|
expect(out.details?.cannotProposeReason).toContain('could not be determined');
|
|
74
75
|
});
|
|
@@ -22,6 +22,7 @@
|
|
|
22
22
|
*/
|
|
23
23
|
|
|
24
24
|
import { ontologyOf } from '../../shared/kb-layout.js';
|
|
25
|
+
import type { KbContext } from '../../shared/kb-context.js';
|
|
25
26
|
import type { JsonSchema } from '../tool-registry/tool.contract.js';
|
|
26
27
|
import { ToolError, type ToolContext } from '../tool-helpers/tool.contract.js';
|
|
27
28
|
import type { ISessionOntologyService } from '../workflow/session-ontology.service.js';
|
|
@@ -75,7 +76,8 @@ export class MissingSessionError extends ToolError {
|
|
|
75
76
|
export interface SessionOntologyGate {
|
|
76
77
|
service: ISessionOntologyService;
|
|
77
78
|
enabled: boolean;
|
|
78
|
-
|
|
79
|
+
/** The checkout folder and the layout a path is classified under. */
|
|
80
|
+
kb: Pick<KbContext, 'kbDirName' | 'layout'>;
|
|
79
81
|
/** Lowercased email of the recovery/merge bot, which is exempt. */
|
|
80
82
|
recoveryBotEmail: string;
|
|
81
83
|
/**
|
|
@@ -103,7 +105,7 @@ function isAgentSource(ctx: ToolContext): boolean {
|
|
|
103
105
|
function resolveGatedSession(gate: SessionOntologyGate, ctx: ToolContext, wsPath: string): string | 'skip' {
|
|
104
106
|
if (!gate.enabled) return 'skip';
|
|
105
107
|
// Neutral paths never pin/record/block — skip before any identity work.
|
|
106
|
-
if (ontologyOf(wsPath, gate.kbDirName) === null) return 'skip';
|
|
108
|
+
if (ontologyOf(wsPath, gate.kb.layout, gate.kb.kbDirName) === null) return 'skip';
|
|
107
109
|
// Humans (UI routes) and browser-JWT callers never hit these tools; only
|
|
108
110
|
// agent tool calls are gated.
|
|
109
111
|
if (!isAgentSource(ctx)) return 'skip';
|
|
@@ -125,7 +127,7 @@ export async function recordOntologyRead(gate: SessionOntologyGate, ctx: ToolCon
|
|
|
125
127
|
const sessionId = resolveGatedSession(gate, ctx, wsPath);
|
|
126
128
|
if (sessionId === 'skip') return;
|
|
127
129
|
// checkOperation(isWrite=false) records the touch and always allows.
|
|
128
|
-
await gate.service.checkOperation(sessionId, wsPath, false, gate.kbDirName);
|
|
130
|
+
await gate.service.checkOperation(sessionId, wsPath, false, gate.kb.kbDirName);
|
|
129
131
|
}
|
|
130
132
|
|
|
131
133
|
/**
|
|
@@ -155,7 +157,7 @@ export async function assertOntologyWriteAllowed(
|
|
|
155
157
|
// Tracking stays core: record the (now-allowed) write's ontology touch.
|
|
156
158
|
// A blocked write never reaches this line, so it records nothing — same as
|
|
157
159
|
// before the hook split.
|
|
158
|
-
await gate.service.checkOperation(sessionId, wsPath, false, gate.kbDirName);
|
|
160
|
+
await gate.service.checkOperation(sessionId, wsPath, false, gate.kb.kbDirName);
|
|
159
161
|
}
|
|
160
162
|
|
|
161
163
|
/**
|
|
@@ -6,7 +6,7 @@ import os from 'node:os';
|
|
|
6
6
|
import path from 'node:path';
|
|
7
7
|
import { KbRemoteUnreachableError, KbStartupRunner } from '../kb-startup-runner.js';
|
|
8
8
|
import { NodeGitRunner } from '../../../workflow/git/node-git-runner.js';
|
|
9
|
-
import { GitRunError, type IGitRunner } from '../../../../shared/git.contract.js';
|
|
9
|
+
import { GitRunError, NO_GIT_CREDENTIALS, type IGitRunner } from '../../../../shared/git.contract.js';
|
|
10
10
|
import type { OnServerStart, ServerStartContext, StepResult } from '../on-server-start.js';
|
|
11
11
|
|
|
12
12
|
/**
|
|
@@ -69,7 +69,6 @@ function makeRunner(steps: OnServerStart[], url: () => string, gitRunner: IGitRu
|
|
|
69
69
|
return new KbStartupRunner({
|
|
70
70
|
gitRunner,
|
|
71
71
|
kbRepoUrl: url,
|
|
72
|
-
gitUsername: () => 'x-access-token',
|
|
73
72
|
workspacesRoot,
|
|
74
73
|
kbDirName: 'knowledge-base',
|
|
75
74
|
templateDir: path.join(root, 'template'),
|
|
@@ -101,6 +100,7 @@ describe('KbStartupRunner with an unreachable remote', () => {
|
|
|
101
100
|
it('a git that never ran is not "unreachable" either: that failure is this host, and it stops the boot', async () => {
|
|
102
101
|
const noGit: IGitRunner = {
|
|
103
102
|
defaultTimeoutMs: 1000,
|
|
103
|
+
credentials: NO_GIT_CREDENTIALS,
|
|
104
104
|
run: (async () => {
|
|
105
105
|
throw new GitRunError('git ls-remote failed: spawn git ENOENT');
|
|
106
106
|
}) as IGitRunner['run'],
|
|
@@ -251,6 +251,7 @@ describe('KbStartupRunner with a remote that rejects the credentials', () => {
|
|
|
251
251
|
// re-dial a host that will never accept the token.
|
|
252
252
|
const rejecting: IGitRunner = {
|
|
253
253
|
defaultTimeoutMs: 1000,
|
|
254
|
+
credentials: NO_GIT_CREDENTIALS,
|
|
254
255
|
run: (async () => {
|
|
255
256
|
// The shape `NodeGitRunner` throws: git's words in the message (that
|
|
256
257
|
// is what the boot classifies) and again in `stderr`.
|
|
@@ -275,6 +276,7 @@ describe('KbStartupRunner retry after a boot that survived a rejected token', ()
|
|
|
275
276
|
let dials = 0;
|
|
276
277
|
const rejecting: IGitRunner = {
|
|
277
278
|
defaultTimeoutMs: 1000,
|
|
279
|
+
credentials: NO_GIT_CREDENTIALS,
|
|
278
280
|
run: (async () => {
|
|
279
281
|
dials += 1;
|
|
280
282
|
const said = "fatal: Authentication failed for 'https://example.com/acme/kb.git/'";
|
|
@@ -319,6 +321,7 @@ describe('KbStartupRunner retry when the token is rejected while it sleeps', ()
|
|
|
319
321
|
let dials = 0;
|
|
320
322
|
const rejecting: IGitRunner = {
|
|
321
323
|
defaultTimeoutMs: 1000,
|
|
324
|
+
credentials: NO_GIT_CREDENTIALS,
|
|
322
325
|
run: (async () => {
|
|
323
326
|
dials += 1;
|
|
324
327
|
const said = "fatal: Authentication failed for 'https://example.com/acme/kb.git/'";
|
|
@@ -331,6 +334,7 @@ describe('KbStartupRunner retry when the token is rejected while it sleeps', ()
|
|
|
331
334
|
let current: IGitRunner = new NodeGitRunner();
|
|
332
335
|
const switching: IGitRunner = {
|
|
333
336
|
defaultTimeoutMs: 1000,
|
|
337
|
+
credentials: NO_GIT_CREDENTIALS,
|
|
334
338
|
run: ((...args: Parameters<IGitRunner['run']>) => current.run(...args)) as IGitRunner['run'],
|
|
335
339
|
};
|
|
336
340
|
let url = path.join(root, 'nowhere.git');
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
2
|
+
import { testKbContext } from '../../../../__tests__/kb-context.js';
|
|
2
3
|
import { NodeFs } from '../../../kb-fs/node-fs.js';
|
|
3
4
|
import { execFile } from 'node:child_process';
|
|
4
5
|
import { promisify } from 'node:util';
|
|
@@ -9,8 +10,18 @@ import { KbStartupRunner } from '../kb-startup-runner.js';
|
|
|
9
10
|
import { WorkspaceService } from '../../workspace.service.js';
|
|
10
11
|
import { NodeGitRunner } from '../../../workflow/git/node-git-runner.js';
|
|
11
12
|
import { ClassifiedFailure, classifyGitFailure, failureOf } from '../../../../shared/git-failure.js';
|
|
13
|
+
import { gitCredentials } from '../../../../shared/git.contract.js';
|
|
12
14
|
import type { OnServerStart, ServerStartContext, StepResult } from '../on-server-start.js';
|
|
13
15
|
|
|
16
|
+
/**
|
|
17
|
+
* The token in effect for the runners these suites build, changed by the
|
|
18
|
+
* cases that need one — the way the setup screen changes it on a running
|
|
19
|
+
* deployment: through the provider the runner reads on every call, never
|
|
20
|
+
* through this process's environment.
|
|
21
|
+
*/
|
|
22
|
+
let token: string | null = null;
|
|
23
|
+
const credentials = gitCredentials('x-access-token', () => token);
|
|
24
|
+
|
|
14
25
|
const execFileAsync = promisify(execFile);
|
|
15
26
|
|
|
16
27
|
const PROTECTED = ['current-company-state', 'target-company-state'];
|
|
@@ -65,9 +76,8 @@ function makeRunner(steps: OnServerStart[], overrides: Partial<Parameters<typeof
|
|
|
65
76
|
|
|
66
77
|
function runnerOpts(steps: OnServerStart[], overrides: Record<string, unknown> = {}) {
|
|
67
78
|
return {
|
|
68
|
-
gitRunner: new NodeGitRunner(),
|
|
79
|
+
gitRunner: new NodeGitRunner(undefined, credentials),
|
|
69
80
|
kbRepoUrl: () => upstream,
|
|
70
|
-
gitUsername: () => 'x-access-token',
|
|
71
81
|
workspacesRoot,
|
|
72
82
|
kbDirName: 'knowledge-base',
|
|
73
83
|
templateDir: path.join(root, 'template'),
|
|
@@ -486,7 +496,7 @@ describe('KbStartupRunner — what a failed phase throws', () => {
|
|
|
486
496
|
try {
|
|
487
497
|
const err = await makeRunner([step('noop', async () => ({ outcome: 'ok' }))], {
|
|
488
498
|
kbRepoUrl: () => 'https://127.0.0.1:1/kb.git?X-Amz-Signature=SECRETSIG',
|
|
489
|
-
|
|
499
|
+
gitRunner: new NodeGitRunner(undefined, gitCredentials('x-access-token', 'access')),
|
|
490
500
|
})
|
|
491
501
|
.runAll()
|
|
492
502
|
.then(
|
|
@@ -518,7 +528,7 @@ describe('KbStartupRunner redaction', () => {
|
|
|
518
528
|
throw new Error('the host said ghp_settingsonly42 is not welcome');
|
|
519
529
|
}),
|
|
520
530
|
],
|
|
521
|
-
{
|
|
531
|
+
{ gitRunner: new NodeGitRunner(undefined, gitCredentials('x-access-token', 'ghp_settingsonly42')) },
|
|
522
532
|
);
|
|
523
533
|
const err = await runner.runAll().then(
|
|
524
534
|
() => null,
|
|
@@ -540,10 +550,8 @@ describe('KbStartupRunner credentials', () => {
|
|
|
540
550
|
// the repo with nothing, so every later push prompts for a username, finds
|
|
541
551
|
// no tty, and dies — commits pile up locally and reach the remote never.
|
|
542
552
|
// Only real git tells the two spellings apart, so this drives real git.
|
|
543
|
-
const ORIGINAL = process.env.GITHUB_TOKEN;
|
|
544
553
|
afterEach(() => {
|
|
545
|
-
|
|
546
|
-
else process.env.GITHUB_TOKEN = ORIGINAL;
|
|
554
|
+
token = null;
|
|
547
555
|
});
|
|
548
556
|
|
|
549
557
|
|
|
@@ -561,7 +569,7 @@ describe('KbStartupRunner credentials', () => {
|
|
|
561
569
|
}
|
|
562
570
|
|
|
563
571
|
it('leaves the boot clone able to authenticate a push of its own', async () => {
|
|
564
|
-
|
|
572
|
+
token = 'ghp_boot';
|
|
565
573
|
await populatedUpstream();
|
|
566
574
|
// The branch handle clones lazily, so a step has to actually reach for the
|
|
567
575
|
// repo before there is anything on disk to inspect.
|
|
@@ -585,7 +593,7 @@ describe('KbStartupRunner credentials', () => {
|
|
|
585
593
|
// path (`--replace-all`), so drift a second value in out of band and let
|
|
586
594
|
// WorkspaceService adopt the clone — that is the code the guarantee is
|
|
587
595
|
// about.
|
|
588
|
-
|
|
596
|
+
token = 'ghp_boot';
|
|
589
597
|
await populatedUpstream();
|
|
590
598
|
const repo = await materializeDefaultBranchClone();
|
|
591
599
|
// App-shaped drift: a second stamp of OURS with a stale username — the
|
|
@@ -594,7 +602,7 @@ describe('KbStartupRunner credentials', () => {
|
|
|
594
602
|
await git(repo, ['config', '--add', 'credential.helper',
|
|
595
603
|
'!f() { echo "username=stale-user"; echo "password=$GITHUB_TOKEN"; }; f']);
|
|
596
604
|
|
|
597
|
-
const ws = new WorkspaceService(workspacesRoot, upstream,
|
|
605
|
+
const ws = new WorkspaceService(workspacesRoot, upstream, testKbContext(), new NodeFs(), new NodeGitRunner(undefined, credentials));
|
|
598
606
|
await ws.getOrCreateForBranch(DEFAULT_BRANCH);
|
|
599
607
|
|
|
600
608
|
const all = (await git(repo, ['config', '--local', '--get-all', 'credential.helper'])).trim();
|
|
@@ -607,19 +615,19 @@ describe('KbStartupRunner credentials', () => {
|
|
|
607
615
|
// git chains every configured helper, so an operator's clone-local
|
|
608
616
|
// `cache`/`store`/custom helper coexists with ours — and losing it on a
|
|
609
617
|
// token change would break the very fallback auth they set up.
|
|
610
|
-
|
|
618
|
+
token = 'ghp_boot';
|
|
611
619
|
await populatedUpstream();
|
|
612
620
|
const repo = await materializeDefaultBranchClone();
|
|
613
621
|
await git(repo, ['config', '--add', 'credential.helper', 'cache --timeout=300']);
|
|
614
622
|
|
|
615
|
-
const ws = new WorkspaceService(workspacesRoot, upstream,
|
|
623
|
+
const ws = new WorkspaceService(workspacesRoot, upstream, testKbContext(), new NodeFs(), new NodeGitRunner(undefined, credentials));
|
|
616
624
|
await ws.getOrCreateForBranch(DEFAULT_BRANCH); // stamp with token
|
|
617
625
|
let all = (await git(repo, ['config', '--local', '--get-all', 'credential.helper'])).trim();
|
|
618
626
|
expect(all).toContain('cache --timeout=300');
|
|
619
627
|
expect(all).toContain('password=$GITHUB_TOKEN');
|
|
620
628
|
|
|
621
|
-
|
|
622
|
-
const ws2 =
|
|
629
|
+
token = null;
|
|
630
|
+
const ws2 =new WorkspaceService(workspacesRoot, upstream, testKbContext(), new NodeFs(), new NodeGitRunner(undefined, credentials));
|
|
623
631
|
await ws2.getOrCreateForBranch(DEFAULT_BRANCH); // unset OUR helper only
|
|
624
632
|
all = (await git(repo, ['config', '--local', '--get-all', 'credential.helper'])).trim();
|
|
625
633
|
expect(all).toContain('cache --timeout=300');
|
|
@@ -630,12 +638,12 @@ describe('KbStartupRunner credentials', () => {
|
|
|
630
638
|
// A deployment that lost its token must not keep a clone-local helper
|
|
631
639
|
// answering with an empty password — it would shadow whatever fallback
|
|
632
640
|
// auth the operator switched to.
|
|
633
|
-
|
|
641
|
+
token = 'ghp_boot';
|
|
634
642
|
await populatedUpstream();
|
|
635
643
|
const repo = await materializeDefaultBranchClone(); // stamped
|
|
636
|
-
|
|
644
|
+
token = null;
|
|
637
645
|
|
|
638
|
-
const ws = new WorkspaceService(workspacesRoot, upstream,
|
|
646
|
+
const ws = new WorkspaceService(workspacesRoot, upstream, testKbContext(), new NodeFs(), new NodeGitRunner(undefined, credentials));
|
|
639
647
|
await ws.getOrCreateForBranch(DEFAULT_BRANCH);
|
|
640
648
|
|
|
641
649
|
await expect(git(repo, ['config', '--local', '--get', 'credential.helper']))
|
|
@@ -646,13 +654,13 @@ describe('KbStartupRunner credentials', () => {
|
|
|
646
654
|
// The rotation gap: the setup screen can supply a token AFTER a branch
|
|
647
655
|
// was first opened, and the cached fast path returns before the adoption
|
|
648
656
|
// re-stamp. The fingerprint check must catch the change there.
|
|
649
|
-
|
|
657
|
+
token = null;
|
|
650
658
|
await populatedUpstream();
|
|
651
659
|
const repo = await materializeDefaultBranchClone(); // no helper
|
|
652
660
|
|
|
653
|
-
const ws = new WorkspaceService(workspacesRoot, upstream,
|
|
661
|
+
const ws = new WorkspaceService(workspacesRoot, upstream, testKbContext(), new NodeFs(), new NodeGitRunner(undefined, credentials));
|
|
654
662
|
await ws.getOrCreateForBranch(DEFAULT_BRANCH); // adopt, tokenless
|
|
655
|
-
|
|
663
|
+
token = 'ghp_late';
|
|
656
664
|
await ws.getOrCreateForBranch(DEFAULT_BRANCH); // cached fast path
|
|
657
665
|
|
|
658
666
|
const helper = (await git(repo, ['config', '--local', '--get', 'credential.helper'])).trim();
|
|
@@ -661,7 +669,7 @@ describe('KbStartupRunner credentials', () => {
|
|
|
661
669
|
});
|
|
662
670
|
|
|
663
671
|
it('clones without a helper when the deployment has no token — an open remote still boots', async () => {
|
|
664
|
-
|
|
672
|
+
token = null;
|
|
665
673
|
await populatedUpstream();
|
|
666
674
|
const repo = await materializeDefaultBranchClone();
|
|
667
675
|
// `--get` exits 1 when the key is unset. Assert on that exit code rather
|
|
@@ -29,12 +29,13 @@ const STARTUP_GIT_TIMEOUT_MS = 600_000;
|
|
|
29
29
|
|
|
30
30
|
/**
|
|
31
31
|
* Per-invocation `-c` config. Long paths always (Windows checkouts of deep
|
|
32
|
-
* KB trees); when a token
|
|
33
|
-
* it from the environment at call time — the secret never
|
|
32
|
+
* KB trees); when the runner carries a token, an inline credential helper
|
|
33
|
+
* that reads it from the child's environment at call time — the secret never
|
|
34
|
+
* appears in argv.
|
|
34
35
|
*/
|
|
35
|
-
function credArgs(
|
|
36
|
+
function credArgs(runner: IGitRunner): string[] {
|
|
36
37
|
const args = ['-c', 'core.longpaths=true'];
|
|
37
|
-
const helper = credentialHelperValue(
|
|
38
|
+
const helper = credentialHelperValue(runner.credentials);
|
|
38
39
|
if (helper) args.push('-c', `credential.helper=${helper}`);
|
|
39
40
|
return args;
|
|
40
41
|
}
|
|
@@ -49,18 +50,14 @@ function credArgs(gitUsername: string): string[] {
|
|
|
49
50
|
* clone to carry its own credentials. Persist them with `clone --config` (which
|
|
50
51
|
* only means "write into the new repo" after the subcommand) so it does.
|
|
51
52
|
*/
|
|
52
|
-
function withPersistedCloneConfig(
|
|
53
|
+
function withPersistedCloneConfig(runner: IGitRunner, args: string[]): string[] {
|
|
53
54
|
if (args[0] !== 'clone') return args;
|
|
54
|
-
return [args[0], ...cloneCredentialArgs(
|
|
55
|
+
return [args[0], ...cloneCredentialArgs(runner.credentials), ...args.slice(1)];
|
|
55
56
|
}
|
|
56
57
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
gitUsername: string,
|
|
61
|
-
args: string[],
|
|
62
|
-
): Promise<string> {
|
|
63
|
-
const argv = [...credArgs(gitUsername), ...withPersistedCloneConfig(gitUsername, args)];
|
|
58
|
+
/** Run one git command of the phase, authenticated with the runner's own credentials. */
|
|
59
|
+
export async function git(runner: IGitRunner, cwd: string, args: string[]): Promise<string> {
|
|
60
|
+
const argv = [...credArgs(runner), ...withPersistedCloneConfig(runner, args)];
|
|
64
61
|
try {
|
|
65
62
|
// A floor under the configured ceiling, not a replacement for it: an
|
|
66
63
|
// operator who raised GIT_TIMEOUT_MS past ten minutes gets that here too.
|
|
@@ -83,18 +80,14 @@ export async function git(
|
|
|
83
80
|
}
|
|
84
81
|
}
|
|
85
82
|
|
|
86
|
-
export async function stampIdentity(runner: IGitRunner, repo: string
|
|
87
|
-
await git(runner, repo,
|
|
88
|
-
await git(runner, repo,
|
|
83
|
+
export async function stampIdentity(runner: IGitRunner, repo: string): Promise<void> {
|
|
84
|
+
await git(runner, repo, ['config', 'user.name', BOT_NAME]);
|
|
85
|
+
await git(runner, repo, ['config', 'user.email', BOT_EMAIL]);
|
|
89
86
|
}
|
|
90
87
|
|
|
91
88
|
/** Branch names present on the remote, from `ls-remote --heads`. */
|
|
92
|
-
export async function lsRemoteHeads(
|
|
93
|
-
runner
|
|
94
|
-
repoUrl: string,
|
|
95
|
-
gitUsername: string,
|
|
96
|
-
): Promise<Set<string>> {
|
|
97
|
-
const out = await git(runner, os.tmpdir(), gitUsername, ['ls-remote', '--heads', repoUrl]);
|
|
89
|
+
export async function lsRemoteHeads(runner: IGitRunner, repoUrl: string): Promise<Set<string>> {
|
|
90
|
+
const out = await git(runner, os.tmpdir(), ['ls-remote', '--heads', repoUrl]);
|
|
98
91
|
const heads = new Set<string>();
|
|
99
92
|
for (const line of out.split('\n')) {
|
|
100
93
|
const m = /\srefs\/heads\/(.+)$/.exec(line.trim());
|