@bevel-software/platform-core-backend 0.35.0 → 0.37.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/agent-guide/directory-structure.md +1 -1
- package/agent-guide/onboarding.md +111 -0
- package/agent-guide/start-here.md +1 -0
- package/agent-guide/tool-manuals.md +1 -0
- package/dist/core/catalog-cache-invalidation.d.ts +2 -2
- package/dist/core/catalog-cache-invalidation.d.ts.map +1 -1
- package/dist/core/compose-embed.d.ts +2 -2
- package/dist/core/compose-embed.d.ts.map +1 -1
- package/dist/core/compose-embed.js +1 -1
- package/dist/core/compose-embed.js.map +1 -1
- package/dist/core/core-ports.d.ts +19 -4
- package/dist/core/core-ports.d.ts.map +1 -1
- package/dist/core/core-ports.js.map +1 -1
- package/dist/core/create-core-server.d.ts.map +1 -1
- package/dist/core/create-core-server.js +26 -24
- package/dist/core/create-core-server.js.map +1 -1
- package/dist/core/create-core-services.d.ts +19 -13
- package/dist/core/create-core-services.d.ts.map +1 -1
- package/dist/core/create-core-services.js +72 -57
- package/dist/core/create-core-services.js.map +1 -1
- package/dist/core/lifecycle.d.ts +4 -4
- package/dist/core/lifecycle.d.ts.map +1 -1
- package/dist/core/lifecycle.js +5 -5
- package/dist/core/lifecycle.js.map +1 -1
- package/dist/core-config.d.ts +2 -2
- package/dist/core-config.js +3 -3
- package/dist/core-config.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/modules/access/access-control.service.js +1 -1
- package/dist/modules/access/access-control.service.js.map +1 -1
- package/dist/modules/access/access-declarations.d.ts +2 -2
- package/dist/modules/access/access-declarations.d.ts.map +1 -1
- package/dist/modules/access/access-declarations.js +2 -2
- package/dist/modules/access/access-declarations.js.map +1 -1
- package/dist/modules/access/access-mutation.service.d.ts +2 -2
- package/dist/modules/access/access-mutation.service.d.ts.map +1 -1
- package/dist/modules/access/access-mutation.service.js +2 -2
- package/dist/modules/access/access-mutation.service.js.map +1 -1
- package/dist/modules/access/access-requests.routes.d.ts +2 -2
- package/dist/modules/access/access-requests.routes.d.ts.map +1 -1
- package/dist/modules/access/access-requests.routes.js +5 -5
- package/dist/modules/access/access-requests.routes.js.map +1 -1
- package/dist/modules/access/access-requests.service.d.ts +2 -2
- package/dist/modules/access/access-requests.service.d.ts.map +1 -1
- package/dist/modules/access/access-requests.service.js +11 -11
- package/dist/modules/access/access-requests.service.js.map +1 -1
- package/dist/modules/access/access.routes.d.ts +2 -2
- package/dist/modules/access/access.routes.d.ts.map +1 -1
- package/dist/modules/access/access.routes.js +9 -9
- package/dist/modules/access/access.routes.js.map +1 -1
- package/dist/modules/access/admin-locked-commit.d.ts +5 -5
- package/dist/modules/access/admin-locked-commit.d.ts.map +1 -1
- package/dist/modules/access/admin-locked-commit.js +7 -7
- package/dist/modules/access/admin-locked-commit.js.map +1 -1
- package/dist/modules/access/admin-route-helpers.d.ts +1 -1
- package/dist/modules/access/admin-route-helpers.js +5 -5
- package/dist/modules/access/admin-route-helpers.js.map +1 -1
- package/dist/modules/access/change-read-gate.d.ts +1 -1
- package/dist/modules/access/change-read-gate.js +1 -1
- package/dist/modules/access/groups-admin.service.d.ts +7 -7
- package/dist/modules/access/groups-admin.service.d.ts.map +1 -1
- package/dist/modules/access/groups-admin.service.js +6 -6
- package/dist/modules/access/groups-admin.service.js.map +1 -1
- package/dist/modules/access/reference-scan.d.ts +1 -1
- package/dist/modules/access/roles-admin.service.d.ts +7 -7
- package/dist/modules/access/roles-admin.service.d.ts.map +1 -1
- package/dist/modules/access/roles-admin.service.js +8 -8
- package/dist/modules/access/roles-admin.service.js.map +1 -1
- package/dist/modules/access/synced-groups-committer.d.ts +4 -4
- package/dist/modules/access/synced-groups-committer.d.ts.map +1 -1
- package/dist/modules/access/synced-groups-committer.js +7 -7
- package/dist/modules/access/synced-groups-committer.js.map +1 -1
- package/dist/modules/access/user-access-removal.service.d.ts +6 -6
- package/dist/modules/access/user-access-removal.service.d.ts.map +1 -1
- package/dist/modules/access/user-access-removal.service.js +4 -4
- package/dist/modules/access/user-access-removal.service.js.map +1 -1
- package/dist/modules/access-model/access-errors.d.ts +4 -4
- package/dist/modules/access-model/access-errors.d.ts.map +1 -1
- package/dist/modules/access-model/access-errors.js +4 -4
- package/dist/modules/access-model/access-errors.js.map +1 -1
- package/dist/modules/access-model/access-grammar.d.ts +1 -1
- package/dist/modules/access-model/access-grammar.js +4 -4
- package/dist/modules/access-model/change-gate.d.ts +1 -1
- package/dist/modules/access-model/change-gate.js +1 -1
- package/dist/modules/access-model/roles-yaml-guard.d.ts +4 -4
- package/dist/modules/access-model/roles-yaml-guard.d.ts.map +1 -1
- package/dist/modules/access-model/roles-yaml-guard.js +4 -4
- package/dist/modules/access-model/roles-yaml-guard.js.map +1 -1
- package/dist/modules/agent-guide/agent-guide.d.ts +19 -14
- package/dist/modules/agent-guide/agent-guide.d.ts.map +1 -1
- package/dist/modules/agent-guide/agent-guide.js +42 -18
- package/dist/modules/agent-guide/agent-guide.js.map +1 -1
- package/dist/modules/agent-guide/guide-budget.d.ts +5 -2
- package/dist/modules/agent-guide/guide-budget.d.ts.map +1 -1
- package/dist/modules/agent-guide/guide-budget.js +6 -2
- package/dist/modules/agent-guide/guide-budget.js.map +1 -1
- package/dist/modules/agent-instructions/agent-instructions.routes.d.ts +12 -5
- package/dist/modules/agent-instructions/agent-instructions.routes.d.ts.map +1 -1
- package/dist/modules/agent-instructions/agent-instructions.routes.js +13 -6
- package/dist/modules/agent-instructions/agent-instructions.routes.js.map +1 -1
- package/dist/modules/agent-instructions/compose.d.ts +15 -8
- package/dist/modules/agent-instructions/compose.d.ts.map +1 -1
- package/dist/modules/agent-instructions/compose.js +24 -10
- package/dist/modules/agent-instructions/compose.js.map +1 -1
- package/dist/modules/agent-instructions/shared-file-rules.d.ts +14 -6
- package/dist/modules/agent-instructions/shared-file-rules.d.ts.map +1 -1
- package/dist/modules/agent-instructions/shared-file-rules.js +51 -11
- package/dist/modules/agent-instructions/shared-file-rules.js.map +1 -1
- package/dist/modules/auth/account-erasure.service.d.ts +36 -7
- package/dist/modules/auth/account-erasure.service.d.ts.map +1 -1
- package/dist/modules/auth/account-erasure.service.js +30 -10
- package/dist/modules/auth/account-erasure.service.js.map +1 -1
- package/dist/modules/auth/account-hooks.d.ts +20 -0
- package/dist/modules/auth/account-hooks.d.ts.map +1 -1
- package/dist/modules/auth/account-hooks.js +10 -0
- package/dist/modules/auth/account-hooks.js.map +1 -1
- package/dist/modules/auth/account-switch-lock.js +2 -2
- package/dist/modules/auth/account-switch-lock.js.map +1 -1
- package/dist/modules/auth/account.routes.d.ts +7 -2
- package/dist/modules/auth/account.routes.d.ts.map +1 -1
- package/dist/modules/auth/account.routes.js +23 -4
- package/dist/modules/auth/account.routes.js.map +1 -1
- package/dist/modules/auth/auth.service.d.ts +1 -1
- package/dist/modules/auth/auth.service.js +4 -4
- package/dist/modules/auth/auth.service.js.map +1 -1
- package/dist/modules/auth/index.d.ts +1 -0
- package/dist/modules/auth/index.d.ts.map +1 -1
- package/dist/modules/database/connection.d.ts.map +1 -1
- package/dist/modules/database/connection.js +11 -0
- package/dist/modules/database/connection.js.map +1 -1
- package/dist/modules/database/core-schema.js +2 -2
- package/dist/modules/database/core-schema.js.map +1 -1
- package/dist/modules/diff/diff.routes.d.ts +3 -3
- package/dist/modules/diff/diff.routes.d.ts.map +1 -1
- package/dist/modules/diff/diff.routes.js +7 -7
- package/dist/modules/diff/diff.routes.js.map +1 -1
- package/dist/modules/embed/embed.routes.js +1 -1
- package/dist/modules/embed/embed.routes.js.map +1 -1
- package/dist/modules/embed/embed.service.d.ts +4 -4
- package/dist/modules/embed/embed.service.d.ts.map +1 -1
- package/dist/modules/embed/embed.service.js +18 -18
- package/dist/modules/embed/embed.service.js.map +1 -1
- package/dist/modules/kb-fs/branch-name.js +8 -8
- package/dist/modules/kb-fs/branch-name.js.map +1 -1
- package/dist/modules/kb-fs/file-change-notifier.d.ts +51 -26
- package/dist/modules/kb-fs/file-change-notifier.d.ts.map +1 -1
- package/dist/modules/kb-fs/file-change-notifier.js +6 -8
- package/dist/modules/kb-fs/file-change-notifier.js.map +1 -1
- package/dist/modules/kb-fs/locking-filesystem.d.ts +9 -16
- package/dist/modules/kb-fs/locking-filesystem.d.ts.map +1 -1
- package/dist/modules/kb-fs/locking-filesystem.js +31 -39
- package/dist/modules/kb-fs/locking-filesystem.js.map +1 -1
- package/dist/modules/kb-fs/repo-path.js +5 -5
- package/dist/modules/kb-fs/repo-path.js.map +1 -1
- package/dist/modules/kb-fs/tmp-ref.d.ts +2 -2
- package/dist/modules/kb-fs/tmp-ref.d.ts.map +1 -1
- package/dist/modules/kb-fs/tmp-ref.js +2 -2
- package/dist/modules/kb-fs/tmp-ref.js.map +1 -1
- package/dist/modules/kb-sync/index.d.ts +1 -1
- package/dist/modules/kb-sync/index.d.ts.map +1 -1
- package/dist/modules/kb-sync/kb-sync.interface.d.ts +3 -3
- package/dist/modules/kb-sync/kb-sync.interface.d.ts.map +1 -1
- package/dist/modules/kb-sync/kb-sync.service.d.ts +3 -3
- package/dist/modules/kb-sync/kb-sync.service.d.ts.map +1 -1
- package/dist/modules/kb-sync/kb-sync.service.js +10 -10
- package/dist/modules/kb-sync/kb-sync.service.js.map +1 -1
- package/dist/modules/mcp/mcp.service.d.ts +11 -4
- package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
- package/dist/modules/mcp/mcp.service.js +75 -19
- package/dist/modules/mcp/mcp.service.js.map +1 -1
- package/dist/modules/onboarding/onboarding.contract.d.ts +1 -1
- package/dist/modules/onboarding/onboarding.routes.js +2 -2
- package/dist/modules/onboarding/onboarding.routes.js.map +1 -1
- package/dist/modules/onboarding/starter-pack.service.d.ts +5 -7
- package/dist/modules/onboarding/starter-pack.service.d.ts.map +1 -1
- package/dist/modules/onboarding/starter-pack.service.js +4 -4
- package/dist/modules/onboarding/starter-pack.service.js.map +1 -1
- package/dist/modules/plugins/join-request-jobs.service.d.ts +2 -2
- package/dist/modules/plugins/join-request-jobs.service.d.ts.map +1 -1
- package/dist/modules/plugins/join-request-jobs.service.js +7 -7
- package/dist/modules/plugins/join-request-jobs.service.js.map +1 -1
- package/dist/modules/plugins/join-requests.service.d.ts +3 -3
- package/dist/modules/plugins/join-requests.service.d.ts.map +1 -1
- package/dist/modules/plugins/join-requests.service.js +5 -5
- package/dist/modules/plugins/join-requests.service.js.map +1 -1
- package/dist/modules/plugins/plugin-rename.service.js +1 -1
- package/dist/modules/plugins/plugin-rename.service.js.map +1 -1
- package/dist/modules/plugins/plugins.routes.d.ts +2 -2
- package/dist/modules/plugins/plugins.routes.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.routes.js +8 -8
- package/dist/modules/plugins/plugins.routes.js.map +1 -1
- package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts +77 -2
- package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts.map +1 -1
- package/dist/modules/secrets-vault/db-secrets-vault.service.js +479 -53
- package/dist/modules/secrets-vault/db-secrets-vault.service.js.map +1 -1
- package/dist/modules/secrets-vault/index.d.ts +2 -1
- package/dist/modules/secrets-vault/index.d.ts.map +1 -1
- package/dist/modules/secrets-vault/index.js +1 -0
- package/dist/modules/secrets-vault/index.js.map +1 -1
- package/dist/modules/secrets-vault/managed-sign-in-erasure.d.ts +36 -0
- package/dist/modules/secrets-vault/managed-sign-in-erasure.d.ts.map +1 -0
- package/dist/modules/secrets-vault/managed-sign-in-erasure.js +37 -0
- package/dist/modules/secrets-vault/managed-sign-in-erasure.js.map +1 -0
- package/dist/modules/secrets-vault/secrets-vault.contract.d.ts +152 -0
- package/dist/modules/secrets-vault/secrets-vault.contract.d.ts.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.contract.js.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.routes.d.ts +7 -1
- package/dist/modules/secrets-vault/secrets-vault.routes.d.ts.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.routes.js +125 -10
- package/dist/modules/secrets-vault/secrets-vault.routes.js.map +1 -1
- package/dist/modules/settings/connection-check.js +1 -1
- package/dist/modules/settings/connection-check.js.map +1 -1
- package/dist/modules/settings/deployment-settings.service.js +1 -1
- package/dist/modules/settings/git-root-folders.js +1 -1
- package/dist/modules/settings/git-root-folders.js.map +1 -1
- package/dist/modules/settings/setup.routes.d.ts +1 -1
- package/dist/modules/settings/setup.routes.js +1 -1
- package/dist/modules/skills/pending-skills.service.d.ts +3 -3
- package/dist/modules/skills/pending-skills.service.d.ts.map +1 -1
- package/dist/modules/skills/pending-skills.service.js +4 -4
- package/dist/modules/skills/pending-skills.service.js.map +1 -1
- package/dist/modules/skills/skill-access-requests.routes.d.ts +2 -2
- package/dist/modules/skills/skill-access-requests.routes.d.ts.map +1 -1
- package/dist/modules/skills/skill-access-requests.routes.js +5 -5
- package/dist/modules/skills/skill-access-requests.routes.js.map +1 -1
- package/dist/modules/tool-helpers/tool-context.d.ts +4 -4
- package/dist/modules/tool-helpers/tool-context.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool-context.js +2 -2
- package/dist/modules/tool-helpers/tool-context.js.map +1 -1
- package/dist/modules/tool-helpers/tool-handler.js +2 -2
- package/dist/modules/tool-helpers/tool-handler.js.map +1 -1
- package/dist/modules/tool-helpers/tool.contract.d.ts +4 -4
- package/dist/modules/tool-helpers/tool.contract.d.ts.map +1 -1
- package/dist/modules/tool-manuals/mcp-server-edit.service.js +1 -1
- package/dist/modules/tool-manuals/mcp-server-edit.service.js.map +1 -1
- package/dist/modules/tool-manuals/pending-tools.service.d.ts +3 -3
- package/dist/modules/tool-manuals/pending-tools.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/pending-tools.service.js +4 -4
- package/dist/modules/tool-manuals/pending-tools.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-delete.service.js +1 -1
- package/dist/modules/tool-manuals/tool-delete.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.contract.d.ts +43 -3
- package/dist/modules/tool-manuals/tool-manuals.contract.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts +6 -0
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.js +51 -5
- package/dist/modules/tool-manuals/tool-manuals.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts +3 -0
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.js +36 -15
- package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -1
- package/dist/modules/version-control/agent-tools/change-request-read-shape.d.ts.map +1 -0
- package/dist/modules/version-control/agent-tools/change-request-read-shape.js.map +1 -0
- package/dist/modules/version-control/agent-tools/change-request-read.tools.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/agent-tools/change-request-read.tools.js +2 -2
- package/dist/modules/version-control/agent-tools/change-request-read.tools.js.map +1 -0
- package/dist/modules/version-control/agent-tools/change-request-summary.d.ts.map +1 -0
- package/dist/modules/version-control/agent-tools/change-request-summary.js.map +1 -0
- package/dist/modules/{workflow/agent-tools/workflow.tools.d.ts → version-control/agent-tools/version-control.tools.d.ts} +4 -4
- package/dist/modules/version-control/agent-tools/version-control.tools.d.ts.map +1 -0
- package/dist/modules/{workflow/agent-tools/workflow.tools.js → version-control/agent-tools/version-control.tools.js} +31 -31
- package/dist/modules/version-control/agent-tools/version-control.tools.js.map +1 -0
- package/dist/modules/{workflow → version-control}/change-request-hooks.d.ts +1 -1
- package/dist/modules/version-control/change-request-hooks.d.ts.map +1 -0
- package/dist/modules/version-control/change-request-hooks.js.map +1 -0
- package/dist/modules/version-control/change-request-review/approval-lock.d.ts.map +1 -0
- package/dist/modules/version-control/change-request-review/approval-lock.js.map +1 -0
- package/dist/modules/{workflow/review-workflow/review-workflow.interface.d.ts → version-control/change-request-review/change-request-review.interface.d.ts} +2 -2
- package/dist/modules/version-control/change-request-review/change-request-review.interface.d.ts.map +1 -0
- package/dist/modules/version-control/change-request-review/change-request-review.interface.js +2 -0
- package/dist/modules/version-control/change-request-review/change-request-review.interface.js.map +1 -0
- package/dist/modules/{workflow/review-workflow/review-workflow.service.d.ts → version-control/change-request-review/change-request-review.service.d.ts} +3 -3
- package/dist/modules/version-control/change-request-review/change-request-review.service.d.ts.map +1 -0
- package/dist/modules/{workflow/review-workflow/review-workflow.service.js → version-control/change-request-review/change-request-review.service.js} +26 -26
- package/dist/modules/version-control/change-request-review/change-request-review.service.js.map +1 -0
- package/dist/modules/{workflow → version-control}/event-bus.d.ts +8 -8
- package/dist/modules/version-control/event-bus.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/event-bus.js +4 -4
- package/dist/modules/version-control/event-bus.js.map +1 -0
- package/dist/modules/{workflow → version-control}/events-delivery.d.ts +4 -4
- package/dist/modules/version-control/events-delivery.d.ts.map +1 -0
- package/dist/modules/version-control/events-delivery.js.map +1 -0
- package/dist/modules/{workflow → version-control}/events.routes.d.ts +4 -4
- package/dist/modules/version-control/events.routes.d.ts.map +1 -0
- package/dist/modules/version-control/events.routes.js.map +1 -0
- package/dist/modules/{workflow → version-control}/file-lock.service.d.ts +2 -2
- package/dist/modules/version-control/file-lock.service.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/file-lock.service.js +6 -6
- package/dist/modules/version-control/file-lock.service.js.map +1 -0
- package/dist/modules/version-control/git/change-request-link.d.ts.map +1 -0
- package/dist/modules/version-control/git/change-request-link.js.map +1 -0
- package/dist/modules/version-control/git/git-version.d.ts.map +1 -0
- package/dist/modules/version-control/git/git-version.js.map +1 -0
- package/dist/modules/{workflow → version-control}/git/git.service.d.ts +26 -8
- package/dist/modules/version-control/git/git.service.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/git/git.service.js +106 -55
- package/dist/modules/version-control/git/git.service.js.map +1 -0
- package/dist/modules/version-control/git/merge-commit.d.ts.map +1 -0
- package/dist/modules/version-control/git/merge-commit.js.map +1 -0
- package/dist/modules/version-control/git/node-git-runner.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/git/node-git-runner.js +1 -1
- package/dist/modules/version-control/git/node-git-runner.js.map +1 -0
- package/dist/modules/{workflow → version-control}/git/pull-request.service.d.ts +5 -5
- package/dist/modules/version-control/git/pull-request.service.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/git/pull-request.service.js +10 -10
- package/dist/modules/version-control/git/pull-request.service.js.map +1 -0
- package/dist/modules/{workflow → version-control}/index.d.ts +6 -5
- package/dist/modules/version-control/index.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/index.js +3 -2
- package/dist/modules/version-control/index.js.map +1 -0
- package/dist/modules/{workflow → version-control}/pending-commits.service.d.ts +2 -2
- package/dist/modules/version-control/pending-commits.service.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/pending-commits.service.js +2 -2
- package/dist/modules/version-control/pending-commits.service.js.map +1 -0
- package/dist/modules/{workflow → version-control}/pending-commits.worker.d.ts +5 -5
- package/dist/modules/version-control/pending-commits.worker.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/pending-commits.worker.js +3 -3
- package/dist/modules/version-control/pending-commits.worker.js.map +1 -0
- package/dist/modules/{workflow → version-control}/read-on-branch.d.ts +2 -2
- package/dist/modules/version-control/read-on-branch.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/read-on-branch.js +2 -2
- package/dist/modules/version-control/read-on-branch.js.map +1 -0
- package/dist/modules/version-control/recovery-bot.d.ts.map +1 -0
- package/dist/modules/version-control/recovery-bot.js.map +1 -0
- package/dist/modules/version-control/sanitize-error.d.ts.map +1 -0
- package/dist/modules/version-control/sanitize-error.js.map +1 -0
- package/dist/modules/{workflow/workflow-hooks.d.ts → version-control/version-control-hooks.d.ts} +33 -6
- package/dist/modules/version-control/version-control-hooks.d.ts.map +1 -0
- package/dist/modules/{workflow/workflow-hooks.js → version-control/version-control-hooks.js} +20 -3
- package/dist/modules/version-control/version-control-hooks.js.map +1 -0
- package/dist/modules/{workflow/workflow.routes.d.ts → version-control/version-control.routes.d.ts} +6 -5
- package/dist/modules/version-control/version-control.routes.d.ts.map +1 -0
- package/dist/modules/{workflow/workflow.routes.js → version-control/version-control.routes.js} +61 -60
- package/dist/modules/version-control/version-control.routes.js.map +1 -0
- package/dist/modules/{workflow/workflow.service.d.ts → version-control/version-control.service.d.ts} +26 -46
- package/dist/modules/version-control/version-control.service.d.ts.map +1 -0
- package/dist/modules/{workflow/workflow.service.js → version-control/version-control.service.js} +93 -107
- package/dist/modules/version-control/version-control.service.js.map +1 -0
- package/dist/modules/workspace/agent-access.gate.d.ts +5 -5
- package/dist/modules/workspace/agent-access.gate.d.ts.map +1 -1
- package/dist/modules/workspace/agent-access.gate.js +1 -1
- package/dist/modules/workspace/git-internals.middleware.d.ts +1 -1
- package/dist/modules/workspace/git-internals.middleware.js +2 -2
- package/dist/modules/workspace/kb-repository.js +1 -1
- package/dist/modules/workspace/kb-repository.js.map +1 -1
- package/dist/modules/workspace/startup/kb-git.d.ts +1 -1
- package/dist/modules/workspace/startup/kb-git.d.ts.map +1 -1
- package/dist/modules/workspace/startup/kb-git.js +1 -1
- package/dist/modules/workspace/startup/kb-git.js.map +1 -1
- package/dist/modules/workspace/startup/steps/seed-tree.d.ts +2 -2
- package/dist/modules/workspace/startup/steps/seed-tree.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/seed-tree.js +1 -1
- package/dist/modules/workspace/startup/steps/seed-tree.js.map +1 -1
- package/dist/modules/workspace/startup/steps/template-files.step.d.ts +2 -2
- package/dist/modules/workspace/startup/steps/template-files.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/template-files.step.js +2 -2
- package/dist/modules/workspace/startup/steps/template-files.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/template-source.d.ts +17 -4
- package/dist/modules/workspace/startup/steps/template-source.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/template-source.js +8 -5
- package/dist/modules/workspace/startup/steps/template-source.js.map +1 -1
- package/dist/modules/workspace/workspace-tmp.js +3 -3
- package/dist/modules/workspace/workspace-tmp.js.map +1 -1
- package/dist/modules/workspace/workspace.routes.d.ts +4 -4
- package/dist/modules/workspace/workspace.routes.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.routes.js +22 -22
- package/dist/modules/workspace/workspace.routes.js.map +1 -1
- package/dist/modules/workspace/workspace.service.d.ts +6 -6
- package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.service.js +11 -11
- package/dist/modules/workspace/workspace.service.js.map +1 -1
- package/dist/modules/workspace/workspace.tools.d.ts +2 -1
- package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.tools.js +15 -10
- package/dist/modules/workspace/workspace.tools.js.map +1 -1
- package/dist/shared/canonical-file-identity.d.ts +2 -2
- package/dist/shared/canonical-file-identity.js +5 -5
- package/dist/shared/canonical-file-identity.js.map +1 -1
- package/dist/shared/domain-errors.d.ts +39 -39
- package/dist/shared/domain-errors.d.ts.map +1 -1
- package/dist/shared/domain-errors.js +44 -44
- package/dist/shared/domain-errors.js.map +1 -1
- package/dist/shared/fire-and-forget.d.ts +14 -0
- package/dist/shared/fire-and-forget.d.ts.map +1 -0
- package/dist/shared/fire-and-forget.js +23 -0
- package/dist/shared/fire-and-forget.js.map +1 -0
- package/dist/shared/git.contract.d.ts +1 -1
- package/dist/shared/git.contract.js +1 -1
- package/dist/shared/http-errors.d.ts +3 -3
- package/dist/shared/http-errors.d.ts.map +1 -1
- package/dist/shared/http-errors.js +1 -1
- package/dist/shared/http-errors.js.map +1 -1
- package/dist/shared/pending-proposals.d.ts +3 -3
- package/dist/shared/pending-proposals.d.ts.map +1 -1
- package/dist/shared/pending-proposals.js +2 -2
- package/dist/shared/pending-proposals.js.map +1 -1
- package/dist/tenancy/static-tenant-source.js +1 -1
- package/dist/tenancy/static-tenant-source.js.map +1 -1
- package/migrations/0012_agent_audit.sql +40 -40
- package/migrations/0013_agent_identity_and_key_soft_delete.sql +29 -29
- package/migrations/meta/0012_snapshot.json +2246 -2246
- package/migrations/meta/0013_snapshot.json +2258 -2258
- package/package.json +4 -4
- package/src/__tests__/account-admin.ts +27 -0
- package/src/__tests__/capturing-logger.ts +36 -0
- package/src/__tests__/hexis-catalog.ts +4 -4
- package/src/__tests__/kb-context.ts +30 -30
- package/src/__tests__/kb-layout-config.test.ts +21 -0
- package/src/__tests__/open-change-gate.ts +1 -1
- package/src/__tests__/real-access.ts +16 -0
- package/src/__tests__/real-auth.ts +13 -0
- package/src/__tests__/real-readers.ts +27 -0
- package/src/__tests__/real-version-control.ts +22 -0
- package/src/__tests__/tool-handler.ts +15 -0
- package/src/__tests__/tool-wiring.ts +10 -4
- package/src/__tests__/workspace-service.ts +1 -1
- package/src/core/__tests__/catalog-cache-invalidation.test.ts +3 -3
- package/src/core/__tests__/commit-announcements-wired-once.test.ts +53 -0
- package/src/core/__tests__/compose-embed.test.ts +1 -1
- package/src/core/__tests__/damaged-document.tools.test.ts +3 -3
- package/src/core/__tests__/erasure-slices-wired-once.test.ts +46 -0
- package/src/core/__tests__/gated-boot.test.ts +2 -2
- package/src/core/__tests__/lifecycle.test.ts +9 -9
- package/src/core/catalog-cache-invalidation.ts +2 -2
- package/src/core/compose-embed.ts +3 -3
- package/src/core/core-ports.ts +19 -4
- package/src/core/create-core-server.ts +39 -25
- package/src/core/create-core-services.ts +83 -65
- package/src/core/lifecycle.ts +9 -9
- package/src/core-config.ts +3 -3
- package/src/index.ts +5 -5
- package/src/modules/access/__tests__/access-control.admin-root-floor.test.ts +4 -4
- package/src/modules/access/__tests__/access-own-read-grant.test.ts +14 -14
- package/src/modules/access/__tests__/access-requests.routes.test.ts +23 -23
- package/src/modules/access/__tests__/access.routes.admins.test.ts +4 -4
- package/src/modules/access/__tests__/access.routes.batch.test.ts +4 -4
- package/src/modules/access/__tests__/access.routes.folder-governs.test.ts +6 -6
- package/src/modules/access/__tests__/access.routes.group-grant.test.ts +6 -6
- package/src/modules/access/__tests__/access.routes.overrides.test.ts +5 -5
- package/src/modules/access/__tests__/access.routes.proposal-branch.test.ts +6 -6
- package/src/modules/access/__tests__/access.routes.prospective.test.ts +3 -3
- package/src/modules/access/__tests__/access.routes.revoke.test.ts +6 -6
- package/src/modules/access/__tests__/access.routes.unknown-email.test.ts +6 -6
- package/src/modules/access/__tests__/admin-locked-commit.test.ts +6 -6
- package/src/modules/access/__tests__/admin-route-helpers.test.ts +5 -5
- package/src/modules/access/__tests__/groups-admin.service.test.ts +44 -44
- package/src/modules/access/__tests__/roles-admin.security.test.ts +14 -13
- package/src/modules/access/__tests__/roles-admin.service.test.ts +34 -34
- package/src/modules/access/__tests__/roles-capabilities.test.ts +29 -29
- package/src/modules/access/__tests__/roles.routes.test.ts +11 -11
- package/src/modules/access/__tests__/synced-groups-committer.test.ts +14 -14
- package/src/modules/access/__tests__/user-access-removal.service.test.ts +33 -33
- package/src/modules/access/access-control.service.ts +1 -1
- package/src/modules/access/access-declarations.ts +2 -2
- package/src/modules/access/access-mutation.service.ts +2 -2
- package/src/modules/access/access-requests.routes.ts +7 -7
- package/src/modules/access/access-requests.service.ts +13 -13
- package/src/modules/access/access.routes.ts +11 -11
- package/src/modules/access/admin-locked-commit.ts +11 -11
- package/src/modules/access/admin-route-helpers.ts +5 -5
- package/src/modules/access/change-read-gate.ts +1 -1
- package/src/modules/access/groups-admin.service.ts +7 -7
- package/src/modules/access/reference-scan.ts +1 -1
- package/src/modules/access/roles-admin.service.ts +9 -9
- package/src/modules/access/synced-groups-committer.ts +11 -11
- package/src/modules/access/user-access-removal.service.ts +7 -7
- package/src/modules/access-model/__tests__/access-grammar.test.ts +2 -2
- package/src/modules/access-model/access-errors.ts +4 -4
- package/src/modules/access-model/access-grammar.ts +4 -4
- package/src/modules/access-model/change-gate.ts +1 -1
- package/src/modules/access-model/roles-yaml-guard.ts +4 -4
- package/src/modules/agent-guide/__tests__/agent-guide.test.ts +19 -4
- package/src/modules/agent-guide/__tests__/agent-guide.tools.test.ts +1 -1
- package/src/modules/agent-guide/__tests__/guide-matches-code.test.ts +2 -2
- package/src/modules/agent-guide/agent-guide.ts +48 -22
- package/src/modules/agent-guide/guide-budget.ts +6 -2
- package/src/modules/agent-instructions/__tests__/agent-instructions.route.test.ts +4 -5
- package/src/modules/agent-instructions/__tests__/compose.test.ts +1 -1
- package/src/modules/agent-instructions/__tests__/shared-file-rules.test.ts +113 -7
- package/src/modules/agent-instructions/agent-instructions.routes.ts +12 -5
- package/src/modules/agent-instructions/compose.ts +24 -9
- package/src/modules/agent-instructions/shared-file-rules.ts +53 -11
- package/src/modules/agent-scope/__tests__/agent-surfaces.connect-as.test.ts +1 -1
- package/src/modules/audit/__tests__/agent-rest-audit.middleware.test.ts +113 -113
- package/src/modules/audit/__tests__/event-classifier.test.ts +121 -121
- package/src/modules/audit/event-classifier.ts +155 -155
- package/src/modules/auth/__tests__/account-deactivation.test.ts +1 -1
- package/src/modules/auth/__tests__/account-erasure.approval-gate.test.ts +4 -4
- package/src/modules/auth/__tests__/account-erasure.participants.test.ts +56 -0
- package/src/modules/auth/__tests__/account-switch-lock.pg.test.ts +2 -2
- package/src/modules/auth/__tests__/account-switch-lock.test.ts +2 -2
- package/src/modules/auth/__tests__/account.routes.test.ts +73 -11
- package/src/modules/auth/__tests__/auth.service.test.ts +1 -1
- package/src/modules/auth/account-erasure.service.ts +27 -9
- package/src/modules/auth/account-hooks.ts +34 -0
- package/src/modules/auth/account-switch-lock.ts +2 -2
- package/src/modules/auth/account.routes.ts +23 -5
- package/src/modules/auth/auth.service.ts +4 -4
- package/src/modules/auth/index.ts +1 -0
- package/src/modules/database/__tests__/advisory-lock.test.ts +169 -169
- package/src/modules/database/__tests__/connection.pg.test.ts +55 -0
- package/src/modules/database/__tests__/connection.test.ts +30 -0
- package/src/modules/database/__tests__/migrations-unqualified.test.ts +32 -32
- package/src/modules/database/connection.ts +12 -0
- package/src/modules/database/core-schema.ts +2 -2
- package/src/modules/diff/__tests__/diff.routes.read-gate.test.ts +2 -2
- package/src/modules/diff/__tests__/diff.routes.rejectPathsLocked.test.ts +12 -12
- package/src/modules/diff/diff.routes.ts +8 -8
- package/src/modules/embed/__tests__/embed.service.lock.test.ts +7 -7
- package/src/modules/embed/__tests__/embed.service.test.ts +48 -62
- package/src/modules/embed/__tests__/embed.tools.test.ts +1 -1
- package/src/modules/embed/embed.routes.ts +1 -1
- package/src/modules/embed/embed.service.ts +17 -17
- package/src/modules/kb-fs/__tests__/branch-name.test.ts +2 -2
- package/src/modules/kb-fs/__tests__/file-change-notifier.test.ts +23 -4
- package/src/modules/kb-fs/__tests__/locking-filesystem.test.ts +264 -305
- package/src/modules/kb-fs/__tests__/move-with-edits.test.ts +103 -40
- package/src/modules/kb-fs/__tests__/repo-path.test.ts +8 -8
- package/src/modules/kb-fs/branch-name.ts +8 -8
- package/src/modules/kb-fs/file-change-notifier.ts +55 -32
- package/src/modules/kb-fs/locking-filesystem.ts +34 -48
- package/src/modules/kb-fs/repo-path.ts +5 -5
- package/src/modules/kb-fs/tmp-ref.ts +3 -3
- package/src/modules/kb-sync/__tests__/kb-sync.service.test.ts +36 -36
- package/src/modules/kb-sync/index.ts +1 -1
- package/src/modules/kb-sync/kb-sync.interface.ts +3 -3
- package/src/modules/kb-sync/kb-sync.service.ts +9 -9
- package/src/modules/marketplace/__tests__/github-facade.test.ts +1 -1
- package/src/modules/marketplace/__tests__/marketplace-git.test.ts +1 -1
- package/src/modules/mcp/__tests__/mcp-proxy-helpers.test.ts +4 -2
- package/src/modules/mcp/__tests__/mcp.e2e.test.ts +69 -8
- package/src/modules/mcp/__tests__/mcp.service.test.ts +91 -13
- package/src/modules/mcp/__tests__/read-only-hint.pg.test.ts +194 -0
- package/src/modules/mcp/mcp.service.ts +89 -28
- package/src/modules/onboarding/__tests__/starter-pack.service.test.ts +59 -59
- package/src/modules/onboarding/onboarding.contract.ts +1 -1
- package/src/modules/onboarding/onboarding.routes.ts +2 -2
- package/src/modules/onboarding/starter-pack.service.ts +7 -9
- package/src/modules/plugins/__tests__/bundle-dialect.e2e.test.ts +1 -1
- package/src/modules/plugins/__tests__/compile-marketplace.test.ts +1 -1
- package/src/modules/plugins/__tests__/join-request-jobs.service.test.ts +43 -43
- package/src/modules/plugins/__tests__/join-requests.service.test.ts +19 -19
- package/src/modules/plugins/__tests__/join-requests.settlement.test.ts +26 -26
- package/src/modules/plugins/__tests__/plugin-rename.service.test.ts +46 -21
- package/src/modules/plugins/__tests__/plugins.routes.test.ts +31 -31
- package/src/modules/plugins/join-request-jobs.service.ts +10 -10
- package/src/modules/plugins/join-requests.service.ts +4 -4
- package/src/modules/plugins/plugin-rename.service.ts +1 -1
- package/src/modules/plugins/plugins.routes.ts +9 -9
- package/src/modules/secrets-vault/__tests__/db-secrets-vault.managed.test.ts +773 -0
- package/src/modules/secrets-vault/__tests__/db-secrets-vault.oauth.test.ts +28 -1
- package/src/modules/secrets-vault/__tests__/managed-sign-in.route.test.ts +351 -0
- package/src/modules/secrets-vault/db-secrets-vault.service.ts +562 -95
- package/src/modules/secrets-vault/index.ts +7 -0
- package/src/modules/secrets-vault/managed-sign-in-erasure.ts +41 -0
- package/src/modules/secrets-vault/secrets-variable-loader.ts +134 -134
- package/src/modules/secrets-vault/secrets-vault.contract.ts +152 -0
- package/src/modules/secrets-vault/secrets-vault.routes.ts +157 -10
- package/src/modules/settings/__tests__/repository-source.test.ts +1 -1
- package/src/modules/settings/__tests__/setup.routes.layout-phase.test.ts +1 -1
- package/src/modules/settings/__tests__/setup.routes.managed-phase.test.ts +1 -1
- package/src/modules/settings/connection-check.ts +1 -1
- package/src/modules/settings/deployment-settings.service.ts +1 -1
- package/src/modules/settings/git-root-folders.ts +1 -1
- package/src/modules/settings/setup.routes.ts +1 -1
- package/src/modules/skills/__tests__/allowed-tools-warn.tools.test.ts +3 -3
- package/src/modules/skills/__tests__/branch-skills.tools.test.ts +1 -1
- package/src/modules/skills/__tests__/pending-skills.service.test.ts +8 -8
- package/src/modules/skills/__tests__/skill-access-requests.routes.test.ts +18 -18
- package/src/modules/skills/__tests__/skills.service.test.ts +3 -3
- package/src/modules/skills/pending-skills.service.ts +3 -3
- package/src/modules/skills/skill-access-requests.routes.ts +7 -7
- package/src/modules/tool-helpers/__tests__/agent-roles-write.test.ts +4 -4
- package/src/modules/tool-helpers/__tests__/branch-declaration.test.ts +3 -3
- package/src/modules/tool-helpers/__tests__/can-write.tools.test.ts +3 -3
- package/src/modules/tool-helpers/__tests__/phase4-tools.test.ts +4 -4
- package/src/modules/tool-helpers/__tests__/tools-surface.test.ts +3 -3
- package/src/modules/tool-helpers/__tests__/validate-token.test.ts +1 -1
- package/src/modules/tool-helpers/tool-context.ts +6 -6
- package/src/modules/tool-helpers/tool-handler.ts +2 -2
- package/src/modules/tool-helpers/tool.contract.ts +4 -4
- package/src/modules/tool-manuals/__tests__/pending-tools.service.test.ts +9 -9
- package/src/modules/tool-manuals/__tests__/tool-manuals.managed-sign-in.test.ts +89 -0
- package/src/modules/tool-manuals/__tests__/tool-manuals.restart.test.ts +1 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.tools.test.ts +36 -1
- package/src/modules/tool-manuals/mcp-server-edit.service.ts +1 -1
- package/src/modules/tool-manuals/pending-tools.service.ts +3 -3
- package/src/modules/tool-manuals/tool-delete.service.ts +1 -1
- package/src/modules/tool-manuals/tool-manuals.contract.ts +41 -3
- package/src/modules/tool-manuals/tool-manuals.service.ts +53 -5
- package/src/modules/tool-manuals/tool-manuals.tools.ts +41 -15
- package/src/modules/tool-registry/__tests__/own-tool-schemas.test.ts +4 -4
- package/src/modules/tool-registry/__tests__/read-only-hints.test.ts +3 -3
- package/src/modules/tool-registry/__tests__/tool-description-length.test.ts +6 -6
- package/src/modules/{workflow → version-control}/__tests__/apply-failure.test.ts +54 -54
- package/src/modules/{workflow → version-control}/__tests__/event-bus.test.ts +27 -27
- package/src/modules/{workflow → version-control}/__tests__/events-delivery.test.ts +37 -37
- package/src/modules/{workflow → version-control}/__tests__/file-lock.service.deletion-gate.test.ts +2 -2
- package/src/modules/{workflow → version-control}/__tests__/file-lock.service.path-identity.test.ts +8 -8
- package/src/modules/{workflow → version-control}/__tests__/merge-announces-tree.test.ts +11 -11
- package/src/modules/{workflow → version-control}/__tests__/pending-commits.worker.concurrency.test.ts +9 -9
- package/src/modules/{workflow → version-control}/__tests__/pending-commits.worker.test.ts +25 -25
- package/src/modules/{workflow → version-control}/__tests__/preserve-roles-yaml.test.ts +42 -42
- package/src/modules/version-control/__tests__/public-surface.test.ts +114 -0
- package/src/modules/{workflow/__tests__/workflow.routes.folder-proposals.test.ts → version-control/__tests__/version-control.routes.folder-proposals.test.ts} +18 -18
- package/src/modules/{workflow/__tests__/workflow.routes.fork-point-file.test.ts → version-control/__tests__/version-control.routes.fork-point-file.test.ts} +19 -19
- package/src/modules/{workflow/__tests__/workflow.routes.history-read-gate.test.ts → version-control/__tests__/version-control.routes.history-read-gate.test.ts} +13 -13
- package/src/modules/{workflow/__tests__/workflow.routes.lock-path.test.ts → version-control/__tests__/version-control.routes.lock-path.test.ts} +18 -18
- package/src/modules/{workflow/__tests__/workflow.routes.open-change-request.test.ts → version-control/__tests__/version-control.routes.open-change-request.test.ts} +7 -7
- package/src/modules/{workflow/__tests__/workflow.routes.push-refused.test.ts → version-control/__tests__/version-control.routes.push-refused.test.ts} +14 -14
- package/src/modules/{workflow/__tests__/workflow.service.branch-in-use.test.ts → version-control/__tests__/version-control.service.branch-in-use.test.ts} +6 -6
- package/src/modules/{workflow/__tests__/workflow.service.commitFileWhileLocked.test.ts → version-control/__tests__/version-control.service.commitFileWhileLocked.test.ts} +14 -14
- package/src/modules/{workflow/__tests__/workflow.service.delete-branch.test.ts → version-control/__tests__/version-control.service.delete-branch.test.ts} +14 -14
- package/src/modules/{workflow/__tests__/workflow.service.deleted-branch-sweep.test.ts → version-control/__tests__/version-control.service.deleted-branch-sweep.test.ts} +4 -4
- package/src/modules/{workflow/__tests__/workflow.service.facade.test.ts → version-control/__tests__/version-control.service.facade.test.ts} +100 -102
- package/src/modules/{workflow/__tests__/workflow.service.folder-proposals.test.ts → version-control/__tests__/version-control.service.folder-proposals.test.ts} +7 -7
- package/src/modules/{workflow/__tests__/workflow.service.platform-restore.test.ts → version-control/__tests__/version-control.service.platform-restore.test.ts} +6 -6
- package/src/modules/{workflow/__tests__/workflow.service.read-gate.test.ts → version-control/__tests__/version-control.service.read-gate.test.ts} +9 -9
- package/src/modules/{workflow/__tests__/workflow.service.releaseLock.test.ts → version-control/__tests__/version-control.service.releaseLock.test.ts} +85 -75
- package/src/modules/{workflow/__tests__/workflow.service.repository-replaced.test.ts → version-control/__tests__/version-control.service.repository-replaced.test.ts} +4 -4
- package/src/modules/{workflow/__tests__/workflow.service.sync.test.ts → version-control/__tests__/version-control.service.sync.test.ts} +17 -17
- package/src/modules/{workflow/__tests__/workflow.service.update-change-request.pg.test.ts → version-control/__tests__/version-control.service.update-change-request.pg.test.ts} +6 -6
- package/src/modules/{workflow/__tests__/workflow.service.update-change-request.test.ts → version-control/__tests__/version-control.service.update-change-request.test.ts} +11 -11
- package/src/modules/{workflow/__tests__/workflow.service.update-from-target.test.ts → version-control/__tests__/version-control.service.update-from-target.test.ts} +22 -22
- package/src/modules/{workflow → version-control}/agent-tools/__tests__/change-request-read.tools.test.ts +3 -3
- package/src/modules/{workflow → version-control}/agent-tools/__tests__/update-change-request.parity.test.ts +16 -16
- package/src/modules/{workflow/agent-tools/__tests__/workflow.tools.test.ts → version-control/agent-tools/__tests__/version-control.tools.test.ts} +9 -9
- package/src/modules/{workflow → version-control}/agent-tools/change-request-read.tools.ts +2 -2
- package/src/modules/{workflow/agent-tools/workflow.tools.ts → version-control/agent-tools/version-control.tools.ts} +30 -30
- package/src/modules/{workflow → version-control}/change-request-hooks.ts +1 -1
- package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/approval-states.test.ts +5 -5
- package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/cancel-pr.test.ts +8 -8
- package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/carry-approvals-forward.test.ts +6 -6
- package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/erase-approver.test.ts +5 -5
- package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/merge-gate.test.ts +3 -3
- package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/merge-records-own-commit.test.ts +3 -3
- package/src/modules/{workflow/review-workflow/review-workflow.interface.ts → version-control/change-request-review/change-request-review.interface.ts} +1 -1
- package/src/modules/{workflow/review-workflow/review-workflow.service.ts → version-control/change-request-review/change-request-review.service.ts} +28 -28
- package/src/modules/{workflow → version-control}/event-bus.ts +14 -14
- package/src/modules/{workflow → version-control}/events-delivery.ts +11 -11
- package/src/modules/{workflow → version-control}/events.routes.ts +5 -5
- package/src/modules/{workflow → version-control}/file-lock.service.ts +6 -6
- package/src/modules/{workflow → version-control}/git/__tests__/git-test-helpers.ts +3 -3
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.accessGating.test.ts +5 -5
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.appliedChange.test.ts +4 -4
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.changedFilesForPr.test.ts +16 -16
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.changedPathsMemo.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.commitChanges.test.ts +3 -3
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.commitFile.strayPath.test.ts +10 -10
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.commitFile.test.ts +3 -3
- package/src/modules/version-control/git/__tests__/git.service.commitLanded.test.ts +199 -0
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.createBranch.test.ts +3 -3
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.deleteBranch.test.ts +7 -7
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.diffFileAtCommit.test.ts +9 -9
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.diffFileBetweenBranches.test.ts +23 -23
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.fileBytesAtCommit.test.ts +7 -7
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.fileContentsAtCommit.test.ts +3 -3
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.forkPoint.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.history-guards.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.list-branches.test.ts +12 -12
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.listTrackedFiles.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.logForFile.test.ts +6 -6
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.mergeChangeRequest.test.ts +99 -22
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.mergeIntoBranch.test.ts +16 -16
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.pendingChanges.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.postMergePull.test.ts +5 -5
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.prFetchFailure.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.pull.test.ts +12 -12
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.readFileAtRef.test.ts +3 -3
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.revertPathsAndPush.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.status.test.ts +4 -4
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.syncFromRemote.test.ts +8 -8
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.worktrees.test.ts +4 -4
- package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.list-fetch.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.test.ts +6 -6
- package/src/modules/{workflow → version-control}/git/git.service.ts +112 -59
- package/src/modules/{workflow → version-control}/git/node-git-runner.ts +1 -1
- package/src/modules/{workflow → version-control}/git/pull-request.service.ts +12 -12
- package/src/modules/{workflow → version-control}/index.ts +6 -5
- package/src/modules/{workflow → version-control}/pending-commits.service.ts +2 -2
- package/src/modules/{workflow → version-control}/pending-commits.worker.ts +8 -8
- package/src/modules/{workflow → version-control}/read-on-branch.ts +2 -2
- package/src/modules/{workflow/workflow-hooks.ts → version-control/version-control-hooks.ts} +44 -5
- package/src/modules/{workflow/workflow.routes.ts → version-control/version-control.routes.ts} +64 -63
- package/src/modules/{workflow/workflow.service.ts → version-control/version-control.service.ts} +96 -109
- package/src/modules/workspace/__tests__/agent-access.gate.test.ts +8 -8
- package/src/modules/workspace/__tests__/agent-downloads.test.ts +13 -16
- package/src/modules/workspace/__tests__/agent-uploads.test.ts +11 -12
- package/src/modules/workspace/__tests__/escape-sequences.routes.test.ts +11 -16
- package/src/modules/workspace/__tests__/file-stat-access.test.ts +3 -3
- package/src/modules/workspace/__tests__/git-internals.security.test.ts +27 -27
- package/src/modules/workspace/__tests__/kb-repository.test.ts +1 -1
- package/src/modules/workspace/__tests__/rest-tool-arguments.test.ts +3 -3
- package/src/modules/workspace/__tests__/start-session.default-branch.test.ts +152 -0
- package/src/modules/workspace/__tests__/workspace-paths-inside-the-repo.test.ts +6 -6
- package/src/modules/workspace/__tests__/workspace-tmp.tools.test.ts +13 -14
- package/src/modules/workspace/__tests__/workspace.routes.at-ref.test.ts +6 -6
- package/src/modules/workspace/__tests__/workspace.routes.branch-errors.test.ts +4 -4
- package/src/modules/workspace/__tests__/workspace.routes.create-grant.test.ts +6 -6
- package/src/modules/workspace/__tests__/workspace.routes.delete.test.ts +8 -8
- package/src/modules/workspace/__tests__/workspace.routes.download-implies-read.test.ts +4 -4
- package/src/modules/workspace/__tests__/workspace.routes.download.test.ts +6 -6
- package/src/modules/workspace/__tests__/workspace.routes.file-writes.test.ts +6 -6
- package/src/modules/workspace/__tests__/workspace.routes.folder-zip-access.test.ts +4 -4
- package/src/modules/workspace/__tests__/workspace.routes.folders.test.ts +6 -6
- package/src/modules/workspace/__tests__/workspace.routes.move-platform-files.test.ts +7 -7
- package/src/modules/workspace/__tests__/workspace.routes.read-gate.test.ts +13 -13
- package/src/modules/workspace/__tests__/workspace.service.any-workspace-credentials.test.ts +1 -1
- package/src/modules/workspace/__tests__/workspace.service.replaced-repository.test.ts +1 -1
- package/src/modules/workspace/__tests__/workspace.service.worktrees.test.ts +1 -1
- package/src/modules/workspace/__tests__/workspace.tools.agents-file.test.ts +5 -5
- package/src/modules/workspace/__tests__/workspace.tools.branch-errors.test.ts +5 -5
- package/src/modules/workspace/__tests__/workspace.tools.test.ts +27 -27
- package/src/modules/workspace/agent-access.gate.ts +5 -5
- package/src/modules/workspace/git-internals.middleware.ts +2 -2
- package/src/modules/workspace/kb-repository.ts +1 -1
- package/src/modules/workspace/startup/__tests__/kb-startup-runner.degraded.test.ts +1 -1
- package/src/modules/workspace/startup/__tests__/kb-startup-runner.test.ts +1 -1
- package/src/modules/workspace/startup/__tests__/kb-startup-runner.worktrees.test.ts +1 -1
- package/src/modules/workspace/startup/kb-git.ts +1 -1
- package/src/modules/workspace/startup/steps/__tests__/steps.test.ts +94 -70
- package/src/modules/workspace/startup/steps/seed-tree.ts +4 -5
- package/src/modules/workspace/startup/steps/template-files.step.ts +4 -5
- package/src/modules/workspace/startup/steps/template-source.ts +21 -6
- package/src/modules/workspace/workspace-tmp.ts +4 -4
- package/src/modules/workspace/workspace.routes.ts +26 -26
- package/src/modules/workspace/workspace.service.ts +11 -11
- package/src/modules/workspace/workspace.tools.ts +17 -10
- package/src/shared/__tests__/canonical-file-identity.test.ts +5 -5
- package/src/shared/__tests__/fire-and-forget.test.ts +39 -0
- package/src/shared/__tests__/http-errors.test.ts +4 -4
- package/src/shared/canonical-file-identity.ts +5 -5
- package/src/shared/domain-errors.ts +44 -44
- package/src/shared/fire-and-forget.ts +26 -0
- package/src/shared/git.contract.ts +1 -1
- package/src/shared/http-errors.ts +3 -3
- package/src/shared/kb-context.ts +130 -130
- package/src/shared/pending-proposals.ts +4 -4
- package/src/tenancy/__tests__/tenant-host.test.ts +372 -372
- package/src/tenancy/__tests__/tenant-runtime.test.ts +221 -221
- package/src/tenancy/__tests__/tenant-secrets.test.ts +35 -35
- package/src/tenancy/index.ts +35 -35
- package/src/tenancy/static-tenant-source.ts +1 -1
- package/src/tenancy/tenant-host.ts +261 -261
- package/src/tenancy/tenant-runtime.ts +208 -208
- package/src/tenancy/tenant-source.contract.ts +59 -59
- package/dist/modules/workflow/agent-tools/change-request-read-shape.d.ts.map +0 -1
- package/dist/modules/workflow/agent-tools/change-request-read-shape.js.map +0 -1
- package/dist/modules/workflow/agent-tools/change-request-read.tools.d.ts.map +0 -1
- package/dist/modules/workflow/agent-tools/change-request-read.tools.js.map +0 -1
- package/dist/modules/workflow/agent-tools/change-request-summary.d.ts.map +0 -1
- package/dist/modules/workflow/agent-tools/change-request-summary.js.map +0 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +0 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.js.map +0 -1
- package/dist/modules/workflow/change-request-hooks.d.ts.map +0 -1
- package/dist/modules/workflow/change-request-hooks.js.map +0 -1
- package/dist/modules/workflow/event-bus.d.ts.map +0 -1
- package/dist/modules/workflow/event-bus.js.map +0 -1
- package/dist/modules/workflow/events-delivery.d.ts.map +0 -1
- package/dist/modules/workflow/events-delivery.js.map +0 -1
- package/dist/modules/workflow/events.routes.d.ts.map +0 -1
- package/dist/modules/workflow/events.routes.js.map +0 -1
- package/dist/modules/workflow/file-lock.service.d.ts.map +0 -1
- package/dist/modules/workflow/file-lock.service.js.map +0 -1
- package/dist/modules/workflow/git/change-request-link.d.ts.map +0 -1
- package/dist/modules/workflow/git/change-request-link.js.map +0 -1
- package/dist/modules/workflow/git/git-version.d.ts.map +0 -1
- package/dist/modules/workflow/git/git-version.js.map +0 -1
- package/dist/modules/workflow/git/git.service.d.ts.map +0 -1
- package/dist/modules/workflow/git/git.service.js.map +0 -1
- package/dist/modules/workflow/git/merge-commit.d.ts.map +0 -1
- package/dist/modules/workflow/git/merge-commit.js.map +0 -1
- package/dist/modules/workflow/git/node-git-runner.d.ts.map +0 -1
- package/dist/modules/workflow/git/node-git-runner.js.map +0 -1
- package/dist/modules/workflow/git/pull-request.service.d.ts.map +0 -1
- package/dist/modules/workflow/git/pull-request.service.js.map +0 -1
- package/dist/modules/workflow/index.d.ts.map +0 -1
- package/dist/modules/workflow/index.js.map +0 -1
- package/dist/modules/workflow/pending-commits.service.d.ts.map +0 -1
- package/dist/modules/workflow/pending-commits.service.js.map +0 -1
- package/dist/modules/workflow/pending-commits.worker.d.ts.map +0 -1
- package/dist/modules/workflow/pending-commits.worker.js.map +0 -1
- package/dist/modules/workflow/read-on-branch.d.ts.map +0 -1
- package/dist/modules/workflow/read-on-branch.js.map +0 -1
- package/dist/modules/workflow/recovery-bot.d.ts.map +0 -1
- package/dist/modules/workflow/recovery-bot.js.map +0 -1
- package/dist/modules/workflow/review-workflow/approval-lock.d.ts.map +0 -1
- package/dist/modules/workflow/review-workflow/approval-lock.js.map +0 -1
- package/dist/modules/workflow/review-workflow/review-workflow.interface.d.ts.map +0 -1
- package/dist/modules/workflow/review-workflow/review-workflow.interface.js +0 -2
- package/dist/modules/workflow/review-workflow/review-workflow.interface.js.map +0 -1
- package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts.map +0 -1
- package/dist/modules/workflow/review-workflow/review-workflow.service.js.map +0 -1
- package/dist/modules/workflow/sanitize-error.d.ts.map +0 -1
- package/dist/modules/workflow/sanitize-error.js.map +0 -1
- package/dist/modules/workflow/workflow-hooks.d.ts.map +0 -1
- package/dist/modules/workflow/workflow-hooks.js.map +0 -1
- package/dist/modules/workflow/workflow.routes.d.ts.map +0 -1
- package/dist/modules/workflow/workflow.routes.js.map +0 -1
- package/dist/modules/workflow/workflow.service.d.ts.map +0 -1
- package/dist/modules/workflow/workflow.service.js.map +0 -1
- package/src/modules/mcp/__tests__/read-only-hint.e2e.test.ts +0 -213
- /package/dist/modules/{workflow → version-control}/agent-tools/change-request-read-shape.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/agent-tools/change-request-read-shape.js +0 -0
- /package/dist/modules/{workflow → version-control}/agent-tools/change-request-read.tools.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/agent-tools/change-request-summary.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/agent-tools/change-request-summary.js +0 -0
- /package/dist/modules/{workflow → version-control}/change-request-hooks.js +0 -0
- /package/dist/modules/{workflow/review-workflow → version-control/change-request-review}/approval-lock.d.ts +0 -0
- /package/dist/modules/{workflow/review-workflow → version-control/change-request-review}/approval-lock.js +0 -0
- /package/dist/modules/{workflow → version-control}/events-delivery.js +0 -0
- /package/dist/modules/{workflow → version-control}/events.routes.js +0 -0
- /package/dist/modules/{workflow → version-control}/git/change-request-link.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/git/change-request-link.js +0 -0
- /package/dist/modules/{workflow → version-control}/git/git-version.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/git/git-version.js +0 -0
- /package/dist/modules/{workflow → version-control}/git/merge-commit.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/git/merge-commit.js +0 -0
- /package/dist/modules/{workflow → version-control}/git/node-git-runner.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/recovery-bot.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/recovery-bot.js +0 -0
- /package/dist/modules/{workflow → version-control}/sanitize-error.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/sanitize-error.js +0 -0
- /package/src/modules/{workflow → version-control}/__tests__/change-request-hooks.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/__tests__/fake-file-lock-db.ts +0 -0
- /package/src/modules/{workflow → version-control}/__tests__/pending-commits.canonical.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/__tests__/pending-commits.enqueue-if-absent.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/__tests__/pending-commits.repository-replaced.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/__tests__/sanitize-error.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/agent-tools/__tests__/change-request-read-shape.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/agent-tools/change-request-read-shape.ts +0 -0
- /package/src/modules/{workflow → version-control}/agent-tools/change-request-summary.ts +0 -0
- /package/src/modules/{workflow/review-workflow → version-control/change-request-review}/approval-lock.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/branchAuthor.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/change-request-link.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/git-version.failure.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/git-version.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/node-git-runner.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.getPrDetail.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.placeholder.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.viewer-can-cancel.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.viewer-can-delete.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.viewer-can-update.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/change-request-link.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/git-version.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/merge-commit.ts +0 -0
- /package/src/modules/{workflow → version-control}/recovery-bot.ts +0 -0
- /package/src/modules/{workflow → version-control}/sanitize-error.ts +0 -0
|
@@ -454,6 +454,20 @@ export class ToolManualService implements IToolManualService {
|
|
|
454
454
|
}));
|
|
455
455
|
}
|
|
456
456
|
|
|
457
|
+
async sharedSignInKeysForManual(
|
|
458
|
+
manualName: string,
|
|
459
|
+
): Promise<{ key: string; name: string; label: string | null; oauthScopes?: string[] }[]> {
|
|
460
|
+
const manual = (await this.scan()).manuals.find((m) => m.name === manualName);
|
|
461
|
+
return (manual?.variables ?? [])
|
|
462
|
+
.filter((v) => v.scope === 'admin' && v.oauth != null)
|
|
463
|
+
.map((v) => ({
|
|
464
|
+
key: utcpNamespacedKey(manualName, v.name),
|
|
465
|
+
name: v.name,
|
|
466
|
+
label: v.label ?? null,
|
|
467
|
+
oauthScopes: v.oauth?.scopes,
|
|
468
|
+
}));
|
|
469
|
+
}
|
|
470
|
+
|
|
457
471
|
async scopeOfVariable(effectiveKey: string): Promise<ToolVariableScope> {
|
|
458
472
|
// UTCP looks up `<namespace-with-doubled-underscores>_<VAR>`. Find the manual
|
|
459
473
|
// whose namespace prefixes this key; the declared var is the remainder. Match
|
|
@@ -802,6 +816,10 @@ export class ToolManualService implements IToolManualService {
|
|
|
802
816
|
if (m.type !== 'mcp') continue;
|
|
803
817
|
const oauthVar = (m.variables ?? []).find((v) => v.oauth != null);
|
|
804
818
|
if (oauthVar) {
|
|
819
|
+
// A MANAGED sign-in has nothing for an owner to set up here: its
|
|
820
|
+
// client is the broker's, its endpoints are in the file. No setup
|
|
821
|
+
// kind, so no surface asks for a client secret it does not need.
|
|
822
|
+
if (oauthVar.oauth?.managed) continue;
|
|
805
823
|
// An owner-registered client is `oauth-manual` by definition — whether
|
|
806
824
|
// the declaration is complete or still needs its endpoints discovered.
|
|
807
825
|
// Explicit wins over discovery: never registered over, never probed
|
|
@@ -909,8 +927,15 @@ export class ToolManualService implements IToolManualService {
|
|
|
909
927
|
m.setup = { kind: 'oauth-manual', reason: `sign-in endpoint discovery is unavailable — ${declaredByHand}` };
|
|
910
928
|
return;
|
|
911
929
|
}
|
|
930
|
+
// A file-declared sign-in carries its client id unless it is managed, and
|
|
931
|
+
// a managed one has nothing to discover: its endpoints are in the file.
|
|
932
|
+
const clientId = v.oauth?.clientId;
|
|
933
|
+
if (!clientId) {
|
|
934
|
+
m.setup = { kind: 'oauth-manual', reason: `the sign-in names no client id — ${declaredByHand}` };
|
|
935
|
+
return;
|
|
936
|
+
}
|
|
912
937
|
try {
|
|
913
|
-
const found = await discovery.providerForDeclaredClient(m.name, m.url!,
|
|
938
|
+
const found = await discovery.providerForDeclaredClient(m.name, m.url!, clientId);
|
|
914
939
|
if (found.status !== 'oauth') {
|
|
915
940
|
m.setup = {
|
|
916
941
|
kind: 'oauth-manual',
|
|
@@ -1579,8 +1604,11 @@ function normalizeVariables(raw: unknown): ToolVariable[] {
|
|
|
1579
1604
|
const label = typeof e.label === 'string' && e.label.trim() ? e.label.trim() : undefined;
|
|
1580
1605
|
const oauth = normalizeVariableOAuth(at, e.oauth);
|
|
1581
1606
|
// OAuth is inherently per-caller — each user signs in for their own token. An
|
|
1582
|
-
// admin-shared OAuth token would leak one user's token to all callers.
|
|
1583
|
-
|
|
1607
|
+
// admin-shared OAuth token would leak one user's token to all callers. The
|
|
1608
|
+
// one exception is a MANAGED sign-in enabled as a workspace connection:
|
|
1609
|
+
// there the shared token is the point (one CRM account for the company),
|
|
1610
|
+
// and only an owner of the tool can make it.
|
|
1611
|
+
if (oauth && scope !== 'user' && !oauth.managed) {
|
|
1584
1612
|
throw new Error(`${at}\` has \`oauth\`, so its \`scope\` must be \`user\``);
|
|
1585
1613
|
}
|
|
1586
1614
|
return {
|
|
@@ -1640,8 +1668,27 @@ function normalizeVariableOAuth(at: string, raw: unknown): ToolVariableOAuth | u
|
|
|
1640
1668
|
};
|
|
1641
1669
|
const authorizationUrl = safeUrl(o.authorizationUrl, 'authorizationUrl');
|
|
1642
1670
|
const tokenUrl = safeUrl(o.tokenUrl, 'tokenUrl');
|
|
1671
|
+
// A managed sign-in names the platform connector it goes through instead
|
|
1672
|
+
// of a client id: the client is the broker's. Both parts are ids of OURS
|
|
1673
|
+
// (matched against the catalog later), so the shape check here is all the
|
|
1674
|
+
// file gets — and neither value is repeated in a refusal.
|
|
1675
|
+
let managed: { connectorId: string; scopeSet: string } | undefined;
|
|
1676
|
+
if (o.managed !== undefined) {
|
|
1677
|
+
const m = o.managed as Record<string, unknown> | null;
|
|
1678
|
+
const connectorId = m && typeof m === 'object' && typeof m.connectorId === 'string' ? m.connectorId.trim() : '';
|
|
1679
|
+
const scopeSet = m && typeof m === 'object' && typeof m.scopeSet === 'string' ? m.scopeSet.trim() : '';
|
|
1680
|
+
if (!isValidId(connectorId) || !isValidId(scopeSet)) {
|
|
1681
|
+
throw new Error(`${at}.oauth.managed\` must be { connectorId, scopeSet } (lowercase snake_case ids)`);
|
|
1682
|
+
}
|
|
1683
|
+
managed = { connectorId, scopeSet };
|
|
1684
|
+
}
|
|
1643
1685
|
const clientId = typeof o.clientId === 'string' && o.clientId.trim() ? o.clientId.trim() : '';
|
|
1644
|
-
if (!clientId) throw new Error(`${at}.oauth.clientId\` is required`);
|
|
1686
|
+
if (!clientId && !managed) throw new Error(`${at}.oauth.clientId\` is required`);
|
|
1687
|
+
// One client or the other: a managed sign-in runs with the broker's app, and
|
|
1688
|
+
// a client id beside it would be a declaration two flows claim.
|
|
1689
|
+
if (clientId && managed) {
|
|
1690
|
+
throw new Error(`${at}.oauth\` names both \`managed\` and a \`clientId\`; a managed sign-in has no client of its own`);
|
|
1691
|
+
}
|
|
1645
1692
|
let scopes: string[] | undefined;
|
|
1646
1693
|
if (o.scopes !== undefined) {
|
|
1647
1694
|
if (!Array.isArray(o.scopes) || !o.scopes.every((s) => typeof s === 'string')) {
|
|
@@ -1670,11 +1717,12 @@ function normalizeVariableOAuth(at: string, raw: unknown): ToolVariableOAuth | u
|
|
|
1670
1717
|
return {
|
|
1671
1718
|
authorizationUrl,
|
|
1672
1719
|
tokenUrl,
|
|
1673
|
-
clientId,
|
|
1720
|
+
...(clientId ? { clientId } : {}),
|
|
1674
1721
|
...(scopes ? { scopes } : {}),
|
|
1675
1722
|
...(authParams ? { authParams } : {}),
|
|
1676
1723
|
...(o.pkce === false ? { pkce: false } : {}),
|
|
1677
1724
|
...(resource ? { resource } : {}),
|
|
1725
|
+
...(managed ? { managed } : {}),
|
|
1678
1726
|
};
|
|
1679
1727
|
}
|
|
1680
1728
|
|
|
@@ -7,7 +7,7 @@ import type { IAccessControl } from '../access/index.js';
|
|
|
7
7
|
import { utcpNamespacedKey } from '../../shared/utcp-namespace.js';
|
|
8
8
|
import type { ConnectorScope, IToolManualService } from './tool-manuals.contract.js';
|
|
9
9
|
import type { HiddenToolSource } from '../../shared/hidden-tools.js';
|
|
10
|
-
import { userSecretGap } from '../secrets-vault/index.js';
|
|
10
|
+
import { scopesCovered, userSecretGap } from '../secrets-vault/index.js';
|
|
11
11
|
|
|
12
12
|
/**
|
|
13
13
|
* What `list_tool_setup` needs from the secrets vault (structurally satisfied
|
|
@@ -29,6 +29,9 @@ export interface VariableStatusPort {
|
|
|
29
29
|
adminKind?: 'static' | 'oauth' | null;
|
|
30
30
|
userConfigured: boolean;
|
|
31
31
|
userAuthorized?: boolean;
|
|
32
|
+
/** For a shared (workspace) sign-in: the owner's row holds tokens, and what they were granted. */
|
|
33
|
+
adminAuthorized?: boolean;
|
|
34
|
+
adminGrantedScopes?: string;
|
|
32
35
|
userKind?: 'static' | 'oauth' | null;
|
|
33
36
|
grantedScopes?: string;
|
|
34
37
|
}[]
|
|
@@ -116,18 +119,15 @@ export function registerToolManualsTools(
|
|
|
116
119
|
// hidden tool's entry CONTAINS is on the field below rather than here.
|
|
117
120
|
description:
|
|
118
121
|
'Configuration status of every `.tool` the current user can access: what each needs set up and what is ' +
|
|
119
|
-
'configured, as `{ tools, invalid, onBranchOnly, note? }`. Scoped to the CALLER: a `.tool` it cannot ' +
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
'editor; users sign
|
|
123
|
-
'
|
|
124
|
-
'
|
|
125
|
-
'the tool
|
|
126
|
-
'
|
|
127
|
-
'
|
|
128
|
-
'draft is not listed, callable or signed-in-able until it is merged. Pass `branch` (the draft you wrote the ' +
|
|
129
|
-
'declaration on) and `onBranchOnly` names every tool declared there that the default branch does not serve ' +
|
|
130
|
-
'yet — open a change request and ask the user to merge it.',
|
|
122
|
+
'configured, as `{ tools, invalid, onBranchOnly, note? }`. Scoped to the CALLER: a `.tool` it cannot READ is ' +
|
|
123
|
+
"absent, and a `user` variable's flags are the caller's own. An `admin` variable with `oauth` is a WORKSPACE " +
|
|
124
|
+
"connection: `authorized` is the owner's connection, which only a writer of the tool can make or remake. " +
|
|
125
|
+
'Secret VALUES are never returned or set through a tool: an admin enters them in the tool editor; users sign ' +
|
|
126
|
+
'in on /connect. Setting shared secrets is gated by `canWrite` on the `.tool` FILE (its frontmatter verbs and ' +
|
|
127
|
+
'the access.md chain), not by a platform role. `hiddenTools` names the tools Hexis hides for an invalid ' +
|
|
128
|
+
'schema. The listing is the RELEASED catalog (default branch only): a server or `.tool` declared on a draft is ' +
|
|
129
|
+
'not listed, callable or signed-in-able until merged. Pass `branch` and `onBranchOnly` names every tool ' +
|
|
130
|
+
'declared there that the default branch does not serve yet — open a change request and ask the user to merge it.',
|
|
131
131
|
path: '/api/agent/tools/list_tool_setup',
|
|
132
132
|
inputs: {
|
|
133
133
|
type: 'object',
|
|
@@ -211,7 +211,22 @@ export function registerToolManualsTools(
|
|
|
211
211
|
'Shared value set (plain admin vars), or the owner finished provider setup (OAuth vars).',
|
|
212
212
|
},
|
|
213
213
|
userConfigured: { type: 'boolean' },
|
|
214
|
-
authorized: {
|
|
214
|
+
authorized: {
|
|
215
|
+
type: ['boolean', 'null'],
|
|
216
|
+
description:
|
|
217
|
+
'OAuth vars: a token is stored that covers the declared scopes — the current user\'s for a `user` ' +
|
|
218
|
+
'variable, the WORKSPACE connection an owner made for an `admin` one (a managed connector enabled ' +
|
|
219
|
+
'as one shared connection; a reader cannot connect that, a writer of the tool can).',
|
|
220
|
+
},
|
|
221
|
+
managed: {
|
|
222
|
+
type: 'object',
|
|
223
|
+
description:
|
|
224
|
+
'Present when the sign-in goes through a managed connector (the distribution\'s own OAuth app, a ' +
|
|
225
|
+
'broker doing the round-trip): which connector and scope set. Members connect on /connect; an ' +
|
|
226
|
+
'owner needs no client secret for it.',
|
|
227
|
+
properties: { connectorId: { type: 'string' }, scopeSet: { type: 'string' } },
|
|
228
|
+
required: ['connectorId', 'scopeSet'],
|
|
229
|
+
},
|
|
215
230
|
},
|
|
216
231
|
required: ['name', 'scope', 'oauth', 'adminConfigured', 'userConfigured'],
|
|
217
232
|
},
|
|
@@ -304,6 +319,16 @@ export function registerToolManualsTools(
|
|
|
304
319
|
variables: (m.variables ?? []).map((v) => {
|
|
305
320
|
const st = statusByKey.get(varKey(m.name, v.name));
|
|
306
321
|
const isOAuth = v.oauth != null;
|
|
322
|
+
// A sign-in counts as authorized when a token is stored AND it
|
|
323
|
+
// still covers what the tool declares — the one readiness rule,
|
|
324
|
+
// so this flag agrees with the sign-in note below. A shared
|
|
325
|
+
// sign-in (a managed workspace connection) reads the owner's
|
|
326
|
+
// row: it is everyone's once an owner has connected it.
|
|
327
|
+
const authorized = isOAuth
|
|
328
|
+
? v.scope === 'admin'
|
|
329
|
+
? st?.adminAuthorized === true && scopesCovered(v.oauth?.scopes, st.adminGrantedScopes)
|
|
330
|
+
: st?.userAuthorized === true && scopesCovered(v.oauth?.scopes, st.grantedScopes)
|
|
331
|
+
: null;
|
|
307
332
|
return {
|
|
308
333
|
name: v.name,
|
|
309
334
|
scope: v.scope,
|
|
@@ -311,7 +336,8 @@ export function registerToolManualsTools(
|
|
|
311
336
|
oauth: isOAuth,
|
|
312
337
|
adminConfigured: st?.adminConfigured ?? false,
|
|
313
338
|
userConfigured: st?.userConfigured ?? false,
|
|
314
|
-
authorized
|
|
339
|
+
authorized,
|
|
340
|
+
...(v.oauth?.managed ? { managed: v.oauth.managed } : {}),
|
|
315
341
|
};
|
|
316
342
|
}),
|
|
317
343
|
};
|
|
@@ -3,8 +3,8 @@ import express from 'express';
|
|
|
3
3
|
import { describe, expect, it } from 'vitest';
|
|
4
4
|
import { inputSchemaDefect } from '@bevel-software/platform-mcp-core';
|
|
5
5
|
import { ToolRegistry } from '../tool-registry.js';
|
|
6
|
-
import {
|
|
7
|
-
import { registerChangeRequestReadTools } from '../../
|
|
6
|
+
import { registerVersionControlTools } from '../../version-control/agent-tools/version-control.tools.js';
|
|
7
|
+
import { registerChangeRequestReadTools } from '../../version-control/agent-tools/change-request-read.tools.js';
|
|
8
8
|
import { registerWorkspaceTools } from '../../workspace/workspace.tools.js';
|
|
9
9
|
import { registerSkillsTools } from '../../skills/skills.tools.js';
|
|
10
10
|
import { registerPluginsTools } from '../../plugins/plugins.tools.js';
|
|
@@ -58,8 +58,8 @@ const CORE_SERVER_SOURCE = new URL('../../../core/create-core-server.ts', import
|
|
|
58
58
|
/** Every tool-registering module, by the name the server calls it under. */
|
|
59
59
|
const MODULES: ReadonlyArray<{ name: string; register: (registry: ToolRegistry) => void }> = [
|
|
60
60
|
{
|
|
61
|
-
name: '
|
|
62
|
-
register: (registry) =>
|
|
61
|
+
name: 'registerVersionControlTools',
|
|
62
|
+
register: (registry) => registerVersionControlTools(registry, express.Router(), pass, handler, testKbContext(), async () => true, { canRead: async () => true, canReadAtRef: async () => true, canReadBatch: async () => new Map(), canReadBatchAtRef: async () => new Map(), canWrite: async () => true } as never, { recoveryBotEmail: 'recovery@x', hooks: { runAgentRead: async () => undefined }, notes: { onChange: () => undefined } } as never),
|
|
63
63
|
},
|
|
64
64
|
{
|
|
65
65
|
name: 'registerChangeRequestReadTools',
|
|
@@ -13,8 +13,8 @@ import {
|
|
|
13
13
|
createToolHintsRoutes,
|
|
14
14
|
} from '../index.js';
|
|
15
15
|
import { toolDef } from '../../tool-helpers/index.js';
|
|
16
|
-
import {
|
|
17
|
-
import { registerChangeRequestReadTools } from '../../
|
|
16
|
+
import { registerVersionControlTools } from '../../version-control/agent-tools/version-control.tools.js';
|
|
17
|
+
import { registerChangeRequestReadTools } from '../../version-control/agent-tools/change-request-read.tools.js';
|
|
18
18
|
import { registerWorkspaceTools } from '../../workspace/workspace.tools.js';
|
|
19
19
|
import { registerSkillsTools } from '../../skills/index.js';
|
|
20
20
|
import { registerPluginsTools } from '../../plugins/index.js';
|
|
@@ -98,7 +98,7 @@ const INTERNAL_ONLY = new Set(['switch_branch']);
|
|
|
98
98
|
function platformRegistry(): ToolRegistry {
|
|
99
99
|
const registry = new ToolRegistry();
|
|
100
100
|
const kb = testKbContext();
|
|
101
|
-
|
|
101
|
+
registerVersionControlTools(registry, express.Router(), pass, handler, kb, async () => true);
|
|
102
102
|
registerChangeRequestReadTools(registry, express.Router(), pass, handler, nothing, kb);
|
|
103
103
|
registerWorkspaceTools(
|
|
104
104
|
registry,
|
|
@@ -130,7 +130,7 @@ describe('no Hexis tool description is long enough to be cut', () => {
|
|
|
130
130
|
// purpose, and this assertion is what keeps that a stated fact rather than
|
|
131
131
|
// an oversight: if it ever reaches the catalog, the cap test above measures
|
|
132
132
|
// it like everything else.
|
|
133
|
-
const { createCallToolChainTool } = await import('../../code-mode/
|
|
133
|
+
const { createCallToolChainTool } = await import('../../code-mode/index.js');
|
|
134
134
|
const mastraTool = createCallToolChainTool(unused(), unused(), EXTERNAL_KB_MANUAL_NAME) as unknown as {
|
|
135
135
|
description: string;
|
|
136
136
|
};
|
|
@@ -218,14 +218,14 @@ describe('the shared rules describe the tools they name', () => {
|
|
|
218
218
|
// The opener is only honest if the rules it points at are THERE. These
|
|
219
219
|
// two were paragraphs of the chain's description; they moved, whole, and a
|
|
220
220
|
// description that kept them as well would be the long one a client cuts.
|
|
221
|
-
const rule = sharedFileRules(testKbContext().layout).find((r) => r.id === 'tool-chain')!;
|
|
221
|
+
const rule = sharedFileRules(testKbContext().layout, testKbContext().defaultBranch).find((r) => r.id === 'tool-chain')!;
|
|
222
222
|
expect(rule.body).toContain(CHAIN_FAILURES_RULE);
|
|
223
223
|
expect(rule.body).toContain(CHAIN_LARGE_RESULTS_RULE);
|
|
224
224
|
const served = (await hexisTools()).find((t) => t.name === CALL_TOOL_CHAIN_NAME)!;
|
|
225
225
|
expect(served.description).not.toContain(CHAIN_FAILURES_RULE);
|
|
226
226
|
expect(served.description).not.toContain(CHAIN_LARGE_RESULTS_RULE);
|
|
227
227
|
// What a chained read does to an image was already one of the shared rules.
|
|
228
|
-
const content = sharedFileRules(testKbContext().layout).find((r) => r.id === 'content-kinds')!;
|
|
228
|
+
const content = sharedFileRules(testKbContext().layout, testKbContext().defaultBranch).find((r) => r.id === 'content-kinds')!;
|
|
229
229
|
expect(content.body).toContain('image_omitted');
|
|
230
230
|
});
|
|
231
231
|
|
|
@@ -244,7 +244,7 @@ describe('the shared rules describe the tools they name', () => {
|
|
|
244
244
|
// rejects: `delete_file` has no `dryRun`, so an agent told to preflight a
|
|
245
245
|
// single-file delete gets a validation error on the safe call and learns to
|
|
246
246
|
// skip it. Read off the schemas rather than asserted by hand.
|
|
247
|
-
const rule = sharedFileRules(testKbContext().layout).find((r) => r.id === 'dry-run-confirm')!;
|
|
247
|
+
const rule = sharedFileRules(testKbContext().layout, testKbContext().defaultBranch).find((r) => r.id === 'dry-run-confirm')!;
|
|
248
248
|
const tools = await hexisTools();
|
|
249
249
|
// `toolDef` wraps a tool's own inputs under `body`, which is the schema a
|
|
250
250
|
// client validates against — so that is where the argument either is or is not.
|
|
@@ -272,7 +272,7 @@ describe('the shared rules describe the tools they name', () => {
|
|
|
272
272
|
});
|
|
273
273
|
|
|
274
274
|
it('gives each platform file the depth it actually counts at', () => {
|
|
275
|
-
const rule = sharedFileRules(testKbContext().layout).find((r) => r.id === 'managed-items')!;
|
|
275
|
+
const rule = sharedFileRules(testKbContext().layout, testKbContext().defaultBranch).find((r) => r.id === 'managed-items')!;
|
|
276
276
|
const { anyDepth, rootOnly } = platformFilesByDepth(testKbContext().layout);
|
|
277
277
|
// The split is the half of the rule a list of names leaves out, and
|
|
278
278
|
// `isPlatformFile` is the predicate the prose has to match.
|
|
@@ -283,7 +283,7 @@ describe('the shared rules describe the tools they name', () => {
|
|
|
283
283
|
});
|
|
284
284
|
|
|
285
285
|
it('says what unzip extracts, rather than that it takes any bytes', () => {
|
|
286
|
-
const rule = sharedFileRules(testKbContext().layout).find((r) => r.id === 'content-kinds')!;
|
|
286
|
+
const rule = sharedFileRules(testKbContext().layout, testKbContext().defaultBranch).find((r) => r.id === 'content-kinds')!;
|
|
287
287
|
// `unzip` refuses anything but a `.zip` (`workspace.service.ts`: "Only .zip
|
|
288
288
|
// files can be extracted"), so the byte-tool clause must not sweep it in.
|
|
289
289
|
expect(rule.body).toContain('unzip extracts the entries of a `.zip`');
|
|
@@ -5,7 +5,7 @@ import type { AddressInfo } from 'node:net';
|
|
|
5
5
|
import express from 'express';
|
|
6
6
|
import { describe, it, expect, afterEach, vi } from 'vitest';
|
|
7
7
|
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
8
|
-
import type { AuthUser, FileApprovalState,
|
|
8
|
+
import type { AuthUser, FileApprovalState, IVersionControlService, VersionControlEvent } from '@bevel-software/platform-shared';
|
|
9
9
|
import type { IAccessControl } from '../../access/access-control.interface.js';
|
|
10
10
|
import type { AuthService } from '../../auth/auth.service.js';
|
|
11
11
|
import type { WorkspaceService } from '../../workspace/workspace.service.js';
|
|
@@ -13,18 +13,18 @@ import type { Database } from '../../database/connection.js';
|
|
|
13
13
|
import type { GitService } from '../git/git.service.js';
|
|
14
14
|
import type { PullRequestService } from '../git/pull-request.service.js';
|
|
15
15
|
import { PullRequestService as RealPullRequestService } from '../git/pull-request.service.js';
|
|
16
|
-
import type {
|
|
17
|
-
import {
|
|
16
|
+
import type { IChangeRequestReviewService } from '../change-request-review/change-request-review.interface.js';
|
|
17
|
+
import { ChangeRequestReviewService } from '../change-request-review/change-request-review.service.js';
|
|
18
18
|
import type { FileLockService } from '../file-lock.service.js';
|
|
19
19
|
import type { PendingCommitsService } from '../pending-commits.service.js';
|
|
20
|
-
import {
|
|
20
|
+
import { VersionControlEventBus } from '../event-bus.js';
|
|
21
21
|
import type { SQL } from 'drizzle-orm';
|
|
22
22
|
import { PgDialect } from 'drizzle-orm/pg-core';
|
|
23
23
|
import { changeRequests } from '../../database/schema.js';
|
|
24
24
|
import { coreMigrationsDir } from '../../../assets.js';
|
|
25
|
-
import {
|
|
26
|
-
import { APPLY_FAILURE_REASON_WITHHELD,
|
|
27
|
-
import {
|
|
25
|
+
import { VersionControlService } from '../version-control.service.js';
|
|
26
|
+
import { APPLY_FAILURE_REASON_WITHHELD, createVersionControlRoutes } from '../version-control.routes.js';
|
|
27
|
+
import { VersionControlDomainError, VersionControlValidationError } from '../../../shared/domain-errors.js';
|
|
28
28
|
import { openChangeGate } from '../../../__tests__/open-change-gate.js';
|
|
29
29
|
|
|
30
30
|
/**
|
|
@@ -43,8 +43,8 @@ const ADMIN: AuthUser = { id: 'u-admin', email: 'admin@example.com', name: 'Ada
|
|
|
43
43
|
interface RouteHarness {
|
|
44
44
|
server: Server;
|
|
45
45
|
baseUrl: string;
|
|
46
|
-
emitted:
|
|
47
|
-
|
|
46
|
+
emitted: VersionControlEvent[];
|
|
47
|
+
versionControl: {
|
|
48
48
|
getChangeRequestDetail: ReturnType<typeof vi.fn>;
|
|
49
49
|
mergeChangeRequest: ReturnType<typeof vi.fn>;
|
|
50
50
|
beginApplyAttempt: ReturnType<typeof vi.fn>;
|
|
@@ -60,9 +60,9 @@ async function routeHarness(
|
|
|
60
60
|
canReadBatch?: (paths: string[]) => Promise<Map<string, boolean>>;
|
|
61
61
|
} = {},
|
|
62
62
|
): Promise<RouteHarness> {
|
|
63
|
-
const emitted:
|
|
63
|
+
const emitted: VersionControlEvent[] = [];
|
|
64
64
|
const canReadBatch = opts.canReadBatch ?? (async (paths: string[]) => new Map(paths.map((p) => [p, true])));
|
|
65
|
-
const
|
|
65
|
+
const versionControl = {
|
|
66
66
|
getChangeRequestDetail: vi.fn(async () => ({
|
|
67
67
|
headSha: 'h',
|
|
68
68
|
approvals: [],
|
|
@@ -84,11 +84,11 @@ async function routeHarness(
|
|
|
84
84
|
});
|
|
85
85
|
app.use(
|
|
86
86
|
'/api',
|
|
87
|
-
|
|
88
|
-
|
|
87
|
+
createVersionControlRoutes(
|
|
88
|
+
versionControl as unknown as IVersionControlService,
|
|
89
89
|
{ getOrCreateForUser: vi.fn(async () => ({ id: 'ws-admin' })) } as unknown as WorkspaceService,
|
|
90
90
|
{ getUserById: vi.fn(async () => ADMIN) } as unknown as AuthService,
|
|
91
|
-
{ emit: (e:
|
|
91
|
+
{ emit: (e: VersionControlEvent) => emitted.push(e) } as unknown as VersionControlEventBus,
|
|
92
92
|
{
|
|
93
93
|
canReadBatch: async (_ws: string, _email: string, paths: string[]) => canReadBatch(paths),
|
|
94
94
|
} as unknown as IAccessControl,
|
|
@@ -99,7 +99,7 @@ async function routeHarness(
|
|
|
99
99
|
const s = app.listen(0, () => resolve(s));
|
|
100
100
|
});
|
|
101
101
|
const addr = server.address() as AddressInfo;
|
|
102
|
-
return { server, baseUrl: `http://127.0.0.1:${addr.port}`, emitted,
|
|
102
|
+
return { server, baseUrl: `http://127.0.0.1:${addr.port}`, emitted, versionControl };
|
|
103
103
|
}
|
|
104
104
|
|
|
105
105
|
const closeServer = (s: Server) =>
|
|
@@ -123,22 +123,22 @@ describe('POST /workflow/change-requests/:n/merge — a failed apply reaches eve
|
|
|
123
123
|
h = await routeHarness(async () => {
|
|
124
124
|
// The gate's own `MergeBlockedError` shape: a 422 carrying the reasons it
|
|
125
125
|
// still waits on. Its message is what the route reports.
|
|
126
|
-
throw new
|
|
126
|
+
throw new VersionControlDomainError('Merge gate rejected: Waiting on approval for Plugins/x/SKILL.md', 422, {
|
|
127
127
|
mergeBlockedReasons: ['Waiting on approval for Plugins/x/SKILL.md'],
|
|
128
128
|
});
|
|
129
129
|
});
|
|
130
130
|
const res = await post(h.baseUrl);
|
|
131
131
|
expect(res.status).toBe(202);
|
|
132
132
|
|
|
133
|
-
await vi.waitFor(() => expect(h!.
|
|
134
|
-
expect(h.
|
|
133
|
+
await vi.waitFor(() => expect(h!.versionControl.recordApplyFailure).toHaveBeenCalled());
|
|
134
|
+
expect(h.versionControl.recordApplyFailure).toHaveBeenCalledWith(
|
|
135
135
|
7,
|
|
136
136
|
{ reason: expect.stringContaining('Waiting on approval'), kind: 'gate', at: expect.any(Date) },
|
|
137
137
|
ADMIN,
|
|
138
138
|
1,
|
|
139
139
|
);
|
|
140
140
|
// The clicker's event and the persisted refusal name the same instant.
|
|
141
|
-
const [, { at }] = h.
|
|
141
|
+
const [, { at }] = h.versionControl.recordApplyFailure.mock.calls[0] as [number, { at: Date }];
|
|
142
142
|
// The clicker's own answer is unchanged.
|
|
143
143
|
expect(h.emitted).toContainEqual(
|
|
144
144
|
expect.objectContaining({
|
|
@@ -153,16 +153,16 @@ describe('POST /workflow/change-requests/:n/merge — a failed apply reaches eve
|
|
|
153
153
|
it("the clicker's own answer is scoped like the stored one: a clicker who cannot read the files gets no reason", async () => {
|
|
154
154
|
h = await routeHarness(
|
|
155
155
|
async () => {
|
|
156
|
-
throw new
|
|
156
|
+
throw new VersionControlValidationError('Waiting on approval for Plugins/x/SKILL.md');
|
|
157
157
|
},
|
|
158
158
|
{ canReadBatch: async (paths) => new Map(paths.map((p) => [p, false])) },
|
|
159
159
|
);
|
|
160
160
|
await post(h.baseUrl);
|
|
161
|
-
await vi.waitFor(() => expect(h!.
|
|
161
|
+
await vi.waitFor(() => expect(h!.versionControl.recordApplyFailure).toHaveBeenCalled());
|
|
162
162
|
const answer = h.emitted.find((e) => e.kind === 'change-request-merge-failed') as { reason: string };
|
|
163
163
|
expect(answer.reason).toBe(APPLY_FAILURE_REASON_WITHHELD);
|
|
164
164
|
// The raw reason is still what is stored, for the viewers who may read it.
|
|
165
|
-
expect(h.
|
|
165
|
+
expect(h.versionControl.recordApplyFailure).toHaveBeenCalledWith(
|
|
166
166
|
7,
|
|
167
167
|
expect.objectContaining({ reason: expect.stringContaining('Plugins/x/SKILL.md') }),
|
|
168
168
|
ADMIN,
|
|
@@ -173,7 +173,7 @@ describe('POST /workflow/change-requests/:n/merge — a failed apply reaches eve
|
|
|
173
173
|
it("a request with no resolved touched paths withholds the clicker's reason too", async () => {
|
|
174
174
|
h = await routeHarness(
|
|
175
175
|
async () => {
|
|
176
|
-
throw new
|
|
176
|
+
throw new VersionControlValidationError('Waiting on approval for Plugins/x/SKILL.md');
|
|
177
177
|
},
|
|
178
178
|
{ touchedNodePaths: [] },
|
|
179
179
|
);
|
|
@@ -187,7 +187,7 @@ describe('POST /workflow/change-requests/:n/merge — a failed apply reaches eve
|
|
|
187
187
|
|
|
188
188
|
it('a refusal of the caller reaches the caller alone and erases nobody\'s verdict', async () => {
|
|
189
189
|
h = await routeHarness(async () => {
|
|
190
|
-
throw new
|
|
190
|
+
throw new VersionControlDomainError('Only admins can merge with bypass.', 403);
|
|
191
191
|
});
|
|
192
192
|
await post(h.baseUrl);
|
|
193
193
|
await vi.waitFor(() =>
|
|
@@ -195,16 +195,16 @@ describe('POST /workflow/change-requests/:n/merge — a failed apply reaches eve
|
|
|
195
195
|
expect.objectContaining({ kind: 'change-request-merge-failed', forUserId: ADMIN.id }),
|
|
196
196
|
),
|
|
197
197
|
);
|
|
198
|
-
expect(h.
|
|
198
|
+
expect(h.versionControl.recordApplyFailure).not.toHaveBeenCalled();
|
|
199
199
|
});
|
|
200
200
|
|
|
201
201
|
it('any other refusal is persisted as an error, which an approval does not answer', async () => {
|
|
202
202
|
h = await routeHarness(async () => {
|
|
203
|
-
throw new
|
|
203
|
+
throw new VersionControlDomainError('Merge failed: push rejected', 502);
|
|
204
204
|
});
|
|
205
205
|
await post(h.baseUrl);
|
|
206
|
-
await vi.waitFor(() => expect(h!.
|
|
207
|
-
expect(h.
|
|
206
|
+
await vi.waitFor(() => expect(h!.versionControl.recordApplyFailure).toHaveBeenCalled());
|
|
207
|
+
expect(h.versionControl.recordApplyFailure).toHaveBeenCalledWith(
|
|
208
208
|
7,
|
|
209
209
|
expect.objectContaining({ kind: 'error' }),
|
|
210
210
|
ADMIN,
|
|
@@ -215,8 +215,8 @@ describe('POST /workflow/change-requests/:n/merge — a failed apply reaches eve
|
|
|
215
215
|
it('a conflict is persisted as a conflict', async () => {
|
|
216
216
|
h = await routeHarness(async () => ({ kind: 'conflicts-need-resolution', conflictedPaths: ['a.md'] }));
|
|
217
217
|
await post(h.baseUrl);
|
|
218
|
-
await vi.waitFor(() => expect(h!.
|
|
219
|
-
expect(h.
|
|
218
|
+
await vi.waitFor(() => expect(h!.versionControl.recordApplyFailure).toHaveBeenCalled());
|
|
219
|
+
expect(h.versionControl.recordApplyFailure).toHaveBeenCalledWith(
|
|
220
220
|
7,
|
|
221
221
|
expect.objectContaining({ kind: 'conflicts' }),
|
|
222
222
|
ADMIN,
|
|
@@ -238,21 +238,21 @@ describe('POST /workflow/change-requests/:n/merge — a failed apply reaches eve
|
|
|
238
238
|
await done;
|
|
239
239
|
// One macrotask: the route's continuation after `mergeChangeRequest` resolves.
|
|
240
240
|
await new Promise((r) => setImmediate(r));
|
|
241
|
-
expect(h.
|
|
242
|
-
expect(h.
|
|
241
|
+
expect(h.versionControl.mergeChangeRequest).toHaveBeenCalledTimes(1);
|
|
242
|
+
expect(h.versionControl.recordApplyFailure).not.toHaveBeenCalled();
|
|
243
243
|
expect(h.emitted.filter((e) => e.kind === 'change-request-merge-failed')).toEqual([]);
|
|
244
244
|
// The attempt ended, so the service holds no entry for it.
|
|
245
|
-
expect(h.
|
|
245
|
+
expect(h.versionControl.endApplyAttempt).toHaveBeenCalledWith(7, 1);
|
|
246
246
|
});
|
|
247
247
|
|
|
248
248
|
it('a failed attempt ends too, after its refusal is recorded', async () => {
|
|
249
249
|
h = await routeHarness(async () => {
|
|
250
|
-
throw new
|
|
250
|
+
throw new VersionControlValidationError('gate says no');
|
|
251
251
|
});
|
|
252
252
|
await post(h.baseUrl);
|
|
253
|
-
await vi.waitFor(() => expect(h!.
|
|
254
|
-
expect(h.
|
|
255
|
-
h.
|
|
253
|
+
await vi.waitFor(() => expect(h!.versionControl.endApplyAttempt).toHaveBeenCalledWith(7, 1));
|
|
254
|
+
expect(h.versionControl.recordApplyFailure.mock.invocationCallOrder[0]).toBeLessThan(
|
|
255
|
+
h.versionControl.endApplyAttempt.mock.invocationCallOrder[0]!,
|
|
256
256
|
);
|
|
257
257
|
});
|
|
258
258
|
|
|
@@ -260,7 +260,7 @@ describe('POST /workflow/change-requests/:n/merge — a failed apply reaches eve
|
|
|
260
260
|
h = await routeHarness(async () => {
|
|
261
261
|
throw new Error('gate says no');
|
|
262
262
|
});
|
|
263
|
-
h.
|
|
263
|
+
h.versionControl.recordApplyFailure.mockRejectedValue(new Error('db down'));
|
|
264
264
|
await post(h.baseUrl);
|
|
265
265
|
await vi.waitFor(() =>
|
|
266
266
|
expect(h!.emitted).toContainEqual(expect.objectContaining({ kind: 'change-request-merge-failed' })),
|
|
@@ -268,7 +268,7 @@ describe('POST /workflow/change-requests/:n/merge — a failed apply reaches eve
|
|
|
268
268
|
});
|
|
269
269
|
});
|
|
270
270
|
|
|
271
|
-
// ──
|
|
271
|
+
// ── VersionControlService.recordApplyFailure ──────────────────────────────────────
|
|
272
272
|
|
|
273
273
|
function updateDb(openRows = 1) {
|
|
274
274
|
const sets: Record<string, unknown>[] = [];
|
|
@@ -370,27 +370,27 @@ const refusal = (kind: 'gate' | 'conflicts' | 'error', at: Date): Partial<Row> =
|
|
|
370
370
|
function service(
|
|
371
371
|
db: Database,
|
|
372
372
|
emit: (e: unknown) => void,
|
|
373
|
-
|
|
373
|
+
changeRequestReview: Partial<IChangeRequestReviewService> = {},
|
|
374
374
|
deps: { git?: Partial<GitService>; prs?: Record<string, unknown> } = {},
|
|
375
375
|
) {
|
|
376
376
|
const prs = { invalidateDetailCache: vi.fn(), ...deps.prs };
|
|
377
|
-
const svc = new
|
|
377
|
+
const svc = new VersionControlService(
|
|
378
378
|
db,
|
|
379
379
|
(deps.git ?? {}) as GitService,
|
|
380
380
|
prs as unknown as PullRequestService,
|
|
381
|
-
|
|
381
|
+
changeRequestReview as IChangeRequestReviewService,
|
|
382
382
|
{} as WorkspaceService,
|
|
383
383
|
{} as IAccessControl,
|
|
384
384
|
{} as FileLockService,
|
|
385
385
|
{} as PendingCommitsService,
|
|
386
386
|
testKbContext(),
|
|
387
387
|
openChangeGate(),
|
|
388
|
-
{ emit } as unknown as
|
|
388
|
+
{ emit } as unknown as VersionControlEventBus,
|
|
389
389
|
);
|
|
390
390
|
return { svc, prs };
|
|
391
391
|
}
|
|
392
392
|
|
|
393
|
-
describe('
|
|
393
|
+
describe('VersionControlService — the persisted apply refusal', () => {
|
|
394
394
|
it('records the reason, evicts the cached lists, and announces it to everyone without the text', async () => {
|
|
395
395
|
const { db, sets } = updateDb();
|
|
396
396
|
const emitted: unknown[] = [];
|
|
@@ -522,7 +522,7 @@ describe('WorkflowService — the persisted apply refusal', () => {
|
|
|
522
522
|
|
|
523
523
|
describe('change-request-apply-failed on the bus', () => {
|
|
524
524
|
it('reaches every session — the author and other viewers, not only the clicker', () => {
|
|
525
|
-
const bus = new
|
|
525
|
+
const bus = new VersionControlEventBus();
|
|
526
526
|
const sub = (sessionId: string, userId: string) => ({
|
|
527
527
|
sessionId,
|
|
528
528
|
userId,
|
|
@@ -544,11 +544,11 @@ describe('change-request-apply-failed on the bus', () => {
|
|
|
544
544
|
|
|
545
545
|
// ── Read back through the summary ───────────────────────────────────────────
|
|
546
546
|
|
|
547
|
-
describe('
|
|
547
|
+
describe('VersionControlService — a refusal clears when a change makes it obsolete', () => {
|
|
548
548
|
const approveArgs = [7, 'Plugins/x/SKILL.md', ADMIN, [], 'h', 'main', null, 'ws'] as const;
|
|
549
549
|
const EARLIER = new Date(Date.now() - 60_000);
|
|
550
550
|
|
|
551
|
-
/** A gate-bound markdown file's approval state, as the review
|
|
551
|
+
/** A gate-bound markdown file's approval state, as the change-request review returns it. */
|
|
552
552
|
const fileState = (path: string, isApproved: boolean): FileApprovalState => ({
|
|
553
553
|
path,
|
|
554
554
|
eligibleApprovers: { roles: ['Plugin owners'], users: [] },
|
|
@@ -571,7 +571,7 @@ describe('WorkflowService — a refusal clears when a change makes it obsolete',
|
|
|
571
571
|
return approvalsAfter;
|
|
572
572
|
}),
|
|
573
573
|
// The real gate: whether an approval answers the refusal is its verdict.
|
|
574
|
-
evaluateMergeGate: (input) =>
|
|
574
|
+
evaluateMergeGate: (input) => ChangeRequestReviewService.prototype.evaluateMergeGate.call({}, input),
|
|
575
575
|
});
|
|
576
576
|
return { ...store, svc, prs, emitted };
|
|
577
577
|
}
|
|
@@ -695,7 +695,7 @@ describe('WorkflowService — a refusal clears when a change makes it obsolete',
|
|
|
695
695
|
} as unknown as Database;
|
|
696
696
|
const { svc } = service(db, () => {}, {
|
|
697
697
|
approveFile: vi.fn(async () => ALL_APPROVED),
|
|
698
|
-
evaluateMergeGate: (input) =>
|
|
698
|
+
evaluateMergeGate: (input) => ChangeRequestReviewService.prototype.evaluateMergeGate.call({}, input),
|
|
699
699
|
});
|
|
700
700
|
await expect(svc.approveFile(...approveArgs)).resolves.toEqual(ALL_APPROVED);
|
|
701
701
|
});
|
|
@@ -839,7 +839,7 @@ describe('GET change requests — the refusal reason reaches only viewers who ca
|
|
|
839
839
|
touchedNodePaths: opts.touchedNodePaths ?? CR.touchedNodePaths,
|
|
840
840
|
lastApplyFailure: { ...FAILURE },
|
|
841
841
|
};
|
|
842
|
-
const
|
|
842
|
+
const versionControl = {
|
|
843
843
|
listChangeRequests: vi.fn(async () => [cached]),
|
|
844
844
|
listChangeRequestsAuthoredBy: vi.fn(async () => [cached]),
|
|
845
845
|
listChangeRequestsForUser: vi.fn(async () => [cached]),
|
|
@@ -855,11 +855,11 @@ describe('GET change requests — the refusal reason reaches only viewers who ca
|
|
|
855
855
|
});
|
|
856
856
|
app.use(
|
|
857
857
|
'/api',
|
|
858
|
-
|
|
859
|
-
|
|
858
|
+
createVersionControlRoutes(
|
|
859
|
+
versionControl as unknown as IVersionControlService,
|
|
860
860
|
{ getOrCreateForUser: vi.fn(async () => ({ id: 'ws-bo' })) } as unknown as WorkspaceService,
|
|
861
861
|
{ getUserById: vi.fn(async () => BO) } as unknown as AuthService,
|
|
862
|
-
{ emit: () => {} } as unknown as
|
|
862
|
+
{ emit: () => {} } as unknown as VersionControlEventBus,
|
|
863
863
|
{ canReadBatch } as unknown as IAccessControl,
|
|
864
864
|
'knowledge-base',
|
|
865
865
|
),
|
|
@@ -1043,7 +1043,7 @@ describe('migration 0009 — refusals recorded before the kind existed are class
|
|
|
1043
1043
|
|
|
1044
1044
|
it("the prefix it matches is the one the merge gate's refusal actually carries", () => {
|
|
1045
1045
|
const gateSource = readFileSync(
|
|
1046
|
-
path.join(coreMigrationsDir(), '..', 'src/modules/
|
|
1046
|
+
path.join(coreMigrationsDir(), '..', 'src/modules/version-control/change-request-review/change-request-review.service.ts'),
|
|
1047
1047
|
'utf8',
|
|
1048
1048
|
);
|
|
1049
1049
|
const prefix = /LIKE '([^%']*)%' THEN 'gate'/.exec(migration)![1]!;
|