@bevel-software/platform-core-backend 0.35.0 → 0.36.1
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/agent-guide/directory-structure.md +1 -1
- package/agent-guide/onboarding.md +111 -0
- package/agent-guide/start-here.md +1 -0
- package/agent-guide/tool-manuals.md +1 -0
- package/dist/core/catalog-cache-invalidation.d.ts +2 -2
- package/dist/core/catalog-cache-invalidation.d.ts.map +1 -1
- package/dist/core/compose-embed.d.ts +2 -2
- package/dist/core/compose-embed.d.ts.map +1 -1
- package/dist/core/compose-embed.js +1 -1
- package/dist/core/compose-embed.js.map +1 -1
- package/dist/core/core-ports.d.ts +19 -4
- 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.map +1 -1
- package/dist/core/create-core-server.js +26 -24
- package/dist/core/create-core-server.js.map +1 -1
- package/dist/core/create-core-services.d.ts +19 -13
- package/dist/core/create-core-services.d.ts.map +1 -1
- package/dist/core/create-core-services.js +68 -56
- package/dist/core/create-core-services.js.map +1 -1
- package/dist/core/lifecycle.d.ts +4 -4
- package/dist/core/lifecycle.d.ts.map +1 -1
- package/dist/core/lifecycle.js +5 -5
- package/dist/core/lifecycle.js.map +1 -1
- package/dist/core-config.d.ts +2 -2
- package/dist/core-config.js +3 -3
- package/dist/core-config.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/modules/access/access-control.service.js +1 -1
- package/dist/modules/access/access-control.service.js.map +1 -1
- package/dist/modules/access/access-declarations.d.ts +2 -2
- package/dist/modules/access/access-declarations.d.ts.map +1 -1
- package/dist/modules/access/access-declarations.js +2 -2
- package/dist/modules/access/access-declarations.js.map +1 -1
- package/dist/modules/access/access-mutation.service.d.ts +2 -2
- package/dist/modules/access/access-mutation.service.d.ts.map +1 -1
- package/dist/modules/access/access-mutation.service.js +2 -2
- package/dist/modules/access/access-mutation.service.js.map +1 -1
- package/dist/modules/access/access-requests.routes.d.ts +2 -2
- package/dist/modules/access/access-requests.routes.d.ts.map +1 -1
- package/dist/modules/access/access-requests.routes.js +5 -5
- package/dist/modules/access/access-requests.routes.js.map +1 -1
- package/dist/modules/access/access-requests.service.d.ts +2 -2
- package/dist/modules/access/access-requests.service.d.ts.map +1 -1
- package/dist/modules/access/access-requests.service.js +11 -11
- package/dist/modules/access/access-requests.service.js.map +1 -1
- package/dist/modules/access/access.routes.d.ts +2 -2
- package/dist/modules/access/access.routes.d.ts.map +1 -1
- package/dist/modules/access/access.routes.js +9 -9
- package/dist/modules/access/access.routes.js.map +1 -1
- package/dist/modules/access/admin-locked-commit.d.ts +5 -5
- package/dist/modules/access/admin-locked-commit.d.ts.map +1 -1
- package/dist/modules/access/admin-locked-commit.js +7 -7
- package/dist/modules/access/admin-locked-commit.js.map +1 -1
- package/dist/modules/access/admin-route-helpers.d.ts +1 -1
- package/dist/modules/access/admin-route-helpers.js +5 -5
- package/dist/modules/access/admin-route-helpers.js.map +1 -1
- package/dist/modules/access/change-read-gate.d.ts +1 -1
- package/dist/modules/access/change-read-gate.js +1 -1
- package/dist/modules/access/groups-admin.service.d.ts +7 -7
- package/dist/modules/access/groups-admin.service.d.ts.map +1 -1
- package/dist/modules/access/groups-admin.service.js +6 -6
- package/dist/modules/access/groups-admin.service.js.map +1 -1
- package/dist/modules/access/reference-scan.d.ts +1 -1
- package/dist/modules/access/roles-admin.service.d.ts +7 -7
- package/dist/modules/access/roles-admin.service.d.ts.map +1 -1
- package/dist/modules/access/roles-admin.service.js +8 -8
- package/dist/modules/access/roles-admin.service.js.map +1 -1
- package/dist/modules/access/synced-groups-committer.d.ts +4 -4
- package/dist/modules/access/synced-groups-committer.d.ts.map +1 -1
- package/dist/modules/access/synced-groups-committer.js +7 -7
- package/dist/modules/access/synced-groups-committer.js.map +1 -1
- package/dist/modules/access/user-access-removal.service.d.ts +6 -6
- package/dist/modules/access/user-access-removal.service.d.ts.map +1 -1
- package/dist/modules/access/user-access-removal.service.js +4 -4
- package/dist/modules/access/user-access-removal.service.js.map +1 -1
- package/dist/modules/access-model/access-errors.d.ts +4 -4
- package/dist/modules/access-model/access-errors.d.ts.map +1 -1
- package/dist/modules/access-model/access-errors.js +4 -4
- package/dist/modules/access-model/access-errors.js.map +1 -1
- package/dist/modules/access-model/access-grammar.d.ts +1 -1
- package/dist/modules/access-model/access-grammar.js +4 -4
- package/dist/modules/access-model/change-gate.d.ts +1 -1
- package/dist/modules/access-model/change-gate.js +1 -1
- package/dist/modules/access-model/roles-yaml-guard.d.ts +4 -4
- package/dist/modules/access-model/roles-yaml-guard.d.ts.map +1 -1
- package/dist/modules/access-model/roles-yaml-guard.js +4 -4
- package/dist/modules/access-model/roles-yaml-guard.js.map +1 -1
- package/dist/modules/agent-guide/agent-guide.d.ts +19 -14
- package/dist/modules/agent-guide/agent-guide.d.ts.map +1 -1
- package/dist/modules/agent-guide/agent-guide.js +42 -18
- package/dist/modules/agent-guide/agent-guide.js.map +1 -1
- package/dist/modules/agent-guide/guide-budget.d.ts +5 -2
- package/dist/modules/agent-guide/guide-budget.d.ts.map +1 -1
- package/dist/modules/agent-guide/guide-budget.js +6 -2
- package/dist/modules/agent-guide/guide-budget.js.map +1 -1
- package/dist/modules/agent-instructions/agent-instructions.routes.d.ts +12 -5
- package/dist/modules/agent-instructions/agent-instructions.routes.d.ts.map +1 -1
- package/dist/modules/agent-instructions/agent-instructions.routes.js +13 -6
- package/dist/modules/agent-instructions/agent-instructions.routes.js.map +1 -1
- package/dist/modules/agent-instructions/compose.d.ts +15 -8
- package/dist/modules/agent-instructions/compose.d.ts.map +1 -1
- package/dist/modules/agent-instructions/compose.js +24 -10
- package/dist/modules/agent-instructions/compose.js.map +1 -1
- package/dist/modules/agent-instructions/shared-file-rules.d.ts +14 -6
- package/dist/modules/agent-instructions/shared-file-rules.d.ts.map +1 -1
- package/dist/modules/agent-instructions/shared-file-rules.js +51 -11
- package/dist/modules/agent-instructions/shared-file-rules.js.map +1 -1
- package/dist/modules/auth/account-erasure.service.d.ts +36 -7
- package/dist/modules/auth/account-erasure.service.d.ts.map +1 -1
- package/dist/modules/auth/account-erasure.service.js +30 -10
- package/dist/modules/auth/account-erasure.service.js.map +1 -1
- package/dist/modules/auth/account-hooks.d.ts +20 -0
- package/dist/modules/auth/account-hooks.d.ts.map +1 -1
- package/dist/modules/auth/account-hooks.js +10 -0
- package/dist/modules/auth/account-hooks.js.map +1 -1
- package/dist/modules/auth/account-switch-lock.js +2 -2
- package/dist/modules/auth/account-switch-lock.js.map +1 -1
- package/dist/modules/auth/account.routes.d.ts +7 -2
- package/dist/modules/auth/account.routes.d.ts.map +1 -1
- package/dist/modules/auth/account.routes.js +23 -4
- package/dist/modules/auth/account.routes.js.map +1 -1
- package/dist/modules/auth/auth.service.d.ts +1 -1
- package/dist/modules/auth/auth.service.js +4 -4
- package/dist/modules/auth/auth.service.js.map +1 -1
- package/dist/modules/auth/index.d.ts +1 -0
- package/dist/modules/auth/index.d.ts.map +1 -1
- package/dist/modules/database/core-schema.js +2 -2
- package/dist/modules/database/core-schema.js.map +1 -1
- package/dist/modules/diff/diff.routes.d.ts +3 -3
- package/dist/modules/diff/diff.routes.d.ts.map +1 -1
- package/dist/modules/diff/diff.routes.js +7 -7
- package/dist/modules/diff/diff.routes.js.map +1 -1
- package/dist/modules/embed/embed.routes.js +1 -1
- package/dist/modules/embed/embed.routes.js.map +1 -1
- package/dist/modules/embed/embed.service.d.ts +4 -4
- package/dist/modules/embed/embed.service.d.ts.map +1 -1
- package/dist/modules/embed/embed.service.js +18 -18
- package/dist/modules/embed/embed.service.js.map +1 -1
- package/dist/modules/kb-fs/branch-name.js +8 -8
- package/dist/modules/kb-fs/branch-name.js.map +1 -1
- package/dist/modules/kb-fs/file-change-notifier.d.ts +2 -2
- package/dist/modules/kb-fs/locking-filesystem.d.ts +9 -9
- package/dist/modules/kb-fs/locking-filesystem.d.ts.map +1 -1
- package/dist/modules/kb-fs/locking-filesystem.js +27 -27
- package/dist/modules/kb-fs/locking-filesystem.js.map +1 -1
- package/dist/modules/kb-fs/repo-path.js +5 -5
- package/dist/modules/kb-fs/repo-path.js.map +1 -1
- package/dist/modules/kb-fs/tmp-ref.d.ts +2 -2
- package/dist/modules/kb-fs/tmp-ref.d.ts.map +1 -1
- package/dist/modules/kb-fs/tmp-ref.js +2 -2
- package/dist/modules/kb-fs/tmp-ref.js.map +1 -1
- package/dist/modules/kb-sync/index.d.ts +1 -1
- package/dist/modules/kb-sync/index.d.ts.map +1 -1
- package/dist/modules/kb-sync/kb-sync.interface.d.ts +3 -3
- package/dist/modules/kb-sync/kb-sync.interface.d.ts.map +1 -1
- package/dist/modules/kb-sync/kb-sync.service.d.ts +3 -3
- package/dist/modules/kb-sync/kb-sync.service.d.ts.map +1 -1
- package/dist/modules/kb-sync/kb-sync.service.js +10 -10
- package/dist/modules/kb-sync/kb-sync.service.js.map +1 -1
- package/dist/modules/mcp/mcp.service.d.ts +11 -4
- package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
- package/dist/modules/mcp/mcp.service.js +75 -19
- package/dist/modules/mcp/mcp.service.js.map +1 -1
- package/dist/modules/onboarding/onboarding.contract.d.ts +1 -1
- package/dist/modules/onboarding/onboarding.routes.js +2 -2
- package/dist/modules/onboarding/onboarding.routes.js.map +1 -1
- package/dist/modules/onboarding/starter-pack.service.d.ts +4 -4
- package/dist/modules/onboarding/starter-pack.service.d.ts.map +1 -1
- package/dist/modules/onboarding/starter-pack.service.js +4 -4
- package/dist/modules/onboarding/starter-pack.service.js.map +1 -1
- package/dist/modules/plugins/join-request-jobs.service.d.ts +2 -2
- package/dist/modules/plugins/join-request-jobs.service.d.ts.map +1 -1
- package/dist/modules/plugins/join-request-jobs.service.js +7 -7
- package/dist/modules/plugins/join-request-jobs.service.js.map +1 -1
- package/dist/modules/plugins/join-requests.service.d.ts +3 -3
- package/dist/modules/plugins/join-requests.service.d.ts.map +1 -1
- package/dist/modules/plugins/join-requests.service.js +5 -5
- package/dist/modules/plugins/join-requests.service.js.map +1 -1
- package/dist/modules/plugins/plugin-rename.service.js +1 -1
- package/dist/modules/plugins/plugin-rename.service.js.map +1 -1
- package/dist/modules/plugins/plugins.routes.d.ts +2 -2
- package/dist/modules/plugins/plugins.routes.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.routes.js +8 -8
- package/dist/modules/plugins/plugins.routes.js.map +1 -1
- package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts +77 -2
- package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts.map +1 -1
- package/dist/modules/secrets-vault/db-secrets-vault.service.js +479 -53
- package/dist/modules/secrets-vault/db-secrets-vault.service.js.map +1 -1
- package/dist/modules/secrets-vault/index.d.ts +2 -1
- package/dist/modules/secrets-vault/index.d.ts.map +1 -1
- package/dist/modules/secrets-vault/index.js +1 -0
- package/dist/modules/secrets-vault/index.js.map +1 -1
- package/dist/modules/secrets-vault/managed-sign-in-erasure.d.ts +36 -0
- package/dist/modules/secrets-vault/managed-sign-in-erasure.d.ts.map +1 -0
- package/dist/modules/secrets-vault/managed-sign-in-erasure.js +37 -0
- package/dist/modules/secrets-vault/managed-sign-in-erasure.js.map +1 -0
- package/dist/modules/secrets-vault/secrets-vault.contract.d.ts +152 -0
- package/dist/modules/secrets-vault/secrets-vault.contract.d.ts.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.contract.js.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.routes.d.ts +7 -1
- package/dist/modules/secrets-vault/secrets-vault.routes.d.ts.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.routes.js +125 -10
- package/dist/modules/secrets-vault/secrets-vault.routes.js.map +1 -1
- package/dist/modules/settings/connection-check.js +1 -1
- package/dist/modules/settings/connection-check.js.map +1 -1
- package/dist/modules/settings/deployment-settings.service.js +1 -1
- package/dist/modules/settings/git-root-folders.js +1 -1
- package/dist/modules/settings/git-root-folders.js.map +1 -1
- package/dist/modules/settings/setup.routes.d.ts +1 -1
- package/dist/modules/settings/setup.routes.js +1 -1
- package/dist/modules/skills/pending-skills.service.d.ts +3 -3
- package/dist/modules/skills/pending-skills.service.d.ts.map +1 -1
- package/dist/modules/skills/pending-skills.service.js +4 -4
- package/dist/modules/skills/pending-skills.service.js.map +1 -1
- package/dist/modules/skills/skill-access-requests.routes.d.ts +2 -2
- package/dist/modules/skills/skill-access-requests.routes.d.ts.map +1 -1
- package/dist/modules/skills/skill-access-requests.routes.js +5 -5
- package/dist/modules/skills/skill-access-requests.routes.js.map +1 -1
- package/dist/modules/tool-helpers/tool-context.d.ts +4 -4
- package/dist/modules/tool-helpers/tool-context.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool-context.js +2 -2
- package/dist/modules/tool-helpers/tool-context.js.map +1 -1
- package/dist/modules/tool-helpers/tool-handler.js +2 -2
- package/dist/modules/tool-helpers/tool-handler.js.map +1 -1
- package/dist/modules/tool-helpers/tool.contract.d.ts +4 -4
- package/dist/modules/tool-helpers/tool.contract.d.ts.map +1 -1
- package/dist/modules/tool-manuals/mcp-server-edit.service.js +1 -1
- package/dist/modules/tool-manuals/mcp-server-edit.service.js.map +1 -1
- package/dist/modules/tool-manuals/pending-tools.service.d.ts +3 -3
- package/dist/modules/tool-manuals/pending-tools.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/pending-tools.service.js +4 -4
- package/dist/modules/tool-manuals/pending-tools.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-delete.service.js +1 -1
- package/dist/modules/tool-manuals/tool-delete.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.contract.d.ts +43 -3
- package/dist/modules/tool-manuals/tool-manuals.contract.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts +6 -0
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.js +51 -5
- 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 +36 -15
- package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -1
- package/dist/modules/version-control/agent-tools/change-request-read-shape.d.ts.map +1 -0
- package/dist/modules/version-control/agent-tools/change-request-read-shape.js.map +1 -0
- package/dist/modules/version-control/agent-tools/change-request-read.tools.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/agent-tools/change-request-read.tools.js +2 -2
- package/dist/modules/version-control/agent-tools/change-request-read.tools.js.map +1 -0
- package/dist/modules/version-control/agent-tools/change-request-summary.d.ts.map +1 -0
- package/dist/modules/version-control/agent-tools/change-request-summary.js.map +1 -0
- package/dist/modules/{workflow/agent-tools/workflow.tools.d.ts → version-control/agent-tools/version-control.tools.d.ts} +4 -4
- package/dist/modules/version-control/agent-tools/version-control.tools.d.ts.map +1 -0
- package/dist/modules/{workflow/agent-tools/workflow.tools.js → version-control/agent-tools/version-control.tools.js} +31 -31
- package/dist/modules/version-control/agent-tools/version-control.tools.js.map +1 -0
- package/dist/modules/{workflow → version-control}/change-request-hooks.d.ts +1 -1
- package/dist/modules/version-control/change-request-hooks.d.ts.map +1 -0
- package/dist/modules/version-control/change-request-hooks.js.map +1 -0
- package/dist/modules/version-control/change-request-review/approval-lock.d.ts.map +1 -0
- package/dist/modules/version-control/change-request-review/approval-lock.js.map +1 -0
- package/dist/modules/{workflow/review-workflow/review-workflow.interface.d.ts → version-control/change-request-review/change-request-review.interface.d.ts} +2 -2
- package/dist/modules/version-control/change-request-review/change-request-review.interface.d.ts.map +1 -0
- package/dist/modules/version-control/change-request-review/change-request-review.interface.js +2 -0
- package/dist/modules/version-control/change-request-review/change-request-review.interface.js.map +1 -0
- package/dist/modules/{workflow/review-workflow/review-workflow.service.d.ts → version-control/change-request-review/change-request-review.service.d.ts} +3 -3
- package/dist/modules/version-control/change-request-review/change-request-review.service.d.ts.map +1 -0
- package/dist/modules/{workflow/review-workflow/review-workflow.service.js → version-control/change-request-review/change-request-review.service.js} +26 -26
- package/dist/modules/version-control/change-request-review/change-request-review.service.js.map +1 -0
- package/dist/modules/{workflow → version-control}/event-bus.d.ts +8 -8
- package/dist/modules/version-control/event-bus.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/event-bus.js +4 -4
- package/dist/modules/version-control/event-bus.js.map +1 -0
- package/dist/modules/{workflow → version-control}/events-delivery.d.ts +4 -4
- package/dist/modules/version-control/events-delivery.d.ts.map +1 -0
- package/dist/modules/version-control/events-delivery.js.map +1 -0
- package/dist/modules/{workflow → version-control}/events.routes.d.ts +4 -4
- package/dist/modules/version-control/events.routes.d.ts.map +1 -0
- package/dist/modules/version-control/events.routes.js.map +1 -0
- package/dist/modules/{workflow → version-control}/file-lock.service.d.ts +2 -2
- package/dist/modules/version-control/file-lock.service.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/file-lock.service.js +6 -6
- package/dist/modules/version-control/file-lock.service.js.map +1 -0
- package/dist/modules/version-control/git/change-request-link.d.ts.map +1 -0
- package/dist/modules/version-control/git/change-request-link.js.map +1 -0
- package/dist/modules/version-control/git/git-version.d.ts.map +1 -0
- package/dist/modules/version-control/git/git-version.js.map +1 -0
- package/dist/modules/{workflow → version-control}/git/git.service.d.ts +8 -8
- package/dist/modules/version-control/git/git.service.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/git/git.service.js +53 -53
- package/dist/modules/version-control/git/git.service.js.map +1 -0
- package/dist/modules/version-control/git/merge-commit.d.ts.map +1 -0
- package/dist/modules/version-control/git/merge-commit.js.map +1 -0
- package/dist/modules/version-control/git/node-git-runner.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/git/node-git-runner.js +1 -1
- package/dist/modules/version-control/git/node-git-runner.js.map +1 -0
- package/dist/modules/{workflow → version-control}/git/pull-request.service.d.ts +5 -5
- package/dist/modules/version-control/git/pull-request.service.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/git/pull-request.service.js +10 -10
- package/dist/modules/version-control/git/pull-request.service.js.map +1 -0
- package/dist/modules/{workflow → version-control}/index.d.ts +6 -5
- package/dist/modules/version-control/index.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/index.js +3 -2
- package/dist/modules/version-control/index.js.map +1 -0
- package/dist/modules/{workflow → version-control}/pending-commits.service.d.ts +2 -2
- package/dist/modules/version-control/pending-commits.service.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/pending-commits.service.js +2 -2
- package/dist/modules/version-control/pending-commits.service.js.map +1 -0
- package/dist/modules/{workflow → version-control}/pending-commits.worker.d.ts +5 -5
- package/dist/modules/version-control/pending-commits.worker.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/pending-commits.worker.js +3 -3
- package/dist/modules/version-control/pending-commits.worker.js.map +1 -0
- package/dist/modules/{workflow → version-control}/read-on-branch.d.ts +2 -2
- package/dist/modules/version-control/read-on-branch.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/read-on-branch.js +2 -2
- package/dist/modules/version-control/read-on-branch.js.map +1 -0
- package/dist/modules/version-control/recovery-bot.d.ts.map +1 -0
- package/dist/modules/version-control/recovery-bot.js.map +1 -0
- package/dist/modules/version-control/sanitize-error.d.ts.map +1 -0
- package/dist/modules/version-control/sanitize-error.js.map +1 -0
- package/dist/modules/{workflow/workflow-hooks.d.ts → version-control/version-control-hooks.d.ts} +4 -4
- package/dist/modules/version-control/version-control-hooks.d.ts.map +1 -0
- package/dist/modules/{workflow/workflow-hooks.js → version-control/version-control-hooks.js} +3 -3
- package/dist/modules/version-control/version-control-hooks.js.map +1 -0
- package/dist/modules/{workflow/workflow.routes.d.ts → version-control/version-control.routes.d.ts} +6 -5
- package/dist/modules/version-control/version-control.routes.d.ts.map +1 -0
- package/dist/modules/{workflow/workflow.routes.js → version-control/version-control.routes.js} +61 -60
- package/dist/modules/version-control/version-control.routes.js.map +1 -0
- package/dist/modules/{workflow/workflow.service.d.ts → version-control/version-control.service.d.ts} +26 -31
- package/dist/modules/version-control/version-control.service.d.ts.map +1 -0
- package/dist/modules/{workflow/workflow.service.js → version-control/version-control.service.js} +89 -94
- package/dist/modules/version-control/version-control.service.js.map +1 -0
- package/dist/modules/workspace/agent-access.gate.d.ts +5 -5
- package/dist/modules/workspace/agent-access.gate.d.ts.map +1 -1
- package/dist/modules/workspace/agent-access.gate.js +1 -1
- package/dist/modules/workspace/git-internals.middleware.d.ts +1 -1
- package/dist/modules/workspace/git-internals.middleware.js +2 -2
- package/dist/modules/workspace/kb-repository.js +1 -1
- package/dist/modules/workspace/kb-repository.js.map +1 -1
- package/dist/modules/workspace/startup/kb-git.d.ts +1 -1
- package/dist/modules/workspace/startup/kb-git.d.ts.map +1 -1
- package/dist/modules/workspace/startup/kb-git.js +1 -1
- package/dist/modules/workspace/startup/kb-git.js.map +1 -1
- package/dist/modules/workspace/startup/steps/seed-tree.d.ts +2 -2
- package/dist/modules/workspace/startup/steps/seed-tree.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/seed-tree.js +1 -1
- package/dist/modules/workspace/startup/steps/seed-tree.js.map +1 -1
- package/dist/modules/workspace/startup/steps/template-files.step.d.ts +2 -2
- package/dist/modules/workspace/startup/steps/template-files.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/template-files.step.js +2 -2
- package/dist/modules/workspace/startup/steps/template-files.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/template-source.d.ts +17 -4
- package/dist/modules/workspace/startup/steps/template-source.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/template-source.js +8 -5
- package/dist/modules/workspace/startup/steps/template-source.js.map +1 -1
- package/dist/modules/workspace/workspace-tmp.js +3 -3
- package/dist/modules/workspace/workspace-tmp.js.map +1 -1
- package/dist/modules/workspace/workspace.routes.d.ts +4 -4
- package/dist/modules/workspace/workspace.routes.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.routes.js +22 -22
- package/dist/modules/workspace/workspace.routes.js.map +1 -1
- package/dist/modules/workspace/workspace.service.d.ts +6 -6
- package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.service.js +11 -11
- 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 +15 -10
- package/dist/modules/workspace/workspace.tools.js.map +1 -1
- package/dist/shared/canonical-file-identity.d.ts +2 -2
- package/dist/shared/canonical-file-identity.js +5 -5
- package/dist/shared/canonical-file-identity.js.map +1 -1
- package/dist/shared/domain-errors.d.ts +39 -39
- package/dist/shared/domain-errors.d.ts.map +1 -1
- package/dist/shared/domain-errors.js +44 -44
- package/dist/shared/domain-errors.js.map +1 -1
- package/dist/shared/git.contract.d.ts +1 -1
- package/dist/shared/git.contract.js +1 -1
- package/dist/shared/http-errors.d.ts +3 -3
- package/dist/shared/http-errors.d.ts.map +1 -1
- package/dist/shared/http-errors.js +1 -1
- package/dist/shared/http-errors.js.map +1 -1
- package/dist/shared/pending-proposals.d.ts +3 -3
- package/dist/shared/pending-proposals.d.ts.map +1 -1
- package/dist/shared/pending-proposals.js +2 -2
- package/dist/shared/pending-proposals.js.map +1 -1
- package/dist/tenancy/static-tenant-source.js +1 -1
- package/dist/tenancy/static-tenant-source.js.map +1 -1
- package/migrations/0012_agent_audit.sql +40 -40
- package/migrations/0013_agent_identity_and_key_soft_delete.sql +29 -29
- package/migrations/meta/0012_snapshot.json +2246 -2246
- package/migrations/meta/0013_snapshot.json +2258 -2258
- package/package.json +4 -4
- package/src/__tests__/account-admin.ts +27 -0
- package/src/__tests__/hexis-catalog.ts +4 -4
- package/src/__tests__/kb-context.ts +30 -30
- package/src/__tests__/kb-layout-config.test.ts +21 -0
- package/src/__tests__/open-change-gate.ts +1 -1
- package/src/__tests__/tool-handler.ts +15 -0
- package/src/__tests__/tool-wiring.ts +10 -4
- package/src/__tests__/workspace-service.ts +1 -1
- package/src/core/__tests__/catalog-cache-invalidation.test.ts +3 -3
- package/src/core/__tests__/compose-embed.test.ts +1 -1
- package/src/core/__tests__/damaged-document.tools.test.ts +3 -3
- package/src/core/__tests__/erasure-slices-wired-once.test.ts +46 -0
- package/src/core/__tests__/gated-boot.test.ts +2 -2
- package/src/core/__tests__/lifecycle.test.ts +9 -9
- package/src/core/catalog-cache-invalidation.ts +2 -2
- package/src/core/compose-embed.ts +3 -3
- package/src/core/core-ports.ts +19 -4
- package/src/core/create-core-server.ts +39 -25
- package/src/core/create-core-services.ts +79 -63
- package/src/core/lifecycle.ts +9 -9
- package/src/core-config.ts +3 -3
- package/src/index.ts +5 -5
- package/src/modules/access/__tests__/access-control.admin-root-floor.test.ts +4 -4
- package/src/modules/access/__tests__/access-own-read-grant.test.ts +14 -14
- package/src/modules/access/__tests__/access-requests.routes.test.ts +20 -20
- package/src/modules/access/__tests__/access.routes.admins.test.ts +4 -4
- package/src/modules/access/__tests__/access.routes.batch.test.ts +4 -4
- package/src/modules/access/__tests__/access.routes.folder-governs.test.ts +6 -6
- package/src/modules/access/__tests__/access.routes.group-grant.test.ts +6 -6
- package/src/modules/access/__tests__/access.routes.overrides.test.ts +5 -5
- package/src/modules/access/__tests__/access.routes.proposal-branch.test.ts +6 -6
- package/src/modules/access/__tests__/access.routes.prospective.test.ts +3 -3
- package/src/modules/access/__tests__/access.routes.revoke.test.ts +6 -6
- package/src/modules/access/__tests__/access.routes.unknown-email.test.ts +6 -6
- package/src/modules/access/__tests__/admin-locked-commit.test.ts +6 -6
- package/src/modules/access/__tests__/admin-route-helpers.test.ts +5 -5
- package/src/modules/access/__tests__/groups-admin.service.test.ts +27 -27
- package/src/modules/access/__tests__/roles-admin.security.test.ts +14 -13
- package/src/modules/access/__tests__/roles-admin.service.test.ts +27 -27
- package/src/modules/access/__tests__/roles-capabilities.test.ts +19 -19
- package/src/modules/access/__tests__/roles.routes.test.ts +6 -6
- package/src/modules/access/__tests__/synced-groups-committer.test.ts +13 -13
- package/src/modules/access/__tests__/user-access-removal.service.test.ts +29 -29
- package/src/modules/access/access-control.service.ts +1 -1
- package/src/modules/access/access-declarations.ts +2 -2
- package/src/modules/access/access-mutation.service.ts +2 -2
- package/src/modules/access/access-requests.routes.ts +7 -7
- package/src/modules/access/access-requests.service.ts +13 -13
- package/src/modules/access/access.routes.ts +11 -11
- package/src/modules/access/admin-locked-commit.ts +11 -11
- package/src/modules/access/admin-route-helpers.ts +5 -5
- package/src/modules/access/change-read-gate.ts +1 -1
- package/src/modules/access/groups-admin.service.ts +7 -7
- package/src/modules/access/reference-scan.ts +1 -1
- package/src/modules/access/roles-admin.service.ts +9 -9
- package/src/modules/access/synced-groups-committer.ts +11 -11
- package/src/modules/access/user-access-removal.service.ts +7 -7
- package/src/modules/access-model/__tests__/access-grammar.test.ts +2 -2
- package/src/modules/access-model/access-errors.ts +4 -4
- package/src/modules/access-model/access-grammar.ts +4 -4
- package/src/modules/access-model/change-gate.ts +1 -1
- package/src/modules/access-model/roles-yaml-guard.ts +4 -4
- package/src/modules/agent-guide/__tests__/agent-guide.test.ts +19 -4
- package/src/modules/agent-guide/__tests__/agent-guide.tools.test.ts +1 -1
- package/src/modules/agent-guide/__tests__/guide-matches-code.test.ts +2 -2
- package/src/modules/agent-guide/agent-guide.ts +48 -22
- package/src/modules/agent-guide/guide-budget.ts +6 -2
- package/src/modules/agent-instructions/__tests__/agent-instructions.route.test.ts +4 -5
- package/src/modules/agent-instructions/__tests__/compose.test.ts +1 -1
- package/src/modules/agent-instructions/__tests__/shared-file-rules.test.ts +113 -7
- package/src/modules/agent-instructions/agent-instructions.routes.ts +12 -5
- package/src/modules/agent-instructions/compose.ts +24 -9
- package/src/modules/agent-instructions/shared-file-rules.ts +53 -11
- package/src/modules/agent-scope/__tests__/agent-surfaces.connect-as.test.ts +1 -1
- package/src/modules/audit/__tests__/agent-rest-audit.middleware.test.ts +113 -113
- package/src/modules/audit/__tests__/event-classifier.test.ts +121 -121
- package/src/modules/audit/event-classifier.ts +155 -155
- package/src/modules/auth/__tests__/account-deactivation.test.ts +1 -1
- package/src/modules/auth/__tests__/account-erasure.approval-gate.test.ts +4 -4
- package/src/modules/auth/__tests__/account-erasure.participants.test.ts +56 -0
- package/src/modules/auth/__tests__/account-switch-lock.pg.test.ts +2 -2
- package/src/modules/auth/__tests__/account-switch-lock.test.ts +2 -2
- package/src/modules/auth/__tests__/account.routes.test.ts +73 -11
- package/src/modules/auth/__tests__/auth.service.test.ts +1 -1
- package/src/modules/auth/account-erasure.service.ts +27 -9
- package/src/modules/auth/account-hooks.ts +34 -0
- package/src/modules/auth/account-switch-lock.ts +2 -2
- package/src/modules/auth/account.routes.ts +23 -5
- package/src/modules/auth/auth.service.ts +4 -4
- package/src/modules/auth/index.ts +1 -0
- package/src/modules/database/__tests__/advisory-lock.test.ts +169 -169
- package/src/modules/database/__tests__/migrations-unqualified.test.ts +32 -32
- package/src/modules/database/core-schema.ts +2 -2
- package/src/modules/diff/__tests__/diff.routes.read-gate.test.ts +2 -2
- package/src/modules/diff/__tests__/diff.routes.rejectPathsLocked.test.ts +12 -12
- package/src/modules/diff/diff.routes.ts +8 -8
- package/src/modules/embed/__tests__/embed.service.lock.test.ts +7 -7
- package/src/modules/embed/__tests__/embed.service.test.ts +42 -42
- package/src/modules/embed/__tests__/embed.tools.test.ts +1 -1
- package/src/modules/embed/embed.routes.ts +1 -1
- package/src/modules/embed/embed.service.ts +17 -17
- package/src/modules/kb-fs/__tests__/branch-name.test.ts +2 -2
- package/src/modules/kb-fs/__tests__/locking-filesystem.test.ts +260 -260
- package/src/modules/kb-fs/__tests__/move-with-edits.test.ts +34 -34
- package/src/modules/kb-fs/__tests__/repo-path.test.ts +8 -8
- package/src/modules/kb-fs/branch-name.ts +8 -8
- package/src/modules/kb-fs/file-change-notifier.ts +2 -2
- package/src/modules/kb-fs/locking-filesystem.ts +30 -30
- package/src/modules/kb-fs/repo-path.ts +5 -5
- package/src/modules/kb-fs/tmp-ref.ts +3 -3
- package/src/modules/kb-sync/__tests__/kb-sync.service.test.ts +36 -36
- package/src/modules/kb-sync/index.ts +1 -1
- package/src/modules/kb-sync/kb-sync.interface.ts +3 -3
- package/src/modules/kb-sync/kb-sync.service.ts +9 -9
- package/src/modules/marketplace/__tests__/github-facade.test.ts +1 -1
- package/src/modules/marketplace/__tests__/marketplace-git.test.ts +1 -1
- package/src/modules/mcp/__tests__/mcp-proxy-helpers.test.ts +4 -2
- package/src/modules/mcp/__tests__/mcp.e2e.test.ts +69 -8
- package/src/modules/mcp/__tests__/mcp.service.test.ts +91 -13
- package/src/modules/mcp/__tests__/read-only-hint.pg.test.ts +194 -0
- package/src/modules/mcp/mcp.service.ts +89 -28
- package/src/modules/onboarding/__tests__/starter-pack.service.test.ts +55 -55
- package/src/modules/onboarding/onboarding.contract.ts +1 -1
- package/src/modules/onboarding/onboarding.routes.ts +2 -2
- package/src/modules/onboarding/starter-pack.service.ts +6 -6
- package/src/modules/plugins/__tests__/bundle-dialect.e2e.test.ts +1 -1
- package/src/modules/plugins/__tests__/compile-marketplace.test.ts +1 -1
- package/src/modules/plugins/__tests__/join-request-jobs.service.test.ts +43 -43
- package/src/modules/plugins/__tests__/join-requests.service.test.ts +19 -19
- package/src/modules/plugins/__tests__/join-requests.settlement.test.ts +26 -26
- package/src/modules/plugins/__tests__/plugins.routes.test.ts +25 -25
- package/src/modules/plugins/join-request-jobs.service.ts +10 -10
- package/src/modules/plugins/join-requests.service.ts +4 -4
- package/src/modules/plugins/plugin-rename.service.ts +1 -1
- package/src/modules/plugins/plugins.routes.ts +9 -9
- package/src/modules/secrets-vault/__tests__/db-secrets-vault.managed.test.ts +773 -0
- package/src/modules/secrets-vault/__tests__/db-secrets-vault.oauth.test.ts +28 -1
- package/src/modules/secrets-vault/__tests__/managed-sign-in.route.test.ts +351 -0
- package/src/modules/secrets-vault/db-secrets-vault.service.ts +562 -95
- package/src/modules/secrets-vault/index.ts +7 -0
- package/src/modules/secrets-vault/managed-sign-in-erasure.ts +41 -0
- package/src/modules/secrets-vault/secrets-variable-loader.ts +134 -134
- package/src/modules/secrets-vault/secrets-vault.contract.ts +152 -0
- package/src/modules/secrets-vault/secrets-vault.routes.ts +157 -10
- package/src/modules/settings/__tests__/repository-source.test.ts +1 -1
- package/src/modules/settings/__tests__/setup.routes.layout-phase.test.ts +1 -1
- package/src/modules/settings/__tests__/setup.routes.managed-phase.test.ts +1 -1
- package/src/modules/settings/connection-check.ts +1 -1
- package/src/modules/settings/deployment-settings.service.ts +1 -1
- package/src/modules/settings/git-root-folders.ts +1 -1
- package/src/modules/settings/setup.routes.ts +1 -1
- package/src/modules/skills/__tests__/allowed-tools-warn.tools.test.ts +3 -3
- package/src/modules/skills/__tests__/branch-skills.tools.test.ts +1 -1
- package/src/modules/skills/__tests__/pending-skills.service.test.ts +8 -8
- package/src/modules/skills/__tests__/skill-access-requests.routes.test.ts +18 -18
- package/src/modules/skills/__tests__/skills.service.test.ts +3 -3
- package/src/modules/skills/pending-skills.service.ts +3 -3
- package/src/modules/skills/skill-access-requests.routes.ts +7 -7
- package/src/modules/tool-helpers/__tests__/agent-roles-write.test.ts +4 -4
- package/src/modules/tool-helpers/__tests__/branch-declaration.test.ts +3 -3
- package/src/modules/tool-helpers/__tests__/can-write.tools.test.ts +3 -3
- package/src/modules/tool-helpers/__tests__/phase4-tools.test.ts +4 -4
- package/src/modules/tool-helpers/__tests__/tools-surface.test.ts +3 -3
- package/src/modules/tool-helpers/__tests__/validate-token.test.ts +1 -1
- package/src/modules/tool-helpers/tool-context.ts +6 -6
- package/src/modules/tool-helpers/tool-handler.ts +2 -2
- package/src/modules/tool-helpers/tool.contract.ts +4 -4
- package/src/modules/tool-manuals/__tests__/pending-tools.service.test.ts +9 -9
- package/src/modules/tool-manuals/__tests__/tool-manuals.managed-sign-in.test.ts +89 -0
- package/src/modules/tool-manuals/__tests__/tool-manuals.restart.test.ts +1 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.tools.test.ts +36 -1
- package/src/modules/tool-manuals/mcp-server-edit.service.ts +1 -1
- package/src/modules/tool-manuals/pending-tools.service.ts +3 -3
- package/src/modules/tool-manuals/tool-delete.service.ts +1 -1
- package/src/modules/tool-manuals/tool-manuals.contract.ts +41 -3
- package/src/modules/tool-manuals/tool-manuals.service.ts +53 -5
- package/src/modules/tool-manuals/tool-manuals.tools.ts +41 -15
- package/src/modules/tool-registry/__tests__/own-tool-schemas.test.ts +4 -4
- package/src/modules/tool-registry/__tests__/read-only-hints.test.ts +3 -3
- package/src/modules/tool-registry/__tests__/tool-description-length.test.ts +6 -6
- package/src/modules/{workflow → version-control}/__tests__/apply-failure.test.ts +54 -54
- package/src/modules/{workflow → version-control}/__tests__/event-bus.test.ts +27 -27
- package/src/modules/{workflow → version-control}/__tests__/events-delivery.test.ts +37 -37
- package/src/modules/{workflow → version-control}/__tests__/file-lock.service.deletion-gate.test.ts +2 -2
- package/src/modules/{workflow → version-control}/__tests__/file-lock.service.path-identity.test.ts +8 -8
- package/src/modules/{workflow → version-control}/__tests__/merge-announces-tree.test.ts +11 -11
- package/src/modules/{workflow → version-control}/__tests__/pending-commits.worker.concurrency.test.ts +9 -9
- package/src/modules/{workflow → version-control}/__tests__/pending-commits.worker.test.ts +25 -25
- package/src/modules/{workflow → version-control}/__tests__/preserve-roles-yaml.test.ts +42 -42
- package/src/modules/version-control/__tests__/public-surface.test.ts +114 -0
- package/src/modules/{workflow/__tests__/workflow.routes.folder-proposals.test.ts → version-control/__tests__/version-control.routes.folder-proposals.test.ts} +18 -18
- package/src/modules/{workflow/__tests__/workflow.routes.fork-point-file.test.ts → version-control/__tests__/version-control.routes.fork-point-file.test.ts} +19 -19
- package/src/modules/{workflow/__tests__/workflow.routes.history-read-gate.test.ts → version-control/__tests__/version-control.routes.history-read-gate.test.ts} +13 -13
- package/src/modules/{workflow/__tests__/workflow.routes.lock-path.test.ts → version-control/__tests__/version-control.routes.lock-path.test.ts} +18 -18
- package/src/modules/{workflow/__tests__/workflow.routes.open-change-request.test.ts → version-control/__tests__/version-control.routes.open-change-request.test.ts} +7 -7
- package/src/modules/{workflow/__tests__/workflow.routes.push-refused.test.ts → version-control/__tests__/version-control.routes.push-refused.test.ts} +14 -14
- package/src/modules/{workflow/__tests__/workflow.service.branch-in-use.test.ts → version-control/__tests__/version-control.service.branch-in-use.test.ts} +6 -6
- package/src/modules/{workflow/__tests__/workflow.service.commitFileWhileLocked.test.ts → version-control/__tests__/version-control.service.commitFileWhileLocked.test.ts} +14 -14
- package/src/modules/{workflow/__tests__/workflow.service.delete-branch.test.ts → version-control/__tests__/version-control.service.delete-branch.test.ts} +14 -14
- package/src/modules/{workflow/__tests__/workflow.service.deleted-branch-sweep.test.ts → version-control/__tests__/version-control.service.deleted-branch-sweep.test.ts} +4 -4
- package/src/modules/{workflow/__tests__/workflow.service.facade.test.ts → version-control/__tests__/version-control.service.facade.test.ts} +97 -99
- package/src/modules/{workflow/__tests__/workflow.service.folder-proposals.test.ts → version-control/__tests__/version-control.service.folder-proposals.test.ts} +7 -7
- package/src/modules/{workflow/__tests__/workflow.service.platform-restore.test.ts → version-control/__tests__/version-control.service.platform-restore.test.ts} +6 -6
- package/src/modules/{workflow/__tests__/workflow.service.read-gate.test.ts → version-control/__tests__/version-control.service.read-gate.test.ts} +9 -9
- package/src/modules/{workflow/__tests__/workflow.service.releaseLock.test.ts → version-control/__tests__/version-control.service.releaseLock.test.ts} +42 -42
- package/src/modules/{workflow/__tests__/workflow.service.repository-replaced.test.ts → version-control/__tests__/version-control.service.repository-replaced.test.ts} +4 -4
- package/src/modules/{workflow/__tests__/workflow.service.sync.test.ts → version-control/__tests__/version-control.service.sync.test.ts} +17 -17
- package/src/modules/{workflow/__tests__/workflow.service.update-change-request.pg.test.ts → version-control/__tests__/version-control.service.update-change-request.pg.test.ts} +6 -6
- package/src/modules/{workflow/__tests__/workflow.service.update-change-request.test.ts → version-control/__tests__/version-control.service.update-change-request.test.ts} +11 -11
- package/src/modules/{workflow/__tests__/workflow.service.update-from-target.test.ts → version-control/__tests__/version-control.service.update-from-target.test.ts} +22 -22
- package/src/modules/{workflow → version-control}/agent-tools/__tests__/change-request-read.tools.test.ts +3 -3
- package/src/modules/{workflow → version-control}/agent-tools/__tests__/update-change-request.parity.test.ts +16 -16
- package/src/modules/{workflow/agent-tools/__tests__/workflow.tools.test.ts → version-control/agent-tools/__tests__/version-control.tools.test.ts} +9 -9
- package/src/modules/{workflow → version-control}/agent-tools/change-request-read.tools.ts +2 -2
- package/src/modules/{workflow/agent-tools/workflow.tools.ts → version-control/agent-tools/version-control.tools.ts} +30 -30
- package/src/modules/{workflow → version-control}/change-request-hooks.ts +1 -1
- package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/approval-states.test.ts +5 -5
- package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/cancel-pr.test.ts +8 -8
- package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/carry-approvals-forward.test.ts +6 -6
- package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/erase-approver.test.ts +5 -5
- package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/merge-gate.test.ts +3 -3
- package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/merge-records-own-commit.test.ts +3 -3
- package/src/modules/{workflow/review-workflow/review-workflow.interface.ts → version-control/change-request-review/change-request-review.interface.ts} +1 -1
- package/src/modules/{workflow/review-workflow/review-workflow.service.ts → version-control/change-request-review/change-request-review.service.ts} +28 -28
- package/src/modules/{workflow → version-control}/event-bus.ts +14 -14
- package/src/modules/{workflow → version-control}/events-delivery.ts +11 -11
- package/src/modules/{workflow → version-control}/events.routes.ts +5 -5
- package/src/modules/{workflow → version-control}/file-lock.service.ts +6 -6
- package/src/modules/{workflow → version-control}/git/__tests__/git-test-helpers.ts +3 -3
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.accessGating.test.ts +5 -5
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.appliedChange.test.ts +4 -4
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.changedFilesForPr.test.ts +16 -16
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.changedPathsMemo.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.commitChanges.test.ts +3 -3
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.commitFile.strayPath.test.ts +10 -10
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.commitFile.test.ts +3 -3
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.createBranch.test.ts +3 -3
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.deleteBranch.test.ts +7 -7
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.diffFileAtCommit.test.ts +9 -9
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.diffFileBetweenBranches.test.ts +23 -23
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.fileBytesAtCommit.test.ts +7 -7
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.fileContentsAtCommit.test.ts +3 -3
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.forkPoint.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.history-guards.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.list-branches.test.ts +12 -12
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.listTrackedFiles.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.logForFile.test.ts +6 -6
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.mergeChangeRequest.test.ts +20 -20
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.mergeIntoBranch.test.ts +16 -16
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.pendingChanges.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.postMergePull.test.ts +5 -5
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.prFetchFailure.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.pull.test.ts +12 -12
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.readFileAtRef.test.ts +3 -3
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.revertPathsAndPush.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.status.test.ts +4 -4
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.syncFromRemote.test.ts +8 -8
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.worktrees.test.ts +4 -4
- package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.list-fetch.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.test.ts +6 -6
- package/src/modules/{workflow → version-control}/git/git.service.ts +57 -57
- package/src/modules/{workflow → version-control}/git/node-git-runner.ts +1 -1
- package/src/modules/{workflow → version-control}/git/pull-request.service.ts +12 -12
- package/src/modules/{workflow → version-control}/index.ts +6 -5
- package/src/modules/{workflow → version-control}/pending-commits.service.ts +2 -2
- package/src/modules/{workflow → version-control}/pending-commits.worker.ts +8 -8
- package/src/modules/{workflow → version-control}/read-on-branch.ts +2 -2
- package/src/modules/{workflow/workflow-hooks.ts → version-control/version-control-hooks.ts} +3 -3
- package/src/modules/{workflow/workflow.routes.ts → version-control/version-control.routes.ts} +64 -63
- package/src/modules/{workflow/workflow.service.ts → version-control/version-control.service.ts} +92 -97
- package/src/modules/workspace/__tests__/agent-access.gate.test.ts +8 -8
- package/src/modules/workspace/__tests__/agent-downloads.test.ts +13 -16
- package/src/modules/workspace/__tests__/agent-uploads.test.ts +11 -12
- package/src/modules/workspace/__tests__/escape-sequences.routes.test.ts +11 -16
- package/src/modules/workspace/__tests__/file-stat-access.test.ts +3 -3
- package/src/modules/workspace/__tests__/git-internals.security.test.ts +27 -27
- package/src/modules/workspace/__tests__/kb-repository.test.ts +1 -1
- package/src/modules/workspace/__tests__/rest-tool-arguments.test.ts +3 -3
- package/src/modules/workspace/__tests__/start-session.default-branch.test.ts +152 -0
- package/src/modules/workspace/__tests__/workspace-paths-inside-the-repo.test.ts +6 -6
- package/src/modules/workspace/__tests__/workspace-tmp.tools.test.ts +13 -14
- package/src/modules/workspace/__tests__/workspace.routes.at-ref.test.ts +6 -6
- package/src/modules/workspace/__tests__/workspace.routes.branch-errors.test.ts +4 -4
- package/src/modules/workspace/__tests__/workspace.routes.create-grant.test.ts +6 -6
- package/src/modules/workspace/__tests__/workspace.routes.delete.test.ts +8 -8
- package/src/modules/workspace/__tests__/workspace.routes.download-implies-read.test.ts +4 -4
- package/src/modules/workspace/__tests__/workspace.routes.download.test.ts +6 -6
- package/src/modules/workspace/__tests__/workspace.routes.file-writes.test.ts +6 -6
- package/src/modules/workspace/__tests__/workspace.routes.folder-zip-access.test.ts +4 -4
- package/src/modules/workspace/__tests__/workspace.routes.folders.test.ts +6 -6
- package/src/modules/workspace/__tests__/workspace.routes.move-platform-files.test.ts +7 -7
- package/src/modules/workspace/__tests__/workspace.routes.read-gate.test.ts +13 -13
- package/src/modules/workspace/__tests__/workspace.service.any-workspace-credentials.test.ts +1 -1
- package/src/modules/workspace/__tests__/workspace.service.replaced-repository.test.ts +1 -1
- package/src/modules/workspace/__tests__/workspace.service.worktrees.test.ts +1 -1
- package/src/modules/workspace/__tests__/workspace.tools.agents-file.test.ts +5 -5
- package/src/modules/workspace/__tests__/workspace.tools.branch-errors.test.ts +5 -5
- package/src/modules/workspace/__tests__/workspace.tools.test.ts +27 -27
- package/src/modules/workspace/agent-access.gate.ts +5 -5
- package/src/modules/workspace/git-internals.middleware.ts +2 -2
- package/src/modules/workspace/kb-repository.ts +1 -1
- package/src/modules/workspace/startup/__tests__/kb-startup-runner.degraded.test.ts +1 -1
- package/src/modules/workspace/startup/__tests__/kb-startup-runner.test.ts +1 -1
- package/src/modules/workspace/startup/__tests__/kb-startup-runner.worktrees.test.ts +1 -1
- package/src/modules/workspace/startup/kb-git.ts +1 -1
- package/src/modules/workspace/startup/steps/__tests__/steps.test.ts +94 -70
- package/src/modules/workspace/startup/steps/seed-tree.ts +4 -5
- package/src/modules/workspace/startup/steps/template-files.step.ts +4 -5
- package/src/modules/workspace/startup/steps/template-source.ts +21 -6
- package/src/modules/workspace/workspace-tmp.ts +4 -4
- package/src/modules/workspace/workspace.routes.ts +26 -26
- package/src/modules/workspace/workspace.service.ts +11 -11
- package/src/modules/workspace/workspace.tools.ts +17 -10
- package/src/shared/__tests__/canonical-file-identity.test.ts +5 -5
- package/src/shared/__tests__/http-errors.test.ts +4 -4
- package/src/shared/canonical-file-identity.ts +5 -5
- package/src/shared/domain-errors.ts +44 -44
- package/src/shared/git.contract.ts +1 -1
- package/src/shared/http-errors.ts +3 -3
- package/src/shared/kb-context.ts +130 -130
- package/src/shared/pending-proposals.ts +4 -4
- package/src/tenancy/__tests__/tenant-host.test.ts +372 -372
- package/src/tenancy/__tests__/tenant-runtime.test.ts +221 -221
- package/src/tenancy/__tests__/tenant-secrets.test.ts +35 -35
- package/src/tenancy/index.ts +35 -35
- package/src/tenancy/static-tenant-source.ts +1 -1
- package/src/tenancy/tenant-host.ts +261 -261
- package/src/tenancy/tenant-runtime.ts +208 -208
- package/src/tenancy/tenant-source.contract.ts +59 -59
- package/dist/modules/workflow/agent-tools/change-request-read-shape.d.ts.map +0 -1
- package/dist/modules/workflow/agent-tools/change-request-read-shape.js.map +0 -1
- package/dist/modules/workflow/agent-tools/change-request-read.tools.d.ts.map +0 -1
- package/dist/modules/workflow/agent-tools/change-request-read.tools.js.map +0 -1
- package/dist/modules/workflow/agent-tools/change-request-summary.d.ts.map +0 -1
- package/dist/modules/workflow/agent-tools/change-request-summary.js.map +0 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +0 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.js.map +0 -1
- package/dist/modules/workflow/change-request-hooks.d.ts.map +0 -1
- package/dist/modules/workflow/change-request-hooks.js.map +0 -1
- package/dist/modules/workflow/event-bus.d.ts.map +0 -1
- package/dist/modules/workflow/event-bus.js.map +0 -1
- package/dist/modules/workflow/events-delivery.d.ts.map +0 -1
- package/dist/modules/workflow/events-delivery.js.map +0 -1
- package/dist/modules/workflow/events.routes.d.ts.map +0 -1
- package/dist/modules/workflow/events.routes.js.map +0 -1
- package/dist/modules/workflow/file-lock.service.d.ts.map +0 -1
- package/dist/modules/workflow/file-lock.service.js.map +0 -1
- package/dist/modules/workflow/git/change-request-link.d.ts.map +0 -1
- package/dist/modules/workflow/git/change-request-link.js.map +0 -1
- package/dist/modules/workflow/git/git-version.d.ts.map +0 -1
- package/dist/modules/workflow/git/git-version.js.map +0 -1
- package/dist/modules/workflow/git/git.service.d.ts.map +0 -1
- package/dist/modules/workflow/git/git.service.js.map +0 -1
- package/dist/modules/workflow/git/merge-commit.d.ts.map +0 -1
- package/dist/modules/workflow/git/merge-commit.js.map +0 -1
- package/dist/modules/workflow/git/node-git-runner.d.ts.map +0 -1
- package/dist/modules/workflow/git/node-git-runner.js.map +0 -1
- package/dist/modules/workflow/git/pull-request.service.d.ts.map +0 -1
- package/dist/modules/workflow/git/pull-request.service.js.map +0 -1
- package/dist/modules/workflow/index.d.ts.map +0 -1
- package/dist/modules/workflow/index.js.map +0 -1
- package/dist/modules/workflow/pending-commits.service.d.ts.map +0 -1
- package/dist/modules/workflow/pending-commits.service.js.map +0 -1
- package/dist/modules/workflow/pending-commits.worker.d.ts.map +0 -1
- package/dist/modules/workflow/pending-commits.worker.js.map +0 -1
- package/dist/modules/workflow/read-on-branch.d.ts.map +0 -1
- package/dist/modules/workflow/read-on-branch.js.map +0 -1
- package/dist/modules/workflow/recovery-bot.d.ts.map +0 -1
- package/dist/modules/workflow/recovery-bot.js.map +0 -1
- package/dist/modules/workflow/review-workflow/approval-lock.d.ts.map +0 -1
- package/dist/modules/workflow/review-workflow/approval-lock.js.map +0 -1
- package/dist/modules/workflow/review-workflow/review-workflow.interface.d.ts.map +0 -1
- package/dist/modules/workflow/review-workflow/review-workflow.interface.js +0 -2
- package/dist/modules/workflow/review-workflow/review-workflow.interface.js.map +0 -1
- package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts.map +0 -1
- package/dist/modules/workflow/review-workflow/review-workflow.service.js.map +0 -1
- package/dist/modules/workflow/sanitize-error.d.ts.map +0 -1
- package/dist/modules/workflow/sanitize-error.js.map +0 -1
- package/dist/modules/workflow/workflow-hooks.d.ts.map +0 -1
- package/dist/modules/workflow/workflow-hooks.js.map +0 -1
- package/dist/modules/workflow/workflow.routes.d.ts.map +0 -1
- package/dist/modules/workflow/workflow.routes.js.map +0 -1
- package/dist/modules/workflow/workflow.service.d.ts.map +0 -1
- package/dist/modules/workflow/workflow.service.js.map +0 -1
- package/src/modules/mcp/__tests__/read-only-hint.e2e.test.ts +0 -213
- /package/dist/modules/{workflow → version-control}/agent-tools/change-request-read-shape.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/agent-tools/change-request-read-shape.js +0 -0
- /package/dist/modules/{workflow → version-control}/agent-tools/change-request-read.tools.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/agent-tools/change-request-summary.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/agent-tools/change-request-summary.js +0 -0
- /package/dist/modules/{workflow → version-control}/change-request-hooks.js +0 -0
- /package/dist/modules/{workflow/review-workflow → version-control/change-request-review}/approval-lock.d.ts +0 -0
- /package/dist/modules/{workflow/review-workflow → version-control/change-request-review}/approval-lock.js +0 -0
- /package/dist/modules/{workflow → version-control}/events-delivery.js +0 -0
- /package/dist/modules/{workflow → version-control}/events.routes.js +0 -0
- /package/dist/modules/{workflow → version-control}/git/change-request-link.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/git/change-request-link.js +0 -0
- /package/dist/modules/{workflow → version-control}/git/git-version.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/git/git-version.js +0 -0
- /package/dist/modules/{workflow → version-control}/git/merge-commit.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/git/merge-commit.js +0 -0
- /package/dist/modules/{workflow → version-control}/git/node-git-runner.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/recovery-bot.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/recovery-bot.js +0 -0
- /package/dist/modules/{workflow → version-control}/sanitize-error.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/sanitize-error.js +0 -0
- /package/src/modules/{workflow → version-control}/__tests__/change-request-hooks.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/__tests__/fake-file-lock-db.ts +0 -0
- /package/src/modules/{workflow → version-control}/__tests__/pending-commits.canonical.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/__tests__/pending-commits.enqueue-if-absent.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/__tests__/pending-commits.repository-replaced.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/__tests__/sanitize-error.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/agent-tools/__tests__/change-request-read-shape.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/agent-tools/change-request-read-shape.ts +0 -0
- /package/src/modules/{workflow → version-control}/agent-tools/change-request-summary.ts +0 -0
- /package/src/modules/{workflow/review-workflow → version-control/change-request-review}/approval-lock.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/branchAuthor.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/change-request-link.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/git-version.failure.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/git-version.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/node-git-runner.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.getPrDetail.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.placeholder.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.viewer-can-cancel.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.viewer-can-delete.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.viewer-can-update.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/change-request-link.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/git-version.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/merge-commit.ts +0 -0
- /package/src/modules/{workflow → version-control}/recovery-bot.ts +0 -0
- /package/src/modules/{workflow → version-control}/sanitize-error.ts +0 -0
package/dist/modules/{workflow/workflow.service.js → version-control/version-control.service.js}
RENAMED
|
@@ -1,20 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* Version-control facade — the only thing app callers (routes, agent tools, tests)
|
|
3
3
|
* should reach for. Today it delegates to the existing git / PR /
|
|
4
|
-
* review
|
|
4
|
+
* change-request-review services; over PLAN steps 2–5 the implementations migrate
|
|
5
5
|
* here directly and the underlying services either disappear or move
|
|
6
6
|
* underneath this module.
|
|
7
7
|
*
|
|
8
8
|
* The facade does no caching, no validation, no policy of its own — it
|
|
9
9
|
* exists to:
|
|
10
|
-
* 1. Lock in the
|
|
11
|
-
* 2. Concentrate every call into git/PR/review
|
|
10
|
+
* 1. Lock in the version-control vocabulary on the consumer side.
|
|
11
|
+
* 2. Concentrate every call into git/PR/change-request-review into one place
|
|
12
12
|
* so the agent prompt can stop knowing about `git` / `gh`.
|
|
13
|
-
*
|
|
14
|
-
* Methods backed by services that don't exist yet (locks, openChangeRequest,
|
|
15
|
-
* updateFromTarget) throw `NotImplementedWorkflowError`. The interface
|
|
16
|
-
* defines them so frontend / agent code can wire to the final surface while
|
|
17
|
-
* those backings land.
|
|
18
13
|
*/
|
|
19
14
|
import path from 'node:path';
|
|
20
15
|
import { execFile } from 'node:child_process';
|
|
@@ -38,11 +33,11 @@ import { redactSecret } from '../../shared/redact-secret.js';
|
|
|
38
33
|
import { workspaceIdForBranch, branchForWorkspaceId } from '../../shared/workspace-id.js';
|
|
39
34
|
import { canonicalFileIdentity } from '../../shared/canonical-file-identity.js';
|
|
40
35
|
import { describeSyncFailure, sanitizeError } from './sanitize-error.js';
|
|
41
|
-
import {
|
|
36
|
+
import { VersionControlHooks } from './version-control-hooks.js';
|
|
42
37
|
import { ChangeRequestHooks, } from './change-request-hooks.js';
|
|
43
38
|
import { WorkspaceMutex, assertValidBranchName } from '../kb-fs/index.js';
|
|
44
39
|
import { canonicalEmail, hashEmail } from '../../shared/email-identity.js';
|
|
45
|
-
import { BranchAuthorshipError, BranchDeleteBlockedError, BranchNotFoundError, ChangeRequestConflictsError, DuplicateChangeRequestError, OpenChangeRequestBlocksMergeError, ProtectedBranchError, RolesYamlPreservationError, PullRebaseConflictError, PushNeedsAgentResolutionError, RemoteBranchGoneError,
|
|
40
|
+
import { BranchAuthorshipError, BranchDeleteBlockedError, BranchNotFoundError, ChangeRequestConflictsError, DuplicateChangeRequestError, OpenChangeRequestBlocksMergeError, ProtectedBranchError, RolesYamlPreservationError, PullRebaseConflictError, PushNeedsAgentResolutionError, RemoteBranchGoneError, VersionControlDomainError, VersionControlValidationError, } from '../../shared/domain-errors.js';
|
|
46
41
|
import { RECOVERY_BOT_EMAIL, RECOVERY_BOT_NAME } from './recovery-bot.js';
|
|
47
42
|
import { AccessDeniedError, EVERYONE_CANONICAL } from '../access-model/index.js';
|
|
48
43
|
import { printable } from '../../shared/printable.js';
|
|
@@ -117,15 +112,15 @@ function redactTokens(msg, token) {
|
|
|
117
112
|
*/
|
|
118
113
|
function assertDescriptionFits(description) {
|
|
119
114
|
if (description !== undefined && description.length > CHANGE_REQUEST_DESCRIPTION_MAX) {
|
|
120
|
-
throw new
|
|
115
|
+
throw new VersionControlValidationError(`A change request's description is at most ${CHANGE_REQUEST_DESCRIPTION_MAX} characters; this one would have ${description.length}.`);
|
|
121
116
|
}
|
|
122
117
|
}
|
|
123
118
|
function assertEditable(state) {
|
|
124
119
|
if (state === 'merged') {
|
|
125
|
-
throw new
|
|
120
|
+
throw new VersionControlDomainError('This change request has already been applied; its title and description can no longer be changed.', 409);
|
|
126
121
|
}
|
|
127
122
|
if (state !== 'open') {
|
|
128
|
-
throw new
|
|
123
|
+
throw new VersionControlDomainError('This change request is closed; its title and description can no longer be changed.', 409);
|
|
129
124
|
}
|
|
130
125
|
}
|
|
131
126
|
/** Git commit subjects are capped at 200 characters (`GitService.commitFile`). */
|
|
@@ -148,11 +143,11 @@ const basenameOf = (repoRelPath) => repoRelPath.split('/').pop() ?? repoRelPath;
|
|
|
148
143
|
function folderPrefix(folder) {
|
|
149
144
|
return `${folder.replace(/\/+$/, '')}/`;
|
|
150
145
|
}
|
|
151
|
-
export class
|
|
146
|
+
export class VersionControlService {
|
|
152
147
|
db;
|
|
153
148
|
git;
|
|
154
149
|
prs;
|
|
155
|
-
|
|
150
|
+
changeRequestReview;
|
|
156
151
|
workspaceService;
|
|
157
152
|
accessControl;
|
|
158
153
|
fileLocks;
|
|
@@ -167,9 +162,9 @@ export class WorkflowService {
|
|
|
167
162
|
/**
|
|
168
163
|
* Concrete `PullRequestService` (not the interface) so the facade can call
|
|
169
164
|
* `invalidateDetailCache` after a mutation lands — the legacy routes do
|
|
170
|
-
* this inline, and the
|
|
165
|
+
* this inline, and the version-control facade absorbs that responsibility so its
|
|
171
166
|
* own routes stay free of cache plumbing. Replaceable later when the PR
|
|
172
|
-
* detail cache moves into the
|
|
167
|
+
* detail cache moves into the version-control module proper (PLAN step 5).
|
|
173
168
|
*
|
|
174
169
|
* `db` + `workspaceService` + `kbDirName` back `openChangeRequest`, which
|
|
175
170
|
* inserts a change_requests row and runs the local auto-merge — no provider
|
|
@@ -177,16 +172,16 @@ export class WorkflowService {
|
|
|
177
172
|
*/
|
|
178
173
|
/**
|
|
179
174
|
* Concrete `GitService` (not the interface) so the facade can reach
|
|
180
|
-
* `mergeFromOrigin` — the local auto-merge primitive the
|
|
175
|
+
* `mergeFromOrigin` — the local auto-merge primitive the version-control service needs
|
|
181
176
|
* for `openChangeRequest` + `updateFromTarget` (PLAN §1). The interface
|
|
182
177
|
* intentionally doesn't surface that method because it's an internal
|
|
183
|
-
* implementation detail of the
|
|
178
|
+
* implementation detail of the version-control auto-merge story; nothing outside
|
|
184
179
|
* the facade should call it directly.
|
|
185
180
|
*/
|
|
186
181
|
get kbDirName() {
|
|
187
182
|
return this.kb.kbDirName;
|
|
188
183
|
}
|
|
189
|
-
constructor(db, git, prs,
|
|
184
|
+
constructor(db, git, prs, changeRequestReview, workspaceService, accessControl, fileLocks,
|
|
190
185
|
/**
|
|
191
186
|
* Background commit queue. `releaseLock` enqueues a row instead of
|
|
192
187
|
* committing inline; the `PendingCommitsWorker` drains the queue and
|
|
@@ -217,15 +212,15 @@ export class WorkflowService {
|
|
|
217
212
|
*/
|
|
218
213
|
fileChanges,
|
|
219
214
|
/**
|
|
220
|
-
*
|
|
215
|
+
* Version-control lifecycle-hook registry (see `version-control-hooks.ts`). PUBLIC so
|
|
221
216
|
* the composition root registers module-owned behavior against it
|
|
222
|
-
* (`core.
|
|
217
|
+
* (`core.versionControlService.hooks.onCommitValidation(…)` /
|
|
223
218
|
* `.onPreWrite(…)`) after `createCoreServices` returns. The composition
|
|
224
219
|
* root passes the SAME instance `GitService` and the agent-access gate
|
|
225
220
|
* consult; the default keeps test constructions (which don't exercise
|
|
226
221
|
* hooks) unchanged.
|
|
227
222
|
*/
|
|
228
|
-
hooks = new
|
|
223
|
+
hooks = new VersionControlHooks(),
|
|
229
224
|
/**
|
|
230
225
|
* The seam a deployment's notification extends when a request is opened
|
|
231
226
|
* (see `change-request-hooks.ts`). The composition root passes the SAME
|
|
@@ -242,7 +237,7 @@ export class WorkflowService {
|
|
|
242
237
|
this.db = db;
|
|
243
238
|
this.git = git;
|
|
244
239
|
this.prs = prs;
|
|
245
|
-
this.
|
|
240
|
+
this.changeRequestReview = changeRequestReview;
|
|
246
241
|
this.workspaceService = workspaceService;
|
|
247
242
|
this.accessControl = accessControl;
|
|
248
243
|
this.fileLocks = fileLocks;
|
|
@@ -257,7 +252,7 @@ export class WorkflowService {
|
|
|
257
252
|
// The type already requires it; this holds for a caller the compiler did
|
|
258
253
|
// not see (plain JavaScript, a positional slip in a harness).
|
|
259
254
|
if (!changeGate || typeof changeGate.assertMayChange !== 'function') {
|
|
260
|
-
throw new Error('
|
|
255
|
+
throw new Error('VersionControlService requires a read-before-write gate (IChangeReadGate)');
|
|
261
256
|
}
|
|
262
257
|
}
|
|
263
258
|
// ── Branches ──────────────────────────────────────────────────────────────
|
|
@@ -401,7 +396,7 @@ export class WorkflowService {
|
|
|
401
396
|
// this branch is the deleter's own to withdraw; a request INTO it
|
|
402
397
|
// belongs to someone else, and telling the branch owner to
|
|
403
398
|
// "withdraw" it points them at a verb they cannot use.
|
|
404
|
-
throw new
|
|
399
|
+
throw new VersionControlValidationError(open.end === 'source'
|
|
405
400
|
? `Branch "${name}" has an open change request (#${open.number}). ` +
|
|
406
401
|
`Withdraw or decline it before deleting the branch.`
|
|
407
402
|
: `Open change request #${open.number} proposes changes into "${name}". ` +
|
|
@@ -747,7 +742,7 @@ export class WorkflowService {
|
|
|
747
742
|
// longer exposes a "checkout this branch on the source workspace's clone"
|
|
748
743
|
// operation, which was the only place the legacy DirtyWorkingTreeError
|
|
749
744
|
// could surface as a user-facing 409.
|
|
750
|
-
// `forkCurrentToDraft` removed (see
|
|
745
|
+
// `forkCurrentToDraft` removed (see IVersionControlService): per-branch workspaces
|
|
751
746
|
// make the dirty-tree-carry-along escape hatch impossible by construction.
|
|
752
747
|
branchStatus(workspaceId) {
|
|
753
748
|
return this.git.status(workspaceId);
|
|
@@ -950,7 +945,7 @@ export class WorkflowService {
|
|
|
950
945
|
// this sync's — never a save that landed alongside. Capped: a bulk
|
|
951
946
|
// import would otherwise fan hundreds of events out to say what one
|
|
952
947
|
// refresh says.
|
|
953
|
-
if (announce.changedPaths.length <=
|
|
948
|
+
if (announce.changedPaths.length <= VersionControlService.SYNC_FILE_EVENT_CAP) {
|
|
954
949
|
for (const p of announce.changedPaths) {
|
|
955
950
|
this.events?.emit({
|
|
956
951
|
kind: 'file-changed',
|
|
@@ -1261,7 +1256,7 @@ export class WorkflowService {
|
|
|
1261
1256
|
const targetPath = canonicalFileIdentity(rawPath);
|
|
1262
1257
|
const lock = await this.fileLocks.get(workspaceId, branch, targetPath);
|
|
1263
1258
|
if (!lock || lock.holderUserId !== user.id) {
|
|
1264
|
-
throw new
|
|
1259
|
+
throw new VersionControlValidationError(`Cannot commit "${targetPath}": you don't hold the lock.`, { kind: 'lock-not-held', branch, path: targetPath });
|
|
1265
1260
|
}
|
|
1266
1261
|
// A coordination hold is NOT write possession (see `acquireLock`): it was
|
|
1267
1262
|
// acquired past the write-authorization gate on the promise that nothing
|
|
@@ -1269,7 +1264,7 @@ export class WorkflowService {
|
|
|
1269
1264
|
// holder checkpoint bytes onto a path — machine-owned files included —
|
|
1270
1265
|
// whose write rule they never passed.
|
|
1271
1266
|
if (lock.mode === 'coordination') {
|
|
1272
|
-
throw new
|
|
1267
|
+
throw new VersionControlValidationError(`Cannot commit "${targetPath}": the lock is a coordination hold, which grants no write authority.`, { kind: 'coordination-hold', branch, path: targetPath });
|
|
1273
1268
|
}
|
|
1274
1269
|
const change = await this.git.commitFile(workspaceId, user, targetPath, summary);
|
|
1275
1270
|
// Push the autosave commit so other users on the branch see it
|
|
@@ -1380,7 +1375,7 @@ export class WorkflowService {
|
|
|
1380
1375
|
const lock = await this.fileLocks.get(workspaceId, branch, targetPath);
|
|
1381
1376
|
if (!lock || lock.holderUserId !== user.id) {
|
|
1382
1377
|
lockLog.warn(`RELEASE refused ws=${workspaceId} branch=${branch} path=${targetPath} user=${user.id} → ${lock ? `held by ${lock.holderUserId}` : 'no lock row'}`);
|
|
1383
|
-
throw new
|
|
1378
|
+
throw new VersionControlValidationError(`Cannot release lock on "${targetPath}": not held by you (or no longer exists).`, { kind: 'lock-not-held', branch, path: targetPath });
|
|
1384
1379
|
}
|
|
1385
1380
|
// Releasing a coordination hold must NEVER enqueue a commit: the hold was
|
|
1386
1381
|
// granted past the write-authorization gate (see `acquireLock`) on the
|
|
@@ -1393,7 +1388,7 @@ export class WorkflowService {
|
|
|
1393
1388
|
// row until its TTL.
|
|
1394
1389
|
if (lock.mode === 'coordination') {
|
|
1395
1390
|
lockLog.warn(`RELEASE refused ws=${workspaceId} branch=${branch} path=${targetPath} user=${user.id} → coordination hold (no commit may be enqueued)`);
|
|
1396
|
-
throw new
|
|
1391
|
+
throw new VersionControlValidationError(`Cannot release lock on "${targetPath}" with a commit: it is a coordination hold. Use releaseLockNoCommit.`, { kind: 'coordination-hold', branch, path: targetPath });
|
|
1397
1392
|
}
|
|
1398
1393
|
// Order matters here:
|
|
1399
1394
|
// 1. Drop the lock row. Other sessions can re-acquire immediately.
|
|
@@ -1563,7 +1558,7 @@ export class WorkflowService {
|
|
|
1563
1558
|
* still fails." The full rationale lives at the call site in
|
|
1564
1559
|
* `releaseLock`; this method is the de-duplicated body.
|
|
1565
1560
|
*
|
|
1566
|
-
* EVERY
|
|
1561
|
+
* EVERY version-control push goes through here — saves, sharing a branch, opening
|
|
1567
1562
|
* a request, update-from-target, the decline revert, the roles.yaml
|
|
1568
1563
|
* restore — so a push the host refuses answers one way everywhere: the
|
|
1569
1564
|
* commit stays local, the sync banner goes up, and the caller gets the
|
|
@@ -1683,7 +1678,7 @@ export class WorkflowService {
|
|
|
1683
1678
|
//
|
|
1684
1679
|
// One refinement for COORDINATION holds: the holder never legitimately
|
|
1685
1680
|
// wrote the path (the write paths refuse coordination possession), so
|
|
1686
|
-
// anything dirty there is either bytes smuggled in around
|
|
1681
|
+
// anything dirty there is either bytes smuggled in around version control —
|
|
1687
1682
|
// which the discard rightly wipes — or a PRIOR save's work whose commit
|
|
1688
1683
|
// is still queued. Only the queue can tell those apart: when a live
|
|
1689
1684
|
// pending-commit row exists for the path, the dirty bytes are that
|
|
@@ -1850,17 +1845,17 @@ export class WorkflowService {
|
|
|
1850
1845
|
*/
|
|
1851
1846
|
async openChangeRequest(workspaceId, user, input) {
|
|
1852
1847
|
if (!input.sourceBranch)
|
|
1853
|
-
throw new
|
|
1848
|
+
throw new VersionControlValidationError('sourceBranch is required');
|
|
1854
1849
|
if (!input.targetBranch)
|
|
1855
|
-
throw new
|
|
1850
|
+
throw new VersionControlValidationError('targetBranch is required');
|
|
1856
1851
|
if (input.sourceBranch === input.targetBranch) {
|
|
1857
|
-
throw new
|
|
1852
|
+
throw new VersionControlValidationError('source and target branches must differ');
|
|
1858
1853
|
}
|
|
1859
1854
|
if (!input.title?.trim())
|
|
1860
|
-
throw new
|
|
1855
|
+
throw new VersionControlValidationError('title is required');
|
|
1861
1856
|
assertDescriptionFits(input.description?.trim());
|
|
1862
1857
|
if (this.kb.isProtectedBranch(input.sourceBranch)) {
|
|
1863
|
-
throw new
|
|
1858
|
+
throw new VersionControlValidationError(`Cannot open a change request *from* a protected branch ("${input.sourceBranch}").`, { kind: 'source-is-protected', sourceBranch: input.sourceBranch });
|
|
1864
1859
|
}
|
|
1865
1860
|
// The whole open sequence — uniqueness check through row insert — runs
|
|
1866
1861
|
// under the lifecycle lock of BOTH branches. `retireMergedSourceBranch`
|
|
@@ -1890,7 +1885,7 @@ export class WorkflowService {
|
|
|
1890
1885
|
}
|
|
1891
1886
|
// Auto-merge target → source. `mergeFromOrigin` enforces "current
|
|
1892
1887
|
// branch == source" and "clean working tree" before attempting; both
|
|
1893
|
-
// failures surface as structured
|
|
1888
|
+
// failures surface as structured version-control errors that pass straight
|
|
1894
1889
|
// through to the caller.
|
|
1895
1890
|
const mergeOutcome = await this.git.mergeFromOrigin(workspaceId, input.sourceBranch, input.targetBranch, user);
|
|
1896
1891
|
if (mergeOutcome.kind === 'conflicts') {
|
|
@@ -1959,7 +1954,7 @@ export class WorkflowService {
|
|
|
1959
1954
|
// rival was merged/closed in the microsecond between the conflict and
|
|
1960
1955
|
// this re-query), don't fabricate a #0 — report it as a transient race.
|
|
1961
1956
|
if (!existing) {
|
|
1962
|
-
throw new
|
|
1957
|
+
throw new VersionControlValidationError(`Change request for "${input.sourceBranch}" → "${input.targetBranch}" ` +
|
|
1963
1958
|
'raced with a concurrent open/close; retry.', { kind: 'open-change-request-failed' });
|
|
1964
1959
|
}
|
|
1965
1960
|
throw new DuplicateChangeRequestError(input.sourceBranch, input.targetBranch, existing.number);
|
|
@@ -1970,7 +1965,7 @@ export class WorkflowService {
|
|
|
1970
1965
|
// openChangeRequest finds no duplicate, re-runs the (idempotent, already
|
|
1971
1966
|
// up-to-date) auto-merge, and inserts the row.
|
|
1972
1967
|
const rawMsg = err instanceof Error ? err.message : String(err);
|
|
1973
|
-
throw new
|
|
1968
|
+
throw new VersionControlValidationError(`Failed to open change request: ${redactTokens(rawMsg, this.git.credentials?.token())}`, { kind: 'open-change-request-failed' });
|
|
1974
1969
|
}
|
|
1975
1970
|
this.prs.invalidateDetailCache(prNumber);
|
|
1976
1971
|
const opened = {
|
|
@@ -2013,7 +2008,7 @@ export class WorkflowService {
|
|
|
2013
2008
|
eligible,
|
|
2014
2009
|
detail: null,
|
|
2015
2010
|
pushRefused: null,
|
|
2016
|
-
detailError: detailError ?? new
|
|
2011
|
+
detailError: detailError ?? new VersionControlValidationError(`Created change request #${prNumber} but could not fetch its detail`),
|
|
2017
2012
|
};
|
|
2018
2013
|
});
|
|
2019
2014
|
// The request exists in every branch of the outcome — the listeners are
|
|
@@ -2134,13 +2129,13 @@ export class WorkflowService {
|
|
|
2134
2129
|
patches: false,
|
|
2135
2130
|
});
|
|
2136
2131
|
if (!detail) {
|
|
2137
|
-
throw new
|
|
2132
|
+
throw new VersionControlValidationError(`Change request #${number} not found.`, { kind: 'change-request-not-found', number });
|
|
2138
2133
|
}
|
|
2139
2134
|
if (detail.state !== 'open') {
|
|
2140
|
-
throw new
|
|
2135
|
+
throw new VersionControlValidationError(`Change request #${number} is ${detail.state} — only open requests can refresh from target.`, { kind: 'change-request-not-open', state: detail.state });
|
|
2141
2136
|
}
|
|
2142
2137
|
if (!detail.viewerCanUpdate) {
|
|
2143
|
-
throw new
|
|
2138
|
+
throw new VersionControlDomainError('Only the author of this change request, or someone who may apply it, can update it.', 403);
|
|
2144
2139
|
}
|
|
2145
2140
|
// Taken BEFORE the head moves (the pull below can move it too): only a
|
|
2146
2141
|
// refusal recorded earlier describes the revision this replaces (see
|
|
@@ -2263,7 +2258,7 @@ export class WorkflowService {
|
|
|
2263
2258
|
if (headMoved) {
|
|
2264
2259
|
try {
|
|
2265
2260
|
updatedPaths = await this.git.pathsChangedBetween(workspaceId, headBeforeMerge, headAfterMerge);
|
|
2266
|
-
await this.
|
|
2261
|
+
await this.changeRequestReview.carryApprovalsForward(number, headBeforeMerge, headAfterMerge, updatedPaths);
|
|
2267
2262
|
}
|
|
2268
2263
|
catch (err) {
|
|
2269
2264
|
log.warn(`could not carry approvals forward on change request #${number} after updating from target`, { err });
|
|
@@ -2282,14 +2277,14 @@ export class WorkflowService {
|
|
|
2282
2277
|
viewerEmail: user.email,
|
|
2283
2278
|
});
|
|
2284
2279
|
if (!refreshed) {
|
|
2285
|
-
throw new
|
|
2280
|
+
throw new VersionControlValidationError(`Refreshed change request #${number} but could not re-fetch its detail.`);
|
|
2286
2281
|
}
|
|
2287
2282
|
return { ...refreshed, updatedPaths };
|
|
2288
2283
|
}
|
|
2289
2284
|
async approveFile(number, path, user, files, headSha, baseBranch, authorIdHash, workspaceId) {
|
|
2290
2285
|
// Taken BEFORE the approval lands (see `clearApplyFailure`).
|
|
2291
2286
|
const approvedAfter = new Date();
|
|
2292
|
-
const approvals = await this.
|
|
2287
|
+
const approvals = await this.changeRequestReview.approveFile(number, path, user, files, headSha, baseBranch, authorIdHash, workspaceId);
|
|
2293
2288
|
// A recorded approval can answer a GATE refusal only — a conflict or a git
|
|
2294
2289
|
// error still describes the request — and only once the gate that refused
|
|
2295
2290
|
// would now pass: approving one file of several leaves the rest waiting,
|
|
@@ -2310,7 +2305,7 @@ export class WorkflowService {
|
|
|
2310
2305
|
return approvals;
|
|
2311
2306
|
}
|
|
2312
2307
|
async unapproveFile(number, path, user, files, headSha, baseBranch, authorIdHash, workspaceId) {
|
|
2313
|
-
const approvals = await this.
|
|
2308
|
+
const approvals = await this.changeRequestReview.unapproveFile(number, path, user, files, headSha, baseBranch, authorIdHash, workspaceId);
|
|
2314
2309
|
this.prs.invalidateDetailCache(number);
|
|
2315
2310
|
this.events?.emit({
|
|
2316
2311
|
kind: 'approval-changed',
|
|
@@ -2362,9 +2357,9 @@ export class WorkflowService {
|
|
|
2362
2357
|
async revertChangeRequestFile(number, user, repoRelPath) {
|
|
2363
2358
|
const summary = await this.prs.getPr(number);
|
|
2364
2359
|
if (!summary)
|
|
2365
|
-
throw new
|
|
2360
|
+
throw new VersionControlDomainError('change request not found', 404);
|
|
2366
2361
|
if (summary.state !== 'open') {
|
|
2367
|
-
throw new
|
|
2362
|
+
throw new VersionControlDomainError('This change request is no longer open.', 422);
|
|
2368
2363
|
}
|
|
2369
2364
|
const baseBranch = summary.base;
|
|
2370
2365
|
const headBranch = summary.branch;
|
|
@@ -2381,15 +2376,15 @@ export class WorkflowService {
|
|
|
2381
2376
|
// The verb acts on the request as it is NOW — never a cached file list.
|
|
2382
2377
|
const paths = await this.git.changedPathsForPr(ws.id, baseBranch, headBranch);
|
|
2383
2378
|
if (!paths.includes(repoRelPath)) {
|
|
2384
|
-
throw new
|
|
2379
|
+
throw new VersionControlDomainError('That file is not part of this change request.', 422);
|
|
2385
2380
|
}
|
|
2386
2381
|
const canApprove = await this.accessControl.canWriteAtRef(ws.id, `origin/${baseBranch}`, user.email, repoRelPath);
|
|
2387
2382
|
if (canApprove !== true) {
|
|
2388
|
-
throw new
|
|
2383
|
+
throw new VersionControlDomainError('Only an eligible approver of this file can revert it — declining takes the same permission as accepting.', 403);
|
|
2389
2384
|
}
|
|
2390
2385
|
const mergeBase = await this.git.mergeBaseForPr(ws.id, baseBranch, headBranch);
|
|
2391
2386
|
if (!mergeBase) {
|
|
2392
|
-
throw new
|
|
2387
|
+
throw new VersionControlDomainError('These branches share no history to revert to.', 422);
|
|
2393
2388
|
}
|
|
2394
2389
|
const placeholder = await this.placeholderRevertedWith(ws.id, mergeBase, repoRelPath, paths);
|
|
2395
2390
|
const reverted = placeholder ? [repoRelPath, placeholder] : [repoRelPath];
|
|
@@ -2406,7 +2401,7 @@ export class WorkflowService {
|
|
|
2406
2401
|
const lockPath = `${this.kbDirName}/${p}`;
|
|
2407
2402
|
const lock = await this.fileLocks.acquire(ws.id, headBranch, lockPath, user);
|
|
2408
2403
|
if (!lock.acquired) {
|
|
2409
|
-
throw new
|
|
2404
|
+
throw new VersionControlDomainError(p === repoRelPath
|
|
2410
2405
|
? `${repoRelPath} is being edited by ${lock.lock.holderName} — try again once the edit settles.`
|
|
2411
2406
|
: `The folder of ${repoRelPath} is being changed by ${lock.lock.holderName} — try again once the edit settles.`, 409);
|
|
2412
2407
|
}
|
|
@@ -2486,7 +2481,7 @@ export class WorkflowService {
|
|
|
2486
2481
|
}
|
|
2487
2482
|
catch (err) {
|
|
2488
2483
|
log.warn(`changedPathsForPr failed for #${cr.number} under folder ${printable(folder)}: ${printable(sanitizeError(err))}`);
|
|
2489
|
-
throw new
|
|
2484
|
+
throw new VersionControlDomainError(`Couldn't read what change request #${cr.number} proposes — try again in a moment.`, 500);
|
|
2490
2485
|
}
|
|
2491
2486
|
}));
|
|
2492
2487
|
const touching = resolved
|
|
@@ -2549,7 +2544,7 @@ export class WorkflowService {
|
|
|
2549
2544
|
const requests = await this.changeRequestsUnderFolder(folder, user);
|
|
2550
2545
|
const refused = requests.filter((r) => !r.mayRemove);
|
|
2551
2546
|
if (refused.length > 0) {
|
|
2552
|
-
throw new
|
|
2547
|
+
throw new VersionControlDomainError(`You can't remove proposed changes from ${refused.map((r) => `#${r.number}`).join(', ')} — only the author, an admin or someone who can write every file it proposes here can.`, 403);
|
|
2553
2548
|
}
|
|
2554
2549
|
const prefix = folderPrefix(folder);
|
|
2555
2550
|
// Everything that can refuse happens before the first commit, so a
|
|
@@ -2571,7 +2566,7 @@ export class WorkflowService {
|
|
|
2571
2566
|
}
|
|
2572
2567
|
catch (err) {
|
|
2573
2568
|
log.warn(`pull failed for #${summary.number} before removing folder ${printable(folder)}: ${printable(sanitizeError(err))}`);
|
|
2574
|
-
throw new
|
|
2569
|
+
throw new VersionControlDomainError(`#${summary.number} could not be brought up to date, so nothing was removed — try again in a moment.`, 409);
|
|
2575
2570
|
}
|
|
2576
2571
|
const paths = (await this.git.changedPathsForPr(ws.id, summary.base, summary.branch)).filter((p) => p.startsWith(prefix));
|
|
2577
2572
|
// The permission above was judged on the paths the request proposed
|
|
@@ -2579,13 +2574,13 @@ export class WorkflowService {
|
|
|
2579
2574
|
// file need not be one of it — so the request has to be asked about again.
|
|
2580
2575
|
const unjudged = paths.filter((p) => !request.paths.includes(p));
|
|
2581
2576
|
if (unjudged.length > 0) {
|
|
2582
|
-
throw new
|
|
2577
|
+
throw new VersionControlDomainError(`#${summary.number} changed while the folder was being deleted (${unjudged.length === 1 ? unjudged[0] : `${unjudged.length} new files`}), so no proposed changes were removed — try again.`, 409);
|
|
2583
2578
|
}
|
|
2584
2579
|
let mergeBase = null;
|
|
2585
2580
|
if (paths.length > 0) {
|
|
2586
2581
|
mergeBase = await this.git.mergeBaseForPr(ws.id, summary.base, summary.branch);
|
|
2587
2582
|
if (!mergeBase) {
|
|
2588
|
-
throw new
|
|
2583
|
+
throw new VersionControlDomainError(`#${summary.number} shares no history with its target to revert to.`, 422);
|
|
2589
2584
|
}
|
|
2590
2585
|
}
|
|
2591
2586
|
plans.push({ number: summary.number, branch: summary.branch, wsId: ws.id, paths, mergeBase });
|
|
@@ -2612,7 +2607,7 @@ export class WorkflowService {
|
|
|
2612
2607
|
}
|
|
2613
2608
|
else if (seen.mergeBase !== plan.mergeBase) {
|
|
2614
2609
|
const sharing = group.plans.map((other) => `#${other.number}`).join(', ');
|
|
2615
|
-
throw new
|
|
2610
|
+
throw new VersionControlDomainError(`${sharing} propose ${repoRelPath} from the same branch against different targets, so it can't be taken out of both at once. Decline it in each request instead.`, 422);
|
|
2616
2611
|
}
|
|
2617
2612
|
}
|
|
2618
2613
|
}
|
|
@@ -2639,7 +2634,7 @@ export class WorkflowService {
|
|
|
2639
2634
|
const lockPath = `${this.kbDirName}/${repoRelPath}`;
|
|
2640
2635
|
const lock = await this.fileLocks.acquire(group.wsId, group.branch, lockPath, user);
|
|
2641
2636
|
if (!lock.acquired) {
|
|
2642
|
-
throw new
|
|
2637
|
+
throw new VersionControlDomainError(`${repoRelPath} is being edited by ${lock.lock.holderName} — try again once the edit settles.`, 409);
|
|
2643
2638
|
}
|
|
2644
2639
|
held.push({ wsId: group.wsId, branch: group.branch, lockPath });
|
|
2645
2640
|
}
|
|
@@ -2710,7 +2705,7 @@ export class WorkflowService {
|
|
|
2710
2705
|
if (pushFailure) {
|
|
2711
2706
|
const failed = pushFailure.group.plans.map((plan) => `#${plan.number}`).join(', ');
|
|
2712
2707
|
log.warn(`push failed for ${failed} removing folder ${printable(folder)}: ${printable(sanitizeError(pushFailure.err))}`);
|
|
2713
|
-
throw new
|
|
2708
|
+
throw new VersionControlDomainError(`The folder's files were removed from ${finished.map((plan) => `#${plan.number}`).join(', ')}, but ${failed} could not be updated and it and any later requests were left as they were. Run the delete again to finish.`, 500);
|
|
2714
2709
|
}
|
|
2715
2710
|
return results;
|
|
2716
2711
|
}
|
|
@@ -2731,9 +2726,9 @@ export class WorkflowService {
|
|
|
2731
2726
|
async deleteChangeRequest(number, user) {
|
|
2732
2727
|
const summary = await this.prs.getPr(number);
|
|
2733
2728
|
if (!summary)
|
|
2734
|
-
throw new
|
|
2729
|
+
throw new VersionControlDomainError('change request not found', 404);
|
|
2735
2730
|
if (summary.state === 'merged') {
|
|
2736
|
-
throw new
|
|
2731
|
+
throw new VersionControlDomainError('This change request has already been applied.', 422);
|
|
2737
2732
|
}
|
|
2738
2733
|
// Which `roles.yaml` authorizes this? The base branch's, exactly as every
|
|
2739
2734
|
// other admin check here. When the base branch itself is gone, this
|
|
@@ -2758,7 +2753,7 @@ export class WorkflowService {
|
|
|
2758
2753
|
await this.workspaceService.ensureRemotesFetched(ws.id, { strict: true });
|
|
2759
2754
|
}
|
|
2760
2755
|
catch {
|
|
2761
|
-
throw new
|
|
2756
|
+
throw new VersionControlDomainError(`Could not verify the base branch "${summary.base}" — origin was unreachable. Retry in a moment.`, 409);
|
|
2762
2757
|
}
|
|
2763
2758
|
isAdmin = await this.accessControl.canWriteAtRef(ws.id, `origin/${summary.base}`, user.email, 'roles.yaml');
|
|
2764
2759
|
}
|
|
@@ -2774,7 +2769,7 @@ export class WorkflowService {
|
|
|
2774
2769
|
// attempt the sweep has either closed the row or shown the base alive.
|
|
2775
2770
|
if (isAdmin === null) {
|
|
2776
2771
|
this.kickDeletedBranchSweep();
|
|
2777
|
-
throw new
|
|
2772
|
+
throw new VersionControlDomainError(`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);
|
|
2778
2773
|
}
|
|
2779
2774
|
// Authorship is decided from the STORED author hash, never from anything
|
|
2780
2775
|
// the caller sends. Note what is deliberately NOT short-circuited for an
|
|
@@ -2786,7 +2781,7 @@ export class WorkflowService {
|
|
|
2786
2781
|
// stay honest.
|
|
2787
2782
|
const callerIsAuthor = !!(summary.authorId && summary.authorId === hashEmail(user.email));
|
|
2788
2783
|
if (!callerIsAuthor && isAdmin !== true) {
|
|
2789
|
-
throw new
|
|
2784
|
+
throw new VersionControlDomainError("Only the request's author or an admin can delete it.", 403);
|
|
2790
2785
|
}
|
|
2791
2786
|
// Close first (idempotent: an already-closed request just skips to the
|
|
2792
2787
|
// branch retirement). Guarded on `open` so a concurrent merge wins.
|
|
@@ -2803,7 +2798,7 @@ export class WorkflowService {
|
|
|
2803
2798
|
else {
|
|
2804
2799
|
const fresh = await this.prs.getPr(number);
|
|
2805
2800
|
if (fresh?.state === 'merged') {
|
|
2806
|
-
throw new
|
|
2801
|
+
throw new VersionControlDomainError('This change request has already been applied.', 422);
|
|
2807
2802
|
}
|
|
2808
2803
|
}
|
|
2809
2804
|
await this.retireMergedSourceBranch(number, summary.base, user);
|
|
@@ -2837,7 +2832,7 @@ export class WorkflowService {
|
|
|
2837
2832
|
}
|
|
2838
2833
|
catch {
|
|
2839
2834
|
this.kickDeletedBranchSweep();
|
|
2840
|
-
throw new
|
|
2835
|
+
throw new VersionControlDomainError(`Could not verify the base branch "${baseBranch}" — origin was unreachable. Retry in a moment.`, 409);
|
|
2841
2836
|
}
|
|
2842
2837
|
const isAdmin = await this.accessControl.canWriteAtRef(workspaceId, `origin/${baseBranch}`, user.email, 'roles.yaml');
|
|
2843
2838
|
if (isAdmin === true)
|
|
@@ -2847,7 +2842,7 @@ export class WorkflowService {
|
|
|
2847
2842
|
// read and a batch lookup done for nothing.
|
|
2848
2843
|
if (isAdmin === null) {
|
|
2849
2844
|
this.kickDeletedBranchSweep();
|
|
2850
|
-
throw new
|
|
2845
|
+
throw new VersionControlDomainError(`The base branch "${baseBranch}" could not be resolved — it may have been deleted, or origin was unreachable. A background check is running; retry in a moment.`, 409);
|
|
2851
2846
|
}
|
|
2852
2847
|
let detail;
|
|
2853
2848
|
try {
|
|
@@ -2885,16 +2880,16 @@ export class WorkflowService {
|
|
|
2885
2880
|
const description = input.description === undefined ? undefined : input.description.trim();
|
|
2886
2881
|
const appended = input.appendDescription === undefined ? undefined : input.appendDescription.trim();
|
|
2887
2882
|
if (title === undefined && description === undefined && appended === undefined) {
|
|
2888
|
-
throw new
|
|
2883
|
+
throw new VersionControlValidationError('Give a new title, a new description, or both.');
|
|
2889
2884
|
}
|
|
2890
2885
|
if (description !== undefined && appended !== undefined) {
|
|
2891
|
-
throw new
|
|
2886
|
+
throw new VersionControlValidationError('Give either a new description or text to append to it, not both.');
|
|
2892
2887
|
}
|
|
2893
2888
|
if (title !== undefined && title.length === 0) {
|
|
2894
|
-
throw new
|
|
2889
|
+
throw new VersionControlValidationError('A change request needs a title; it cannot be empty.');
|
|
2895
2890
|
}
|
|
2896
2891
|
if (title !== undefined && title.length > CHANGE_REQUEST_TITLE_MAX) {
|
|
2897
|
-
throw new
|
|
2892
|
+
throw new VersionControlValidationError(`A change request's title is at most ${CHANGE_REQUEST_TITLE_MAX} characters; this one has ${title.length}.`);
|
|
2898
2893
|
}
|
|
2899
2894
|
// A replacement is measured here; an append is measured on what it
|
|
2900
2895
|
// leaves, inside the transaction, since that depends on the body as
|
|
@@ -2902,7 +2897,7 @@ export class WorkflowService {
|
|
|
2902
2897
|
assertDescriptionFits(description);
|
|
2903
2898
|
const summary = await this.prs.getPr(number);
|
|
2904
2899
|
if (!summary)
|
|
2905
|
-
throw new
|
|
2900
|
+
throw new VersionControlDomainError('change request not found', 404);
|
|
2906
2901
|
assertEditable(summary.state);
|
|
2907
2902
|
// The grants beyond authorship are read in the base branch's own workspace,
|
|
2908
2903
|
// resolved only once authorship has not already decided: an author's edit
|
|
@@ -2918,7 +2913,7 @@ export class WorkflowService {
|
|
|
2918
2913
|
}
|
|
2919
2914
|
});
|
|
2920
2915
|
if (grant === null) {
|
|
2921
|
-
throw new
|
|
2916
|
+
throw new VersionControlDomainError("Only the request's author, an admin, or someone who may approve every file it changes can edit its title and description.", 403);
|
|
2922
2917
|
}
|
|
2923
2918
|
// The body is rewritten from the row as stored, not from the summary read
|
|
2924
2919
|
// above, inside one transaction holding the row's lock (`FOR UPDATE`) from
|
|
@@ -2963,15 +2958,15 @@ export class WorkflowService {
|
|
|
2963
2958
|
if (!updated) {
|
|
2964
2959
|
const fresh = await this.prs.getPr(number);
|
|
2965
2960
|
if (!fresh)
|
|
2966
|
-
throw new
|
|
2961
|
+
throw new VersionControlDomainError('change request not found', 404);
|
|
2967
2962
|
assertEditable(fresh.state);
|
|
2968
|
-
throw new
|
|
2963
|
+
throw new VersionControlDomainError('This change request changed while it was being edited. Retry in a moment.', 409);
|
|
2969
2964
|
}
|
|
2970
2965
|
crLog.info(`#${number} title/description edited`);
|
|
2971
2966
|
this.events?.emit({ kind: 'change-request-edited', number });
|
|
2972
2967
|
const fresh = await this.prs.getPr(number);
|
|
2973
2968
|
if (!fresh)
|
|
2974
|
-
throw new
|
|
2969
|
+
throw new VersionControlDomainError('change request not found', 404);
|
|
2975
2970
|
return fresh;
|
|
2976
2971
|
}
|
|
2977
2972
|
/**
|
|
@@ -3043,7 +3038,7 @@ export class WorkflowService {
|
|
|
3043
3038
|
* branch is gone. Closing takes it out of every open list (which is the
|
|
3044
3039
|
* whole visible problem) while a `state = 'closed'` row can still be read,
|
|
3045
3040
|
* counted, and reopened by hand. Deleting would make this sweep the one
|
|
3046
|
-
* operation in
|
|
3041
|
+
* operation in version control that destroys history without a human asking.
|
|
3047
3042
|
*
|
|
3048
3043
|
* ONE fetch, then a set lookup. The freshness matters more than the cost:
|
|
3049
3044
|
* `changedPathsForPr` fails when a branch is missing from THAT
|
|
@@ -3506,7 +3501,7 @@ export class WorkflowService {
|
|
|
3506
3501
|
effectiveAuthorIdHash = hashEmail(user.email);
|
|
3507
3502
|
}
|
|
3508
3503
|
}
|
|
3509
|
-
const result = await this.
|
|
3504
|
+
const result = await this.changeRequestReview.cancelPr(number, user, state, effectiveAuthorIdHash, baseBranch, workspaceId);
|
|
3510
3505
|
this.prs.invalidateDetailCache(number);
|
|
3511
3506
|
this.events?.emit({ kind: 'change-request-rejected', number });
|
|
3512
3507
|
return result;
|
|
@@ -3561,7 +3556,7 @@ export class WorkflowService {
|
|
|
3561
3556
|
}
|
|
3562
3557
|
let result;
|
|
3563
3558
|
try {
|
|
3564
|
-
result = await this.
|
|
3559
|
+
result = await this.changeRequestReview.mergePr(number, user, mergeHeadSha, mergeApprovals, state, title, baseBranch, workspaceId, opts);
|
|
3565
3560
|
}
|
|
3566
3561
|
catch (err) {
|
|
3567
3562
|
// The local merge hit conflicts — hand the caller (agent/UI) the actual
|
|
@@ -3693,7 +3688,7 @@ export class WorkflowService {
|
|
|
3693
3688
|
}
|
|
3694
3689
|
async mergeBranch(user, sourceBranch, targetBranch) {
|
|
3695
3690
|
if (sourceBranch === targetBranch) {
|
|
3696
|
-
throw new
|
|
3691
|
+
throw new VersionControlValidationError(`\`source\` and \`target\` are both "${sourceBranch}" — name two different branches.`);
|
|
3697
3692
|
}
|
|
3698
3693
|
// Asked once BEFORE waiting, so a merge the open request forbids is refused
|
|
3699
3694
|
// at once rather than after the source's commits have landed. Not the
|
|
@@ -3742,7 +3737,7 @@ export class WorkflowService {
|
|
|
3742
3737
|
// The merge runs in the target's own workspace, like a change request's.
|
|
3743
3738
|
const targetWorkspaceId = (await this.workspaceService.getOrCreateForBranch(targetBranch)).id;
|
|
3744
3739
|
if (!(await this.git.remoteBranchExists(targetWorkspaceId, sourceBranch))) {
|
|
3745
|
-
throw new
|
|
3740
|
+
throw new VersionControlValidationError(`No branch named "${sourceBranch}" on the shared remote.`);
|
|
3746
3741
|
}
|
|
3747
3742
|
const result = await this.git.mergeChangeRequest(targetWorkspaceId, sourceBranch, targetBranch, {
|
|
3748
3743
|
subject: `Merge ${sourceBranch} into ${targetBranch}`,
|
|
@@ -3780,7 +3775,7 @@ export class WorkflowService {
|
|
|
3780
3775
|
// roles.yaml would bypass both, on the one file the access
|
|
3781
3776
|
// model cannot survive being wrong.
|
|
3782
3777
|
if (changedPaths.includes('roles.yaml')) {
|
|
3783
|
-
throw new
|
|
3778
|
+
throw new VersionControlDomainError(`"${targetBranch}" is protected and this merge would change its roles.yaml. ` +
|
|
3784
3779
|
`Roles never change through a merge: restore roles.yaml on "${sourceBranch}" to the version on ` +
|
|
3785
3780
|
`"${targetBranch}" and merge again, and ask the user to change roles in the app.`, 403, { kind: 'protected-merge-changes-roles', targetBranch, sourceBranch });
|
|
3786
3781
|
}
|
|
@@ -3788,7 +3783,7 @@ export class WorkflowService {
|
|
|
3788
3783
|
const denied = allowed ? changedPaths.filter((p) => !allowed.get(p)) : [];
|
|
3789
3784
|
if (denied.length === 0)
|
|
3790
3785
|
return;
|
|
3791
|
-
throw new
|
|
3786
|
+
throw new VersionControlDomainError(`"${targetBranch}" is protected and you cannot commit directly to it: ` +
|
|
3792
3787
|
`${denied.length} changed file(s) are outside your write access (${denied.join(', ')}). ` +
|
|
3793
3788
|
`Open a change request from "${sourceBranch}" into "${targetBranch}" and ask the user to review it in the app.`, 403, { kind: 'protected-merge-target', targetBranch, deniedPaths: denied });
|
|
3794
3789
|
}
|
|
@@ -3888,7 +3883,7 @@ export class WorkflowService {
|
|
|
3888
3883
|
*/
|
|
3889
3884
|
gateWouldPass(number, approvals) {
|
|
3890
3885
|
try {
|
|
3891
|
-
const gate = this.
|
|
3886
|
+
const gate = this.changeRequestReview.evaluateMergeGate({ prNumber: number, state: 'open', approvals });
|
|
3892
3887
|
return gate?.mergeable === true && gate.warnings.length === 0;
|
|
3893
3888
|
}
|
|
3894
3889
|
catch (err) {
|
|
@@ -4159,7 +4154,7 @@ export class WorkflowService {
|
|
|
4159
4154
|
throw new Error('updateBranch: resolutions need a `validateWrite` to be asked before the merge');
|
|
4160
4155
|
}
|
|
4161
4156
|
if (this.kb.isProtectedBranch(branch)) {
|
|
4162
|
-
throw new
|
|
4157
|
+
throw new VersionControlDomainError(`"${branch}" is protected: it is changed through change requests, never merged into directly.`, 403, { kind: 'protected-update-target', branch });
|
|
4163
4158
|
}
|
|
4164
4159
|
// The one merge a person makes: a change request's. An update that would
|
|
4165
4160
|
// land an OPEN request from `from` into this draft is that merge by
|
|
@@ -4205,7 +4200,7 @@ export class WorkflowService {
|
|
|
4205
4200
|
throw new OpenChangeRequestBlocksMergeError(from, branch, open);
|
|
4206
4201
|
}
|
|
4207
4202
|
if (!(await this.git.remoteBranchExists(workspaceId, from))) {
|
|
4208
|
-
throw new
|
|
4203
|
+
throw new VersionControlValidationError(`No branch named "${from}" on the shared repository.`);
|
|
4209
4204
|
}
|
|
4210
4205
|
const resolutions = opts.resolutions ?? [];
|
|
4211
4206
|
const subject = from === branch ? `Merge the shared ${branch} into the local one` : `Merge ${from} into ${branch}`;
|
|
@@ -4216,7 +4211,7 @@ export class WorkflowService {
|
|
|
4216
4211
|
? ` Conflicts resolved by ${user.name} <${user.email}> in: ${resolutions.map((r) => r.path).join(', ')}.`
|
|
4217
4212
|
: '');
|
|
4218
4213
|
// Published inside the merge's own reservation: nothing lands between
|
|
4219
|
-
// the merge commit and its push, and the push is EVERY
|
|
4214
|
+
// the merge commit and its push, and the push is EVERY version-control push's
|
|
4220
4215
|
// `pushWithRecovery`, run over the merge's own unlocked moves — a
|
|
4221
4216
|
// rejection replays the merge (kept as a merge) onto the moved branch
|
|
4222
4217
|
// and pushes again; a replay that conflicts or a host that refuses
|
|
@@ -4268,4 +4263,4 @@ export class WorkflowService {
|
|
|
4268
4263
|
return this.git.changedPathsForPr(workspaceId, base, branch);
|
|
4269
4264
|
}
|
|
4270
4265
|
}
|
|
4271
|
-
//# sourceMappingURL=
|
|
4266
|
+
//# sourceMappingURL=version-control.service.js.map
|