@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
|
@@ -23,7 +23,7 @@ import type {
|
|
|
23
23
|
import { isFolderPlaceholder } from '@bevel-software/platform-shared';
|
|
24
24
|
import { mergeCommitMessageNames } from './merge-commit.js';
|
|
25
25
|
import type { WorkspaceService } from '../../workspace/index.js';
|
|
26
|
-
import type {
|
|
26
|
+
import type { VersionControlHooks, CommitValidationContext } from '../version-control-hooks.js';
|
|
27
27
|
import type { IAccessControl } from '../../access/index.js';
|
|
28
28
|
import { AccessDeniedError } from '../../access-model/index.js';
|
|
29
29
|
import { WorkspaceIdMutex, type WorkspaceMutex, assertInsideRepo, cloneTrackingConfigArgs, SAFE_IMPLICIT_FETCH_ARGS, readRefSha } from '../../kb-fs/index.js';
|
|
@@ -42,8 +42,8 @@ import {
|
|
|
42
42
|
AppliedChangeMismatchError,
|
|
43
43
|
BranchAuthorshipError,
|
|
44
44
|
BranchDeleteRefusedError,
|
|
45
|
-
|
|
46
|
-
|
|
45
|
+
VersionControlDomainError,
|
|
46
|
+
VersionControlValidationError,
|
|
47
47
|
ProtectedBranchError,
|
|
48
48
|
PullRebaseConflictError,
|
|
49
49
|
RemoteBranchGoneError,
|
|
@@ -69,7 +69,7 @@ const crLog = logger('cr');
|
|
|
69
69
|
|
|
70
70
|
|
|
71
71
|
/**
|
|
72
|
-
* Fallback committer identity. Every
|
|
72
|
+
* Fallback committer identity. Every version-control commit overrides the author via
|
|
73
73
|
* `--author=…` so the real human shows up in `git log`; this is just the
|
|
74
74
|
* committer git records need. Mirrors the value `WorkspaceService` stamps on
|
|
75
75
|
* each clone — set again where an operation must not depend on that ambient
|
|
@@ -149,13 +149,13 @@ function buildDefaultCommitSummary(repoRelativePath: string): string {
|
|
|
149
149
|
|
|
150
150
|
function assertValidAuthor(user: AuthUser): void {
|
|
151
151
|
if (!user.name || !user.email) {
|
|
152
|
-
throw new
|
|
152
|
+
throw new VersionControlValidationError('commit author name and email are required');
|
|
153
153
|
}
|
|
154
154
|
if (/[\r\n<>]/.test(user.name)) {
|
|
155
|
-
throw new
|
|
155
|
+
throw new VersionControlValidationError('commit author name contains invalid characters');
|
|
156
156
|
}
|
|
157
157
|
if (/[\r\n<>\s]/.test(user.email) || !/^[^@\s]+@[^@\s]+$/.test(user.email)) {
|
|
158
|
-
throw new
|
|
158
|
+
throw new VersionControlValidationError('commit author email is not a valid address');
|
|
159
159
|
}
|
|
160
160
|
}
|
|
161
161
|
|
|
@@ -317,13 +317,13 @@ export class GitService implements IGitService {
|
|
|
317
317
|
constructor(
|
|
318
318
|
private readonly workspaceService: WorkspaceService,
|
|
319
319
|
/**
|
|
320
|
-
*
|
|
320
|
+
* Version-control lifecycle hooks. This service only consults the ADVISORY
|
|
321
321
|
* `commitValidation` hooks (registered by the enterprise kb module in the
|
|
322
322
|
* composition root — the constructor-injected `IKbValidator` this
|
|
323
323
|
* replaced). No hooks registered = no commit-time validation, which is
|
|
324
324
|
* safe because validation is advisory and never blocks a commit.
|
|
325
325
|
*/
|
|
326
|
-
private readonly hooks:
|
|
326
|
+
private readonly hooks: VersionControlHooks,
|
|
327
327
|
private readonly kb: KbContext,
|
|
328
328
|
// Keyed by the CANONICAL workspace id: a route's Express-decoded `:id`
|
|
329
329
|
// (`alice/feature`) and a tool's `alice%2Ffeature` name one clone, and
|
|
@@ -344,6 +344,36 @@ export class GitService implements IGitService {
|
|
|
344
344
|
return this.kb.kbDirName;
|
|
345
345
|
}
|
|
346
346
|
|
|
347
|
+
/**
|
|
348
|
+
* Every commit this service lands is reported here, once, to the hooks the
|
|
349
|
+
* composition root registered (`VersionControlHooks.onCommitLanded`): a
|
|
350
|
+
* single-file commit, a batch, a merge. Paths go out workspace-relative, as
|
|
351
|
+
* the notifier's contract has them. The hooks run isolated, so a reactor can
|
|
352
|
+
* neither fail nor unwind the commit it hears of. This is the ONE place a
|
|
353
|
+
* commit is announced from — a new way of committing reports here or it is
|
|
354
|
+
* not announced at all, which a test pins.
|
|
355
|
+
*/
|
|
356
|
+
private landed(workspaceId: string, branch: string, user: AuthUser, repoRelativePaths: readonly string[]): void {
|
|
357
|
+
this.hooks.commitLanded({
|
|
358
|
+
workspaceId,
|
|
359
|
+
branch,
|
|
360
|
+
paths: repoRelativePaths.map((p) => `${this.kbDirName}/${p}`),
|
|
361
|
+
byUser: user,
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
/**
|
|
366
|
+
* The files the commit at HEAD changed, repo-relative, read from the commit
|
|
367
|
+
* itself rather than from the status listing that preceded it: every file
|
|
368
|
+
* of a new folder (status shows the folder), both ends of a rename (status
|
|
369
|
+
* shows one entry). A read that fails must not lose the report, so callers
|
|
370
|
+
* fall back to what they knew before the commit.
|
|
371
|
+
*/
|
|
372
|
+
private async committedPaths(cwd: string): Promise<string[]> {
|
|
373
|
+
const { stdout } = await this.git(cwd, ['diff-tree', '--root', '--no-commit-id', '--name-only', '--no-renames', '-r', '-z', 'HEAD']);
|
|
374
|
+
return stdout.split('\0').filter(Boolean);
|
|
375
|
+
}
|
|
376
|
+
|
|
347
377
|
/**
|
|
348
378
|
* The credentials the runner authenticates with — for the services above
|
|
349
379
|
* this one that scrub a message git or the host echoed a token into.
|
|
@@ -808,7 +838,7 @@ export class GitService implements IGitService {
|
|
|
808
838
|
const cwd = await this.repoDir(workspaceId);
|
|
809
839
|
const current = await this.currentBranch(cwd);
|
|
810
840
|
if (current === name) {
|
|
811
|
-
throw new
|
|
841
|
+
throw new VersionControlValidationError(
|
|
812
842
|
`Cannot delete "${name}" while it's the checked-out branch.`,
|
|
813
843
|
);
|
|
814
844
|
}
|
|
@@ -824,7 +854,7 @@ export class GitService implements IGitService {
|
|
|
824
854
|
// not just their own — but keep the "refuse if origin still has the
|
|
825
855
|
// ref" safety: a present remote means the branch is still live.
|
|
826
856
|
if (await this.refExists(cwd, `refs/remotes/origin/${name}`)) {
|
|
827
|
-
throw new
|
|
857
|
+
throw new VersionControlValidationError(
|
|
828
858
|
`Branch "${name}" still exists on origin — refusing to auto-prune.`,
|
|
829
859
|
);
|
|
830
860
|
}
|
|
@@ -1008,12 +1038,12 @@ export class GitService implements IGitService {
|
|
|
1008
1038
|
req: ShareChangesRequest,
|
|
1009
1039
|
): Promise<CommitAttribution> {
|
|
1010
1040
|
const subject = req.summary?.trim();
|
|
1011
|
-
if (!subject) throw new
|
|
1041
|
+
if (!subject) throw new VersionControlValidationError('commit summary is required');
|
|
1012
1042
|
if (subject.length > 200) {
|
|
1013
|
-
throw new
|
|
1043
|
+
throw new VersionControlValidationError('commit summary must be ≤ 200 characters');
|
|
1014
1044
|
}
|
|
1015
1045
|
if (subject.includes('\n')) {
|
|
1016
|
-
throw new
|
|
1046
|
+
throw new VersionControlValidationError('commit summary must be a single line');
|
|
1017
1047
|
}
|
|
1018
1048
|
assertValidAuthor(user);
|
|
1019
1049
|
|
|
@@ -1033,12 +1063,12 @@ export class GitService implements IGitService {
|
|
|
1033
1063
|
]);
|
|
1034
1064
|
const touched = parsePorcelainZ(porcelain);
|
|
1035
1065
|
if (touched.length === 0) {
|
|
1036
|
-
throw new
|
|
1066
|
+
throw new VersionControlValidationError('No pending changes to commit', {
|
|
1037
1067
|
kind: 'no-pending-changes',
|
|
1038
1068
|
});
|
|
1039
1069
|
}
|
|
1040
1070
|
if (touched.length > 1) {
|
|
1041
|
-
throw new
|
|
1071
|
+
throw new VersionControlValidationError(
|
|
1042
1072
|
`Each change must affect exactly one file. ${touched.length} files are currently pending: ${touched.join(', ')}. Commit them one at a time.`,
|
|
1043
1073
|
{ kind: 'too-many-files-dirty', paths: touched },
|
|
1044
1074
|
);
|
|
@@ -1082,6 +1112,10 @@ export class GitService implements IGitService {
|
|
|
1082
1112
|
args.push('-m', req.description.trim());
|
|
1083
1113
|
}
|
|
1084
1114
|
await this.git(cwd, args);
|
|
1115
|
+
// The commit exists from here on: reported now, before the attribution
|
|
1116
|
+
// read, which can fail without unmaking it — with the files the commit
|
|
1117
|
+
// holds, or the status listing if even that read fails.
|
|
1118
|
+
this.landed(workspaceId, branch, user, await this.committedPaths(cwd).catch(() => touched));
|
|
1085
1119
|
|
|
1086
1120
|
const { stdout } = await this.git(cwd, [
|
|
1087
1121
|
'log',
|
|
@@ -1206,7 +1240,7 @@ export class GitService implements IGitService {
|
|
|
1206
1240
|
// **No access check at commit time.** Per the "disk is the source of
|
|
1207
1241
|
// truth" rule, by the time content is on disk it must not be rejected.
|
|
1208
1242
|
// The permission check that used to live here now runs at lock
|
|
1209
|
-
// acquisition (see `
|
|
1243
|
+
// acquisition (see `VersionControlService.acquireLock`'s
|
|
1210
1244
|
// `assertCanWriteAtPath`), so a user can't even start editing a file
|
|
1211
1245
|
// they lack write permission on — they never reach this commit. The
|
|
1212
1246
|
// legacy gate could destroy a user's edits when access changed
|
|
@@ -1235,10 +1269,10 @@ export class GitService implements IGitService {
|
|
|
1235
1269
|
|
|
1236
1270
|
const subject = summary?.trim() || buildDefaultCommitSummary(repoRelativePath);
|
|
1237
1271
|
if (subject.length > 200) {
|
|
1238
|
-
throw new
|
|
1272
|
+
throw new VersionControlValidationError('commit summary must be ≤ 200 characters');
|
|
1239
1273
|
}
|
|
1240
1274
|
if (subject.includes('\n')) {
|
|
1241
|
-
throw new
|
|
1275
|
+
throw new VersionControlValidationError('commit summary must be a single line');
|
|
1242
1276
|
}
|
|
1243
1277
|
|
|
1244
1278
|
await this.git(cwd, [
|
|
@@ -1246,6 +1280,10 @@ export class GitService implements IGitService {
|
|
|
1246
1280
|
`--author=${user.name} <${user.email}>`,
|
|
1247
1281
|
'-m', subject,
|
|
1248
1282
|
]);
|
|
1283
|
+
// The commit exists from here on: reported now, before the attribution
|
|
1284
|
+
// read, which can fail without unmaking it — with the files the commit
|
|
1285
|
+
// holds (the one path, as it was staged), or that path if the read fails.
|
|
1286
|
+
this.landed(workspaceId, branch, user, await this.committedPaths(cwd).catch(() => [repoRelativePath]));
|
|
1249
1287
|
|
|
1250
1288
|
const { stdout } = await this.git(cwd, [
|
|
1251
1289
|
'log',
|
|
@@ -1292,9 +1330,9 @@ export class GitService implements IGitService {
|
|
|
1292
1330
|
): Promise<CommitAttribution | null> {
|
|
1293
1331
|
assertValidAuthor(user);
|
|
1294
1332
|
const subject = summary?.trim();
|
|
1295
|
-
if (!subject) throw new
|
|
1296
|
-
if (subject.length > 200) throw new
|
|
1297
|
-
if (subject.includes('\n')) throw new
|
|
1333
|
+
if (!subject) throw new VersionControlValidationError('commit summary is required');
|
|
1334
|
+
if (subject.length > 200) throw new VersionControlValidationError('commit summary must be ≤ 200 characters');
|
|
1335
|
+
if (subject.includes('\n')) throw new VersionControlValidationError('commit summary must be a single line');
|
|
1298
1336
|
|
|
1299
1337
|
return this.mutex.run(workspaceId, async () => {
|
|
1300
1338
|
const cwd = await this.repoDir(workspaceId);
|
|
@@ -1383,6 +1421,10 @@ export class GitService implements IGitService {
|
|
|
1383
1421
|
// committed" and restore their pre-edit bytes, which here would publish
|
|
1384
1422
|
// a compensating revert of a commit that DID land. The attribution read
|
|
1385
1423
|
// is best-effort; on failure fall back to what we already know.
|
|
1424
|
+
// The commit exists: report it, with the files it holds — both ends of a
|
|
1425
|
+
// rename, every file of a new folder — or the scoped status listing if
|
|
1426
|
+
// that read fails. Neither the read nor the hooks can throw here.
|
|
1427
|
+
this.landed(workspaceId, branch, user, await this.committedPaths(cwd).catch(() => touched));
|
|
1386
1428
|
let sha = '';
|
|
1387
1429
|
let authorName = user.name;
|
|
1388
1430
|
let authorEmail = user.email;
|
|
@@ -1480,7 +1522,7 @@ export class GitService implements IGitService {
|
|
|
1480
1522
|
}
|
|
1481
1523
|
}
|
|
1482
1524
|
|
|
1483
|
-
// `forcePush` method removed. The
|
|
1525
|
+
// `forcePush` method removed. The version-control layer no longer auto-force-pushes
|
|
1484
1526
|
// as a recovery — when the cooperative `pull --rebase` + retry can't
|
|
1485
1527
|
// reconcile, we throw `PushNeedsAgentResolutionError` and hand off to the
|
|
1486
1528
|
// agent. The agent has git + gh CLI access and can choose to run a raw
|
|
@@ -1493,7 +1535,7 @@ export class GitService implements IGitService {
|
|
|
1493
1535
|
|
|
1494
1536
|
/**
|
|
1495
1537
|
* Attempt a local merge of `origin/<targetBranch>` into the currently-
|
|
1496
|
-
* checked-out branch. Used by the
|
|
1538
|
+
* checked-out branch. Used by the version-control module to auto-merge target →
|
|
1497
1539
|
* source when a change request is opened or refreshed (PLAN §1).
|
|
1498
1540
|
*
|
|
1499
1541
|
* Two outcomes:
|
|
@@ -1564,7 +1606,7 @@ export class GitService implements IGitService {
|
|
|
1564
1606
|
assertValidBranchName(fromBranch);
|
|
1565
1607
|
assertValidAuthor(user);
|
|
1566
1608
|
if (/\n\s*\n/.test(opts.subject)) {
|
|
1567
|
-
throw new
|
|
1609
|
+
throw new VersionControlValidationError('merge commit subject must be a single paragraph');
|
|
1568
1610
|
}
|
|
1569
1611
|
// Every resolution names a repository path; which of them are conflicted
|
|
1570
1612
|
// is only known inside the merge, where they are matched exactly.
|
|
@@ -1579,12 +1621,12 @@ export class GitService implements IGitService {
|
|
|
1579
1621
|
const p = this.stripRepoPrefix(r.path);
|
|
1580
1622
|
const ways = [r.content !== undefined, r.choose !== undefined].filter(Boolean).length;
|
|
1581
1623
|
if (ways !== 1) {
|
|
1582
|
-
throw new
|
|
1624
|
+
throw new VersionControlValidationError(`resolution for "${p}": give either \`content\` or \`choose\`, not ${ways === 0 ? 'neither' : 'both'}`);
|
|
1583
1625
|
}
|
|
1584
1626
|
if (r.choose !== undefined && !['ours', 'theirs', 'delete'].includes(r.choose)) {
|
|
1585
|
-
throw new
|
|
1627
|
+
throw new VersionControlValidationError(`resolution for "${p}": \`choose\` is \`ours\`, \`theirs\` or \`delete\``);
|
|
1586
1628
|
}
|
|
1587
|
-
if (resolutions.has(p)) throw new
|
|
1629
|
+
if (resolutions.has(p)) throw new VersionControlValidationError(`"${p}" is resolved twice`);
|
|
1588
1630
|
resolutions.set(p, { ...r, path: p });
|
|
1589
1631
|
}
|
|
1590
1632
|
return this.mutex.run(workspaceId, async () =>
|
|
@@ -1616,7 +1658,7 @@ export class GitService implements IGitService {
|
|
|
1616
1658
|
*
|
|
1617
1659
|
* `publish` runs over the merge commit inside this same reservation, so no
|
|
1618
1660
|
* save or sync can land between the commit and its push; it is the
|
|
1619
|
-
* caller's push policy (the
|
|
1661
|
+
* caller's push policy (the version-control service's `pushWithRecovery`: one replay onto
|
|
1620
1662
|
* the moved branch with the merge kept, `--rebase-merges`, then the typed
|
|
1621
1663
|
* hand-off) over this checkout's own unlocked moves.
|
|
1622
1664
|
*/
|
|
@@ -1653,14 +1695,14 @@ export class GitService implements IGitService {
|
|
|
1653
1695
|
if (opts.guardCheckout) {
|
|
1654
1696
|
const checkedOut = await this.currentBranch(cwd);
|
|
1655
1697
|
if (checkedOut !== branch) {
|
|
1656
|
-
throw new
|
|
1698
|
+
throw new VersionControlValidationError(`the workspace is on "${checkedOut}", not on "${branch}"`);
|
|
1657
1699
|
}
|
|
1658
1700
|
// A merge rewrites tracked files. Edits still on their way to a commit
|
|
1659
1701
|
// (a save the worker has not landed) would be swept into the merge
|
|
1660
1702
|
// commit under this user's name, or lost under the merge's version.
|
|
1661
1703
|
const { stdout: dirty } = await this.git(cwd, ['status', '--porcelain=v1', '-z']);
|
|
1662
1704
|
if (parsePorcelainZ(dirty).length > 0) {
|
|
1663
|
-
throw new
|
|
1705
|
+
throw new VersionControlDomainError(
|
|
1664
1706
|
`"${branch}" has edits that are not committed yet. Try again once they are saved.`,
|
|
1665
1707
|
409,
|
|
1666
1708
|
{ kind: 'branch-busy', branch },
|
|
@@ -1687,8 +1729,8 @@ export class GitService implements IGitService {
|
|
|
1687
1729
|
// A merge with nothing to settle leaves no resolution a place to go: one
|
|
1688
1730
|
// supplied anyway names a path that is not conflicted, and is refused as
|
|
1689
1731
|
// such rather than dropped on the floor behind a published merge.
|
|
1690
|
-
const noConflictsFor = ():
|
|
1691
|
-
new
|
|
1732
|
+
const noConflictsFor = (): VersionControlValidationError =>
|
|
1733
|
+
new VersionControlValidationError(
|
|
1692
1734
|
`nothing conflicted, so nothing is resolved here: ${[...opts.resolutions.keys()].join(', ')}.`,
|
|
1693
1735
|
{ kind: 'not-conflicted', paths: [...opts.resolutions.keys()] },
|
|
1694
1736
|
);
|
|
@@ -1723,7 +1765,7 @@ export class GitService implements IGitService {
|
|
|
1723
1765
|
// locks. Refused whole, before any resolution is applied — naming
|
|
1724
1766
|
// the caller's own paths only, never the conflicted set (which the
|
|
1725
1767
|
// caller is told of, cut to what they may read, by the answer).
|
|
1726
|
-
throw new
|
|
1768
|
+
throw new VersionControlValidationError(
|
|
1727
1769
|
`not conflicted, so not resolved here: ${stray.join(', ')}.`,
|
|
1728
1770
|
{ kind: 'not-conflicted', paths: stray },
|
|
1729
1771
|
);
|
|
@@ -1811,8 +1853,13 @@ export class GitService implements IGitService {
|
|
|
1811
1853
|
opts: { subject: string; body: string; publish?: (ops: ReservedPushOps) => Promise<void> },
|
|
1812
1854
|
resolvedPaths: string[],
|
|
1813
1855
|
): Promise<MergeIntoBranchOutcome> {
|
|
1856
|
+
// What this merge brings onto the branch: the index holds the merged tree.
|
|
1857
|
+
// NUL-delimited and with renames as a delete plus an add, so every path is
|
|
1858
|
+
// named verbatim, both ends of a rename included.
|
|
1859
|
+
const { stdout: merged } = await this.git(cwd, ['diff', '--cached', '--name-only', '--no-renames', '-z']);
|
|
1814
1860
|
await this.git(cwd, ['commit', `--author=${user.name} <${user.email}>`, '-m', opts.subject, '-m', opts.body]);
|
|
1815
1861
|
this.accessControl?.invalidate(workspaceId);
|
|
1862
|
+
this.landed(workspaceId, branch, user, merged.split('\0').filter(Boolean));
|
|
1816
1863
|
// The publish runs here, inside the reservation the merge was made in,
|
|
1817
1864
|
// over this checkout's own push and pull-rebase (the merge kept as a
|
|
1818
1865
|
// merge) — the caller's policy, the git layer's moves. Whatever it
|
|
@@ -1901,7 +1948,7 @@ export class GitService implements IGitService {
|
|
|
1901
1948
|
// the way that is a link is refused, and a path that is itself a link is
|
|
1902
1949
|
// replaced as a path (the link removed first), never written through.
|
|
1903
1950
|
if ((await linkedAncestor(cwd, path.dirname(file))) !== null) {
|
|
1904
|
-
throw new
|
|
1951
|
+
throw new VersionControlValidationError(`"${r.path}" is reached through a link, so it is not resolved here`);
|
|
1905
1952
|
}
|
|
1906
1953
|
if (r.content !== undefined) {
|
|
1907
1954
|
if ((await lstatOrNull(file))?.isSymbolicLink()) await fs.unlink(file);
|
|
@@ -2029,7 +2076,7 @@ export class GitService implements IGitService {
|
|
|
2029
2076
|
// `mergeCommitSubject` already flattens the title it builds from; this is the
|
|
2030
2077
|
// guard that keeps any other caller from reintroducing the break.
|
|
2031
2078
|
if (/\n\s*\n/.test(commit.subject)) {
|
|
2032
|
-
throw new
|
|
2079
|
+
throw new VersionControlValidationError('merge commit subject must be a single paragraph');
|
|
2033
2080
|
}
|
|
2034
2081
|
const MAX_ATTEMPTS = 3;
|
|
2035
2082
|
return this.mutex.run(baseWorkspaceId, async () => {
|
|
@@ -2044,7 +2091,7 @@ export class GitService implements IGitService {
|
|
|
2044
2091
|
const { stdout: dirty } = await this.git(cwd, ['status', '--porcelain=v1', '-z']);
|
|
2045
2092
|
const unpushed = await this.hasUnpushedCommitsAt(cwd);
|
|
2046
2093
|
if (parsePorcelainZ(dirty).length > 0 || unpushed) {
|
|
2047
|
-
throw new
|
|
2094
|
+
throw new VersionControlDomainError(
|
|
2048
2095
|
`"${targetBranch}" has edits that are not shared yet. Try the merge again once they are saved.`,
|
|
2049
2096
|
409,
|
|
2050
2097
|
{ kind: 'merge-target-busy', targetBranch },
|
|
@@ -2124,8 +2171,10 @@ export class GitService implements IGitService {
|
|
|
2124
2171
|
// finalize the row (a transient database fault between the push and the
|
|
2125
2172
|
// update) has one, and it is the only place its file list survives — so
|
|
2126
2173
|
// it is looked for rather than assumed absent (cubic P2 on #347).
|
|
2127
|
-
|
|
2128
|
-
|
|
2174
|
+
// NUL-delimited and with renames as a delete plus an add, so every path
|
|
2175
|
+
// the merge touches is named verbatim, both ends of a rename included.
|
|
2176
|
+
const { stdout: staged } = await this.git(cwd, ['diff', '--cached', '--name-only', '--no-renames', '-z']);
|
|
2177
|
+
if (staged === '') {
|
|
2129
2178
|
const { stdout: sha } = await this.git(cwd, ['rev-parse', 'HEAD']);
|
|
2130
2179
|
await this.git(cwd, ['merge', '--abort']).catch(() => undefined);
|
|
2131
2180
|
const own =
|
|
@@ -2145,6 +2194,10 @@ export class GitService implements IGitService {
|
|
|
2145
2194
|
|
|
2146
2195
|
try {
|
|
2147
2196
|
await this.git(cwd, ['push', 'origin', `HEAD:refs/heads/${targetBranch}`]);
|
|
2197
|
+
// This merge commit is provisional until its push lands: a rejected
|
|
2198
|
+
// push resets the checkout and the next attempt commits anew. So it
|
|
2199
|
+
// is reported here, once, for the attempt that landed on the target.
|
|
2200
|
+
this.landed(baseWorkspaceId, targetBranch, user, staged.split('\0').filter(Boolean));
|
|
2148
2201
|
this.accessControl?.invalidate(baseWorkspaceId);
|
|
2149
2202
|
// A commit of this request's own, with the subject the reader verifies.
|
|
2150
2203
|
return { kind: 'merged' as const, sha: sha.trim(), mergeCommit: sha.trim() };
|
|
@@ -2453,7 +2506,7 @@ export class GitService implements IGitService {
|
|
|
2453
2506
|
|
|
2454
2507
|
/**
|
|
2455
2508
|
* Rebase the checked-out branch onto `remoteRef`, turning a content
|
|
2456
|
-
* conflict into the typed error the
|
|
2509
|
+
* conflict into the typed error the version-control layer queues recovery for.
|
|
2457
2510
|
* Shared by `pull` and `syncFromRemote` so the two cannot drift.
|
|
2458
2511
|
*/
|
|
2459
2512
|
private async rebaseOntoRemote(
|
|
@@ -2535,7 +2588,7 @@ export class GitService implements IGitService {
|
|
|
2535
2588
|
abortSucceeded = false;
|
|
2536
2589
|
});
|
|
2537
2590
|
if (abortSucceeded && conflictedPaths.length > 0) {
|
|
2538
|
-
// Typed so the
|
|
2591
|
+
// Typed so the version-control layer can queue background recovery — this
|
|
2539
2592
|
// divergence never resolves on its own (every retry pull hits the
|
|
2540
2593
|
// same conflict) and the unpushed local commits are someone's saved
|
|
2541
2594
|
// content stuck violating save=share.
|
|
@@ -3029,7 +3082,7 @@ export class GitService implements IGitService {
|
|
|
3029
3082
|
// Only the genuinely empty separator lines are skipped.
|
|
3030
3083
|
const touched = nameLine.endsWith('\r') ? nameLine.slice(0, -1) : nameLine;
|
|
3031
3084
|
if (touched && touched !== repoRelativePath) {
|
|
3032
|
-
throw new
|
|
3085
|
+
throw new VersionControlValidationError(
|
|
3033
3086
|
`"${relativePath}" is a directory at that point in history — history is served per file`,
|
|
3034
3087
|
);
|
|
3035
3088
|
}
|
|
@@ -3064,7 +3117,7 @@ export class GitService implements IGitService {
|
|
|
3064
3117
|
): Promise<string> {
|
|
3065
3118
|
assertValidRelativePath(relativePath);
|
|
3066
3119
|
if (!/^[a-f0-9]{7,40}$/i.test(sha)) {
|
|
3067
|
-
throw new
|
|
3120
|
+
throw new VersionControlValidationError('invalid commit sha');
|
|
3068
3121
|
}
|
|
3069
3122
|
const repoRelativePath = this.stripRepoPrefix(relativePath);
|
|
3070
3123
|
return this.mutex.run(workspaceId, async () => {
|
|
@@ -3119,7 +3172,7 @@ export class GitService implements IGitService {
|
|
|
3119
3172
|
): Promise<{ baseline: string | null; current: string | null }> {
|
|
3120
3173
|
assertValidRelativePath(relativePath);
|
|
3121
3174
|
if (!/^[a-f0-9]{7,40}$/i.test(sha)) {
|
|
3122
|
-
throw new
|
|
3175
|
+
throw new VersionControlValidationError('invalid commit sha');
|
|
3123
3176
|
}
|
|
3124
3177
|
const repoRelativePath = this.stripRepoPrefix(relativePath);
|
|
3125
3178
|
return this.mutex.run(workspaceId, async () => {
|
|
@@ -3160,7 +3213,7 @@ export class GitService implements IGitService {
|
|
|
3160
3213
|
assertValidBranchName(fromBranch);
|
|
3161
3214
|
assertValidBranchName(toBranch);
|
|
3162
3215
|
if (fromBranch === toBranch) {
|
|
3163
|
-
throw new
|
|
3216
|
+
throw new VersionControlValidationError('from and to branches must differ');
|
|
3164
3217
|
}
|
|
3165
3218
|
const repoRelativePath = this.stripRepoPrefix(relativePath);
|
|
3166
3219
|
return this.mutex.run(workspaceId, async () => {
|
|
@@ -3291,7 +3344,7 @@ export class GitService implements IGitService {
|
|
|
3291
3344
|
if (opts.at) {
|
|
3292
3345
|
for (const sha of [opts.at.baseSha, opts.at.headSha]) {
|
|
3293
3346
|
if (!/^[0-9a-f]{40,64}$/.test(sha)) {
|
|
3294
|
-
throw new
|
|
3347
|
+
throw new VersionControlValidationError(`invalid commit sha: ${sha}`);
|
|
3295
3348
|
}
|
|
3296
3349
|
}
|
|
3297
3350
|
}
|
|
@@ -3411,7 +3464,7 @@ export class GitService implements IGitService {
|
|
|
3411
3464
|
* side for a merge commit, and for a squashed or fast-forwarded commit it is
|
|
3412
3465
|
* simply the commit before — the same answer either way.
|
|
3413
3466
|
*
|
|
3414
|
-
* Throws `
|
|
3467
|
+
* Throws `VersionControlValidationError` whenever the recorded commit cannot be
|
|
3415
3468
|
* PROVEN to be this request's own merge commit — see
|
|
3416
3469
|
* {@link appliedChangeShas}. Every caller reads that as "the file set could
|
|
3417
3470
|
* not be resolved" and falls back to its own fail-closed answer, which is what
|
|
@@ -3424,7 +3477,7 @@ export class GitService implements IGitService {
|
|
|
3424
3477
|
): Promise<{ baseSha: string; headSha: string }> {
|
|
3425
3478
|
const { mergeSha, number } = applied;
|
|
3426
3479
|
if (!/^[0-9a-f]{40,64}$/.test(mergeSha)) {
|
|
3427
|
-
throw new
|
|
3480
|
+
throw new VersionControlValidationError(`invalid commit sha: ${mergeSha}`);
|
|
3428
3481
|
}
|
|
3429
3482
|
const revParse = async (rev: string): Promise<string | null> => {
|
|
3430
3483
|
try {
|
|
@@ -3447,7 +3500,7 @@ export class GitService implements IGitService {
|
|
|
3447
3500
|
// or a message that does not name the request) never becomes it, and is
|
|
3448
3501
|
// reported as a mismatch the caller may remember.
|
|
3449
3502
|
if (!(await revParse(`${mergeSha}^{commit}`))) {
|
|
3450
|
-
throw new
|
|
3503
|
+
throw new VersionControlValidationError(
|
|
3451
3504
|
`commit ${mergeSha} is not in this clone, so change request #${number} cannot be read from it yet`,
|
|
3452
3505
|
);
|
|
3453
3506
|
}
|
|
@@ -3612,7 +3665,7 @@ export class GitService implements IGitService {
|
|
|
3612
3665
|
// concurrent `fetch --prune origin` (`ensureRemotesFetched` and
|
|
3613
3666
|
// `fetchPrRefs` both run outside this mutex, deliberately) can drop a
|
|
3614
3667
|
// remote-tracking ref between the two, and re-resolving inside the mutex
|
|
3615
|
-
// would then throw `
|
|
3668
|
+
// would then throw `VersionControlValidationError` — which `touchedPathsFor`
|
|
3616
3669
|
// swallows into an empty touched-path set, i.e. exactly the change
|
|
3617
3670
|
// request missing from its own author's tree that the skip is guarded
|
|
3618
3671
|
// against. The commits stay readable whatever happens to the ref names.
|
|
@@ -3792,7 +3845,7 @@ export class GitService implements IGitService {
|
|
|
3792
3845
|
): Promise<{ mergeBaseSha: string | null; behind: boolean }> {
|
|
3793
3846
|
for (const sha of [at.baseSha, at.headSha]) {
|
|
3794
3847
|
if (!/^[0-9a-f]{40,64}$/.test(sha)) {
|
|
3795
|
-
throw new
|
|
3848
|
+
throw new VersionControlValidationError(`invalid commit sha: ${sha}`);
|
|
3796
3849
|
}
|
|
3797
3850
|
}
|
|
3798
3851
|
const cwd = await this.repoDir(workspaceId);
|
|
@@ -3835,7 +3888,7 @@ export class GitService implements IGitService {
|
|
|
3835
3888
|
): Promise<string[]> {
|
|
3836
3889
|
for (const sha of [fromSha, toSha]) {
|
|
3837
3890
|
if (!/^[0-9a-f]{40,64}$/.test(sha)) {
|
|
3838
|
-
throw new
|
|
3891
|
+
throw new VersionControlValidationError(`invalid commit sha: ${sha}`);
|
|
3839
3892
|
}
|
|
3840
3893
|
}
|
|
3841
3894
|
const cwd = await this.repoDir(workspaceId);
|
|
@@ -3866,7 +3919,7 @@ export class GitService implements IGitService {
|
|
|
3866
3919
|
assertValidBranchName(baseBranch);
|
|
3867
3920
|
assertValidRelativePath(relativePath);
|
|
3868
3921
|
if (!/^[0-9a-f]{40,64}$/.test(sha)) {
|
|
3869
|
-
throw new
|
|
3922
|
+
throw new VersionControlValidationError(`invalid commit sha: ${sha}`);
|
|
3870
3923
|
}
|
|
3871
3924
|
const repoRelativePath = this.stripRepoPrefix(relativePath);
|
|
3872
3925
|
return this.mutex.run(workspaceId, async () => {
|
|
@@ -3876,7 +3929,7 @@ export class GitService implements IGitService {
|
|
|
3876
3929
|
await this.git(cwd, ['merge-base', '--is-ancestor', sha, baseRef]);
|
|
3877
3930
|
} catch (err) {
|
|
3878
3931
|
if ((err as { exitCode?: number }).exitCode === 1) {
|
|
3879
|
-
throw new
|
|
3932
|
+
throw new VersionControlDomainError(
|
|
3880
3933
|
`That commit is not part of "${baseBranch}" — it is not this request's fork point.`,
|
|
3881
3934
|
404,
|
|
3882
3935
|
);
|
|
@@ -4086,7 +4139,7 @@ export class GitService implements IGitService {
|
|
|
4086
4139
|
try {
|
|
4087
4140
|
return await this.publishedPrEnds(cwd, baseBranch, headBranch);
|
|
4088
4141
|
} catch (err) {
|
|
4089
|
-
if (err instanceof
|
|
4142
|
+
if (err instanceof VersionControlValidationError) return null;
|
|
4090
4143
|
throw err;
|
|
4091
4144
|
}
|
|
4092
4145
|
}
|
|
@@ -4143,7 +4196,7 @@ export class GitService implements IGitService {
|
|
|
4143
4196
|
if (!(err instanceof GitRunError) || err.timedOut || err.exitCode !== 1) throw err;
|
|
4144
4197
|
}
|
|
4145
4198
|
}
|
|
4146
|
-
throw new
|
|
4199
|
+
throw new VersionControlValidationError(`unknown branch: ${branch}`);
|
|
4147
4200
|
}
|
|
4148
4201
|
|
|
4149
4202
|
/**
|
|
@@ -4182,7 +4235,7 @@ export class GitService implements IGitService {
|
|
|
4182
4235
|
// Try the next candidate.
|
|
4183
4236
|
}
|
|
4184
4237
|
}
|
|
4185
|
-
throw new
|
|
4238
|
+
throw new VersionControlValidationError(`unknown branch: ${branch}`);
|
|
4186
4239
|
}
|
|
4187
4240
|
|
|
4188
4241
|
// ── internals ──────────────────────────────────────────────────────────
|
|
@@ -4341,7 +4394,7 @@ export class GitService implements IGitService {
|
|
|
4341
4394
|
throw err;
|
|
4342
4395
|
}
|
|
4343
4396
|
if (kind === 'tree') {
|
|
4344
|
-
throw new
|
|
4397
|
+
throw new VersionControlValidationError(
|
|
4345
4398
|
`"${displayPath}" is a directory at that point in history — history is served per file`,
|
|
4346
4399
|
);
|
|
4347
4400
|
}
|
|
@@ -4497,7 +4550,7 @@ export class GitService implements IGitService {
|
|
|
4497
4550
|
): Promise<{ bytes: Buffer; blobId: string } | null> {
|
|
4498
4551
|
assertValidRelativePath(relativePath);
|
|
4499
4552
|
if (!/^[a-f0-9]{7,40}$/i.test(sha)) {
|
|
4500
|
-
throw new
|
|
4553
|
+
throw new VersionControlValidationError('invalid commit sha');
|
|
4501
4554
|
}
|
|
4502
4555
|
const repoRelativePath = this.stripRepoPrefix(relativePath);
|
|
4503
4556
|
return this.mutex.run(workspaceId, async () => {
|
|
@@ -65,7 +65,7 @@ const MAX_OUTPUT_BYTES = 64 * 1024 * 1024;
|
|
|
65
65
|
* The environment every invocation runs under, laid OVER whatever the caller
|
|
66
66
|
* supplied so that none of it can be unset per call. Only what is safe for
|
|
67
67
|
* EVERY caller belongs here. `GIT_LITERAL_PATHSPECS` does not: it is the
|
|
68
|
-
*
|
|
68
|
+
* version-control service's answer to raw user paths, and the startup runner spells
|
|
69
69
|
* its literal paths with `:(literal)` magic, which that setting would disable
|
|
70
70
|
* — so each of them sets its own, per call.
|
|
71
71
|
*
|
|
@@ -19,7 +19,7 @@ import { changeRequests } from '../../database/index.js';
|
|
|
19
19
|
import type { WorkspaceService } from '../../workspace/index.js';
|
|
20
20
|
import type { IAccessControl } from '../../access/index.js';
|
|
21
21
|
import { AccessUnreadableError } from '../../access-model/index.js';
|
|
22
|
-
import { AppliedChangeMismatchError,
|
|
22
|
+
import { AppliedChangeMismatchError, VersionControlValidationError } from '../../../shared/domain-errors.js';
|
|
23
23
|
import { canonicalEmail, hashEmail } from '../../../shared/email-identity.js';
|
|
24
24
|
import { changeRequestLink, changeRequestLinkBase } from './change-request-link.js';
|
|
25
25
|
|
|
@@ -141,9 +141,9 @@ export function changeSourceFor(row: {
|
|
|
141
141
|
}
|
|
142
142
|
|
|
143
143
|
/**
|
|
144
|
-
* The slice of the review
|
|
144
|
+
* The slice of the change-request-review service this module needs to compose detail
|
|
145
145
|
* responses. Kept narrow (just what `getPrDetail` stitches in) so the PR
|
|
146
|
-
* service doesn't depend on the full
|
|
146
|
+
* service doesn't depend on the full version-control interface — and so the circular
|
|
147
147
|
* relationship in the composition root is explicit and minimal.
|
|
148
148
|
*/
|
|
149
149
|
export interface PrDetailEnricher {
|
|
@@ -183,7 +183,7 @@ export interface PrDetailEnricher {
|
|
|
183
183
|
* The durable facts (pairing, title/body, author, state) live in the row; the
|
|
184
184
|
* head/base SHAs, file list, and diffs are derived live from git so a new commit
|
|
185
185
|
* or force-push is always reflected. Per-file approvals and the merge gate
|
|
186
|
-
* are stitched in from the review
|
|
186
|
+
* are stitched in from the change-request-review service (also DB-backed).
|
|
187
187
|
*/
|
|
188
188
|
export class PullRequestService implements IPullRequestService {
|
|
189
189
|
/**
|
|
@@ -223,9 +223,9 @@ export class PullRequestService implements IPullRequestService {
|
|
|
223
223
|
>();
|
|
224
224
|
|
|
225
225
|
/**
|
|
226
|
-
* Optional — set by the composition root after
|
|
226
|
+
* Optional — set by the composition root after ChangeRequestReviewService exists.
|
|
227
227
|
* Setter-based wiring (not constructor) because PullRequestService is itself
|
|
228
|
-
* a dependency of
|
|
228
|
+
* a dependency of ChangeRequestReviewService's routes, and we want both to live
|
|
229
229
|
* in the same container without a forward-declaration dance.
|
|
230
230
|
*/
|
|
231
231
|
private detailEnricher: PrDetailEnricher | null = null;
|
|
@@ -354,7 +354,7 @@ export class PullRequestService implements IPullRequestService {
|
|
|
354
354
|
// to shout about — it is this row's turn to be fetched, and the next list
|
|
355
355
|
// read answers it. Warning per request on that would be the log flood the
|
|
356
356
|
// network flood came with.
|
|
357
|
-
if (err instanceof
|
|
357
|
+
if (err instanceof VersionControlValidationError) {
|
|
358
358
|
log.debug(`${what} could not resolve ${where}; answering no touched paths:`, { err });
|
|
359
359
|
} else {
|
|
360
360
|
log.warn(`${what} failed for ${where}:`, { err });
|
|
@@ -610,7 +610,7 @@ export class PullRequestService implements IPullRequestService {
|
|
|
610
610
|
|
|
611
611
|
async getPr(prNumber: number): Promise<PullRequestSummary | null> {
|
|
612
612
|
if (!Number.isInteger(prNumber) || prNumber <= 0) {
|
|
613
|
-
throw new
|
|
613
|
+
throw new VersionControlValidationError('PR number must be a positive integer');
|
|
614
614
|
}
|
|
615
615
|
const row = await this.findRow(prNumber);
|
|
616
616
|
if (!row) return null;
|
|
@@ -677,7 +677,7 @@ export class PullRequestService implements IPullRequestService {
|
|
|
677
677
|
opts: { fresh?: boolean; workspaceId?: string; viewerEmail?: string; patches?: boolean } = {},
|
|
678
678
|
): Promise<PullRequestDetail | null> {
|
|
679
679
|
if (!Number.isInteger(prNumber) || prNumber <= 0) {
|
|
680
|
-
throw new
|
|
680
|
+
throw new VersionControlValidationError('PR number must be a positive integer');
|
|
681
681
|
}
|
|
682
682
|
const generation = this.cacheGeneration;
|
|
683
683
|
const row = await this.findRow(prNumber);
|
|
@@ -798,7 +798,7 @@ export class PullRequestService implements IPullRequestService {
|
|
|
798
798
|
// a branch not yet published or a clone not yet caught up, and presenting
|
|
799
799
|
// a live proposal as one that changes nothing would tell a reviewer the
|
|
800
800
|
// opposite of the truth.
|
|
801
|
-
if (!(err instanceof
|
|
801
|
+
if (!(err instanceof VersionControlValidationError) || row.state === 'open') throw err;
|
|
802
802
|
log.warn(
|
|
803
803
|
`change request #${prNumber} is ${row.state} and can no longer be diffed; answering from its row alone:`,
|
|
804
804
|
{ err },
|
|
@@ -835,7 +835,7 @@ export class PullRequestService implements IPullRequestService {
|
|
|
835
835
|
})),
|
|
836
836
|
);
|
|
837
837
|
|
|
838
|
-
// Approvals come from our own DB via the review
|
|
838
|
+
// Approvals come from our own DB via the change-request-review service. The
|
|
839
839
|
// enricher is optional — if it isn't wired yet (startup ordering, isolated
|
|
840
840
|
// tests) we return an empty list rather than blocking the fetch.
|
|
841
841
|
const approvals = this.detailEnricher
|
|
@@ -953,7 +953,7 @@ export class PullRequestService implements IPullRequestService {
|
|
|
953
953
|
viewerIsAuthor,
|
|
954
954
|
viewerCanDelete,
|
|
955
955
|
// Who may close a request may also change what it asks: the same
|
|
956
|
-
// grants, so the same predicate (`
|
|
956
|
+
// grants, so the same predicate (`VersionControlService.updateChangeRequest`
|
|
957
957
|
// enforces it).
|
|
958
958
|
viewerCanEdit: viewerCanCancel,
|
|
959
959
|
};
|