@bevel-software/platform-core-backend 0.34.0 → 0.36.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/agent-guide/access-control.md +146 -300
- package/agent-guide/conventions.md +23 -25
- package/agent-guide/directory-structure.md +72 -120
- package/agent-guide/drafts-and-change-requests.md +92 -0
- package/agent-guide/for-git-users.md +47 -0
- package/agent-guide/glossary.md +36 -0
- package/agent-guide/how-agents-find-things.md +49 -0
- package/agent-guide/html-views.md +16 -11
- package/agent-guide/new-knowledge-base.md +9 -8
- package/agent-guide/onboarding.md +111 -0
- package/agent-guide/skills.md +67 -42
- package/agent-guide/start-here.md +66 -0
- package/agent-guide/tool-manuals.md +133 -154
- package/agent-guide/tools.md +67 -0
- package/agent-guide/where-a-new-file-goes.md +45 -28
- 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 +27 -25
- package/dist/core/create-core-server.js.map +1 -1
- package/dist/core/create-core-services.d.ts +25 -13
- package/dist/core/create-core-services.d.ts.map +1 -1
- package/dist/core/create-core-services.js +75 -60
- 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.interface.d.ts +22 -0
- package/dist/modules/access/access-control.interface.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.d.ts +3 -1
- package/dist/modules/access/access-control.service.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.js +76 -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 +32 -13
- 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/index.d.ts +1 -1
- package/dist/modules/access/index.d.ts.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 +63 -18
- package/dist/modules/agent-guide/agent-guide.d.ts.map +1 -1
- package/dist/modules/agent-guide/agent-guide.js +144 -30
- package/dist/modules/agent-guide/agent-guide.js.map +1 -1
- package/dist/modules/agent-guide/agent-guide.tools.d.ts +6 -2
- package/dist/modules/agent-guide/agent-guide.tools.d.ts.map +1 -1
- package/dist/modules/agent-guide/agent-guide.tools.js +45 -31
- package/dist/modules/agent-guide/agent-guide.tools.js.map +1 -1
- package/dist/modules/agent-guide/guide-budget.d.ts +51 -0
- package/dist/modules/agent-guide/guide-budget.d.ts.map +1 -0
- package/dist/modules/agent-guide/guide-budget.js +71 -0
- package/dist/modules/agent-guide/guide-budget.js.map +1 -0
- package/dist/modules/agent-guide/index.d.ts +2 -1
- package/dist/modules/agent-guide/index.d.ts.map +1 -1
- package/dist/modules/agent-guide/index.js +2 -1
- package/dist/modules/agent-guide/index.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 +28 -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 +60 -18
- 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/code-mode/code-mode.tool.js +2 -2
- package/dist/modules/code-mode/code-mode.tool.js.map +1 -1
- package/dist/modules/connection-probe/connection-probe.service.d.ts +0 -12
- package/dist/modules/connection-probe/connection-probe.service.d.ts.map +1 -1
- package/dist/modules/connection-probe/connection-probe.service.js +1 -38
- package/dist/modules/connection-probe/connection-probe.service.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 +2 -2
- package/dist/modules/kb-fs/locking-filesystem.d.ts +9 -9
- package/dist/modules/kb-fs/locking-filesystem.d.ts.map +1 -1
- package/dist/modules/kb-fs/locking-filesystem.js +27 -27
- package/dist/modules/kb-fs/locking-filesystem.js.map +1 -1
- package/dist/modules/kb-fs/repo-path.js +5 -5
- package/dist/modules/kb-fs/repo-path.js.map +1 -1
- package/dist/modules/kb-fs/tmp-ref.d.ts +2 -2
- package/dist/modules/kb-fs/tmp-ref.d.ts.map +1 -1
- package/dist/modules/kb-fs/tmp-ref.js +2 -2
- package/dist/modules/kb-fs/tmp-ref.js.map +1 -1
- package/dist/modules/kb-sync/index.d.ts +1 -1
- package/dist/modules/kb-sync/index.d.ts.map +1 -1
- package/dist/modules/kb-sync/kb-sync.interface.d.ts +3 -3
- package/dist/modules/kb-sync/kb-sync.interface.d.ts.map +1 -1
- package/dist/modules/kb-sync/kb-sync.service.d.ts +3 -3
- package/dist/modules/kb-sync/kb-sync.service.d.ts.map +1 -1
- package/dist/modules/kb-sync/kb-sync.service.js +10 -10
- package/dist/modules/kb-sync/kb-sync.service.js.map +1 -1
- package/dist/modules/mcp/mcp.service.d.ts +11 -4
- package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
- package/dist/modules/mcp/mcp.service.js +80 -53
- package/dist/modules/mcp/mcp.service.js.map +1 -1
- package/dist/modules/onboarding/onboarding.contract.d.ts +1 -1
- package/dist/modules/onboarding/onboarding.routes.js +2 -2
- package/dist/modules/onboarding/onboarding.routes.js.map +1 -1
- package/dist/modules/onboarding/starter-pack.service.d.ts +4 -4
- package/dist/modules/onboarding/starter-pack.service.d.ts.map +1 -1
- package/dist/modules/onboarding/starter-pack.service.js +4 -4
- package/dist/modules/onboarding/starter-pack.service.js.map +1 -1
- package/dist/modules/plugins/join-request-jobs.service.d.ts +2 -2
- package/dist/modules/plugins/join-request-jobs.service.d.ts.map +1 -1
- package/dist/modules/plugins/join-request-jobs.service.js +7 -7
- package/dist/modules/plugins/join-request-jobs.service.js.map +1 -1
- package/dist/modules/plugins/join-requests.service.d.ts +3 -3
- package/dist/modules/plugins/join-requests.service.d.ts.map +1 -1
- package/dist/modules/plugins/join-requests.service.js +5 -5
- package/dist/modules/plugins/join-requests.service.js.map +1 -1
- package/dist/modules/plugins/plugin-rename.service.js +1 -1
- package/dist/modules/plugins/plugin-rename.service.js.map +1 -1
- package/dist/modules/plugins/plugins.routes.d.ts +2 -2
- package/dist/modules/plugins/plugins.routes.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.routes.js +8 -8
- package/dist/modules/plugins/plugins.routes.js.map +1 -1
- package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts +87 -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 +635 -74
- package/dist/modules/secrets-vault/db-secrets-vault.service.js.map +1 -1
- package/dist/modules/secrets-vault/index.d.ts +3 -2
- package/dist/modules/secrets-vault/index.d.ts.map +1 -1
- package/dist/modules/secrets-vault/index.js +2 -1
- 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 +205 -11
- package/dist/modules/secrets-vault/secrets-vault.contract.d.ts.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.contract.js +27 -0
- 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 +206 -45
- 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/oidc-check.d.ts.map +1 -1
- package/dist/modules/settings/oidc-check.js +5 -17
- package/dist/modules/settings/oidc-check.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/skills/skills.tools.js +1 -1
- package/dist/modules/skills/skills.tools.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-def.js +1 -1
- package/dist/modules/tool-helpers/tool-def.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-json-discovery.d.ts +7 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.d.ts.map +1 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.js +69 -38
- package/dist/modules/tool-manuals/mcp-json-discovery.js.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 +70 -3
- package/dist/modules/tool-manuals/tool-manuals.contract.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts +18 -8
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.js +166 -49
- package/dist/modules/tool-manuals/tool-manuals.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts +11 -2
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.js +66 -24
- 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} +53 -49
- package/dist/modules/version-control/agent-tools/version-control.tools.js.map +1 -0
- package/dist/modules/{workflow → version-control}/change-request-hooks.d.ts +1 -1
- package/dist/modules/version-control/change-request-hooks.d.ts.map +1 -0
- package/dist/modules/version-control/change-request-hooks.js.map +1 -0
- package/dist/modules/version-control/change-request-review/approval-lock.d.ts.map +1 -0
- package/dist/modules/version-control/change-request-review/approval-lock.js.map +1 -0
- package/dist/modules/{workflow/review-workflow/review-workflow.interface.d.ts → version-control/change-request-review/change-request-review.interface.d.ts} +2 -2
- package/dist/modules/version-control/change-request-review/change-request-review.interface.d.ts.map +1 -0
- package/dist/modules/version-control/change-request-review/change-request-review.interface.js +2 -0
- package/dist/modules/version-control/change-request-review/change-request-review.interface.js.map +1 -0
- package/dist/modules/{workflow/review-workflow/review-workflow.service.d.ts → version-control/change-request-review/change-request-review.service.d.ts} +3 -3
- package/dist/modules/version-control/change-request-review/change-request-review.service.d.ts.map +1 -0
- package/dist/modules/{workflow/review-workflow/review-workflow.service.js → version-control/change-request-review/change-request-review.service.js} +26 -26
- package/dist/modules/version-control/change-request-review/change-request-review.service.js.map +1 -0
- package/dist/modules/{workflow → version-control}/event-bus.d.ts +8 -8
- package/dist/modules/version-control/event-bus.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/event-bus.js +4 -4
- package/dist/modules/version-control/event-bus.js.map +1 -0
- package/dist/modules/{workflow → version-control}/events-delivery.d.ts +4 -4
- package/dist/modules/version-control/events-delivery.d.ts.map +1 -0
- package/dist/modules/version-control/events-delivery.js.map +1 -0
- package/dist/modules/{workflow → version-control}/events.routes.d.ts +4 -4
- package/dist/modules/version-control/events.routes.d.ts.map +1 -0
- package/dist/modules/version-control/events.routes.js.map +1 -0
- package/dist/modules/{workflow → version-control}/file-lock.service.d.ts +2 -2
- package/dist/modules/version-control/file-lock.service.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/file-lock.service.js +6 -6
- package/dist/modules/version-control/file-lock.service.js.map +1 -0
- package/dist/modules/version-control/git/change-request-link.d.ts.map +1 -0
- package/dist/modules/version-control/git/change-request-link.js.map +1 -0
- package/dist/modules/version-control/git/git-version.d.ts.map +1 -0
- package/dist/modules/version-control/git/git-version.js.map +1 -0
- package/dist/modules/{workflow → version-control}/git/git.service.d.ts +8 -8
- package/dist/modules/version-control/git/git.service.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/git/git.service.js +53 -53
- package/dist/modules/version-control/git/git.service.js.map +1 -0
- package/dist/modules/version-control/git/merge-commit.d.ts.map +1 -0
- package/dist/modules/version-control/git/merge-commit.js.map +1 -0
- package/dist/modules/version-control/git/node-git-runner.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/git/node-git-runner.js +1 -1
- package/dist/modules/version-control/git/node-git-runner.js.map +1 -0
- package/dist/modules/{workflow → version-control}/git/pull-request.service.d.ts +5 -5
- package/dist/modules/version-control/git/pull-request.service.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/git/pull-request.service.js +10 -10
- package/dist/modules/version-control/git/pull-request.service.js.map +1 -0
- package/dist/modules/{workflow → version-control}/index.d.ts +6 -5
- package/dist/modules/version-control/index.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/index.js +3 -2
- package/dist/modules/version-control/index.js.map +1 -0
- package/dist/modules/{workflow → version-control}/pending-commits.service.d.ts +2 -2
- package/dist/modules/version-control/pending-commits.service.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/pending-commits.service.js +2 -2
- package/dist/modules/version-control/pending-commits.service.js.map +1 -0
- package/dist/modules/{workflow → version-control}/pending-commits.worker.d.ts +5 -5
- package/dist/modules/version-control/pending-commits.worker.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/pending-commits.worker.js +3 -3
- package/dist/modules/version-control/pending-commits.worker.js.map +1 -0
- package/dist/modules/{workflow → version-control}/read-on-branch.d.ts +2 -2
- package/dist/modules/version-control/read-on-branch.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/read-on-branch.js +2 -2
- package/dist/modules/version-control/read-on-branch.js.map +1 -0
- package/dist/modules/version-control/recovery-bot.d.ts.map +1 -0
- package/dist/modules/version-control/recovery-bot.js.map +1 -0
- package/dist/modules/version-control/sanitize-error.d.ts.map +1 -0
- package/dist/modules/version-control/sanitize-error.js.map +1 -0
- package/dist/modules/{workflow/workflow-hooks.d.ts → version-control/version-control-hooks.d.ts} +4 -4
- package/dist/modules/version-control/version-control-hooks.d.ts.map +1 -0
- package/dist/modules/{workflow/workflow-hooks.js → version-control/version-control-hooks.js} +3 -3
- package/dist/modules/version-control/version-control-hooks.js.map +1 -0
- package/dist/modules/{workflow/workflow.routes.d.ts → version-control/version-control.routes.d.ts} +6 -5
- package/dist/modules/version-control/version-control.routes.d.ts.map +1 -0
- package/dist/modules/{workflow/workflow.routes.js → version-control/version-control.routes.js} +61 -60
- package/dist/modules/version-control/version-control.routes.js.map +1 -0
- package/dist/modules/{workflow/workflow.service.d.ts → version-control/version-control.service.d.ts} +26 -31
- package/dist/modules/version-control/version-control.service.d.ts.map +1 -0
- package/dist/modules/{workflow/workflow.service.js → version-control/version-control.service.js} +89 -94
- package/dist/modules/version-control/version-control.service.js.map +1 -0
- package/dist/modules/workspace/agent-access.gate.d.ts +6 -6
- package/dist/modules/workspace/agent-access.gate.d.ts.map +1 -1
- package/dist/modules/workspace/agent-access.gate.js +2 -2
- package/dist/modules/workspace/agent-access.gate.js.map +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 +5 -3
- package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.tools.js +85 -30
- package/dist/modules/workspace/workspace.tools.js.map +1 -1
- package/dist/shared/canonical-file-identity.d.ts +2 -2
- package/dist/shared/canonical-file-identity.js +5 -5
- package/dist/shared/canonical-file-identity.js.map +1 -1
- package/dist/shared/domain-errors.d.ts +39 -39
- package/dist/shared/domain-errors.d.ts.map +1 -1
- package/dist/shared/domain-errors.js +44 -44
- package/dist/shared/domain-errors.js.map +1 -1
- package/dist/shared/git.contract.d.ts +1 -1
- package/dist/shared/git.contract.js +1 -1
- package/dist/shared/http-errors.d.ts +3 -3
- package/dist/shared/http-errors.d.ts.map +1 -1
- package/dist/shared/http-errors.js +1 -1
- package/dist/shared/http-errors.js.map +1 -1
- package/dist/shared/oauth-token-error.d.ts +23 -0
- package/dist/shared/oauth-token-error.d.ts.map +1 -0
- package/dist/shared/oauth-token-error.js +47 -0
- package/dist/shared/oauth-token-error.js.map +1 -0
- 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/shared/read-capped.d.ts +19 -0
- package/dist/shared/read-capped.d.ts.map +1 -0
- package/dist/shared/read-capped.js +45 -0
- package/dist/shared/read-capped.js.map +1 -0
- 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 +5 -4
- package/src/__tests__/account-admin.ts +27 -0
- package/src/__tests__/hexis-catalog.ts +144 -0
- 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-disk.ts +21 -0
- package/src/__tests__/tokens.ts +19 -0
- package/src/__tests__/tool-handler.ts +15 -0
- package/src/__tests__/tool-manuals.ts +32 -0
- package/src/__tests__/tool-wiring.ts +31 -0
- package/src/__tests__/workspace-service.ts +1 -1
- package/src/core/__tests__/catalog-cache-invalidation.test.ts +3 -3
- package/src/core/__tests__/compose-embed.test.ts +1 -1
- package/src/core/__tests__/damaged-document.tools.test.ts +3 -3
- package/src/core/__tests__/erasure-slices-wired-once.test.ts +46 -0
- package/src/core/__tests__/gated-boot.test.ts +2 -2
- package/src/core/__tests__/lifecycle.test.ts +9 -9
- package/src/core/__tests__/oauth-sign-in-real-file.test.ts +179 -0
- 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 +40 -26
- package/src/core/create-core-services.ts +92 -66
- package/src/core/lifecycle.ts +9 -9
- package/src/core-config.ts +3 -3
- package/src/index.ts +5 -5
- package/src/modules/access/__tests__/access-control.admin-root-floor.test.ts +4 -4
- package/src/modules/access/__tests__/access-own-read-grant.test.ts +14 -14
- package/src/modules/access/__tests__/access-requests.routes.test.ts +20 -20
- package/src/modules/access/__tests__/access.routes.admins.test.ts +4 -4
- package/src/modules/access/__tests__/access.routes.batch.test.ts +4 -4
- package/src/modules/access/__tests__/access.routes.folder-governs.test.ts +6 -6
- package/src/modules/access/__tests__/access.routes.group-grant.test.ts +6 -6
- package/src/modules/access/__tests__/access.routes.overrides.test.ts +5 -5
- package/src/modules/access/__tests__/access.routes.proposal-branch.test.ts +6 -6
- package/src/modules/access/__tests__/access.routes.prospective.test.ts +54 -14
- package/src/modules/access/__tests__/access.routes.revoke.test.ts +6 -6
- package/src/modules/access/__tests__/access.routes.unknown-email.test.ts +6 -6
- package/src/modules/access/__tests__/admin-locked-commit.test.ts +6 -6
- package/src/modules/access/__tests__/admin-route-helpers.test.ts +5 -5
- package/src/modules/access/__tests__/groups-admin.service.test.ts +27 -27
- package/src/modules/access/__tests__/holder-changes.test.ts +127 -0
- package/src/modules/access/__tests__/roles-admin.security.test.ts +14 -13
- package/src/modules/access/__tests__/roles-admin.service.test.ts +27 -27
- package/src/modules/access/__tests__/roles-capabilities.test.ts +19 -19
- package/src/modules/access/__tests__/roles.routes.test.ts +6 -6
- package/src/modules/access/__tests__/synced-groups-committer.test.ts +13 -13
- package/src/modules/access/__tests__/user-access-removal.service.test.ts +29 -29
- package/src/modules/access/access-control.interface.ts +26 -0
- package/src/modules/access/access-control.service.ts +93 -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 +34 -15
- 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/index.ts +1 -1
- 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 +98 -29
- package/src/modules/agent-guide/__tests__/agent-guide.tools.test.ts +39 -12
- package/src/modules/agent-guide/__tests__/guide-budget.test.ts +95 -0
- package/src/modules/agent-guide/__tests__/guide-eval.test.ts +182 -0
- package/src/modules/agent-guide/__tests__/guide-matches-code.test.ts +263 -0
- package/src/modules/agent-guide/__tests__/tool-surface.json +514 -0
- package/src/modules/agent-guide/__tests__/tool-surface.test.ts +75 -0
- package/src/modules/agent-guide/agent-guide.tools.ts +49 -31
- package/src/modules/agent-guide/agent-guide.ts +165 -32
- package/src/modules/agent-guide/guide-budget.ts +77 -0
- package/src/modules/agent-guide/index.ts +12 -0
- 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 +117 -11
- package/src/modules/agent-instructions/agent-instructions.routes.ts +12 -5
- package/src/modules/agent-instructions/compose.ts +28 -9
- package/src/modules/agent-instructions/shared-file-rules.ts +62 -18
- 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/code-mode/code-mode.tool.ts +2 -2
- package/src/modules/connection-probe/__tests__/connection-probe.service.test.ts +5 -24
- package/src/modules/connection-probe/connection-probe.service.ts +1 -34
- package/src/modules/database/__tests__/advisory-lock.test.ts +169 -169
- package/src/modules/database/__tests__/migrations-unqualified.test.ts +32 -32
- package/src/modules/database/core-schema.ts +2 -2
- package/src/modules/diff/__tests__/diff.routes.read-gate.test.ts +2 -2
- package/src/modules/diff/__tests__/diff.routes.rejectPathsLocked.test.ts +12 -12
- package/src/modules/diff/diff.routes.ts +8 -8
- package/src/modules/embed/__tests__/embed.service.lock.test.ts +7 -7
- package/src/modules/embed/__tests__/embed.service.test.ts +42 -42
- package/src/modules/embed/__tests__/embed.tools.test.ts +1 -1
- package/src/modules/embed/embed.routes.ts +1 -1
- package/src/modules/embed/embed.service.ts +17 -17
- package/src/modules/kb-fs/__tests__/branch-name.test.ts +2 -2
- package/src/modules/kb-fs/__tests__/locking-filesystem.test.ts +260 -260
- package/src/modules/kb-fs/__tests__/move-with-edits.test.ts +34 -34
- package/src/modules/kb-fs/__tests__/repo-path.test.ts +8 -8
- package/src/modules/kb-fs/branch-name.ts +8 -8
- package/src/modules/kb-fs/file-change-notifier.ts +2 -2
- package/src/modules/kb-fs/locking-filesystem.ts +30 -30
- package/src/modules/kb-fs/repo-path.ts +5 -5
- package/src/modules/kb-fs/tmp-ref.ts +3 -3
- package/src/modules/kb-sync/__tests__/kb-sync.service.test.ts +36 -36
- package/src/modules/kb-sync/index.ts +1 -1
- package/src/modules/kb-sync/kb-sync.interface.ts +3 -3
- package/src/modules/kb-sync/kb-sync.service.ts +9 -9
- package/src/modules/marketplace/__tests__/github-facade.test.ts +1 -1
- package/src/modules/marketplace/__tests__/marketplace-git.test.ts +1 -1
- package/src/modules/mcp/__tests__/mcp-proxy-helpers.test.ts +4 -2
- package/src/modules/mcp/__tests__/mcp.e2e.test.ts +69 -8
- package/src/modules/mcp/__tests__/mcp.service.test.ts +91 -13
- package/src/modules/mcp/__tests__/read-only-hint.pg.test.ts +194 -0
- package/src/modules/mcp/mcp.service.ts +93 -62
- package/src/modules/onboarding/__tests__/starter-pack.service.test.ts +55 -55
- package/src/modules/onboarding/onboarding.contract.ts +1 -1
- package/src/modules/onboarding/onboarding.routes.ts +2 -2
- package/src/modules/onboarding/starter-pack.service.ts +6 -6
- package/src/modules/plugins/__tests__/bundle-dialect.e2e.test.ts +1 -1
- package/src/modules/plugins/__tests__/compile-marketplace.test.ts +1 -1
- package/src/modules/plugins/__tests__/join-request-jobs.service.test.ts +43 -43
- package/src/modules/plugins/__tests__/join-requests.service.test.ts +19 -19
- package/src/modules/plugins/__tests__/join-requests.settlement.test.ts +26 -26
- package/src/modules/plugins/__tests__/plugins.routes.test.ts +25 -25
- package/src/modules/plugins/join-request-jobs.service.ts +10 -10
- package/src/modules/plugins/join-requests.service.ts +4 -4
- package/src/modules/plugins/plugin-rename.service.ts +1 -1
- package/src/modules/plugins/plugins.routes.ts +9 -9
- package/src/modules/secrets-vault/__tests__/db-secrets-vault.managed.test.ts +773 -0
- package/src/modules/secrets-vault/__tests__/db-secrets-vault.oauth.test.ts +458 -4
- package/src/modules/secrets-vault/__tests__/managed-sign-in.route.test.ts +351 -0
- package/src/modules/secrets-vault/__tests__/oauth-live-declaration.route.test.ts +218 -0
- package/src/modules/secrets-vault/__tests__/oauth-return-to.route.test.ts +39 -6
- package/src/modules/secrets-vault/db-secrets-vault.service.ts +728 -118
- package/src/modules/secrets-vault/index.ts +8 -1
- 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 +213 -11
- package/src/modules/secrets-vault/secrets-vault.routes.ts +244 -45
- 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/oidc-check.ts +5 -18
- 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/skills/skills.tools.ts +1 -1
- package/src/modules/tool-helpers/__tests__/agent-roles-write.test.ts +22 -14
- 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__/route-tool-schemas.catalog.test.ts +38 -0
- 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-def.ts +1 -1
- 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.mcp-oauth.test.ts +197 -11
- package/src/modules/tool-manuals/__tests__/tool-manuals.restart.test.ts +1 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.tools.test.ts +132 -6
- package/src/modules/tool-manuals/mcp-json-discovery.ts +73 -34
- 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 +63 -3
- package/src/modules/tool-manuals/tool-manuals.service.ts +191 -51
- package/src/modules/tool-manuals/tool-manuals.tools.ts +93 -28
- 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 +12 -119
- package/src/modules/{workflow → version-control}/__tests__/apply-failure.test.ts +54 -54
- package/src/modules/{workflow → version-control}/__tests__/event-bus.test.ts +27 -27
- package/src/modules/{workflow → version-control}/__tests__/events-delivery.test.ts +37 -37
- package/src/modules/{workflow → version-control}/__tests__/file-lock.service.deletion-gate.test.ts +2 -2
- package/src/modules/{workflow → version-control}/__tests__/file-lock.service.path-identity.test.ts +8 -8
- package/src/modules/{workflow → version-control}/__tests__/merge-announces-tree.test.ts +11 -11
- package/src/modules/{workflow → version-control}/__tests__/pending-commits.worker.concurrency.test.ts +9 -9
- package/src/modules/{workflow → version-control}/__tests__/pending-commits.worker.test.ts +25 -25
- package/src/modules/{workflow → version-control}/__tests__/preserve-roles-yaml.test.ts +42 -42
- package/src/modules/version-control/__tests__/public-surface.test.ts +114 -0
- package/src/modules/{workflow/__tests__/workflow.routes.folder-proposals.test.ts → version-control/__tests__/version-control.routes.folder-proposals.test.ts} +18 -18
- package/src/modules/{workflow/__tests__/workflow.routes.fork-point-file.test.ts → version-control/__tests__/version-control.routes.fork-point-file.test.ts} +19 -19
- package/src/modules/{workflow/__tests__/workflow.routes.history-read-gate.test.ts → version-control/__tests__/version-control.routes.history-read-gate.test.ts} +13 -13
- package/src/modules/{workflow/__tests__/workflow.routes.lock-path.test.ts → version-control/__tests__/version-control.routes.lock-path.test.ts} +18 -18
- package/src/modules/{workflow/__tests__/workflow.routes.open-change-request.test.ts → version-control/__tests__/version-control.routes.open-change-request.test.ts} +7 -7
- package/src/modules/{workflow/__tests__/workflow.routes.push-refused.test.ts → version-control/__tests__/version-control.routes.push-refused.test.ts} +14 -14
- package/src/modules/{workflow/__tests__/workflow.service.branch-in-use.test.ts → version-control/__tests__/version-control.service.branch-in-use.test.ts} +6 -6
- package/src/modules/{workflow/__tests__/workflow.service.commitFileWhileLocked.test.ts → version-control/__tests__/version-control.service.commitFileWhileLocked.test.ts} +14 -14
- package/src/modules/{workflow/__tests__/workflow.service.delete-branch.test.ts → version-control/__tests__/version-control.service.delete-branch.test.ts} +14 -14
- package/src/modules/{workflow/__tests__/workflow.service.deleted-branch-sweep.test.ts → version-control/__tests__/version-control.service.deleted-branch-sweep.test.ts} +4 -4
- package/src/modules/{workflow/__tests__/workflow.service.facade.test.ts → version-control/__tests__/version-control.service.facade.test.ts} +97 -99
- package/src/modules/{workflow/__tests__/workflow.service.folder-proposals.test.ts → version-control/__tests__/version-control.service.folder-proposals.test.ts} +7 -7
- package/src/modules/{workflow/__tests__/workflow.service.platform-restore.test.ts → version-control/__tests__/version-control.service.platform-restore.test.ts} +6 -6
- package/src/modules/{workflow/__tests__/workflow.service.read-gate.test.ts → version-control/__tests__/version-control.service.read-gate.test.ts} +9 -9
- package/src/modules/{workflow/__tests__/workflow.service.releaseLock.test.ts → version-control/__tests__/version-control.service.releaseLock.test.ts} +42 -42
- package/src/modules/{workflow/__tests__/workflow.service.repository-replaced.test.ts → version-control/__tests__/version-control.service.repository-replaced.test.ts} +4 -4
- package/src/modules/{workflow/__tests__/workflow.service.sync.test.ts → version-control/__tests__/version-control.service.sync.test.ts} +17 -17
- package/src/modules/{workflow/__tests__/workflow.service.update-change-request.pg.test.ts → version-control/__tests__/version-control.service.update-change-request.pg.test.ts} +6 -6
- package/src/modules/{workflow/__tests__/workflow.service.update-change-request.test.ts → version-control/__tests__/version-control.service.update-change-request.test.ts} +11 -11
- package/src/modules/{workflow/__tests__/workflow.service.update-from-target.test.ts → version-control/__tests__/version-control.service.update-from-target.test.ts} +22 -22
- package/src/modules/{workflow → version-control}/agent-tools/__tests__/change-request-read.tools.test.ts +3 -3
- package/src/modules/{workflow → version-control}/agent-tools/__tests__/update-change-request.parity.test.ts +16 -16
- package/src/modules/{workflow/agent-tools/__tests__/workflow.tools.test.ts → version-control/agent-tools/__tests__/version-control.tools.test.ts} +9 -9
- package/src/modules/{workflow → version-control}/agent-tools/change-request-read.tools.ts +2 -2
- package/src/modules/{workflow/agent-tools/workflow.tools.ts → version-control/agent-tools/version-control.tools.ts} +52 -48
- package/src/modules/{workflow → version-control}/change-request-hooks.ts +1 -1
- package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/approval-states.test.ts +5 -5
- package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/cancel-pr.test.ts +8 -8
- package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/carry-approvals-forward.test.ts +6 -6
- package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/erase-approver.test.ts +5 -5
- package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/merge-gate.test.ts +3 -3
- package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/merge-records-own-commit.test.ts +3 -3
- package/src/modules/{workflow/review-workflow/review-workflow.interface.ts → version-control/change-request-review/change-request-review.interface.ts} +1 -1
- package/src/modules/{workflow/review-workflow/review-workflow.service.ts → version-control/change-request-review/change-request-review.service.ts} +28 -28
- package/src/modules/{workflow → version-control}/event-bus.ts +14 -14
- package/src/modules/{workflow → version-control}/events-delivery.ts +11 -11
- package/src/modules/{workflow → version-control}/events.routes.ts +5 -5
- package/src/modules/{workflow → version-control}/file-lock.service.ts +6 -6
- package/src/modules/{workflow → version-control}/git/__tests__/git-test-helpers.ts +3 -3
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.accessGating.test.ts +5 -5
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.appliedChange.test.ts +4 -4
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.changedFilesForPr.test.ts +16 -16
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.changedPathsMemo.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.commitChanges.test.ts +3 -3
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.commitFile.strayPath.test.ts +10 -10
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.commitFile.test.ts +3 -3
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.createBranch.test.ts +3 -3
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.deleteBranch.test.ts +7 -7
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.diffFileAtCommit.test.ts +9 -9
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.diffFileBetweenBranches.test.ts +23 -23
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.fileBytesAtCommit.test.ts +7 -7
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.fileContentsAtCommit.test.ts +3 -3
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.forkPoint.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.history-guards.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.list-branches.test.ts +12 -12
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.listTrackedFiles.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.logForFile.test.ts +6 -6
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.mergeChangeRequest.test.ts +20 -20
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.mergeIntoBranch.test.ts +16 -16
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.pendingChanges.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.postMergePull.test.ts +5 -5
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.prFetchFailure.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.pull.test.ts +12 -12
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.readFileAtRef.test.ts +3 -3
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.revertPathsAndPush.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.status.test.ts +4 -4
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.syncFromRemote.test.ts +8 -8
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.worktrees.test.ts +4 -4
- package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.list-fetch.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.test.ts +6 -6
- package/src/modules/{workflow → version-control}/git/git.service.ts +57 -57
- package/src/modules/{workflow → version-control}/git/node-git-runner.ts +1 -1
- package/src/modules/{workflow → version-control}/git/pull-request.service.ts +12 -12
- package/src/modules/{workflow → version-control}/index.ts +6 -5
- package/src/modules/{workflow → version-control}/pending-commits.service.ts +2 -2
- package/src/modules/{workflow → version-control}/pending-commits.worker.ts +8 -8
- package/src/modules/{workflow → version-control}/read-on-branch.ts +2 -2
- package/src/modules/{workflow/workflow-hooks.ts → version-control/version-control-hooks.ts} +3 -3
- package/src/modules/{workflow/workflow.routes.ts → version-control/version-control.routes.ts} +64 -63
- package/src/modules/{workflow/workflow.service.ts → version-control/version-control.service.ts} +92 -97
- package/src/modules/workspace/__tests__/agent-access.gate.test.ts +8 -8
- package/src/modules/workspace/__tests__/agent-downloads.test.ts +13 -16
- package/src/modules/workspace/__tests__/agent-uploads.test.ts +11 -12
- package/src/modules/workspace/__tests__/escape-sequences.routes.test.ts +11 -16
- package/src/modules/workspace/__tests__/file-stat-access.test.ts +3 -3
- package/src/modules/workspace/__tests__/git-internals.security.test.ts +27 -27
- package/src/modules/workspace/__tests__/kb-repository.test.ts +1 -1
- package/src/modules/workspace/__tests__/rest-tool-arguments.test.ts +3 -3
- package/src/modules/workspace/__tests__/start-session.default-branch.test.ts +152 -0
- package/src/modules/workspace/__tests__/workspace-paths-inside-the-repo.test.ts +6 -6
- package/src/modules/workspace/__tests__/workspace-tmp.tools.test.ts +13 -14
- package/src/modules/workspace/__tests__/workspace.routes.at-ref.test.ts +6 -6
- package/src/modules/workspace/__tests__/workspace.routes.branch-errors.test.ts +4 -4
- package/src/modules/workspace/__tests__/workspace.routes.create-grant.test.ts +6 -6
- package/src/modules/workspace/__tests__/workspace.routes.delete.test.ts +8 -8
- package/src/modules/workspace/__tests__/workspace.routes.download-implies-read.test.ts +4 -4
- package/src/modules/workspace/__tests__/workspace.routes.download.test.ts +6 -6
- package/src/modules/workspace/__tests__/workspace.routes.file-writes.test.ts +6 -6
- package/src/modules/workspace/__tests__/workspace.routes.folder-zip-access.test.ts +4 -4
- package/src/modules/workspace/__tests__/workspace.routes.folders.test.ts +6 -6
- package/src/modules/workspace/__tests__/workspace.routes.move-platform-files.test.ts +7 -7
- package/src/modules/workspace/__tests__/workspace.routes.read-gate.test.ts +13 -13
- package/src/modules/workspace/__tests__/workspace.service.any-workspace-credentials.test.ts +1 -1
- package/src/modules/workspace/__tests__/workspace.service.replaced-repository.test.ts +1 -1
- package/src/modules/workspace/__tests__/workspace.service.worktrees.test.ts +1 -1
- package/src/modules/workspace/__tests__/workspace.tools.agents-file.test.ts +12 -14
- package/src/modules/workspace/__tests__/workspace.tools.branch-errors.test.ts +5 -5
- package/src/modules/workspace/__tests__/workspace.tools.test.ts +182 -75
- package/src/modules/workspace/agent-access.gate.ts +6 -6
- 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 +90 -30
- package/src/shared/__tests__/canonical-file-identity.test.ts +5 -5
- package/src/shared/__tests__/http-errors.test.ts +4 -4
- package/src/shared/__tests__/read-capped.test.ts +68 -0
- package/src/shared/canonical-file-identity.ts +5 -5
- package/src/shared/domain-errors.ts +44 -44
- package/src/shared/git.contract.ts +1 -1
- package/src/shared/http-errors.ts +3 -3
- package/src/shared/kb-context.ts +130 -130
- package/src/shared/oauth-token-error.ts +46 -0
- package/src/shared/pending-proposals.ts +4 -4
- package/src/shared/read-capped.ts +40 -0
- 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/agent-guide/finding-things.md +0 -7
- package/agent-guide/introduction.md +0 -27
- 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
|
@@ -10,23 +10,23 @@ import type {
|
|
|
10
10
|
} from '@bevel-software/platform-shared';
|
|
11
11
|
import type { GitService } from '../git/git.service.js';
|
|
12
12
|
import type { PullRequestService } from '../git/pull-request.service.js';
|
|
13
|
-
import type {
|
|
13
|
+
import type { IChangeRequestReviewService } from '../change-request-review/change-request-review.interface.js';
|
|
14
14
|
import type { WorkspaceService } from '../../workspace/workspace.service.js';
|
|
15
15
|
import type { IAccessControl } from '../../access/access-control.interface.js';
|
|
16
16
|
import { FileLockService } from '../file-lock.service.js';
|
|
17
17
|
import { PendingCommitsService, type PendingCommit } from '../pending-commits.service.js';
|
|
18
18
|
import { PendingCommitsWorker } from '../pending-commits.worker.js';
|
|
19
19
|
import { HttpCommunicationProtocol } from '@utcp/http';
|
|
20
|
-
import {
|
|
20
|
+
import { VersionControlService } from '../version-control.service.js';
|
|
21
21
|
import type { ChangeRequestOpenedEvent, IChangeRequestHooks } from '../change-request-hooks.js';
|
|
22
22
|
import {
|
|
23
23
|
ChangeRequestConflictsError,
|
|
24
24
|
PullRebaseConflictError,
|
|
25
25
|
PushNeedsAgentResolutionError,
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
VersionControlDomainError,
|
|
27
|
+
VersionControlValidationError,
|
|
28
28
|
} from '../../../shared/domain-errors.js';
|
|
29
|
-
import type {
|
|
29
|
+
import type { VersionControlEventBus } from '../event-bus.js';
|
|
30
30
|
import { DEFAULT_BRANCH } from '@bevel-software/platform-shared';
|
|
31
31
|
import type { Database } from '../../database/connection.js';
|
|
32
32
|
import { openChangeGate } from '../../../__tests__/open-change-gate.js';
|
|
@@ -173,9 +173,7 @@ function makeAccessControl(): IAccessControl {
|
|
|
173
173
|
/**
|
|
174
174
|
* The facade exists only to delegate — these tests pin down that contract.
|
|
175
175
|
* For each backed method we verify (a) the right underlying call is made
|
|
176
|
-
* with the right arguments, (b) the underlying return propagates back.
|
|
177
|
-
* each unimplemented method we verify it rejects with
|
|
178
|
-
* `NotImplementedWorkflowError` so consumers can switch on the error class.
|
|
176
|
+
* with the right arguments, (b) the underlying return propagates back.
|
|
179
177
|
*
|
|
180
178
|
* Cache invalidation (`PullRequestService.invalidateDetailCache`) is part
|
|
181
179
|
* of the facade contract for mutating change-request methods — without it
|
|
@@ -236,7 +234,7 @@ function makePrs(): PullRequestService {
|
|
|
236
234
|
} as unknown as PullRequestService;
|
|
237
235
|
}
|
|
238
236
|
|
|
239
|
-
function
|
|
237
|
+
function makeChangeRequestReview(): IChangeRequestReviewService {
|
|
240
238
|
return {
|
|
241
239
|
getApprovalStates: vi.fn(),
|
|
242
240
|
approveFile: vi.fn(),
|
|
@@ -244,16 +242,16 @@ function makeReviewWorkflow(): IReviewWorkflowService {
|
|
|
244
242
|
evaluateMergeGate: vi.fn(),
|
|
245
243
|
mergePr: vi.fn(),
|
|
246
244
|
cancelPr: vi.fn(),
|
|
247
|
-
} as unknown as
|
|
245
|
+
} as unknown as IChangeRequestReviewService;
|
|
248
246
|
}
|
|
249
247
|
|
|
250
|
-
describe('
|
|
248
|
+
describe('VersionControlService — branch delegation', () => {
|
|
251
249
|
it('listBranches delegates to git.listBranches', async () => {
|
|
252
250
|
const git = makeGit();
|
|
253
251
|
const branches = [{ name: 'main', isCurrent: true, isProtected: true, hasRemote: true }];
|
|
254
252
|
(git.listBranches as ReturnType<typeof vi.fn>).mockResolvedValue(branches);
|
|
255
253
|
|
|
256
|
-
const svc = new
|
|
254
|
+
const svc = new VersionControlService(makeDb(), git, makePrs(), makeChangeRequestReview(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
|
|
257
255
|
await expect(svc.listBranches('w1')).resolves.toBe(branches);
|
|
258
256
|
// listBranches(workspaceId, opts?) forwards opts — undefined when omitted.
|
|
259
257
|
expect(git.listBranches).toHaveBeenCalledWith('w1', undefined);
|
|
@@ -263,7 +261,7 @@ describe('WorkflowService — branch delegation', () => {
|
|
|
263
261
|
const git = makeGit();
|
|
264
262
|
(git.createBranch as ReturnType<typeof vi.fn>).mockResolvedValue({ name: 'feat' });
|
|
265
263
|
|
|
266
|
-
const svc = new
|
|
264
|
+
const svc = new VersionControlService(makeDb(), git, makePrs(), makeChangeRequestReview(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
|
|
267
265
|
await svc.createBranch('w1', 'feat', 'current-company-state');
|
|
268
266
|
expect(git.createBranch).toHaveBeenCalledWith('w1', 'feat', 'current-company-state');
|
|
269
267
|
});
|
|
@@ -273,13 +271,13 @@ describe('WorkflowService — branch delegation', () => {
|
|
|
273
271
|
const status = { branch: 'main', isDirty: false, hasUpstream: true, unpushedCommits: 0, conflicted: [], unmergedFromUpstream: false };
|
|
274
272
|
(git.status as ReturnType<typeof vi.fn>).mockResolvedValue(status);
|
|
275
273
|
|
|
276
|
-
const svc = new
|
|
274
|
+
const svc = new VersionControlService(makeDb(), git, makePrs(), makeChangeRequestReview(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
|
|
277
275
|
await expect(svc.branchStatus('w1')).resolves.toBe(status);
|
|
278
276
|
expect(git.status).toHaveBeenCalledWith('w1');
|
|
279
277
|
});
|
|
280
278
|
});
|
|
281
279
|
|
|
282
|
-
describe('
|
|
280
|
+
describe('VersionControlService.updateBranch', () => {
|
|
283
281
|
const user = { id: 'u1', email: 'ada@x.io', name: 'Ada' };
|
|
284
282
|
/** A git double whose merge answers `outcome`, with the source on the remote. */
|
|
285
283
|
const gitThatMerges = (outcome: unknown) => {
|
|
@@ -289,14 +287,14 @@ describe('WorkflowService.updateBranch', () => {
|
|
|
289
287
|
return git;
|
|
290
288
|
};
|
|
291
289
|
const build = (git: GitService, pending = makePendingCommits()) =>
|
|
292
|
-
new
|
|
290
|
+
new VersionControlService(makeDb(), git, makePrs(), makeChangeRequestReview(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(), pending, testKbContext(), openChangeGate());
|
|
293
291
|
|
|
294
292
|
it('refuses a protected branch before asking git anything', async () => {
|
|
295
293
|
const git = gitThatMerges({ kind: 'merged', sha: 'm', from: 'x', resolvedPaths: [] });
|
|
296
294
|
const err = await build(git).updateBranch('target-company-state', user).catch((e: unknown) => e);
|
|
297
|
-
expect(err).toBeInstanceOf(
|
|
298
|
-
expect((err as
|
|
299
|
-
expect((err as
|
|
295
|
+
expect(err).toBeInstanceOf(VersionControlDomainError);
|
|
296
|
+
expect((err as VersionControlDomainError).status).toBe(403);
|
|
297
|
+
expect((err as VersionControlDomainError).payload).toMatchObject({ kind: 'protected-update-target' });
|
|
300
298
|
expect((git as unknown as { mergeIntoBranch: ReturnType<typeof vi.fn> }).mergeIntoBranch).not.toHaveBeenCalled();
|
|
301
299
|
expect(git.push).not.toHaveBeenCalled();
|
|
302
300
|
});
|
|
@@ -314,7 +312,7 @@ describe('WorkflowService.updateBranch', () => {
|
|
|
314
312
|
it('refuses an update that would land an open change request from `from` into the draft, as the merge tool refuses it', async () => {
|
|
315
313
|
const git = gitThatMerges({ kind: 'merged', sha: 'm', from: 'target-company-state', resolvedPaths: [] });
|
|
316
314
|
const open = [{ number: 5, sourceBranch: 'target-company-state', targetBranch: 'ada/draft', state: 'open' }];
|
|
317
|
-
const svc = new
|
|
315
|
+
const svc = new VersionControlService(makeDb(open), git, makePrs(), makeChangeRequestReview(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
|
|
318
316
|
const err = await svc.updateBranch('ada%2Fdraft', user, { from: 'target-company-state' }).catch((e: unknown) => e);
|
|
319
317
|
expect(err).toMatchObject({ status: 409, payload: { kind: 'open-change-request-blocks-merge', number: 5 } });
|
|
320
318
|
expect((git as unknown as { mergeIntoBranch: ReturnType<typeof vi.fn> }).mergeIntoBranch).not.toHaveBeenCalled();
|
|
@@ -322,7 +320,7 @@ describe('WorkflowService.updateBranch', () => {
|
|
|
322
320
|
// The other direction — the draft's own request, open INTO `from` — is
|
|
323
321
|
// how a draft under review stays current: never blocked.
|
|
324
322
|
const reverse = [{ number: 6, sourceBranch: 'ada/draft', targetBranch: 'target-company-state', state: 'open' }];
|
|
325
|
-
const syncing = new
|
|
323
|
+
const syncing = new VersionControlService(makeDb(reverse), git, makePrs(), makeChangeRequestReview(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
|
|
326
324
|
expect(await syncing.updateBranch('ada%2Fdraft', user, { from: 'target-company-state' })).toMatchObject({ kind: 'merged' });
|
|
327
325
|
});
|
|
328
326
|
|
|
@@ -404,7 +402,7 @@ describe('WorkflowService.updateBranch', () => {
|
|
|
404
402
|
expect(git.push).not.toHaveBeenCalled();
|
|
405
403
|
});
|
|
406
404
|
|
|
407
|
-
it("publishes through the one push policy every
|
|
405
|
+
it("publishes through the one push policy every version-control push takes, over the merge's own moves", async () => {
|
|
408
406
|
const git = gitThatMerges({ kind: 'merged', sha: 'm', from: 'target-company-state', resolvedPaths: [] });
|
|
409
407
|
await build(git).updateBranch('ada%2Fdraft', user, { from: 'target-company-state' });
|
|
410
408
|
const merge = (git as unknown as { mergeIntoBranch: ReturnType<typeof vi.fn> }).mergeIntoBranch;
|
|
@@ -432,7 +430,7 @@ describe('WorkflowService.updateBranch', () => {
|
|
|
432
430
|
expect(diverged).toBeInstanceOf(PushNeedsAgentResolutionError);
|
|
433
431
|
expect(diverged as PushNeedsAgentResolutionError).toMatchObject({ branch: 'ada/draft', path: 'ada/draft', cause: 'diverged' });
|
|
434
432
|
expect((diverged as Error).message).not.toContain('Secret/Plan.md');
|
|
435
|
-
expect(JSON.stringify((diverged as
|
|
433
|
+
expect(JSON.stringify((diverged as VersionControlDomainError).payload)).not.toContain('Secret/Plan.md');
|
|
436
434
|
|
|
437
435
|
// A host that refuses: the same hand-off, `refused`, no replay attempted.
|
|
438
436
|
const untouched = vi.fn();
|
|
@@ -453,7 +451,7 @@ describe('WorkflowService.updateBranch', () => {
|
|
|
453
451
|
gate.assertMayChange = async (...args: unknown[]) => {
|
|
454
452
|
asked.push(args);
|
|
455
453
|
};
|
|
456
|
-
const svc = new
|
|
454
|
+
const svc = new VersionControlService(makeDb(), git, makePrs(), makeChangeRequestReview(), makeWorkspaceService(), access, makeFileLockService(), makePendingCommits(), testKbContext(), gate);
|
|
457
455
|
const validated: unknown[][] = [];
|
|
458
456
|
const validateWrite = vi.fn(async (...args: unknown[]) => { validated.push(args); });
|
|
459
457
|
await svc.updateBranch('ada%2Fdraft', user, {
|
|
@@ -476,7 +474,7 @@ describe('WorkflowService.updateBranch', () => {
|
|
|
476
474
|
expect(asked).toEqual([['ada%2Fdraft', 'ada@x.io', 'knowledge-base/A.md', 'file'], ['ada%2Fdraft', 'ada@x.io', 'knowledge-base/B.md', 'file']]);
|
|
477
475
|
|
|
478
476
|
// The write gate's refusal refuses the update (a roles.yaml that would not parse, say).
|
|
479
|
-
validateWrite.mockRejectedValueOnce(new
|
|
477
|
+
validateWrite.mockRejectedValueOnce(new VersionControlDomainError('roles.yaml would be invalid', 422));
|
|
480
478
|
await expect(opts.authorizeResolutions({ ours: 'o', theirs: 't' })).rejects.toMatchObject({ status: 422 });
|
|
481
479
|
|
|
482
480
|
// Not readable at the draft's commit: refused before the change gate is asked.
|
|
@@ -521,7 +519,7 @@ describe('WorkflowService.updateBranch', () => {
|
|
|
521
519
|
});
|
|
522
520
|
});
|
|
523
521
|
|
|
524
|
-
describe('
|
|
522
|
+
describe('VersionControlService — change delegation', () => {
|
|
525
523
|
it('commitChange delegates to git.commit', async () => {
|
|
526
524
|
const git = makeGit();
|
|
527
525
|
const user = makeUser();
|
|
@@ -529,7 +527,7 @@ describe('WorkflowService — change delegation', () => {
|
|
|
529
527
|
const commit = { sha: 'abc', authorName: 'Alice', authorEmail: 'alice@example.com', subject: 'tweak owner', committedAt: '2026-01-01T00:00:00Z' };
|
|
530
528
|
(git.commit as ReturnType<typeof vi.fn>).mockResolvedValue(commit);
|
|
531
529
|
|
|
532
|
-
const svc = new
|
|
530
|
+
const svc = new VersionControlService(makeDb(), git, makePrs(), makeChangeRequestReview(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
|
|
533
531
|
await expect(svc.commitChange('w1', user, input)).resolves.toBe(commit);
|
|
534
532
|
expect(git.commit).toHaveBeenCalledWith('w1', user, input);
|
|
535
533
|
});
|
|
@@ -538,7 +536,7 @@ describe('WorkflowService — change delegation', () => {
|
|
|
538
536
|
const git = makeGit();
|
|
539
537
|
(git.logForFile as ReturnType<typeof vi.fn>).mockResolvedValue([]);
|
|
540
538
|
|
|
541
|
-
const svc = new
|
|
539
|
+
const svc = new VersionControlService(makeDb(), git, makePrs(), makeChangeRequestReview(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
|
|
542
540
|
await svc.listChangesForFile('w1', 'Knowledge/Foo.md', 5);
|
|
543
541
|
expect(git.logForFile).toHaveBeenCalledWith('w1', 'Knowledge/Foo.md', 5);
|
|
544
542
|
});
|
|
@@ -547,7 +545,7 @@ describe('WorkflowService — change delegation', () => {
|
|
|
547
545
|
const git = makeGit();
|
|
548
546
|
(git.diffFileBetweenBranches as ReturnType<typeof vi.fn>).mockResolvedValue({ diff: '@@ diff', from: 'a1', to: 'b1' });
|
|
549
547
|
|
|
550
|
-
const svc = new
|
|
548
|
+
const svc = new VersionControlService(makeDb(), git, makePrs(), makeChangeRequestReview(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
|
|
551
549
|
// The caller's verdict travels down to the git layer, which asks it at
|
|
552
550
|
// the pinned commits; those commits travel back with the diff.
|
|
553
551
|
const authorize = vi.fn(async () => {});
|
|
@@ -557,40 +555,40 @@ describe('WorkflowService — change delegation', () => {
|
|
|
557
555
|
});
|
|
558
556
|
});
|
|
559
557
|
|
|
560
|
-
describe('
|
|
558
|
+
describe('VersionControlService — change request delegation + cache invalidation', () => {
|
|
561
559
|
it('listChangeRequests forwards opts to prs.listOpenPrs', async () => {
|
|
562
560
|
const prs = makePrs();
|
|
563
561
|
(prs.listOpenPrs as ReturnType<typeof vi.fn>).mockResolvedValue([]);
|
|
564
562
|
|
|
565
|
-
const svc = new
|
|
563
|
+
const svc = new VersionControlService(makeDb(), makeGit(), prs, makeChangeRequestReview(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
|
|
566
564
|
await svc.listChangeRequests({ fresh: true });
|
|
567
565
|
expect(prs.listOpenPrs).toHaveBeenCalledWith({ fresh: true });
|
|
568
566
|
});
|
|
569
567
|
|
|
570
568
|
it('approveFile invalidates the PR detail cache exactly once', async () => {
|
|
571
569
|
const prs = makePrs();
|
|
572
|
-
const
|
|
573
|
-
(
|
|
570
|
+
const changeRequestReview = makeChangeRequestReview();
|
|
571
|
+
(changeRequestReview.approveFile as ReturnType<typeof vi.fn>).mockResolvedValue([]);
|
|
574
572
|
|
|
575
|
-
const svc = new
|
|
573
|
+
const svc = new VersionControlService(makeDb(), makeGit(), prs, changeRequestReview, makeWorkspaceService(), makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
|
|
576
574
|
await svc.approveFile(7, 'Foo.md', makeUser(), [], 'sha', 'main', null, 'w1');
|
|
577
575
|
expect(prs.invalidateDetailCache).toHaveBeenCalledWith(7);
|
|
578
576
|
expect(prs.invalidateDetailCache).toHaveBeenCalledTimes(1);
|
|
579
577
|
});
|
|
580
578
|
|
|
581
|
-
it('rejectChangeRequest delegates to
|
|
579
|
+
it('rejectChangeRequest delegates to changeRequestReview.cancelPr', async () => {
|
|
582
580
|
const prs = makePrs();
|
|
583
|
-
const
|
|
584
|
-
(
|
|
581
|
+
const changeRequestReview = makeChangeRequestReview();
|
|
582
|
+
(changeRequestReview.cancelPr as ReturnType<typeof vi.fn>).mockResolvedValue({ prNumber: 9, cancelledAt: 't' });
|
|
585
583
|
// A caller holding no grant: not the author, not an admin, no files to own.
|
|
586
584
|
const access = makeAccessControl();
|
|
587
585
|
(access.canWriteAtRef as ReturnType<typeof vi.fn>).mockResolvedValue(false);
|
|
588
586
|
|
|
589
|
-
const svc = new
|
|
587
|
+
const svc = new VersionControlService(makeDb(), makeGit(), prs, changeRequestReview, makeWorkspaceService(), access, makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
|
|
590
588
|
const user = makeUser();
|
|
591
589
|
await svc.rejectChangeRequest(9, user, 'open', null, 'main', 'w1');
|
|
592
590
|
// Passed through unchanged: `cancelPr` is the one that refuses it.
|
|
593
|
-
expect(
|
|
591
|
+
expect(changeRequestReview.cancelPr).toHaveBeenCalledWith(9, user, 'open', null, 'main', 'w1');
|
|
594
592
|
expect(prs.invalidateDetailCache).toHaveBeenCalledWith(9);
|
|
595
593
|
});
|
|
596
594
|
|
|
@@ -599,8 +597,8 @@ describe('WorkflowService — change request delegation + cache invalidation', (
|
|
|
599
597
|
it('rejectChangeRequest lets the holder of write on every changed file close it as the author would', async () => {
|
|
600
598
|
const prs = makePrs();
|
|
601
599
|
(prs.getPrDetail as ReturnType<typeof vi.fn>).mockResolvedValue({ files: [{ path: 'a.md' }, { path: 'b.md' }] });
|
|
602
|
-
const
|
|
603
|
-
(
|
|
600
|
+
const changeRequestReview = makeChangeRequestReview();
|
|
601
|
+
(changeRequestReview.cancelPr as ReturnType<typeof vi.fn>).mockResolvedValue({ prNumber: 9, cancelledAt: 't' });
|
|
604
602
|
const access = makeAccessControl();
|
|
605
603
|
(access.canWriteAtRef as ReturnType<typeof vi.fn>).mockResolvedValue(false);
|
|
606
604
|
(access.canWriteBatchAtRef as ReturnType<typeof vi.fn>).mockResolvedValue(
|
|
@@ -608,44 +606,44 @@ describe('WorkflowService — change request delegation + cache invalidation', (
|
|
|
608
606
|
);
|
|
609
607
|
const workspaceService = makeWorkspaceService();
|
|
610
608
|
|
|
611
|
-
const svc = new
|
|
609
|
+
const svc = new VersionControlService(makeDb(), makeGit(), prs, changeRequestReview, workspaceService, access, makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
|
|
612
610
|
const user = makeUser();
|
|
613
611
|
await svc.rejectChangeRequest(9, user, 'open', 'someone-else', 'main', 'w1');
|
|
614
612
|
expect(workspaceService.ensureRemotesFetched).toHaveBeenCalledWith('w1', { strict: true, force: true });
|
|
615
613
|
expect(access.canWriteBatchAtRef).toHaveBeenCalledWith('w1', 'origin/main', user.email, ['a.md', 'b.md']);
|
|
616
|
-
expect(
|
|
614
|
+
expect(changeRequestReview.cancelPr).toHaveBeenCalledWith(9, user, 'open', hashEmail(user.email), 'main', 'w1');
|
|
617
615
|
});
|
|
618
616
|
|
|
619
617
|
it('rejectChangeRequest refuses with a worded 409 when origin cannot be fetched, never against a stale tree', async () => {
|
|
620
|
-
const
|
|
618
|
+
const changeRequestReview = makeChangeRequestReview();
|
|
621
619
|
const workspaceService = makeWorkspaceService();
|
|
622
620
|
(workspaceService.ensureRemotesFetched as ReturnType<typeof vi.fn>).mockRejectedValue(new Error('offline'));
|
|
623
621
|
const access = makeAccessControl();
|
|
624
622
|
|
|
625
|
-
const svc = new
|
|
623
|
+
const svc = new VersionControlService(makeDb(), makeGit(), makePrs(), changeRequestReview, workspaceService, access, makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
|
|
626
624
|
await expect(svc.rejectChangeRequest(9, makeUser(), 'open', 'someone-else', 'main', 'w1')).rejects.toMatchObject({
|
|
627
625
|
status: 409,
|
|
628
626
|
message: expect.stringContaining('origin was unreachable'),
|
|
629
627
|
});
|
|
630
628
|
expect(access.canWriteAtRef).not.toHaveBeenCalled();
|
|
631
|
-
expect(
|
|
629
|
+
expect(changeRequestReview.cancelPr).not.toHaveBeenCalled();
|
|
632
630
|
});
|
|
633
631
|
|
|
634
632
|
it("rejectChangeRequest reads no grant for a request that is no longer open — cancelPr answers it", async () => {
|
|
635
|
-
const
|
|
636
|
-
(
|
|
633
|
+
const changeRequestReview = makeChangeRequestReview();
|
|
634
|
+
(changeRequestReview.cancelPr as ReturnType<typeof vi.fn>).mockRejectedValue(new Error('already-applied'));
|
|
637
635
|
const workspaceService = makeWorkspaceService();
|
|
638
636
|
|
|
639
|
-
const svc = new
|
|
637
|
+
const svc = new VersionControlService(makeDb(), makeGit(), makePrs(), changeRequestReview, workspaceService, makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
|
|
640
638
|
await expect(svc.rejectChangeRequest(9, makeUser(), 'merged', null, 'main', 'w1')).rejects.toThrow('already-applied');
|
|
641
639
|
expect(workspaceService.ensureRemotesFetched).not.toHaveBeenCalled();
|
|
642
640
|
});
|
|
643
641
|
|
|
644
642
|
it('mergeChangeRequest wraps the underlying merge result in a "merged" outcome', async () => {
|
|
645
643
|
const prs = makePrs();
|
|
646
|
-
const
|
|
644
|
+
const changeRequestReview = makeChangeRequestReview();
|
|
647
645
|
const mergeResult = { prNumber: 4, sha: 'abc', mergedAt: 't' };
|
|
648
|
-
(
|
|
646
|
+
(changeRequestReview.mergePr as ReturnType<typeof vi.fn>).mockResolvedValue(mergeResult);
|
|
649
647
|
// The roles.yaml-preservation guard resolves the CR's source branch via
|
|
650
648
|
// getPr. readFileAtRef (stubbed in makeGit) returns identical roles.yaml for
|
|
651
649
|
// base + head, so the guard no-ops and the merge proceeds.
|
|
@@ -653,8 +651,8 @@ describe('WorkflowService — change request delegation + cache invalidation', (
|
|
|
653
651
|
|
|
654
652
|
const git = makeGit();
|
|
655
653
|
const workspaceService = makeWorkspaceService();
|
|
656
|
-
const svc = new
|
|
657
|
-
// Conflicts are surfaced by the local merge inside `
|
|
654
|
+
const svc = new VersionControlService(makeDb(), git, prs, changeRequestReview, workspaceService, makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
|
|
655
|
+
// Conflicts are surfaced by the local merge inside `changeRequestReview.mergePr`
|
|
658
656
|
// (mocked here), so there's no provider "mergeable" pre-check to stub.
|
|
659
657
|
const outcome = await svc.mergeChangeRequest(
|
|
660
658
|
4,
|
|
@@ -671,7 +669,7 @@ describe('WorkflowService — change request delegation + cache invalidation', (
|
|
|
671
669
|
// The target branch's workspace is pulled so it doesn't fall behind origin.
|
|
672
670
|
expect(workspaceService.getOrCreateForBranch).toHaveBeenCalledWith('main');
|
|
673
671
|
expect(git.pull).toHaveBeenCalledWith('main', {});
|
|
674
|
-
expect(
|
|
672
|
+
expect(changeRequestReview.mergePr).toHaveBeenCalledWith(
|
|
675
673
|
4,
|
|
676
674
|
expect.objectContaining({ email: 'alice@example.com' }),
|
|
677
675
|
'sha',
|
|
@@ -687,9 +685,9 @@ describe('WorkflowService — change request delegation + cache invalidation', (
|
|
|
687
685
|
|
|
688
686
|
it('mergeChangeRequest still merges when the post-merge pull conflicts, and queues recovery on the TARGET workspace', async () => {
|
|
689
687
|
const prs = makePrs();
|
|
690
|
-
const
|
|
688
|
+
const changeRequestReview = makeChangeRequestReview();
|
|
691
689
|
const mergeResult = { prNumber: 4, sha: 'abc', mergedAt: 't' };
|
|
692
|
-
(
|
|
690
|
+
(changeRequestReview.mergePr as ReturnType<typeof vi.fn>).mockResolvedValue(mergeResult);
|
|
693
691
|
(prs.getPr as ReturnType<typeof vi.fn>).mockResolvedValue({ branch: 'alice/feat', base: 'main' });
|
|
694
692
|
|
|
695
693
|
const git = makeGit();
|
|
@@ -708,7 +706,7 @@ describe('WorkflowService — change request delegation + cache invalidation', (
|
|
|
708
706
|
id: 'resolved-target-ws',
|
|
709
707
|
});
|
|
710
708
|
const pending = makePendingCommits();
|
|
711
|
-
const svc = new
|
|
709
|
+
const svc = new VersionControlService(makeDb(), git, prs, changeRequestReview, workspaceService, makeAccessControl(), makeFileLockService(), pending, testKbContext(), openChangeGate());
|
|
712
710
|
|
|
713
711
|
const outcome = await svc.mergeChangeRequest(
|
|
714
712
|
4, makeUser(), 'sha', [], 'open', 'PR title', 'main', 'w1', { bypass: true },
|
|
@@ -728,10 +726,10 @@ describe('WorkflowService — change request delegation + cache invalidation', (
|
|
|
728
726
|
});
|
|
729
727
|
});
|
|
730
728
|
|
|
731
|
-
describe('
|
|
729
|
+
describe('VersionControlService — file lock delegation', () => {
|
|
732
730
|
it('acquireLock delegates to FileLockService.acquire', async () => {
|
|
733
731
|
const fileLocks = makeFileLockService();
|
|
734
|
-
const svc = new
|
|
732
|
+
const svc = new VersionControlService(makeDb(), makeGit(), makePrs(), makeChangeRequestReview(), makeWorkspaceService(), makeAccessControl(), fileLocks, makePendingCommits(), testKbContext(), openChangeGate());
|
|
735
733
|
await svc.acquireLock('w1', 'b', 'p', makeUser());
|
|
736
734
|
expect(fileLocks.acquire).toHaveBeenCalledWith('w1', 'b', 'p', expect.objectContaining({ email: 'alice@example.com' }), undefined);
|
|
737
735
|
});
|
|
@@ -741,7 +739,7 @@ describe('WorkflowService — file lock delegation', () => {
|
|
|
741
739
|
// a coordination hold masquerade as an edit lock on the very next read
|
|
742
740
|
// (which is how the write paths decide what the holder may do).
|
|
743
741
|
const fileLocks = makeFileLockService();
|
|
744
|
-
const svc = new
|
|
742
|
+
const svc = new VersionControlService(makeDb(), makeGit(), makePrs(), makeChangeRequestReview(), makeWorkspaceService(), makeAccessControl(), fileLocks, makePendingCommits(), testKbContext(), openChangeGate());
|
|
745
743
|
await svc.acquireLock('w1', 'b', 'p', makeUser(), { coordination: true });
|
|
746
744
|
expect(fileLocks.acquire).toHaveBeenCalledWith(
|
|
747
745
|
'w1', 'b', 'p', expect.objectContaining({ email: 'alice@example.com' }), { coordination: true },
|
|
@@ -750,7 +748,7 @@ describe('WorkflowService — file lock delegation', () => {
|
|
|
750
748
|
|
|
751
749
|
it('getLock delegates to FileLockService.get', async () => {
|
|
752
750
|
const fileLocks = makeFileLockService();
|
|
753
|
-
const svc = new
|
|
751
|
+
const svc = new VersionControlService(makeDb(), makeGit(), makePrs(), makeChangeRequestReview(), makeWorkspaceService(), makeAccessControl(), fileLocks, makePendingCommits(), testKbContext(), openChangeGate());
|
|
754
752
|
await expect(svc.getLock('w1', 'b', 'p')).resolves.toBeNull();
|
|
755
753
|
expect(fileLocks.get).toHaveBeenCalledWith('w1', 'b', 'p');
|
|
756
754
|
});
|
|
@@ -765,7 +763,7 @@ describe('WorkflowService — file lock delegation', () => {
|
|
|
765
763
|
acquiredAt: '', lastHeartbeatAt: '', expiresAt: '',
|
|
766
764
|
});
|
|
767
765
|
const pending = makePendingCommits();
|
|
768
|
-
const svc = new
|
|
766
|
+
const svc = new VersionControlService(makeDb(), git, makePrs(), makeChangeRequestReview(), makeWorkspaceService(), makeAccessControl(), fileLocks, pending, testKbContext(), openChangeGate());
|
|
769
767
|
await expect(svc.releaseLock('w1', 'feat', 'Foo.md', makeUser())).resolves.toBeUndefined();
|
|
770
768
|
// No inline git work — the worker handles that out of band.
|
|
771
769
|
expect(git.commitFile).not.toHaveBeenCalled();
|
|
@@ -784,28 +782,28 @@ describe('WorkflowService — file lock delegation', () => {
|
|
|
784
782
|
// One open request rides the branch — deleting it would strand the request.
|
|
785
783
|
// `sourceBranch` matters to the guard now: it decides whether the refusal
|
|
786
784
|
// says "withdraw yours" (source) or names the other request's actors (target).
|
|
787
|
-
const svc = new
|
|
785
|
+
const svc = new VersionControlService(makeDb([{ number: 7, sourceBranch: 'feat/x', targetBranch: 'dev', state: 'open' }]), git, makePrs(), makeChangeRequestReview(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
|
|
788
786
|
await expect(svc.deleteBranch('w1', 'feat/x', makeUser())).rejects.toThrow(/open change request \(#7\)/);
|
|
789
787
|
expect(git.deleteBranch).not.toHaveBeenCalled();
|
|
790
788
|
});
|
|
791
789
|
|
|
792
790
|
it('deleteBranch refuses when an open request proposes INTO the branch (target end)', async () => {
|
|
793
791
|
const git = makeGit();
|
|
794
|
-
const svc = new
|
|
792
|
+
const svc = new VersionControlService(makeDb([{ number: 9, sourceBranch: 'other/y', targetBranch: 'feat/x', state: 'open' }]), git, makePrs(), makeChangeRequestReview(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
|
|
795
793
|
await expect(svc.deleteBranch('w1', 'feat/x', makeUser())).rejects.toThrow(/proposes changes into/);
|
|
796
794
|
expect(git.deleteBranch).not.toHaveBeenCalled();
|
|
797
795
|
});
|
|
798
796
|
|
|
799
797
|
it('deleteBranch proceeds past a CLOSED request — the guard filters on state, not mere mention', async () => {
|
|
800
798
|
const git = makeGit();
|
|
801
|
-
const svc = new
|
|
799
|
+
const svc = new VersionControlService(makeDb([{ number: 7, sourceBranch: 'feat/x', targetBranch: 'dev', state: 'closed' }]), git, makePrs(), makeChangeRequestReview(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
|
|
802
800
|
await expect(svc.deleteBranch('w1', 'feat/x', makeUser())).resolves.toBeUndefined();
|
|
803
801
|
expect(git.deleteBranch).toHaveBeenCalled();
|
|
804
802
|
});
|
|
805
803
|
|
|
806
804
|
it('deleteBranch deletes when the branch has no open change request', async () => {
|
|
807
805
|
const git = makeGit();
|
|
808
|
-
const svc = new
|
|
806
|
+
const svc = new VersionControlService(makeDb(), git, makePrs(), makeChangeRequestReview(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
|
|
809
807
|
await expect(svc.deleteBranch('w1', 'feat/x', makeUser())).resolves.toBeUndefined();
|
|
810
808
|
expect(git.deleteBranch).toHaveBeenCalledWith('w1', 'feat/x', expect.objectContaining({ email: 'alice@example.com' }), undefined);
|
|
811
809
|
});
|
|
@@ -825,7 +823,7 @@ describe('WorkflowService — file lock delegation', () => {
|
|
|
825
823
|
vi.mocked(git.deleteBranch)
|
|
826
824
|
.mockImplementationOnce(async () => { order.push('first:start'); await gate; order.push('first:end'); return { lastCommit: null }; })
|
|
827
825
|
.mockImplementationOnce(async () => { order.push('second'); return { lastCommit: null }; });
|
|
828
|
-
const svc = new
|
|
826
|
+
const svc = new VersionControlService(makeDb(), git, makePrs(), makeChangeRequestReview(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
|
|
829
827
|
const first = svc.deleteBranch('w1', 'feat/x', makeUser());
|
|
830
828
|
const second = svc.deleteBranch('w1', 'feat/x', makeUser());
|
|
831
829
|
// Only release the gate once the first operation is provably inside its
|
|
@@ -840,7 +838,7 @@ describe('WorkflowService — file lock delegation', () => {
|
|
|
840
838
|
it('releaseLock refuses when the caller does not hold the lock', async () => {
|
|
841
839
|
const git = makeGit();
|
|
842
840
|
const fileLocks = makeFileLockService(); // default: get → null
|
|
843
|
-
const svc = new
|
|
841
|
+
const svc = new VersionControlService(makeDb(), git, makePrs(), makeChangeRequestReview(), makeWorkspaceService(), makeAccessControl(), fileLocks, makePendingCommits(), testKbContext(), openChangeGate());
|
|
844
842
|
await expect(svc.releaseLock('w1', 'feat', 'Foo.md', makeUser())).rejects.toThrow(/not held by you/);
|
|
845
843
|
// The commit must NOT run when the caller doesn't hold the lock —
|
|
846
844
|
// otherwise a non-holder could trigger a commit attributed as them.
|
|
@@ -854,7 +852,7 @@ describe('WorkflowService — file lock delegation', () => {
|
|
|
854
852
|
* predicate, the restore→commit→push order, the lock discipline, and the
|
|
855
853
|
* authoritative emptiness re-check before anything closes.
|
|
856
854
|
*/
|
|
857
|
-
describe('
|
|
855
|
+
describe('VersionControlService — revertChangeRequestFile / closeEmptyChangeRequest', () => {
|
|
858
856
|
const SUMMARY = { number: 7, base: 'main', branch: 'ali/x', state: 'open' };
|
|
859
857
|
|
|
860
858
|
function makeRevertGit(overrides: Record<string, unknown> = {}): GitService {
|
|
@@ -875,7 +873,7 @@ describe('WorkflowService — revertChangeRequestFile / closeEmptyChangeRequest'
|
|
|
875
873
|
canWriteAtRef?: boolean | null;
|
|
876
874
|
prState?: string;
|
|
877
875
|
updateRows?: unknown[];
|
|
878
|
-
events?:
|
|
876
|
+
events?: VersionControlEventBus;
|
|
879
877
|
} = {}) {
|
|
880
878
|
const git = opts.git ?? makeRevertGit();
|
|
881
879
|
const prs = makePrs();
|
|
@@ -902,7 +900,7 @@ describe('WorkflowService — revertChangeRequestFile / closeEmptyChangeRequest'
|
|
|
902
900
|
returning: vi.fn(async () => updateRows),
|
|
903
901
|
});
|
|
904
902
|
const db = chain as unknown as Database;
|
|
905
|
-
const svc = new
|
|
903
|
+
const svc = new VersionControlService(db, git, prs, makeChangeRequestReview(), makeWorkspaceService(), access, fileLocks, makePendingCommits(), testKbContext(), openChangeGate(), opts.events);
|
|
906
904
|
return { svc, git, prs, access, fileLocks, db: chain };
|
|
907
905
|
}
|
|
908
906
|
|
|
@@ -1057,7 +1055,7 @@ describe('WorkflowService — revertChangeRequestFile / closeEmptyChangeRequest'
|
|
|
1057
1055
|
// so the cooperative pull runs first; it changes nothing here.
|
|
1058
1056
|
pull: vi.fn().mockResolvedValue({ treeChanged: false }),
|
|
1059
1057
|
});
|
|
1060
|
-
const { svc, fileLocks, prs, db } = makeHarness({ git, events: { emit } as unknown as
|
|
1058
|
+
const { svc, fileLocks, prs, db } = makeHarness({ git, events: { emit } as unknown as VersionControlEventBus });
|
|
1061
1059
|
|
|
1062
1060
|
const err = await svc.revertChangeRequestFile(7, makeUser(), 'Docs/a.md').catch((e: unknown) => e);
|
|
1063
1061
|
expect(err).toBeInstanceOf(PushNeedsAgentResolutionError);
|
|
@@ -1091,7 +1089,7 @@ describe('WorkflowService — revertChangeRequestFile / closeEmptyChangeRequest'
|
|
|
1091
1089
|
const emit = vi.fn();
|
|
1092
1090
|
const push = vi.fn().mockRejectedValueOnce(REFUSED).mockRejectedValueOnce(REFUSED).mockResolvedValue(undefined);
|
|
1093
1091
|
const git = makeRevertGit({ push, pull: vi.fn().mockResolvedValue({ treeChanged: false }) });
|
|
1094
|
-
const { svc } = makeHarness({ git, events: { emit } as unknown as
|
|
1092
|
+
const { svc } = makeHarness({ git, events: { emit } as unknown as VersionControlEventBus });
|
|
1095
1093
|
|
|
1096
1094
|
await expect(svc.revertChangeRequestFile(7, makeUser(), 'Docs/a.md')).rejects.toBeInstanceOf(
|
|
1097
1095
|
PushNeedsAgentResolutionError,
|
|
@@ -1129,7 +1127,7 @@ describe('WorkflowService — revertChangeRequestFile / closeEmptyChangeRequest'
|
|
|
1129
1127
|
new Error("fatal: unable to access 'https://github.com/acme/kb.git/': The requested URL returned error: 403"),
|
|
1130
1128
|
);
|
|
1131
1129
|
const git = makeRevertGit({ push, pull });
|
|
1132
|
-
const { svc } = makeHarness({ git, events: { emit } as unknown as
|
|
1130
|
+
const { svc } = makeHarness({ git, events: { emit } as unknown as VersionControlEventBus });
|
|
1133
1131
|
|
|
1134
1132
|
await expect(svc.revertChangeRequestFile(7, makeUser(), 'Docs/a.md')).rejects.toBeInstanceOf(
|
|
1135
1133
|
PushNeedsAgentResolutionError,
|
|
@@ -1149,7 +1147,7 @@ describe('WorkflowService — revertChangeRequestFile / closeEmptyChangeRequest'
|
|
|
1149
1147
|
.mockResolvedValue(undefined);
|
|
1150
1148
|
const pull = vi.fn().mockResolvedValue({ treeChanged: true });
|
|
1151
1149
|
const git = makeRevertGit({ push, pull });
|
|
1152
|
-
const { svc } = makeHarness({ git, events: { emit } as unknown as
|
|
1150
|
+
const { svc } = makeHarness({ git, events: { emit } as unknown as VersionControlEventBus });
|
|
1153
1151
|
|
|
1154
1152
|
await expect(svc.revertChangeRequestFile(7, makeUser(), 'Docs/a.md')).resolves.toMatchObject({ closed: false });
|
|
1155
1153
|
expect(push).toHaveBeenCalledTimes(2);
|
|
@@ -1204,7 +1202,7 @@ describe('WorkflowService — revertChangeRequestFile / closeEmptyChangeRequest'
|
|
|
1204
1202
|
});
|
|
1205
1203
|
});
|
|
1206
1204
|
|
|
1207
|
-
describe('
|
|
1205
|
+
describe('VersionControlService — deleteChangeRequest (the author’s and the admin’s verb)', () => {
|
|
1208
1206
|
const AUTHOR_EMAIL = 'alice@example.com'; // makeUser()'s default caller
|
|
1209
1207
|
const STRANGER_AUTHOR = 'mallory@example.com';
|
|
1210
1208
|
|
|
@@ -1252,7 +1250,7 @@ describe('WorkflowService — deleteChangeRequest (the author’s and the admin
|
|
|
1252
1250
|
returning: vi.fn(async () => [{ id: 1 }]),
|
|
1253
1251
|
});
|
|
1254
1252
|
const workspaces = makeWorkspaceService();
|
|
1255
|
-
const svc = new
|
|
1253
|
+
const svc = new VersionControlService(chain as unknown as Database, git, prs, makeChangeRequestReview(), workspaces, access, makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate());
|
|
1256
1254
|
return { svc, prs, db: chain, access, workspaces, git };
|
|
1257
1255
|
}
|
|
1258
1256
|
|
|
@@ -1426,7 +1424,7 @@ describe('WorkflowService — deleteChangeRequest (the author’s and the admin
|
|
|
1426
1424
|
});
|
|
1427
1425
|
});
|
|
1428
1426
|
|
|
1429
|
-
describe('
|
|
1427
|
+
describe('VersionControlService.mergeBranch — an agent merges branches, never an open change request', () => {
|
|
1430
1428
|
// One open request, `alice/feat` → the protected default branch;
|
|
1431
1429
|
// `alice/other` is an unprotected draft with no request.
|
|
1432
1430
|
const PROTECTED = DEFAULT_BRANCH;
|
|
@@ -1466,7 +1464,7 @@ describe('WorkflowService.mergeBranch — an agent merges branches, never an ope
|
|
|
1466
1464
|
const unpushed = await (git as unknown as { hasUnpushedCommits: (id: string) => Promise<boolean> })
|
|
1467
1465
|
.hasUnpushedCommits(workspaceId);
|
|
1468
1466
|
if (dirty.length > 0 || unpushed) {
|
|
1469
|
-
throw new
|
|
1467
|
+
throw new VersionControlDomainError(
|
|
1470
1468
|
`"${target}" has edits that are not shared yet.`,
|
|
1471
1469
|
409,
|
|
1472
1470
|
{ kind: 'merge-target-busy', targetBranch: target },
|
|
@@ -1489,7 +1487,7 @@ describe('WorkflowService.mergeBranch — an agent merges branches, never an ope
|
|
|
1489
1487
|
(access.canWriteBatchAtRef as ReturnType<typeof vi.fn>).mockResolvedValue(opts.canWrite === undefined ? null : opts.canWrite);
|
|
1490
1488
|
const workspaceService = makeWorkspaceService();
|
|
1491
1489
|
const pending = opts.pending ?? makePendingCommits();
|
|
1492
|
-
const svc = new
|
|
1490
|
+
const svc = new VersionControlService(makeDb([OPEN_REQUEST]), git, makePrs(), makeChangeRequestReview(), workspaceService, access, makeFileLockService(), pending, testKbContext(), openChangeGate());
|
|
1493
1491
|
const merge = (git as unknown as { mergeChangeRequest: ReturnType<typeof vi.fn> }).mergeChangeRequest;
|
|
1494
1492
|
return { svc, git, access, merge, pending };
|
|
1495
1493
|
}
|
|
@@ -1614,7 +1612,7 @@ describe('WorkflowService.mergeBranch — an agent merges branches, never an ope
|
|
|
1614
1612
|
* refuses must not undo the open: the merge is committed locally, the request
|
|
1615
1613
|
* is a DB row, and the next push of the branch carries the commits.
|
|
1616
1614
|
*/
|
|
1617
|
-
describe('
|
|
1615
|
+
describe('VersionControlService.openChangeRequest — when the repository host refuses the push', () => {
|
|
1618
1616
|
const INPUT = { sourceBranch: 'ali/x', targetBranch: 'main', title: 'Tidy the glossary' };
|
|
1619
1617
|
|
|
1620
1618
|
function makeOpenHarness(push: ReturnType<typeof vi.fn>) {
|
|
@@ -1629,10 +1627,10 @@ describe('WorkflowService.openChangeRequest — when the repository host refuses
|
|
|
1629
1627
|
(prs.getPrDetail as ReturnType<typeof vi.fn>).mockResolvedValue({ number: 12, branch: 'ali/x', base: 'main' });
|
|
1630
1628
|
const values = vi.fn(() => ({ returning: vi.fn(async () => [{ number: 12 }]) }));
|
|
1631
1629
|
const db = { insert: vi.fn(() => ({ values })) } as unknown as Database;
|
|
1632
|
-
const svc = new
|
|
1633
|
-
db, git, prs,
|
|
1630
|
+
const svc = new VersionControlService(
|
|
1631
|
+
db, git, prs, makeChangeRequestReview(), makeWorkspaceService(), makeAccessControl(),
|
|
1634
1632
|
makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate(),
|
|
1635
|
-
{ emit } as unknown as
|
|
1633
|
+
{ emit } as unknown as VersionControlEventBus,
|
|
1636
1634
|
);
|
|
1637
1635
|
return { svc, git, prs, values, emit };
|
|
1638
1636
|
}
|
|
@@ -1716,7 +1714,7 @@ describe('WorkflowService.openChangeRequest — when the repository host refuses
|
|
|
1716
1714
|
* people the `## Affected owners` block lists, resolved to accounts and
|
|
1717
1715
|
* handed over once each; who could not be is counted.
|
|
1718
1716
|
*/
|
|
1719
|
-
describe('
|
|
1717
|
+
describe('VersionControlService.openChangeRequest — tells the change-request listeners', () => {
|
|
1720
1718
|
const INPUT = { sourceBranch: 'ali/x', targetBranch: 'main', title: ' Tidy the glossary ' };
|
|
1721
1719
|
const PATHS = ['KnowledgeBase/Sales/Deal.md', 'KnowledgeBase/Legal/Terms.md'];
|
|
1722
1720
|
const ACCOUNTS: Record<string, { id: string; email: string; name: string }> = {
|
|
@@ -1800,10 +1798,10 @@ describe('WorkflowService.openChangeRequest — tells the change-request listene
|
|
|
1800
1798
|
return found;
|
|
1801
1799
|
}),
|
|
1802
1800
|
};
|
|
1803
|
-
const svc = new
|
|
1804
|
-
db, git, prs,
|
|
1801
|
+
const svc = new VersionControlService(
|
|
1802
|
+
db, git, prs, makeChangeRequestReview(), workspaces, access,
|
|
1805
1803
|
makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate(),
|
|
1806
|
-
{ emit: vi.fn() } as unknown as
|
|
1804
|
+
{ emit: vi.fn() } as unknown as VersionControlEventBus, undefined, undefined, hooks, accounts,
|
|
1807
1805
|
);
|
|
1808
1806
|
return { svc, run, prs, access, accounts, values };
|
|
1809
1807
|
}
|
|
@@ -1934,13 +1932,13 @@ describe('WorkflowService.openChangeRequest — tells the change-request listene
|
|
|
1934
1932
|
expect(failing.run.mock.calls[0]![0]).toMatchObject({ number: 12, pushPending: false });
|
|
1935
1933
|
|
|
1936
1934
|
const missing = makeNotifyHarness({ detail: vi.fn().mockResolvedValue(null) });
|
|
1937
|
-
await expect(missing.svc.openChangeRequest('ali%2Fx', makeUser(), INPUT)).rejects.toBeInstanceOf(
|
|
1935
|
+
await expect(missing.svc.openChangeRequest('ali%2Fx', makeUser(), INPUT)).rejects.toBeInstanceOf(VersionControlValidationError);
|
|
1938
1936
|
expect(missing.run).toHaveBeenCalledTimes(1);
|
|
1939
1937
|
});
|
|
1940
1938
|
|
|
1941
1939
|
it('a refused open tells nobody: a validation failure, a conflicting auto-merge', async () => {
|
|
1942
1940
|
const invalid = makeNotifyHarness();
|
|
1943
|
-
await expect(invalid.svc.openChangeRequest('ali%2Fx', makeUser(), { ...INPUT, title: ' ' })).rejects.toBeInstanceOf(
|
|
1941
|
+
await expect(invalid.svc.openChangeRequest('ali%2Fx', makeUser(), { ...INPUT, title: ' ' })).rejects.toBeInstanceOf(VersionControlValidationError);
|
|
1944
1942
|
expect(invalid.run).not.toHaveBeenCalled();
|
|
1945
1943
|
expect(invalid.values).not.toHaveBeenCalled();
|
|
1946
1944
|
|
|
@@ -1967,7 +1965,7 @@ describe('WorkflowService.openChangeRequest — tells the change-request listene
|
|
|
1967
1965
|
* for the source's queue first — bounded, outside the lifecycle locks — and
|
|
1968
1966
|
* says plainly when there was nothing to merge.
|
|
1969
1967
|
*/
|
|
1970
|
-
describe('
|
|
1968
|
+
describe('VersionControlService.mergeBranch — waits for the source branch\'s pending commits', () => {
|
|
1971
1969
|
const SOURCE = 'alice/other';
|
|
1972
1970
|
const TARGET = 'alice/feat';
|
|
1973
1971
|
|
|
@@ -2031,9 +2029,9 @@ describe('WorkflowService.mergeBranch — waits for the source branch\'s pending
|
|
|
2031
2029
|
(git as unknown as Record<string, unknown>).remoteBranchExists = vi.fn().mockResolvedValue(true);
|
|
2032
2030
|
const merge = vi.fn(async (): Promise<unknown> => ({ kind: 'merged', sha: 'merge-sha', mergeCommit: 'merge-sha' }));
|
|
2033
2031
|
(git as unknown as Record<string, unknown>).mergeChangeRequest = merge;
|
|
2034
|
-
const svc = new
|
|
2032
|
+
const svc = new VersionControlService(
|
|
2035
2033
|
makeDb([{ number: 12, sourceBranch: 'alice/feat', targetBranch: DEFAULT_BRANCH, state: 'open' }]),
|
|
2036
|
-
git, makePrs(),
|
|
2034
|
+
git, makePrs(), makeChangeRequestReview(), makeWorkspaceService(), makeAccessControl(), makeFileLockService(),
|
|
2037
2035
|
pending, testKbContext(), openChangeGate(),
|
|
2038
2036
|
);
|
|
2039
2037
|
svc.mergeWaitForPendingCommits = wait;
|
|
@@ -2057,7 +2055,7 @@ describe('WorkflowService.mergeBranch — waits for the source branch\'s pending
|
|
|
2057
2055
|
// after a moment, the way a commit + push takes a few seconds.
|
|
2058
2056
|
const worker = new PendingCommitsWorker({
|
|
2059
2057
|
service,
|
|
2060
|
-
|
|
2058
|
+
versionControl: {
|
|
2061
2059
|
runPendingCommit: async (_ws: string, branch: string, path: string) => {
|
|
2062
2060
|
await new Promise((r) => setTimeout(r, 150));
|
|
2063
2061
|
remote.get(branch)!.add(path);
|
|
@@ -2109,8 +2107,8 @@ describe('WorkflowService.mergeBranch — waits for the source branch\'s pending
|
|
|
2109
2107
|
});
|
|
2110
2108
|
|
|
2111
2109
|
it('bounds the wait well inside the timeout an agent\'s call is forwarded under', () => {
|
|
2112
|
-
const svc = new
|
|
2113
|
-
makeDb(), makeGit(), makePrs(),
|
|
2110
|
+
const svc = new VersionControlService(
|
|
2111
|
+
makeDb(), makeGit(), makePrs(), makeChangeRequestReview(), makeWorkspaceService(), makeAccessControl(),
|
|
2114
2112
|
makeFileLockService(), makePendingCommits(), testKbContext(), openChangeGate(),
|
|
2115
2113
|
);
|
|
2116
2114
|
// Over `/api/mcp` the call reaches the tool through `@utcp/http`, whose
|
|
@@ -2201,11 +2199,11 @@ describe('WorkflowService.mergeBranch — waits for the source branch\'s pending
|
|
|
2201
2199
|
it('leaves the app\'s change-request apply as it was: no wait, same outcome', async () => {
|
|
2202
2200
|
const { service } = memoryQueue([row({ branch: 'alice/feat' })]);
|
|
2203
2201
|
const prs = makePrs();
|
|
2204
|
-
const
|
|
2202
|
+
const changeRequestReview = makeChangeRequestReview();
|
|
2205
2203
|
const mergeResult = { prNumber: 4, sha: 'abc', mergedAt: 't' };
|
|
2206
|
-
(
|
|
2204
|
+
(changeRequestReview.mergePr as ReturnType<typeof vi.fn>).mockResolvedValue(mergeResult);
|
|
2207
2205
|
(prs.getPr as ReturnType<typeof vi.fn>).mockResolvedValue({ branch: 'alice/feat', base: 'main' });
|
|
2208
|
-
const svc = new
|
|
2206
|
+
const svc = new VersionControlService(makeDb(), makeGit(), prs, changeRequestReview, makeWorkspaceService(), makeAccessControl(), makeFileLockService(), service, testKbContext(), openChangeGate());
|
|
2209
2207
|
const outcome = await svc.mergeChangeRequest(4, makeUser(), 'sha', [], 'open', 'PR title', 'main', 'w1', { bypass: true });
|
|
2210
2208
|
expect(outcome).toEqual({ kind: 'merged', result: mergeResult });
|
|
2211
2209
|
expect(service.queuedOnBranch).not.toHaveBeenCalled();
|