@bevel-software/platform-core-backend 0.20.0 → 0.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/core/catalog-cache-invalidation.d.ts +7 -2
- package/dist/core/catalog-cache-invalidation.d.ts.map +1 -1
- package/dist/core/catalog-cache-invalidation.js +8 -9
- package/dist/core/catalog-cache-invalidation.js.map +1 -1
- package/dist/core/core-ports.d.ts +19 -0
- package/dist/core/core-ports.d.ts.map +1 -1
- package/dist/core/core-ports.js.map +1 -1
- package/dist/core/create-core-server.d.ts +2 -0
- package/dist/core/create-core-server.d.ts.map +1 -1
- package/dist/core/create-core-server.js +55 -107
- package/dist/core/create-core-server.js.map +1 -1
- package/dist/core/create-core-services.d.ts +41 -4
- package/dist/core/create-core-services.d.ts.map +1 -1
- package/dist/core/create-core-services.js +183 -82
- package/dist/core/create-core-services.js.map +1 -1
- package/dist/core/lifecycle.d.ts +74 -28
- package/dist/core/lifecycle.d.ts.map +1 -1
- package/dist/core/lifecycle.js +157 -20
- package/dist/core/lifecycle.js.map +1 -1
- package/dist/core/public-config.d.ts +5 -1
- package/dist/core/public-config.d.ts.map +1 -1
- package/dist/core/public-config.js +7 -5
- package/dist/core/public-config.js.map +1 -1
- package/dist/core-config.d.ts +95 -1
- package/dist/core-config.d.ts.map +1 -1
- package/dist/core-config.js +24 -8
- package/dist/core-config.js.map +1 -1
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -3
- package/dist/index.js.map +1 -1
- package/dist/modules/access/access-control.service.d.ts +18 -1
- package/dist/modules/access/access-control.service.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.js +19 -8
- package/dist/modules/access/access-control.service.js.map +1 -1
- package/dist/modules/access/access-requests.contract.d.ts +75 -0
- package/dist/modules/access/access-requests.contract.d.ts.map +1 -0
- package/dist/modules/access/access-requests.contract.js +20 -0
- package/dist/modules/access/access-requests.contract.js.map +1 -0
- package/dist/modules/access/access-requests.routes.d.ts +35 -0
- package/dist/modules/access/access-requests.routes.d.ts.map +1 -0
- package/dist/modules/access/access-requests.routes.js +237 -0
- package/dist/modules/access/access-requests.routes.js.map +1 -0
- package/dist/modules/access/access-requests.service.d.ts +123 -0
- package/dist/modules/access/access-requests.service.d.ts.map +1 -0
- package/dist/modules/access/access-requests.service.js +337 -0
- package/dist/modules/access/access-requests.service.js.map +1 -0
- package/dist/modules/access/access.routes.d.ts +2 -1
- package/dist/modules/access/access.routes.d.ts.map +1 -1
- package/dist/modules/access/access.routes.js +10 -10
- package/dist/modules/access/access.routes.js.map +1 -1
- package/dist/modules/access/change-read-gate.d.ts +6 -3
- package/dist/modules/access/change-read-gate.d.ts.map +1 -1
- package/dist/modules/access/change-read-gate.js +9 -6
- package/dist/modules/access/change-read-gate.js.map +1 -1
- package/dist/modules/access/creator-access.d.ts +4 -2
- package/dist/modules/access/creator-access.d.ts.map +1 -1
- package/dist/modules/access/creator-access.js +7 -4
- package/dist/modules/access/creator-access.js.map +1 -1
- package/dist/modules/access-model/access-grammar.d.ts +12 -0
- package/dist/modules/access-model/access-grammar.d.ts.map +1 -1
- package/dist/modules/access-model/access-grammar.js +24 -0
- package/dist/modules/access-model/access-grammar.js.map +1 -1
- package/dist/modules/agent-instructions/read-preamble.d.ts +2 -1
- package/dist/modules/agent-instructions/read-preamble.d.ts.map +1 -1
- package/dist/modules/agent-instructions/read-preamble.js +6 -9
- package/dist/modules/agent-instructions/read-preamble.js.map +1 -1
- package/dist/modules/auth/account-admission.d.ts +40 -0
- package/dist/modules/auth/account-admission.d.ts.map +1 -0
- package/dist/modules/auth/account-admission.js +17 -0
- package/dist/modules/auth/account-admission.js.map +1 -0
- package/dist/modules/auth/account.routes.d.ts.map +1 -1
- package/dist/modules/auth/account.routes.js +4 -1
- package/dist/modules/auth/account.routes.js.map +1 -1
- package/dist/modules/auth/auth.service.d.ts +45 -2
- package/dist/modules/auth/auth.service.d.ts.map +1 -1
- package/dist/modules/auth/auth.service.js +44 -3
- package/dist/modules/auth/auth.service.js.map +1 -1
- package/dist/modules/auth/oidc-auth-provider.d.ts.map +1 -1
- package/dist/modules/auth/oidc-auth-provider.js +9 -0
- package/dist/modules/auth/oidc-auth-provider.js.map +1 -1
- package/dist/modules/connection-probe/connection-probe.service.d.ts +13 -1
- package/dist/modules/connection-probe/connection-probe.service.d.ts.map +1 -1
- package/dist/modules/connection-probe/connection-probe.service.js +10 -2
- package/dist/modules/connection-probe/connection-probe.service.js.map +1 -1
- package/dist/modules/database/advisory-lock.d.ts +17 -0
- package/dist/modules/database/advisory-lock.d.ts.map +1 -1
- package/dist/modules/database/advisory-lock.js +24 -3
- package/dist/modules/database/advisory-lock.js.map +1 -1
- package/dist/modules/database/connection.d.ts +67 -2
- package/dist/modules/database/connection.d.ts.map +1 -1
- package/dist/modules/database/connection.js +118 -12
- package/dist/modules/database/connection.js.map +1 -1
- package/dist/modules/database/migrate.d.ts +1 -1
- package/dist/modules/database/migrate.d.ts.map +1 -1
- package/dist/modules/database/migrate.js +27 -3
- package/dist/modules/database/migrate.js.map +1 -1
- package/dist/modules/github-app/github-app.client.d.ts +101 -0
- package/dist/modules/github-app/github-app.client.d.ts.map +1 -0
- package/dist/modules/github-app/github-app.client.js +222 -0
- package/dist/modules/github-app/github-app.client.js.map +1 -0
- package/dist/modules/github-app/github-app.connection.d.ts +102 -0
- package/dist/modules/github-app/github-app.connection.d.ts.map +1 -0
- package/dist/modules/github-app/github-app.connection.js +185 -0
- package/dist/modules/github-app/github-app.connection.js.map +1 -0
- package/dist/modules/github-app/github-app.routes.d.ts +59 -0
- package/dist/modules/github-app/github-app.routes.d.ts.map +1 -0
- package/dist/modules/github-app/github-app.routes.js +323 -0
- package/dist/modules/github-app/github-app.routes.js.map +1 -0
- package/dist/modules/github-app/index.d.ts +4 -0
- package/dist/modules/github-app/index.d.ts.map +1 -0
- package/dist/modules/github-app/index.js +4 -0
- package/dist/modules/github-app/index.js.map +1 -0
- package/dist/modules/kb-fs/branch-name.d.ts +0 -1
- package/dist/modules/kb-fs/branch-name.d.ts.map +1 -1
- package/dist/modules/kb-fs/branch-name.js +3 -3
- package/dist/modules/kb-fs/branch-name.js.map +1 -1
- package/dist/modules/kb-fs/clone-config.d.ts +9 -8
- package/dist/modules/kb-fs/clone-config.d.ts.map +1 -1
- package/dist/modules/kb-fs/clone-config.js +14 -12
- package/dist/modules/kb-fs/clone-config.js.map +1 -1
- package/dist/modules/kb-fs/remote-url.d.ts +22 -0
- package/dist/modules/kb-fs/remote-url.d.ts.map +1 -0
- package/dist/modules/kb-fs/remote-url.js +35 -0
- package/dist/modules/kb-fs/remote-url.js.map +1 -0
- package/dist/modules/mcp/mcp.service.d.ts +7 -0
- package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
- package/dist/modules/mcp/mcp.service.js +4 -4
- package/dist/modules/mcp/mcp.service.js.map +1 -1
- package/dist/modules/plugins/compile/marketplace-compiler.service.d.ts +4 -4
- package/dist/modules/plugins/compile/marketplace-compiler.service.d.ts.map +1 -1
- package/dist/modules/plugins/compile/marketplace-compiler.service.js +7 -10
- package/dist/modules/plugins/compile/marketplace-compiler.service.js.map +1 -1
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.d.ts +4 -1
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.d.ts.map +1 -1
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.js +5 -3
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.js.map +1 -1
- package/dist/modules/plugins/discovery/kb-plugin-source.d.ts +6 -1
- package/dist/modules/plugins/discovery/kb-plugin-source.d.ts.map +1 -1
- package/dist/modules/plugins/discovery/kb-plugin-source.js +14 -9
- package/dist/modules/plugins/discovery/kb-plugin-source.js.map +1 -1
- package/dist/modules/plugins/discovery/native.source.d.ts +4 -1
- package/dist/modules/plugins/discovery/native.source.d.ts.map +1 -1
- package/dist/modules/plugins/discovery/native.source.js +4 -2
- package/dist/modules/plugins/discovery/native.source.js.map +1 -1
- package/dist/modules/plugins/index.d.ts +1 -1
- package/dist/modules/plugins/index.d.ts.map +1 -1
- package/dist/modules/plugins/index.js +1 -1
- package/dist/modules/plugins/index.js.map +1 -1
- package/dist/modules/plugins/join-proposals.d.ts +17 -5
- package/dist/modules/plugins/join-proposals.d.ts.map +1 -1
- package/dist/modules/plugins/join-proposals.js +76 -22
- package/dist/modules/plugins/join-proposals.js.map +1 -1
- package/dist/modules/plugins/join-request-jobs.service.d.ts +3 -1
- package/dist/modules/plugins/join-request-jobs.service.d.ts.map +1 -1
- package/dist/modules/plugins/join-request-jobs.service.js +6 -6
- package/dist/modules/plugins/join-request-jobs.service.js.map +1 -1
- package/dist/modules/plugins/join-requests.service.d.ts +113 -18
- package/dist/modules/plugins/join-requests.service.d.ts.map +1 -1
- package/dist/modules/plugins/join-requests.service.js +178 -33
- package/dist/modules/plugins/join-requests.service.js.map +1 -1
- package/dist/modules/plugins/plugin-links.d.ts +65 -10
- package/dist/modules/plugins/plugin-links.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-links.js +136 -31
- package/dist/modules/plugins/plugin-links.js.map +1 -1
- package/dist/modules/plugins/plugin-links.service.d.ts +107 -5
- package/dist/modules/plugins/plugin-links.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-links.service.js +151 -21
- package/dist/modules/plugins/plugin-links.service.js.map +1 -1
- package/dist/modules/plugins/plugin-provision.service.d.ts +10 -3
- package/dist/modules/plugins/plugin-provision.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-provision.service.js +33 -26
- package/dist/modules/plugins/plugin-provision.service.js.map +1 -1
- package/dist/modules/plugins/plugin-rename.service.d.ts +4 -2
- package/dist/modules/plugins/plugin-rename.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-rename.service.js +10 -12
- package/dist/modules/plugins/plugin-rename.service.js.map +1 -1
- package/dist/modules/plugins/plugins.routes.d.ts +3 -0
- package/dist/modules/plugins/plugins.routes.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.routes.js +48 -17
- package/dist/modules/plugins/plugins.routes.js.map +1 -1
- package/dist/modules/plugins/plugins.service.d.ts +4 -4
- package/dist/modules/plugins/plugins.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.service.js +7 -10
- package/dist/modules/plugins/plugins.service.js.map +1 -1
- package/dist/modules/plugins/teams.routes.d.ts +4 -1
- package/dist/modules/plugins/teams.routes.d.ts.map +1 -1
- package/dist/modules/plugins/teams.routes.js +11 -9
- package/dist/modules/plugins/teams.routes.js.map +1 -1
- package/dist/modules/secrets-vault/index.d.ts +1 -1
- package/dist/modules/secrets-vault/index.d.ts.map +1 -1
- package/dist/modules/secrets-vault/index.js +1 -1
- package/dist/modules/secrets-vault/index.js.map +1 -1
- package/dist/modules/secrets-vault/secrets-variable-loader.d.ts +29 -11
- package/dist/modules/secrets-vault/secrets-variable-loader.d.ts.map +1 -1
- package/dist/modules/secrets-vault/secrets-variable-loader.js +46 -21
- package/dist/modules/secrets-vault/secrets-variable-loader.js.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.routes.d.ts +3 -0
- package/dist/modules/secrets-vault/secrets-vault.routes.d.ts.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.routes.js +4 -6
- package/dist/modules/secrets-vault/secrets-vault.routes.js.map +1 -1
- package/dist/modules/settings/deployment-settings.service.d.ts +34 -9
- package/dist/modules/settings/deployment-settings.service.d.ts.map +1 -1
- package/dist/modules/settings/deployment-settings.service.js +113 -26
- package/dist/modules/settings/deployment-settings.service.js.map +1 -1
- package/dist/modules/settings/managed-repository.d.ts +43 -0
- package/dist/modules/settings/managed-repository.d.ts.map +1 -0
- package/dist/modules/settings/managed-repository.js +60 -0
- package/dist/modules/settings/managed-repository.js.map +1 -0
- package/dist/modules/settings/repository-source.d.ts +128 -0
- package/dist/modules/settings/repository-source.d.ts.map +1 -0
- package/dist/modules/settings/repository-source.js +150 -0
- package/dist/modules/settings/repository-source.js.map +1 -0
- package/dist/modules/settings/setup.routes.d.ts +34 -4
- package/dist/modules/settings/setup.routes.d.ts.map +1 -1
- package/dist/modules/settings/setup.routes.js +198 -18
- package/dist/modules/settings/setup.routes.js.map +1 -1
- package/dist/modules/skills/allowed-tools-check.d.ts +4 -3
- package/dist/modules/skills/allowed-tools-check.d.ts.map +1 -1
- package/dist/modules/skills/allowed-tools-check.js +8 -8
- package/dist/modules/skills/allowed-tools-check.js.map +1 -1
- package/dist/modules/skills/pending-skills.service.d.ts +3 -1
- package/dist/modules/skills/pending-skills.service.d.ts.map +1 -1
- package/dist/modules/skills/pending-skills.service.js +9 -6
- package/dist/modules/skills/pending-skills.service.js.map +1 -1
- package/dist/modules/skills/skill-access-requests.routes.d.ts +8 -9
- package/dist/modules/skills/skill-access-requests.routes.d.ts.map +1 -1
- package/dist/modules/skills/skill-access-requests.routes.js +26 -65
- package/dist/modules/skills/skill-access-requests.routes.js.map +1 -1
- package/dist/modules/skills/skills.routes.d.ts +4 -1
- package/dist/modules/skills/skills.routes.d.ts.map +1 -1
- package/dist/modules/skills/skills.routes.js +4 -4
- package/dist/modules/skills/skills.routes.js.map +1 -1
- package/dist/modules/skills/skills.service.d.ts +4 -2
- package/dist/modules/skills/skills.service.d.ts.map +1 -1
- package/dist/modules/skills/skills.service.js +13 -11
- package/dist/modules/skills/skills.service.js.map +1 -1
- package/dist/modules/tool-helpers/tool-context.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool-context.js +15 -0
- package/dist/modules/tool-helpers/tool-context.js.map +1 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.d.ts +2 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.d.ts.map +1 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.js +6 -5
- package/dist/modules/tool-manuals/mcp-json-discovery.js.map +1 -1
- package/dist/modules/tool-manuals/mcp-server-edit.service.d.ts +4 -2
- package/dist/modules/tool-manuals/mcp-server-edit.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/mcp-server-edit.service.js +12 -10
- package/dist/modules/tool-manuals/mcp-server-edit.service.js.map +1 -1
- package/dist/modules/tool-manuals/pending-tools.service.d.ts +3 -1
- package/dist/modules/tool-manuals/pending-tools.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/pending-tools.service.js +19 -16
- package/dist/modules/tool-manuals/pending-tools.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-delete.service.d.ts +4 -2
- package/dist/modules/tool-manuals/tool-delete.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-delete.service.js +14 -12
- package/dist/modules/tool-manuals/tool-delete.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.routes.d.ts +3 -1
- package/dist/modules/tool-manuals/tool-manuals.routes.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.routes.js +7 -7
- package/dist/modules/tool-manuals/tool-manuals.routes.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts +4 -2
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.js +15 -12
- package/dist/modules/tool-manuals/tool-manuals.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts +3 -0
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.js +4 -6
- package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.d.ts +3 -2
- package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +1 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.js +47 -11
- package/dist/modules/workflow/agent-tools/workflow.tools.js.map +1 -1
- package/dist/modules/workflow/git/git.service.d.ts +14 -6
- package/dist/modules/workflow/git/git.service.d.ts.map +1 -1
- package/dist/modules/workflow/git/git.service.js +40 -18
- package/dist/modules/workflow/git/git.service.js.map +1 -1
- package/dist/modules/workflow/git/node-git-runner.d.ts +26 -2
- package/dist/modules/workflow/git/node-git-runner.d.ts.map +1 -1
- package/dist/modules/workflow/git/node-git-runner.js +40 -5
- package/dist/modules/workflow/git/node-git-runner.js.map +1 -1
- package/dist/modules/workflow/git/pull-request.service.d.ts +45 -0
- package/dist/modules/workflow/git/pull-request.service.d.ts.map +1 -1
- package/dist/modules/workflow/git/pull-request.service.js +99 -0
- package/dist/modules/workflow/git/pull-request.service.js.map +1 -1
- package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts.map +1 -1
- package/dist/modules/workflow/review-workflow/review-workflow.service.js +9 -4
- package/dist/modules/workflow/review-workflow/review-workflow.service.js.map +1 -1
- package/dist/modules/workflow/session-ontology.service.d.ts +6 -1
- package/dist/modules/workflow/session-ontology.service.d.ts.map +1 -1
- package/dist/modules/workflow/session-ontology.service.js +6 -2
- package/dist/modules/workflow/session-ontology.service.js.map +1 -1
- package/dist/modules/workflow/workflow.routes.d.ts.map +1 -1
- package/dist/modules/workflow/workflow.routes.js +3 -1
- package/dist/modules/workflow/workflow.routes.js.map +1 -1
- package/dist/modules/workflow/workflow.service.d.ts +42 -10
- package/dist/modules/workflow/workflow.service.d.ts.map +1 -1
- package/dist/modules/workflow/workflow.service.js +181 -71
- package/dist/modules/workflow/workflow.service.js.map +1 -1
- package/dist/modules/workspace/session-ontology.gate.d.ts +3 -1
- package/dist/modules/workspace/session-ontology.gate.d.ts.map +1 -1
- package/dist/modules/workspace/session-ontology.gate.js +3 -3
- package/dist/modules/workspace/session-ontology.gate.js.map +1 -1
- package/dist/modules/workspace/startup/kb-git.d.ts +4 -3
- package/dist/modules/workspace/startup/kb-git.d.ts.map +1 -1
- package/dist/modules/workspace/startup/kb-git.js +15 -13
- package/dist/modules/workspace/startup/kb-git.js.map +1 -1
- package/dist/modules/workspace/startup/kb-startup-runner.d.ts +70 -7
- package/dist/modules/workspace/startup/kb-startup-runner.d.ts.map +1 -1
- package/dist/modules/workspace/startup/kb-startup-runner.js +183 -38
- package/dist/modules/workspace/startup/kb-startup-runner.js.map +1 -1
- package/dist/modules/workspace/startup/steps/groups-to-plugins.step.d.ts +7 -1
- package/dist/modules/workspace/startup/steps/groups-to-plugins.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/groups-to-plugins.step.js +23 -16
- package/dist/modules/workspace/startup/steps/groups-to-plugins.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/personal-spaces.step.d.ts +7 -1
- package/dist/modules/workspace/startup/steps/personal-spaces.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/personal-spaces.step.js +12 -5
- package/dist/modules/workspace/startup/steps/personal-spaces.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/plugin-display-names.step.d.ts +7 -1
- package/dist/modules/workspace/startup/steps/plugin-display-names.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/plugin-display-names.step.js +12 -5
- package/dist/modules/workspace/startup/steps/plugin-display-names.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.d.ts +7 -1
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.js +12 -5
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/seed-tree.d.ts +4 -1
- package/dist/modules/workspace/startup/steps/seed-tree.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/seed-tree.js +14 -11
- package/dist/modules/workspace/startup/steps/seed-tree.js.map +1 -1
- package/dist/modules/workspace/startup/steps/template-files.step.d.ts +17 -3
- package/dist/modules/workspace/startup/steps/template-files.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/template-files.step.js +36 -30
- package/dist/modules/workspace/startup/steps/template-files.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/template-source.d.ts +6 -1
- package/dist/modules/workspace/startup/steps/template-source.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/template-source.js +10 -6
- package/dist/modules/workspace/startup/steps/template-source.js.map +1 -1
- package/dist/modules/workspace/workspace.routes.d.ts +2 -1
- package/dist/modules/workspace/workspace.routes.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.routes.js +8 -7
- package/dist/modules/workspace/workspace.routes.js.map +1 -1
- package/dist/modules/workspace/workspace.service.d.ts +18 -12
- package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.service.js +49 -29
- package/dist/modules/workspace/workspace.service.js.map +1 -1
- package/dist/modules/workspace/workspace.tools.d.ts +2 -1
- package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.tools.js +48 -20
- package/dist/modules/workspace/workspace.tools.js.map +1 -1
- package/dist/modules/workspace/write-denial.d.ts +3 -2
- package/dist/modules/workspace/write-denial.d.ts.map +1 -1
- package/dist/modules/workspace/write-denial.js +6 -5
- package/dist/modules/workspace/write-denial.js.map +1 -1
- package/dist/shared/domain-errors.d.ts +39 -0
- package/dist/shared/domain-errors.d.ts.map +1 -1
- package/dist/shared/domain-errors.js +55 -0
- package/dist/shared/domain-errors.js.map +1 -1
- package/dist/shared/git.contract.d.ts +62 -7
- package/dist/shared/git.contract.d.ts.map +1 -1
- package/dist/shared/git.contract.js +30 -8
- package/dist/shared/git.contract.js.map +1 -1
- package/dist/shared/kb-context.d.ts +76 -0
- package/dist/shared/kb-context.d.ts.map +1 -0
- package/dist/shared/kb-context.js +108 -0
- package/dist/shared/kb-context.js.map +1 -0
- package/dist/shared/kb-layout.d.ts +3 -2
- package/dist/shared/kb-layout.d.ts.map +1 -1
- package/dist/shared/kb-layout.js +4 -3
- package/dist/shared/kb-layout.js.map +1 -1
- package/dist/shared/kb-layout.test.js +35 -27
- package/dist/shared/kb-layout.test.js.map +1 -1
- package/dist/shared/pending-proposals.d.ts +4 -1
- package/dist/shared/pending-proposals.d.ts.map +1 -1
- package/dist/shared/pending-proposals.js +3 -4
- package/dist/shared/pending-proposals.js.map +1 -1
- package/dist/shared/redact-secret.d.ts +5 -5
- package/dist/shared/redact-secret.js +5 -5
- package/dist/tenancy/index.d.ts +13 -0
- package/dist/tenancy/index.d.ts.map +1 -0
- package/dist/tenancy/index.js +13 -0
- package/dist/tenancy/index.js.map +1 -0
- package/dist/tenancy/static-tenant-source.d.ts +98 -0
- package/dist/tenancy/static-tenant-source.d.ts.map +1 -0
- package/dist/tenancy/static-tenant-source.js +220 -0
- package/dist/tenancy/static-tenant-source.js.map +1 -0
- package/dist/tenancy/tenant-host.d.ts +80 -0
- package/dist/tenancy/tenant-host.d.ts.map +1 -0
- package/dist/tenancy/tenant-host.js +217 -0
- package/dist/tenancy/tenant-host.js.map +1 -0
- package/dist/tenancy/tenant-runtime.d.ts +91 -0
- package/dist/tenancy/tenant-runtime.d.ts.map +1 -0
- package/dist/tenancy/tenant-runtime.js +174 -0
- package/dist/tenancy/tenant-runtime.js.map +1 -0
- package/dist/tenancy/tenant-secrets.d.ts +24 -0
- package/dist/tenancy/tenant-secrets.d.ts.map +1 -0
- package/dist/tenancy/tenant-secrets.js +30 -0
- package/dist/tenancy/tenant-secrets.js.map +1 -0
- package/dist/tenancy/tenant-source.contract.d.ts +45 -0
- package/dist/tenancy/tenant-source.contract.d.ts.map +1 -0
- package/dist/tenancy/tenant-source.contract.js +21 -0
- package/dist/tenancy/tenant-source.contract.js.map +1 -0
- package/migrations/0000_core_init.sql +14 -14
- package/migrations/0003_deployment_settings.sql +1 -1
- package/migrations/0005_github_facade.sql +1 -1
- package/migrations/0012_agent_audit.sql +6 -6
- package/package.json +3 -3
- package/src/__tests__/branch-model.test.ts +7 -6
- package/src/__tests__/kb-context.ts +30 -0
- package/src/__tests__/kb-layout-config.test.ts +35 -30
- package/src/core/__tests__/catalog-cache-invalidation.test.ts +2 -1
- package/src/core/__tests__/lifecycle.test.ts +78 -1
- package/src/core/__tests__/public-config.test.ts +5 -1
- package/src/core/catalog-cache-invalidation.ts +16 -11
- package/src/core/core-ports.ts +19 -0
- package/src/core/create-core-server.ts +64 -107
- package/src/core/create-core-services.ts +238 -96
- package/src/core/lifecycle.ts +214 -29
- package/src/core/public-config.ts +8 -5
- package/src/core-config.ts +107 -8
- package/src/index.ts +25 -2
- package/src/modules/access/__tests__/access-control.admin-root-floor.test.ts +2 -1
- package/src/modules/access/__tests__/access-requests.recut.test.ts +134 -0
- package/src/modules/access/__tests__/access-requests.routes.test.ts +610 -0
- package/src/modules/access/__tests__/access.routes.batch.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.folder-governs.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.group-grant.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.overrides.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.proposal-branch.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.prospective.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.revoke.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.unknown-email.test.ts +2 -1
- package/src/modules/access/__tests__/change-read-gate.test.ts +13 -11
- package/src/modules/access/__tests__/creator-access.test.ts +3 -2
- package/src/modules/access/__tests__/roles.routes.test.ts +2 -1
- package/src/modules/access/access-control.service.ts +20 -6
- package/src/modules/access/access-requests.contract.ts +93 -0
- package/src/modules/access/access-requests.routes.ts +286 -0
- package/src/modules/access/access-requests.service.ts +420 -0
- package/src/modules/access/access.routes.ts +10 -13
- package/src/modules/access/change-read-gate.ts +10 -4
- package/src/modules/access/creator-access.ts +7 -2
- package/src/modules/access-model/access-grammar.ts +22 -0
- package/src/modules/agent-instructions/__tests__/read-preamble.test.ts +13 -12
- package/src/modules/agent-instructions/read-preamble.ts +10 -12
- package/src/modules/auth/__tests__/account.routes.test.ts +15 -0
- package/src/modules/auth/__tests__/auth.service.test.ts +98 -0
- package/src/modules/auth/account-admission.ts +44 -0
- package/src/modules/auth/account.routes.ts +4 -1
- package/src/modules/auth/auth.service.ts +61 -2
- package/src/modules/auth/oidc-auth-provider.ts +9 -0
- package/src/modules/connection-probe/connection-probe.service.ts +7 -1
- package/src/modules/database/__tests__/advisory-lock.test.ts +23 -1
- package/src/modules/database/__tests__/connection.test.ts +98 -0
- package/src/modules/database/__tests__/migrations-unqualified.test.ts +32 -0
- package/src/modules/database/advisory-lock.ts +28 -4
- package/src/modules/database/connection.ts +143 -13
- package/src/modules/database/migrate.ts +48 -14
- package/src/modules/diff/__tests__/diff.service.seed-atomicity.test.ts +2 -1
- package/src/modules/diff/__tests__/diff.service.test.ts +2 -1
- package/src/modules/github-app/__tests__/github-app.test.ts +848 -0
- package/src/modules/github-app/github-app.client.ts +268 -0
- package/src/modules/github-app/github-app.connection.ts +204 -0
- package/src/modules/github-app/github-app.routes.ts +359 -0
- package/src/modules/github-app/index.ts +19 -0
- package/src/modules/kb-fs/__tests__/branch-name.test.ts +6 -6
- package/src/modules/kb-fs/__tests__/clone-config.test.ts +24 -20
- package/src/modules/kb-fs/__tests__/remote-url.test.ts +38 -0
- package/src/modules/kb-fs/branch-name.ts +3 -3
- package/src/modules/kb-fs/clone-config.ts +15 -12
- package/src/modules/kb-fs/remote-url.ts +35 -0
- package/src/modules/marketplace/__tests__/marketplace-repo.head.test.ts +2 -1
- package/src/modules/mcp/mcp.service.ts +11 -4
- package/src/modules/plugins/__tests__/bundle-dialect.e2e.test.ts +12 -11
- package/src/modules/plugins/__tests__/bundle-dialect.test.ts +2 -1
- package/src/modules/plugins/__tests__/compile-marketplace.test.ts +6 -4
- package/src/modules/plugins/__tests__/join-proposals.test.ts +100 -19
- package/src/modules/plugins/__tests__/join-request-jobs.service.test.ts +2 -1
- package/src/modules/plugins/__tests__/join-requests.service.test.ts +28 -11
- package/src/modules/plugins/__tests__/join-requests.settlement.test.ts +371 -0
- package/src/modules/plugins/__tests__/plugin-creation-display-name.test.ts +4 -3
- package/src/modules/plugins/__tests__/plugin-index.service.test.ts +6 -4
- package/src/modules/plugins/__tests__/plugin-links.service.test.ts +220 -5
- package/src/modules/plugins/__tests__/plugin-provision.service.test.ts +3 -1
- package/src/modules/plugins/__tests__/plugin-rename.service.test.ts +7 -6
- package/src/modules/plugins/__tests__/plugins.routes.test.ts +12 -3
- package/src/modules/plugins/__tests__/teams.routes.test.ts +2 -1
- package/src/modules/plugins/compile/marketplace-compiler.service.ts +7 -9
- package/src/modules/plugins/discovery/__tests__/kb-plugin-source.test.ts +20 -16
- package/src/modules/plugins/discovery/bundle-dialect/bundle.source.ts +9 -2
- package/src/modules/plugins/discovery/kb-plugin-source.ts +15 -8
- package/src/modules/plugins/discovery/native.source.ts +4 -1
- package/src/modules/plugins/index.ts +1 -1
- package/src/modules/plugins/join-proposals.ts +87 -19
- package/src/modules/plugins/join-request-jobs.service.ts +8 -7
- package/src/modules/plugins/join-requests.service.ts +203 -43
- package/src/modules/plugins/plugin-links.service.ts +192 -19
- package/src/modules/plugins/plugin-links.ts +147 -27
- package/src/modules/plugins/plugin-provision.service.ts +54 -27
- package/src/modules/plugins/plugin-rename.service.ts +10 -10
- package/src/modules/plugins/plugins.routes.ts +48 -17
- package/src/modules/plugins/plugins.service.ts +7 -11
- package/src/modules/plugins/teams.routes.ts +16 -8
- package/src/modules/secrets-vault/__tests__/connect-pending.route.test.ts +7 -0
- package/src/modules/secrets-vault/__tests__/secrets-variable-loader.test.ts +40 -0
- package/src/modules/secrets-vault/__tests__/tool-owner-gate.route.test.ts +2 -0
- package/src/modules/secrets-vault/index.ts +2 -0
- package/src/modules/secrets-vault/secrets-variable-loader.ts +51 -21
- package/src/modules/secrets-vault/secrets-vault.routes.ts +7 -6
- package/src/modules/settings/__tests__/deployment-settings.service.test.ts +24 -11
- package/src/modules/settings/__tests__/git-root-folders.test.ts +2 -1
- package/src/modules/settings/__tests__/repository-source.test.ts +191 -0
- package/src/modules/settings/__tests__/setup.routes.boot-failure.test.ts +2 -1
- package/src/modules/settings/__tests__/setup.routes.git-mode.test.ts +353 -0
- package/src/modules/settings/__tests__/setup.routes.github-app.test.ts +282 -0
- package/src/modules/settings/__tests__/setup.routes.layout-phase.test.ts +7 -4
- package/src/modules/settings/__tests__/setup.routes.managed-phase.test.ts +233 -0
- package/src/modules/settings/__tests__/setup.routes.oidc.test.ts +2 -0
- package/src/modules/settings/__tests__/setup.routes.sync-status.test.ts +2 -0
- package/src/modules/settings/__tests__/setup.routes.test.ts +33 -52
- package/src/modules/settings/deployment-settings.service.ts +130 -23
- package/src/modules/settings/managed-repository.ts +68 -0
- package/src/modules/settings/repository-source.ts +197 -0
- package/src/modules/settings/setup.routes.ts +233 -19
- package/src/modules/skills/__tests__/allowed-tools-check.test.ts +11 -10
- package/src/modules/skills/__tests__/allowed-tools-warn.tools.test.ts +4 -3
- package/src/modules/skills/__tests__/pending-skills.service.test.ts +3 -1
- package/src/modules/skills/__tests__/skill-access-requests.routes.test.ts +7 -2
- package/src/modules/skills/__tests__/skills.routes.warnings.test.ts +2 -1
- package/src/modules/skills/__tests__/skills.service.test.ts +3 -2
- package/src/modules/skills/allowed-tools-check.ts +7 -6
- package/src/modules/skills/pending-skills.service.ts +9 -8
- package/src/modules/skills/skill-access-requests.routes.ts +29 -79
- package/src/modules/skills/skills.routes.ts +4 -3
- package/src/modules/skills/skills.service.ts +13 -9
- package/src/modules/tool-helpers/__tests__/agent-roles-write.test.ts +3 -2
- package/src/modules/tool-helpers/__tests__/phase4-tools.test.ts +3 -2
- package/src/modules/tool-helpers/tool-context.ts +15 -0
- package/src/modules/tool-manuals/__tests__/mcp-json-discovery.test.ts +17 -12
- package/src/modules/tool-manuals/__tests__/mcp-server-edit.service.test.ts +2 -1
- package/src/modules/tool-manuals/__tests__/pending-tools.service.test.ts +4 -1
- package/src/modules/tool-manuals/__tests__/tool-delete.service.test.ts +2 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.archive.route.test.ts +2 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.cli.test.ts +5 -4
- package/src/modules/tool-manuals/__tests__/tool-manuals.detail.route.test.ts +2 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.invalid.routes.test.ts +4 -2
- package/src/modules/tool-manuals/__tests__/tool-manuals.invalid.test.ts +13 -5
- package/src/modules/tool-manuals/__tests__/tool-manuals.mcp-oauth.test.ts +2 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.restart.test.ts +9 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.service.test.ts +3 -2
- package/src/modules/tool-manuals/__tests__/tool-manuals.tools.test.ts +2 -0
- package/src/modules/tool-manuals/mcp-json-discovery.ts +6 -4
- package/src/modules/tool-manuals/mcp-server-edit.service.ts +13 -11
- package/src/modules/tool-manuals/pending-tools.service.ts +19 -16
- package/src/modules/tool-manuals/tool-delete.service.ts +13 -10
- package/src/modules/tool-manuals/tool-manuals.routes.ts +10 -8
- package/src/modules/tool-manuals/tool-manuals.service.ts +15 -13
- package/src/modules/tool-manuals/tool-manuals.tools.ts +7 -6
- package/src/modules/workflow/__tests__/apply-failure.test.ts +11 -2
- package/src/modules/workflow/__tests__/merge-announces-tree.test.ts +14 -26
- package/src/modules/workflow/__tests__/preserve-roles-yaml.test.ts +2 -1
- package/src/modules/workflow/__tests__/session-ontology.service.test.ts +3 -2
- package/src/modules/workflow/__tests__/workflow.routes.lock-path.test.ts +2 -1
- package/src/modules/workflow/__tests__/workflow.service.branch-in-use.test.ts +3 -10
- package/src/modules/workflow/__tests__/workflow.service.commitFileWhileLocked.test.ts +2 -1
- package/src/modules/workflow/__tests__/workflow.service.deleted-branch-sweep.test.ts +3 -10
- package/src/modules/workflow/__tests__/workflow.service.facade.test.ts +187 -35
- package/src/modules/workflow/__tests__/workflow.service.folder-proposals.test.ts +2 -1
- package/src/modules/workflow/__tests__/workflow.service.platform-restore.test.ts +2 -1
- package/src/modules/workflow/__tests__/workflow.service.read-gate.test.ts +3 -2
- package/src/modules/workflow/__tests__/workflow.service.releaseLock.test.ts +2 -1
- package/src/modules/workflow/__tests__/workflow.service.sync.test.ts +5 -4
- package/src/modules/workflow/__tests__/workflow.service.update-from-target.test.ts +148 -41
- package/src/modules/workflow/agent-tools/__tests__/workflow.tools.test.ts +143 -2
- package/src/modules/workflow/agent-tools/workflow.tools.ts +60 -12
- package/src/modules/workflow/git/__tests__/git.service.accessGating.test.ts +5 -4
- package/src/modules/workflow/git/__tests__/git.service.changedFilesForPr.test.ts +12 -11
- package/src/modules/workflow/git/__tests__/git.service.commitChanges.test.ts +9 -8
- package/src/modules/workflow/git/__tests__/git.service.commitFile.strayPath.test.ts +8 -7
- package/src/modules/workflow/git/__tests__/git.service.commitFile.test.ts +6 -5
- package/src/modules/workflow/git/__tests__/git.service.createBranch.test.ts +3 -2
- package/src/modules/workflow/git/__tests__/git.service.deleteBranch.test.ts +3 -2
- package/src/modules/workflow/git/__tests__/git.service.diffFileAtCommit.test.ts +7 -6
- package/src/modules/workflow/git/__tests__/git.service.diffFileBetweenBranches.test.ts +16 -15
- package/src/modules/workflow/git/__tests__/git.service.fileContentsAtCommit.test.ts +3 -2
- package/src/modules/workflow/git/__tests__/git.service.forkPoint.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.history-guards.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.list-branches.test.ts +10 -9
- package/src/modules/workflow/git/__tests__/git.service.listTrackedFiles.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.logForFile.test.ts +6 -5
- package/src/modules/workflow/git/__tests__/git.service.mergeChangeRequest.test.ts +9 -8
- package/src/modules/workflow/git/__tests__/git.service.pendingChanges.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.postMergePull.test.ts +4 -3
- package/src/modules/workflow/git/__tests__/git.service.pull.test.ts +130 -8
- package/src/modules/workflow/git/__tests__/git.service.readFileAtRef.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.revertPathsAndPush.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.status.test.ts +4 -3
- package/src/modules/workflow/git/__tests__/git.service.syncFromRemote.test.ts +8 -7
- package/src/modules/workflow/git/__tests__/node-git-runner.test.ts +41 -3
- package/src/modules/workflow/git/__tests__/pull-request.service.getPrDetail.test.ts +145 -2
- package/src/modules/workflow/git/__tests__/pull-request.service.viewer-can-delete.test.ts +166 -0
- package/src/modules/workflow/git/git.service.ts +49 -17
- package/src/modules/workflow/git/node-git-runner.ts +43 -4
- package/src/modules/workflow/git/pull-request.service.ts +119 -0
- package/src/modules/workflow/review-workflow/review-workflow.service.ts +9 -6
- package/src/modules/workflow/session-ontology.service.ts +7 -2
- package/src/modules/workflow/workflow.routes.ts +3 -1
- package/src/modules/workflow/workflow.service.ts +201 -76
- package/src/modules/workspace/__tests__/file-stat-access.test.ts +3 -2
- package/src/modules/workspace/__tests__/git-internals.security.test.ts +10 -9
- package/src/modules/workspace/__tests__/session-ontology.gate.test.ts +4 -2
- package/src/modules/workspace/__tests__/workspace-paths-inside-the-repo.test.ts +3 -2
- package/src/modules/workspace/__tests__/workspace.routes.branch-errors.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.create-grant.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.delete.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.download-implies-read.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.download.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.file-writes.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.folders.test.ts +5 -4
- package/src/modules/workspace/__tests__/workspace.routes.move-platform-files.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.read-gate.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.service.ensure-remotes-fetched.test.ts +2 -2
- package/src/modules/workspace/__tests__/workspace.service.list-cloned.test.ts +6 -5
- package/src/modules/workspace/__tests__/workspace.service.move-never-overwrites.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.service.read-filter.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.service.test.ts +84 -50
- package/src/modules/workspace/__tests__/workspace.service.unknown-branch.test.ts +45 -1
- package/src/modules/workspace/__tests__/workspace.tools.agents-file.test.ts +10 -7
- package/src/modules/workspace/__tests__/workspace.tools.branch-errors.test.ts +237 -10
- package/src/modules/workspace/__tests__/workspace.tools.test.ts +44 -11
- package/src/modules/workspace/__tests__/write-denial.test.ts +5 -4
- package/src/modules/workspace/session-ontology.gate.ts +6 -4
- package/src/modules/workspace/startup/__tests__/kb-startup-runner.degraded.test.ts +6 -2
- package/src/modules/workspace/startup/__tests__/kb-startup-runner.test.ts +240 -21
- package/src/modules/workspace/startup/kb-git.ts +15 -22
- package/src/modules/workspace/startup/kb-startup-runner.ts +198 -45
- package/src/modules/workspace/startup/steps/__tests__/steps.test.ts +104 -98
- package/src/modules/workspace/startup/steps/groups-to-plugins.step.ts +24 -16
- package/src/modules/workspace/startup/steps/personal-spaces.step.ts +14 -5
- package/src/modules/workspace/startup/steps/plugin-display-names.step.ts +13 -5
- package/src/modules/workspace/startup/steps/plugin-manifests.step.ts +14 -5
- package/src/modules/workspace/startup/steps/seed-tree.ts +11 -9
- package/src/modules/workspace/startup/steps/template-files.step.ts +43 -34
- package/src/modules/workspace/startup/steps/template-source.ts +8 -5
- package/src/modules/workspace/workspace.routes.ts +8 -7
- package/src/modules/workspace/workspace.service.ts +47 -28
- package/src/modules/workspace/workspace.tools.ts +56 -20
- package/src/modules/workspace/write-denial.ts +7 -5
- package/src/shared/__tests__/kb-layout.plugin.test.ts +19 -16
- package/src/shared/domain-errors.ts +58 -0
- package/src/shared/git.contract.ts +80 -8
- package/src/shared/kb-context.ts +130 -0
- package/src/shared/kb-layout.test.ts +37 -27
- package/src/shared/kb-layout.ts +4 -3
- package/src/shared/pending-proposals.ts +7 -4
- package/src/shared/redact-secret.ts +5 -5
- package/src/tenancy/__tests__/static-tenant-source.test.ts +177 -0
- package/src/tenancy/__tests__/tenant-host.test.ts +372 -0
- package/src/tenancy/__tests__/tenant-runtime.test.ts +221 -0
- package/src/tenancy/__tests__/tenant-secrets.test.ts +35 -0
- package/src/tenancy/index.ts +35 -0
- package/src/tenancy/static-tenant-source.ts +296 -0
- package/src/tenancy/tenant-host.ts +261 -0
- package/src/tenancy/tenant-runtime.ts +208 -0
- package/src/tenancy/tenant-secrets.ts +41 -0
- package/src/tenancy/tenant-source.contract.ts +59 -0
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { testKbContext } from '../../../../__tests__/kb-context.js';
|
|
2
3
|
import { execFile } from 'node:child_process';
|
|
3
4
|
import { promisify } from 'node:util';
|
|
4
5
|
import fs from 'node:fs/promises';
|
|
@@ -82,7 +83,7 @@ describe('GitService.listBranches', () => {
|
|
|
82
83
|
const svc = new GitService(
|
|
83
84
|
stubWorkspaceService(workspaceId, path.join(root, workspaceId)),
|
|
84
85
|
new WorkflowHooks(),
|
|
85
|
-
|
|
86
|
+
testKbContext(),
|
|
86
87
|
);
|
|
87
88
|
|
|
88
89
|
const branches = await svc.listBranches(workspaceId);
|
|
@@ -101,7 +102,7 @@ describe('GitService.listBranches', () => {
|
|
|
101
102
|
const svc = new GitService(
|
|
102
103
|
stubWorkspaceService(workspaceId, path.join(root, workspaceId)),
|
|
103
104
|
new WorkflowHooks(),
|
|
104
|
-
|
|
105
|
+
testKbContext(),
|
|
105
106
|
);
|
|
106
107
|
|
|
107
108
|
const branches = await svc.listBranches(workspaceId);
|
|
@@ -115,7 +116,7 @@ describe('GitService.listBranches', () => {
|
|
|
115
116
|
const svc = new GitService(
|
|
116
117
|
stubWorkspaceService(workspaceId, path.join(root, workspaceId)),
|
|
117
118
|
new WorkflowHooks(),
|
|
118
|
-
|
|
119
|
+
testKbContext(),
|
|
119
120
|
);
|
|
120
121
|
// Prime the cache: first call fetches and populates lastImplicitFetchAt.
|
|
121
122
|
await svc.listBranches(workspaceId);
|
|
@@ -131,7 +132,7 @@ describe('GitService.listBranches', () => {
|
|
|
131
132
|
const freshSvc = new GitService(
|
|
132
133
|
stubWorkspaceService(workspaceId, path.join(root, workspaceId)),
|
|
133
134
|
new WorkflowHooks(),
|
|
134
|
-
|
|
135
|
+
testKbContext(),
|
|
135
136
|
);
|
|
136
137
|
const branches = await freshSvc.listBranches(workspaceId);
|
|
137
138
|
expect(branches.map((b) => b.name)).toContain('bob/draft-two');
|
|
@@ -145,7 +146,7 @@ describe('GitService.listBranches', () => {
|
|
|
145
146
|
const svc = new GitService(
|
|
146
147
|
stubWorkspaceService(workspaceId, path.join(root, workspaceId)),
|
|
147
148
|
new WorkflowHooks(),
|
|
148
|
-
|
|
149
|
+
testKbContext(),
|
|
149
150
|
);
|
|
150
151
|
|
|
151
152
|
// Should not throw and should return the refs we already had on disk.
|
|
@@ -159,7 +160,7 @@ describe('GitService.listBranches', () => {
|
|
|
159
160
|
const svc = new GitService(
|
|
160
161
|
stubWorkspaceService(workspaceId, path.join(root, workspaceId)),
|
|
161
162
|
new WorkflowHooks(),
|
|
162
|
-
|
|
163
|
+
testKbContext(),
|
|
163
164
|
);
|
|
164
165
|
|
|
165
166
|
// current-company-state is the workspace clone's checked-out branch (the
|
|
@@ -179,7 +180,7 @@ describe('GitService.listBranches', () => {
|
|
|
179
180
|
const svc = new GitService(
|
|
180
181
|
stubWorkspaceService(workspaceId, path.join(root, workspaceId)),
|
|
181
182
|
new WorkflowHooks(),
|
|
182
|
-
|
|
183
|
+
testKbContext(),
|
|
183
184
|
);
|
|
184
185
|
// Simulate a just-completed clone — the workspace is freshly fetched.
|
|
185
186
|
svc.noteWorkspaceFetched(workspaceId);
|
|
@@ -205,7 +206,7 @@ describe('GitService.listBranches', () => {
|
|
|
205
206
|
const svc = new GitService(
|
|
206
207
|
stubWorkspaceService(workspaceId, path.join(root, workspaceId)),
|
|
207
208
|
new WorkflowHooks(),
|
|
208
|
-
|
|
209
|
+
testKbContext(),
|
|
209
210
|
);
|
|
210
211
|
const seen: string[][] = [];
|
|
211
212
|
svc.setBranchesListedListener((names) => seen.push(names));
|
|
@@ -222,7 +223,7 @@ describe('GitService.listBranches', () => {
|
|
|
222
223
|
const svc = new GitService(
|
|
223
224
|
stubWorkspaceService(workspaceId, path.join(root, workspaceId)),
|
|
224
225
|
new WorkflowHooks(),
|
|
225
|
-
|
|
226
|
+
testKbContext(),
|
|
226
227
|
);
|
|
227
228
|
svc.setBranchesListedListener(() => { throw new Error('listener blew up'); });
|
|
228
229
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { testKbContext } from '../../../../__tests__/kb-context.js';
|
|
2
3
|
import { execFile } from 'node:child_process';
|
|
3
4
|
import { promisify } from 'node:util';
|
|
4
5
|
import fs from 'node:fs/promises';
|
|
@@ -63,7 +64,7 @@ async function makeSvc(root: string, workspaceId: string) {
|
|
|
63
64
|
const svc = new GitService(
|
|
64
65
|
stubWorkspaceService(workspaceId, path.join(root, workspaceId)),
|
|
65
66
|
new WorkflowHooks(),
|
|
66
|
-
|
|
67
|
+
testKbContext(),
|
|
67
68
|
);
|
|
68
69
|
return { svc, repo };
|
|
69
70
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { testKbContext } from '../../../../__tests__/kb-context.js';
|
|
2
3
|
import { execFile } from 'node:child_process';
|
|
3
4
|
import { promisify } from 'node:util';
|
|
4
5
|
import fs from 'node:fs/promises';
|
|
@@ -120,7 +121,7 @@ describe('GitService.logForFile', () => {
|
|
|
120
121
|
const svc = new GitService(
|
|
121
122
|
stubWorkspaceService(workspaceId, workspaceDir),
|
|
122
123
|
new WorkflowHooks(),
|
|
123
|
-
|
|
124
|
+
testKbContext(),
|
|
124
125
|
);
|
|
125
126
|
|
|
126
127
|
await commitFile(repo, 'Knowledge/Foo.md', 'one\n', 'first save');
|
|
@@ -140,7 +141,7 @@ describe('GitService.logForFile', () => {
|
|
|
140
141
|
const svc = new GitService(
|
|
141
142
|
stubWorkspaceService(workspaceId, workspaceDir),
|
|
142
143
|
new WorkflowHooks(),
|
|
143
|
-
|
|
144
|
+
testKbContext(),
|
|
144
145
|
);
|
|
145
146
|
|
|
146
147
|
await commitFile(repo, 'Knowledge/Foo.md', 'base\n', 'base edit');
|
|
@@ -159,7 +160,7 @@ describe('GitService.logForFile', () => {
|
|
|
159
160
|
const svc = new GitService(
|
|
160
161
|
stubWorkspaceService(workspaceId, workspaceDir),
|
|
161
162
|
new WorkflowHooks(),
|
|
162
|
-
|
|
163
|
+
testKbContext(),
|
|
163
164
|
);
|
|
164
165
|
|
|
165
166
|
await runGit(repo, ['commit', '--allow-empty', '-m', 'init']);
|
|
@@ -174,7 +175,7 @@ describe('GitService.logForFile', () => {
|
|
|
174
175
|
const svc = new GitService(
|
|
175
176
|
stubWorkspaceService(workspaceId, workspaceDir),
|
|
176
177
|
new WorkflowHooks(),
|
|
177
|
-
|
|
178
|
+
testKbContext(),
|
|
178
179
|
);
|
|
179
180
|
|
|
180
181
|
// 110 commits is the minimum that still proves "clamped to 100" — going
|
|
@@ -206,7 +207,7 @@ describe('GitService.logForFile', () => {
|
|
|
206
207
|
const svc = new GitService(
|
|
207
208
|
stubWorkspaceService(workspaceId, workspaceDir),
|
|
208
209
|
new WorkflowHooks(),
|
|
209
|
-
|
|
210
|
+
testKbContext(),
|
|
210
211
|
);
|
|
211
212
|
await runGit(repo, ['commit', '--allow-empty', '-m', 'init']);
|
|
212
213
|
const user = { id: 'u', name: 'Test', email: 't@x.com' };
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { testKbContext } from '../../../../__tests__/kb-context.js';
|
|
2
3
|
import { execFile } from 'node:child_process';
|
|
3
4
|
import { promisify } from 'node:util';
|
|
4
5
|
import fs from 'node:fs/promises';
|
|
@@ -94,7 +95,7 @@ describe('GitService.mergeChangeRequest', () => {
|
|
|
94
95
|
await fs.writeFile(path.join(dir, 'feature.md'), 'new content\n');
|
|
95
96
|
});
|
|
96
97
|
|
|
97
|
-
const git = new GitService(stubWorkspaceService(baseWsId, baseRepo), new WorkflowHooks(),
|
|
98
|
+
const git = new GitService(stubWorkspaceService(baseWsId, baseRepo), new WorkflowHooks(), testKbContext());
|
|
98
99
|
const result = await git.mergeChangeRequest(
|
|
99
100
|
baseWsId, 'alice/add', BASE, { subject: 'Add feature (#1)', body: 'Merged via Bevel' }, USER,
|
|
100
101
|
);
|
|
@@ -129,7 +130,7 @@ describe('GitService.mergeChangeRequest', () => {
|
|
|
129
130
|
await runGit(root, ['clone', '-b', 'tmp-base-advance', upstream, advancer]);
|
|
130
131
|
await runGit(advancer, ['push', 'origin', 'tmp-base-advance:' + BASE]);
|
|
131
132
|
|
|
132
|
-
const git = new GitService(stubWorkspaceService(baseWsId, baseRepo), new WorkflowHooks(),
|
|
133
|
+
const git = new GitService(stubWorkspaceService(baseWsId, baseRepo), new WorkflowHooks(), testKbContext());
|
|
133
134
|
const result = await git.mergeChangeRequest(
|
|
134
135
|
baseWsId, 'alice/edit', BASE, { subject: 'Edit (#2)', body: 'x' }, USER,
|
|
135
136
|
);
|
|
@@ -163,7 +164,7 @@ describe('GitService.mergeChangeRequest', () => {
|
|
|
163
164
|
// A save that has not been shared yet, exactly as a file tool leaves it.
|
|
164
165
|
await fs.writeFile(path.join(baseRepo, 'base.md'), 'edited but not shared\n');
|
|
165
166
|
|
|
166
|
-
const git = new GitService(stubWorkspaceService(baseWsId, baseRepo), new WorkflowHooks(),
|
|
167
|
+
const git = new GitService(stubWorkspaceService(baseWsId, baseRepo), new WorkflowHooks(), testKbContext());
|
|
167
168
|
await expect(
|
|
168
169
|
git.mergeChangeRequest(
|
|
169
170
|
baseWsId, 'alice/add', BASE, { subject: 'Add (#1)', body: 'x' }, USER,
|
|
@@ -188,7 +189,7 @@ describe('GitService.mergeChangeRequest', () => {
|
|
|
188
189
|
await runGit(baseRepo, ['add', '-A']);
|
|
189
190
|
await runGit(baseRepo, ['commit', '-m', 'local only']);
|
|
190
191
|
|
|
191
|
-
const git = new GitService(stubWorkspaceService(baseWsId, baseRepo), new WorkflowHooks(),
|
|
192
|
+
const git = new GitService(stubWorkspaceService(baseWsId, baseRepo), new WorkflowHooks(), testKbContext());
|
|
192
193
|
await expect(
|
|
193
194
|
git.mergeChangeRequest(
|
|
194
195
|
baseWsId, 'alice/add', BASE, { subject: 'Add (#1)', body: 'x' }, USER,
|
|
@@ -203,7 +204,7 @@ describe('GitService.mergeChangeRequest', () => {
|
|
|
203
204
|
await pushFeatureBranch(root, upstream, 'alice/add', async (dir) => {
|
|
204
205
|
await fs.writeFile(path.join(dir, 'feature.md'), 'new content\n');
|
|
205
206
|
});
|
|
206
|
-
const git = new GitService(stubWorkspaceService(baseWsId, baseRepo), new WorkflowHooks(),
|
|
207
|
+
const git = new GitService(stubWorkspaceService(baseWsId, baseRepo), new WorkflowHooks(), testKbContext());
|
|
207
208
|
const result = await git.mergeChangeRequest(
|
|
208
209
|
baseWsId, 'alice/add', BASE, { subject: 'Add (#1)', body: 'x' }, USER,
|
|
209
210
|
{ requireCleanTarget: true },
|
|
@@ -236,7 +237,7 @@ describe('GitService.mergeChangeRequest', () => {
|
|
|
236
237
|
const publishedTip = (await gitOut(advancer, ['rev-parse', 'HEAD'])).trim();
|
|
237
238
|
expect(staleHead).not.toBe(publishedTip);
|
|
238
239
|
|
|
239
|
-
const git = new GitService(stubWorkspaceService(baseWsId, baseRepo), new WorkflowHooks(),
|
|
240
|
+
const git = new GitService(stubWorkspaceService(baseWsId, baseRepo), new WorkflowHooks(), testKbContext());
|
|
240
241
|
const seen: { sha: string; changedPaths: string[] }[] = [];
|
|
241
242
|
const result = await git.mergeChangeRequest(
|
|
242
243
|
baseWsId, 'alice/add', BASE, { subject: 'Add (#1)', body: 'x' }, USER,
|
|
@@ -254,7 +255,7 @@ describe('GitService.mergeChangeRequest', () => {
|
|
|
254
255
|
await pushFeatureBranch(root, upstream, 'alice/add', async (dir) => {
|
|
255
256
|
await fs.writeFile(path.join(dir, 'feature.md'), 'new content\n');
|
|
256
257
|
});
|
|
257
|
-
const git = new GitService(stubWorkspaceService(baseWsId, baseRepo), new WorkflowHooks(),
|
|
258
|
+
const git = new GitService(stubWorkspaceService(baseWsId, baseRepo), new WorkflowHooks(), testKbContext());
|
|
258
259
|
await expect(
|
|
259
260
|
git.mergeChangeRequest(
|
|
260
261
|
baseWsId, 'alice/add', BASE, { subject: 'Add (#1)', body: 'x' }, USER,
|
|
@@ -279,7 +280,7 @@ describe('GitService.mergeChangeRequest', () => {
|
|
|
279
280
|
await runGit(dir, ['mv', 'roles.yaml', 'people.yaml']);
|
|
280
281
|
});
|
|
281
282
|
|
|
282
|
-
const git = new GitService(stubWorkspaceService(baseWsId, baseRepo), new WorkflowHooks(),
|
|
283
|
+
const git = new GitService(stubWorkspaceService(baseWsId, baseRepo), new WorkflowHooks(), testKbContext());
|
|
283
284
|
const seen: string[][] = [];
|
|
284
285
|
const result = await git.mergeChangeRequest(
|
|
285
286
|
baseWsId, 'alice/rename', BASE, { subject: 'Rename (#1)', body: 'x' }, USER,
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { testKbContext } from '../../../../__tests__/kb-context.js';
|
|
2
3
|
import { execFile } from 'node:child_process';
|
|
3
4
|
import { promisify } from 'node:util';
|
|
4
5
|
import fs from 'node:fs/promises';
|
|
@@ -72,7 +73,7 @@ async function makeSvc(root: string, workspaceId: string) {
|
|
|
72
73
|
const svc = new GitService(
|
|
73
74
|
stubWorkspaceService(workspaceId, workspaceDir),
|
|
74
75
|
new WorkflowHooks(),
|
|
75
|
-
|
|
76
|
+
testKbContext(),
|
|
76
77
|
);
|
|
77
78
|
return { svc, repo };
|
|
78
79
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { testKbContext } from '../../../../__tests__/kb-context.js';
|
|
2
3
|
import { execFile } from 'node:child_process';
|
|
3
4
|
import { promisify } from 'node:util';
|
|
4
5
|
import fs from 'node:fs/promises';
|
|
@@ -109,7 +110,7 @@ describe('post-merge refresh of the target branch workspace', () => {
|
|
|
109
110
|
[baseWsId]: path.dirname(baseRepo),
|
|
110
111
|
}),
|
|
111
112
|
stubWorkflowHooks(),
|
|
112
|
-
KB_DIR,
|
|
113
|
+
testKbContext({ kbDirName: KB_DIR }),
|
|
113
114
|
);
|
|
114
115
|
|
|
115
116
|
// 1. The merge lands on origin/BASE (run from the caller's workspace).
|
|
@@ -163,7 +164,7 @@ describe('post-merge refresh of the target branch workspace', () => {
|
|
|
163
164
|
[baseWsId]: path.dirname(baseRepo),
|
|
164
165
|
}),
|
|
165
166
|
stubWorkflowHooks(),
|
|
166
|
-
KB_DIR,
|
|
167
|
+
testKbContext({ kbDirName: KB_DIR }),
|
|
167
168
|
);
|
|
168
169
|
|
|
169
170
|
const merged = await git.mergeChangeRequest(
|
|
@@ -254,7 +255,7 @@ describe('post-merge refresh of the target branch workspace', () => {
|
|
|
254
255
|
[baseWsId]: path.dirname(baseRepo),
|
|
255
256
|
}),
|
|
256
257
|
stubWorkflowHooks(),
|
|
257
|
-
KB_DIR,
|
|
258
|
+
testKbContext({ kbDirName: KB_DIR }),
|
|
258
259
|
);
|
|
259
260
|
|
|
260
261
|
const merged = await git.mergeChangeRequest(
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { testKbContext } from '../../../../__tests__/kb-context.js';
|
|
2
3
|
import fs from 'node:fs/promises';
|
|
3
4
|
import path from 'node:path';
|
|
4
5
|
import os from 'node:os';
|
|
@@ -85,7 +86,7 @@ describe('GitService.pull', () => {
|
|
|
85
86
|
const svc = new GitService(
|
|
86
87
|
stubWorkspaceService({ [workspaceId]: path.join(root, workspaceId) }),
|
|
87
88
|
stubWorkflowHooks(),
|
|
88
|
-
|
|
89
|
+
testKbContext(),
|
|
89
90
|
);
|
|
90
91
|
|
|
91
92
|
await expect(svc.pull(workspaceId)).resolves.toEqual({ treeChanged: true });
|
|
@@ -128,7 +129,7 @@ describe('GitService.pull', () => {
|
|
|
128
129
|
const svc = new GitService(
|
|
129
130
|
stubWorkspaceService({ [workspaceId]: path.join(root, workspaceId) }),
|
|
130
131
|
stubWorkflowHooks(),
|
|
131
|
-
|
|
132
|
+
testKbContext(),
|
|
132
133
|
);
|
|
133
134
|
|
|
134
135
|
await expect(svc.pull(workspaceId)).resolves.toEqual({ treeChanged: true });
|
|
@@ -174,7 +175,7 @@ describe('GitService.pull', () => {
|
|
|
174
175
|
const svc = new GitService(
|
|
175
176
|
stubWorkspaceService({ [workspaceId]: path.join(root, workspaceId) }),
|
|
176
177
|
stubWorkflowHooks(),
|
|
177
|
-
|
|
178
|
+
testKbContext(),
|
|
178
179
|
);
|
|
179
180
|
|
|
180
181
|
await expect(svc.pull(workspaceId)).resolves.toEqual({ treeChanged: true });
|
|
@@ -219,7 +220,7 @@ describe('GitService.pull', () => {
|
|
|
219
220
|
const svc = new GitService(
|
|
220
221
|
stubWorkspaceService({ [workspaceId]: path.join(root, workspaceId) }),
|
|
221
222
|
stubWorkflowHooks(),
|
|
222
|
-
|
|
223
|
+
testKbContext(),
|
|
223
224
|
);
|
|
224
225
|
|
|
225
226
|
await expect(svc.pull(workspaceId)).resolves.toEqual({ treeChanged: true });
|
|
@@ -247,7 +248,7 @@ describe('GitService.pull', () => {
|
|
|
247
248
|
const svc = new GitService(
|
|
248
249
|
stubWorkspaceService({ [workspaceId]: path.join(root, workspaceId) }),
|
|
249
250
|
stubWorkflowHooks(),
|
|
250
|
-
|
|
251
|
+
testKbContext(),
|
|
251
252
|
);
|
|
252
253
|
|
|
253
254
|
await expect(svc.pull(workspaceId)).resolves.toEqual({ treeChanged: false });
|
|
@@ -269,7 +270,7 @@ describe('GitService.pull', () => {
|
|
|
269
270
|
const svc = new GitService(
|
|
270
271
|
stubWorkspaceService({ [workspaceId]: path.join(root, workspaceId) }),
|
|
271
272
|
stubWorkflowHooks(),
|
|
272
|
-
|
|
273
|
+
testKbContext(),
|
|
273
274
|
);
|
|
274
275
|
|
|
275
276
|
await expect(svc.pull(workspaceId)).resolves.toEqual({ treeChanged: false });
|
|
@@ -311,7 +312,7 @@ describe('GitService.pull', () => {
|
|
|
311
312
|
const svc = new GitService(
|
|
312
313
|
stubWorkspaceService({ [workspaceId]: path.join(root, workspaceId) }),
|
|
313
314
|
stubWorkflowHooks(),
|
|
314
|
-
|
|
315
|
+
testKbContext(),
|
|
315
316
|
);
|
|
316
317
|
|
|
317
318
|
const err = await svc.pull(workspaceId).then(() => null).catch((e: unknown) => e);
|
|
@@ -338,7 +339,7 @@ describe('GitService.pull', () => {
|
|
|
338
339
|
const svc = new GitService(
|
|
339
340
|
stubWorkspaceService({ [workspaceId]: path.join(root, workspaceId) }),
|
|
340
341
|
stubWorkflowHooks(),
|
|
341
|
-
|
|
342
|
+
testKbContext(),
|
|
342
343
|
);
|
|
343
344
|
|
|
344
345
|
await expect(svc.hasUnpushedCommits(workspaceId)).resolves.toBe(false);
|
|
@@ -352,3 +353,124 @@ describe('GitService.pull', () => {
|
|
|
352
353
|
await expect(svc.hasUnpushedCommits(workspaceId)).resolves.toBe(false);
|
|
353
354
|
});
|
|
354
355
|
});
|
|
356
|
+
|
|
357
|
+
/**
|
|
358
|
+
* `preserveMerges` — why an unpushed MERGE must survive the pull's rebase.
|
|
359
|
+
*
|
|
360
|
+
* The change-request Update merges the target into the proposal branch and
|
|
361
|
+
* pushes. When that push fails, the merge sits in the clone, and the NEXT
|
|
362
|
+
* update pulls first. A plain `git rebase` replays `--no-merges
|
|
363
|
+
* upstream..HEAD`, which turns that merge commit into cherry-picks of the
|
|
364
|
+
* commits it merged: the target stops being a parent, so the branch never
|
|
365
|
+
* contains the target's head however many times the update runs, and the
|
|
366
|
+
* request stays behind for good.
|
|
367
|
+
*/
|
|
368
|
+
describe('GitService.pull — an unpushed merge commit', () => {
|
|
369
|
+
let root: string;
|
|
370
|
+
const workspaceId = 'alice%2Fdeal';
|
|
371
|
+
|
|
372
|
+
beforeEach(async () => {
|
|
373
|
+
root = await fs.mkdtemp(path.join(os.tmpdir(), 'bevel-git-pull-merges-'));
|
|
374
|
+
});
|
|
375
|
+
|
|
376
|
+
afterEach(async () => {
|
|
377
|
+
await fs.rm(root, { recursive: true, force: true, maxRetries: 10, retryDelay: 100 });
|
|
378
|
+
});
|
|
379
|
+
|
|
380
|
+
/**
|
|
381
|
+
* A clone of `alice/deal` holding a merge of `target-company-state` that
|
|
382
|
+
* origin has not seen, with origin's own `alice/deal` one commit further on
|
|
383
|
+
* so the pull has something to rebase ONTO.
|
|
384
|
+
*/
|
|
385
|
+
async function seedUnpushedMerge(): Promise<{ repo: string; targetTip: string }> {
|
|
386
|
+
const upstream = path.join(root, 'upstream.git');
|
|
387
|
+
await runGit(root, ['init', '--bare', '-b', 'target-company-state', upstream]);
|
|
388
|
+
|
|
389
|
+
const seed = path.join(root, '.seed');
|
|
390
|
+
await fs.mkdir(seed);
|
|
391
|
+
await runGit(seed, ['init', '-b', 'target-company-state']);
|
|
392
|
+
await runGit(seed, ['remote', 'add', 'origin', upstream]);
|
|
393
|
+
await fs.writeFile(path.join(seed, 'shared.txt'), 'one\n');
|
|
394
|
+
await runGit(seed, ['add', '.']);
|
|
395
|
+
await runGit(seed, ['commit', '-m', 'init']);
|
|
396
|
+
await runGit(seed, ['push', 'origin', 'target-company-state']);
|
|
397
|
+
// The proposal branch, forked here.
|
|
398
|
+
await runGit(seed, ['checkout', '-b', 'alice/deal']);
|
|
399
|
+
await fs.writeFile(path.join(seed, 'proposal.txt'), 'alice proposes\n');
|
|
400
|
+
await runGit(seed, ['add', '.']);
|
|
401
|
+
await runGit(seed, ['commit', '-m', 'propose']);
|
|
402
|
+
await runGit(seed, ['push', 'origin', 'alice/deal']);
|
|
403
|
+
// The target moves on, in a file the proposal does not touch.
|
|
404
|
+
await runGit(seed, ['checkout', 'target-company-state']);
|
|
405
|
+
await fs.writeFile(path.join(seed, 'elsewhere.txt'), 'someone else\n');
|
|
406
|
+
await runGit(seed, ['add', '.']);
|
|
407
|
+
await runGit(seed, ['commit', '-m', 'target moves']);
|
|
408
|
+
await runGit(seed, ['push', 'origin', 'target-company-state']);
|
|
409
|
+
const targetTip = await gitOut(seed, ['rev-parse', 'HEAD']);
|
|
410
|
+
|
|
411
|
+
const workspaceDir = path.join(root, workspaceId);
|
|
412
|
+
const repo = path.join(workspaceDir, 'knowledge-base');
|
|
413
|
+
await fs.mkdir(workspaceDir, { recursive: true });
|
|
414
|
+
await runGit(root, ['clone', '-b', 'alice/deal', upstream, repo]);
|
|
415
|
+
await runGit(repo, ['config', 'user.email', 'workspace@bevel.test']);
|
|
416
|
+
await runGit(repo, ['config', 'user.name', 'bevel Workspace']);
|
|
417
|
+
await runGit(repo, ['config', 'core.autocrlf', 'false']);
|
|
418
|
+
|
|
419
|
+
// The Update that merged and could not push: a real merge commit in the
|
|
420
|
+
// clone, with the target's tip as its second parent.
|
|
421
|
+
await runGit(repo, ['fetch', 'origin']);
|
|
422
|
+
await runGit(repo, [
|
|
423
|
+
'merge', '--no-ff', '-m', 'Refresh alice/deal', 'origin/target-company-state',
|
|
424
|
+
]);
|
|
425
|
+
expect(await gitOut(repo, ['rev-list', '--count', '--merges', 'HEAD'])).toBe('1');
|
|
426
|
+
|
|
427
|
+
// Origin's alice/deal moves on too (the author saved from another client),
|
|
428
|
+
// so the pull has a real rebase to do rather than nothing.
|
|
429
|
+
await runGit(seed, ['checkout', 'alice/deal']);
|
|
430
|
+
await fs.writeFile(path.join(seed, 'proposal.txt'), 'alice proposes\nand adds\n');
|
|
431
|
+
await runGit(seed, ['add', '.']);
|
|
432
|
+
await runGit(seed, ['commit', '-m', 'another save']);
|
|
433
|
+
await runGit(seed, ['push', 'origin', 'alice/deal']);
|
|
434
|
+
|
|
435
|
+
return { repo, targetTip };
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
function svcFor(): GitService {
|
|
439
|
+
return new GitService(
|
|
440
|
+
stubWorkspaceService({ [workspaceId]: path.join(root, workspaceId) }),
|
|
441
|
+
stubWorkflowHooks(),
|
|
442
|
+
testKbContext(),
|
|
443
|
+
);
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
it('is flattened by a plain pull — the branch stops containing the target', async () => {
|
|
447
|
+
// The bug, stated as the behaviour that causes it. Kept as a test so the
|
|
448
|
+
// option below is never "simplified" away as redundant.
|
|
449
|
+
const { repo, targetTip } = await seedUnpushedMerge();
|
|
450
|
+
await svcFor().pull(workspaceId);
|
|
451
|
+
|
|
452
|
+
expect(await gitOut(repo, ['rev-list', '--count', '--merges', 'HEAD'])).toBe('0');
|
|
453
|
+
const contains = await gitOut(repo, [
|
|
454
|
+
'merge-base', '--is-ancestor', targetTip, 'HEAD',
|
|
455
|
+
]).then(() => true, () => false);
|
|
456
|
+
expect(contains).toBe(false);
|
|
457
|
+
});
|
|
458
|
+
|
|
459
|
+
it('survives `preserveMerges`, and the branch still contains the target', async () => {
|
|
460
|
+
const { repo, targetTip } = await seedUnpushedMerge();
|
|
461
|
+
await svcFor().pull(workspaceId, { preserveMerges: true });
|
|
462
|
+
|
|
463
|
+
// The merge is still a merge...
|
|
464
|
+
expect(await gitOut(repo, ['rev-list', '--count', '--merges', 'HEAD'])).toBe('1');
|
|
465
|
+
// ...so the target's head is an ancestor of the branch, which is exactly
|
|
466
|
+
// what "this request is no longer behind" means.
|
|
467
|
+
const contains = await gitOut(repo, [
|
|
468
|
+
'merge-base', '--is-ancestor', targetTip, 'HEAD',
|
|
469
|
+
]).then(() => true, () => false);
|
|
470
|
+
expect(contains).toBe(true);
|
|
471
|
+
// And the save origin had that the clone did not is replayed on top.
|
|
472
|
+
expect(await fs.readFile(path.join(repo, 'proposal.txt'), 'utf8')).toBe(
|
|
473
|
+
'alice proposes\nand adds\n',
|
|
474
|
+
);
|
|
475
|
+
});
|
|
476
|
+
});
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { testKbContext } from '../../../../__tests__/kb-context.js';
|
|
2
3
|
import { execFile } from 'node:child_process';
|
|
3
4
|
import { promisify } from 'node:util';
|
|
4
5
|
import fs from 'node:fs/promises';
|
|
@@ -59,7 +60,7 @@ describe('GitService.readFileAtRef', () => {
|
|
|
59
60
|
return new GitService(
|
|
60
61
|
stubWorkspaceService(workspaceId, workspaceDir),
|
|
61
62
|
new WorkflowHooks(),
|
|
62
|
-
PROCESS_MAP_DIR,
|
|
63
|
+
testKbContext({ kbDirName: PROCESS_MAP_DIR }),
|
|
63
64
|
);
|
|
64
65
|
}
|
|
65
66
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { testKbContext } from '../../../../__tests__/kb-context.js';
|
|
2
3
|
import fs from 'node:fs/promises';
|
|
3
4
|
import path from 'node:path';
|
|
4
5
|
import os from 'node:os';
|
|
@@ -58,7 +59,7 @@ async function seed(root: string, branches: string[]): Promise<Fixture> {
|
|
|
58
59
|
await runGit(repo, ['config', 'core.autocrlf', 'false']);
|
|
59
60
|
repos[b] = repo;
|
|
60
61
|
}
|
|
61
|
-
const svc = new GitService(stubWorkspaceService(dirs), stubWorkflowHooks(), KB);
|
|
62
|
+
const svc = new GitService(stubWorkspaceService(dirs), stubWorkflowHooks(), testKbContext({ kbDirName: KB }));
|
|
62
63
|
return { upstream, base, repos, svc };
|
|
63
64
|
}
|
|
64
65
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { testKbContext } from '../../../../__tests__/kb-context.js';
|
|
2
3
|
import { execFile } from 'node:child_process';
|
|
3
4
|
import { promisify } from 'node:util';
|
|
4
5
|
import fs from 'node:fs/promises';
|
|
@@ -80,7 +81,7 @@ describe('GitService.status — hasUpstream', () => {
|
|
|
80
81
|
|
|
81
82
|
it('reports hasUpstream=true on a tracked branch (cloned from origin)', async () => {
|
|
82
83
|
const { workspaceDir } = await seedWorkspace(root, workspaceId);
|
|
83
|
-
const svc = new GitService(stubWorkspaceService(workspaceId, workspaceDir), new WorkflowHooks(),
|
|
84
|
+
const svc = new GitService(stubWorkspaceService(workspaceId, workspaceDir), new WorkflowHooks(), testKbContext());
|
|
84
85
|
|
|
85
86
|
const status = await svc.status(workspaceId);
|
|
86
87
|
expect(status.branch).toBe('current-company-state');
|
|
@@ -96,7 +97,7 @@ describe('GitService.status — hasUpstream', () => {
|
|
|
96
97
|
await runGit(repo, ['checkout', '-b', 'alice/unpublished-draft']);
|
|
97
98
|
await runGit(repo, ['commit', '--allow-empty', '-m', 'local-only edit']);
|
|
98
99
|
|
|
99
|
-
const svc = new GitService(stubWorkspaceService(workspaceId, workspaceDir), new WorkflowHooks(),
|
|
100
|
+
const svc = new GitService(stubWorkspaceService(workspaceId, workspaceDir), new WorkflowHooks(), testKbContext());
|
|
100
101
|
const status = await svc.status(workspaceId);
|
|
101
102
|
|
|
102
103
|
expect(status.branch).toBe('alice/unpublished-draft');
|
|
@@ -114,7 +115,7 @@ describe('GitService.status — hasUpstream', () => {
|
|
|
114
115
|
await runGit(repo, ['commit', '--allow-empty', '-m', 'two']);
|
|
115
116
|
await runGit(repo, ['push', '-u', 'origin', 'alice/published-draft']);
|
|
116
117
|
|
|
117
|
-
const svc = new GitService(stubWorkspaceService(workspaceId, workspaceDir), new WorkflowHooks(),
|
|
118
|
+
const svc = new GitService(stubWorkspaceService(workspaceId, workspaceDir), new WorkflowHooks(), testKbContext());
|
|
118
119
|
const status = await svc.status(workspaceId);
|
|
119
120
|
|
|
120
121
|
expect(status.branch).toBe('alice/published-draft');
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { testKbContext } from '../../../../__tests__/kb-context.js';
|
|
2
3
|
import fs from 'node:fs/promises';
|
|
3
4
|
import path from 'node:path';
|
|
4
5
|
import os from 'node:os';
|
|
@@ -81,7 +82,7 @@ describe('GitService.syncFromRemote', () => {
|
|
|
81
82
|
await fs.writeFile(path.join(dir, 'b.md'), 'b\n');
|
|
82
83
|
await fs.rename(path.join(dir, 'old name.md'), path.join(dir, 'new name.md'));
|
|
83
84
|
});
|
|
84
|
-
const git = new GitService(stubWorkspaceService({ ws: workspaceDir }), stubWorkflowHooks(),
|
|
85
|
+
const git = new GitService(stubWorkspaceService({ ws: workspaceDir }), stubWorkflowHooks(), testKbContext());
|
|
85
86
|
|
|
86
87
|
const r = await git.syncFromRemote('ws');
|
|
87
88
|
expect(r.before).toBe(before);
|
|
@@ -105,7 +106,7 @@ describe('GitService.syncFromRemote', () => {
|
|
|
105
106
|
await runGit(repo, ['config', 'user.email', 'workspace@bevel.test']);
|
|
106
107
|
await runGit(repo, ['config', 'user.name', 'bevel Workspace']);
|
|
107
108
|
await runGit(repo, ['checkout', '-b', BRANCH]).catch(() => undefined);
|
|
108
|
-
const git = new GitService(stubWorkspaceService({ ws: workspaceDir }), stubWorkflowHooks(),
|
|
109
|
+
const git = new GitService(stubWorkspaceService({ ws: workspaceDir }), stubWorkflowHooks(), testKbContext());
|
|
109
110
|
|
|
110
111
|
// Still empty on both sides: nothing to sync, and NOT 'remote gone' — a
|
|
111
112
|
// fresh deployment nobody has pushed to must never have its clone retired.
|
|
@@ -134,7 +135,7 @@ describe('GitService.syncFromRemote', () => {
|
|
|
134
135
|
await runGit(upstream, ['branch', 'ali/x', BRANCH]);
|
|
135
136
|
const { workspaceDir } = await cloneWorkspace(root, upstream, 'ali%2Fx', 'ali/x');
|
|
136
137
|
await runGit(upstream, ['update-ref', '-d', 'refs/heads/ali/x']);
|
|
137
|
-
const git = new GitService(stubWorkspaceService({ 'ali%2Fx': workspaceDir }), stubWorkflowHooks(),
|
|
138
|
+
const git = new GitService(stubWorkspaceService({ 'ali%2Fx': workspaceDir }), stubWorkflowHooks(), testKbContext());
|
|
138
139
|
await expect(git.syncFromRemote('ali%2Fx')).rejects.toBeInstanceOf(RemoteBranchGoneError);
|
|
139
140
|
});
|
|
140
141
|
});
|
|
@@ -163,7 +164,7 @@ describe('GitService.syncFromRemote — the cases git exits 0 on but should not
|
|
|
163
164
|
await pushFromElsewhere(root, upstream, async (dir) => {
|
|
164
165
|
await fs.writeFile(path.join(dir, 'a.md'), 'edited on the host\n');
|
|
165
166
|
});
|
|
166
|
-
const git = new GitService(stubWorkspaceService({ ws: workspaceDir }), stubWorkflowHooks(),
|
|
167
|
+
const git = new GitService(stubWorkspaceService({ ws: workspaceDir }), stubWorkflowHooks(), testKbContext());
|
|
167
168
|
|
|
168
169
|
await expect(git.syncFromRemote('ws')).rejects.toMatchObject({
|
|
169
170
|
name: 'PullRebaseConflictError',
|
|
@@ -186,7 +187,7 @@ describe('GitService.syncFromRemote — the cases git exits 0 on but should not
|
|
|
186
187
|
await runGit(repo, ['rm', '-rf', '--cached', '.']).catch(() => undefined);
|
|
187
188
|
await fs.rm(path.join(repo, 'a.md'), { force: true });
|
|
188
189
|
await fs.rm(path.join(repo, 'old name.md'), { force: true });
|
|
189
|
-
const git = new GitService(stubWorkspaceService({ ws: workspaceDir }), stubWorkflowHooks(),
|
|
190
|
+
const git = new GitService(stubWorkspaceService({ ws: workspaceDir }), stubWorkflowHooks(), testKbContext());
|
|
190
191
|
await expect(git.syncFromRemote('ws')).rejects.toBeInstanceOf(RemoteBranchGoneError);
|
|
191
192
|
});
|
|
192
193
|
|
|
@@ -194,7 +195,7 @@ describe('GitService.syncFromRemote — the cases git exits 0 on but should not
|
|
|
194
195
|
const upstream = await bareUpstream(root, true);
|
|
195
196
|
await runGit(upstream, ['branch', 'ali/x', BRANCH]);
|
|
196
197
|
const { workspaceDir } = await cloneWorkspace(root, upstream, 'ws');
|
|
197
|
-
const git = new GitService(stubWorkspaceService({ ws: workspaceDir }), stubWorkflowHooks(),
|
|
198
|
+
const git = new GitService(stubWorkspaceService({ ws: workspaceDir }), stubWorkflowHooks(), testKbContext());
|
|
198
199
|
expect(await git.remoteBranchExists('ws', 'ali/x')).toBe(true);
|
|
199
200
|
await runGit(upstream, ['update-ref', '-d', 'refs/heads/ali/x']);
|
|
200
201
|
expect(await git.remoteBranchExists('ws', 'ali/x')).toBe(false);
|
|
@@ -241,7 +242,7 @@ describe('GitService.syncFromRemote — an unborn clone that already holds stage
|
|
|
241
242
|
await runGit(seed, ['add', '.']);
|
|
242
243
|
await runGit(seed, ['commit', '-m', 'first']);
|
|
243
244
|
await runGit(seed, ['push', upstream, BRANCH]);
|
|
244
|
-
const git = new GitService(stubWorkspaceService({ ws: workspaceDir }), stubWorkflowHooks(),
|
|
245
|
+
const git = new GitService(stubWorkspaceService({ ws: workspaceDir }), stubWorkflowHooks(), testKbContext());
|
|
245
246
|
|
|
246
247
|
await expect(git.syncFromRemote('ws')).rejects.toMatchObject({
|
|
247
248
|
name: 'PullRebaseConflictError',
|