@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
|
@@ -28,7 +28,7 @@ function stripKbDir(path: string, kbDirName: string): string {
|
|
|
28
28
|
const protectedInline = (kb: Pick<KbContext, 'protectedBranches'>) =>
|
|
29
29
|
[...kb.protectedBranches].map((b) => `\`${b}\``).join(' / ');
|
|
30
30
|
|
|
31
|
-
// Output sub-schemas for the git-aliased
|
|
31
|
+
// Output sub-schemas for the git-aliased version-control payloads (Branch, Change,
|
|
32
32
|
// ChangeRequest, …). Defined once and referenced by the individual tool
|
|
33
33
|
// defs below so each tool still declares its own `outputs`.
|
|
34
34
|
const branchSchema: JsonSchema = {
|
|
@@ -139,15 +139,15 @@ const changeRequestSummarySchema: JsonSchema = {
|
|
|
139
139
|
};
|
|
140
140
|
|
|
141
141
|
/**
|
|
142
|
-
*
|
|
142
|
+
* Version-control domain tools, registered into the central catalog and hosted on the
|
|
143
143
|
* shared tools router — the ONE mechanism: build a self-describing UTCP def,
|
|
144
144
|
* host the endpoint behind `toolAuth` + `toolHandler`, register the def. Each is
|
|
145
|
-
* a thin facade over `
|
|
145
|
+
* a thin facade over `IVersionControlService`; identity + workspace come from the
|
|
146
146
|
* resolved `ToolContext` (so a caller can never address another user/workspace).
|
|
147
147
|
* All are `both` (external agents can drive repo ops directly); the write ones
|
|
148
148
|
* carry the `write` tag so read-scoped callers are refused.
|
|
149
149
|
*/
|
|
150
|
-
export function
|
|
150
|
+
export function registerVersionControlTools(
|
|
151
151
|
registry: IToolRegistry,
|
|
152
152
|
router: Router,
|
|
153
153
|
toolAuth: RequestHandler,
|
|
@@ -202,7 +202,7 @@ export function registerWorkflowTools(
|
|
|
202
202
|
handler: ToolHandler;
|
|
203
203
|
}): void => {
|
|
204
204
|
const path = `/api/agent/tools/${spec.name}`;
|
|
205
|
-
// Every
|
|
205
|
+
// Every version-control tool that takes a branch REQUIRES it — the injected input
|
|
206
206
|
// and a hand-declared one (the fork base, the draft to switch to) alike.
|
|
207
207
|
// A hand-declared one is required by its own schema, which `toolDef`
|
|
208
208
|
// reads as `required` too; the tool handler refuses a call without it.
|
|
@@ -272,7 +272,7 @@ export function registerWorkflowTools(
|
|
|
272
272
|
},
|
|
273
273
|
write: false,
|
|
274
274
|
handler: async (_args, ctx: ToolContext) => ({
|
|
275
|
-
branches: await ctx.
|
|
275
|
+
branches: await ctx.versionControlService.listBranches(await repoGlobalWorkspaceId(ctx)),
|
|
276
276
|
}),
|
|
277
277
|
});
|
|
278
278
|
|
|
@@ -299,7 +299,7 @@ export function registerWorkflowTools(
|
|
|
299
299
|
},
|
|
300
300
|
write: true,
|
|
301
301
|
handler: async (args, ctx: ToolContext) => ({
|
|
302
|
-
change: await ctx.
|
|
302
|
+
change: await ctx.versionControlService.commitChange(workspaceIdForBranch(args.branch as string), ctx.user, {
|
|
303
303
|
summary: args.summary as string,
|
|
304
304
|
description: typeof args.description === 'string' ? args.description : undefined,
|
|
305
305
|
}),
|
|
@@ -346,11 +346,11 @@ export function registerWorkflowTools(
|
|
|
346
346
|
}
|
|
347
347
|
assertInsideRepo(path, kbDirName);
|
|
348
348
|
const workspaceId = workspaceIdForBranch(branch);
|
|
349
|
-
const acquired = await ctx.
|
|
349
|
+
const acquired = await ctx.versionControlService.acquireLock(workspaceId, branch, path, ctx.user);
|
|
350
350
|
if (!acquired.acquired) {
|
|
351
351
|
return { saved: false, reason: `Locked by ${acquired.lock.holderName ?? 'another user'} — try again later.` };
|
|
352
352
|
}
|
|
353
|
-
await ctx.
|
|
353
|
+
await ctx.versionControlService.releaseLock(workspaceId, branch, path, ctx.user);
|
|
354
354
|
return { saved: true, queued: true };
|
|
355
355
|
},
|
|
356
356
|
});
|
|
@@ -369,7 +369,7 @@ export function registerWorkflowTools(
|
|
|
369
369
|
},
|
|
370
370
|
write: true,
|
|
371
371
|
handler: async (args, ctx: ToolContext) => {
|
|
372
|
-
await ctx.
|
|
372
|
+
await ctx.versionControlService.shareCurrentBranch(workspaceIdForBranch(args.branch as string), ctx.user);
|
|
373
373
|
return { shared: true };
|
|
374
374
|
},
|
|
375
375
|
});
|
|
@@ -430,7 +430,7 @@ export function registerWorkflowTools(
|
|
|
430
430
|
);
|
|
431
431
|
}
|
|
432
432
|
return {
|
|
433
|
-
branch: await ctx.
|
|
433
|
+
branch: await ctx.versionControlService.createBranch(workspaceIdForBranch(base), name),
|
|
434
434
|
};
|
|
435
435
|
},
|
|
436
436
|
});
|
|
@@ -478,7 +478,7 @@ export function registerWorkflowTools(
|
|
|
478
478
|
// answer, so nothing below the tool changes.
|
|
479
479
|
handler: async (args, ctx: ToolContext) =>
|
|
480
480
|
summarizeChangeRequest(
|
|
481
|
-
await ctx.
|
|
481
|
+
await ctx.versionControlService.openChangeRequest(workspaceIdForBranch(args.sourceBranch as string), ctx.user, {
|
|
482
482
|
sourceBranch: args.sourceBranch as string,
|
|
483
483
|
targetBranch: args.targetBranch as string,
|
|
484
484
|
title: args.title as string,
|
|
@@ -536,7 +536,7 @@ export function registerWorkflowTools(
|
|
|
536
536
|
if (!(await maySeeChangeRequest(ctx, number))) {
|
|
537
537
|
throw new ToolError(`Change request #${number} not found.`, 404);
|
|
538
538
|
}
|
|
539
|
-
const updated = await ctx.
|
|
539
|
+
const updated = await ctx.versionControlService.updateChangeRequest(number, ctx.user, {
|
|
540
540
|
title,
|
|
541
541
|
description,
|
|
542
542
|
appendDescription,
|
|
@@ -614,7 +614,7 @@ export function registerWorkflowTools(
|
|
|
614
614
|
if (typeof source !== 'string' || source.length === 0 || typeof target !== 'string' || target.length === 0) {
|
|
615
615
|
throw new ToolError('`source` and `target` are required branch names.', 400);
|
|
616
616
|
}
|
|
617
|
-
return { outcome: await ctx.
|
|
617
|
+
return { outcome: await ctx.versionControlService.mergeBranch(ctx.user, source, target) };
|
|
618
618
|
},
|
|
619
619
|
});
|
|
620
620
|
|
|
@@ -685,7 +685,7 @@ export function registerWorkflowTools(
|
|
|
685
685
|
kind: 'name-required',
|
|
686
686
|
});
|
|
687
687
|
}
|
|
688
|
-
return ctx.
|
|
688
|
+
return ctx.versionControlService.deleteBranchChecked(ctx.user, name, {
|
|
689
689
|
dryRun: args.dryRun === true,
|
|
690
690
|
discardUnmerged: args.discardUnmerged === true,
|
|
691
691
|
maySee: (number) => maySeeChangeRequest(ctx, number),
|
|
@@ -734,7 +734,7 @@ export function registerWorkflowTools(
|
|
|
734
734
|
// Validate the target exists by listing from any existing clone (every
|
|
735
735
|
// clone tracks all remote refs) — there is no "current" workspace here,
|
|
736
736
|
// and the default branch may not even be on the remote.
|
|
737
|
-
const branches = await ctx.
|
|
737
|
+
const branches = await ctx.versionControlService.listBranches(await repoGlobalWorkspaceId(ctx));
|
|
738
738
|
if (!branches.find((b) => b.name === target)) {
|
|
739
739
|
const known = branches.map((b) => b.name).slice(0, 25).join(', ');
|
|
740
740
|
throw new ToolError(`No draft named "${target}" on this workspace. Known: ${known || '(none)'}.`, 404);
|
|
@@ -757,7 +757,7 @@ export function registerWorkflowTools(
|
|
|
757
757
|
//
|
|
758
758
|
// What the app's History tab, compare view and "update from target" do,
|
|
759
759
|
// as tools: the agent never runs git itself. Each reads through the
|
|
760
|
-
//
|
|
760
|
+
// version-control service's gated methods and takes the per-file read the file
|
|
761
761
|
// itself takes.
|
|
762
762
|
|
|
763
763
|
/** The branch's workspace, made when it is not on disk yet, and its id. */
|
|
@@ -829,7 +829,7 @@ export function registerWorkflowTools(
|
|
|
829
829
|
const workspaceId = await workspaceOf(ctx, branch);
|
|
830
830
|
const rel = await requireRead(ctx, branch, workspaceId, path);
|
|
831
831
|
const limit = typeof args.limit === 'number' ? args.limit : undefined;
|
|
832
|
-
const changes = await ctx.
|
|
832
|
+
const changes = await ctx.versionControlService.listChangesForFile(workspaceId, path, limit);
|
|
833
833
|
return { path: rel, changes };
|
|
834
834
|
},
|
|
835
835
|
});
|
|
@@ -876,14 +876,14 @@ export function registerWorkflowTools(
|
|
|
876
876
|
// read: the file is this workspace's file.
|
|
877
877
|
const rel = await requireRead(ctx, branch, workspaceId, path);
|
|
878
878
|
if (isCommitSha(at)) {
|
|
879
|
-
const { baseline, current } = await ctx.
|
|
879
|
+
const { baseline, current } = await ctx.versionControlService.fileAtChange(workspaceId, path, at);
|
|
880
880
|
return { path: rel, at, kind: 'commit', sha: at, content: current, before: baseline };
|
|
881
881
|
}
|
|
882
882
|
// Read at the branch's published tip, authorized at that very commit
|
|
883
883
|
// inside the read — before anything is said about the path there,
|
|
884
884
|
// the folder refusal included: the ref is a name a fetch may move
|
|
885
885
|
// between a verdict and a read; the commit is not.
|
|
886
|
-
const read = await ctx.
|
|
886
|
+
const read = await ctx.versionControlService.fileAtBranch(workspaceId, path, at, (commits) => requireReadAtCommits(ctx, workspaceId, rel, commits, at));
|
|
887
887
|
return { path: rel, at, kind: 'branch', sha: read.sha, content: read.content };
|
|
888
888
|
},
|
|
889
889
|
});
|
|
@@ -926,14 +926,14 @@ export function registerWorkflowTools(
|
|
|
926
926
|
const rel = await requireRead(ctx, branch, workspaceId, path);
|
|
927
927
|
if (typeof args.at === 'string' && args.at.length > 0) {
|
|
928
928
|
if (!isCommitSha(args.at)) throw new ToolError('`at` must be a full commit sha.', 400);
|
|
929
|
-
return { path: rel, diff: await ctx.
|
|
929
|
+
return { path: rel, diff: await ctx.versionControlService.showFileAtChange(workspaceId, path, args.at) };
|
|
930
930
|
}
|
|
931
931
|
const from = args.from;
|
|
932
932
|
const to = args.to;
|
|
933
933
|
if (typeof from !== 'string' || from.length === 0 || typeof to !== 'string' || to.length === 0) {
|
|
934
934
|
throw new ToolError('Give `from` and `to` (two branches), or `at` (one commit).', 400);
|
|
935
935
|
}
|
|
936
|
-
const compared = await ctx.
|
|
936
|
+
const compared = await ctx.versionControlService.compareFile(workspaceId, path, from, to, async (sides) => {
|
|
937
937
|
await requireReadAtCommits(ctx, workspaceId, rel, sides.from, from);
|
|
938
938
|
await requireReadAtCommits(ctx, workspaceId, rel, sides.to, to);
|
|
939
939
|
});
|
|
@@ -986,12 +986,12 @@ export function registerWorkflowTools(
|
|
|
986
986
|
// The counts alone wait for the listing: its fetch refreshes the
|
|
987
987
|
// remote-tracking refs they are measured against.
|
|
988
988
|
const [status, [branches, counts], pending, forkBase] = await Promise.all([
|
|
989
|
-
ctx.
|
|
990
|
-
ctx.
|
|
989
|
+
ctx.versionControlService.branchStatus(workspaceId),
|
|
990
|
+
ctx.versionControlService
|
|
991
991
|
.listBranches(workspaceId)
|
|
992
|
-
.then(async (listed) => [listed, await ctx.
|
|
993
|
-
ctx.
|
|
994
|
-
ctx.
|
|
992
|
+
.then(async (listed) => [listed, await ctx.versionControlService.branchCounts(workspaceId)] as const),
|
|
993
|
+
ctx.versionControlService.listPendingChangePaths(workspaceId),
|
|
994
|
+
ctx.versionControlService.resolveForkBase(workspaceId, branch),
|
|
995
995
|
]);
|
|
996
996
|
const info = branches.find((b) => b.name === branch);
|
|
997
997
|
const base = typeof args.base === 'string' && args.base.length > 0 ? args.base : forkBase;
|
|
@@ -999,7 +999,7 @@ export function registerWorkflowTools(
|
|
|
999
999
|
// change-request reads show them (readable at `origin/<base>`), the
|
|
1000
1000
|
// uncommitted ones as the workspace's own listing would.
|
|
1001
1001
|
const changedAll =
|
|
1002
|
-
base && base !== branch ? await ctx.
|
|
1002
|
+
base && base !== branch ? await ctx.versionControlService.changedPathsBetweenBranches(workspaceId, base, branch) : [];
|
|
1003
1003
|
const readableChanged = base ? await readableAt(ctx, workspaceId, base, changedAll) : new Set<string>();
|
|
1004
1004
|
const changedPaths = changedAll.filter((p) => readableChanged.has(p));
|
|
1005
1005
|
const pendingRel = pending.map((p) => stripKbDir(p, kbDirName));
|
|
@@ -1177,12 +1177,12 @@ export function registerWorkflowTools(
|
|
|
1177
1177
|
// group), handed to the service to ask before the merge.
|
|
1178
1178
|
const outcome =
|
|
1179
1179
|
resolutions !== undefined
|
|
1180
|
-
? await ctx.
|
|
1180
|
+
? await ctx.versionControlService.updateBranch(workspaceId, ctx.user, {
|
|
1181
1181
|
...(from !== undefined ? { from } : {}),
|
|
1182
1182
|
resolutions,
|
|
1183
1183
|
validateWrite: await ctx.getWriteValidator(branch),
|
|
1184
1184
|
})
|
|
1185
|
-
: await ctx.
|
|
1185
|
+
: await ctx.versionControlService.updateBranch(workspaceId, ctx.user, from !== undefined ? { from } : {});
|
|
1186
1186
|
if (outcome.kind !== 'conflicts') return outcome;
|
|
1187
1187
|
// A conflict answer carries the file on both branches, and a path's
|
|
1188
1188
|
// name is information too: a file the caller may not read on both is
|
|
@@ -9,7 +9,7 @@ export type ChangeRequestPerson = Pick<AuthUser, 'id' | 'email' | 'name'>;
|
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
11
|
* A change request was OPENED — by a person in the app or by an agent through
|
|
12
|
-
* its tool, which take the one road (`
|
|
12
|
+
* its tool, which take the one road (`VersionControlService.openChangeRequest`).
|
|
13
13
|
* Raised once per request, after its row exists and its source branch was
|
|
14
14
|
* pushed, or the push was refused: the request exists either way, and the
|
|
15
15
|
* branch's next push carries the commits. Never raised for a request that is
|
|
@@ -12,7 +12,7 @@ const mergeChangeRequestMock = vi.fn(async () => ({
|
|
|
12
12
|
mergeCommit: 'merged-sha',
|
|
13
13
|
}));
|
|
14
14
|
|
|
15
|
-
import {
|
|
15
|
+
import { ChangeRequestReviewService } from '../change-request-review.service.js';
|
|
16
16
|
import { changeRequests } from '../../../database/schema.js';
|
|
17
17
|
import type { Database } from '../../../database/connection.js';
|
|
18
18
|
import type { WorkspaceService } from '../../../workspace/workspace.service.js';
|
|
@@ -182,10 +182,10 @@ function makeService(rows: ApprovalRow[], byPath: EligibilityByPath) {
|
|
|
182
182
|
getOrCreateForBranch: vi.fn(async () => ({ id: 'ws-base' })),
|
|
183
183
|
} as unknown as WorkspaceService;
|
|
184
184
|
const git = { mergeChangeRequest: mergeChangeRequestMock } as unknown as GitService;
|
|
185
|
-
return new
|
|
185
|
+
return new ChangeRequestReviewService(makeDb(rows), makeAccessControl(byPath), workspace, git);
|
|
186
186
|
}
|
|
187
187
|
|
|
188
|
-
describe('
|
|
188
|
+
describe('ChangeRequestReviewService.getApprovalStates', () => {
|
|
189
189
|
const HEAD = 'head-sha-1';
|
|
190
190
|
const BASE = 'current-company-state';
|
|
191
191
|
const ALICE_EMAIL = 'alice@bevel.software';
|
|
@@ -751,7 +751,7 @@ describe('merge gate — every file type', () => {
|
|
|
751
751
|
* load. The unreadable case propagates (the caller fails closed, 503); any
|
|
752
752
|
* other lookup failure still degrades to empty eligibility as documented.
|
|
753
753
|
*/
|
|
754
|
-
describe('
|
|
754
|
+
describe('ChangeRequestReviewService.getApprovalStates — unreadable access tree', () => {
|
|
755
755
|
const FILES = [file({ path: 'Knowledge/Foo.md' })];
|
|
756
756
|
function serviceWith(overrides: Partial<IAccessControl>) {
|
|
757
757
|
const workspace = {
|
|
@@ -759,7 +759,7 @@ describe('ReviewWorkflowService.getApprovalStates — unreadable access tree', (
|
|
|
759
759
|
getOrCreateForBranch: vi.fn(async () => ({ id: 'ws-base' })),
|
|
760
760
|
} as unknown as WorkspaceService;
|
|
761
761
|
const git = { mergeChangeRequest: mergeChangeRequestMock } as unknown as GitService;
|
|
762
|
-
return new
|
|
762
|
+
return new ChangeRequestReviewService(makeDb([]), { ...makeAccessControl({}), ...overrides }, workspace, git);
|
|
763
763
|
}
|
|
764
764
|
|
|
765
765
|
it('propagates AccessUnreadableError from the eligibility lookup', async () => {
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
2
2
|
import type { AuthUser } from '@bevel-software/platform-shared';
|
|
3
|
-
import {
|
|
3
|
+
import { ChangeRequestReviewService } from '../change-request-review.service.js';
|
|
4
4
|
import type { Database } from '../../../database/connection.js';
|
|
5
5
|
import type { WorkspaceService } from '../../../workspace/workspace.service.js';
|
|
6
6
|
import type { GitService } from '../../git/git.service.js';
|
|
7
7
|
import type { IAccessControl } from '../../../access/access-control.interface.js';
|
|
8
8
|
import { hashEmail } from '../../../../shared/email-identity.js';
|
|
9
|
-
import {
|
|
9
|
+
import { VersionControlValidationError } from '../../../../shared/domain-errors.js';
|
|
10
10
|
|
|
11
11
|
// Cancel is now a DB state flip (no `gh`): `update(change_requests) … WHERE
|
|
12
12
|
// number = ? AND state = 'open'`. This spy stands in for the update's
|
|
@@ -58,14 +58,14 @@ function makeAccessControl(adminEmails: string[] = []): IAccessControl {
|
|
|
58
58
|
};
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
-
function makeService(accessControl: IAccessControl):
|
|
61
|
+
function makeService(accessControl: IAccessControl): ChangeRequestReviewService {
|
|
62
62
|
// `ensureRemotesFetched` is best-effort (catches errors); the DB stub above
|
|
63
63
|
// stands in for the state-flip update + the race re-read.
|
|
64
64
|
const workspace = { ensureRemotesFetched: async () => undefined } as unknown as WorkspaceService;
|
|
65
|
-
return new
|
|
65
|
+
return new ChangeRequestReviewService(makeDb(), accessControl, workspace, {} as unknown as GitService);
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
-
describe('
|
|
68
|
+
describe('ChangeRequestReviewService.cancelPr', () => {
|
|
69
69
|
beforeEach(() => {
|
|
70
70
|
updateReturning.mockClear();
|
|
71
71
|
updateReturning.mockResolvedValue([{ id: 'cr-1' }]);
|
|
@@ -145,7 +145,7 @@ describe('ReviewWorkflowService.cancelPr', () => {
|
|
|
145
145
|
for (const bad of [0, -1, 1.5, Number.NaN]) {
|
|
146
146
|
await expect(
|
|
147
147
|
svc.cancelPr(bad, USER, 'open', null, 'current-company-state', 'ws-1'),
|
|
148
|
-
).rejects.toBeInstanceOf(
|
|
148
|
+
).rejects.toBeInstanceOf(VersionControlValidationError);
|
|
149
149
|
}
|
|
150
150
|
});
|
|
151
151
|
|
|
@@ -153,10 +153,10 @@ describe('ReviewWorkflowService.cancelPr', () => {
|
|
|
153
153
|
const svc = makeService(makeAccessControl([USER.email]));
|
|
154
154
|
await expect(
|
|
155
155
|
svc.cancelPr(42, USER, 'open', null, '', 'ws-1'),
|
|
156
|
-
).rejects.toBeInstanceOf(
|
|
156
|
+
).rejects.toBeInstanceOf(VersionControlValidationError);
|
|
157
157
|
await expect(
|
|
158
158
|
svc.cancelPr(42, USER, 'open', null, 'current-company-state', ''),
|
|
159
|
-
).rejects.toBeInstanceOf(
|
|
159
|
+
).rejects.toBeInstanceOf(VersionControlValidationError);
|
|
160
160
|
});
|
|
161
161
|
|
|
162
162
|
it('skips the admin lookup when the author check matches', async () => {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { describe, it, expect, vi } from 'vitest';
|
|
2
2
|
import type { PullRequestFile } from '@bevel-software/platform-shared';
|
|
3
|
-
import {
|
|
3
|
+
import { ChangeRequestReviewService } from '../change-request-review.service.js';
|
|
4
4
|
import type { Database } from '../../../database/connection.js';
|
|
5
5
|
import type { WorkspaceService } from '../../../workspace/workspace.service.js';
|
|
6
6
|
import type { GitService } from '../../git/git.service.js';
|
|
@@ -220,7 +220,7 @@ function makeService(
|
|
|
220
220
|
return fn(tx);
|
|
221
221
|
},
|
|
222
222
|
} as unknown as Database;
|
|
223
|
-
const svc = new
|
|
223
|
+
const svc = new ChangeRequestReviewService(
|
|
224
224
|
db,
|
|
225
225
|
{} as unknown as IAccessControl,
|
|
226
226
|
{} as unknown as WorkspaceService,
|
|
@@ -229,7 +229,7 @@ function makeService(
|
|
|
229
229
|
return { svc, db, stored, selected, inserted, order, locked, lockSql };
|
|
230
230
|
}
|
|
231
231
|
|
|
232
|
-
describe('
|
|
232
|
+
describe('ChangeRequestReviewService.carryApprovalsForward', () => {
|
|
233
233
|
it('re-pins only the approvals the merge did not touch, keeping who approved and when', async () => {
|
|
234
234
|
const h = makeService([
|
|
235
235
|
row('Sales/Deal.md'),
|
|
@@ -355,7 +355,7 @@ describe('ReviewWorkflowService.carryApprovalsForward', () => {
|
|
|
355
355
|
* between the copy's select and its insert stayed pinned to the head the
|
|
356
356
|
* update was replacing and vanished from the request it was made on.
|
|
357
357
|
*/
|
|
358
|
-
describe('
|
|
358
|
+
describe('ChangeRequestReviewService.approveFile: written under the same lock', () => {
|
|
359
359
|
const USER = { id: 'u1', email: 'bob@bevel.software', name: 'Bob' };
|
|
360
360
|
const FILES: PullRequestFile[] = [
|
|
361
361
|
{
|
|
@@ -370,7 +370,7 @@ describe('ReviewWorkflowService.approveFile: written under the same lock', () =>
|
|
|
370
370
|
];
|
|
371
371
|
|
|
372
372
|
const approver = (h: ReturnType<typeof makeService>) =>
|
|
373
|
-
new
|
|
373
|
+
new ChangeRequestReviewService(
|
|
374
374
|
h.db,
|
|
375
375
|
{
|
|
376
376
|
canWriteAtRef: async () => true,
|
|
@@ -493,7 +493,7 @@ describe('a carried approval still counts at the new head', () => {
|
|
|
493
493
|
const h = makeService([row('Sales/Deal.md'), row('Sales/Terms.md')]);
|
|
494
494
|
await h.svc.carryApprovalsForward(PR, OLD_HEAD, NEW_HEAD, ['Sales/Deal.md']);
|
|
495
495
|
|
|
496
|
-
const reader = new
|
|
496
|
+
const reader = new ChangeRequestReviewService(
|
|
497
497
|
{
|
|
498
498
|
select: () => ({ from: () => ({ where: () => Promise.resolve(h.stored) }) }),
|
|
499
499
|
} as unknown as Database,
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { describe, it, expect } from 'vitest';
|
|
2
2
|
import type { SQL } from 'drizzle-orm';
|
|
3
3
|
import { PgDialect } from 'drizzle-orm/pg-core';
|
|
4
|
-
import {
|
|
5
|
-
import type { ApprovalTx } from '../review
|
|
4
|
+
import { ChangeRequestReviewService } from '../change-request-review.service.js';
|
|
5
|
+
import type { ApprovalTx } from '../change-request-review.interface.js';
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
|
-
* `eraseApprover` is the review
|
|
8
|
+
* `eraseApprover` is the change-request review's half of account erasure: the rows
|
|
9
9
|
* are this module's, the writers that race the rewrite are this module's, so
|
|
10
10
|
* the lock and the statement live here and erasure only hands over its
|
|
11
11
|
* transaction. This pins what that half must do with it — take the
|
|
@@ -62,11 +62,11 @@ function harness() {
|
|
|
62
62
|
};
|
|
63
63
|
// `eraseApprover` touches nothing but the transaction it is given, so the
|
|
64
64
|
// service's own collaborators are never reached.
|
|
65
|
-
const svc = new
|
|
65
|
+
const svc = new ChangeRequestReviewService({} as never, {} as never, {} as never, {} as never);
|
|
66
66
|
return { svc, tx: tx as unknown as ApprovalTx, order, locked, lockSql, sets, wheres };
|
|
67
67
|
}
|
|
68
68
|
|
|
69
|
-
describe('
|
|
69
|
+
describe('ChangeRequestReviewService.eraseApprover', () => {
|
|
70
70
|
it('takes the every-request lock exclusively, bounded, right before the rewrite', async () => {
|
|
71
71
|
const h = harness();
|
|
72
72
|
await h.svc.eraseApprover(h.tx, 'bob@bevel.software', {
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { describe, it, expect } from 'vitest';
|
|
2
2
|
import type { FileApprovalEntry, FileApprovalState, PullRequestState } from '@bevel-software/platform-shared';
|
|
3
|
-
import {
|
|
3
|
+
import { ChangeRequestReviewService } from '../change-request-review.service.js';
|
|
4
4
|
|
|
5
|
-
function makeService():
|
|
5
|
+
function makeService(): ChangeRequestReviewService {
|
|
6
6
|
// evaluateMergeGate is pure — it never touches the DB, access service, or
|
|
7
7
|
// workspace. Constructing with `undefined as any` for unused deps keeps the
|
|
8
8
|
// test focused on the gate logic and avoids pulling in fixture scaffolding.
|
|
9
|
-
return new
|
|
9
|
+
return new ChangeRequestReviewService(undefined as any, undefined as any, undefined as any, undefined as any);
|
|
10
10
|
}
|
|
11
11
|
|
|
12
12
|
const ADMIN_ELIGIBLE = {
|
|
@@ -2,7 +2,7 @@ import { describe, it, expect, vi } from 'vitest';
|
|
|
2
2
|
|
|
3
3
|
import { PgDialect } from 'drizzle-orm/pg-core';
|
|
4
4
|
import type { SQL } from 'drizzle-orm';
|
|
5
|
-
import {
|
|
5
|
+
import { ChangeRequestReviewService } from '../change-request-review.service.js';
|
|
6
6
|
import { changeRequests, prMergeLog } from '../../../database/schema.js';
|
|
7
7
|
import type { Database } from '../../../database/connection.js';
|
|
8
8
|
import type { WorkspaceService } from '../../../workspace/workspace.service.js';
|
|
@@ -159,7 +159,7 @@ function makeService(mergeResult: AppliedMergeResult) {
|
|
|
159
159
|
ensureRemotesFetched: vi.fn(async () => undefined),
|
|
160
160
|
getOrCreateForBranch: vi.fn(async () => ({ id: 'ws-base' })),
|
|
161
161
|
} as unknown as WorkspaceService;
|
|
162
|
-
const svc = new
|
|
162
|
+
const svc = new ChangeRequestReviewService(
|
|
163
163
|
makeDb(captured),
|
|
164
164
|
{} as unknown as IAccessControl,
|
|
165
165
|
workspace,
|
|
@@ -268,7 +268,7 @@ function makeStuckService(
|
|
|
268
268
|
const workspace = {
|
|
269
269
|
getOrCreateForBranch: vi.fn(async () => ({ id: 'ws-base' })),
|
|
270
270
|
} as unknown as WorkspaceService;
|
|
271
|
-
const svc = new
|
|
271
|
+
const svc = new ChangeRequestReviewService(
|
|
272
272
|
makeDb(captured, { rows, casWon, begunLog }),
|
|
273
273
|
{} as unknown as IAccessControl,
|
|
274
274
|
workspace,
|
|
@@ -45,7 +45,7 @@ export interface MergeGateResult {
|
|
|
45
45
|
* merge; everything in this interface is in-app state
|
|
46
46
|
* the team uses to decide whether the merge should fire.
|
|
47
47
|
*/
|
|
48
|
-
export interface
|
|
48
|
+
export interface IChangeRequestReviewService {
|
|
49
49
|
/**
|
|
50
50
|
* Compose the per-file approval state for a PR detail response. Resolves
|
|
51
51
|
* the eligible approver set against **the PR's base branch on origin**
|
|
@@ -20,16 +20,16 @@ import { mergeCommitSubject } from '../git/merge-commit.js';
|
|
|
20
20
|
import { redactSecret } from '../../../shared/redact-secret.js';
|
|
21
21
|
import {
|
|
22
22
|
ChangeRequestConflictsError,
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
VersionControlDomainError,
|
|
24
|
+
VersionControlValidationError,
|
|
25
25
|
} from '../../../shared/domain-errors.js';
|
|
26
26
|
import type { WorkspaceService } from '../../workspace/index.js';
|
|
27
27
|
import { canonicalEmail, hashEmail } from '../../../shared/email-identity.js';
|
|
28
28
|
import type {
|
|
29
|
-
|
|
29
|
+
IChangeRequestReviewService,
|
|
30
30
|
MergeGateInput,
|
|
31
31
|
MergeGateResult,
|
|
32
|
-
} from './review
|
|
32
|
+
} from './change-request-review.interface.js';
|
|
33
33
|
import {
|
|
34
34
|
APPROVAL_LOCK_TIMEOUT_MS,
|
|
35
35
|
isApprovalLockTimeout,
|
|
@@ -67,7 +67,7 @@ function redactTokens(msg: string, token: string | null | undefined): string {
|
|
|
67
67
|
* let go. Retryable BY THE CALLER, and said in words a business user can act
|
|
68
68
|
* on: nothing was written, and trying again is the whole fix.
|
|
69
69
|
*/
|
|
70
|
-
class ApprovalBusyError extends
|
|
70
|
+
class ApprovalBusyError extends VersionControlDomainError {
|
|
71
71
|
constructor() {
|
|
72
72
|
super(
|
|
73
73
|
'This change request is being updated right now — try that again in a moment.',
|
|
@@ -78,7 +78,7 @@ class ApprovalBusyError extends WorkflowDomainError {
|
|
|
78
78
|
}
|
|
79
79
|
}
|
|
80
80
|
|
|
81
|
-
class MergeBlockedError extends
|
|
81
|
+
class MergeBlockedError extends VersionControlDomainError {
|
|
82
82
|
constructor(reasons: string[]) {
|
|
83
83
|
super(`Merge gate rejected: ${reasons.join('; ') || 'unknown'}`, 422, {
|
|
84
84
|
mergeBlockedReasons: reasons,
|
|
@@ -87,14 +87,14 @@ class MergeBlockedError extends WorkflowDomainError {
|
|
|
87
87
|
}
|
|
88
88
|
}
|
|
89
89
|
|
|
90
|
-
class MergeExecutionError extends
|
|
90
|
+
class MergeExecutionError extends VersionControlDomainError {
|
|
91
91
|
constructor(reason: string) {
|
|
92
92
|
super(`Merge failed: ${reason}`, 502);
|
|
93
93
|
this.name = 'MergeExecutionError';
|
|
94
94
|
}
|
|
95
95
|
}
|
|
96
96
|
|
|
97
|
-
class ApprovalAuthError extends
|
|
97
|
+
class ApprovalAuthError extends VersionControlDomainError {
|
|
98
98
|
constructor(reason: 'not-eligible' | 'no-eligible-approvers' | 'path-not-in-pr') {
|
|
99
99
|
const { status, msg } = {
|
|
100
100
|
'not-eligible': { status: 403, msg: "You don't have write access on this file's path" },
|
|
@@ -115,7 +115,7 @@ class ApprovalAuthError extends WorkflowDomainError {
|
|
|
115
115
|
* Signing in again makes a fresh account at the same address, and approvals
|
|
116
116
|
* made then are that new person's.
|
|
117
117
|
*/
|
|
118
|
-
class ApprovalAccountGoneError extends
|
|
118
|
+
class ApprovalAccountGoneError extends VersionControlDomainError {
|
|
119
119
|
constructor() {
|
|
120
120
|
super('This account no longer exists — sign in again to approve.', 401, {
|
|
121
121
|
kind: 'approval-account-erased',
|
|
@@ -124,7 +124,7 @@ class ApprovalAccountGoneError extends WorkflowDomainError {
|
|
|
124
124
|
}
|
|
125
125
|
}
|
|
126
126
|
|
|
127
|
-
class BypassAuthError extends
|
|
127
|
+
class BypassAuthError extends VersionControlDomainError {
|
|
128
128
|
constructor() {
|
|
129
129
|
super(
|
|
130
130
|
"Only admins can merge with bypass. You need write access to roles.yaml on the base branch to skip approval warnings.",
|
|
@@ -134,7 +134,7 @@ class BypassAuthError extends WorkflowDomainError {
|
|
|
134
134
|
}
|
|
135
135
|
}
|
|
136
136
|
|
|
137
|
-
class CancelStateError extends
|
|
137
|
+
class CancelStateError extends VersionControlDomainError {
|
|
138
138
|
constructor(reason: 'already-applied' | 'already-cancelled') {
|
|
139
139
|
const msg =
|
|
140
140
|
reason === 'already-applied'
|
|
@@ -145,7 +145,7 @@ class CancelStateError extends WorkflowDomainError {
|
|
|
145
145
|
}
|
|
146
146
|
}
|
|
147
147
|
|
|
148
|
-
class CancelAuthError extends
|
|
148
|
+
class CancelAuthError extends VersionControlDomainError {
|
|
149
149
|
constructor() {
|
|
150
150
|
super(
|
|
151
151
|
"You can't cancel this change request — that takes being its author, an admin, " +
|
|
@@ -158,7 +158,7 @@ class CancelAuthError extends WorkflowDomainError {
|
|
|
158
158
|
|
|
159
159
|
function assertValidPrNumber(n: number): void {
|
|
160
160
|
if (!Number.isInteger(n) || n <= 0) {
|
|
161
|
-
throw new
|
|
161
|
+
throw new VersionControlValidationError('PR number must be a positive integer');
|
|
162
162
|
}
|
|
163
163
|
}
|
|
164
164
|
|
|
@@ -236,13 +236,13 @@ function evaluateGateParts(input: MergeGateInput): { hardReasons: string[]; warn
|
|
|
236
236
|
|
|
237
237
|
function assertValidPath(p: unknown): asserts p is string | undefined {
|
|
238
238
|
if (p === undefined || p === null) return;
|
|
239
|
-
if (typeof p !== 'string') throw new
|
|
240
|
-
if (!p) throw new
|
|
241
|
-
if (p.length > 4096) throw new
|
|
242
|
-
if (p.includes('\0')) throw new
|
|
239
|
+
if (typeof p !== 'string') throw new VersionControlValidationError('path must be a string');
|
|
240
|
+
if (!p) throw new VersionControlValidationError('path, if provided, must be non-empty');
|
|
241
|
+
if (p.length > 4096) throw new VersionControlValidationError('path exceeds 4096 character limit');
|
|
242
|
+
if (p.includes('\0')) throw new VersionControlValidationError('path contains NUL');
|
|
243
243
|
}
|
|
244
244
|
|
|
245
|
-
export class
|
|
245
|
+
export class ChangeRequestReviewService implements IChangeRequestReviewService {
|
|
246
246
|
constructor(
|
|
247
247
|
private readonly db: Database,
|
|
248
248
|
private readonly accessControl: IAccessControl,
|
|
@@ -394,8 +394,8 @@ export class ReviewWorkflowService implements IReviewWorkflowService {
|
|
|
394
394
|
): Promise<FileApprovalState[]> {
|
|
395
395
|
assertValidPrNumber(prNumber);
|
|
396
396
|
assertValidPath(path);
|
|
397
|
-
if (!headSha) throw new
|
|
398
|
-
if (!baseBranch) throw new
|
|
397
|
+
if (!headSha) throw new VersionControlValidationError('head sha is required');
|
|
398
|
+
if (!baseBranch) throw new VersionControlValidationError('base branch is required');
|
|
399
399
|
|
|
400
400
|
if (!files.some((f) => f.path === path)) {
|
|
401
401
|
throw new ApprovalAuthError('path-not-in-pr');
|
|
@@ -513,9 +513,9 @@ export class ReviewWorkflowService implements IReviewWorkflowService {
|
|
|
513
513
|
opts: { bypass?: boolean } = {},
|
|
514
514
|
): Promise<MergePrResult> {
|
|
515
515
|
assertValidPrNumber(prNumber);
|
|
516
|
-
if (!headSha) throw new
|
|
517
|
-
if (!baseBranch) throw new
|
|
518
|
-
if (!workspaceId) throw new
|
|
516
|
+
if (!headSha) throw new VersionControlValidationError('head sha is required');
|
|
517
|
+
if (!baseBranch) throw new VersionControlValidationError('base branch is required');
|
|
518
|
+
if (!workspaceId) throw new VersionControlValidationError('workspace id is required');
|
|
519
519
|
|
|
520
520
|
// Server-side re-validation — never trust the frontend's cached gate.
|
|
521
521
|
// Hard blocks always refuse. Missing approvals refuse unless the caller
|
|
@@ -562,7 +562,7 @@ export class ReviewWorkflowService implements IReviewWorkflowService {
|
|
|
562
562
|
.from(changeRequests)
|
|
563
563
|
.where(eq(changeRequests.number, prNumber))
|
|
564
564
|
.limit(1);
|
|
565
|
-
if (!cr) throw new
|
|
565
|
+
if (!cr) throw new VersionControlValidationError(`Change request #${prNumber} not found`);
|
|
566
566
|
// Re-validate lifecycle against the AUTHORITATIVE row, not the caller's
|
|
567
567
|
// `state` (which only drove the gate). A stale or duplicate request must not
|
|
568
568
|
// re-run the git merge on a CR that's already merged or closed.
|
|
@@ -837,8 +837,8 @@ export class ReviewWorkflowService implements IReviewWorkflowService {
|
|
|
837
837
|
workspaceId: string,
|
|
838
838
|
): Promise<CancelPrResult> {
|
|
839
839
|
assertValidPrNumber(prNumber);
|
|
840
|
-
if (!baseBranch) throw new
|
|
841
|
-
if (!workspaceId) throw new
|
|
840
|
+
if (!baseBranch) throw new VersionControlValidationError('base branch is required');
|
|
841
|
+
if (!workspaceId) throw new VersionControlValidationError('workspace id is required');
|
|
842
842
|
|
|
843
843
|
// Refuse early on terminal states so the gh call only fires for genuinely
|
|
844
844
|
// open PRs. Two distinct 422s — frontend distinguishes "already applied"
|
|
@@ -938,7 +938,7 @@ export class ReviewWorkflowService implements IReviewWorkflowService {
|
|
|
938
938
|
): Promise<number> {
|
|
939
939
|
assertValidPrNumber(prNumber);
|
|
940
940
|
if (!fromHeadSha || !toHeadSha) {
|
|
941
|
-
throw new
|
|
941
|
+
throw new VersionControlValidationError('both head shas are required');
|
|
942
942
|
}
|
|
943
943
|
if (fromHeadSha === toHeadSha) return 0;
|
|
944
944
|
|
|
@@ -1023,7 +1023,7 @@ export class ReviewWorkflowService implements IReviewWorkflowService {
|
|
|
1023
1023
|
): Promise<FileApprovalState[]> {
|
|
1024
1024
|
assertValidPrNumber(prNumber);
|
|
1025
1025
|
assertValidPath(path);
|
|
1026
|
-
if (!headSha) throw new
|
|
1026
|
+
if (!headSha) throw new VersionControlValidationError('head sha is required');
|
|
1027
1027
|
|
|
1028
1028
|
const callerEmail = canonicalEmail(user.email);
|
|
1029
1029
|
|