@bevel-software/platform-core-backend 0.25.2 → 0.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/agent-guide/access-control.md +251 -0
- package/agent-guide/conventions.md +35 -0
- package/agent-guide/directory-structure.md +145 -0
- package/agent-guide/finding-things.md +7 -0
- package/agent-guide/html-views.md +83 -0
- package/agent-guide/introduction.md +27 -0
- package/agent-guide/new-knowledge-base.md +24 -0
- package/agent-guide/skills.md +47 -0
- package/agent-guide/tool-manuals.md +227 -0
- package/agent-guide/where-a-new-file-goes.md +36 -0
- package/dist/assets.d.ts +26 -0
- package/dist/assets.d.ts.map +1 -1
- package/dist/assets.js +35 -2
- package/dist/assets.js.map +1 -1
- package/dist/core/catalog-revision.d.ts +19 -1
- package/dist/core/catalog-revision.d.ts.map +1 -1
- package/dist/core/catalog-revision.js +14 -3
- package/dist/core/catalog-revision.js.map +1 -1
- package/dist/core/core-ports.d.ts +11 -0
- package/dist/core/core-ports.d.ts.map +1 -1
- package/dist/core/core-ports.js.map +1 -1
- package/dist/core/create-core-server.d.ts +5 -0
- package/dist/core/create-core-server.d.ts.map +1 -1
- package/dist/core/create-core-server.js +65 -3
- package/dist/core/create-core-server.js.map +1 -1
- package/dist/core/create-core-services.d.ts +35 -0
- package/dist/core/create-core-services.d.ts.map +1 -1
- package/dist/core/create-core-services.js +114 -12
- package/dist/core/create-core-services.js.map +1 -1
- package/dist/core/lifecycle.d.ts +16 -1
- package/dist/core/lifecycle.d.ts.map +1 -1
- package/dist/core/lifecycle.js +18 -1
- package/dist/core/lifecycle.js.map +1 -1
- package/dist/core-config.d.ts +21 -0
- package/dist/core-config.d.ts.map +1 -1
- package/dist/core-config.js +22 -1
- package/dist/core-config.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/modules/access/access-control.interface.d.ts +17 -0
- package/dist/modules/access/access-control.interface.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.d.ts +2 -0
- package/dist/modules/access/access-control.service.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.js +27 -0
- package/dist/modules/access/access-control.service.js.map +1 -1
- package/dist/modules/access/directory-sync-bot.js +1 -1
- package/dist/modules/access/directory-sync-bot.js.map +1 -1
- package/dist/modules/agent-guide/agent-guide.d.ts +145 -0
- package/dist/modules/agent-guide/agent-guide.d.ts.map +1 -0
- package/dist/modules/agent-guide/agent-guide.js +199 -0
- package/dist/modules/agent-guide/agent-guide.js.map +1 -0
- package/dist/modules/agent-guide/agent-guide.tools.d.ts +24 -0
- package/dist/modules/agent-guide/agent-guide.tools.d.ts.map +1 -0
- package/dist/modules/agent-guide/agent-guide.tools.js +100 -0
- package/dist/modules/agent-guide/agent-guide.tools.js.map +1 -0
- package/dist/modules/agent-guide/index.d.ts +4 -0
- package/dist/modules/agent-guide/index.d.ts.map +1 -0
- package/dist/modules/agent-guide/index.js +4 -0
- package/dist/modules/agent-guide/index.js.map +1 -0
- package/dist/modules/agent-instructions/agent-instructions.routes.d.ts +3 -2
- package/dist/modules/agent-instructions/agent-instructions.routes.d.ts.map +1 -1
- package/dist/modules/agent-instructions/agent-instructions.routes.js +3 -2
- package/dist/modules/agent-instructions/agent-instructions.routes.js.map +1 -1
- package/dist/modules/agent-instructions/compose.d.ts +14 -6
- package/dist/modules/agent-instructions/compose.d.ts.map +1 -1
- package/dist/modules/agent-instructions/compose.js +28 -8
- package/dist/modules/agent-instructions/compose.js.map +1 -1
- package/dist/modules/agent-instructions/index.d.ts +1 -1
- package/dist/modules/agent-instructions/index.d.ts.map +1 -1
- package/dist/modules/agent-instructions/index.js +1 -1
- package/dist/modules/agent-instructions/index.js.map +1 -1
- package/dist/modules/agent-instructions/shared-file-rules.d.ts +10 -50
- package/dist/modules/agent-instructions/shared-file-rules.d.ts.map +1 -1
- package/dist/modules/agent-instructions/shared-file-rules.js +51 -104
- package/dist/modules/agent-instructions/shared-file-rules.js.map +1 -1
- package/dist/modules/audit/agent-audit.service.d.ts +21 -2
- package/dist/modules/audit/agent-audit.service.d.ts.map +1 -1
- package/dist/modules/audit/agent-audit.service.js +43 -2
- package/dist/modules/audit/agent-audit.service.js.map +1 -1
- package/dist/modules/audit/agent-connection.routes.d.ts +34 -0
- package/dist/modules/audit/agent-connection.routes.d.ts.map +1 -0
- package/dist/modules/audit/agent-connection.routes.js +38 -0
- package/dist/modules/audit/agent-connection.routes.js.map +1 -0
- package/dist/modules/audit/audit.contract.d.ts +24 -0
- package/dist/modules/audit/audit.contract.d.ts.map +1 -1
- package/dist/modules/audit/audit.contract.js.map +1 -1
- package/dist/modules/audit/index.d.ts +1 -0
- package/dist/modules/audit/index.d.ts.map +1 -1
- package/dist/modules/audit/index.js +1 -0
- package/dist/modules/audit/index.js.map +1 -1
- package/dist/modules/auth/account.routes.d.ts.map +1 -1
- package/dist/modules/auth/account.routes.js +10 -3
- package/dist/modules/auth/account.routes.js.map +1 -1
- package/dist/modules/auth/auth.middleware.d.ts +7 -0
- package/dist/modules/auth/auth.middleware.d.ts.map +1 -1
- package/dist/modules/auth/auth.middleware.js +1 -1
- package/dist/modules/auth/auth.middleware.js.map +1 -1
- package/dist/modules/code-mode/code-mode.tool.d.ts.map +1 -1
- package/dist/modules/code-mode/code-mode.tool.js +11 -3
- package/dist/modules/code-mode/code-mode.tool.js.map +1 -1
- package/dist/modules/database/core-schema.d.ts +96 -0
- package/dist/modules/database/core-schema.d.ts.map +1 -1
- package/dist/modules/database/core-schema.js +32 -3
- package/dist/modules/database/core-schema.js.map +1 -1
- package/dist/modules/embed/account-link.service.d.ts +42 -0
- package/dist/modules/embed/account-link.service.d.ts.map +1 -0
- package/dist/modules/embed/account-link.service.js +50 -0
- package/dist/modules/embed/account-link.service.js.map +1 -0
- package/dist/modules/embed/embed-link.d.ts +58 -0
- package/dist/modules/embed/embed-link.d.ts.map +1 -0
- package/dist/modules/embed/embed-link.js +160 -0
- package/dist/modules/embed/embed-link.js.map +1 -0
- package/dist/modules/embed/embed.errors.d.ts +30 -0
- package/dist/modules/embed/embed.errors.d.ts.map +1 -0
- package/dist/modules/embed/embed.errors.js +42 -0
- package/dist/modules/embed/embed.errors.js.map +1 -0
- package/dist/modules/embed/embed.interface.d.ts +204 -0
- package/dist/modules/embed/embed.interface.d.ts.map +1 -0
- package/dist/modules/embed/embed.interface.js +2 -0
- package/dist/modules/embed/embed.interface.js.map +1 -0
- package/dist/modules/embed/embed.routes.d.ts +59 -0
- package/dist/modules/embed/embed.routes.d.ts.map +1 -0
- package/dist/modules/embed/embed.routes.js +343 -0
- package/dist/modules/embed/embed.routes.js.map +1 -0
- package/dist/modules/embed/embed.service.d.ts +169 -0
- package/dist/modules/embed/embed.service.d.ts.map +1 -0
- package/dist/modules/embed/embed.service.js +627 -0
- package/dist/modules/embed/embed.service.js.map +1 -0
- package/dist/modules/embed/embed.tools.d.ts +51 -0
- package/dist/modules/embed/embed.tools.d.ts.map +1 -0
- package/dist/modules/embed/embed.tools.js +170 -0
- package/dist/modules/embed/embed.tools.js.map +1 -0
- package/dist/modules/embed/mcp-app.d.ts +64 -0
- package/dist/modules/embed/mcp-app.d.ts.map +1 -0
- package/dist/modules/embed/mcp-app.js +147 -0
- package/dist/modules/embed/mcp-app.js.map +1 -0
- package/dist/modules/embed/mcp-app.routes.d.ts +21 -0
- package/dist/modules/embed/mcp-app.routes.d.ts.map +1 -0
- package/dist/modules/embed/mcp-app.routes.js +36 -0
- package/dist/modules/embed/mcp-app.routes.js.map +1 -0
- package/dist/modules/github-app/github-app.connection.d.ts +15 -0
- package/dist/modules/github-app/github-app.connection.d.ts.map +1 -1
- package/dist/modules/github-app/github-app.connection.js +34 -3
- package/dist/modules/github-app/github-app.connection.js.map +1 -1
- package/dist/modules/kb-fs/locking-filesystem.d.ts +65 -0
- package/dist/modules/kb-fs/locking-filesystem.d.ts.map +1 -1
- package/dist/modules/kb-fs/locking-filesystem.js +300 -0
- package/dist/modules/kb-fs/locking-filesystem.js.map +1 -1
- package/dist/modules/kb-sync/kb-sync.interface.d.ts +5 -0
- package/dist/modules/kb-sync/kb-sync.interface.d.ts.map +1 -1
- package/dist/modules/kb-sync/kb-sync.service.d.ts.map +1 -1
- package/dist/modules/kb-sync/kb-sync.service.js +6 -0
- package/dist/modules/kb-sync/kb-sync.service.js.map +1 -1
- package/dist/modules/mcp/mcp-auth.middleware.d.ts.map +1 -1
- package/dist/modules/mcp/mcp-auth.middleware.js +2 -1
- package/dist/modules/mcp/mcp-auth.middleware.js.map +1 -1
- package/dist/modules/mcp/mcp.service.d.ts +57 -3
- package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
- package/dist/modules/mcp/mcp.service.js +177 -24
- package/dist/modules/mcp/mcp.service.js.map +1 -1
- package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts +24 -0
- package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts.map +1 -1
- package/dist/modules/mcp/oauth/bevel-oauth-provider.js +32 -4
- package/dist/modules/mcp/oauth/bevel-oauth-provider.js.map +1 -1
- package/dist/modules/mcp/tool-schema-guard.d.ts +105 -0
- package/dist/modules/mcp/tool-schema-guard.d.ts.map +1 -0
- package/dist/modules/mcp/tool-schema-guard.js +171 -0
- package/dist/modules/mcp/tool-schema-guard.js.map +1 -0
- package/dist/modules/onboarding/onboarding.contract.d.ts +80 -0
- package/dist/modules/onboarding/onboarding.contract.d.ts.map +1 -0
- package/dist/modules/onboarding/onboarding.contract.js +7 -0
- package/dist/modules/onboarding/onboarding.contract.js.map +1 -0
- package/dist/modules/onboarding/onboarding.routes.d.ts +18 -0
- package/dist/modules/onboarding/onboarding.routes.d.ts.map +1 -0
- package/dist/modules/onboarding/onboarding.routes.js +81 -0
- package/dist/modules/onboarding/onboarding.routes.js.map +1 -0
- package/dist/modules/onboarding/starter-pack.service.d.ts +213 -0
- package/dist/modules/onboarding/starter-pack.service.d.ts.map +1 -0
- package/dist/modules/onboarding/starter-pack.service.js +492 -0
- package/dist/modules/onboarding/starter-pack.service.js.map +1 -0
- package/dist/modules/onboarding/starter-packs.d.ts +78 -0
- package/dist/modules/onboarding/starter-packs.d.ts.map +1 -0
- package/dist/modules/onboarding/starter-packs.js +156 -0
- package/dist/modules/onboarding/starter-packs.js.map +1 -0
- package/dist/modules/plugins/index.d.ts +1 -1
- package/dist/modules/plugins/index.d.ts.map +1 -1
- package/dist/modules/plugins/index.js +1 -1
- package/dist/modules/plugins/index.js.map +1 -1
- package/dist/modules/plugins/plugin-provision.service.d.ts +19 -0
- package/dist/modules/plugins/plugin-provision.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-provision.service.js +18 -1
- package/dist/modules/plugins/plugin-provision.service.js.map +1 -1
- package/dist/modules/plugins/plugins.routes.d.ts +0 -36
- package/dist/modules/plugins/plugins.routes.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.routes.js +31 -0
- package/dist/modules/plugins/plugins.routes.js.map +1 -1
- package/dist/modules/plugins/plugins.tools.d.ts +36 -2
- package/dist/modules/plugins/plugins.tools.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.tools.js +71 -14
- package/dist/modules/plugins/plugins.tools.js.map +1 -1
- package/dist/modules/settings/deployment-settings.service.d.ts +34 -7
- package/dist/modules/settings/deployment-settings.service.d.ts.map +1 -1
- package/dist/modules/settings/deployment-settings.service.js +148 -54
- package/dist/modules/settings/deployment-settings.service.js.map +1 -1
- package/dist/modules/settings/repository-source.d.ts +1 -0
- package/dist/modules/settings/repository-source.d.ts.map +1 -1
- package/dist/modules/settings/repository-source.js +3 -3
- package/dist/modules/settings/repository-source.js.map +1 -1
- package/dist/modules/settings/setup.routes.d.ts.map +1 -1
- package/dist/modules/settings/setup.routes.js +3 -6
- package/dist/modules/settings/setup.routes.js.map +1 -1
- package/dist/modules/skills/skills.tools.d.ts.map +1 -1
- package/dist/modules/skills/skills.tools.js +103 -43
- package/dist/modules/skills/skills.tools.js.map +1 -1
- package/dist/modules/tool-auth/connection-key-rejection.d.ts +10 -1
- package/dist/modules/tool-auth/connection-key-rejection.d.ts.map +1 -1
- package/dist/modules/tool-auth/connection-key-rejection.js +11 -3
- package/dist/modules/tool-auth/connection-key-rejection.js.map +1 -1
- package/dist/modules/tool-auth/external-api-key.interface.d.ts +8 -0
- package/dist/modules/tool-auth/external-api-key.interface.d.ts.map +1 -1
- package/dist/modules/tool-auth/external-api-key.service.d.ts +24 -2
- package/dist/modules/tool-auth/external-api-key.service.d.ts.map +1 -1
- package/dist/modules/tool-auth/external-api-key.service.js +59 -2
- package/dist/modules/tool-auth/external-api-key.service.js.map +1 -1
- package/dist/modules/tool-auth/tool-auth.middleware.d.ts.map +1 -1
- package/dist/modules/tool-auth/tool-auth.middleware.js +9 -4
- package/dist/modules/tool-auth/tool-auth.middleware.js.map +1 -1
- package/dist/modules/tool-helpers/index.d.ts +28 -1
- package/dist/modules/tool-helpers/index.d.ts.map +1 -1
- package/dist/modules/tool-helpers/index.js +28 -1
- package/dist/modules/tool-helpers/index.js.map +1 -1
- package/dist/modules/tool-helpers/route-argument-check.d.ts +10 -0
- package/dist/modules/tool-helpers/route-argument-check.d.ts.map +1 -0
- package/dist/modules/tool-helpers/route-argument-check.js +132 -0
- package/dist/modules/tool-helpers/route-argument-check.js.map +1 -0
- package/dist/modules/tool-helpers/route-tool-schemas.d.ts +89 -0
- package/dist/modules/tool-helpers/route-tool-schemas.d.ts.map +1 -0
- package/dist/modules/tool-helpers/route-tool-schemas.js +113 -0
- package/dist/modules/tool-helpers/route-tool-schemas.js.map +1 -0
- package/dist/modules/tool-helpers/tool-def.d.ts +71 -0
- package/dist/modules/tool-helpers/tool-def.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool-def.js +70 -6
- package/dist/modules/tool-helpers/tool-def.js.map +1 -1
- package/dist/modules/tool-helpers/tool-handler.d.ts +46 -6
- package/dist/modules/tool-helpers/tool-handler.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool-handler.js +157 -8
- package/dist/modules/tool-helpers/tool-handler.js.map +1 -1
- package/dist/modules/tool-helpers/tool.contract.d.ts +9 -0
- package/dist/modules/tool-helpers/tool.contract.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool.contract.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.contract.d.ts +23 -4
- package/dist/modules/tool-manuals/tool-manuals.contract.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.contract.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts +4 -0
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.js +14 -0
- package/dist/modules/tool-manuals/tool-manuals.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts +7 -0
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.js +77 -38
- package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -1
- package/dist/modules/tool-registry/description-length.d.ts +20 -16
- package/dist/modules/tool-registry/description-length.d.ts.map +1 -1
- package/dist/modules/tool-registry/description-length.js +50 -30
- package/dist/modules/tool-registry/description-length.js.map +1 -1
- package/dist/modules/tool-registry/guide-first.d.ts +27 -0
- package/dist/modules/tool-registry/guide-first.d.ts.map +1 -0
- package/dist/modules/tool-registry/guide-first.js +40 -0
- package/dist/modules/tool-registry/guide-first.js.map +1 -0
- package/dist/modules/tool-registry/tool-registry.d.ts +6 -0
- package/dist/modules/tool-registry/tool-registry.d.ts.map +1 -1
- package/dist/modules/tool-registry/tool-registry.js +9 -2
- package/dist/modules/tool-registry/tool-registry.js.map +1 -1
- package/dist/modules/workflow/agent-tools/change-request-read-shape.d.ts +449 -0
- package/dist/modules/workflow/agent-tools/change-request-read-shape.d.ts.map +1 -0
- package/dist/modules/workflow/agent-tools/change-request-read-shape.js +481 -0
- package/dist/modules/workflow/agent-tools/change-request-read-shape.js.map +1 -0
- package/dist/modules/workflow/agent-tools/change-request-read.tools.d.ts +126 -0
- package/dist/modules/workflow/agent-tools/change-request-read.tools.d.ts.map +1 -0
- package/dist/modules/workflow/agent-tools/change-request-read.tools.js +611 -0
- package/dist/modules/workflow/agent-tools/change-request-read.tools.js.map +1 -0
- package/dist/modules/workflow/agent-tools/change-request-summary.d.ts +12 -1
- package/dist/modules/workflow/agent-tools/change-request-summary.d.ts.map +1 -1
- package/dist/modules/workflow/agent-tools/change-request-summary.js +5 -1
- package/dist/modules/workflow/agent-tools/change-request-summary.js.map +1 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.d.ts +8 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +1 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.js +133 -37
- package/dist/modules/workflow/agent-tools/workflow.tools.js.map +1 -1
- package/dist/modules/workflow/file-lock.service.d.ts +29 -5
- package/dist/modules/workflow/file-lock.service.d.ts.map +1 -1
- package/dist/modules/workflow/file-lock.service.js +62 -5
- package/dist/modules/workflow/file-lock.service.js.map +1 -1
- package/dist/modules/workflow/git/git.service.d.ts +282 -14
- package/dist/modules/workflow/git/git.service.d.ts.map +1 -1
- package/dist/modules/workflow/git/git.service.js +627 -126
- package/dist/modules/workflow/git/git.service.js.map +1 -1
- package/dist/modules/workflow/git/merge-commit.d.ts +73 -0
- package/dist/modules/workflow/git/merge-commit.d.ts.map +1 -0
- package/dist/modules/workflow/git/merge-commit.js +89 -0
- package/dist/modules/workflow/git/merge-commit.js.map +1 -0
- package/dist/modules/workflow/git/node-git-runner.d.ts +15 -0
- package/dist/modules/workflow/git/node-git-runner.d.ts.map +1 -1
- package/dist/modules/workflow/git/node-git-runner.js +78 -6
- package/dist/modules/workflow/git/node-git-runner.js.map +1 -1
- package/dist/modules/workflow/git/pull-request.service.d.ts +94 -1
- package/dist/modules/workflow/git/pull-request.service.d.ts.map +1 -1
- package/dist/modules/workflow/git/pull-request.service.js +332 -37
- package/dist/modules/workflow/git/pull-request.service.js.map +1 -1
- package/dist/modules/workflow/pending-commits.service.d.ts +15 -0
- package/dist/modules/workflow/pending-commits.service.d.ts.map +1 -1
- package/dist/modules/workflow/pending-commits.service.js +25 -1
- package/dist/modules/workflow/pending-commits.service.js.map +1 -1
- package/dist/modules/workflow/pending-commits.worker.d.ts +6 -1
- package/dist/modules/workflow/pending-commits.worker.d.ts.map +1 -1
- package/dist/modules/workflow/pending-commits.worker.js +23 -6
- package/dist/modules/workflow/pending-commits.worker.js.map +1 -1
- package/dist/modules/workflow/recovery-bot.js +1 -1
- package/dist/modules/workflow/recovery-bot.js.map +1 -1
- package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts +35 -0
- package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts.map +1 -1
- package/dist/modules/workflow/review-workflow/review-workflow.service.js +180 -13
- package/dist/modules/workflow/review-workflow/review-workflow.service.js.map +1 -1
- package/dist/modules/workflow/sanitize-error.d.ts +16 -0
- package/dist/modules/workflow/sanitize-error.d.ts.map +1 -1
- package/dist/modules/workflow/sanitize-error.js +45 -0
- package/dist/modules/workflow/sanitize-error.js.map +1 -1
- package/dist/modules/workflow/workflow.routes.d.ts +6 -2
- package/dist/modules/workflow/workflow.routes.d.ts.map +1 -1
- package/dist/modules/workflow/workflow.routes.js +7 -2
- package/dist/modules/workflow/workflow.routes.js.map +1 -1
- package/dist/modules/workflow/workflow.service.d.ts +187 -15
- package/dist/modules/workflow/workflow.service.d.ts.map +1 -1
- package/dist/modules/workflow/workflow.service.js +808 -106
- package/dist/modules/workflow/workflow.service.js.map +1 -1
- package/dist/modules/workspace/agent-download.builder.d.ts +105 -0
- package/dist/modules/workspace/agent-download.builder.d.ts.map +1 -0
- package/dist/modules/workspace/agent-download.builder.js +238 -0
- package/dist/modules/workspace/agent-download.builder.js.map +1 -0
- package/dist/modules/workspace/agent-download.routes.d.ts +77 -0
- package/dist/modules/workspace/agent-download.routes.d.ts.map +1 -0
- package/dist/modules/workspace/agent-download.routes.js +156 -0
- package/dist/modules/workspace/agent-download.routes.js.map +1 -0
- package/dist/modules/workspace/agent-download.store.d.ts +225 -0
- package/dist/modules/workspace/agent-download.store.d.ts.map +1 -0
- package/dist/modules/workspace/agent-download.store.js +423 -0
- package/dist/modules/workspace/agent-download.store.js.map +1 -0
- package/dist/modules/workspace/agent-upload.store.d.ts +10 -1
- package/dist/modules/workspace/agent-upload.store.d.ts.map +1 -1
- package/dist/modules/workspace/agent-upload.store.js +16 -6
- package/dist/modules/workspace/agent-upload.store.js.map +1 -1
- package/dist/modules/workspace/file-readers/raw-mime.d.ts +6 -0
- package/dist/modules/workspace/file-readers/raw-mime.d.ts.map +1 -0
- package/dist/modules/workspace/file-readers/raw-mime.js +38 -0
- package/dist/modules/workspace/file-readers/raw-mime.js.map +1 -0
- package/dist/modules/workspace/file-readers/text-reader.d.ts +5 -5
- package/dist/modules/workspace/file-readers/text-reader.d.ts.map +1 -1
- package/dist/modules/workspace/file-readers/text-reader.js +5 -8
- package/dist/modules/workspace/file-readers/text-reader.js.map +1 -1
- package/dist/modules/workspace/first-run.d.ts +111 -0
- package/dist/modules/workspace/first-run.d.ts.map +1 -0
- package/dist/modules/workspace/first-run.js +181 -0
- package/dist/modules/workspace/first-run.js.map +1 -0
- package/dist/modules/workspace/move-links.d.ts +92 -0
- package/dist/modules/workspace/move-links.d.ts.map +1 -0
- package/dist/modules/workspace/move-links.js +173 -0
- package/dist/modules/workspace/move-links.js.map +1 -0
- package/dist/modules/workspace/startup/steps/seed-tree.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/seed-tree.js +24 -39
- package/dist/modules/workspace/startup/steps/seed-tree.js.map +1 -1
- package/dist/modules/workspace/startup/steps/template-files.step.d.ts +58 -52
- package/dist/modules/workspace/startup/steps/template-files.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/template-files.step.js +209 -223
- package/dist/modules/workspace/startup/steps/template-files.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/template-source.d.ts +5 -3
- package/dist/modules/workspace/startup/steps/template-source.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/template-source.js +5 -3
- package/dist/modules/workspace/startup/steps/template-source.js.map +1 -1
- package/dist/modules/workspace/workspace.routes.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.routes.js +63 -22
- package/dist/modules/workspace/workspace.routes.js.map +1 -1
- package/dist/modules/workspace/workspace.service.d.ts +75 -2
- package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.service.js +197 -24
- package/dist/modules/workspace/workspace.service.js.map +1 -1
- package/dist/modules/workspace/workspace.tools.d.ts +68 -1
- package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.tools.js +642 -71
- package/dist/modules/workspace/workspace.tools.js.map +1 -1
- package/dist/modules/write-access/write-access.d.ts.map +1 -1
- package/dist/modules/write-access/write-access.js +9 -0
- package/dist/modules/write-access/write-access.js.map +1 -1
- package/dist/shared/domain-errors.d.ts +84 -1
- package/dist/shared/domain-errors.d.ts.map +1 -1
- package/dist/shared/domain-errors.js +100 -12
- package/dist/shared/domain-errors.js.map +1 -1
- package/dist/shared/git.contract.d.ts +10 -1
- package/dist/shared/git.contract.d.ts.map +1 -1
- package/dist/shared/git.contract.js.map +1 -1
- package/dist/shared/hidden-tools.d.ts +44 -0
- package/dist/shared/hidden-tools.d.ts.map +1 -0
- package/dist/shared/hidden-tools.js +13 -0
- package/dist/shared/hidden-tools.js.map +1 -0
- package/dist/shared/utf8-text.d.ts +15 -0
- package/dist/shared/utf8-text.d.ts.map +1 -0
- package/dist/shared/utf8-text.js +20 -0
- package/dist/shared/utf8-text.js.map +1 -0
- package/dist/tenancy/static-tenant-source.d.ts +2 -1
- package/dist/tenancy/static-tenant-source.d.ts.map +1 -1
- package/dist/tenancy/static-tenant-source.js +9 -2
- package/dist/tenancy/static-tenant-source.js.map +1 -1
- package/kb-template/.bevelignore +0 -5
- package/mcp-app/page.html +349 -0
- package/migrations/0017_atlassian_account_links.sql +37 -0
- package/migrations/meta/0017_snapshot.json +2396 -0
- package/migrations/meta/_journal.json +8 -1
- package/package.json +6 -3
- package/src/__tests__/kb-layout-config.test.ts +10 -100
- package/src/__tests__/packaged-assets-ship.test.ts +66 -0
- package/src/assets.ts +38 -2
- package/src/core/__tests__/catalog-revision.test.ts +40 -0
- package/src/core/__tests__/gated-boot.test.ts +1 -0
- package/src/core/__tests__/lifecycle.test.ts +14 -0
- package/src/core/catalog-revision.ts +15 -2
- package/src/core/core-ports.ts +11 -0
- package/src/core/create-core-server.ts +78 -3
- package/src/core/create-core-services.ts +168 -10
- package/src/core/lifecycle.ts +28 -2
- package/src/core-config.ts +24 -1
- package/src/index.ts +2 -2
- package/src/modules/access/__tests__/access-control.atref-batch.test.ts +58 -0
- package/src/modules/access/__tests__/access-control.platform-restore.test.ts +8 -7
- package/src/modules/access/__tests__/access-control.service.test.ts +19 -0
- package/src/modules/access/__tests__/access-personal-plugin.test.ts +1 -18
- package/src/modules/access/access-control.interface.ts +28 -0
- package/src/modules/access/access-control.service.ts +37 -0
- package/src/modules/access/directory-sync-bot.ts +1 -1
- package/src/modules/agent-guide/__tests__/agent-guide.test.ts +386 -0
- package/src/modules/agent-guide/__tests__/agent-guide.tools.test.ts +207 -0
- package/src/modules/agent-guide/agent-guide.tools.ts +122 -0
- package/src/modules/agent-guide/agent-guide.ts +300 -0
- package/src/modules/agent-guide/index.ts +22 -0
- package/src/modules/agent-instructions/__tests__/shared-file-rules.test.ts +39 -118
- package/src/modules/agent-instructions/agent-instructions.routes.ts +3 -2
- package/src/modules/agent-instructions/compose.ts +26 -8
- package/src/modules/agent-instructions/index.ts +0 -3
- package/src/modules/agent-instructions/shared-file-rules.ts +50 -112
- package/src/modules/audit/__tests__/agent-audit.service.test.ts +64 -4
- package/src/modules/audit/__tests__/agent-connection.routes.test.ts +102 -0
- package/src/modules/audit/agent-audit.service.ts +58 -3
- package/src/modules/audit/agent-connection.routes.ts +56 -0
- package/src/modules/audit/audit.contract.ts +26 -0
- package/src/modules/audit/index.ts +1 -0
- package/src/modules/auth/__tests__/account.routes.test.ts +5 -3
- package/src/modules/auth/account.routes.ts +10 -3
- package/src/modules/auth/auth.middleware.ts +1 -1
- package/src/modules/code-mode/__tests__/code-mode.tool.test.ts +18 -2
- package/src/modules/code-mode/code-mode.tool.ts +13 -2
- package/src/modules/database/core-schema.ts +33 -3
- package/src/modules/embed/__tests__/account-links.migration.test.ts +98 -0
- package/src/modules/embed/__tests__/embed-link.test.ts +122 -0
- package/src/modules/embed/__tests__/embed.routes.test.ts +362 -0
- package/src/modules/embed/__tests__/embed.service.lock.test.ts +193 -0
- package/src/modules/embed/__tests__/embed.service.test.ts +805 -0
- package/src/modules/embed/__tests__/embed.tools.test.ts +304 -0
- package/src/modules/embed/__tests__/mcp-app.test.ts +207 -0
- package/src/modules/embed/account-link.service.ts +76 -0
- package/src/modules/embed/embed-link.ts +180 -0
- package/src/modules/embed/embed.errors.ts +43 -0
- package/src/modules/embed/embed.interface.ts +203 -0
- package/src/modules/embed/embed.routes.ts +363 -0
- package/src/modules/embed/embed.service.ts +705 -0
- package/src/modules/embed/embed.tools.ts +206 -0
- package/src/modules/embed/mcp-app.routes.ts +41 -0
- package/src/modules/embed/mcp-app.ts +173 -0
- package/src/modules/github-app/__tests__/github-app.test.ts +76 -0
- package/src/modules/github-app/github-app.connection.ts +38 -4
- package/src/modules/kb-fs/__tests__/move-with-edits.test.ts +304 -0
- package/src/modules/kb-fs/locking-filesystem.ts +287 -0
- package/src/modules/kb-sync/__tests__/kb-sync.service.test.ts +35 -0
- package/src/modules/kb-sync/kb-sync.interface.ts +2 -0
- package/src/modules/kb-sync/kb-sync.service.ts +6 -0
- package/src/modules/mcp/__tests__/bevel-oauth-provider.test.ts +68 -11
- package/src/modules/mcp/__tests__/fake-downstream-mcp-server.ts +14 -3
- package/src/modules/mcp/__tests__/mcp-proxy-helpers.test.ts +37 -2
- package/src/modules/mcp/__tests__/mcp.app.e2e.test.ts +200 -0
- package/src/modules/mcp/__tests__/mcp.e2e.test.ts +252 -0
- package/src/modules/mcp/__tests__/mcp.service.test.ts +42 -24
- package/src/modules/mcp/__tests__/tool-call-interface.e2e.test.ts +499 -0
- package/src/modules/mcp/__tests__/tool-schema-guard.test.ts +266 -0
- package/src/modules/mcp/mcp-auth.middleware.ts +2 -1
- package/src/modules/mcp/mcp.service.ts +218 -31
- package/src/modules/mcp/oauth/bevel-oauth-provider.ts +42 -4
- package/src/modules/mcp/tool-schema-guard.ts +196 -0
- package/src/modules/onboarding/__tests__/onboarding.routes.test.ts +163 -0
- package/src/modules/onboarding/__tests__/starter-pack.service.test.ts +635 -0
- package/src/modules/onboarding/__tests__/starter-packs.test.ts +169 -0
- package/src/modules/onboarding/onboarding.contract.ts +85 -0
- package/src/modules/onboarding/onboarding.routes.ts +85 -0
- package/src/modules/onboarding/starter-pack.service.ts +580 -0
- package/src/modules/onboarding/starter-packs.ts +182 -0
- package/src/modules/plugins/__tests__/plugins.tools.test.ts +177 -4
- package/src/modules/plugins/index.ts +1 -0
- package/src/modules/plugins/plugin-provision.service.ts +22 -1
- package/src/modules/plugins/plugins.routes.ts +29 -0
- package/src/modules/plugins/plugins.tools.ts +75 -15
- package/src/modules/settings/__tests__/deployment-settings.service.test.ts +176 -56
- package/src/modules/settings/__tests__/repository-source.test.ts +9 -0
- package/src/modules/settings/deployment-settings.service.ts +144 -55
- package/src/modules/settings/repository-source.ts +4 -4
- package/src/modules/settings/setup.routes.ts +3 -6
- package/src/modules/skills/__tests__/skills.tools.description.test.ts +95 -0
- package/src/modules/skills/skills.tools.ts +112 -46
- package/src/modules/tool-auth/__tests__/connection-key-rejection.test.ts +32 -0
- package/src/modules/tool-auth/__tests__/external-api-key.service.test.ts +65 -0
- package/src/modules/tool-auth/connection-key-rejection.ts +13 -3
- package/src/modules/tool-auth/external-api-key.interface.ts +9 -0
- package/src/modules/tool-auth/external-api-key.service.ts +61 -4
- package/src/modules/tool-auth/tool-auth.middleware.ts +13 -4
- package/src/modules/tool-helpers/__tests__/branch-declaration.test.ts +502 -0
- package/src/modules/tool-helpers/__tests__/route-argument-check.test.ts +337 -0
- package/src/modules/tool-helpers/index.ts +34 -1
- package/src/modules/tool-helpers/route-argument-check.ts +149 -0
- package/src/modules/tool-helpers/route-tool-schemas.ts +171 -0
- package/src/modules/tool-helpers/tool-def.ts +132 -7
- package/src/modules/tool-helpers/tool-handler.ts +196 -8
- package/src/modules/tool-helpers/tool.contract.ts +9 -0
- package/src/modules/tool-manuals/__tests__/tool-manuals.detail.route.test.ts +57 -0
- package/src/modules/tool-manuals/__tests__/tool-manuals.tools.test.ts +73 -4
- package/src/modules/tool-manuals/tool-manuals.contract.ts +24 -4
- package/src/modules/tool-manuals/tool-manuals.service.ts +17 -0
- package/src/modules/tool-manuals/tool-manuals.tools.ts +86 -38
- package/src/modules/tool-registry/__tests__/own-tool-schemas.test.ts +173 -0
- package/src/modules/tool-registry/__tests__/tool-description-length.test.ts +81 -66
- package/src/modules/tool-registry/description-length.ts +57 -32
- package/src/modules/tool-registry/guide-first.ts +41 -0
- package/src/modules/tool-registry/tool-registry.ts +9 -2
- package/src/modules/workflow/__tests__/apply-failure.test.ts +6 -1
- package/src/modules/workflow/__tests__/file-lock.service.deletion-gate.test.ts +104 -0
- package/src/modules/workflow/__tests__/pending-commits.repository-replaced.test.ts +66 -0
- package/src/modules/workflow/__tests__/pending-commits.worker.test.ts +31 -2
- package/src/modules/workflow/__tests__/preserve-roles-yaml.test.ts +110 -6
- package/src/modules/workflow/__tests__/sanitize-error.test.ts +89 -1
- package/src/modules/workflow/__tests__/workflow.routes.push-refused.test.ts +202 -0
- package/src/modules/workflow/__tests__/workflow.service.branch-in-use.test.ts +6 -6
- package/src/modules/workflow/__tests__/workflow.service.delete-branch.test.ts +1026 -0
- package/src/modules/workflow/__tests__/workflow.service.facade.test.ts +468 -10
- package/src/modules/workflow/__tests__/workflow.service.folder-proposals.test.ts +4 -0
- package/src/modules/workflow/__tests__/workflow.service.releaseLock.test.ts +5 -4
- package/src/modules/workflow/__tests__/workflow.service.update-from-target.test.ts +54 -2
- package/src/modules/workflow/agent-tools/__tests__/change-request-read-shape.test.ts +705 -0
- package/src/modules/workflow/agent-tools/__tests__/change-request-read.tools.test.ts +1554 -0
- package/src/modules/workflow/agent-tools/__tests__/workflow.tools.test.ts +150 -4
- package/src/modules/workflow/agent-tools/change-request-read-shape.ts +712 -0
- package/src/modules/workflow/agent-tools/change-request-read.tools.ts +759 -0
- package/src/modules/workflow/agent-tools/change-request-summary.ts +5 -1
- package/src/modules/workflow/agent-tools/workflow.tools.ts +137 -35
- package/src/modules/workflow/file-lock.service.ts +67 -5
- package/src/modules/workflow/git/__tests__/git.service.appliedChange.test.ts +285 -0
- package/src/modules/workflow/git/__tests__/git.service.changedFilesForPr.test.ts +124 -0
- package/src/modules/workflow/git/__tests__/git.service.deleteBranch.test.ts +164 -0
- package/src/modules/workflow/git/__tests__/git.service.mergeChangeRequest.test.ts +334 -0
- package/src/modules/workflow/git/__tests__/git.service.pull.test.ts +48 -1
- package/src/modules/workflow/git/__tests__/node-git-runner.test.ts +231 -2
- package/src/modules/workflow/git/__tests__/pull-request.service.list-fetch.test.ts +72 -2
- package/src/modules/workflow/git/__tests__/pull-request.service.placeholder.test.ts +24 -2
- package/src/modules/workflow/git/__tests__/pull-request.service.test.ts +620 -1
- package/src/modules/workflow/git/git.service.ts +714 -133
- package/src/modules/workflow/git/merge-commit.ts +88 -0
- package/src/modules/workflow/git/node-git-runner.ts +82 -7
- package/src/modules/workflow/git/pull-request.service.ts +380 -54
- package/src/modules/workflow/pending-commits.service.ts +29 -1
- package/src/modules/workflow/pending-commits.worker.ts +24 -6
- package/src/modules/workflow/recovery-bot.ts +1 -1
- package/src/modules/workflow/review-workflow/__tests__/approval-states.test.ts +7 -1
- package/src/modules/workflow/review-workflow/__tests__/merge-records-own-commit.test.ts +407 -0
- package/src/modules/workflow/review-workflow/review-workflow.service.ts +191 -12
- package/src/modules/workflow/sanitize-error.ts +50 -0
- package/src/modules/workflow/workflow.routes.ts +7 -2
- package/src/modules/workflow/workflow.service.ts +886 -112
- package/src/modules/workspace/__tests__/agent-downloads.test.ts +823 -0
- package/src/modules/workspace/__tests__/escape-sequences.routes.test.ts +4 -3
- package/src/modules/workspace/__tests__/first-run.test.ts +234 -0
- package/src/modules/workspace/__tests__/git-internals.security.test.ts +5 -2
- package/src/modules/workspace/__tests__/md-links.test.ts +353 -0
- package/src/modules/workspace/__tests__/move-links.test.ts +261 -0
- package/src/modules/workspace/__tests__/rest-tool-arguments.test.ts +219 -0
- package/src/modules/workspace/__tests__/workspace-paths-inside-the-repo.test.ts +3 -0
- package/src/modules/workspace/__tests__/workspace.routes.delete.test.ts +102 -0
- package/src/modules/workspace/__tests__/workspace.routes.download.test.ts +52 -5
- package/src/modules/workspace/__tests__/workspace.routes.folder-zip-access.test.ts +190 -0
- package/src/modules/workspace/__tests__/workspace.routes.move-platform-files.test.ts +21 -10
- package/src/modules/workspace/__tests__/workspace.service.forget-clone-races.test.ts +8 -4
- package/src/modules/workspace/__tests__/workspace.service.test.ts +50 -8
- package/src/modules/workspace/__tests__/workspace.tools.agents-file.test.ts +33 -55
- package/src/modules/workspace/__tests__/workspace.tools.branch-errors.test.ts +44 -1
- package/src/modules/workspace/__tests__/workspace.tools.test.ts +664 -34
- package/src/modules/workspace/agent-download.builder.ts +308 -0
- package/src/modules/workspace/agent-download.routes.ts +183 -0
- package/src/modules/workspace/agent-download.store.ts +533 -0
- package/src/modules/workspace/agent-upload.store.ts +23 -7
- package/src/modules/workspace/file-readers/raw-mime.ts +40 -0
- package/src/modules/workspace/file-readers/text-reader.ts +5 -8
- package/src/modules/workspace/first-run.ts +222 -0
- package/src/modules/workspace/move-links.ts +237 -0
- package/src/modules/workspace/startup/steps/__tests__/steps.test.ts +191 -489
- package/src/modules/workspace/startup/steps/seed-tree.ts +23 -38
- package/src/modules/workspace/startup/steps/template-files.step.ts +217 -249
- package/src/modules/workspace/startup/steps/template-source.ts +5 -3
- package/src/modules/workspace/workspace.routes.ts +64 -22
- package/src/modules/workspace/workspace.service.ts +202 -25
- package/src/modules/workspace/workspace.tools.ts +707 -68
- package/src/modules/write-access/__tests__/write-access.test.ts +13 -0
- package/src/modules/write-access/write-access.ts +9 -0
- package/src/shared/domain-errors.ts +123 -11
- package/src/shared/git.contract.ts +8 -1
- package/src/shared/hidden-tools.ts +45 -0
- package/src/shared/utf8-text.ts +21 -0
- package/src/tenancy/__tests__/static-tenant-source.test.ts +1 -0
- package/src/tenancy/static-tenant-source.ts +10 -2
- package/starter-packs/README.md +103 -0
- package/starter-packs/engineering/KnowledgeBase/About us.md +9 -0
- package/starter-packs/engineering/KnowledgeBase/Architecture.md +9 -0
- package/starter-packs/engineering/KnowledgeBase/Glossary.md +9 -0
- package/starter-packs/engineering/KnowledgeBase/How we ship.md +9 -0
- package/starter-packs/engineering/Plugins/engineering-starter/LICENSE +21 -0
- package/starter-packs/engineering/Plugins/engineering-starter/SOURCE.md +20 -0
- package/starter-packs/engineering/Plugins/engineering-starter/access.md +19 -0
- package/starter-packs/engineering/Plugins/engineering-starter/plugin.json +10 -0
- package/starter-packs/engineering/Plugins/engineering-starter/skills/office-hours/SKILL.md +171 -0
- package/starter-packs/engineering/Plugins/engineering-starter/skills/office-hours/sections/phase-2a-startup-diagnostic.md +157 -0
- package/starter-packs/engineering/Plugins/engineering-starter/skills/office-hours/sections/phase-2b-builder-brainstorm.md +39 -0
- package/starter-packs/engineering/Plugins/engineering-starter/skills/plan-ceo-review/SKILL.md +144 -0
- package/starter-packs/engineering/Plugins/engineering-starter/skills/plan-eng-review/SKILL.md +144 -0
- package/starter-packs/engineering/Plugins/engineering-starter/skills/review/SKILL.md +80 -0
- package/starter-packs/engineering/Plugins/engineering-starter/skills/review/checklist.md +184 -0
- package/starter-packs/engineering/pack.yaml +11 -0
- package/starter-packs/general/KnowledgeBase/About us.md +9 -0
- package/starter-packs/general/KnowledgeBase/Glossary.md +9 -0
- package/starter-packs/general/KnowledgeBase/How we work.md +9 -0
- package/starter-packs/general/Plugins/general-starter/LICENSE +202 -0
- package/starter-packs/general/Plugins/general-starter/SOURCE.md +10 -0
- package/starter-packs/general/Plugins/general-starter/access.md +19 -0
- package/starter-packs/general/Plugins/general-starter/plugin.json +10 -0
- package/starter-packs/general/Plugins/general-starter/skills/memory-management/SKILL.md +332 -0
- package/starter-packs/general/Plugins/general-starter/skills/productivity-start/SKILL.md +163 -0
- package/starter-packs/general/Plugins/general-starter/skills/productivity-update/SKILL.md +167 -0
- package/starter-packs/general/Plugins/general-starter/skills/task-management/SKILL.md +83 -0
- package/starter-packs/general/pack.yaml +10 -0
- package/starter-packs/operations/KnowledgeBase/Glossary.md +9 -0
- package/starter-packs/operations/KnowledgeBase/How we work.md +9 -0
- package/starter-packs/operations/KnowledgeBase/Processes.md +9 -0
- package/starter-packs/operations/KnowledgeBase/Tools we use.md +9 -0
- package/starter-packs/operations/KnowledgeBase/Vendors.md +9 -0
- package/starter-packs/operations/Plugins/operations-starter/LICENSE +202 -0
- package/starter-packs/operations/Plugins/operations-starter/SOURCE.md +10 -0
- package/starter-packs/operations/Plugins/operations-starter/access.md +19 -0
- package/starter-packs/operations/Plugins/operations-starter/plugin.json +10 -0
- package/starter-packs/operations/Plugins/operations-starter/skills/capacity-plan/SKILL.md +111 -0
- package/starter-packs/operations/Plugins/operations-starter/skills/change-request/SKILL.md +119 -0
- package/starter-packs/operations/Plugins/operations-starter/skills/compliance-tracking/SKILL.md +44 -0
- package/starter-packs/operations/Plugins/operations-starter/skills/process-doc/SKILL.md +80 -0
- package/starter-packs/operations/Plugins/operations-starter/skills/process-optimization/SKILL.md +39 -0
- package/starter-packs/operations/Plugins/operations-starter/skills/risk-assessment/SKILL.md +40 -0
- package/starter-packs/operations/Plugins/operations-starter/skills/runbook/SKILL.md +85 -0
- package/starter-packs/operations/Plugins/operations-starter/skills/status-report/SKILL.md +75 -0
- package/starter-packs/operations/Plugins/operations-starter/skills/vendor-review/SKILL.md +102 -0
- package/starter-packs/operations/pack.yaml +12 -0
- package/starter-packs/sales/KnowledgeBase/About us.md +9 -0
- package/starter-packs/sales/KnowledgeBase/Customers.md +9 -0
- package/starter-packs/sales/KnowledgeBase/Glossary.md +9 -0
- package/starter-packs/sales/KnowledgeBase/How we sell.md +9 -0
- package/starter-packs/sales/KnowledgeBase/Objections.md +9 -0
- package/starter-packs/sales/KnowledgeBase/Pricing.md +9 -0
- package/starter-packs/sales/Plugins/sales-starter/LICENSE +202 -0
- package/starter-packs/sales/Plugins/sales-starter/SOURCE.md +10 -0
- package/starter-packs/sales/Plugins/sales-starter/access.md +19 -0
- package/starter-packs/sales/Plugins/sales-starter/plugin.json +10 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/account-context/SKILL.md +94 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/account-plan/SKILL.md +95 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/account-research/SKILL.md +99 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/account-tiering/SKILL.md +101 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/call-prep/SKILL.md +111 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/call-summary/SKILL.md +111 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/close-plan/SKILL.md +106 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/competitive-intelligence/SKILL.md +102 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/create-an-asset/SKILL.md +105 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/crm-hygiene-check/SKILL.md +103 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/customer-health/SKILL.md +108 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/customer-voice/SKILL.md +94 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/daily-briefing/SKILL.md +61 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/deal-advance-gap/SKILL.md +102 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/deal-review/SKILL.md +105 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/deal-signals/SKILL.md +96 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/deal-slip-scenario/SKILL.md +104 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/draft-outreach/SKILL.md +116 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/end-of-day/SKILL.md +114 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/expansion-whitespace/SKILL.md +97 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/forecast/SKILL.md +100 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/handle-objection/SKILL.md +93 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/inbox-sweep/SKILL.md +114 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/lead-triage/SKILL.md +106 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/log-activity/SKILL.md +111 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/pipeline-review/SKILL.md +97 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/renewal-radar/SKILL.md +95 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/rep-context/SKILL.md +90 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/route-lead/SKILL.md +111 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/sales-setup/SKILL.md +200 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/schedule-meeting/SKILL.md +99 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/stakeholder-map/SKILL.md +107 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/team-pipeline/SKILL.md +105 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/update-opportunity/SKILL.md +112 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/weekly-wrap/SKILL.md +90 -0
- package/starter-packs/sales/Plugins/sales-starter/skills/win-loss-review/SKILL.md +88 -0
- package/starter-packs/sales/pack.yaml +13 -0
- package/starter-packs/support/KnowledgeBase/Escalations.md +9 -0
- package/starter-packs/support/KnowledgeBase/Glossary.md +9 -0
- package/starter-packs/support/KnowledgeBase/Known issues.md +9 -0
- package/starter-packs/support/KnowledgeBase/Products.md +9 -0
- package/starter-packs/support/KnowledgeBase/Tone of voice.md +9 -0
- package/starter-packs/support/Plugins/support-starter/LICENSE +202 -0
- package/starter-packs/support/Plugins/support-starter/SOURCE.md +10 -0
- package/starter-packs/support/Plugins/support-starter/access.md +19 -0
- package/starter-packs/support/Plugins/support-starter/plugin.json +10 -0
- package/starter-packs/support/Plugins/support-starter/skills/customer-escalation/SKILL.md +246 -0
- package/starter-packs/support/Plugins/support-starter/skills/customer-research/SKILL.md +250 -0
- package/starter-packs/support/Plugins/support-starter/skills/draft-response/SKILL.md +416 -0
- package/starter-packs/support/Plugins/support-starter/skills/kb-article/SKILL.md +350 -0
- package/starter-packs/support/Plugins/support-starter/skills/ticket-triage/SKILL.md +273 -0
- package/starter-packs/support/pack.yaml +12 -0
- package/kb-template/AGENTS.md +0 -730
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import type { Server } from 'node:http';
|
|
2
|
+
import type { AddressInfo } from 'node:net';
|
|
3
|
+
import express from 'express';
|
|
4
|
+
import { afterEach, describe, expect, it } from 'vitest';
|
|
5
|
+
import { ToolRegistry } from '../../tool-registry/tool-registry.js';
|
|
6
|
+
import { GUIDE_FIRST_SENTENCE } from '../../tool-registry/guide-first.js';
|
|
7
|
+
import { TOOL_DESCRIPTION_CAP } from '../../tool-registry/description-length.js';
|
|
8
|
+
import { createToolHandlerFactory } from '../../tool-helpers/tool-handler.js';
|
|
9
|
+
import type { ToolContext } from '../../tool-helpers/tool.contract.js';
|
|
10
|
+
import { toolDef } from '../../tool-helpers/tool-def.js';
|
|
11
|
+
import { GET_AGENT_GUIDE_TOOL, registerAgentGuideTool } from '../agent-guide.tools.js';
|
|
12
|
+
import { DEFAULT_KB_LAYOUT } from '@bevel-software/platform-shared';
|
|
13
|
+
import { agentGuideSections, joinGuideSections, type RenderedGuideSection } from '../agent-guide.js';
|
|
14
|
+
|
|
15
|
+
let server: Server | null = null;
|
|
16
|
+
|
|
17
|
+
afterEach(async () => {
|
|
18
|
+
if (server) await new Promise<void>((resolve) => server!.close(() => resolve()));
|
|
19
|
+
server = null;
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
const SECTIONS: RenderedGuideSection[] = [
|
|
23
|
+
{ id: 'introduction', title: 'Knowledge base', body: '# Knowledge base\n\nRead me.' },
|
|
24
|
+
{ id: 'access-control', title: 'Access control', body: '## Access control\n\nWho may do what.' },
|
|
25
|
+
{ id: 'knowledge-graph', title: 'Knowledge graph', body: '## Knowledge graph\n\nA distribution added this one.' },
|
|
26
|
+
];
|
|
27
|
+
|
|
28
|
+
describe('get_agent_guide', () => {
|
|
29
|
+
async function serve() {
|
|
30
|
+
const registry = new ToolRegistry();
|
|
31
|
+
const router = express.Router();
|
|
32
|
+
// Stands in for the connection-key auth: the caller is a signed-in reader.
|
|
33
|
+
const auth = (req: express.Request, _res: express.Response, next: express.NextFunction) => {
|
|
34
|
+
req.toolAuth = { source: 'internal', userId: 'u', scope: 'read' };
|
|
35
|
+
next();
|
|
36
|
+
};
|
|
37
|
+
const resolve = async (): Promise<ToolContext> =>
|
|
38
|
+
({
|
|
39
|
+
user: { id: 'u', email: 'a@x.io', name: 'A' },
|
|
40
|
+
scope: 'read',
|
|
41
|
+
source: 'internal',
|
|
42
|
+
abortSignal: new AbortController().signal,
|
|
43
|
+
workspaceService: {} as never,
|
|
44
|
+
workflowService: {} as never,
|
|
45
|
+
events: {} as never,
|
|
46
|
+
getFilesystem: async () => {
|
|
47
|
+
throw new Error('the guide reads no file');
|
|
48
|
+
},
|
|
49
|
+
}) as unknown as ToolContext;
|
|
50
|
+
let reads = 0;
|
|
51
|
+
let current: RenderedGuideSection[] = SECTIONS;
|
|
52
|
+
registerAgentGuideTool(registry, router, auth, createToolHandlerFactory(resolve), async () => {
|
|
53
|
+
reads += 1;
|
|
54
|
+
return current;
|
|
55
|
+
});
|
|
56
|
+
const sectionsNow = (sections: RenderedGuideSection[]) => {
|
|
57
|
+
current = sections;
|
|
58
|
+
};
|
|
59
|
+
// Another tool beside it, to see what the catalog does to each.
|
|
60
|
+
registry.registerExternalTool(
|
|
61
|
+
toolDef({ name: 'read_file', description: 'Read a file.', path: '/api/agent/tools/read_file', inputs: { type: 'object', properties: {} }, tags: [] }),
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
const web = express();
|
|
65
|
+
web.use(express.json());
|
|
66
|
+
web.use('/api', router);
|
|
67
|
+
server = await new Promise<Server>((resolve) => {
|
|
68
|
+
const s = web.listen(0, '127.0.0.1', () => resolve(s));
|
|
69
|
+
});
|
|
70
|
+
const port = (server.address() as AddressInfo).port;
|
|
71
|
+
const call = async (body: Record<string, unknown> = {}) => {
|
|
72
|
+
const res = await fetch(`http://127.0.0.1:${port}/api/agent/tools/${GET_AGENT_GUIDE_TOOL}`, {
|
|
73
|
+
method: 'POST',
|
|
74
|
+
headers: { 'content-type': 'application/json', authorization: 'Bearer x' },
|
|
75
|
+
body: JSON.stringify(body),
|
|
76
|
+
});
|
|
77
|
+
return { status: res.status, body: (await res.json()) as Record<string, unknown> };
|
|
78
|
+
};
|
|
79
|
+
return { registry, call, reads: () => reads, sectionsNow };
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
it('is on both surfaces, says to call it first, and lists the sections the guide has now', async () => {
|
|
83
|
+
const { registry } = await serve();
|
|
84
|
+
for (const list of [registry.listExternal(), registry.listInternal()]) {
|
|
85
|
+
const def = (await list).find((t) => t.name === GET_AGENT_GUIDE_TOOL);
|
|
86
|
+
expect(def).toBeDefined();
|
|
87
|
+
expect(def!.description).toContain('ALWAYS call this first and read the guide before you do anything else');
|
|
88
|
+
expect(def!.description).toContain("`read_file` on `AGENTS.md` at the KB root");
|
|
89
|
+
// The sections, a distribution's own included, by id and title.
|
|
90
|
+
expect(def!.description).toContain(
|
|
91
|
+
'Sections: `introduction` (Knowledge base), `access-control` (Access control), `knowledge-graph` (Knowledge graph).',
|
|
92
|
+
);
|
|
93
|
+
// The one tool that does not open with "call get_agent_guide first".
|
|
94
|
+
expect(def!.description.startsWith(GUIDE_FIRST_SENTENCE)).toBe(false);
|
|
95
|
+
// The def wraps a tool's inputs as its request `body`; this one takes `section` and nothing else.
|
|
96
|
+
const body = (def!.inputs as { properties: { body: { properties?: Record<string, unknown> } } }).properties.body;
|
|
97
|
+
expect(Object.keys(body.properties ?? {})).toEqual(['section']);
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
it('puts the guide-first sentence at the front of every other tool the catalog lists', async () => {
|
|
102
|
+
const { registry } = await serve();
|
|
103
|
+
const read = (await registry.listExternal()).find((t) => t.name === 'read_file')!;
|
|
104
|
+
expect(read.description).toBe(`${GUIDE_FIRST_SENTENCE} Read a file.`);
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
it('returns the whole guide, or one section by id, composed when asked', async () => {
|
|
108
|
+
const { call, reads, sectionsNow } = await serve();
|
|
109
|
+
expect(await call()).toEqual({
|
|
110
|
+
status: 200,
|
|
111
|
+
body: {
|
|
112
|
+
guide: '# Knowledge base\n\nRead me.\n\n## Access control\n\nWho may do what.\n\n## Knowledge graph\n\nA distribution added this one.\n',
|
|
113
|
+
// The complete list, whatever the description had room for.
|
|
114
|
+
sections: [
|
|
115
|
+
{ id: 'introduction', title: 'Knowledge base' },
|
|
116
|
+
{ id: 'access-control', title: 'Access control' },
|
|
117
|
+
{ id: 'knowledge-graph', title: 'Knowledge graph' },
|
|
118
|
+
],
|
|
119
|
+
},
|
|
120
|
+
});
|
|
121
|
+
expect(await call({ section: 'access-control' })).toEqual({
|
|
122
|
+
status: 200,
|
|
123
|
+
body: { guide: '## Access control\n\nWho may do what.', section: 'access-control', title: 'Access control' },
|
|
124
|
+
});
|
|
125
|
+
// A section the guide does not have is refused with the ones it has.
|
|
126
|
+
const unknown = await call({ section: 'nope' });
|
|
127
|
+
expect(unknown.status).toBe(400);
|
|
128
|
+
expect(String(unknown.body.error)).toContain('The guide has no section "nope". Sections: `introduction`, `access-control`, `knowledge-graph`.');
|
|
129
|
+
// Composed per call, never cached here: what the reader answers NOW is
|
|
130
|
+
// what the next call returns, so a layout applied later is seen.
|
|
131
|
+
expect(reads()).toBe(3);
|
|
132
|
+
sectionsNow([{ id: 'introduction', title: 'Renamed', body: '# Renamed\n\nThe layout changed.' }]);
|
|
133
|
+
expect(await call()).toEqual({
|
|
134
|
+
status: 200,
|
|
135
|
+
body: { guide: '# Renamed\n\nThe layout changed.\n', sections: [{ id: 'introduction', title: 'Renamed' }] },
|
|
136
|
+
});
|
|
137
|
+
expect(await call({ section: 'introduction' })).toMatchObject({ status: 200, body: { title: 'Renamed' } });
|
|
138
|
+
expect((await call({ section: 'access-control' })).status).toBe(400);
|
|
139
|
+
expect(reads()).toBe(6);
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
it('stays under the cap whatever a distribution adds: titles go first, then ids beyond what fits are counted', async () => {
|
|
143
|
+
// A client cuts a long description from the end, and an id cut off is a
|
|
144
|
+
// section an agent cannot ask for — so the description never carries a
|
|
145
|
+
// cut list. Three forms, by what fits: ids with titles; ids alone; as
|
|
146
|
+
// many ids as fit and the count of the rest, with the complete list on
|
|
147
|
+
// the whole-guide response's `sections`.
|
|
148
|
+
const { registry, call, sectionsNow } = await serve();
|
|
149
|
+
const describedAs = async () => (await registry.listExternal()).find((t) => t.name === GET_AGENT_GUIDE_TOOL)!.description!;
|
|
150
|
+
|
|
151
|
+
// Forty sections with long titles: the ids fit, the titles do not.
|
|
152
|
+
const many = Array.from({ length: 40 }, (_, i) => ({
|
|
153
|
+
id: `section-${i}`,
|
|
154
|
+
title: `A title long enough that forty of them do not fit, number ${i}`,
|
|
155
|
+
body: `## Title ${i}\n\nBody.`,
|
|
156
|
+
}));
|
|
157
|
+
sectionsNow([...SECTIONS, ...many]);
|
|
158
|
+
const idsOnly = await describedAs();
|
|
159
|
+
expect(idsOnly.length).toBeLessThanOrEqual(TOOL_DESCRIPTION_CAP);
|
|
160
|
+
for (const section of [...SECTIONS, ...many]) expect(idsOnly).toContain(`\`${section.id}\``);
|
|
161
|
+
expect(idsOnly).not.toContain('(Knowledge base)');
|
|
162
|
+
expect(idsOnly).not.toContain(' more');
|
|
163
|
+
|
|
164
|
+
// Two hundred sections with long ids: not even the ids fit. The ones
|
|
165
|
+
// that do are listed whole, the rest are counted, nothing is cut — and
|
|
166
|
+
// the whole-guide response names every one.
|
|
167
|
+
const flood = Array.from({ length: 200 }, (_, i) => ({
|
|
168
|
+
id: `a-section-id-long-enough-that-two-hundred-never-fit-${i}`,
|
|
169
|
+
title: `T${i}`,
|
|
170
|
+
body: `## T${i}\n\nBody.`,
|
|
171
|
+
}));
|
|
172
|
+
sectionsNow([...SECTIONS, ...flood]);
|
|
173
|
+
const counted = await describedAs();
|
|
174
|
+
expect(counted.length).toBeLessThanOrEqual(TOOL_DESCRIPTION_CAP);
|
|
175
|
+
expect(counted).toContain('`introduction`');
|
|
176
|
+
const shown = (counted.match(/`[^`]+`(?=, |\.$)/g) ?? []).filter((id) => id.startsWith('`a-section-id') || id === '`introduction`' || id === '`access-control`' || id === '`knowledge-graph`');
|
|
177
|
+
expect(shown.length).toBeGreaterThan(0);
|
|
178
|
+
expect(shown.length).toBeLessThan(203);
|
|
179
|
+
expect(counted).toMatch(new RegExp(`and ${203 - shown.length} more, all named under \`sections\` in the whole-guide response\\.$`));
|
|
180
|
+
// No id is ever cut mid-way: every listed id is one of the guide's.
|
|
181
|
+
const all = new Set([...SECTIONS, ...flood].map((s) => `\`${s.id}\``));
|
|
182
|
+
for (const id of shown) expect(all.has(id), id).toBe(true);
|
|
183
|
+
const whole = (await call()).body as { sections: { id: string }[] };
|
|
184
|
+
expect(whole.sections.map((s) => s.id)).toEqual([...SECTIONS, ...flood].map((s) => s.id));
|
|
185
|
+
|
|
186
|
+
// With the platform's few, the titles are there.
|
|
187
|
+
sectionsNow(SECTIONS);
|
|
188
|
+
expect(await describedAs()).toContain('`introduction` (Knowledge base)');
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
it('returns the platform\'s HTML views section on its own, and inside the whole guide', async () => {
|
|
192
|
+
const { call, registry, sectionsNow } = await serve();
|
|
193
|
+
const platform = await agentGuideSections(DEFAULT_KB_LAYOUT);
|
|
194
|
+
sectionsNow([...platform]);
|
|
195
|
+
const html = platform.find((s) => s.id === 'html-views')!;
|
|
196
|
+
expect(await call({ section: 'html-views' })).toEqual({
|
|
197
|
+
status: 200,
|
|
198
|
+
body: { guide: html.body, section: 'html-views', title: 'HTML views' },
|
|
199
|
+
});
|
|
200
|
+
const whole = await call();
|
|
201
|
+
expect(whole.body.guide).toBe(joinGuideSections(platform));
|
|
202
|
+
expect(String(whole.body.guide)).toContain('## HTML views');
|
|
203
|
+
// The description lists it, so an agent knows it can ask for it.
|
|
204
|
+
const def = (await registry.listExternal()).find((t) => t.name === GET_AGENT_GUIDE_TOOL)!;
|
|
205
|
+
expect(def.description).toContain('`html-views`');
|
|
206
|
+
});
|
|
207
|
+
});
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import type { Router, RequestHandler } from 'express';
|
|
2
|
+
import type { IToolRegistry, UtcpTool } from '../tool-registry/tool.contract.js';
|
|
3
|
+
import { GET_AGENT_GUIDE_TOOL } from '../tool-registry/guide-first.js';
|
|
4
|
+
import { TOOL_DESCRIPTION_CAP } from '../tool-registry/description-length.js';
|
|
5
|
+
import { ToolError } from '../tool-helpers/tool.contract.js';
|
|
6
|
+
import { toolDef } from '../tool-helpers/tool-def.js';
|
|
7
|
+
import type { ToolHandlerFactory } from '../tool-helpers/tool-handler.js';
|
|
8
|
+
import { AGENT_GUIDE_FILE, joinGuideSections, type AgentGuideSectionsReader } from './agent-guide.js';
|
|
9
|
+
|
|
10
|
+
export { GET_AGENT_GUIDE_TOOL };
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* The one tool that returns the guide on its own — whole, or one section by
|
|
14
|
+
* id. It takes nothing else: the guide is the platform's text for this
|
|
15
|
+
* deployment, the same for every caller and every branch, and reading it
|
|
16
|
+
* touches no file — so no `branch`, no `sessionId`, and no access gate. The
|
|
17
|
+
* other way to the same text is a `read_file` of `AGENTS.md` at the
|
|
18
|
+
* repository root, which also carries the knowledge base's own `AGENTS.md`
|
|
19
|
+
* when it has one (see `agent-guide.ts`).
|
|
20
|
+
*
|
|
21
|
+
* Registered as a PROVIDER on both surfaces, so the description names the
|
|
22
|
+
* sections the guide has NOW — a distribution's hook may add its own — and
|
|
23
|
+
* the in-process agent and an external one are told the same thing to read
|
|
24
|
+
* first. This is the one tool the catalog does not open with "call
|
|
25
|
+
* get_agent_guide first" (see `tool-registry/guide-first.ts`): it is what
|
|
26
|
+
* that sentence points at, and says so itself.
|
|
27
|
+
*/
|
|
28
|
+
export function registerAgentGuideTool(
|
|
29
|
+
registry: IToolRegistry,
|
|
30
|
+
router: Router,
|
|
31
|
+
toolAuth: RequestHandler,
|
|
32
|
+
toolHandler: ToolHandlerFactory,
|
|
33
|
+
sections: AgentGuideSectionsReader,
|
|
34
|
+
): void {
|
|
35
|
+
const build = async (): Promise<UtcpTool> => {
|
|
36
|
+
const list = await sections();
|
|
37
|
+
const describe = (sectionList: string) =>
|
|
38
|
+
"The platform's guide to this knowledge base: its layout, where a new file goes, the rules every file tool " +
|
|
39
|
+
'shares, access control, skills and tool manuals. ALWAYS call this first and read the guide before you do ' +
|
|
40
|
+
'anything else in the platform. Returns `{ guide }` as markdown: the whole guide, or one section when ' +
|
|
41
|
+
'`section` names one. The same text comes back from `read_file` on `' +
|
|
42
|
+
AGENT_GUIDE_FILE +
|
|
43
|
+
"` at the KB root, after the knowledge base's own " +
|
|
44
|
+
AGENT_GUIDE_FILE +
|
|
45
|
+
` when it has one. Sections: ${sectionList}.`;
|
|
46
|
+
// The description stays under the cap WHATEVER a distribution adds, in
|
|
47
|
+
// three steps: every id with its title; every id alone; as many ids as
|
|
48
|
+
// fit and a count of the rest. An id a client cut off the end would be a
|
|
49
|
+
// section an agent cannot ask for — so nothing is ever cut: the one
|
|
50
|
+
// complete list of sections is `sections` on the whole-guide response,
|
|
51
|
+
// which the description names when it cannot carry them all itself.
|
|
52
|
+
const titled = describe(list.map((s) => `\`${s.id}\` (${s.title})`).join(', '));
|
|
53
|
+
const ids = list.map((s) => `\`${s.id}\``);
|
|
54
|
+
const counted = (shown: number) =>
|
|
55
|
+
describe(
|
|
56
|
+
shown === 0
|
|
57
|
+
? `${ids.length}, named under \`sections\` in the whole-guide response`
|
|
58
|
+
: [...ids.slice(0, shown), `and ${ids.length - shown} more, all named under \`sections\` in the whole-guide response`].join(', '),
|
|
59
|
+
);
|
|
60
|
+
let description = titled.length <= TOOL_DESCRIPTION_CAP ? titled : describe(ids.join(', '));
|
|
61
|
+
for (let shown = ids.length; description.length > TOOL_DESCRIPTION_CAP && shown > 0; shown--) {
|
|
62
|
+
description = counted(shown - 1);
|
|
63
|
+
}
|
|
64
|
+
return toolDef({
|
|
65
|
+
name: GET_AGENT_GUIDE_TOOL,
|
|
66
|
+
description,
|
|
67
|
+
path: `/api/agent/tools/${GET_AGENT_GUIDE_TOOL}`,
|
|
68
|
+
inputs: {
|
|
69
|
+
type: 'object',
|
|
70
|
+
properties: {
|
|
71
|
+
section: {
|
|
72
|
+
type: 'string',
|
|
73
|
+
description:
|
|
74
|
+
'Optional: the id of one section to read instead of the whole guide (the ids are listed in this ' +
|
|
75
|
+
'description, and every one under `sections` in the whole-guide response). Omit it for the whole guide.',
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
additionalProperties: false,
|
|
79
|
+
},
|
|
80
|
+
outputs: {
|
|
81
|
+
type: 'object',
|
|
82
|
+
properties: {
|
|
83
|
+
guide: { type: 'string', description: 'The guide, or the one section asked for, as markdown.' },
|
|
84
|
+
sections: {
|
|
85
|
+
type: 'array',
|
|
86
|
+
description: 'Without `section`: every section of the guide, in order, by id and heading — the complete list.',
|
|
87
|
+
items: {
|
|
88
|
+
type: 'object',
|
|
89
|
+
properties: { id: { type: 'string' }, title: { type: 'string' } },
|
|
90
|
+
required: ['id', 'title'],
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
section: { type: 'string', description: 'With `section`: the id of the section returned.' },
|
|
94
|
+
title: { type: 'string', description: 'With `section`: its heading.' },
|
|
95
|
+
},
|
|
96
|
+
required: ['guide'],
|
|
97
|
+
},
|
|
98
|
+
tags: ['workspace'],
|
|
99
|
+
});
|
|
100
|
+
};
|
|
101
|
+
registry.registerInternalTool(build);
|
|
102
|
+
registry.registerExternalTool(build);
|
|
103
|
+
|
|
104
|
+
router.post(
|
|
105
|
+
`/agent/tools/${GET_AGENT_GUIDE_TOOL}`,
|
|
106
|
+
toolAuth,
|
|
107
|
+
toolHandler(async (args) => {
|
|
108
|
+
const list = await sections();
|
|
109
|
+
const wanted = typeof args.section === 'string' ? args.section.trim() : '';
|
|
110
|
+
if (!wanted) return { guide: joinGuideSections(list), sections: list.map((s) => ({ id: s.id, title: s.title })) };
|
|
111
|
+
const one = list.find((s) => s.id === wanted);
|
|
112
|
+
if (!one) {
|
|
113
|
+
throw new ToolError(
|
|
114
|
+
`The guide has no section "${wanted}". Sections: ${list.map((s) => `\`${s.id}\``).join(', ')}. ` +
|
|
115
|
+
'Omit `section` for the whole guide.',
|
|
116
|
+
400,
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
return { guide: one.body, section: one.id, title: one.title };
|
|
120
|
+
}),
|
|
121
|
+
);
|
|
122
|
+
}
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The platform's agent guide: what every agent is told to read before its
|
|
3
|
+
* first read or change in a knowledge base — the layout, where a new file
|
|
4
|
+
* goes, the rules every file tool shares, access control, skills and tool
|
|
5
|
+
* manuals.
|
|
6
|
+
*
|
|
7
|
+
* It is TEXT THE CODE OWNS, not a file in the repository. It used to be
|
|
8
|
+
* written to every protected branch as `AGENTS.md` and refreshed on every
|
|
9
|
+
* start, which had three costs: a repository that already had an `AGENTS.md`
|
|
10
|
+
* of its own lost it or had to rename ours; a distribution that wanted to add
|
|
11
|
+
* to the guide had to fork the whole file and then drifted from every change
|
|
12
|
+
* made here; and the file sat in git history on every branch, hidden from the
|
|
13
|
+
* tree by an ignore rule it had to keep writing. Now the guide is composed
|
|
14
|
+
* from SECTIONS at the moment an agent asks for it — `get_agent_guide`, or a
|
|
15
|
+
* `read_file` of the guide's name at the repository root — and a distribution
|
|
16
|
+
* shapes it with a hook that sees the sections and returns the sections it
|
|
17
|
+
* wants (append, replace or drop by id), so what Hexis says reaches it without
|
|
18
|
+
* a copy to maintain.
|
|
19
|
+
*
|
|
20
|
+
* The sections ship as markdown files in the package's `agent-guide/` folder
|
|
21
|
+
* (see `assets.ts`), one per section, with the layout placeholders the old
|
|
22
|
+
* template carried (`{{knowledgeBaseDir}}`, `{{skillsDir}}`, `{{pluginsDir}}`,
|
|
23
|
+
* `{{agentsFile}}`). ONE section is computed rather than read: the rules every
|
|
24
|
+
* file tool shares, which the MCP handshake also sends — the same string in
|
|
25
|
+
* both places, from `shared-file-rules.ts`, so a rule cannot be changed in one
|
|
26
|
+
* and left stale in the other.
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
import fs from 'node:fs/promises';
|
|
30
|
+
import path from 'node:path';
|
|
31
|
+
import {
|
|
32
|
+
|
|
33
|
+
renderKbLayoutPlaceholders,
|
|
34
|
+
resolveKbLayout,
|
|
35
|
+
type KbLayout,
|
|
36
|
+
} from '@bevel-software/platform-shared';
|
|
37
|
+
import { agentGuideDir } from '../../assets.js';
|
|
38
|
+
import { sharedFileRulesSection } from '../agent-instructions/shared-file-rules.js';
|
|
39
|
+
|
|
40
|
+
/** One section of the guide. */
|
|
41
|
+
export interface AgentGuideSection {
|
|
42
|
+
/**
|
|
43
|
+
* Stable id, so a distribution's hook can replace or drop a section by name
|
|
44
|
+
* and a test can say which one went missing. Core's ids are the
|
|
45
|
+
* {@link CORE_SECTION_IDS}.
|
|
46
|
+
*/
|
|
47
|
+
id: string;
|
|
48
|
+
/**
|
|
49
|
+
* The section's markdown, heading included (`## …`). May carry the layout
|
|
50
|
+
* placeholders; they are rendered with the names in effect when the guide is
|
|
51
|
+
* composed, so a section can name the knowledge folder without knowing what
|
|
52
|
+
* this deployment calls it.
|
|
53
|
+
*/
|
|
54
|
+
body: string;
|
|
55
|
+
/**
|
|
56
|
+
* The body is FINAL: already rendered, and not to be passed through the
|
|
57
|
+
* placeholder renderer. Set on the computed shared-rules section, which is
|
|
58
|
+
* rendered for the layout by the code that builds it; rendering it again
|
|
59
|
+
* could only misread a folder name it STATES as a placeholder.
|
|
60
|
+
*/
|
|
61
|
+
literal?: boolean;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* A distribution's say over the guide. Called with core's sections, in order,
|
|
66
|
+
* and the layout in effect; returns the sections the guide is composed from.
|
|
67
|
+
* Append to the array to add sections, map over it to replace one by id,
|
|
68
|
+
* filter it to drop one. Called on every composition, so a hook that reads
|
|
69
|
+
* something live (a feature flag, a setting) is read each time.
|
|
70
|
+
*/
|
|
71
|
+
export type AgentGuideHook = (
|
|
72
|
+
sections: readonly AgentGuideSection[],
|
|
73
|
+
layout: Required<KbLayout>,
|
|
74
|
+
) => readonly AgentGuideSection[] | Promise<readonly AgentGuideSection[]>;
|
|
75
|
+
|
|
76
|
+
/** Composes the guide for the layout in effect — the shape every consumer reads. */
|
|
77
|
+
export type AgentGuideReader = () => Promise<string>;
|
|
78
|
+
|
|
79
|
+
/** The computed section: the rules every file tool shares. */
|
|
80
|
+
export const WORKING_WITH_FILES_SECTION_ID = 'working-with-files';
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* What to do on a knowledge base nobody has written in yet: the section the
|
|
84
|
+
* `firstRun` note `start_session` answers with points at (see
|
|
85
|
+
* workspace/first-run.ts, which names it by this constant).
|
|
86
|
+
*/
|
|
87
|
+
export const NEW_KNOWLEDGE_BASE_SECTION_ID = 'new-knowledge-base';
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Core's sections, in reading order. Every id but the shared-rules one names
|
|
91
|
+
* a file in the package's `agent-guide/` folder.
|
|
92
|
+
*/
|
|
93
|
+
export const CORE_SECTION_IDS: readonly string[] = Object.freeze([
|
|
94
|
+
'introduction',
|
|
95
|
+
'directory-structure',
|
|
96
|
+
'where-a-new-file-goes',
|
|
97
|
+
WORKING_WITH_FILES_SECTION_ID,
|
|
98
|
+
'access-control',
|
|
99
|
+
'skills',
|
|
100
|
+
'tool-manuals',
|
|
101
|
+
'html-views',
|
|
102
|
+
'conventions',
|
|
103
|
+
'finding-things',
|
|
104
|
+
NEW_KNOWLEDGE_BASE_SECTION_ID,
|
|
105
|
+
]);
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* The one line that proves a root guide file is the platform's and not the
|
|
109
|
+
* customer's: the blockquote the packaged guide opened with for as long as
|
|
110
|
+
* the guide was a file, under every release. Asked for WHERE the header put
|
|
111
|
+
* it — a blockquote line among the first lines of the file — and not anywhere
|
|
112
|
+
* in the text: a note of the organisation's own that quotes the platform's
|
|
113
|
+
* sentence in its body must not read as ours, because the consequence of the
|
|
114
|
+
* mistake is a deletion. Still read on every start, to take the copies
|
|
115
|
+
* earlier releases wrote out of the repository (see template-files.step.ts),
|
|
116
|
+
* and on every read of the guide's name, so a copy still on a draft is not
|
|
117
|
+
* served twice.
|
|
118
|
+
*/
|
|
119
|
+
const MANAGED_GUIDE_HEADER_LINE = '> **This file is managed by the platform.**';
|
|
120
|
+
|
|
121
|
+
/** How far down a file the header's blockquote can sit: under the title and a sentence or two, never further. */
|
|
122
|
+
const MANAGED_GUIDE_HEADER_WITHIN_LINES = 12;
|
|
123
|
+
|
|
124
|
+
/** Whether `text` is a copy of the guide a release wrote to disk, of any vintage. */
|
|
125
|
+
export function isManagedGuide(text: string): boolean {
|
|
126
|
+
return text
|
|
127
|
+
.split('\n', MANAGED_GUIDE_HEADER_WITHIN_LINES)
|
|
128
|
+
.some((line) => line.trimStart().startsWith(MANAGED_GUIDE_HEADER_LINE));
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/** The raw section files, read once per process: the package does not change while it runs. */
|
|
132
|
+
let coreSectionFiles: Promise<ReadonlyMap<string, string>> | null = null;
|
|
133
|
+
|
|
134
|
+
async function readCoreSectionFiles(): Promise<ReadonlyMap<string, string>> {
|
|
135
|
+
const dir = agentGuideDir();
|
|
136
|
+
const entries = await Promise.all(
|
|
137
|
+
CORE_SECTION_IDS.filter((id) => id !== WORKING_WITH_FILES_SECTION_ID).map(
|
|
138
|
+
// Line endings normalised: a checkout on Windows may carry CRLF, and the
|
|
139
|
+
// guide is one text with one ending wherever it is served from.
|
|
140
|
+
async (id) => [id, (await fs.readFile(path.join(dir, `${id}.md`), 'utf8')).replace(/\r\n?/g, '\n')] as const,
|
|
141
|
+
),
|
|
142
|
+
);
|
|
143
|
+
return new Map(entries);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Core's sections for `layout`: the files, placeholders unrendered, with the
|
|
148
|
+
* shared-rules section computed and in its place. What a distribution's hook
|
|
149
|
+
* is handed.
|
|
150
|
+
*/
|
|
151
|
+
export async function coreAgentGuideSections(layout: KbLayout): Promise<AgentGuideSection[]> {
|
|
152
|
+
coreSectionFiles ??= readCoreSectionFiles();
|
|
153
|
+
let files: ReadonlyMap<string, string>;
|
|
154
|
+
try {
|
|
155
|
+
files = await coreSectionFiles;
|
|
156
|
+
} catch (err) {
|
|
157
|
+
// A failed read is not cached: the next composition tries the disk again.
|
|
158
|
+
coreSectionFiles = null;
|
|
159
|
+
throw err;
|
|
160
|
+
}
|
|
161
|
+
return CORE_SECTION_IDS.map((id) =>
|
|
162
|
+
id === WORKING_WITH_FILES_SECTION_ID
|
|
163
|
+
? { id, body: sharedFileRulesSection(layout), literal: true }
|
|
164
|
+
: { id, body: files.get(id)! },
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/** What the guide is composed for, beyond the layout. */
|
|
169
|
+
export interface AgentGuideContext {
|
|
170
|
+
/**
|
|
171
|
+
* The name of the repository's checkout folder inside a workspace, which
|
|
172
|
+
* the file tools take paths under (`knowledge-base/` by default). Rendered
|
|
173
|
+
* into `{{kbDirName}}` so the paths the guide shows are the paths this
|
|
174
|
+
* deployment's tools report back.
|
|
175
|
+
*/
|
|
176
|
+
kbDirName?: string;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/** The checkout folder's name when none is given — core's own default. */
|
|
180
|
+
const DEFAULT_KB_DIR_NAME = 'knowledge-base';
|
|
181
|
+
|
|
182
|
+
/** One section of the guide as an agent reads it: rendered, with the heading's text as its title. */
|
|
183
|
+
export interface RenderedGuideSection {
|
|
184
|
+
id: string;
|
|
185
|
+
/** The heading line's text, without its `#`s — what the tool lists the section as. */
|
|
186
|
+
title: string;
|
|
187
|
+
/** The section's markdown, heading included, rendered for the layout. */
|
|
188
|
+
body: string;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/** Composes the guide's sections for the layout in effect — what the guide tool reads. */
|
|
192
|
+
export type AgentGuideSectionsReader = () => Promise<RenderedGuideSection[]>;
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* The guide's sections as an agent reads them: core's sections through the
|
|
196
|
+
* distribution's hook (when there is one), rendered for the layout, each
|
|
197
|
+
* with its title. The whole guide is these joined (see
|
|
198
|
+
* {@link composeAgentGuide}); `get_agent_guide` also serves one at a time.
|
|
199
|
+
*
|
|
200
|
+
* A hook may append, replace and drop sections, with ONE exception: the
|
|
201
|
+
* shared file rules ({@link WORKING_WITH_FILES_SECTION_ID}) must come back
|
|
202
|
+
* WITH TEXT IN THEM, as core's or as the hook's own replacement. A client
|
|
203
|
+
* that drops the handshake instructions has the guide as the only place to
|
|
204
|
+
* read the rules — a guide without them would leave agents nothing to read.
|
|
205
|
+
* A hook that drops the section, or hands it back empty, is a composition
|
|
206
|
+
* error, thrown rather than served. Judged on what would be SERVED — the
|
|
207
|
+
* rendered, trimmed body — so a replacement of whitespace is caught like a
|
|
208
|
+
* missing one, rather than passing the check and vanishing with the other
|
|
209
|
+
* empty sections below.
|
|
210
|
+
*/
|
|
211
|
+
export async function agentGuideSections(
|
|
212
|
+
layout: KbLayout,
|
|
213
|
+
hook?: AgentGuideHook,
|
|
214
|
+
context: AgentGuideContext = {},
|
|
215
|
+
): Promise<RenderedGuideSection[]> {
|
|
216
|
+
const resolved = resolveKbLayout(layout);
|
|
217
|
+
const core = await coreAgentGuideSections(resolved);
|
|
218
|
+
const sections = hook ? await hook(core, resolved) : core;
|
|
219
|
+
const kbDirName = context.kbDirName?.trim() || DEFAULT_KB_DIR_NAME;
|
|
220
|
+
const rendered = sections.map((section) => {
|
|
221
|
+
const body = (
|
|
222
|
+
section.literal
|
|
223
|
+
? section.body
|
|
224
|
+
: renderKbLayoutPlaceholders(section.body.replaceAll('{{kbDirName}}', () => kbDirName), resolved)
|
|
225
|
+
).trim();
|
|
226
|
+
return { id: section.id, title: titleOf(body, section.id), body };
|
|
227
|
+
});
|
|
228
|
+
// Judged over EVERY section under the id — a hook may return the id twice
|
|
229
|
+
// — on what survives the empty-body filter below: one with text is enough.
|
|
230
|
+
const rules = rendered.filter((section) => section.id === WORKING_WITH_FILES_SECTION_ID);
|
|
231
|
+
if (!rules.some((section) => section.body.length > 0)) {
|
|
232
|
+
throw new Error(
|
|
233
|
+
`The agent guide hook ${rules.length === 0 ? 'dropped' : 'emptied'} the "${WORKING_WITH_FILES_SECTION_ID}" ` +
|
|
234
|
+
'section, which every file tool points at. Keep it, or replace it under the same id with the rules in it.',
|
|
235
|
+
);
|
|
236
|
+
}
|
|
237
|
+
return rendered.filter((section) => section.body.length > 0);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* The heading's text, or the id when the section opens with no heading. An
|
|
242
|
+
* ATX heading may close with a run of `#` of its own (`## Custom ##`); that
|
|
243
|
+
* is a delimiter, not part of the title.
|
|
244
|
+
*/
|
|
245
|
+
function titleOf(body: string, id: string): string {
|
|
246
|
+
const first = body.split('\n', 1)[0] ?? '';
|
|
247
|
+
const heading = /^#{1,6}\s+(.*?)(?:\s+#+)?\s*$/.exec(first);
|
|
248
|
+
return heading ? heading[1]!.trim() : id;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
/**
|
|
252
|
+
* The guide as an agent reads it whole: the sections joined by blank lines,
|
|
253
|
+
* ending in one newline.
|
|
254
|
+
*/
|
|
255
|
+
export async function composeAgentGuide(
|
|
256
|
+
layout: KbLayout,
|
|
257
|
+
hook?: AgentGuideHook,
|
|
258
|
+
context: AgentGuideContext = {},
|
|
259
|
+
): Promise<string> {
|
|
260
|
+
return joinGuideSections(await agentGuideSections(layout, hook, context));
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/** The sections as one document, the way `composeAgentGuide` joins them. */
|
|
264
|
+
export function joinGuideSections(sections: readonly RenderedGuideSection[]): string {
|
|
265
|
+
return `${sections.map((section) => section.body).join('\n\n')}\n`;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* What a `read_file` of the guide's name answers when the knowledge base has an
|
|
270
|
+
* `AGENTS.md` of its own: their text first, whole, then a rule and one line
|
|
271
|
+
* saying what follows, then the platform's guide. Theirs first because it is
|
|
272
|
+
* the more specific of the two, and the line between so neither is read as
|
|
273
|
+
* part of the other.
|
|
274
|
+
*/
|
|
275
|
+
export const PLATFORM_GUIDE_SEPARATOR =
|
|
276
|
+
"---\n\n_The text above is this knowledge base's own conventions file. The platform's guide follows; `get_agent_guide` returns it on its own._";
|
|
277
|
+
|
|
278
|
+
export function withPlatformGuideAppended(ownText: string, guide: string): string {
|
|
279
|
+
// Their text as they wrote it, line endings normalised and the trailing
|
|
280
|
+
// newlines folded into the one blank line before the separator. Nothing
|
|
281
|
+
// else is touched: leading indentation and trailing spaces are markdown.
|
|
282
|
+
const own = ownText.replace(/\r\n?/g, '\n').replace(/\n+$/, '');
|
|
283
|
+
// A file with nothing in it has nothing to put first, and a separator
|
|
284
|
+
// above nothing would claim a conventions file that says nothing.
|
|
285
|
+
if (own.trim().length === 0) return guide;
|
|
286
|
+
return `${own}\n\n${PLATFORM_GUIDE_SEPARATOR}\n\n${guide}`;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/** The one name the guide is read by: `AGENTS.md` at the repository root, the name coding agents look for. */
|
|
290
|
+
export const AGENT_GUIDE_FILE = 'AGENTS.md';
|
|
291
|
+
|
|
292
|
+
/**
|
|
293
|
+
* Whether a repository-relative path is where the guide is read — `AGENTS.md`
|
|
294
|
+
* at the repository root, exactly spelled, like every platform path. One
|
|
295
|
+
* name on every deployment: there is no setting for it any more.
|
|
296
|
+
*/
|
|
297
|
+
export function isAgentGuidePath(repoRelativePath: string): boolean {
|
|
298
|
+
const norm = repoRelativePath.replace(/^\.?\/+/, '').replace(/\/+$/, '');
|
|
299
|
+
return norm === AGENT_GUIDE_FILE;
|
|
300
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export {
|
|
2
|
+
AGENT_GUIDE_FILE,
|
|
3
|
+
CORE_SECTION_IDS,
|
|
4
|
+
NEW_KNOWLEDGE_BASE_SECTION_ID,
|
|
5
|
+
PLATFORM_GUIDE_SEPARATOR,
|
|
6
|
+
WORKING_WITH_FILES_SECTION_ID,
|
|
7
|
+
agentGuideSections,
|
|
8
|
+
composeAgentGuide,
|
|
9
|
+
coreAgentGuideSections,
|
|
10
|
+
isAgentGuidePath,
|
|
11
|
+
isManagedGuide,
|
|
12
|
+
joinGuideSections,
|
|
13
|
+
withPlatformGuideAppended,
|
|
14
|
+
type AgentGuideContext,
|
|
15
|
+
type AgentGuideHook,
|
|
16
|
+
type AgentGuideReader,
|
|
17
|
+
type AgentGuideSection,
|
|
18
|
+
type AgentGuideSectionsReader,
|
|
19
|
+
type RenderedGuideSection,
|
|
20
|
+
} from './agent-guide.js';
|
|
21
|
+
export { GET_AGENT_GUIDE_TOOL, registerAgentGuideTool } from './agent-guide.tools.js';
|
|
22
|
+
export { GUIDE_FIRST_SENTENCE, withGuideFirst } from '../tool-registry/guide-first.js';
|