@bevel-software/platform-core-backend 0.34.0 → 0.36.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/agent-guide/access-control.md +146 -300
- package/agent-guide/conventions.md +23 -25
- package/agent-guide/directory-structure.md +72 -120
- package/agent-guide/drafts-and-change-requests.md +92 -0
- package/agent-guide/for-git-users.md +47 -0
- package/agent-guide/glossary.md +36 -0
- package/agent-guide/how-agents-find-things.md +49 -0
- package/agent-guide/html-views.md +16 -11
- package/agent-guide/new-knowledge-base.md +9 -8
- package/agent-guide/onboarding.md +111 -0
- package/agent-guide/skills.md +67 -42
- package/agent-guide/start-here.md +66 -0
- package/agent-guide/tool-manuals.md +133 -154
- package/agent-guide/tools.md +67 -0
- package/agent-guide/where-a-new-file-goes.md +45 -28
- package/dist/core/catalog-cache-invalidation.d.ts +2 -2
- package/dist/core/catalog-cache-invalidation.d.ts.map +1 -1
- package/dist/core/compose-embed.d.ts +2 -2
- package/dist/core/compose-embed.d.ts.map +1 -1
- package/dist/core/compose-embed.js +1 -1
- package/dist/core/compose-embed.js.map +1 -1
- package/dist/core/core-ports.d.ts +19 -4
- package/dist/core/core-ports.d.ts.map +1 -1
- package/dist/core/core-ports.js.map +1 -1
- package/dist/core/create-core-server.d.ts.map +1 -1
- package/dist/core/create-core-server.js +27 -25
- package/dist/core/create-core-server.js.map +1 -1
- package/dist/core/create-core-services.d.ts +25 -13
- package/dist/core/create-core-services.d.ts.map +1 -1
- package/dist/core/create-core-services.js +75 -60
- package/dist/core/create-core-services.js.map +1 -1
- package/dist/core/lifecycle.d.ts +4 -4
- package/dist/core/lifecycle.d.ts.map +1 -1
- package/dist/core/lifecycle.js +5 -5
- package/dist/core/lifecycle.js.map +1 -1
- package/dist/core-config.d.ts +2 -2
- package/dist/core-config.js +3 -3
- package/dist/core-config.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +1 -1
- package/dist/modules/access/access-control.interface.d.ts +22 -0
- package/dist/modules/access/access-control.interface.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.d.ts +3 -1
- package/dist/modules/access/access-control.service.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.js +76 -1
- package/dist/modules/access/access-control.service.js.map +1 -1
- package/dist/modules/access/access-declarations.d.ts +2 -2
- package/dist/modules/access/access-declarations.d.ts.map +1 -1
- package/dist/modules/access/access-declarations.js +2 -2
- package/dist/modules/access/access-declarations.js.map +1 -1
- package/dist/modules/access/access-mutation.service.d.ts +2 -2
- package/dist/modules/access/access-mutation.service.d.ts.map +1 -1
- package/dist/modules/access/access-mutation.service.js +2 -2
- package/dist/modules/access/access-mutation.service.js.map +1 -1
- package/dist/modules/access/access-requests.routes.d.ts +2 -2
- package/dist/modules/access/access-requests.routes.d.ts.map +1 -1
- package/dist/modules/access/access-requests.routes.js +5 -5
- package/dist/modules/access/access-requests.routes.js.map +1 -1
- package/dist/modules/access/access-requests.service.d.ts +2 -2
- package/dist/modules/access/access-requests.service.d.ts.map +1 -1
- package/dist/modules/access/access-requests.service.js +11 -11
- package/dist/modules/access/access-requests.service.js.map +1 -1
- package/dist/modules/access/access.routes.d.ts +2 -2
- package/dist/modules/access/access.routes.d.ts.map +1 -1
- package/dist/modules/access/access.routes.js +32 -13
- package/dist/modules/access/access.routes.js.map +1 -1
- package/dist/modules/access/admin-locked-commit.d.ts +5 -5
- package/dist/modules/access/admin-locked-commit.d.ts.map +1 -1
- package/dist/modules/access/admin-locked-commit.js +7 -7
- package/dist/modules/access/admin-locked-commit.js.map +1 -1
- package/dist/modules/access/admin-route-helpers.d.ts +1 -1
- package/dist/modules/access/admin-route-helpers.js +5 -5
- package/dist/modules/access/admin-route-helpers.js.map +1 -1
- package/dist/modules/access/change-read-gate.d.ts +1 -1
- package/dist/modules/access/change-read-gate.js +1 -1
- package/dist/modules/access/groups-admin.service.d.ts +7 -7
- package/dist/modules/access/groups-admin.service.d.ts.map +1 -1
- package/dist/modules/access/groups-admin.service.js +6 -6
- package/dist/modules/access/groups-admin.service.js.map +1 -1
- package/dist/modules/access/index.d.ts +1 -1
- package/dist/modules/access/index.d.ts.map +1 -1
- package/dist/modules/access/reference-scan.d.ts +1 -1
- package/dist/modules/access/roles-admin.service.d.ts +7 -7
- package/dist/modules/access/roles-admin.service.d.ts.map +1 -1
- package/dist/modules/access/roles-admin.service.js +8 -8
- package/dist/modules/access/roles-admin.service.js.map +1 -1
- package/dist/modules/access/synced-groups-committer.d.ts +4 -4
- package/dist/modules/access/synced-groups-committer.d.ts.map +1 -1
- package/dist/modules/access/synced-groups-committer.js +7 -7
- package/dist/modules/access/synced-groups-committer.js.map +1 -1
- package/dist/modules/access/user-access-removal.service.d.ts +6 -6
- package/dist/modules/access/user-access-removal.service.d.ts.map +1 -1
- package/dist/modules/access/user-access-removal.service.js +4 -4
- package/dist/modules/access/user-access-removal.service.js.map +1 -1
- package/dist/modules/access-model/access-errors.d.ts +4 -4
- package/dist/modules/access-model/access-errors.d.ts.map +1 -1
- package/dist/modules/access-model/access-errors.js +4 -4
- package/dist/modules/access-model/access-errors.js.map +1 -1
- package/dist/modules/access-model/access-grammar.d.ts +1 -1
- package/dist/modules/access-model/access-grammar.js +4 -4
- package/dist/modules/access-model/change-gate.d.ts +1 -1
- package/dist/modules/access-model/change-gate.js +1 -1
- package/dist/modules/access-model/roles-yaml-guard.d.ts +4 -4
- package/dist/modules/access-model/roles-yaml-guard.d.ts.map +1 -1
- package/dist/modules/access-model/roles-yaml-guard.js +4 -4
- package/dist/modules/access-model/roles-yaml-guard.js.map +1 -1
- package/dist/modules/agent-guide/agent-guide.d.ts +63 -18
- package/dist/modules/agent-guide/agent-guide.d.ts.map +1 -1
- package/dist/modules/agent-guide/agent-guide.js +144 -30
- package/dist/modules/agent-guide/agent-guide.js.map +1 -1
- package/dist/modules/agent-guide/agent-guide.tools.d.ts +6 -2
- package/dist/modules/agent-guide/agent-guide.tools.d.ts.map +1 -1
- package/dist/modules/agent-guide/agent-guide.tools.js +45 -31
- package/dist/modules/agent-guide/agent-guide.tools.js.map +1 -1
- package/dist/modules/agent-guide/guide-budget.d.ts +51 -0
- package/dist/modules/agent-guide/guide-budget.d.ts.map +1 -0
- package/dist/modules/agent-guide/guide-budget.js +71 -0
- package/dist/modules/agent-guide/guide-budget.js.map +1 -0
- package/dist/modules/agent-guide/index.d.ts +2 -1
- package/dist/modules/agent-guide/index.d.ts.map +1 -1
- package/dist/modules/agent-guide/index.js +2 -1
- package/dist/modules/agent-guide/index.js.map +1 -1
- package/dist/modules/agent-instructions/agent-instructions.routes.d.ts +12 -5
- package/dist/modules/agent-instructions/agent-instructions.routes.d.ts.map +1 -1
- package/dist/modules/agent-instructions/agent-instructions.routes.js +13 -6
- package/dist/modules/agent-instructions/agent-instructions.routes.js.map +1 -1
- package/dist/modules/agent-instructions/compose.d.ts +15 -8
- package/dist/modules/agent-instructions/compose.d.ts.map +1 -1
- package/dist/modules/agent-instructions/compose.js +28 -10
- package/dist/modules/agent-instructions/compose.js.map +1 -1
- package/dist/modules/agent-instructions/shared-file-rules.d.ts +14 -6
- package/dist/modules/agent-instructions/shared-file-rules.d.ts.map +1 -1
- package/dist/modules/agent-instructions/shared-file-rules.js +60 -18
- package/dist/modules/agent-instructions/shared-file-rules.js.map +1 -1
- package/dist/modules/auth/account-erasure.service.d.ts +36 -7
- package/dist/modules/auth/account-erasure.service.d.ts.map +1 -1
- package/dist/modules/auth/account-erasure.service.js +30 -10
- package/dist/modules/auth/account-erasure.service.js.map +1 -1
- package/dist/modules/auth/account-hooks.d.ts +20 -0
- package/dist/modules/auth/account-hooks.d.ts.map +1 -1
- package/dist/modules/auth/account-hooks.js +10 -0
- package/dist/modules/auth/account-hooks.js.map +1 -1
- package/dist/modules/auth/account-switch-lock.js +2 -2
- package/dist/modules/auth/account-switch-lock.js.map +1 -1
- package/dist/modules/auth/account.routes.d.ts +7 -2
- package/dist/modules/auth/account.routes.d.ts.map +1 -1
- package/dist/modules/auth/account.routes.js +23 -4
- package/dist/modules/auth/account.routes.js.map +1 -1
- package/dist/modules/auth/auth.service.d.ts +1 -1
- package/dist/modules/auth/auth.service.js +4 -4
- package/dist/modules/auth/auth.service.js.map +1 -1
- package/dist/modules/auth/index.d.ts +1 -0
- package/dist/modules/auth/index.d.ts.map +1 -1
- package/dist/modules/code-mode/code-mode.tool.js +2 -2
- package/dist/modules/code-mode/code-mode.tool.js.map +1 -1
- package/dist/modules/connection-probe/connection-probe.service.d.ts +0 -12
- package/dist/modules/connection-probe/connection-probe.service.d.ts.map +1 -1
- package/dist/modules/connection-probe/connection-probe.service.js +1 -38
- package/dist/modules/connection-probe/connection-probe.service.js.map +1 -1
- package/dist/modules/database/core-schema.js +2 -2
- package/dist/modules/database/core-schema.js.map +1 -1
- package/dist/modules/diff/diff.routes.d.ts +3 -3
- package/dist/modules/diff/diff.routes.d.ts.map +1 -1
- package/dist/modules/diff/diff.routes.js +7 -7
- package/dist/modules/diff/diff.routes.js.map +1 -1
- package/dist/modules/embed/embed.routes.js +1 -1
- package/dist/modules/embed/embed.routes.js.map +1 -1
- package/dist/modules/embed/embed.service.d.ts +4 -4
- package/dist/modules/embed/embed.service.d.ts.map +1 -1
- package/dist/modules/embed/embed.service.js +18 -18
- package/dist/modules/embed/embed.service.js.map +1 -1
- package/dist/modules/kb-fs/branch-name.js +8 -8
- package/dist/modules/kb-fs/branch-name.js.map +1 -1
- package/dist/modules/kb-fs/file-change-notifier.d.ts +2 -2
- package/dist/modules/kb-fs/locking-filesystem.d.ts +9 -9
- package/dist/modules/kb-fs/locking-filesystem.d.ts.map +1 -1
- package/dist/modules/kb-fs/locking-filesystem.js +27 -27
- package/dist/modules/kb-fs/locking-filesystem.js.map +1 -1
- package/dist/modules/kb-fs/repo-path.js +5 -5
- package/dist/modules/kb-fs/repo-path.js.map +1 -1
- package/dist/modules/kb-fs/tmp-ref.d.ts +2 -2
- package/dist/modules/kb-fs/tmp-ref.d.ts.map +1 -1
- package/dist/modules/kb-fs/tmp-ref.js +2 -2
- package/dist/modules/kb-fs/tmp-ref.js.map +1 -1
- package/dist/modules/kb-sync/index.d.ts +1 -1
- package/dist/modules/kb-sync/index.d.ts.map +1 -1
- package/dist/modules/kb-sync/kb-sync.interface.d.ts +3 -3
- package/dist/modules/kb-sync/kb-sync.interface.d.ts.map +1 -1
- package/dist/modules/kb-sync/kb-sync.service.d.ts +3 -3
- package/dist/modules/kb-sync/kb-sync.service.d.ts.map +1 -1
- package/dist/modules/kb-sync/kb-sync.service.js +10 -10
- package/dist/modules/kb-sync/kb-sync.service.js.map +1 -1
- package/dist/modules/mcp/mcp.service.d.ts +11 -4
- package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
- package/dist/modules/mcp/mcp.service.js +80 -53
- package/dist/modules/mcp/mcp.service.js.map +1 -1
- package/dist/modules/onboarding/onboarding.contract.d.ts +1 -1
- package/dist/modules/onboarding/onboarding.routes.js +2 -2
- package/dist/modules/onboarding/onboarding.routes.js.map +1 -1
- package/dist/modules/onboarding/starter-pack.service.d.ts +4 -4
- package/dist/modules/onboarding/starter-pack.service.d.ts.map +1 -1
- package/dist/modules/onboarding/starter-pack.service.js +4 -4
- package/dist/modules/onboarding/starter-pack.service.js.map +1 -1
- package/dist/modules/plugins/join-request-jobs.service.d.ts +2 -2
- package/dist/modules/plugins/join-request-jobs.service.d.ts.map +1 -1
- package/dist/modules/plugins/join-request-jobs.service.js +7 -7
- package/dist/modules/plugins/join-request-jobs.service.js.map +1 -1
- package/dist/modules/plugins/join-requests.service.d.ts +3 -3
- package/dist/modules/plugins/join-requests.service.d.ts.map +1 -1
- package/dist/modules/plugins/join-requests.service.js +5 -5
- package/dist/modules/plugins/join-requests.service.js.map +1 -1
- package/dist/modules/plugins/plugin-rename.service.js +1 -1
- package/dist/modules/plugins/plugin-rename.service.js.map +1 -1
- package/dist/modules/plugins/plugins.routes.d.ts +2 -2
- package/dist/modules/plugins/plugins.routes.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.routes.js +8 -8
- package/dist/modules/plugins/plugins.routes.js.map +1 -1
- package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts +87 -2
- package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts.map +1 -1
- package/dist/modules/secrets-vault/db-secrets-vault.service.js +635 -74
- package/dist/modules/secrets-vault/db-secrets-vault.service.js.map +1 -1
- package/dist/modules/secrets-vault/index.d.ts +3 -2
- package/dist/modules/secrets-vault/index.d.ts.map +1 -1
- package/dist/modules/secrets-vault/index.js +2 -1
- package/dist/modules/secrets-vault/index.js.map +1 -1
- package/dist/modules/secrets-vault/managed-sign-in-erasure.d.ts +36 -0
- package/dist/modules/secrets-vault/managed-sign-in-erasure.d.ts.map +1 -0
- package/dist/modules/secrets-vault/managed-sign-in-erasure.js +37 -0
- package/dist/modules/secrets-vault/managed-sign-in-erasure.js.map +1 -0
- package/dist/modules/secrets-vault/secrets-vault.contract.d.ts +205 -11
- package/dist/modules/secrets-vault/secrets-vault.contract.d.ts.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.contract.js +27 -0
- package/dist/modules/secrets-vault/secrets-vault.contract.js.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.routes.d.ts +7 -1
- package/dist/modules/secrets-vault/secrets-vault.routes.d.ts.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.routes.js +206 -45
- package/dist/modules/secrets-vault/secrets-vault.routes.js.map +1 -1
- package/dist/modules/settings/connection-check.js +1 -1
- package/dist/modules/settings/connection-check.js.map +1 -1
- package/dist/modules/settings/deployment-settings.service.js +1 -1
- package/dist/modules/settings/git-root-folders.js +1 -1
- package/dist/modules/settings/git-root-folders.js.map +1 -1
- package/dist/modules/settings/oidc-check.d.ts.map +1 -1
- package/dist/modules/settings/oidc-check.js +5 -17
- package/dist/modules/settings/oidc-check.js.map +1 -1
- package/dist/modules/settings/setup.routes.d.ts +1 -1
- package/dist/modules/settings/setup.routes.js +1 -1
- package/dist/modules/skills/pending-skills.service.d.ts +3 -3
- package/dist/modules/skills/pending-skills.service.d.ts.map +1 -1
- package/dist/modules/skills/pending-skills.service.js +4 -4
- package/dist/modules/skills/pending-skills.service.js.map +1 -1
- package/dist/modules/skills/skill-access-requests.routes.d.ts +2 -2
- package/dist/modules/skills/skill-access-requests.routes.d.ts.map +1 -1
- package/dist/modules/skills/skill-access-requests.routes.js +5 -5
- package/dist/modules/skills/skill-access-requests.routes.js.map +1 -1
- package/dist/modules/skills/skills.tools.js +1 -1
- package/dist/modules/skills/skills.tools.js.map +1 -1
- package/dist/modules/tool-helpers/tool-context.d.ts +4 -4
- package/dist/modules/tool-helpers/tool-context.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool-context.js +2 -2
- package/dist/modules/tool-helpers/tool-context.js.map +1 -1
- package/dist/modules/tool-helpers/tool-def.js +1 -1
- package/dist/modules/tool-helpers/tool-def.js.map +1 -1
- package/dist/modules/tool-helpers/tool-handler.js +2 -2
- package/dist/modules/tool-helpers/tool-handler.js.map +1 -1
- package/dist/modules/tool-helpers/tool.contract.d.ts +4 -4
- package/dist/modules/tool-helpers/tool.contract.d.ts.map +1 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.d.ts +7 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.d.ts.map +1 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.js +69 -38
- package/dist/modules/tool-manuals/mcp-json-discovery.js.map +1 -1
- package/dist/modules/tool-manuals/mcp-server-edit.service.js +1 -1
- package/dist/modules/tool-manuals/mcp-server-edit.service.js.map +1 -1
- package/dist/modules/tool-manuals/pending-tools.service.d.ts +3 -3
- package/dist/modules/tool-manuals/pending-tools.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/pending-tools.service.js +4 -4
- package/dist/modules/tool-manuals/pending-tools.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-delete.service.js +1 -1
- package/dist/modules/tool-manuals/tool-delete.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.contract.d.ts +70 -3
- package/dist/modules/tool-manuals/tool-manuals.contract.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts +18 -8
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.js +166 -49
- package/dist/modules/tool-manuals/tool-manuals.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts +11 -2
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.js +66 -24
- package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -1
- package/dist/modules/version-control/agent-tools/change-request-read-shape.d.ts.map +1 -0
- package/dist/modules/version-control/agent-tools/change-request-read-shape.js.map +1 -0
- package/dist/modules/version-control/agent-tools/change-request-read.tools.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/agent-tools/change-request-read.tools.js +2 -2
- package/dist/modules/version-control/agent-tools/change-request-read.tools.js.map +1 -0
- package/dist/modules/version-control/agent-tools/change-request-summary.d.ts.map +1 -0
- package/dist/modules/version-control/agent-tools/change-request-summary.js.map +1 -0
- package/dist/modules/{workflow/agent-tools/workflow.tools.d.ts → version-control/agent-tools/version-control.tools.d.ts} +4 -4
- package/dist/modules/version-control/agent-tools/version-control.tools.d.ts.map +1 -0
- package/dist/modules/{workflow/agent-tools/workflow.tools.js → version-control/agent-tools/version-control.tools.js} +53 -49
- package/dist/modules/version-control/agent-tools/version-control.tools.js.map +1 -0
- package/dist/modules/{workflow → version-control}/change-request-hooks.d.ts +1 -1
- package/dist/modules/version-control/change-request-hooks.d.ts.map +1 -0
- package/dist/modules/version-control/change-request-hooks.js.map +1 -0
- package/dist/modules/version-control/change-request-review/approval-lock.d.ts.map +1 -0
- package/dist/modules/version-control/change-request-review/approval-lock.js.map +1 -0
- package/dist/modules/{workflow/review-workflow/review-workflow.interface.d.ts → version-control/change-request-review/change-request-review.interface.d.ts} +2 -2
- package/dist/modules/version-control/change-request-review/change-request-review.interface.d.ts.map +1 -0
- package/dist/modules/version-control/change-request-review/change-request-review.interface.js +2 -0
- package/dist/modules/version-control/change-request-review/change-request-review.interface.js.map +1 -0
- package/dist/modules/{workflow/review-workflow/review-workflow.service.d.ts → version-control/change-request-review/change-request-review.service.d.ts} +3 -3
- package/dist/modules/version-control/change-request-review/change-request-review.service.d.ts.map +1 -0
- package/dist/modules/{workflow/review-workflow/review-workflow.service.js → version-control/change-request-review/change-request-review.service.js} +26 -26
- package/dist/modules/version-control/change-request-review/change-request-review.service.js.map +1 -0
- package/dist/modules/{workflow → version-control}/event-bus.d.ts +8 -8
- package/dist/modules/version-control/event-bus.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/event-bus.js +4 -4
- package/dist/modules/version-control/event-bus.js.map +1 -0
- package/dist/modules/{workflow → version-control}/events-delivery.d.ts +4 -4
- package/dist/modules/version-control/events-delivery.d.ts.map +1 -0
- package/dist/modules/version-control/events-delivery.js.map +1 -0
- package/dist/modules/{workflow → version-control}/events.routes.d.ts +4 -4
- package/dist/modules/version-control/events.routes.d.ts.map +1 -0
- package/dist/modules/version-control/events.routes.js.map +1 -0
- package/dist/modules/{workflow → version-control}/file-lock.service.d.ts +2 -2
- package/dist/modules/version-control/file-lock.service.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/file-lock.service.js +6 -6
- package/dist/modules/version-control/file-lock.service.js.map +1 -0
- package/dist/modules/version-control/git/change-request-link.d.ts.map +1 -0
- package/dist/modules/version-control/git/change-request-link.js.map +1 -0
- package/dist/modules/version-control/git/git-version.d.ts.map +1 -0
- package/dist/modules/version-control/git/git-version.js.map +1 -0
- package/dist/modules/{workflow → version-control}/git/git.service.d.ts +8 -8
- package/dist/modules/version-control/git/git.service.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/git/git.service.js +53 -53
- package/dist/modules/version-control/git/git.service.js.map +1 -0
- package/dist/modules/version-control/git/merge-commit.d.ts.map +1 -0
- package/dist/modules/version-control/git/merge-commit.js.map +1 -0
- package/dist/modules/version-control/git/node-git-runner.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/git/node-git-runner.js +1 -1
- package/dist/modules/version-control/git/node-git-runner.js.map +1 -0
- package/dist/modules/{workflow → version-control}/git/pull-request.service.d.ts +5 -5
- package/dist/modules/version-control/git/pull-request.service.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/git/pull-request.service.js +10 -10
- package/dist/modules/version-control/git/pull-request.service.js.map +1 -0
- package/dist/modules/{workflow → version-control}/index.d.ts +6 -5
- package/dist/modules/version-control/index.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/index.js +3 -2
- package/dist/modules/version-control/index.js.map +1 -0
- package/dist/modules/{workflow → version-control}/pending-commits.service.d.ts +2 -2
- package/dist/modules/version-control/pending-commits.service.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/pending-commits.service.js +2 -2
- package/dist/modules/version-control/pending-commits.service.js.map +1 -0
- package/dist/modules/{workflow → version-control}/pending-commits.worker.d.ts +5 -5
- package/dist/modules/version-control/pending-commits.worker.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/pending-commits.worker.js +3 -3
- package/dist/modules/version-control/pending-commits.worker.js.map +1 -0
- package/dist/modules/{workflow → version-control}/read-on-branch.d.ts +2 -2
- package/dist/modules/version-control/read-on-branch.d.ts.map +1 -0
- package/dist/modules/{workflow → version-control}/read-on-branch.js +2 -2
- package/dist/modules/version-control/read-on-branch.js.map +1 -0
- package/dist/modules/version-control/recovery-bot.d.ts.map +1 -0
- package/dist/modules/version-control/recovery-bot.js.map +1 -0
- package/dist/modules/version-control/sanitize-error.d.ts.map +1 -0
- package/dist/modules/version-control/sanitize-error.js.map +1 -0
- package/dist/modules/{workflow/workflow-hooks.d.ts → version-control/version-control-hooks.d.ts} +4 -4
- package/dist/modules/version-control/version-control-hooks.d.ts.map +1 -0
- package/dist/modules/{workflow/workflow-hooks.js → version-control/version-control-hooks.js} +3 -3
- package/dist/modules/version-control/version-control-hooks.js.map +1 -0
- package/dist/modules/{workflow/workflow.routes.d.ts → version-control/version-control.routes.d.ts} +6 -5
- package/dist/modules/version-control/version-control.routes.d.ts.map +1 -0
- package/dist/modules/{workflow/workflow.routes.js → version-control/version-control.routes.js} +61 -60
- package/dist/modules/version-control/version-control.routes.js.map +1 -0
- package/dist/modules/{workflow/workflow.service.d.ts → version-control/version-control.service.d.ts} +26 -31
- package/dist/modules/version-control/version-control.service.d.ts.map +1 -0
- package/dist/modules/{workflow/workflow.service.js → version-control/version-control.service.js} +89 -94
- package/dist/modules/version-control/version-control.service.js.map +1 -0
- package/dist/modules/workspace/agent-access.gate.d.ts +6 -6
- package/dist/modules/workspace/agent-access.gate.d.ts.map +1 -1
- package/dist/modules/workspace/agent-access.gate.js +2 -2
- package/dist/modules/workspace/agent-access.gate.js.map +1 -1
- package/dist/modules/workspace/git-internals.middleware.d.ts +1 -1
- package/dist/modules/workspace/git-internals.middleware.js +2 -2
- package/dist/modules/workspace/kb-repository.js +1 -1
- package/dist/modules/workspace/kb-repository.js.map +1 -1
- package/dist/modules/workspace/startup/kb-git.d.ts +1 -1
- package/dist/modules/workspace/startup/kb-git.d.ts.map +1 -1
- package/dist/modules/workspace/startup/kb-git.js +1 -1
- package/dist/modules/workspace/startup/kb-git.js.map +1 -1
- package/dist/modules/workspace/startup/steps/seed-tree.d.ts +2 -2
- package/dist/modules/workspace/startup/steps/seed-tree.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/seed-tree.js +1 -1
- package/dist/modules/workspace/startup/steps/seed-tree.js.map +1 -1
- package/dist/modules/workspace/startup/steps/template-files.step.d.ts +2 -2
- package/dist/modules/workspace/startup/steps/template-files.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/template-files.step.js +2 -2
- package/dist/modules/workspace/startup/steps/template-files.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/template-source.d.ts +17 -4
- package/dist/modules/workspace/startup/steps/template-source.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/template-source.js +8 -5
- package/dist/modules/workspace/startup/steps/template-source.js.map +1 -1
- package/dist/modules/workspace/workspace-tmp.js +3 -3
- package/dist/modules/workspace/workspace-tmp.js.map +1 -1
- package/dist/modules/workspace/workspace.routes.d.ts +4 -4
- package/dist/modules/workspace/workspace.routes.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.routes.js +22 -22
- package/dist/modules/workspace/workspace.routes.js.map +1 -1
- package/dist/modules/workspace/workspace.service.d.ts +6 -6
- package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.service.js +11 -11
- package/dist/modules/workspace/workspace.service.js.map +1 -1
- package/dist/modules/workspace/workspace.tools.d.ts +5 -3
- package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.tools.js +85 -30
- package/dist/modules/workspace/workspace.tools.js.map +1 -1
- package/dist/shared/canonical-file-identity.d.ts +2 -2
- package/dist/shared/canonical-file-identity.js +5 -5
- package/dist/shared/canonical-file-identity.js.map +1 -1
- package/dist/shared/domain-errors.d.ts +39 -39
- package/dist/shared/domain-errors.d.ts.map +1 -1
- package/dist/shared/domain-errors.js +44 -44
- package/dist/shared/domain-errors.js.map +1 -1
- package/dist/shared/git.contract.d.ts +1 -1
- package/dist/shared/git.contract.js +1 -1
- package/dist/shared/http-errors.d.ts +3 -3
- package/dist/shared/http-errors.d.ts.map +1 -1
- package/dist/shared/http-errors.js +1 -1
- package/dist/shared/http-errors.js.map +1 -1
- package/dist/shared/oauth-token-error.d.ts +23 -0
- package/dist/shared/oauth-token-error.d.ts.map +1 -0
- package/dist/shared/oauth-token-error.js +47 -0
- package/dist/shared/oauth-token-error.js.map +1 -0
- package/dist/shared/pending-proposals.d.ts +3 -3
- package/dist/shared/pending-proposals.d.ts.map +1 -1
- package/dist/shared/pending-proposals.js +2 -2
- package/dist/shared/pending-proposals.js.map +1 -1
- package/dist/shared/read-capped.d.ts +19 -0
- package/dist/shared/read-capped.d.ts.map +1 -0
- package/dist/shared/read-capped.js +45 -0
- package/dist/shared/read-capped.js.map +1 -0
- package/dist/tenancy/static-tenant-source.js +1 -1
- package/dist/tenancy/static-tenant-source.js.map +1 -1
- package/migrations/0012_agent_audit.sql +40 -40
- package/migrations/0013_agent_identity_and_key_soft_delete.sql +29 -29
- package/migrations/meta/0012_snapshot.json +2246 -2246
- package/migrations/meta/0013_snapshot.json +2258 -2258
- package/package.json +5 -4
- package/src/__tests__/account-admin.ts +27 -0
- package/src/__tests__/hexis-catalog.ts +144 -0
- package/src/__tests__/kb-context.ts +30 -30
- package/src/__tests__/kb-layout-config.test.ts +21 -0
- package/src/__tests__/open-change-gate.ts +1 -1
- package/src/__tests__/real-disk.ts +21 -0
- package/src/__tests__/tokens.ts +19 -0
- package/src/__tests__/tool-handler.ts +15 -0
- package/src/__tests__/tool-manuals.ts +32 -0
- package/src/__tests__/tool-wiring.ts +31 -0
- package/src/__tests__/workspace-service.ts +1 -1
- package/src/core/__tests__/catalog-cache-invalidation.test.ts +3 -3
- package/src/core/__tests__/compose-embed.test.ts +1 -1
- package/src/core/__tests__/damaged-document.tools.test.ts +3 -3
- package/src/core/__tests__/erasure-slices-wired-once.test.ts +46 -0
- package/src/core/__tests__/gated-boot.test.ts +2 -2
- package/src/core/__tests__/lifecycle.test.ts +9 -9
- package/src/core/__tests__/oauth-sign-in-real-file.test.ts +179 -0
- package/src/core/catalog-cache-invalidation.ts +2 -2
- package/src/core/compose-embed.ts +3 -3
- package/src/core/core-ports.ts +19 -4
- package/src/core/create-core-server.ts +40 -26
- package/src/core/create-core-services.ts +92 -66
- package/src/core/lifecycle.ts +9 -9
- package/src/core-config.ts +3 -3
- package/src/index.ts +5 -5
- package/src/modules/access/__tests__/access-control.admin-root-floor.test.ts +4 -4
- package/src/modules/access/__tests__/access-own-read-grant.test.ts +14 -14
- package/src/modules/access/__tests__/access-requests.routes.test.ts +20 -20
- package/src/modules/access/__tests__/access.routes.admins.test.ts +4 -4
- package/src/modules/access/__tests__/access.routes.batch.test.ts +4 -4
- package/src/modules/access/__tests__/access.routes.folder-governs.test.ts +6 -6
- package/src/modules/access/__tests__/access.routes.group-grant.test.ts +6 -6
- package/src/modules/access/__tests__/access.routes.overrides.test.ts +5 -5
- package/src/modules/access/__tests__/access.routes.proposal-branch.test.ts +6 -6
- package/src/modules/access/__tests__/access.routes.prospective.test.ts +54 -14
- package/src/modules/access/__tests__/access.routes.revoke.test.ts +6 -6
- package/src/modules/access/__tests__/access.routes.unknown-email.test.ts +6 -6
- package/src/modules/access/__tests__/admin-locked-commit.test.ts +6 -6
- package/src/modules/access/__tests__/admin-route-helpers.test.ts +5 -5
- package/src/modules/access/__tests__/groups-admin.service.test.ts +27 -27
- package/src/modules/access/__tests__/holder-changes.test.ts +127 -0
- package/src/modules/access/__tests__/roles-admin.security.test.ts +14 -13
- package/src/modules/access/__tests__/roles-admin.service.test.ts +27 -27
- package/src/modules/access/__tests__/roles-capabilities.test.ts +19 -19
- package/src/modules/access/__tests__/roles.routes.test.ts +6 -6
- package/src/modules/access/__tests__/synced-groups-committer.test.ts +13 -13
- package/src/modules/access/__tests__/user-access-removal.service.test.ts +29 -29
- package/src/modules/access/access-control.interface.ts +26 -0
- package/src/modules/access/access-control.service.ts +93 -1
- package/src/modules/access/access-declarations.ts +2 -2
- package/src/modules/access/access-mutation.service.ts +2 -2
- package/src/modules/access/access-requests.routes.ts +7 -7
- package/src/modules/access/access-requests.service.ts +13 -13
- package/src/modules/access/access.routes.ts +34 -15
- package/src/modules/access/admin-locked-commit.ts +11 -11
- package/src/modules/access/admin-route-helpers.ts +5 -5
- package/src/modules/access/change-read-gate.ts +1 -1
- package/src/modules/access/groups-admin.service.ts +7 -7
- package/src/modules/access/index.ts +1 -1
- package/src/modules/access/reference-scan.ts +1 -1
- package/src/modules/access/roles-admin.service.ts +9 -9
- package/src/modules/access/synced-groups-committer.ts +11 -11
- package/src/modules/access/user-access-removal.service.ts +7 -7
- package/src/modules/access-model/__tests__/access-grammar.test.ts +2 -2
- package/src/modules/access-model/access-errors.ts +4 -4
- package/src/modules/access-model/access-grammar.ts +4 -4
- package/src/modules/access-model/change-gate.ts +1 -1
- package/src/modules/access-model/roles-yaml-guard.ts +4 -4
- package/src/modules/agent-guide/__tests__/agent-guide.test.ts +98 -29
- package/src/modules/agent-guide/__tests__/agent-guide.tools.test.ts +39 -12
- package/src/modules/agent-guide/__tests__/guide-budget.test.ts +95 -0
- package/src/modules/agent-guide/__tests__/guide-eval.test.ts +182 -0
- package/src/modules/agent-guide/__tests__/guide-matches-code.test.ts +263 -0
- package/src/modules/agent-guide/__tests__/tool-surface.json +514 -0
- package/src/modules/agent-guide/__tests__/tool-surface.test.ts +75 -0
- package/src/modules/agent-guide/agent-guide.tools.ts +49 -31
- package/src/modules/agent-guide/agent-guide.ts +165 -32
- package/src/modules/agent-guide/guide-budget.ts +77 -0
- package/src/modules/agent-guide/index.ts +12 -0
- package/src/modules/agent-instructions/__tests__/agent-instructions.route.test.ts +4 -5
- package/src/modules/agent-instructions/__tests__/compose.test.ts +1 -1
- package/src/modules/agent-instructions/__tests__/shared-file-rules.test.ts +117 -11
- package/src/modules/agent-instructions/agent-instructions.routes.ts +12 -5
- package/src/modules/agent-instructions/compose.ts +28 -9
- package/src/modules/agent-instructions/shared-file-rules.ts +62 -18
- package/src/modules/agent-scope/__tests__/agent-surfaces.connect-as.test.ts +1 -1
- package/src/modules/audit/__tests__/agent-rest-audit.middleware.test.ts +113 -113
- package/src/modules/audit/__tests__/event-classifier.test.ts +121 -121
- package/src/modules/audit/event-classifier.ts +155 -155
- package/src/modules/auth/__tests__/account-deactivation.test.ts +1 -1
- package/src/modules/auth/__tests__/account-erasure.approval-gate.test.ts +4 -4
- package/src/modules/auth/__tests__/account-erasure.participants.test.ts +56 -0
- package/src/modules/auth/__tests__/account-switch-lock.pg.test.ts +2 -2
- package/src/modules/auth/__tests__/account-switch-lock.test.ts +2 -2
- package/src/modules/auth/__tests__/account.routes.test.ts +73 -11
- package/src/modules/auth/__tests__/auth.service.test.ts +1 -1
- package/src/modules/auth/account-erasure.service.ts +27 -9
- package/src/modules/auth/account-hooks.ts +34 -0
- package/src/modules/auth/account-switch-lock.ts +2 -2
- package/src/modules/auth/account.routes.ts +23 -5
- package/src/modules/auth/auth.service.ts +4 -4
- package/src/modules/auth/index.ts +1 -0
- package/src/modules/code-mode/code-mode.tool.ts +2 -2
- package/src/modules/connection-probe/__tests__/connection-probe.service.test.ts +5 -24
- package/src/modules/connection-probe/connection-probe.service.ts +1 -34
- package/src/modules/database/__tests__/advisory-lock.test.ts +169 -169
- package/src/modules/database/__tests__/migrations-unqualified.test.ts +32 -32
- package/src/modules/database/core-schema.ts +2 -2
- package/src/modules/diff/__tests__/diff.routes.read-gate.test.ts +2 -2
- package/src/modules/diff/__tests__/diff.routes.rejectPathsLocked.test.ts +12 -12
- package/src/modules/diff/diff.routes.ts +8 -8
- package/src/modules/embed/__tests__/embed.service.lock.test.ts +7 -7
- package/src/modules/embed/__tests__/embed.service.test.ts +42 -42
- package/src/modules/embed/__tests__/embed.tools.test.ts +1 -1
- package/src/modules/embed/embed.routes.ts +1 -1
- package/src/modules/embed/embed.service.ts +17 -17
- package/src/modules/kb-fs/__tests__/branch-name.test.ts +2 -2
- package/src/modules/kb-fs/__tests__/locking-filesystem.test.ts +260 -260
- package/src/modules/kb-fs/__tests__/move-with-edits.test.ts +34 -34
- package/src/modules/kb-fs/__tests__/repo-path.test.ts +8 -8
- package/src/modules/kb-fs/branch-name.ts +8 -8
- package/src/modules/kb-fs/file-change-notifier.ts +2 -2
- package/src/modules/kb-fs/locking-filesystem.ts +30 -30
- package/src/modules/kb-fs/repo-path.ts +5 -5
- package/src/modules/kb-fs/tmp-ref.ts +3 -3
- package/src/modules/kb-sync/__tests__/kb-sync.service.test.ts +36 -36
- package/src/modules/kb-sync/index.ts +1 -1
- package/src/modules/kb-sync/kb-sync.interface.ts +3 -3
- package/src/modules/kb-sync/kb-sync.service.ts +9 -9
- package/src/modules/marketplace/__tests__/github-facade.test.ts +1 -1
- package/src/modules/marketplace/__tests__/marketplace-git.test.ts +1 -1
- package/src/modules/mcp/__tests__/mcp-proxy-helpers.test.ts +4 -2
- package/src/modules/mcp/__tests__/mcp.e2e.test.ts +69 -8
- package/src/modules/mcp/__tests__/mcp.service.test.ts +91 -13
- package/src/modules/mcp/__tests__/read-only-hint.pg.test.ts +194 -0
- package/src/modules/mcp/mcp.service.ts +93 -62
- package/src/modules/onboarding/__tests__/starter-pack.service.test.ts +55 -55
- package/src/modules/onboarding/onboarding.contract.ts +1 -1
- package/src/modules/onboarding/onboarding.routes.ts +2 -2
- package/src/modules/onboarding/starter-pack.service.ts +6 -6
- package/src/modules/plugins/__tests__/bundle-dialect.e2e.test.ts +1 -1
- package/src/modules/plugins/__tests__/compile-marketplace.test.ts +1 -1
- package/src/modules/plugins/__tests__/join-request-jobs.service.test.ts +43 -43
- package/src/modules/plugins/__tests__/join-requests.service.test.ts +19 -19
- package/src/modules/plugins/__tests__/join-requests.settlement.test.ts +26 -26
- package/src/modules/plugins/__tests__/plugins.routes.test.ts +25 -25
- package/src/modules/plugins/join-request-jobs.service.ts +10 -10
- package/src/modules/plugins/join-requests.service.ts +4 -4
- package/src/modules/plugins/plugin-rename.service.ts +1 -1
- package/src/modules/plugins/plugins.routes.ts +9 -9
- package/src/modules/secrets-vault/__tests__/db-secrets-vault.managed.test.ts +773 -0
- package/src/modules/secrets-vault/__tests__/db-secrets-vault.oauth.test.ts +458 -4
- package/src/modules/secrets-vault/__tests__/managed-sign-in.route.test.ts +351 -0
- package/src/modules/secrets-vault/__tests__/oauth-live-declaration.route.test.ts +218 -0
- package/src/modules/secrets-vault/__tests__/oauth-return-to.route.test.ts +39 -6
- package/src/modules/secrets-vault/db-secrets-vault.service.ts +728 -118
- package/src/modules/secrets-vault/index.ts +8 -1
- package/src/modules/secrets-vault/managed-sign-in-erasure.ts +41 -0
- package/src/modules/secrets-vault/secrets-variable-loader.ts +134 -134
- package/src/modules/secrets-vault/secrets-vault.contract.ts +213 -11
- package/src/modules/secrets-vault/secrets-vault.routes.ts +244 -45
- package/src/modules/settings/__tests__/repository-source.test.ts +1 -1
- package/src/modules/settings/__tests__/setup.routes.layout-phase.test.ts +1 -1
- package/src/modules/settings/__tests__/setup.routes.managed-phase.test.ts +1 -1
- package/src/modules/settings/connection-check.ts +1 -1
- package/src/modules/settings/deployment-settings.service.ts +1 -1
- package/src/modules/settings/git-root-folders.ts +1 -1
- package/src/modules/settings/oidc-check.ts +5 -18
- package/src/modules/settings/setup.routes.ts +1 -1
- package/src/modules/skills/__tests__/allowed-tools-warn.tools.test.ts +3 -3
- package/src/modules/skills/__tests__/branch-skills.tools.test.ts +1 -1
- package/src/modules/skills/__tests__/pending-skills.service.test.ts +8 -8
- package/src/modules/skills/__tests__/skill-access-requests.routes.test.ts +18 -18
- package/src/modules/skills/__tests__/skills.service.test.ts +3 -3
- package/src/modules/skills/pending-skills.service.ts +3 -3
- package/src/modules/skills/skill-access-requests.routes.ts +7 -7
- package/src/modules/skills/skills.tools.ts +1 -1
- package/src/modules/tool-helpers/__tests__/agent-roles-write.test.ts +22 -14
- package/src/modules/tool-helpers/__tests__/branch-declaration.test.ts +3 -3
- package/src/modules/tool-helpers/__tests__/can-write.tools.test.ts +3 -3
- package/src/modules/tool-helpers/__tests__/phase4-tools.test.ts +4 -4
- package/src/modules/tool-helpers/__tests__/route-tool-schemas.catalog.test.ts +38 -0
- package/src/modules/tool-helpers/__tests__/tools-surface.test.ts +3 -3
- package/src/modules/tool-helpers/__tests__/validate-token.test.ts +1 -1
- package/src/modules/tool-helpers/tool-context.ts +6 -6
- package/src/modules/tool-helpers/tool-def.ts +1 -1
- package/src/modules/tool-helpers/tool-handler.ts +2 -2
- package/src/modules/tool-helpers/tool.contract.ts +4 -4
- package/src/modules/tool-manuals/__tests__/pending-tools.service.test.ts +9 -9
- package/src/modules/tool-manuals/__tests__/tool-manuals.managed-sign-in.test.ts +89 -0
- package/src/modules/tool-manuals/__tests__/tool-manuals.mcp-oauth.test.ts +197 -11
- package/src/modules/tool-manuals/__tests__/tool-manuals.restart.test.ts +1 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.tools.test.ts +132 -6
- package/src/modules/tool-manuals/mcp-json-discovery.ts +73 -34
- package/src/modules/tool-manuals/mcp-server-edit.service.ts +1 -1
- package/src/modules/tool-manuals/pending-tools.service.ts +3 -3
- package/src/modules/tool-manuals/tool-delete.service.ts +1 -1
- package/src/modules/tool-manuals/tool-manuals.contract.ts +63 -3
- package/src/modules/tool-manuals/tool-manuals.service.ts +191 -51
- package/src/modules/tool-manuals/tool-manuals.tools.ts +93 -28
- package/src/modules/tool-registry/__tests__/own-tool-schemas.test.ts +4 -4
- package/src/modules/tool-registry/__tests__/read-only-hints.test.ts +3 -3
- package/src/modules/tool-registry/__tests__/tool-description-length.test.ts +12 -119
- package/src/modules/{workflow → version-control}/__tests__/apply-failure.test.ts +54 -54
- package/src/modules/{workflow → version-control}/__tests__/event-bus.test.ts +27 -27
- package/src/modules/{workflow → version-control}/__tests__/events-delivery.test.ts +37 -37
- package/src/modules/{workflow → version-control}/__tests__/file-lock.service.deletion-gate.test.ts +2 -2
- package/src/modules/{workflow → version-control}/__tests__/file-lock.service.path-identity.test.ts +8 -8
- package/src/modules/{workflow → version-control}/__tests__/merge-announces-tree.test.ts +11 -11
- package/src/modules/{workflow → version-control}/__tests__/pending-commits.worker.concurrency.test.ts +9 -9
- package/src/modules/{workflow → version-control}/__tests__/pending-commits.worker.test.ts +25 -25
- package/src/modules/{workflow → version-control}/__tests__/preserve-roles-yaml.test.ts +42 -42
- package/src/modules/version-control/__tests__/public-surface.test.ts +114 -0
- package/src/modules/{workflow/__tests__/workflow.routes.folder-proposals.test.ts → version-control/__tests__/version-control.routes.folder-proposals.test.ts} +18 -18
- package/src/modules/{workflow/__tests__/workflow.routes.fork-point-file.test.ts → version-control/__tests__/version-control.routes.fork-point-file.test.ts} +19 -19
- package/src/modules/{workflow/__tests__/workflow.routes.history-read-gate.test.ts → version-control/__tests__/version-control.routes.history-read-gate.test.ts} +13 -13
- package/src/modules/{workflow/__tests__/workflow.routes.lock-path.test.ts → version-control/__tests__/version-control.routes.lock-path.test.ts} +18 -18
- package/src/modules/{workflow/__tests__/workflow.routes.open-change-request.test.ts → version-control/__tests__/version-control.routes.open-change-request.test.ts} +7 -7
- package/src/modules/{workflow/__tests__/workflow.routes.push-refused.test.ts → version-control/__tests__/version-control.routes.push-refused.test.ts} +14 -14
- package/src/modules/{workflow/__tests__/workflow.service.branch-in-use.test.ts → version-control/__tests__/version-control.service.branch-in-use.test.ts} +6 -6
- package/src/modules/{workflow/__tests__/workflow.service.commitFileWhileLocked.test.ts → version-control/__tests__/version-control.service.commitFileWhileLocked.test.ts} +14 -14
- package/src/modules/{workflow/__tests__/workflow.service.delete-branch.test.ts → version-control/__tests__/version-control.service.delete-branch.test.ts} +14 -14
- package/src/modules/{workflow/__tests__/workflow.service.deleted-branch-sweep.test.ts → version-control/__tests__/version-control.service.deleted-branch-sweep.test.ts} +4 -4
- package/src/modules/{workflow/__tests__/workflow.service.facade.test.ts → version-control/__tests__/version-control.service.facade.test.ts} +97 -99
- package/src/modules/{workflow/__tests__/workflow.service.folder-proposals.test.ts → version-control/__tests__/version-control.service.folder-proposals.test.ts} +7 -7
- package/src/modules/{workflow/__tests__/workflow.service.platform-restore.test.ts → version-control/__tests__/version-control.service.platform-restore.test.ts} +6 -6
- package/src/modules/{workflow/__tests__/workflow.service.read-gate.test.ts → version-control/__tests__/version-control.service.read-gate.test.ts} +9 -9
- package/src/modules/{workflow/__tests__/workflow.service.releaseLock.test.ts → version-control/__tests__/version-control.service.releaseLock.test.ts} +42 -42
- package/src/modules/{workflow/__tests__/workflow.service.repository-replaced.test.ts → version-control/__tests__/version-control.service.repository-replaced.test.ts} +4 -4
- package/src/modules/{workflow/__tests__/workflow.service.sync.test.ts → version-control/__tests__/version-control.service.sync.test.ts} +17 -17
- package/src/modules/{workflow/__tests__/workflow.service.update-change-request.pg.test.ts → version-control/__tests__/version-control.service.update-change-request.pg.test.ts} +6 -6
- package/src/modules/{workflow/__tests__/workflow.service.update-change-request.test.ts → version-control/__tests__/version-control.service.update-change-request.test.ts} +11 -11
- package/src/modules/{workflow/__tests__/workflow.service.update-from-target.test.ts → version-control/__tests__/version-control.service.update-from-target.test.ts} +22 -22
- package/src/modules/{workflow → version-control}/agent-tools/__tests__/change-request-read.tools.test.ts +3 -3
- package/src/modules/{workflow → version-control}/agent-tools/__tests__/update-change-request.parity.test.ts +16 -16
- package/src/modules/{workflow/agent-tools/__tests__/workflow.tools.test.ts → version-control/agent-tools/__tests__/version-control.tools.test.ts} +9 -9
- package/src/modules/{workflow → version-control}/agent-tools/change-request-read.tools.ts +2 -2
- package/src/modules/{workflow/agent-tools/workflow.tools.ts → version-control/agent-tools/version-control.tools.ts} +52 -48
- package/src/modules/{workflow → version-control}/change-request-hooks.ts +1 -1
- package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/approval-states.test.ts +5 -5
- package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/cancel-pr.test.ts +8 -8
- package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/carry-approvals-forward.test.ts +6 -6
- package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/erase-approver.test.ts +5 -5
- package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/merge-gate.test.ts +3 -3
- package/src/modules/{workflow/review-workflow → version-control/change-request-review}/__tests__/merge-records-own-commit.test.ts +3 -3
- package/src/modules/{workflow/review-workflow/review-workflow.interface.ts → version-control/change-request-review/change-request-review.interface.ts} +1 -1
- package/src/modules/{workflow/review-workflow/review-workflow.service.ts → version-control/change-request-review/change-request-review.service.ts} +28 -28
- package/src/modules/{workflow → version-control}/event-bus.ts +14 -14
- package/src/modules/{workflow → version-control}/events-delivery.ts +11 -11
- package/src/modules/{workflow → version-control}/events.routes.ts +5 -5
- package/src/modules/{workflow → version-control}/file-lock.service.ts +6 -6
- package/src/modules/{workflow → version-control}/git/__tests__/git-test-helpers.ts +3 -3
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.accessGating.test.ts +5 -5
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.appliedChange.test.ts +4 -4
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.changedFilesForPr.test.ts +16 -16
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.changedPathsMemo.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.commitChanges.test.ts +3 -3
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.commitFile.strayPath.test.ts +10 -10
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.commitFile.test.ts +3 -3
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.createBranch.test.ts +3 -3
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.deleteBranch.test.ts +7 -7
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.diffFileAtCommit.test.ts +9 -9
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.diffFileBetweenBranches.test.ts +23 -23
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.fileBytesAtCommit.test.ts +7 -7
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.fileContentsAtCommit.test.ts +3 -3
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.forkPoint.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.history-guards.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.list-branches.test.ts +12 -12
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.listTrackedFiles.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.logForFile.test.ts +6 -6
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.mergeChangeRequest.test.ts +20 -20
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.mergeIntoBranch.test.ts +16 -16
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.pendingChanges.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.postMergePull.test.ts +5 -5
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.prFetchFailure.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.pull.test.ts +12 -12
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.readFileAtRef.test.ts +3 -3
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.revertPathsAndPush.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.status.test.ts +4 -4
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.syncFromRemote.test.ts +8 -8
- package/src/modules/{workflow → version-control}/git/__tests__/git.service.worktrees.test.ts +4 -4
- package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.list-fetch.test.ts +2 -2
- package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.test.ts +6 -6
- package/src/modules/{workflow → version-control}/git/git.service.ts +57 -57
- package/src/modules/{workflow → version-control}/git/node-git-runner.ts +1 -1
- package/src/modules/{workflow → version-control}/git/pull-request.service.ts +12 -12
- package/src/modules/{workflow → version-control}/index.ts +6 -5
- package/src/modules/{workflow → version-control}/pending-commits.service.ts +2 -2
- package/src/modules/{workflow → version-control}/pending-commits.worker.ts +8 -8
- package/src/modules/{workflow → version-control}/read-on-branch.ts +2 -2
- package/src/modules/{workflow/workflow-hooks.ts → version-control/version-control-hooks.ts} +3 -3
- package/src/modules/{workflow/workflow.routes.ts → version-control/version-control.routes.ts} +64 -63
- package/src/modules/{workflow/workflow.service.ts → version-control/version-control.service.ts} +92 -97
- package/src/modules/workspace/__tests__/agent-access.gate.test.ts +8 -8
- package/src/modules/workspace/__tests__/agent-downloads.test.ts +13 -16
- package/src/modules/workspace/__tests__/agent-uploads.test.ts +11 -12
- package/src/modules/workspace/__tests__/escape-sequences.routes.test.ts +11 -16
- package/src/modules/workspace/__tests__/file-stat-access.test.ts +3 -3
- package/src/modules/workspace/__tests__/git-internals.security.test.ts +27 -27
- package/src/modules/workspace/__tests__/kb-repository.test.ts +1 -1
- package/src/modules/workspace/__tests__/rest-tool-arguments.test.ts +3 -3
- package/src/modules/workspace/__tests__/start-session.default-branch.test.ts +152 -0
- package/src/modules/workspace/__tests__/workspace-paths-inside-the-repo.test.ts +6 -6
- package/src/modules/workspace/__tests__/workspace-tmp.tools.test.ts +13 -14
- package/src/modules/workspace/__tests__/workspace.routes.at-ref.test.ts +6 -6
- package/src/modules/workspace/__tests__/workspace.routes.branch-errors.test.ts +4 -4
- package/src/modules/workspace/__tests__/workspace.routes.create-grant.test.ts +6 -6
- package/src/modules/workspace/__tests__/workspace.routes.delete.test.ts +8 -8
- package/src/modules/workspace/__tests__/workspace.routes.download-implies-read.test.ts +4 -4
- package/src/modules/workspace/__tests__/workspace.routes.download.test.ts +6 -6
- package/src/modules/workspace/__tests__/workspace.routes.file-writes.test.ts +6 -6
- package/src/modules/workspace/__tests__/workspace.routes.folder-zip-access.test.ts +4 -4
- package/src/modules/workspace/__tests__/workspace.routes.folders.test.ts +6 -6
- package/src/modules/workspace/__tests__/workspace.routes.move-platform-files.test.ts +7 -7
- package/src/modules/workspace/__tests__/workspace.routes.read-gate.test.ts +13 -13
- package/src/modules/workspace/__tests__/workspace.service.any-workspace-credentials.test.ts +1 -1
- package/src/modules/workspace/__tests__/workspace.service.replaced-repository.test.ts +1 -1
- package/src/modules/workspace/__tests__/workspace.service.worktrees.test.ts +1 -1
- package/src/modules/workspace/__tests__/workspace.tools.agents-file.test.ts +12 -14
- package/src/modules/workspace/__tests__/workspace.tools.branch-errors.test.ts +5 -5
- package/src/modules/workspace/__tests__/workspace.tools.test.ts +182 -75
- package/src/modules/workspace/agent-access.gate.ts +6 -6
- package/src/modules/workspace/git-internals.middleware.ts +2 -2
- package/src/modules/workspace/kb-repository.ts +1 -1
- package/src/modules/workspace/startup/__tests__/kb-startup-runner.degraded.test.ts +1 -1
- package/src/modules/workspace/startup/__tests__/kb-startup-runner.test.ts +1 -1
- package/src/modules/workspace/startup/__tests__/kb-startup-runner.worktrees.test.ts +1 -1
- package/src/modules/workspace/startup/kb-git.ts +1 -1
- package/src/modules/workspace/startup/steps/__tests__/steps.test.ts +94 -70
- package/src/modules/workspace/startup/steps/seed-tree.ts +4 -5
- package/src/modules/workspace/startup/steps/template-files.step.ts +4 -5
- package/src/modules/workspace/startup/steps/template-source.ts +21 -6
- package/src/modules/workspace/workspace-tmp.ts +4 -4
- package/src/modules/workspace/workspace.routes.ts +26 -26
- package/src/modules/workspace/workspace.service.ts +11 -11
- package/src/modules/workspace/workspace.tools.ts +90 -30
- package/src/shared/__tests__/canonical-file-identity.test.ts +5 -5
- package/src/shared/__tests__/http-errors.test.ts +4 -4
- package/src/shared/__tests__/read-capped.test.ts +68 -0
- package/src/shared/canonical-file-identity.ts +5 -5
- package/src/shared/domain-errors.ts +44 -44
- package/src/shared/git.contract.ts +1 -1
- package/src/shared/http-errors.ts +3 -3
- package/src/shared/kb-context.ts +130 -130
- package/src/shared/oauth-token-error.ts +46 -0
- package/src/shared/pending-proposals.ts +4 -4
- package/src/shared/read-capped.ts +40 -0
- package/src/tenancy/__tests__/tenant-host.test.ts +372 -372
- package/src/tenancy/__tests__/tenant-runtime.test.ts +221 -221
- package/src/tenancy/__tests__/tenant-secrets.test.ts +35 -35
- package/src/tenancy/index.ts +35 -35
- package/src/tenancy/static-tenant-source.ts +1 -1
- package/src/tenancy/tenant-host.ts +261 -261
- package/src/tenancy/tenant-runtime.ts +208 -208
- package/src/tenancy/tenant-source.contract.ts +59 -59
- package/agent-guide/finding-things.md +0 -7
- package/agent-guide/introduction.md +0 -27
- package/dist/modules/workflow/agent-tools/change-request-read-shape.d.ts.map +0 -1
- package/dist/modules/workflow/agent-tools/change-request-read-shape.js.map +0 -1
- package/dist/modules/workflow/agent-tools/change-request-read.tools.d.ts.map +0 -1
- package/dist/modules/workflow/agent-tools/change-request-read.tools.js.map +0 -1
- package/dist/modules/workflow/agent-tools/change-request-summary.d.ts.map +0 -1
- package/dist/modules/workflow/agent-tools/change-request-summary.js.map +0 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +0 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.js.map +0 -1
- package/dist/modules/workflow/change-request-hooks.d.ts.map +0 -1
- package/dist/modules/workflow/change-request-hooks.js.map +0 -1
- package/dist/modules/workflow/event-bus.d.ts.map +0 -1
- package/dist/modules/workflow/event-bus.js.map +0 -1
- package/dist/modules/workflow/events-delivery.d.ts.map +0 -1
- package/dist/modules/workflow/events-delivery.js.map +0 -1
- package/dist/modules/workflow/events.routes.d.ts.map +0 -1
- package/dist/modules/workflow/events.routes.js.map +0 -1
- package/dist/modules/workflow/file-lock.service.d.ts.map +0 -1
- package/dist/modules/workflow/file-lock.service.js.map +0 -1
- package/dist/modules/workflow/git/change-request-link.d.ts.map +0 -1
- package/dist/modules/workflow/git/change-request-link.js.map +0 -1
- package/dist/modules/workflow/git/git-version.d.ts.map +0 -1
- package/dist/modules/workflow/git/git-version.js.map +0 -1
- package/dist/modules/workflow/git/git.service.d.ts.map +0 -1
- package/dist/modules/workflow/git/git.service.js.map +0 -1
- package/dist/modules/workflow/git/merge-commit.d.ts.map +0 -1
- package/dist/modules/workflow/git/merge-commit.js.map +0 -1
- package/dist/modules/workflow/git/node-git-runner.d.ts.map +0 -1
- package/dist/modules/workflow/git/node-git-runner.js.map +0 -1
- package/dist/modules/workflow/git/pull-request.service.d.ts.map +0 -1
- package/dist/modules/workflow/git/pull-request.service.js.map +0 -1
- package/dist/modules/workflow/index.d.ts.map +0 -1
- package/dist/modules/workflow/index.js.map +0 -1
- package/dist/modules/workflow/pending-commits.service.d.ts.map +0 -1
- package/dist/modules/workflow/pending-commits.service.js.map +0 -1
- package/dist/modules/workflow/pending-commits.worker.d.ts.map +0 -1
- package/dist/modules/workflow/pending-commits.worker.js.map +0 -1
- package/dist/modules/workflow/read-on-branch.d.ts.map +0 -1
- package/dist/modules/workflow/read-on-branch.js.map +0 -1
- package/dist/modules/workflow/recovery-bot.d.ts.map +0 -1
- package/dist/modules/workflow/recovery-bot.js.map +0 -1
- package/dist/modules/workflow/review-workflow/approval-lock.d.ts.map +0 -1
- package/dist/modules/workflow/review-workflow/approval-lock.js.map +0 -1
- package/dist/modules/workflow/review-workflow/review-workflow.interface.d.ts.map +0 -1
- package/dist/modules/workflow/review-workflow/review-workflow.interface.js +0 -2
- package/dist/modules/workflow/review-workflow/review-workflow.interface.js.map +0 -1
- package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts.map +0 -1
- package/dist/modules/workflow/review-workflow/review-workflow.service.js.map +0 -1
- package/dist/modules/workflow/sanitize-error.d.ts.map +0 -1
- package/dist/modules/workflow/sanitize-error.js.map +0 -1
- package/dist/modules/workflow/workflow-hooks.d.ts.map +0 -1
- package/dist/modules/workflow/workflow-hooks.js.map +0 -1
- package/dist/modules/workflow/workflow.routes.d.ts.map +0 -1
- package/dist/modules/workflow/workflow.routes.js.map +0 -1
- package/dist/modules/workflow/workflow.service.d.ts.map +0 -1
- package/dist/modules/workflow/workflow.service.js.map +0 -1
- package/src/modules/mcp/__tests__/read-only-hint.e2e.test.ts +0 -213
- /package/dist/modules/{workflow → version-control}/agent-tools/change-request-read-shape.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/agent-tools/change-request-read-shape.js +0 -0
- /package/dist/modules/{workflow → version-control}/agent-tools/change-request-read.tools.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/agent-tools/change-request-summary.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/agent-tools/change-request-summary.js +0 -0
- /package/dist/modules/{workflow → version-control}/change-request-hooks.js +0 -0
- /package/dist/modules/{workflow/review-workflow → version-control/change-request-review}/approval-lock.d.ts +0 -0
- /package/dist/modules/{workflow/review-workflow → version-control/change-request-review}/approval-lock.js +0 -0
- /package/dist/modules/{workflow → version-control}/events-delivery.js +0 -0
- /package/dist/modules/{workflow → version-control}/events.routes.js +0 -0
- /package/dist/modules/{workflow → version-control}/git/change-request-link.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/git/change-request-link.js +0 -0
- /package/dist/modules/{workflow → version-control}/git/git-version.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/git/git-version.js +0 -0
- /package/dist/modules/{workflow → version-control}/git/merge-commit.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/git/merge-commit.js +0 -0
- /package/dist/modules/{workflow → version-control}/git/node-git-runner.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/recovery-bot.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/recovery-bot.js +0 -0
- /package/dist/modules/{workflow → version-control}/sanitize-error.d.ts +0 -0
- /package/dist/modules/{workflow → version-control}/sanitize-error.js +0 -0
- /package/src/modules/{workflow → version-control}/__tests__/change-request-hooks.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/__tests__/fake-file-lock-db.ts +0 -0
- /package/src/modules/{workflow → version-control}/__tests__/pending-commits.canonical.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/__tests__/pending-commits.enqueue-if-absent.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/__tests__/pending-commits.repository-replaced.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/__tests__/sanitize-error.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/agent-tools/__tests__/change-request-read-shape.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/agent-tools/change-request-read-shape.ts +0 -0
- /package/src/modules/{workflow → version-control}/agent-tools/change-request-summary.ts +0 -0
- /package/src/modules/{workflow/review-workflow → version-control/change-request-review}/approval-lock.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/branchAuthor.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/change-request-link.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/git-version.failure.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/git-version.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/node-git-runner.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.getPrDetail.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.placeholder.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.viewer-can-cancel.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.viewer-can-delete.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/__tests__/pull-request.service.viewer-can-update.test.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/change-request-link.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/git-version.ts +0 -0
- /package/src/modules/{workflow → version-control}/git/merge-commit.ts +0 -0
- /package/src/modules/{workflow → version-control}/recovery-bot.ts +0 -0
- /package/src/modules/{workflow → version-control}/sanitize-error.ts +0 -0
|
@@ -10,40 +10,38 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
|
10
10
|
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
11
11
|
import { slowRipgrep } from '../../../__tests__/slow-ripgrep.js';
|
|
12
12
|
import { LocalFilesystem } from '@mastra/core/workspace';
|
|
13
|
-
import { ToolRegistry } from '../../tool-registry/
|
|
14
|
-
import { createToolHandlerFactory } from '
|
|
15
|
-
import { ToolError, type ToolContext } from '../../tool-helpers/
|
|
16
|
-
import type { ToolAuth } from '../../tool-auth/
|
|
13
|
+
import { GUIDE_FIRST_SENTENCE, ToolRegistry } from '../../tool-registry/index.js';
|
|
14
|
+
import { AccessControlService, VersionControlHooks, createToolHandlerFactory, type AgentOperationContext } from '../../../__tests__/tool-wiring.js';
|
|
15
|
+
import { ToolError, type ToolContext } from '../../tool-helpers/index.js';
|
|
16
|
+
import type { ToolAuth } from '../../tool-auth/index.js';
|
|
17
17
|
import { registerWorkspaceTools } from '../workspace.tools.js';
|
|
18
18
|
import { RipgrepPatternMatcher, type RipgrepPatternMatcherOptions } from '../index.js';
|
|
19
|
-
import { sharedFileRules, sharedFileRulesSection } from '../../agent-instructions/
|
|
20
|
-
import { composeAgentGuide } from '../../agent-guide/
|
|
21
|
-
import { GUIDE_FIRST_SENTENCE } from '../../tool-registry/guide-first.js';
|
|
19
|
+
import { sharedFileRules, sharedFileRulesSection } from '../../agent-instructions/index.js';
|
|
20
|
+
import { composeAgentGuide } from '../../agent-guide/index.js';
|
|
22
21
|
import { RoutineWritePolicyService } from '../routine-write-policy.js';
|
|
23
22
|
import { UuidSessionSink, type ISessionSink } from '../session-sink.js';
|
|
24
23
|
import { FIRST_RUN_SECTION_ID, STARTER_GUIDE_FILE, firstRunNote, type FirstRunStarterSource } from '../first-run.js';
|
|
25
|
-
import { WorkflowHooks, type AgentOperationContext } from '../../workflow/workflow-hooks.js';
|
|
26
24
|
import { SESSION_ID_DESCRIPTION, ToolDescriptionNotes } from '../agent-access.gate.js';
|
|
27
25
|
import { SpillStore } from '../spill-store.js';
|
|
28
26
|
import { DocExtractService } from '../file-readers/doc-extract.service.js';
|
|
29
27
|
import { WorkerDocumentExtractor } from '../file-readers/extract-in-worker.js';
|
|
30
28
|
import { OCTET_STREAM_FALLBACK_NOTE } from '../file-readers/content-mode.js';
|
|
31
|
-
import type { IAccessControl } from '../../access/
|
|
32
|
-
import {
|
|
33
|
-
import { NodeFs } from '../../kb-fs/node-fs.js';
|
|
29
|
+
import type { IAccessControl } from '../../access/index.js';
|
|
30
|
+
import { realDisk } from '../../../__tests__/real-disk.js';
|
|
34
31
|
import type { WorkspaceService } from '../workspace.service.js';
|
|
35
32
|
import { DEFAULT_KB_LAYOUT, isBranchAuthoredBy, isOwnSuggestionsBranch } from '@bevel-software/platform-shared';
|
|
36
|
-
import { normalizeWorkspacePath } from '../../kb-fs/
|
|
33
|
+
import { normalizeWorkspacePath } from '../../kb-fs/index.js';
|
|
37
34
|
import { GIT_INTERNALS_MESSAGE, PathNotFoundError } from '../../../shared/domain-errors.js';
|
|
38
|
-
import { AccessDeniedError } from '../../access-model/
|
|
35
|
+
import { AccessDeniedError } from '../../access-model/index.js';
|
|
39
36
|
import { proposalTitleFor } from '../write-denial.js';
|
|
40
37
|
import { NOT_FOUND_NEXT_STEP } from '../not-found.js';
|
|
41
38
|
import { compileCheck, exampleArguments } from '@bevel-software/platform-mcp-core';
|
|
42
|
-
import { routeToolSchemas } from '../../tool-helpers/route-tool-schemas.js';
|
|
43
|
-
import { TOOL_DESCRIPTION_CAP, clientVisibleLength } from '../../tool-registry/description-length.js';
|
|
44
39
|
|
|
45
40
|
const KB_DIR = 'knowledge-base';
|
|
46
41
|
|
|
42
|
+
/** A move that changes nobody's access: what a stand-in without rules answers. */
|
|
43
|
+
const NO_CHANGES = { lose: [], gain: [] };
|
|
44
|
+
|
|
47
45
|
/** Allow-all access control — the default for tests not exercising read gating. */
|
|
48
46
|
const allowAll = {
|
|
49
47
|
canRead: async () => true,
|
|
@@ -67,6 +65,8 @@ const allowAll = {
|
|
|
67
65
|
// a folder's `access.md` files actually does to it is exercised against
|
|
68
66
|
// REAL rules in "a move preview judges the destination as it will be".
|
|
69
67
|
previewAccessAfterRelocation: async () => ({ read: true, write: true, download: true, owner: true }),
|
|
68
|
+
// Who else loses or gains access in a move: nobody, here.
|
|
69
|
+
prospectiveHolderChanges: async () => NO_CHANGES,
|
|
70
70
|
} as unknown as IAccessControl;
|
|
71
71
|
|
|
72
72
|
/** Access control that denies `canRead` for an explicit set of repo-relative paths. */
|
|
@@ -120,7 +120,7 @@ let focusedBranch: string | undefined;
|
|
|
120
120
|
/** The registry the tools were mounted into, so a test can inspect their defs. */
|
|
121
121
|
let toolRegistry: ToolRegistry;
|
|
122
122
|
/** The hook registry the tools were mounted against, so a test can register one. */
|
|
123
|
-
let hooks:
|
|
123
|
+
let hooks: VersionControlHooks;
|
|
124
124
|
/** The note registry the tools were mounted against, so a test can register a note. */
|
|
125
125
|
let notes: ToolDescriptionNotes;
|
|
126
126
|
/**
|
|
@@ -165,7 +165,7 @@ async function start(
|
|
|
165
165
|
await docExtractor?.close();
|
|
166
166
|
const extractor = new WorkerDocumentExtractor();
|
|
167
167
|
docExtractor = extractor;
|
|
168
|
-
hooks = new
|
|
168
|
+
hooks = new VersionControlHooks();
|
|
169
169
|
notes = new ToolDescriptionNotes();
|
|
170
170
|
callerSource = 'internal';
|
|
171
171
|
tempDir = await mkdtemp(join(tmpdir(), 'ws-tools-'));
|
|
@@ -307,7 +307,7 @@ async function start(
|
|
|
307
307
|
return { destination: '', extracted, skipped };
|
|
308
308
|
},
|
|
309
309
|
} as never,
|
|
310
|
-
|
|
310
|
+
versionControlService: {} as never,
|
|
311
311
|
events: {} as never,
|
|
312
312
|
getFilesystem: async () => fs,
|
|
313
313
|
});
|
|
@@ -825,10 +825,10 @@ describe('write modes and per-path outcomes', () => {
|
|
|
825
825
|
// The paragraph that said this in BOTH descriptions is one shared rule now.
|
|
826
826
|
// What stays on the tool is the input the agent fills, which is where the
|
|
827
827
|
// decision is actually taken.
|
|
828
|
-
const rule = sharedFileRules(testKbContext().layout).find((r) => r.id === 'write-mode')!;
|
|
828
|
+
const rule = sharedFileRules(testKbContext().layout, testKbContext().defaultBranch).find((r) => r.id === 'write-mode')!;
|
|
829
829
|
expect(rule.body).toContain('DEFAULTS TO `create`');
|
|
830
830
|
expect(rule.body).toContain('On write_file and write_files');
|
|
831
|
-
expect(sharedFileRulesSection(testKbContext().layout).split(rule.body)).toHaveLength(2);
|
|
831
|
+
expect(sharedFileRulesSection(testKbContext().layout, testKbContext().defaultBranch).split(rule.body)).toHaveLength(2);
|
|
832
832
|
for (const name of ['write_file', 'write_files']) {
|
|
833
833
|
const def = tools.find((t) => t.name === name)!;
|
|
834
834
|
expect(def.description, name).not.toContain('DEFAULTS TO `create`');
|
|
@@ -2089,7 +2089,7 @@ describe('office documents and PDFs', () => {
|
|
|
2089
2089
|
// description. Checked on the whole body rather than on a phrase: the
|
|
2090
2090
|
// drift this PR exists to prevent is a paragraph pasted back onto a
|
|
2091
2091
|
// tool, and naming only two marker phrases would catch two of eight.
|
|
2092
|
-
for (const rule of sharedFileRules(testKbContext().layout)) {
|
|
2092
|
+
for (const rule of sharedFileRules(testKbContext().layout, testKbContext().defaultBranch)) {
|
|
2093
2093
|
expect(def!.description, `${name} / ${rule.id}`).not.toContain(rule.body);
|
|
2094
2094
|
}
|
|
2095
2095
|
// The two lead-in labels the paragraphs used to arrive under are gone
|
|
@@ -2124,30 +2124,12 @@ describe('office documents and PDFs', () => {
|
|
|
2124
2124
|
// Narrowed by hand: the assertion above already failed the test if not.
|
|
2125
2125
|
if (!compiled.checkable) throw new Error(compiled.reason);
|
|
2126
2126
|
expect(compiled.check(exampleArguments(def.inputs)), def.name).toEqual([]);
|
|
2127
|
-
// And the FLAT schema, which is what the tool's own route checks the
|
|
2128
|
-
// call against: the two must agree, or a call the example produced would
|
|
2129
|
-
// be refused one layer in.
|
|
2130
|
-
const flat = routeToolSchemas(def.name)?.flat;
|
|
2131
|
-
expect(flat, def.name).toBeDefined();
|
|
2132
|
-
const flatCheck = compileCheck(flat);
|
|
2133
|
-
expect(flatCheck.checkable, `${def.name} (flat): ${flatCheck.checkable ? '' : flatCheck.reason}`).toBe(true);
|
|
2134
|
-
if (!flatCheck.checkable) throw new Error(flatCheck.reason);
|
|
2135
|
-
expect(flatCheck.check(exampleArguments(flat)), `${def.name} (flat)`).toEqual([]);
|
|
2136
|
-
}
|
|
2137
|
-
});
|
|
2138
|
-
|
|
2139
|
-
it('every description, call example and purpose prefix included, stays inside the cap a client shows', async () => {
|
|
2140
|
-
await start();
|
|
2141
|
-
const tools = await toolRegistry.listInternal();
|
|
2142
|
-
for (const def of tools) {
|
|
2143
|
-
// Measured as a CLIENT receives it: the call line, the purpose prefix at
|
|
2144
|
-
// its own cap (the four knowledge-base tools carry one), and the
|
|
2145
|
-
// description — the three things that ride one tool's entry.
|
|
2146
|
-
const received = clientVisibleLength(def);
|
|
2147
|
-
expect(received, `${def.name} is ${received} characters (cap ${TOOL_DESCRIPTION_CAP})`).toBeLessThanOrEqual(
|
|
2148
|
-
TOOL_DESCRIPTION_CAP,
|
|
2149
|
-
);
|
|
2150
2127
|
}
|
|
2128
|
+
// That the FLAT schema each route checks a call against agrees with the
|
|
2129
|
+
// example is the route layer's own property: tool-helpers'
|
|
2130
|
+
// `route-tool-schemas.catalog.test.ts` holds it over the whole catalog.
|
|
2131
|
+
// And that every description stays inside the cap a client shows is the
|
|
2132
|
+
// registry's: `tool-description-length.test.ts`, over the same catalog.
|
|
2151
2133
|
});
|
|
2152
2134
|
|
|
2153
2135
|
describe('binary capability contract: a text file, a document, an image and a zip', () => {
|
|
@@ -2296,10 +2278,10 @@ describe('office documents and PDFs', () => {
|
|
|
2296
2278
|
it('says where the images a page uses go — once, in the shared rules', async () => {
|
|
2297
2279
|
await start();
|
|
2298
2280
|
const tools = await toolRegistry.listInternal();
|
|
2299
|
-
const rule = sharedFileRules(testKbContext().layout).find((r) => r.id === 'images-in-pages')!;
|
|
2281
|
+
const rule = sharedFileRules(testKbContext().layout, testKbContext().defaultBranch).find((r) => r.id === 'images-in-pages')!;
|
|
2300
2282
|
expect(rule.body).toContain('`assets/` folder next to the page');
|
|
2301
2283
|
expect(rule.body).toContain('');
|
|
2302
|
-
expect(sharedFileRulesSection(testKbContext().layout)).toContain(rule.body);
|
|
2284
|
+
expect(sharedFileRulesSection(testKbContext().layout, testKbContext().defaultBranch)).toContain(rule.body);
|
|
2303
2285
|
for (const name of ['write_file', 'write_files']) {
|
|
2304
2286
|
expect(tools.find((t) => t.name === name)!.description, name).not.toContain('`assets/` folder next to the page');
|
|
2305
2287
|
}
|
|
@@ -2420,7 +2402,7 @@ describe('start_session', () => {
|
|
|
2420
2402
|
// The default branch's workspace directory, for the tests about the
|
|
2421
2403
|
// `firstRun` note. Without one the workspace service is a bare stand-in
|
|
2422
2404
|
// the note's check cannot use, which is what every other test here wants:
|
|
2423
|
-
// the call answers with the id
|
|
2405
|
+
// the call answers with the id and the default branch, never `firstRun`.
|
|
2424
2406
|
defaultWorkspaceDir?: string,
|
|
2425
2407
|
// The starter pack the knowledge base was filled from, for the note.
|
|
2426
2408
|
starterPacks?: FirstRunStarterSource,
|
|
@@ -2440,7 +2422,7 @@ describe('start_session', () => {
|
|
|
2440
2422
|
getWorkspacePath: async () => defaultWorkspaceDir,
|
|
2441
2423
|
}
|
|
2442
2424
|
: {}) as never,
|
|
2443
|
-
|
|
2425
|
+
versionControlService: {} as never,
|
|
2444
2426
|
events: {} as never,
|
|
2445
2427
|
getFilesystem: async () => ({}) as never,
|
|
2446
2428
|
});
|
|
@@ -2466,7 +2448,7 @@ describe('start_session', () => {
|
|
|
2466
2448
|
registerWorkspaceTools(
|
|
2467
2449
|
registry, router, auth, toolHandler,
|
|
2468
2450
|
new SpillStore(join(tmpdir(), 'bevel-test-spills')), new DocExtractService(join(tmpdir(), 'bevel-test-doc-extract'), extractor), access, testKbContext({ kbDirName: KB_DIR }),
|
|
2469
|
-
{ recoveryBotEmail: RECOVERY_BOT, hooks: new
|
|
2451
|
+
{ recoveryBotEmail: RECOVERY_BOT, hooks: new VersionControlHooks(), notes: new ToolDescriptionNotes() },
|
|
2470
2452
|
new RoutineWritePolicyService(),
|
|
2471
2453
|
sink ?? fakeSessionSink,
|
|
2472
2454
|
undefined,
|
|
@@ -2475,7 +2457,7 @@ describe('start_session', () => {
|
|
|
2475
2457
|
undefined,
|
|
2476
2458
|
undefined /* downloads */,
|
|
2477
2459
|
starterPacks,
|
|
2478
|
-
|
|
2460
|
+
realDisk(),
|
|
2479
2461
|
);
|
|
2480
2462
|
app.use('/api', router);
|
|
2481
2463
|
server = await new Promise<HttpServer>((r) => {
|
|
@@ -2601,7 +2583,7 @@ describe('start_session', () => {
|
|
|
2601
2583
|
registerWorkspaceTools(
|
|
2602
2584
|
registry, router, noopAuth, (() => () => {}) as never,
|
|
2603
2585
|
new SpillStore(join(tmpdir(), 'bevel-test-spills')), new DocExtractService(join(tmpdir(), 'bevel-test-doc-extract'), extractor), allowAll, testKbContext({ kbDirName: KB_DIR }),
|
|
2604
|
-
{ recoveryBotEmail: RECOVERY_BOT, hooks: new
|
|
2586
|
+
{ recoveryBotEmail: RECOVERY_BOT, hooks: new VersionControlHooks(), notes: new ToolDescriptionNotes() },
|
|
2605
2587
|
new RoutineWritePolicyService(),
|
|
2606
2588
|
{} as never,
|
|
2607
2589
|
);
|
|
@@ -2700,7 +2682,7 @@ describe('start_session', () => {
|
|
|
2700
2682
|
|
|
2701
2683
|
/**
|
|
2702
2684
|
* The note is a read: it says what the knowledge folder holds. A caller
|
|
2703
|
-
* who may not read the folder gets the id alone, and a pack page the
|
|
2685
|
+
* who may not read the folder gets the id and the default branch alone, and a pack page the
|
|
2704
2686
|
* caller may not read is judged as anybody's page, so the note never
|
|
2705
2687
|
* tells them it is still a placeholder.
|
|
2706
2688
|
*/
|
|
@@ -2708,7 +2690,7 @@ describe('start_session', () => {
|
|
|
2708
2690
|
const closed = { ...allowAll, canRead: async () => false } as unknown as IAccessControl;
|
|
2709
2691
|
const base = await startSessionApp('external', undefined, wsDir, undefined, closed);
|
|
2710
2692
|
const res = (await (await postRaw(`${base}/api/agent/tools/start_session`)).json()) as { firstRun?: string };
|
|
2711
|
-
expect(res).toEqual({ sessionId: 'thread-xyz' });
|
|
2693
|
+
expect(res).toEqual({ sessionId: 'thread-xyz', defaultBranch: 'target-company-state' });
|
|
2712
2694
|
});
|
|
2713
2695
|
|
|
2714
2696
|
it('judges the folder as the caller may see it: a page they may not read leaves the note standing', async () => {
|
|
@@ -2741,15 +2723,15 @@ describe('start_session', () => {
|
|
|
2741
2723
|
} as unknown as IAccessControl;
|
|
2742
2724
|
const base = await startSessionApp('external', undefined, wsDir, starter, pageClosed);
|
|
2743
2725
|
const res = (await (await postRaw(`${base}/api/agent/tools/start_session`)).json()) as { firstRun?: string };
|
|
2744
|
-
expect(res).toEqual({ sessionId: 'thread-xyz' });
|
|
2726
|
+
expect(res).toEqual({ sessionId: 'thread-xyz', defaultBranch: 'target-company-state' });
|
|
2745
2727
|
});
|
|
2746
2728
|
|
|
2747
|
-
it('never costs the session id: a workspace it cannot read answers with the id
|
|
2729
|
+
it('never costs the session id: a workspace it cannot read answers with the id and the default branch', async () => {
|
|
2748
2730
|
await rm(wsDir, { recursive: true, force: true });
|
|
2749
2731
|
|
|
2750
2732
|
const res = await startSession();
|
|
2751
2733
|
|
|
2752
|
-
expect(res).toEqual({ sessionId: 'thread-xyz' });
|
|
2734
|
+
expect(res).toEqual({ sessionId: 'thread-xyz', defaultBranch: 'target-company-state' });
|
|
2753
2735
|
});
|
|
2754
2736
|
});
|
|
2755
2737
|
});
|
|
@@ -2786,7 +2768,7 @@ describe('branch is a required parameter in the tool contract', () => {
|
|
|
2786
2768
|
new DocExtractService(join(tmpdir(), 'bevel-test-doc-extract'), extractor),
|
|
2787
2769
|
allowAll,
|
|
2788
2770
|
testKbContext({ kbDirName: KB_DIR }),
|
|
2789
|
-
{ recoveryBotEmail: RECOVERY_BOT, hooks: new
|
|
2771
|
+
{ recoveryBotEmail: RECOVERY_BOT, hooks: new VersionControlHooks(), notes: new ToolDescriptionNotes() },
|
|
2790
2772
|
new RoutineWritePolicyService(),
|
|
2791
2773
|
{} as never,
|
|
2792
2774
|
// Skill check, change gate, uploads, guide, downloads, starter packs, disk: not this harness's business.
|
|
@@ -3256,7 +3238,8 @@ describe('preflight for moves and deletes', () => {
|
|
|
3256
3238
|
if (rel === 'sealed.md' || rel.endsWith('/sealed.md')) return { read: true, write: false, download: false, owner: false };
|
|
3257
3239
|
if (rel.startsWith('HR/')) return { read: true, write: true, download: false, owner: false };
|
|
3258
3240
|
if (rel.startsWith('Locked/')) return { read: true, write: false, download: false, owner: false };
|
|
3259
|
-
|
|
3241
|
+
// The folder itself answers as its contents do, as the resolver's scopes do.
|
|
3242
|
+
if (rel === 'Secret' || rel.startsWith('Secret/')) return { read: false, write: false, download: false, owner: false };
|
|
3260
3243
|
return { read: true, write: true, download: true, owner: true };
|
|
3261
3244
|
};
|
|
3262
3245
|
const rules = {
|
|
@@ -3273,6 +3256,7 @@ describe('preflight for moves and deletes', () => {
|
|
|
3273
3256
|
// preview learned to relocate them, which keeps every ordering and
|
|
3274
3257
|
// oracle test below about what it is about.
|
|
3275
3258
|
previewAccessAfterRelocation: async (_w: string, _u: string, _from: string, to: string) => verbsFor(to),
|
|
3259
|
+
prospectiveHolderChanges: async () => NO_CHANGES,
|
|
3276
3260
|
} as unknown as IAccessControl;
|
|
3277
3261
|
|
|
3278
3262
|
const call = async (base: string, tool: string, body: Record<string, unknown>) => {
|
|
@@ -3401,10 +3385,12 @@ describe('preflight for moves and deletes', () => {
|
|
|
3401
3385
|
writes.push(op.wsPath ?? '');
|
|
3402
3386
|
});
|
|
3403
3387
|
expect((await call(base, 'move_file', args)).body).toMatchObject({ moved: true });
|
|
3404
|
-
//
|
|
3405
|
-
//
|
|
3406
|
-
//
|
|
3407
|
-
|
|
3388
|
+
// The move's two ends first, as read_file tells it (what moves, and
|
|
3389
|
+
// the folder it lands in); then `Locked/refs.md` is named (left for
|
|
3390
|
+
// want of write access, its links listed), so the read hook hears of
|
|
3391
|
+
// it; the unreadable page and the transcript are never named, so it
|
|
3392
|
+
// never hears of them.
|
|
3393
|
+
expect(reads.sort()).toEqual([KB('Locked/refs.md'), KB('Sales/2026'), KB('Sales/deal.md'), KB('Sales/deal.md'), KB('Sales/index.md')]);
|
|
3408
3394
|
expect([...new Set(writes)].sort()).toEqual([KB('Sales/2026/deal.md'), KB('Sales/deal.md'), KB('Sales/index.md')]);
|
|
3409
3395
|
});
|
|
3410
3396
|
|
|
@@ -3450,6 +3436,32 @@ describe('preflight for moves and deletes', () => {
|
|
|
3450
3436
|
expect(await exists(args.src)).toBe(false);
|
|
3451
3437
|
});
|
|
3452
3438
|
|
|
3439
|
+
it('a caller who cannot read what moves is refused as read_file refuses them, on a draft too, and nothing is looked at', async () => {
|
|
3440
|
+
const resolved: string[] = [];
|
|
3441
|
+
const base = await start('write', {
|
|
3442
|
+
...rules,
|
|
3443
|
+
prospectiveHolderChanges: async (_w: string, from: string) => {
|
|
3444
|
+
resolved.push(from);
|
|
3445
|
+
return { lose: [{ kind: 'group', name: 'Board', verb: 'read' }], gain: [] };
|
|
3446
|
+
},
|
|
3447
|
+
} as unknown as IAccessControl);
|
|
3448
|
+
await fs.writeFile(KB('Secret/plan.md'), 'plan');
|
|
3449
|
+
// A draft is not write-gated, so only the read gate stands between a
|
|
3450
|
+
// caller and a move of a file they may not open — and it does: the dry
|
|
3451
|
+
// run, the unconfirmed move and the confirmed one are all read_file's
|
|
3452
|
+
// own refusal, with nobody resolved and nothing moved.
|
|
3453
|
+
const args = { branch: 'someone/draft', src: KB('Secret/plan.md'), dest: KB('Secret/old/plan.md') };
|
|
3454
|
+
const read = await call(base, 'read_file', { branch: args.branch, path: args.src });
|
|
3455
|
+
expect(read.status).toBe(403);
|
|
3456
|
+
for (const body of [{ ...args, dryRun: true }, args, { ...args, confirm: true }]) {
|
|
3457
|
+
const res = await call(base, 'move_file', body);
|
|
3458
|
+
expect(res.status).toBe(403);
|
|
3459
|
+
expect(res.body).toEqual(read.body);
|
|
3460
|
+
}
|
|
3461
|
+
expect(resolved).toEqual([]);
|
|
3462
|
+
expect(await exists(args.src)).toBe(true);
|
|
3463
|
+
});
|
|
3464
|
+
|
|
3453
3465
|
it('an access-changing move shows before/after and runs only with confirm: true', async () => {
|
|
3454
3466
|
const base = await seeded();
|
|
3455
3467
|
const args = { src: KB('Sales/deal.md'), dest: KB('HR/deal.md') };
|
|
@@ -3648,13 +3660,18 @@ describe('preflight for moves and deletes', () => {
|
|
|
3648
3660
|
expect(await exists(KB('Sales/moved'))).toBe(false);
|
|
3649
3661
|
});
|
|
3650
3662
|
|
|
3651
|
-
it('a
|
|
3663
|
+
it('a move into a folder the caller cannot read is refused as read_file refuses the folder, before the write verdict', async () => {
|
|
3652
3664
|
const base = await seeded();
|
|
3665
|
+
// The folder's rules are what a move preview would read back (the
|
|
3666
|
+
// caller's verdicts there, who else is affected), so the read refusal
|
|
3667
|
+
// comes first — not the write denial, which would say whether the path
|
|
3668
|
+
// can be proposed and name the folder's contents on a collision.
|
|
3653
3669
|
const run = await call(base, 'move_file', { src: KB('Sales/deal.md'), dest: KB('Secret/deal.md'), confirm: true });
|
|
3654
3670
|
expect(run.status).toBe(403);
|
|
3655
|
-
expect(run.body).
|
|
3671
|
+
expect(run.body.error).toContain(`permission to read "${KB('Secret')}"`);
|
|
3672
|
+
expect(run.body.kind).toBeUndefined();
|
|
3656
3673
|
expect(run.body.proposal).toBeUndefined();
|
|
3657
|
-
expect(
|
|
3674
|
+
expect(await exists(KB('Sales/deal.md'))).toBe(true);
|
|
3658
3675
|
});
|
|
3659
3676
|
|
|
3660
3677
|
it('a draft branch is not write-gated, so the same move is allowed there', async () => {
|
|
@@ -4195,7 +4212,7 @@ describe('preflight for moves and deletes', () => {
|
|
|
4195
4212
|
expect(d.description).toMatch(/destination must not exist/);
|
|
4196
4213
|
// What refuses a move, and the dry-run/confirm protocol it shares with the
|
|
4197
4214
|
// deletes, are shared rules — stated once, in the two shared places.
|
|
4198
|
-
const rules = sharedFileRulesSection(testKbContext().layout);
|
|
4215
|
+
const rules = sharedFileRulesSection(testKbContext().layout, testKbContext().defaultBranch);
|
|
4199
4216
|
expect(rules).toContain('is a platform file and stays in its folder.');
|
|
4200
4217
|
expect(rules).toContain('`dryRun: true`');
|
|
4201
4218
|
expect(rules).toContain('`confirm: true`');
|
|
@@ -4223,9 +4240,10 @@ describe('preflight for moves and deletes', () => {
|
|
|
4223
4240
|
const d = await def('delete_folder');
|
|
4224
4241
|
expect(d.description).toContain('a non-empty folder wants `confirm: true`');
|
|
4225
4242
|
// The protocol itself, and what a platform folder does to it, are shared.
|
|
4226
|
-
const rules = sharedFileRulesSection(testKbContext().layout);
|
|
4243
|
+
const rules = sharedFileRulesSection(testKbContext().layout, testKbContext().defaultBranch);
|
|
4227
4244
|
expect(rules).toContain('`dryRun: true`');
|
|
4228
|
-
|
|
4245
|
+
// Anyone's: a move asks when it changes who else may open or edit the file too (`holderChanges`).
|
|
4246
|
+
expect(rules).toContain("A non-empty folder is deleted, and a move that changes anyone's access runs, only with `confirm: true`");
|
|
4229
4247
|
expect(rules).toContain('platform folder');
|
|
4230
4248
|
const dry = await call(base, 'delete_folder', { path: KB('Sales/archive'), dryRun: true });
|
|
4231
4249
|
const unconfirmed = await call(base, 'delete_folder', { path: KB('Sales/archive') });
|
|
@@ -4247,7 +4265,7 @@ describe('preflight for moves and deletes', () => {
|
|
|
4247
4265
|
expect(stat.description).toContain('shared rules on what these tools never move or delete');
|
|
4248
4266
|
// The proposal route applies to every tool a permission can refuse, so it
|
|
4249
4267
|
// is stated once in the shared rules rather than on each of them.
|
|
4250
|
-
expect(sharedFileRulesSection(testKbContext().layout)).toContain('`write-denied`');
|
|
4268
|
+
expect(sharedFileRulesSection(testKbContext().layout, testKbContext().defaultBranch)).toContain('`write-denied`');
|
|
4251
4269
|
for (const name of ['move_file', 'delete_file', 'delete_folder']) {
|
|
4252
4270
|
expect((await def(name)).description.startsWith(GUIDE_FIRST_SENTENCE), name).toBe(true);
|
|
4253
4271
|
}
|
|
@@ -4291,6 +4309,7 @@ describe('a write refused for permissions says whether and how to propose it', (
|
|
|
4291
4309
|
canOwner: async () => true,
|
|
4292
4310
|
canWriteBatchAtRef: async () => null,
|
|
4293
4311
|
previewAccessAfterRelocation: async () => ({ read: true, write: true, download: true, owner: true }),
|
|
4312
|
+
prospectiveHolderChanges: async () => NO_CHANGES,
|
|
4294
4313
|
eligibleWritersAtRef: async () => ({ roles: ['Sales Lead'], users: [{ name: 'Owner', email: 'owner@x' }] }),
|
|
4295
4314
|
} as unknown as IAccessControl;
|
|
4296
4315
|
return { ac, calls };
|
|
@@ -4364,7 +4383,7 @@ describe('a write refused for permissions says whether and how to propose it', (
|
|
|
4364
4383
|
await fs.writeFile(DENIED, 'old text\n');
|
|
4365
4384
|
await freeDestinationFor(tool);
|
|
4366
4385
|
denyWrites();
|
|
4367
|
-
const
|
|
4386
|
+
const versionControlCalls = workspacePathCalls.length;
|
|
4368
4387
|
|
|
4369
4388
|
const { status, json } = await call(base, tool, body);
|
|
4370
4389
|
|
|
@@ -4387,12 +4406,12 @@ describe('a write refused for permissions says whether and how to propose it', (
|
|
|
4387
4406
|
// The read verdict was asked of the repo-relative path.
|
|
4388
4407
|
expect(calls).toContain('Sales/deal.md');
|
|
4389
4408
|
// Nothing was created: no workspace was resolved for the DRAFT the answer
|
|
4390
|
-
// suggests, and the context's
|
|
4409
|
+
// suggests, and the context's version-control service is an empty stub, so a
|
|
4391
4410
|
// create_branch or change request would have 500d. (The tools that
|
|
4392
4411
|
// preflight do resolve the CALLER's own workspace on the way — to read
|
|
4393
4412
|
// the on-disk spelling and refuse links — which is not a draft.)
|
|
4394
4413
|
const forDraft = workspacePathCalls
|
|
4395
|
-
.slice(
|
|
4414
|
+
.slice(versionControlCalls)
|
|
4396
4415
|
.filter((b) => b.includes(draft) || b.includes(encodeURIComponent(draft)));
|
|
4397
4416
|
expect(forDraft).toEqual([]);
|
|
4398
4417
|
});
|
|
@@ -4503,8 +4522,8 @@ describe('a write refused for permissions says whether and how to propose it', (
|
|
|
4503
4522
|
// stated in the handshake instructions and in the managed guide, and in no
|
|
4504
4523
|
// description. The refusal ITSELF still spells the steps out — that is what
|
|
4505
4524
|
// the tests above this one assert.
|
|
4506
|
-
const rule = sharedFileRules(testKbContext().layout).find((r) => r.id === 'refused-for-permissions')!;
|
|
4507
|
-
expect(sharedFileRulesSection(testKbContext().layout)).toContain(rule.body);
|
|
4525
|
+
const rule = sharedFileRules(testKbContext().layout, testKbContext().defaultBranch).find((r) => r.id === 'refused-for-permissions')!;
|
|
4526
|
+
expect(sharedFileRulesSection(testKbContext().layout, testKbContext().defaultBranch)).toContain(rule.body);
|
|
4508
4527
|
for (const def of tools) {
|
|
4509
4528
|
expect(def.description ?? '', def.name).not.toContain('If this is refused for permissions');
|
|
4510
4529
|
expect(def.description ?? '', def.name).not.toContain(rule.body);
|
|
@@ -5134,7 +5153,7 @@ describe('a move preview judges the destination as it will be', () => {
|
|
|
5134
5153
|
ensureRemotesFetched: async () => undefined,
|
|
5135
5154
|
} as unknown as WorkspaceService,
|
|
5136
5155
|
KB_DIR,
|
|
5137
|
-
|
|
5156
|
+
realDisk(),
|
|
5138
5157
|
);
|
|
5139
5158
|
return {
|
|
5140
5159
|
canRead: (w: string, u: string, r: string) => fresh().canRead(w, u, r),
|
|
@@ -5146,6 +5165,7 @@ describe('a move preview judges the destination as it will be', () => {
|
|
|
5146
5165
|
previewAccessAfterRelocation: (
|
|
5147
5166
|
w: string, u: string, from: string, to: string, opts?: { sourceRemains?: boolean },
|
|
5148
5167
|
) => fresh().previewAccessAfterRelocation(w, u, from, to, opts),
|
|
5168
|
+
prospectiveHolderChanges: (w: string, from: string, to: string) => fresh().prospectiveHolderChanges(w, from, to),
|
|
5149
5169
|
} as unknown as IAccessControl;
|
|
5150
5170
|
};
|
|
5151
5171
|
|
|
@@ -5189,6 +5209,8 @@ describe('a move preview judges the destination as it will be', () => {
|
|
|
5189
5209
|
expect(dry.body).toMatchObject({ kind: 'folder', accessChanges: false, allowed: true, moved: false });
|
|
5190
5210
|
expect(dry.body.access.after).toEqual(dry.body.access.before);
|
|
5191
5211
|
expect(dry.body.access.after.owner).toBe(true);
|
|
5212
|
+
// A rename carries its own rules along: nobody else gains or loses either.
|
|
5213
|
+
expect(dry.body.holderChanges).toBeUndefined();
|
|
5192
5214
|
// Nothing moved and nothing was written to answer the question.
|
|
5193
5215
|
expect(await fs.exists(args.dest)).toBe(false);
|
|
5194
5216
|
expect(await fs.exists(KB('Sales/access.md'))).toBe(true);
|
|
@@ -5213,6 +5235,91 @@ describe('a move preview judges the destination as it will be', () => {
|
|
|
5213
5235
|
expect(await verbsAt(base, args.dest)).toEqual(dry.body.access.after);
|
|
5214
5236
|
});
|
|
5215
5237
|
|
|
5238
|
+
it('a move that changes only who ELSE may edit it names them, and asks before it moves', async () => {
|
|
5239
|
+
const base = await seeded();
|
|
5240
|
+
// `Ops/` gives the caller what `Sales/` gives, and Ops Lead write as well.
|
|
5241
|
+
await fs.writeFile(
|
|
5242
|
+
KB('Ops/access.md'),
|
|
5243
|
+
rules(`write:\n - Mover <${MOVER}>\n - Ops Lead <ops@x.io>\nowner:\n - Mover <${MOVER}>\n`),
|
|
5244
|
+
);
|
|
5245
|
+
const args = { src: KB('Sales/deal.md'), dest: KB('Ops/deal.md') };
|
|
5246
|
+
|
|
5247
|
+
const dry = await call(base, 'move_file', { ...args, dryRun: true });
|
|
5248
|
+
expect(dry.body).toMatchObject({ accessChanges: false, allowed: true });
|
|
5249
|
+
// Everyone may read on both sides, so the only change is who may edit.
|
|
5250
|
+
expect(dry.body.holderChanges).toEqual({
|
|
5251
|
+
lose: [],
|
|
5252
|
+
gain: [{ kind: 'person', name: 'ops@x.io', email: 'ops@x.io', verb: 'write' }],
|
|
5253
|
+
});
|
|
5254
|
+
|
|
5255
|
+
const unconfirmed = await call(base, 'move_file', args);
|
|
5256
|
+
expect(unconfirmed.body).toMatchObject({ confirmationRequired: true, moved: false });
|
|
5257
|
+
expect(unconfirmed.body.message).toContain('`holderChanges`');
|
|
5258
|
+
expect(await fs.exists(args.src)).toBe(true);
|
|
5259
|
+
expect((await call(base, 'move_file', { ...args, confirm: true })).body).toMatchObject({ moved: true });
|
|
5260
|
+
});
|
|
5261
|
+
|
|
5262
|
+
it('a source the read hook refuses is refused as read_file refuses it: no preview, not even that the move would ask', async () => {
|
|
5263
|
+
const base = await seeded();
|
|
5264
|
+
await fs.writeFile(
|
|
5265
|
+
KB('Ops/access.md'),
|
|
5266
|
+
rules(`write:\n - Mover <${MOVER}>\n - Ops Lead <ops@x.io>\nowner:\n - Mover <${MOVER}>\n`),
|
|
5267
|
+
);
|
|
5268
|
+
const args = { src: KB('Sales/deal.md'), dest: KB('Ops/deal.md'), rewriteLinks: false };
|
|
5269
|
+
// The rules let the caller read it; a deployment's read hook does not. The
|
|
5270
|
+
// hook's refusal is the whole answer: a "this move asks for confirm" would
|
|
5271
|
+
// already say what the comparison found behind the hook.
|
|
5272
|
+
hooks.onAgentRead(async (op) => {
|
|
5273
|
+
if (op.wsPath === args.src) throw new Error('not for agents');
|
|
5274
|
+
});
|
|
5275
|
+
const read = await call(base, 'read_file', { path: args.src });
|
|
5276
|
+
expect(read.status).toBeGreaterThanOrEqual(400);
|
|
5277
|
+
for (const body of [{ ...args, dryRun: true }, args, { ...args, confirm: true }]) {
|
|
5278
|
+
const res = await call(base, 'move_file', body);
|
|
5279
|
+
expect(res.status).toBe(read.status);
|
|
5280
|
+
expect(res.body).toEqual(read.body);
|
|
5281
|
+
expect(JSON.stringify(res.body)).not.toContain('ops@x.io');
|
|
5282
|
+
}
|
|
5283
|
+
expect(await fs.exists(args.src)).toBe(true);
|
|
5284
|
+
});
|
|
5285
|
+
|
|
5286
|
+
it('a caller who reads what moves but not the folder it lands in is refused, on a draft too, and told nothing of the folder', async () => {
|
|
5287
|
+
const base = await seeded();
|
|
5288
|
+
// `Closed/` is somebody else's: its rules are what a move preview would
|
|
5289
|
+
// read back (who it lets in, whom it denies). On a draft no write gate
|
|
5290
|
+
// stands, so the read gate is what refuses — before anything is looked at.
|
|
5291
|
+
await fs.writeFile(
|
|
5292
|
+
KB('Closed/access.md'),
|
|
5293
|
+
rules('read:\n - Other <other@x.io>\n - deny everyone\nwrite:\n - Other <other@x.io>\n'),
|
|
5294
|
+
);
|
|
5295
|
+
await fs.writeFile(KB('Closed/deal.md'), 'taken');
|
|
5296
|
+
const args = { branch: 'someone/draft', src: KB('Sales/deal.md'), dest: KB('Closed/deal.md'), rewriteLinks: false };
|
|
5297
|
+
|
|
5298
|
+
for (const body of [{ ...args, dryRun: true }, args, { ...args, confirm: true }]) {
|
|
5299
|
+
const res = await call(base, 'move_file', body);
|
|
5300
|
+
expect(res.status).toBe(403);
|
|
5301
|
+
expect(res.body.error).toContain(`permission to read "${KB('Closed')}"`);
|
|
5302
|
+
// Neither the folder's rules nor what sits in it: the name clash at
|
|
5303
|
+
// `Closed/deal.md` is never reached.
|
|
5304
|
+
const text = JSON.stringify(res.body);
|
|
5305
|
+
expect(text).not.toContain('other@x.io');
|
|
5306
|
+
expect(text).not.toContain('already exists');
|
|
5307
|
+
}
|
|
5308
|
+
expect(await fs.exists(args.src)).toBe(true);
|
|
5309
|
+
expect(await fs.readFile(KB('Closed/deal.md'), { encoding: 'utf8' })).toBe('taken');
|
|
5310
|
+
});
|
|
5311
|
+
|
|
5312
|
+
it('a move out of a folder names everyone it leaves behind', async () => {
|
|
5313
|
+
const base = await seeded();
|
|
5314
|
+
const args = { src: KB('Work/Notes'), dest: KB('Legal/Notes') };
|
|
5315
|
+
const dry = await call(base, 'move_file', { ...args, dryRun: true });
|
|
5316
|
+
// Everyone may still read it in Legal/: the caller loses editing, not opening.
|
|
5317
|
+
expect(dry.body.holderChanges).toEqual({
|
|
5318
|
+
lose: [{ kind: 'person', name: MOVER, email: MOVER, verb: 'write' }],
|
|
5319
|
+
gain: [],
|
|
5320
|
+
});
|
|
5321
|
+
});
|
|
5322
|
+
|
|
5216
5323
|
it('what the folder inherited is left behind; what its own access.md gives comes along', async () => {
|
|
5217
5324
|
const base = await seeded();
|
|
5218
5325
|
const args = { src: KB('Work/Team'), dest: KB('Legal/Team') };
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Agent access gate — the per-call seam every gated agent tool runs through.
|
|
3
3
|
*
|
|
4
4
|
* It decides nothing of its own. It calls the hooks a DEPLOYMENT registered
|
|
5
|
-
* (`
|
|
5
|
+
* (`VersionControlHooks`): one before an agent read of a knowledge-base path, one
|
|
6
6
|
* before an agent write. A hook that throws refuses the operation and the
|
|
7
7
|
* caller sees that hook's own message and status. With no hook registered —
|
|
8
8
|
* every core-only deployment — nothing is refused and nothing is recorded, and
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
|
|
22
22
|
import type { JsonSchema } from '../tool-registry/index.js';
|
|
23
23
|
import type { ToolContext } from '../tool-helpers/index.js';
|
|
24
|
-
import type {
|
|
24
|
+
import type { VersionControlHooks } from '../version-control/index.js';
|
|
25
25
|
|
|
26
26
|
/**
|
|
27
27
|
* What the `sessionId` input says on its own, before any deployment note. The
|
|
@@ -32,7 +32,7 @@ import type { WorkflowHooks } from '../workflow/index.js';
|
|
|
32
32
|
* takes, so a run's reads and its questions share one conversation.
|
|
33
33
|
*/
|
|
34
34
|
export const SESSION_ID_DESCRIPTION =
|
|
35
|
-
"This conversation's id
|
|
35
|
+
"This conversation's id: call `start_session` once, at the start of your work, and pass its id here, inside `call_tool_chain` too (and to `ask`, where the deployment offers it). The in-process agent runtime sets it itself.";
|
|
36
36
|
|
|
37
37
|
/**
|
|
38
38
|
* The `sessionId` input every gated tool declares. The description a MOUNTED
|
|
@@ -97,11 +97,11 @@ export interface AgentAccessGate {
|
|
|
97
97
|
/** Lowercased email of the recovery/merge bot, which never reaches the hooks. */
|
|
98
98
|
recoveryBotEmail: string;
|
|
99
99
|
/**
|
|
100
|
-
* The
|
|
100
|
+
* The version-control lifecycle-hook registry holding the BLOCKING `agentRead` and
|
|
101
101
|
* `preWrite` hooks. Core registers none; a deployment registers against
|
|
102
|
-
* `
|
|
102
|
+
* `versionControlService.hooks` — pass that same instance here.
|
|
103
103
|
*/
|
|
104
|
-
hooks:
|
|
104
|
+
hooks: VersionControlHooks;
|
|
105
105
|
/** The notes a deployment adds to what agents read about these tools. */
|
|
106
106
|
notes: ToolDescriptionNotes;
|
|
107
107
|
}
|
|
@@ -12,7 +12,7 @@ const GIT_GUARDED_QUERY_KEYS = ['path', 'toDir'] as const;
|
|
|
12
12
|
const GIT_GUARDED_BODY_KEYS = ['path', 'oldPath', 'newPath', 'destination', 'paths', 'ancestor'] as const;
|
|
13
13
|
/**
|
|
14
14
|
* `from` names a PATH on the prospective-access route (`?from=<file>&toDir=…`)
|
|
15
|
-
* and a BRANCH on the
|
|
15
|
+
* and a BRANCH on the version-control comparison (`?from=<branch>`), so it is judged
|
|
16
16
|
* only where it is a path — a branch called after the git folder is refused
|
|
17
17
|
* by the branch-name rule, not by this one.
|
|
18
18
|
*/
|
|
@@ -49,7 +49,7 @@ export function gitGuardedInputs(req: express.Request): string[] {
|
|
|
49
49
|
* request must not make the server do.
|
|
50
50
|
*
|
|
51
51
|
* Mounted at the app, ahead of every router under that prefix — the file
|
|
52
|
-
* routes, the review routes, the
|
|
52
|
+
* routes, the review routes, the version-control and access ones, and whatever an
|
|
53
53
|
* extension mounts — so a router added later is covered by the fact of its
|
|
54
54
|
* prefix rather than by remembering this. The services underneath refuse
|
|
55
55
|
* again on their own; this is what keeps the refusal ahead of the gates.
|
|
@@ -76,7 +76,7 @@ const READY_MARKER = 'hexis-repository-ready';
|
|
|
76
76
|
/** Where a converted clone's stash and other local refs are kept, per workspace (see `importLocalRefs`). */
|
|
77
77
|
export const CONVERTED_REFS = 'refs/kb-converted';
|
|
78
78
|
|
|
79
|
-
/** Fallback committer identity; every
|
|
79
|
+
/** Fallback committer identity; every version-control commit overrides it with `--author`. */
|
|
80
80
|
const BOT_NAME = 'Bevel Workflow';
|
|
81
81
|
const BOT_EMAIL = 'bevel-workflow@bevel.software';
|
|
82
82
|
|
|
@@ -5,7 +5,7 @@ import fs from 'node:fs/promises';
|
|
|
5
5
|
import os from 'node:os';
|
|
6
6
|
import path from 'node:path';
|
|
7
7
|
import { KbRemoteUnreachableError } from '../kb-startup-runner.js';
|
|
8
|
-
import { NodeGitRunner } from '../../../
|
|
8
|
+
import { NodeGitRunner } from '../../../version-control/git/node-git-runner.js';
|
|
9
9
|
import { GitRunError, NO_GIT_CREDENTIALS, type IGitRunner } from '../../../../shared/git.contract.js';
|
|
10
10
|
import type { OnServerStart, ServerStartContext, StepResult } from '../on-server-start.js';
|
|
11
11
|
import { newKbStartupRunner } from '../../../../__tests__/workspace-service.js';
|
|
@@ -6,7 +6,7 @@ import { promisify } from 'node:util';
|
|
|
6
6
|
import fs from 'node:fs/promises';
|
|
7
7
|
import os from 'node:os';
|
|
8
8
|
import path from 'node:path';
|
|
9
|
-
import { NodeGitRunner } from '../../../
|
|
9
|
+
import { NodeGitRunner } from '../../../version-control/git/node-git-runner.js';
|
|
10
10
|
import { ClassifiedFailure, classifyGitFailure, failureOf } from '../../../../shared/git-failure.js';
|
|
11
11
|
import { GitRunError, gitCredentials } from '../../../../shared/git.contract.js';
|
|
12
12
|
import type { OnServerStart, ServerStartContext, StepResult } from '../on-server-start.js';
|
|
@@ -5,7 +5,7 @@ import fs from 'node:fs/promises';
|
|
|
5
5
|
import os from 'node:os';
|
|
6
6
|
import path from 'node:path';
|
|
7
7
|
import { workingCopyShape } from '../../kb-repository.js';
|
|
8
|
-
import { NodeGitRunner } from '../../../
|
|
8
|
+
import { NodeGitRunner } from '../../../version-control/git/node-git-runner.js';
|
|
9
9
|
import { gitCredentials, type IGitRunner } from '../../../../shared/git.contract.js';
|
|
10
10
|
import type { OnServerStart, ServerStartContext, StepResult } from '../on-server-start.js';
|
|
11
11
|
import { newKbStartupRunner } from '../../../../__tests__/workspace-service.js';
|