@bevel-software/platform-core-backend 0.35.0 → 0.37.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/agent-guide/directory-structure.md +1 -1
- package/agent-guide/onboarding.md +111 -0
- package/agent-guide/start-here.md +1 -0
- package/agent-guide/tool-manuals.md +1 -0
- package/dist/core/catalog-cache-invalidation.d.ts +2 -2
- package/dist/core/catalog-cache-invalidation.d.ts.map +1 -1
- package/dist/core/compose-embed.d.ts +2 -2
- package/dist/core/compose-embed.d.ts.map +1 -1
- package/dist/core/compose-embed.js +1 -1
- package/dist/core/compose-embed.js.map +1 -1
- package/dist/core/core-ports.d.ts +19 -4
- package/dist/core/core-ports.d.ts.map +1 -1
- package/dist/core/core-ports.js.map +1 -1
- package/dist/core/create-core-server.d.ts.map +1 -1
- package/dist/core/create-core-server.js +26 -24
- package/dist/core/create-core-server.js.map +1 -1
- package/dist/core/create-core-services.d.ts +19 -13
- package/dist/core/create-core-services.d.ts.map +1 -1
- package/dist/core/create-core-services.js +72 -57
- package/dist/core/create-core-services.js.map +1 -1
- package/dist/core/lifecycle.d.ts +4 -4
- package/dist/core/lifecycle.d.ts.map +1 -1
- package/dist/core/lifecycle.js +5 -5
- package/dist/core/lifecycle.js.map +1 -1
- package/dist/core-config.d.ts +2 -2
- package/dist/core-config.js +3 -3
- package/dist/core-config.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/modules/access/access-control.service.js +1 -1
- package/dist/modules/access/access-control.service.js.map +1 -1
- package/dist/modules/access/access-declarations.d.ts +2 -2
- package/dist/modules/access/access-declarations.d.ts.map +1 -1
- package/dist/modules/access/access-declarations.js +2 -2
- package/dist/modules/access/access-declarations.js.map +1 -1
- package/dist/modules/access/access-mutation.service.d.ts +2 -2
- package/dist/modules/access/access-mutation.service.d.ts.map +1 -1
- package/dist/modules/access/access-mutation.service.js +2 -2
- package/dist/modules/access/access-mutation.service.js.map +1 -1
- package/dist/modules/access/access-requests.routes.d.ts +2 -2
- package/dist/modules/access/access-requests.routes.d.ts.map +1 -1
- package/dist/modules/access/access-requests.routes.js +5 -5
- package/dist/modules/access/access-requests.routes.js.map +1 -1
- package/dist/modules/access/access-requests.service.d.ts +2 -2
- package/dist/modules/access/access-requests.service.d.ts.map +1 -1
- package/dist/modules/access/access-requests.service.js +11 -11
- package/dist/modules/access/access-requests.service.js.map +1 -1
- package/dist/modules/access/access.routes.d.ts +2 -2
- package/dist/modules/access/access.routes.d.ts.map +1 -1
- package/dist/modules/access/access.routes.js +9 -9
- package/dist/modules/access/access.routes.js.map +1 -1
- package/dist/modules/access/admin-locked-commit.d.ts +5 -5
- package/dist/modules/access/admin-locked-commit.d.ts.map +1 -1
- package/dist/modules/access/admin-locked-commit.js +7 -7
- package/dist/modules/access/admin-locked-commit.js.map +1 -1
- package/dist/modules/access/admin-route-helpers.d.ts +1 -1
- package/dist/modules/access/admin-route-helpers.js +5 -5
- package/dist/modules/access/admin-route-helpers.js.map +1 -1
- package/dist/modules/access/change-read-gate.d.ts +1 -1
- package/dist/modules/access/change-read-gate.js +1 -1
- package/dist/modules/access/groups-admin.service.d.ts +7 -7
- package/dist/modules/access/groups-admin.service.d.ts.map +1 -1
- package/dist/modules/access/groups-admin.service.js +6 -6
- package/dist/modules/access/groups-admin.service.js.map +1 -1
- package/dist/modules/access/reference-scan.d.ts +1 -1
- package/dist/modules/access/roles-admin.service.d.ts +7 -7
- package/dist/modules/access/roles-admin.service.d.ts.map +1 -1
- package/dist/modules/access/roles-admin.service.js +8 -8
- package/dist/modules/access/roles-admin.service.js.map +1 -1
- package/dist/modules/access/synced-groups-committer.d.ts +4 -4
- package/dist/modules/access/synced-groups-committer.d.ts.map +1 -1
- package/dist/modules/access/synced-groups-committer.js +7 -7
- package/dist/modules/access/synced-groups-committer.js.map +1 -1
- package/dist/modules/access/user-access-removal.service.d.ts +6 -6
- package/dist/modules/access/user-access-removal.service.d.ts.map +1 -1
- package/dist/modules/access/user-access-removal.service.js +4 -4
- package/dist/modules/access/user-access-removal.service.js.map +1 -1
- package/dist/modules/access-model/access-errors.d.ts +4 -4
- package/dist/modules/access-model/access-errors.d.ts.map +1 -1
- package/dist/modules/access-model/access-errors.js +4 -4
- package/dist/modules/access-model/access-errors.js.map +1 -1
- package/dist/modules/access-model/access-grammar.d.ts +1 -1
- package/dist/modules/access-model/access-grammar.js +4 -4
- package/dist/modules/access-model/change-gate.d.ts +1 -1
- package/dist/modules/access-model/change-gate.js +1 -1
- package/dist/modules/access-model/roles-yaml-guard.d.ts +4 -4
- package/dist/modules/access-model/roles-yaml-guard.d.ts.map +1 -1
- package/dist/modules/access-model/roles-yaml-guard.js +4 -4
- package/dist/modules/access-model/roles-yaml-guard.js.map +1 -1
- package/dist/modules/agent-guide/agent-guide.d.ts +19 -14
- package/dist/modules/agent-guide/agent-guide.d.ts.map +1 -1
- package/dist/modules/agent-guide/agent-guide.js +42 -18
- package/dist/modules/agent-guide/agent-guide.js.map +1 -1
- package/dist/modules/agent-guide/guide-budget.d.ts +5 -2
- package/dist/modules/agent-guide/guide-budget.d.ts.map +1 -1
- package/dist/modules/agent-guide/guide-budget.js +6 -2
- package/dist/modules/agent-guide/guide-budget.js.map +1 -1
- package/dist/modules/agent-instructions/agent-instructions.routes.d.ts +12 -5
- package/dist/modules/agent-instructions/agent-instructions.routes.d.ts.map +1 -1
- package/dist/modules/agent-instructions/agent-instructions.routes.js +13 -6
- package/dist/modules/agent-instructions/agent-instructions.routes.js.map +1 -1
- package/dist/modules/agent-instructions/compose.d.ts +15 -8
- package/dist/modules/agent-instructions/compose.d.ts.map +1 -1
- package/dist/modules/agent-instructions/compose.js +24 -10
- package/dist/modules/agent-instructions/compose.js.map +1 -1
- package/dist/modules/agent-instructions/shared-file-rules.d.ts +14 -6
- package/dist/modules/agent-instructions/shared-file-rules.d.ts.map +1 -1
- package/dist/modules/agent-instructions/shared-file-rules.js +51 -11
- package/dist/modules/agent-instructions/shared-file-rules.js.map +1 -1
- package/dist/modules/auth/account-erasure.service.d.ts +36 -7
- package/dist/modules/auth/account-erasure.service.d.ts.map +1 -1
- package/dist/modules/auth/account-erasure.service.js +30 -10
- package/dist/modules/auth/account-erasure.service.js.map +1 -1
- package/dist/modules/auth/account-hooks.d.ts +20 -0
- package/dist/modules/auth/account-hooks.d.ts.map +1 -1
- package/dist/modules/auth/account-hooks.js +10 -0
- package/dist/modules/auth/account-hooks.js.map +1 -1
- package/dist/modules/auth/account-switch-lock.js +2 -2
- package/dist/modules/auth/account-switch-lock.js.map +1 -1
- package/dist/modules/auth/account.routes.d.ts +7 -2
- package/dist/modules/auth/account.routes.d.ts.map +1 -1
- package/dist/modules/auth/account.routes.js +23 -4
- package/dist/modules/auth/account.routes.js.map +1 -1
- package/dist/modules/auth/auth.service.d.ts +1 -1
- package/dist/modules/auth/auth.service.js +4 -4
- package/dist/modules/auth/auth.service.js.map +1 -1
- package/dist/modules/auth/index.d.ts +1 -0
- package/dist/modules/auth/index.d.ts.map +1 -1
- package/dist/modules/database/connection.d.ts.map +1 -1
- package/dist/modules/database/connection.js +11 -0
- package/dist/modules/database/connection.js.map +1 -1
- package/dist/modules/database/core-schema.js +2 -2
- package/dist/modules/database/core-schema.js.map +1 -1
- package/dist/modules/diff/diff.routes.d.ts +3 -3
- package/dist/modules/diff/diff.routes.d.ts.map +1 -1
- package/dist/modules/diff/diff.routes.js +7 -7
- package/dist/modules/diff/diff.routes.js.map +1 -1
- package/dist/modules/embed/embed.routes.js +1 -1
- package/dist/modules/embed/embed.routes.js.map +1 -1
- package/dist/modules/embed/embed.service.d.ts +4 -4
- package/dist/modules/embed/embed.service.d.ts.map +1 -1
- package/dist/modules/embed/embed.service.js +18 -18
- package/dist/modules/embed/embed.service.js.map +1 -1
- package/dist/modules/kb-fs/branch-name.js +8 -8
- package/dist/modules/kb-fs/branch-name.js.map +1 -1
- package/dist/modules/kb-fs/file-change-notifier.d.ts +51 -26
- package/dist/modules/kb-fs/file-change-notifier.d.ts.map +1 -1
- package/dist/modules/kb-fs/file-change-notifier.js +6 -8
- package/dist/modules/kb-fs/file-change-notifier.js.map +1 -1
- package/dist/modules/kb-fs/locking-filesystem.d.ts +9 -16
- package/dist/modules/kb-fs/locking-filesystem.d.ts.map +1 -1
- package/dist/modules/kb-fs/locking-filesystem.js +31 -39
- package/dist/modules/kb-fs/locking-filesystem.js.map +1 -1
- package/dist/modules/kb-fs/repo-path.js +5 -5
- package/dist/modules/kb-fs/repo-path.js.map +1 -1
- package/dist/modules/kb-fs/tmp-ref.d.ts +2 -2
- package/dist/modules/kb-fs/tmp-ref.d.ts.map +1 -1
- package/dist/modules/kb-fs/tmp-ref.js +2 -2
- package/dist/modules/kb-fs/tmp-ref.js.map +1 -1
- package/dist/modules/kb-sync/index.d.ts +1 -1
- package/dist/modules/kb-sync/index.d.ts.map +1 -1
- package/dist/modules/kb-sync/kb-sync.interface.d.ts +3 -3
- package/dist/modules/kb-sync/kb-sync.interface.d.ts.map +1 -1
- package/dist/modules/kb-sync/kb-sync.service.d.ts +3 -3
- package/dist/modules/kb-sync/kb-sync.service.d.ts.map +1 -1
- package/dist/modules/kb-sync/kb-sync.service.js +10 -10
- package/dist/modules/kb-sync/kb-sync.service.js.map +1 -1
- package/dist/modules/mcp/mcp.service.d.ts +11 -4
- package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
- package/dist/modules/mcp/mcp.service.js +75 -19
- package/dist/modules/mcp/mcp.service.js.map +1 -1
- package/dist/modules/onboarding/onboarding.contract.d.ts +1 -1
- package/dist/modules/onboarding/onboarding.routes.js +2 -2
- package/dist/modules/onboarding/onboarding.routes.js.map +1 -1
- package/dist/modules/onboarding/starter-pack.service.d.ts +5 -7
- package/dist/modules/onboarding/starter-pack.service.d.ts.map +1 -1
- package/dist/modules/onboarding/starter-pack.service.js +4 -4
- package/dist/modules/onboarding/starter-pack.service.js.map +1 -1
- package/dist/modules/plugins/join-request-jobs.service.d.ts +2 -2
- package/dist/modules/plugins/join-request-jobs.service.d.ts.map +1 -1
- package/dist/modules/plugins/join-request-jobs.service.js +7 -7
- package/dist/modules/plugins/join-request-jobs.service.js.map +1 -1
- package/dist/modules/plugins/join-requests.service.d.ts +3 -3
- package/dist/modules/plugins/join-requests.service.d.ts.map +1 -1
- package/dist/modules/plugins/join-requests.service.js +5 -5
- package/dist/modules/plugins/join-requests.service.js.map +1 -1
- package/dist/modules/plugins/plugin-rename.service.js +1 -1
- package/dist/modules/plugins/plugin-rename.service.js.map +1 -1
- package/dist/modules/plugins/plugins.routes.d.ts +2 -2
- package/dist/modules/plugins/plugins.routes.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.routes.js +8 -8
- package/dist/modules/plugins/plugins.routes.js.map +1 -1
- package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts +77 -2
- package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts.map +1 -1
- package/dist/modules/secrets-vault/db-secrets-vault.service.js +479 -53
- package/dist/modules/secrets-vault/db-secrets-vault.service.js.map +1 -1
- package/dist/modules/secrets-vault/index.d.ts +2 -1
- package/dist/modules/secrets-vault/index.d.ts.map +1 -1
- package/dist/modules/secrets-vault/index.js +1 -0
- package/dist/modules/secrets-vault/index.js.map +1 -1
- package/dist/modules/secrets-vault/managed-sign-in-erasure.d.ts +36 -0
- package/dist/modules/secrets-vault/managed-sign-in-erasure.d.ts.map +1 -0
- package/dist/modules/secrets-vault/managed-sign-in-erasure.js +37 -0
- package/dist/modules/secrets-vault/managed-sign-in-erasure.js.map +1 -0
- package/dist/modules/secrets-vault/secrets-vault.contract.d.ts +152 -0
- package/dist/modules/secrets-vault/secrets-vault.contract.d.ts.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.contract.js.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.routes.d.ts +7 -1
- package/dist/modules/secrets-vault/secrets-vault.routes.d.ts.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.routes.js +125 -10
- package/dist/modules/secrets-vault/secrets-vault.routes.js.map +1 -1
- package/dist/modules/settings/connection-check.js +1 -1
- package/dist/modules/settings/connection-check.js.map +1 -1
- package/dist/modules/settings/deployment-settings.service.js +1 -1
- package/dist/modules/settings/git-root-folders.js +1 -1
- package/dist/modules/settings/git-root-folders.js.map +1 -1
- package/dist/modules/settings/setup.routes.d.ts +1 -1
- package/dist/modules/settings/setup.routes.js +1 -1
- package/dist/modules/skills/pending-skills.service.d.ts +3 -3
- package/dist/modules/skills/pending-skills.service.d.ts.map +1 -1
- package/dist/modules/skills/pending-skills.service.js +4 -4
- package/dist/modules/skills/pending-skills.service.js.map +1 -1
- package/dist/modules/skills/skill-access-requests.routes.d.ts +2 -2
- package/dist/modules/skills/skill-access-requests.routes.d.ts.map +1 -1
- package/dist/modules/skills/skill-access-requests.routes.js +5 -5
- package/dist/modules/skills/skill-access-requests.routes.js.map +1 -1
- package/dist/modules/tool-helpers/tool-context.d.ts +4 -4
- package/dist/modules/tool-helpers/tool-context.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool-context.js +2 -2
- package/dist/modules/tool-helpers/tool-context.js.map +1 -1
- package/dist/modules/tool-helpers/tool-handler.js +2 -2
- package/dist/modules/tool-helpers/tool-handler.js.map +1 -1
- package/dist/modules/tool-helpers/tool.contract.d.ts +4 -4
- package/dist/modules/tool-helpers/tool.contract.d.ts.map +1 -1
- package/dist/modules/tool-manuals/mcp-server-edit.service.js +1 -1
- package/dist/modules/tool-manuals/mcp-server-edit.service.js.map +1 -1
- package/dist/modules/tool-manuals/pending-tools.service.d.ts +3 -3
- package/dist/modules/tool-manuals/pending-tools.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/pending-tools.service.js +4 -4
- package/dist/modules/tool-manuals/pending-tools.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-delete.service.js +1 -1
- package/dist/modules/tool-manuals/tool-delete.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.contract.d.ts +43 -3
- package/dist/modules/tool-manuals/tool-manuals.contract.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts +6 -0
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.js +51 -5
- package/dist/modules/tool-manuals/tool-manuals.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts +3 -0
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.js +36 -15
- package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -1
- package/dist/modules/version-control/agent-tools/change-request-read-shape.d.ts.map +1 -0
- package/dist/modules/version-control/agent-tools/change-request-read-shape.js.map +1 -0
- package/dist/modules/version-control/agent-tools/change-request-read.tools.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/agent-tools/change-request-read.tools.js +2 -2
- package/dist/modules/version-control/agent-tools/change-request-read.tools.js.map +1 -0
- package/dist/modules/version-control/agent-tools/change-request-summary.d.ts.map +1 -0
- package/dist/modules/version-control/agent-tools/change-request-summary.js.map +1 -0
- package/dist/modules/{workflow/agent-tools/workflow.tools.d.ts → version-control/agent-tools/version-control.tools.d.ts} +4 -4
- package/dist/modules/version-control/agent-tools/version-control.tools.d.ts.map +1 -0
- package/dist/modules/{workflow/agent-tools/workflow.tools.js → version-control/agent-tools/version-control.tools.js} +31 -31
- package/dist/modules/version-control/agent-tools/version-control.tools.js.map +1 -0
- package/dist/modules/{workflow → version-control}/change-request-hooks.d.ts +1 -1
- package/dist/modules/version-control/change-request-hooks.d.ts.map +1 -0
- package/dist/modules/version-control/change-request-hooks.js.map +1 -0
- package/dist/modules/version-control/change-request-review/approval-lock.d.ts.map +1 -0
- package/dist/modules/version-control/change-request-review/approval-lock.js.map +1 -0
- package/dist/modules/{workflow/review-workflow/review-workflow.interface.d.ts → version-control/change-request-review/change-request-review.interface.d.ts} +2 -2
- package/dist/modules/version-control/change-request-review/change-request-review.interface.d.ts.map +1 -0
- package/dist/modules/version-control/change-request-review/change-request-review.interface.js +2 -0
- package/dist/modules/version-control/change-request-review/change-request-review.interface.js.map +1 -0
- package/dist/modules/{workflow/review-workflow/review-workflow.service.d.ts → version-control/change-request-review/change-request-review.service.d.ts} +3 -3
- package/dist/modules/version-control/change-request-review/change-request-review.service.d.ts.map +1 -0
- package/dist/modules/{workflow/review-workflow/review-workflow.service.js → version-control/change-request-review/change-request-review.service.js} +26 -26
- package/dist/modules/version-control/change-request-review/change-request-review.service.js.map +1 -0
- package/dist/modules/{workflow → version-control}/event-bus.d.ts +8 -8
- package/dist/modules/version-control/event-bus.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/event-bus.js +4 -4
- package/dist/modules/version-control/event-bus.js.map +1 -0
- package/dist/modules/{workflow → version-control}/events-delivery.d.ts +4 -4
- package/dist/modules/version-control/events-delivery.d.ts.map +1 -0
- package/dist/modules/version-control/events-delivery.js.map +1 -0
- package/dist/modules/{workflow → version-control}/events.routes.d.ts +4 -4
- package/dist/modules/version-control/events.routes.d.ts.map +1 -0
- package/dist/modules/version-control/events.routes.js.map +1 -0
- package/dist/modules/{workflow → version-control}/file-lock.service.d.ts +2 -2
- package/dist/modules/version-control/file-lock.service.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/file-lock.service.js +6 -6
- package/dist/modules/version-control/file-lock.service.js.map +1 -0
- package/dist/modules/version-control/git/change-request-link.d.ts.map +1 -0
- package/dist/modules/version-control/git/change-request-link.js.map +1 -0
- package/dist/modules/version-control/git/git-version.d.ts.map +1 -0
- package/dist/modules/version-control/git/git-version.js.map +1 -0
- package/dist/modules/{workflow → version-control}/git/git.service.d.ts +26 -8
- package/dist/modules/version-control/git/git.service.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/git/git.service.js +106 -55
- package/dist/modules/version-control/git/git.service.js.map +1 -0
- package/dist/modules/version-control/git/merge-commit.d.ts.map +1 -0
- package/dist/modules/version-control/git/merge-commit.js.map +1 -0
- package/dist/modules/version-control/git/node-git-runner.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/git/node-git-runner.js +1 -1
- package/dist/modules/version-control/git/node-git-runner.js.map +1 -0
- package/dist/modules/{workflow → version-control}/git/pull-request.service.d.ts +5 -5
- package/dist/modules/version-control/git/pull-request.service.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/git/pull-request.service.js +10 -10
- package/dist/modules/version-control/git/pull-request.service.js.map +1 -0
- package/dist/modules/{workflow → version-control}/index.d.ts +6 -5
- package/dist/modules/version-control/index.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/index.js +3 -2
- package/dist/modules/version-control/index.js.map +1 -0
- package/dist/modules/{workflow → version-control}/pending-commits.service.d.ts +2 -2
- package/dist/modules/version-control/pending-commits.service.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/pending-commits.service.js +2 -2
- package/dist/modules/version-control/pending-commits.service.js.map +1 -0
- package/dist/modules/{workflow → version-control}/pending-commits.worker.d.ts +5 -5
- package/dist/modules/version-control/pending-commits.worker.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/pending-commits.worker.js +3 -3
- package/dist/modules/version-control/pending-commits.worker.js.map +1 -0
- package/dist/modules/{workflow → version-control}/read-on-branch.d.ts +2 -2
- package/dist/modules/version-control/read-on-branch.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/read-on-branch.js +2 -2
- package/dist/modules/version-control/read-on-branch.js.map +1 -0
- package/dist/modules/version-control/recovery-bot.d.ts.map +1 -0
- package/dist/modules/version-control/recovery-bot.js.map +1 -0
- package/dist/modules/version-control/sanitize-error.d.ts.map +1 -0
- package/dist/modules/version-control/sanitize-error.js.map +1 -0
- package/dist/modules/{workflow/workflow-hooks.d.ts → version-control/version-control-hooks.d.ts} +33 -6
- package/dist/modules/version-control/version-control-hooks.d.ts.map +1 -0
- package/dist/modules/{workflow/workflow-hooks.js → version-control/version-control-hooks.js} +20 -3
- package/dist/modules/version-control/version-control-hooks.js.map +1 -0
- package/dist/modules/{workflow/workflow.routes.d.ts → version-control/version-control.routes.d.ts} +6 -5
- package/dist/modules/version-control/version-control.routes.d.ts.map +1 -0
- package/dist/modules/{workflow/workflow.routes.js → version-control/version-control.routes.js} +61 -60
- package/dist/modules/version-control/version-control.routes.js.map +1 -0
- package/dist/modules/{workflow/workflow.service.d.ts → version-control/version-control.service.d.ts} +26 -46
- package/dist/modules/version-control/version-control.service.d.ts.map +1 -0
- package/dist/modules/{workflow/workflow.service.js → version-control/version-control.service.js} +93 -107
- package/dist/modules/version-control/version-control.service.js.map +1 -0
- package/dist/modules/workspace/agent-access.gate.d.ts +5 -5
- package/dist/modules/workspace/agent-access.gate.d.ts.map +1 -1
- package/dist/modules/workspace/agent-access.gate.js +1 -1
- package/dist/modules/workspace/git-internals.middleware.d.ts +1 -1
- package/dist/modules/workspace/git-internals.middleware.js +2 -2
- package/dist/modules/workspace/kb-repository.js +1 -1
- package/dist/modules/workspace/kb-repository.js.map +1 -1
- package/dist/modules/workspace/startup/kb-git.d.ts +1 -1
- package/dist/modules/workspace/startup/kb-git.d.ts.map +1 -1
- package/dist/modules/workspace/startup/kb-git.js +1 -1
- package/dist/modules/workspace/startup/kb-git.js.map +1 -1
- package/dist/modules/workspace/startup/steps/seed-tree.d.ts +2 -2
- package/dist/modules/workspace/startup/steps/seed-tree.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/seed-tree.js +1 -1
- package/dist/modules/workspace/startup/steps/seed-tree.js.map +1 -1
- package/dist/modules/workspace/startup/steps/template-files.step.d.ts +2 -2
- package/dist/modules/workspace/startup/steps/template-files.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/template-files.step.js +2 -2
- package/dist/modules/workspace/startup/steps/template-files.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/template-source.d.ts +17 -4
- package/dist/modules/workspace/startup/steps/template-source.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/template-source.js +8 -5
- package/dist/modules/workspace/startup/steps/template-source.js.map +1 -1
- package/dist/modules/workspace/workspace-tmp.js +3 -3
- package/dist/modules/workspace/workspace-tmp.js.map +1 -1
- package/dist/modules/workspace/workspace.routes.d.ts +4 -4
- package/dist/modules/workspace/workspace.routes.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.routes.js +22 -22
- package/dist/modules/workspace/workspace.routes.js.map +1 -1
- package/dist/modules/workspace/workspace.service.d.ts +6 -6
- package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.service.js +11 -11
- package/dist/modules/workspace/workspace.service.js.map +1 -1
- package/dist/modules/workspace/workspace.tools.d.ts +2 -1
- package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.tools.js +15 -10
- package/dist/modules/workspace/workspace.tools.js.map +1 -1
- package/dist/shared/canonical-file-identity.d.ts +2 -2
- package/dist/shared/canonical-file-identity.js +5 -5
- package/dist/shared/canonical-file-identity.js.map +1 -1
- package/dist/shared/domain-errors.d.ts +39 -39
- package/dist/shared/domain-errors.d.ts.map +1 -1
- package/dist/shared/domain-errors.js +44 -44
- package/dist/shared/domain-errors.js.map +1 -1
- package/dist/shared/fire-and-forget.d.ts +14 -0
- package/dist/shared/fire-and-forget.d.ts.map +1 -0
- package/dist/shared/fire-and-forget.js +23 -0
- package/dist/shared/fire-and-forget.js.map +1 -0
- package/dist/shared/git.contract.d.ts +1 -1
- package/dist/shared/git.contract.js +1 -1
- package/dist/shared/http-errors.d.ts +3 -3
- package/dist/shared/http-errors.d.ts.map +1 -1
- package/dist/shared/http-errors.js +1 -1
- package/dist/shared/http-errors.js.map +1 -1
- package/dist/shared/pending-proposals.d.ts +3 -3
- package/dist/shared/pending-proposals.d.ts.map +1 -1
- package/dist/shared/pending-proposals.js +2 -2
- package/dist/shared/pending-proposals.js.map +1 -1
- package/dist/tenancy/static-tenant-source.js +1 -1
- package/dist/tenancy/static-tenant-source.js.map +1 -1
- package/migrations/0012_agent_audit.sql +40 -40
- package/migrations/0013_agent_identity_and_key_soft_delete.sql +29 -29
- package/migrations/meta/0012_snapshot.json +2246 -2246
- package/migrations/meta/0013_snapshot.json +2258 -2258
- package/package.json +4 -4
- package/src/__tests__/account-admin.ts +27 -0
- package/src/__tests__/capturing-logger.ts +36 -0
- package/src/__tests__/hexis-catalog.ts +4 -4
- package/src/__tests__/kb-context.ts +30 -30
- package/src/__tests__/kb-layout-config.test.ts +21 -0
- package/src/__tests__/open-change-gate.ts +1 -1
- package/src/__tests__/real-access.ts +16 -0
- package/src/__tests__/real-auth.ts +13 -0
- package/src/__tests__/real-readers.ts +27 -0
- package/src/__tests__/real-version-control.ts +22 -0
- package/src/__tests__/tool-handler.ts +15 -0
- package/src/__tests__/tool-wiring.ts +10 -4
- package/src/__tests__/workspace-service.ts +1 -1
- package/src/core/__tests__/catalog-cache-invalidation.test.ts +3 -3
- package/src/core/__tests__/commit-announcements-wired-once.test.ts +53 -0
- package/src/core/__tests__/compose-embed.test.ts +1 -1
- package/src/core/__tests__/damaged-document.tools.test.ts +3 -3
- package/src/core/__tests__/erasure-slices-wired-once.test.ts +46 -0
- package/src/core/__tests__/gated-boot.test.ts +2 -2
- package/src/core/__tests__/lifecycle.test.ts +9 -9
- package/src/core/catalog-cache-invalidation.ts +2 -2
- package/src/core/compose-embed.ts +3 -3
- package/src/core/core-ports.ts +19 -4
- package/src/core/create-core-server.ts +39 -25
- package/src/core/create-core-services.ts +83 -65
- package/src/core/lifecycle.ts +9 -9
- package/src/core-config.ts +3 -3
- package/src/index.ts +5 -5
- package/src/modules/access/__tests__/access-control.admin-root-floor.test.ts +4 -4
- package/src/modules/access/__tests__/access-own-read-grant.test.ts +14 -14
- package/src/modules/access/__tests__/access-requests.routes.test.ts +23 -23
- package/src/modules/access/__tests__/access.routes.admins.test.ts +4 -4
- package/src/modules/access/__tests__/access.routes.batch.test.ts +4 -4
- package/src/modules/access/__tests__/access.routes.folder-governs.test.ts +6 -6
- package/src/modules/access/__tests__/access.routes.group-grant.test.ts +6 -6
- package/src/modules/access/__tests__/access.routes.overrides.test.ts +5 -5
- package/src/modules/access/__tests__/access.routes.proposal-branch.test.ts +6 -6
- package/src/modules/access/__tests__/access.routes.prospective.test.ts +3 -3
- package/src/modules/access/__tests__/access.routes.revoke.test.ts +6 -6
- package/src/modules/access/__tests__/access.routes.unknown-email.test.ts +6 -6
- package/src/modules/access/__tests__/admin-locked-commit.test.ts +6 -6
- package/src/modules/access/__tests__/admin-route-helpers.test.ts +5 -5
- package/src/modules/access/__tests__/groups-admin.service.test.ts +44 -44
- package/src/modules/access/__tests__/roles-admin.security.test.ts +14 -13
- package/src/modules/access/__tests__/roles-admin.service.test.ts +34 -34
- package/src/modules/access/__tests__/roles-capabilities.test.ts +29 -29
- package/src/modules/access/__tests__/roles.routes.test.ts +11 -11
- package/src/modules/access/__tests__/synced-groups-committer.test.ts +14 -14
- package/src/modules/access/__tests__/user-access-removal.service.test.ts +33 -33
- package/src/modules/access/access-control.service.ts +1 -1
- package/src/modules/access/access-declarations.ts +2 -2
- package/src/modules/access/access-mutation.service.ts +2 -2
- package/src/modules/access/access-requests.routes.ts +7 -7
- package/src/modules/access/access-requests.service.ts +13 -13
- package/src/modules/access/access.routes.ts +11 -11
- package/src/modules/access/admin-locked-commit.ts +11 -11
- package/src/modules/access/admin-route-helpers.ts +5 -5
- package/src/modules/access/change-read-gate.ts +1 -1
- package/src/modules/access/groups-admin.service.ts +7 -7
- package/src/modules/access/reference-scan.ts +1 -1
- package/src/modules/access/roles-admin.service.ts +9 -9
- package/src/modules/access/synced-groups-committer.ts +11 -11
- package/src/modules/access/user-access-removal.service.ts +7 -7
- package/src/modules/access-model/__tests__/access-grammar.test.ts +2 -2
- package/src/modules/access-model/access-errors.ts +4 -4
- package/src/modules/access-model/access-grammar.ts +4 -4
- package/src/modules/access-model/change-gate.ts +1 -1
- package/src/modules/access-model/roles-yaml-guard.ts +4 -4
- package/src/modules/agent-guide/__tests__/agent-guide.test.ts +19 -4
- package/src/modules/agent-guide/__tests__/agent-guide.tools.test.ts +1 -1
- package/src/modules/agent-guide/__tests__/guide-matches-code.test.ts +2 -2
- package/src/modules/agent-guide/agent-guide.ts +48 -22
- package/src/modules/agent-guide/guide-budget.ts +6 -2
- package/src/modules/agent-instructions/__tests__/agent-instructions.route.test.ts +4 -5
- package/src/modules/agent-instructions/__tests__/compose.test.ts +1 -1
- package/src/modules/agent-instructions/__tests__/shared-file-rules.test.ts +113 -7
- package/src/modules/agent-instructions/agent-instructions.routes.ts +12 -5
- package/src/modules/agent-instructions/compose.ts +24 -9
- package/src/modules/agent-instructions/shared-file-rules.ts +53 -11
- package/src/modules/agent-scope/__tests__/agent-surfaces.connect-as.test.ts +1 -1
- package/src/modules/audit/__tests__/agent-rest-audit.middleware.test.ts +113 -113
- package/src/modules/audit/__tests__/event-classifier.test.ts +121 -121
- package/src/modules/audit/event-classifier.ts +155 -155
- package/src/modules/auth/__tests__/account-deactivation.test.ts +1 -1
- package/src/modules/auth/__tests__/account-erasure.approval-gate.test.ts +4 -4
- package/src/modules/auth/__tests__/account-erasure.participants.test.ts +56 -0
- package/src/modules/auth/__tests__/account-switch-lock.pg.test.ts +2 -2
- package/src/modules/auth/__tests__/account-switch-lock.test.ts +2 -2
- package/src/modules/auth/__tests__/account.routes.test.ts +73 -11
- package/src/modules/auth/__tests__/auth.service.test.ts +1 -1
- package/src/modules/auth/account-erasure.service.ts +27 -9
- package/src/modules/auth/account-hooks.ts +34 -0
- package/src/modules/auth/account-switch-lock.ts +2 -2
- package/src/modules/auth/account.routes.ts +23 -5
- package/src/modules/auth/auth.service.ts +4 -4
- package/src/modules/auth/index.ts +1 -0
- package/src/modules/database/__tests__/advisory-lock.test.ts +169 -169
- package/src/modules/database/__tests__/connection.pg.test.ts +55 -0
- package/src/modules/database/__tests__/connection.test.ts +30 -0
- package/src/modules/database/__tests__/migrations-unqualified.test.ts +32 -32
- package/src/modules/database/connection.ts +12 -0
- package/src/modules/database/core-schema.ts +2 -2
- package/src/modules/diff/__tests__/diff.routes.read-gate.test.ts +2 -2
- package/src/modules/diff/__tests__/diff.routes.rejectPathsLocked.test.ts +12 -12
- package/src/modules/diff/diff.routes.ts +8 -8
- package/src/modules/embed/__tests__/embed.service.lock.test.ts +7 -7
- package/src/modules/embed/__tests__/embed.service.test.ts +48 -62
- package/src/modules/embed/__tests__/embed.tools.test.ts +1 -1
- package/src/modules/embed/embed.routes.ts +1 -1
- package/src/modules/embed/embed.service.ts +17 -17
- package/src/modules/kb-fs/__tests__/branch-name.test.ts +2 -2
- package/src/modules/kb-fs/__tests__/file-change-notifier.test.ts +23 -4
- package/src/modules/kb-fs/__tests__/locking-filesystem.test.ts +264 -305
- package/src/modules/kb-fs/__tests__/move-with-edits.test.ts +103 -40
- package/src/modules/kb-fs/__tests__/repo-path.test.ts +8 -8
- package/src/modules/kb-fs/branch-name.ts +8 -8
- package/src/modules/kb-fs/file-change-notifier.ts +55 -32
- package/src/modules/kb-fs/locking-filesystem.ts +34 -48
- package/src/modules/kb-fs/repo-path.ts +5 -5
- package/src/modules/kb-fs/tmp-ref.ts +3 -3
- package/src/modules/kb-sync/__tests__/kb-sync.service.test.ts +36 -36
- package/src/modules/kb-sync/index.ts +1 -1
- package/src/modules/kb-sync/kb-sync.interface.ts +3 -3
- package/src/modules/kb-sync/kb-sync.service.ts +9 -9
- package/src/modules/marketplace/__tests__/github-facade.test.ts +1 -1
- package/src/modules/marketplace/__tests__/marketplace-git.test.ts +1 -1
- package/src/modules/mcp/__tests__/mcp-proxy-helpers.test.ts +4 -2
- package/src/modules/mcp/__tests__/mcp.e2e.test.ts +69 -8
- package/src/modules/mcp/__tests__/mcp.service.test.ts +91 -13
- package/src/modules/mcp/__tests__/read-only-hint.pg.test.ts +194 -0
- package/src/modules/mcp/mcp.service.ts +89 -28
- package/src/modules/onboarding/__tests__/starter-pack.service.test.ts +59 -59
- package/src/modules/onboarding/onboarding.contract.ts +1 -1
- package/src/modules/onboarding/onboarding.routes.ts +2 -2
- package/src/modules/onboarding/starter-pack.service.ts +7 -9
- package/src/modules/plugins/__tests__/bundle-dialect.e2e.test.ts +1 -1
- package/src/modules/plugins/__tests__/compile-marketplace.test.ts +1 -1
- package/src/modules/plugins/__tests__/join-request-jobs.service.test.ts +43 -43
- package/src/modules/plugins/__tests__/join-requests.service.test.ts +19 -19
- package/src/modules/plugins/__tests__/join-requests.settlement.test.ts +26 -26
- package/src/modules/plugins/__tests__/plugin-rename.service.test.ts +46 -21
- package/src/modules/plugins/__tests__/plugins.routes.test.ts +31 -31
- package/src/modules/plugins/join-request-jobs.service.ts +10 -10
- package/src/modules/plugins/join-requests.service.ts +4 -4
- package/src/modules/plugins/plugin-rename.service.ts +1 -1
- package/src/modules/plugins/plugins.routes.ts +9 -9
- package/src/modules/secrets-vault/__tests__/db-secrets-vault.managed.test.ts +773 -0
- package/src/modules/secrets-vault/__tests__/db-secrets-vault.oauth.test.ts +28 -1
- package/src/modules/secrets-vault/__tests__/managed-sign-in.route.test.ts +351 -0
- package/src/modules/secrets-vault/db-secrets-vault.service.ts +562 -95
- package/src/modules/secrets-vault/index.ts +7 -0
- package/src/modules/secrets-vault/managed-sign-in-erasure.ts +41 -0
- package/src/modules/secrets-vault/secrets-variable-loader.ts +134 -134
- package/src/modules/secrets-vault/secrets-vault.contract.ts +152 -0
- package/src/modules/secrets-vault/secrets-vault.routes.ts +157 -10
- package/src/modules/settings/__tests__/repository-source.test.ts +1 -1
- package/src/modules/settings/__tests__/setup.routes.layout-phase.test.ts +1 -1
- package/src/modules/settings/__tests__/setup.routes.managed-phase.test.ts +1 -1
- package/src/modules/settings/connection-check.ts +1 -1
- package/src/modules/settings/deployment-settings.service.ts +1 -1
- package/src/modules/settings/git-root-folders.ts +1 -1
- package/src/modules/settings/setup.routes.ts +1 -1
- package/src/modules/skills/__tests__/allowed-tools-warn.tools.test.ts +3 -3
- package/src/modules/skills/__tests__/branch-skills.tools.test.ts +1 -1
- package/src/modules/skills/__tests__/pending-skills.service.test.ts +8 -8
- package/src/modules/skills/__tests__/skill-access-requests.routes.test.ts +18 -18
- package/src/modules/skills/__tests__/skills.service.test.ts +3 -3
- package/src/modules/skills/pending-skills.service.ts +3 -3
- package/src/modules/skills/skill-access-requests.routes.ts +7 -7
- package/src/modules/tool-helpers/__tests__/agent-roles-write.test.ts +4 -4
- package/src/modules/tool-helpers/__tests__/branch-declaration.test.ts +3 -3
- package/src/modules/tool-helpers/__tests__/can-write.tools.test.ts +3 -3
- package/src/modules/tool-helpers/__tests__/phase4-tools.test.ts +4 -4
- package/src/modules/tool-helpers/__tests__/tools-surface.test.ts +3 -3
- package/src/modules/tool-helpers/__tests__/validate-token.test.ts +1 -1
- package/src/modules/tool-helpers/tool-context.ts +6 -6
- package/src/modules/tool-helpers/tool-handler.ts +2 -2
- package/src/modules/tool-helpers/tool.contract.ts +4 -4
- package/src/modules/tool-manuals/__tests__/pending-tools.service.test.ts +9 -9
- package/src/modules/tool-manuals/__tests__/tool-manuals.managed-sign-in.test.ts +89 -0
- package/src/modules/tool-manuals/__tests__/tool-manuals.restart.test.ts +1 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.tools.test.ts +36 -1
- package/src/modules/tool-manuals/mcp-server-edit.service.ts +1 -1
- package/src/modules/tool-manuals/pending-tools.service.ts +3 -3
- package/src/modules/tool-manuals/tool-delete.service.ts +1 -1
- package/src/modules/tool-manuals/tool-manuals.contract.ts +41 -3
- package/src/modules/tool-manuals/tool-manuals.service.ts +53 -5
- package/src/modules/tool-manuals/tool-manuals.tools.ts +41 -15
- package/src/modules/tool-registry/__tests__/own-tool-schemas.test.ts +4 -4
- package/src/modules/tool-registry/__tests__/read-only-hints.test.ts +3 -3
- package/src/modules/tool-registry/__tests__/tool-description-length.test.ts +6 -6
- package/src/modules/{workflow → version-control}/__tests__/apply-failure.test.ts +54 -54
- package/src/modules/{workflow → version-control}/__tests__/event-bus.test.ts +27 -27
- package/src/modules/{workflow → version-control}/__tests__/events-delivery.test.ts +37 -37
- package/src/modules/{workflow → version-control}/__tests__/file-lock.service.deletion-gate.test.ts +2 -2
- package/src/modules/{workflow → version-control}/__tests__/file-lock.service.path-identity.test.ts +8 -8
- package/src/modules/{workflow → version-control}/__tests__/merge-announces-tree.test.ts +11 -11
- package/src/modules/{workflow → version-control}/__tests__/pending-commits.worker.concurrency.test.ts +9 -9
- package/src/modules/{workflow → version-control}/__tests__/pending-commits.worker.test.ts +25 -25
- package/src/modules/{workflow → version-control}/__tests__/preserve-roles-yaml.test.ts +42 -42
- package/src/modules/version-control/__tests__/public-surface.test.ts +114 -0
- package/src/modules/{workflow/__tests__/workflow.routes.folder-proposals.test.ts → version-control/__tests__/version-control.routes.folder-proposals.test.ts} +18 -18
- package/src/modules/{workflow/__tests__/workflow.routes.fork-point-file.test.ts → version-control/__tests__/version-control.routes.fork-point-file.test.ts} +19 -19
- package/src/modules/{workflow/__tests__/workflow.routes.history-read-gate.test.ts → version-control/__tests__/version-control.routes.history-read-gate.test.ts} +13 -13
- package/src/modules/{workflow/__tests__/workflow.routes.lock-path.test.ts → version-control/__tests__/version-control.routes.lock-path.test.ts} +18 -18
- package/src/modules/{workflow/__tests__/workflow.routes.open-change-request.test.ts → version-control/__tests__/version-control.routes.open-change-request.test.ts} +7 -7
- package/src/modules/{workflow/__tests__/workflow.routes.push-refused.test.ts → version-control/__tests__/version-control.routes.push-refused.test.ts} +14 -14
- package/src/modules/{workflow/__tests__/workflow.service.branch-in-use.test.ts → version-control/__tests__/version-control.service.branch-in-use.test.ts} +6 -6
- package/src/modules/{workflow/__tests__/workflow.service.commitFileWhileLocked.test.ts → version-control/__tests__/version-control.service.commitFileWhileLocked.test.ts} +14 -14
- package/src/modules/{workflow/__tests__/workflow.service.delete-branch.test.ts → version-control/__tests__/version-control.service.delete-branch.test.ts} +14 -14
- package/src/modules/{workflow/__tests__/workflow.service.deleted-branch-sweep.test.ts → version-control/__tests__/version-control.service.deleted-branch-sweep.test.ts} +4 -4
- package/src/modules/{workflow/__tests__/workflow.service.facade.test.ts → version-control/__tests__/version-control.service.facade.test.ts} +100 -102
- package/src/modules/{workflow/__tests__/workflow.service.folder-proposals.test.ts → version-control/__tests__/version-control.service.folder-proposals.test.ts} +7 -7
- package/src/modules/{workflow/__tests__/workflow.service.platform-restore.test.ts → version-control/__tests__/version-control.service.platform-restore.test.ts} +6 -6
- package/src/modules/{workflow/__tests__/workflow.service.read-gate.test.ts → version-control/__tests__/version-control.service.read-gate.test.ts} +9 -9
- package/src/modules/{workflow/__tests__/workflow.service.releaseLock.test.ts → version-control/__tests__/version-control.service.releaseLock.test.ts} +85 -75
- package/src/modules/{workflow/__tests__/workflow.service.repository-replaced.test.ts → version-control/__tests__/version-control.service.repository-replaced.test.ts} +4 -4
- package/src/modules/{workflow/__tests__/workflow.service.sync.test.ts → version-control/__tests__/version-control.service.sync.test.ts} +17 -17
- package/src/modules/{workflow/__tests__/workflow.service.update-change-request.pg.test.ts → version-control/__tests__/version-control.service.update-change-request.pg.test.ts} +6 -6
- package/src/modules/{workflow/__tests__/workflow.service.update-change-request.test.ts → version-control/__tests__/version-control.service.update-change-request.test.ts} +11 -11
- package/src/modules/{workflow/__tests__/workflow.service.update-from-target.test.ts → version-control/__tests__/version-control.service.update-from-target.test.ts} +22 -22
- package/src/modules/{workflow → version-control}/agent-tools/__tests__/change-request-read.tools.test.ts +3 -3
- package/src/modules/{workflow → version-control}/agent-tools/__tests__/update-change-request.parity.test.ts +16 -16
- package/src/modules/{workflow/agent-tools/__tests__/workflow.tools.test.ts → version-control/agent-tools/__tests__/version-control.tools.test.ts} +9 -9
- package/src/modules/{workflow → version-control}/agent-tools/change-request-read.tools.ts +2 -2
- package/src/modules/{workflow/agent-tools/workflow.tools.ts → version-control/agent-tools/version-control.tools.ts} +30 -30
- package/src/modules/{workflow → version-control}/change-request-hooks.ts +1 -1
- package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/approval-states.test.ts +5 -5
- package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/cancel-pr.test.ts +8 -8
- package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/carry-approvals-forward.test.ts +6 -6
- package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/erase-approver.test.ts +5 -5
- package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/merge-gate.test.ts +3 -3
- package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/merge-records-own-commit.test.ts +3 -3
- package/src/modules/{workflow/review-workflow/review-workflow.interface.ts → version-control/change-request-review/change-request-review.interface.ts} +1 -1
- package/src/modules/{workflow/review-workflow/review-workflow.service.ts → version-control/change-request-review/change-request-review.service.ts} +28 -28
- package/src/modules/{workflow → version-control}/event-bus.ts +14 -14
- package/src/modules/{workflow → version-control}/events-delivery.ts +11 -11
- package/src/modules/{workflow → version-control}/events.routes.ts +5 -5
- package/src/modules/{workflow → version-control}/file-lock.service.ts +6 -6
- package/src/modules/{workflow → version-control}/git/__tests__/git-test-helpers.ts +3 -3
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.accessGating.test.ts +5 -5
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.appliedChange.test.ts +4 -4
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.changedFilesForPr.test.ts +16 -16
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.changedPathsMemo.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.commitChanges.test.ts +3 -3
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.commitFile.strayPath.test.ts +10 -10
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.commitFile.test.ts +3 -3
- package/src/modules/version-control/git/__tests__/git.service.commitLanded.test.ts +199 -0
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.createBranch.test.ts +3 -3
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.deleteBranch.test.ts +7 -7
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.diffFileAtCommit.test.ts +9 -9
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.diffFileBetweenBranches.test.ts +23 -23
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.fileBytesAtCommit.test.ts +7 -7
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.fileContentsAtCommit.test.ts +3 -3
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.forkPoint.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.history-guards.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.list-branches.test.ts +12 -12
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.listTrackedFiles.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.logForFile.test.ts +6 -6
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.mergeChangeRequest.test.ts +99 -22
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.mergeIntoBranch.test.ts +16 -16
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.pendingChanges.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.postMergePull.test.ts +5 -5
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.prFetchFailure.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.pull.test.ts +12 -12
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.readFileAtRef.test.ts +3 -3
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.revertPathsAndPush.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.status.test.ts +4 -4
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.syncFromRemote.test.ts +8 -8
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.worktrees.test.ts +4 -4
- package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.list-fetch.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.test.ts +6 -6
- package/src/modules/{workflow → version-control}/git/git.service.ts +112 -59
- package/src/modules/{workflow → version-control}/git/node-git-runner.ts +1 -1
- package/src/modules/{workflow → version-control}/git/pull-request.service.ts +12 -12
- package/src/modules/{workflow → version-control}/index.ts +6 -5
- package/src/modules/{workflow → version-control}/pending-commits.service.ts +2 -2
- package/src/modules/{workflow → version-control}/pending-commits.worker.ts +8 -8
- package/src/modules/{workflow → version-control}/read-on-branch.ts +2 -2
- package/src/modules/{workflow/workflow-hooks.ts → version-control/version-control-hooks.ts} +44 -5
- package/src/modules/{workflow/workflow.routes.ts → version-control/version-control.routes.ts} +64 -63
- package/src/modules/{workflow/workflow.service.ts → version-control/version-control.service.ts} +96 -109
- package/src/modules/workspace/__tests__/agent-access.gate.test.ts +8 -8
- package/src/modules/workspace/__tests__/agent-downloads.test.ts +13 -16
- package/src/modules/workspace/__tests__/agent-uploads.test.ts +11 -12
- package/src/modules/workspace/__tests__/escape-sequences.routes.test.ts +11 -16
- package/src/modules/workspace/__tests__/file-stat-access.test.ts +3 -3
- package/src/modules/workspace/__tests__/git-internals.security.test.ts +27 -27
- package/src/modules/workspace/__tests__/kb-repository.test.ts +1 -1
- package/src/modules/workspace/__tests__/rest-tool-arguments.test.ts +3 -3
- package/src/modules/workspace/__tests__/start-session.default-branch.test.ts +152 -0
- package/src/modules/workspace/__tests__/workspace-paths-inside-the-repo.test.ts +6 -6
- package/src/modules/workspace/__tests__/workspace-tmp.tools.test.ts +13 -14
- package/src/modules/workspace/__tests__/workspace.routes.at-ref.test.ts +6 -6
- package/src/modules/workspace/__tests__/workspace.routes.branch-errors.test.ts +4 -4
- package/src/modules/workspace/__tests__/workspace.routes.create-grant.test.ts +6 -6
- package/src/modules/workspace/__tests__/workspace.routes.delete.test.ts +8 -8
- package/src/modules/workspace/__tests__/workspace.routes.download-implies-read.test.ts +4 -4
- package/src/modules/workspace/__tests__/workspace.routes.download.test.ts +6 -6
- package/src/modules/workspace/__tests__/workspace.routes.file-writes.test.ts +6 -6
- package/src/modules/workspace/__tests__/workspace.routes.folder-zip-access.test.ts +4 -4
- package/src/modules/workspace/__tests__/workspace.routes.folders.test.ts +6 -6
- package/src/modules/workspace/__tests__/workspace.routes.move-platform-files.test.ts +7 -7
- package/src/modules/workspace/__tests__/workspace.routes.read-gate.test.ts +13 -13
- package/src/modules/workspace/__tests__/workspace.service.any-workspace-credentials.test.ts +1 -1
- package/src/modules/workspace/__tests__/workspace.service.replaced-repository.test.ts +1 -1
- package/src/modules/workspace/__tests__/workspace.service.worktrees.test.ts +1 -1
- package/src/modules/workspace/__tests__/workspace.tools.agents-file.test.ts +5 -5
- package/src/modules/workspace/__tests__/workspace.tools.branch-errors.test.ts +5 -5
- package/src/modules/workspace/__tests__/workspace.tools.test.ts +27 -27
- package/src/modules/workspace/agent-access.gate.ts +5 -5
- package/src/modules/workspace/git-internals.middleware.ts +2 -2
- package/src/modules/workspace/kb-repository.ts +1 -1
- package/src/modules/workspace/startup/__tests__/kb-startup-runner.degraded.test.ts +1 -1
- package/src/modules/workspace/startup/__tests__/kb-startup-runner.test.ts +1 -1
- package/src/modules/workspace/startup/__tests__/kb-startup-runner.worktrees.test.ts +1 -1
- package/src/modules/workspace/startup/kb-git.ts +1 -1
- package/src/modules/workspace/startup/steps/__tests__/steps.test.ts +94 -70
- package/src/modules/workspace/startup/steps/seed-tree.ts +4 -5
- package/src/modules/workspace/startup/steps/template-files.step.ts +4 -5
- package/src/modules/workspace/startup/steps/template-source.ts +21 -6
- package/src/modules/workspace/workspace-tmp.ts +4 -4
- package/src/modules/workspace/workspace.routes.ts +26 -26
- package/src/modules/workspace/workspace.service.ts +11 -11
- package/src/modules/workspace/workspace.tools.ts +17 -10
- package/src/shared/__tests__/canonical-file-identity.test.ts +5 -5
- package/src/shared/__tests__/fire-and-forget.test.ts +39 -0
- package/src/shared/__tests__/http-errors.test.ts +4 -4
- package/src/shared/canonical-file-identity.ts +5 -5
- package/src/shared/domain-errors.ts +44 -44
- package/src/shared/fire-and-forget.ts +26 -0
- package/src/shared/git.contract.ts +1 -1
- package/src/shared/http-errors.ts +3 -3
- package/src/shared/kb-context.ts +130 -130
- package/src/shared/pending-proposals.ts +4 -4
- package/src/tenancy/__tests__/tenant-host.test.ts +372 -372
- package/src/tenancy/__tests__/tenant-runtime.test.ts +221 -221
- package/src/tenancy/__tests__/tenant-secrets.test.ts +35 -35
- package/src/tenancy/index.ts +35 -35
- package/src/tenancy/static-tenant-source.ts +1 -1
- package/src/tenancy/tenant-host.ts +261 -261
- package/src/tenancy/tenant-runtime.ts +208 -208
- package/src/tenancy/tenant-source.contract.ts +59 -59
- package/dist/modules/workflow/agent-tools/change-request-read-shape.d.ts.map +0 -1
- package/dist/modules/workflow/agent-tools/change-request-read-shape.js.map +0 -1
- package/dist/modules/workflow/agent-tools/change-request-read.tools.d.ts.map +0 -1
- package/dist/modules/workflow/agent-tools/change-request-read.tools.js.map +0 -1
- package/dist/modules/workflow/agent-tools/change-request-summary.d.ts.map +0 -1
- package/dist/modules/workflow/agent-tools/change-request-summary.js.map +0 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +0 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.js.map +0 -1
- package/dist/modules/workflow/change-request-hooks.d.ts.map +0 -1
- package/dist/modules/workflow/change-request-hooks.js.map +0 -1
- package/dist/modules/workflow/event-bus.d.ts.map +0 -1
- package/dist/modules/workflow/event-bus.js.map +0 -1
- package/dist/modules/workflow/events-delivery.d.ts.map +0 -1
- package/dist/modules/workflow/events-delivery.js.map +0 -1
- package/dist/modules/workflow/events.routes.d.ts.map +0 -1
- package/dist/modules/workflow/events.routes.js.map +0 -1
- package/dist/modules/workflow/file-lock.service.d.ts.map +0 -1
- package/dist/modules/workflow/file-lock.service.js.map +0 -1
- package/dist/modules/workflow/git/change-request-link.d.ts.map +0 -1
- package/dist/modules/workflow/git/change-request-link.js.map +0 -1
- package/dist/modules/workflow/git/git-version.d.ts.map +0 -1
- package/dist/modules/workflow/git/git-version.js.map +0 -1
- package/dist/modules/workflow/git/git.service.d.ts.map +0 -1
- package/dist/modules/workflow/git/git.service.js.map +0 -1
- package/dist/modules/workflow/git/merge-commit.d.ts.map +0 -1
- package/dist/modules/workflow/git/merge-commit.js.map +0 -1
- package/dist/modules/workflow/git/node-git-runner.d.ts.map +0 -1
- package/dist/modules/workflow/git/node-git-runner.js.map +0 -1
- package/dist/modules/workflow/git/pull-request.service.d.ts.map +0 -1
- package/dist/modules/workflow/git/pull-request.service.js.map +0 -1
- package/dist/modules/workflow/index.d.ts.map +0 -1
- package/dist/modules/workflow/index.js.map +0 -1
- package/dist/modules/workflow/pending-commits.service.d.ts.map +0 -1
- package/dist/modules/workflow/pending-commits.service.js.map +0 -1
- package/dist/modules/workflow/pending-commits.worker.d.ts.map +0 -1
- package/dist/modules/workflow/pending-commits.worker.js.map +0 -1
- package/dist/modules/workflow/read-on-branch.d.ts.map +0 -1
- package/dist/modules/workflow/read-on-branch.js.map +0 -1
- package/dist/modules/workflow/recovery-bot.d.ts.map +0 -1
- package/dist/modules/workflow/recovery-bot.js.map +0 -1
- package/dist/modules/workflow/review-workflow/approval-lock.d.ts.map +0 -1
- package/dist/modules/workflow/review-workflow/approval-lock.js.map +0 -1
- package/dist/modules/workflow/review-workflow/review-workflow.interface.d.ts.map +0 -1
- package/dist/modules/workflow/review-workflow/review-workflow.interface.js +0 -2
- package/dist/modules/workflow/review-workflow/review-workflow.interface.js.map +0 -1
- package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts.map +0 -1
- package/dist/modules/workflow/review-workflow/review-workflow.service.js.map +0 -1
- package/dist/modules/workflow/sanitize-error.d.ts.map +0 -1
- package/dist/modules/workflow/sanitize-error.js.map +0 -1
- package/dist/modules/workflow/workflow-hooks.d.ts.map +0 -1
- package/dist/modules/workflow/workflow-hooks.js.map +0 -1
- package/dist/modules/workflow/workflow.routes.d.ts.map +0 -1
- package/dist/modules/workflow/workflow.routes.js.map +0 -1
- package/dist/modules/workflow/workflow.service.d.ts.map +0 -1
- package/dist/modules/workflow/workflow.service.js.map +0 -1
- package/src/modules/mcp/__tests__/read-only-hint.e2e.test.ts +0 -213
- /package/dist/modules/{workflow → version-control}/agent-tools/change-request-read-shape.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/agent-tools/change-request-read-shape.js +0 -0
- /package/dist/modules/{workflow → version-control}/agent-tools/change-request-read.tools.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/agent-tools/change-request-summary.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/agent-tools/change-request-summary.js +0 -0
- /package/dist/modules/{workflow → version-control}/change-request-hooks.js +0 -0
- /package/dist/modules/{workflow/review-workflow → version-control/change-request-review}/approval-lock.d.ts +0 -0
- /package/dist/modules/{workflow/review-workflow → version-control/change-request-review}/approval-lock.js +0 -0
- /package/dist/modules/{workflow → version-control}/events-delivery.js +0 -0
- /package/dist/modules/{workflow → version-control}/events.routes.js +0 -0
- /package/dist/modules/{workflow → version-control}/git/change-request-link.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/git/change-request-link.js +0 -0
- /package/dist/modules/{workflow → version-control}/git/git-version.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/git/git-version.js +0 -0
- /package/dist/modules/{workflow → version-control}/git/merge-commit.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/git/merge-commit.js +0 -0
- /package/dist/modules/{workflow → version-control}/git/node-git-runner.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/recovery-bot.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/recovery-bot.js +0 -0
- /package/dist/modules/{workflow → version-control}/sanitize-error.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/sanitize-error.js +0 -0
- /package/src/modules/{workflow → version-control}/__tests__/change-request-hooks.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/__tests__/fake-file-lock-db.ts +0 -0
- /package/src/modules/{workflow → version-control}/__tests__/pending-commits.canonical.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/__tests__/pending-commits.enqueue-if-absent.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/__tests__/pending-commits.repository-replaced.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/__tests__/sanitize-error.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/agent-tools/__tests__/change-request-read-shape.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/agent-tools/change-request-read-shape.ts +0 -0
- /package/src/modules/{workflow → version-control}/agent-tools/change-request-summary.ts +0 -0
- /package/src/modules/{workflow/review-workflow → version-control/change-request-review}/approval-lock.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/branchAuthor.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/change-request-link.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/git-version.failure.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/git-version.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/node-git-runner.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.getPrDetail.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.placeholder.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.viewer-can-cancel.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.viewer-can-delete.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.viewer-can-update.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/change-request-link.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/git-version.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/merge-commit.ts +0 -0
- /package/src/modules/{workflow → version-control}/recovery-bot.ts +0 -0
- /package/src/modules/{workflow → version-control}/sanitize-error.ts +0 -0
|
@@ -7,13 +7,13 @@ import express from 'express';
|
|
|
7
7
|
import { PgDialect } from 'drizzle-orm/pg-core';
|
|
8
8
|
import type { SQL } from 'drizzle-orm';
|
|
9
9
|
import { describe, it, expect, afterEach, vi } from 'vitest';
|
|
10
|
-
import {
|
|
10
|
+
import { realDisk } from '../../../__tests__/real-disk.js';
|
|
11
11
|
|
|
12
12
|
import type { IAccessControl } from '../access-control.interface.js';
|
|
13
|
-
import type { WorkspaceService } from '../../workspace/
|
|
14
|
-
import {
|
|
15
|
-
import type {
|
|
16
|
-
import type {
|
|
13
|
+
import type { WorkspaceService } from '../../workspace/index.js';
|
|
14
|
+
import { realAuthService } from '../../../__tests__/real-auth.js';
|
|
15
|
+
import type { VersionControlService } from '../../version-control/index.js';
|
|
16
|
+
import type { VersionControlEventBus } from '../../version-control/index.js';
|
|
17
17
|
import type { FileTreeEntry } from '@bevel-software/platform-shared';
|
|
18
18
|
import { createAccessRoutes } from '../access.routes.js';
|
|
19
19
|
import { usersDbDouble } from './users-db-double.js';
|
|
@@ -64,7 +64,7 @@ async function makeHarness(
|
|
|
64
64
|
const realAccess = new AccessControlService(
|
|
65
65
|
{ getWorkspacePath: async () => workspaceDir, readFile: async () => ROLES } as unknown as WorkspaceService,
|
|
66
66
|
KB,
|
|
67
|
-
|
|
67
|
+
realDisk(),
|
|
68
68
|
);
|
|
69
69
|
const accessControl = {
|
|
70
70
|
// Admin gate: the route's assertCanMutate calls canWrite('roles.yaml').
|
|
@@ -113,7 +113,7 @@ async function makeHarness(
|
|
|
113
113
|
// exactly like FileLockService (nesting bugs must fail here too).
|
|
114
114
|
const locks = new Map<string, { id: string; name: string }>();
|
|
115
115
|
const lockRow = (h: { id: string; name: string }) => ({ holderUserId: h.id, holderName: h.name });
|
|
116
|
-
const
|
|
116
|
+
const versionControlService = {
|
|
117
117
|
getLock: vi.fn(async (_w: string, _b: string, p: string) => {
|
|
118
118
|
const h = locks.get(p);
|
|
119
119
|
return h ? lockRow(h) : null;
|
|
@@ -131,9 +131,9 @@ async function makeHarness(
|
|
|
131
131
|
// Write-free: the lock-aware filesystem writes to disk; this just commits the
|
|
132
132
|
// dirty tree. Not exercised by these route tests (no rename), but kept honest.
|
|
133
133
|
commitChanges: vi.fn(async () => ({})),
|
|
134
|
-
} as unknown as
|
|
134
|
+
} as unknown as VersionControlService;
|
|
135
135
|
|
|
136
|
-
const eventBus = { emit: vi.fn() } as unknown as
|
|
136
|
+
const eventBus = { emit: vi.fn() } as unknown as VersionControlEventBus;
|
|
137
137
|
const accounts = [
|
|
138
138
|
{ email: 'off@example.com', deactivatedAt: new Date('2026-09-01T00:00:00Z') },
|
|
139
139
|
'on@example.com',
|
|
@@ -173,7 +173,7 @@ async function makeHarness(
|
|
|
173
173
|
|
|
174
174
|
// The real auth service over the same double, so the promotion's switch
|
|
175
175
|
// lock and read run as they do in production (`whileSwitchedOn`).
|
|
176
|
-
const authService =
|
|
176
|
+
const authService = realAuthService(db, { jwtSecret: 'test', adminEmail: '', adminPassword: '', allowedEmailDomains: [] });
|
|
177
177
|
vi.spyOn(authService, 'getUserById').mockImplementation(async () => ADMIN);
|
|
178
178
|
|
|
179
179
|
const app = express();
|
|
@@ -182,7 +182,7 @@ async function makeHarness(
|
|
|
182
182
|
(req as unknown as { userId: string }).userId = ADMIN.id;
|
|
183
183
|
next();
|
|
184
184
|
});
|
|
185
|
-
app.use('/api', createAccessRoutes(accessControl, workspaceService, authService, authService,
|
|
185
|
+
app.use('/api', createAccessRoutes(accessControl, workspaceService, authService, authService, versionControlService, eventBus, db, testKbContext({ kbDirName: KB }), realDisk()));
|
|
186
186
|
|
|
187
187
|
const server = await new Promise<Server>((resolve) => {
|
|
188
188
|
const s = app.listen(0, () => resolve(s));
|
|
@@ -3,12 +3,12 @@ import fs from 'node:fs/promises';
|
|
|
3
3
|
import path from 'node:path';
|
|
4
4
|
import os from 'node:os';
|
|
5
5
|
|
|
6
|
-
import type { AuthUser,
|
|
7
|
-
import type { WorkspaceService } from '../../workspace/
|
|
6
|
+
import type { AuthUser, IVersionControlService } from '@bevel-software/platform-shared';
|
|
7
|
+
import type { WorkspaceService } from '../../workspace/index.js';
|
|
8
8
|
import type { AccessControlService } from '../access-control.service.js';
|
|
9
|
-
import type {
|
|
9
|
+
import type { VersionControlEventBus } from '../../version-control/index.js';
|
|
10
10
|
import { createSyncedGroupsCommitter } from '../synced-groups-committer.js';
|
|
11
|
-
import { PushNeedsAgentResolutionError,
|
|
11
|
+
import { PushNeedsAgentResolutionError, VersionControlValidationError } from '../../../shared/domain-errors.js';
|
|
12
12
|
|
|
13
13
|
const KB = 'knowledge-base';
|
|
14
14
|
const BOT: AuthUser = { id: 'bot-1', email: 'directory-sync@bevel.local', name: 'Directory Sync Bot' };
|
|
@@ -26,7 +26,7 @@ describe('createSyncedGroupsCommitter.persist — post-commit push failures', ()
|
|
|
26
26
|
});
|
|
27
27
|
|
|
28
28
|
function makeDeps(
|
|
29
|
-
|
|
29
|
+
versionControlOverrides: Partial<
|
|
30
30
|
Record<'commitChanges' | 'releaseLock' | 'hasQueuedCommit' | 'hasUnpushedCommits', unknown>
|
|
31
31
|
> = {},
|
|
32
32
|
) {
|
|
@@ -44,7 +44,7 @@ describe('createSyncedGroupsCommitter.persist — post-commit push failures', ()
|
|
|
44
44
|
// Default: the branch still carries the landed-but-unpushed commit — the
|
|
45
45
|
// truthful answer everywhere except the worker-won-the-race scenario.
|
|
46
46
|
const hasUnpushedCommits = vi.fn(async () => true);
|
|
47
|
-
const
|
|
47
|
+
const versionControlService = {
|
|
48
48
|
acquireLock: vi.fn(async () => ({ acquired: true, lock: {} })),
|
|
49
49
|
releaseLock,
|
|
50
50
|
releaseLockNoCommit,
|
|
@@ -52,13 +52,13 @@ describe('createSyncedGroupsCommitter.persist — post-commit push failures', ()
|
|
|
52
52
|
hasQueuedCommit,
|
|
53
53
|
hasUnpushedCommits,
|
|
54
54
|
commitChanges: vi.fn(async () => ({})),
|
|
55
|
-
...
|
|
56
|
-
} as unknown as
|
|
55
|
+
...versionControlOverrides,
|
|
56
|
+
} as unknown as IVersionControlService;
|
|
57
57
|
const accessControl = { invalidate: vi.fn() } as unknown as AccessControlService;
|
|
58
|
-
const eventBus = { emit: vi.fn() } as unknown as
|
|
58
|
+
const eventBus = { emit: vi.fn() } as unknown as VersionControlEventBus;
|
|
59
59
|
const committer = createSyncedGroupsCommitter({
|
|
60
60
|
workspaceService,
|
|
61
|
-
|
|
61
|
+
versionControlService,
|
|
62
62
|
accessControl,
|
|
63
63
|
eventBus,
|
|
64
64
|
kbDirName: KB,
|
|
@@ -99,7 +99,7 @@ describe('createSyncedGroupsCommitter.persist — post-commit push failures', ()
|
|
|
99
99
|
.mockResolvedValueOnce(undefined)
|
|
100
100
|
// The committer's arm probe: nothing left to release.
|
|
101
101
|
.mockRejectedValue(
|
|
102
|
-
new
|
|
102
|
+
new VersionControlValidationError('Cannot release lock: not held by you.', {
|
|
103
103
|
kind: 'lock-not-held',
|
|
104
104
|
}),
|
|
105
105
|
);
|
|
@@ -125,7 +125,7 @@ describe('createSyncedGroupsCommitter.persist — post-commit push failures', ()
|
|
|
125
125
|
// unpublished forever. With the queue consulted directly, an empty queue
|
|
126
126
|
// must surface the original push failure.
|
|
127
127
|
const releaseLock = vi.fn().mockRejectedValue(
|
|
128
|
-
new
|
|
128
|
+
new VersionControlValidationError('Cannot release lock: not held by you.', {
|
|
129
129
|
kind: 'lock-not-held',
|
|
130
130
|
}),
|
|
131
131
|
);
|
|
@@ -154,7 +154,7 @@ describe('createSyncedGroupsCommitter.persist — post-commit push failures', ()
|
|
|
154
154
|
.fn()
|
|
155
155
|
.mockResolvedValueOnce(undefined) // writeFiles' release: enqueued + dropped
|
|
156
156
|
.mockRejectedValue(
|
|
157
|
-
new
|
|
157
|
+
new VersionControlValidationError('Cannot release lock: not held by you.', {
|
|
158
158
|
kind: 'lock-not-held',
|
|
159
159
|
}),
|
|
160
160
|
);
|
|
@@ -171,7 +171,7 @@ describe('createSyncedGroupsCommitter.persist — post-commit push failures', ()
|
|
|
171
171
|
|
|
172
172
|
it('REJECTS when the queue itself cannot be read (armed must be PROVEN, never assumed)', async () => {
|
|
173
173
|
const releaseLock = vi.fn().mockRejectedValue(
|
|
174
|
-
new
|
|
174
|
+
new VersionControlValidationError('Cannot release lock: not held by you.', {
|
|
175
175
|
kind: 'lock-not-held',
|
|
176
176
|
}),
|
|
177
177
|
);
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
2
|
-
import {
|
|
2
|
+
import { realDisk } from '../../../__tests__/real-disk.js';
|
|
3
3
|
import fs from 'node:fs/promises';
|
|
4
4
|
import path from 'node:path';
|
|
5
5
|
import os from 'node:os';
|
|
6
6
|
import { fileURLToPath } from 'node:url';
|
|
7
7
|
|
|
8
|
-
import type { WorkspaceService } from '../../workspace/
|
|
9
|
-
import type {
|
|
8
|
+
import type { WorkspaceService } from '../../workspace/index.js';
|
|
9
|
+
import type { VersionControlService } from '../../version-control/index.js';
|
|
10
10
|
import type { AuthUser } from '@bevel-software/platform-shared';
|
|
11
11
|
import { DEFAULT_BRANCH } from '@bevel-software/platform-shared';
|
|
12
12
|
import { PushNeedsAgentResolutionError } from '../../../shared/domain-errors.js';
|
|
@@ -62,7 +62,7 @@ function stubWorkspace(workspaceDir: string): WorkspaceService {
|
|
|
62
62
|
} as unknown as WorkspaceService;
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
-
function
|
|
65
|
+
function stubVersionControl(opts: { failCommit?: boolean; pushNeedsResolution?: boolean } = {}) {
|
|
66
66
|
const commits: { summary: string; paths: string[]; author: string }[] = [];
|
|
67
67
|
const locks = new Map<string, AuthUser>();
|
|
68
68
|
const lockRow = (h: AuthUser) => ({ holderUserId: h.id, holderName: h.name });
|
|
@@ -89,7 +89,7 @@ function stubWorkflow(opts: { failCommit?: boolean; pushNeedsResolution?: boolea
|
|
|
89
89
|
if (opts.pushNeedsResolution) throw new PushNeedsAgentResolutionError(DEFAULT_BRANCH, paths[0], 'diverged', 'rebase failed');
|
|
90
90
|
return {} as unknown;
|
|
91
91
|
},
|
|
92
|
-
} as unknown as
|
|
92
|
+
} as unknown as VersionControlService;
|
|
93
93
|
return { svc, commits, locks };
|
|
94
94
|
}
|
|
95
95
|
|
|
@@ -167,11 +167,11 @@ describe('UserAccessRemovalService', () => {
|
|
|
167
167
|
|
|
168
168
|
const read = (rel: string) => fs.readFile(path.join(repo, rel), 'utf-8');
|
|
169
169
|
|
|
170
|
-
function build(
|
|
171
|
-
const access = new AccessControlService(workspace as never, KB,
|
|
170
|
+
function build(versionControl = stubVersionControl(), owners: string[] = ['owner@x.io'], disk: ITreeWalker = realDisk()) {
|
|
171
|
+
const access = new AccessControlService(workspace as never, KB, realDisk());
|
|
172
172
|
return {
|
|
173
|
-
|
|
174
|
-
service: new UserAccessRemovalService(workspace,
|
|
173
|
+
versionControl,
|
|
174
|
+
service: new UserAccessRemovalService(workspace, versionControl.svc, access, disk, KB, () => DEFAULT_BRANCH, undefined, owners),
|
|
175
175
|
};
|
|
176
176
|
}
|
|
177
177
|
|
|
@@ -236,12 +236,12 @@ describe('UserAccessRemovalService', () => {
|
|
|
236
236
|
});
|
|
237
237
|
|
|
238
238
|
it('removes the address from all four kinds of file in ONE commit named by the anonymised id', async () => {
|
|
239
|
-
const { service,
|
|
239
|
+
const { service, versionControl } = build();
|
|
240
240
|
const before = await read('access.md');
|
|
241
241
|
const result = await service.remove(ADMIN, LEE, 'deleted-1234');
|
|
242
242
|
|
|
243
|
-
expect(
|
|
244
|
-
const [commit] =
|
|
243
|
+
expect(versionControl.commits).toHaveLength(1);
|
|
244
|
+
const [commit] = versionControl.commits;
|
|
245
245
|
expect(commit.summary).toBe('Remove erased account deleted-1234 from roles, groups and access rules');
|
|
246
246
|
expect(commit.summary).not.toContain('lee');
|
|
247
247
|
expect(commit.author).toBe('admin@x.io');
|
|
@@ -258,15 +258,15 @@ describe('UserAccessRemovalService', () => {
|
|
|
258
258
|
expect(await read('Sales/access.md')).not.toContain('lee@x.io');
|
|
259
259
|
expect((await service.report(LEE)).total).toBe(0);
|
|
260
260
|
// No locks left behind.
|
|
261
|
-
expect(
|
|
261
|
+
expect(versionControl.locks.size).toBe(0);
|
|
262
262
|
});
|
|
263
263
|
|
|
264
264
|
it('counts synced groups but never writes them, reporting the file as still naming the user', async () => {
|
|
265
265
|
await write(repo, 'synced-groups.yaml', 'groups:\n Engineering:\n - lee@x.io\n');
|
|
266
|
-
const { service,
|
|
266
|
+
const { service, versionControl } = build();
|
|
267
267
|
expect((await service.report(LEE)).groups).toBe(2);
|
|
268
268
|
const result = await service.remove(ADMIN, LEE, 'deleted-1');
|
|
269
|
-
expect(
|
|
269
|
+
expect(versionControl.commits[0].paths).not.toContain(`${KB}/synced-groups.yaml`);
|
|
270
270
|
expect(result.stillNamedIn).toEqual(['synced-groups.yaml']);
|
|
271
271
|
});
|
|
272
272
|
|
|
@@ -278,11 +278,11 @@ describe('UserAccessRemovalService', () => {
|
|
|
278
278
|
.spyOn(AccessControlService.prototype, 'canWriteBatchAtRef')
|
|
279
279
|
.mockImplementation(async (_ws, _ref, _email, paths) => new Map(paths.map((p) => [p, p !== 'Sales/Plan.md'])));
|
|
280
280
|
try {
|
|
281
|
-
const { service,
|
|
281
|
+
const { service, versionControl } = build();
|
|
282
282
|
const result = await service.remove(ADMIN, LEE, 'deleted-1');
|
|
283
283
|
|
|
284
|
-
expect(
|
|
285
|
-
expect(
|
|
284
|
+
expect(versionControl.commits).toHaveLength(1);
|
|
285
|
+
expect(versionControl.commits[0].paths.sort()).toEqual(
|
|
286
286
|
['Sales/access.md', 'groups.yaml', 'roles.yaml'].map((p) => `${KB}/${p}`).sort(),
|
|
287
287
|
);
|
|
288
288
|
expect(result.removedFrom.sort()).toEqual(['Sales/access.md', 'groups.yaml', 'roles.yaml']);
|
|
@@ -291,7 +291,7 @@ describe('UserAccessRemovalService', () => {
|
|
|
291
291
|
expect(await read('Sales/Plan.md')).toBe(NODE);
|
|
292
292
|
expect(await read('roles.yaml')).not.toContain('lee@x.io');
|
|
293
293
|
expect(await read('Sales/access.md')).not.toContain('lee@x.io');
|
|
294
|
-
expect(
|
|
294
|
+
expect(versionControl.locks.size).toBe(0);
|
|
295
295
|
} finally {
|
|
296
296
|
canWrite.mockRestore();
|
|
297
297
|
}
|
|
@@ -308,9 +308,9 @@ describe('UserAccessRemovalService', () => {
|
|
|
308
308
|
|
|
309
309
|
// The pre-check only ever narrows the set; with nothing known, attempt
|
|
310
310
|
// them all — the lock gate remains the authority.
|
|
311
|
-
const { service,
|
|
311
|
+
const { service, versionControl } = build();
|
|
312
312
|
const result = await service.remove(ADMIN, LEE, 'deleted-1');
|
|
313
|
-
expect(
|
|
313
|
+
expect(versionControl.commits).toHaveLength(1);
|
|
314
314
|
expect(result.removedFrom.sort()).toEqual(['Sales/Plan.md', 'Sales/access.md', 'groups.yaml', 'roles.yaml']);
|
|
315
315
|
expect(result.stillNamedIn).toEqual([]);
|
|
316
316
|
} finally {
|
|
@@ -330,25 +330,25 @@ describe('UserAccessRemovalService', () => {
|
|
|
330
330
|
});
|
|
331
331
|
|
|
332
332
|
it('refuses the owner and the last Admin, writing nothing', async () => {
|
|
333
|
-
const { service,
|
|
333
|
+
const { service, versionControl } = build(stubVersionControl(), ['Lee@x.io']);
|
|
334
334
|
const report = await service.report(LEE);
|
|
335
335
|
expect(report.removable).toBe(false);
|
|
336
336
|
expect(report.blockedReason).toBe('The owner stays in roles and access rules.');
|
|
337
337
|
await expect(service.remove(ADMIN, LEE, 'deleted-1')).rejects.toMatchObject({ status: 409 });
|
|
338
338
|
|
|
339
|
-
const other = build(
|
|
339
|
+
const other = build(stubVersionControl(), []);
|
|
340
340
|
expect((await other.service.report('admin@x.io')).removable).toBe(true);
|
|
341
341
|
await write(repo, 'roles.yaml', 'roles:\n Admin:\n - lee@x.io\n');
|
|
342
342
|
expect((await other.service.report(LEE)).blockedReason).toMatch(/last Admin/);
|
|
343
343
|
await expect(other.service.remove(ADMIN, LEE, 'deleted-1')).rejects.toMatchObject({ status: 409 });
|
|
344
344
|
|
|
345
|
-
expect(
|
|
346
|
-
expect(other.
|
|
345
|
+
expect(versionControl.commits).toHaveLength(0);
|
|
346
|
+
expect(other.versionControl.commits).toHaveLength(0);
|
|
347
347
|
expect(await read('groups.yaml')).toBe(GROUPS);
|
|
348
348
|
});
|
|
349
349
|
|
|
350
350
|
it('a failed commit restores every file and leaves them naming the user', async () => {
|
|
351
|
-
const { service } = build(
|
|
351
|
+
const { service } = build(stubVersionControl({ failCommit: true }));
|
|
352
352
|
await expect(service.remove(ADMIN, LEE, 'deleted-1')).rejects.toThrow(/push rejected/);
|
|
353
353
|
expect(await read('roles.yaml')).toBe(ROLES);
|
|
354
354
|
expect(await read('Sales/access.md')).toBe(SALES_ACCESS);
|
|
@@ -356,19 +356,19 @@ describe('UserAccessRemovalService', () => {
|
|
|
356
356
|
});
|
|
357
357
|
|
|
358
358
|
it('refuses to commit a partial cleanup when a folder cannot be listed', async () => {
|
|
359
|
-
const real =
|
|
359
|
+
const real = realDisk();
|
|
360
360
|
const holey = {
|
|
361
361
|
walkKb: async (...args: Parameters<ITreeWalker['walkKb']>) => {
|
|
362
362
|
const result = await real.walkKb(...args);
|
|
363
363
|
return { ...result, holes: [...result.holes, 'Secret'] };
|
|
364
364
|
},
|
|
365
365
|
} as unknown as ITreeWalker;
|
|
366
|
-
const { service,
|
|
366
|
+
const { service, versionControl } = build(stubVersionControl(), ['owner@x.io'], holey);
|
|
367
367
|
await expect(service.remove(ADMIN, LEE, 'deleted-1')).rejects.toMatchObject({
|
|
368
368
|
status: 422,
|
|
369
369
|
message: expect.stringMatching(/could not be read \(Secret\)/),
|
|
370
370
|
});
|
|
371
|
-
expect(
|
|
371
|
+
expect(versionControl.commits).toHaveLength(0);
|
|
372
372
|
expect(await read('roles.yaml')).toBe(ROLES);
|
|
373
373
|
});
|
|
374
374
|
|
|
@@ -377,9 +377,9 @@ describe('UserAccessRemovalService', () => {
|
|
|
377
377
|
throw new Error('cache gone');
|
|
378
378
|
});
|
|
379
379
|
try {
|
|
380
|
-
const { service,
|
|
380
|
+
const { service, versionControl } = build();
|
|
381
381
|
const result = await service.remove(ADMIN, LEE, 'deleted-1');
|
|
382
|
-
expect(
|
|
382
|
+
expect(versionControl.commits).toHaveLength(1);
|
|
383
383
|
expect(result.removedFrom.sort()).toEqual(['Sales/Plan.md', 'Sales/access.md', 'groups.yaml', 'roles.yaml']);
|
|
384
384
|
expect(result.stillNamedIn).toEqual([]);
|
|
385
385
|
// The refresh really ran after the commit and really threw.
|
|
@@ -391,9 +391,9 @@ describe('UserAccessRemovalService', () => {
|
|
|
391
391
|
});
|
|
392
392
|
|
|
393
393
|
it('a commit whose push needs resolution is reported as removed, publishing pending', async () => {
|
|
394
|
-
const { service,
|
|
394
|
+
const { service, versionControl } = build(stubVersionControl({ pushNeedsResolution: true }));
|
|
395
395
|
const result = await service.remove(ADMIN, LEE, 'deleted-1');
|
|
396
|
-
expect(
|
|
396
|
+
expect(versionControl.commits).toHaveLength(1);
|
|
397
397
|
expect(result.publishPending).toBe(true);
|
|
398
398
|
expect(result.removedFrom.sort()).toEqual(['Sales/Plan.md', 'Sales/access.md', 'groups.yaml', 'roles.yaml']);
|
|
399
399
|
expect(result.stillNamedIn).toEqual([]);
|
|
@@ -8,7 +8,7 @@ const log = logger('access');
|
|
|
8
8
|
import { isAbsence, type ITreeWalker, type WalkListener } from '../../shared/fs.contract.js';
|
|
9
9
|
import { assertOneSpecPerLine, isCommitSha, isGitTimeout, type IGitRunner } from '../../shared/git.contract.js';
|
|
10
10
|
import { hashEmail } from '../../shared/email-identity.js';
|
|
11
|
-
import { NodeGitRunner } from '../
|
|
11
|
+
import { NodeGitRunner } from '../version-control/index.js';
|
|
12
12
|
import { readRevSha } from '../kb-fs/index.js';
|
|
13
13
|
import type { WorkspaceService } from '../workspace/index.js';
|
|
14
14
|
import type {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { FileTreeEntry, IWorkspaceService } from '@bevel-software/platform-shared';
|
|
2
|
-
import {
|
|
2
|
+
import { VersionControlDomainError } from '../../shared/domain-errors.js';
|
|
3
3
|
import { accessMdPathForFolder } from './access-mutation.service.js';
|
|
4
4
|
import {
|
|
5
5
|
EVERYONE_CANONICAL,
|
|
@@ -75,7 +75,7 @@ export interface AccessDeclaration {
|
|
|
75
75
|
export const DECLARATION_SCAN_FILE_CAP = 400;
|
|
76
76
|
|
|
77
77
|
/** 400 for a target that is not a folder. */
|
|
78
|
-
export class AccessDeclarationsError extends
|
|
78
|
+
export class AccessDeclarationsError extends VersionControlDomainError {
|
|
79
79
|
constructor(message: string, status = 400) {
|
|
80
80
|
super(message, status);
|
|
81
81
|
this.name = 'AccessDeclarationsError';
|
|
@@ -53,7 +53,7 @@ import {
|
|
|
53
53
|
AccessSpliceError,
|
|
54
54
|
} from '../access-model/index.js';
|
|
55
55
|
import type { Verb, Principal, TokenMatch } from '../access-model/index.js';
|
|
56
|
-
import {
|
|
56
|
+
import { VersionControlDomainError } from '../../shared/domain-errors.js';
|
|
57
57
|
import {
|
|
58
58
|
canCarryFrontmatter,
|
|
59
59
|
FOLDER_GOVERNS_ACCESS_KIND,
|
|
@@ -64,7 +64,7 @@ import {
|
|
|
64
64
|
export type TargetKind = 'folder' | 'file';
|
|
65
65
|
|
|
66
66
|
/** Bad-request-class mutation failure (invalid principal, unknown role/group, lockout). */
|
|
67
|
-
export class AccessMutationError extends
|
|
67
|
+
export class AccessMutationError extends VersionControlDomainError {
|
|
68
68
|
constructor(message: string, status = 400, payload?: Record<string, unknown>) {
|
|
69
69
|
super(message, status, payload);
|
|
70
70
|
this.name = 'AccessMutationError';
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import express from 'express';
|
|
2
|
-
import type { AuthUser,
|
|
2
|
+
import type { AuthUser, IVersionControlService } from '@bevel-software/platform-shared';
|
|
3
3
|
import { logger } from '../../shared/logging.js';
|
|
4
4
|
import type { KbContext } from '../../shared/kb-context.js';
|
|
5
5
|
import { branchForWorkspaceId } from '../../shared/workspace-id.js';
|
|
@@ -48,15 +48,15 @@ export function createAccessRequestRoutes(deps: {
|
|
|
48
48
|
accessControl: IAccessControl;
|
|
49
49
|
workspaceService: WorkspaceService;
|
|
50
50
|
authService: AuthService;
|
|
51
|
-
|
|
51
|
+
versionControl: IVersionControlService;
|
|
52
52
|
lifecycle: IAccessRequestLifecycle;
|
|
53
53
|
kb: KbContext;
|
|
54
54
|
}): express.Router {
|
|
55
|
-
const { accessControl, workspaceService, authService,
|
|
55
|
+
const { accessControl, workspaceService, authService, versionControl, lifecycle, kb } = deps;
|
|
56
56
|
const { kbDirName } = kb;
|
|
57
57
|
const router = express.Router({ mergeParams: true });
|
|
58
58
|
const mutation = new AccessMutationService(workspaceService, accessControl, kbDirName);
|
|
59
|
-
const requests = new AccessRequestsService({
|
|
59
|
+
const requests = new AccessRequestsService({ versionControl, workspaceService, lifecycle, kb });
|
|
60
60
|
|
|
61
61
|
async function requireUser(
|
|
62
62
|
req: express.Request,
|
|
@@ -228,7 +228,7 @@ export function createAccessRequestRoutes(deps: {
|
|
|
228
228
|
res.json({ requests: [] });
|
|
229
229
|
return;
|
|
230
230
|
}
|
|
231
|
-
const crs = await
|
|
231
|
+
const crs = await versionControl.listChangeRequests();
|
|
232
232
|
const rows = await lifecycle.list(target.path, target, crs, user);
|
|
233
233
|
// The note is the request's own column, read back per request.
|
|
234
234
|
// Bounded by the open requests on ONE item — a handful at most — and a
|
|
@@ -236,7 +236,7 @@ export function createAccessRequestRoutes(deps: {
|
|
|
236
236
|
// belongs to.
|
|
237
237
|
const withNotes = await Promise.all(
|
|
238
238
|
rows.map(async (row) => {
|
|
239
|
-
const detail = await
|
|
239
|
+
const detail = await versionControl
|
|
240
240
|
.getChangeRequestDetail(row.number, { patches: false })
|
|
241
241
|
.catch(() => null);
|
|
242
242
|
const note = detail?.accessRequest?.note;
|
|
@@ -265,7 +265,7 @@ export function createAccessRequestRoutes(deps: {
|
|
|
265
265
|
res.status(400).json({ error: 'Invalid change request number' });
|
|
266
266
|
return;
|
|
267
267
|
}
|
|
268
|
-
const cr = await
|
|
268
|
+
const cr = await versionControl.getChangeRequest(number);
|
|
269
269
|
if (!cr) {
|
|
270
270
|
res.status(404).json({ error: 'Not found' });
|
|
271
271
|
return;
|
|
@@ -2,7 +2,7 @@ import path from 'node:path';
|
|
|
2
2
|
import {
|
|
3
3
|
joinBranchFor,
|
|
4
4
|
type AuthUser,
|
|
5
|
-
type
|
|
5
|
+
type IVersionControlService,
|
|
6
6
|
} from '@bevel-software/platform-shared';
|
|
7
7
|
import {
|
|
8
8
|
ChangeRequestConflictsError,
|
|
@@ -78,7 +78,7 @@ export function escapeMarkdown(text: string): string {
|
|
|
78
78
|
export class AccessRequestsService {
|
|
79
79
|
constructor(
|
|
80
80
|
private readonly deps: {
|
|
81
|
-
|
|
81
|
+
versionControl: IVersionControlService;
|
|
82
82
|
workspaceService: WorkspaceService;
|
|
83
83
|
lifecycle: IAccessRequestLifecycle;
|
|
84
84
|
kb: Pick<KbContext, 'defaultBranch' | 'defaultWorkspaceId' | 'kbDirName'>;
|
|
@@ -103,7 +103,7 @@ export class AccessRequestsService {
|
|
|
103
103
|
}): Promise<{ number: number; level: RequestLevel }> {
|
|
104
104
|
const { user, target, itemName, level } = input;
|
|
105
105
|
const note = (input.note ?? '').trim();
|
|
106
|
-
const {
|
|
106
|
+
const { versionControl, workspaceService, kb } = this.deps;
|
|
107
107
|
const wsId = kb.defaultWorkspaceId();
|
|
108
108
|
const branch = this.branchFor(user.email, target);
|
|
109
109
|
|
|
@@ -113,7 +113,7 @@ export class AccessRequestsService {
|
|
|
113
113
|
// it is recut below. The branch name already carries the person, so
|
|
114
114
|
// matching it is matching them.
|
|
115
115
|
const openOnBranch = async () =>
|
|
116
|
-
(await
|
|
116
|
+
(await versionControl.listChangeRequests({ fresh: true })).find(
|
|
117
117
|
(cr) => cr.state === 'open' && cr.branch === branch,
|
|
118
118
|
);
|
|
119
119
|
const existing = await openOnBranch();
|
|
@@ -124,7 +124,7 @@ export class AccessRequestsService {
|
|
|
124
124
|
// got there first, and a message is not a contract. STRICT: the list
|
|
125
125
|
// proves absence, and a listing that could not fetch proves nothing.
|
|
126
126
|
const branchExists = async () =>
|
|
127
|
-
(await
|
|
127
|
+
(await versionControl.listBranches(wsId, { freshFetch: true, strictFetch: true })).some(
|
|
128
128
|
(b) => b.name === branch,
|
|
129
129
|
);
|
|
130
130
|
// A branch still standing here belonged to an ANSWERED request: it holds a
|
|
@@ -144,7 +144,7 @@ export class AccessRequestsService {
|
|
|
144
144
|
let present = await branchExists();
|
|
145
145
|
if (present) {
|
|
146
146
|
try {
|
|
147
|
-
await
|
|
147
|
+
await versionControl.deleteBranch(wsId, branch, user);
|
|
148
148
|
// A delete that RETURNED is proof enough; re-probing here would let a
|
|
149
149
|
// ref list that has not caught up talk us out of cutting the branch we
|
|
150
150
|
// just removed, and the proposal would have nowhere to go.
|
|
@@ -165,7 +165,7 @@ export class AccessRequestsService {
|
|
|
165
165
|
}
|
|
166
166
|
if (!present) {
|
|
167
167
|
try {
|
|
168
|
-
await
|
|
168
|
+
await versionControl.createBranch(wsId, branch, kb.defaultBranch);
|
|
169
169
|
} catch (err) {
|
|
170
170
|
if (!(await branchExists())) throw err;
|
|
171
171
|
}
|
|
@@ -195,7 +195,7 @@ export class AccessRequestsService {
|
|
|
195
195
|
});
|
|
196
196
|
if (onBranch !== spliced.text) {
|
|
197
197
|
await workspaceService.writeFile(ws.id, wsRulesPath, spliced.text);
|
|
198
|
-
await
|
|
198
|
+
await versionControl.commitChanges(
|
|
199
199
|
ws.id,
|
|
200
200
|
user,
|
|
201
201
|
`Request ${LEVEL_LABEL[level].toLowerCase()} access to ${itemName}`,
|
|
@@ -206,7 +206,7 @@ export class AccessRequestsService {
|
|
|
206
206
|
// The level and the note are the request's own columns — what the
|
|
207
207
|
// dialog and the editors' banner read back. The description is for the
|
|
208
208
|
// people who read the request, and says the same things in prose.
|
|
209
|
-
const detail = await
|
|
209
|
+
const detail = await versionControl.openChangeRequest(ws.id, user, {
|
|
210
210
|
sourceBranch: branch,
|
|
211
211
|
targetBranch: kb.defaultBranch,
|
|
212
212
|
title: `Access request: ${itemName}`,
|
|
@@ -260,10 +260,10 @@ export class AccessRequestsService {
|
|
|
260
260
|
* claiming a refusal nobody made.
|
|
261
261
|
*/
|
|
262
262
|
async status(user: AuthUser, target: AccessRequestTarget): Promise<AccessRequestStatus> {
|
|
263
|
-
const {
|
|
263
|
+
const { versionControl } = this.deps;
|
|
264
264
|
const branch = this.branchFor(user.email, target);
|
|
265
265
|
|
|
266
|
-
const open = (await
|
|
266
|
+
const open = (await versionControl.listChangeRequests({ fresh: true })).find(
|
|
267
267
|
(cr) => cr.state === 'open' && cr.branch === branch,
|
|
268
268
|
);
|
|
269
269
|
if (open) {
|
|
@@ -272,7 +272,7 @@ export class AccessRequestsService {
|
|
|
272
272
|
|
|
273
273
|
const level = await this.levelAskedOn(branch, target, user.email);
|
|
274
274
|
if (!level) return { state: 'none' };
|
|
275
|
-
const last = await
|
|
275
|
+
const last = await versionControl.latestClosedChangeRequest(user.email, branch);
|
|
276
276
|
return last ? { state: 'not-accepted', level, number: last.number } : { state: 'none' };
|
|
277
277
|
}
|
|
278
278
|
|
|
@@ -288,7 +288,7 @@ export class AccessRequestsService {
|
|
|
288
288
|
* for, and Can edit is the lesser claim.
|
|
289
289
|
*/
|
|
290
290
|
private async levelOf(number: number): Promise<RequestLevel> {
|
|
291
|
-
const detail = await this.deps.
|
|
291
|
+
const detail = await this.deps.versionControl
|
|
292
292
|
.getChangeRequestDetail(number, { patches: false })
|
|
293
293
|
.catch(() => null);
|
|
294
294
|
return detail?.accessRequest?.level ?? 'write';
|
|
@@ -22,8 +22,8 @@ import type { KbContext } from '../../shared/kb-context.js';
|
|
|
22
22
|
import type { ITreeWalker } from '../../shared/fs.contract.js';
|
|
23
23
|
import { branchForWorkspaceId } from '../../shared/workspace-id.js';
|
|
24
24
|
import type { AuthService, IAccountSwitchGuard } from '../auth/index.js';
|
|
25
|
-
import type {
|
|
26
|
-
import {
|
|
25
|
+
import type { VersionControlService, VersionControlEventBus } from '../version-control/index.js';
|
|
26
|
+
import { VersionControlDomainError } from '../../shared/domain-errors.js';
|
|
27
27
|
import { AccessDeniedError } from '../access-model/index.js';
|
|
28
28
|
import {
|
|
29
29
|
AccessMutationService,
|
|
@@ -90,8 +90,8 @@ export function createAccessRoutes(
|
|
|
90
90
|
authService: AuthService,
|
|
91
91
|
/** Auth's switch-off coordination, for the invite's promotion (`ifActive`). */
|
|
92
92
|
switchGuard: IAccountSwitchGuard,
|
|
93
|
-
|
|
94
|
-
eventBus:
|
|
93
|
+
versionControlService: VersionControlService,
|
|
94
|
+
eventBus: VersionControlEventBus,
|
|
95
95
|
db: Database,
|
|
96
96
|
kb: KbContext,
|
|
97
97
|
/** The composition root's walk, for the roles admin's reference scan. */
|
|
@@ -104,7 +104,7 @@ export function createAccessRoutes(
|
|
|
104
104
|
const mutation = new AccessMutationService(workspaceService, accessControl, kbDirName);
|
|
105
105
|
const rolesAdmin = new RolesAdminService(
|
|
106
106
|
workspaceService,
|
|
107
|
-
|
|
107
|
+
versionControlService,
|
|
108
108
|
accessControl,
|
|
109
109
|
disk,
|
|
110
110
|
kbDirName,
|
|
@@ -878,7 +878,7 @@ export function createAccessRoutes(
|
|
|
878
878
|
user: AuthUser,
|
|
879
879
|
op: () => Promise<void>,
|
|
880
880
|
): Promise<void> {
|
|
881
|
-
const existing = await
|
|
881
|
+
const existing = await versionControlService.getLock(workspaceId, branch, wsEditPath);
|
|
882
882
|
if (existing && existing.holderUserId === user.id) {
|
|
883
883
|
// Caller already holds the lock (mid-edit) — write without touching it.
|
|
884
884
|
await op();
|
|
@@ -894,7 +894,7 @@ export function createAccessRoutes(
|
|
|
894
894
|
eventBus.emit({ kind: 'fs-tree-changed', workspaceId, branch });
|
|
895
895
|
return;
|
|
896
896
|
}
|
|
897
|
-
const acquired = await
|
|
897
|
+
const acquired = await versionControlService.acquireLock(workspaceId, branch, wsEditPath, user);
|
|
898
898
|
if (!acquired.acquired) {
|
|
899
899
|
const holder = acquired.lock.holderName || 'another user';
|
|
900
900
|
const err: Error & { status?: number } = new Error(
|
|
@@ -913,16 +913,16 @@ export function createAccessRoutes(
|
|
|
913
913
|
// upload. Every other failure may have left partial bytes, so it keeps
|
|
914
914
|
// the discarding release.
|
|
915
915
|
if (isFolderGovernsRefusal(err)) {
|
|
916
|
-
await
|
|
916
|
+
await versionControlService.releaseLockUntouched(workspaceId, branch, wsEditPath, user);
|
|
917
917
|
} else {
|
|
918
|
-
await
|
|
918
|
+
await versionControlService.releaseLockNoCommit(workspaceId, branch, wsEditPath, user);
|
|
919
919
|
}
|
|
920
920
|
} catch {
|
|
921
921
|
/* best-effort */
|
|
922
922
|
}
|
|
923
923
|
throw err;
|
|
924
924
|
}
|
|
925
|
-
await
|
|
925
|
+
await versionControlService.releaseLock(workspaceId, branch, wsEditPath, user);
|
|
926
926
|
eventBus.emit({ kind: 'fs-tree-changed', workspaceId, branch });
|
|
927
927
|
}
|
|
928
928
|
|
|
@@ -1238,7 +1238,7 @@ export function createAccessRoutes(
|
|
|
1238
1238
|
if (err instanceof AccessDeniedError || err instanceof AccessMutationError) {
|
|
1239
1239
|
logger('access.revoke.denied').warn(
|
|
1240
1240
|
`ws=${workspaceId} byUserId=${user.id} -> ${
|
|
1241
|
-
err instanceof
|
|
1241
|
+
err instanceof VersionControlDomainError ? err.status : 500
|
|
1242
1242
|
}`,
|
|
1243
1243
|
);
|
|
1244
1244
|
}
|