@bevel-software/platform-core-backend 0.35.0 → 0.37.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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 +72 -57
- 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/connection.d.ts.map +1 -1
- package/dist/modules/database/connection.js +11 -0
- package/dist/modules/database/connection.js.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 +51 -26
- package/dist/modules/kb-fs/file-change-notifier.d.ts.map +1 -1
- package/dist/modules/kb-fs/file-change-notifier.js +6 -8
- package/dist/modules/kb-fs/file-change-notifier.js.map +1 -1
- package/dist/modules/kb-fs/locking-filesystem.d.ts +9 -16
- package/dist/modules/kb-fs/locking-filesystem.d.ts.map +1 -1
- package/dist/modules/kb-fs/locking-filesystem.js +31 -39
- 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 +5 -7
- 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 +26 -8
- package/dist/modules/version-control/git/git.service.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/git/git.service.js +106 -55
- 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} +33 -6
- 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} +20 -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 -46
- 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} +93 -107
- 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/fire-and-forget.d.ts +14 -0
- package/dist/shared/fire-and-forget.d.ts.map +1 -0
- package/dist/shared/fire-and-forget.js +23 -0
- package/dist/shared/fire-and-forget.js.map +1 -0
- 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__/capturing-logger.ts +36 -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__/real-access.ts +16 -0
- package/src/__tests__/real-auth.ts +13 -0
- package/src/__tests__/real-readers.ts +27 -0
- package/src/__tests__/real-version-control.ts +22 -0
- 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__/commit-announcements-wired-once.test.ts +53 -0
- 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 +83 -65
- 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 +23 -23
- 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 +44 -44
- package/src/modules/access/__tests__/roles-admin.security.test.ts +14 -13
- package/src/modules/access/__tests__/roles-admin.service.test.ts +34 -34
- package/src/modules/access/__tests__/roles-capabilities.test.ts +29 -29
- package/src/modules/access/__tests__/roles.routes.test.ts +11 -11
- package/src/modules/access/__tests__/synced-groups-committer.test.ts +14 -14
- package/src/modules/access/__tests__/user-access-removal.service.test.ts +33 -33
- 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__/connection.pg.test.ts +55 -0
- package/src/modules/database/__tests__/connection.test.ts +30 -0
- package/src/modules/database/__tests__/migrations-unqualified.test.ts +32 -32
- package/src/modules/database/connection.ts +12 -0
- 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 +48 -62
- 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__/file-change-notifier.test.ts +23 -4
- package/src/modules/kb-fs/__tests__/locking-filesystem.test.ts +264 -305
- package/src/modules/kb-fs/__tests__/move-with-edits.test.ts +103 -40
- 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 +55 -32
- package/src/modules/kb-fs/locking-filesystem.ts +34 -48
- 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 +59 -59
- 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 +7 -9
- 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__/plugin-rename.service.test.ts +46 -21
- package/src/modules/plugins/__tests__/plugins.routes.test.ts +31 -31
- 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} +100 -102
- 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} +85 -75
- 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/version-control/git/__tests__/git.service.commitLanded.test.ts +199 -0
- 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 +99 -22
- 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 +112 -59
- 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} +44 -5
- 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} +96 -109
- 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__/fire-and-forget.test.ts +39 -0
- 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/fire-and-forget.ts +26 -0
- 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;
|
|
@@ -160,16 +155,15 @@ export class WorkflowService {
|
|
|
160
155
|
kb;
|
|
161
156
|
changeGate;
|
|
162
157
|
events;
|
|
163
|
-
fileChanges;
|
|
164
158
|
hooks;
|
|
165
159
|
changeRequestHooks;
|
|
166
160
|
accounts;
|
|
167
161
|
/**
|
|
168
162
|
* Concrete `PullRequestService` (not the interface) so the facade can call
|
|
169
163
|
* `invalidateDetailCache` after a mutation lands — the legacy routes do
|
|
170
|
-
* this inline, and the
|
|
164
|
+
* this inline, and the version-control facade absorbs that responsibility so its
|
|
171
165
|
* own routes stay free of cache plumbing. Replaceable later when the PR
|
|
172
|
-
* detail cache moves into the
|
|
166
|
+
* detail cache moves into the version-control module proper (PLAN step 5).
|
|
173
167
|
*
|
|
174
168
|
* `db` + `workspaceService` + `kbDirName` back `openChangeRequest`, which
|
|
175
169
|
* inserts a change_requests row and runs the local auto-merge — no provider
|
|
@@ -177,16 +171,16 @@ export class WorkflowService {
|
|
|
177
171
|
*/
|
|
178
172
|
/**
|
|
179
173
|
* Concrete `GitService` (not the interface) so the facade can reach
|
|
180
|
-
* `mergeFromOrigin` — the local auto-merge primitive the
|
|
174
|
+
* `mergeFromOrigin` — the local auto-merge primitive the version-control service needs
|
|
181
175
|
* for `openChangeRequest` + `updateFromTarget` (PLAN §1). The interface
|
|
182
176
|
* intentionally doesn't surface that method because it's an internal
|
|
183
|
-
* implementation detail of the
|
|
177
|
+
* implementation detail of the version-control auto-merge story; nothing outside
|
|
184
178
|
* the facade should call it directly.
|
|
185
179
|
*/
|
|
186
180
|
get kbDirName() {
|
|
187
181
|
return this.kb.kbDirName;
|
|
188
182
|
}
|
|
189
|
-
constructor(db, git, prs,
|
|
183
|
+
constructor(db, git, prs, changeRequestReview, workspaceService, accessControl, fileLocks,
|
|
190
184
|
/**
|
|
191
185
|
* Background commit queue. `releaseLock` enqueues a row instead of
|
|
192
186
|
* committing inline; the `PendingCommitsWorker` drains the queue and
|
|
@@ -210,22 +204,15 @@ export class WorkflowService {
|
|
|
210
204
|
*/
|
|
211
205
|
events,
|
|
212
206
|
/**
|
|
213
|
-
*
|
|
214
|
-
* after a file's change is committed + pushed so backend services (catalog
|
|
215
|
-
* invalidation, id-repair) react without the per-file TTL wait. Optional,
|
|
216
|
-
* like `events`.
|
|
217
|
-
*/
|
|
218
|
-
fileChanges,
|
|
219
|
-
/**
|
|
220
|
-
* Workflow lifecycle-hook registry (see `workflow-hooks.ts`). PUBLIC so
|
|
207
|
+
* Version-control lifecycle-hook registry (see `version-control-hooks.ts`). PUBLIC so
|
|
221
208
|
* the composition root registers module-owned behavior against it
|
|
222
|
-
* (`core.
|
|
209
|
+
* (`core.versionControlService.hooks.onCommitValidation(…)` /
|
|
223
210
|
* `.onPreWrite(…)`) after `createCoreServices` returns. The composition
|
|
224
211
|
* root passes the SAME instance `GitService` and the agent-access gate
|
|
225
212
|
* consult; the default keeps test constructions (which don't exercise
|
|
226
213
|
* hooks) unchanged.
|
|
227
214
|
*/
|
|
228
|
-
hooks = new
|
|
215
|
+
hooks = new VersionControlHooks(),
|
|
229
216
|
/**
|
|
230
217
|
* The seam a deployment's notification extends when a request is opened
|
|
231
218
|
* (see `change-request-hooks.ts`). The composition root passes the SAME
|
|
@@ -242,7 +229,7 @@ export class WorkflowService {
|
|
|
242
229
|
this.db = db;
|
|
243
230
|
this.git = git;
|
|
244
231
|
this.prs = prs;
|
|
245
|
-
this.
|
|
232
|
+
this.changeRequestReview = changeRequestReview;
|
|
246
233
|
this.workspaceService = workspaceService;
|
|
247
234
|
this.accessControl = accessControl;
|
|
248
235
|
this.fileLocks = fileLocks;
|
|
@@ -250,14 +237,13 @@ export class WorkflowService {
|
|
|
250
237
|
this.kb = kb;
|
|
251
238
|
this.changeGate = changeGate;
|
|
252
239
|
this.events = events;
|
|
253
|
-
this.fileChanges = fileChanges;
|
|
254
240
|
this.hooks = hooks;
|
|
255
241
|
this.changeRequestHooks = changeRequestHooks;
|
|
256
242
|
this.accounts = accounts;
|
|
257
243
|
// The type already requires it; this holds for a caller the compiler did
|
|
258
244
|
// not see (plain JavaScript, a positional slip in a harness).
|
|
259
245
|
if (!changeGate || typeof changeGate.assertMayChange !== 'function') {
|
|
260
|
-
throw new Error('
|
|
246
|
+
throw new Error('VersionControlService requires a read-before-write gate (IChangeReadGate)');
|
|
261
247
|
}
|
|
262
248
|
}
|
|
263
249
|
// ── Branches ──────────────────────────────────────────────────────────────
|
|
@@ -401,7 +387,7 @@ export class WorkflowService {
|
|
|
401
387
|
// this branch is the deleter's own to withdraw; a request INTO it
|
|
402
388
|
// belongs to someone else, and telling the branch owner to
|
|
403
389
|
// "withdraw" it points them at a verb they cannot use.
|
|
404
|
-
throw new
|
|
390
|
+
throw new VersionControlValidationError(open.end === 'source'
|
|
405
391
|
? `Branch "${name}" has an open change request (#${open.number}). ` +
|
|
406
392
|
`Withdraw or decline it before deleting the branch.`
|
|
407
393
|
: `Open change request #${open.number} proposes changes into "${name}". ` +
|
|
@@ -747,7 +733,7 @@ export class WorkflowService {
|
|
|
747
733
|
// longer exposes a "checkout this branch on the source workspace's clone"
|
|
748
734
|
// operation, which was the only place the legacy DirtyWorkingTreeError
|
|
749
735
|
// could surface as a user-facing 409.
|
|
750
|
-
// `forkCurrentToDraft` removed (see
|
|
736
|
+
// `forkCurrentToDraft` removed (see IVersionControlService): per-branch workspaces
|
|
751
737
|
// make the dirty-tree-carry-along escape hatch impossible by construction.
|
|
752
738
|
branchStatus(workspaceId) {
|
|
753
739
|
return this.git.status(workspaceId);
|
|
@@ -950,7 +936,7 @@ export class WorkflowService {
|
|
|
950
936
|
// this sync's — never a save that landed alongside. Capped: a bulk
|
|
951
937
|
// import would otherwise fan hundreds of events out to say what one
|
|
952
938
|
// refresh says.
|
|
953
|
-
if (announce.changedPaths.length <=
|
|
939
|
+
if (announce.changedPaths.length <= VersionControlService.SYNC_FILE_EVENT_CAP) {
|
|
954
940
|
for (const p of announce.changedPaths) {
|
|
955
941
|
this.events?.emit({
|
|
956
942
|
kind: 'file-changed',
|
|
@@ -1261,7 +1247,7 @@ export class WorkflowService {
|
|
|
1261
1247
|
const targetPath = canonicalFileIdentity(rawPath);
|
|
1262
1248
|
const lock = await this.fileLocks.get(workspaceId, branch, targetPath);
|
|
1263
1249
|
if (!lock || lock.holderUserId !== user.id) {
|
|
1264
|
-
throw new
|
|
1250
|
+
throw new VersionControlValidationError(`Cannot commit "${targetPath}": you don't hold the lock.`, { kind: 'lock-not-held', branch, path: targetPath });
|
|
1265
1251
|
}
|
|
1266
1252
|
// A coordination hold is NOT write possession (see `acquireLock`): it was
|
|
1267
1253
|
// acquired past the write-authorization gate on the promise that nothing
|
|
@@ -1269,7 +1255,7 @@ export class WorkflowService {
|
|
|
1269
1255
|
// holder checkpoint bytes onto a path — machine-owned files included —
|
|
1270
1256
|
// whose write rule they never passed.
|
|
1271
1257
|
if (lock.mode === 'coordination') {
|
|
1272
|
-
throw new
|
|
1258
|
+
throw new VersionControlValidationError(`Cannot commit "${targetPath}": the lock is a coordination hold, which grants no write authority.`, { kind: 'coordination-hold', branch, path: targetPath });
|
|
1273
1259
|
}
|
|
1274
1260
|
const change = await this.git.commitFile(workspaceId, user, targetPath, summary);
|
|
1275
1261
|
// Push the autosave commit so other users on the branch see it
|
|
@@ -1380,7 +1366,7 @@ export class WorkflowService {
|
|
|
1380
1366
|
const lock = await this.fileLocks.get(workspaceId, branch, targetPath);
|
|
1381
1367
|
if (!lock || lock.holderUserId !== user.id) {
|
|
1382
1368
|
lockLog.warn(`RELEASE refused ws=${workspaceId} branch=${branch} path=${targetPath} user=${user.id} → ${lock ? `held by ${lock.holderUserId}` : 'no lock row'}`);
|
|
1383
|
-
throw new
|
|
1369
|
+
throw new VersionControlValidationError(`Cannot release lock on "${targetPath}": not held by you (or no longer exists).`, { kind: 'lock-not-held', branch, path: targetPath });
|
|
1384
1370
|
}
|
|
1385
1371
|
// Releasing a coordination hold must NEVER enqueue a commit: the hold was
|
|
1386
1372
|
// granted past the write-authorization gate (see `acquireLock`) on the
|
|
@@ -1393,7 +1379,7 @@ export class WorkflowService {
|
|
|
1393
1379
|
// row until its TTL.
|
|
1394
1380
|
if (lock.mode === 'coordination') {
|
|
1395
1381
|
lockLog.warn(`RELEASE refused ws=${workspaceId} branch=${branch} path=${targetPath} user=${user.id} → coordination hold (no commit may be enqueued)`);
|
|
1396
|
-
throw new
|
|
1382
|
+
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
1383
|
}
|
|
1398
1384
|
// Order matters here:
|
|
1399
1385
|
// 1. Drop the lock row. Other sessions can re-acquire immediately.
|
|
@@ -1457,11 +1443,14 @@ export class WorkflowService {
|
|
|
1457
1443
|
// which is exactly how a diverged workspace ends up stuck forever.
|
|
1458
1444
|
// So: if the branch is ahead of its remote-tracking ref, push (with
|
|
1459
1445
|
// the same cooperative recovery, so a conflicting divergence throws
|
|
1460
|
-
// and the worker's ladder takes over).
|
|
1446
|
+
// and the worker's ladder takes over). No `file-changed` either way —
|
|
1461
1447
|
// there's no new sha.
|
|
1462
1448
|
if (await this.git.hasUnpushedCommits(workspaceId)) {
|
|
1463
1449
|
await this.pushWithRecovery(workspaceId, branch, targetPath, user, opts);
|
|
1464
1450
|
}
|
|
1451
|
+
// Nothing landed here, so nothing is announced: the git layer reports
|
|
1452
|
+
// each commit as it lands (an autosave checkpoint, a batch whose push
|
|
1453
|
+
// retry this row is), and this row made none.
|
|
1465
1454
|
return;
|
|
1466
1455
|
}
|
|
1467
1456
|
await this.pushWithRecovery(workspaceId, branch, targetPath, user, opts);
|
|
@@ -1474,9 +1463,6 @@ export class WorkflowService {
|
|
|
1474
1463
|
byUserId: user.id,
|
|
1475
1464
|
byUserName: user.name,
|
|
1476
1465
|
});
|
|
1477
|
-
// Post-commit, post-lock-release: the one chokepoint every single-file write
|
|
1478
|
-
// converges on. Backend reactors (catalog invalidation, id-repair) hook here.
|
|
1479
|
-
this.fileChanges?.emit({ workspaceId, branch, paths: [targetPath], byUser: user });
|
|
1480
1466
|
}
|
|
1481
1467
|
/**
|
|
1482
1468
|
* Workspaces whose last push failed. Purely so the recovery event fires on
|
|
@@ -1563,7 +1549,7 @@ export class WorkflowService {
|
|
|
1563
1549
|
* still fails." The full rationale lives at the call site in
|
|
1564
1550
|
* `releaseLock`; this method is the de-duplicated body.
|
|
1565
1551
|
*
|
|
1566
|
-
* EVERY
|
|
1552
|
+
* EVERY version-control push goes through here — saves, sharing a branch, opening
|
|
1567
1553
|
* a request, update-from-target, the decline revert, the roles.yaml
|
|
1568
1554
|
* restore — so a push the host refuses answers one way everywhere: the
|
|
1569
1555
|
* commit stays local, the sync banner goes up, and the caller gets the
|
|
@@ -1683,7 +1669,7 @@ export class WorkflowService {
|
|
|
1683
1669
|
//
|
|
1684
1670
|
// One refinement for COORDINATION holds: the holder never legitimately
|
|
1685
1671
|
// wrote the path (the write paths refuse coordination possession), so
|
|
1686
|
-
// anything dirty there is either bytes smuggled in around
|
|
1672
|
+
// anything dirty there is either bytes smuggled in around version control —
|
|
1687
1673
|
// which the discard rightly wipes — or a PRIOR save's work whose commit
|
|
1688
1674
|
// is still queued. Only the queue can tell those apart: when a live
|
|
1689
1675
|
// pending-commit row exists for the path, the dirty bytes are that
|
|
@@ -1850,17 +1836,17 @@ export class WorkflowService {
|
|
|
1850
1836
|
*/
|
|
1851
1837
|
async openChangeRequest(workspaceId, user, input) {
|
|
1852
1838
|
if (!input.sourceBranch)
|
|
1853
|
-
throw new
|
|
1839
|
+
throw new VersionControlValidationError('sourceBranch is required');
|
|
1854
1840
|
if (!input.targetBranch)
|
|
1855
|
-
throw new
|
|
1841
|
+
throw new VersionControlValidationError('targetBranch is required');
|
|
1856
1842
|
if (input.sourceBranch === input.targetBranch) {
|
|
1857
|
-
throw new
|
|
1843
|
+
throw new VersionControlValidationError('source and target branches must differ');
|
|
1858
1844
|
}
|
|
1859
1845
|
if (!input.title?.trim())
|
|
1860
|
-
throw new
|
|
1846
|
+
throw new VersionControlValidationError('title is required');
|
|
1861
1847
|
assertDescriptionFits(input.description?.trim());
|
|
1862
1848
|
if (this.kb.isProtectedBranch(input.sourceBranch)) {
|
|
1863
|
-
throw new
|
|
1849
|
+
throw new VersionControlValidationError(`Cannot open a change request *from* a protected branch ("${input.sourceBranch}").`, { kind: 'source-is-protected', sourceBranch: input.sourceBranch });
|
|
1864
1850
|
}
|
|
1865
1851
|
// The whole open sequence — uniqueness check through row insert — runs
|
|
1866
1852
|
// under the lifecycle lock of BOTH branches. `retireMergedSourceBranch`
|
|
@@ -1890,7 +1876,7 @@ export class WorkflowService {
|
|
|
1890
1876
|
}
|
|
1891
1877
|
// Auto-merge target → source. `mergeFromOrigin` enforces "current
|
|
1892
1878
|
// branch == source" and "clean working tree" before attempting; both
|
|
1893
|
-
// failures surface as structured
|
|
1879
|
+
// failures surface as structured version-control errors that pass straight
|
|
1894
1880
|
// through to the caller.
|
|
1895
1881
|
const mergeOutcome = await this.git.mergeFromOrigin(workspaceId, input.sourceBranch, input.targetBranch, user);
|
|
1896
1882
|
if (mergeOutcome.kind === 'conflicts') {
|
|
@@ -1959,7 +1945,7 @@ export class WorkflowService {
|
|
|
1959
1945
|
// rival was merged/closed in the microsecond between the conflict and
|
|
1960
1946
|
// this re-query), don't fabricate a #0 — report it as a transient race.
|
|
1961
1947
|
if (!existing) {
|
|
1962
|
-
throw new
|
|
1948
|
+
throw new VersionControlValidationError(`Change request for "${input.sourceBranch}" → "${input.targetBranch}" ` +
|
|
1963
1949
|
'raced with a concurrent open/close; retry.', { kind: 'open-change-request-failed' });
|
|
1964
1950
|
}
|
|
1965
1951
|
throw new DuplicateChangeRequestError(input.sourceBranch, input.targetBranch, existing.number);
|
|
@@ -1970,7 +1956,7 @@ export class WorkflowService {
|
|
|
1970
1956
|
// openChangeRequest finds no duplicate, re-runs the (idempotent, already
|
|
1971
1957
|
// up-to-date) auto-merge, and inserts the row.
|
|
1972
1958
|
const rawMsg = err instanceof Error ? err.message : String(err);
|
|
1973
|
-
throw new
|
|
1959
|
+
throw new VersionControlValidationError(`Failed to open change request: ${redactTokens(rawMsg, this.git.credentials?.token())}`, { kind: 'open-change-request-failed' });
|
|
1974
1960
|
}
|
|
1975
1961
|
this.prs.invalidateDetailCache(prNumber);
|
|
1976
1962
|
const opened = {
|
|
@@ -2013,7 +1999,7 @@ export class WorkflowService {
|
|
|
2013
1999
|
eligible,
|
|
2014
2000
|
detail: null,
|
|
2015
2001
|
pushRefused: null,
|
|
2016
|
-
detailError: detailError ?? new
|
|
2002
|
+
detailError: detailError ?? new VersionControlValidationError(`Created change request #${prNumber} but could not fetch its detail`),
|
|
2017
2003
|
};
|
|
2018
2004
|
});
|
|
2019
2005
|
// The request exists in every branch of the outcome — the listeners are
|
|
@@ -2134,13 +2120,13 @@ export class WorkflowService {
|
|
|
2134
2120
|
patches: false,
|
|
2135
2121
|
});
|
|
2136
2122
|
if (!detail) {
|
|
2137
|
-
throw new
|
|
2123
|
+
throw new VersionControlValidationError(`Change request #${number} not found.`, { kind: 'change-request-not-found', number });
|
|
2138
2124
|
}
|
|
2139
2125
|
if (detail.state !== 'open') {
|
|
2140
|
-
throw new
|
|
2126
|
+
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
2127
|
}
|
|
2142
2128
|
if (!detail.viewerCanUpdate) {
|
|
2143
|
-
throw new
|
|
2129
|
+
throw new VersionControlDomainError('Only the author of this change request, or someone who may apply it, can update it.', 403);
|
|
2144
2130
|
}
|
|
2145
2131
|
// Taken BEFORE the head moves (the pull below can move it too): only a
|
|
2146
2132
|
// refusal recorded earlier describes the revision this replaces (see
|
|
@@ -2263,7 +2249,7 @@ export class WorkflowService {
|
|
|
2263
2249
|
if (headMoved) {
|
|
2264
2250
|
try {
|
|
2265
2251
|
updatedPaths = await this.git.pathsChangedBetween(workspaceId, headBeforeMerge, headAfterMerge);
|
|
2266
|
-
await this.
|
|
2252
|
+
await this.changeRequestReview.carryApprovalsForward(number, headBeforeMerge, headAfterMerge, updatedPaths);
|
|
2267
2253
|
}
|
|
2268
2254
|
catch (err) {
|
|
2269
2255
|
log.warn(`could not carry approvals forward on change request #${number} after updating from target`, { err });
|
|
@@ -2282,14 +2268,14 @@ export class WorkflowService {
|
|
|
2282
2268
|
viewerEmail: user.email,
|
|
2283
2269
|
});
|
|
2284
2270
|
if (!refreshed) {
|
|
2285
|
-
throw new
|
|
2271
|
+
throw new VersionControlValidationError(`Refreshed change request #${number} but could not re-fetch its detail.`);
|
|
2286
2272
|
}
|
|
2287
2273
|
return { ...refreshed, updatedPaths };
|
|
2288
2274
|
}
|
|
2289
2275
|
async approveFile(number, path, user, files, headSha, baseBranch, authorIdHash, workspaceId) {
|
|
2290
2276
|
// Taken BEFORE the approval lands (see `clearApplyFailure`).
|
|
2291
2277
|
const approvedAfter = new Date();
|
|
2292
|
-
const approvals = await this.
|
|
2278
|
+
const approvals = await this.changeRequestReview.approveFile(number, path, user, files, headSha, baseBranch, authorIdHash, workspaceId);
|
|
2293
2279
|
// A recorded approval can answer a GATE refusal only — a conflict or a git
|
|
2294
2280
|
// error still describes the request — and only once the gate that refused
|
|
2295
2281
|
// would now pass: approving one file of several leaves the rest waiting,
|
|
@@ -2310,7 +2296,7 @@ export class WorkflowService {
|
|
|
2310
2296
|
return approvals;
|
|
2311
2297
|
}
|
|
2312
2298
|
async unapproveFile(number, path, user, files, headSha, baseBranch, authorIdHash, workspaceId) {
|
|
2313
|
-
const approvals = await this.
|
|
2299
|
+
const approvals = await this.changeRequestReview.unapproveFile(number, path, user, files, headSha, baseBranch, authorIdHash, workspaceId);
|
|
2314
2300
|
this.prs.invalidateDetailCache(number);
|
|
2315
2301
|
this.events?.emit({
|
|
2316
2302
|
kind: 'approval-changed',
|
|
@@ -2362,9 +2348,9 @@ export class WorkflowService {
|
|
|
2362
2348
|
async revertChangeRequestFile(number, user, repoRelPath) {
|
|
2363
2349
|
const summary = await this.prs.getPr(number);
|
|
2364
2350
|
if (!summary)
|
|
2365
|
-
throw new
|
|
2351
|
+
throw new VersionControlDomainError('change request not found', 404);
|
|
2366
2352
|
if (summary.state !== 'open') {
|
|
2367
|
-
throw new
|
|
2353
|
+
throw new VersionControlDomainError('This change request is no longer open.', 422);
|
|
2368
2354
|
}
|
|
2369
2355
|
const baseBranch = summary.base;
|
|
2370
2356
|
const headBranch = summary.branch;
|
|
@@ -2381,15 +2367,15 @@ export class WorkflowService {
|
|
|
2381
2367
|
// The verb acts on the request as it is NOW — never a cached file list.
|
|
2382
2368
|
const paths = await this.git.changedPathsForPr(ws.id, baseBranch, headBranch);
|
|
2383
2369
|
if (!paths.includes(repoRelPath)) {
|
|
2384
|
-
throw new
|
|
2370
|
+
throw new VersionControlDomainError('That file is not part of this change request.', 422);
|
|
2385
2371
|
}
|
|
2386
2372
|
const canApprove = await this.accessControl.canWriteAtRef(ws.id, `origin/${baseBranch}`, user.email, repoRelPath);
|
|
2387
2373
|
if (canApprove !== true) {
|
|
2388
|
-
throw new
|
|
2374
|
+
throw new VersionControlDomainError('Only an eligible approver of this file can revert it — declining takes the same permission as accepting.', 403);
|
|
2389
2375
|
}
|
|
2390
2376
|
const mergeBase = await this.git.mergeBaseForPr(ws.id, baseBranch, headBranch);
|
|
2391
2377
|
if (!mergeBase) {
|
|
2392
|
-
throw new
|
|
2378
|
+
throw new VersionControlDomainError('These branches share no history to revert to.', 422);
|
|
2393
2379
|
}
|
|
2394
2380
|
const placeholder = await this.placeholderRevertedWith(ws.id, mergeBase, repoRelPath, paths);
|
|
2395
2381
|
const reverted = placeholder ? [repoRelPath, placeholder] : [repoRelPath];
|
|
@@ -2406,7 +2392,7 @@ export class WorkflowService {
|
|
|
2406
2392
|
const lockPath = `${this.kbDirName}/${p}`;
|
|
2407
2393
|
const lock = await this.fileLocks.acquire(ws.id, headBranch, lockPath, user);
|
|
2408
2394
|
if (!lock.acquired) {
|
|
2409
|
-
throw new
|
|
2395
|
+
throw new VersionControlDomainError(p === repoRelPath
|
|
2410
2396
|
? `${repoRelPath} is being edited by ${lock.lock.holderName} — try again once the edit settles.`
|
|
2411
2397
|
: `The folder of ${repoRelPath} is being changed by ${lock.lock.holderName} — try again once the edit settles.`, 409);
|
|
2412
2398
|
}
|
|
@@ -2486,7 +2472,7 @@ export class WorkflowService {
|
|
|
2486
2472
|
}
|
|
2487
2473
|
catch (err) {
|
|
2488
2474
|
log.warn(`changedPathsForPr failed for #${cr.number} under folder ${printable(folder)}: ${printable(sanitizeError(err))}`);
|
|
2489
|
-
throw new
|
|
2475
|
+
throw new VersionControlDomainError(`Couldn't read what change request #${cr.number} proposes — try again in a moment.`, 500);
|
|
2490
2476
|
}
|
|
2491
2477
|
}));
|
|
2492
2478
|
const touching = resolved
|
|
@@ -2549,7 +2535,7 @@ export class WorkflowService {
|
|
|
2549
2535
|
const requests = await this.changeRequestsUnderFolder(folder, user);
|
|
2550
2536
|
const refused = requests.filter((r) => !r.mayRemove);
|
|
2551
2537
|
if (refused.length > 0) {
|
|
2552
|
-
throw new
|
|
2538
|
+
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
2539
|
}
|
|
2554
2540
|
const prefix = folderPrefix(folder);
|
|
2555
2541
|
// Everything that can refuse happens before the first commit, so a
|
|
@@ -2571,7 +2557,7 @@ export class WorkflowService {
|
|
|
2571
2557
|
}
|
|
2572
2558
|
catch (err) {
|
|
2573
2559
|
log.warn(`pull failed for #${summary.number} before removing folder ${printable(folder)}: ${printable(sanitizeError(err))}`);
|
|
2574
|
-
throw new
|
|
2560
|
+
throw new VersionControlDomainError(`#${summary.number} could not be brought up to date, so nothing was removed — try again in a moment.`, 409);
|
|
2575
2561
|
}
|
|
2576
2562
|
const paths = (await this.git.changedPathsForPr(ws.id, summary.base, summary.branch)).filter((p) => p.startsWith(prefix));
|
|
2577
2563
|
// The permission above was judged on the paths the request proposed
|
|
@@ -2579,13 +2565,13 @@ export class WorkflowService {
|
|
|
2579
2565
|
// file need not be one of it — so the request has to be asked about again.
|
|
2580
2566
|
const unjudged = paths.filter((p) => !request.paths.includes(p));
|
|
2581
2567
|
if (unjudged.length > 0) {
|
|
2582
|
-
throw new
|
|
2568
|
+
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
2569
|
}
|
|
2584
2570
|
let mergeBase = null;
|
|
2585
2571
|
if (paths.length > 0) {
|
|
2586
2572
|
mergeBase = await this.git.mergeBaseForPr(ws.id, summary.base, summary.branch);
|
|
2587
2573
|
if (!mergeBase) {
|
|
2588
|
-
throw new
|
|
2574
|
+
throw new VersionControlDomainError(`#${summary.number} shares no history with its target to revert to.`, 422);
|
|
2589
2575
|
}
|
|
2590
2576
|
}
|
|
2591
2577
|
plans.push({ number: summary.number, branch: summary.branch, wsId: ws.id, paths, mergeBase });
|
|
@@ -2612,7 +2598,7 @@ export class WorkflowService {
|
|
|
2612
2598
|
}
|
|
2613
2599
|
else if (seen.mergeBase !== plan.mergeBase) {
|
|
2614
2600
|
const sharing = group.plans.map((other) => `#${other.number}`).join(', ');
|
|
2615
|
-
throw new
|
|
2601
|
+
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
2602
|
}
|
|
2617
2603
|
}
|
|
2618
2604
|
}
|
|
@@ -2639,7 +2625,7 @@ export class WorkflowService {
|
|
|
2639
2625
|
const lockPath = `${this.kbDirName}/${repoRelPath}`;
|
|
2640
2626
|
const lock = await this.fileLocks.acquire(group.wsId, group.branch, lockPath, user);
|
|
2641
2627
|
if (!lock.acquired) {
|
|
2642
|
-
throw new
|
|
2628
|
+
throw new VersionControlDomainError(`${repoRelPath} is being edited by ${lock.lock.holderName} — try again once the edit settles.`, 409);
|
|
2643
2629
|
}
|
|
2644
2630
|
held.push({ wsId: group.wsId, branch: group.branch, lockPath });
|
|
2645
2631
|
}
|
|
@@ -2710,7 +2696,7 @@ export class WorkflowService {
|
|
|
2710
2696
|
if (pushFailure) {
|
|
2711
2697
|
const failed = pushFailure.group.plans.map((plan) => `#${plan.number}`).join(', ');
|
|
2712
2698
|
log.warn(`push failed for ${failed} removing folder ${printable(folder)}: ${printable(sanitizeError(pushFailure.err))}`);
|
|
2713
|
-
throw new
|
|
2699
|
+
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
2700
|
}
|
|
2715
2701
|
return results;
|
|
2716
2702
|
}
|
|
@@ -2731,9 +2717,9 @@ export class WorkflowService {
|
|
|
2731
2717
|
async deleteChangeRequest(number, user) {
|
|
2732
2718
|
const summary = await this.prs.getPr(number);
|
|
2733
2719
|
if (!summary)
|
|
2734
|
-
throw new
|
|
2720
|
+
throw new VersionControlDomainError('change request not found', 404);
|
|
2735
2721
|
if (summary.state === 'merged') {
|
|
2736
|
-
throw new
|
|
2722
|
+
throw new VersionControlDomainError('This change request has already been applied.', 422);
|
|
2737
2723
|
}
|
|
2738
2724
|
// Which `roles.yaml` authorizes this? The base branch's, exactly as every
|
|
2739
2725
|
// other admin check here. When the base branch itself is gone, this
|
|
@@ -2758,7 +2744,7 @@ export class WorkflowService {
|
|
|
2758
2744
|
await this.workspaceService.ensureRemotesFetched(ws.id, { strict: true });
|
|
2759
2745
|
}
|
|
2760
2746
|
catch {
|
|
2761
|
-
throw new
|
|
2747
|
+
throw new VersionControlDomainError(`Could not verify the base branch "${summary.base}" — origin was unreachable. Retry in a moment.`, 409);
|
|
2762
2748
|
}
|
|
2763
2749
|
isAdmin = await this.accessControl.canWriteAtRef(ws.id, `origin/${summary.base}`, user.email, 'roles.yaml');
|
|
2764
2750
|
}
|
|
@@ -2774,7 +2760,7 @@ export class WorkflowService {
|
|
|
2774
2760
|
// attempt the sweep has either closed the row or shown the base alive.
|
|
2775
2761
|
if (isAdmin === null) {
|
|
2776
2762
|
this.kickDeletedBranchSweep();
|
|
2777
|
-
throw new
|
|
2763
|
+
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
2764
|
}
|
|
2779
2765
|
// Authorship is decided from the STORED author hash, never from anything
|
|
2780
2766
|
// the caller sends. Note what is deliberately NOT short-circuited for an
|
|
@@ -2786,7 +2772,7 @@ export class WorkflowService {
|
|
|
2786
2772
|
// stay honest.
|
|
2787
2773
|
const callerIsAuthor = !!(summary.authorId && summary.authorId === hashEmail(user.email));
|
|
2788
2774
|
if (!callerIsAuthor && isAdmin !== true) {
|
|
2789
|
-
throw new
|
|
2775
|
+
throw new VersionControlDomainError("Only the request's author or an admin can delete it.", 403);
|
|
2790
2776
|
}
|
|
2791
2777
|
// Close first (idempotent: an already-closed request just skips to the
|
|
2792
2778
|
// branch retirement). Guarded on `open` so a concurrent merge wins.
|
|
@@ -2803,7 +2789,7 @@ export class WorkflowService {
|
|
|
2803
2789
|
else {
|
|
2804
2790
|
const fresh = await this.prs.getPr(number);
|
|
2805
2791
|
if (fresh?.state === 'merged') {
|
|
2806
|
-
throw new
|
|
2792
|
+
throw new VersionControlDomainError('This change request has already been applied.', 422);
|
|
2807
2793
|
}
|
|
2808
2794
|
}
|
|
2809
2795
|
await this.retireMergedSourceBranch(number, summary.base, user);
|
|
@@ -2837,7 +2823,7 @@ export class WorkflowService {
|
|
|
2837
2823
|
}
|
|
2838
2824
|
catch {
|
|
2839
2825
|
this.kickDeletedBranchSweep();
|
|
2840
|
-
throw new
|
|
2826
|
+
throw new VersionControlDomainError(`Could not verify the base branch "${baseBranch}" — origin was unreachable. Retry in a moment.`, 409);
|
|
2841
2827
|
}
|
|
2842
2828
|
const isAdmin = await this.accessControl.canWriteAtRef(workspaceId, `origin/${baseBranch}`, user.email, 'roles.yaml');
|
|
2843
2829
|
if (isAdmin === true)
|
|
@@ -2847,7 +2833,7 @@ export class WorkflowService {
|
|
|
2847
2833
|
// read and a batch lookup done for nothing.
|
|
2848
2834
|
if (isAdmin === null) {
|
|
2849
2835
|
this.kickDeletedBranchSweep();
|
|
2850
|
-
throw new
|
|
2836
|
+
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
2837
|
}
|
|
2852
2838
|
let detail;
|
|
2853
2839
|
try {
|
|
@@ -2885,16 +2871,16 @@ export class WorkflowService {
|
|
|
2885
2871
|
const description = input.description === undefined ? undefined : input.description.trim();
|
|
2886
2872
|
const appended = input.appendDescription === undefined ? undefined : input.appendDescription.trim();
|
|
2887
2873
|
if (title === undefined && description === undefined && appended === undefined) {
|
|
2888
|
-
throw new
|
|
2874
|
+
throw new VersionControlValidationError('Give a new title, a new description, or both.');
|
|
2889
2875
|
}
|
|
2890
2876
|
if (description !== undefined && appended !== undefined) {
|
|
2891
|
-
throw new
|
|
2877
|
+
throw new VersionControlValidationError('Give either a new description or text to append to it, not both.');
|
|
2892
2878
|
}
|
|
2893
2879
|
if (title !== undefined && title.length === 0) {
|
|
2894
|
-
throw new
|
|
2880
|
+
throw new VersionControlValidationError('A change request needs a title; it cannot be empty.');
|
|
2895
2881
|
}
|
|
2896
2882
|
if (title !== undefined && title.length > CHANGE_REQUEST_TITLE_MAX) {
|
|
2897
|
-
throw new
|
|
2883
|
+
throw new VersionControlValidationError(`A change request's title is at most ${CHANGE_REQUEST_TITLE_MAX} characters; this one has ${title.length}.`);
|
|
2898
2884
|
}
|
|
2899
2885
|
// A replacement is measured here; an append is measured on what it
|
|
2900
2886
|
// leaves, inside the transaction, since that depends on the body as
|
|
@@ -2902,7 +2888,7 @@ export class WorkflowService {
|
|
|
2902
2888
|
assertDescriptionFits(description);
|
|
2903
2889
|
const summary = await this.prs.getPr(number);
|
|
2904
2890
|
if (!summary)
|
|
2905
|
-
throw new
|
|
2891
|
+
throw new VersionControlDomainError('change request not found', 404);
|
|
2906
2892
|
assertEditable(summary.state);
|
|
2907
2893
|
// The grants beyond authorship are read in the base branch's own workspace,
|
|
2908
2894
|
// resolved only once authorship has not already decided: an author's edit
|
|
@@ -2918,7 +2904,7 @@ export class WorkflowService {
|
|
|
2918
2904
|
}
|
|
2919
2905
|
});
|
|
2920
2906
|
if (grant === null) {
|
|
2921
|
-
throw new
|
|
2907
|
+
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
2908
|
}
|
|
2923
2909
|
// The body is rewritten from the row as stored, not from the summary read
|
|
2924
2910
|
// above, inside one transaction holding the row's lock (`FOR UPDATE`) from
|
|
@@ -2963,15 +2949,15 @@ export class WorkflowService {
|
|
|
2963
2949
|
if (!updated) {
|
|
2964
2950
|
const fresh = await this.prs.getPr(number);
|
|
2965
2951
|
if (!fresh)
|
|
2966
|
-
throw new
|
|
2952
|
+
throw new VersionControlDomainError('change request not found', 404);
|
|
2967
2953
|
assertEditable(fresh.state);
|
|
2968
|
-
throw new
|
|
2954
|
+
throw new VersionControlDomainError('This change request changed while it was being edited. Retry in a moment.', 409);
|
|
2969
2955
|
}
|
|
2970
2956
|
crLog.info(`#${number} title/description edited`);
|
|
2971
2957
|
this.events?.emit({ kind: 'change-request-edited', number });
|
|
2972
2958
|
const fresh = await this.prs.getPr(number);
|
|
2973
2959
|
if (!fresh)
|
|
2974
|
-
throw new
|
|
2960
|
+
throw new VersionControlDomainError('change request not found', 404);
|
|
2975
2961
|
return fresh;
|
|
2976
2962
|
}
|
|
2977
2963
|
/**
|
|
@@ -3043,7 +3029,7 @@ export class WorkflowService {
|
|
|
3043
3029
|
* branch is gone. Closing takes it out of every open list (which is the
|
|
3044
3030
|
* whole visible problem) while a `state = 'closed'` row can still be read,
|
|
3045
3031
|
* counted, and reopened by hand. Deleting would make this sweep the one
|
|
3046
|
-
* operation in
|
|
3032
|
+
* operation in version control that destroys history without a human asking.
|
|
3047
3033
|
*
|
|
3048
3034
|
* ONE fetch, then a set lookup. The freshness matters more than the cost:
|
|
3049
3035
|
* `changedPathsForPr` fails when a branch is missing from THAT
|
|
@@ -3506,7 +3492,7 @@ export class WorkflowService {
|
|
|
3506
3492
|
effectiveAuthorIdHash = hashEmail(user.email);
|
|
3507
3493
|
}
|
|
3508
3494
|
}
|
|
3509
|
-
const result = await this.
|
|
3495
|
+
const result = await this.changeRequestReview.cancelPr(number, user, state, effectiveAuthorIdHash, baseBranch, workspaceId);
|
|
3510
3496
|
this.prs.invalidateDetailCache(number);
|
|
3511
3497
|
this.events?.emit({ kind: 'change-request-rejected', number });
|
|
3512
3498
|
return result;
|
|
@@ -3561,7 +3547,7 @@ export class WorkflowService {
|
|
|
3561
3547
|
}
|
|
3562
3548
|
let result;
|
|
3563
3549
|
try {
|
|
3564
|
-
result = await this.
|
|
3550
|
+
result = await this.changeRequestReview.mergePr(number, user, mergeHeadSha, mergeApprovals, state, title, baseBranch, workspaceId, opts);
|
|
3565
3551
|
}
|
|
3566
3552
|
catch (err) {
|
|
3567
3553
|
// The local merge hit conflicts — hand the caller (agent/UI) the actual
|
|
@@ -3693,7 +3679,7 @@ export class WorkflowService {
|
|
|
3693
3679
|
}
|
|
3694
3680
|
async mergeBranch(user, sourceBranch, targetBranch) {
|
|
3695
3681
|
if (sourceBranch === targetBranch) {
|
|
3696
|
-
throw new
|
|
3682
|
+
throw new VersionControlValidationError(`\`source\` and \`target\` are both "${sourceBranch}" — name two different branches.`);
|
|
3697
3683
|
}
|
|
3698
3684
|
// Asked once BEFORE waiting, so a merge the open request forbids is refused
|
|
3699
3685
|
// at once rather than after the source's commits have landed. Not the
|
|
@@ -3742,7 +3728,7 @@ export class WorkflowService {
|
|
|
3742
3728
|
// The merge runs in the target's own workspace, like a change request's.
|
|
3743
3729
|
const targetWorkspaceId = (await this.workspaceService.getOrCreateForBranch(targetBranch)).id;
|
|
3744
3730
|
if (!(await this.git.remoteBranchExists(targetWorkspaceId, sourceBranch))) {
|
|
3745
|
-
throw new
|
|
3731
|
+
throw new VersionControlValidationError(`No branch named "${sourceBranch}" on the shared remote.`);
|
|
3746
3732
|
}
|
|
3747
3733
|
const result = await this.git.mergeChangeRequest(targetWorkspaceId, sourceBranch, targetBranch, {
|
|
3748
3734
|
subject: `Merge ${sourceBranch} into ${targetBranch}`,
|
|
@@ -3780,7 +3766,7 @@ export class WorkflowService {
|
|
|
3780
3766
|
// roles.yaml would bypass both, on the one file the access
|
|
3781
3767
|
// model cannot survive being wrong.
|
|
3782
3768
|
if (changedPaths.includes('roles.yaml')) {
|
|
3783
|
-
throw new
|
|
3769
|
+
throw new VersionControlDomainError(`"${targetBranch}" is protected and this merge would change its roles.yaml. ` +
|
|
3784
3770
|
`Roles never change through a merge: restore roles.yaml on "${sourceBranch}" to the version on ` +
|
|
3785
3771
|
`"${targetBranch}" and merge again, and ask the user to change roles in the app.`, 403, { kind: 'protected-merge-changes-roles', targetBranch, sourceBranch });
|
|
3786
3772
|
}
|
|
@@ -3788,7 +3774,7 @@ export class WorkflowService {
|
|
|
3788
3774
|
const denied = allowed ? changedPaths.filter((p) => !allowed.get(p)) : [];
|
|
3789
3775
|
if (denied.length === 0)
|
|
3790
3776
|
return;
|
|
3791
|
-
throw new
|
|
3777
|
+
throw new VersionControlDomainError(`"${targetBranch}" is protected and you cannot commit directly to it: ` +
|
|
3792
3778
|
`${denied.length} changed file(s) are outside your write access (${denied.join(', ')}). ` +
|
|
3793
3779
|
`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
3780
|
}
|
|
@@ -3888,7 +3874,7 @@ export class WorkflowService {
|
|
|
3888
3874
|
*/
|
|
3889
3875
|
gateWouldPass(number, approvals) {
|
|
3890
3876
|
try {
|
|
3891
|
-
const gate = this.
|
|
3877
|
+
const gate = this.changeRequestReview.evaluateMergeGate({ prNumber: number, state: 'open', approvals });
|
|
3892
3878
|
return gate?.mergeable === true && gate.warnings.length === 0;
|
|
3893
3879
|
}
|
|
3894
3880
|
catch (err) {
|
|
@@ -4159,7 +4145,7 @@ export class WorkflowService {
|
|
|
4159
4145
|
throw new Error('updateBranch: resolutions need a `validateWrite` to be asked before the merge');
|
|
4160
4146
|
}
|
|
4161
4147
|
if (this.kb.isProtectedBranch(branch)) {
|
|
4162
|
-
throw new
|
|
4148
|
+
throw new VersionControlDomainError(`"${branch}" is protected: it is changed through change requests, never merged into directly.`, 403, { kind: 'protected-update-target', branch });
|
|
4163
4149
|
}
|
|
4164
4150
|
// The one merge a person makes: a change request's. An update that would
|
|
4165
4151
|
// land an OPEN request from `from` into this draft is that merge by
|
|
@@ -4205,7 +4191,7 @@ export class WorkflowService {
|
|
|
4205
4191
|
throw new OpenChangeRequestBlocksMergeError(from, branch, open);
|
|
4206
4192
|
}
|
|
4207
4193
|
if (!(await this.git.remoteBranchExists(workspaceId, from))) {
|
|
4208
|
-
throw new
|
|
4194
|
+
throw new VersionControlValidationError(`No branch named "${from}" on the shared repository.`);
|
|
4209
4195
|
}
|
|
4210
4196
|
const resolutions = opts.resolutions ?? [];
|
|
4211
4197
|
const subject = from === branch ? `Merge the shared ${branch} into the local one` : `Merge ${from} into ${branch}`;
|
|
@@ -4216,7 +4202,7 @@ export class WorkflowService {
|
|
|
4216
4202
|
? ` Conflicts resolved by ${user.name} <${user.email}> in: ${resolutions.map((r) => r.path).join(', ')}.`
|
|
4217
4203
|
: '');
|
|
4218
4204
|
// Published inside the merge's own reservation: nothing lands between
|
|
4219
|
-
// the merge commit and its push, and the push is EVERY
|
|
4205
|
+
// the merge commit and its push, and the push is EVERY version-control push's
|
|
4220
4206
|
// `pushWithRecovery`, run over the merge's own unlocked moves — a
|
|
4221
4207
|
// rejection replays the merge (kept as a merge) onto the moved branch
|
|
4222
4208
|
// and pushes again; a replay that conflicts or a host that refuses
|
|
@@ -4268,4 +4254,4 @@ export class WorkflowService {
|
|
|
4268
4254
|
return this.git.changedPathsForPr(workspaceId, base, branch);
|
|
4269
4255
|
}
|
|
4270
4256
|
}
|
|
4271
|
-
//# sourceMappingURL=
|
|
4257
|
+
//# sourceMappingURL=version-control.service.js.map
|