@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
|
@@ -28,9 +28,10 @@ const mergeLog = logger('merge');
|
|
|
28
28
|
import { promises as fs } from 'node:fs';
|
|
29
29
|
import { execFile } from 'node:child_process';
|
|
30
30
|
import { promisify } from 'node:util';
|
|
31
|
-
import {
|
|
32
|
-
import { and, eq, inArray, isNotNull, isNull, lt, or } from 'drizzle-orm';
|
|
31
|
+
import { isFolderPlaceholder, folderPlaceholderPath, isPlatformRestoreShape, } from '@bevel-software/platform-shared';
|
|
32
|
+
import { and, desc, eq, inArray, isNotNull, isNull, lt, ne, or } from 'drizzle-orm';
|
|
33
33
|
import { changeRequests } from '../database/schema.js';
|
|
34
|
+
import { redactSecret } from '../../shared/redact-secret.js';
|
|
34
35
|
import { workspaceIdForBranch, branchForWorkspaceId } from '../../shared/workspace-id.js';
|
|
35
36
|
import { canonicalFileIdentity } from '../../shared/canonical-file-identity.js';
|
|
36
37
|
import { sanitizeError } from './sanitize-error.js';
|
|
@@ -92,10 +93,13 @@ export function syncConflictMessage(branch, conflictedPaths) {
|
|
|
92
93
|
}
|
|
93
94
|
/** How many conflicted files the sync-conflict sentence names before "and N more". */
|
|
94
95
|
const SYNC_CONFLICT_FILES_NAMED = 3;
|
|
95
|
-
/**
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
96
|
+
/**
|
|
97
|
+
* Redact a git token from an error string before surfacing it: the one the
|
|
98
|
+
* knowledge base's runner authenticates with, plus whatever the environment
|
|
99
|
+
* holds (`redactSecret` names those itself).
|
|
100
|
+
*/
|
|
101
|
+
function redactTokens(msg, token) {
|
|
102
|
+
return redactSecret(msg, [token]);
|
|
99
103
|
}
|
|
100
104
|
/**
|
|
101
105
|
* Cap on how many changed paths the `## Affected owners` CR-body block lists
|
|
@@ -183,7 +187,7 @@ export class WorkflowService {
|
|
|
183
187
|
accessControl;
|
|
184
188
|
fileLocks;
|
|
185
189
|
pendingCommits;
|
|
186
|
-
|
|
190
|
+
kb;
|
|
187
191
|
changeGate;
|
|
188
192
|
events;
|
|
189
193
|
fileChanges;
|
|
@@ -207,6 +211,9 @@ export class WorkflowService {
|
|
|
207
211
|
* implementation detail of the workflow auto-merge story; nothing outside
|
|
208
212
|
* the facade should call it directly.
|
|
209
213
|
*/
|
|
214
|
+
get kbDirName() {
|
|
215
|
+
return this.kb.kbDirName;
|
|
216
|
+
}
|
|
210
217
|
constructor(db, git, prs, reviewWorkflow, workspaceService, accessControl, fileLocks,
|
|
211
218
|
/**
|
|
212
219
|
* Background commit queue. `releaseLock` enqueues a row instead of
|
|
@@ -215,7 +222,7 @@ export class WorkflowService {
|
|
|
215
222
|
* failure modes entirely off the user-facing lock release path.
|
|
216
223
|
* See `lock-decoupling-plan.md` for the full design.
|
|
217
224
|
*/
|
|
218
|
-
pendingCommits,
|
|
225
|
+
pendingCommits, kb,
|
|
219
226
|
/**
|
|
220
227
|
* The read-before-write gate `acquireLock` asks on every branch (see
|
|
221
228
|
* `access-model/change-gate.ts`). Required, and checked at construction:
|
|
@@ -255,7 +262,7 @@ export class WorkflowService {
|
|
|
255
262
|
this.accessControl = accessControl;
|
|
256
263
|
this.fileLocks = fileLocks;
|
|
257
264
|
this.pendingCommits = pendingCommits;
|
|
258
|
-
this.
|
|
265
|
+
this.kb = kb;
|
|
259
266
|
this.changeGate = changeGate;
|
|
260
267
|
this.events = events;
|
|
261
268
|
this.fileChanges = fileChanges;
|
|
@@ -340,7 +347,7 @@ export class WorkflowService {
|
|
|
340
347
|
*/
|
|
341
348
|
runOnBranchPair(source, target, fn) {
|
|
342
349
|
const keys = [`branch:${source}`];
|
|
343
|
-
if (!isProtectedBranch(target))
|
|
350
|
+
if (!this.kb.isProtectedBranch(target))
|
|
344
351
|
keys.push(`branch:${target}`);
|
|
345
352
|
return this.branchLifecycle.runAll(keys, fn);
|
|
346
353
|
}
|
|
@@ -463,10 +470,11 @@ export class WorkflowService {
|
|
|
463
470
|
* and nothing else. The pull itself reports the change, since it is the
|
|
464
471
|
* only code that can observe it under the workspace mutex.
|
|
465
472
|
*/
|
|
466
|
-
async pullWorkspace(workspaceId) {
|
|
467
|
-
const { treeChanged } = await this.git.pull(workspaceId);
|
|
468
|
-
|
|
469
|
-
|
|
473
|
+
async pullWorkspace(workspaceId, opts = {}) {
|
|
474
|
+
const { treeChanged } = await this.git.pull(workspaceId, opts);
|
|
475
|
+
const defaultBranch = this.kb.defaultBranch;
|
|
476
|
+
if (treeChanged && branchForWorkspaceId(workspaceId) === defaultBranch) {
|
|
477
|
+
this.events?.emit({ kind: 'fs-tree-changed', workspaceId, branch: defaultBranch });
|
|
470
478
|
return true;
|
|
471
479
|
}
|
|
472
480
|
return false;
|
|
@@ -799,7 +807,7 @@ export class WorkflowService {
|
|
|
799
807
|
// as its own rescue. The source is part of the claim precisely so no
|
|
800
808
|
// future caller can make that claim by passing a flag.
|
|
801
809
|
if (typeof platformRestore?.source === 'string' &&
|
|
802
|
-
isPlatformRestoreShape(toRepoRelative(platformRestore.source), repoRelative) &&
|
|
810
|
+
isPlatformRestoreShape(toRepoRelative(platformRestore.source), repoRelative, this.kb.layout) &&
|
|
803
811
|
(await this.accessControl.canRestorePlatformFile(workspaceId, userEmail, repoRelative))) {
|
|
804
812
|
return 'restore';
|
|
805
813
|
}
|
|
@@ -861,7 +869,7 @@ export class WorkflowService {
|
|
|
861
869
|
// coordination hold as write possession (see those methods).
|
|
862
870
|
if (!opts?.coordination) {
|
|
863
871
|
let via = 'granted';
|
|
864
|
-
if (isProtectedBranch(branch)) {
|
|
872
|
+
if (this.kb.isProtectedBranch(branch)) {
|
|
865
873
|
// `assertCanWriteAtPath` throws AccessDeniedError on denial, with the
|
|
866
874
|
// eligible-writers payload so the frontend can render a useful refusal.
|
|
867
875
|
via = await this.assertCanWriteAtPath(workspaceId, branch, user.email, targetPath, opts?.platformRestore);
|
|
@@ -1089,13 +1097,15 @@ export class WorkflowService {
|
|
|
1089
1097
|
* retry, hand off to the recovery agent, or escalate. Emits
|
|
1090
1098
|
* `file-changed` on success so frontends see the new sha.
|
|
1091
1099
|
*/
|
|
1092
|
-
async runPendingCommit(workspaceId, branch, targetPath, user,
|
|
1100
|
+
async runPendingCommit(workspaceId, branch, targetPath, user,
|
|
1101
|
+
/** `summary` overrides the path-derived commit subject; see `commitFile`. */
|
|
1102
|
+
opts) {
|
|
1093
1103
|
// `skipValidation` is the worker telling us this commit is not the last of
|
|
1094
1104
|
// a burst. The validator is advisory — it parses the whole KB to produce a
|
|
1095
1105
|
// report nothing reads but the log — so running it once on the burst's
|
|
1096
1106
|
// final state says the same thing as running it per file, for a fraction
|
|
1097
1107
|
// of the work. Nothing downstream depends on it having run.
|
|
1098
|
-
const change = await this.git.commitFile(workspaceId, user, targetPath,
|
|
1108
|
+
const change = await this.git.commitFile(workspaceId, user, targetPath, opts?.summary, opts?.skipValidation);
|
|
1099
1109
|
if (!change) {
|
|
1100
1110
|
// No-op commit — the path was already clean. Usually a double-enqueue
|
|
1101
1111
|
// or a save of bytes identical to HEAD, BUT a clean tree does NOT
|
|
@@ -1417,6 +1427,30 @@ export class WorkflowService {
|
|
|
1417
1427
|
getChangeRequest(number) {
|
|
1418
1428
|
return this.prs.getPr(number);
|
|
1419
1429
|
}
|
|
1430
|
+
/**
|
|
1431
|
+
* The newest non-open change request from `sourceBranch` by `authorEmail`.
|
|
1432
|
+
*
|
|
1433
|
+
* Read straight off `change_requests` rather than through the PR listing,
|
|
1434
|
+
* which serves OPEN requests only: the whole point here is the closed ones.
|
|
1435
|
+
* `author_email` is stored lowercased at insert, so the needle is too.
|
|
1436
|
+
* Ordered by `closed_at` with `created_at` as the tiebreak, because a row
|
|
1437
|
+
* closed before the column existed (or by a path that forgot to stamp it)
|
|
1438
|
+
* still has a creation time and must not sort as the oldest.
|
|
1439
|
+
*/
|
|
1440
|
+
async latestClosedChangeRequest(authorEmail, sourceBranch) {
|
|
1441
|
+
const email = authorEmail.trim().toLowerCase();
|
|
1442
|
+
if (!email || !sourceBranch)
|
|
1443
|
+
return null;
|
|
1444
|
+
const [row] = await this.db
|
|
1445
|
+
.select({ number: changeRequests.number, state: changeRequests.state })
|
|
1446
|
+
.from(changeRequests)
|
|
1447
|
+
.where(and(eq(changeRequests.authorEmail, email), eq(changeRequests.sourceBranch, sourceBranch), ne(changeRequests.state, 'open')))
|
|
1448
|
+
.orderBy(desc(changeRequests.closedAt), desc(changeRequests.createdAt))
|
|
1449
|
+
.limit(1);
|
|
1450
|
+
if (!row)
|
|
1451
|
+
return null;
|
|
1452
|
+
return { number: row.number, state: row.state };
|
|
1453
|
+
}
|
|
1420
1454
|
getChangeRequestDetail(number, opts) {
|
|
1421
1455
|
return this.prs.getPrDetail(number, opts);
|
|
1422
1456
|
}
|
|
@@ -1449,7 +1483,7 @@ export class WorkflowService {
|
|
|
1449
1483
|
}
|
|
1450
1484
|
if (!input.title?.trim())
|
|
1451
1485
|
throw new WorkflowValidationError('title is required');
|
|
1452
|
-
if (isProtectedBranch(input.sourceBranch)) {
|
|
1486
|
+
if (this.kb.isProtectedBranch(input.sourceBranch)) {
|
|
1453
1487
|
throw new WorkflowValidationError(`Cannot open a change request *from* a protected branch ("${input.sourceBranch}").`, { kind: 'source-is-protected', sourceBranch: input.sourceBranch });
|
|
1454
1488
|
}
|
|
1455
1489
|
// The whole open sequence — uniqueness check through row insert — runs
|
|
@@ -1541,7 +1575,7 @@ export class WorkflowService {
|
|
|
1541
1575
|
// openChangeRequest finds no duplicate, re-runs the (idempotent, already
|
|
1542
1576
|
// up-to-date) auto-merge, and inserts the row.
|
|
1543
1577
|
const rawMsg = err instanceof Error ? err.message : String(err);
|
|
1544
|
-
throw new WorkflowValidationError(`Failed to open change request: ${redactTokens(rawMsg)}`, { kind: 'open-change-request-failed' });
|
|
1578
|
+
throw new WorkflowValidationError(`Failed to open change request: ${redactTokens(rawMsg, this.git.credentials?.token())}`, { kind: 'open-change-request-failed' });
|
|
1545
1579
|
}
|
|
1546
1580
|
this.prs.invalidateDetailCache(prNumber);
|
|
1547
1581
|
const detail = await this.prs.getPrDetail(prNumber, {
|
|
@@ -1584,9 +1618,25 @@ export class WorkflowService {
|
|
|
1584
1618
|
* the enforcement read one predicate. A conflicting merge is aborted
|
|
1585
1619
|
* inside `mergeFromOrigin`: nothing is committed or pushed, and the branch
|
|
1586
1620
|
* is exactly what it was.
|
|
1621
|
+
*
|
|
1622
|
+
* ONE detail read after the merge. The read before it exists only to
|
|
1623
|
+
* decide authority and to name the two branches, so it asks for no patches
|
|
1624
|
+
* — that is one git subprocess per changed file it does not spend. The
|
|
1625
|
+
* approvals carry-forward runs BEFORE the final read rather than after it,
|
|
1626
|
+
* against a head resolved with `resolvePrShas` (two rev-parses) instead of
|
|
1627
|
+
* a whole second detail, so the detail that goes back already describes the
|
|
1628
|
+
* approvals it carried. What used to be three detail reads is now one.
|
|
1587
1629
|
*/
|
|
1588
1630
|
async updateFromTarget(workspaceId, user, number) {
|
|
1589
|
-
|
|
1631
|
+
// No patches: all this read decides is authority, state and the two
|
|
1632
|
+
// branch names. Asking for patch text here would diff every changed file
|
|
1633
|
+
// in a request that is about to be merged and read in full anyway.
|
|
1634
|
+
const detail = await this.prs.getPrDetail(number, {
|
|
1635
|
+
fresh: true,
|
|
1636
|
+
workspaceId,
|
|
1637
|
+
viewerEmail: user.email,
|
|
1638
|
+
patches: false,
|
|
1639
|
+
});
|
|
1590
1640
|
if (!detail) {
|
|
1591
1641
|
throw new WorkflowValidationError(`Change request #${number} not found.`, { kind: 'change-request-not-found', number });
|
|
1592
1642
|
}
|
|
@@ -1605,8 +1655,15 @@ export class WorkflowService {
|
|
|
1605
1655
|
// merge commit that then cannot push, stranding it in the workspace. A
|
|
1606
1656
|
// rebase conflict hands the stranded saves to recovery, as every other
|
|
1607
1657
|
// pull does, before the refusal reaches the caller.
|
|
1658
|
+
//
|
|
1659
|
+
// `preserveMerges`: this is the one pull whose unpushed commit may be a
|
|
1660
|
+
// MERGE — the update that ran before this one and could not push. A plain
|
|
1661
|
+
// rebase replays it as cherry-picks of the target's commits, which drops
|
|
1662
|
+
// the target as a parent, so the branch never contains the target's head
|
|
1663
|
+
// however many times the update runs. Replayed with `--rebase-merges` it
|
|
1664
|
+
// stays a merge and the next push ends the loop.
|
|
1608
1665
|
try {
|
|
1609
|
-
await this.pullWorkspace(workspaceId);
|
|
1666
|
+
await this.pullWorkspace(workspaceId, { preserveMerges: true });
|
|
1610
1667
|
}
|
|
1611
1668
|
catch (err) {
|
|
1612
1669
|
if (err instanceof PullRebaseConflictError) {
|
|
@@ -1638,21 +1695,47 @@ export class WorkflowService {
|
|
|
1638
1695
|
if (outcome.kind === 'conflicts') {
|
|
1639
1696
|
throw new ChangeRequestConflictsError(detail.branch, detail.base, outcome.paths);
|
|
1640
1697
|
}
|
|
1641
|
-
//
|
|
1642
|
-
//
|
|
1643
|
-
|
|
1698
|
+
// Push whenever the CLONE holds a commit origin has not seen — not when
|
|
1699
|
+
// THIS merge authored one. The two differ in exactly the case that keeps
|
|
1700
|
+
// a request behind for good: an earlier update merged, its push failed,
|
|
1701
|
+
// and the merge is sitting in the workspace. That merge already contains
|
|
1702
|
+
// the target, so this call's `mergeFromOrigin` reports
|
|
1703
|
+
// `alreadyUpToDate` and the old gate skipped the push — leaving the
|
|
1704
|
+
// request behind on the remote, and the next open with the same work to
|
|
1705
|
+
// do. Asking git what is unpushed retries it instead.
|
|
1706
|
+
//
|
|
1707
|
+
// A failed probe falls back to the old gate rather than to "push
|
|
1708
|
+
// anyway": `trackedPush` on a clone with nothing to push is a wasted
|
|
1709
|
+
// round trip on every single update.
|
|
1710
|
+
const hasUnpushed = await this.git
|
|
1711
|
+
.hasUnpushedCommits(workspaceId)
|
|
1712
|
+
.catch((err) => {
|
|
1713
|
+
log.warn(`could not tell whether change request #${number} has unpushed commits; falling back to whether this merge authored one`, { err });
|
|
1714
|
+
return !outcome.alreadyUpToDate;
|
|
1715
|
+
});
|
|
1716
|
+
if (hasUnpushed) {
|
|
1644
1717
|
await this.trackedPush(workspaceId, user);
|
|
1645
|
-
// The source head moved: the refusal described a revision that is gone.
|
|
1646
|
-
await this.clearApplyFailure(number, { recordedBefore: headMovedAfter });
|
|
1647
1718
|
}
|
|
1648
|
-
|
|
1649
|
-
|
|
1650
|
-
|
|
1651
|
-
|
|
1652
|
-
|
|
1653
|
-
|
|
1654
|
-
|
|
1655
|
-
|
|
1719
|
+
// Where the branch ended up, as PUBLISHED — two rev-parses, not a second
|
|
1720
|
+
// detail read. Everything below needs only the sha, and the detail that
|
|
1721
|
+
// goes back to the caller is read once, at the end, after the approvals
|
|
1722
|
+
// it should describe have been carried.
|
|
1723
|
+
let headAfterMerge = headBeforeMerge;
|
|
1724
|
+
try {
|
|
1725
|
+
const at = await this.git.resolvePrShas(workspaceId, detail.base, detail.branch);
|
|
1726
|
+
headAfterMerge = at.headSha;
|
|
1727
|
+
}
|
|
1728
|
+
catch (err) {
|
|
1729
|
+
log.warn(`could not resolve the published head of change request #${number} after updating it from target`, { err });
|
|
1730
|
+
}
|
|
1731
|
+
const headMoved = Boolean(headBeforeMerge) && headAfterMerge !== headBeforeMerge;
|
|
1732
|
+
// The source head moved: the refusal described a revision that is gone.
|
|
1733
|
+
// `hasUnpushed` counts as well as the sha comparison, and deliberately —
|
|
1734
|
+
// a push that just landed moved the published head by definition, and
|
|
1735
|
+
// reading the sha to confirm it is a call that can fail. A refusal left
|
|
1736
|
+
// standing over a revision nobody can apply any more is the worse error.
|
|
1737
|
+
if (headMoved || hasUnpushed) {
|
|
1738
|
+
await this.clearApplyFailure(number, { recordedBefore: headMovedAfter });
|
|
1656
1739
|
}
|
|
1657
1740
|
// The merge is a commit the APPROVERS did not make. Re-pin their
|
|
1658
1741
|
// approvals onto the new head for every file whose bytes it left alone —
|
|
@@ -1661,35 +1744,48 @@ export class WorkflowService {
|
|
|
1661
1744
|
// than the bookkeeping, so a failure here is logged and the fresh detail
|
|
1662
1745
|
// still goes back.
|
|
1663
1746
|
//
|
|
1664
|
-
//
|
|
1665
|
-
//
|
|
1666
|
-
//
|
|
1667
|
-
//
|
|
1668
|
-
//
|
|
1669
|
-
//
|
|
1670
|
-
|
|
1747
|
+
// The head moving is the real gate: nothing moved, nothing moved under
|
|
1748
|
+
// anyone. It also covers the sha that is not a sha — a resolve that
|
|
1749
|
+
// failed onto a detail with no head — which `pathsChangedBetween` and
|
|
1750
|
+
// `carryApprovalsForward` would refuse anyway.
|
|
1751
|
+
//
|
|
1752
|
+
// This runs BEFORE the detail read, not after it. The rows it writes are
|
|
1753
|
+
// what the caller's `approvals` must describe, so doing it first means
|
|
1754
|
+
// the one read at the end is already correct — where carrying afterwards
|
|
1755
|
+
// needed a THIRD read to correct a detail assembled before the rows
|
|
1756
|
+
// existed.
|
|
1757
|
+
//
|
|
1758
|
+
// The same list answers the caller's `updatedPaths`: "which files did
|
|
1759
|
+
// this merge change" is one question, and the two answers must not be
|
|
1760
|
+
// allowed to differ — a file whose approval was carried (so: untouched)
|
|
1761
|
+
// that the dialog then re-read would be the dialog discarding content the
|
|
1762
|
+
// server just called unchanged.
|
|
1763
|
+
let updatedPaths = [];
|
|
1764
|
+
if (headMoved) {
|
|
1671
1765
|
try {
|
|
1672
|
-
|
|
1673
|
-
|
|
1674
|
-
// The detail above was assembled before those rows existed, so its
|
|
1675
|
-
// `approvals` (and the merge gate derived from them) still describe
|
|
1676
|
-
// the pre-merge head. Only re-read when something actually carried.
|
|
1677
|
-
if (carried > 0) {
|
|
1678
|
-
this.prs.invalidateDetailCache(number);
|
|
1679
|
-
const withApprovals = await this.prs.getPrDetail(number, {
|
|
1680
|
-
fresh: true,
|
|
1681
|
-
workspaceId,
|
|
1682
|
-
viewerEmail: user.email,
|
|
1683
|
-
});
|
|
1684
|
-
if (withApprovals)
|
|
1685
|
-
return withApprovals;
|
|
1686
|
-
}
|
|
1766
|
+
updatedPaths = await this.git.pathsChangedBetween(workspaceId, headBeforeMerge, headAfterMerge);
|
|
1767
|
+
await this.reviewWorkflow.carryApprovalsForward(number, headBeforeMerge, headAfterMerge, updatedPaths);
|
|
1687
1768
|
}
|
|
1688
1769
|
catch (err) {
|
|
1689
1770
|
log.warn(`could not carry approvals forward on change request #${number} after updating from target`, { err });
|
|
1771
|
+
// The diff is what failed, so which files moved is unknown. Say so as
|
|
1772
|
+
// "every file this request had", which is every file a caller can
|
|
1773
|
+
// already be showing: slow beats a dialog that goes on presenting
|
|
1774
|
+
// pre-merge text as current. Anything the merge ADDED is not on the
|
|
1775
|
+
// list and does not need to be — no caller has read it yet.
|
|
1776
|
+
updatedPaths = (detail.files ?? []).map((f) => f.path);
|
|
1690
1777
|
}
|
|
1691
1778
|
}
|
|
1692
|
-
|
|
1779
|
+
this.prs.invalidateDetailCache(number);
|
|
1780
|
+
const refreshed = await this.prs.getPrDetail(number, {
|
|
1781
|
+
fresh: true,
|
|
1782
|
+
workspaceId,
|
|
1783
|
+
viewerEmail: user.email,
|
|
1784
|
+
});
|
|
1785
|
+
if (!refreshed) {
|
|
1786
|
+
throw new WorkflowValidationError(`Refreshed change request #${number} but could not re-fetch its detail.`);
|
|
1787
|
+
}
|
|
1788
|
+
return { ...refreshed, updatedPaths };
|
|
1693
1789
|
}
|
|
1694
1790
|
listComments(number) {
|
|
1695
1791
|
return this.reviewWorkflow.listComments(number);
|
|
@@ -2116,11 +2212,16 @@ export class WorkflowService {
|
|
|
2116
2212
|
/**
|
|
2117
2213
|
* DELETE a change request outright: close it (whatever its diff says) and
|
|
2118
2214
|
* retire its source branch — the request, its proposal, and the branch that
|
|
2119
|
-
* carried it are gone in one verb.
|
|
2120
|
-
*
|
|
2121
|
-
*
|
|
2122
|
-
*
|
|
2123
|
-
*
|
|
2215
|
+
* carried it are gone in one verb. The request's AUTHOR or an admin, and
|
|
2216
|
+
* nobody else: it is the author's own proposal and their own branch to throw
|
|
2217
|
+
* away, and it is the moderation verb for a shared deployment. Admin rights
|
|
2218
|
+
* resolve the same way every other admin check here does (write on
|
|
2219
|
+
* `roles.yaml` at `origin/<base>`, never a local ref); authorship is the
|
|
2220
|
+
* STORED `authorId` hash, never anything the caller sends.
|
|
2221
|
+
*
|
|
2222
|
+
* Stronger than reject, which the changed files' owners may also do and which
|
|
2223
|
+
* leaves the branch for a second round. They keep reject and do not get this:
|
|
2224
|
+
* an owner must not be able to destroy someone else's text and branch.
|
|
2124
2225
|
*/
|
|
2125
2226
|
async deleteChangeRequest(number, user) {
|
|
2126
2227
|
const summary = await this.prs.getPr(number);
|
|
@@ -2170,8 +2271,17 @@ export class WorkflowService {
|
|
|
2170
2271
|
this.kickDeletedBranchSweep();
|
|
2171
2272
|
throw new WorkflowDomainError(`The base branch "${summary.base}" could not be resolved — it may have been deleted, or origin was unreachable. A background check is running; retry in a moment.`, 409);
|
|
2172
2273
|
}
|
|
2173
|
-
|
|
2174
|
-
|
|
2274
|
+
// Authorship is decided from the STORED author hash, never from anything
|
|
2275
|
+
// the caller sends. Note what is deliberately NOT short-circuited for an
|
|
2276
|
+
// author: the strict fetch and the `null` check above still run. An
|
|
2277
|
+
// author's grant needs no `roles.yaml` read, so skipping them would look
|
|
2278
|
+
// free — but it would let a delete close the request while the branch
|
|
2279
|
+
// removal silently failed against an unreachable origin, and "the shared
|
|
2280
|
+
// repository was down, so nothing changed" is the one refusal that has to
|
|
2281
|
+
// stay honest.
|
|
2282
|
+
const callerIsAuthor = !!(summary.authorId && summary.authorId === hashEmail(user.email));
|
|
2283
|
+
if (!callerIsAuthor && isAdmin !== true) {
|
|
2284
|
+
throw new WorkflowDomainError("Only the request's author or an admin can delete it.", 403);
|
|
2175
2285
|
}
|
|
2176
2286
|
// Close first (idempotent: an already-closed request just skips to the
|
|
2177
2287
|
// branch retirement). Guarded on `open` so a concurrent merge wins.
|
|
@@ -2316,7 +2426,7 @@ export class WorkflowService {
|
|
|
2316
2426
|
return 0;
|
|
2317
2427
|
let live;
|
|
2318
2428
|
try {
|
|
2319
|
-
const branches = await this.git.listBranches(
|
|
2429
|
+
const branches = await this.git.listBranches(this.kb.defaultWorkspaceId(), {
|
|
2320
2430
|
freshFetch: true,
|
|
2321
2431
|
// The list is used to PROVE absence, and the listing's normal
|
|
2322
2432
|
// degrade-to-stale behaviour would report every branch created since
|
|
@@ -2586,8 +2696,8 @@ export class WorkflowService {
|
|
|
2586
2696
|
// outright if it disagrees with the request's own base.) The failure the
|
|
2587
2697
|
// pull reports is about OTHER people's commits not arriving, which leaves
|
|
2588
2698
|
// the catalogs no staler than they were.
|
|
2589
|
-
if (!announced && targetWorkspaceId && targetBranch ===
|
|
2590
|
-
this.events?.emit({ kind: 'fs-tree-changed', workspaceId: targetWorkspaceId, branch:
|
|
2699
|
+
if (!announced && targetWorkspaceId && targetBranch === this.kb.defaultBranch) {
|
|
2700
|
+
this.events?.emit({ kind: 'fs-tree-changed', workspaceId: targetWorkspaceId, branch: targetBranch });
|
|
2591
2701
|
}
|
|
2592
2702
|
}
|
|
2593
2703
|
async mergeBranch(user, sourceBranch, targetBranch) {
|
|
@@ -2639,7 +2749,7 @@ export class WorkflowService {
|
|
|
2639
2749
|
// change request's merge, nothing strips it here — so its presence
|
|
2640
2750
|
// is what the hook refuses on) and both sides of a rename, since the
|
|
2641
2751
|
// old name is a file this merge deletes.
|
|
2642
|
-
authorize: isProtectedBranch(targetBranch)
|
|
2752
|
+
authorize: this.kb.isProtectedBranch(targetBranch)
|
|
2643
2753
|
? async ({ sha, changedPaths }) => {
|
|
2644
2754
|
if (changedPaths.length === 0)
|
|
2645
2755
|
return;
|
|
@@ -2814,7 +2924,7 @@ export class WorkflowService {
|
|
|
2814
2924
|
.where(eq(changeRequests.number, number))
|
|
2815
2925
|
.limit(1);
|
|
2816
2926
|
const sourceBranch = rows[0]?.sourceBranch;
|
|
2817
|
-
if (!sourceBranch || isProtectedBranch(sourceBranch))
|
|
2927
|
+
if (!sourceBranch || this.kb.isProtectedBranch(sourceBranch))
|
|
2818
2928
|
return;
|
|
2819
2929
|
// The open-check and the deletion hold the branch's lifecycle lock
|
|
2820
2930
|
// TOGETHER — `openChangeRequest` holds the same lock across its own
|
|
@@ -2965,7 +3075,7 @@ export class WorkflowService {
|
|
|
2965
3075
|
}
|
|
2966
3076
|
catch (err) {
|
|
2967
3077
|
log.warn('listChangedPathsBetweenBranches failed:', {
|
|
2968
|
-
detail: redactTokens(err instanceof Error ? err.message : String(err)),
|
|
3078
|
+
detail: redactTokens(err instanceof Error ? err.message : String(err), this.git.credentials?.token()),
|
|
2969
3079
|
});
|
|
2970
3080
|
return [];
|
|
2971
3081
|
}
|