@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
|
@@ -90,39 +90,62 @@ const SERVER_NAME_RE = /^[a-z0-9][a-z0-9_-]*$/;
|
|
|
90
90
|
* silently vanishes from the catalog the moment its edit lands.
|
|
91
91
|
*/
|
|
92
92
|
export function validatedVariables(raw: unknown): ToolVariable[] | null {
|
|
93
|
-
|
|
94
|
-
|
|
93
|
+
const verdict = judgeVariables(raw);
|
|
94
|
+
return verdict.ok ? verdict.variables : null;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* {@link validatedVariables} with the reason a declaration was refused. The
|
|
99
|
+
* reason locates the entry by its position (`` `variables[2] ``), never by
|
|
100
|
+
* the name it declared or any other value the author wrote — the `.tool`
|
|
101
|
+
* parser's discipline (`describeManualFault`): passing `[A-Za-z0-9_]+` makes
|
|
102
|
+
* a string a legal identifier, not one this process may repeat. The reason
|
|
103
|
+
* reaches logs and, for a sign-in start on the server, the person signing in.
|
|
104
|
+
*/
|
|
105
|
+
function judgeVariables(
|
|
106
|
+
raw: unknown,
|
|
107
|
+
): { ok: true; variables: ToolVariable[] } | { ok: false; reason: string } {
|
|
108
|
+
const no = (reason: string) => ({ ok: false as const, reason });
|
|
109
|
+
if (raw === undefined) return { ok: true, variables: [] };
|
|
110
|
+
if (!Array.isArray(raw)) return no('`variables` must be a list');
|
|
95
111
|
const out: ToolVariable[] = [];
|
|
96
112
|
const declared = new Set<string>();
|
|
97
|
-
for (const entry of raw) {
|
|
98
|
-
|
|
99
|
-
if (
|
|
113
|
+
for (const [i, entry] of raw.entries()) {
|
|
114
|
+
const at = `\`variables[${i}]`;
|
|
115
|
+
if (!isRecord(entry)) return no(`${at}\` must be an object`);
|
|
116
|
+
if (typeof entry.name !== 'string' || !/^[A-Za-z0-9_]+$/.test(entry.name)) {
|
|
117
|
+
return no(`${at}.name\` must match [A-Za-z0-9_]+`);
|
|
118
|
+
}
|
|
100
119
|
// The `.tool` parser's declaration rules, at this file's grain: a
|
|
101
120
|
// platform-seeded name may not be re-declared (it would shadow the
|
|
102
121
|
// seeding), and a duplicate would make later scope resolution depend on
|
|
103
122
|
// declaration order.
|
|
104
|
-
if (RESERVED_VARIABLE_NAMES.includes(entry.name)
|
|
123
|
+
if (RESERVED_VARIABLE_NAMES.includes(entry.name)) return no(`${at}.name\` is reserved for platform seeding`);
|
|
124
|
+
if (declared.has(entry.name)) return no(`${at}.name\` duplicates an earlier entry's`);
|
|
105
125
|
declared.add(entry.name);
|
|
106
126
|
const scope = entry.scope ?? 'admin';
|
|
107
|
-
if (scope !== 'admin' && scope !== 'user') return
|
|
127
|
+
if (scope !== 'admin' && scope !== 'user') return no(`${at}.scope\` must be \`admin\` or \`user\``);
|
|
108
128
|
let oauth: ToolVariable['oauth'];
|
|
109
129
|
if (entry.oauth !== undefined) {
|
|
110
130
|
// OAuth is inherently per-caller (same rule the `.tool` parser
|
|
111
131
|
// enforces): an admin-shared OAuth token would leak one user's token
|
|
112
132
|
// to all callers.
|
|
113
|
-
if (!isRecord(entry.oauth)
|
|
133
|
+
if (!isRecord(entry.oauth)) return no(`${at}.oauth\` must be an object`);
|
|
134
|
+
if (scope !== 'user') return no(`${at}\` has \`oauth\`, so its \`scope\` must be \`user\``);
|
|
114
135
|
const o = entry.oauth;
|
|
115
136
|
// Confidential material never loads from a file, on either declaration
|
|
116
137
|
// surface: the `.tool` parser throws on these keys, and silently
|
|
117
138
|
// dropping one here would leave a plugin.json carrying a secret that
|
|
118
139
|
// "worked" — the file is portable package data, readable by every
|
|
119
140
|
// client that loads the plugin.
|
|
120
|
-
if (o.clientSecret !== undefined || o.client_secret !== undefined || o.secret !== undefined)
|
|
141
|
+
if (o.clientSecret !== undefined || o.client_secret !== undefined || o.secret !== undefined) {
|
|
142
|
+
return no(`${at}.oauth\` may not carry a client secret — it is set through the protected client-secret route`);
|
|
143
|
+
}
|
|
121
144
|
// `clientId` is trimmed and must be non-empty, exactly as the `.tool`
|
|
122
145
|
// parser requires: a whitespace-only value would pass discovery and
|
|
123
146
|
// then fail the owner's client-secret setup with "clientId is
|
|
124
147
|
// required" — an error at the wrong surface, long after the save.
|
|
125
|
-
if (typeof o.clientId !== 'string' || !o.clientId.trim()) return
|
|
148
|
+
if (typeof o.clientId !== 'string' || !o.clientId.trim()) return no(`${at}.oauth.clientId\` is required`);
|
|
126
149
|
// The endpoints are OPTIONAL here, unlike in a `.tool`: an MCP server
|
|
127
150
|
// publishes its authorization-server metadata, so a declaration that
|
|
128
151
|
// names only the client id is completed at scan time. Both or neither
|
|
@@ -137,33 +160,38 @@ export function validatedVariables(raw: unknown): ToolVariable[] | null {
|
|
|
137
160
|
const authorizationUrl = optionalUrl(o.authorizationUrl);
|
|
138
161
|
const tokenUrl = optionalUrl(o.tokenUrl);
|
|
139
162
|
const resource = optionalUrl(o.resource);
|
|
140
|
-
if (authorizationUrl === null || tokenUrl === null || resource === null)
|
|
141
|
-
|
|
163
|
+
if (authorizationUrl === null || tokenUrl === null || resource === null) {
|
|
164
|
+
return no(`${at}.oauth\` URLs must be strings`);
|
|
165
|
+
}
|
|
166
|
+
if ((authorizationUrl === undefined) !== (tokenUrl === undefined)) {
|
|
167
|
+
return no(`${at}.oauth\` must declare both \`authorizationUrl\` and \`tokenUrl\`, or neither`);
|
|
168
|
+
}
|
|
142
169
|
// The same https + SSRF gate the `.tool` parser runs on these URLs: a
|
|
143
170
|
// sign-in or token exchange aimed at an internal host is a declaration
|
|
144
171
|
// this surface must refuse exactly like the other one does. `resource`
|
|
145
172
|
// is never fetched, but it names the remote server — same bar.
|
|
146
173
|
try {
|
|
147
174
|
if (authorizationUrl !== undefined) {
|
|
148
|
-
assertSafeFetchUrl(authorizationUrl, { requireHttps: true, label: `${
|
|
149
|
-
assertSafeFetchUrl(tokenUrl!, { requireHttps: true, label: `${
|
|
175
|
+
assertSafeFetchUrl(authorizationUrl, { requireHttps: true, label: `${at}.oauth.authorizationUrl\`` });
|
|
176
|
+
assertSafeFetchUrl(tokenUrl!, { requireHttps: true, label: `${at}.oauth.tokenUrl\`` });
|
|
150
177
|
}
|
|
151
178
|
if (resource !== undefined) {
|
|
152
|
-
assertSafeFetchUrl(resource, { requireHttps: true, label: `${
|
|
179
|
+
assertSafeFetchUrl(resource, { requireHttps: true, label: `${at}.oauth.resource\`` });
|
|
153
180
|
}
|
|
154
|
-
} catch {
|
|
155
|
-
|
|
181
|
+
} catch (err) {
|
|
182
|
+
// `assertSafeFetchUrl` names the field and the rule, never the URL.
|
|
183
|
+
return no(err instanceof Error ? err.message : `${at}.oauth\` has an invalid URL`);
|
|
156
184
|
}
|
|
157
185
|
// Forwarded verbatim as query params later — a non-string value here is
|
|
158
186
|
// a malformed declaration, not something to coerce.
|
|
159
187
|
if (o.authParams !== undefined) {
|
|
160
188
|
if (!isRecord(o.authParams) || !Object.values(o.authParams).every((v) => typeof v === 'string')) {
|
|
161
|
-
return
|
|
189
|
+
return no(`${at}.oauth.authParams\` must be an object of string values`);
|
|
162
190
|
}
|
|
163
191
|
}
|
|
164
192
|
// PKCE is on unless the declaration says `false`; anything else there is
|
|
165
193
|
// a malformed flag, not a preference.
|
|
166
|
-
if (o.pkce !== undefined && typeof o.pkce !== 'boolean') return
|
|
194
|
+
if (o.pkce !== undefined && typeof o.pkce !== 'boolean') return no(`${at}.oauth.pkce\` must be a boolean`);
|
|
167
195
|
oauth = {
|
|
168
196
|
...(authorizationUrl !== undefined ? { authorizationUrl, tokenUrl: tokenUrl! } : {}),
|
|
169
197
|
clientId: o.clientId.trim(),
|
|
@@ -182,7 +210,7 @@ export function validatedVariables(raw: unknown): ToolVariable[] | null {
|
|
|
182
210
|
...(oauth ? { oauth } : {}),
|
|
183
211
|
});
|
|
184
212
|
}
|
|
185
|
-
return out;
|
|
213
|
+
return { ok: true, variables: out };
|
|
186
214
|
}
|
|
187
215
|
|
|
188
216
|
/**
|
|
@@ -318,6 +346,12 @@ export function descriptorsFromMcpJson(
|
|
|
318
346
|
mcpJsonText: string,
|
|
319
347
|
pluginJsonText: string | null,
|
|
320
348
|
layout: KbLayout,
|
|
349
|
+
/**
|
|
350
|
+
* Told of every server this file declares and the parse refuses, with the
|
|
351
|
+
* reason the log line gives. The scan keeps them so a sign-in started on a
|
|
352
|
+
* refused server answers why, instead of finding nothing by that name.
|
|
353
|
+
*/
|
|
354
|
+
onRefused?: (server: string, reason: string, path: string) => void,
|
|
321
355
|
): ToolManualDescriptor[] {
|
|
322
356
|
const { pluginsDir } = layout;
|
|
323
357
|
let mcp: unknown;
|
|
@@ -347,10 +381,14 @@ export function descriptorsFromMcpJson(
|
|
|
347
381
|
const mcpJsonPath = `${pluginsDir}/${pluginFolder}/${PLUGIN_MCP_FILE}`;
|
|
348
382
|
|
|
349
383
|
const out: ToolManualDescriptor[] = [];
|
|
384
|
+
const skip = (name: string, reason: string) => {
|
|
385
|
+
log.warn(`skipping mcp server "${name}" in ${mcpJsonPath}: ${reason}`);
|
|
386
|
+
onRefused?.(name, reason, mcpJsonPath);
|
|
387
|
+
};
|
|
350
388
|
for (const [name, rawEntry] of Object.entries(mcp.mcpServers)) {
|
|
351
389
|
const verdict = judgeMcpServerEntry(name, rawEntry);
|
|
352
390
|
if (!verdict.ok) {
|
|
353
|
-
|
|
391
|
+
skip(name, `${verdict.reason}.`);
|
|
354
392
|
continue;
|
|
355
393
|
}
|
|
356
394
|
// Narrowed by the verdict: an entry that passed is a record.
|
|
@@ -365,22 +403,23 @@ export function descriptorsFromMcpJson(
|
|
|
365
403
|
// into outbound requests exactly the same way.
|
|
366
404
|
const reserved = referencesReservedVariable({ raw, ext });
|
|
367
405
|
if (reserved !== null) {
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
'CONNECTION_KEY are platform-seeded and may not appear in server declarations.',
|
|
406
|
+
skip(
|
|
407
|
+
name,
|
|
408
|
+
`its declaration (mcp.json entry or plugin.json extension) references the reserved variable "${reserved}" — ` +
|
|
409
|
+
'API_URL and CONNECTION_KEY are platform-seeded and may not appear in server declarations.',
|
|
372
410
|
);
|
|
373
411
|
continue;
|
|
374
412
|
}
|
|
375
|
-
const
|
|
376
|
-
if (
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
'the server stays offline until the manifest is fixed.',
|
|
413
|
+
const judged = judgeVariables(ext.variables);
|
|
414
|
+
if (!judged.ok) {
|
|
415
|
+
skip(
|
|
416
|
+
name,
|
|
417
|
+
`its plugin.json \`variables\` declaration is malformed (${judged.reason}) — a dropped declaration ` +
|
|
418
|
+
'would silently re-scope a credential, so the server stays offline until the manifest is fixed.',
|
|
381
419
|
);
|
|
382
420
|
continue;
|
|
383
421
|
}
|
|
422
|
+
const variables = judged.variables;
|
|
384
423
|
const shared = {
|
|
385
424
|
slug: name,
|
|
386
425
|
name,
|
|
@@ -408,9 +447,9 @@ export function descriptorsFromMcpJson(
|
|
|
408
447
|
try {
|
|
409
448
|
assertSafeFetchUrl(url, { label: `mcp server "${name}" url` });
|
|
410
449
|
} catch (err) {
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
450
|
+
skip(
|
|
451
|
+
name,
|
|
452
|
+
`${err instanceof Error ? err.message : String(err)} (declare it \`local: true\` if it is deliberately private).`,
|
|
414
453
|
);
|
|
415
454
|
continue;
|
|
416
455
|
}
|
|
@@ -356,6 +356,21 @@ export interface ToolManualDetail extends Omit<ToolManualSummary, 'description'>
|
|
|
356
356
|
hiddenTools: HiddenTool[];
|
|
357
357
|
}
|
|
358
358
|
|
|
359
|
+
/**
|
|
360
|
+
* A connection's narrowing of the catalog: whether the connector defined at
|
|
361
|
+
* `definitionPath` (a `.tool` file, or the MCP server definition a server
|
|
362
|
+
* entry came from) is one the connection loads. Applied AFTER the caller's
|
|
363
|
+
* read gate, so it can only take manuals away. The agent surfaces pass the
|
|
364
|
+
* connection scope's `allowsConnector` (`modules/agent-scope`); absent is the
|
|
365
|
+
* whole readable catalog.
|
|
366
|
+
*/
|
|
367
|
+
export type ConnectorScope = (definitionPath: string) => boolean;
|
|
368
|
+
|
|
369
|
+
/** A manual as its file reads now — see {@link IToolManualService.liveDeclaration}. */
|
|
370
|
+
export type LiveDeclaration =
|
|
371
|
+
| { manual: ToolManualSummary; variable?: ToolVariable; refused?: undefined }
|
|
372
|
+
| { refused: string; manual?: undefined; variable?: undefined };
|
|
373
|
+
|
|
359
374
|
export interface IToolManualService {
|
|
360
375
|
/** The `.tool` manuals the user can read, as summaries. */
|
|
361
376
|
listAccessible(userEmail: string): Promise<ToolManualSummary[]>;
|
|
@@ -377,7 +392,7 @@ export interface IToolManualService {
|
|
|
377
392
|
* unparseable by definition, so the verdict comes from its folder's
|
|
378
393
|
* `access.md` chain — default-deny, as everywhere else.
|
|
379
394
|
*/
|
|
380
|
-
listAccessibleCatalog(userEmail: string): Promise<AccessibleCatalog>;
|
|
395
|
+
listAccessibleCatalog(userEmail: string, within?: ConnectorScope): Promise<AccessibleCatalog>;
|
|
381
396
|
/**
|
|
382
397
|
* One readable `.tool` by slug, with its description + capabilities, for the
|
|
383
398
|
* browser tool page. `null` when no such slug exists OR the caller can't read
|
|
@@ -385,6 +400,23 @@ export interface IToolManualService {
|
|
|
385
400
|
* confirm that a tool the caller can't see exists).
|
|
386
401
|
*/
|
|
387
402
|
getDetail(userEmail: string, slug: string): Promise<ToolManualDetail | null>;
|
|
403
|
+
/**
|
|
404
|
+
* One manual's declaration as its file reads on the default branch NOW, for a
|
|
405
|
+
* sign-in about to start: the files are parsed afresh, never served from the
|
|
406
|
+
* catalog's cached scan, so an edit made seconds ago is already what this
|
|
407
|
+
* answers. A sign-in variable that names only its `clientId` is completed from
|
|
408
|
+
* the server's OAuth metadata by the same walk the catalog completes it with;
|
|
409
|
+
* when that fails, the endpoints stay absent and `manual.setup.reason` says why.
|
|
410
|
+
*
|
|
411
|
+
* `refused` when the file declaring this slug is one the parse refuses as it
|
|
412
|
+
* reads now (an endpoint failing the https/SSRF check, say): the parser's
|
|
413
|
+
* reason, so the sign-in can say why instead of finding nothing. `null` when
|
|
414
|
+
* no readable manual has this slug (fail-closed, like {@link getDetail});
|
|
415
|
+
* `variable` absent when the file declares no variable of that name. Nothing
|
|
416
|
+
* the platform synthesises from discovery (the zero-config sign-in variable)
|
|
417
|
+
* is in the answer: it is not in any file.
|
|
418
|
+
*/
|
|
419
|
+
liveDeclaration(userEmail: string, slug: string, varName: string): Promise<LiveDeclaration | null>;
|
|
388
420
|
|
|
389
421
|
/**
|
|
390
422
|
* Wire where a hidden tool's schema finding comes from (the MCP proxy, which
|
|
@@ -406,7 +438,7 @@ export interface IToolManualService {
|
|
|
406
438
|
* manual's embedded tools breaks without touching anything a summary shows.
|
|
407
439
|
* Opaque to callers: only equality is ever asked of these lines.
|
|
408
440
|
*/
|
|
409
|
-
catalogFingerprints(userEmail: string): Promise<string[]>;
|
|
441
|
+
catalogFingerprints(userEmail: string, within?: ConnectorScope): Promise<string[]>;
|
|
410
442
|
/**
|
|
411
443
|
* Every manual in the catalog, UNFILTERED by access — the mirror of
|
|
412
444
|
* `skillService.listSkills(undefined)`. For caller-INDEPENDENT counting only
|
|
@@ -422,7 +454,7 @@ export interface IToolManualService {
|
|
|
422
454
|
* NOT include the KB manual (the route prepends that). With `{ remoteOnly: true }`
|
|
423
455
|
* (the remote MCP proxy), LOCAL-ONLY manuals (`remote: false`) are excluded.
|
|
424
456
|
*/
|
|
425
|
-
toManualCallTemplates(userEmail: string, opts?: { remoteOnly?: boolean }): Promise<CallTemplate[]>;
|
|
457
|
+
toManualCallTemplates(userEmail: string, opts?: { remoteOnly?: boolean; within?: ConnectorScope }): Promise<CallTemplate[]>;
|
|
426
458
|
/**
|
|
427
459
|
* The caller's accessible LOCAL-ONLY (`remote: false`) manuals.
|
|
428
460
|
*
|
|
@@ -430,21 +462,23 @@ export interface IToolManualService {
|
|
|
430
462
|
* both: `name` is the UTCP namespace its `${VAR}` refs are keyed by, and
|
|
431
463
|
* `slug` is what addresses the manual on the variable-resolution route.
|
|
432
464
|
*/
|
|
433
|
-
listLocalOnly(userEmail: string): Promise<{ slug: string; name: string; path: string }[]>;
|
|
465
|
+
listLocalOnly(userEmail: string, within?: ConnectorScope): Promise<{ slug: string; name: string; path: string }[]>;
|
|
434
466
|
/**
|
|
435
467
|
* Tools declared on `branch` whose namespace the default-branch catalog does
|
|
436
468
|
* not serve yet, filtered to what the caller can read there. The catalog is
|
|
437
469
|
* built from the default branch only, so a server an agent declares on its
|
|
438
470
|
* draft is invisible to every tool surface until the draft is merged — this
|
|
439
471
|
* is how the agent is told where its declaration lives. `[]` for the default
|
|
440
|
-
* branch itself, or a branch with no workspace.
|
|
472
|
+
* branch itself, or a branch with no workspace. `within` narrows the answer
|
|
473
|
+
* to a connection's connectors, after the read gate, as the catalog's does.
|
|
441
474
|
*/
|
|
442
475
|
listDeclaredOnlyOnBranch(
|
|
443
476
|
userEmail: string,
|
|
444
477
|
branch: string,
|
|
478
|
+
within?: ConnectorScope,
|
|
445
479
|
): Promise<{ name: string; path: string; type: ToolManualType }[]>;
|
|
446
480
|
/** The embedded UTCP manual for an inline `.tool` (served at `/api/tools/:slug/manual`). */
|
|
447
|
-
resolveInlineManual(userEmail: string, slug: string): Promise<UtcpManualDict | null>;
|
|
481
|
+
resolveInlineManual(userEmail: string, slug: string, opts?: { within?: ConnectorScope }): Promise<UtcpManualDict | null>;
|
|
448
482
|
/** Validate a draft `.tool` file's content for the renderer preview. */
|
|
449
483
|
preview(content: string): Promise<ToolManualPreview>;
|
|
450
484
|
/**
|
|
@@ -19,6 +19,7 @@ import type { AuthUser } from '@bevel-software/platform-shared';
|
|
|
19
19
|
import '../auth/index.js'; // Express Request augmentation (req.userId / req.userEmail)
|
|
20
20
|
import '../tool-auth/index.js'; // Express Request augmentation (req.toolAuth)
|
|
21
21
|
import { hasGitInternalsSegment } from '../../shared/git-internals.js';
|
|
22
|
+
import { NOT_AVAILABLE_TO_CONNECTION, resolveConnectionScope, type IAgentScopeResolver } from '../agent-scope/index.js';
|
|
22
23
|
|
|
23
24
|
/** Resolve a connection-key/internal-token user id to its email (per-caller ACL). */
|
|
24
25
|
export type ResolveUserEmail = (userId: string) => Promise<string | undefined>;
|
|
@@ -64,6 +65,11 @@ export function createToolManualsAgentRoutes(
|
|
|
64
65
|
*/
|
|
65
66
|
pluginIndex?: Pick<IPluginIndexService, 'catalog'>;
|
|
66
67
|
},
|
|
68
|
+
/**
|
|
69
|
+
* Resolves the scope of a connection made as an agent configuration, so
|
|
70
|
+
* `all-tools` lists only the connectors it loads (`modules/agent-scope`).
|
|
71
|
+
*/
|
|
72
|
+
agentScope?: Pick<IAgentScopeResolver, 'resolve'>,
|
|
67
73
|
): express.Router {
|
|
68
74
|
const router = express.Router();
|
|
69
75
|
|
|
@@ -83,9 +89,18 @@ export function createToolManualsAgentRoutes(
|
|
|
83
89
|
// Default remote-safe: exclude local-only manuals unless the caller (a locally
|
|
84
90
|
// installed MCP server) explicitly opts in with `?remote=false`.
|
|
85
91
|
const remoteOnly = req.query.remote !== 'false';
|
|
86
|
-
|
|
92
|
+
// A connection made as an agent configuration lists only the connectors that
|
|
93
|
+
// file loads, and says which agent it is — the MCP proxy words its
|
|
94
|
+
// refusals and its handshake from that. Everything lists as it always
|
|
95
|
+
// did, with no `connection` at all.
|
|
96
|
+
const scope = await resolveConnectionScope(agentScope, email, req.toolAuth?.agentPath);
|
|
97
|
+
const within = scope.connectorFilter();
|
|
98
|
+
const userManuals = email
|
|
99
|
+
? await toolManualService.toManualCallTemplates(email, within ? { remoteOnly, within } : { remoteOnly })
|
|
100
|
+
: [];
|
|
87
101
|
const manuals: CallTemplate[] = [kbManualTemplate(), ...userManuals];
|
|
88
|
-
|
|
102
|
+
const connection = scope.toWire();
|
|
103
|
+
res.json(connection ? { manuals, connection } : { manuals });
|
|
89
104
|
} catch (err) {
|
|
90
105
|
log.error('all-tools failed:', { err });
|
|
91
106
|
res.status(500).json({ error: 'Failed to list tools' });
|
|
@@ -171,6 +186,24 @@ export function createToolManualsAgentRoutes(
|
|
|
171
186
|
email,
|
|
172
187
|
rels.map((r) => `${pluginRel}/${r}`),
|
|
173
188
|
);
|
|
189
|
+
// A folder with nothing the person may read is absent to them, whatever
|
|
190
|
+
// the connection — so that 404 comes first, and the connection's own
|
|
191
|
+
// refusal below never confirms a folder the person could not see.
|
|
192
|
+
if (![...verdicts.values()].some((v) => v === true)) {
|
|
193
|
+
return void res.status(404).json({ error: 'Not found' });
|
|
194
|
+
}
|
|
195
|
+
// A connection made as an agent configuration materializes only a plugin
|
|
196
|
+
// that defines a connector the file loads — the archive is how the
|
|
197
|
+
// local MCP server runs one, and nothing else asks for it. Checked
|
|
198
|
+
// before any file is opened.
|
|
199
|
+
const scope = await resolveConnectionScope(agentScope, email, req.toolAuth?.agentPath);
|
|
200
|
+
if (!scope.loadsConnectorIn(pluginRel)) {
|
|
201
|
+
const why = scope.describe();
|
|
202
|
+
return void res.status(403).json({
|
|
203
|
+
error: `The plugin "${folder}" is not available to this connection.${why ? ` ${why}` : ''}`,
|
|
204
|
+
code: NOT_AVAILABLE_TO_CONNECTION,
|
|
205
|
+
});
|
|
206
|
+
}
|
|
174
207
|
const zip = new AdmZip();
|
|
175
208
|
let included = 0;
|
|
176
209
|
let bytes = 0;
|
|
@@ -269,7 +302,11 @@ export function createToolManualsAgentRoutes(
|
|
|
269
302
|
const email = await callerEmail(req);
|
|
270
303
|
if (!email) return void res.status(403).json({ error: 'Forbidden' });
|
|
271
304
|
const slug = Array.isArray(req.params.slug) ? req.params.slug[0] : req.params.slug;
|
|
272
|
-
|
|
305
|
+
// A connection made as an agent configuration reads only the manuals of the
|
|
306
|
+
// connectors it loads; another is as absent as one the person cannot read.
|
|
307
|
+
const scope = await resolveConnectionScope(agentScope, email, req.toolAuth?.agentPath);
|
|
308
|
+
const within = scope.connectorFilter();
|
|
309
|
+
const manual = await toolManualService.resolveInlineManual(email, String(slug), within ? { within } : undefined);
|
|
273
310
|
if (!manual) return void res.status(404).json({ error: 'Not found' });
|
|
274
311
|
res.json(manual);
|
|
275
312
|
} catch (err) {
|