@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
|
@@ -4,7 +4,9 @@ import {
|
|
|
4
4
|
CALL_TOOL_CHAIN_NAME,
|
|
5
5
|
CHAIN_FAILURES_RULE,
|
|
6
6
|
CHAIN_LARGE_RESULTS_RULE,
|
|
7
|
+
callLine,
|
|
7
8
|
codeModeMetaTools,
|
|
9
|
+
splitCallLine,
|
|
8
10
|
} from '@bevel-software/platform-mcp-core';
|
|
9
11
|
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
10
12
|
import { EXTERNAL_KB_MANUAL_NAME } from '../../tool-manuals/tool-manuals.contract.js';
|
|
@@ -23,13 +25,13 @@ import { UuidSessionSink } from '../../workspace/session-sink.js';
|
|
|
23
25
|
import { RoutineWritePolicyService } from '../../workspace/routine-write-policy.js';
|
|
24
26
|
import { CLIENT_SHORT_CUT, TOOL_DESCRIPTION_CAP, clientVisibleLength, firstSentenceEnd } from '../description-length.js';
|
|
25
27
|
import {
|
|
26
|
-
POINTER_GUIDE_NAME_BUDGET,
|
|
27
|
-
SHARED_RULES_POINTER_MAX,
|
|
28
28
|
TOOL_PREFIX_CAP,
|
|
29
29
|
sharedFileRules,
|
|
30
|
-
sharedRulesPointer,
|
|
31
30
|
} from '../../agent-instructions/index.js';
|
|
32
31
|
import { isPlatformFile, platformFilesByDepth } from '@bevel-software/platform-shared';
|
|
32
|
+
import { GET_AGENT_GUIDE_TOOL, GUIDE_FIRST_SENTENCE, guideFirstDescription } from '../guide-first.js';
|
|
33
|
+
import { registerAgentGuideTool } from '../../agent-guide/agent-guide.tools.js';
|
|
34
|
+
import { agentGuideSections } from '../../agent-guide/agent-guide.js';
|
|
33
35
|
|
|
34
36
|
/**
|
|
35
37
|
* The cap exists because clients cut a long tool description, and they cut it
|
|
@@ -62,16 +64,18 @@ const emptySkills = { listSkills: async () => [] } as unknown as Parameters<type
|
|
|
62
64
|
/**
|
|
63
65
|
* The meta-tools as the hosted endpoint builds them (`mcp.service.ts`):
|
|
64
66
|
* examples written against the namespace it registers the knowledge-base tools
|
|
65
|
-
* under and against the catalog it serves, and the chain
|
|
66
|
-
*
|
|
67
|
-
* really sent, which is its longest form.
|
|
67
|
+
* under and against the catalog it serves, and the chain without the rules it
|
|
68
|
+
* states only in the shared places. So the chain description measured here
|
|
69
|
+
* carries the worked call a client is really sent, which is its longest form.
|
|
68
70
|
*/
|
|
69
|
-
function servedMetaTools(external: readonly UtcpTool[]
|
|
71
|
+
function servedMetaTools(external: readonly UtcpTool[]) {
|
|
70
72
|
return codeModeMetaTools(
|
|
71
73
|
EXTERNAL_KB_MANUAL_NAME,
|
|
72
74
|
external.map((t) => ({ utcpName: `${EXTERNAL_KB_MANUAL_NAME}.${t.name}`, inputSchema: t.inputs })),
|
|
73
|
-
{ sharedRulesPointer:
|
|
74
|
-
|
|
75
|
+
{ sharedRulesPointer: '' },
|
|
76
|
+
// As the hosted endpoint serves them: opening with the guide-first
|
|
77
|
+
// sentence, through the one helper the endpoint itself uses.
|
|
78
|
+
).map((t) => ({ ...t, description: guideFirstDescription(t.description) }));
|
|
75
79
|
}
|
|
76
80
|
|
|
77
81
|
/** Every tool Hexis itself registers, on both surfaces, deduplicated by name. */
|
|
@@ -101,20 +105,27 @@ async function hexisTools(): Promise<UtcpTool[]> {
|
|
|
101
105
|
// every real composition supplies one: without it they would be the two
|
|
102
106
|
// descriptions this suite never measured.
|
|
103
107
|
unused(),
|
|
108
|
+
// The guide reader, not needed to build defs; then the download store,
|
|
109
|
+
// mounted on the same terms as the upload one.
|
|
110
|
+
undefined,
|
|
111
|
+
unused(),
|
|
104
112
|
);
|
|
105
|
-
registerWorkflowTools(registry, router, toolAuth, toolHandler, kb);
|
|
106
|
-
registerPluginsTools(registry);
|
|
113
|
+
registerWorkflowTools(registry, router, toolAuth, toolHandler, kb, async () => true);
|
|
114
|
+
registerPluginsTools(registry, kb);
|
|
107
115
|
registerSkillsTools(registry, router, toolAuth, toolHandler, emptySkills);
|
|
108
116
|
registerToolManualsTools(registry, router, toolAuth, toolHandler, emptyManuals, {
|
|
109
117
|
accessControl: unused(),
|
|
110
118
|
variableStatus: unused(),
|
|
111
119
|
kb,
|
|
112
120
|
});
|
|
121
|
+
// The guide's own tool, with the platform's sections: the one description
|
|
122
|
+
// that lists the sections is measured with the list it really carries.
|
|
123
|
+
registerAgentGuideTool(registry, router, toolAuth, toolHandler, () => agentGuideSections(kb.layout));
|
|
113
124
|
|
|
114
125
|
const byName = new Map<string, UtcpTool>();
|
|
115
|
-
// The meta-tools as a client is served them
|
|
116
|
-
//
|
|
117
|
-
// the catalog that goes out rather than the
|
|
126
|
+
// The meta-tools as a client is served them (`mcp.service.ts` opens each
|
|
127
|
+
// with the guide-first sentence at the mount), so the catalog measured here
|
|
128
|
+
// is the catalog that goes out rather than the bare constant.
|
|
118
129
|
const external = (await registry.listExternal()) as UtcpTool[];
|
|
119
130
|
const metaTools = servedMetaTools(external);
|
|
120
131
|
for (const tool of [...(await registry.listInternal()), ...external, ...metaTools]) {
|
|
@@ -141,9 +152,11 @@ describe('no Hexis tool description is long enough to be cut', () => {
|
|
|
141
152
|
// The cap does not answer the ~500-character cut; the ORDER of the text
|
|
142
153
|
// does, and this is where that claim is checked rather than asserted in a
|
|
143
154
|
// comment. A client that stops at 500 must still have the sentence saying
|
|
144
|
-
// what the tool does — what it loses is the
|
|
145
|
-
//
|
|
146
|
-
//
|
|
155
|
+
// what the tool does — what it loses is the tail. The shared rules are
|
|
156
|
+
// stated in the guide (which the opener sends every client to, including
|
|
157
|
+
// the description-only ones this cut is about) and, for the clients that
|
|
158
|
+
// honour it, in the handshake instructions as well. Lowering
|
|
159
|
+
// the cap to 500 would not buy this; only order does.
|
|
147
160
|
const late = (await hexisTools())
|
|
148
161
|
.map((t) => ({ tool: t.name, endsAt: firstSentenceEnd(t) }))
|
|
149
162
|
.filter((m) => m.endsAt > CLIENT_SHORT_CUT)
|
|
@@ -156,30 +169,28 @@ describe('no Hexis tool description is long enough to be cut', () => {
|
|
|
156
169
|
).toEqual([]);
|
|
157
170
|
});
|
|
158
171
|
|
|
159
|
-
it('
|
|
160
|
-
// The
|
|
161
|
-
//
|
|
162
|
-
// of `AGENTS.md` guarantees nothing about the catalog a renamed deployment
|
|
163
|
-
// serves. Two things make it hold: the pointer is bounded by construction
|
|
164
|
-
// (past `POINTER_GUIDE_NAME_BUDGET` the guide is named by its role), and
|
|
165
|
-
// `clientVisibleLength` charges the worst case rather than this layout's.
|
|
172
|
+
it('opens every tool but the guide\'s own with the guide-first sentence, and fits with it', async () => {
|
|
173
|
+
// The sentence is in the description the registry lists, so the catalog
|
|
174
|
+
// measured here is the catalog a client gets, sentence included.
|
|
166
175
|
const tools = await hexisTools();
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
176
|
+
// ONE predicate for both halves, so no description falls between them: a
|
|
177
|
+
// tool whose own description is empty is served the sentence alone, and
|
|
178
|
+
// one with text after it has whitespace between — not `here.Read`.
|
|
179
|
+
// Behind the `Call:` line, when the description already carries one (the
|
|
180
|
+
// meta-tools are built with theirs): that line comes first on every tool.
|
|
181
|
+
const opensWithGuide = (t: UtcpTool): boolean => {
|
|
182
|
+
const description = splitCallLine(t.description ?? '').rest;
|
|
183
|
+
if (description === GUIDE_FIRST_SENTENCE) return true;
|
|
184
|
+
return description.startsWith(GUIDE_FIRST_SENTENCE) && /^\s/.test(description.slice(GUIDE_FIRST_SENTENCE.length));
|
|
185
|
+
};
|
|
186
|
+
const opened = tools.filter(opensWithGuide);
|
|
187
|
+
expect(opened.length).toBeGreaterThan(0);
|
|
188
|
+
// The guide's own tool is the one exception: it is what the sentence
|
|
189
|
+
// points at, and it is in the catalog measured here so the cap holds on
|
|
190
|
+
// it too (see the first test).
|
|
191
|
+
expect(tools.filter((t) => !opensWithGuide(t)).map((t) => t.name)).toEqual([GET_AGENT_GUIDE_TOOL]);
|
|
192
|
+
for (const tool of opened) {
|
|
193
|
+
expect(clientVisibleLength(tool), tool.name).toBeLessThanOrEqual(TOOL_DESCRIPTION_CAP);
|
|
183
194
|
}
|
|
184
195
|
});
|
|
185
196
|
|
|
@@ -190,23 +201,24 @@ describe('no Hexis tool description is long enough to be cut', () => {
|
|
|
190
201
|
// the catalog the agent reads was over it by 300.
|
|
191
202
|
const read = (await hexisTools()).find((t) => t.name === 'read_file');
|
|
192
203
|
expect(read).toBeDefined();
|
|
193
|
-
// Its own text
|
|
194
|
-
//
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
expect(clientVisibleLength(read!)).toBe(ownAtWorstPointer + TOOL_PREFIX_CAP + 2);
|
|
198
|
-
expect(ownAtWorstPointer + TOOL_PREFIX_CAP + 2).toBeLessThanOrEqual(TOOL_DESCRIPTION_CAP);
|
|
204
|
+
// Its own text (the guide-first sentence included), plus the prefix at
|
|
205
|
+
// ITS cap and the blank line between, must fit — measured as the client
|
|
206
|
+
// sees it.
|
|
207
|
+
expect(clientVisibleLength(read!)).toBeLessThanOrEqual(TOOL_DESCRIPTION_CAP);
|
|
199
208
|
});
|
|
200
209
|
|
|
201
210
|
it('fails, naming the tool, when a paragraph takes a description over the cap', () => {
|
|
202
211
|
const padded = { name: 'write_file', description: 'x'.repeat(TOOL_DESCRIPTION_CAP + 1) } as UtcpTool;
|
|
203
212
|
expect(clientVisibleLength(padded)).toBeGreaterThan(TOOL_DESCRIPTION_CAP);
|
|
204
|
-
// A tool with no description at all is
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
//
|
|
209
|
-
|
|
213
|
+
// A tool with no description at all is handed its `Call:` line alone —
|
|
214
|
+
// the example counts toward the cap like any other text a client gets.
|
|
215
|
+
const nothingCall = callLine(`${EXTERNAL_KB_MANUAL_NAME}.nothing`, undefined);
|
|
216
|
+
expect(clientVisibleLength({ name: 'nothing' } as UtcpTool)).toBe(nothingCall.length);
|
|
217
|
+
// A PREFIXED one is handed the prefix too, behind the line (no
|
|
218
|
+
// description, so no blank line after the prefix), and that text is what
|
|
219
|
+
// the client was handed. Measuring it as nothing would hide what it got.
|
|
220
|
+
const readCall = callLine(`${EXTERNAL_KB_MANUAL_NAME}.read_file`, undefined);
|
|
221
|
+
expect(clientVisibleLength({ name: 'read_file' } as UtcpTool)).toBe(readCall.length + 2 + TOOL_PREFIX_CAP);
|
|
210
222
|
});
|
|
211
223
|
|
|
212
224
|
it('measures the catalog, which is what a client lists — and says what is outside it', async () => {
|
|
@@ -228,7 +240,7 @@ describe('no Hexis tool description is long enough to be cut', () => {
|
|
|
228
240
|
});
|
|
229
241
|
});
|
|
230
242
|
|
|
231
|
-
describe('every file tool
|
|
243
|
+
describe('every file tool opens with the guide-first sentence and carries no shared paragraph', () => {
|
|
232
244
|
/** The tools that used to carry the shared paragraphs — every `mount`ed one. */
|
|
233
245
|
const FILE_TOOLS = [
|
|
234
246
|
'read_file',
|
|
@@ -248,13 +260,12 @@ describe('every file tool ends with the pointer and carries no shared paragraph'
|
|
|
248
260
|
'apply_file_upload',
|
|
249
261
|
];
|
|
250
262
|
|
|
251
|
-
it('
|
|
263
|
+
it('opens each description with the sentence sending the agent to the guide, and ends it as a sentence', async () => {
|
|
252
264
|
const tools = await hexisTools();
|
|
253
|
-
const pointer = sharedRulesPointer(testKbContext().layout);
|
|
254
265
|
for (const name of FILE_TOOLS) {
|
|
255
266
|
const def = tools.find((t) => t.name === name);
|
|
256
267
|
expect(def, name).toBeDefined();
|
|
257
|
-
expect(def!.description!.
|
|
268
|
+
expect(def!.description!.startsWith(`${GUIDE_FIRST_SENTENCE} `), `${name} must open with: ${GUIDE_FIRST_SENTENCE}`).toBe(true);
|
|
258
269
|
// Ends with a full sentence, so nothing reads as cut off mid-thought.
|
|
259
270
|
expect(def!.description!.trimEnd().endsWith('.'), name).toBe(true);
|
|
260
271
|
}
|
|
@@ -283,25 +294,29 @@ describe('every file tool ends with the pointer and carries no shared paragraph'
|
|
|
283
294
|
});
|
|
284
295
|
|
|
285
296
|
describe('the shared rules describe the tools they name', () => {
|
|
286
|
-
it('
|
|
297
|
+
it('opens the chain description with the guide-first sentence too, under the cap', async () => {
|
|
287
298
|
// What a chain does with a failure, a large result or an image is true of
|
|
288
299
|
// every call, so it is stated in the shared rules — and the clients that
|
|
289
300
|
// drop the handshake `instructions` see only descriptions, so the chain
|
|
290
|
-
//
|
|
291
|
-
//
|
|
292
|
-
//
|
|
293
|
-
|
|
301
|
+
// opens with the same sentence every tool of the platform's own opens
|
|
302
|
+
// with, and ends with no second pointer: the one at the front is the way
|
|
303
|
+
// to the rules. Composed at the mount, because `mcp-core` builds the
|
|
304
|
+
// constant without knowing where this deployment states them.
|
|
294
305
|
const served = (await hexisTools()).find((t) => t.name === CALL_TOOL_CHAIN_NAME)!;
|
|
295
|
-
|
|
306
|
+
// Behind its `Call:` line, which is the first line of every description.
|
|
307
|
+
expect(served.description!.startsWith('Call: call_tool_chain(')).toBe(true);
|
|
308
|
+
expect(splitCallLine(served.description!).rest.startsWith(`${GUIDE_FIRST_SENTENCE} `)).toBe(true);
|
|
309
|
+
expect(served.description!.split(GUIDE_FIRST_SENTENCE)).toHaveLength(2);
|
|
310
|
+
expect(served.description!.trimEnd().endsWith('.')).toBe(true);
|
|
296
311
|
expect(clientVisibleLength(served)).toBeLessThanOrEqual(TOOL_DESCRIPTION_CAP);
|
|
297
|
-
// The other two
|
|
312
|
+
// The other two open the same way: the guide comes before the registry too.
|
|
298
313
|
for (const tool of servedMetaTools([]).filter((t) => t.name !== CALL_TOOL_CHAIN_NAME)) {
|
|
299
|
-
expect(tool.description).
|
|
314
|
+
expect(splitCallLine(tool.description!).rest.startsWith(`${GUIDE_FIRST_SENTENCE} `), tool.name).toBe(true);
|
|
300
315
|
}
|
|
301
316
|
});
|
|
302
317
|
|
|
303
318
|
it('states what a chain does in the shared rules, and not a second time on the chain', async () => {
|
|
304
|
-
// The
|
|
319
|
+
// The opener is only honest if the rules it points at are THERE. These
|
|
305
320
|
// two were paragraphs of the chain's description; they moved, whole, and a
|
|
306
321
|
// description that kept them as well would be the long one a client cuts.
|
|
307
322
|
const rule = sharedFileRules(testKbContext().layout).find((r) => r.id === 'tool-chain')!;
|
|
@@ -317,7 +332,7 @@ describe('the shared rules describe the tools they name', () => {
|
|
|
317
332
|
|
|
318
333
|
it('keeps the rules on the chain itself where no shared rules are served', () => {
|
|
319
334
|
// The standalone bridge proxies a deployment whose guide it cannot name, so
|
|
320
|
-
// it passes no pointer — and an agent there must still be told what a chain
|
|
335
|
+
// it passes no pointer at all — and an agent there must still be told what a chain
|
|
321
336
|
// that timed out, or answered too much, or read an image, does.
|
|
322
337
|
const [chain] = codeModeMetaTools('hexis', []).filter((t) => t.name === CALL_TOOL_CHAIN_NAME);
|
|
323
338
|
expect(chain.description).toContain(CHAIN_FAILURES_RULE);
|
|
@@ -5,14 +5,17 @@
|
|
|
5
5
|
* where the text specific to the tool sits, after whatever shared preamble it
|
|
6
6
|
* carried. Agents reported `file_stat`, `read_file`, `write_file` and
|
|
7
7
|
* `write_files` arriving ending in "[truncated]". The rules those descriptions
|
|
8
|
-
* shared now live in one place (see `agent-instructions/shared-file-rules.ts
|
|
9
|
-
*
|
|
10
|
-
*
|
|
8
|
+
* shared now live in one place (see `agent-instructions/shared-file-rules.ts`,
|
|
9
|
+
* served in the guide `get_agent_guide` returns) and each description OPENS
|
|
10
|
+
* with the one sentence sending the agent there (`guide-first.ts`), which is
|
|
11
|
+
* what makes the cap below reachable rather than aspirational.
|
|
11
12
|
*/
|
|
12
13
|
|
|
14
|
+
import { callLine, splitCallLine } from '@bevel-software/platform-mcp-core';
|
|
13
15
|
import { TOOL_PREFIX_CAP } from '@bevel-software/platform-shared';
|
|
14
16
|
import { PREFIXED_TOOLS } from '../agent-instructions/compose.js';
|
|
15
|
-
import {
|
|
17
|
+
import { EXTERNAL_KB_MANUAL_NAME } from '../tool-manuals/tool-manuals.contract.js';
|
|
18
|
+
import { GUIDE_FIRST_SENTENCE } from './guide-first.js';
|
|
16
19
|
import type { UtcpTool } from './tool.contract.js';
|
|
17
20
|
|
|
18
21
|
/**
|
|
@@ -25,8 +28,10 @@ import type { UtcpTool } from './tool.contract.js';
|
|
|
25
28
|
* could answer: no useful description of `move_file` fits in 500. What answers
|
|
26
29
|
* that one is the ORDER of the text, which is why the deployment's purpose line
|
|
27
30
|
* is prepended rather than appended (see `prefixToolDescription`) and why every
|
|
28
|
-
* description now
|
|
29
|
-
*
|
|
31
|
+
* description now opens with the guide-first sentence and then what the tool
|
|
32
|
+
* does, with the tool's own detail last: a cut at 500 keeps the sentence and
|
|
33
|
+
* the tool's first sentence (see `firstSentenceEnd`) and takes the detail,
|
|
34
|
+
* which the guide states in full anyway. The other cut is the
|
|
30
35
|
* four-figure one agents reported on `file_stat`, `read_file`, `write_file` and
|
|
31
36
|
* `write_files`, and 1,200 sits below it with room to spare.
|
|
32
37
|
*
|
|
@@ -58,23 +63,48 @@ export const TOOL_DESCRIPTION_CAP = 1_200;
|
|
|
58
63
|
*/
|
|
59
64
|
export const CLIENT_SHORT_CUT = 500;
|
|
60
65
|
|
|
66
|
+
/** What these measurements read of a tool: its name, its text and the schema its `Call:` line is generated from. */
|
|
67
|
+
export type MeasuredTool = Pick<UtcpTool, 'name' | 'description'> & { inputs?: unknown };
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* The `Call:` line a client is handed ahead of everything else, and the blank
|
|
71
|
+
* line after it — counted, because it is part of what a client cuts. Taken
|
|
72
|
+
* from the description when it already opens with one (a meta-tool is built
|
|
73
|
+
* with its line), generated from the tool's inputs under the namespace the
|
|
74
|
+
* hosted endpoint serves otherwise, as mcp-core's `withCallExample` does at
|
|
75
|
+
* listing time. The rest of the description comes back beside it.
|
|
76
|
+
*/
|
|
77
|
+
function splitServedCallLine(tool: MeasuredTool): { callChars: number; rest: string } {
|
|
78
|
+
const { call, rest } = splitCallLine(tool.description ?? '');
|
|
79
|
+
const line = call ?? callLine(`${EXTERNAL_KB_MANUAL_NAME}.${tool.name}`, tool.inputs);
|
|
80
|
+
// The blank line after it only when something follows it.
|
|
81
|
+
const followed = rest !== '' || PREFIXED_TOOLS.has(tool.name);
|
|
82
|
+
return { callChars: line.length + (followed ? 2 : 0), rest };
|
|
83
|
+
}
|
|
84
|
+
|
|
61
85
|
/**
|
|
62
86
|
* Where the tool's OWN opening sentence ends in the text a client is handed:
|
|
63
|
-
* the purpose prefix counted at its cap, as in {@link clientVisibleLength},
|
|
64
|
-
* the
|
|
65
|
-
*
|
|
87
|
+
* the purpose prefix counted at its cap, as in {@link clientVisibleLength},
|
|
88
|
+
* and the guide-first sentence every listed tool opens with counted as the
|
|
89
|
+
* text it is — a client that cuts at 500 must still reach the sentence saying
|
|
90
|
+
* what the tool does, past that one.
|
|
66
91
|
*
|
|
67
92
|
* A description with no sentence-ending punctuation counts whole — the honest
|
|
68
93
|
* answer for text that never finishes a sentence.
|
|
69
94
|
*/
|
|
70
|
-
export function firstSentenceEnd(tool:
|
|
71
|
-
const
|
|
72
|
-
const
|
|
95
|
+
export function firstSentenceEnd(tool: MeasuredTool): number {
|
|
96
|
+
const { callChars, rest: description } = splitServedCallLine(tool);
|
|
97
|
+
const prefix = callChars + (PREFIXED_TOOLS.has(tool.name) ? TOOL_PREFIX_CAP + 2 : 0);
|
|
73
98
|
if (description === '') return prefix;
|
|
74
|
-
|
|
75
|
-
|
|
99
|
+
// The opener and whatever whitespace follows it: `guideFirstDescription`
|
|
100
|
+
// joins with one space, and leaves a description that already opens with
|
|
101
|
+
// the sentence as it came — a newline after it is still the opener's.
|
|
102
|
+
const opener = description.startsWith(GUIDE_FIRST_SENTENCE)
|
|
103
|
+
? GUIDE_FIRST_SENTENCE.length + (description.slice(GUIDE_FIRST_SENTENCE.length).match(/^\s*/)?.[0].length ?? 0)
|
|
104
|
+
: 0;
|
|
105
|
+
const own = description.slice(opener);
|
|
76
106
|
const firstSentence = own.match(/^[\s\S]*?[.!?](?=\s|$)/)?.[0] ?? own;
|
|
77
|
-
return prefix + firstSentence.length;
|
|
107
|
+
return prefix + opener + firstSentence.length;
|
|
78
108
|
}
|
|
79
109
|
|
|
80
110
|
/**
|
|
@@ -85,27 +115,22 @@ export function firstSentenceEnd(tool: Pick<UtcpTool, 'name' | 'description'>):
|
|
|
85
115
|
* the cap is what an admin may grow their text to without being told, so a
|
|
86
116
|
* description that only fits beside a short prefix does not really fit.
|
|
87
117
|
*
|
|
88
|
-
* The
|
|
89
|
-
*
|
|
90
|
-
* — the guide's file name — so a description measured beside the nine
|
|
91
|
-
* characters of `AGENTS.md` would pass here and arrive cut on a deployment
|
|
92
|
-
* that renamed its guide. Whatever pointer a description actually carries is
|
|
93
|
-
* discounted and charged at {@link SHARED_RULES_POINTER_MAX} instead.
|
|
118
|
+
* The guide-first sentence every listed tool opens with is already in the
|
|
119
|
+
* description the registry lists, so it is measured as the text it is.
|
|
94
120
|
*/
|
|
95
|
-
export function clientVisibleLength(tool:
|
|
96
|
-
const
|
|
121
|
+
export function clientVisibleLength(tool: MeasuredTool): number {
|
|
122
|
+
const { callChars, rest } = splitServedCallLine(tool);
|
|
123
|
+
return callChars + ownVisibleLength(tool.name, rest);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/** {@link clientVisibleLength} without the `Call:` line: the purpose prefix and the tool's own text. */
|
|
127
|
+
function ownVisibleLength(name: string, description: string): number {
|
|
128
|
+
const own = description.length;
|
|
97
129
|
// A prefixed tool with no description of its own is still handed the prefix,
|
|
98
130
|
// and nothing else — `prefixToolDescription` sends the prefix alone, with no
|
|
99
131
|
// blank line after it. Measuring that as zero would under-report the only
|
|
100
132
|
// text the client got.
|
|
101
|
-
if (own === 0) return PREFIXED_TOOLS.has(
|
|
102
|
-
// The pointer at its worst case rather than at this layout's: swap the one
|
|
103
|
-
// it carries for the longest it could be. A description that does not end
|
|
104
|
-
// with it (`start_session`, the proxied tools) is charged nothing.
|
|
105
|
-
const pointer = sharedRulesPointer();
|
|
106
|
-
const atWorstPointer = tool.description!.endsWith(pointer)
|
|
107
|
-
? own - pointer.length + SHARED_RULES_POINTER_MAX
|
|
108
|
-
: own;
|
|
133
|
+
if (own === 0) return PREFIXED_TOOLS.has(name) ? TOOL_PREFIX_CAP : 0;
|
|
109
134
|
// `+ 2` for the blank line `prefixToolDescription` puts between the two.
|
|
110
|
-
return PREFIXED_TOOLS.has(
|
|
135
|
+
return PREFIXED_TOOLS.has(name) ? own + TOOL_PREFIX_CAP + 2 : own;
|
|
111
136
|
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { splitCallLine } from '@bevel-software/platform-mcp-core';
|
|
2
|
+
import type { UtcpTool } from './tool.contract.js';
|
|
3
|
+
|
|
4
|
+
/** The one tool that returns the platform's guide (see `modules/agent-guide`). */
|
|
5
|
+
export const GET_AGENT_GUIDE_TOOL = 'get_agent_guide';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* The sentence every tool of the platform's own OPENS with: what to do before
|
|
9
|
+
* anything else here. At the front, not the end, because clients cut a long
|
|
10
|
+
* description from the end and the one instruction that must survive is this
|
|
11
|
+
* one. The guide's own tool is the one that does not carry it — it IS what
|
|
12
|
+
* the sentence points at.
|
|
13
|
+
*/
|
|
14
|
+
export const GUIDE_FIRST_SENTENCE = `Call \`${GET_AGENT_GUIDE_TOOL}\` first and read the platform's guide before anything else here.`;
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* `description` as a client is handed it: the sentence ahead of it, once. A
|
|
18
|
+
* description that already opens with the sentence is returned as it is, and
|
|
19
|
+
* an absent or empty one becomes the sentence alone. The ONE place the
|
|
20
|
+
* sentence is put in front of a description — the registry for the tools it
|
|
21
|
+
* lists, the MCP service for the meta-tools it builds itself — so the two
|
|
22
|
+
* cannot drift apart on what "once" means.
|
|
23
|
+
*
|
|
24
|
+
* Behind a `Call:` line, never ahead of it: the call example is the first
|
|
25
|
+
* line of every description (see mcp-core's `withCallExample`), and the
|
|
26
|
+
* sentence opens what follows it.
|
|
27
|
+
*/
|
|
28
|
+
export function guideFirstDescription(description: string | undefined): string {
|
|
29
|
+
const { call, rest } = splitCallLine(description ?? '');
|
|
30
|
+
if (call !== null) return `${call}\n\n${guideFirstDescription(rest)}`;
|
|
31
|
+
const own = rest;
|
|
32
|
+
if (own.startsWith(GUIDE_FIRST_SENTENCE)) return own;
|
|
33
|
+
return own ? `${GUIDE_FIRST_SENTENCE} ${own}` : GUIDE_FIRST_SENTENCE;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** `tool` as the catalog lists it: the sentence ahead of its own description, except on the guide's own tool. */
|
|
37
|
+
export function withGuideFirst(tool: UtcpTool): UtcpTool {
|
|
38
|
+
if (tool.name === GET_AGENT_GUIDE_TOOL) return tool;
|
|
39
|
+
const description = guideFirstDescription(tool.description);
|
|
40
|
+
return description === tool.description ? tool : { ...tool, description };
|
|
41
|
+
}
|
|
@@ -5,6 +5,7 @@ import type {
|
|
|
5
5
|
ToolProvider,
|
|
6
6
|
UtcpTool,
|
|
7
7
|
} from './tool.contract.js';
|
|
8
|
+
import { withGuideFirst } from './guide-first.js';
|
|
8
9
|
|
|
9
10
|
/**
|
|
10
11
|
* The tool catalog. Modules call `registerExternalTool` / `registerInternalTool`
|
|
@@ -13,6 +14,12 @@ import type {
|
|
|
13
14
|
* catalog only aggregates and lists them — the two manual endpoints serialize
|
|
14
15
|
* each list per request. Insertion order is preserved (static tools first, then
|
|
15
16
|
* provider-built ones); a duplicate static name within a surface throws.
|
|
17
|
+
*
|
|
18
|
+
* Every listed tool but the guide's own (`get_agent_guide`, which is what the
|
|
19
|
+
* sentence points at) opens with the one sentence saying what to do before
|
|
20
|
+
* any of them (`guide-first.ts`): applied here, at the one place both
|
|
21
|
+
* surfaces list from, so no module that registers a tool has to remember it
|
|
22
|
+
* and no surface can serve a tool without it.
|
|
16
23
|
*/
|
|
17
24
|
export class ToolRegistry implements IToolRegistry {
|
|
18
25
|
private readonly external = new Map<string, UtcpTool>();
|
|
@@ -37,13 +44,13 @@ export class ToolRegistry implements IToolRegistry {
|
|
|
37
44
|
|
|
38
45
|
async listExternal(ctx: ToolManualContext = {}): Promise<UtcpTool[]> {
|
|
39
46
|
const dynamic = await Promise.all(this.externalProviders.map((p) => p(ctx)));
|
|
40
|
-
return [...this.external.values(), ...dynamic];
|
|
47
|
+
return [...this.external.values(), ...dynamic].map(withGuideFirst);
|
|
41
48
|
}
|
|
42
49
|
|
|
43
50
|
async listInternal(ctx: ToolManualContext = {}): Promise<UtcpTool[]> {
|
|
44
51
|
const dynamic = await Promise.all(this.internalProviders.map((p) => p(ctx)));
|
|
45
52
|
const lists = await Promise.all(this.internalListProviders.map((p) => p(ctx)));
|
|
46
|
-
return [...this.internal.values(), ...dynamic, ...lists.flat()];
|
|
53
|
+
return [...this.internal.values(), ...dynamic, ...lists.flat()].map(withGuideFirst);
|
|
47
54
|
}
|
|
48
55
|
|
|
49
56
|
private add(into: Map<string, UtcpTool>, tool: UtcpTool, surface: string): void {
|
|
@@ -954,7 +954,12 @@ describe('PullRequestService — a recorded or cleared refusal reaches cached li
|
|
|
954
954
|
ensureRemotesFetched: async () => undefined,
|
|
955
955
|
} as unknown as WorkspaceService,
|
|
956
956
|
{} as unknown as IAccessControl,
|
|
957
|
-
{
|
|
957
|
+
{
|
|
958
|
+
changedPathsAndPairsForPr: async () => ({
|
|
959
|
+
paths: ['Plugins/x/SKILL.md'],
|
|
960
|
+
pairs: [{ path: 'Plugins/x/SKILL.md' }],
|
|
961
|
+
}),
|
|
962
|
+
} as unknown as GitService,
|
|
958
963
|
);
|
|
959
964
|
|
|
960
965
|
expect((await svc.listOpenPrs())[0]!.lastApplyFailure).toBeNull();
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach } from 'vitest';
|
|
2
|
+
import type { AuthUser } from '@bevel-software/platform-shared';
|
|
3
|
+
import type { Database } from '../../database/connection.js';
|
|
4
|
+
import { FileLockService } from '../file-lock.service.js';
|
|
5
|
+
import { WorkflowValidationError } from '../../../shared/domain-errors.js';
|
|
6
|
+
import { makeFakeLockDb, type FakeLockDb } from './fake-file-lock-db.js';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* A deletion runs its last "is any save landing?" check inside
|
|
10
|
+
* `whileNoneAcquired`, and a save starts by taking its file lock. An acquire
|
|
11
|
+
* that passed the gate before the deletion began, but whose row was still
|
|
12
|
+
* being written, must be seen by that check — not land after it.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
const ALICE: AuthUser = { id: '11111111-1111-4111-8111-111111111111', email: 'alice@example.com', name: 'Alice' };
|
|
16
|
+
const WS = 'alice%2Fdraft';
|
|
17
|
+
const BRANCH = 'alice/draft';
|
|
18
|
+
const PATH = 'knowledge-base/a.md';
|
|
19
|
+
|
|
20
|
+
/** The fake lock db, with every INSERT held until `release()`. */
|
|
21
|
+
function withHeldInserts(fake: FakeLockDb): { db: Database; release: () => void } {
|
|
22
|
+
let release!: () => void;
|
|
23
|
+
const gate = new Promise<void>((resolve) => {
|
|
24
|
+
release = resolve;
|
|
25
|
+
});
|
|
26
|
+
const base = fake.db as unknown as { insert: () => { values: (row: unknown) => Record<string, unknown> } };
|
|
27
|
+
const db = {
|
|
28
|
+
...base,
|
|
29
|
+
insert: () => ({
|
|
30
|
+
values: (row: unknown) => {
|
|
31
|
+
const chain = base.insert().values(row) as {
|
|
32
|
+
onConflictDoUpdate: (arg: unknown) => unknown;
|
|
33
|
+
returning: () => Promise<unknown>;
|
|
34
|
+
};
|
|
35
|
+
const held = {
|
|
36
|
+
onConflictDoUpdate: (arg: unknown) => {
|
|
37
|
+
chain.onConflictDoUpdate(arg);
|
|
38
|
+
return held;
|
|
39
|
+
},
|
|
40
|
+
returning: async () => {
|
|
41
|
+
await gate;
|
|
42
|
+
return chain.returning();
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
return held;
|
|
46
|
+
},
|
|
47
|
+
}),
|
|
48
|
+
} as unknown as Database;
|
|
49
|
+
return { db, release };
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
describe('FileLockService deletion gate', () => {
|
|
53
|
+
let fake: FakeLockDb;
|
|
54
|
+
|
|
55
|
+
beforeEach(() => {
|
|
56
|
+
fake = makeFakeLockDb();
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
it('waits for an acquire already under way, so the check inside sees its lock', async () => {
|
|
60
|
+
const { db, release } = withHeldInserts(fake);
|
|
61
|
+
const locks = new FileLockService(db);
|
|
62
|
+
|
|
63
|
+
const acquire = locks.acquire(WS, BRANCH, PATH, ALICE);
|
|
64
|
+
let sawLock: boolean | null = null;
|
|
65
|
+
const deletion = locks.whileNoneAcquired(BRANCH, async () => {
|
|
66
|
+
sawLock = await locks.hasAnyActive(WS);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
await new Promise((r) => setTimeout(r, 10));
|
|
70
|
+
// The acquire's row is not written yet, so the check has not run.
|
|
71
|
+
expect(sawLock).toBeNull();
|
|
72
|
+
|
|
73
|
+
release();
|
|
74
|
+
await expect(acquire).resolves.toMatchObject({ acquired: true });
|
|
75
|
+
await deletion;
|
|
76
|
+
expect(sawLock).toBe(true);
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
it('refuses an acquire that starts while the deletion runs', async () => {
|
|
80
|
+
const locks = new FileLockService(fake.db);
|
|
81
|
+
let refused: unknown = null;
|
|
82
|
+
await locks.whileNoneAcquired(BRANCH, async () => {
|
|
83
|
+
refused = await locks.acquire(WS, BRANCH, PATH, ALICE).catch((err: unknown) => err);
|
|
84
|
+
});
|
|
85
|
+
expect(refused).toBeInstanceOf(WorkflowValidationError);
|
|
86
|
+
expect(fake.rows()).toHaveLength(0);
|
|
87
|
+
// And grants it again once the deletion is over.
|
|
88
|
+
await expect(locks.acquire(WS, BRANCH, PATH, ALICE)).resolves.toMatchObject({ acquired: true });
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
it('does not wait for an acquire on another branch', async () => {
|
|
92
|
+
const { db, release } = withHeldInserts(fake);
|
|
93
|
+
const locks = new FileLockService(db);
|
|
94
|
+
|
|
95
|
+
const other = locks.acquire('bob%2Fdraft', 'bob/draft', PATH, ALICE);
|
|
96
|
+
let ran = false;
|
|
97
|
+
await locks.whileNoneAcquired(BRANCH, async () => {
|
|
98
|
+
ran = true;
|
|
99
|
+
});
|
|
100
|
+
expect(ran).toBe(true);
|
|
101
|
+
release();
|
|
102
|
+
await other;
|
|
103
|
+
});
|
|
104
|
+
});
|