@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
|
@@ -37,9 +37,9 @@
|
|
|
37
37
|
*/
|
|
38
38
|
|
|
39
39
|
import { workspaceIdForBranch } from '../../shared/workspace-id.js';
|
|
40
|
-
import type {
|
|
41
|
-
import type { AuthUser, IWorkspaceService,
|
|
42
|
-
import { PushNeedsAgentResolutionError,
|
|
40
|
+
import type { VersionControlEventBus } from '../version-control/index.js';
|
|
41
|
+
import type { AuthUser, IWorkspaceService, IVersionControlService } from '@bevel-software/platform-shared';
|
|
42
|
+
import { PushNeedsAgentResolutionError, VersionControlDomainError } from '../../shared/domain-errors.js';
|
|
43
43
|
import type { IAccessControl } from './access-control.interface.js';
|
|
44
44
|
import {
|
|
45
45
|
ADMIN_CANONICAL,
|
|
@@ -92,7 +92,7 @@ async function mapPooled<T, R>(items: readonly T[], limit: number, fn: (item: T)
|
|
|
92
92
|
}
|
|
93
93
|
|
|
94
94
|
/** A removal this service refuses (guard) or cannot run. */
|
|
95
|
-
export class UserAccessRemovalError extends
|
|
95
|
+
export class UserAccessRemovalError extends VersionControlDomainError {
|
|
96
96
|
constructor(message: string, status = 422, payload?: Record<string, unknown>) {
|
|
97
97
|
super(message, status, payload);
|
|
98
98
|
this.name = 'UserAccessRemovalError';
|
|
@@ -343,7 +343,7 @@ export class UserAccessRemovalService {
|
|
|
343
343
|
|
|
344
344
|
constructor(
|
|
345
345
|
private readonly workspaceService: IWorkspaceService,
|
|
346
|
-
|
|
346
|
+
versionControlService: IVersionControlService,
|
|
347
347
|
private readonly accessControl: IAccessControl,
|
|
348
348
|
/**
|
|
349
349
|
* The resolver's own walk. NOT `workspaceService.listFiles`: that honours
|
|
@@ -354,13 +354,13 @@ export class UserAccessRemovalService {
|
|
|
354
354
|
private readonly kbDirName: string,
|
|
355
355
|
/** Live-binding thunk — DEFAULT_BRANCH stays empty until setup. */
|
|
356
356
|
private readonly defaultBranchOf: () => string,
|
|
357
|
-
private readonly eventBus?:
|
|
357
|
+
private readonly eventBus?: VersionControlEventBus,
|
|
358
358
|
/** The deployment owner(s) (`ADMIN_EMAIL`) — never removed this way. */
|
|
359
359
|
private readonly deploymentOwners: readonly string[] = [],
|
|
360
360
|
) {
|
|
361
361
|
this.locked = new AdminLockedCommits({
|
|
362
362
|
workspaceService,
|
|
363
|
-
|
|
363
|
+
versionControlService,
|
|
364
364
|
kbDirName,
|
|
365
365
|
defaultBranchOf,
|
|
366
366
|
makeError: (message, status, payload) => new UserAccessRemovalError(message, status, payload),
|
|
@@ -145,7 +145,7 @@ describe('the access-frontmatter extension set', () => {
|
|
|
145
145
|
it('throws on a malformed extension rather than skipping it', () => {
|
|
146
146
|
// A typo would otherwise leave capability-granting files ungoverned, at
|
|
147
147
|
// boot, with nothing to distinguish it from a successful registration.
|
|
148
|
-
expect(() => registerAccessFrontmatterExtensions(['
|
|
148
|
+
expect(() => registerAccessFrontmatterExtensions(['workflow'])).toThrow(/malformed/);
|
|
149
149
|
expect(() => registerAccessFrontmatterExtensions(['.two.dots'])).toThrow(/malformed/);
|
|
150
150
|
expect(() => registerAccessFrontmatterExtensions([''])).toThrow(/malformed/);
|
|
151
151
|
expect(hasAccessFrontmatterExtension('x.pipeline_typo_guard')).toBe(false);
|
|
@@ -186,7 +186,7 @@ describe('the access-frontmatter extension set', () => {
|
|
|
186
186
|
});
|
|
187
187
|
|
|
188
188
|
describe('parseOwnAccessEntries — whole-document YAML the subset parser cannot read', () => {
|
|
189
|
-
// A `.tool` / `.
|
|
189
|
+
// A `.tool` / `.workflow` / `.agent` is one `---` fenced YAML document, and
|
|
190
190
|
// real ones use folded and literal scalars and nested maps. The subset
|
|
191
191
|
// parser stops at the first such line; the verbs must still be read.
|
|
192
192
|
const doc = [
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { VersionControlDomainError } from '../../shared/domain-errors.js';
|
|
2
2
|
import { sanitizedPath } from '../../shared/printable.js';
|
|
3
3
|
|
|
4
4
|
export interface AccessDeniedDetails {
|
|
@@ -55,7 +55,7 @@ export function unreadableRefusalSentence(repoRelative: string): string {
|
|
|
55
55
|
* "you don't have permission to write to <path>; eligible: <roles + users>"
|
|
56
56
|
* without a follow-up roundtrip.
|
|
57
57
|
*/
|
|
58
|
-
export class AccessDeniedError extends
|
|
58
|
+
export class AccessDeniedError extends VersionControlDomainError {
|
|
59
59
|
readonly access: AccessDeniedDetails;
|
|
60
60
|
|
|
61
61
|
constructor(details: AccessDeniedDetails) {
|
|
@@ -89,7 +89,7 @@ export class AccessDeniedError extends WorkflowDomainError {
|
|
|
89
89
|
* 503 and the caller retries. Distinct from AccessConfigError (the config is
|
|
90
90
|
* there and wrong) and AccessDeniedError (a real permission decision).
|
|
91
91
|
*/
|
|
92
|
-
export class AccessUnreadableError extends
|
|
92
|
+
export class AccessUnreadableError extends VersionControlDomainError {
|
|
93
93
|
constructor(ref: string, relativePath: string) {
|
|
94
94
|
super(
|
|
95
95
|
`Access rules at ${ref} could not be read (git failed on ${relativePath}); nothing was decided. Try again.`,
|
|
@@ -105,7 +105,7 @@ export class AccessUnreadableError extends WorkflowDomainError {
|
|
|
105
105
|
* or malformed at runtime — distinct from AccessDeniedError because the cause
|
|
106
106
|
* is a config bug, not a permission decision.
|
|
107
107
|
*/
|
|
108
|
-
export class AccessConfigError extends
|
|
108
|
+
export class AccessConfigError extends VersionControlDomainError {
|
|
109
109
|
readonly errors: string[];
|
|
110
110
|
|
|
111
111
|
constructor(errors: string[]) {
|
|
@@ -285,8 +285,8 @@ const accessFrontmatterExtensions = new Set<string>(CORE_ACCESS_FRONTMATTER_EXTE
|
|
|
285
285
|
*/
|
|
286
286
|
export function registerAccessFrontmatterExtensions(extensions: readonly string[]): void {
|
|
287
287
|
// Validate EVERYTHING first, then apply. These registrations decide which
|
|
288
|
-
// files' edits carry enforced access grants, so a typo (`
|
|
289
|
-
// `.
|
|
288
|
+
// files' edits carry enforced access grants, so a typo (`workflow` for
|
|
289
|
+
// `.workflow`) must THROW rather than be skipped — a silent skip makes a
|
|
290
290
|
// failed registration indistinguishable from a successful one, at boot,
|
|
291
291
|
// where nobody is looking. And it must throw before the registry changes:
|
|
292
292
|
// a list that is half-applied when it throws leaves later scans governing a
|
|
@@ -295,7 +295,7 @@ export function registerAccessFrontmatterExtensions(extensions: readonly string[
|
|
|
295
295
|
const n = ext.trim().toLowerCase();
|
|
296
296
|
if (!/^\.[a-z0-9]+$/.test(n)) {
|
|
297
297
|
throw new Error(
|
|
298
|
-
`access frontmatter extension "${ext}" is malformed — expected a leading dot, e.g. ".
|
|
298
|
+
`access frontmatter extension "${ext}" is malformed — expected a leading dot, e.g. ".workflow"`,
|
|
299
299
|
);
|
|
300
300
|
}
|
|
301
301
|
return n;
|
|
@@ -313,7 +313,7 @@ export function accessFrontmatterExtensionList(): string[] {
|
|
|
313
313
|
*
|
|
314
314
|
* Case-SENSITIVE on the path, as it always was: `doc.MD` is not a node and
|
|
315
315
|
* carries no enforced grant. Registered extensions are normalized to lowercase
|
|
316
|
-
* so `.
|
|
316
|
+
* so `.Workflow` and `.workflow` register the same thing, but which FILES are
|
|
317
317
|
* governed must not change because the set became registrable — widening it to
|
|
318
318
|
* `X.MD` silently in a release would be an access-model change nobody asked
|
|
319
319
|
* for, made in a refactor.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* The contract of the READ-BEFORE-WRITE gate: nothing is created, changed or
|
|
3
3
|
* removed at a place its author cannot read. The service that answers
|
|
4
4
|
* (filesystem stats, access checks) is `modules/access/change-read-gate.ts`;
|
|
5
|
-
* this file carries only the types, so the
|
|
5
|
+
* this file carries only the types, so the version-control, kb-fs and tool modules
|
|
6
6
|
* depend on the contract and never on the access module.
|
|
7
7
|
*
|
|
8
8
|
* Why `read`, when every write already needs `write`: on a draft branch no
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
import type { FileContent } from '@mastra/core/workspace';
|
|
25
25
|
import { GROUP_REF_PREFIX, canonicalRoleName, parseRolesYaml, parseYamlSubset } from './access-grammar.js';
|
|
26
26
|
import type { GroupsIndex } from './group-files.js';
|
|
27
|
-
import {
|
|
27
|
+
import { VersionControlDomainError } from '../../shared/domain-errors.js';
|
|
28
28
|
import type { WriteValidator } from '../kb-fs/index.js';
|
|
29
29
|
|
|
30
30
|
/** Repo-relative basename of the roles file (it lives at the KB repo root). */
|
|
@@ -35,7 +35,7 @@ export const ROLES_YAML_BASENAME = 'roles.yaml';
|
|
|
35
35
|
* the edit is refused and nothing is written. Carries the parser errors so the
|
|
36
36
|
* editor / agent can show exactly what's wrong.
|
|
37
37
|
*/
|
|
38
|
-
export class RolesYamlInvalidError extends
|
|
38
|
+
export class RolesYamlInvalidError extends VersionControlDomainError {
|
|
39
39
|
readonly errors: string[];
|
|
40
40
|
constructor(errors: string[]) {
|
|
41
41
|
super(
|
|
@@ -102,7 +102,7 @@ export const NEW_ROLE_GUIDANCE =
|
|
|
102
102
|
* self-contained because a tool error reaches the agent as its message alone,
|
|
103
103
|
* and the agent relays it to its user.
|
|
104
104
|
*/
|
|
105
|
-
export class RolesYamlNewRoleError extends
|
|
105
|
+
export class RolesYamlNewRoleError extends VersionControlDomainError {
|
|
106
106
|
readonly roleNames: string[];
|
|
107
107
|
constructor(roleNames: string[]) {
|
|
108
108
|
const quoted = roleNames.map((n) => `'${n}'`).join(', ');
|
|
@@ -171,7 +171,7 @@ interface GroupEntry {
|
|
|
171
171
|
* entry with only a log warning — the role silently reaches nobody — so it is
|
|
172
172
|
* refused up front, naming each entry, in the same 422 shape as the others.
|
|
173
173
|
*/
|
|
174
|
-
export class RolesYamlUnknownGroupError extends
|
|
174
|
+
export class RolesYamlUnknownGroupError extends VersionControlDomainError {
|
|
175
175
|
readonly entries: { role: string; entry: string }[];
|
|
176
176
|
constructor(entries: { role: string; entry: string }[], sourceFile: string) {
|
|
177
177
|
const listed = entries.map((e) => `'- ${e.entry}' under role '${e.role}'`).join(', ');
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { DEFAULT_KB_LAYOUT } from '@bevel-software/platform-shared';
|
|
2
2
|
import { describe, expect, it } from 'vitest';
|
|
3
|
-
import { mergeGroupsIntoRoles, parseRolesYaml } from '../../access-model/
|
|
4
|
-
import { sharedFileRulesSection } from '../../agent-instructions/
|
|
3
|
+
import { mergeGroupsIntoRoles, parseRolesYaml } from '../../access-model/index.js';
|
|
4
|
+
import { sharedFileRulesSection } from '../../agent-instructions/index.js';
|
|
5
5
|
import {
|
|
6
6
|
CORE_SECTION_IDS,
|
|
7
7
|
PLATFORM_GUIDE_SEPARATOR,
|
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
agentGuideSections,
|
|
10
10
|
composeAgentGuide,
|
|
11
11
|
coreAgentGuideSections,
|
|
12
|
+
guideStartText,
|
|
12
13
|
isAgentGuidePath,
|
|
13
14
|
isManagedGuide,
|
|
14
15
|
joinGuideSections,
|
|
@@ -42,13 +43,10 @@ describe('the guide is composed from the platform\'s sections', () => {
|
|
|
42
43
|
const sections = await coreAgentGuideSections(DEFAULT_KB_LAYOUT);
|
|
43
44
|
expect(sections.map((s) => s.id)).toEqual(CORE_SECTION_IDS);
|
|
44
45
|
const rules = sections.find((s) => s.id === WORKING_WITH_FILES_SECTION_ID)!;
|
|
45
|
-
expect(rules.body).toBe(sharedFileRulesSection(DEFAULT_KB_LAYOUT));
|
|
46
|
+
expect(rules.body).toBe(sharedFileRulesSection(DEFAULT_KB_LAYOUT, ''));
|
|
46
47
|
expect(rules.literal).toBe(true);
|
|
47
|
-
// Every
|
|
48
|
-
for (const s of sections)
|
|
49
|
-
if (s.id === 'introduction') expect(s.body.startsWith('# Knowledge base')).toBe(true);
|
|
50
|
-
else expect(s.body.startsWith('## '), s.id).toBe(true);
|
|
51
|
-
}
|
|
48
|
+
// Every section begins with its heading, so the guide reads as one document.
|
|
49
|
+
for (const s of sections) expect(s.body.startsWith('## '), s.id).toBe(true);
|
|
52
50
|
// The order of the composed guide is the order of the sections — pinned
|
|
53
51
|
// exactly above by the id list, and by the join test below, which equates
|
|
54
52
|
// the composed guide with the sections joined.
|
|
@@ -68,16 +66,17 @@ describe('the guide is composed from the platform\'s sections', () => {
|
|
|
68
66
|
// never passed through the renderer again: a folder literally named like a
|
|
69
67
|
// placeholder comes out as the folder it is.
|
|
70
68
|
const odd = await composeAgentGuide({ ...DEFAULT_KB_LAYOUT, knowledgeBaseDir: '{{skillsDir}}', skillsDir: 'Playbooks' });
|
|
71
|
-
expect(odd).toContain(sharedFileRulesSection({ ...DEFAULT_KB_LAYOUT, knowledgeBaseDir: '{{skillsDir}}', skillsDir: 'Playbooks' }));
|
|
69
|
+
expect(odd).toContain(sharedFileRulesSection({ ...DEFAULT_KB_LAYOUT, knowledgeBaseDir: '{{skillsDir}}', skillsDir: 'Playbooks' }, ''));
|
|
72
70
|
});
|
|
73
71
|
|
|
74
72
|
it('says it is served, not written, and names the one file it is read as', async () => {
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
expect(
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
expect(
|
|
73
|
+
const guide0 = await composeAgentGuide(DEFAULT_KB_LAYOUT);
|
|
74
|
+
const start = section(guide0, '## Start here').replace(/\s+/g, ' ');
|
|
75
|
+
expect(start).toContain('`get_agent_guide({ body: { section: "all" } })` returns the whole guide');
|
|
76
|
+
// By id, not by heading: the section shows an AGENTS.md snippet whose own `##` heading sits in a code fence.
|
|
77
|
+
const finding = (await agentGuideSections(DEFAULT_KB_LAYOUT)).find((s) => s.id === 'how-agents-find-things')!.body.replace(/\s+/g, ' ');
|
|
78
|
+
expect(finding).toContain('`read_file` on `AGENTS.md` returns that file first, then the start of this guide');
|
|
79
|
+
expect(finding).toContain('never copy this guide into either: the platform serves it');
|
|
81
80
|
// The old header, which proved a file on disk was the platform's, is gone
|
|
82
81
|
// from the served text — or every read would look like a stale copy.
|
|
83
82
|
expect(isManagedGuide(await composeAgentGuide(DEFAULT_KB_LAYOUT))).toBe(false);
|
|
@@ -95,7 +94,7 @@ describe('the guide is composed from the platform\'s sections', () => {
|
|
|
95
94
|
it('serves the guide as sections with titles, the whole being the sections joined', async () => {
|
|
96
95
|
const sections = await agentGuideSections(DEFAULT_KB_LAYOUT);
|
|
97
96
|
expect(sections.map((s) => s.id)).toEqual(CORE_SECTION_IDS);
|
|
98
|
-
expect(sections.find((s) => s.id === '
|
|
97
|
+
expect(sections.find((s) => s.id === 'start-here')!.title).toBe('Start here');
|
|
99
98
|
expect(sections.find((s) => s.id === 'where-a-new-file-goes')!.title).toBe('Where a new file goes');
|
|
100
99
|
expect(sections.find((s) => s.id === 'skills')!.title).toContain('Skills (`Skills/');
|
|
101
100
|
expect(joinGuideSections(sections)).toBe(await composeAgentGuide(DEFAULT_KB_LAYOUT));
|
|
@@ -120,15 +119,15 @@ describe('the guide is composed from the platform\'s sections', () => {
|
|
|
120
119
|
const hook = (sections: readonly AgentGuideSection[]) => [
|
|
121
120
|
...sections
|
|
122
121
|
.filter((s) => s.id !== 'conventions')
|
|
123
|
-
.map((s) => (s.id === '
|
|
122
|
+
.map((s) => (s.id === 'glossary' ? { ...s, body: '## Words used here\n\nAsk the graph.\n' } : s)),
|
|
124
123
|
{ id: 'knowledge-graph', body: '## Knowledge graph\n\nNodes live under `{{knowledgeBaseDir}}/<Ontology>/Knowledge/`.\n' },
|
|
125
124
|
];
|
|
126
125
|
const guide = await composeAgentGuide({ ...DEFAULT_KB_LAYOUT, knowledgeBaseDir: 'Docs' }, hook);
|
|
127
126
|
expect(guide).not.toContain('## Conventions');
|
|
128
|
-
expect(section(guide, '##
|
|
129
|
-
expect(section(guide, '##
|
|
127
|
+
expect(section(guide, '## Words used here')).toContain('Ask the graph.');
|
|
128
|
+
expect(section(guide, '## Words used here')).not.toContain('Plugin');
|
|
130
129
|
expect(guide.trimEnd().endsWith('Nodes live under `Docs/<Ontology>/Knowledge/`.')).toBe(true);
|
|
131
|
-
expect(guide).toContain(sharedFileRulesSection({ ...DEFAULT_KB_LAYOUT, knowledgeBaseDir: 'Docs' }));
|
|
130
|
+
expect(guide).toContain(sharedFileRulesSection({ ...DEFAULT_KB_LAYOUT, knowledgeBaseDir: 'Docs' }, ''));
|
|
132
131
|
// An async hook is awaited, and the layout it is handed is the resolved one.
|
|
133
132
|
const seen: string[] = [];
|
|
134
133
|
await composeAgentGuide({ knowledgeBaseDir: ' Docs ', skillsDir: 'Skills', pluginsDir: 'Plugins' }, async (sections, layout) => {
|
|
@@ -138,6 +137,76 @@ describe('the guide is composed from the platform\'s sections', () => {
|
|
|
138
137
|
expect(seen).toEqual(['Docs', 'AGENTS.md']);
|
|
139
138
|
});
|
|
140
139
|
|
|
140
|
+
it('routes the start section to a section a distribution adds, when that section says what it answers', async () => {
|
|
141
|
+
const hook = (sections: readonly AgentGuideSection[]) => [
|
|
142
|
+
...sections,
|
|
143
|
+
{ id: 'graph-rules', body: '## Graph rules\n\nNodes carry an id.\n', asks: 'How is a graph node written? Which | fields?' },
|
|
144
|
+
{ id: 'quiet', body: '## Quiet\n\nNot routed.\n' },
|
|
145
|
+
// Already in the table: no second row.
|
|
146
|
+
{ id: 'tools', body: '## Tools again\n\nA second copy.\n', asks: 'When can I use a tool?' },
|
|
147
|
+
];
|
|
148
|
+
const start = (await agentGuideSections(DEFAULT_KB_LAYOUT, hook)).find((s) => s.id === 'start-here')!.body;
|
|
149
|
+
const rows = start.split('\n').filter((line) => line.startsWith('|'));
|
|
150
|
+
// After the table's last row, with a `|` in the question escaped.
|
|
151
|
+
expect(rows.at(-1)).toBe('| How is a graph node written? Which \\| fields? | `graph-rules` |');
|
|
152
|
+
expect(start).not.toContain('`quiet`');
|
|
153
|
+
expect(rows.filter((line) => line.endsWith('| `tools` |'))).toHaveLength(1);
|
|
154
|
+
// Core's own guide is left as it was.
|
|
155
|
+
const core = (await agentGuideSections(DEFAULT_KB_LAYOUT)).find((s) => s.id === 'start-here')!.body;
|
|
156
|
+
expect(core).not.toContain('graph-rules');
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
it('serves a distribution\'s own version of a core section in core\'s place, when the hook adds it under the same id', async () => {
|
|
160
|
+
const hook = (sections: readonly AgentGuideSection[]) => [
|
|
161
|
+
...sections,
|
|
162
|
+
// The enterprise way: its own sections appended, two of them under core ids.
|
|
163
|
+
{ id: 'html-views', body: '## Pages, our way\n\nOurs.\n' },
|
|
164
|
+
{ id: 'start-here', body: '## Start here\n\nOurs first.\n\n| Question | Section |\n|---|---|\n| Pages? | `html-views` |\n' },
|
|
165
|
+
{ id: 'graph', body: '## Graph\n\nNodes.\n', asks: 'How is the graph written?' },
|
|
166
|
+
];
|
|
167
|
+
const sections = await agentGuideSections(DEFAULT_KB_LAYOUT, hook);
|
|
168
|
+
const core = await agentGuideSections(DEFAULT_KB_LAYOUT);
|
|
169
|
+
// One section per id, each where core's stood, the hook's text in it.
|
|
170
|
+
expect(sections.map((s) => s.id)).toEqual([...core.map((s) => s.id), 'graph']);
|
|
171
|
+
expect(sections.find((s) => s.id === 'html-views')!.body).toBe('## Pages, our way\n\nOurs.');
|
|
172
|
+
const start = sections.find((s) => s.id === 'start-here')!.body;
|
|
173
|
+
expect(start.startsWith('## Start here\n\nOurs first.')).toBe(true);
|
|
174
|
+
// The overriding start section is the one routed to: a row for the added section lands in ITS table.
|
|
175
|
+
expect(start).toContain('| How is the graph written? | `graph` |');
|
|
176
|
+
expect(start).not.toContain('`for-git-users`');
|
|
177
|
+
// The whole guide carries the override once, and never core's text under that id.
|
|
178
|
+
const guide = joinGuideSections(sections);
|
|
179
|
+
expect(guide.match(/^## Pages, our way$/gm)).toHaveLength(1);
|
|
180
|
+
expect(guide).not.toContain('## HTML views');
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
it('answers a read of AGENTS.md with the start section and every section by id, not the whole guide', async () => {
|
|
184
|
+
const sections = await agentGuideSections(DEFAULT_KB_LAYOUT, undefined, { defaultBranch: 'main' });
|
|
185
|
+
const text = guideStartText(sections);
|
|
186
|
+
const start = sections.find((s) => s.id === 'start-here')!;
|
|
187
|
+
expect(text.startsWith(start.body)).toBe(true);
|
|
188
|
+
for (const s of sections) expect(text).toContain(`- \`${s.id}\`: ${s.title}`);
|
|
189
|
+
expect(text).not.toContain(sections.find((s) => s.id === 'access-control')!.body);
|
|
190
|
+
// A guide a distribution left without a start section is answered whole.
|
|
191
|
+
const without = sections.filter((s) => s.id !== 'start-here');
|
|
192
|
+
expect(guideStartText(without)).toBe(joinGuideSections(without));
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
it("refuses a hook that drops or empties the onboarding section, which the platform's onboard prompt points at", async () => {
|
|
196
|
+
await expect(
|
|
197
|
+
composeAgentGuide(DEFAULT_KB_LAYOUT, (sections) => sections.filter((s) => s.id !== 'onboarding')),
|
|
198
|
+
).rejects.toThrow(/dropped the "onboarding" section, which the platform's `onboard` prompt points at/);
|
|
199
|
+
await expect(
|
|
200
|
+
composeAgentGuide(DEFAULT_KB_LAYOUT, (sections) => sections.map((s) => (s.id === 'onboarding' ? { id: s.id, body: ' \n' } : s))),
|
|
201
|
+
).rejects.toThrow(/emptied the "onboarding" section/);
|
|
202
|
+
// Replacing it under the same id is the hook's right: an organisation
|
|
203
|
+
// ships its own onboarding.
|
|
204
|
+
const own = await composeAgentGuide(DEFAULT_KB_LAYOUT, (sections) =>
|
|
205
|
+
sections.map((s) => (s.id === 'onboarding' ? { id: s.id, body: '## Welcome\n\nOur own flow.' } : s)),
|
|
206
|
+
);
|
|
207
|
+
expect(own).toContain('Our own flow.');
|
|
208
|
+
});
|
|
209
|
+
|
|
141
210
|
it('refuses a hook that drops or empties the shared file rules, which every file tool points at', async () => {
|
|
142
211
|
await expect(
|
|
143
212
|
composeAgentGuide(DEFAULT_KB_LAYOUT, (sections) => sections.filter((s) => s.id !== WORKING_WITH_FILES_SECTION_ID)),
|
|
@@ -157,7 +226,7 @@ describe('the guide is composed from the platform\'s sections', () => {
|
|
|
157
226
|
{ id: WORKING_WITH_FILES_SECTION_ID, body: '' },
|
|
158
227
|
...sections,
|
|
159
228
|
]);
|
|
160
|
-
expect(twice).toContain(sharedFileRulesSection(DEFAULT_KB_LAYOUT));
|
|
229
|
+
expect(twice).toContain(sharedFileRulesSection(DEFAULT_KB_LAYOUT, ''));
|
|
161
230
|
// Replacing it under the same id is the hook's right.
|
|
162
231
|
const replaced = await composeAgentGuide(DEFAULT_KB_LAYOUT, (sections) =>
|
|
163
232
|
sections.map((s) => (s.id === WORKING_WITH_FILES_SECTION_ID ? { id: s.id, body: '## Working with files\n\nOurs.\n' } : s)),
|
|
@@ -250,8 +319,8 @@ describe('what the guide tells an agent', () => {
|
|
|
250
319
|
expect(placement).toContain('Extensions/personal-<id>/');
|
|
251
320
|
// A skill's own bundled files are part of the skill and stay welcome, so the
|
|
252
321
|
// rule does not deter an agent from writing a COMPLETE skill.
|
|
253
|
-
expect(placement).toContain("each skill's own
|
|
254
|
-
expect(placement).toContain("
|
|
322
|
+
expect(placement).toContain("each skill's own files");
|
|
323
|
+
expect(placement).toContain("in that skill's folder");
|
|
255
324
|
expect(placement).toContain('never a note or any other document');
|
|
256
325
|
// A private request gets a question and the restrictable folder, in the
|
|
257
326
|
// deployment's own root name.
|
|
@@ -259,8 +328,8 @@ describe('what the guide tells an agent', () => {
|
|
|
259
328
|
expect(placement).toContain('restricted so only they can read it');
|
|
260
329
|
// And when the user insists, the agent declines, says why, and offers again.
|
|
261
330
|
expect(placement).toContain('If they insist on the personal plugin, decline');
|
|
262
|
-
expect(placement).toContain('
|
|
263
|
-
expect(placement).toContain('offer a place under `Docs/`
|
|
331
|
+
expect(placement).toContain('only they would ever find it, and never where the organisation looks for knowledge');
|
|
332
|
+
expect(placement).toContain('offer a place under `Docs/` again');
|
|
264
333
|
// Nothing tells the agent to move or flag documents already filed there.
|
|
265
334
|
expect(placement).not.toMatch(/\bmove (them|it|any)\b/);
|
|
266
335
|
});
|
|
@@ -281,8 +350,8 @@ describe('what the guide tells an agent', () => {
|
|
|
281
350
|
// The four places that introduce it: the `my_plugin` bullet, the sentence
|
|
282
351
|
// on moving a skill, the placement rule, and the `everyone` note.
|
|
283
352
|
const prose = guide.replace(/\s+/g, ' ');
|
|
284
|
-
expect(prose).toContain(
|
|
285
|
-
expect(prose).toContain('A skill moves from a personal plugin
|
|
353
|
+
expect(prose).toContain(`\`my_plugin\`: the user's personal plugin, \`${plugins}/personal-<id>/\`, created on first use.`);
|
|
354
|
+
expect(prose).toContain('A skill moves from a personal plugin to a shared one by moving its folder.');
|
|
286
355
|
expect(prose).toContain("A person's private skill goes in their personal plugin");
|
|
287
356
|
expect(prose).toContain(
|
|
288
357
|
`A person's personal plugin (\`${plugins}/personal-<id>/\`) grants its owner access and denies \`everyone\` outright`,
|
|
@@ -299,8 +368,8 @@ describe('what the guide tells an agent', () => {
|
|
|
299
368
|
expect(prose).toContain('add people to existing roles, and use a GROUP for a task- or team-scoped set of people');
|
|
300
369
|
});
|
|
301
370
|
|
|
302
|
-
it('describes delete_branch where it says what
|
|
303
|
-
const text = section(await composeAgentGuide(DEFAULT_KB_LAYOUT), '###
|
|
371
|
+
it('describes delete_branch where it says what happens to a draft', async () => {
|
|
372
|
+
const text = section(await composeAgentGuide(DEFAULT_KB_LAYOUT), '### When a draft goes away');
|
|
304
373
|
const prose = text.replace(/\s+/g, ' ');
|
|
305
374
|
expect(prose).toContain('`delete_branch`');
|
|
306
375
|
expect(prose).toContain('Only its author');
|
|
@@ -2,15 +2,18 @@ import type { Server } from 'node:http';
|
|
|
2
2
|
import type { AddressInfo } from 'node:net';
|
|
3
3
|
import express from 'express';
|
|
4
4
|
import { afterEach, describe, expect, it } from 'vitest';
|
|
5
|
-
import { ToolRegistry } from '../../tool-registry/
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import { createToolHandlerFactory } from '../../tool-helpers/tool-handler.js';
|
|
9
|
-
import type { ToolContext } from '../../tool-helpers/tool.contract.js';
|
|
10
|
-
import { toolDef } from '../../tool-helpers/tool-def.js';
|
|
5
|
+
import { GUIDE_FIRST_SENTENCE, TOOL_DESCRIPTION_CAP, ToolRegistry } from '../../tool-registry/index.js';
|
|
6
|
+
import { createToolHandlerFactory } from '../../../__tests__/tool-wiring.js';
|
|
7
|
+
import { toolDef, type ToolContext } from '../../tool-helpers/index.js';
|
|
11
8
|
import { GET_AGENT_GUIDE_TOOL, registerAgentGuideTool } from '../agent-guide.tools.js';
|
|
12
9
|
import { DEFAULT_KB_LAYOUT } from '@bevel-software/platform-shared';
|
|
13
|
-
import {
|
|
10
|
+
import {
|
|
11
|
+
START_HERE_SECTION_ID,
|
|
12
|
+
WHOLE_GUIDE_SECTION,
|
|
13
|
+
agentGuideSections,
|
|
14
|
+
joinGuideSections,
|
|
15
|
+
type RenderedGuideSection,
|
|
16
|
+
} from '../agent-guide.js';
|
|
14
17
|
|
|
15
18
|
let server: Server | null = null;
|
|
16
19
|
|
|
@@ -41,7 +44,7 @@ describe('get_agent_guide', () => {
|
|
|
41
44
|
source: 'internal',
|
|
42
45
|
abortSignal: new AbortController().signal,
|
|
43
46
|
workspaceService: {} as never,
|
|
44
|
-
|
|
47
|
+
versionControlService: {} as never,
|
|
45
48
|
events: {} as never,
|
|
46
49
|
getFilesystem: async () => {
|
|
47
50
|
throw new Error('the guide reads no file');
|
|
@@ -84,8 +87,11 @@ describe('get_agent_guide', () => {
|
|
|
84
87
|
for (const list of [registry.listExternal(), registry.listInternal()]) {
|
|
85
88
|
const def = (await list).find((t) => t.name === GET_AGENT_GUIDE_TOOL);
|
|
86
89
|
expect(def).toBeDefined();
|
|
87
|
-
expect(def!.description).toContain('ALWAYS call this first
|
|
88
|
-
expect(def!.description).toContain(
|
|
90
|
+
expect(def!.description).toContain('ALWAYS call this first, before anything else in the platform.');
|
|
91
|
+
expect(def!.description).toContain('With no `section` it returns the start section');
|
|
92
|
+
expect(def!.description).toContain('only `"all"` returns the whole guide.');
|
|
93
|
+
// The read of the guide's name is the start too (`guideStartText`), never the whole guide.
|
|
94
|
+
expect(def!.description).toContain('`read_file` on `AGENTS.md` at the KB root answers with the same start section');
|
|
89
95
|
// The sections, a distribution's own included, by id and title.
|
|
90
96
|
expect(def!.description).toContain(
|
|
91
97
|
'Sections: `introduction` (Knowledge base), `access-control` (Access control), `knowledge-graph` (Knowledge graph).',
|
|
@@ -176,7 +182,7 @@ describe('get_agent_guide', () => {
|
|
|
176
182
|
const shown = (counted.match(/`[^`]+`(?=, |\.$)/g) ?? []).filter((id) => id.startsWith('`a-section-id') || id === '`introduction`' || id === '`access-control`' || id === '`knowledge-graph`');
|
|
177
183
|
expect(shown.length).toBeGreaterThan(0);
|
|
178
184
|
expect(shown.length).toBeLessThan(203);
|
|
179
|
-
expect(counted).toMatch(new RegExp(`and ${203 - shown.length} more, all named under \`sections\` in the
|
|
185
|
+
expect(counted).toMatch(new RegExp(`and ${203 - shown.length} more, all named under \`sections\` in the answer\\.$`));
|
|
180
186
|
// No id is ever cut mid-way: every listed id is one of the guide's.
|
|
181
187
|
const all = new Set([...SECTIONS, ...flood].map((s) => `\`${s.id}\``));
|
|
182
188
|
for (const id of shown) expect(all.has(id), id).toBe(true);
|
|
@@ -188,6 +194,27 @@ describe('get_agent_guide', () => {
|
|
|
188
194
|
expect(await describedAs()).toContain('`introduction` (Knowledge base)');
|
|
189
195
|
});
|
|
190
196
|
|
|
197
|
+
it('answers a call without a section with the start section and every section, and `all` with the whole guide', async () => {
|
|
198
|
+
const { call, sectionsNow } = await serve();
|
|
199
|
+
const platform = await agentGuideSections(DEFAULT_KB_LAYOUT, undefined, { defaultBranch: 'production' });
|
|
200
|
+
sectionsNow([...platform]);
|
|
201
|
+
const index = platform.map((s) => ({ id: s.id, title: s.title }));
|
|
202
|
+
const start = platform.find((s) => s.id === START_HERE_SECTION_ID)!;
|
|
203
|
+
// The first call every description asks for costs the start section, not the guide.
|
|
204
|
+
expect(await call()).toEqual({
|
|
205
|
+
status: 200,
|
|
206
|
+
body: { guide: start.body, section: START_HERE_SECTION_ID, title: 'Start here', sections: index },
|
|
207
|
+
});
|
|
208
|
+
expect(start.body.replace(/\s+/g, ' ')).toContain('`production` is the default branch');
|
|
209
|
+
expect(await call({ section: WHOLE_GUIDE_SECTION })).toEqual({
|
|
210
|
+
status: 200,
|
|
211
|
+
body: { guide: joinGuideSections(platform), sections: index },
|
|
212
|
+
});
|
|
213
|
+
// A refusal says how to reach both.
|
|
214
|
+
const unknown = await call({ section: 'nope' });
|
|
215
|
+
expect(String(unknown.body.error)).toContain('Omit `section` for the start section, or pass `"all"` for the whole guide.');
|
|
216
|
+
});
|
|
217
|
+
|
|
191
218
|
it('returns the platform\'s HTML views section on its own, and inside the whole guide', async () => {
|
|
192
219
|
const { call, registry, sectionsNow } = await serve();
|
|
193
220
|
const platform = await agentGuideSections(DEFAULT_KB_LAYOUT);
|
|
@@ -197,7 +224,7 @@ describe('get_agent_guide', () => {
|
|
|
197
224
|
status: 200,
|
|
198
225
|
body: { guide: html.body, section: 'html-views', title: 'HTML views' },
|
|
199
226
|
});
|
|
200
|
-
const whole = await call();
|
|
227
|
+
const whole = await call({ section: 'all' });
|
|
201
228
|
expect(whole.body.guide).toBe(joinGuideSections(platform));
|
|
202
229
|
expect(String(whole.body.guide)).toContain('## HTML views');
|
|
203
230
|
// The description lists it, so an agent knows it can ask for it.
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { DEFAULT_KB_LAYOUT } from '@bevel-software/platform-shared';
|
|
2
|
+
import { toListedTool } from '@bevel-software/platform-mcp-core';
|
|
3
|
+
import { describe, expect, it } from 'vitest';
|
|
4
|
+
import { countTokens } from '../../../__tests__/tokens.js';
|
|
5
|
+
import { hexisCatalog } from '../../../__tests__/hexis-catalog.js';
|
|
6
|
+
import {
|
|
7
|
+
PREFIXED_TOOLS,
|
|
8
|
+
composeAgentInstructions,
|
|
9
|
+
platformInstructions,
|
|
10
|
+
prefixToolDescription,
|
|
11
|
+
} from '../../agent-instructions/index.js';
|
|
12
|
+
import { EXTERNAL_KB_MANUAL_NAME } from '../../tool-manuals/index.js';
|
|
13
|
+
import { CORE_SECTION_IDS, START_HERE_SECTION_ID, agentGuideSections, joinGuideSections } from '../agent-guide.js';
|
|
14
|
+
import {
|
|
15
|
+
INSTRUCTIONS_TOKEN_BUDGET,
|
|
16
|
+
SECTION_TOKEN_BUDGETS,
|
|
17
|
+
TOOL_LIST_TOKEN_BUDGET,
|
|
18
|
+
WHOLE_GUIDE_TOKEN_BUDGET,
|
|
19
|
+
} from '../guide-budget.js';
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* The budgets in `guide-budget.ts`, measured with a real tokenizer on the
|
|
23
|
+
* text an agent is actually handed: the sections as composed for a
|
|
24
|
+
* deployment (default layout, a default branch named `main`), the handshake's
|
|
25
|
+
* platform part, and the tool list as the hosted endpoint serves it. Each
|
|
26
|
+
* failure names what grew and by how much, so the next reader does not have
|
|
27
|
+
* to measure it by hand.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
const composed = () => agentGuideSections(DEFAULT_KB_LAYOUT, undefined, { defaultBranch: 'main' });
|
|
31
|
+
|
|
32
|
+
describe('the guide fits its token budgets', () => {
|
|
33
|
+
it('gives every core section a budget, and no budget to a section that is gone', () => {
|
|
34
|
+
const budgeted = Object.keys(SECTION_TOKEN_BUDGETS);
|
|
35
|
+
expect(CORE_SECTION_IDS.filter((id) => !budgeted.includes(id)), 'sections without a budget').toEqual([]);
|
|
36
|
+
expect(budgeted.filter((id) => !CORE_SECTION_IDS.includes(id)), 'budgets for sections that do not exist').toEqual([]);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it('keeps each section within its budget, the start section the tightest', async () => {
|
|
40
|
+
const over = (await composed())
|
|
41
|
+
.map((s) => ({ id: s.id, tokens: countTokens(s.body), budget: SECTION_TOKEN_BUDGETS[s.id]! }))
|
|
42
|
+
.filter((s) => s.tokens > s.budget);
|
|
43
|
+
expect(over, over.map((s) => `${s.id}: ${s.tokens} tokens (budget ${s.budget})`).join('\n')).toEqual([]);
|
|
44
|
+
expect(SECTION_TOKEN_BUDGETS[START_HERE_SECTION_ID]).toBe(Math.min(...Object.values(SECTION_TOKEN_BUDGETS)));
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it('keeps the whole guide within its budget', async () => {
|
|
48
|
+
const tokens = countTokens(joinGuideSections(await composed()));
|
|
49
|
+
expect(tokens, `the whole guide is ${tokens} tokens (budget ${WHOLE_GUIDE_TOKEN_BUDGET})`).toBeLessThanOrEqual(
|
|
50
|
+
WHOLE_GUIDE_TOKEN_BUDGET,
|
|
51
|
+
);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it('keeps the platform part of the handshake instructions within its budget', () => {
|
|
55
|
+
const tokens = countTokens(platformInstructions(DEFAULT_KB_LAYOUT));
|
|
56
|
+
expect(tokens, `the instructions are ${tokens} tokens (budget ${INSTRUCTIONS_TOKEN_BUDGET})`).toBeLessThanOrEqual(
|
|
57
|
+
INSTRUCTIONS_TOKEN_BUDGET,
|
|
58
|
+
);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it('keeps the tool list a client is served within its budget', async () => {
|
|
62
|
+
// As `mcp.service.ts` lists it: each tool through `toListedTool` (its
|
|
63
|
+
// `Call:` line and normalised schema), the purpose prefix on the four
|
|
64
|
+
// knowledge-base tools, and the meta-tools as built for the endpoint.
|
|
65
|
+
const { external, metaTools } = await hexisCatalog();
|
|
66
|
+
const { toolPrefix } = composeAgentInstructions(null, DEFAULT_KB_LAYOUT);
|
|
67
|
+
const listed = external.map((t) => {
|
|
68
|
+
const entry = toListedTool({
|
|
69
|
+
mcpName: t.name,
|
|
70
|
+
utcpName: `${EXTERNAL_KB_MANUAL_NAME}.${t.name}`,
|
|
71
|
+
description: t.description ?? '',
|
|
72
|
+
inputSchema: (t.inputs ?? {}) as never,
|
|
73
|
+
manualName: EXTERNAL_KB_MANUAL_NAME,
|
|
74
|
+
})!;
|
|
75
|
+
return PREFIXED_TOOLS.has(entry.name)
|
|
76
|
+
? { ...entry, description: prefixToolDescription(toolPrefix, entry.description) }
|
|
77
|
+
: entry;
|
|
78
|
+
});
|
|
79
|
+
const served = [
|
|
80
|
+
...metaTools.map((t) => ({ name: t.name, description: t.description ?? '', inputSchema: (t as { inputSchema?: unknown }).inputSchema })),
|
|
81
|
+
...listed,
|
|
82
|
+
];
|
|
83
|
+
const perTool = served.map((t) => ({
|
|
84
|
+
name: t.name,
|
|
85
|
+
tokens: countTokens(t.name) + countTokens(t.description ?? '') + countTokens(JSON.stringify(t.inputSchema ?? {})),
|
|
86
|
+
}));
|
|
87
|
+
const total = perTool.reduce((sum, t) => sum + t.tokens, 0);
|
|
88
|
+
const largest = [...perTool].sort((a, b) => b.tokens - a.tokens).slice(0, 5);
|
|
89
|
+
expect(
|
|
90
|
+
total,
|
|
91
|
+
`the tool list is ${total} tokens over ${served.length} tools (budget ${TOOL_LIST_TOKEN_BUDGET}); largest: ` +
|
|
92
|
+
largest.map((t) => `${t.name} ${t.tokens}`).join(', '),
|
|
93
|
+
).toBeLessThanOrEqual(TOOL_LIST_TOKEN_BUDGET);
|
|
94
|
+
});
|
|
95
|
+
});
|