@bevel-software/platform-core-backend 0.33.0 → 0.35.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 +146 -289
- package/agent-guide/conventions.md +23 -25
- package/agent-guide/directory-structure.md +72 -120
- package/agent-guide/drafts-and-change-requests.md +92 -0
- package/agent-guide/for-git-users.md +47 -0
- package/agent-guide/glossary.md +36 -0
- package/agent-guide/how-agents-find-things.md +49 -0
- package/agent-guide/html-views.md +239 -8
- package/agent-guide/new-knowledge-base.md +9 -8
- package/agent-guide/skills.md +67 -42
- package/agent-guide/start-here.md +65 -0
- package/agent-guide/tool-manuals.md +133 -155
- package/agent-guide/tools.md +67 -0
- package/agent-guide/where-a-new-file-goes.md +45 -28
- package/dist/core/catalog-revision.d.ts +12 -1
- package/dist/core/catalog-revision.d.ts.map +1 -1
- package/dist/core/catalog-revision.js +23 -3
- package/dist/core/catalog-revision.js.map +1 -1
- package/dist/core/core-ports.d.ts +41 -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.map +1 -1
- package/dist/core/create-core-server.js +15 -8
- package/dist/core/create-core-server.js.map +1 -1
- package/dist/core/create-core-services.d.ts +22 -5
- package/dist/core/create-core-services.d.ts.map +1 -1
- package/dist/core/create-core-services.js +44 -16
- package/dist/core/create-core-services.js.map +1 -1
- package/dist/core/lifecycle.d.ts +16 -0
- package/dist/core/lifecycle.d.ts.map +1 -1
- package/dist/core/lifecycle.js +12 -2
- package/dist/core/lifecycle.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/modules/access/access-control.interface.d.ts +39 -9
- package/dist/modules/access/access-control.interface.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.d.ts +15 -3
- package/dist/modules/access/access-control.service.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.js +239 -75
- package/dist/modules/access/access-control.service.js.map +1 -1
- package/dist/modules/access/access-mutation.service.d.ts +22 -24
- package/dist/modules/access/access-mutation.service.d.ts.map +1 -1
- package/dist/modules/access/access-mutation.service.js +48 -51
- package/dist/modules/access/access-mutation.service.js.map +1 -1
- package/dist/modules/access/access-view.d.ts.map +1 -1
- package/dist/modules/access/access-view.js +12 -11
- package/dist/modules/access/access-view.js.map +1 -1
- package/dist/modules/access/access.routes.d.ts +3 -0
- package/dist/modules/access/access.routes.d.ts.map +1 -1
- package/dist/modules/access/access.routes.js +58 -33
- package/dist/modules/access/access.routes.js.map +1 -1
- package/dist/modules/access/groups-admin.routes.d.ts.map +1 -1
- package/dist/modules/access/groups-admin.routes.js +4 -2
- package/dist/modules/access/groups-admin.routes.js.map +1 -1
- package/dist/modules/access/groups-admin.service.d.ts +44 -13
- package/dist/modules/access/groups-admin.service.d.ts.map +1 -1
- package/dist/modules/access/groups-admin.service.js +80 -38
- package/dist/modules/access/groups-admin.service.js.map +1 -1
- package/dist/modules/access/groups-edit.d.ts +1 -1
- package/dist/modules/access/groups-edit.d.ts.map +1 -1
- package/dist/modules/access/groups-edit.js +1 -1
- package/dist/modules/access/groups-edit.js.map +1 -1
- package/dist/modules/access/index.d.ts +1 -1
- package/dist/modules/access/index.d.ts.map +1 -1
- package/dist/modules/access/reference-scan.d.ts +116 -24
- package/dist/modules/access/reference-scan.d.ts.map +1 -1
- package/dist/modules/access/reference-scan.js +305 -44
- package/dist/modules/access/reference-scan.js.map +1 -1
- package/dist/modules/access/roles-admin.service.d.ts +17 -8
- package/dist/modules/access/roles-admin.service.d.ts.map +1 -1
- package/dist/modules/access/roles-admin.service.js +32 -23
- package/dist/modules/access/roles-admin.service.js.map +1 -1
- package/dist/modules/access-model/access-grammar.d.ts +35 -10
- package/dist/modules/access-model/access-grammar.d.ts.map +1 -1
- package/dist/modules/access-model/access-grammar.js +60 -20
- package/dist/modules/access-model/access-grammar.js.map +1 -1
- package/dist/modules/access-model/access-splice.d.ts +22 -18
- package/dist/modules/access-model/access-splice.d.ts.map +1 -1
- package/dist/modules/access-model/access-splice.js +20 -14
- package/dist/modules/access-model/access-splice.js.map +1 -1
- package/dist/modules/access-model/group-files.d.ts +1 -0
- package/dist/modules/access-model/group-files.d.ts.map +1 -1
- package/dist/modules/access-model/group-files.js +5 -1
- package/dist/modules/access-model/group-files.js.map +1 -1
- package/dist/modules/agent-guide/agent-guide.d.ts +47 -7
- package/dist/modules/agent-guide/agent-guide.d.ts.map +1 -1
- package/dist/modules/agent-guide/agent-guide.js +103 -13
- package/dist/modules/agent-guide/agent-guide.js.map +1 -1
- package/dist/modules/agent-guide/agent-guide.tools.d.ts +6 -2
- package/dist/modules/agent-guide/agent-guide.tools.d.ts.map +1 -1
- package/dist/modules/agent-guide/agent-guide.tools.js +46 -22
- package/dist/modules/agent-guide/agent-guide.tools.js.map +1 -1
- package/dist/modules/agent-guide/guide-budget.d.ts +48 -0
- package/dist/modules/agent-guide/guide-budget.d.ts.map +1 -0
- package/dist/modules/agent-guide/guide-budget.js +67 -0
- package/dist/modules/agent-guide/guide-budget.js.map +1 -0
- package/dist/modules/agent-guide/index.d.ts +2 -1
- package/dist/modules/agent-guide/index.d.ts.map +1 -1
- package/dist/modules/agent-guide/index.js +2 -1
- package/dist/modules/agent-guide/index.js.map +1 -1
- package/dist/modules/agent-instructions/compose.d.ts +3 -1
- package/dist/modules/agent-instructions/compose.d.ts.map +1 -1
- package/dist/modules/agent-instructions/compose.js +7 -1
- package/dist/modules/agent-instructions/compose.js.map +1 -1
- package/dist/modules/agent-instructions/shared-file-rules.d.ts +5 -1
- package/dist/modules/agent-instructions/shared-file-rules.d.ts.map +1 -1
- package/dist/modules/agent-instructions/shared-file-rules.js +26 -9
- package/dist/modules/agent-instructions/shared-file-rules.js.map +1 -1
- package/dist/modules/agent-scope/agent-scope.contract.d.ts +67 -0
- package/dist/modules/agent-scope/agent-scope.contract.d.ts.map +1 -0
- package/dist/modules/agent-scope/agent-scope.contract.js +27 -0
- package/dist/modules/agent-scope/agent-scope.contract.js.map +1 -0
- package/dist/modules/agent-scope/connection-scope.d.ts +111 -0
- package/dist/modules/agent-scope/connection-scope.d.ts.map +1 -0
- package/dist/modules/agent-scope/connection-scope.js +165 -0
- package/dist/modules/agent-scope/connection-scope.js.map +1 -0
- package/dist/modules/agent-scope/index.d.ts +3 -0
- package/dist/modules/agent-scope/index.d.ts.map +1 -0
- package/dist/modules/agent-scope/index.js +3 -0
- package/dist/modules/agent-scope/index.js.map +1 -0
- package/dist/modules/audit/agent-audit.service.d.ts.map +1 -1
- package/dist/modules/audit/agent-audit.service.js +2 -0
- package/dist/modules/audit/agent-audit.service.js.map +1 -1
- package/dist/modules/audit/audit.contract.d.ts +6 -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/auth/account-admission.d.ts +12 -0
- package/dist/modules/auth/account-admission.d.ts.map +1 -1
- package/dist/modules/auth/account-admission.js +15 -0
- package/dist/modules/auth/account-admission.js.map +1 -1
- package/dist/modules/auth/auth.middleware.d.ts +27 -1
- package/dist/modules/auth/auth.middleware.d.ts.map +1 -1
- package/dist/modules/auth/auth.middleware.js +42 -4
- package/dist/modules/auth/auth.middleware.js.map +1 -1
- package/dist/modules/auth/auth.routes.d.ts +13 -9
- package/dist/modules/auth/auth.routes.d.ts.map +1 -1
- package/dist/modules/auth/auth.routes.js +35 -29
- package/dist/modules/auth/auth.routes.js.map +1 -1
- package/dist/modules/auth/auth.service.d.ts +55 -6
- package/dist/modules/auth/auth.service.d.ts.map +1 -1
- package/dist/modules/auth/auth.service.js +128 -34
- package/dist/modules/auth/auth.service.js.map +1 -1
- package/dist/modules/auth/index.d.ts +1 -1
- package/dist/modules/auth/index.d.ts.map +1 -1
- package/dist/modules/auth/index.js +1 -1
- package/dist/modules/auth/index.js.map +1 -1
- package/dist/modules/auth/oidc-auth-provider.d.ts.map +1 -1
- package/dist/modules/auth/oidc-auth-provider.js +2 -9
- package/dist/modules/auth/oidc-auth-provider.js.map +1 -1
- package/dist/modules/code-mode/code-mode.tool.js +2 -2
- package/dist/modules/code-mode/code-mode.tool.js.map +1 -1
- package/dist/modules/connection-probe/connection-probe.service.d.ts +0 -12
- package/dist/modules/connection-probe/connection-probe.service.d.ts.map +1 -1
- package/dist/modules/connection-probe/connection-probe.service.js +1 -38
- package/dist/modules/connection-probe/connection-probe.service.js.map +1 -1
- package/dist/modules/database/core-schema.d.ts +68 -0
- package/dist/modules/database/core-schema.d.ts.map +1 -1
- package/dist/modules/database/core-schema.js +33 -0
- package/dist/modules/database/core-schema.js.map +1 -1
- package/dist/modules/declared-variables/declared-variables.routes.d.ts +8 -1
- package/dist/modules/declared-variables/declared-variables.routes.d.ts.map +1 -1
- package/dist/modules/declared-variables/declared-variables.routes.js +13 -2
- package/dist/modules/declared-variables/declared-variables.routes.js.map +1 -1
- package/dist/modules/embed/embed.tools.d.ts.map +1 -1
- package/dist/modules/embed/embed.tools.js +5 -0
- package/dist/modules/embed/embed.tools.js.map +1 -1
- package/dist/modules/kb-fs/index.d.ts +2 -0
- package/dist/modules/kb-fs/index.d.ts.map +1 -1
- package/dist/modules/kb-fs/index.js +1 -0
- package/dist/modules/kb-fs/index.js.map +1 -1
- package/dist/modules/kb-fs/locking-filesystem.d.ts.map +1 -1
- package/dist/modules/kb-fs/locking-filesystem.js +7 -1
- package/dist/modules/kb-fs/locking-filesystem.js.map +1 -1
- package/dist/modules/kb-fs/repo-path.d.ts +26 -6
- package/dist/modules/kb-fs/repo-path.d.ts.map +1 -1
- package/dist/modules/kb-fs/repo-path.js +22 -7
- package/dist/modules/kb-fs/repo-path.js.map +1 -1
- package/dist/modules/kb-fs/tmp-ref.d.ts +36 -0
- package/dist/modules/kb-fs/tmp-ref.d.ts.map +1 -0
- package/dist/modules/kb-fs/tmp-ref.js +76 -0
- package/dist/modules/kb-fs/tmp-ref.js.map +1 -0
- package/dist/modules/mcp/mcp-auth.middleware.d.ts +7 -0
- package/dist/modules/mcp/mcp-auth.middleware.d.ts.map +1 -1
- package/dist/modules/mcp/mcp-auth.middleware.js +14 -1
- package/dist/modules/mcp/mcp-auth.middleware.js.map +1 -1
- package/dist/modules/mcp/mcp.routes.d.ts +7 -1
- package/dist/modules/mcp/mcp.routes.d.ts.map +1 -1
- package/dist/modules/mcp/mcp.routes.js +39 -4
- package/dist/modules/mcp/mcp.routes.js.map +1 -1
- package/dist/modules/mcp/mcp.service.d.ts +11 -0
- package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
- package/dist/modules/mcp/mcp.service.js +74 -48
- package/dist/modules/mcp/mcp.service.js.map +1 -1
- package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts +24 -1
- package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts.map +1 -1
- package/dist/modules/mcp/oauth/bevel-oauth-provider.js +45 -10
- package/dist/modules/mcp/oauth/bevel-oauth-provider.js.map +1 -1
- package/dist/modules/mcp/oauth/oauth-consent.routes.d.ts +9 -0
- package/dist/modules/mcp/oauth/oauth-consent.routes.d.ts.map +1 -1
- package/dist/modules/mcp/oauth/oauth-consent.routes.js +34 -1
- package/dist/modules/mcp/oauth/oauth-consent.routes.js.map +1 -1
- 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.map +1 -1
- package/dist/modules/plugins/plugin-links.d.ts +18 -2
- package/dist/modules/plugins/plugin-links.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-links.js.map +1 -1
- package/dist/modules/plugins/plugins.routes.d.ts +5 -1
- package/dist/modules/plugins/plugins.routes.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.routes.js +32 -5
- package/dist/modules/plugins/plugins.routes.js.map +1 -1
- package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts +11 -1
- package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts.map +1 -1
- package/dist/modules/secrets-vault/db-secrets-vault.service.js +159 -24
- package/dist/modules/secrets-vault/db-secrets-vault.service.js.map +1 -1
- package/dist/modules/secrets-vault/index.d.ts +1 -1
- package/dist/modules/secrets-vault/index.d.ts.map +1 -1
- package/dist/modules/secrets-vault/index.js +1 -1
- package/dist/modules/secrets-vault/index.js.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.contract.d.ts +53 -11
- package/dist/modules/secrets-vault/secrets-vault.contract.d.ts.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.contract.js +27 -0
- package/dist/modules/secrets-vault/secrets-vault.contract.js.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.routes.d.ts +9 -0
- package/dist/modules/secrets-vault/secrets-vault.routes.d.ts.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.routes.js +100 -42
- package/dist/modules/secrets-vault/secrets-vault.routes.js.map +1 -1
- package/dist/modules/settings/oidc-check.d.ts.map +1 -1
- package/dist/modules/settings/oidc-check.js +5 -17
- package/dist/modules/settings/oidc-check.js.map +1 -1
- package/dist/modules/skills/index.d.ts +3 -3
- package/dist/modules/skills/index.d.ts.map +1 -1
- package/dist/modules/skills/index.js +0 -2
- package/dist/modules/skills/index.js.map +1 -1
- package/dist/modules/skills/skills.contract.d.ts +16 -0
- package/dist/modules/skills/skills.contract.d.ts.map +1 -1
- package/dist/modules/skills/skills.service.d.ts.map +1 -1
- package/dist/modules/skills/skills.service.js +6 -1
- package/dist/modules/skills/skills.service.js.map +1 -1
- package/dist/modules/skills/skills.tools.d.ts.map +1 -1
- package/dist/modules/skills/skills.tools.js +25 -13
- package/dist/modules/skills/skills.tools.js.map +1 -1
- package/dist/modules/tool-auth/external-api-key.interface.d.ts +11 -0
- package/dist/modules/tool-auth/external-api-key.interface.d.ts.map +1 -1
- package/dist/modules/tool-auth/external-api-key.interface.js.map +1 -1
- package/dist/modules/tool-auth/external-api-key.service.d.ts +1 -0
- package/dist/modules/tool-auth/external-api-key.service.d.ts.map +1 -1
- package/dist/modules/tool-auth/external-api-key.service.js +4 -1
- package/dist/modules/tool-auth/external-api-key.service.js.map +1 -1
- package/dist/modules/tool-auth/index.d.ts +1 -1
- package/dist/modules/tool-auth/index.d.ts.map +1 -1
- package/dist/modules/tool-auth/internal-token.service.d.ts +9 -0
- package/dist/modules/tool-auth/internal-token.service.d.ts.map +1 -1
- package/dist/modules/tool-auth/internal-token.service.js +1 -0
- package/dist/modules/tool-auth/internal-token.service.js.map +1 -1
- package/dist/modules/tool-auth/tool-auth.middleware.d.ts +27 -3
- package/dist/modules/tool-auth/tool-auth.middleware.d.ts.map +1 -1
- package/dist/modules/tool-auth/tool-auth.middleware.js +32 -6
- package/dist/modules/tool-auth/tool-auth.middleware.js.map +1 -1
- package/dist/modules/tool-helpers/tool-context.d.ts +7 -0
- package/dist/modules/tool-helpers/tool-context.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool-context.js +3 -0
- package/dist/modules/tool-helpers/tool-context.js.map +1 -1
- package/dist/modules/tool-helpers/tool-def.js +1 -1
- package/dist/modules/tool-helpers/tool-def.js.map +1 -1
- package/dist/modules/tool-helpers/tool-handler.d.ts +15 -0
- package/dist/modules/tool-helpers/tool-handler.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool-handler.js +19 -0
- package/dist/modules/tool-helpers/tool-handler.js.map +1 -1
- package/dist/modules/tool-helpers/tool.contract.d.ts +10 -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-helpers/validate-token.d.ts +3 -1
- package/dist/modules/tool-helpers/validate-token.d.ts.map +1 -1
- package/dist/modules/tool-helpers/validate-token.js +1 -1
- package/dist/modules/tool-helpers/validate-token.js.map +1 -1
- package/dist/modules/tool-manuals/index.d.ts +3 -3
- package/dist/modules/tool-manuals/index.d.ts.map +1 -1
- package/dist/modules/tool-manuals/index.js +0 -2
- package/dist/modules/tool-manuals/index.js.map +1 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.d.ts +7 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.d.ts.map +1 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.js +69 -38
- package/dist/modules/tool-manuals/mcp-json-discovery.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.contract.d.ts +46 -6
- package/dist/modules/tool-manuals/tool-manuals.contract.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.routes.d.ts +7 -1
- package/dist/modules/tool-manuals/tool-manuals.routes.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.routes.js +41 -4
- package/dist/modules/tool-manuals/tool-manuals.routes.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts +24 -13
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.js +138 -59
- package/dist/modules/tool-manuals/tool-manuals.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts +8 -2
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.js +56 -20
- package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -1
- package/dist/modules/tool-registry/manual.routes.d.ts +8 -1
- package/dist/modules/tool-registry/manual.routes.d.ts.map +1 -1
- package/dist/modules/tool-registry/manual.routes.js +27 -7
- package/dist/modules/tool-registry/manual.routes.js.map +1 -1
- package/dist/modules/tool-registry/tool.contract.d.ts +7 -0
- package/dist/modules/tool-registry/tool.contract.d.ts.map +1 -1
- package/dist/modules/tool-registry/tool.contract.js.map +1 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +1 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.js +36 -27
- package/dist/modules/workflow/agent-tools/workflow.tools.js.map +1 -1
- package/dist/modules/workflow/git/git.service.d.ts +2 -2
- package/dist/modules/workflow/git/git.service.d.ts.map +1 -1
- package/dist/modules/workflow/git/git.service.js +20 -35
- package/dist/modules/workflow/git/git.service.js.map +1 -1
- package/dist/modules/workflow/workflow.service.d.ts +2 -1
- package/dist/modules/workflow/workflow.service.d.ts.map +1 -1
- package/dist/modules/workflow/workflow.service.js +3 -0
- package/dist/modules/workflow/workflow.service.js.map +1 -1
- package/dist/modules/workspace/agent-access.gate.d.ts +1 -1
- package/dist/modules/workspace/agent-access.gate.d.ts.map +1 -1
- package/dist/modules/workspace/agent-access.gate.js +1 -1
- package/dist/modules/workspace/agent-access.gate.js.map +1 -1
- package/dist/modules/workspace/file-readers/doc-extract.service.d.ts +28 -4
- package/dist/modules/workspace/file-readers/doc-extract.service.d.ts.map +1 -1
- package/dist/modules/workspace/file-readers/doc-extract.service.js +61 -40
- package/dist/modules/workspace/file-readers/doc-extract.service.js.map +1 -1
- package/dist/modules/workspace/index.d.ts +8 -0
- package/dist/modules/workspace/index.d.ts.map +1 -1
- package/dist/modules/workspace/index.js +8 -0
- package/dist/modules/workspace/index.js.map +1 -1
- package/dist/modules/workspace/nul-scan.d.ts +19 -0
- package/dist/modules/workspace/nul-scan.d.ts.map +1 -0
- package/dist/modules/workspace/nul-scan.js +55 -0
- package/dist/modules/workspace/nul-scan.js.map +1 -0
- package/dist/modules/workspace/pattern-matcher.contract.d.ts +110 -27
- package/dist/modules/workspace/pattern-matcher.contract.d.ts.map +1 -1
- package/dist/modules/workspace/pattern-matcher.contract.js +30 -13
- package/dist/modules/workspace/pattern-matcher.contract.js.map +1 -1
- package/dist/modules/workspace/ripgrep-search.d.ts +54 -0
- package/dist/modules/workspace/ripgrep-search.d.ts.map +1 -0
- package/dist/modules/workspace/ripgrep-search.js +657 -0
- package/dist/modules/workspace/ripgrep-search.js.map +1 -0
- package/dist/modules/workspace/ripgrep-version.d.ts +15 -0
- package/dist/modules/workspace/ripgrep-version.d.ts.map +1 -0
- package/dist/modules/workspace/ripgrep-version.js +31 -0
- package/dist/modules/workspace/ripgrep-version.js.map +1 -0
- package/dist/modules/workspace/startup/beside-checkout.d.ts +8 -5
- package/dist/modules/workspace/startup/beside-checkout.d.ts.map +1 -1
- package/dist/modules/workspace/startup/beside-checkout.js +14 -5
- package/dist/modules/workspace/startup/beside-checkout.js.map +1 -1
- package/dist/modules/workspace/worker-pool.d.ts +3 -4
- package/dist/modules/workspace/worker-pool.d.ts.map +1 -1
- package/dist/modules/workspace/worker-pool.js.map +1 -1
- package/dist/modules/workspace/workspace-tmp.d.ts +146 -0
- package/dist/modules/workspace/workspace-tmp.d.ts.map +1 -0
- package/dist/modules/workspace/workspace-tmp.js +435 -0
- package/dist/modules/workspace/workspace-tmp.js.map +1 -0
- package/dist/modules/workspace/workspace.routes.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.routes.js +5 -26
- package/dist/modules/workspace/workspace.routes.js.map +1 -1
- package/dist/modules/workspace/workspace.service.d.ts +47 -6
- package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.service.js +86 -6
- package/dist/modules/workspace/workspace.service.js.map +1 -1
- package/dist/modules/workspace/workspace.tools.d.ts +3 -2
- package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.tools.js +531 -137
- package/dist/modules/workspace/workspace.tools.js.map +1 -1
- package/dist/shared/oauth-token-error.d.ts +23 -0
- package/dist/shared/oauth-token-error.d.ts.map +1 -0
- package/dist/shared/oauth-token-error.js +47 -0
- package/dist/shared/oauth-token-error.js.map +1 -0
- package/dist/shared/path-order.d.ts +28 -8
- package/dist/shared/path-order.d.ts.map +1 -1
- package/dist/shared/path-order.js +37 -8
- package/dist/shared/path-order.js.map +1 -1
- package/dist/shared/read-capped.d.ts +19 -0
- package/dist/shared/read-capped.d.ts.map +1 -0
- package/dist/shared/read-capped.js +45 -0
- package/dist/shared/read-capped.js.map +1 -0
- package/migrations/0022_session_version.sql +6 -0
- package/migrations/0023_agent_path.sql +3 -0
- package/migrations/meta/0022_snapshot.json +2360 -0
- package/migrations/meta/0023_snapshot.json +2378 -0
- package/migrations/meta/_journal.json +14 -0
- package/package.json +4 -3
- package/src/__tests__/hexis-catalog.ts +144 -0
- package/src/__tests__/pg-scratch.test.ts +69 -0
- package/src/__tests__/pg-scratch.ts +31 -0
- package/src/__tests__/real-disk.ts +21 -0
- package/src/__tests__/slow-ripgrep.ts +65 -0
- package/src/__tests__/tokens.ts +19 -0
- package/src/__tests__/tool-manuals.ts +32 -0
- package/src/__tests__/tool-wiring.ts +25 -0
- package/src/core/__tests__/boot-without-ripgrep.test.ts +34 -0
- package/src/core/__tests__/catalog-revision.test.ts +89 -0
- package/src/core/__tests__/damaged-document.tools.test.ts +2 -2
- package/src/core/__tests__/gated-boot.test.ts +8 -1
- package/src/core/__tests__/lifecycle.test.ts +46 -13
- package/src/core/__tests__/oauth-sign-in-real-file.test.ts +179 -0
- package/src/core/catalog-revision.ts +24 -2
- package/src/core/core-ports.ts +42 -0
- package/src/core/create-core-server.ts +14 -1
- package/src/core/create-core-services.ts +62 -15
- package/src/core/lifecycle.ts +26 -2
- package/src/index.ts +1 -1
- package/src/modules/access/__tests__/access-control.admin-root-floor.test.ts +12 -0
- package/src/modules/access/__tests__/access-control.colliding-name-cases.test.ts +113 -0
- package/src/modules/access/__tests__/access-control.frontmatter-head.test.ts +117 -0
- package/src/modules/access/__tests__/access-control.group-named-admin.test.ts +122 -0
- package/src/modules/access/__tests__/access-control.preview-relocation.test.ts +50 -0
- package/src/modules/access/__tests__/access-declarations.test.ts +19 -0
- package/src/modules/access/__tests__/access-groups.test.ts +55 -22
- package/src/modules/access/__tests__/access-mutation.service.test.ts +85 -59
- package/src/modules/access/__tests__/access-restrict-here.test.ts +7 -5
- package/src/modules/access/__tests__/access.routes.admins.test.ts +1 -0
- package/src/modules/access/__tests__/access.routes.batch.test.ts +2 -0
- package/src/modules/access/__tests__/access.routes.folder-governs.test.ts +2 -0
- package/src/modules/access/__tests__/access.routes.group-grant.test.ts +50 -14
- package/src/modules/access/__tests__/access.routes.overrides.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.proposal-branch.test.ts +1 -0
- package/src/modules/access/__tests__/access.routes.prospective.test.ts +52 -10
- package/src/modules/access/__tests__/access.routes.revoke.test.ts +18 -13
- package/src/modules/access/__tests__/access.routes.unknown-email.test.ts +2 -0
- package/src/modules/access/__tests__/grant-sources.test.ts +20 -15
- package/src/modules/access/__tests__/groups-admin.routes.test.ts +61 -0
- package/src/modules/access/__tests__/groups-admin.service.test.ts +211 -18
- package/src/modules/access/__tests__/holder-changes.test.ts +127 -0
- package/src/modules/access/__tests__/reference-scan.test.ts +366 -14
- package/src/modules/access/__tests__/roles-admin.security.test.ts +1 -1
- package/src/modules/access/__tests__/roles-admin.service.test.ts +43 -22
- package/src/modules/access/__tests__/roles-capabilities.test.ts +6 -2
- package/src/modules/access/__tests__/roles.routes.test.ts +1 -1
- package/src/modules/access/access-control.interface.ts +43 -10
- package/src/modules/access/access-control.service.ts +250 -72
- package/src/modules/access/access-mutation.service.ts +48 -53
- package/src/modules/access/access-view.ts +12 -10
- package/src/modules/access/access.routes.ts +66 -37
- package/src/modules/access/groups-admin.routes.ts +4 -2
- package/src/modules/access/groups-admin.service.ts +114 -44
- package/src/modules/access/groups-edit.ts +1 -1
- package/src/modules/access/index.ts +1 -1
- package/src/modules/access/reference-scan.ts +319 -46
- package/src/modules/access/roles-admin.service.ts +43 -26
- package/src/modules/access/synced-groups-writer.ts +1 -1
- package/src/modules/access-model/__tests__/access-grammar.test.ts +38 -1
- package/src/modules/access-model/__tests__/access-splice.test.ts +50 -8
- package/src/modules/access-model/access-grammar.ts +65 -20
- package/src/modules/access-model/access-splice.ts +31 -23
- package/src/modules/access-model/group-files.ts +5 -0
- package/src/modules/agent-guide/__tests__/agent-guide.test.ts +110 -25
- package/src/modules/agent-guide/__tests__/agent-guide.tools.test.ts +38 -11
- package/src/modules/agent-guide/__tests__/guide-budget.test.ts +95 -0
- package/src/modules/agent-guide/__tests__/guide-eval.test.ts +182 -0
- package/src/modules/agent-guide/__tests__/guide-matches-code.test.ts +263 -0
- package/src/modules/agent-guide/__tests__/tool-surface.json +514 -0
- package/src/modules/agent-guide/__tests__/tool-surface.test.ts +75 -0
- package/src/modules/agent-guide/agent-guide.tools.ts +51 -22
- package/src/modules/agent-guide/agent-guide.ts +120 -13
- package/src/modules/agent-guide/guide-budget.ts +73 -0
- package/src/modules/agent-guide/index.ts +12 -0
- package/src/modules/agent-instructions/__tests__/shared-file-rules.test.ts +5 -4
- package/src/modules/agent-instructions/compose.ts +7 -1
- package/src/modules/agent-instructions/shared-file-rules.ts +27 -9
- package/src/modules/agent-scope/__tests__/agent-surfaces.connect-as.test.ts +421 -0
- package/src/modules/agent-scope/__tests__/connection-scope.test.ts +46 -0
- package/src/modules/agent-scope/__tests__/in-memory-kb.ts +148 -0
- package/src/modules/agent-scope/agent-scope.contract.ts +83 -0
- package/src/modules/agent-scope/connection-scope.ts +199 -0
- package/src/modules/agent-scope/index.ts +15 -0
- package/src/modules/audit/agent-audit.service.ts +2 -0
- package/src/modules/audit/audit.contract.ts +6 -0
- package/src/modules/auth/__tests__/auth.middleware.test.ts +30 -2
- package/src/modules/auth/__tests__/auth.routes.test.ts +71 -5
- package/src/modules/auth/__tests__/auth.service.test.ts +90 -9
- package/src/modules/auth/__tests__/password-change-sessions.pg.test.ts +269 -0
- package/src/modules/auth/account-admission.ts +19 -0
- package/src/modules/auth/auth.middleware.ts +45 -4
- package/src/modules/auth/auth.routes.ts +46 -29
- package/src/modules/auth/auth.service.ts +135 -34
- package/src/modules/auth/index.ts +2 -0
- package/src/modules/auth/oidc-auth-provider.ts +2 -9
- package/src/modules/code-mode/code-mode.tool.ts +2 -2
- package/src/modules/connection-probe/__tests__/connection-probe.service.test.ts +5 -24
- package/src/modules/connection-probe/connection-probe.service.ts +1 -34
- package/src/modules/database/__tests__/session-version-migration.pg.test.ts +133 -0
- package/src/modules/database/core-schema.ts +33 -0
- package/src/modules/declared-variables/__tests__/declared-variables.route.test.ts +44 -1
- package/src/modules/declared-variables/declared-variables.routes.ts +12 -1
- package/src/modules/embed/__tests__/embed.tools.test.ts +12 -0
- package/src/modules/embed/embed.tools.ts +5 -0
- package/src/modules/kb-fs/__tests__/locking-filesystem.test.ts +25 -0
- package/src/modules/kb-fs/__tests__/repo-path.test.ts +53 -8
- package/src/modules/kb-fs/index.ts +2 -0
- package/src/modules/kb-fs/locking-filesystem.ts +7 -1
- package/src/modules/kb-fs/repo-path.ts +33 -7
- package/src/modules/kb-fs/tmp-ref.ts +81 -0
- package/src/modules/mcp/__tests__/connect-as.pg.test.ts +137 -0
- package/src/modules/mcp/__tests__/mcp-auth.middleware.test.ts +29 -5
- package/src/modules/mcp/__tests__/mcp-routes-harness.ts +8 -0
- package/src/modules/mcp/__tests__/mcp.connect-as.test.ts +195 -0
- package/src/modules/mcp/__tests__/mcp.routes.connect-as.test.ts +192 -0
- package/src/modules/mcp/__tests__/oauth-consent.connect-as.test.ts +146 -0
- package/src/modules/mcp/mcp-auth.middleware.ts +19 -2
- package/src/modules/mcp/mcp.routes.ts +39 -3
- package/src/modules/mcp/mcp.service.ts +112 -52
- package/src/modules/mcp/oauth/bevel-oauth-provider.ts +46 -8
- package/src/modules/mcp/oauth/oauth-consent.routes.ts +41 -1
- package/src/modules/plugins/__tests__/plugins.tools.test.ts +38 -2
- package/src/modules/plugins/index.ts +1 -1
- package/src/modules/plugins/plugin-links.ts +19 -2
- package/src/modules/plugins/plugins.routes.ts +35 -4
- package/src/modules/secrets-vault/__tests__/connect-pending.route.test.ts +113 -0
- package/src/modules/secrets-vault/__tests__/db-secrets-vault.oauth.test.ts +430 -3
- package/src/modules/secrets-vault/__tests__/oauth-live-declaration.route.test.ts +218 -0
- package/src/modules/secrets-vault/__tests__/oauth-return-to.route.test.ts +39 -6
- package/src/modules/secrets-vault/db-secrets-vault.service.ts +170 -27
- package/src/modules/secrets-vault/index.ts +1 -1
- package/src/modules/secrets-vault/secrets-vault.contract.ts +61 -11
- package/src/modules/secrets-vault/secrets-vault.routes.ts +114 -42
- package/src/modules/settings/oidc-check.ts +5 -18
- package/src/modules/skills/__tests__/skills.service.test.ts +34 -0
- package/src/modules/skills/index.ts +7 -2
- package/src/modules/skills/skills.contract.ts +17 -0
- package/src/modules/skills/skills.service.ts +5 -1
- package/src/modules/skills/skills.tools.ts +45 -14
- package/src/modules/tool-auth/__tests__/external-api-key.service.test.ts +4 -0
- package/src/modules/tool-auth/external-api-key.interface.ts +11 -1
- package/src/modules/tool-auth/external-api-key.service.ts +5 -2
- package/src/modules/tool-auth/index.ts +1 -1
- package/src/modules/tool-auth/internal-token.service.ts +10 -0
- package/src/modules/tool-auth/tool-auth.middleware.ts +45 -3
- package/src/modules/tool-helpers/__tests__/agent-roles-write.test.ts +19 -11
- package/src/modules/tool-helpers/__tests__/can-write.tools.test.ts +3 -1
- package/src/modules/tool-helpers/__tests__/route-tool-schemas.catalog.test.ts +38 -0
- package/src/modules/tool-helpers/tool-context.ts +10 -0
- package/src/modules/tool-helpers/tool-def.ts +1 -1
- package/src/modules/tool-helpers/tool-handler.ts +34 -0
- package/src/modules/tool-helpers/tool.contract.ts +10 -0
- package/src/modules/tool-helpers/validate-token.ts +4 -2
- package/src/modules/tool-manuals/__tests__/tool-manuals.archive.route.test.ts +80 -4
- package/src/modules/tool-manuals/__tests__/tool-manuals.mcp-oauth.test.ts +197 -11
- package/src/modules/tool-manuals/__tests__/tool-manuals.service.test.ts +42 -0
- package/src/modules/tool-manuals/__tests__/tool-manuals.tools.test.ts +99 -8
- package/src/modules/tool-manuals/index.ts +6 -2
- package/src/modules/tool-manuals/mcp-json-discovery.ts +73 -34
- package/src/modules/tool-manuals/tool-manuals.contract.ts +40 -6
- package/src/modules/tool-manuals/tool-manuals.routes.ts +40 -3
- package/src/modules/tool-manuals/tool-manuals.service.ts +169 -61
- package/src/modules/tool-manuals/tool-manuals.tools.ts +81 -25
- package/src/modules/tool-registry/__tests__/tool-description-length.test.ts +6 -113
- package/src/modules/tool-registry/manual.routes.ts +26 -5
- package/src/modules/tool-registry/tool.contract.ts +7 -0
- package/src/modules/workflow/__tests__/workflow.service.facade.test.ts +1 -1
- package/src/modules/workflow/__tests__/workflow.service.sync.test.ts +1 -1
- package/src/modules/workflow/agent-tools/__tests__/workflow.tools.test.ts +54 -3
- package/src/modules/workflow/agent-tools/workflow.tools.ts +36 -27
- package/src/modules/workflow/git/__tests__/git.service.list-branches.test.ts +130 -3
- package/src/modules/workflow/git/git.service.ts +29 -48
- package/src/modules/workflow/workflow.service.ts +5 -0
- package/src/modules/workspace/__tests__/git-internals.security.test.ts +2 -2
- package/src/modules/workspace/__tests__/holds-nul.test.ts +66 -0
- package/src/modules/workspace/__tests__/rest-tool-arguments.test.ts +3 -3
- package/src/modules/workspace/__tests__/ripgrep-search.test.ts +570 -0
- package/src/modules/workspace/__tests__/ripgrep-version.test.ts +29 -0
- package/src/modules/workspace/__tests__/workspace-tmp.tools.test.ts +928 -0
- package/src/modules/workspace/__tests__/workspace.routes.read-gate.test.ts +17 -37
- package/src/modules/workspace/__tests__/workspace.service.read-filter.test.ts +20 -8
- package/src/modules/workspace/__tests__/workspace.tools.agents-file.test.ts +10 -12
- package/src/modules/workspace/__tests__/workspace.tools.branch-errors.test.ts +22 -10
- package/src/modules/workspace/__tests__/workspace.tools.test.ts +549 -162
- package/src/modules/workspace/agent-access.gate.ts +1 -1
- package/src/modules/workspace/file-readers/__tests__/doc-extract.service.test.ts +10 -0
- package/src/modules/workspace/file-readers/doc-extract.service.ts +71 -38
- package/src/modules/workspace/index.ts +20 -0
- package/src/modules/workspace/nul-scan.ts +50 -0
- package/src/modules/workspace/pattern-matcher.contract.ts +123 -32
- package/src/modules/workspace/ripgrep-search.ts +715 -0
- package/src/modules/workspace/ripgrep-version.ts +35 -0
- package/src/modules/workspace/startup/__tests__/beside-checkout.test.ts +11 -0
- package/src/modules/workspace/startup/beside-checkout.ts +13 -5
- package/src/modules/workspace/worker-pool.ts +3 -4
- package/src/modules/workspace/workspace-tmp.ts +457 -0
- package/src/modules/workspace/workspace.routes.ts +6 -27
- package/src/modules/workspace/workspace.service.ts +92 -15
- package/src/modules/workspace/workspace.tools.ts +574 -176
- package/src/shared/__tests__/read-capped.test.ts +68 -0
- package/src/shared/oauth-token-error.ts +46 -0
- package/src/shared/path-order.ts +37 -8
- package/src/shared/read-capped.ts +40 -0
- package/starter-packs/engineering/Plugins/engineering-starter/access.md +1 -1
- package/starter-packs/general/Plugins/general-starter/access.md +1 -1
- package/starter-packs/operations/Plugins/operations-starter/access.md +1 -1
- package/starter-packs/sales/Plugins/sales-starter/access.md +1 -1
- package/starter-packs/support/Plugins/support-starter/access.md +1 -1
- package/agent-guide/finding-things.md +0 -7
- package/agent-guide/introduction.md +0 -27
- package/dist/modules/workspace/bounded-matcher.d.ts +0 -73
- package/dist/modules/workspace/bounded-matcher.d.ts.map +0 -1
- package/dist/modules/workspace/bounded-matcher.js +0 -200
- package/dist/modules/workspace/bounded-matcher.js.map +0 -1
- package/src/modules/workspace/__tests__/bounded-matcher.test.ts +0 -213
- package/src/modules/workspace/bounded-matcher.ts +0 -271
|
@@ -3,13 +3,23 @@ import type { IToolRegistry, UtcpTool } from '../tool-registry/index.js';
|
|
|
3
3
|
import { GET_AGENT_GUIDE_TOOL, TOOL_DESCRIPTION_CAP } from '../tool-registry/index.js';
|
|
4
4
|
import { ToolError, toolDef } from '../tool-helpers/index.js';
|
|
5
5
|
import type { ToolHandlerFactory } from '../tool-helpers/index.js';
|
|
6
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
AGENT_GUIDE_FILE,
|
|
8
|
+
START_HERE_SECTION_ID,
|
|
9
|
+
WHOLE_GUIDE_SECTION,
|
|
10
|
+
joinGuideSections,
|
|
11
|
+
type AgentGuideSectionsReader,
|
|
12
|
+
} from './agent-guide.js';
|
|
7
13
|
|
|
8
14
|
export { GET_AGENT_GUIDE_TOOL };
|
|
9
15
|
|
|
10
16
|
/**
|
|
11
|
-
* The one tool that returns the guide on its own
|
|
12
|
-
*
|
|
17
|
+
* The one tool that returns the guide on its own: the start section when no
|
|
18
|
+
* section is named, one section by id, or the whole guide (`all`). Start
|
|
19
|
+
* section by default because this is the call every tool description tells
|
|
20
|
+
* an agent, and each sub-agent it starts, to make first: answering it with
|
|
21
|
+
* the whole guide made the most-read text the platform has also its longest.
|
|
22
|
+
* It takes nothing else: the guide is the platform's text for this
|
|
13
23
|
* deployment, the same for every caller and every branch, and reading it
|
|
14
24
|
* touches no file — so no `branch`, no `sessionId`, and no access gate. The
|
|
15
25
|
* other way to the same text is a `read_file` of `AGENTS.md` at the
|
|
@@ -33,27 +43,30 @@ export function registerAgentGuideTool(
|
|
|
33
43
|
const build = async (): Promise<UtcpTool> => {
|
|
34
44
|
const list = await sections();
|
|
35
45
|
const describe = (sectionList: string) =>
|
|
36
|
-
"The platform's guide to this knowledge base
|
|
37
|
-
'
|
|
38
|
-
'
|
|
39
|
-
'`section
|
|
46
|
+
"The platform's guide to this knowledge base. ALWAYS call this first, before anything else in the " +
|
|
47
|
+
'platform. With no `section` it returns the start section: the default branch every file tool takes, the ' +
|
|
48
|
+
'first-call rules, and which section answers which question. Then fetch only the section a task needs, by ' +
|
|
49
|
+
'`section`; only `"' +
|
|
50
|
+
WHOLE_GUIDE_SECTION +
|
|
51
|
+
'"` returns the whole guide. `read_file` on `' +
|
|
40
52
|
AGENT_GUIDE_FILE +
|
|
41
|
-
"` at the KB root
|
|
53
|
+
"` at the KB root answers with the same start section (after the knowledge base's own " +
|
|
42
54
|
AGENT_GUIDE_FILE +
|
|
43
|
-
` when it has one. Sections: ${sectionList}.`;
|
|
55
|
+
` when it has one). Returns \`{ guide }\` as markdown. Sections: ${sectionList}.`;
|
|
44
56
|
// The description stays under the cap WHATEVER a distribution adds, in
|
|
45
57
|
// three steps: every id with its title; every id alone; as many ids as
|
|
46
58
|
// fit and a count of the rest. An id a client cut off the end would be a
|
|
47
59
|
// section an agent cannot ask for — so nothing is ever cut: the one
|
|
48
|
-
// complete list of sections is `sections` on the
|
|
49
|
-
// which the description names when it cannot carry them
|
|
60
|
+
// complete list of sections is `sections` on the answer to a call
|
|
61
|
+
// without one, which the description names when it cannot carry them
|
|
62
|
+
// all itself.
|
|
50
63
|
const titled = describe(list.map((s) => `\`${s.id}\` (${s.title})`).join(', '));
|
|
51
64
|
const ids = list.map((s) => `\`${s.id}\``);
|
|
52
65
|
const counted = (shown: number) =>
|
|
53
66
|
describe(
|
|
54
67
|
shown === 0
|
|
55
|
-
? `${ids.length}, named under \`sections\` in the
|
|
56
|
-
: [...ids.slice(0, shown), `and ${ids.length - shown} more, all named under \`sections\` in the
|
|
68
|
+
? `${ids.length}, named under \`sections\` in the answer`
|
|
69
|
+
: [...ids.slice(0, shown), `and ${ids.length - shown} more, all named under \`sections\` in the answer`].join(', '),
|
|
57
70
|
);
|
|
58
71
|
let description = titled.length <= TOOL_DESCRIPTION_CAP ? titled : describe(ids.join(', '));
|
|
59
72
|
for (let shown = ids.length; description.length > TOOL_DESCRIPTION_CAP && shown > 0; shown--) {
|
|
@@ -69,8 +82,10 @@ export function registerAgentGuideTool(
|
|
|
69
82
|
section: {
|
|
70
83
|
type: 'string',
|
|
71
84
|
description:
|
|
72
|
-
'Optional: the id of one section to read
|
|
73
|
-
'
|
|
85
|
+
'Optional: the id of one section to read (the ids are listed in this description, and every one under ' +
|
|
86
|
+
'`sections` in the answer), or `"' +
|
|
87
|
+
WHOLE_GUIDE_SECTION +
|
|
88
|
+
'"` for the whole guide. Omit it for the start section.',
|
|
74
89
|
},
|
|
75
90
|
},
|
|
76
91
|
additionalProperties: false,
|
|
@@ -78,18 +93,18 @@ export function registerAgentGuideTool(
|
|
|
78
93
|
outputs: {
|
|
79
94
|
type: 'object',
|
|
80
95
|
properties: {
|
|
81
|
-
guide: { type: 'string', description: 'The
|
|
96
|
+
guide: { type: 'string', description: 'The section asked for (the start section by default), or the whole guide, as markdown.' },
|
|
82
97
|
sections: {
|
|
83
98
|
type: 'array',
|
|
84
|
-
description:
|
|
99
|
+
description: `Without \`section\`, or with \`"${WHOLE_GUIDE_SECTION}"\`: every section of the guide, in order, by id and heading — the complete list.`,
|
|
85
100
|
items: {
|
|
86
101
|
type: 'object',
|
|
87
102
|
properties: { id: { type: 'string' }, title: { type: 'string' } },
|
|
88
103
|
required: ['id', 'title'],
|
|
89
104
|
},
|
|
90
105
|
},
|
|
91
|
-
section: { type: 'string', description: '
|
|
92
|
-
title: { type: 'string', description: '
|
|
106
|
+
section: { type: 'string', description: 'The id of the one section returned.' },
|
|
107
|
+
title: { type: 'string', description: 'Its heading.' },
|
|
93
108
|
},
|
|
94
109
|
required: ['guide'],
|
|
95
110
|
},
|
|
@@ -102,15 +117,29 @@ export function registerAgentGuideTool(
|
|
|
102
117
|
router.post(
|
|
103
118
|
`/agent/tools/${GET_AGENT_GUIDE_TOOL}`,
|
|
104
119
|
toolAuth,
|
|
105
|
-
toolHandler(async (args) => {
|
|
120
|
+
toolHandler(async (args, ctx) => {
|
|
106
121
|
const list = await sections();
|
|
122
|
+
const index = list.map((s) => ({ id: s.id, title: s.title }));
|
|
107
123
|
const wanted = typeof args.section === 'string' ? args.section.trim() : '';
|
|
108
|
-
|
|
124
|
+
// A distribution that dropped the start section gets the whole guide by
|
|
125
|
+
// default, as before there was one: never an answer with nothing in it.
|
|
126
|
+
const start = list.find((s) => s.id === START_HERE_SECTION_ID);
|
|
127
|
+
// A connection made as an agent configuration is told so at the top of
|
|
128
|
+
// the guide's first answer and of the whole guide: the catalog it
|
|
129
|
+
// describes is narrowed to that agent. Everything is told nothing new,
|
|
130
|
+
// so its guide is the same text.
|
|
131
|
+
const connection = ctx.connectionScope?.describe() ?? null;
|
|
132
|
+
const told = (guide: string) => ({
|
|
133
|
+
guide: connection ? `> ${connection}\n\n${guide}` : guide,
|
|
134
|
+
...(connection ? { connection } : {}),
|
|
135
|
+
});
|
|
136
|
+
if (wanted === WHOLE_GUIDE_SECTION || (!wanted && !start)) return { ...told(joinGuideSections(list)), sections: index };
|
|
137
|
+
if (!wanted) return { ...told(start!.body), section: start!.id, title: start!.title, sections: index };
|
|
109
138
|
const one = list.find((s) => s.id === wanted);
|
|
110
139
|
if (!one) {
|
|
111
140
|
throw new ToolError(
|
|
112
141
|
`The guide has no section "${wanted}". Sections: ${list.map((s) => `\`${s.id}\``).join(', ')}. ` +
|
|
113
|
-
|
|
142
|
+
`Omit \`section\` for the start section, or pass \`"${WHOLE_GUIDE_SECTION}"\` for the whole guide.`,
|
|
114
143
|
400,
|
|
115
144
|
);
|
|
116
145
|
}
|
|
@@ -20,10 +20,17 @@
|
|
|
20
20
|
* The sections ship as markdown files in the package's `agent-guide/` folder
|
|
21
21
|
* (see `assets.ts`), one per section, with the layout placeholders the old
|
|
22
22
|
* template carried (`{{knowledgeBaseDir}}`, `{{skillsDir}}`, `{{pluginsDir}}`,
|
|
23
|
-
* `{{agentsFile}}`)
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
23
|
+
* `{{agentsFile}}`), the checkout folder's `{{kbDirName}}` and the default
|
|
24
|
+
* branch's `{{defaultBranch}}`. ONE section is computed rather than read: the
|
|
25
|
+
* rules every file tool shares, which the MCP handshake also sends — the same
|
|
26
|
+
* string in both places, from `shared-file-rules.ts`, so a rule cannot be
|
|
27
|
+
* changed in one and left stale in the other.
|
|
28
|
+
*
|
|
29
|
+
* The guide is LAYERED (see openspec/changes/agent-guide-layers/design.md):
|
|
30
|
+
* `get_agent_guide` with no section answers with the short start section
|
|
31
|
+
* ({@link START_HERE_SECTION_ID}), which says which section answers which
|
|
32
|
+
* question, and an agent fetches the others by id when a task needs them.
|
|
33
|
+
* Each section has a token budget (`guide-budget.ts`), held by a test.
|
|
27
34
|
*/
|
|
28
35
|
|
|
29
36
|
import fs from 'node:fs/promises';
|
|
@@ -59,6 +66,13 @@ export interface AgentGuideSection {
|
|
|
59
66
|
* could only misread a folder name it STATES as a placeholder.
|
|
60
67
|
*/
|
|
61
68
|
literal?: boolean;
|
|
69
|
+
/**
|
|
70
|
+
* The question this section answers, as a row of the start section's
|
|
71
|
+
* "which section answers what" table. Core's sections are in that table
|
|
72
|
+
* already; a distribution sets it on a section it adds, so an agent that
|
|
73
|
+
* reads only the start section is routed to it.
|
|
74
|
+
*/
|
|
75
|
+
asks?: string;
|
|
62
76
|
}
|
|
63
77
|
|
|
64
78
|
/**
|
|
@@ -86,21 +100,35 @@ export const WORKING_WITH_FILES_SECTION_ID = 'working-with-files';
|
|
|
86
100
|
*/
|
|
87
101
|
export const NEW_KNOWLEDGE_BASE_SECTION_ID = 'new-knowledge-base';
|
|
88
102
|
|
|
103
|
+
/**
|
|
104
|
+
* The first-contact section: what `get_agent_guide` answers when no section is
|
|
105
|
+
* named. Short on purpose, and the one place that maps each question to the
|
|
106
|
+
* section answering it, so an agent fetches one section rather than the guide.
|
|
107
|
+
*/
|
|
108
|
+
export const START_HERE_SECTION_ID = 'start-here';
|
|
109
|
+
|
|
110
|
+
/** The `section` that asks `get_agent_guide` for every section at once. */
|
|
111
|
+
export const WHOLE_GUIDE_SECTION = 'all';
|
|
112
|
+
|
|
89
113
|
/**
|
|
90
114
|
* Core's sections, in reading order. Every id but the shared-rules one names
|
|
91
115
|
* a file in the package's `agent-guide/` folder.
|
|
92
116
|
*/
|
|
93
117
|
export const CORE_SECTION_IDS: readonly string[] = Object.freeze([
|
|
94
|
-
|
|
118
|
+
START_HERE_SECTION_ID,
|
|
119
|
+
'how-agents-find-things',
|
|
120
|
+
'for-git-users',
|
|
121
|
+
'glossary',
|
|
95
122
|
'directory-structure',
|
|
96
123
|
'where-a-new-file-goes',
|
|
97
124
|
WORKING_WITH_FILES_SECTION_ID,
|
|
98
125
|
'access-control',
|
|
126
|
+
'drafts-and-change-requests',
|
|
99
127
|
'skills',
|
|
128
|
+
'tools',
|
|
100
129
|
'tool-manuals',
|
|
101
130
|
'html-views',
|
|
102
131
|
'conventions',
|
|
103
|
-
'finding-things',
|
|
104
132
|
NEW_KNOWLEDGE_BASE_SECTION_ID,
|
|
105
133
|
]);
|
|
106
134
|
|
|
@@ -174,11 +202,21 @@ export interface AgentGuideContext {
|
|
|
174
202
|
* deployment's tools report back.
|
|
175
203
|
*/
|
|
176
204
|
kbDirName?: string;
|
|
205
|
+
/**
|
|
206
|
+
* The knowledge base's default branch, rendered into `{{defaultBranch}}` so
|
|
207
|
+
* the start section names the branch every file tool's `branch` takes for
|
|
208
|
+
* what is live. Read when the guide is composed: a fresh deployment gets its
|
|
209
|
+
* branch model from the setup screen after the services are built.
|
|
210
|
+
*/
|
|
211
|
+
defaultBranch?: string;
|
|
177
212
|
}
|
|
178
213
|
|
|
179
214
|
/** The checkout folder's name when none is given — core's own default. */
|
|
180
215
|
const DEFAULT_KB_DIR_NAME = 'knowledge-base';
|
|
181
216
|
|
|
217
|
+
/** What `{{defaultBranch}}` reads as when no branch is configured yet: a name no branch can have. */
|
|
218
|
+
const UNCONFIGURED_DEFAULT_BRANCH = '<the default branch>';
|
|
219
|
+
|
|
182
220
|
/** One section of the guide as an agent reads it: rendered, with the heading's text as its title. */
|
|
183
221
|
export interface RenderedGuideSection {
|
|
184
222
|
id: string;
|
|
@@ -197,7 +235,11 @@ export type AgentGuideSectionsReader = () => Promise<RenderedGuideSection[]>;
|
|
|
197
235
|
* with its title. The whole guide is these joined (see
|
|
198
236
|
* {@link composeAgentGuide}); `get_agent_guide` also serves one at a time.
|
|
199
237
|
*
|
|
200
|
-
* A hook may append, replace and drop sections
|
|
238
|
+
* A hook may append, replace and drop sections. It replaces one by returning
|
|
239
|
+
* its own under the same id, beside core's or in its place: of two sections
|
|
240
|
+
* under one id the LAST is served, where the FIRST stood, so a distribution
|
|
241
|
+
* overrides core's `start-here` or `html-views` by adding its own and the
|
|
242
|
+
* guide keeps its order (see {@link oneSectionPerId}). ONE exception: the
|
|
201
243
|
* shared file rules ({@link WORKING_WITH_FILES_SECTION_ID}) must come back
|
|
202
244
|
* WITH TEXT IN THEM, as core's or as the hook's own replacement. A client
|
|
203
245
|
* that drops the handshake instructions has the guide as the only place to
|
|
@@ -215,18 +257,25 @@ export async function agentGuideSections(
|
|
|
215
257
|
): Promise<RenderedGuideSection[]> {
|
|
216
258
|
const resolved = resolveKbLayout(layout);
|
|
217
259
|
const core = await coreAgentGuideSections(resolved);
|
|
218
|
-
const sections = hook ? await hook(core, resolved) : core;
|
|
260
|
+
const sections = withRoutes(oneSectionPerId(hook ? await hook(core, resolved) : core));
|
|
219
261
|
const kbDirName = context.kbDirName?.trim() || DEFAULT_KB_DIR_NAME;
|
|
262
|
+
const defaultBranch = context.defaultBranch?.trim() || UNCONFIGURED_DEFAULT_BRANCH;
|
|
220
263
|
const rendered = sections.map((section) => {
|
|
221
264
|
const body = (
|
|
222
265
|
section.literal
|
|
223
266
|
? section.body
|
|
224
|
-
: renderKbLayoutPlaceholders(
|
|
267
|
+
: renderKbLayoutPlaceholders(
|
|
268
|
+
section.body
|
|
269
|
+
.replaceAll('{{kbDirName}}', () => kbDirName)
|
|
270
|
+
.replaceAll('{{defaultBranch}}', () => defaultBranch),
|
|
271
|
+
resolved,
|
|
272
|
+
)
|
|
225
273
|
).trim();
|
|
226
274
|
return { id: section.id, title: titleOf(body, section.id), body };
|
|
227
275
|
});
|
|
228
|
-
//
|
|
229
|
-
//
|
|
276
|
+
// One section per id by now (`oneSectionPerId`), so a hook's own version
|
|
277
|
+
// of the rules is what is judged, on what survives the empty-body filter
|
|
278
|
+
// below.
|
|
230
279
|
const rules = rendered.filter((section) => section.id === WORKING_WITH_FILES_SECTION_ID);
|
|
231
280
|
if (!rules.some((section) => section.body.length > 0)) {
|
|
232
281
|
throw new Error(
|
|
@@ -237,6 +286,51 @@ export async function agentGuideSections(
|
|
|
237
286
|
return rendered.filter((section) => section.body.length > 0);
|
|
238
287
|
}
|
|
239
288
|
|
|
289
|
+
/**
|
|
290
|
+
* One section per id. A hook that returns an id twice (its own version of a
|
|
291
|
+
* core section, added beside core's) means the later one: it is served in
|
|
292
|
+
* the earlier one's place, so a distribution overrides a section by adding
|
|
293
|
+
* its own under the same id, and the guide keeps core's order. Without this
|
|
294
|
+
* the whole guide carried both and `get_agent_guide` served the first, which
|
|
295
|
+
* was always core's.
|
|
296
|
+
*/
|
|
297
|
+
function oneSectionPerId(sections: readonly AgentGuideSection[]): readonly AgentGuideSection[] {
|
|
298
|
+
const at = new Map<string, number>();
|
|
299
|
+
const out: AgentGuideSection[] = [];
|
|
300
|
+
for (const section of sections) {
|
|
301
|
+
const index = at.get(section.id);
|
|
302
|
+
if (index === undefined) {
|
|
303
|
+
at.set(section.id, out.length);
|
|
304
|
+
out.push(section);
|
|
305
|
+
} else {
|
|
306
|
+
out[index] = section;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
return out;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* Adds a row to the start section's routing table for every section that
|
|
314
|
+
* says what it {@link AgentGuideSection.asks} and is not routed there yet.
|
|
315
|
+
* The rows go after the table's last row. A start section without the table
|
|
316
|
+
* (a distribution replaced it) is left as it is.
|
|
317
|
+
*/
|
|
318
|
+
function withRoutes(sections: readonly AgentGuideSection[]): readonly AgentGuideSection[] {
|
|
319
|
+
const start = sections.find((section) => section.id === START_HERE_SECTION_ID);
|
|
320
|
+
if (!start) return sections;
|
|
321
|
+
const routed = sections.filter((section) => section.asks?.trim() && !start.body.includes(`| \`${section.id}\` |`));
|
|
322
|
+
if (routed.length === 0) return sections;
|
|
323
|
+
const lines = start.body.split('\n');
|
|
324
|
+
const header = lines.findIndex((line) => /^\|\s*Question\s*\|\s*Section\s*\|/.test(line));
|
|
325
|
+
if (header < 0) return sections;
|
|
326
|
+
let last = header;
|
|
327
|
+
while (last + 1 < lines.length && lines[last + 1]!.startsWith('|')) last += 1;
|
|
328
|
+
const rows = routed.map((section) => `| ${section.asks!.trim().replaceAll('|', '\\|')} | \`${section.id}\` |`);
|
|
329
|
+
lines.splice(last + 1, 0, ...rows);
|
|
330
|
+
const body = lines.join('\n');
|
|
331
|
+
return sections.map((section) => (section === start ? { ...start, body } : section));
|
|
332
|
+
}
|
|
333
|
+
|
|
240
334
|
/**
|
|
241
335
|
* The heading's text, or the id when the section opens with no heading. An
|
|
242
336
|
* ATX heading may close with a run of `#` of its own (`## Custom ##`); that
|
|
@@ -260,6 +354,19 @@ export async function composeAgentGuide(
|
|
|
260
354
|
return joinGuideSections(await agentGuideSections(layout, hook, context));
|
|
261
355
|
}
|
|
262
356
|
|
|
357
|
+
/**
|
|
358
|
+
* What a `read_file` of the guide's name answers: the start section and the
|
|
359
|
+
* list of every section, the same as `get_agent_guide` with no `section`, so
|
|
360
|
+
* no read hands an agent the whole guide unless it asks for it. A guide
|
|
361
|
+
* without a start section (a distribution dropped it) is answered whole.
|
|
362
|
+
*/
|
|
363
|
+
export function guideStartText(sections: readonly RenderedGuideSection[]): string {
|
|
364
|
+
const start = sections.find((section) => section.id === START_HERE_SECTION_ID);
|
|
365
|
+
if (!start) return joinGuideSections(sections);
|
|
366
|
+
const list = sections.map((section) => `- \`${section.id}\`: ${section.title}`).join('\n');
|
|
367
|
+
return `${start.body}\n\n### Every section\n\n${list}\n`;
|
|
368
|
+
}
|
|
369
|
+
|
|
263
370
|
/** The sections as one document, the way `composeAgentGuide` joins them. */
|
|
264
371
|
export function joinGuideSections(sections: readonly RenderedGuideSection[]): string {
|
|
265
372
|
return `${sections.map((section) => section.body).join('\n\n')}\n`;
|
|
@@ -268,12 +375,12 @@ export function joinGuideSections(sections: readonly RenderedGuideSection[]): st
|
|
|
268
375
|
/**
|
|
269
376
|
* What a `read_file` of the guide's name answers when the knowledge base has an
|
|
270
377
|
* `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
|
|
378
|
+
* saying what follows, then the start of the platform's guide. Theirs first because it is
|
|
272
379
|
* the more specific of the two, and the line between so neither is read as
|
|
273
380
|
* part of the other.
|
|
274
381
|
*/
|
|
275
382
|
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`
|
|
383
|
+
"---\n\n_The text above is this knowledge base's own conventions file. The start of the platform's guide follows; `get_agent_guide` with a `section` returns the rest._";
|
|
277
384
|
|
|
278
385
|
export function withPlatformGuideAppended(ownText: string, guide: string): string {
|
|
279
386
|
// Their text as they wrote it, line endings normalised and the trailing
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* How much each layer of what an agent is told may cost, in tokens.
|
|
3
|
+
*
|
|
4
|
+
* Three layers (openspec/changes/agent-guide-layers/design.md): what every
|
|
5
|
+
* connection carries (the handshake instructions and the tool list), what an
|
|
6
|
+
* agent reads on first contact (the start section `get_agent_guide` answers
|
|
7
|
+
* with), and what it fetches only when a task needs it (every other section).
|
|
8
|
+
* A line in the first layer costs every conversation and every sub-agent; a
|
|
9
|
+
* line in the last costs only the tasks that fetch it. The budgets are what
|
|
10
|
+
* keeps the guide from growing into a document every agent loads whole and
|
|
11
|
+
* reads little of, which is what a customer's agent did fifteen times in one
|
|
12
|
+
* day.
|
|
13
|
+
*
|
|
14
|
+
* Counted with the `o200k_base` encoding by `__tests__/guide-budget.test.ts`.
|
|
15
|
+
* It is a real tokenizer that runs offline; it is not Claude's own, which
|
|
16
|
+
* usually counts somewhat more for the same text, so these are ceilings to
|
|
17
|
+
* compare against each other and over time rather than a model's bill.
|
|
18
|
+
*
|
|
19
|
+
* Every number is one a reviewer may move. The point of pinning them is that
|
|
20
|
+
* growing the guide is a decision someone takes, not a paragraph someone
|
|
21
|
+
* appends: a section that needs more room says why in the pull request that
|
|
22
|
+
* raises its line here.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
/** The encoding the budgets are counted in. */
|
|
26
|
+
export const GUIDE_TOKEN_ENCODING = 'o200k_base';
|
|
27
|
+
|
|
28
|
+
/** The platform's part of the handshake instructions: the header and the shared file rules. */
|
|
29
|
+
export const INSTRUCTIONS_TOKEN_BUDGET = 2_000;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* The platform's own tools as the hosted endpoint lists them to an MCP client:
|
|
33
|
+
* each name, description (with its `Call:` line and, on the four
|
|
34
|
+
* knowledge-base tools, the purpose prefix) and input schema. Measured over
|
|
35
|
+
* every registrar the root mounts, the change-request readers and `open_page`
|
|
36
|
+
* included: 46 tools, 17,278 tokens at 0.35.0 (an earlier figure of 15,710
|
|
37
|
+
* left those five out).
|
|
38
|
+
*/
|
|
39
|
+
export const TOOL_LIST_TOKEN_BUDGET = 17_500;
|
|
40
|
+
|
|
41
|
+
/** The ceiling for a section a distribution adds, which core's checks cannot see: the same as core's own. */
|
|
42
|
+
export const SECTION_TOKEN_BUDGET = 2_500;
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Each core section's budget, by id. A section without a line here fails the
|
|
46
|
+
* budget test: a new section starts by saying what it may cost.
|
|
47
|
+
*/
|
|
48
|
+
export const SECTION_TOKEN_BUDGETS: Readonly<Record<string, number>> = Object.freeze({
|
|
49
|
+
'start-here': 1_200,
|
|
50
|
+
'how-agents-find-things': SECTION_TOKEN_BUDGET,
|
|
51
|
+
'for-git-users': SECTION_TOKEN_BUDGET,
|
|
52
|
+
glossary: SECTION_TOKEN_BUDGET,
|
|
53
|
+
'directory-structure': SECTION_TOKEN_BUDGET,
|
|
54
|
+
'where-a-new-file-goes': SECTION_TOKEN_BUDGET,
|
|
55
|
+
'working-with-files': SECTION_TOKEN_BUDGET,
|
|
56
|
+
'access-control': SECTION_TOKEN_BUDGET,
|
|
57
|
+
'drafts-and-change-requests': SECTION_TOKEN_BUDGET,
|
|
58
|
+
skills: SECTION_TOKEN_BUDGET,
|
|
59
|
+
tools: SECTION_TOKEN_BUDGET,
|
|
60
|
+
'tool-manuals': SECTION_TOKEN_BUDGET,
|
|
61
|
+
// The page contract is long by nature (the frame, the bridge, the link
|
|
62
|
+
// rules, pages that load live data), and an agent fetches it only to build
|
|
63
|
+
// a page.
|
|
64
|
+
'html-views': 5_500,
|
|
65
|
+
conventions: SECTION_TOKEN_BUDGET,
|
|
66
|
+
'new-knowledge-base': SECTION_TOKEN_BUDGET,
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
/** Every core section at once: what `section: "all"` returns. */
|
|
70
|
+
export const WHOLE_GUIDE_TOKEN_BUDGET = 21_500;
|
|
71
|
+
|
|
72
|
+
/** One task: the start section plus the sections it routes the task to. */
|
|
73
|
+
export const TASK_TOKEN_BUDGET = 6_000;
|
|
@@ -3,10 +3,13 @@ export {
|
|
|
3
3
|
CORE_SECTION_IDS,
|
|
4
4
|
NEW_KNOWLEDGE_BASE_SECTION_ID,
|
|
5
5
|
PLATFORM_GUIDE_SEPARATOR,
|
|
6
|
+
START_HERE_SECTION_ID,
|
|
7
|
+
WHOLE_GUIDE_SECTION,
|
|
6
8
|
WORKING_WITH_FILES_SECTION_ID,
|
|
7
9
|
agentGuideSections,
|
|
8
10
|
composeAgentGuide,
|
|
9
11
|
coreAgentGuideSections,
|
|
12
|
+
guideStartText,
|
|
10
13
|
isAgentGuidePath,
|
|
11
14
|
isManagedGuide,
|
|
12
15
|
joinGuideSections,
|
|
@@ -19,4 +22,13 @@ export {
|
|
|
19
22
|
type RenderedGuideSection,
|
|
20
23
|
} from './agent-guide.js';
|
|
21
24
|
export { GET_AGENT_GUIDE_TOOL, registerAgentGuideTool } from './agent-guide.tools.js';
|
|
25
|
+
export {
|
|
26
|
+
GUIDE_TOKEN_ENCODING,
|
|
27
|
+
INSTRUCTIONS_TOKEN_BUDGET,
|
|
28
|
+
SECTION_TOKEN_BUDGET,
|
|
29
|
+
SECTION_TOKEN_BUDGETS,
|
|
30
|
+
TASK_TOKEN_BUDGET,
|
|
31
|
+
TOOL_LIST_TOKEN_BUDGET,
|
|
32
|
+
WHOLE_GUIDE_TOKEN_BUDGET,
|
|
33
|
+
} from './guide-budget.js';
|
|
22
34
|
export { GUIDE_FIRST_SENTENCE, withGuideFirst } from '../tool-registry/index.js';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { DEFAULT_KB_LAYOUT, PREAMBLE_CAP } from '@bevel-software/platform-shared';
|
|
2
2
|
import { describe, expect, it } from 'vitest';
|
|
3
|
-
import { composeAgentGuide } from '../../agent-guide/
|
|
3
|
+
import { composeAgentGuide } from '../../agent-guide/index.js';
|
|
4
4
|
import {
|
|
5
5
|
INSTRUCTIONS_CAP,
|
|
6
6
|
PLATFORM_HEADER,
|
|
@@ -51,6 +51,7 @@ describe('the shared file rules are one text, in two places', () => {
|
|
|
51
51
|
expect(rules.map((r) => r.id)).toEqual([
|
|
52
52
|
'agent-guide',
|
|
53
53
|
'content-kinds',
|
|
54
|
+
'workspace-tmp',
|
|
54
55
|
'write-mode',
|
|
55
56
|
'images-in-pages',
|
|
56
57
|
'escape-sequences',
|
|
@@ -92,10 +93,10 @@ describe('the shared file rules are one text, in two places', () => {
|
|
|
92
93
|
* organisation's own conventions file beside it — which is what a
|
|
93
94
|
* `read_file` of that name serves first.
|
|
94
95
|
*/
|
|
95
|
-
it('tells an agent to call get_agent_guide first, and that AGENTS.md answers with
|
|
96
|
+
it('tells an agent to call get_agent_guide first, and that AGENTS.md answers with that start after the organisation\'s own', () => {
|
|
96
97
|
const rule = sharedFileRules(DEFAULT_KB_LAYOUT).find((r) => r.id === 'agent-guide')!.body;
|
|
97
|
-
expect(rule).toContain("call `get_agent_guide
|
|
98
|
-
expect(rule).toContain('read_file on `AGENTS.md` at the KB root answers with
|
|
98
|
+
expect(rule).toContain("call `get_agent_guide`: it answers the guide's start, which names the default branch");
|
|
99
|
+
expect(rule).toContain('read_file on `AGENTS.md` at the KB root answers with that start');
|
|
99
100
|
expect(rule).toContain("after the organisation's own conventions file of that name");
|
|
100
101
|
// The pre-rename name is still offered, for a knowledge base that kept one.
|
|
101
102
|
expect(rule).toContain('`CLAUDE.md`');
|
|
@@ -50,6 +50,10 @@ export const PLATFORM_HEADER =
|
|
|
50
50
|
'search the knowledge base: call `start_session` once, then `grep` for the key terms, `list_files` to orient, and `read_file` what matches. ' +
|
|
51
51
|
'Prefer what you find there over memory or the web, and say so when the knowledge base is silent on something the organisation should have documented. ' +
|
|
52
52
|
'Skills are available as prompts and through `list_skills` and `get_skill`. ' +
|
|
53
|
+
// Said here as well as on the write tools: agents wrote to the default
|
|
54
|
+
// branch without asking (the agent-guide benchmark, 2026-10-26), and this
|
|
55
|
+
// text reaches an agent that never fetches the guide.
|
|
56
|
+
'A write to the default branch is live for everyone: unless the person said where, ask first whether to write there or on a draft. ' +
|
|
53
57
|
// There is no one calling shape to state: the knowledge-base tools take
|
|
54
58
|
// their arguments under `body`, a tool that calls another service takes them
|
|
55
59
|
// flat, and an agent told one rule for all of them sends a GET with a body.
|
|
@@ -90,8 +94,10 @@ export function platformInstructions(layout: KbLayout): string {
|
|
|
90
94
|
* own cap, and the preamble under its cap plus the marker a cut appends. The
|
|
91
95
|
* test is what makes it a ceiling rather than a hope: a shared rule that grew
|
|
92
96
|
* past it fails before it reaches an agent.
|
|
97
|
+
*
|
|
98
|
+
* 14,400 since the shared rules' own cap rose by 400 (the `__tmp__/` ref).
|
|
93
99
|
*/
|
|
94
|
-
export const INSTRUCTIONS_CAP =
|
|
100
|
+
export const INSTRUCTIONS_CAP = 14_400;
|
|
95
101
|
|
|
96
102
|
/** The one-line marker that replaces everything past the preamble cap. */
|
|
97
103
|
export const PREAMBLE_TRUNCATION_MARKER = `[preamble truncated at ${PREAMBLE_CAP.toLocaleString('en-US')} characters; shorten ${PREAMBLE_FILE}]`;
|
|
@@ -61,8 +61,12 @@ const PRE_RENAME_AGENTS_FILE = 'CLAUDE.md';
|
|
|
61
61
|
* of every call rather than of how to write one, and why large, escape-heavy
|
|
62
62
|
* and binary content goes by upload, which three write tools each said in
|
|
63
63
|
* full.
|
|
64
|
+
*
|
|
65
|
+
* 7,400 since the `__tmp__/` ref: four tools take it, so what it reaches and
|
|
66
|
+
* that it is read-only is said once here rather than in each description, and
|
|
67
|
+
* the section had no room left for it.
|
|
64
68
|
*/
|
|
65
|
-
export const SHARED_FILE_RULES_CAP =
|
|
69
|
+
export const SHARED_FILE_RULES_CAP = 7_400;
|
|
66
70
|
|
|
67
71
|
/** One shared rule: how the guide heads it, and the rule itself. */
|
|
68
72
|
export interface SharedFileRule {
|
|
@@ -114,6 +118,18 @@ export function sharedFileRules(layout: KbLayout): readonly SharedFileRule[] {
|
|
|
114
118
|
'`{ image_omitted, note }` stub instead, so read an image outside a chain when you mean to look at it. Any other ' +
|
|
115
119
|
'binary file reads as a one-line description rather than raw bytes.',
|
|
116
120
|
},
|
|
121
|
+
{
|
|
122
|
+
// What `__tmp__/` reaches and what it does not (see
|
|
123
|
+
// `workspace/workspace-tmp.ts`) — four tools take the ref, so it is a
|
|
124
|
+
// shared rule rather than a sentence in each description.
|
|
125
|
+
id: 'workspace-tmp',
|
|
126
|
+
heading: "Files staged in the workspace's tmp folder",
|
|
127
|
+
body:
|
|
128
|
+
"`__tmp__/<path>` names ONE file YOU staged in the branch workspace's `tmp/` folder (chat attachments land " +
|
|
129
|
+
'there; nobody else\'s staged files are reachable). read_file, file_stat, grep (`path`) and copy_file (`src`) ' +
|
|
130
|
+
'read it as a repository file; it is read-only and never listed — copy_file it to a repository path to keep ' +
|
|
131
|
+
'it. An entry stays up to seven days.',
|
|
132
|
+
},
|
|
117
133
|
{
|
|
118
134
|
id: 'write-mode',
|
|
119
135
|
heading: 'What a write may do at a path',
|
|
@@ -161,10 +177,10 @@ export function sharedFileRules(layout: KbLayout): readonly SharedFileRule[] {
|
|
|
161
177
|
body:
|
|
162
178
|
'move_file, copy_file and delete_folder take `dryRun: true`: it changes nothing and answers the impact — ' +
|
|
163
179
|
'what the call would touch, `allowed`, and `reason` when it may not run. A non-empty folder is deleted, and a ' +
|
|
164
|
-
'move that changes
|
|
180
|
+
'move that changes anyone\'s access runs, only with `confirm: true`; without it the call changes nothing and ' +
|
|
165
181
|
'returns the same impact with `confirmationRequired: true`. Do NOT set `confirm: true` on your first call — ' +
|
|
166
182
|
'dry-run, check the impact, then confirm. delete_file takes neither: check it first with file_stat ' +
|
|
167
|
-
'(`deletable`)
|
|
183
|
+
'(`deletable`). delete_branch has its own `dryRun`.',
|
|
168
184
|
},
|
|
169
185
|
{
|
|
170
186
|
id: 'managed-items',
|
|
@@ -184,7 +200,7 @@ export function sharedFileRules(layout: KbLayout): readonly SharedFileRule[] {
|
|
|
184
200
|
id: 'refused-for-permissions',
|
|
185
201
|
heading: 'When a write is refused for permissions',
|
|
186
202
|
body:
|
|
187
|
-
'
|
|
203
|
+
'The `write-denied` error says whether you may propose the ' +
|
|
188
204
|
'change instead (create a branch from this one, repeat the call on it, then `open_change_request` into this ' +
|
|
189
205
|
'branch) and lists those steps.',
|
|
190
206
|
},
|
|
@@ -222,17 +238,19 @@ function platformFileList(layout: KbLayout): string {
|
|
|
222
238
|
* The conventions reminder — where the platform's guide is, that the
|
|
223
239
|
* organisation's own conventions file comes with it, and to read both first.
|
|
224
240
|
*
|
|
225
|
-
* The guide is read by name at the repository root, where coding
|
|
226
|
-
* for an `AGENTS.md` by convention, and `get_agent_guide` returns
|
|
241
|
+
* The guide's start is read by name at the repository root, where coding
|
|
242
|
+
* agents look for an `AGENTS.md` by convention, and `get_agent_guide` returns
|
|
243
|
+
* it or any one section.
|
|
227
244
|
* One name on every deployment, so the rule takes no layout. `CLAUDE.md` is
|
|
228
245
|
* named as a fallback because a knowledge base seeded before the rename may
|
|
229
246
|
* still carry one its people edited.
|
|
230
247
|
*/
|
|
231
248
|
function conventionsRule(): string {
|
|
232
249
|
return (
|
|
233
|
-
"Before your first read or change in a workspace, call `get_agent_guide
|
|
234
|
-
|
|
235
|
-
|
|
250
|
+
"Before your first read or change in a workspace, call `get_agent_guide`: it answers the guide's start, " +
|
|
251
|
+
"which names the default branch and the section for each question. " +
|
|
252
|
+
`read_file on \`${LEGACY_AGENTS_FILE}\` at the KB root answers with ` +
|
|
253
|
+
"that start, after the organisation's own conventions file of that name when it has one: follow both. A " +
|
|
236
254
|
`\`${PRE_RENAME_AGENTS_FILE}\` at the KB root is the organisation's own too; read it if it exists.`
|
|
237
255
|
);
|
|
238
256
|
}
|