@bevel-software/platform-core-backend 0.34.0 → 0.36.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/agent-guide/access-control.md +146 -300
- package/agent-guide/conventions.md +23 -25
- package/agent-guide/directory-structure.md +72 -120
- package/agent-guide/drafts-and-change-requests.md +92 -0
- package/agent-guide/for-git-users.md +47 -0
- package/agent-guide/glossary.md +36 -0
- package/agent-guide/how-agents-find-things.md +49 -0
- package/agent-guide/html-views.md +16 -11
- package/agent-guide/new-knowledge-base.md +9 -8
- package/agent-guide/onboarding.md +111 -0
- package/agent-guide/skills.md +67 -42
- package/agent-guide/start-here.md +66 -0
- package/agent-guide/tool-manuals.md +133 -154
- package/agent-guide/tools.md +67 -0
- package/agent-guide/where-a-new-file-goes.md +45 -28
- package/dist/core/catalog-cache-invalidation.d.ts +2 -2
- package/dist/core/catalog-cache-invalidation.d.ts.map +1 -1
- package/dist/core/compose-embed.d.ts +2 -2
- package/dist/core/compose-embed.d.ts.map +1 -1
- package/dist/core/compose-embed.js +1 -1
- package/dist/core/compose-embed.js.map +1 -1
- package/dist/core/core-ports.d.ts +19 -4
- package/dist/core/core-ports.d.ts.map +1 -1
- package/dist/core/core-ports.js.map +1 -1
- package/dist/core/create-core-server.d.ts.map +1 -1
- package/dist/core/create-core-server.js +27 -25
- package/dist/core/create-core-server.js.map +1 -1
- package/dist/core/create-core-services.d.ts +25 -13
- package/dist/core/create-core-services.d.ts.map +1 -1
- package/dist/core/create-core-services.js +75 -60
- package/dist/core/create-core-services.js.map +1 -1
- package/dist/core/lifecycle.d.ts +4 -4
- package/dist/core/lifecycle.d.ts.map +1 -1
- package/dist/core/lifecycle.js +5 -5
- package/dist/core/lifecycle.js.map +1 -1
- package/dist/core-config.d.ts +2 -2
- package/dist/core-config.js +3 -3
- package/dist/core-config.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/modules/access/access-control.interface.d.ts +22 -0
- package/dist/modules/access/access-control.interface.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.d.ts +3 -1
- package/dist/modules/access/access-control.service.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.js +76 -1
- package/dist/modules/access/access-control.service.js.map +1 -1
- package/dist/modules/access/access-declarations.d.ts +2 -2
- package/dist/modules/access/access-declarations.d.ts.map +1 -1
- package/dist/modules/access/access-declarations.js +2 -2
- package/dist/modules/access/access-declarations.js.map +1 -1
- package/dist/modules/access/access-mutation.service.d.ts +2 -2
- package/dist/modules/access/access-mutation.service.d.ts.map +1 -1
- package/dist/modules/access/access-mutation.service.js +2 -2
- package/dist/modules/access/access-mutation.service.js.map +1 -1
- package/dist/modules/access/access-requests.routes.d.ts +2 -2
- package/dist/modules/access/access-requests.routes.d.ts.map +1 -1
- package/dist/modules/access/access-requests.routes.js +5 -5
- package/dist/modules/access/access-requests.routes.js.map +1 -1
- package/dist/modules/access/access-requests.service.d.ts +2 -2
- package/dist/modules/access/access-requests.service.d.ts.map +1 -1
- package/dist/modules/access/access-requests.service.js +11 -11
- package/dist/modules/access/access-requests.service.js.map +1 -1
- package/dist/modules/access/access.routes.d.ts +2 -2
- package/dist/modules/access/access.routes.d.ts.map +1 -1
- package/dist/modules/access/access.routes.js +32 -13
- package/dist/modules/access/access.routes.js.map +1 -1
- package/dist/modules/access/admin-locked-commit.d.ts +5 -5
- package/dist/modules/access/admin-locked-commit.d.ts.map +1 -1
- package/dist/modules/access/admin-locked-commit.js +7 -7
- package/dist/modules/access/admin-locked-commit.js.map +1 -1
- package/dist/modules/access/admin-route-helpers.d.ts +1 -1
- package/dist/modules/access/admin-route-helpers.js +5 -5
- package/dist/modules/access/admin-route-helpers.js.map +1 -1
- package/dist/modules/access/change-read-gate.d.ts +1 -1
- package/dist/modules/access/change-read-gate.js +1 -1
- package/dist/modules/access/groups-admin.service.d.ts +7 -7
- package/dist/modules/access/groups-admin.service.d.ts.map +1 -1
- package/dist/modules/access/groups-admin.service.js +6 -6
- package/dist/modules/access/groups-admin.service.js.map +1 -1
- package/dist/modules/access/index.d.ts +1 -1
- package/dist/modules/access/index.d.ts.map +1 -1
- package/dist/modules/access/reference-scan.d.ts +1 -1
- package/dist/modules/access/roles-admin.service.d.ts +7 -7
- package/dist/modules/access/roles-admin.service.d.ts.map +1 -1
- package/dist/modules/access/roles-admin.service.js +8 -8
- package/dist/modules/access/roles-admin.service.js.map +1 -1
- package/dist/modules/access/synced-groups-committer.d.ts +4 -4
- package/dist/modules/access/synced-groups-committer.d.ts.map +1 -1
- package/dist/modules/access/synced-groups-committer.js +7 -7
- package/dist/modules/access/synced-groups-committer.js.map +1 -1
- package/dist/modules/access/user-access-removal.service.d.ts +6 -6
- package/dist/modules/access/user-access-removal.service.d.ts.map +1 -1
- package/dist/modules/access/user-access-removal.service.js +4 -4
- package/dist/modules/access/user-access-removal.service.js.map +1 -1
- package/dist/modules/access-model/access-errors.d.ts +4 -4
- package/dist/modules/access-model/access-errors.d.ts.map +1 -1
- package/dist/modules/access-model/access-errors.js +4 -4
- package/dist/modules/access-model/access-errors.js.map +1 -1
- package/dist/modules/access-model/access-grammar.d.ts +1 -1
- package/dist/modules/access-model/access-grammar.js +4 -4
- package/dist/modules/access-model/change-gate.d.ts +1 -1
- package/dist/modules/access-model/change-gate.js +1 -1
- package/dist/modules/access-model/roles-yaml-guard.d.ts +4 -4
- package/dist/modules/access-model/roles-yaml-guard.d.ts.map +1 -1
- package/dist/modules/access-model/roles-yaml-guard.js +4 -4
- package/dist/modules/access-model/roles-yaml-guard.js.map +1 -1
- package/dist/modules/agent-guide/agent-guide.d.ts +63 -18
- package/dist/modules/agent-guide/agent-guide.d.ts.map +1 -1
- package/dist/modules/agent-guide/agent-guide.js +144 -30
- package/dist/modules/agent-guide/agent-guide.js.map +1 -1
- package/dist/modules/agent-guide/agent-guide.tools.d.ts +6 -2
- package/dist/modules/agent-guide/agent-guide.tools.d.ts.map +1 -1
- package/dist/modules/agent-guide/agent-guide.tools.js +45 -31
- package/dist/modules/agent-guide/agent-guide.tools.js.map +1 -1
- package/dist/modules/agent-guide/guide-budget.d.ts +51 -0
- package/dist/modules/agent-guide/guide-budget.d.ts.map +1 -0
- package/dist/modules/agent-guide/guide-budget.js +71 -0
- package/dist/modules/agent-guide/guide-budget.js.map +1 -0
- package/dist/modules/agent-guide/index.d.ts +2 -1
- package/dist/modules/agent-guide/index.d.ts.map +1 -1
- package/dist/modules/agent-guide/index.js +2 -1
- package/dist/modules/agent-guide/index.js.map +1 -1
- package/dist/modules/agent-instructions/agent-instructions.routes.d.ts +12 -5
- package/dist/modules/agent-instructions/agent-instructions.routes.d.ts.map +1 -1
- package/dist/modules/agent-instructions/agent-instructions.routes.js +13 -6
- package/dist/modules/agent-instructions/agent-instructions.routes.js.map +1 -1
- package/dist/modules/agent-instructions/compose.d.ts +15 -8
- package/dist/modules/agent-instructions/compose.d.ts.map +1 -1
- package/dist/modules/agent-instructions/compose.js +28 -10
- package/dist/modules/agent-instructions/compose.js.map +1 -1
- package/dist/modules/agent-instructions/shared-file-rules.d.ts +14 -6
- package/dist/modules/agent-instructions/shared-file-rules.d.ts.map +1 -1
- package/dist/modules/agent-instructions/shared-file-rules.js +60 -18
- package/dist/modules/agent-instructions/shared-file-rules.js.map +1 -1
- package/dist/modules/auth/account-erasure.service.d.ts +36 -7
- package/dist/modules/auth/account-erasure.service.d.ts.map +1 -1
- package/dist/modules/auth/account-erasure.service.js +30 -10
- package/dist/modules/auth/account-erasure.service.js.map +1 -1
- package/dist/modules/auth/account-hooks.d.ts +20 -0
- package/dist/modules/auth/account-hooks.d.ts.map +1 -1
- package/dist/modules/auth/account-hooks.js +10 -0
- package/dist/modules/auth/account-hooks.js.map +1 -1
- package/dist/modules/auth/account-switch-lock.js +2 -2
- package/dist/modules/auth/account-switch-lock.js.map +1 -1
- package/dist/modules/auth/account.routes.d.ts +7 -2
- package/dist/modules/auth/account.routes.d.ts.map +1 -1
- package/dist/modules/auth/account.routes.js +23 -4
- package/dist/modules/auth/account.routes.js.map +1 -1
- package/dist/modules/auth/auth.service.d.ts +1 -1
- package/dist/modules/auth/auth.service.js +4 -4
- package/dist/modules/auth/auth.service.js.map +1 -1
- package/dist/modules/auth/index.d.ts +1 -0
- package/dist/modules/auth/index.d.ts.map +1 -1
- package/dist/modules/code-mode/code-mode.tool.js +2 -2
- package/dist/modules/code-mode/code-mode.tool.js.map +1 -1
- package/dist/modules/connection-probe/connection-probe.service.d.ts +0 -12
- package/dist/modules/connection-probe/connection-probe.service.d.ts.map +1 -1
- package/dist/modules/connection-probe/connection-probe.service.js +1 -38
- package/dist/modules/connection-probe/connection-probe.service.js.map +1 -1
- package/dist/modules/database/core-schema.js +2 -2
- package/dist/modules/database/core-schema.js.map +1 -1
- package/dist/modules/diff/diff.routes.d.ts +3 -3
- package/dist/modules/diff/diff.routes.d.ts.map +1 -1
- package/dist/modules/diff/diff.routes.js +7 -7
- package/dist/modules/diff/diff.routes.js.map +1 -1
- package/dist/modules/embed/embed.routes.js +1 -1
- package/dist/modules/embed/embed.routes.js.map +1 -1
- package/dist/modules/embed/embed.service.d.ts +4 -4
- package/dist/modules/embed/embed.service.d.ts.map +1 -1
- package/dist/modules/embed/embed.service.js +18 -18
- package/dist/modules/embed/embed.service.js.map +1 -1
- package/dist/modules/kb-fs/branch-name.js +8 -8
- package/dist/modules/kb-fs/branch-name.js.map +1 -1
- package/dist/modules/kb-fs/file-change-notifier.d.ts +2 -2
- package/dist/modules/kb-fs/locking-filesystem.d.ts +9 -9
- package/dist/modules/kb-fs/locking-filesystem.d.ts.map +1 -1
- package/dist/modules/kb-fs/locking-filesystem.js +27 -27
- package/dist/modules/kb-fs/locking-filesystem.js.map +1 -1
- package/dist/modules/kb-fs/repo-path.js +5 -5
- package/dist/modules/kb-fs/repo-path.js.map +1 -1
- package/dist/modules/kb-fs/tmp-ref.d.ts +2 -2
- package/dist/modules/kb-fs/tmp-ref.d.ts.map +1 -1
- package/dist/modules/kb-fs/tmp-ref.js +2 -2
- package/dist/modules/kb-fs/tmp-ref.js.map +1 -1
- package/dist/modules/kb-sync/index.d.ts +1 -1
- package/dist/modules/kb-sync/index.d.ts.map +1 -1
- package/dist/modules/kb-sync/kb-sync.interface.d.ts +3 -3
- package/dist/modules/kb-sync/kb-sync.interface.d.ts.map +1 -1
- package/dist/modules/kb-sync/kb-sync.service.d.ts +3 -3
- package/dist/modules/kb-sync/kb-sync.service.d.ts.map +1 -1
- package/dist/modules/kb-sync/kb-sync.service.js +10 -10
- package/dist/modules/kb-sync/kb-sync.service.js.map +1 -1
- package/dist/modules/mcp/mcp.service.d.ts +11 -4
- package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
- package/dist/modules/mcp/mcp.service.js +80 -53
- package/dist/modules/mcp/mcp.service.js.map +1 -1
- package/dist/modules/onboarding/onboarding.contract.d.ts +1 -1
- package/dist/modules/onboarding/onboarding.routes.js +2 -2
- package/dist/modules/onboarding/onboarding.routes.js.map +1 -1
- package/dist/modules/onboarding/starter-pack.service.d.ts +4 -4
- package/dist/modules/onboarding/starter-pack.service.d.ts.map +1 -1
- package/dist/modules/onboarding/starter-pack.service.js +4 -4
- package/dist/modules/onboarding/starter-pack.service.js.map +1 -1
- package/dist/modules/plugins/join-request-jobs.service.d.ts +2 -2
- package/dist/modules/plugins/join-request-jobs.service.d.ts.map +1 -1
- package/dist/modules/plugins/join-request-jobs.service.js +7 -7
- package/dist/modules/plugins/join-request-jobs.service.js.map +1 -1
- package/dist/modules/plugins/join-requests.service.d.ts +3 -3
- package/dist/modules/plugins/join-requests.service.d.ts.map +1 -1
- package/dist/modules/plugins/join-requests.service.js +5 -5
- package/dist/modules/plugins/join-requests.service.js.map +1 -1
- package/dist/modules/plugins/plugin-rename.service.js +1 -1
- package/dist/modules/plugins/plugin-rename.service.js.map +1 -1
- package/dist/modules/plugins/plugins.routes.d.ts +2 -2
- package/dist/modules/plugins/plugins.routes.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.routes.js +8 -8
- package/dist/modules/plugins/plugins.routes.js.map +1 -1
- package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts +87 -2
- package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts.map +1 -1
- package/dist/modules/secrets-vault/db-secrets-vault.service.js +635 -74
- package/dist/modules/secrets-vault/db-secrets-vault.service.js.map +1 -1
- package/dist/modules/secrets-vault/index.d.ts +3 -2
- package/dist/modules/secrets-vault/index.d.ts.map +1 -1
- package/dist/modules/secrets-vault/index.js +2 -1
- package/dist/modules/secrets-vault/index.js.map +1 -1
- package/dist/modules/secrets-vault/managed-sign-in-erasure.d.ts +36 -0
- package/dist/modules/secrets-vault/managed-sign-in-erasure.d.ts.map +1 -0
- package/dist/modules/secrets-vault/managed-sign-in-erasure.js +37 -0
- package/dist/modules/secrets-vault/managed-sign-in-erasure.js.map +1 -0
- package/dist/modules/secrets-vault/secrets-vault.contract.d.ts +205 -11
- package/dist/modules/secrets-vault/secrets-vault.contract.d.ts.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.contract.js +27 -0
- package/dist/modules/secrets-vault/secrets-vault.contract.js.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.routes.d.ts +7 -1
- package/dist/modules/secrets-vault/secrets-vault.routes.d.ts.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.routes.js +206 -45
- package/dist/modules/secrets-vault/secrets-vault.routes.js.map +1 -1
- package/dist/modules/settings/connection-check.js +1 -1
- package/dist/modules/settings/connection-check.js.map +1 -1
- package/dist/modules/settings/deployment-settings.service.js +1 -1
- package/dist/modules/settings/git-root-folders.js +1 -1
- package/dist/modules/settings/git-root-folders.js.map +1 -1
- package/dist/modules/settings/oidc-check.d.ts.map +1 -1
- package/dist/modules/settings/oidc-check.js +5 -17
- package/dist/modules/settings/oidc-check.js.map +1 -1
- package/dist/modules/settings/setup.routes.d.ts +1 -1
- package/dist/modules/settings/setup.routes.js +1 -1
- package/dist/modules/skills/pending-skills.service.d.ts +3 -3
- package/dist/modules/skills/pending-skills.service.d.ts.map +1 -1
- package/dist/modules/skills/pending-skills.service.js +4 -4
- package/dist/modules/skills/pending-skills.service.js.map +1 -1
- package/dist/modules/skills/skill-access-requests.routes.d.ts +2 -2
- package/dist/modules/skills/skill-access-requests.routes.d.ts.map +1 -1
- package/dist/modules/skills/skill-access-requests.routes.js +5 -5
- package/dist/modules/skills/skill-access-requests.routes.js.map +1 -1
- package/dist/modules/skills/skills.tools.js +1 -1
- package/dist/modules/skills/skills.tools.js.map +1 -1
- package/dist/modules/tool-helpers/tool-context.d.ts +4 -4
- package/dist/modules/tool-helpers/tool-context.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool-context.js +2 -2
- package/dist/modules/tool-helpers/tool-context.js.map +1 -1
- package/dist/modules/tool-helpers/tool-def.js +1 -1
- package/dist/modules/tool-helpers/tool-def.js.map +1 -1
- package/dist/modules/tool-helpers/tool-handler.js +2 -2
- package/dist/modules/tool-helpers/tool-handler.js.map +1 -1
- package/dist/modules/tool-helpers/tool.contract.d.ts +4 -4
- package/dist/modules/tool-helpers/tool.contract.d.ts.map +1 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.d.ts +7 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.d.ts.map +1 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.js +69 -38
- package/dist/modules/tool-manuals/mcp-json-discovery.js.map +1 -1
- package/dist/modules/tool-manuals/mcp-server-edit.service.js +1 -1
- package/dist/modules/tool-manuals/mcp-server-edit.service.js.map +1 -1
- package/dist/modules/tool-manuals/pending-tools.service.d.ts +3 -3
- package/dist/modules/tool-manuals/pending-tools.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/pending-tools.service.js +4 -4
- package/dist/modules/tool-manuals/pending-tools.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-delete.service.js +1 -1
- package/dist/modules/tool-manuals/tool-delete.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.contract.d.ts +70 -3
- package/dist/modules/tool-manuals/tool-manuals.contract.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts +18 -8
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.js +166 -49
- package/dist/modules/tool-manuals/tool-manuals.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts +11 -2
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.js +66 -24
- package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -1
- package/dist/modules/version-control/agent-tools/change-request-read-shape.d.ts.map +1 -0
- package/dist/modules/version-control/agent-tools/change-request-read-shape.js.map +1 -0
- package/dist/modules/version-control/agent-tools/change-request-read.tools.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/agent-tools/change-request-read.tools.js +2 -2
- package/dist/modules/version-control/agent-tools/change-request-read.tools.js.map +1 -0
- package/dist/modules/version-control/agent-tools/change-request-summary.d.ts.map +1 -0
- package/dist/modules/version-control/agent-tools/change-request-summary.js.map +1 -0
- package/dist/modules/{workflow/agent-tools/workflow.tools.d.ts → version-control/agent-tools/version-control.tools.d.ts} +4 -4
- package/dist/modules/version-control/agent-tools/version-control.tools.d.ts.map +1 -0
- package/dist/modules/{workflow/agent-tools/workflow.tools.js → version-control/agent-tools/version-control.tools.js} +53 -49
- package/dist/modules/version-control/agent-tools/version-control.tools.js.map +1 -0
- package/dist/modules/{workflow → version-control}/change-request-hooks.d.ts +1 -1
- package/dist/modules/version-control/change-request-hooks.d.ts.map +1 -0
- package/dist/modules/version-control/change-request-hooks.js.map +1 -0
- package/dist/modules/version-control/change-request-review/approval-lock.d.ts.map +1 -0
- package/dist/modules/version-control/change-request-review/approval-lock.js.map +1 -0
- package/dist/modules/{workflow/review-workflow/review-workflow.interface.d.ts → version-control/change-request-review/change-request-review.interface.d.ts} +2 -2
- package/dist/modules/version-control/change-request-review/change-request-review.interface.d.ts.map +1 -0
- package/dist/modules/version-control/change-request-review/change-request-review.interface.js +2 -0
- package/dist/modules/version-control/change-request-review/change-request-review.interface.js.map +1 -0
- package/dist/modules/{workflow/review-workflow/review-workflow.service.d.ts → version-control/change-request-review/change-request-review.service.d.ts} +3 -3
- package/dist/modules/version-control/change-request-review/change-request-review.service.d.ts.map +1 -0
- package/dist/modules/{workflow/review-workflow/review-workflow.service.js → version-control/change-request-review/change-request-review.service.js} +26 -26
- package/dist/modules/version-control/change-request-review/change-request-review.service.js.map +1 -0
- package/dist/modules/{workflow → version-control}/event-bus.d.ts +8 -8
- package/dist/modules/version-control/event-bus.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/event-bus.js +4 -4
- package/dist/modules/version-control/event-bus.js.map +1 -0
- package/dist/modules/{workflow → version-control}/events-delivery.d.ts +4 -4
- package/dist/modules/version-control/events-delivery.d.ts.map +1 -0
- package/dist/modules/version-control/events-delivery.js.map +1 -0
- package/dist/modules/{workflow → version-control}/events.routes.d.ts +4 -4
- package/dist/modules/version-control/events.routes.d.ts.map +1 -0
- package/dist/modules/version-control/events.routes.js.map +1 -0
- package/dist/modules/{workflow → version-control}/file-lock.service.d.ts +2 -2
- package/dist/modules/version-control/file-lock.service.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/file-lock.service.js +6 -6
- package/dist/modules/version-control/file-lock.service.js.map +1 -0
- package/dist/modules/version-control/git/change-request-link.d.ts.map +1 -0
- package/dist/modules/version-control/git/change-request-link.js.map +1 -0
- package/dist/modules/version-control/git/git-version.d.ts.map +1 -0
- package/dist/modules/version-control/git/git-version.js.map +1 -0
- package/dist/modules/{workflow → version-control}/git/git.service.d.ts +8 -8
- package/dist/modules/version-control/git/git.service.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/git/git.service.js +53 -53
- package/dist/modules/version-control/git/git.service.js.map +1 -0
- package/dist/modules/version-control/git/merge-commit.d.ts.map +1 -0
- package/dist/modules/version-control/git/merge-commit.js.map +1 -0
- package/dist/modules/version-control/git/node-git-runner.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/git/node-git-runner.js +1 -1
- package/dist/modules/version-control/git/node-git-runner.js.map +1 -0
- package/dist/modules/{workflow → version-control}/git/pull-request.service.d.ts +5 -5
- package/dist/modules/version-control/git/pull-request.service.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/git/pull-request.service.js +10 -10
- package/dist/modules/version-control/git/pull-request.service.js.map +1 -0
- package/dist/modules/{workflow → version-control}/index.d.ts +6 -5
- package/dist/modules/version-control/index.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/index.js +3 -2
- package/dist/modules/version-control/index.js.map +1 -0
- package/dist/modules/{workflow → version-control}/pending-commits.service.d.ts +2 -2
- package/dist/modules/version-control/pending-commits.service.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/pending-commits.service.js +2 -2
- package/dist/modules/version-control/pending-commits.service.js.map +1 -0
- package/dist/modules/{workflow → version-control}/pending-commits.worker.d.ts +5 -5
- package/dist/modules/version-control/pending-commits.worker.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/pending-commits.worker.js +3 -3
- package/dist/modules/version-control/pending-commits.worker.js.map +1 -0
- package/dist/modules/{workflow → version-control}/read-on-branch.d.ts +2 -2
- package/dist/modules/version-control/read-on-branch.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/read-on-branch.js +2 -2
- package/dist/modules/version-control/read-on-branch.js.map +1 -0
- package/dist/modules/version-control/recovery-bot.d.ts.map +1 -0
- package/dist/modules/version-control/recovery-bot.js.map +1 -0
- package/dist/modules/version-control/sanitize-error.d.ts.map +1 -0
- package/dist/modules/version-control/sanitize-error.js.map +1 -0
- package/dist/modules/{workflow/workflow-hooks.d.ts → version-control/version-control-hooks.d.ts} +4 -4
- package/dist/modules/version-control/version-control-hooks.d.ts.map +1 -0
- package/dist/modules/{workflow/workflow-hooks.js → version-control/version-control-hooks.js} +3 -3
- package/dist/modules/version-control/version-control-hooks.js.map +1 -0
- package/dist/modules/{workflow/workflow.routes.d.ts → version-control/version-control.routes.d.ts} +6 -5
- package/dist/modules/version-control/version-control.routes.d.ts.map +1 -0
- package/dist/modules/{workflow/workflow.routes.js → version-control/version-control.routes.js} +61 -60
- package/dist/modules/version-control/version-control.routes.js.map +1 -0
- package/dist/modules/{workflow/workflow.service.d.ts → version-control/version-control.service.d.ts} +26 -31
- package/dist/modules/version-control/version-control.service.d.ts.map +1 -0
- package/dist/modules/{workflow/workflow.service.js → version-control/version-control.service.js} +89 -94
- package/dist/modules/version-control/version-control.service.js.map +1 -0
- package/dist/modules/workspace/agent-access.gate.d.ts +6 -6
- package/dist/modules/workspace/agent-access.gate.d.ts.map +1 -1
- package/dist/modules/workspace/agent-access.gate.js +2 -2
- package/dist/modules/workspace/agent-access.gate.js.map +1 -1
- package/dist/modules/workspace/git-internals.middleware.d.ts +1 -1
- package/dist/modules/workspace/git-internals.middleware.js +2 -2
- package/dist/modules/workspace/kb-repository.js +1 -1
- package/dist/modules/workspace/kb-repository.js.map +1 -1
- package/dist/modules/workspace/startup/kb-git.d.ts +1 -1
- package/dist/modules/workspace/startup/kb-git.d.ts.map +1 -1
- package/dist/modules/workspace/startup/kb-git.js +1 -1
- package/dist/modules/workspace/startup/kb-git.js.map +1 -1
- package/dist/modules/workspace/startup/steps/seed-tree.d.ts +2 -2
- package/dist/modules/workspace/startup/steps/seed-tree.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/seed-tree.js +1 -1
- package/dist/modules/workspace/startup/steps/seed-tree.js.map +1 -1
- package/dist/modules/workspace/startup/steps/template-files.step.d.ts +2 -2
- package/dist/modules/workspace/startup/steps/template-files.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/template-files.step.js +2 -2
- package/dist/modules/workspace/startup/steps/template-files.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/template-source.d.ts +17 -4
- package/dist/modules/workspace/startup/steps/template-source.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/template-source.js +8 -5
- package/dist/modules/workspace/startup/steps/template-source.js.map +1 -1
- package/dist/modules/workspace/workspace-tmp.js +3 -3
- package/dist/modules/workspace/workspace-tmp.js.map +1 -1
- package/dist/modules/workspace/workspace.routes.d.ts +4 -4
- package/dist/modules/workspace/workspace.routes.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.routes.js +22 -22
- package/dist/modules/workspace/workspace.routes.js.map +1 -1
- package/dist/modules/workspace/workspace.service.d.ts +6 -6
- package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.service.js +11 -11
- package/dist/modules/workspace/workspace.service.js.map +1 -1
- package/dist/modules/workspace/workspace.tools.d.ts +5 -3
- package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.tools.js +85 -30
- package/dist/modules/workspace/workspace.tools.js.map +1 -1
- package/dist/shared/canonical-file-identity.d.ts +2 -2
- package/dist/shared/canonical-file-identity.js +5 -5
- package/dist/shared/canonical-file-identity.js.map +1 -1
- package/dist/shared/domain-errors.d.ts +39 -39
- package/dist/shared/domain-errors.d.ts.map +1 -1
- package/dist/shared/domain-errors.js +44 -44
- package/dist/shared/domain-errors.js.map +1 -1
- package/dist/shared/git.contract.d.ts +1 -1
- package/dist/shared/git.contract.js +1 -1
- package/dist/shared/http-errors.d.ts +3 -3
- package/dist/shared/http-errors.d.ts.map +1 -1
- package/dist/shared/http-errors.js +1 -1
- package/dist/shared/http-errors.js.map +1 -1
- package/dist/shared/oauth-token-error.d.ts +23 -0
- package/dist/shared/oauth-token-error.d.ts.map +1 -0
- package/dist/shared/oauth-token-error.js +47 -0
- package/dist/shared/oauth-token-error.js.map +1 -0
- package/dist/shared/pending-proposals.d.ts +3 -3
- package/dist/shared/pending-proposals.d.ts.map +1 -1
- package/dist/shared/pending-proposals.js +2 -2
- package/dist/shared/pending-proposals.js.map +1 -1
- package/dist/shared/read-capped.d.ts +19 -0
- package/dist/shared/read-capped.d.ts.map +1 -0
- package/dist/shared/read-capped.js +45 -0
- package/dist/shared/read-capped.js.map +1 -0
- package/dist/tenancy/static-tenant-source.js +1 -1
- package/dist/tenancy/static-tenant-source.js.map +1 -1
- package/migrations/0012_agent_audit.sql +40 -40
- package/migrations/0013_agent_identity_and_key_soft_delete.sql +29 -29
- package/migrations/meta/0012_snapshot.json +2246 -2246
- package/migrations/meta/0013_snapshot.json +2258 -2258
- package/package.json +5 -4
- package/src/__tests__/account-admin.ts +27 -0
- package/src/__tests__/hexis-catalog.ts +144 -0
- package/src/__tests__/kb-context.ts +30 -30
- package/src/__tests__/kb-layout-config.test.ts +21 -0
- package/src/__tests__/open-change-gate.ts +1 -1
- package/src/__tests__/real-disk.ts +21 -0
- package/src/__tests__/tokens.ts +19 -0
- package/src/__tests__/tool-handler.ts +15 -0
- package/src/__tests__/tool-manuals.ts +32 -0
- package/src/__tests__/tool-wiring.ts +31 -0
- package/src/__tests__/workspace-service.ts +1 -1
- package/src/core/__tests__/catalog-cache-invalidation.test.ts +3 -3
- package/src/core/__tests__/compose-embed.test.ts +1 -1
- package/src/core/__tests__/damaged-document.tools.test.ts +3 -3
- package/src/core/__tests__/erasure-slices-wired-once.test.ts +46 -0
- package/src/core/__tests__/gated-boot.test.ts +2 -2
- package/src/core/__tests__/lifecycle.test.ts +9 -9
- package/src/core/__tests__/oauth-sign-in-real-file.test.ts +179 -0
- package/src/core/catalog-cache-invalidation.ts +2 -2
- package/src/core/compose-embed.ts +3 -3
- package/src/core/core-ports.ts +19 -4
- package/src/core/create-core-server.ts +40 -26
- package/src/core/create-core-services.ts +92 -66
- package/src/core/lifecycle.ts +9 -9
- package/src/core-config.ts +3 -3
- package/src/index.ts +5 -5
- package/src/modules/access/__tests__/access-control.admin-root-floor.test.ts +4 -4
- package/src/modules/access/__tests__/access-own-read-grant.test.ts +14 -14
- package/src/modules/access/__tests__/access-requests.routes.test.ts +20 -20
- package/src/modules/access/__tests__/access.routes.admins.test.ts +4 -4
- package/src/modules/access/__tests__/access.routes.batch.test.ts +4 -4
- package/src/modules/access/__tests__/access.routes.folder-governs.test.ts +6 -6
- package/src/modules/access/__tests__/access.routes.group-grant.test.ts +6 -6
- package/src/modules/access/__tests__/access.routes.overrides.test.ts +5 -5
- package/src/modules/access/__tests__/access.routes.proposal-branch.test.ts +6 -6
- package/src/modules/access/__tests__/access.routes.prospective.test.ts +54 -14
- package/src/modules/access/__tests__/access.routes.revoke.test.ts +6 -6
- package/src/modules/access/__tests__/access.routes.unknown-email.test.ts +6 -6
- package/src/modules/access/__tests__/admin-locked-commit.test.ts +6 -6
- package/src/modules/access/__tests__/admin-route-helpers.test.ts +5 -5
- package/src/modules/access/__tests__/groups-admin.service.test.ts +27 -27
- package/src/modules/access/__tests__/holder-changes.test.ts +127 -0
- package/src/modules/access/__tests__/roles-admin.security.test.ts +14 -13
- package/src/modules/access/__tests__/roles-admin.service.test.ts +27 -27
- package/src/modules/access/__tests__/roles-capabilities.test.ts +19 -19
- package/src/modules/access/__tests__/roles.routes.test.ts +6 -6
- package/src/modules/access/__tests__/synced-groups-committer.test.ts +13 -13
- package/src/modules/access/__tests__/user-access-removal.service.test.ts +29 -29
- package/src/modules/access/access-control.interface.ts +26 -0
- package/src/modules/access/access-control.service.ts +93 -1
- package/src/modules/access/access-declarations.ts +2 -2
- package/src/modules/access/access-mutation.service.ts +2 -2
- package/src/modules/access/access-requests.routes.ts +7 -7
- package/src/modules/access/access-requests.service.ts +13 -13
- package/src/modules/access/access.routes.ts +34 -15
- package/src/modules/access/admin-locked-commit.ts +11 -11
- package/src/modules/access/admin-route-helpers.ts +5 -5
- package/src/modules/access/change-read-gate.ts +1 -1
- package/src/modules/access/groups-admin.service.ts +7 -7
- package/src/modules/access/index.ts +1 -1
- package/src/modules/access/reference-scan.ts +1 -1
- package/src/modules/access/roles-admin.service.ts +9 -9
- package/src/modules/access/synced-groups-committer.ts +11 -11
- package/src/modules/access/user-access-removal.service.ts +7 -7
- package/src/modules/access-model/__tests__/access-grammar.test.ts +2 -2
- package/src/modules/access-model/access-errors.ts +4 -4
- package/src/modules/access-model/access-grammar.ts +4 -4
- package/src/modules/access-model/change-gate.ts +1 -1
- package/src/modules/access-model/roles-yaml-guard.ts +4 -4
- package/src/modules/agent-guide/__tests__/agent-guide.test.ts +98 -29
- package/src/modules/agent-guide/__tests__/agent-guide.tools.test.ts +39 -12
- package/src/modules/agent-guide/__tests__/guide-budget.test.ts +95 -0
- package/src/modules/agent-guide/__tests__/guide-eval.test.ts +182 -0
- package/src/modules/agent-guide/__tests__/guide-matches-code.test.ts +263 -0
- package/src/modules/agent-guide/__tests__/tool-surface.json +514 -0
- package/src/modules/agent-guide/__tests__/tool-surface.test.ts +75 -0
- package/src/modules/agent-guide/agent-guide.tools.ts +49 -31
- package/src/modules/agent-guide/agent-guide.ts +165 -32
- package/src/modules/agent-guide/guide-budget.ts +77 -0
- package/src/modules/agent-guide/index.ts +12 -0
- package/src/modules/agent-instructions/__tests__/agent-instructions.route.test.ts +4 -5
- package/src/modules/agent-instructions/__tests__/compose.test.ts +1 -1
- package/src/modules/agent-instructions/__tests__/shared-file-rules.test.ts +117 -11
- package/src/modules/agent-instructions/agent-instructions.routes.ts +12 -5
- package/src/modules/agent-instructions/compose.ts +28 -9
- package/src/modules/agent-instructions/shared-file-rules.ts +62 -18
- package/src/modules/agent-scope/__tests__/agent-surfaces.connect-as.test.ts +1 -1
- package/src/modules/audit/__tests__/agent-rest-audit.middleware.test.ts +113 -113
- package/src/modules/audit/__tests__/event-classifier.test.ts +121 -121
- package/src/modules/audit/event-classifier.ts +155 -155
- package/src/modules/auth/__tests__/account-deactivation.test.ts +1 -1
- package/src/modules/auth/__tests__/account-erasure.approval-gate.test.ts +4 -4
- package/src/modules/auth/__tests__/account-erasure.participants.test.ts +56 -0
- package/src/modules/auth/__tests__/account-switch-lock.pg.test.ts +2 -2
- package/src/modules/auth/__tests__/account-switch-lock.test.ts +2 -2
- package/src/modules/auth/__tests__/account.routes.test.ts +73 -11
- package/src/modules/auth/__tests__/auth.service.test.ts +1 -1
- package/src/modules/auth/account-erasure.service.ts +27 -9
- package/src/modules/auth/account-hooks.ts +34 -0
- package/src/modules/auth/account-switch-lock.ts +2 -2
- package/src/modules/auth/account.routes.ts +23 -5
- package/src/modules/auth/auth.service.ts +4 -4
- package/src/modules/auth/index.ts +1 -0
- package/src/modules/code-mode/code-mode.tool.ts +2 -2
- package/src/modules/connection-probe/__tests__/connection-probe.service.test.ts +5 -24
- package/src/modules/connection-probe/connection-probe.service.ts +1 -34
- package/src/modules/database/__tests__/advisory-lock.test.ts +169 -169
- package/src/modules/database/__tests__/migrations-unqualified.test.ts +32 -32
- package/src/modules/database/core-schema.ts +2 -2
- package/src/modules/diff/__tests__/diff.routes.read-gate.test.ts +2 -2
- package/src/modules/diff/__tests__/diff.routes.rejectPathsLocked.test.ts +12 -12
- package/src/modules/diff/diff.routes.ts +8 -8
- package/src/modules/embed/__tests__/embed.service.lock.test.ts +7 -7
- package/src/modules/embed/__tests__/embed.service.test.ts +42 -42
- package/src/modules/embed/__tests__/embed.tools.test.ts +1 -1
- package/src/modules/embed/embed.routes.ts +1 -1
- package/src/modules/embed/embed.service.ts +17 -17
- package/src/modules/kb-fs/__tests__/branch-name.test.ts +2 -2
- package/src/modules/kb-fs/__tests__/locking-filesystem.test.ts +260 -260
- package/src/modules/kb-fs/__tests__/move-with-edits.test.ts +34 -34
- package/src/modules/kb-fs/__tests__/repo-path.test.ts +8 -8
- package/src/modules/kb-fs/branch-name.ts +8 -8
- package/src/modules/kb-fs/file-change-notifier.ts +2 -2
- package/src/modules/kb-fs/locking-filesystem.ts +30 -30
- package/src/modules/kb-fs/repo-path.ts +5 -5
- package/src/modules/kb-fs/tmp-ref.ts +3 -3
- package/src/modules/kb-sync/__tests__/kb-sync.service.test.ts +36 -36
- package/src/modules/kb-sync/index.ts +1 -1
- package/src/modules/kb-sync/kb-sync.interface.ts +3 -3
- package/src/modules/kb-sync/kb-sync.service.ts +9 -9
- package/src/modules/marketplace/__tests__/github-facade.test.ts +1 -1
- package/src/modules/marketplace/__tests__/marketplace-git.test.ts +1 -1
- package/src/modules/mcp/__tests__/mcp-proxy-helpers.test.ts +4 -2
- package/src/modules/mcp/__tests__/mcp.e2e.test.ts +69 -8
- package/src/modules/mcp/__tests__/mcp.service.test.ts +91 -13
- package/src/modules/mcp/__tests__/read-only-hint.pg.test.ts +194 -0
- package/src/modules/mcp/mcp.service.ts +93 -62
- package/src/modules/onboarding/__tests__/starter-pack.service.test.ts +55 -55
- package/src/modules/onboarding/onboarding.contract.ts +1 -1
- package/src/modules/onboarding/onboarding.routes.ts +2 -2
- package/src/modules/onboarding/starter-pack.service.ts +6 -6
- package/src/modules/plugins/__tests__/bundle-dialect.e2e.test.ts +1 -1
- package/src/modules/plugins/__tests__/compile-marketplace.test.ts +1 -1
- package/src/modules/plugins/__tests__/join-request-jobs.service.test.ts +43 -43
- package/src/modules/plugins/__tests__/join-requests.service.test.ts +19 -19
- package/src/modules/plugins/__tests__/join-requests.settlement.test.ts +26 -26
- package/src/modules/plugins/__tests__/plugins.routes.test.ts +25 -25
- package/src/modules/plugins/join-request-jobs.service.ts +10 -10
- package/src/modules/plugins/join-requests.service.ts +4 -4
- package/src/modules/plugins/plugin-rename.service.ts +1 -1
- package/src/modules/plugins/plugins.routes.ts +9 -9
- package/src/modules/secrets-vault/__tests__/db-secrets-vault.managed.test.ts +773 -0
- package/src/modules/secrets-vault/__tests__/db-secrets-vault.oauth.test.ts +458 -4
- package/src/modules/secrets-vault/__tests__/managed-sign-in.route.test.ts +351 -0
- package/src/modules/secrets-vault/__tests__/oauth-live-declaration.route.test.ts +218 -0
- package/src/modules/secrets-vault/__tests__/oauth-return-to.route.test.ts +39 -6
- package/src/modules/secrets-vault/db-secrets-vault.service.ts +728 -118
- package/src/modules/secrets-vault/index.ts +8 -1
- package/src/modules/secrets-vault/managed-sign-in-erasure.ts +41 -0
- package/src/modules/secrets-vault/secrets-variable-loader.ts +134 -134
- package/src/modules/secrets-vault/secrets-vault.contract.ts +213 -11
- package/src/modules/secrets-vault/secrets-vault.routes.ts +244 -45
- package/src/modules/settings/__tests__/repository-source.test.ts +1 -1
- package/src/modules/settings/__tests__/setup.routes.layout-phase.test.ts +1 -1
- package/src/modules/settings/__tests__/setup.routes.managed-phase.test.ts +1 -1
- package/src/modules/settings/connection-check.ts +1 -1
- package/src/modules/settings/deployment-settings.service.ts +1 -1
- package/src/modules/settings/git-root-folders.ts +1 -1
- package/src/modules/settings/oidc-check.ts +5 -18
- package/src/modules/settings/setup.routes.ts +1 -1
- package/src/modules/skills/__tests__/allowed-tools-warn.tools.test.ts +3 -3
- package/src/modules/skills/__tests__/branch-skills.tools.test.ts +1 -1
- package/src/modules/skills/__tests__/pending-skills.service.test.ts +8 -8
- package/src/modules/skills/__tests__/skill-access-requests.routes.test.ts +18 -18
- package/src/modules/skills/__tests__/skills.service.test.ts +3 -3
- package/src/modules/skills/pending-skills.service.ts +3 -3
- package/src/modules/skills/skill-access-requests.routes.ts +7 -7
- package/src/modules/skills/skills.tools.ts +1 -1
- package/src/modules/tool-helpers/__tests__/agent-roles-write.test.ts +22 -14
- package/src/modules/tool-helpers/__tests__/branch-declaration.test.ts +3 -3
- package/src/modules/tool-helpers/__tests__/can-write.tools.test.ts +3 -3
- package/src/modules/tool-helpers/__tests__/phase4-tools.test.ts +4 -4
- package/src/modules/tool-helpers/__tests__/route-tool-schemas.catalog.test.ts +38 -0
- package/src/modules/tool-helpers/__tests__/tools-surface.test.ts +3 -3
- package/src/modules/tool-helpers/__tests__/validate-token.test.ts +1 -1
- package/src/modules/tool-helpers/tool-context.ts +6 -6
- package/src/modules/tool-helpers/tool-def.ts +1 -1
- package/src/modules/tool-helpers/tool-handler.ts +2 -2
- package/src/modules/tool-helpers/tool.contract.ts +4 -4
- package/src/modules/tool-manuals/__tests__/pending-tools.service.test.ts +9 -9
- package/src/modules/tool-manuals/__tests__/tool-manuals.managed-sign-in.test.ts +89 -0
- package/src/modules/tool-manuals/__tests__/tool-manuals.mcp-oauth.test.ts +197 -11
- package/src/modules/tool-manuals/__tests__/tool-manuals.restart.test.ts +1 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.tools.test.ts +132 -6
- package/src/modules/tool-manuals/mcp-json-discovery.ts +73 -34
- package/src/modules/tool-manuals/mcp-server-edit.service.ts +1 -1
- package/src/modules/tool-manuals/pending-tools.service.ts +3 -3
- package/src/modules/tool-manuals/tool-delete.service.ts +1 -1
- package/src/modules/tool-manuals/tool-manuals.contract.ts +63 -3
- package/src/modules/tool-manuals/tool-manuals.service.ts +191 -51
- package/src/modules/tool-manuals/tool-manuals.tools.ts +93 -28
- package/src/modules/tool-registry/__tests__/own-tool-schemas.test.ts +4 -4
- package/src/modules/tool-registry/__tests__/read-only-hints.test.ts +3 -3
- package/src/modules/tool-registry/__tests__/tool-description-length.test.ts +12 -119
- package/src/modules/{workflow → version-control}/__tests__/apply-failure.test.ts +54 -54
- package/src/modules/{workflow → version-control}/__tests__/event-bus.test.ts +27 -27
- package/src/modules/{workflow → version-control}/__tests__/events-delivery.test.ts +37 -37
- package/src/modules/{workflow → version-control}/__tests__/file-lock.service.deletion-gate.test.ts +2 -2
- package/src/modules/{workflow → version-control}/__tests__/file-lock.service.path-identity.test.ts +8 -8
- package/src/modules/{workflow → version-control}/__tests__/merge-announces-tree.test.ts +11 -11
- package/src/modules/{workflow → version-control}/__tests__/pending-commits.worker.concurrency.test.ts +9 -9
- package/src/modules/{workflow → version-control}/__tests__/pending-commits.worker.test.ts +25 -25
- package/src/modules/{workflow → version-control}/__tests__/preserve-roles-yaml.test.ts +42 -42
- package/src/modules/version-control/__tests__/public-surface.test.ts +114 -0
- package/src/modules/{workflow/__tests__/workflow.routes.folder-proposals.test.ts → version-control/__tests__/version-control.routes.folder-proposals.test.ts} +18 -18
- package/src/modules/{workflow/__tests__/workflow.routes.fork-point-file.test.ts → version-control/__tests__/version-control.routes.fork-point-file.test.ts} +19 -19
- package/src/modules/{workflow/__tests__/workflow.routes.history-read-gate.test.ts → version-control/__tests__/version-control.routes.history-read-gate.test.ts} +13 -13
- package/src/modules/{workflow/__tests__/workflow.routes.lock-path.test.ts → version-control/__tests__/version-control.routes.lock-path.test.ts} +18 -18
- package/src/modules/{workflow/__tests__/workflow.routes.open-change-request.test.ts → version-control/__tests__/version-control.routes.open-change-request.test.ts} +7 -7
- package/src/modules/{workflow/__tests__/workflow.routes.push-refused.test.ts → version-control/__tests__/version-control.routes.push-refused.test.ts} +14 -14
- package/src/modules/{workflow/__tests__/workflow.service.branch-in-use.test.ts → version-control/__tests__/version-control.service.branch-in-use.test.ts} +6 -6
- package/src/modules/{workflow/__tests__/workflow.service.commitFileWhileLocked.test.ts → version-control/__tests__/version-control.service.commitFileWhileLocked.test.ts} +14 -14
- package/src/modules/{workflow/__tests__/workflow.service.delete-branch.test.ts → version-control/__tests__/version-control.service.delete-branch.test.ts} +14 -14
- package/src/modules/{workflow/__tests__/workflow.service.deleted-branch-sweep.test.ts → version-control/__tests__/version-control.service.deleted-branch-sweep.test.ts} +4 -4
- package/src/modules/{workflow/__tests__/workflow.service.facade.test.ts → version-control/__tests__/version-control.service.facade.test.ts} +97 -99
- package/src/modules/{workflow/__tests__/workflow.service.folder-proposals.test.ts → version-control/__tests__/version-control.service.folder-proposals.test.ts} +7 -7
- package/src/modules/{workflow/__tests__/workflow.service.platform-restore.test.ts → version-control/__tests__/version-control.service.platform-restore.test.ts} +6 -6
- package/src/modules/{workflow/__tests__/workflow.service.read-gate.test.ts → version-control/__tests__/version-control.service.read-gate.test.ts} +9 -9
- package/src/modules/{workflow/__tests__/workflow.service.releaseLock.test.ts → version-control/__tests__/version-control.service.releaseLock.test.ts} +42 -42
- package/src/modules/{workflow/__tests__/workflow.service.repository-replaced.test.ts → version-control/__tests__/version-control.service.repository-replaced.test.ts} +4 -4
- package/src/modules/{workflow/__tests__/workflow.service.sync.test.ts → version-control/__tests__/version-control.service.sync.test.ts} +17 -17
- package/src/modules/{workflow/__tests__/workflow.service.update-change-request.pg.test.ts → version-control/__tests__/version-control.service.update-change-request.pg.test.ts} +6 -6
- package/src/modules/{workflow/__tests__/workflow.service.update-change-request.test.ts → version-control/__tests__/version-control.service.update-change-request.test.ts} +11 -11
- package/src/modules/{workflow/__tests__/workflow.service.update-from-target.test.ts → version-control/__tests__/version-control.service.update-from-target.test.ts} +22 -22
- package/src/modules/{workflow → version-control}/agent-tools/__tests__/change-request-read.tools.test.ts +3 -3
- package/src/modules/{workflow → version-control}/agent-tools/__tests__/update-change-request.parity.test.ts +16 -16
- package/src/modules/{workflow/agent-tools/__tests__/workflow.tools.test.ts → version-control/agent-tools/__tests__/version-control.tools.test.ts} +9 -9
- package/src/modules/{workflow → version-control}/agent-tools/change-request-read.tools.ts +2 -2
- package/src/modules/{workflow/agent-tools/workflow.tools.ts → version-control/agent-tools/version-control.tools.ts} +52 -48
- package/src/modules/{workflow → version-control}/change-request-hooks.ts +1 -1
- package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/approval-states.test.ts +5 -5
- package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/cancel-pr.test.ts +8 -8
- package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/carry-approvals-forward.test.ts +6 -6
- package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/erase-approver.test.ts +5 -5
- package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/merge-gate.test.ts +3 -3
- package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/merge-records-own-commit.test.ts +3 -3
- package/src/modules/{workflow/review-workflow/review-workflow.interface.ts → version-control/change-request-review/change-request-review.interface.ts} +1 -1
- package/src/modules/{workflow/review-workflow/review-workflow.service.ts → version-control/change-request-review/change-request-review.service.ts} +28 -28
- package/src/modules/{workflow → version-control}/event-bus.ts +14 -14
- package/src/modules/{workflow → version-control}/events-delivery.ts +11 -11
- package/src/modules/{workflow → version-control}/events.routes.ts +5 -5
- package/src/modules/{workflow → version-control}/file-lock.service.ts +6 -6
- package/src/modules/{workflow → version-control}/git/__tests__/git-test-helpers.ts +3 -3
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.accessGating.test.ts +5 -5
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.appliedChange.test.ts +4 -4
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.changedFilesForPr.test.ts +16 -16
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.changedPathsMemo.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.commitChanges.test.ts +3 -3
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.commitFile.strayPath.test.ts +10 -10
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.commitFile.test.ts +3 -3
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.createBranch.test.ts +3 -3
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.deleteBranch.test.ts +7 -7
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.diffFileAtCommit.test.ts +9 -9
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.diffFileBetweenBranches.test.ts +23 -23
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.fileBytesAtCommit.test.ts +7 -7
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.fileContentsAtCommit.test.ts +3 -3
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.forkPoint.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.history-guards.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.list-branches.test.ts +12 -12
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.listTrackedFiles.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.logForFile.test.ts +6 -6
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.mergeChangeRequest.test.ts +20 -20
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.mergeIntoBranch.test.ts +16 -16
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.pendingChanges.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.postMergePull.test.ts +5 -5
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.prFetchFailure.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.pull.test.ts +12 -12
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.readFileAtRef.test.ts +3 -3
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.revertPathsAndPush.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.status.test.ts +4 -4
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.syncFromRemote.test.ts +8 -8
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.worktrees.test.ts +4 -4
- package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.list-fetch.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.test.ts +6 -6
- package/src/modules/{workflow → version-control}/git/git.service.ts +57 -57
- package/src/modules/{workflow → version-control}/git/node-git-runner.ts +1 -1
- package/src/modules/{workflow → version-control}/git/pull-request.service.ts +12 -12
- package/src/modules/{workflow → version-control}/index.ts +6 -5
- package/src/modules/{workflow → version-control}/pending-commits.service.ts +2 -2
- package/src/modules/{workflow → version-control}/pending-commits.worker.ts +8 -8
- package/src/modules/{workflow → version-control}/read-on-branch.ts +2 -2
- package/src/modules/{workflow/workflow-hooks.ts → version-control/version-control-hooks.ts} +3 -3
- package/src/modules/{workflow/workflow.routes.ts → version-control/version-control.routes.ts} +64 -63
- package/src/modules/{workflow/workflow.service.ts → version-control/version-control.service.ts} +92 -97
- package/src/modules/workspace/__tests__/agent-access.gate.test.ts +8 -8
- package/src/modules/workspace/__tests__/agent-downloads.test.ts +13 -16
- package/src/modules/workspace/__tests__/agent-uploads.test.ts +11 -12
- package/src/modules/workspace/__tests__/escape-sequences.routes.test.ts +11 -16
- package/src/modules/workspace/__tests__/file-stat-access.test.ts +3 -3
- package/src/modules/workspace/__tests__/git-internals.security.test.ts +27 -27
- package/src/modules/workspace/__tests__/kb-repository.test.ts +1 -1
- package/src/modules/workspace/__tests__/rest-tool-arguments.test.ts +3 -3
- package/src/modules/workspace/__tests__/start-session.default-branch.test.ts +152 -0
- package/src/modules/workspace/__tests__/workspace-paths-inside-the-repo.test.ts +6 -6
- package/src/modules/workspace/__tests__/workspace-tmp.tools.test.ts +13 -14
- package/src/modules/workspace/__tests__/workspace.routes.at-ref.test.ts +6 -6
- package/src/modules/workspace/__tests__/workspace.routes.branch-errors.test.ts +4 -4
- package/src/modules/workspace/__tests__/workspace.routes.create-grant.test.ts +6 -6
- package/src/modules/workspace/__tests__/workspace.routes.delete.test.ts +8 -8
- package/src/modules/workspace/__tests__/workspace.routes.download-implies-read.test.ts +4 -4
- package/src/modules/workspace/__tests__/workspace.routes.download.test.ts +6 -6
- package/src/modules/workspace/__tests__/workspace.routes.file-writes.test.ts +6 -6
- package/src/modules/workspace/__tests__/workspace.routes.folder-zip-access.test.ts +4 -4
- package/src/modules/workspace/__tests__/workspace.routes.folders.test.ts +6 -6
- package/src/modules/workspace/__tests__/workspace.routes.move-platform-files.test.ts +7 -7
- package/src/modules/workspace/__tests__/workspace.routes.read-gate.test.ts +13 -13
- package/src/modules/workspace/__tests__/workspace.service.any-workspace-credentials.test.ts +1 -1
- package/src/modules/workspace/__tests__/workspace.service.replaced-repository.test.ts +1 -1
- package/src/modules/workspace/__tests__/workspace.service.worktrees.test.ts +1 -1
- package/src/modules/workspace/__tests__/workspace.tools.agents-file.test.ts +12 -14
- package/src/modules/workspace/__tests__/workspace.tools.branch-errors.test.ts +5 -5
- package/src/modules/workspace/__tests__/workspace.tools.test.ts +182 -75
- package/src/modules/workspace/agent-access.gate.ts +6 -6
- package/src/modules/workspace/git-internals.middleware.ts +2 -2
- package/src/modules/workspace/kb-repository.ts +1 -1
- package/src/modules/workspace/startup/__tests__/kb-startup-runner.degraded.test.ts +1 -1
- package/src/modules/workspace/startup/__tests__/kb-startup-runner.test.ts +1 -1
- package/src/modules/workspace/startup/__tests__/kb-startup-runner.worktrees.test.ts +1 -1
- package/src/modules/workspace/startup/kb-git.ts +1 -1
- package/src/modules/workspace/startup/steps/__tests__/steps.test.ts +94 -70
- package/src/modules/workspace/startup/steps/seed-tree.ts +4 -5
- package/src/modules/workspace/startup/steps/template-files.step.ts +4 -5
- package/src/modules/workspace/startup/steps/template-source.ts +21 -6
- package/src/modules/workspace/workspace-tmp.ts +4 -4
- package/src/modules/workspace/workspace.routes.ts +26 -26
- package/src/modules/workspace/workspace.service.ts +11 -11
- package/src/modules/workspace/workspace.tools.ts +90 -30
- package/src/shared/__tests__/canonical-file-identity.test.ts +5 -5
- package/src/shared/__tests__/http-errors.test.ts +4 -4
- package/src/shared/__tests__/read-capped.test.ts +68 -0
- package/src/shared/canonical-file-identity.ts +5 -5
- package/src/shared/domain-errors.ts +44 -44
- package/src/shared/git.contract.ts +1 -1
- package/src/shared/http-errors.ts +3 -3
- package/src/shared/kb-context.ts +130 -130
- package/src/shared/oauth-token-error.ts +46 -0
- package/src/shared/pending-proposals.ts +4 -4
- package/src/shared/read-capped.ts +40 -0
- package/src/tenancy/__tests__/tenant-host.test.ts +372 -372
- package/src/tenancy/__tests__/tenant-runtime.test.ts +221 -221
- package/src/tenancy/__tests__/tenant-secrets.test.ts +35 -35
- package/src/tenancy/index.ts +35 -35
- package/src/tenancy/static-tenant-source.ts +1 -1
- package/src/tenancy/tenant-host.ts +261 -261
- package/src/tenancy/tenant-runtime.ts +208 -208
- package/src/tenancy/tenant-source.contract.ts +59 -59
- package/agent-guide/finding-things.md +0 -7
- package/agent-guide/introduction.md +0 -27
- package/dist/modules/workflow/agent-tools/change-request-read-shape.d.ts.map +0 -1
- package/dist/modules/workflow/agent-tools/change-request-read-shape.js.map +0 -1
- package/dist/modules/workflow/agent-tools/change-request-read.tools.d.ts.map +0 -1
- package/dist/modules/workflow/agent-tools/change-request-read.tools.js.map +0 -1
- package/dist/modules/workflow/agent-tools/change-request-summary.d.ts.map +0 -1
- package/dist/modules/workflow/agent-tools/change-request-summary.js.map +0 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +0 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.js.map +0 -1
- package/dist/modules/workflow/change-request-hooks.d.ts.map +0 -1
- package/dist/modules/workflow/change-request-hooks.js.map +0 -1
- package/dist/modules/workflow/event-bus.d.ts.map +0 -1
- package/dist/modules/workflow/event-bus.js.map +0 -1
- package/dist/modules/workflow/events-delivery.d.ts.map +0 -1
- package/dist/modules/workflow/events-delivery.js.map +0 -1
- package/dist/modules/workflow/events.routes.d.ts.map +0 -1
- package/dist/modules/workflow/events.routes.js.map +0 -1
- package/dist/modules/workflow/file-lock.service.d.ts.map +0 -1
- package/dist/modules/workflow/file-lock.service.js.map +0 -1
- package/dist/modules/workflow/git/change-request-link.d.ts.map +0 -1
- package/dist/modules/workflow/git/change-request-link.js.map +0 -1
- package/dist/modules/workflow/git/git-version.d.ts.map +0 -1
- package/dist/modules/workflow/git/git-version.js.map +0 -1
- package/dist/modules/workflow/git/git.service.d.ts.map +0 -1
- package/dist/modules/workflow/git/git.service.js.map +0 -1
- package/dist/modules/workflow/git/merge-commit.d.ts.map +0 -1
- package/dist/modules/workflow/git/merge-commit.js.map +0 -1
- package/dist/modules/workflow/git/node-git-runner.d.ts.map +0 -1
- package/dist/modules/workflow/git/node-git-runner.js.map +0 -1
- package/dist/modules/workflow/git/pull-request.service.d.ts.map +0 -1
- package/dist/modules/workflow/git/pull-request.service.js.map +0 -1
- package/dist/modules/workflow/index.d.ts.map +0 -1
- package/dist/modules/workflow/index.js.map +0 -1
- package/dist/modules/workflow/pending-commits.service.d.ts.map +0 -1
- package/dist/modules/workflow/pending-commits.service.js.map +0 -1
- package/dist/modules/workflow/pending-commits.worker.d.ts.map +0 -1
- package/dist/modules/workflow/pending-commits.worker.js.map +0 -1
- package/dist/modules/workflow/read-on-branch.d.ts.map +0 -1
- package/dist/modules/workflow/read-on-branch.js.map +0 -1
- package/dist/modules/workflow/recovery-bot.d.ts.map +0 -1
- package/dist/modules/workflow/recovery-bot.js.map +0 -1
- package/dist/modules/workflow/review-workflow/approval-lock.d.ts.map +0 -1
- package/dist/modules/workflow/review-workflow/approval-lock.js.map +0 -1
- package/dist/modules/workflow/review-workflow/review-workflow.interface.d.ts.map +0 -1
- package/dist/modules/workflow/review-workflow/review-workflow.interface.js +0 -2
- package/dist/modules/workflow/review-workflow/review-workflow.interface.js.map +0 -1
- package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts.map +0 -1
- package/dist/modules/workflow/review-workflow/review-workflow.service.js.map +0 -1
- package/dist/modules/workflow/sanitize-error.d.ts.map +0 -1
- package/dist/modules/workflow/sanitize-error.js.map +0 -1
- package/dist/modules/workflow/workflow-hooks.d.ts.map +0 -1
- package/dist/modules/workflow/workflow-hooks.js.map +0 -1
- package/dist/modules/workflow/workflow.routes.d.ts.map +0 -1
- package/dist/modules/workflow/workflow.routes.js.map +0 -1
- package/dist/modules/workflow/workflow.service.d.ts.map +0 -1
- package/dist/modules/workflow/workflow.service.js.map +0 -1
- package/src/modules/mcp/__tests__/read-only-hint.e2e.test.ts +0 -213
- /package/dist/modules/{workflow → version-control}/agent-tools/change-request-read-shape.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/agent-tools/change-request-read-shape.js +0 -0
- /package/dist/modules/{workflow → version-control}/agent-tools/change-request-read.tools.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/agent-tools/change-request-summary.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/agent-tools/change-request-summary.js +0 -0
- /package/dist/modules/{workflow → version-control}/change-request-hooks.js +0 -0
- /package/dist/modules/{workflow/review-workflow → version-control/change-request-review}/approval-lock.d.ts +0 -0
- /package/dist/modules/{workflow/review-workflow → version-control/change-request-review}/approval-lock.js +0 -0
- /package/dist/modules/{workflow → version-control}/events-delivery.js +0 -0
- /package/dist/modules/{workflow → version-control}/events.routes.js +0 -0
- /package/dist/modules/{workflow → version-control}/git/change-request-link.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/git/change-request-link.js +0 -0
- /package/dist/modules/{workflow → version-control}/git/git-version.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/git/git-version.js +0 -0
- /package/dist/modules/{workflow → version-control}/git/merge-commit.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/git/merge-commit.js +0 -0
- /package/dist/modules/{workflow → version-control}/git/node-git-runner.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/recovery-bot.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/recovery-bot.js +0 -0
- /package/dist/modules/{workflow → version-control}/sanitize-error.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/sanitize-error.js +0 -0
- /package/src/modules/{workflow → version-control}/__tests__/change-request-hooks.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/__tests__/fake-file-lock-db.ts +0 -0
- /package/src/modules/{workflow → version-control}/__tests__/pending-commits.canonical.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/__tests__/pending-commits.enqueue-if-absent.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/__tests__/pending-commits.repository-replaced.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/__tests__/sanitize-error.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/agent-tools/__tests__/change-request-read-shape.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/agent-tools/change-request-read-shape.ts +0 -0
- /package/src/modules/{workflow → version-control}/agent-tools/change-request-summary.ts +0 -0
- /package/src/modules/{workflow/review-workflow → version-control/change-request-review}/approval-lock.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/branchAuthor.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/change-request-link.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/git-version.failure.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/git-version.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/node-git-runner.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.getPrDetail.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.placeholder.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.viewer-can-cancel.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.viewer-can-delete.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.viewer-can-update.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/change-request-link.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/git-version.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/merge-commit.ts +0 -0
- /package/src/modules/{workflow → version-control}/recovery-bot.ts +0 -0
- /package/src/modules/{workflow → version-control}/sanitize-error.ts +0 -0
|
@@ -4,10 +4,10 @@ import { promisify } from 'node:util';
|
|
|
4
4
|
import fs from 'node:fs/promises';
|
|
5
5
|
import path from 'node:path';
|
|
6
6
|
import os from 'node:os';
|
|
7
|
-
import type { AuthUser,
|
|
7
|
+
import type { AuthUser, IVersionControlService } from '@bevel-software/platform-shared';
|
|
8
8
|
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
9
|
-
import { GitService } from '../../
|
|
10
|
-
import {
|
|
9
|
+
import { GitService } from '../../version-control/git/git.service.js';
|
|
10
|
+
import { VersionControlHooks } from '../../version-control/version-control-hooks.js';
|
|
11
11
|
import type { WorkspaceService } from '../../workspace/workspace.service.js';
|
|
12
12
|
import { LockingFilesystem, MoveLockedError, MoveRacedError, MoveUndoError } from '../locking-filesystem.js';
|
|
13
13
|
import { PushNeedsAgentResolutionError } from '../../../shared/domain-errors.js';
|
|
@@ -34,7 +34,7 @@ async function git(cwd: string, args: string[]): Promise<string> {
|
|
|
34
34
|
|
|
35
35
|
let root: string;
|
|
36
36
|
let repo: string;
|
|
37
|
-
let
|
|
37
|
+
let versionControl: IVersionControlService;
|
|
38
38
|
let lockedPaths: Set<string>;
|
|
39
39
|
|
|
40
40
|
async function put(rel: string, content: string | Buffer): Promise<void> {
|
|
@@ -62,14 +62,14 @@ beforeEach(async () => {
|
|
|
62
62
|
const svc = new GitService(
|
|
63
63
|
{ getWorkspacePath: async () => root } as unknown as WorkspaceService,
|
|
64
64
|
(() => {
|
|
65
|
-
const hooks = new
|
|
65
|
+
const hooks = new VersionControlHooks();
|
|
66
66
|
hooks.onCommitValidation(vi.fn(async () => ({ ok: true, mustFix: [], warnings: [], rawOutput: '' })));
|
|
67
67
|
return hooks;
|
|
68
68
|
})(),
|
|
69
69
|
testKbContext({ kbDirName: KB }),
|
|
70
70
|
);
|
|
71
71
|
lockedPaths = new Set();
|
|
72
|
-
|
|
72
|
+
versionControl = {
|
|
73
73
|
acquireLock: vi.fn(async (_w: string, _b: string, p: string) =>
|
|
74
74
|
lockedPaths.has(p)
|
|
75
75
|
? { acquired: false, lock: { holderName: 'Bob' } }
|
|
@@ -78,7 +78,7 @@ beforeEach(async () => {
|
|
|
78
78
|
releaseLockNoCommit: vi.fn(async () => undefined),
|
|
79
79
|
releaseLockUntouched: vi.fn(async () => undefined),
|
|
80
80
|
commitChanges: vi.fn((w: string, u: AuthUser, s: string, paths?: string[]) => svc.commitChanges(w, u, s, paths)),
|
|
81
|
-
} as unknown as
|
|
81
|
+
} as unknown as IVersionControlService;
|
|
82
82
|
});
|
|
83
83
|
|
|
84
84
|
afterEach(async () => {
|
|
@@ -88,7 +88,7 @@ afterEach(async () => {
|
|
|
88
88
|
const fsLayer = (validateWrite?: (p: string, content: unknown) => Promise<void>) =>
|
|
89
89
|
new LockingFilesystem(
|
|
90
90
|
{ basePath: root, contained: true },
|
|
91
|
-
{
|
|
91
|
+
{ versionControl, workspaceId: WS, branch: 'feature-test', user: USER, kbDirName: KB, ...(validateWrite ? { validateWrite } : {}) },
|
|
92
92
|
);
|
|
93
93
|
|
|
94
94
|
/** The paths each release kind was called with. */
|
|
@@ -147,16 +147,16 @@ describe('LockingFilesystem.moveWithEdits', () => {
|
|
|
147
147
|
expect((err as Error).message).toContain(`"${KB}/Projects/A/Two.md" is being edited by Bob`);
|
|
148
148
|
expect(await git(repo, ['rev-parse', 'HEAD'])).toBe(head);
|
|
149
149
|
expect((await git(repo, ['status', '--porcelain'])).trim()).toBe('');
|
|
150
|
-
expect(
|
|
150
|
+
expect(versionControl.commitChanges).not.toHaveBeenCalled();
|
|
151
151
|
// Every lock taken was given back untouched.
|
|
152
|
-
expect(released(
|
|
153
|
-
expect(
|
|
154
|
-
expect(
|
|
152
|
+
expect(released(versionControl.releaseLockUntouched)).toEqual([`${KB}/Index.md`, `${KB}/Projects/A`, `${KB}/Projects/A/One.md`]);
|
|
153
|
+
expect(versionControl.releaseLockNoCommit).not.toHaveBeenCalled();
|
|
154
|
+
expect(versionControl.releaseLock).not.toHaveBeenCalled();
|
|
155
155
|
expect(await read('Index.md')).toBe('[one](Projects/A/One.md)\n');
|
|
156
156
|
}, 20_000);
|
|
157
157
|
|
|
158
158
|
it('a file saved into the folder while the locks were being taken refuses the move, nothing moved', async () => {
|
|
159
|
-
const acquire =
|
|
159
|
+
const acquire = versionControl.acquireLock as ReturnType<typeof vi.fn>;
|
|
160
160
|
let arrived = false;
|
|
161
161
|
acquire.mockImplementation(async () => {
|
|
162
162
|
// The first lock is the moment somebody else's save lands in the folder.
|
|
@@ -171,15 +171,15 @@ describe('LockingFilesystem.moveWithEdits', () => {
|
|
|
171
171
|
expect(err).toBeInstanceOf(MoveRacedError);
|
|
172
172
|
expect((err as Error).message).toContain(`"${KB}/Projects/A/Late.md" was added`);
|
|
173
173
|
expect(await git(repo, ['rev-parse', 'HEAD'])).toBe(head);
|
|
174
|
-
expect(
|
|
174
|
+
expect(versionControl.commitChanges).not.toHaveBeenCalled();
|
|
175
175
|
expect(await read('Projects/A/Late.md')).toBe('late\n');
|
|
176
176
|
expect(await read('Index.md')).toBe('[one](Projects/A/One.md)\n');
|
|
177
|
-
expect(
|
|
178
|
-
expect(released(
|
|
177
|
+
expect(versionControl.releaseLockNoCommit).not.toHaveBeenCalled();
|
|
178
|
+
expect(released(versionControl.releaseLockUntouched).length).toBeGreaterThan(0);
|
|
179
179
|
});
|
|
180
180
|
|
|
181
181
|
it('a move that fails and cannot be undone releases every lock with the discard, and says both', async () => {
|
|
182
|
-
(
|
|
182
|
+
(versionControl.commitChanges as ReturnType<typeof vi.fn>).mockImplementation(async () => {
|
|
183
183
|
// Something takes the old place while the move is in flight, so the
|
|
184
184
|
// undo's rename finds its destination occupied.
|
|
185
185
|
await put('Projects/A/Taken.md', 'x\n');
|
|
@@ -190,8 +190,8 @@ describe('LockingFilesystem.moveWithEdits', () => {
|
|
|
190
190
|
expect((err as Error).message).toContain('commit exploded');
|
|
191
191
|
expect((err as Error).message).toContain('could not be undone');
|
|
192
192
|
// Nothing is handed back as untouched: every path goes with the discard.
|
|
193
|
-
expect(
|
|
194
|
-
const discarded = released(
|
|
193
|
+
expect(versionControl.releaseLockUntouched).not.toHaveBeenCalled();
|
|
194
|
+
const discarded = released(versionControl.releaseLockNoCommit);
|
|
195
195
|
expect(discarded).toContain(`${KB}/Projects/A`);
|
|
196
196
|
expect(discarded).toContain(`${KB}/Topics/Deep/A/One.md`);
|
|
197
197
|
expect(discarded).toContain(`${KB}/Index.md`);
|
|
@@ -199,8 +199,8 @@ describe('LockingFilesystem.moveWithEdits', () => {
|
|
|
199
199
|
|
|
200
200
|
it('a commit that landed but could not be pushed enqueues the committed paths only; the folder locks go back untouched', async () => {
|
|
201
201
|
// The real commit lands; only its push is refused.
|
|
202
|
-
const commit = (
|
|
203
|
-
(
|
|
202
|
+
const commit = (versionControl.commitChanges as ReturnType<typeof vi.fn>).getMockImplementation()!;
|
|
203
|
+
(versionControl.commitChanges as ReturnType<typeof vi.fn>).mockImplementation(async (...args: unknown[]) => {
|
|
204
204
|
await commit(...args);
|
|
205
205
|
throw new PushNeedsAgentResolutionError('feature-test', `${KB}/Index.md`, 'refused', '(not attempted)', 'refused');
|
|
206
206
|
});
|
|
@@ -213,8 +213,8 @@ describe('LockingFilesystem.moveWithEdits', () => {
|
|
|
213
213
|
expect(Number(await git(repo, ['rev-list', '--count', 'HEAD']))).toBe(Number(commitsBefore) + 1);
|
|
214
214
|
expect((await git(repo, ['status', '--porcelain'])).trim()).toBe('');
|
|
215
215
|
expect(await read('Topics/Deep/A/One.md')).toContain('../../../NodeTypes/Task.md');
|
|
216
|
-
const enqueued = released(
|
|
217
|
-
const untouched = released(
|
|
216
|
+
const enqueued = released(versionControl.releaseLock);
|
|
217
|
+
const untouched = released(versionControl.releaseLockUntouched);
|
|
218
218
|
// Every file the commit named is enqueued…
|
|
219
219
|
for (const p of [`${KB}/Index.md`, `${KB}/Projects/A/One.md`, `${KB}/Topics/Deep/A/One.md`, `${KB}/Topics/Deep/A/pic.png`]) {
|
|
220
220
|
expect(enqueued).toContain(p);
|
|
@@ -227,7 +227,7 @@ describe('LockingFilesystem.moveWithEdits', () => {
|
|
|
227
227
|
|
|
228
228
|
it('locks every file of a moved folder at its old and its new path', async () => {
|
|
229
229
|
await fsLayer().moveWithEdits(`${KB}/Projects/A`, `${KB}/Topics/Deep/A`, edits(), 'Move A');
|
|
230
|
-
const locked = (
|
|
230
|
+
const locked = (versionControl.acquireLock as ReturnType<typeof vi.fn>).mock.calls.map((c) => c[2] as string);
|
|
231
231
|
for (const name of ['One.md', 'Two.md', 'pic.png']) {
|
|
232
232
|
expect(locked).toContain(`${KB}/Projects/A/${name}`);
|
|
233
233
|
expect(locked).toContain(`${KB}/Topics/Deep/A/${name}`);
|
|
@@ -236,19 +236,19 @@ describe('LockingFilesystem.moveWithEdits', () => {
|
|
|
236
236
|
});
|
|
237
237
|
|
|
238
238
|
it('a lock store that throws gives back the locks already held, and changes nothing', async () => {
|
|
239
|
-
(
|
|
239
|
+
(versionControl.acquireLock as ReturnType<typeof vi.fn>).mockImplementation(async (_w: string, _b: string, p: string) => {
|
|
240
240
|
if (p === `${KB}/Projects/A/One.md`) throw new Error('lock store down');
|
|
241
241
|
return { acquired: true, lock: { holderName: 'Alice' } };
|
|
242
242
|
});
|
|
243
243
|
await expect(
|
|
244
244
|
fsLayer().moveWithEdits(`${KB}/Projects/A`, `${KB}/Topics/Deep/A`, edits(), 'Move A'),
|
|
245
245
|
).rejects.toThrow('lock store down');
|
|
246
|
-
expect(released(
|
|
246
|
+
expect(released(versionControl.releaseLockUntouched)).toEqual([`${KB}/Index.md`, `${KB}/Projects/A`]);
|
|
247
247
|
expect((await git(repo, ['status', '--porcelain'])).trim()).toBe('');
|
|
248
248
|
});
|
|
249
249
|
|
|
250
250
|
it('every edit is judged again once the locks are held, and a refusal there changes nothing', async () => {
|
|
251
|
-
const acquire =
|
|
251
|
+
const acquire = versionControl.acquireLock as ReturnType<typeof vi.fn>;
|
|
252
252
|
// A validator whose verdict depends on the state under the locks.
|
|
253
253
|
const validateWrite = vi.fn(async (p: string) => {
|
|
254
254
|
if (acquire.mock.calls.length > 0 && p.endsWith('Index.md')) throw new Error('refused under lock');
|
|
@@ -260,12 +260,12 @@ describe('LockingFilesystem.moveWithEdits', () => {
|
|
|
260
260
|
expect(validateWrite.mock.calls.filter((c) => c[0] === `${KB}/Index.md`)).toHaveLength(2);
|
|
261
261
|
expect(await git(repo, ['rev-parse', 'HEAD'])).toBe(head);
|
|
262
262
|
expect((await git(repo, ['status', '--porcelain'])).trim()).toBe('');
|
|
263
|
-
expect(
|
|
264
|
-
expect(released(
|
|
263
|
+
expect(versionControl.releaseLockNoCommit).not.toHaveBeenCalled();
|
|
264
|
+
expect(released(versionControl.releaseLockUntouched)).toContain(`${KB}/Index.md`);
|
|
265
265
|
});
|
|
266
266
|
|
|
267
267
|
it('an edit whose bytes cannot be put back is released with the discard, not untouched', async () => {
|
|
268
|
-
(
|
|
268
|
+
(versionControl.commitChanges as ReturnType<typeof vi.fn>).mockImplementationOnce(async () => {
|
|
269
269
|
// The restore of Index.md will fail: a folder now sits at its path.
|
|
270
270
|
await fs.rm(path.join(repo, 'Index.md'));
|
|
271
271
|
await fs.mkdir(path.join(repo, 'Index.md'));
|
|
@@ -274,11 +274,11 @@ describe('LockingFilesystem.moveWithEdits', () => {
|
|
|
274
274
|
await expect(
|
|
275
275
|
fsLayer().moveWithEdits(`${KB}/Projects/A`, `${KB}/Topics/Deep/A`, edits(), 'Move A'),
|
|
276
276
|
).rejects.toThrow('commit exploded');
|
|
277
|
-
expect(released(
|
|
278
|
-
expect(released(
|
|
277
|
+
expect(released(versionControl.releaseLockNoCommit)).toEqual([`${KB}/Index.md`]);
|
|
278
|
+
expect(released(versionControl.releaseLockUntouched)).not.toContain(`${KB}/Index.md`);
|
|
279
279
|
// The moved file's edit was put back, and its lock released untouched.
|
|
280
280
|
expect(await read('Projects/A/One.md')).toContain('../../NodeTypes/Task.md');
|
|
281
|
-
expect(released(
|
|
281
|
+
expect(released(versionControl.releaseLockUntouched)).toContain(`${KB}/Projects/A/One.md`);
|
|
282
282
|
});
|
|
283
283
|
|
|
284
284
|
it('a check refusal under the locks changes nothing', async () => {
|
|
@@ -293,7 +293,7 @@ describe('LockingFilesystem.moveWithEdits', () => {
|
|
|
293
293
|
});
|
|
294
294
|
|
|
295
295
|
it('a failing commit puts every byte back and undoes the move', async () => {
|
|
296
|
-
(
|
|
296
|
+
(versionControl.commitChanges as ReturnType<typeof vi.fn>).mockRejectedValueOnce(new Error('commit exploded'));
|
|
297
297
|
await expect(
|
|
298
298
|
fsLayer().moveWithEdits(`${KB}/Projects/A`, `${KB}/Topics/Deep/A`, edits(), 'Move A'),
|
|
299
299
|
).rejects.toThrow('commit exploded');
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
normalizePathArgs,
|
|
10
10
|
normalizeWorkspacePath,
|
|
11
11
|
} from '../repo-path.js';
|
|
12
|
-
import {
|
|
12
|
+
import { VersionControlValidationError } from '../../../shared/domain-errors.js';
|
|
13
13
|
|
|
14
14
|
const KB = 'knowledge-base';
|
|
15
15
|
|
|
@@ -80,8 +80,8 @@ describe('assertInsideRepo', () => {
|
|
|
80
80
|
} catch (e) {
|
|
81
81
|
err = e;
|
|
82
82
|
}
|
|
83
|
-
expect(err).toBeInstanceOf(
|
|
84
|
-
const e = err as
|
|
83
|
+
expect(err).toBeInstanceOf(VersionControlValidationError);
|
|
84
|
+
const e = err as VersionControlValidationError;
|
|
85
85
|
expect(e.status).toBe(400);
|
|
86
86
|
// The offending path, the rule, and the exact path to use instead: an
|
|
87
87
|
// agent reading this error can retry without guessing.
|
|
@@ -144,8 +144,8 @@ describe('a line break in a path — one name to the gates, two object names to
|
|
|
144
144
|
} catch (e) {
|
|
145
145
|
err = e;
|
|
146
146
|
}
|
|
147
|
-
expect(err).toBeInstanceOf(
|
|
148
|
-
const e = err as
|
|
147
|
+
expect(err).toBeInstanceOf(VersionControlValidationError);
|
|
148
|
+
const e = err as VersionControlValidationError;
|
|
149
149
|
expect(e.status).toBe(400);
|
|
150
150
|
expect(e.message).toMatch(/control character/);
|
|
151
151
|
// Never "use this instead": there is no corrected spelling of a name with
|
|
@@ -173,7 +173,7 @@ describe('a line break in a path — one name to the gates, two object names to
|
|
|
173
173
|
it('refuses every control character, not only the line breaks', () => {
|
|
174
174
|
for (const ch of ['\u0000', '\u0001', '\t', '\n', '\u000B', '\r', '\u001F', '\u007F']) {
|
|
175
175
|
expect(() => normalizeWorkspacePath(`knowledge-base/Docs/a${ch}b.md`, KB), ch).toThrow(
|
|
176
|
-
|
|
176
|
+
VersionControlValidationError,
|
|
177
177
|
);
|
|
178
178
|
}
|
|
179
179
|
});
|
|
@@ -189,8 +189,8 @@ describe('a line break in a path — one name to the gates, two object names to
|
|
|
189
189
|
} catch (e) {
|
|
190
190
|
err = e;
|
|
191
191
|
}
|
|
192
|
-
expect(err).toBeInstanceOf(
|
|
193
|
-
const e = err as
|
|
192
|
+
expect(err).toBeInstanceOf(VersionControlValidationError);
|
|
193
|
+
const e = err as VersionControlValidationError;
|
|
194
194
|
// Named as the CONFIGURATION error it is: an operator told their own path
|
|
195
195
|
// was invalid would have nothing to fix.
|
|
196
196
|
expect(e.message).toMatch(/checkout folder name/);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BranchNameError,
|
|
1
|
+
import { BranchNameError, VersionControlValidationError } from '../../shared/domain-errors.js';
|
|
2
2
|
|
|
3
3
|
// The protected-branch list is the knowledge base's (`KbContext.protectedBranches`):
|
|
4
4
|
// services ask the context they were built with, so the backend guard and the
|
|
@@ -47,8 +47,8 @@ export function assertValidBranchName(name: string): void {
|
|
|
47
47
|
* path we pass to `git` as a pathspec. Must stay within the repo; forward slashes only.
|
|
48
48
|
*/
|
|
49
49
|
export function assertValidRelativePath(relativePath: string): void {
|
|
50
|
-
if (!relativePath) throw new
|
|
51
|
-
if (relativePath.length > 1024) throw new
|
|
50
|
+
if (!relativePath) throw new VersionControlValidationError('path is required');
|
|
51
|
+
if (relativePath.length > 1024) throw new VersionControlValidationError('path too long');
|
|
52
52
|
// NUL, every other C0 control and DEL. A NUL is named on its own because it
|
|
53
53
|
// terminates a C string and git's `-z` output; the rest are refused with it
|
|
54
54
|
// because a LINE BREAK in a path is a separator in git's line-oriented stdin
|
|
@@ -59,22 +59,22 @@ export function assertValidRelativePath(relativePath: string): void {
|
|
|
59
59
|
// check every path handed to git as a pathspec passes through.
|
|
60
60
|
// eslint-disable-next-line no-control-regex
|
|
61
61
|
if (/[\x00-\x1F\x7F]/.test(relativePath)) {
|
|
62
|
-
throw new
|
|
62
|
+
throw new VersionControlValidationError(
|
|
63
63
|
relativePath.includes('\0') ? 'path contains NUL' : 'path contains a control character',
|
|
64
64
|
);
|
|
65
65
|
}
|
|
66
66
|
if (relativePath.includes('\\')) {
|
|
67
|
-
throw new
|
|
67
|
+
throw new VersionControlValidationError('path must use forward slashes only');
|
|
68
68
|
}
|
|
69
69
|
if (relativePath.startsWith('/') || /^[A-Za-z]:/.test(relativePath)) {
|
|
70
|
-
throw new
|
|
70
|
+
throw new VersionControlValidationError('path must be relative');
|
|
71
71
|
}
|
|
72
72
|
const parts = relativePath.split('/');
|
|
73
73
|
if (parts.some((p) => p === '..' || p === '.')) {
|
|
74
|
-
throw new
|
|
74
|
+
throw new VersionControlValidationError('path must not contain "." or ".."');
|
|
75
75
|
}
|
|
76
76
|
if (relativePath.startsWith('-')) {
|
|
77
|
-
throw new
|
|
77
|
+
throw new VersionControlValidationError('path must not start with "-"');
|
|
78
78
|
}
|
|
79
79
|
// Pathspec glob characters (`*`, `?`, `[`, `]`, `!`) and pathspec magic (`:(…)`)
|
|
80
80
|
// would otherwise be interpreted by `git add -- <path>` / `git log -- <path>`
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* One in-process notification fired AFTER a set of file changes is committed +
|
|
3
3
|
* pushed (post-lock-release), so backend services can react to KB writes without
|
|
4
|
-
* the per-file TTL wait. Distinct from the SSE `
|
|
4
|
+
* the per-file TTL wait. Distinct from the SSE `VersionControlEventBus`, which fans
|
|
5
5
|
* scoped events to browser sessions; this is an unscoped, server-side domain hook.
|
|
6
6
|
*
|
|
7
7
|
* BATCHED by design: a single-file save emits `paths: [p]`, a batch write
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
* id-repair rebuilds the id index) handle a whole batch off one rebuild instead
|
|
11
11
|
* of N back-to-back ones.
|
|
12
12
|
*
|
|
13
|
-
* Emitted from the two post-commit chokepoints (`
|
|
13
|
+
* Emitted from the two post-commit chokepoints (`VersionControlService.runPendingCommit`
|
|
14
14
|
* for single-file writes, `LockingFilesystem.writeFiles` for batches).
|
|
15
15
|
*
|
|
16
16
|
* Every listener is invoked inside try/catch — a throwing subscriber must never
|
|
@@ -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,7 +47,7 @@ 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
52
|
import type { FileChangeNotifier } from './file-change-notifier.js';
|
|
53
53
|
import { isAbsence } from '../../shared/fs.contract.js';
|
|
@@ -134,13 +134,13 @@ export type WriteValidator = ((path: string, content: FileContent) => void | Pro
|
|
|
134
134
|
};
|
|
135
135
|
|
|
136
136
|
/**
|
|
137
|
-
* Dependencies the wrapper needs to talk to the
|
|
137
|
+
* Dependencies the wrapper needs to talk to the version-control lock service.
|
|
138
138
|
* Captured at construction time so every per-method call resolves to the
|
|
139
139
|
* same `(workspace, branch, user)` triple — the agent can't accidentally
|
|
140
140
|
* target a different workspace through this filesystem.
|
|
141
141
|
*/
|
|
142
142
|
export interface LockingFilesystemContext {
|
|
143
|
-
|
|
143
|
+
versionControl: IVersionControlService;
|
|
144
144
|
workspaceId: string;
|
|
145
145
|
branch: string;
|
|
146
146
|
user: AuthUser;
|
|
@@ -475,7 +475,7 @@ export class LockingFilesystem extends GitGuardedFilesystem {
|
|
|
475
475
|
summary: string,
|
|
476
476
|
check?: () => Promise<void>,
|
|
477
477
|
): Promise<Change | null> {
|
|
478
|
-
const {
|
|
478
|
+
const { versionControl, workspaceId, branch, user } = this.lockContext;
|
|
479
479
|
await this.assertNotGitInternals(src);
|
|
480
480
|
await this.assertNotGitInternals(dest);
|
|
481
481
|
this.assertInsideRepo(dest);
|
|
@@ -512,10 +512,10 @@ export class LockingFilesystem extends GitGuardedFilesystem {
|
|
|
512
512
|
const release = async (mode: 'untouched' | 'enqueue'): Promise<void> => {
|
|
513
513
|
for (const p of acquired) {
|
|
514
514
|
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
|
|
515
|
+
if (mode === 'enqueue' && scope.includes(p)) await versionControl.releaseLock(workspaceId, branch, p, user);
|
|
516
|
+
else if (mode === 'enqueue') await versionControl.releaseLockUntouched(workspaceId, branch, p, user);
|
|
517
|
+
else if (dirtyLeft.has(p)) await versionControl.releaseLockNoCommit(workspaceId, branch, p, user);
|
|
518
|
+
else await versionControl.releaseLockUntouched(workspaceId, branch, p, user);
|
|
519
519
|
} catch (releaseErr) {
|
|
520
520
|
log.warn(`lock release failed for "${p}" during moveWithEdits:`, { err: releaseErr });
|
|
521
521
|
}
|
|
@@ -526,7 +526,7 @@ export class LockingFilesystem extends GitGuardedFilesystem {
|
|
|
526
526
|
let ok = false;
|
|
527
527
|
try {
|
|
528
528
|
for (let attempt = 0; attempt < ACQUIRE_RETRY_ATTEMPTS; attempt++) {
|
|
529
|
-
const result = await
|
|
529
|
+
const result = await versionControl.acquireLock(workspaceId, branch, p, user);
|
|
530
530
|
if (result.acquired) {
|
|
531
531
|
ok = true;
|
|
532
532
|
break;
|
|
@@ -599,7 +599,7 @@ export class LockingFilesystem extends GitGuardedFilesystem {
|
|
|
599
599
|
...edits.map((e) => e.path),
|
|
600
600
|
]),
|
|
601
601
|
].sort();
|
|
602
|
-
const change = await
|
|
602
|
+
const change = await versionControl.commitChanges(workspaceId, user, summary, scope);
|
|
603
603
|
await release('untouched');
|
|
604
604
|
if (change) this.lockContext.fileChanges?.emit({ workspaceId, branch, paths: scope, byUser: user });
|
|
605
605
|
return change;
|
|
@@ -681,7 +681,7 @@ export class LockingFilesystem extends GitGuardedFilesystem {
|
|
|
681
681
|
* `writeFile` takes one lock cycle per file and lets the deferred queue commit
|
|
682
682
|
* it, this wraps the WHOLE batch in one cycle: acquire every path's lock up
|
|
683
683
|
* front, write every file to disk, then commit the whole set synchronously as
|
|
684
|
-
* one change via the
|
|
684
|
+
* one change via the version-control service's `commitChanges` (one `git add` + one
|
|
685
685
|
* `git commit`, then push), and release WITHOUT a per-file commit. Fail-closed:
|
|
686
686
|
* if any lock can't be acquired, or a write/commit throws, nothing is committed
|
|
687
687
|
* (the failure-path `releaseLockNoCommit` discards the uncommitted bytes).
|
|
@@ -713,7 +713,7 @@ export class LockingFilesystem extends GitGuardedFilesystem {
|
|
|
713
713
|
writes: readonly { path: string; content: FileContent }[],
|
|
714
714
|
) => Promise<{ path: string; content: FileContent }[]>,
|
|
715
715
|
): Promise<Change | null> {
|
|
716
|
-
const {
|
|
716
|
+
const { versionControl, workspaceId, branch, user } = this.lockContext;
|
|
717
717
|
// Fail the whole batch before any plan, validator or lock: one stray path
|
|
718
718
|
// must not let its siblings land while it silently misses git.
|
|
719
719
|
for (const w of writes) await this.assertNotGitInternals(w.path);
|
|
@@ -760,7 +760,7 @@ export class LockingFilesystem extends GitGuardedFilesystem {
|
|
|
760
760
|
// with the discard so the corrupt bytes can't outlive the batch.
|
|
761
761
|
const failedSeedDiscards = new Set<string>();
|
|
762
762
|
// Release every acquired lock, each with the semantics its outcome
|
|
763
|
-
// earned. Three shapes (mirroring the three
|
|
763
|
+
// earned. Three shapes (mirroring the three VersionControlService releases):
|
|
764
764
|
//
|
|
765
765
|
// 'discard' → releaseLockNoCommit: resets the path's working tree to
|
|
766
766
|
// HEAD. Only for bytes this batch itself owns — its committed paths
|
|
@@ -783,11 +783,11 @@ export class LockingFilesystem extends GitGuardedFilesystem {
|
|
|
783
783
|
try {
|
|
784
784
|
const mode = modeOf(p);
|
|
785
785
|
if (mode === 'discard') {
|
|
786
|
-
await
|
|
786
|
+
await versionControl.releaseLockNoCommit(workspaceId, branch, p, user);
|
|
787
787
|
} else if (mode === 'enqueue') {
|
|
788
|
-
await
|
|
788
|
+
await versionControl.releaseLock(workspaceId, branch, p, user);
|
|
789
789
|
} else {
|
|
790
|
-
await
|
|
790
|
+
await versionControl.releaseLockUntouched(workspaceId, branch, p, user);
|
|
791
791
|
}
|
|
792
792
|
} catch (releaseErr) {
|
|
793
793
|
log.warn(`lock release failed for "${p}" during writeFiles:`, { err: releaseErr });
|
|
@@ -800,7 +800,7 @@ export class LockingFilesystem extends GitGuardedFilesystem {
|
|
|
800
800
|
let holderName: string | null = null;
|
|
801
801
|
let ok = false;
|
|
802
802
|
for (let attempt = 0; attempt < ACQUIRE_RETRY_ATTEMPTS; attempt++) {
|
|
803
|
-
const result = await
|
|
803
|
+
const result = await versionControl.acquireLock(workspaceId, branch, p, user);
|
|
804
804
|
if (result.acquired) {
|
|
805
805
|
ok = true;
|
|
806
806
|
break;
|
|
@@ -864,7 +864,7 @@ export class LockingFilesystem extends GitGuardedFilesystem {
|
|
|
864
864
|
// without it would leave that folder invisible to them.
|
|
865
865
|
for (const p of [...seeds.keys()].sort()) {
|
|
866
866
|
if (paths.includes(p)) continue; // already locked as a caller path
|
|
867
|
-
const result = await
|
|
867
|
+
const result = await versionControl.acquireLock(workspaceId, branch, p, user);
|
|
868
868
|
if (result.acquired) {
|
|
869
869
|
acquired.push(p);
|
|
870
870
|
} else {
|
|
@@ -967,7 +967,7 @@ export class LockingFilesystem extends GitGuardedFilesystem {
|
|
|
967
967
|
// seeds): on the shared per-branch workspace another save's bytes may be
|
|
968
968
|
// dirty with their commit still queued, and an unscoped commit would
|
|
969
969
|
// sweep them in under this batch's author/summary.
|
|
970
|
-
change = await
|
|
970
|
+
change = await versionControl.commitChanges(workspaceId, user, summary, touched);
|
|
971
971
|
if (seeds.size > 0) this.lockContext.creatorAccess?.noteAccessFileWritten(workspaceId);
|
|
972
972
|
} catch (err) {
|
|
973
973
|
if (err instanceof PushNeedsAgentResolutionError) {
|
|
@@ -1052,7 +1052,7 @@ export class LockingFilesystem extends GitGuardedFilesystem {
|
|
|
1052
1052
|
const plan = await this.planCreate(inputPath, 'dir');
|
|
1053
1053
|
// mkdir itself is not a lockable op (it touches no file content), so we
|
|
1054
1054
|
// do the bare super-call without acquiring. The lock + commit happens on
|
|
1055
|
-
// the `.gitkeep` write below — that's the file the
|
|
1055
|
+
// the `.gitkeep` write below — that's the file the version-control change
|
|
1056
1056
|
// attaches to. If the dir already has content (rare; e.g. recursive
|
|
1057
1057
|
// create where a sibling already exists), we skip the .gitkeep — empty-
|
|
1058
1058
|
// folder placeholders are only useful for actually-empty folders.
|
|
@@ -1180,7 +1180,7 @@ export class LockingFilesystem extends GitGuardedFilesystem {
|
|
|
1180
1180
|
|
|
1181
1181
|
/**
|
|
1182
1182
|
* Acquire the lock, run `op`, release. The release does the commit +
|
|
1183
|
-
* push via `
|
|
1183
|
+
* push via `VersionControlService.releaseLock`. On contention we retry a few
|
|
1184
1184
|
* times before surfacing a structured failure — long enough to ride
|
|
1185
1185
|
* out a human typing a quick edit, short enough that the agent doesn't
|
|
1186
1186
|
* stall a whole turn waiting for someone to step away from a file.
|
|
@@ -1214,12 +1214,12 @@ export class LockingFilesystem extends GitGuardedFilesystem {
|
|
|
1214
1214
|
op: () => Promise<T>,
|
|
1215
1215
|
check?: () => Promise<void>,
|
|
1216
1216
|
): Promise<T> {
|
|
1217
|
-
const {
|
|
1217
|
+
const { versionControl, workspaceId, branch, user } = this.lockContext;
|
|
1218
1218
|
|
|
1219
1219
|
let lastHolderName: string | null = null;
|
|
1220
1220
|
let acquired = false;
|
|
1221
1221
|
for (let attempt = 0; attempt < ACQUIRE_RETRY_ATTEMPTS; attempt++) {
|
|
1222
|
-
const result = await
|
|
1222
|
+
const result = await versionControl.acquireLock(workspaceId, branch, inputPath, user);
|
|
1223
1223
|
if (result.acquired) {
|
|
1224
1224
|
acquired = true;
|
|
1225
1225
|
break;
|
|
@@ -1263,9 +1263,9 @@ export class LockingFilesystem extends GitGuardedFilesystem {
|
|
|
1263
1263
|
// caller actually cares about.
|
|
1264
1264
|
try {
|
|
1265
1265
|
if (err instanceof CheckRefusal || err instanceof DestinationTakenError) {
|
|
1266
|
-
await
|
|
1266
|
+
await versionControl.releaseLockUntouched(workspaceId, branch, inputPath, user);
|
|
1267
1267
|
} else {
|
|
1268
|
-
await
|
|
1268
|
+
await versionControl.releaseLockNoCommit(workspaceId, branch, inputPath, user);
|
|
1269
1269
|
}
|
|
1270
1270
|
} catch (releaseErr) {
|
|
1271
1271
|
log.warn(`lock release failed for "${inputPath}" after op error:`, { err: releaseErr });
|
|
@@ -1278,7 +1278,7 @@ export class LockingFilesystem extends GitGuardedFilesystem {
|
|
|
1278
1278
|
// actual `commitFile + push` out of band. The agent's tool call
|
|
1279
1279
|
// returns once disk + lock + enqueue are done — the commit lands
|
|
1280
1280
|
// moments later (typically <1s) without blocking the agent's turn.
|
|
1281
|
-
await
|
|
1281
|
+
await versionControl.releaseLock(workspaceId, branch, inputPath, user);
|
|
1282
1282
|
return result;
|
|
1283
1283
|
}
|
|
1284
1284
|
}
|
|
@@ -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`).',
|