@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
|
@@ -34,6 +34,7 @@ const DETAIL: ToolManualDetail = {
|
|
|
34
34
|
type: 'inline',
|
|
35
35
|
description: 'Read and write GitHub issues and PRs.',
|
|
36
36
|
capabilities: [{ name: 'create_issue', description: 'Open an issue in a repo.' }],
|
|
37
|
+
hiddenTools: [],
|
|
37
38
|
};
|
|
38
39
|
|
|
39
40
|
let httpServer: HttpServer | undefined;
|
|
@@ -205,6 +206,62 @@ describe('ToolManualService.getDetail — capabilities + access', () => {
|
|
|
205
206
|
});
|
|
206
207
|
});
|
|
207
208
|
|
|
209
|
+
/**
|
|
210
|
+
* The tool page's half of the marker. The finding comes from the MCP proxy,
|
|
211
|
+
* which is the only thing that loads a connected server's tools; what this
|
|
212
|
+
* endpoint decides is WHO sees it — the people who may write the `.tool`,
|
|
213
|
+
* and nobody else.
|
|
214
|
+
*/
|
|
215
|
+
describe('a tool of this server hidden for an invalid schema', () => {
|
|
216
|
+
const HIDDEN = {
|
|
217
|
+
manual: 'remote',
|
|
218
|
+
name: 'remote_srv_query',
|
|
219
|
+
path: '/properties/value/anyOf/0/required/0',
|
|
220
|
+
reason: 'must be a string',
|
|
221
|
+
marker:
|
|
222
|
+
'Hidden from agents: its schema is invalid at /properties/value/anyOf/0/required/0 (must be a string).',
|
|
223
|
+
};
|
|
224
|
+
|
|
225
|
+
const writer = (allowed: boolean): IAccessControl =>
|
|
226
|
+
({
|
|
227
|
+
canRead: async () => true,
|
|
228
|
+
canReadBatch: async (_w: string, _e: string, paths: string[]) => new Map(paths.map((p) => [p, true])),
|
|
229
|
+
canWrite: async () => allowed,
|
|
230
|
+
}) as unknown as IAccessControl;
|
|
231
|
+
|
|
232
|
+
test('is reported to a caller who may write the tool', async () => {
|
|
233
|
+
await withTool('remote.tool', JSON.stringify({ name: 'remote', type: 'mcp', url: 'https://mcp.example.com/mcp' }));
|
|
234
|
+
const service = svc(writer(true));
|
|
235
|
+
service.setHiddenTools({ hiddenFor: (manual) => (manual === 'remote' ? [HIDDEN] : []) });
|
|
236
|
+
expect((await service.getDetail('owner@x.eu', 'remote'))?.hiddenTools).toEqual([HIDDEN]);
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
test('is withheld from a caller who may only read it', async () => {
|
|
240
|
+
await withTool('remote.tool', JSON.stringify({ name: 'remote', type: 'mcp', url: 'https://mcp.example.com/mcp' }));
|
|
241
|
+
const service = svc(writer(false));
|
|
242
|
+
service.setHiddenTools({ hiddenFor: () => [HIDDEN] });
|
|
243
|
+
expect((await service.getDetail('reader@x.eu', 'remote'))?.hiddenTools).toEqual([]);
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
test('is empty, and costs no write check, when the server is healthy', async () => {
|
|
247
|
+
await withTool('remote.tool', JSON.stringify({ name: 'remote', type: 'mcp', url: 'https://mcp.example.com/mcp' }));
|
|
248
|
+
const canWrite = vi.fn(async () => true);
|
|
249
|
+
const service = svc({
|
|
250
|
+
canRead: async () => true,
|
|
251
|
+
canReadBatch: async (_w: string, _e: string, paths: string[]) => new Map(paths.map((p) => [p, true])),
|
|
252
|
+
canWrite,
|
|
253
|
+
} as unknown as IAccessControl);
|
|
254
|
+
service.setHiddenTools({ hiddenFor: () => [] });
|
|
255
|
+
expect((await service.getDetail('owner@x.eu', 'remote'))?.hiddenTools).toEqual([]);
|
|
256
|
+
expect(canWrite).not.toHaveBeenCalled();
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
test('is empty when no MCP surface has loaded a server yet', async () => {
|
|
260
|
+
await withTool('remote.tool', JSON.stringify({ name: 'remote', type: 'mcp', url: 'https://mcp.example.com/mcp' }));
|
|
261
|
+
expect((await svc().getDetail('owner@x.eu', 'remote'))?.hiddenTools).toEqual([]);
|
|
262
|
+
});
|
|
263
|
+
});
|
|
264
|
+
|
|
208
265
|
test('description is null (not undefined) when the file declares none', async () => {
|
|
209
266
|
await withTool('bare.tool', JSON.stringify({ name: 'bare', type: 'inline', tools: [] }));
|
|
210
267
|
const detail = await svc().getDetail('user@x.eu', 'bare');
|
|
@@ -9,6 +9,7 @@ import { createToolHandlerFactory } from '../../tool-helpers/tool-handler.js';
|
|
|
9
9
|
import { registerToolManualsTools } from '../tool-manuals.tools.js';
|
|
10
10
|
import type { IToolManualService } from '../tool-manuals.contract.js';
|
|
11
11
|
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
12
|
+
import type { HiddenTool, HiddenToolSource } from '../../../shared/hidden-tools.js';
|
|
12
13
|
|
|
13
14
|
/**
|
|
14
15
|
* `list_tool_setup` MUST respect the same access controls as every other tool
|
|
@@ -31,7 +32,10 @@ const BOB = { id: 'user-bob', email: 'bob@x.com', name: 'Bob' };
|
|
|
31
32
|
const CATALOG = [
|
|
32
33
|
{
|
|
33
34
|
slug: 'weather',
|
|
34
|
-
|
|
35
|
+
// The catalog NAME differs from the slug on purpose: the hidden-tool
|
|
36
|
+
// source is keyed by name, and a lookup keyed by slug would pass a
|
|
37
|
+
// fixture where the two are the same string.
|
|
38
|
+
name: 'Weather Service',
|
|
35
39
|
path: 'Plugins/weather.tool',
|
|
36
40
|
type: 'mcp' as const,
|
|
37
41
|
setup: { kind: 'oauth-manual' as const, reason: 'no dynamic client registration' },
|
|
@@ -93,7 +97,16 @@ const externalApiKeyService = {
|
|
|
93
97
|
t === 'bevel_alice' ? { user: ALICE, tokenId: 'tok-a' } : t === 'bevel_bob' ? { user: BOB, tokenId: 'tok-b' } : null,
|
|
94
98
|
} as never;
|
|
95
99
|
|
|
96
|
-
|
|
100
|
+
/** What the proxy's schema check found for `weather`, when a test wires one in. */
|
|
101
|
+
const HIDDEN_WEATHER_TOOL: HiddenTool = {
|
|
102
|
+
manual: 'Weather Service',
|
|
103
|
+
name: 'weather_srv_forecast',
|
|
104
|
+
path: '/properties/value/anyOf/0/required/0',
|
|
105
|
+
reason: 'must be a string',
|
|
106
|
+
marker: 'Hidden from agents: its schema is invalid at /properties/value/anyOf/0/required/0 (must be a string).',
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
async function start(hiddenTools?: HiddenToolSource): Promise<string> {
|
|
97
110
|
const registry = new ToolRegistry();
|
|
98
111
|
const internalToken = new InternalTokenService({ secret: 'test-secret' });
|
|
99
112
|
const toolAuth = createToolAuthMiddleware(externalApiKeyService, internalToken);
|
|
@@ -116,6 +129,7 @@ async function start(): Promise<string> {
|
|
|
116
129
|
accessControl,
|
|
117
130
|
variableStatus: { statusFor },
|
|
118
131
|
kb: testKbContext(),
|
|
132
|
+
hiddenTools,
|
|
119
133
|
});
|
|
120
134
|
app.use('/api', router);
|
|
121
135
|
|
|
@@ -158,8 +172,10 @@ describe('list_tool_setup — access controls resolved for the caller', () => {
|
|
|
158
172
|
// Bob can't read billing — it must be absent, not just canWrite=false.
|
|
159
173
|
expect(bob.tools.map((t) => t.slug)).toEqual(['weather']);
|
|
160
174
|
expect(bob.tools[0].canWrite).toBe(false);
|
|
161
|
-
// Status was resolved for BOB's user id, not leaked from Alice's
|
|
162
|
-
|
|
175
|
+
// Status was resolved for BOB's user id, not leaked from Alice's — under
|
|
176
|
+
// the key the vault derives from the manual's NAME (`Weather Service`:
|
|
177
|
+
// the space becomes `_`, every `_` is doubled, then the variable).
|
|
178
|
+
expect(statusFor).toHaveBeenLastCalledWith(BOB.id, ['Weather__Service_SHARED_KEY']);
|
|
163
179
|
expect(bob.tools[0].variables[0].userConfigured).toBe(false);
|
|
164
180
|
});
|
|
165
181
|
|
|
@@ -182,6 +198,59 @@ describe('list_tool_setup — access controls resolved for the caller', () => {
|
|
|
182
198
|
expect(bob.invalid).toEqual([]);
|
|
183
199
|
});
|
|
184
200
|
|
|
201
|
+
it('marks a tool hidden for an invalid schema, to the caller who may manage the server', async () => {
|
|
202
|
+
const base = await start({
|
|
203
|
+
hiddenFor: (manual) => (manual === 'Weather Service' ? [HIDDEN_WEATHER_TOOL] : []),
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
const alice = (await (await callSetup(base, 'bevel_alice')).json()) as {
|
|
207
|
+
tools: { slug: string; hiddenTools: HiddenTool[] }[];
|
|
208
|
+
};
|
|
209
|
+
// Alice writes `weather`, so she is the one who can get the schema fixed.
|
|
210
|
+
expect(alice.tools.find((t) => t.slug === 'weather')!.hiddenTools).toEqual([HIDDEN_WEATHER_TOOL]);
|
|
211
|
+
// The marker names the tool, the place and the reason, in one sentence.
|
|
212
|
+
expect(alice.tools.find((t) => t.slug === 'weather')!.hiddenTools[0].marker).toBe(
|
|
213
|
+
'Hidden from agents: its schema is invalid at /properties/value/anyOf/0/required/0 (must be a string).',
|
|
214
|
+
);
|
|
215
|
+
// Nothing is wrong with `billing`, which Alice cannot write anyway.
|
|
216
|
+
expect(alice.tools.find((t) => t.slug === 'billing')!.hiddenTools).toEqual([]);
|
|
217
|
+
|
|
218
|
+
// Bob READS `weather` and cannot write it: the marker is not his to see.
|
|
219
|
+
// He has no way to fix the schema, and the hidden tool is simply not among
|
|
220
|
+
// the ones he can call.
|
|
221
|
+
const bob = (await (await callSetup(base, 'bevel_bob')).json()) as {
|
|
222
|
+
tools: { slug: string; hiddenTools: HiddenTool[] }[];
|
|
223
|
+
};
|
|
224
|
+
expect(bob.tools.map((t) => t.slug)).toEqual(['weather']);
|
|
225
|
+
expect(bob.tools[0].hiddenTools).toEqual([]);
|
|
226
|
+
});
|
|
227
|
+
|
|
228
|
+
it('reports no hidden tool on a deployment with no MCP surface at all — no source wired', async () => {
|
|
229
|
+
const base = await start(); // no source wired, as a deployment without the proxy
|
|
230
|
+
const alice = (await (await callSetup(base, 'bevel_alice')).json()) as {
|
|
231
|
+
tools: { slug: string; hiddenTools: HiddenTool[] }[];
|
|
232
|
+
};
|
|
233
|
+
for (const tool of alice.tools) expect(tool.hiddenTools).toEqual([]);
|
|
234
|
+
});
|
|
235
|
+
|
|
236
|
+
it('reports no hidden tool to a manager whose server is healthy, or has not loaded yet — source wired, nothing found', async () => {
|
|
237
|
+
// The distinct case from the one above: the proxy IS there and has nothing
|
|
238
|
+
// against `weather`, which Alice manages. `[]` is the finding, not the
|
|
239
|
+
// absence of a finder.
|
|
240
|
+
const hiddenFor = vi.fn((): HiddenTool[] => []);
|
|
241
|
+
const base = await start({ hiddenFor });
|
|
242
|
+
const alice = (await (await callSetup(base, 'bevel_alice')).json()) as {
|
|
243
|
+
tools: { slug: string; canWrite: boolean; hiddenTools: HiddenTool[] }[];
|
|
244
|
+
};
|
|
245
|
+
const weather = alice.tools.find((t) => t.slug === 'weather')!;
|
|
246
|
+
expect(weather.canWrite).toBe(true);
|
|
247
|
+
expect(weather.hiddenTools).toEqual([]);
|
|
248
|
+
// Asked by the manual's catalog NAME, which is how the proxy knows it —
|
|
249
|
+
// not by its slug — and the answer came from the source.
|
|
250
|
+
expect(hiddenFor).toHaveBeenCalledWith('Weather Service');
|
|
251
|
+
expect(hiddenFor).not.toHaveBeenCalledWith('weather');
|
|
252
|
+
});
|
|
253
|
+
|
|
185
254
|
it('rejects an unauthenticated call outright', async () => {
|
|
186
255
|
const base = await start();
|
|
187
256
|
const res = await fetch(`${base}/api/agent/tools/list_tool_setup`, {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { CallTemplate } from '@utcp/sdk';
|
|
2
|
+
import type { HiddenTool, HiddenToolSource } from '../../shared/hidden-tools.js';
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* Tool manuals — user-authored `*.tool` files under `Plugins/` in the DEFAULT
|
|
@@ -329,10 +330,11 @@ export interface ToolCapability {
|
|
|
329
330
|
|
|
330
331
|
/**
|
|
331
332
|
* A single tool manual for the BROWSER tool page (`GET /api/tools/:slug`): the
|
|
332
|
-
* summary plus the
|
|
333
|
-
*
|
|
334
|
-
*
|
|
335
|
-
*
|
|
333
|
+
* summary plus the three human-facing fields the catalog listing has no use
|
|
334
|
+
* for — the description, the capabilities and the tools hidden for an invalid
|
|
335
|
+
* schema. Each is normalized to a definite empty (`null`, `[]`) rather than
|
|
336
|
+
* left optional — the page renders a definite "nothing here" state, so an
|
|
337
|
+
* absent field and an empty one are the same thing to it.
|
|
336
338
|
*/
|
|
337
339
|
export interface ToolManualDetail extends Omit<ToolManualSummary, 'description'> {
|
|
338
340
|
description: string | null;
|
|
@@ -342,6 +344,16 @@ export interface ToolManualDetail extends Omit<ToolManualSummary, 'description'>
|
|
|
342
344
|
* round-trip this endpoint deliberately does not make), so they report `[]`.
|
|
343
345
|
*/
|
|
344
346
|
capabilities: ToolCapability[];
|
|
347
|
+
/**
|
|
348
|
+
* Tools of this manual that Hexis keeps off every agent surface because
|
|
349
|
+
* their input schema is not valid JSON Schema as the server sent it, each
|
|
350
|
+
* with the place and the reason.
|
|
351
|
+
*
|
|
352
|
+
* Only for a caller who may WRITE this manual's file: the marker is for the
|
|
353
|
+
* people who manage the server, who are the only ones who can get the schema
|
|
354
|
+
* fixed. `[]` for everyone else, and for a server with nothing wrong.
|
|
355
|
+
*/
|
|
356
|
+
hiddenTools: HiddenTool[];
|
|
345
357
|
}
|
|
346
358
|
|
|
347
359
|
export interface IToolManualService {
|
|
@@ -374,6 +386,14 @@ export interface IToolManualService {
|
|
|
374
386
|
*/
|
|
375
387
|
getDetail(userEmail: string, slug: string): Promise<ToolManualDetail | null>;
|
|
376
388
|
|
|
389
|
+
/**
|
|
390
|
+
* Wire where a hidden tool's schema finding comes from (the MCP proxy, which
|
|
391
|
+
* is constructed after this service — setter injection for the same reason
|
|
392
|
+
* `setMcpAuthDiscovery` is one). Without it `getDetail` reports no hidden
|
|
393
|
+
* tool, which is the honest answer for a deployment with no MCP surface.
|
|
394
|
+
*/
|
|
395
|
+
setHiddenTools(source: HiddenToolSource): void;
|
|
396
|
+
|
|
377
397
|
/**
|
|
378
398
|
* One line per manual the caller can read, each carrying the manual's
|
|
379
399
|
* identity AND a digest of the file it was parsed from — the input the
|
|
@@ -32,6 +32,7 @@ import { RESERVED_VARIABLE_NAMES, findReservedVariableRef } from '../../shared/v
|
|
|
32
32
|
import { extractFrontmatter, resolveDeclaredId, isValidId, dedupeById } from '../../shared/frontmatter-id.js';
|
|
33
33
|
import type { ITreeWalker } from '../../shared/fs.contract.js';
|
|
34
34
|
import { TtlCache } from '../../shared/ttl-cache.js';
|
|
35
|
+
import type { HiddenToolSource } from '../../shared/hidden-tools.js';
|
|
35
36
|
import {
|
|
36
37
|
utcpNamespacePrefix,
|
|
37
38
|
utcpNamespacedKey,
|
|
@@ -239,6 +240,8 @@ export type McpAuthDiscoveryResult =
|
|
|
239
240
|
export class ToolManualService implements IToolManualService {
|
|
240
241
|
private readonly cache: TtlCache<ScanResult>;
|
|
241
242
|
private mcpAuthDiscovery?: McpAuthDiscoveryPort;
|
|
243
|
+
/** Where a hidden tool's schema finding comes from; absent until wired. */
|
|
244
|
+
private hiddenTools?: HiddenToolSource;
|
|
242
245
|
/**
|
|
243
246
|
* The refused set as it was last written to the log, so the warnings are
|
|
244
247
|
* logged ONCE PER CHANGE rather than once per scan. A broken `.tool` sits
|
|
@@ -288,6 +291,10 @@ export class ToolManualService implements IToolManualService {
|
|
|
288
291
|
this.mcpAuthDiscovery = discovery;
|
|
289
292
|
}
|
|
290
293
|
|
|
294
|
+
setHiddenTools(source: HiddenToolSource): void {
|
|
295
|
+
this.hiddenTools = source;
|
|
296
|
+
}
|
|
297
|
+
|
|
291
298
|
invalidate(): void {
|
|
292
299
|
this.cache.invalidate();
|
|
293
300
|
this.inFlightScan = null;
|
|
@@ -317,10 +324,20 @@ export class ToolManualService implements IToolManualService {
|
|
|
317
324
|
// model, no second place for the access rules to drift.
|
|
318
325
|
const found = (await this.accessibleManuals(userEmail)).find((m) => m.slug === slug);
|
|
319
326
|
if (!found) return null;
|
|
327
|
+
// The marker is for whoever manages the server: the same per-file write
|
|
328
|
+
// verdict that gates setting the tool's shared secrets. A reader sees
|
|
329
|
+
// nothing of it — they can neither fix the schema nor do anything with the
|
|
330
|
+
// knowledge that one of the server's tools is off. The write check is
|
|
331
|
+
// asked only when there is something to show, so the healthy case (every
|
|
332
|
+
// tool of every server) costs no ACL round-trip.
|
|
333
|
+
const hidden = this.hiddenTools?.hiddenFor(found.name) ?? [];
|
|
334
|
+
const mayManage =
|
|
335
|
+
hidden.length > 0 && (await this.accessControl.canWrite(this.kb.defaultWorkspaceId(), userEmail, found.path));
|
|
320
336
|
return {
|
|
321
337
|
...toSummary(found),
|
|
322
338
|
description: found.description ?? null,
|
|
323
339
|
capabilities: capabilitiesOf(found),
|
|
340
|
+
hiddenTools: mayManage ? hidden : [],
|
|
324
341
|
};
|
|
325
342
|
}
|
|
326
343
|
|
|
@@ -3,10 +3,12 @@ import type { IToolRegistry, UtcpTool } from '../tool-registry/tool.contract.js'
|
|
|
3
3
|
import type { KbContext } from '../../shared/kb-context.js';
|
|
4
4
|
import type { ToolContext } from '../tool-helpers/tool.contract.js';
|
|
5
5
|
import { toolDef } from '../tool-helpers/tool-def.js';
|
|
6
|
+
import { declareRouteTool } from '../tool-helpers/route-tool-schemas.js';
|
|
6
7
|
import type { ToolHandlerFactory } from '../tool-helpers/tool-handler.js';
|
|
7
8
|
import type { IAccessControl } from '../access/access-control.interface.js';
|
|
8
9
|
import { utcpNamespacedKey } from '../../shared/utcp-namespace.js';
|
|
9
10
|
import type { IToolManualService } from './tool-manuals.contract.js';
|
|
11
|
+
import type { HiddenToolSource } from '../../shared/hidden-tools.js';
|
|
10
12
|
|
|
11
13
|
/**
|
|
12
14
|
* What `list_tool_setup` needs from the secrets vault (structurally satisfied
|
|
@@ -43,10 +45,21 @@ export function registerToolManualsTools(
|
|
|
43
45
|
variableStatus: VariableStatusPort;
|
|
44
46
|
/** Which branch tools are served from, and its clone. */
|
|
45
47
|
kb: Pick<KbContext, 'defaultBranch' | 'defaultWorkspaceId'>;
|
|
48
|
+
/**
|
|
49
|
+
* Where a hidden tool's schema finding comes from (the MCP proxy).
|
|
50
|
+
* Optional: a deployment with no MCP surface has nothing to report, and
|
|
51
|
+
* `hiddenTools` is then empty everywhere.
|
|
52
|
+
*/
|
|
53
|
+
hiddenTools?: HiddenToolSource;
|
|
46
54
|
},
|
|
47
55
|
): void {
|
|
48
56
|
registry.registerExternalTool((ctx) => buildListLocalToolsDef(toolManualService, ctx.userEmail));
|
|
49
57
|
registry.registerInternalTool((ctx) => buildListLocalToolsDef(toolManualService, ctx.userEmail));
|
|
58
|
+
// The def above is built per catalog listing (its description names the
|
|
59
|
+
// tools configured for THIS caller), so declare the arguments here as well:
|
|
60
|
+
// a direct REST call that lands before the first listing must be checked
|
|
61
|
+
// against them too.
|
|
62
|
+
declareRouteTool('list_local_tools', LIST_LOCAL_TOOLS_INPUTS);
|
|
50
63
|
|
|
51
64
|
router.post(
|
|
52
65
|
'/agent/tools/list_local_tools',
|
|
@@ -66,23 +79,31 @@ export function registerToolManualsTools(
|
|
|
66
79
|
const listSetupDef = toolDef({
|
|
67
80
|
name: 'list_tool_setup',
|
|
68
81
|
// What each FIELD means is documented on the field, in `outputs` below:
|
|
69
|
-
// `setup.kind`, `variables` and `
|
|
70
|
-
// which made this description two thousand characters and
|
|
71
|
-
// thing a client cut. The description says what the tool
|
|
72
|
-
//
|
|
82
|
+
// `setup.kind`, `variables`, `invalid` and `hiddenTools` each carried a
|
|
83
|
+
// paragraph here, which made this description two thousand characters and
|
|
84
|
+
// so the first thing a client cut. The description says what the tool
|
|
85
|
+
// answers and the four things an agent cannot read off a field.
|
|
86
|
+
//
|
|
87
|
+
// It sits a few characters under `TOOL_DESCRIPTION_CAP` WITH the guide-first
|
|
88
|
+
// sentence the registry puts in front of it (`tool-registry/guide-first.ts`)
|
|
89
|
+
// and the `Call:` line generated ahead of everything,
|
|
90
|
+
// which is why every sentence here is the short form: the `hiddenTools`
|
|
91
|
+
// clause and that opener both came out of the same budget, and what a
|
|
92
|
+
// hidden tool's entry CONTAINS is on the field below rather than here.
|
|
73
93
|
description:
|
|
74
|
-
'Configuration status of every `.tool` the current user can access: what each
|
|
75
|
-
'
|
|
76
|
-
'READ is absent
|
|
77
|
-
'Secret VALUES are never returned and can never be set through a tool: an admin enters them in the tool
|
|
78
|
-
'
|
|
79
|
-
'
|
|
80
|
-
'
|
|
81
|
-
'
|
|
94
|
+
'Configuration status of every `.tool` the current user can access: what each needs set up and what is ' +
|
|
95
|
+
'configured, as `{ tools, invalid, onBranchOnly, note? }`. Scoped to the CALLER: a `.tool` it cannot ' +
|
|
96
|
+
'READ is absent, and every flag is the caller\'s own. ' +
|
|
97
|
+
'Secret VALUES are never returned and can never be set through a tool: an admin enters them in the tool ' +
|
|
98
|
+
'editor; users sign in on /connect. ' +
|
|
99
|
+
'Setting a tool\'s shared secrets is gated by `canWrite` on the `.tool` FILE (its frontmatter ' +
|
|
100
|
+
'`write:`/`owner:` verbs and the access.md chain), NOT by a platform role: who manages the file configures ' +
|
|
101
|
+
'the tool. ' +
|
|
102
|
+
'`hiddenTools` names the tools Hexis hides from agents for an invalid schema. ' +
|
|
82
103
|
'The listing is the RELEASED catalog, built from the default branch only: a server or `.tool` you declared on a ' +
|
|
83
|
-
'draft is not listed,
|
|
84
|
-
'
|
|
85
|
-
'
|
|
104
|
+
'draft is not listed, callable or signed-in-able until it is merged. Pass `branch` (the draft you wrote the ' +
|
|
105
|
+
'declaration on) and `onBranchOnly` names every tool declared there that the default branch does not serve ' +
|
|
106
|
+
'yet — open a change request and ask the user to merge it.',
|
|
86
107
|
path: '/api/agent/tools/list_tool_setup',
|
|
87
108
|
inputs: {
|
|
88
109
|
type: 'object',
|
|
@@ -132,6 +153,22 @@ export function registerToolManualsTools(
|
|
|
132
153
|
type: 'boolean',
|
|
133
154
|
description: 'You may write this `.tool` FILE, which is what gates setting its shared secrets.',
|
|
134
155
|
},
|
|
156
|
+
hiddenTools: {
|
|
157
|
+
type: 'array',
|
|
158
|
+
description:
|
|
159
|
+
'Tools of this server kept off every agent surface for an invalid input schema. Empty ' +
|
|
160
|
+
'unless the caller may write this tool.',
|
|
161
|
+
items: {
|
|
162
|
+
type: 'object',
|
|
163
|
+
properties: {
|
|
164
|
+
name: { type: 'string', description: 'The name the tool would have been offered under.' },
|
|
165
|
+
path: { type: 'string', description: 'JSON Pointer to the place in the schema that is not valid.' },
|
|
166
|
+
reason: { type: 'string', description: 'Why that place is not valid, in the validator\'s words.' },
|
|
167
|
+
marker: { type: 'string', description: 'The one sentence the tool page shows for this tool.' },
|
|
168
|
+
},
|
|
169
|
+
required: ['name', 'path', 'reason', 'marker'],
|
|
170
|
+
},
|
|
171
|
+
},
|
|
135
172
|
variables: {
|
|
136
173
|
type: 'array',
|
|
137
174
|
description:
|
|
@@ -156,7 +193,7 @@ export function registerToolManualsTools(
|
|
|
156
193
|
},
|
|
157
194
|
},
|
|
158
195
|
},
|
|
159
|
-
required: ['slug', 'name', 'path', 'type', 'canWrite', 'variables'],
|
|
196
|
+
required: ['slug', 'name', 'path', 'type', 'canWrite', 'hiddenTools', 'variables'],
|
|
160
197
|
},
|
|
161
198
|
},
|
|
162
199
|
invalid: {
|
|
@@ -219,27 +256,35 @@ export function registerToolManualsTools(
|
|
|
219
256
|
const status = await deps.variableStatus.statusFor(ctx.user.id, allKeys);
|
|
220
257
|
const statusByKey = new Map(status.map((s) => [s.key, s]));
|
|
221
258
|
const tools = await Promise.all(
|
|
222
|
-
manuals.map(async (m) =>
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
259
|
+
manuals.map(async (m) => {
|
|
260
|
+
const canWrite = await deps.accessControl.canWrite(defaultWs(), ctx.user.email, m.path);
|
|
261
|
+
return {
|
|
262
|
+
slug: m.slug,
|
|
263
|
+
name: m.name,
|
|
264
|
+
path: m.path,
|
|
265
|
+
type: m.type,
|
|
266
|
+
setup: m.setup ?? null,
|
|
267
|
+
canWrite,
|
|
268
|
+
// The marker goes only to the people who manage the server — the
|
|
269
|
+
// same verdict that gates setting its shared secrets. A caller who
|
|
270
|
+
// may only READ the tool is told nothing about it: they cannot fix
|
|
271
|
+
// the schema, and the tool is simply not among the ones they can call.
|
|
272
|
+
hiddenTools: canWrite ? (deps.hiddenTools?.hiddenFor(m.name) ?? []) : [],
|
|
273
|
+
variables: (m.variables ?? []).map((v) => {
|
|
274
|
+
const st = statusByKey.get(varKey(m.name, v.name));
|
|
275
|
+
const isOAuth = v.oauth != null;
|
|
276
|
+
return {
|
|
277
|
+
name: v.name,
|
|
278
|
+
scope: v.scope,
|
|
279
|
+
label: v.label ?? null,
|
|
280
|
+
oauth: isOAuth,
|
|
281
|
+
adminConfigured: st?.adminConfigured ?? false,
|
|
282
|
+
userConfigured: st?.userConfigured ?? false,
|
|
283
|
+
authorized: isOAuth ? (st?.userAuthorized ?? false) : null,
|
|
284
|
+
};
|
|
285
|
+
}),
|
|
286
|
+
};
|
|
287
|
+
}),
|
|
243
288
|
);
|
|
244
289
|
const onBranchOnly = pending.map((p) => ({ ...p, branch: branch! }));
|
|
245
290
|
if (onBranchOnly.length === 0) return { tools, invalid, onBranchOnly };
|
|
@@ -265,6 +310,9 @@ async function localToolsLine(svc: IToolManualService, userEmail?: string): Prom
|
|
|
265
310
|
return `Local-only tools configured for you: ${tools.map((t) => `\`${t.name}\``).join(', ')}.`;
|
|
266
311
|
}
|
|
267
312
|
|
|
313
|
+
/** `list_local_tools` takes nothing; a const so the route and the def share one declaration. */
|
|
314
|
+
const LIST_LOCAL_TOOLS_INPUTS = { type: 'object' as const, properties: {}, additionalProperties: false };
|
|
315
|
+
|
|
268
316
|
async function buildListLocalToolsDef(svc: IToolManualService, userEmail?: string): Promise<UtcpTool> {
|
|
269
317
|
return toolDef({
|
|
270
318
|
name: 'list_local_tools',
|
|
@@ -280,7 +328,7 @@ async function buildListLocalToolsDef(svc: IToolManualService, userEmail?: strin
|
|
|
280
328
|
'setup by hand. ' +
|
|
281
329
|
(await localToolsLine(svc, userEmail)),
|
|
282
330
|
path: '/api/agent/tools/list_local_tools',
|
|
283
|
-
inputs:
|
|
331
|
+
inputs: LIST_LOCAL_TOOLS_INPUTS,
|
|
284
332
|
outputs: {
|
|
285
333
|
type: 'object',
|
|
286
334
|
properties: {
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import express from 'express';
|
|
3
|
+
import { describe, expect, it } from 'vitest';
|
|
4
|
+
import { inputSchemaDefect } from '@bevel-software/platform-mcp-core';
|
|
5
|
+
import { ToolRegistry } from '../tool-registry.js';
|
|
6
|
+
import { registerWorkflowTools } from '../../workflow/agent-tools/workflow.tools.js';
|
|
7
|
+
import { registerChangeRequestReadTools } from '../../workflow/agent-tools/change-request-read.tools.js';
|
|
8
|
+
import { registerWorkspaceTools } from '../../workspace/workspace.tools.js';
|
|
9
|
+
import { registerSkillsTools } from '../../skills/skills.tools.js';
|
|
10
|
+
import { registerPluginsTools } from '../../plugins/plugins.tools.js';
|
|
11
|
+
import { registerToolManualsTools } from '../../tool-manuals/tool-manuals.tools.js';
|
|
12
|
+
import { registerEmbedTools } from '../../embed/embed.tools.js';
|
|
13
|
+
import { registerAgentGuideTool } from '../../agent-guide/agent-guide.tools.js';
|
|
14
|
+
import { ToolDescriptionNotes } from '../../workspace/agent-access.gate.js';
|
|
15
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Every tool Hexis declares itself, checked against the same JSON Schema rules
|
|
19
|
+
* a connected server's tool is checked against.
|
|
20
|
+
*
|
|
21
|
+
* Hexis hides a connected tool whose input schema is invalid, because an AI
|
|
22
|
+
* client would otherwise drop it in silence. The platform's own tools go to
|
|
23
|
+
* those same clients through those same surfaces, so a mistake in one of these
|
|
24
|
+
* schemas costs the tool just as quietly — and it would be Hexis's mistake.
|
|
25
|
+
* This test is the thing that makes shipping one impossible.
|
|
26
|
+
*
|
|
27
|
+
* It registers the DEFS as `create-core-server` does, with stubs for the
|
|
28
|
+
* services (no def-building path touches one: the lazy providers are resolved
|
|
29
|
+
* with no caller context, which is their static form).
|
|
30
|
+
*
|
|
31
|
+
* Add a tool module to the server and this test FAILS until it is added here:
|
|
32
|
+
* `covers every tool module the server registers` reads the server's own source
|
|
33
|
+
* and compares the `register…Tools` calls in it with `MODULES` below. A test
|
|
34
|
+
* that silently skipped a whole module's schemas would be worse than no test,
|
|
35
|
+
* because it would read as if it had checked them.
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* A stub service: every method answers with an empty list. The def-building
|
|
40
|
+
* paths that do reach a service only ask it what exists (which skills, which
|
|
41
|
+
* local-only tools) to name them in a description, and "none" is a valid
|
|
42
|
+
* answer that keeps the SCHEMAS — what this test is about — untouched.
|
|
43
|
+
* `then` is excluded so the stub is never mistaken for a promise.
|
|
44
|
+
*/
|
|
45
|
+
const nothing = new Proxy(
|
|
46
|
+
{},
|
|
47
|
+
{
|
|
48
|
+
get: (_target, key) => (key === 'then' ? undefined : async () => []),
|
|
49
|
+
},
|
|
50
|
+
) as never;
|
|
51
|
+
|
|
52
|
+
const pass: express.RequestHandler = (_req, _res, next) => next();
|
|
53
|
+
const handler = (() => pass) as never;
|
|
54
|
+
|
|
55
|
+
/** Where the server registers its tool modules — read, not imported, see below. */
|
|
56
|
+
const CORE_SERVER_SOURCE = new URL('../../../core/create-core-server.ts', import.meta.url);
|
|
57
|
+
|
|
58
|
+
/** Every tool-registering module, by the name the server calls it under. */
|
|
59
|
+
const MODULES: ReadonlyArray<{ name: string; register: (registry: ToolRegistry) => void }> = [
|
|
60
|
+
{
|
|
61
|
+
name: 'registerWorkflowTools',
|
|
62
|
+
register: (registry) => registerWorkflowTools(registry, express.Router(), pass, handler, testKbContext(), async () => true),
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
name: 'registerChangeRequestReadTools',
|
|
66
|
+
register: (registry) =>
|
|
67
|
+
registerChangeRequestReadTools(registry, express.Router(), pass, handler, nothing, testKbContext()),
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
name: 'registerWorkspaceTools',
|
|
71
|
+
register: (registry) =>
|
|
72
|
+
registerWorkspaceTools(
|
|
73
|
+
registry,
|
|
74
|
+
express.Router(),
|
|
75
|
+
pass,
|
|
76
|
+
handler,
|
|
77
|
+
nothing,
|
|
78
|
+
nothing,
|
|
79
|
+
nothing,
|
|
80
|
+
testKbContext(),
|
|
81
|
+
{ recoveryBotEmail: 'recovery@bevel.software', hooks: nothing, notes: new ToolDescriptionNotes() },
|
|
82
|
+
nothing,
|
|
83
|
+
nothing,
|
|
84
|
+
undefined,
|
|
85
|
+
undefined,
|
|
86
|
+
// The upload store: the two upload tools are mounted only when one is
|
|
87
|
+
// supplied, and the server supplies one — so this harness does too,
|
|
88
|
+
// or their schemas would be the two it silently never checked.
|
|
89
|
+
nothing,
|
|
90
|
+
),
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
name: 'registerSkillsTools',
|
|
94
|
+
register: (registry) => registerSkillsTools(registry, express.Router(), pass, handler, nothing),
|
|
95
|
+
},
|
|
96
|
+
{ name: 'registerPluginsTools', register: (registry) => registerPluginsTools(registry, testKbContext()) },
|
|
97
|
+
{
|
|
98
|
+
name: 'registerEmbedTools',
|
|
99
|
+
register: (registry) =>
|
|
100
|
+
registerEmbedTools(registry, express.Router(), pass, handler, {
|
|
101
|
+
embedService: nothing,
|
|
102
|
+
kb: testKbContext(),
|
|
103
|
+
readForTool: nothing,
|
|
104
|
+
canBeReached: () => true,
|
|
105
|
+
appUrlFor: (repoRelative) => `https://example.test/workspace/main/knowledge-base/${repoRelative}`,
|
|
106
|
+
notes: new ToolDescriptionNotes(),
|
|
107
|
+
}),
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
name: 'registerToolManualsTools',
|
|
111
|
+
register: (registry) =>
|
|
112
|
+
registerToolManualsTools(registry, express.Router(), pass, handler, nothing, {
|
|
113
|
+
accessControl: nothing,
|
|
114
|
+
variableStatus: nothing,
|
|
115
|
+
kb: testKbContext(),
|
|
116
|
+
}),
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
// The one module registering a single tool: a provider on both surfaces,
|
|
120
|
+
// built from the sections the reader answers — none here, which still
|
|
121
|
+
// builds the def.
|
|
122
|
+
name: 'registerAgentGuideTool',
|
|
123
|
+
register: (registry) => registerAgentGuideTool(registry, express.Router(), pass, handler, async () => []),
|
|
124
|
+
},
|
|
125
|
+
];
|
|
126
|
+
|
|
127
|
+
async function toolsOf(modules: ReadonlyArray<(typeof MODULES)[number]>) {
|
|
128
|
+
const registry = new ToolRegistry();
|
|
129
|
+
for (const module of modules) module.register(registry);
|
|
130
|
+
// Both surfaces: the external one is what reaches a connected AI client, the
|
|
131
|
+
// internal one is what the in-app agent calls. Either can carry a bad schema.
|
|
132
|
+
return [...(await registry.listExternal()), ...(await registry.listInternal())];
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
const allOwnTools = () => toolsOf(MODULES);
|
|
136
|
+
|
|
137
|
+
describe("Hexis's own tool schemas", () => {
|
|
138
|
+
/**
|
|
139
|
+
* The harness's own guard, and the reason it reads a source file: nothing in
|
|
140
|
+
* the registry can tell this test about a module nobody registered. A count
|
|
141
|
+
* cannot either — a new module leaves it larger either way. The server's call
|
|
142
|
+
* list can, and it is the only place that knows the whole set.
|
|
143
|
+
*/
|
|
144
|
+
it('covers every tool module the server registers', () => {
|
|
145
|
+
const source = readFileSync(CORE_SERVER_SOURCE, 'utf8');
|
|
146
|
+
// `register…Tools` and `register…Tool` alike: a module registering one
|
|
147
|
+
// tool is a module whose schema this harness must check too.
|
|
148
|
+
const registered = [...source.matchAll(/\b(register\w+Tools?)\s*\(/g)].map((m) => m[1]);
|
|
149
|
+
expect([...new Set(registered)].sort()).toEqual(MODULES.map((m) => m.name).sort());
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
it.each(MODULES.map((m) => [m.name, m] as const))('%s contributes tools to check', async (_name, module) => {
|
|
153
|
+
// A module that registers nothing — a renamed registry method, a provider
|
|
154
|
+
// that threw away its defs — would otherwise pass every assertion below
|
|
155
|
+
// while exercising nothing.
|
|
156
|
+
expect(await toolsOf([module])).not.toEqual([]);
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
it('declares valid JSON Schema for every tool, on both surfaces', async () => {
|
|
160
|
+
const defects = (await allOwnTools())
|
|
161
|
+
.map((tool) => ({ tool: tool.name, defect: inputSchemaDefect(tool.inputs) }))
|
|
162
|
+
.filter((entry) => entry.defect !== null);
|
|
163
|
+
// Named, not counted: a failure has to say WHICH tool and WHERE.
|
|
164
|
+
expect(defects).toEqual([]);
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
it('declares an object schema for every tool, as MCP requires of an input schema', async () => {
|
|
168
|
+
const notObjects = (await allOwnTools())
|
|
169
|
+
.filter((tool) => (tool.inputs as { type?: unknown }).type !== 'object')
|
|
170
|
+
.map((tool) => tool.name);
|
|
171
|
+
expect(notObjects).toEqual([]);
|
|
172
|
+
});
|
|
173
|
+
});
|