@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
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* A `LocalFilesystem` that wraps every mutating operation in a
|
|
2
|
+
* A `LocalFilesystem` that wraps every mutating operation in a version-control
|
|
3
3
|
* lock acquire → super-call → release-with-auto-commit-and-push cycle.
|
|
4
4
|
* This is the agent's file edit surface — Mastra hands the agent the
|
|
5
5
|
* workspace's filesystem tools (write_file / edit_file / etc.), and those
|
|
6
6
|
* call directly into this class, so the agent's edits go through the same
|
|
7
7
|
* lock + commit + push pipeline as the human editor's saves.
|
|
8
8
|
*
|
|
9
|
-
* Per the
|
|
9
|
+
* Per the version-control spec (PLAN.md §2):
|
|
10
10
|
* - Each tool call is one acquire/release cycle. The agent never holds a
|
|
11
11
|
* lock while it's "thinking" between tool calls — a fast human editor
|
|
12
12
|
* can always grab a file the agent isn't actively writing.
|
|
@@ -14,11 +14,11 @@
|
|
|
14
14
|
* 2-second intervals (~6s ceiling) then surface a structured error
|
|
15
15
|
* so the agent can skip the file and continue with the rest of its
|
|
16
16
|
* turn rather than aborting the whole call.
|
|
17
|
-
* - Lock-release inside `
|
|
17
|
+
* - Lock-release inside `VersionControlService.releaseLock` is the thing that
|
|
18
18
|
* actually commits + pushes the file — see that method for the
|
|
19
19
|
* `commitFile → release → push` sequence. We don't repeat the commit
|
|
20
20
|
* step here; releasing IS committing.
|
|
21
|
-
* - `rmdir` is refused. The
|
|
21
|
+
* - `rmdir` is refused. The version-control invariant is "each change touches
|
|
22
22
|
* exactly one file" and a recursive directory delete violates that.
|
|
23
23
|
* The agent must delete entries individually via `deleteFile`.
|
|
24
24
|
* - `mkdir` followed by a `.gitkeep` write is the canonical way to land
|
|
@@ -47,9 +47,8 @@ import {
|
|
|
47
47
|
type RemoveOptions,
|
|
48
48
|
type WriteOptions,
|
|
49
49
|
} from '@mastra/core/workspace';
|
|
50
|
-
import type { AuthUser, Change,
|
|
50
|
+
import type { AuthUser, Change, IVersionControlService } from '@bevel-software/platform-shared';
|
|
51
51
|
import { PushNeedsAgentResolutionError } from '../../shared/domain-errors.js';
|
|
52
|
-
import type { FileChangeNotifier } from './file-change-notifier.js';
|
|
53
52
|
import { isAbsence } from '../../shared/fs.contract.js';
|
|
54
53
|
import { DestinationTakenError, lstatOrNull, renameNoReplace, takenError } from '../../shared/rename-no-replace.js';
|
|
55
54
|
import { linkedAncestor } from '../../shared/no-link-below.js';
|
|
@@ -134,13 +133,13 @@ export type WriteValidator = ((path: string, content: FileContent) => void | Pro
|
|
|
134
133
|
};
|
|
135
134
|
|
|
136
135
|
/**
|
|
137
|
-
* Dependencies the wrapper needs to talk to the
|
|
136
|
+
* Dependencies the wrapper needs to talk to the version-control lock service.
|
|
138
137
|
* Captured at construction time so every per-method call resolves to the
|
|
139
138
|
* same `(workspace, branch, user)` triple — the agent can't accidentally
|
|
140
139
|
* target a different workspace through this filesystem.
|
|
141
140
|
*/
|
|
142
141
|
export interface LockingFilesystemContext {
|
|
143
|
-
|
|
142
|
+
versionControl: IVersionControlService;
|
|
144
143
|
workspaceId: string;
|
|
145
144
|
branch: string;
|
|
146
145
|
user: AuthUser;
|
|
@@ -167,12 +166,6 @@ export interface LockingFilesystemContext {
|
|
|
167
166
|
* when the destination is a path the validator's `appliesTo` claims.
|
|
168
167
|
*/
|
|
169
168
|
validateWrite?: WriteValidator;
|
|
170
|
-
/**
|
|
171
|
-
* Post-commit hook for the BATCH `writeFiles` path (which commits via
|
|
172
|
-
* `commitChanges` and so skips `runPendingCommit`'s emit). Single-file ops
|
|
173
|
-
* emit through the queue instead, so they don't need this. Optional.
|
|
174
|
-
*/
|
|
175
|
-
fileChanges?: FileChangeNotifier;
|
|
176
169
|
/**
|
|
177
170
|
* Optional creator read-grant planner (see `modules/access/creator-access`).
|
|
178
171
|
* When present, a write/mkdir that starts a NEW FOLDER directly under one
|
|
@@ -475,7 +468,7 @@ export class LockingFilesystem extends GitGuardedFilesystem {
|
|
|
475
468
|
summary: string,
|
|
476
469
|
check?: () => Promise<void>,
|
|
477
470
|
): Promise<Change | null> {
|
|
478
|
-
const {
|
|
471
|
+
const { versionControl, workspaceId, branch, user } = this.lockContext;
|
|
479
472
|
await this.assertNotGitInternals(src);
|
|
480
473
|
await this.assertNotGitInternals(dest);
|
|
481
474
|
this.assertInsideRepo(dest);
|
|
@@ -512,10 +505,10 @@ export class LockingFilesystem extends GitGuardedFilesystem {
|
|
|
512
505
|
const release = async (mode: 'untouched' | 'enqueue'): Promise<void> => {
|
|
513
506
|
for (const p of acquired) {
|
|
514
507
|
try {
|
|
515
|
-
if (mode === 'enqueue' && scope.includes(p)) await
|
|
516
|
-
else if (mode === 'enqueue') await
|
|
517
|
-
else if (dirtyLeft.has(p)) await
|
|
518
|
-
else await
|
|
508
|
+
if (mode === 'enqueue' && scope.includes(p)) await versionControl.releaseLock(workspaceId, branch, p, user);
|
|
509
|
+
else if (mode === 'enqueue') await versionControl.releaseLockUntouched(workspaceId, branch, p, user);
|
|
510
|
+
else if (dirtyLeft.has(p)) await versionControl.releaseLockNoCommit(workspaceId, branch, p, user);
|
|
511
|
+
else await versionControl.releaseLockUntouched(workspaceId, branch, p, user);
|
|
519
512
|
} catch (releaseErr) {
|
|
520
513
|
log.warn(`lock release failed for "${p}" during moveWithEdits:`, { err: releaseErr });
|
|
521
514
|
}
|
|
@@ -526,7 +519,7 @@ export class LockingFilesystem extends GitGuardedFilesystem {
|
|
|
526
519
|
let ok = false;
|
|
527
520
|
try {
|
|
528
521
|
for (let attempt = 0; attempt < ACQUIRE_RETRY_ATTEMPTS; attempt++) {
|
|
529
|
-
const result = await
|
|
522
|
+
const result = await versionControl.acquireLock(workspaceId, branch, p, user);
|
|
530
523
|
if (result.acquired) {
|
|
531
524
|
ok = true;
|
|
532
525
|
break;
|
|
@@ -599,9 +592,8 @@ export class LockingFilesystem extends GitGuardedFilesystem {
|
|
|
599
592
|
...edits.map((e) => e.path),
|
|
600
593
|
]),
|
|
601
594
|
].sort();
|
|
602
|
-
const change = await
|
|
595
|
+
const change = await versionControl.commitChanges(workspaceId, user, summary, scope);
|
|
603
596
|
await release('untouched');
|
|
604
|
-
if (change) this.lockContext.fileChanges?.emit({ workspaceId, branch, paths: scope, byUser: user });
|
|
605
597
|
return change;
|
|
606
598
|
} catch (err) {
|
|
607
599
|
if (err instanceof PushNeedsAgentResolutionError) {
|
|
@@ -681,7 +673,7 @@ export class LockingFilesystem extends GitGuardedFilesystem {
|
|
|
681
673
|
* `writeFile` takes one lock cycle per file and lets the deferred queue commit
|
|
682
674
|
* it, this wraps the WHOLE batch in one cycle: acquire every path's lock up
|
|
683
675
|
* front, write every file to disk, then commit the whole set synchronously as
|
|
684
|
-
* one change via the
|
|
676
|
+
* one change via the version-control service's `commitChanges` (one `git add` + one
|
|
685
677
|
* `git commit`, then push), and release WITHOUT a per-file commit. Fail-closed:
|
|
686
678
|
* if any lock can't be acquired, or a write/commit throws, nothing is committed
|
|
687
679
|
* (the failure-path `releaseLockNoCommit` discards the uncommitted bytes).
|
|
@@ -713,7 +705,7 @@ export class LockingFilesystem extends GitGuardedFilesystem {
|
|
|
713
705
|
writes: readonly { path: string; content: FileContent }[],
|
|
714
706
|
) => Promise<{ path: string; content: FileContent }[]>,
|
|
715
707
|
): Promise<Change | null> {
|
|
716
|
-
const {
|
|
708
|
+
const { versionControl, workspaceId, branch, user } = this.lockContext;
|
|
717
709
|
// Fail the whole batch before any plan, validator or lock: one stray path
|
|
718
710
|
// must not let its siblings land while it silently misses git.
|
|
719
711
|
for (const w of writes) await this.assertNotGitInternals(w.path);
|
|
@@ -760,7 +752,7 @@ export class LockingFilesystem extends GitGuardedFilesystem {
|
|
|
760
752
|
// with the discard so the corrupt bytes can't outlive the batch.
|
|
761
753
|
const failedSeedDiscards = new Set<string>();
|
|
762
754
|
// Release every acquired lock, each with the semantics its outcome
|
|
763
|
-
// earned. Three shapes (mirroring the three
|
|
755
|
+
// earned. Three shapes (mirroring the three VersionControlService releases):
|
|
764
756
|
//
|
|
765
757
|
// 'discard' → releaseLockNoCommit: resets the path's working tree to
|
|
766
758
|
// HEAD. Only for bytes this batch itself owns — its committed paths
|
|
@@ -783,11 +775,11 @@ export class LockingFilesystem extends GitGuardedFilesystem {
|
|
|
783
775
|
try {
|
|
784
776
|
const mode = modeOf(p);
|
|
785
777
|
if (mode === 'discard') {
|
|
786
|
-
await
|
|
778
|
+
await versionControl.releaseLockNoCommit(workspaceId, branch, p, user);
|
|
787
779
|
} else if (mode === 'enqueue') {
|
|
788
|
-
await
|
|
780
|
+
await versionControl.releaseLock(workspaceId, branch, p, user);
|
|
789
781
|
} else {
|
|
790
|
-
await
|
|
782
|
+
await versionControl.releaseLockUntouched(workspaceId, branch, p, user);
|
|
791
783
|
}
|
|
792
784
|
} catch (releaseErr) {
|
|
793
785
|
log.warn(`lock release failed for "${p}" during writeFiles:`, { err: releaseErr });
|
|
@@ -800,7 +792,7 @@ export class LockingFilesystem extends GitGuardedFilesystem {
|
|
|
800
792
|
let holderName: string | null = null;
|
|
801
793
|
let ok = false;
|
|
802
794
|
for (let attempt = 0; attempt < ACQUIRE_RETRY_ATTEMPTS; attempt++) {
|
|
803
|
-
const result = await
|
|
795
|
+
const result = await versionControl.acquireLock(workspaceId, branch, p, user);
|
|
804
796
|
if (result.acquired) {
|
|
805
797
|
ok = true;
|
|
806
798
|
break;
|
|
@@ -864,7 +856,7 @@ export class LockingFilesystem extends GitGuardedFilesystem {
|
|
|
864
856
|
// without it would leave that folder invisible to them.
|
|
865
857
|
for (const p of [...seeds.keys()].sort()) {
|
|
866
858
|
if (paths.includes(p)) continue; // already locked as a caller path
|
|
867
|
-
const result = await
|
|
859
|
+
const result = await versionControl.acquireLock(workspaceId, branch, p, user);
|
|
868
860
|
if (result.acquired) {
|
|
869
861
|
acquired.push(p);
|
|
870
862
|
} else {
|
|
@@ -967,7 +959,7 @@ export class LockingFilesystem extends GitGuardedFilesystem {
|
|
|
967
959
|
// seeds): on the shared per-branch workspace another save's bytes may be
|
|
968
960
|
// dirty with their commit still queued, and an unscoped commit would
|
|
969
961
|
// sweep them in under this batch's author/summary.
|
|
970
|
-
change = await
|
|
962
|
+
change = await versionControl.commitChanges(workspaceId, user, summary, touched);
|
|
971
963
|
if (seeds.size > 0) this.lockContext.creatorAccess?.noteAccessFileWritten(workspaceId);
|
|
972
964
|
} catch (err) {
|
|
973
965
|
if (err instanceof PushNeedsAgentResolutionError) {
|
|
@@ -1027,16 +1019,10 @@ export class LockingFilesystem extends GitGuardedFilesystem {
|
|
|
1027
1019
|
await releaseAll((p) =>
|
|
1028
1020
|
committed.has(p) || failedSeedDiscards.has(p) ? 'discard' : 'untouched',
|
|
1029
1021
|
);
|
|
1030
|
-
//
|
|
1031
|
-
//
|
|
1032
|
-
//
|
|
1033
|
-
//
|
|
1034
|
-
// tree) changed nothing, so it emits nothing.
|
|
1035
|
-
if (change) {
|
|
1036
|
-
// `touched` = caller paths + any creator-grant seeds that landed in the
|
|
1037
|
-
// same commit — the exact set this batch may have touched.
|
|
1038
|
-
this.lockContext.fileChanges?.emit({ workspaceId, branch, paths: touched, byUser: user });
|
|
1039
|
-
}
|
|
1022
|
+
// The commit, if one landed, was reported by the git layer as it landed
|
|
1023
|
+
// (`VersionControlHooks.onCommitLanded`) with the paths it committed —
|
|
1024
|
+
// `touched` plus any creator-grant seed in the same commit. Nothing to
|
|
1025
|
+
// announce here.
|
|
1040
1026
|
return change;
|
|
1041
1027
|
}
|
|
1042
1028
|
|
|
@@ -1052,7 +1038,7 @@ export class LockingFilesystem extends GitGuardedFilesystem {
|
|
|
1052
1038
|
const plan = await this.planCreate(inputPath, 'dir');
|
|
1053
1039
|
// mkdir itself is not a lockable op (it touches no file content), so we
|
|
1054
1040
|
// do the bare super-call without acquiring. The lock + commit happens on
|
|
1055
|
-
// the `.gitkeep` write below — that's the file the
|
|
1041
|
+
// the `.gitkeep` write below — that's the file the version-control change
|
|
1056
1042
|
// attaches to. If the dir already has content (rare; e.g. recursive
|
|
1057
1043
|
// create where a sibling already exists), we skip the .gitkeep — empty-
|
|
1058
1044
|
// folder placeholders are only useful for actually-empty folders.
|
|
@@ -1180,7 +1166,7 @@ export class LockingFilesystem extends GitGuardedFilesystem {
|
|
|
1180
1166
|
|
|
1181
1167
|
/**
|
|
1182
1168
|
* Acquire the lock, run `op`, release. The release does the commit +
|
|
1183
|
-
* push via `
|
|
1169
|
+
* push via `VersionControlService.releaseLock`. On contention we retry a few
|
|
1184
1170
|
* times before surfacing a structured failure — long enough to ride
|
|
1185
1171
|
* out a human typing a quick edit, short enough that the agent doesn't
|
|
1186
1172
|
* stall a whole turn waiting for someone to step away from a file.
|
|
@@ -1214,12 +1200,12 @@ export class LockingFilesystem extends GitGuardedFilesystem {
|
|
|
1214
1200
|
op: () => Promise<T>,
|
|
1215
1201
|
check?: () => Promise<void>,
|
|
1216
1202
|
): Promise<T> {
|
|
1217
|
-
const {
|
|
1203
|
+
const { versionControl, workspaceId, branch, user } = this.lockContext;
|
|
1218
1204
|
|
|
1219
1205
|
let lastHolderName: string | null = null;
|
|
1220
1206
|
let acquired = false;
|
|
1221
1207
|
for (let attempt = 0; attempt < ACQUIRE_RETRY_ATTEMPTS; attempt++) {
|
|
1222
|
-
const result = await
|
|
1208
|
+
const result = await versionControl.acquireLock(workspaceId, branch, inputPath, user);
|
|
1223
1209
|
if (result.acquired) {
|
|
1224
1210
|
acquired = true;
|
|
1225
1211
|
break;
|
|
@@ -1263,9 +1249,9 @@ export class LockingFilesystem extends GitGuardedFilesystem {
|
|
|
1263
1249
|
// caller actually cares about.
|
|
1264
1250
|
try {
|
|
1265
1251
|
if (err instanceof CheckRefusal || err instanceof DestinationTakenError) {
|
|
1266
|
-
await
|
|
1252
|
+
await versionControl.releaseLockUntouched(workspaceId, branch, inputPath, user);
|
|
1267
1253
|
} else {
|
|
1268
|
-
await
|
|
1254
|
+
await versionControl.releaseLockNoCommit(workspaceId, branch, inputPath, user);
|
|
1269
1255
|
}
|
|
1270
1256
|
} catch (releaseErr) {
|
|
1271
1257
|
log.warn(`lock release failed for "${inputPath}" after op error:`, { err: releaseErr });
|
|
@@ -1278,7 +1264,7 @@ export class LockingFilesystem extends GitGuardedFilesystem {
|
|
|
1278
1264
|
// actual `commitFile + push` out of band. The agent's tool call
|
|
1279
1265
|
// returns once disk + lock + enqueue are done — the commit lands
|
|
1280
1266
|
// moments later (typically <1s) without blocking the agent's turn.
|
|
1281
|
-
await
|
|
1267
|
+
await versionControl.releaseLock(workspaceId, branch, inputPath, user);
|
|
1282
1268
|
return result;
|
|
1283
1269
|
}
|
|
1284
1270
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
|
-
import {
|
|
2
|
+
import { VersionControlValidationError } from '../../shared/domain-errors.js';
|
|
3
3
|
import { sanitizedPath } from '../../shared/printable.js';
|
|
4
4
|
import { assertTmpRefsTaken, isTmpRef } from './tmp-ref.js';
|
|
5
5
|
|
|
@@ -112,7 +112,7 @@ export function assertInsideRepo(wsPath: string, kbDirName: string): void {
|
|
|
112
112
|
// forge a second line of the answer, in the message and in the `path` a
|
|
113
113
|
// JSON consumer reads.
|
|
114
114
|
const shown = sanitizedPath(wsPath);
|
|
115
|
-
throw new
|
|
115
|
+
throw new VersionControlValidationError(
|
|
116
116
|
`"${shown}" contains a control character: a line break, a NUL or another invisible byte is not part of any ` +
|
|
117
117
|
'file name, and git reads a line break in a path as the end of one object name and the start of another. ' +
|
|
118
118
|
'Remove it and send the name as it is written.',
|
|
@@ -127,7 +127,7 @@ export function assertInsideRepo(wsPath: string, kbDirName: string): void {
|
|
|
127
127
|
.replace(/^(\.\.(\/|$))+/, '')
|
|
128
128
|
.replace(/^\.$/, '');
|
|
129
129
|
const corrected = isInsideRepo(normalized, kbDirName) ? normalized : `${kbDirName}/${normalized}`;
|
|
130
|
-
throw new
|
|
130
|
+
throw new VersionControlValidationError(
|
|
131
131
|
`"${wsPath}" is outside the knowledge base repository: paths are workspace-relative, must start with "${kbDirName}/" and may not contain "." or ".." segments or backslashes. ` +
|
|
132
132
|
`Use "${corrected}" instead. A file written without that prefix lands beside the repository, where it is never committed or pushed.`,
|
|
133
133
|
{ kind: 'path-outside-repo', path: wsPath, kbDirName, corrected },
|
|
@@ -183,7 +183,7 @@ export function normalizeWorkspacePath(wsPath: string, kbDirName: string): strin
|
|
|
183
183
|
// `core-config` and the `kbDirName` setting validator both refuse this at
|
|
184
184
|
// the point it is SET, so reaching here means the two drifted.
|
|
185
185
|
if (CONTROL_CHARACTERS.test(kbDirName)) {
|
|
186
|
-
throw new
|
|
186
|
+
throw new VersionControlValidationError(
|
|
187
187
|
`the configured checkout folder name (kbDirName / KB_DIR_NAME) contains a control character: "${sanitizedPath(kbDirName)}". ` +
|
|
188
188
|
'Every workspace path is prefixed with it, so no path can be resolved until the setting is corrected.',
|
|
189
189
|
{ kind: 'kb-dir-name-control-character', kbDirName: sanitizedPath(kbDirName) },
|
|
@@ -237,7 +237,7 @@ export function assertRepoRootNameFree(wsPath: string, kbDirName: string): void
|
|
|
237
237
|
const segments = String(wsPath).replace(/\/+$/, '').split('/');
|
|
238
238
|
const reserved = kbDirName.toLowerCase();
|
|
239
239
|
if (segments[0] !== kbDirName || segments[1]?.toLowerCase() !== reserved) return;
|
|
240
|
-
throw new
|
|
240
|
+
throw new VersionControlValidationError(
|
|
241
241
|
`"${segments[1]}" is reserved: it is the checkout folder's name. A folder of that name at the repository root ` +
|
|
242
242
|
`could never be reached — every workspace path starting with "${kbDirName}/" names the checkout itself — so it cannot be created, moved to or renamed to.` +
|
|
243
243
|
// Said only when the caller spelled it differently, so the ordinary
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { VersionControlValidationError } from '../../shared/domain-errors.js';
|
|
2
2
|
import { sanitizedPath } from '../../shared/printable.js';
|
|
3
3
|
|
|
4
4
|
/**
|
|
@@ -33,9 +33,9 @@ export function isTmpRef(value: unknown): boolean {
|
|
|
33
33
|
* copying it into the repository. A 400 with a `kind` to branch on, before
|
|
34
34
|
* any gate, lock or write.
|
|
35
35
|
*/
|
|
36
|
-
export function tmpRefReadOnlyRefusal(ref: string, tool: string):
|
|
36
|
+
export function tmpRefReadOnlyRefusal(ref: string, tool: string): VersionControlValidationError {
|
|
37
37
|
const shown = sanitizedPath(ref);
|
|
38
|
-
return new
|
|
38
|
+
return new VersionControlValidationError(
|
|
39
39
|
`"${shown}" is a tmp ref, and ${tool} does not take one there: the workspace's tmp folder is read-only through ` +
|
|
40
40
|
'the ref. read_file, file_stat and grep read the one file it names; to keep the file, copy_file it to a ' +
|
|
41
41
|
'repository path (the ref as `src`, the repository path as `dest`).',
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { describe, expect, it, vi } from 'vitest';
|
|
2
2
|
import type { BranchSyncOutcome } from '@bevel-software/platform-shared';
|
|
3
3
|
import { KbSyncService } from '../kb-sync.service.js';
|
|
4
|
-
import type {
|
|
4
|
+
import type { SyncVersionControlPort, SyncWorkspacePort } from '../kb-sync.interface.js';
|
|
5
5
|
|
|
6
6
|
function deferred<T>() {
|
|
7
7
|
let resolve!: (v: T) => void;
|
|
@@ -24,7 +24,7 @@ function updated(branch: string): BranchSyncOutcome {
|
|
|
24
24
|
describe('KbSyncService', () => {
|
|
25
25
|
it('answers the sync without waiting for the tidy-up after it', async () => {
|
|
26
26
|
let finish = (): void => undefined;
|
|
27
|
-
const
|
|
27
|
+
const versionControl: SyncVersionControlPort = {
|
|
28
28
|
syncWorkspaceFromRemote: vi.fn(async (id: string) => updated(decodeURIComponent(id))),
|
|
29
29
|
closeChangeRequestsWithDeletedBranches: vi.fn(async () => 0),
|
|
30
30
|
// A tidy-up that never ends unless told to — and one that fails.
|
|
@@ -36,36 +36,36 @@ describe('KbSyncService', () => {
|
|
|
36
36
|
.mockRejectedValueOnce(new Error('boom')),
|
|
37
37
|
retireRemoteGoneClone: vi.fn(async () => true),
|
|
38
38
|
};
|
|
39
|
-
const svc = new KbSyncService(
|
|
39
|
+
const svc = new KbSyncService(versionControl, workspaces(['main']));
|
|
40
40
|
await expect(svc.sync({ branches: 'all' })).resolves.toMatchObject({ status: 'synced' });
|
|
41
|
-
expect(
|
|
41
|
+
expect(versionControl.tidyAfterSweep).toHaveBeenCalledTimes(1);
|
|
42
42
|
await expect(svc.sync({ branches: 'all' })).resolves.toMatchObject({ status: 'synced' });
|
|
43
43
|
finish();
|
|
44
44
|
});
|
|
45
45
|
|
|
46
46
|
it('syncs every known clone for an "all" request and reports unknown branches as not cloned', async () => {
|
|
47
|
-
const
|
|
47
|
+
const versionControl: SyncVersionControlPort = {
|
|
48
48
|
syncWorkspaceFromRemote: vi.fn(async (id: string) => updated(decodeURIComponent(id))),
|
|
49
49
|
closeChangeRequestsWithDeletedBranches: vi.fn(async () => 1),
|
|
50
50
|
tidyAfterSweep: vi.fn(async () => ({ closedEmpty: 0, removedLeftovers: 0 })),
|
|
51
51
|
retireRemoteGoneClone: vi.fn(async () => true),
|
|
52
52
|
};
|
|
53
|
-
const svc = new KbSyncService(
|
|
53
|
+
const svc = new KbSyncService(versionControl, workspaces(['main', 'ali/x']));
|
|
54
54
|
|
|
55
55
|
const all = await svc.sync({ branches: 'all' });
|
|
56
56
|
expect(all.status).toBe('synced');
|
|
57
57
|
expect(all.results.map((r) => r.branch)).toEqual(['main', 'ali/x']);
|
|
58
58
|
expect(all.changeRequests.closedDeletedBranch).toBe(1);
|
|
59
59
|
// Every sweep for deleted branches is followed by the leftover cleanup.
|
|
60
|
-
expect(
|
|
61
|
-
expect(
|
|
60
|
+
expect(versionControl.tidyAfterSweep).toHaveBeenCalledTimes(1);
|
|
61
|
+
expect(versionControl.syncWorkspaceFromRemote).toHaveBeenCalledWith('ali%2Fx');
|
|
62
62
|
|
|
63
63
|
const some = await svc.sync({ branches: ['ali/x', 'juan/other'] });
|
|
64
64
|
expect(some.results).toEqual([updated('ali/x'), { branch: 'juan/other', outcome: 'not-cloned' }]);
|
|
65
65
|
});
|
|
66
66
|
|
|
67
67
|
it('a conflict or an error makes the result partial; the other branches still sync', async () => {
|
|
68
|
-
const
|
|
68
|
+
const versionControl: SyncVersionControlPort = {
|
|
69
69
|
syncWorkspaceFromRemote: vi.fn(async (id: string): Promise<BranchSyncOutcome> =>
|
|
70
70
|
id === 'main'
|
|
71
71
|
? { branch: 'main', outcome: 'conflict', conflictedPaths: ['a.md'], error: 'msg' }
|
|
@@ -75,14 +75,14 @@ describe('KbSyncService', () => {
|
|
|
75
75
|
tidyAfterSweep: vi.fn(async () => ({ closedEmpty: 0, removedLeftovers: 0 })),
|
|
76
76
|
retireRemoteGoneClone: vi.fn(async () => true),
|
|
77
77
|
};
|
|
78
|
-
const svc = new KbSyncService(
|
|
78
|
+
const svc = new KbSyncService(versionControl, workspaces(['main', 'ali/x']));
|
|
79
79
|
const r = await svc.sync({ branches: 'all' });
|
|
80
80
|
expect(r.status).toBe('partial');
|
|
81
81
|
expect(r.results[1]).toEqual(updated('ali/x'));
|
|
82
82
|
});
|
|
83
83
|
|
|
84
84
|
it('a failing sweep does not fail the sync', async () => {
|
|
85
|
-
const
|
|
85
|
+
const versionControl: SyncVersionControlPort = {
|
|
86
86
|
syncWorkspaceFromRemote: vi.fn(async () => updated('main')),
|
|
87
87
|
closeChangeRequestsWithDeletedBranches: vi.fn(async () => {
|
|
88
88
|
throw new Error('origin down');
|
|
@@ -90,7 +90,7 @@ describe('KbSyncService', () => {
|
|
|
90
90
|
tidyAfterSweep: vi.fn(async () => ({ closedEmpty: 0, removedLeftovers: 0 })),
|
|
91
91
|
retireRemoteGoneClone: vi.fn(async () => true),
|
|
92
92
|
};
|
|
93
|
-
const svc = new KbSyncService(
|
|
93
|
+
const svc = new KbSyncService(versionControl, workspaces(['main']));
|
|
94
94
|
const r = await svc.sync({ branches: 'all' });
|
|
95
95
|
expect(r.status).toBe('synced');
|
|
96
96
|
expect(r.changeRequests.closedDeletedBranch).toBe(0);
|
|
@@ -103,7 +103,7 @@ describe('KbSyncService', () => {
|
|
|
103
103
|
// landing after the gate opened.
|
|
104
104
|
const calls: string[][] = [['']];
|
|
105
105
|
let gateOpened = false;
|
|
106
|
-
const
|
|
106
|
+
const versionControl: SyncVersionControlPort = {
|
|
107
107
|
syncWorkspaceFromRemote: vi.fn(async (id: string) => {
|
|
108
108
|
const branch = decodeURIComponent(id);
|
|
109
109
|
if (!gateOpened && branch === 'main') {
|
|
@@ -120,7 +120,7 @@ describe('KbSyncService', () => {
|
|
|
120
120
|
tidyAfterSweep: vi.fn(async () => ({ closedEmpty: 0, removedLeftovers: 0 })),
|
|
121
121
|
retireRemoteGoneClone: vi.fn(async () => true),
|
|
122
122
|
};
|
|
123
|
-
const svc = new KbSyncService(
|
|
123
|
+
const svc = new KbSyncService(versionControl, workspaces(['main', 'ali/x', 'juan/y']));
|
|
124
124
|
|
|
125
125
|
const first = svc.sync({ branches: ['main'] });
|
|
126
126
|
// Three requests land while the first is parked on `gate`.
|
|
@@ -137,12 +137,12 @@ describe('KbSyncService', () => {
|
|
|
137
137
|
expect(r2.results.map((r) => r.branch)).toEqual(['ali/x']);
|
|
138
138
|
expect(r3.results.map((r) => r.branch)).toEqual(['juan/y']);
|
|
139
139
|
expect(r4.results.map((r) => r.branch)).toEqual(['ali/x']);
|
|
140
|
-
expect(
|
|
140
|
+
expect(versionControl.closeChangeRequestsWithDeletedBranches).toHaveBeenCalledTimes(2);
|
|
141
141
|
});
|
|
142
142
|
|
|
143
143
|
it('an "all" arriving mid-run absorbs the queued branches', async () => {
|
|
144
144
|
const gate = deferred<void>();
|
|
145
|
-
const
|
|
145
|
+
const versionControl: SyncVersionControlPort = {
|
|
146
146
|
syncWorkspaceFromRemote: vi.fn(async (id: string) => {
|
|
147
147
|
if (id === 'main') await gate.promise;
|
|
148
148
|
return updated(decodeURIComponent(id));
|
|
@@ -151,7 +151,7 @@ describe('KbSyncService', () => {
|
|
|
151
151
|
tidyAfterSweep: vi.fn(async () => ({ closedEmpty: 0, removedLeftovers: 0 })),
|
|
152
152
|
retireRemoteGoneClone: vi.fn(async () => true),
|
|
153
153
|
};
|
|
154
|
-
const svc = new KbSyncService(
|
|
154
|
+
const svc = new KbSyncService(versionControl, workspaces(['main', 'ali/x', 'juan/y']));
|
|
155
155
|
const first = svc.sync({ branches: ['main'] });
|
|
156
156
|
const second = svc.sync({ branches: ['ali/x'] });
|
|
157
157
|
const third = svc.sync({ branches: 'all' });
|
|
@@ -166,14 +166,14 @@ describe('KbSyncService', () => {
|
|
|
166
166
|
|
|
167
167
|
describe('KbSyncService.lastSync', () => {
|
|
168
168
|
it('is null before the first sync, then records when, who and what', async () => {
|
|
169
|
-
const
|
|
169
|
+
const versionControl: SyncVersionControlPort = {
|
|
170
170
|
syncWorkspaceFromRemote: vi.fn(async (id: string) => updated(decodeURIComponent(id))),
|
|
171
171
|
closeChangeRequestsWithDeletedBranches: vi.fn(async () => 0),
|
|
172
172
|
tidyAfterSweep: vi.fn(async () => ({ closedEmpty: 0, removedLeftovers: 0 })),
|
|
173
173
|
retireRemoteGoneClone: vi.fn(async () => true),
|
|
174
174
|
};
|
|
175
175
|
let clock = 1_000;
|
|
176
|
-
const svc = new KbSyncService(
|
|
176
|
+
const svc = new KbSyncService(versionControl, workspaces(['main']), () => clock);
|
|
177
177
|
expect(svc.lastSync()).toBeNull();
|
|
178
178
|
|
|
179
179
|
await svc.sync({ branches: 'all', by: 'bearer' });
|
|
@@ -191,7 +191,7 @@ describe('KbSyncService.lastSync', () => {
|
|
|
191
191
|
|
|
192
192
|
it('a coalesced follow-up names everyone who asked for it', async () => {
|
|
193
193
|
const gate = deferred<void>();
|
|
194
|
-
const
|
|
194
|
+
const versionControl: SyncVersionControlPort = {
|
|
195
195
|
syncWorkspaceFromRemote: vi.fn(async (id: string) => {
|
|
196
196
|
if (id === 'main') await gate.promise;
|
|
197
197
|
return updated(decodeURIComponent(id));
|
|
@@ -200,7 +200,7 @@ describe('KbSyncService.lastSync', () => {
|
|
|
200
200
|
tidyAfterSweep: vi.fn(async () => ({ closedEmpty: 0, removedLeftovers: 0 })),
|
|
201
201
|
retireRemoteGoneClone: vi.fn(async () => true),
|
|
202
202
|
};
|
|
203
|
-
const svc = new KbSyncService(
|
|
203
|
+
const svc = new KbSyncService(versionControl, workspaces(['main', 'ali/x']));
|
|
204
204
|
const first = svc.sync({ branches: ['main'], by: 'bearer' });
|
|
205
205
|
const second = svc.sync({ branches: ['ali/x'], by: 'github-signature' });
|
|
206
206
|
const third = svc.sync({ branches: ['ali/x'], by: 'admin@example.com' });
|
|
@@ -212,7 +212,7 @@ describe('KbSyncService.lastSync', () => {
|
|
|
212
212
|
|
|
213
213
|
describe('KbSyncService — a throwing branch step', () => {
|
|
214
214
|
it('becomes an error outcome; the other branches, the sweep and the record all still happen', async () => {
|
|
215
|
-
const
|
|
215
|
+
const versionControl: SyncVersionControlPort = {
|
|
216
216
|
syncWorkspaceFromRemote: vi.fn(async (id: string) => {
|
|
217
217
|
if (id === 'main') throw new Error('fatal: unable to access https://x:ghp_secret@host/r');
|
|
218
218
|
return updated(decodeURIComponent(id));
|
|
@@ -221,7 +221,7 @@ describe('KbSyncService — a throwing branch step', () => {
|
|
|
221
221
|
tidyAfterSweep: vi.fn(async () => ({ closedEmpty: 0, removedLeftovers: 0 })),
|
|
222
222
|
retireRemoteGoneClone: vi.fn(async () => true),
|
|
223
223
|
};
|
|
224
|
-
const svc = new KbSyncService(
|
|
224
|
+
const svc = new KbSyncService(versionControl, workspaces(['main', 'ali/x']));
|
|
225
225
|
const r = await svc.sync({ branches: 'all', by: 'bearer' });
|
|
226
226
|
expect(r.status).toBe('partial');
|
|
227
227
|
expect(r.results[0]).toMatchObject({ branch: 'main', outcome: 'error' });
|
|
@@ -233,8 +233,8 @@ describe('KbSyncService — a throwing branch step', () => {
|
|
|
233
233
|
});
|
|
234
234
|
|
|
235
235
|
describe('KbSyncService — clones the host no longer has, and clones that cannot be read', () => {
|
|
236
|
-
it('a remote-gone branch is retired through
|
|
237
|
-
const
|
|
236
|
+
it('a remote-gone branch is retired through version control, counts as clean, and does not stop the others', async () => {
|
|
237
|
+
const versionControl: SyncVersionControlPort = {
|
|
238
238
|
syncWorkspaceFromRemote: vi.fn(async (id: string): Promise<BranchSyncOutcome> =>
|
|
239
239
|
id === 'ali%2Fx' ? { branch: 'ali/x', outcome: 'remote-gone' } : updated(decodeURIComponent(id)),
|
|
240
240
|
),
|
|
@@ -242,16 +242,16 @@ describe('KbSyncService — clones the host no longer has, and clones that canno
|
|
|
242
242
|
tidyAfterSweep: vi.fn(async () => ({ closedEmpty: 0, removedLeftovers: 0 })),
|
|
243
243
|
retireRemoteGoneClone: vi.fn(async () => true),
|
|
244
244
|
};
|
|
245
|
-
const svc = new KbSyncService(
|
|
245
|
+
const svc = new KbSyncService(versionControl, workspaces(['ali/x', 'main']));
|
|
246
246
|
const r = await svc.sync({ branches: 'all' });
|
|
247
247
|
expect(r.status).toBe('synced');
|
|
248
248
|
expect(r.results).toEqual([{ branch: 'ali/x', outcome: 'remote-gone' }, updated('main')]);
|
|
249
|
-
expect(
|
|
250
|
-
expect(
|
|
249
|
+
expect(versionControl.retireRemoteGoneClone).toHaveBeenCalledTimes(1);
|
|
250
|
+
expect(versionControl.retireRemoteGoneClone).toHaveBeenCalledWith('ali%2Fx');
|
|
251
251
|
});
|
|
252
252
|
|
|
253
253
|
it('a clone that could not be read is that branch’s error, not everyone’s', async () => {
|
|
254
|
-
const
|
|
254
|
+
const versionControl: SyncVersionControlPort = {
|
|
255
255
|
syncWorkspaceFromRemote: vi.fn(async (id: string) => updated(decodeURIComponent(id))),
|
|
256
256
|
closeChangeRequestsWithDeletedBranches: vi.fn(async () => 0),
|
|
257
257
|
tidyAfterSweep: vi.fn(async () => ({ closedEmpty: 0, removedLeftovers: 0 })),
|
|
@@ -263,21 +263,21 @@ describe('KbSyncService — clones the host no longer has, and clones that canno
|
|
|
263
263
|
{ id: 'juan%2Fy', branch: 'juan/y', unreadable: "Could not read this branch's clone: EPERM" },
|
|
264
264
|
],
|
|
265
265
|
};
|
|
266
|
-
const svc = new KbSyncService(
|
|
266
|
+
const svc = new KbSyncService(versionControl, port);
|
|
267
267
|
const r = await svc.sync({ branches: 'all' });
|
|
268
268
|
expect(r.status).toBe('partial');
|
|
269
269
|
expect(r.results).toEqual([
|
|
270
270
|
updated('main'),
|
|
271
271
|
{ branch: 'juan/y', outcome: 'error', error: "Could not read this branch's clone: EPERM" },
|
|
272
272
|
]);
|
|
273
|
-
expect(
|
|
273
|
+
expect(versionControl.syncWorkspaceFromRemote).toHaveBeenCalledTimes(1);
|
|
274
274
|
});
|
|
275
275
|
});
|
|
276
276
|
|
|
277
277
|
describe('KbSyncService — a coalesced caller is judged by its own branches', () => {
|
|
278
278
|
it("branch A's hook is not failed by branch B's conflict in the same follow-up", async () => {
|
|
279
279
|
const gate = deferred<void>();
|
|
280
|
-
const
|
|
280
|
+
const versionControl: SyncVersionControlPort = {
|
|
281
281
|
syncWorkspaceFromRemote: vi.fn(async (id: string): Promise<BranchSyncOutcome> => {
|
|
282
282
|
if (id === 'main') await gate.promise;
|
|
283
283
|
if (id === 'juan%2Fy') return { branch: 'juan/y', outcome: 'conflict', conflictedPaths: ['a.md'], error: 'msg' };
|
|
@@ -287,7 +287,7 @@ describe('KbSyncService — a coalesced caller is judged by its own branches', (
|
|
|
287
287
|
tidyAfterSweep: vi.fn(async () => ({ closedEmpty: 0, removedLeftovers: 0 })),
|
|
288
288
|
retireRemoteGoneClone: vi.fn(async () => true),
|
|
289
289
|
};
|
|
290
|
-
const svc = new KbSyncService(
|
|
290
|
+
const svc = new KbSyncService(versionControl, workspaces(['main', 'ali/x', 'juan/y']));
|
|
291
291
|
const first = svc.sync({ branches: ['main'] });
|
|
292
292
|
const hookA = svc.sync({ branches: ['ali/x'] });
|
|
293
293
|
const hookB = svc.sync({ branches: ['juan/y'] });
|
|
@@ -306,7 +306,7 @@ describe('KbSyncService — a coalesced caller is judged by its own branches', (
|
|
|
306
306
|
describe('KbSyncService — a waiter keeps the branches it asked for', () => {
|
|
307
307
|
it('a caller that edits its array after queueing changes nothing about its sync or its answer', async () => {
|
|
308
308
|
const gate = deferred<void>();
|
|
309
|
-
const
|
|
309
|
+
const versionControl: SyncVersionControlPort = {
|
|
310
310
|
syncWorkspaceFromRemote: vi.fn(async (id: string) => {
|
|
311
311
|
if (id === 'main') await gate.promise;
|
|
312
312
|
return updated(decodeURIComponent(id));
|
|
@@ -315,7 +315,7 @@ describe('KbSyncService — a waiter keeps the branches it asked for', () => {
|
|
|
315
315
|
tidyAfterSweep: vi.fn(async () => ({ closedEmpty: 0, removedLeftovers: 0 })),
|
|
316
316
|
retireRemoteGoneClone: vi.fn(async () => true),
|
|
317
317
|
};
|
|
318
|
-
const svc = new KbSyncService(
|
|
318
|
+
const svc = new KbSyncService(versionControl, workspaces(['main', 'ali/x', 'juan/y']));
|
|
319
319
|
const first = svc.sync({ branches: ['main'] });
|
|
320
320
|
const asked = ['ali/x'];
|
|
321
321
|
const waiting = svc.sync({ branches: asked });
|
|
@@ -325,6 +325,6 @@ describe('KbSyncService — a waiter keeps the branches it asked for', () => {
|
|
|
325
325
|
await first;
|
|
326
326
|
const r = await waiting;
|
|
327
327
|
expect(r.results.map((x) => x.branch)).toEqual(['ali/x']);
|
|
328
|
-
expect(
|
|
328
|
+
expect(versionControl.syncWorkspaceFromRemote).not.toHaveBeenCalledWith('juan%2Fy');
|
|
329
329
|
});
|
|
330
330
|
});
|
|
@@ -5,7 +5,7 @@ import type { BranchSyncOutcome } from '@bevel-software/platform-shared';
|
|
|
5
5
|
* Hexis "the repository changed" and Hexis brings the clones it holds up to
|
|
6
6
|
* date. The module owns the HTTP surface, the credential check, the payload
|
|
7
7
|
* parsing and the coalescing; every git operation happens behind the
|
|
8
|
-
*
|
|
8
|
+
* version-control port below, never here.
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
/** Which branches a caller asked to sync. `'all'` = every clone Hexis holds. */
|
|
@@ -51,8 +51,8 @@ export interface IKbSyncService {
|
|
|
51
51
|
lastSync(): LastSync | null;
|
|
52
52
|
}
|
|
53
53
|
|
|
54
|
-
/** The slice of the
|
|
55
|
-
export interface
|
|
54
|
+
/** The slice of the version-control module a sync drives. */
|
|
55
|
+
export interface SyncVersionControlPort {
|
|
56
56
|
syncWorkspaceFromRemote(workspaceId: string): Promise<BranchSyncOutcome>;
|
|
57
57
|
/**
|
|
58
58
|
* Retire the clone of a branch the host deleted, under the branch-lifecycle
|