@bevel-software/platform-core-backend 0.25.2 → 0.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/agent-guide/access-control.md +251 -0
- package/agent-guide/conventions.md +35 -0
- package/agent-guide/directory-structure.md +145 -0
- package/agent-guide/finding-things.md +7 -0
- package/agent-guide/html-views.md +83 -0
- package/agent-guide/introduction.md +27 -0
- package/agent-guide/new-knowledge-base.md +24 -0
- package/agent-guide/skills.md +47 -0
- package/agent-guide/tool-manuals.md +227 -0
- package/agent-guide/where-a-new-file-goes.md +36 -0
- package/dist/assets.d.ts +26 -0
- package/dist/assets.d.ts.map +1 -1
- package/dist/assets.js +35 -2
- package/dist/assets.js.map +1 -1
- package/dist/core/catalog-revision.d.ts +19 -1
- package/dist/core/catalog-revision.d.ts.map +1 -1
- package/dist/core/catalog-revision.js +14 -3
- package/dist/core/catalog-revision.js.map +1 -1
- package/dist/core/core-ports.d.ts +11 -0
- 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 +5 -0
- package/dist/core/create-core-server.d.ts.map +1 -1
- package/dist/core/create-core-server.js +65 -3
- package/dist/core/create-core-server.js.map +1 -1
- package/dist/core/create-core-services.d.ts +35 -0
- package/dist/core/create-core-services.d.ts.map +1 -1
- package/dist/core/create-core-services.js +114 -12
- package/dist/core/create-core-services.js.map +1 -1
- package/dist/core/lifecycle.d.ts +16 -1
- package/dist/core/lifecycle.d.ts.map +1 -1
- package/dist/core/lifecycle.js +18 -1
- package/dist/core/lifecycle.js.map +1 -1
- package/dist/core-config.d.ts +21 -0
- package/dist/core-config.d.ts.map +1 -1
- package/dist/core-config.js +22 -1
- package/dist/core-config.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/modules/access/access-control.interface.d.ts +17 -0
- package/dist/modules/access/access-control.interface.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.d.ts +2 -0
- package/dist/modules/access/access-control.service.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.js +27 -0
- package/dist/modules/access/access-control.service.js.map +1 -1
- package/dist/modules/access/directory-sync-bot.js +1 -1
- package/dist/modules/access/directory-sync-bot.js.map +1 -1
- package/dist/modules/agent-guide/agent-guide.d.ts +145 -0
- package/dist/modules/agent-guide/agent-guide.d.ts.map +1 -0
- package/dist/modules/agent-guide/agent-guide.js +199 -0
- package/dist/modules/agent-guide/agent-guide.js.map +1 -0
- package/dist/modules/agent-guide/agent-guide.tools.d.ts +24 -0
- package/dist/modules/agent-guide/agent-guide.tools.d.ts.map +1 -0
- package/dist/modules/agent-guide/agent-guide.tools.js +100 -0
- package/dist/modules/agent-guide/agent-guide.tools.js.map +1 -0
- package/dist/modules/agent-guide/index.d.ts +4 -0
- package/dist/modules/agent-guide/index.d.ts.map +1 -0
- package/dist/modules/agent-guide/index.js +4 -0
- package/dist/modules/agent-guide/index.js.map +1 -0
- package/dist/modules/agent-instructions/agent-instructions.routes.d.ts +3 -2
- package/dist/modules/agent-instructions/agent-instructions.routes.d.ts.map +1 -1
- package/dist/modules/agent-instructions/agent-instructions.routes.js +3 -2
- package/dist/modules/agent-instructions/agent-instructions.routes.js.map +1 -1
- package/dist/modules/agent-instructions/compose.d.ts +14 -6
- package/dist/modules/agent-instructions/compose.d.ts.map +1 -1
- package/dist/modules/agent-instructions/compose.js +28 -8
- package/dist/modules/agent-instructions/compose.js.map +1 -1
- package/dist/modules/agent-instructions/index.d.ts +1 -1
- package/dist/modules/agent-instructions/index.d.ts.map +1 -1
- package/dist/modules/agent-instructions/index.js +1 -1
- package/dist/modules/agent-instructions/index.js.map +1 -1
- package/dist/modules/agent-instructions/shared-file-rules.d.ts +10 -50
- package/dist/modules/agent-instructions/shared-file-rules.d.ts.map +1 -1
- package/dist/modules/agent-instructions/shared-file-rules.js +51 -104
- package/dist/modules/agent-instructions/shared-file-rules.js.map +1 -1
- package/dist/modules/audit/agent-audit.service.d.ts +21 -2
- package/dist/modules/audit/agent-audit.service.d.ts.map +1 -1
- package/dist/modules/audit/agent-audit.service.js +43 -2
- package/dist/modules/audit/agent-audit.service.js.map +1 -1
- package/dist/modules/audit/agent-connection.routes.d.ts +34 -0
- package/dist/modules/audit/agent-connection.routes.d.ts.map +1 -0
- package/dist/modules/audit/agent-connection.routes.js +38 -0
- package/dist/modules/audit/agent-connection.routes.js.map +1 -0
- package/dist/modules/audit/audit.contract.d.ts +24 -0
- package/dist/modules/audit/audit.contract.d.ts.map +1 -1
- package/dist/modules/audit/audit.contract.js.map +1 -1
- package/dist/modules/audit/index.d.ts +1 -0
- package/dist/modules/audit/index.d.ts.map +1 -1
- package/dist/modules/audit/index.js +1 -0
- package/dist/modules/audit/index.js.map +1 -1
- package/dist/modules/auth/account.routes.d.ts.map +1 -1
- package/dist/modules/auth/account.routes.js +10 -3
- package/dist/modules/auth/account.routes.js.map +1 -1
- package/dist/modules/auth/auth.middleware.d.ts +7 -0
- package/dist/modules/auth/auth.middleware.d.ts.map +1 -1
- package/dist/modules/auth/auth.middleware.js +1 -1
- package/dist/modules/auth/auth.middleware.js.map +1 -1
- package/dist/modules/code-mode/code-mode.tool.d.ts.map +1 -1
- package/dist/modules/code-mode/code-mode.tool.js +11 -3
- package/dist/modules/code-mode/code-mode.tool.js.map +1 -1
- package/dist/modules/database/core-schema.d.ts +96 -0
- package/dist/modules/database/core-schema.d.ts.map +1 -1
- package/dist/modules/database/core-schema.js +32 -3
- package/dist/modules/database/core-schema.js.map +1 -1
- package/dist/modules/embed/account-link.service.d.ts +42 -0
- package/dist/modules/embed/account-link.service.d.ts.map +1 -0
- package/dist/modules/embed/account-link.service.js +50 -0
- package/dist/modules/embed/account-link.service.js.map +1 -0
- package/dist/modules/embed/embed-link.d.ts +58 -0
- package/dist/modules/embed/embed-link.d.ts.map +1 -0
- package/dist/modules/embed/embed-link.js +160 -0
- package/dist/modules/embed/embed-link.js.map +1 -0
- package/dist/modules/embed/embed.errors.d.ts +30 -0
- package/dist/modules/embed/embed.errors.d.ts.map +1 -0
- package/dist/modules/embed/embed.errors.js +42 -0
- package/dist/modules/embed/embed.errors.js.map +1 -0
- package/dist/modules/embed/embed.interface.d.ts +204 -0
- package/dist/modules/embed/embed.interface.d.ts.map +1 -0
- package/dist/modules/embed/embed.interface.js +2 -0
- package/dist/modules/embed/embed.interface.js.map +1 -0
- package/dist/modules/embed/embed.routes.d.ts +59 -0
- package/dist/modules/embed/embed.routes.d.ts.map +1 -0
- package/dist/modules/embed/embed.routes.js +343 -0
- package/dist/modules/embed/embed.routes.js.map +1 -0
- package/dist/modules/embed/embed.service.d.ts +169 -0
- package/dist/modules/embed/embed.service.d.ts.map +1 -0
- package/dist/modules/embed/embed.service.js +627 -0
- package/dist/modules/embed/embed.service.js.map +1 -0
- package/dist/modules/embed/embed.tools.d.ts +51 -0
- package/dist/modules/embed/embed.tools.d.ts.map +1 -0
- package/dist/modules/embed/embed.tools.js +170 -0
- package/dist/modules/embed/embed.tools.js.map +1 -0
- package/dist/modules/embed/mcp-app.d.ts +64 -0
- package/dist/modules/embed/mcp-app.d.ts.map +1 -0
- package/dist/modules/embed/mcp-app.js +147 -0
- package/dist/modules/embed/mcp-app.js.map +1 -0
- package/dist/modules/embed/mcp-app.routes.d.ts +21 -0
- package/dist/modules/embed/mcp-app.routes.d.ts.map +1 -0
- package/dist/modules/embed/mcp-app.routes.js +36 -0
- package/dist/modules/embed/mcp-app.routes.js.map +1 -0
- package/dist/modules/github-app/github-app.connection.d.ts +15 -0
- package/dist/modules/github-app/github-app.connection.d.ts.map +1 -1
- package/dist/modules/github-app/github-app.connection.js +34 -3
- package/dist/modules/github-app/github-app.connection.js.map +1 -1
- package/dist/modules/kb-fs/locking-filesystem.d.ts +65 -0
- package/dist/modules/kb-fs/locking-filesystem.d.ts.map +1 -1
- package/dist/modules/kb-fs/locking-filesystem.js +300 -0
- package/dist/modules/kb-fs/locking-filesystem.js.map +1 -1
- package/dist/modules/kb-sync/kb-sync.interface.d.ts +5 -0
- package/dist/modules/kb-sync/kb-sync.interface.d.ts.map +1 -1
- package/dist/modules/kb-sync/kb-sync.service.d.ts.map +1 -1
- package/dist/modules/kb-sync/kb-sync.service.js +6 -0
- package/dist/modules/kb-sync/kb-sync.service.js.map +1 -1
- package/dist/modules/mcp/mcp-auth.middleware.d.ts.map +1 -1
- package/dist/modules/mcp/mcp-auth.middleware.js +2 -1
- package/dist/modules/mcp/mcp-auth.middleware.js.map +1 -1
- package/dist/modules/mcp/mcp.service.d.ts +57 -3
- package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
- package/dist/modules/mcp/mcp.service.js +177 -24
- package/dist/modules/mcp/mcp.service.js.map +1 -1
- package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts +24 -0
- package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts.map +1 -1
- package/dist/modules/mcp/oauth/bevel-oauth-provider.js +32 -4
- package/dist/modules/mcp/oauth/bevel-oauth-provider.js.map +1 -1
- package/dist/modules/mcp/tool-schema-guard.d.ts +105 -0
- package/dist/modules/mcp/tool-schema-guard.d.ts.map +1 -0
- package/dist/modules/mcp/tool-schema-guard.js +171 -0
- package/dist/modules/mcp/tool-schema-guard.js.map +1 -0
- package/dist/modules/onboarding/onboarding.contract.d.ts +80 -0
- package/dist/modules/onboarding/onboarding.contract.d.ts.map +1 -0
- package/dist/modules/onboarding/onboarding.contract.js +7 -0
- package/dist/modules/onboarding/onboarding.contract.js.map +1 -0
- package/dist/modules/onboarding/onboarding.routes.d.ts +18 -0
- package/dist/modules/onboarding/onboarding.routes.d.ts.map +1 -0
- package/dist/modules/onboarding/onboarding.routes.js +81 -0
- package/dist/modules/onboarding/onboarding.routes.js.map +1 -0
- package/dist/modules/onboarding/starter-pack.service.d.ts +213 -0
- package/dist/modules/onboarding/starter-pack.service.d.ts.map +1 -0
- package/dist/modules/onboarding/starter-pack.service.js +492 -0
- package/dist/modules/onboarding/starter-pack.service.js.map +1 -0
- package/dist/modules/onboarding/starter-packs.d.ts +78 -0
- package/dist/modules/onboarding/starter-packs.d.ts.map +1 -0
- package/dist/modules/onboarding/starter-packs.js +156 -0
- package/dist/modules/onboarding/starter-packs.js.map +1 -0
- package/dist/modules/plugins/index.d.ts +1 -1
- package/dist/modules/plugins/index.d.ts.map +1 -1
- package/dist/modules/plugins/index.js +1 -1
- package/dist/modules/plugins/index.js.map +1 -1
- package/dist/modules/plugins/plugin-provision.service.d.ts +19 -0
- package/dist/modules/plugins/plugin-provision.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-provision.service.js +18 -1
- package/dist/modules/plugins/plugin-provision.service.js.map +1 -1
- package/dist/modules/plugins/plugins.routes.d.ts +0 -36
- package/dist/modules/plugins/plugins.routes.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.routes.js +31 -0
- package/dist/modules/plugins/plugins.routes.js.map +1 -1
- package/dist/modules/plugins/plugins.tools.d.ts +36 -2
- package/dist/modules/plugins/plugins.tools.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.tools.js +71 -14
- package/dist/modules/plugins/plugins.tools.js.map +1 -1
- package/dist/modules/settings/deployment-settings.service.d.ts +34 -7
- package/dist/modules/settings/deployment-settings.service.d.ts.map +1 -1
- package/dist/modules/settings/deployment-settings.service.js +148 -54
- package/dist/modules/settings/deployment-settings.service.js.map +1 -1
- package/dist/modules/settings/repository-source.d.ts +1 -0
- package/dist/modules/settings/repository-source.d.ts.map +1 -1
- package/dist/modules/settings/repository-source.js +3 -3
- package/dist/modules/settings/repository-source.js.map +1 -1
- package/dist/modules/settings/setup.routes.d.ts.map +1 -1
- package/dist/modules/settings/setup.routes.js +3 -6
- package/dist/modules/settings/setup.routes.js.map +1 -1
- package/dist/modules/skills/skills.tools.d.ts.map +1 -1
- package/dist/modules/skills/skills.tools.js +103 -43
- package/dist/modules/skills/skills.tools.js.map +1 -1
- package/dist/modules/tool-auth/connection-key-rejection.d.ts +10 -1
- package/dist/modules/tool-auth/connection-key-rejection.d.ts.map +1 -1
- package/dist/modules/tool-auth/connection-key-rejection.js +11 -3
- package/dist/modules/tool-auth/connection-key-rejection.js.map +1 -1
- package/dist/modules/tool-auth/external-api-key.interface.d.ts +8 -0
- package/dist/modules/tool-auth/external-api-key.interface.d.ts.map +1 -1
- package/dist/modules/tool-auth/external-api-key.service.d.ts +24 -2
- package/dist/modules/tool-auth/external-api-key.service.d.ts.map +1 -1
- package/dist/modules/tool-auth/external-api-key.service.js +59 -2
- package/dist/modules/tool-auth/external-api-key.service.js.map +1 -1
- package/dist/modules/tool-auth/tool-auth.middleware.d.ts.map +1 -1
- package/dist/modules/tool-auth/tool-auth.middleware.js +9 -4
- package/dist/modules/tool-auth/tool-auth.middleware.js.map +1 -1
- package/dist/modules/tool-helpers/index.d.ts +28 -1
- package/dist/modules/tool-helpers/index.d.ts.map +1 -1
- package/dist/modules/tool-helpers/index.js +28 -1
- package/dist/modules/tool-helpers/index.js.map +1 -1
- package/dist/modules/tool-helpers/route-argument-check.d.ts +10 -0
- package/dist/modules/tool-helpers/route-argument-check.d.ts.map +1 -0
- package/dist/modules/tool-helpers/route-argument-check.js +132 -0
- package/dist/modules/tool-helpers/route-argument-check.js.map +1 -0
- package/dist/modules/tool-helpers/route-tool-schemas.d.ts +89 -0
- package/dist/modules/tool-helpers/route-tool-schemas.d.ts.map +1 -0
- package/dist/modules/tool-helpers/route-tool-schemas.js +113 -0
- package/dist/modules/tool-helpers/route-tool-schemas.js.map +1 -0
- package/dist/modules/tool-helpers/tool-def.d.ts +71 -0
- package/dist/modules/tool-helpers/tool-def.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool-def.js +70 -6
- package/dist/modules/tool-helpers/tool-def.js.map +1 -1
- package/dist/modules/tool-helpers/tool-handler.d.ts +46 -6
- package/dist/modules/tool-helpers/tool-handler.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool-handler.js +157 -8
- package/dist/modules/tool-helpers/tool-handler.js.map +1 -1
- package/dist/modules/tool-helpers/tool.contract.d.ts +9 -0
- package/dist/modules/tool-helpers/tool.contract.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool.contract.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.contract.d.ts +23 -4
- package/dist/modules/tool-manuals/tool-manuals.contract.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.contract.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts +4 -0
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.js +14 -0
- package/dist/modules/tool-manuals/tool-manuals.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts +7 -0
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.js +77 -38
- package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -1
- package/dist/modules/tool-registry/description-length.d.ts +20 -16
- package/dist/modules/tool-registry/description-length.d.ts.map +1 -1
- package/dist/modules/tool-registry/description-length.js +50 -30
- package/dist/modules/tool-registry/description-length.js.map +1 -1
- package/dist/modules/tool-registry/guide-first.d.ts +27 -0
- package/dist/modules/tool-registry/guide-first.d.ts.map +1 -0
- package/dist/modules/tool-registry/guide-first.js +40 -0
- package/dist/modules/tool-registry/guide-first.js.map +1 -0
- package/dist/modules/tool-registry/tool-registry.d.ts +6 -0
- package/dist/modules/tool-registry/tool-registry.d.ts.map +1 -1
- package/dist/modules/tool-registry/tool-registry.js +9 -2
- package/dist/modules/tool-registry/tool-registry.js.map +1 -1
- package/dist/modules/workflow/agent-tools/change-request-read-shape.d.ts +449 -0
- package/dist/modules/workflow/agent-tools/change-request-read-shape.d.ts.map +1 -0
- package/dist/modules/workflow/agent-tools/change-request-read-shape.js +481 -0
- package/dist/modules/workflow/agent-tools/change-request-read-shape.js.map +1 -0
- package/dist/modules/workflow/agent-tools/change-request-read.tools.d.ts +126 -0
- package/dist/modules/workflow/agent-tools/change-request-read.tools.d.ts.map +1 -0
- package/dist/modules/workflow/agent-tools/change-request-read.tools.js +611 -0
- package/dist/modules/workflow/agent-tools/change-request-read.tools.js.map +1 -0
- package/dist/modules/workflow/agent-tools/change-request-summary.d.ts +12 -1
- package/dist/modules/workflow/agent-tools/change-request-summary.d.ts.map +1 -1
- package/dist/modules/workflow/agent-tools/change-request-summary.js +5 -1
- package/dist/modules/workflow/agent-tools/change-request-summary.js.map +1 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.d.ts +8 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +1 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.js +133 -37
- package/dist/modules/workflow/agent-tools/workflow.tools.js.map +1 -1
- package/dist/modules/workflow/file-lock.service.d.ts +29 -5
- package/dist/modules/workflow/file-lock.service.d.ts.map +1 -1
- package/dist/modules/workflow/file-lock.service.js +62 -5
- package/dist/modules/workflow/file-lock.service.js.map +1 -1
- package/dist/modules/workflow/git/git.service.d.ts +282 -14
- package/dist/modules/workflow/git/git.service.d.ts.map +1 -1
- package/dist/modules/workflow/git/git.service.js +627 -126
- package/dist/modules/workflow/git/git.service.js.map +1 -1
- package/dist/modules/workflow/git/merge-commit.d.ts +73 -0
- package/dist/modules/workflow/git/merge-commit.d.ts.map +1 -0
- package/dist/modules/workflow/git/merge-commit.js +89 -0
- package/dist/modules/workflow/git/merge-commit.js.map +1 -0
- package/dist/modules/workflow/git/node-git-runner.d.ts +15 -0
- package/dist/modules/workflow/git/node-git-runner.d.ts.map +1 -1
- package/dist/modules/workflow/git/node-git-runner.js +78 -6
- package/dist/modules/workflow/git/node-git-runner.js.map +1 -1
- package/dist/modules/workflow/git/pull-request.service.d.ts +94 -1
- package/dist/modules/workflow/git/pull-request.service.d.ts.map +1 -1
- package/dist/modules/workflow/git/pull-request.service.js +332 -37
- package/dist/modules/workflow/git/pull-request.service.js.map +1 -1
- package/dist/modules/workflow/pending-commits.service.d.ts +15 -0
- package/dist/modules/workflow/pending-commits.service.d.ts.map +1 -1
- package/dist/modules/workflow/pending-commits.service.js +25 -1
- package/dist/modules/workflow/pending-commits.service.js.map +1 -1
- package/dist/modules/workflow/pending-commits.worker.d.ts +6 -1
- package/dist/modules/workflow/pending-commits.worker.d.ts.map +1 -1
- package/dist/modules/workflow/pending-commits.worker.js +23 -6
- package/dist/modules/workflow/pending-commits.worker.js.map +1 -1
- package/dist/modules/workflow/recovery-bot.js +1 -1
- package/dist/modules/workflow/recovery-bot.js.map +1 -1
- package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts +35 -0
- package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts.map +1 -1
- package/dist/modules/workflow/review-workflow/review-workflow.service.js +180 -13
- package/dist/modules/workflow/review-workflow/review-workflow.service.js.map +1 -1
- package/dist/modules/workflow/sanitize-error.d.ts +16 -0
- package/dist/modules/workflow/sanitize-error.d.ts.map +1 -1
- package/dist/modules/workflow/sanitize-error.js +45 -0
- package/dist/modules/workflow/sanitize-error.js.map +1 -1
- package/dist/modules/workflow/workflow.routes.d.ts +6 -2
- package/dist/modules/workflow/workflow.routes.d.ts.map +1 -1
- package/dist/modules/workflow/workflow.routes.js +7 -2
- package/dist/modules/workflow/workflow.routes.js.map +1 -1
- package/dist/modules/workflow/workflow.service.d.ts +187 -15
- package/dist/modules/workflow/workflow.service.d.ts.map +1 -1
- package/dist/modules/workflow/workflow.service.js +808 -106
- package/dist/modules/workflow/workflow.service.js.map +1 -1
- package/dist/modules/workspace/agent-download.builder.d.ts +105 -0
- package/dist/modules/workspace/agent-download.builder.d.ts.map +1 -0
- package/dist/modules/workspace/agent-download.builder.js +238 -0
- package/dist/modules/workspace/agent-download.builder.js.map +1 -0
- package/dist/modules/workspace/agent-download.routes.d.ts +77 -0
- package/dist/modules/workspace/agent-download.routes.d.ts.map +1 -0
- package/dist/modules/workspace/agent-download.routes.js +156 -0
- package/dist/modules/workspace/agent-download.routes.js.map +1 -0
- package/dist/modules/workspace/agent-download.store.d.ts +225 -0
- package/dist/modules/workspace/agent-download.store.d.ts.map +1 -0
- package/dist/modules/workspace/agent-download.store.js +423 -0
- package/dist/modules/workspace/agent-download.store.js.map +1 -0
- package/dist/modules/workspace/agent-upload.store.d.ts +10 -1
- package/dist/modules/workspace/agent-upload.store.d.ts.map +1 -1
- package/dist/modules/workspace/agent-upload.store.js +16 -6
- package/dist/modules/workspace/agent-upload.store.js.map +1 -1
- package/dist/modules/workspace/file-readers/raw-mime.d.ts +6 -0
- package/dist/modules/workspace/file-readers/raw-mime.d.ts.map +1 -0
- package/dist/modules/workspace/file-readers/raw-mime.js +38 -0
- package/dist/modules/workspace/file-readers/raw-mime.js.map +1 -0
- package/dist/modules/workspace/file-readers/text-reader.d.ts +5 -5
- package/dist/modules/workspace/file-readers/text-reader.d.ts.map +1 -1
- package/dist/modules/workspace/file-readers/text-reader.js +5 -8
- package/dist/modules/workspace/file-readers/text-reader.js.map +1 -1
- package/dist/modules/workspace/first-run.d.ts +111 -0
- package/dist/modules/workspace/first-run.d.ts.map +1 -0
- package/dist/modules/workspace/first-run.js +181 -0
- package/dist/modules/workspace/first-run.js.map +1 -0
- package/dist/modules/workspace/move-links.d.ts +92 -0
- package/dist/modules/workspace/move-links.d.ts.map +1 -0
- package/dist/modules/workspace/move-links.js +173 -0
- package/dist/modules/workspace/move-links.js.map +1 -0
- package/dist/modules/workspace/startup/steps/seed-tree.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/seed-tree.js +24 -39
- package/dist/modules/workspace/startup/steps/seed-tree.js.map +1 -1
- package/dist/modules/workspace/startup/steps/template-files.step.d.ts +58 -52
- package/dist/modules/workspace/startup/steps/template-files.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/template-files.step.js +209 -223
- package/dist/modules/workspace/startup/steps/template-files.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/template-source.d.ts +5 -3
- package/dist/modules/workspace/startup/steps/template-source.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/template-source.js +5 -3
- package/dist/modules/workspace/startup/steps/template-source.js.map +1 -1
- package/dist/modules/workspace/workspace.routes.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.routes.js +63 -22
- package/dist/modules/workspace/workspace.routes.js.map +1 -1
- package/dist/modules/workspace/workspace.service.d.ts +75 -2
- package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.service.js +197 -24
- package/dist/modules/workspace/workspace.service.js.map +1 -1
- package/dist/modules/workspace/workspace.tools.d.ts +68 -1
- package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.tools.js +642 -71
- package/dist/modules/workspace/workspace.tools.js.map +1 -1
- package/dist/modules/write-access/write-access.d.ts.map +1 -1
- package/dist/modules/write-access/write-access.js +9 -0
- package/dist/modules/write-access/write-access.js.map +1 -1
- package/dist/shared/domain-errors.d.ts +84 -1
- package/dist/shared/domain-errors.d.ts.map +1 -1
- package/dist/shared/domain-errors.js +100 -12
- package/dist/shared/domain-errors.js.map +1 -1
- package/dist/shared/git.contract.d.ts +10 -1
- package/dist/shared/git.contract.d.ts.map +1 -1
- package/dist/shared/git.contract.js.map +1 -1
- package/dist/shared/hidden-tools.d.ts +44 -0
- package/dist/shared/hidden-tools.d.ts.map +1 -0
- package/dist/shared/hidden-tools.js +13 -0
- package/dist/shared/hidden-tools.js.map +1 -0
- package/dist/shared/utf8-text.d.ts +15 -0
- package/dist/shared/utf8-text.d.ts.map +1 -0
- package/dist/shared/utf8-text.js +20 -0
- package/dist/shared/utf8-text.js.map +1 -0
- package/dist/tenancy/static-tenant-source.d.ts +2 -1
- package/dist/tenancy/static-tenant-source.d.ts.map +1 -1
- package/dist/tenancy/static-tenant-source.js +9 -2
- package/dist/tenancy/static-tenant-source.js.map +1 -1
- package/kb-template/.bevelignore +0 -5
- package/mcp-app/page.html +349 -0
- package/migrations/0017_atlassian_account_links.sql +37 -0
- package/migrations/meta/0017_snapshot.json +2396 -0
- package/migrations/meta/_journal.json +8 -1
- package/package.json +6 -3
- package/src/__tests__/kb-layout-config.test.ts +10 -100
- package/src/__tests__/packaged-assets-ship.test.ts +66 -0
- package/src/assets.ts +38 -2
- package/src/core/__tests__/catalog-revision.test.ts +40 -0
- package/src/core/__tests__/gated-boot.test.ts +1 -0
- package/src/core/__tests__/lifecycle.test.ts +14 -0
- package/src/core/catalog-revision.ts +15 -2
- package/src/core/core-ports.ts +11 -0
- package/src/core/create-core-server.ts +78 -3
- package/src/core/create-core-services.ts +168 -10
- package/src/core/lifecycle.ts +28 -2
- package/src/core-config.ts +24 -1
- package/src/index.ts +2 -2
- package/src/modules/access/__tests__/access-control.atref-batch.test.ts +58 -0
- package/src/modules/access/__tests__/access-control.platform-restore.test.ts +8 -7
- package/src/modules/access/__tests__/access-control.service.test.ts +19 -0
- package/src/modules/access/__tests__/access-personal-plugin.test.ts +1 -18
- package/src/modules/access/access-control.interface.ts +28 -0
- package/src/modules/access/access-control.service.ts +37 -0
- package/src/modules/access/directory-sync-bot.ts +1 -1
- package/src/modules/agent-guide/__tests__/agent-guide.test.ts +386 -0
- package/src/modules/agent-guide/__tests__/agent-guide.tools.test.ts +207 -0
- package/src/modules/agent-guide/agent-guide.tools.ts +122 -0
- package/src/modules/agent-guide/agent-guide.ts +300 -0
- package/src/modules/agent-guide/index.ts +22 -0
- package/src/modules/agent-instructions/__tests__/shared-file-rules.test.ts +39 -118
- package/src/modules/agent-instructions/agent-instructions.routes.ts +3 -2
- package/src/modules/agent-instructions/compose.ts +26 -8
- package/src/modules/agent-instructions/index.ts +0 -3
- package/src/modules/agent-instructions/shared-file-rules.ts +50 -112
- package/src/modules/audit/__tests__/agent-audit.service.test.ts +64 -4
- package/src/modules/audit/__tests__/agent-connection.routes.test.ts +102 -0
- package/src/modules/audit/agent-audit.service.ts +58 -3
- package/src/modules/audit/agent-connection.routes.ts +56 -0
- package/src/modules/audit/audit.contract.ts +26 -0
- package/src/modules/audit/index.ts +1 -0
- package/src/modules/auth/__tests__/account.routes.test.ts +5 -3
- package/src/modules/auth/account.routes.ts +10 -3
- package/src/modules/auth/auth.middleware.ts +1 -1
- package/src/modules/code-mode/__tests__/code-mode.tool.test.ts +18 -2
- package/src/modules/code-mode/code-mode.tool.ts +13 -2
- package/src/modules/database/core-schema.ts +33 -3
- package/src/modules/embed/__tests__/account-links.migration.test.ts +98 -0
- package/src/modules/embed/__tests__/embed-link.test.ts +122 -0
- package/src/modules/embed/__tests__/embed.routes.test.ts +362 -0
- package/src/modules/embed/__tests__/embed.service.lock.test.ts +193 -0
- package/src/modules/embed/__tests__/embed.service.test.ts +805 -0
- package/src/modules/embed/__tests__/embed.tools.test.ts +304 -0
- package/src/modules/embed/__tests__/mcp-app.test.ts +207 -0
- package/src/modules/embed/account-link.service.ts +76 -0
- package/src/modules/embed/embed-link.ts +180 -0
- package/src/modules/embed/embed.errors.ts +43 -0
- package/src/modules/embed/embed.interface.ts +203 -0
- package/src/modules/embed/embed.routes.ts +363 -0
- package/src/modules/embed/embed.service.ts +705 -0
- package/src/modules/embed/embed.tools.ts +206 -0
- package/src/modules/embed/mcp-app.routes.ts +41 -0
- package/src/modules/embed/mcp-app.ts +173 -0
- package/src/modules/github-app/__tests__/github-app.test.ts +76 -0
- package/src/modules/github-app/github-app.connection.ts +38 -4
- package/src/modules/kb-fs/__tests__/move-with-edits.test.ts +304 -0
- package/src/modules/kb-fs/locking-filesystem.ts +287 -0
- package/src/modules/kb-sync/__tests__/kb-sync.service.test.ts +35 -0
- package/src/modules/kb-sync/kb-sync.interface.ts +2 -0
- package/src/modules/kb-sync/kb-sync.service.ts +6 -0
- package/src/modules/mcp/__tests__/bevel-oauth-provider.test.ts +68 -11
- package/src/modules/mcp/__tests__/fake-downstream-mcp-server.ts +14 -3
- package/src/modules/mcp/__tests__/mcp-proxy-helpers.test.ts +37 -2
- package/src/modules/mcp/__tests__/mcp.app.e2e.test.ts +200 -0
- package/src/modules/mcp/__tests__/mcp.e2e.test.ts +252 -0
- package/src/modules/mcp/__tests__/mcp.service.test.ts +42 -24
- package/src/modules/mcp/__tests__/tool-call-interface.e2e.test.ts +499 -0
- package/src/modules/mcp/__tests__/tool-schema-guard.test.ts +266 -0
- package/src/modules/mcp/mcp-auth.middleware.ts +2 -1
- package/src/modules/mcp/mcp.service.ts +218 -31
- package/src/modules/mcp/oauth/bevel-oauth-provider.ts +42 -4
- package/src/modules/mcp/tool-schema-guard.ts +196 -0
- package/src/modules/onboarding/__tests__/onboarding.routes.test.ts +163 -0
- package/src/modules/onboarding/__tests__/starter-pack.service.test.ts +635 -0
- package/src/modules/onboarding/__tests__/starter-packs.test.ts +169 -0
- package/src/modules/onboarding/onboarding.contract.ts +85 -0
- package/src/modules/onboarding/onboarding.routes.ts +85 -0
- package/src/modules/onboarding/starter-pack.service.ts +580 -0
- package/src/modules/onboarding/starter-packs.ts +182 -0
- package/src/modules/plugins/__tests__/plugins.tools.test.ts +177 -4
- package/src/modules/plugins/index.ts +1 -0
- package/src/modules/plugins/plugin-provision.service.ts +22 -1
- package/src/modules/plugins/plugins.routes.ts +29 -0
- package/src/modules/plugins/plugins.tools.ts +75 -15
- package/src/modules/settings/__tests__/deployment-settings.service.test.ts +176 -56
- package/src/modules/settings/__tests__/repository-source.test.ts +9 -0
- package/src/modules/settings/deployment-settings.service.ts +144 -55
- package/src/modules/settings/repository-source.ts +4 -4
- package/src/modules/settings/setup.routes.ts +3 -6
- package/src/modules/skills/__tests__/skills.tools.description.test.ts +95 -0
- package/src/modules/skills/skills.tools.ts +112 -46
- package/src/modules/tool-auth/__tests__/connection-key-rejection.test.ts +32 -0
- package/src/modules/tool-auth/__tests__/external-api-key.service.test.ts +65 -0
- package/src/modules/tool-auth/connection-key-rejection.ts +13 -3
- package/src/modules/tool-auth/external-api-key.interface.ts +9 -0
- package/src/modules/tool-auth/external-api-key.service.ts +61 -4
- package/src/modules/tool-auth/tool-auth.middleware.ts +13 -4
- package/src/modules/tool-helpers/__tests__/branch-declaration.test.ts +502 -0
- package/src/modules/tool-helpers/__tests__/route-argument-check.test.ts +337 -0
- package/src/modules/tool-helpers/index.ts +34 -1
- package/src/modules/tool-helpers/route-argument-check.ts +149 -0
- package/src/modules/tool-helpers/route-tool-schemas.ts +171 -0
- package/src/modules/tool-helpers/tool-def.ts +132 -7
- package/src/modules/tool-helpers/tool-handler.ts +196 -8
- package/src/modules/tool-helpers/tool.contract.ts +9 -0
- package/src/modules/tool-manuals/__tests__/tool-manuals.detail.route.test.ts +57 -0
- package/src/modules/tool-manuals/__tests__/tool-manuals.tools.test.ts +73 -4
- package/src/modules/tool-manuals/tool-manuals.contract.ts +24 -4
- package/src/modules/tool-manuals/tool-manuals.service.ts +17 -0
- package/src/modules/tool-manuals/tool-manuals.tools.ts +86 -38
- package/src/modules/tool-registry/__tests__/own-tool-schemas.test.ts +173 -0
- package/src/modules/tool-registry/__tests__/tool-description-length.test.ts +81 -66
- package/src/modules/tool-registry/description-length.ts +57 -32
- package/src/modules/tool-registry/guide-first.ts +41 -0
- package/src/modules/tool-registry/tool-registry.ts +9 -2
- package/src/modules/workflow/__tests__/apply-failure.test.ts +6 -1
- package/src/modules/workflow/__tests__/file-lock.service.deletion-gate.test.ts +104 -0
- package/src/modules/workflow/__tests__/pending-commits.repository-replaced.test.ts +66 -0
- package/src/modules/workflow/__tests__/pending-commits.worker.test.ts +31 -2
- package/src/modules/workflow/__tests__/preserve-roles-yaml.test.ts +110 -6
- package/src/modules/workflow/__tests__/sanitize-error.test.ts +89 -1
- package/src/modules/workflow/__tests__/workflow.routes.push-refused.test.ts +202 -0
- package/src/modules/workflow/__tests__/workflow.service.branch-in-use.test.ts +6 -6
- package/src/modules/workflow/__tests__/workflow.service.delete-branch.test.ts +1026 -0
- package/src/modules/workflow/__tests__/workflow.service.facade.test.ts +468 -10
- package/src/modules/workflow/__tests__/workflow.service.folder-proposals.test.ts +4 -0
- package/src/modules/workflow/__tests__/workflow.service.releaseLock.test.ts +5 -4
- package/src/modules/workflow/__tests__/workflow.service.update-from-target.test.ts +54 -2
- package/src/modules/workflow/agent-tools/__tests__/change-request-read-shape.test.ts +705 -0
- package/src/modules/workflow/agent-tools/__tests__/change-request-read.tools.test.ts +1554 -0
- package/src/modules/workflow/agent-tools/__tests__/workflow.tools.test.ts +150 -4
- package/src/modules/workflow/agent-tools/change-request-read-shape.ts +712 -0
- package/src/modules/workflow/agent-tools/change-request-read.tools.ts +759 -0
- package/src/modules/workflow/agent-tools/change-request-summary.ts +5 -1
- package/src/modules/workflow/agent-tools/workflow.tools.ts +137 -35
- package/src/modules/workflow/file-lock.service.ts +67 -5
- package/src/modules/workflow/git/__tests__/git.service.appliedChange.test.ts +285 -0
- package/src/modules/workflow/git/__tests__/git.service.changedFilesForPr.test.ts +124 -0
- package/src/modules/workflow/git/__tests__/git.service.deleteBranch.test.ts +164 -0
- package/src/modules/workflow/git/__tests__/git.service.mergeChangeRequest.test.ts +334 -0
- package/src/modules/workflow/git/__tests__/git.service.pull.test.ts +48 -1
- package/src/modules/workflow/git/__tests__/node-git-runner.test.ts +231 -2
- package/src/modules/workflow/git/__tests__/pull-request.service.list-fetch.test.ts +72 -2
- package/src/modules/workflow/git/__tests__/pull-request.service.placeholder.test.ts +24 -2
- package/src/modules/workflow/git/__tests__/pull-request.service.test.ts +620 -1
- package/src/modules/workflow/git/git.service.ts +714 -133
- package/src/modules/workflow/git/merge-commit.ts +88 -0
- package/src/modules/workflow/git/node-git-runner.ts +82 -7
- package/src/modules/workflow/git/pull-request.service.ts +380 -54
- package/src/modules/workflow/pending-commits.service.ts +29 -1
- package/src/modules/workflow/pending-commits.worker.ts +24 -6
- package/src/modules/workflow/recovery-bot.ts +1 -1
- package/src/modules/workflow/review-workflow/__tests__/approval-states.test.ts +7 -1
- package/src/modules/workflow/review-workflow/__tests__/merge-records-own-commit.test.ts +407 -0
- package/src/modules/workflow/review-workflow/review-workflow.service.ts +191 -12
- package/src/modules/workflow/sanitize-error.ts +50 -0
- package/src/modules/workflow/workflow.routes.ts +7 -2
- package/src/modules/workflow/workflow.service.ts +886 -112
- package/src/modules/workspace/__tests__/agent-downloads.test.ts +823 -0
- package/src/modules/workspace/__tests__/escape-sequences.routes.test.ts +4 -3
- package/src/modules/workspace/__tests__/first-run.test.ts +234 -0
- package/src/modules/workspace/__tests__/git-internals.security.test.ts +5 -2
- package/src/modules/workspace/__tests__/md-links.test.ts +353 -0
- package/src/modules/workspace/__tests__/move-links.test.ts +261 -0
- package/src/modules/workspace/__tests__/rest-tool-arguments.test.ts +219 -0
- package/src/modules/workspace/__tests__/workspace-paths-inside-the-repo.test.ts +3 -0
- package/src/modules/workspace/__tests__/workspace.routes.delete.test.ts +102 -0
- package/src/modules/workspace/__tests__/workspace.routes.download.test.ts +52 -5
- package/src/modules/workspace/__tests__/workspace.routes.folder-zip-access.test.ts +190 -0
- package/src/modules/workspace/__tests__/workspace.routes.move-platform-files.test.ts +21 -10
- package/src/modules/workspace/__tests__/workspace.service.forget-clone-races.test.ts +8 -4
- package/src/modules/workspace/__tests__/workspace.service.test.ts +50 -8
- package/src/modules/workspace/__tests__/workspace.tools.agents-file.test.ts +33 -55
- package/src/modules/workspace/__tests__/workspace.tools.branch-errors.test.ts +44 -1
- package/src/modules/workspace/__tests__/workspace.tools.test.ts +664 -34
- package/src/modules/workspace/agent-download.builder.ts +308 -0
- package/src/modules/workspace/agent-download.routes.ts +183 -0
- package/src/modules/workspace/agent-download.store.ts +533 -0
- package/src/modules/workspace/agent-upload.store.ts +23 -7
- package/src/modules/workspace/file-readers/raw-mime.ts +40 -0
- package/src/modules/workspace/file-readers/text-reader.ts +5 -8
- package/src/modules/workspace/first-run.ts +222 -0
- package/src/modules/workspace/move-links.ts +237 -0
- package/src/modules/workspace/startup/steps/__tests__/steps.test.ts +191 -489
- package/src/modules/workspace/startup/steps/seed-tree.ts +23 -38
- package/src/modules/workspace/startup/steps/template-files.step.ts +217 -249
- package/src/modules/workspace/startup/steps/template-source.ts +5 -3
- package/src/modules/workspace/workspace.routes.ts +64 -22
- package/src/modules/workspace/workspace.service.ts +202 -25
- package/src/modules/workspace/workspace.tools.ts +707 -68
- package/src/modules/write-access/__tests__/write-access.test.ts +13 -0
- package/src/modules/write-access/write-access.ts +9 -0
- package/src/shared/domain-errors.ts +123 -11
- package/src/shared/git.contract.ts +8 -1
- package/src/shared/hidden-tools.ts +45 -0
- package/src/shared/utf8-text.ts +21 -0
- package/src/tenancy/__tests__/static-tenant-source.test.ts +1 -0
- package/src/tenancy/static-tenant-source.ts +10 -2
- package/starter-packs/README.md +103 -0
- package/starter-packs/engineering/KnowledgeBase/About us.md +9 -0
- package/starter-packs/engineering/KnowledgeBase/Architecture.md +9 -0
- package/starter-packs/engineering/KnowledgeBase/Glossary.md +9 -0
- package/starter-packs/engineering/KnowledgeBase/How we ship.md +9 -0
- package/starter-packs/engineering/Plugins/engineering-starter/LICENSE +21 -0
- package/starter-packs/engineering/Plugins/engineering-starter/SOURCE.md +20 -0
- package/starter-packs/engineering/Plugins/engineering-starter/access.md +19 -0
- package/starter-packs/engineering/Plugins/engineering-starter/plugin.json +10 -0
- package/starter-packs/engineering/Plugins/engineering-starter/skills/office-hours/SKILL.md +171 -0
- package/starter-packs/engineering/Plugins/engineering-starter/skills/office-hours/sections/phase-2a-startup-diagnostic.md +157 -0
- package/starter-packs/engineering/Plugins/engineering-starter/skills/office-hours/sections/phase-2b-builder-brainstorm.md +39 -0
- package/starter-packs/engineering/Plugins/engineering-starter/skills/plan-ceo-review/SKILL.md +144 -0
- package/starter-packs/engineering/Plugins/engineering-starter/skills/plan-eng-review/SKILL.md +144 -0
- package/starter-packs/engineering/Plugins/engineering-starter/skills/review/SKILL.md +80 -0
- package/starter-packs/engineering/Plugins/engineering-starter/skills/review/checklist.md +184 -0
- package/starter-packs/engineering/pack.yaml +11 -0
- package/starter-packs/general/KnowledgeBase/About us.md +9 -0
- package/starter-packs/general/KnowledgeBase/Glossary.md +9 -0
- package/starter-packs/general/KnowledgeBase/How we work.md +9 -0
- package/starter-packs/general/Plugins/general-starter/LICENSE +202 -0
- package/starter-packs/general/Plugins/general-starter/SOURCE.md +10 -0
- package/starter-packs/general/Plugins/general-starter/access.md +19 -0
- package/starter-packs/general/Plugins/general-starter/plugin.json +10 -0
- package/starter-packs/general/Plugins/general-starter/skills/memory-management/SKILL.md +332 -0
- package/starter-packs/general/Plugins/general-starter/skills/productivity-start/SKILL.md +163 -0
- package/starter-packs/general/Plugins/general-starter/skills/productivity-update/SKILL.md +167 -0
- package/starter-packs/general/Plugins/general-starter/skills/task-management/SKILL.md +83 -0
- package/starter-packs/general/pack.yaml +10 -0
- package/starter-packs/operations/KnowledgeBase/Glossary.md +9 -0
- package/starter-packs/operations/KnowledgeBase/How we work.md +9 -0
- package/starter-packs/operations/KnowledgeBase/Processes.md +9 -0
- package/starter-packs/operations/KnowledgeBase/Tools we use.md +9 -0
- package/starter-packs/operations/KnowledgeBase/Vendors.md +9 -0
- package/starter-packs/operations/Plugins/operations-starter/LICENSE +202 -0
- package/starter-packs/operations/Plugins/operations-starter/SOURCE.md +10 -0
- package/starter-packs/operations/Plugins/operations-starter/access.md +19 -0
- package/starter-packs/operations/Plugins/operations-starter/plugin.json +10 -0
- package/starter-packs/operations/Plugins/operations-starter/skills/capacity-plan/SKILL.md +111 -0
- package/starter-packs/operations/Plugins/operations-starter/skills/change-request/SKILL.md +119 -0
- package/starter-packs/operations/Plugins/operations-starter/skills/compliance-tracking/SKILL.md +44 -0
- package/starter-packs/operations/Plugins/operations-starter/skills/process-doc/SKILL.md +80 -0
- package/starter-packs/operations/Plugins/operations-starter/skills/process-optimization/SKILL.md +39 -0
- package/starter-packs/operations/Plugins/operations-starter/skills/risk-assessment/SKILL.md +40 -0
- package/starter-packs/operations/Plugins/operations-starter/skills/runbook/SKILL.md +85 -0
- package/starter-packs/operations/Plugins/operations-starter/skills/status-report/SKILL.md +75 -0
- package/starter-packs/operations/Plugins/operations-starter/skills/vendor-review/SKILL.md +102 -0
- package/starter-packs/operations/pack.yaml +12 -0
- package/starter-packs/sales/KnowledgeBase/About us.md +9 -0
- package/starter-packs/sales/KnowledgeBase/Customers.md +9 -0
- package/starter-packs/sales/KnowledgeBase/Glossary.md +9 -0
- package/starter-packs/sales/KnowledgeBase/How we sell.md +9 -0
- package/starter-packs/sales/KnowledgeBase/Objections.md +9 -0
- package/starter-packs/sales/KnowledgeBase/Pricing.md +9 -0
- package/starter-packs/sales/Plugins/sales-starter/LICENSE +202 -0
- package/starter-packs/sales/Plugins/sales-starter/SOURCE.md +10 -0
- package/starter-packs/sales/Plugins/sales-starter/access.md +19 -0
- package/starter-packs/sales/Plugins/sales-starter/plugin.json +10 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/account-context/SKILL.md +94 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/account-plan/SKILL.md +95 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/account-research/SKILL.md +99 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/account-tiering/SKILL.md +101 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/call-prep/SKILL.md +111 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/call-summary/SKILL.md +111 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/close-plan/SKILL.md +106 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/competitive-intelligence/SKILL.md +102 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/create-an-asset/SKILL.md +105 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/crm-hygiene-check/SKILL.md +103 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/customer-health/SKILL.md +108 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/customer-voice/SKILL.md +94 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/daily-briefing/SKILL.md +61 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/deal-advance-gap/SKILL.md +102 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/deal-review/SKILL.md +105 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/deal-signals/SKILL.md +96 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/deal-slip-scenario/SKILL.md +104 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/draft-outreach/SKILL.md +116 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/end-of-day/SKILL.md +114 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/expansion-whitespace/SKILL.md +97 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/forecast/SKILL.md +100 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/handle-objection/SKILL.md +93 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/inbox-sweep/SKILL.md +114 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/lead-triage/SKILL.md +106 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/log-activity/SKILL.md +111 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/pipeline-review/SKILL.md +97 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/renewal-radar/SKILL.md +95 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/rep-context/SKILL.md +90 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/route-lead/SKILL.md +111 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/sales-setup/SKILL.md +200 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/schedule-meeting/SKILL.md +99 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/stakeholder-map/SKILL.md +107 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/team-pipeline/SKILL.md +105 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/update-opportunity/SKILL.md +112 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/weekly-wrap/SKILL.md +90 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/win-loss-review/SKILL.md +88 -0
- package/starter-packs/sales/pack.yaml +13 -0
- package/starter-packs/support/KnowledgeBase/Escalations.md +9 -0
- package/starter-packs/support/KnowledgeBase/Glossary.md +9 -0
- package/starter-packs/support/KnowledgeBase/Known issues.md +9 -0
- package/starter-packs/support/KnowledgeBase/Products.md +9 -0
- package/starter-packs/support/KnowledgeBase/Tone of voice.md +9 -0
- package/starter-packs/support/Plugins/support-starter/LICENSE +202 -0
- package/starter-packs/support/Plugins/support-starter/SOURCE.md +10 -0
- package/starter-packs/support/Plugins/support-starter/access.md +19 -0
- package/starter-packs/support/Plugins/support-starter/plugin.json +10 -0
- package/starter-packs/support/Plugins/support-starter/skills/customer-escalation/SKILL.md +246 -0
- package/starter-packs/support/Plugins/support-starter/skills/customer-research/SKILL.md +250 -0
- package/starter-packs/support/Plugins/support-starter/skills/draft-response/SKILL.md +416 -0
- package/starter-packs/support/Plugins/support-starter/skills/kb-article/SKILL.md +350 -0
- package/starter-packs/support/Plugins/support-starter/skills/ticket-triage/SKILL.md +273 -0
- package/starter-packs/support/pack.yaml +12 -0
- package/kb-template/AGENTS.md +0 -730
|
@@ -0,0 +1,499 @@
|
|
|
1
|
+
import type { Server as HttpServer } from 'node:http';
|
|
2
|
+
import type { AddressInfo } from 'node:net';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import express, { type RequestHandler } from 'express';
|
|
6
|
+
import { afterEach, describe, expect, it } from 'vitest';
|
|
7
|
+
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
|
|
8
|
+
import { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
|
|
9
|
+
import { createMcpRoutes } from '../mcp.routes.js';
|
|
10
|
+
import { McpService } from '../mcp.service.js';
|
|
11
|
+
import { SpillStore } from '../../workspace/spill-store.js';
|
|
12
|
+
import { createManualRoutes } from '../../tool-registry/manual.routes.js';
|
|
13
|
+
import { ToolRegistry } from '../../tool-registry/tool-registry.js';
|
|
14
|
+
import { toolDef, withBranchInput } from '../../tool-helpers/tool-def.js';
|
|
15
|
+
import { createToolHandlerFactory } from '../../tool-helpers/tool-handler.js';
|
|
16
|
+
import type { ToolContext } from '../../tool-helpers/tool.contract.js';
|
|
17
|
+
import type { ToolAuth } from '../../tool-auth/tool-auth.middleware.js';
|
|
18
|
+
import { assertBranchProvided, BRANCH_REQUIRED_MESSAGE } from '../../../shared/domain-errors.js';
|
|
19
|
+
import { PLATFORM_HEADER } from '../../agent-instructions/index.js';
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Every Scenario of "Tool calls checked against the interface", over the real
|
|
23
|
+
* MCP transport: the call example at the top of every description, the refusal
|
|
24
|
+
* a call that does not match its tool gets on the direct path AND inside
|
|
25
|
+
* `call_tool_chain`, and a matching call reaching its endpoint untouched.
|
|
26
|
+
*
|
|
27
|
+
* Two kinds of tool are in the catalog, because the whole point is that they
|
|
28
|
+
* are called differently, and because the check for each lives somewhere else:
|
|
29
|
+
* - `ask` and `read_file`, platform tools — `toolDef` wraps their arguments in
|
|
30
|
+
* `body`, they are hosted as ROUTES here, and their own route handler
|
|
31
|
+
* (the real `toolHandler`) checks every call, wherever it came from;
|
|
32
|
+
* - `search`, a tool a deployment adds through a manual of its own, with FLAT
|
|
33
|
+
* arguments as every tool that calls another service has, and NO route
|
|
34
|
+
* here — so the tool client checks it before the call leaves.
|
|
35
|
+
*
|
|
36
|
+
* Which is why every refusal below is also asked of `POST /api/agent/tools/<name>`
|
|
37
|
+
* directly: a script with a connection key must get the same answer an agent does.
|
|
38
|
+
*/
|
|
39
|
+
|
|
40
|
+
const KEY = 'bevel_key_user_a';
|
|
41
|
+
const bearerOf = (req: express.Request) => (req.headers.authorization ?? '').replace(/^Bearer\s+/i, '');
|
|
42
|
+
|
|
43
|
+
const fakeAuth: RequestHandler = (req, res, next) => {
|
|
44
|
+
if (bearerOf(req) !== KEY) {
|
|
45
|
+
res.status(401).json({ error: 'unauthorized' });
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
req.userId = 'user-A';
|
|
49
|
+
req.externalApiKeyId = 'tok-A';
|
|
50
|
+
next();
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const passthrough: RequestHandler = (_req, _res, next) => next();
|
|
54
|
+
|
|
55
|
+
interface Platform {
|
|
56
|
+
baseUrl: string;
|
|
57
|
+
/** Every call the deployment's own `search` endpoint received, verbatim. */
|
|
58
|
+
searchCalls: Array<{ body: unknown; query: unknown }>;
|
|
59
|
+
/** Every call that reached the `ask` HANDLER — empty when a refusal ran nothing. */
|
|
60
|
+
askCalls: Array<Record<string, unknown>>;
|
|
61
|
+
stop(): Promise<void>;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const platforms: Platform[] = [];
|
|
65
|
+
const cleanups: Array<() => Promise<void>> = [];
|
|
66
|
+
|
|
67
|
+
async function startPlatform(): Promise<Platform> {
|
|
68
|
+
const searchCalls: Platform['searchCalls'] = [];
|
|
69
|
+
const askCalls: Platform['askCalls'] = [];
|
|
70
|
+
const registry = new ToolRegistry();
|
|
71
|
+
registry.registerExternalTool(
|
|
72
|
+
toolDef({
|
|
73
|
+
name: 'ask',
|
|
74
|
+
description: 'Ask a question.',
|
|
75
|
+
path: '/api/agent/tools/ask',
|
|
76
|
+
inputs: {
|
|
77
|
+
type: 'object',
|
|
78
|
+
properties: {
|
|
79
|
+
prompt: { type: 'string', description: 'What to ask.' },
|
|
80
|
+
sessionId: { type: 'string', description: 'A session to continue.' },
|
|
81
|
+
},
|
|
82
|
+
required: ['prompt'],
|
|
83
|
+
additionalProperties: false,
|
|
84
|
+
},
|
|
85
|
+
}),
|
|
86
|
+
);
|
|
87
|
+
|
|
88
|
+
// A knowledge-base tool, with the required `branch` every one of them takes:
|
|
89
|
+
// its own refusal for a missing branch must survive the argument check.
|
|
90
|
+
registry.registerExternalTool(
|
|
91
|
+
toolDef({
|
|
92
|
+
name: 'read_file',
|
|
93
|
+
description: 'Read a workspace file as text.',
|
|
94
|
+
path: '/api/agent/tools/read_file',
|
|
95
|
+
inputs: withBranchInput({
|
|
96
|
+
type: 'object',
|
|
97
|
+
properties: { path: { type: 'string', description: 'Path to read.' } },
|
|
98
|
+
required: ['path'],
|
|
99
|
+
additionalProperties: false,
|
|
100
|
+
}),
|
|
101
|
+
}),
|
|
102
|
+
);
|
|
103
|
+
|
|
104
|
+
const app = express();
|
|
105
|
+
app.use(express.json());
|
|
106
|
+
// The two platform tools are hosted through the REAL `toolHandler`, because
|
|
107
|
+
// the route's handler is where the check lives: a test that mounted a bare
|
|
108
|
+
// Express handler would prove nothing about the answer an agent gets.
|
|
109
|
+
const toolHandler = createToolHandlerFactory(
|
|
110
|
+
async (auth: ToolAuth, abortSignal: AbortSignal): Promise<ToolContext> =>
|
|
111
|
+
({
|
|
112
|
+
user: { id: 'user-A', email: 'a@x.io', name: 'A' },
|
|
113
|
+
scope: auth.scope,
|
|
114
|
+
source: auth.source,
|
|
115
|
+
abortSignal,
|
|
116
|
+
}) as unknown as ToolContext,
|
|
117
|
+
);
|
|
118
|
+
const asTool: RequestHandler = (req, _res, next) => {
|
|
119
|
+
req.toolAuth = { source: 'external', userId: 'user-A', scope: 'write' };
|
|
120
|
+
next();
|
|
121
|
+
};
|
|
122
|
+
app.post(
|
|
123
|
+
'/api/agent/tools/ask',
|
|
124
|
+
asTool,
|
|
125
|
+
toolHandler(async (args) => {
|
|
126
|
+
askCalls.push(args);
|
|
127
|
+
return { text: `echo: ${args.prompt as string}` };
|
|
128
|
+
}),
|
|
129
|
+
);
|
|
130
|
+
// The real boundary guard too, so the refusal for a missing branch under test
|
|
131
|
+
// is the platform's own and keeps its own wording.
|
|
132
|
+
app.post(
|
|
133
|
+
'/api/agent/tools/read_file',
|
|
134
|
+
asTool,
|
|
135
|
+
toolHandler(async (args) => {
|
|
136
|
+
assertBranchProvided(args.branch);
|
|
137
|
+
return { path: args.path, content: 'contents' };
|
|
138
|
+
}),
|
|
139
|
+
);
|
|
140
|
+
// The deployment's own tool: flat arguments, like every connector tool.
|
|
141
|
+
app.get('/api/third-party/manual', (_req, res) =>
|
|
142
|
+
res.json({
|
|
143
|
+
utcp_version: '1.1.0',
|
|
144
|
+
manual_version: '1.0.0',
|
|
145
|
+
tools: [
|
|
146
|
+
{
|
|
147
|
+
name: 'search',
|
|
148
|
+
description: 'Search the other service.',
|
|
149
|
+
inputs: {
|
|
150
|
+
type: 'object',
|
|
151
|
+
properties: {
|
|
152
|
+
query: { type: 'string', description: 'The search text.' },
|
|
153
|
+
limit: { type: 'integer', description: 'How many results.' },
|
|
154
|
+
},
|
|
155
|
+
required: ['query'],
|
|
156
|
+
additionalProperties: false,
|
|
157
|
+
},
|
|
158
|
+
outputs: { type: 'object', properties: {} },
|
|
159
|
+
tags: [],
|
|
160
|
+
// No `body_field` named, so the default (`body`) matches no
|
|
161
|
+
// argument this tool declares and every argument rides the query
|
|
162
|
+
// string — the shape a connector tool really has.
|
|
163
|
+
tool_call_template: {
|
|
164
|
+
call_template_type: 'http',
|
|
165
|
+
http_method: 'POST',
|
|
166
|
+
url: `\${API_URL}/api/third-party/search`,
|
|
167
|
+
content_type: 'application/json',
|
|
168
|
+
},
|
|
169
|
+
},
|
|
170
|
+
],
|
|
171
|
+
}),
|
|
172
|
+
);
|
|
173
|
+
app.post('/api/third-party/search', (req, res) => {
|
|
174
|
+
searchCalls.push({ body: req.body, query: req.query });
|
|
175
|
+
res.json({ hits: [] });
|
|
176
|
+
});
|
|
177
|
+
app.get('/api/agent/all-tools', (_req, res) => {
|
|
178
|
+
res.json({
|
|
179
|
+
manuals: [
|
|
180
|
+
{
|
|
181
|
+
name: 'KNOWLEDGE_BASE',
|
|
182
|
+
call_template_type: 'http',
|
|
183
|
+
http_method: 'GET',
|
|
184
|
+
url: '${API_URL}/api/agent/utcp',
|
|
185
|
+
content_type: 'application/json',
|
|
186
|
+
headers: { Authorization: 'Bearer ${CONNECTION_KEY}' },
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
name: 'THIRD_PARTY',
|
|
190
|
+
call_template_type: 'http',
|
|
191
|
+
http_method: 'GET',
|
|
192
|
+
url: '${API_URL}/api/third-party/manual',
|
|
193
|
+
content_type: 'application/json',
|
|
194
|
+
},
|
|
195
|
+
],
|
|
196
|
+
});
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
const httpServer = await new Promise<HttpServer>((resolve) => {
|
|
200
|
+
const s = app.listen(0, '127.0.0.1', () => resolve(s));
|
|
201
|
+
});
|
|
202
|
+
const { port } = httpServer.address() as AddressInfo;
|
|
203
|
+
const baseUrl = `http://127.0.0.1:${port}`;
|
|
204
|
+
|
|
205
|
+
const service = new McpService({
|
|
206
|
+
loopbackBaseUrl: baseUrl,
|
|
207
|
+
manualName: 'KNOWLEDGE_BASE',
|
|
208
|
+
spillStore: new SpillStore(join(tmpdir(), 'bevel-test-spills')),
|
|
209
|
+
publicFrontendUrl: 'http://localhost:5173',
|
|
210
|
+
});
|
|
211
|
+
const stub = {} as never;
|
|
212
|
+
app.use('/api', createMcpRoutes(service, stub, fakeAuth, fakeAuth, stub, stub, stub, ''));
|
|
213
|
+
app.use('/api', createManualRoutes(registry, passthrough));
|
|
214
|
+
|
|
215
|
+
let stopped = false;
|
|
216
|
+
const platform: Platform = {
|
|
217
|
+
baseUrl,
|
|
218
|
+
searchCalls,
|
|
219
|
+
askCalls,
|
|
220
|
+
async stop() {
|
|
221
|
+
if (stopped) return;
|
|
222
|
+
stopped = true;
|
|
223
|
+
service.onSecretsChanged(null);
|
|
224
|
+
httpServer.closeAllConnections();
|
|
225
|
+
await new Promise<void>((r) => httpServer.close(() => r()));
|
|
226
|
+
},
|
|
227
|
+
};
|
|
228
|
+
platforms.push(platform);
|
|
229
|
+
return platform;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
async function connect(baseUrl: string): Promise<Client> {
|
|
233
|
+
const transport = new StreamableHTTPClientTransport(new URL(`${baseUrl}/api/mcp`), {
|
|
234
|
+
requestInit: { headers: { Authorization: `Bearer ${KEY}` } },
|
|
235
|
+
});
|
|
236
|
+
const client = new Client({ name: 'interface-e2e', version: '0.0.0' }, { capabilities: {} });
|
|
237
|
+
await client.connect(transport);
|
|
238
|
+
cleanups.push(async () => {
|
|
239
|
+
await client.close();
|
|
240
|
+
});
|
|
241
|
+
return client;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
const toolText = (res: { content?: unknown }) => (res.content as Array<{ text: string }>)[0].text;
|
|
245
|
+
/** The REST route a script or a runner calls, with a connection key. */
|
|
246
|
+
const callRoute = (baseUrl: string, tool: string, body: unknown) =>
|
|
247
|
+
fetch(`${baseUrl}/api/agent/tools/${tool}`, {
|
|
248
|
+
method: 'POST',
|
|
249
|
+
headers: { 'content-type': 'application/json', authorization: `Bearer ${KEY}` },
|
|
250
|
+
body: JSON.stringify(body),
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
|
|
254
|
+
afterEach(async () => {
|
|
255
|
+
for (const c of cleanups.splice(0)) await c().catch(() => {});
|
|
256
|
+
for (const p of platforms.splice(0)) await p.stop().catch(() => {});
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
describe('every description opens with its call', () => {
|
|
260
|
+
it('shows a platform tool with its arguments under `body`, and a flat tool at the top level', async () => {
|
|
261
|
+
const { baseUrl } = await startPlatform();
|
|
262
|
+
const client = await connect(baseUrl);
|
|
263
|
+
const { tools } = await client.listTools();
|
|
264
|
+
const byName = Object.fromEntries(tools.map((t) => [t.name, t]));
|
|
265
|
+
|
|
266
|
+
expect(byName.ask.description?.split('\n')[0]).toBe('Call: KNOWLEDGE_BASE.ask({ body: { prompt: "..." } })');
|
|
267
|
+
expect(byName.THIRD_PARTY_search.description?.split('\n')[0]).toBe('Call: THIRD_PARTY.search({ query: "..." })');
|
|
268
|
+
// Every tool, the meta-tools included — an agent learns one rule, not a
|
|
269
|
+
// rule with exceptions.
|
|
270
|
+
for (const tool of tools) {
|
|
271
|
+
expect(tool.description?.startsWith('Call: '), tool.name).toBe(true);
|
|
272
|
+
expect(tool.description?.split('\n')[0].length, tool.name).toBeLessThan(200);
|
|
273
|
+
}
|
|
274
|
+
});
|
|
275
|
+
|
|
276
|
+
it('keeps the call line first even for a tool that also carries the purpose prefix', async () => {
|
|
277
|
+
const { baseUrl } = await startPlatform();
|
|
278
|
+
const client = await connect(baseUrl);
|
|
279
|
+
const { tools } = await client.listTools();
|
|
280
|
+
// This `McpService` is built without a `toolPrefix`, so no tool here —
|
|
281
|
+
// `read_file`, one of the prefixed four, included — carries the purpose
|
|
282
|
+
// prefix; that is exercised in the composer's own tests and in
|
|
283
|
+
// mcp.service.test.ts. What this pins is that nothing in the listing path
|
|
284
|
+
// (the guide-first opening included) puts text ahead of the line.
|
|
285
|
+
for (const tool of tools) expect(tool.description?.indexOf('Call: '), tool.name).toBe(0);
|
|
286
|
+
});
|
|
287
|
+
|
|
288
|
+
it('tells the agent to follow each tool\'s call line, and states no single shape', async () => {
|
|
289
|
+
const { baseUrl } = await startPlatform();
|
|
290
|
+
const client = await connect(baseUrl);
|
|
291
|
+
const chain = (await client.listTools()).tools.find((t) => t.name === 'call_tool_chain')!;
|
|
292
|
+
expect(chain.description).toContain('`Call:` line');
|
|
293
|
+
expect(chain.description).toContain('NO single calling shape');
|
|
294
|
+
// No phrasing of the one-shape rule, however it is spelled or interpolated.
|
|
295
|
+
expect(chain.description).not.toContain('<tool>({ body: { ...args } })');
|
|
296
|
+
// And the server instructions, which the handshake carries.
|
|
297
|
+
expect(PLATFORM_HEADER).toContain('`Call:` line');
|
|
298
|
+
expect(client.getInstructions()).toContain('`Call:` line');
|
|
299
|
+
});
|
|
300
|
+
});
|
|
301
|
+
|
|
302
|
+
describe('a call whose arguments do not match the tool', () => {
|
|
303
|
+
it('is refused with the interface and the example, and nothing is sent', async () => {
|
|
304
|
+
const platform = await startPlatform();
|
|
305
|
+
const client = await connect(platform.baseUrl);
|
|
306
|
+
const res = await client.callTool({ name: 'THIRD_PARTY_search', arguments: { body: { query: 'x' } } });
|
|
307
|
+
expect(res.isError).toBe(true);
|
|
308
|
+
const text = toolText(res);
|
|
309
|
+
expect(text).toContain('The arguments do not match the "search" tool.');
|
|
310
|
+
expect(text).toContain('This tool takes its arguments at the top level, not under "body".');
|
|
311
|
+
expect(text).toContain('"query" is required, and was not given.');
|
|
312
|
+
expect(text).toContain('query (string, required) — The search text.');
|
|
313
|
+
expect(text).toContain('limit (integer, optional)');
|
|
314
|
+
expect(text).toContain('Call: THIRD_PARTY.search({ query: "..." })');
|
|
315
|
+
expect(text).toContain('"kind":"arguments-do-not-match"');
|
|
316
|
+
// The other service was never reached.
|
|
317
|
+
expect(platform.searchCalls).toEqual([]);
|
|
318
|
+
});
|
|
319
|
+
|
|
320
|
+
it('names a required argument that is missing, and gives that tool\'s interface', async () => {
|
|
321
|
+
const platform = await startPlatform();
|
|
322
|
+
const client = await connect(platform.baseUrl);
|
|
323
|
+
const res = await client.callTool({ name: 'ask', arguments: { body: { sessionId: 's' } } });
|
|
324
|
+
expect(res.isError).toBe(true);
|
|
325
|
+
const text = toolText(res);
|
|
326
|
+
expect(text).toContain('The arguments do not match the "ask" tool.');
|
|
327
|
+
// Named as the tool takes it: the handler receives `prompt`, and so does a
|
|
328
|
+
// script on the REST route. The envelope shows up where it belongs — in the
|
|
329
|
+
// call example, which is the line an agent types.
|
|
330
|
+
expect(text).toContain('"prompt" is required, and was not given.');
|
|
331
|
+
expect(text).toContain('prompt (string, required) — What to ask.');
|
|
332
|
+
expect(text).toContain('Call: KNOWLEDGE_BASE.ask({ body: { prompt: "..." } })');
|
|
333
|
+
expect(text).toContain('"kind":"arguments-do-not-match"');
|
|
334
|
+
// Nothing ran: the handler was never reached.
|
|
335
|
+
expect(platform.askCalls).toEqual([]);
|
|
336
|
+
});
|
|
337
|
+
|
|
338
|
+
it('names an argument of the wrong type', async () => {
|
|
339
|
+
const { baseUrl } = await startPlatform();
|
|
340
|
+
const client = await connect(baseUrl);
|
|
341
|
+
const res = await client.callTool({ name: 'THIRD_PARTY_search', arguments: { query: 'x', limit: 'ten' } });
|
|
342
|
+
expect(res.isError).toBe(true);
|
|
343
|
+
expect(toolText(res)).toContain('"limit" must be integer, but string was given.');
|
|
344
|
+
});
|
|
345
|
+
|
|
346
|
+
it('names an argument the tool does not have', async () => {
|
|
347
|
+
const { baseUrl } = await startPlatform();
|
|
348
|
+
const client = await connect(baseUrl);
|
|
349
|
+
const res = await client.callTool({ name: 'THIRD_PARTY_search', arguments: { query: 'x', nope: 1 } });
|
|
350
|
+
expect(res.isError).toBe(true);
|
|
351
|
+
expect(toolText(res)).toContain('"nope" is not an argument of this tool.');
|
|
352
|
+
});
|
|
353
|
+
|
|
354
|
+
it('leaves a missing branch to the refusal that names it, word for word', async () => {
|
|
355
|
+
const platform = await startPlatform();
|
|
356
|
+
const client = await connect(platform.baseUrl);
|
|
357
|
+
const res = await client.callTool({ name: 'read_file', arguments: { body: { path: 'a.md' } } });
|
|
358
|
+
expect(res.isError).toBe(true);
|
|
359
|
+
const text = toolText(res);
|
|
360
|
+
expect(text).toContain(BRANCH_REQUIRED_MESSAGE);
|
|
361
|
+
expect(text).toContain('"kind":"branch-required"');
|
|
362
|
+
expect(text).not.toContain('arguments do not match');
|
|
363
|
+
});
|
|
364
|
+
|
|
365
|
+
it('fails the chain at a route-hosted tool too, with the route\'s own message', async () => {
|
|
366
|
+
const platform = await startPlatform();
|
|
367
|
+
const client = await connect(platform.baseUrl);
|
|
368
|
+
const res = await client.callTool({
|
|
369
|
+
name: 'call_tool_chain',
|
|
370
|
+
arguments: { code: 'return KNOWLEDGE_BASE.ask({ body: { sessionId: \'s\' } });' },
|
|
371
|
+
});
|
|
372
|
+
const text = toolText(res);
|
|
373
|
+
expect(text).toContain('The arguments do not match the \\"ask\\" tool.');
|
|
374
|
+
expect(text).toContain('\\"prompt\\" is required, and was not given.');
|
|
375
|
+
expect(text).toContain('Call: KNOWLEDGE_BASE.ask({ body: { prompt: \\"...\\" } })');
|
|
376
|
+
expect(platform.askCalls).toEqual([]);
|
|
377
|
+
});
|
|
378
|
+
|
|
379
|
+
it('fails the chain at that call, with the same message', async () => {
|
|
380
|
+
const platform = await startPlatform();
|
|
381
|
+
const client = await connect(platform.baseUrl);
|
|
382
|
+
const res = await client.callTool({
|
|
383
|
+
name: 'call_tool_chain',
|
|
384
|
+
arguments: { code: "return THIRD_PARTY.search({ body: { query: 'x' } });" },
|
|
385
|
+
});
|
|
386
|
+
const text = toolText(res);
|
|
387
|
+
expect(text).toContain('The arguments do not match the \\"search\\" tool.');
|
|
388
|
+
expect(text).toContain('This tool takes its arguments at the top level');
|
|
389
|
+
expect(platform.searchCalls).toEqual([]);
|
|
390
|
+
});
|
|
391
|
+
});
|
|
392
|
+
|
|
393
|
+
describe('the REST route answers every caller the same way', () => {
|
|
394
|
+
it('refuses a missing argument with the 400 and the interface, and runs nothing', async () => {
|
|
395
|
+
const platform = await startPlatform();
|
|
396
|
+
const res = await callRoute(platform.baseUrl, 'ask', { sessionId: 's' });
|
|
397
|
+
expect(res.status).toBe(400);
|
|
398
|
+
const body = (await res.json()) as { error: string; kind: string };
|
|
399
|
+
expect(body.kind).toBe('arguments-do-not-match');
|
|
400
|
+
expect(body.error).toContain('The arguments do not match the "ask" tool.');
|
|
401
|
+
expect(body.error).toContain('"prompt" is required, and was not given.');
|
|
402
|
+
expect(body.error).toContain('prompt (string, required) — What to ask.');
|
|
403
|
+
expect(body.error.split('\n').pop()).toBe('Call: KNOWLEDGE_BASE.ask({ body: { prompt: "..." } })');
|
|
404
|
+
expect(platform.askCalls).toEqual([]);
|
|
405
|
+
});
|
|
406
|
+
|
|
407
|
+
it('gives an MCP caller and a REST caller the SAME answer for the same wrong arguments', async () => {
|
|
408
|
+
const platform = await startPlatform();
|
|
409
|
+
const client = await connect(platform.baseUrl);
|
|
410
|
+
const overMcp = toolText(await client.callTool({ name: 'ask', arguments: { body: { sessionId: 's' } } }));
|
|
411
|
+
const overRest = (await (await callRoute(platform.baseUrl, 'ask', { sessionId: 's' })).json()) as {
|
|
412
|
+
error: string;
|
|
413
|
+
kind: string;
|
|
414
|
+
};
|
|
415
|
+
// The MCP layer shapes nothing: the route's message and the route's
|
|
416
|
+
// machine-readable fields come through as they are, under the one prefix
|
|
417
|
+
// dispatch puts on EVERY tool failure alike (a missing branch included),
|
|
418
|
+
// which says which tool it was.
|
|
419
|
+
expect(overMcp).toBe(`The "ask" tool failed: ${overRest.error} {"kind":"${overRest.kind}"}`);
|
|
420
|
+
expect(overMcp).toContain(overRest.error);
|
|
421
|
+
});
|
|
422
|
+
|
|
423
|
+
it('names an argument the tool does not have, and one of the wrong type', async () => {
|
|
424
|
+
const platform = await startPlatform();
|
|
425
|
+
const unknown = (await (await callRoute(platform.baseUrl, 'ask', { prompt: 'p', nope: 1 })).json()) as {
|
|
426
|
+
error: string;
|
|
427
|
+
};
|
|
428
|
+
expect(unknown.error).toContain('"nope" is not an argument of this tool.');
|
|
429
|
+
const wrongType = (await (await callRoute(platform.baseUrl, 'ask', { prompt: 7 })).json()) as { error: string };
|
|
430
|
+
expect(wrongType.error).toContain('"prompt" must be string, but integer was given.');
|
|
431
|
+
expect(platform.askCalls).toEqual([]);
|
|
432
|
+
});
|
|
433
|
+
|
|
434
|
+
it('keeps the refusal for a missing branch, word for word', async () => {
|
|
435
|
+
const platform = await startPlatform();
|
|
436
|
+
const res = await callRoute(platform.baseUrl, 'read_file', { path: 'a.md' });
|
|
437
|
+
expect(res.status).toBe(400);
|
|
438
|
+
const body = (await res.json()) as { error: string; kind: string };
|
|
439
|
+
expect(body.kind).toBe('branch-required');
|
|
440
|
+
expect(body.error).toBe(BRANCH_REQUIRED_MESSAGE);
|
|
441
|
+
});
|
|
442
|
+
|
|
443
|
+
it('tells an agent that passed the arguments flat that they go under `body`', async () => {
|
|
444
|
+
const platform = await startPlatform();
|
|
445
|
+
// What the http protocol produces for a flat call to a tool whose
|
|
446
|
+
// `body_field` is `body`: an empty body, every argument in the query.
|
|
447
|
+
const res = await fetch(`${platform.baseUrl}/api/agent/tools/ask?prompt=hi`, {
|
|
448
|
+
method: 'POST',
|
|
449
|
+
headers: { 'content-type': 'application/json', authorization: `Bearer ${KEY}` },
|
|
450
|
+
body: JSON.stringify({}),
|
|
451
|
+
});
|
|
452
|
+
expect(res.status).toBe(400);
|
|
453
|
+
const body = (await res.json()) as { error: string; kind: string };
|
|
454
|
+
expect(body.kind).toBe('arguments-do-not-match');
|
|
455
|
+
expect(body.error.split('\n')[1]).toBe('This tool takes its arguments under "body", not at the top level.');
|
|
456
|
+
expect(platform.askCalls).toEqual([]);
|
|
457
|
+
});
|
|
458
|
+
|
|
459
|
+
it('passes a matching call on with exactly the arguments that were sent', async () => {
|
|
460
|
+
const platform = await startPlatform();
|
|
461
|
+
const res = await callRoute(platform.baseUrl, 'ask', { prompt: 'hello', sessionId: 's-1' });
|
|
462
|
+
expect(res.status).toBe(200);
|
|
463
|
+
expect(await res.json()).toEqual({ text: 'echo: hello' });
|
|
464
|
+
expect(platform.askCalls).toEqual([{ prompt: 'hello', sessionId: 's-1' }]);
|
|
465
|
+
});
|
|
466
|
+
});
|
|
467
|
+
|
|
468
|
+
describe('a call that matches', () => {
|
|
469
|
+
it('reaches the tool with exactly the arguments that were sent', async () => {
|
|
470
|
+
const platform = await startPlatform();
|
|
471
|
+
const client = await connect(platform.baseUrl);
|
|
472
|
+
const res = await client.callTool({ name: 'THIRD_PARTY_search', arguments: { query: 'hello', limit: 2 } });
|
|
473
|
+
expect(res.isError).toBeFalsy();
|
|
474
|
+
expect(platform.searchCalls).toHaveLength(1);
|
|
475
|
+
// Both arguments arrive in the place this tool's own template puts them:
|
|
476
|
+
// the query string, since it names no `body_field` — which is why `limit`
|
|
477
|
+
// reads back as the string "2" (query-string coercion by the transport,
|
|
478
|
+
// not by the check). Nothing was added, dropped or renamed on the way.
|
|
479
|
+
expect(platform.searchCalls[0].query).toEqual({ query: 'hello', limit: '2' });
|
|
480
|
+
});
|
|
481
|
+
|
|
482
|
+
it('runs the same call from inside a chain', async () => {
|
|
483
|
+
const platform = await startPlatform();
|
|
484
|
+
const client = await connect(platform.baseUrl);
|
|
485
|
+
const res = await client.callTool({
|
|
486
|
+
name: 'call_tool_chain',
|
|
487
|
+
arguments: { code: "return THIRD_PARTY.search({ query: 'chained' });" },
|
|
488
|
+
});
|
|
489
|
+
expect(JSON.parse(toolText(res)).result).toEqual({ hits: [] });
|
|
490
|
+
expect(platform.searchCalls[0].query).toEqual({ query: 'chained' });
|
|
491
|
+
});
|
|
492
|
+
|
|
493
|
+
it('serves the example in `tools_info` too, so a chain is written from it', async () => {
|
|
494
|
+
const { baseUrl } = await startPlatform();
|
|
495
|
+
const client = await connect(baseUrl);
|
|
496
|
+
const res = await client.callTool({ name: 'tools_info', arguments: { tool_names: ['THIRD_PARTY.search'] } });
|
|
497
|
+
expect(JSON.parse(toolText(res)).interfaces).toContain('Call: THIRD_PARTY.search({ query: "..." })');
|
|
498
|
+
});
|
|
499
|
+
});
|