@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
|
@@ -5,7 +5,7 @@ import path from 'node:path';
|
|
|
5
5
|
import os from 'node:os';
|
|
6
6
|
|
|
7
7
|
import type { WorkspaceService } from '../../workspace/workspace.service.js';
|
|
8
|
-
import type {
|
|
8
|
+
import type { VersionControlService } from '../../version-control/version-control.service.js';
|
|
9
9
|
import type { AuthUser, FileTreeEntry } from '@bevel-software/platform-shared';
|
|
10
10
|
import { DEFAULT_BRANCH } from '@bevel-software/platform-shared';
|
|
11
11
|
import { AccessControlService } from '../access-control.service.js';
|
|
@@ -65,7 +65,7 @@ function stubWorkspace(workspaceDir: string): WorkspaceService {
|
|
|
65
65
|
} as unknown as WorkspaceService;
|
|
66
66
|
}
|
|
67
67
|
|
|
68
|
-
function
|
|
68
|
+
function stubVersionControl() {
|
|
69
69
|
const commits: { summary: string }[] = [];
|
|
70
70
|
// Strict per-path locks — a live row is contended even for the same user,
|
|
71
71
|
// exactly like FileLockService (nesting bugs must fail here too).
|
|
@@ -107,7 +107,7 @@ function stubWorkflow() {
|
|
|
107
107
|
commits.push({ summary });
|
|
108
108
|
return {} as unknown;
|
|
109
109
|
},
|
|
110
|
-
} as unknown as
|
|
110
|
+
} as unknown as VersionControlService;
|
|
111
111
|
return { svc, commits, acquireCalls };
|
|
112
112
|
}
|
|
113
113
|
|
|
@@ -126,11 +126,11 @@ describe('RolesAdminService — capabilities, group assignment, conversion', ()
|
|
|
126
126
|
await write(repo, 'groups.yaml', 'groups:\n GTM Team:\n - sara@x.io\n');
|
|
127
127
|
await write(repo, 'access.md', '---\nwrite:\n - Admin\nread:\n - Product\n---\n');
|
|
128
128
|
const workspace = stubWorkspace(root);
|
|
129
|
-
const
|
|
130
|
-
commits =
|
|
129
|
+
const versionControl = stubVersionControl();
|
|
130
|
+
commits = versionControl.commits;
|
|
131
131
|
service = new RolesAdminService(
|
|
132
132
|
workspace,
|
|
133
|
-
|
|
133
|
+
versionControl.svc,
|
|
134
134
|
new AccessControlService(workspace as never, KB, new NodeFs()),
|
|
135
135
|
new NodeFs(),
|
|
136
136
|
KB,
|
|
@@ -212,10 +212,10 @@ describe('RolesAdminService — capabilities, group assignment, conversion', ()
|
|
|
212
212
|
// that claims no write authority. A write-intent acquire here would fail
|
|
213
213
|
// EVERY manual-mode conversion at lock acquisition.
|
|
214
214
|
const workspace = stubWorkspace(root);
|
|
215
|
-
const
|
|
215
|
+
const versionControl = stubVersionControl();
|
|
216
216
|
const svc = new RolesAdminService(
|
|
217
217
|
workspace,
|
|
218
|
-
|
|
218
|
+
versionControl.svc,
|
|
219
219
|
new AccessControlService(workspace as never, KB, new NodeFs()),
|
|
220
220
|
new NodeFs(),
|
|
221
221
|
KB,
|
|
@@ -226,12 +226,12 @@ describe('RolesAdminService — capabilities, group assignment, conversion', ()
|
|
|
226
226
|
expect(await groupsYaml()).toContain('Product:');
|
|
227
227
|
// The synced file WAS locked (the serialization is real), via coordination;
|
|
228
228
|
// the written files keep their write-gated acquires.
|
|
229
|
-
expect(
|
|
229
|
+
expect(versionControl.acquireCalls).toContainEqual({
|
|
230
230
|
path: `${KB}/synced-groups.yaml`,
|
|
231
231
|
coordination: true,
|
|
232
232
|
});
|
|
233
|
-
expect(
|
|
234
|
-
expect(
|
|
233
|
+
expect(versionControl.acquireCalls).toContainEqual({ path: `${KB}/roles.yaml`, coordination: false });
|
|
234
|
+
expect(versionControl.acquireCalls).toContainEqual({ path: `${KB}/groups.yaml`, coordination: false });
|
|
235
235
|
});
|
|
236
236
|
|
|
237
237
|
it('conversion refusals: capability role, group-assigned role, IdP mode', async () => {
|
|
@@ -259,8 +259,8 @@ describe('RolesAdminService — capabilities, group assignment, conversion', ()
|
|
|
259
259
|
// write nothing (committing a groups.yaml group in IdP mode writes a
|
|
260
260
|
// retired file).
|
|
261
261
|
const workspace = stubWorkspace(root);
|
|
262
|
-
const
|
|
263
|
-
const wf =
|
|
262
|
+
const versionControl = stubVersionControl();
|
|
263
|
+
const wf = versionControl.svc as unknown as {
|
|
264
264
|
acquireLock: (
|
|
265
265
|
w: string,
|
|
266
266
|
b: string,
|
|
@@ -269,7 +269,7 @@ describe('RolesAdminService — capabilities, group assignment, conversion', ()
|
|
|
269
269
|
opts?: { coordination?: boolean },
|
|
270
270
|
) => Promise<unknown>;
|
|
271
271
|
};
|
|
272
|
-
const origAcquire = wf.acquireLock.bind(
|
|
272
|
+
const origAcquire = wf.acquireLock.bind(versionControl.svc);
|
|
273
273
|
wf.acquireLock = async (w, b, p, u, opts) => {
|
|
274
274
|
if (p === `${KB}/synced-groups.yaml`) {
|
|
275
275
|
// The sync's provisioning push won the race for this lock and landed.
|
|
@@ -279,7 +279,7 @@ describe('RolesAdminService — capabilities, group assignment, conversion', ()
|
|
|
279
279
|
};
|
|
280
280
|
const svc = new RolesAdminService(
|
|
281
281
|
workspace,
|
|
282
|
-
|
|
282
|
+
versionControl.svc,
|
|
283
283
|
new AccessControlService(workspace as never, KB, new NodeFs()),
|
|
284
284
|
new NodeFs(),
|
|
285
285
|
KB,
|
|
@@ -292,19 +292,19 @@ describe('RolesAdminService — capabilities, group assignment, conversion', ()
|
|
|
292
292
|
// Nothing moved.
|
|
293
293
|
expect(await rolesYaml()).toBe(ROLES);
|
|
294
294
|
expect(await groupsYaml()).not.toContain('Product');
|
|
295
|
-
expect(
|
|
295
|
+
expect(versionControl.commits).toHaveLength(0);
|
|
296
296
|
});
|
|
297
297
|
|
|
298
298
|
it('a failed conversion with NO pre-existing groups.yaml leaves no groups.yaml behind', async () => {
|
|
299
299
|
await fs.rm(path.join(repo, 'groups.yaml'));
|
|
300
300
|
const workspace = stubWorkspace(root);
|
|
301
|
-
const
|
|
302
|
-
(
|
|
301
|
+
const versionControl = stubVersionControl();
|
|
302
|
+
(versionControl.svc as unknown as { commitChanges: unknown }).commitChanges = async () => {
|
|
303
303
|
throw new Error('commit exploded');
|
|
304
304
|
};
|
|
305
305
|
const svc = new RolesAdminService(
|
|
306
306
|
workspace,
|
|
307
|
-
|
|
307
|
+
versionControl.svc,
|
|
308
308
|
new AccessControlService(workspace as never, KB, new NodeFs()),
|
|
309
309
|
new NodeFs(),
|
|
310
310
|
KB,
|
|
@@ -12,8 +12,8 @@ import { NodeFs } from '../../kb-fs/node-fs.js';
|
|
|
12
12
|
import type { IAccessControl } from '../access-control.interface.js';
|
|
13
13
|
import type { WorkspaceService } from '../../workspace/workspace.service.js';
|
|
14
14
|
import { AuthService } from '../../auth/auth.service.js';
|
|
15
|
-
import type {
|
|
16
|
-
import type {
|
|
15
|
+
import type { VersionControlService } from '../../version-control/version-control.service.js';
|
|
16
|
+
import type { VersionControlEventBus } from '../../version-control/event-bus.js';
|
|
17
17
|
import type { FileTreeEntry } from '@bevel-software/platform-shared';
|
|
18
18
|
import { createAccessRoutes } from '../access.routes.js';
|
|
19
19
|
import { usersDbDouble } from './users-db-double.js';
|
|
@@ -113,7 +113,7 @@ async function makeHarness(
|
|
|
113
113
|
// exactly like FileLockService (nesting bugs must fail here too).
|
|
114
114
|
const locks = new Map<string, { id: string; name: string }>();
|
|
115
115
|
const lockRow = (h: { id: string; name: string }) => ({ holderUserId: h.id, holderName: h.name });
|
|
116
|
-
const
|
|
116
|
+
const versionControlService = {
|
|
117
117
|
getLock: vi.fn(async (_w: string, _b: string, p: string) => {
|
|
118
118
|
const h = locks.get(p);
|
|
119
119
|
return h ? lockRow(h) : null;
|
|
@@ -131,9 +131,9 @@ async function makeHarness(
|
|
|
131
131
|
// Write-free: the lock-aware filesystem writes to disk; this just commits the
|
|
132
132
|
// dirty tree. Not exercised by these route tests (no rename), but kept honest.
|
|
133
133
|
commitChanges: vi.fn(async () => ({})),
|
|
134
|
-
} as unknown as
|
|
134
|
+
} as unknown as VersionControlService;
|
|
135
135
|
|
|
136
|
-
const eventBus = { emit: vi.fn() } as unknown as
|
|
136
|
+
const eventBus = { emit: vi.fn() } as unknown as VersionControlEventBus;
|
|
137
137
|
const accounts = [
|
|
138
138
|
{ email: 'off@example.com', deactivatedAt: new Date('2026-09-01T00:00:00Z') },
|
|
139
139
|
'on@example.com',
|
|
@@ -182,7 +182,7 @@ async function makeHarness(
|
|
|
182
182
|
(req as unknown as { userId: string }).userId = ADMIN.id;
|
|
183
183
|
next();
|
|
184
184
|
});
|
|
185
|
-
app.use('/api', createAccessRoutes(accessControl, workspaceService, authService, authService,
|
|
185
|
+
app.use('/api', createAccessRoutes(accessControl, workspaceService, authService, authService, versionControlService, eventBus, db, testKbContext({ kbDirName: KB }), new NodeFs()));
|
|
186
186
|
|
|
187
187
|
const server = await new Promise<Server>((resolve) => {
|
|
188
188
|
const s = app.listen(0, () => resolve(s));
|
|
@@ -3,12 +3,12 @@ import fs from 'node:fs/promises';
|
|
|
3
3
|
import path from 'node:path';
|
|
4
4
|
import os from 'node:os';
|
|
5
5
|
|
|
6
|
-
import type { AuthUser,
|
|
6
|
+
import type { AuthUser, IVersionControlService } from '@bevel-software/platform-shared';
|
|
7
7
|
import type { WorkspaceService } from '../../workspace/workspace.service.js';
|
|
8
8
|
import type { AccessControlService } from '../access-control.service.js';
|
|
9
|
-
import type {
|
|
9
|
+
import type { VersionControlEventBus } from '../../version-control/event-bus.js';
|
|
10
10
|
import { createSyncedGroupsCommitter } from '../synced-groups-committer.js';
|
|
11
|
-
import { PushNeedsAgentResolutionError,
|
|
11
|
+
import { PushNeedsAgentResolutionError, VersionControlValidationError } from '../../../shared/domain-errors.js';
|
|
12
12
|
|
|
13
13
|
const KB = 'knowledge-base';
|
|
14
14
|
const BOT: AuthUser = { id: 'bot-1', email: 'directory-sync@bevel.local', name: 'Directory Sync Bot' };
|
|
@@ -26,7 +26,7 @@ describe('createSyncedGroupsCommitter.persist — post-commit push failures', ()
|
|
|
26
26
|
});
|
|
27
27
|
|
|
28
28
|
function makeDeps(
|
|
29
|
-
|
|
29
|
+
versionControlOverrides: Partial<
|
|
30
30
|
Record<'commitChanges' | 'releaseLock' | 'hasQueuedCommit' | 'hasUnpushedCommits', unknown>
|
|
31
31
|
> = {},
|
|
32
32
|
) {
|
|
@@ -44,7 +44,7 @@ describe('createSyncedGroupsCommitter.persist — post-commit push failures', ()
|
|
|
44
44
|
// Default: the branch still carries the landed-but-unpushed commit — the
|
|
45
45
|
// truthful answer everywhere except the worker-won-the-race scenario.
|
|
46
46
|
const hasUnpushedCommits = vi.fn(async () => true);
|
|
47
|
-
const
|
|
47
|
+
const versionControlService = {
|
|
48
48
|
acquireLock: vi.fn(async () => ({ acquired: true, lock: {} })),
|
|
49
49
|
releaseLock,
|
|
50
50
|
releaseLockNoCommit,
|
|
@@ -52,13 +52,13 @@ describe('createSyncedGroupsCommitter.persist — post-commit push failures', ()
|
|
|
52
52
|
hasQueuedCommit,
|
|
53
53
|
hasUnpushedCommits,
|
|
54
54
|
commitChanges: vi.fn(async () => ({})),
|
|
55
|
-
...
|
|
56
|
-
} as unknown as
|
|
55
|
+
...versionControlOverrides,
|
|
56
|
+
} as unknown as IVersionControlService;
|
|
57
57
|
const accessControl = { invalidate: vi.fn() } as unknown as AccessControlService;
|
|
58
|
-
const eventBus = { emit: vi.fn() } as unknown as
|
|
58
|
+
const eventBus = { emit: vi.fn() } as unknown as VersionControlEventBus;
|
|
59
59
|
const committer = createSyncedGroupsCommitter({
|
|
60
60
|
workspaceService,
|
|
61
|
-
|
|
61
|
+
versionControlService,
|
|
62
62
|
accessControl,
|
|
63
63
|
eventBus,
|
|
64
64
|
kbDirName: KB,
|
|
@@ -99,7 +99,7 @@ describe('createSyncedGroupsCommitter.persist — post-commit push failures', ()
|
|
|
99
99
|
.mockResolvedValueOnce(undefined)
|
|
100
100
|
// The committer's arm probe: nothing left to release.
|
|
101
101
|
.mockRejectedValue(
|
|
102
|
-
new
|
|
102
|
+
new VersionControlValidationError('Cannot release lock: not held by you.', {
|
|
103
103
|
kind: 'lock-not-held',
|
|
104
104
|
}),
|
|
105
105
|
);
|
|
@@ -125,7 +125,7 @@ describe('createSyncedGroupsCommitter.persist — post-commit push failures', ()
|
|
|
125
125
|
// unpublished forever. With the queue consulted directly, an empty queue
|
|
126
126
|
// must surface the original push failure.
|
|
127
127
|
const releaseLock = vi.fn().mockRejectedValue(
|
|
128
|
-
new
|
|
128
|
+
new VersionControlValidationError('Cannot release lock: not held by you.', {
|
|
129
129
|
kind: 'lock-not-held',
|
|
130
130
|
}),
|
|
131
131
|
);
|
|
@@ -154,7 +154,7 @@ describe('createSyncedGroupsCommitter.persist — post-commit push failures', ()
|
|
|
154
154
|
.fn()
|
|
155
155
|
.mockResolvedValueOnce(undefined) // writeFiles' release: enqueued + dropped
|
|
156
156
|
.mockRejectedValue(
|
|
157
|
-
new
|
|
157
|
+
new VersionControlValidationError('Cannot release lock: not held by you.', {
|
|
158
158
|
kind: 'lock-not-held',
|
|
159
159
|
}),
|
|
160
160
|
);
|
|
@@ -171,7 +171,7 @@ describe('createSyncedGroupsCommitter.persist — post-commit push failures', ()
|
|
|
171
171
|
|
|
172
172
|
it('REJECTS when the queue itself cannot be read (armed must be PROVEN, never assumed)', async () => {
|
|
173
173
|
const releaseLock = vi.fn().mockRejectedValue(
|
|
174
|
-
new
|
|
174
|
+
new VersionControlValidationError('Cannot release lock: not held by you.', {
|
|
175
175
|
kind: 'lock-not-held',
|
|
176
176
|
}),
|
|
177
177
|
);
|
|
@@ -6,7 +6,7 @@ import os from 'node:os';
|
|
|
6
6
|
import { fileURLToPath } from 'node:url';
|
|
7
7
|
|
|
8
8
|
import type { WorkspaceService } from '../../workspace/workspace.service.js';
|
|
9
|
-
import type {
|
|
9
|
+
import type { VersionControlService } from '../../version-control/version-control.service.js';
|
|
10
10
|
import type { AuthUser } from '@bevel-software/platform-shared';
|
|
11
11
|
import { DEFAULT_BRANCH } from '@bevel-software/platform-shared';
|
|
12
12
|
import { PushNeedsAgentResolutionError } from '../../../shared/domain-errors.js';
|
|
@@ -62,7 +62,7 @@ function stubWorkspace(workspaceDir: string): WorkspaceService {
|
|
|
62
62
|
} as unknown as WorkspaceService;
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
-
function
|
|
65
|
+
function stubVersionControl(opts: { failCommit?: boolean; pushNeedsResolution?: boolean } = {}) {
|
|
66
66
|
const commits: { summary: string; paths: string[]; author: string }[] = [];
|
|
67
67
|
const locks = new Map<string, AuthUser>();
|
|
68
68
|
const lockRow = (h: AuthUser) => ({ holderUserId: h.id, holderName: h.name });
|
|
@@ -89,7 +89,7 @@ function stubWorkflow(opts: { failCommit?: boolean; pushNeedsResolution?: boolea
|
|
|
89
89
|
if (opts.pushNeedsResolution) throw new PushNeedsAgentResolutionError(DEFAULT_BRANCH, paths[0], 'diverged', 'rebase failed');
|
|
90
90
|
return {} as unknown;
|
|
91
91
|
},
|
|
92
|
-
} as unknown as
|
|
92
|
+
} as unknown as VersionControlService;
|
|
93
93
|
return { svc, commits, locks };
|
|
94
94
|
}
|
|
95
95
|
|
|
@@ -167,11 +167,11 @@ describe('UserAccessRemovalService', () => {
|
|
|
167
167
|
|
|
168
168
|
const read = (rel: string) => fs.readFile(path.join(repo, rel), 'utf-8');
|
|
169
169
|
|
|
170
|
-
function build(
|
|
170
|
+
function build(versionControl = stubVersionControl(), owners: string[] = ['owner@x.io'], disk: ITreeWalker = new NodeFs()) {
|
|
171
171
|
const access = new AccessControlService(workspace as never, KB, new NodeFs());
|
|
172
172
|
return {
|
|
173
|
-
|
|
174
|
-
service: new UserAccessRemovalService(workspace,
|
|
173
|
+
versionControl,
|
|
174
|
+
service: new UserAccessRemovalService(workspace, versionControl.svc, access, disk, KB, () => DEFAULT_BRANCH, undefined, owners),
|
|
175
175
|
};
|
|
176
176
|
}
|
|
177
177
|
|
|
@@ -236,12 +236,12 @@ describe('UserAccessRemovalService', () => {
|
|
|
236
236
|
});
|
|
237
237
|
|
|
238
238
|
it('removes the address from all four kinds of file in ONE commit named by the anonymised id', async () => {
|
|
239
|
-
const { service,
|
|
239
|
+
const { service, versionControl } = build();
|
|
240
240
|
const before = await read('access.md');
|
|
241
241
|
const result = await service.remove(ADMIN, LEE, 'deleted-1234');
|
|
242
242
|
|
|
243
|
-
expect(
|
|
244
|
-
const [commit] =
|
|
243
|
+
expect(versionControl.commits).toHaveLength(1);
|
|
244
|
+
const [commit] = versionControl.commits;
|
|
245
245
|
expect(commit.summary).toBe('Remove erased account deleted-1234 from roles, groups and access rules');
|
|
246
246
|
expect(commit.summary).not.toContain('lee');
|
|
247
247
|
expect(commit.author).toBe('admin@x.io');
|
|
@@ -258,15 +258,15 @@ describe('UserAccessRemovalService', () => {
|
|
|
258
258
|
expect(await read('Sales/access.md')).not.toContain('lee@x.io');
|
|
259
259
|
expect((await service.report(LEE)).total).toBe(0);
|
|
260
260
|
// No locks left behind.
|
|
261
|
-
expect(
|
|
261
|
+
expect(versionControl.locks.size).toBe(0);
|
|
262
262
|
});
|
|
263
263
|
|
|
264
264
|
it('counts synced groups but never writes them, reporting the file as still naming the user', async () => {
|
|
265
265
|
await write(repo, 'synced-groups.yaml', 'groups:\n Engineering:\n - lee@x.io\n');
|
|
266
|
-
const { service,
|
|
266
|
+
const { service, versionControl } = build();
|
|
267
267
|
expect((await service.report(LEE)).groups).toBe(2);
|
|
268
268
|
const result = await service.remove(ADMIN, LEE, 'deleted-1');
|
|
269
|
-
expect(
|
|
269
|
+
expect(versionControl.commits[0].paths).not.toContain(`${KB}/synced-groups.yaml`);
|
|
270
270
|
expect(result.stillNamedIn).toEqual(['synced-groups.yaml']);
|
|
271
271
|
});
|
|
272
272
|
|
|
@@ -278,11 +278,11 @@ describe('UserAccessRemovalService', () => {
|
|
|
278
278
|
.spyOn(AccessControlService.prototype, 'canWriteBatchAtRef')
|
|
279
279
|
.mockImplementation(async (_ws, _ref, _email, paths) => new Map(paths.map((p) => [p, p !== 'Sales/Plan.md'])));
|
|
280
280
|
try {
|
|
281
|
-
const { service,
|
|
281
|
+
const { service, versionControl } = build();
|
|
282
282
|
const result = await service.remove(ADMIN, LEE, 'deleted-1');
|
|
283
283
|
|
|
284
|
-
expect(
|
|
285
|
-
expect(
|
|
284
|
+
expect(versionControl.commits).toHaveLength(1);
|
|
285
|
+
expect(versionControl.commits[0].paths.sort()).toEqual(
|
|
286
286
|
['Sales/access.md', 'groups.yaml', 'roles.yaml'].map((p) => `${KB}/${p}`).sort(),
|
|
287
287
|
);
|
|
288
288
|
expect(result.removedFrom.sort()).toEqual(['Sales/access.md', 'groups.yaml', 'roles.yaml']);
|
|
@@ -291,7 +291,7 @@ describe('UserAccessRemovalService', () => {
|
|
|
291
291
|
expect(await read('Sales/Plan.md')).toBe(NODE);
|
|
292
292
|
expect(await read('roles.yaml')).not.toContain('lee@x.io');
|
|
293
293
|
expect(await read('Sales/access.md')).not.toContain('lee@x.io');
|
|
294
|
-
expect(
|
|
294
|
+
expect(versionControl.locks.size).toBe(0);
|
|
295
295
|
} finally {
|
|
296
296
|
canWrite.mockRestore();
|
|
297
297
|
}
|
|
@@ -308,9 +308,9 @@ describe('UserAccessRemovalService', () => {
|
|
|
308
308
|
|
|
309
309
|
// The pre-check only ever narrows the set; with nothing known, attempt
|
|
310
310
|
// them all — the lock gate remains the authority.
|
|
311
|
-
const { service,
|
|
311
|
+
const { service, versionControl } = build();
|
|
312
312
|
const result = await service.remove(ADMIN, LEE, 'deleted-1');
|
|
313
|
-
expect(
|
|
313
|
+
expect(versionControl.commits).toHaveLength(1);
|
|
314
314
|
expect(result.removedFrom.sort()).toEqual(['Sales/Plan.md', 'Sales/access.md', 'groups.yaml', 'roles.yaml']);
|
|
315
315
|
expect(result.stillNamedIn).toEqual([]);
|
|
316
316
|
} finally {
|
|
@@ -330,25 +330,25 @@ describe('UserAccessRemovalService', () => {
|
|
|
330
330
|
});
|
|
331
331
|
|
|
332
332
|
it('refuses the owner and the last Admin, writing nothing', async () => {
|
|
333
|
-
const { service,
|
|
333
|
+
const { service, versionControl } = build(stubVersionControl(), ['Lee@x.io']);
|
|
334
334
|
const report = await service.report(LEE);
|
|
335
335
|
expect(report.removable).toBe(false);
|
|
336
336
|
expect(report.blockedReason).toBe('The owner stays in roles and access rules.');
|
|
337
337
|
await expect(service.remove(ADMIN, LEE, 'deleted-1')).rejects.toMatchObject({ status: 409 });
|
|
338
338
|
|
|
339
|
-
const other = build(
|
|
339
|
+
const other = build(stubVersionControl(), []);
|
|
340
340
|
expect((await other.service.report('admin@x.io')).removable).toBe(true);
|
|
341
341
|
await write(repo, 'roles.yaml', 'roles:\n Admin:\n - lee@x.io\n');
|
|
342
342
|
expect((await other.service.report(LEE)).blockedReason).toMatch(/last Admin/);
|
|
343
343
|
await expect(other.service.remove(ADMIN, LEE, 'deleted-1')).rejects.toMatchObject({ status: 409 });
|
|
344
344
|
|
|
345
|
-
expect(
|
|
346
|
-
expect(other.
|
|
345
|
+
expect(versionControl.commits).toHaveLength(0);
|
|
346
|
+
expect(other.versionControl.commits).toHaveLength(0);
|
|
347
347
|
expect(await read('groups.yaml')).toBe(GROUPS);
|
|
348
348
|
});
|
|
349
349
|
|
|
350
350
|
it('a failed commit restores every file and leaves them naming the user', async () => {
|
|
351
|
-
const { service } = build(
|
|
351
|
+
const { service } = build(stubVersionControl({ failCommit: true }));
|
|
352
352
|
await expect(service.remove(ADMIN, LEE, 'deleted-1')).rejects.toThrow(/push rejected/);
|
|
353
353
|
expect(await read('roles.yaml')).toBe(ROLES);
|
|
354
354
|
expect(await read('Sales/access.md')).toBe(SALES_ACCESS);
|
|
@@ -363,12 +363,12 @@ describe('UserAccessRemovalService', () => {
|
|
|
363
363
|
return { ...result, holes: [...result.holes, 'Secret'] };
|
|
364
364
|
},
|
|
365
365
|
} as unknown as ITreeWalker;
|
|
366
|
-
const { service,
|
|
366
|
+
const { service, versionControl } = build(stubVersionControl(), ['owner@x.io'], holey);
|
|
367
367
|
await expect(service.remove(ADMIN, LEE, 'deleted-1')).rejects.toMatchObject({
|
|
368
368
|
status: 422,
|
|
369
369
|
message: expect.stringMatching(/could not be read \(Secret\)/),
|
|
370
370
|
});
|
|
371
|
-
expect(
|
|
371
|
+
expect(versionControl.commits).toHaveLength(0);
|
|
372
372
|
expect(await read('roles.yaml')).toBe(ROLES);
|
|
373
373
|
});
|
|
374
374
|
|
|
@@ -377,9 +377,9 @@ describe('UserAccessRemovalService', () => {
|
|
|
377
377
|
throw new Error('cache gone');
|
|
378
378
|
});
|
|
379
379
|
try {
|
|
380
|
-
const { service,
|
|
380
|
+
const { service, versionControl } = build();
|
|
381
381
|
const result = await service.remove(ADMIN, LEE, 'deleted-1');
|
|
382
|
-
expect(
|
|
382
|
+
expect(versionControl.commits).toHaveLength(1);
|
|
383
383
|
expect(result.removedFrom.sort()).toEqual(['Sales/Plan.md', 'Sales/access.md', 'groups.yaml', 'roles.yaml']);
|
|
384
384
|
expect(result.stillNamedIn).toEqual([]);
|
|
385
385
|
// The refresh really ran after the commit and really threw.
|
|
@@ -391,9 +391,9 @@ describe('UserAccessRemovalService', () => {
|
|
|
391
391
|
});
|
|
392
392
|
|
|
393
393
|
it('a commit whose push needs resolution is reported as removed, publishing pending', async () => {
|
|
394
|
-
const { service,
|
|
394
|
+
const { service, versionControl } = build(stubVersionControl({ pushNeedsResolution: true }));
|
|
395
395
|
const result = await service.remove(ADMIN, LEE, 'deleted-1');
|
|
396
|
-
expect(
|
|
396
|
+
expect(versionControl.commits).toHaveLength(1);
|
|
397
397
|
expect(result.publishPending).toBe(true);
|
|
398
398
|
expect(result.removedFrom.sort()).toEqual(['Sales/Plan.md', 'Sales/access.md', 'groups.yaml', 'roles.yaml']);
|
|
399
399
|
expect(result.stillNamedIn).toEqual([]);
|
|
@@ -92,6 +92,17 @@ export type PathHolders = { read: HolderList; write: HolderList };
|
|
|
92
92
|
*/
|
|
93
93
|
export type ProspectiveHolders = { before: PathHolders; after: PathHolders };
|
|
94
94
|
|
|
95
|
+
/** One principal that loses or gains one verb in a move. A person is named by their address when they have no display name. */
|
|
96
|
+
export type HolderChange = {
|
|
97
|
+
kind: 'group' | 'role' | 'plugin' | 'person';
|
|
98
|
+
name: string;
|
|
99
|
+
email?: string;
|
|
100
|
+
verb: 'read' | 'write';
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
/** Who loses and who gains opening or editing a file or folder in a move — see {@link IAccessControl.prospectiveHolderChanges}. */
|
|
104
|
+
export type HolderChanges = { lose: HolderChange[]; gain: HolderChange[] };
|
|
105
|
+
|
|
95
106
|
/** One caller's own verdict per access verb on one path. */
|
|
96
107
|
export type PathVerbs = { read: boolean; write: boolean; download: boolean; owner: boolean };
|
|
97
108
|
|
|
@@ -420,6 +431,21 @@ export interface IAccessControl {
|
|
|
420
431
|
toPath: string,
|
|
421
432
|
): Promise<ProspectiveHolders>;
|
|
422
433
|
|
|
434
|
+
/**
|
|
435
|
+
* Who loses and who gains `read` or `write` on one file or folder if a move
|
|
436
|
+
* puts it at `toPath`, over the same relocation as
|
|
437
|
+
* {@link IAccessControl.prospectiveHolders}. A holder on one side loses (or
|
|
438
|
+
* gains) the verb only when it does not hold it on the other side: the
|
|
439
|
+
* lists name grants, so a group no rule names at the destination may still
|
|
440
|
+
* read there through `everyone`, and one a rule denies there may not.
|
|
441
|
+
* Writes nothing and moves nothing.
|
|
442
|
+
*/
|
|
443
|
+
prospectiveHolderChanges(
|
|
444
|
+
workspaceId: string,
|
|
445
|
+
fromPath: string,
|
|
446
|
+
toPath: string,
|
|
447
|
+
): Promise<HolderChanges>;
|
|
448
|
+
|
|
423
449
|
/**
|
|
424
450
|
* The CALLER'S OWN `{ read, write, download, owner }` at `toPath` as they
|
|
425
451
|
* will be once `fromPath` has been moved (`sourceRemains: false`, the
|
|
@@ -8,7 +8,7 @@ const log = logger('access');
|
|
|
8
8
|
import { isAbsence, type ITreeWalker, type WalkListener } from '../../shared/fs.contract.js';
|
|
9
9
|
import { assertOneSpecPerLine, isCommitSha, isGitTimeout, type IGitRunner } from '../../shared/git.contract.js';
|
|
10
10
|
import { hashEmail } from '../../shared/email-identity.js';
|
|
11
|
-
import { NodeGitRunner } from '../
|
|
11
|
+
import { NodeGitRunner } from '../version-control/index.js';
|
|
12
12
|
import { readRevSha } from '../kb-fs/index.js';
|
|
13
13
|
import type { WorkspaceService } from '../workspace/index.js';
|
|
14
14
|
import type {
|
|
@@ -22,6 +22,8 @@ import type {
|
|
|
22
22
|
GrantSources,
|
|
23
23
|
PathHolders,
|
|
24
24
|
PathVerbs,
|
|
25
|
+
HolderChange,
|
|
26
|
+
HolderChanges,
|
|
25
27
|
ProspectiveHolders,
|
|
26
28
|
ResolvedPrincipal,
|
|
27
29
|
} from './access-control.interface.js';
|
|
@@ -1354,6 +1356,70 @@ function eligibleHoldersResolved(
|
|
|
1354
1356
|
return { principals, roles, users };
|
|
1355
1357
|
}
|
|
1356
1358
|
|
|
1359
|
+
/** One side of a move: the access model, the path, and the rules the file carries there. */
|
|
1360
|
+
type MoveSide = { model: AccessModel; path: string; own: OwnEntries | null };
|
|
1361
|
+
|
|
1362
|
+
/** The key set behind one entry of an eligible-holders list, read back from its name and kind. */
|
|
1363
|
+
function keysOfHolder(model: AccessModel, holder: ResolvedPrincipal): ReadonlySet<string> {
|
|
1364
|
+
for (const [canonical, record] of model.roles.byCanonical) {
|
|
1365
|
+
if (record.kind === holder.kind && record.displayName === holder.name) return principalKeysOfToken(model, canonical);
|
|
1366
|
+
}
|
|
1367
|
+
return principalKeysOfToken(model, canonicalRoleName(holder.name));
|
|
1368
|
+
}
|
|
1369
|
+
|
|
1370
|
+
/**
|
|
1371
|
+
* Who loses and who gains `verb` between the two sides of a move. The
|
|
1372
|
+
* candidates are every principal and person a rule on either side names for
|
|
1373
|
+
* the verb, as a grant or as a denial, and every holder either side lists;
|
|
1374
|
+
* each is put to both sides' resolvers as the gates would put it. The holder
|
|
1375
|
+
* lists alone are not enough: they name grants, so they miss a group still
|
|
1376
|
+
* covered by `everyone`, and they cannot show someone whose only access was
|
|
1377
|
+
* `everyone` and whom a rule on the far side denies by name.
|
|
1378
|
+
*/
|
|
1379
|
+
function holderChangesFor(verb: 'read' | 'write', here: MoveSide, there: MoveSide): HolderChanges {
|
|
1380
|
+
const collectives = new Map<string, { holder: ResolvedPrincipal; keys: ReadonlySet<string> }>();
|
|
1381
|
+
const people = new Set<string>();
|
|
1382
|
+
const addCollective = (holder: ResolvedPrincipal, keys: ReadonlySet<string>) => {
|
|
1383
|
+
const id = `${holder.kind}\0${holder.name.toLowerCase()}`;
|
|
1384
|
+
if (!collectives.has(id)) collectives.set(id, { holder, keys });
|
|
1385
|
+
};
|
|
1386
|
+
for (const side of [here, there]) {
|
|
1387
|
+
const held = eligibleHoldersResolved(side.model, verb, side.path, side.own);
|
|
1388
|
+
for (const holder of held.principals) addCollective(holder, keysOfHolder(side.model, holder));
|
|
1389
|
+
for (const user of held.users) people.add(user.email);
|
|
1390
|
+
const { byRole, byEmail } = resolveAtPath(side.model, verb, side.path, side.own);
|
|
1391
|
+
for (const token of byRole.keys()) {
|
|
1392
|
+
const record = side.model.roles.byCanonical.get(token);
|
|
1393
|
+
addCollective(
|
|
1394
|
+
{ name: record ? record.displayName : token, kind: record?.kind ?? 'role' },
|
|
1395
|
+
principalKeysOfToken(side.model, token),
|
|
1396
|
+
);
|
|
1397
|
+
}
|
|
1398
|
+
for (const email of byEmail.keys()) people.add(email);
|
|
1399
|
+
}
|
|
1400
|
+
const lose: HolderChange[] = [];
|
|
1401
|
+
const gain: HolderChange[] = [];
|
|
1402
|
+
const record = (had: boolean, has: boolean, change: HolderChange) => {
|
|
1403
|
+
if (had && !has) lose.push(change);
|
|
1404
|
+
if (!had && has) gain.push(change);
|
|
1405
|
+
};
|
|
1406
|
+
for (const { holder, keys } of collectives.values()) {
|
|
1407
|
+
record(
|
|
1408
|
+
hasPermissionForKeys(here.model, verb, keys, here.path, here.own),
|
|
1409
|
+
hasPermissionForKeys(there.model, verb, keys, there.path, there.own),
|
|
1410
|
+
{ kind: holder.kind, name: holder.name, verb },
|
|
1411
|
+
);
|
|
1412
|
+
}
|
|
1413
|
+
for (const email of [...people].sort()) {
|
|
1414
|
+
record(
|
|
1415
|
+
hasPermissionResolved(here.model, verb, email, here.path, here.own),
|
|
1416
|
+
hasPermissionResolved(there.model, verb, email, there.path, there.own),
|
|
1417
|
+
{ kind: 'person', name: email, email, verb },
|
|
1418
|
+
);
|
|
1419
|
+
}
|
|
1420
|
+
return { lose, gain };
|
|
1421
|
+
}
|
|
1422
|
+
|
|
1357
1423
|
/**
|
|
1358
1424
|
* Every individual the model names: `roles.yaml` members, emails named inline
|
|
1359
1425
|
* at this path's scope, and the deployment owner (bound by every rule that
|
|
@@ -1928,6 +1994,32 @@ export class AccessControlService implements IAccessControl {
|
|
|
1928
1994
|
};
|
|
1929
1995
|
}
|
|
1930
1996
|
|
|
1997
|
+
/** Who loses and who gains `read` or `write` in a move (see the interface). */
|
|
1998
|
+
async prospectiveHolderChanges(
|
|
1999
|
+
workspaceId: string,
|
|
2000
|
+
fromPath: string,
|
|
2001
|
+
toPath: string,
|
|
2002
|
+
): Promise<HolderChanges> {
|
|
2003
|
+
const model = await this.loadModel(workspaceId);
|
|
2004
|
+
const repoDir = await this.repoDir(workspaceId);
|
|
2005
|
+
const { isFolder, ownHere, ownThere, landing } =
|
|
2006
|
+
await this.relocationSubject(repoDir, fromPath, toPath);
|
|
2007
|
+
const here: MoveSide = { model, path: fromPath, own: ownHere };
|
|
2008
|
+
const there: MoveSide = {
|
|
2009
|
+
model: withRelocatedAccessFiles(model, fromPath, toPath, { sourceRemains: false, sourceIsFolder: isFolder, landing }),
|
|
2010
|
+
path: toPath,
|
|
2011
|
+
own: ownThere,
|
|
2012
|
+
};
|
|
2013
|
+
const lose: HolderChange[] = [];
|
|
2014
|
+
const gain: HolderChange[] = [];
|
|
2015
|
+
for (const verb of ['read', 'write'] as const) {
|
|
2016
|
+
const changes = holderChangesFor(verb, here, there);
|
|
2017
|
+
lose.push(...changes.lose);
|
|
2018
|
+
gain.push(...changes.gain);
|
|
2019
|
+
}
|
|
2020
|
+
return { lose, gain };
|
|
2021
|
+
}
|
|
2022
|
+
|
|
1931
2023
|
/**
|
|
1932
2024
|
* The caller's own verbs at `toPath` as they will be once `fromPath` has
|
|
1933
2025
|
* been moved or copied there (see the interface).
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { FileTreeEntry, IWorkspaceService } from '@bevel-software/platform-shared';
|
|
2
|
-
import {
|
|
2
|
+
import { VersionControlDomainError } from '../../shared/domain-errors.js';
|
|
3
3
|
import { accessMdPathForFolder } from './access-mutation.service.js';
|
|
4
4
|
import {
|
|
5
5
|
EVERYONE_CANONICAL,
|
|
@@ -75,7 +75,7 @@ export interface AccessDeclaration {
|
|
|
75
75
|
export const DECLARATION_SCAN_FILE_CAP = 400;
|
|
76
76
|
|
|
77
77
|
/** 400 for a target that is not a folder. */
|
|
78
|
-
export class AccessDeclarationsError extends
|
|
78
|
+
export class AccessDeclarationsError extends VersionControlDomainError {
|
|
79
79
|
constructor(message: string, status = 400) {
|
|
80
80
|
super(message, status);
|
|
81
81
|
this.name = 'AccessDeclarationsError';
|
|
@@ -53,7 +53,7 @@ import {
|
|
|
53
53
|
AccessSpliceError,
|
|
54
54
|
} from '../access-model/index.js';
|
|
55
55
|
import type { Verb, Principal, TokenMatch } from '../access-model/index.js';
|
|
56
|
-
import {
|
|
56
|
+
import { VersionControlDomainError } from '../../shared/domain-errors.js';
|
|
57
57
|
import {
|
|
58
58
|
canCarryFrontmatter,
|
|
59
59
|
FOLDER_GOVERNS_ACCESS_KIND,
|
|
@@ -64,7 +64,7 @@ import {
|
|
|
64
64
|
export type TargetKind = 'folder' | 'file';
|
|
65
65
|
|
|
66
66
|
/** Bad-request-class mutation failure (invalid principal, unknown role/group, lockout). */
|
|
67
|
-
export class AccessMutationError extends
|
|
67
|
+
export class AccessMutationError extends VersionControlDomainError {
|
|
68
68
|
constructor(message: string, status = 400, payload?: Record<string, unknown>) {
|
|
69
69
|
super(message, status, payload);
|
|
70
70
|
this.name = 'AccessMutationError';
|