@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
|
@@ -7,7 +7,7 @@ import type { KbContext } from '../../shared/kb-context.js';
|
|
|
7
7
|
import type { IAccessControl } from '../access/index.js';
|
|
8
8
|
import type { ITreeWalker } from '../../shared/fs.contract.js';
|
|
9
9
|
import type { HiddenToolSource } from '../../shared/hidden-tools.js';
|
|
10
|
-
import { type IToolManualService, type ToolManualDescriptor, type ToolManualSummary, type ToolManualDetail, type AccessibleCatalog, type UtcpManualDict, type ToolManualPreview, type ToolManualType, type ToolProbeTarget, type ToolVariableScope } from './tool-manuals.contract.js';
|
|
10
|
+
import { type IToolManualService, type ConnectorScope, type ToolManualDescriptor, type ToolManualSummary, type ToolManualDetail, type AccessibleCatalog, type UtcpManualDict, type ToolManualPreview, type ToolManualType, type ToolProbeTarget, type ToolVariableScope, type LiveDeclaration } from './tool-manuals.contract.js';
|
|
11
11
|
/**
|
|
12
12
|
* Why one `.tool` was refused, in a form safe to hand an agent, a browser and a
|
|
13
13
|
* log — the `reason` of an {@link InvalidToolManual}.
|
|
@@ -64,8 +64,8 @@ export interface McpAuthDiscoveryPort {
|
|
|
64
64
|
/**
|
|
65
65
|
* The sign-in endpoints for an OWNER-REGISTERED client: the same metadata
|
|
66
66
|
* walk as `statusFor`, stopping short of dynamic registration — the manual
|
|
67
|
-
* already names its `clientId`. Nothing is persisted;
|
|
68
|
-
*
|
|
67
|
+
* already names its `clientId`. Nothing is persisted; every sign-in start
|
|
68
|
+
* completes the declaration afresh (`liveDeclaration`). Optional so a port that
|
|
69
69
|
* only knows the zero-config path still satisfies the interface.
|
|
70
70
|
*/
|
|
71
71
|
providerForDeclaredClient?(manualName: string, mcpUrl: string, clientId: string): Promise<McpAuthDiscoveryResult>;
|
|
@@ -140,16 +140,17 @@ export declare class ToolManualService implements IToolManualService {
|
|
|
140
140
|
setHiddenTools(source: HiddenToolSource): void;
|
|
141
141
|
invalidate(): void;
|
|
142
142
|
listAccessible(userEmail: string): Promise<ToolManualSummary[]>;
|
|
143
|
-
listAccessibleCatalog(userEmail: string): Promise<AccessibleCatalog>;
|
|
143
|
+
listAccessibleCatalog(userEmail: string, within?: ConnectorScope): Promise<AccessibleCatalog>;
|
|
144
144
|
listAllSummaries(): Promise<ToolManualSummary[]>;
|
|
145
|
-
catalogFingerprints(userEmail: string): Promise<string[]>;
|
|
145
|
+
catalogFingerprints(userEmail: string, within?: ConnectorScope): Promise<string[]>;
|
|
146
146
|
getDetail(userEmail: string, slug: string): Promise<ToolManualDetail | null>;
|
|
147
|
-
|
|
147
|
+
liveDeclaration(userEmail: string, slug: string, varName: string): Promise<LiveDeclaration | null>;
|
|
148
|
+
listLocalOnly(userEmail: string, within?: ConnectorScope): Promise<{
|
|
148
149
|
slug: string;
|
|
149
150
|
name: string;
|
|
150
151
|
path: string;
|
|
151
152
|
}[]>;
|
|
152
|
-
listDeclaredOnlyOnBranch(userEmail: string, branch: string): Promise<{
|
|
153
|
+
listDeclaredOnlyOnBranch(userEmail: string, branch: string, within?: ConnectorScope): Promise<{
|
|
153
154
|
name: string;
|
|
154
155
|
path: string;
|
|
155
156
|
type: ToolManualType;
|
|
@@ -172,8 +173,11 @@ export declare class ToolManualService implements IToolManualService {
|
|
|
172
173
|
probeTargetFor(userEmail: string, slug: string): Promise<ToolProbeTarget | null>;
|
|
173
174
|
toManualCallTemplates(userEmail: string, opts?: {
|
|
174
175
|
remoteOnly?: boolean;
|
|
176
|
+
within?: ConnectorScope;
|
|
175
177
|
}): Promise<CallTemplate[]>;
|
|
176
|
-
resolveInlineManual(userEmail: string, slug: string
|
|
178
|
+
resolveInlineManual(userEmail: string, slug: string, opts?: {
|
|
179
|
+
within?: ConnectorScope;
|
|
180
|
+
}): Promise<UtcpManualDict | null>;
|
|
177
181
|
preview(content: string): Promise<ToolManualPreview>;
|
|
178
182
|
/** Build the raw UTCP manual call-template dict for one descriptor (validated by the caller). */
|
|
179
183
|
private buildCallTemplateDict;
|
|
@@ -183,8 +187,14 @@ export declare class ToolManualService implements IToolManualService {
|
|
|
183
187
|
* ONE `canReadBatch`. Both halves are paths in the same workspace judged by
|
|
184
188
|
* the same rule, and splitting them into two calls would pay a second
|
|
185
189
|
* round-trip to ask the same question.
|
|
190
|
+
*
|
|
191
|
+
* `within` narrows the answer to a connection's connectors, AFTER the read
|
|
192
|
+
* gate: it can take a manual out of what the caller may read, never put one
|
|
193
|
+
* in. Absent, the answer is the caller's whole readable catalog.
|
|
186
194
|
*/
|
|
187
195
|
private accessibleScan;
|
|
196
|
+
/** A scan cut to what this caller may read — see {@link accessibleScan}. */
|
|
197
|
+
private readableBy;
|
|
188
198
|
private scan;
|
|
189
199
|
private runScan;
|
|
190
200
|
/**
|
|
@@ -221,11 +231,12 @@ export declare class ToolManualService implements IToolManualService {
|
|
|
221
231
|
* (the owner registered an app with a provider that offers no dynamic
|
|
222
232
|
* registration — HubSpot, Google) gets its endpoints, PKCE and resource
|
|
223
233
|
* indicator from the server's own OAuth metadata, exactly as the zero-config
|
|
224
|
-
* path would. The descriptor is completed IN MEMORY
|
|
225
|
-
*
|
|
226
|
-
*
|
|
227
|
-
* incomplete and `setup.reason` says so — the secret
|
|
228
|
-
* with the same reason instead of
|
|
234
|
+
* path would. The descriptor is completed IN MEMORY, for the catalog's scan
|
|
235
|
+
* and for every sign-in start (`liveDeclaration`) alike, so nothing here
|
|
236
|
+
* persists. When the metadata can't be had, the declaration stays
|
|
237
|
+
* incomplete and `setup.reason` says so — the client-secret save and the
|
|
238
|
+
* sign-in start then refuse with the same reason instead of running a
|
|
239
|
+
* provider with no endpoints.
|
|
229
240
|
*/
|
|
230
241
|
private completeDeclaredOAuth;
|
|
231
242
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-manuals.service.d.ts","sourceRoot":"","sources":["../../../src/modules/tool-manuals/tool-manuals.service.ts"],"names":[],"mappings":"AAOA,OAAO,YAAY,CAAC;AACpB,OAAO,WAAW,CAAC;AAInB,OAAO,EAIL,KAAK,YAAY,EAClB,MAAM,WAAW,CAAC;AAKnB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAE5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAMzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAE/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAOrE,OAAO,EAGL,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EAEzB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EAErB,KAAK,iBAAiB,EAEtB,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EAGnB,KAAK,eAAe,EACpB,KAAK,iBAAiB,
|
|
1
|
+
{"version":3,"file":"tool-manuals.service.d.ts","sourceRoot":"","sources":["../../../src/modules/tool-manuals/tool-manuals.service.ts"],"names":[],"mappings":"AAOA,OAAO,YAAY,CAAC;AACpB,OAAO,WAAW,CAAC;AAInB,OAAO,EAIL,KAAK,YAAY,EAClB,MAAM,WAAW,CAAC;AAKnB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAE5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAMzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAE/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAOrE,OAAO,EAGL,KAAK,kBAAkB,EACvB,KAAK,cAAc,EACnB,KAAK,oBAAoB,EAEzB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EAErB,KAAK,iBAAiB,EAEtB,KAAK,cAAc,EACnB,KAAK,iBAAiB,EACtB,KAAK,cAAc,EAGnB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EAEtB,KAAK,eAAe,EACrB,MAAM,4BAA4B,CAAC;AAsDpC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAYxD;AA0CD;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC/E;;;;;;OAMG;IACH,yBAAyB,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;CACnH;AAED,MAAM,MAAM,sBAAsB,GAC9B;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,GAClB;IACE,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,EAAE;QACR,gBAAgB,EAAE,MAAM,CAAC;QACzB,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,OAAO,CAAC;KAChB,CAAC;CACH,GACD;IAAE,MAAM,EAAE,aAAa,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9C;;;;;;GAMG;AACH,qBAAa,iBAAkB,YAAW,kBAAkB;IA6BxD,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,gGAAgG;IAChG,OAAO,CAAC,QAAQ,CAAC,MAAM;IAjCzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAuB;IAC7C,OAAO,CAAC,gBAAgB,CAAC,CAAuB;IAChD,2EAA2E;IAC3E,OAAO,CAAC,WAAW,CAAC,CAAmB;IACvC;;;;;;;OAOG;IACH,OAAO,CAAC,aAAa,CAAuB;IAC5C;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,YAAY,CAAoC;gBAGrC,gBAAgB,EAAE,gBAAgB,EAClC,aAAa,EAAE,cAAc,EAC7B,EAAE,EAAE,SAAS,EACb,IAAI,EAAE,WAAW;IAClC,gGAAgG;IAC/E,MAAM,EAAE,YAAY,EACrC,GAAG,GAAE,MAAM,MAAiB;IAK9B,OAAO,KAAK,SAAS,GAEpB;IAED;;;;;OAKG;IACH,mBAAmB,CAAC,SAAS,EAAE,oBAAoB,GAAG,IAAI;IAI1D,cAAc,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI;IAI9C,UAAU,IAAI,IAAI;IAKZ,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAI/D,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAK7F,gBAAgB,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAIhD,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAIlF,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;IAwB5E,eAAe,CACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IA4B5B,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAKlH,wBAAwB,CAC5B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,cAAc,GACtB,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,cAAc,CAAA;KAAE,EAAE,CAAC;IAgC5D,uBAAuB,CAC3B,UAAU,EAAE,MAAM,GACjB,OAAO,CACR;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,KAAK,EAAE,OAAO,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,EAAE,CAC9F;IAqBK,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAiBvE;;;;;;OAMG;IACG,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IA0BhF,qBAAqB,CACzB,SAAS,EAAE,MAAM,EACjB,IAAI,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,cAAc,CAAA;KAAE,GACvD,OAAO,CAAC,YAAY,EAAE,CAAC;IAkBpB,mBAAmB,CACvB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,cAAc,CAAA;KAAE,GACjC,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAkB3B,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAqC1D,iGAAiG;IACjG,OAAO,CAAC,qBAAqB;YA8Df,iBAAiB;IAI/B;;;;;;;;;OASG;YACW,cAAc;IAI5B,4EAA4E;YAC9D,UAAU;YAoBV,IAAI;YAiBJ,OAAO;IAcrB;;;;;;OAMG;IACH,OAAO,CAAC,kBAAkB;IAc1B;;;;;;;;OAQG;IACH,OAAO,CAAC,0BAA0B;IAoClC;;;;;;;;;OASG;YACW,gBAAgB;IAuF9B;;;;;;;;;;;OAWG;YACW,qBAAqB;IA4CnC;;;;;;;;;;;;OAYG;YACW,QAAQ;CAuIvB;AAgFD;;;;;;;GAOG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG5C;AAmED;;;;;;;;;;GAUG;AACH,wBAAgB,mBAAmB,CACjC,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,GACd,oBAAoB,CA+JtB"}
|
|
@@ -132,7 +132,7 @@ export function describeManualFault(err) {
|
|
|
132
132
|
* convention instance is one push away from every empty scan in the process
|
|
133
133
|
* inheriting another's contents.
|
|
134
134
|
*/
|
|
135
|
-
const emptyScan = () => ({ manuals: [], invalid: [] });
|
|
135
|
+
const emptyScan = () => ({ manuals: [], invalid: [], refused: [] });
|
|
136
136
|
const manualSerializer = new UtcpManualSerializer();
|
|
137
137
|
const callTemplateSerializer = new CallTemplateSerializer();
|
|
138
138
|
// `findRequiredVariables` is a pure walk — one shared instance is fine.
|
|
@@ -208,15 +208,15 @@ export class ToolManualService {
|
|
|
208
208
|
async listAccessible(userEmail) {
|
|
209
209
|
return (await this.accessibleManuals(userEmail)).map(toSummary);
|
|
210
210
|
}
|
|
211
|
-
async listAccessibleCatalog(userEmail) {
|
|
212
|
-
const { manuals, invalid } = await this.accessibleScan(userEmail);
|
|
211
|
+
async listAccessibleCatalog(userEmail, within) {
|
|
212
|
+
const { manuals, invalid } = await this.accessibleScan(userEmail, within);
|
|
213
213
|
return { tools: manuals.map(toSummary), invalid };
|
|
214
214
|
}
|
|
215
215
|
async listAllSummaries() {
|
|
216
216
|
return (await this.scan()).manuals.map(toSummary);
|
|
217
217
|
}
|
|
218
|
-
async catalogFingerprints(userEmail) {
|
|
219
|
-
return (await this.accessibleManuals(userEmail)).map(manualFingerprint);
|
|
218
|
+
async catalogFingerprints(userEmail, within) {
|
|
219
|
+
return (await this.accessibleManuals(userEmail, within)).map(manualFingerprint);
|
|
220
220
|
}
|
|
221
221
|
async getDetail(userEmail, slug) {
|
|
222
222
|
// Resolved through `accessibleManuals` rather than `scan()` + a canRead call
|
|
@@ -241,11 +241,39 @@ export class ToolManualService {
|
|
|
241
241
|
hiddenTools: mayManage ? hidden : [],
|
|
242
242
|
};
|
|
243
243
|
}
|
|
244
|
-
async
|
|
245
|
-
|
|
244
|
+
async liveDeclaration(userEmail, slug, varName) {
|
|
245
|
+
// The disk walk the catalog's scan is built from, run afresh and never
|
|
246
|
+
// cached: a sign-in must follow the file as it is, and the catalog's scan
|
|
247
|
+
// can be a refresh behind it. The whole walk rather than the one file, so
|
|
248
|
+
// the descriptor comes out of exactly the parse, plugin discovery and
|
|
249
|
+
// namespace dedup the catalog applies — a sign-in start is rare and
|
|
250
|
+
// interactive, and a second, single-file reading of the same files is a
|
|
251
|
+
// second place for those rules to drift. A workspace that cannot be opened
|
|
252
|
+
// is an error here, never an empty answer: "no sign-in declared" would be
|
|
253
|
+
// the wrong diagnosis for a server that could not read its files.
|
|
254
|
+
const { manuals, refused } = await this.readableBy(await this.scanDisk(undefined, 'throw'), userEmail);
|
|
255
|
+
const m = manuals.find((x) => x.slug === slug);
|
|
256
|
+
if (!m) {
|
|
257
|
+
// The file is there and says it is this manual, but the parse refused
|
|
258
|
+
// it — e.g. its sign-in names an http:// or private token endpoint. That
|
|
259
|
+
// reason is the answer; "not found" would hide the one thing to fix.
|
|
260
|
+
const r = refused.find((x) => x.slug === slug);
|
|
261
|
+
return r ? { refused: r.reason } : null;
|
|
262
|
+
}
|
|
263
|
+
const variable = (m.variables ?? []).find((v) => v.name === varName);
|
|
264
|
+
// Completed by the catalog's own decoration, on this one fresh descriptor.
|
|
265
|
+
// Only when THIS variable is a sign-in: then the manual has a declared one,
|
|
266
|
+
// so the pass completes its endpoints from the server's metadata and never
|
|
267
|
+
// probes for (or registers) a zero-config client.
|
|
268
|
+
if (variable?.oauth)
|
|
269
|
+
await this.decorateMcpOAuth([m]);
|
|
270
|
+
return { manual: toSummary(m), ...(variable ? { variable } : {}) };
|
|
271
|
+
}
|
|
272
|
+
async listLocalOnly(userEmail, within) {
|
|
273
|
+
const manuals = await this.accessibleManuals(userEmail, within);
|
|
246
274
|
return manuals.filter((m) => m.remote === false).map((m) => ({ slug: m.slug, name: m.name, path: m.path }));
|
|
247
275
|
}
|
|
248
|
-
async listDeclaredOnlyOnBranch(userEmail, branch) {
|
|
276
|
+
async listDeclaredOnlyOnBranch(userEmail, branch, within) {
|
|
249
277
|
if (!branch || branch === this.kb.defaultBranch)
|
|
250
278
|
return [];
|
|
251
279
|
// Only a draft this process already holds a clone of — the one the caller
|
|
@@ -273,7 +301,7 @@ export class ToolManualService {
|
|
|
273
301
|
// the caller could not open with `read_file`.
|
|
274
302
|
const allowed = await this.accessControl.canReadBatch(workspaceIdForBranch(branch), userEmail, pending.map((m) => m.path));
|
|
275
303
|
return pending
|
|
276
|
-
.filter((m) => allowed.get(m.path) === true)
|
|
304
|
+
.filter((m) => allowed.get(m.path) === true && (within === undefined || within(m.path)))
|
|
277
305
|
.map((m) => ({ name: m.name, path: m.path, type: m.type }));
|
|
278
306
|
}
|
|
279
307
|
async userScopedKeysForManual(manualName) {
|
|
@@ -348,7 +376,7 @@ export class ToolManualService {
|
|
|
348
376
|
return { name: m.name, type: m.type, remote: m.remote, healthCheck: m.healthCheck, callTemplate };
|
|
349
377
|
}
|
|
350
378
|
async toManualCallTemplates(userEmail, opts) {
|
|
351
|
-
const manuals = await this.accessibleManuals(userEmail);
|
|
379
|
+
const manuals = await this.accessibleManuals(userEmail, opts?.within);
|
|
352
380
|
const out = [];
|
|
353
381
|
for (const m of manuals) {
|
|
354
382
|
// Remote consumers (the hosted MCP proxy) don't get local-only manuals —
|
|
@@ -366,13 +394,16 @@ export class ToolManualService {
|
|
|
366
394
|
}
|
|
367
395
|
return out;
|
|
368
396
|
}
|
|
369
|
-
async resolveInlineManual(userEmail, slug) {
|
|
397
|
+
async resolveInlineManual(userEmail, slug, opts) {
|
|
370
398
|
const found = (await this.scan()).manuals.find((m) => m.slug === slug);
|
|
371
399
|
if (!found || found.type !== 'inline')
|
|
372
400
|
return null;
|
|
373
401
|
const wsId = this.kb.defaultWorkspaceId();
|
|
374
402
|
if (!(await this.accessControl.canRead(wsId, userEmail, found.path)))
|
|
375
403
|
return null;
|
|
404
|
+
// After the read gate, as every narrowing is: a connection's scope can only take away.
|
|
405
|
+
if (opts?.within && !opts.within(found.path))
|
|
406
|
+
return null;
|
|
376
407
|
try {
|
|
377
408
|
return manualSerializer.validateDict({
|
|
378
409
|
utcp_version: '1.1.0',
|
|
@@ -484,31 +515,41 @@ export class ToolManualService {
|
|
|
484
515
|
...(m.headers ? { headers: m.headers } : {}),
|
|
485
516
|
};
|
|
486
517
|
}
|
|
487
|
-
async accessibleManuals(userEmail) {
|
|
488
|
-
return (await this.accessibleScan(userEmail)).manuals;
|
|
518
|
+
async accessibleManuals(userEmail, within) {
|
|
519
|
+
return (await this.accessibleScan(userEmail, within)).manuals;
|
|
489
520
|
}
|
|
490
521
|
/**
|
|
491
522
|
* The scan cut to what this caller may read — manuals AND refusals, through
|
|
492
523
|
* ONE `canReadBatch`. Both halves are paths in the same workspace judged by
|
|
493
524
|
* the same rule, and splitting them into two calls would pay a second
|
|
494
525
|
* round-trip to ask the same question.
|
|
526
|
+
*
|
|
527
|
+
* `within` narrows the answer to a connection's connectors, AFTER the read
|
|
528
|
+
* gate: it can take a manual out of what the caller may read, never put one
|
|
529
|
+
* in. Absent, the answer is the caller's whole readable catalog.
|
|
495
530
|
*/
|
|
496
|
-
async accessibleScan(userEmail) {
|
|
497
|
-
|
|
498
|
-
|
|
531
|
+
async accessibleScan(userEmail, within) {
|
|
532
|
+
return this.readableBy(await this.scan(), userEmail, within);
|
|
533
|
+
}
|
|
534
|
+
/** A scan cut to what this caller may read — see {@link accessibleScan}. */
|
|
535
|
+
async readableBy(scan, userEmail, within) {
|
|
536
|
+
const { manuals, invalid, refused } = scan;
|
|
537
|
+
if (manuals.length === 0 && invalid.length === 0 && refused.length === 0)
|
|
499
538
|
return emptyScan();
|
|
500
539
|
const wsId = this.kb.defaultWorkspaceId();
|
|
501
540
|
const allowed = await this.accessControl.canReadBatch(wsId, userEmail, [
|
|
502
|
-
...new Set([...manuals.map((m) => m.path), ...invalid.map((i) => i.path)]),
|
|
541
|
+
...new Set([...manuals.map((m) => m.path), ...invalid.map((i) => i.path), ...refused.map((r) => r.path)]),
|
|
503
542
|
]);
|
|
504
543
|
// Fail closed: keep an entry only on an explicit `true` verdict (a missing
|
|
505
544
|
// entry is treated as denied, matching the KB's default-deny read model).
|
|
506
545
|
// A REFUSED file is gated the same way a listed one is: its path is a fact
|
|
507
546
|
// about the knowledge base, and "there is a broken tool at this path" is
|
|
508
547
|
// not something to tell someone who may not read that path.
|
|
548
|
+
const inScope = (p) => allowed.get(p) === true && (within === undefined || within(p));
|
|
509
549
|
return {
|
|
510
|
-
manuals: manuals.filter((m) =>
|
|
511
|
-
invalid: invalid.filter((i) =>
|
|
550
|
+
manuals: manuals.filter((m) => inScope(m.path)),
|
|
551
|
+
invalid: invalid.filter((i) => inScope(i.path)),
|
|
552
|
+
refused: refused.filter((r) => inScope(r.path)),
|
|
512
553
|
};
|
|
513
554
|
}
|
|
514
555
|
async scan() {
|
|
@@ -534,15 +575,15 @@ export class ToolManualService {
|
|
|
534
575
|
// See `TtlCache.begin`: taken before the read so an `invalidate()` that
|
|
535
576
|
// lands mid-scan discards this result instead of being overwritten by it.
|
|
536
577
|
const token = this.cache.begin();
|
|
537
|
-
const
|
|
578
|
+
const scanned = await this.scanDisk();
|
|
579
|
+
const { manuals } = scanned;
|
|
538
580
|
await this.decorateMcpOAuth(manuals);
|
|
539
581
|
// AFTER the oauth decoration, so an injected `${MCP_OAUTH}` header ref is
|
|
540
582
|
// already declared and isn't re-surfaced as a bare admin key.
|
|
541
583
|
for (const m of manuals)
|
|
542
584
|
this.surfaceReferencedVariables(m);
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
return result;
|
|
585
|
+
this.cache.set(scanned, token);
|
|
586
|
+
return scanned;
|
|
546
587
|
}
|
|
547
588
|
/**
|
|
548
589
|
* Say what the scan refused — once per CHANGE, not once per scan. Every
|
|
@@ -713,11 +754,12 @@ export class ToolManualService {
|
|
|
713
754
|
* (the owner registered an app with a provider that offers no dynamic
|
|
714
755
|
* registration — HubSpot, Google) gets its endpoints, PKCE and resource
|
|
715
756
|
* indicator from the server's own OAuth metadata, exactly as the zero-config
|
|
716
|
-
* path would. The descriptor is completed IN MEMORY
|
|
717
|
-
*
|
|
718
|
-
*
|
|
719
|
-
* incomplete and `setup.reason` says so — the secret
|
|
720
|
-
* with the same reason instead of
|
|
757
|
+
* path would. The descriptor is completed IN MEMORY, for the catalog's scan
|
|
758
|
+
* and for every sign-in start (`liveDeclaration`) alike, so nothing here
|
|
759
|
+
* persists. When the metadata can't be had, the declaration stays
|
|
760
|
+
* incomplete and `setup.reason` says so — the client-secret save and the
|
|
761
|
+
* sign-in start then refuse with the same reason instead of running a
|
|
762
|
+
* provider with no endpoints.
|
|
721
763
|
*/
|
|
722
764
|
async completeDeclaredOAuth(discovery, m, v) {
|
|
723
765
|
const declaredByHand = 'declare `authorizationUrl` and `tokenUrl` on the sign-in variable';
|
|
@@ -771,12 +813,22 @@ export class ToolManualService {
|
|
|
771
813
|
* calls: a refusal lives only in the scan it came from, so a fixed file is a
|
|
772
814
|
* valid manual on the very next scan.
|
|
773
815
|
*/
|
|
774
|
-
async scanDisk(branch = this.kb.defaultBranch
|
|
816
|
+
async scanDisk(branch = this.kb.defaultBranch,
|
|
817
|
+
/**
|
|
818
|
+
* What a workspace that cannot be opened means. For the catalog, an empty
|
|
819
|
+
* scan: a listing surface answers "nothing released" and the next scan
|
|
820
|
+
* tries again. For a sign-in start (`liveDeclaration`), the error itself:
|
|
821
|
+
* an empty answer there would read as "this tool has no sign-in", a
|
|
822
|
+
* misconfiguration, when the server could not read its files at all.
|
|
823
|
+
*/
|
|
824
|
+
workspaceFailure = 'empty') {
|
|
775
825
|
let wsId;
|
|
776
826
|
try {
|
|
777
827
|
wsId = (await this.workspaceService.getOrCreateForBranch(branch)).id;
|
|
778
828
|
}
|
|
779
|
-
catch {
|
|
829
|
+
catch (err) {
|
|
830
|
+
if (workspaceFailure === 'throw')
|
|
831
|
+
throw err;
|
|
780
832
|
return emptyScan();
|
|
781
833
|
}
|
|
782
834
|
const kbRoot = path.join(await this.workspaceService.getWorkspacePath(wsId), this.kbDirName);
|
|
@@ -795,6 +847,7 @@ export class ToolManualService {
|
|
|
795
847
|
// The plugins (and their mcp.json text) come from the configured source, so
|
|
796
848
|
// a dialect that expands servers from a registry lands here unchanged.
|
|
797
849
|
const parsed = [];
|
|
850
|
+
const refused = [];
|
|
798
851
|
const discovered = await this.source.discover(kbRoot);
|
|
799
852
|
for (const plugin of discovered.plugins) {
|
|
800
853
|
if (plugin.mcpJsonText === null)
|
|
@@ -804,7 +857,8 @@ export class ToolManualService {
|
|
|
804
857
|
// (a URL, a header, an added or dropped server, a `local: true` flip)
|
|
805
858
|
// moves every server's digest — which is correct, if slightly generous.
|
|
806
859
|
const from = sourceDigest(plugin.mcpJsonText + '\u0000' + (plugin.manifestText ?? ''));
|
|
807
|
-
|
|
860
|
+
const onRefused = (slug, reason, path) => refused.push({ slug, path, reason: describeManualFault(reason) });
|
|
861
|
+
for (const d of descriptorsFromMcpJson(plugin.relFolder, plugin.mcpJsonText, plugin.manifestText, layout, onRefused)) {
|
|
808
862
|
d.sourceRevision = from;
|
|
809
863
|
parsed.push(d);
|
|
810
864
|
}
|
|
@@ -841,6 +895,9 @@ export class ToolManualService {
|
|
|
841
895
|
// outage from where the author stands: the tool is gone from every
|
|
842
896
|
// listing, with nothing anywhere saying which file or why.
|
|
843
897
|
invalid.push({ path: f.rel, reason: describeManualFault(err) });
|
|
898
|
+
const slug = refusedToolManualName(baseName(f.rel), content);
|
|
899
|
+
if (slug !== null)
|
|
900
|
+
refused.push({ slug, path: f.rel, reason: describeManualFault(err) });
|
|
844
901
|
continue;
|
|
845
902
|
}
|
|
846
903
|
// The route slug IS the id (unique after dedup below, snake_case → URL-safe),
|
|
@@ -888,7 +945,7 @@ export class ToolManualService {
|
|
|
888
945
|
// served catalog — it would also flap the log every time an agent saves.
|
|
889
946
|
if (branch === this.kb.defaultBranch)
|
|
890
947
|
this.logInvalidOnChange(invalid);
|
|
891
|
-
return { manuals, invalid };
|
|
948
|
+
return { manuals, invalid, refused };
|
|
892
949
|
}
|
|
893
950
|
}
|
|
894
951
|
// --- helpers ------------------------------------------------------------------
|
|
@@ -997,6 +1054,53 @@ function manualName(raw) {
|
|
|
997
1054
|
return `tool${name}`;
|
|
998
1055
|
return name;
|
|
999
1056
|
}
|
|
1057
|
+
/**
|
|
1058
|
+
* The object a `.tool` file holds: its `---` block when fenced, the whole file
|
|
1059
|
+
* when not. Throws when that is not an object.
|
|
1060
|
+
*/
|
|
1061
|
+
function toolFileObject(content) {
|
|
1062
|
+
const fm = extractFrontmatter(content);
|
|
1063
|
+
const source = fm ? fm.frontmatter : content;
|
|
1064
|
+
const parsed = parseYaml(source);
|
|
1065
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
1066
|
+
throw new Error('`.tool` file must be a YAML/JSON object (in the `---` block when fenced)');
|
|
1067
|
+
}
|
|
1068
|
+
return parsed;
|
|
1069
|
+
}
|
|
1070
|
+
/**
|
|
1071
|
+
* A `.tool`'s manual name — its UTCP namespace, and the slug the scan serves it
|
|
1072
|
+
* under. An explicit `id` is used VERBATIM, so it must be lowercase snake_case
|
|
1073
|
+
* (UTCP's namespace grammar). With no explicit id, fall back to `name` then the
|
|
1074
|
+
* filename and sanitize (legacy behaviour — keeps existing tools' namespaces).
|
|
1075
|
+
*/
|
|
1076
|
+
function toolManualName(obj, provisionalSlug) {
|
|
1077
|
+
const explicitId = typeof obj.id === 'string' ? obj.id.trim() : '';
|
|
1078
|
+
if (!explicitId)
|
|
1079
|
+
return manualName(resolveDeclaredId(obj, provisionalSlug));
|
|
1080
|
+
if (!isValidId(explicitId)) {
|
|
1081
|
+
// The rejected id is NOT quoted back — see `describeManualFault`: this
|
|
1082
|
+
// message becomes an `invalid[].reason` on an agent transcript, a browser
|
|
1083
|
+
// and a log, and `id` is a field an author can paste anything into,
|
|
1084
|
+
// including the token they meant for a header. The field name plus the
|
|
1085
|
+
// rule is what the author needs; the value is in front of them.
|
|
1086
|
+
throw new Error('tool `id` must be lowercase snake_case (letters, digits, underscores)');
|
|
1087
|
+
}
|
|
1088
|
+
return explicitId;
|
|
1089
|
+
}
|
|
1090
|
+
/**
|
|
1091
|
+
* The manual name of a `.tool` the parser REFUSED, when the file still says
|
|
1092
|
+
* which manual it is — by the same rule {@link normalizeToolManual} names a
|
|
1093
|
+
* manual it accepts. `null` when even that cannot be read (unparseable YAML,
|
|
1094
|
+
* a malformed `id`): then nothing can claim the refusal by name.
|
|
1095
|
+
*/
|
|
1096
|
+
function refusedToolManualName(provisionalSlug, content) {
|
|
1097
|
+
try {
|
|
1098
|
+
return toolManualName(toolFileObject(content), provisionalSlug);
|
|
1099
|
+
}
|
|
1100
|
+
catch {
|
|
1101
|
+
return null;
|
|
1102
|
+
}
|
|
1103
|
+
}
|
|
1000
1104
|
/**
|
|
1001
1105
|
* Parse + normalize a `.tool` file into a descriptor. THE TOOL IS THE
|
|
1002
1106
|
* FRONTMATTER: a fenced file's single `---` YAML block carries everything —
|
|
@@ -1016,34 +1120,9 @@ export function normalizeToolManual(provisionalSlug, repoPath, content) {
|
|
|
1016
1120
|
// finds its verbs inside the fence, the id index finds `id`/`name`, and the
|
|
1017
1121
|
// config keys live in the same object. A fence-less file is the legacy form
|
|
1018
1122
|
// (the whole file is the object) — JSON `.tool`s can't carry fences.
|
|
1019
|
-
const
|
|
1020
|
-
const source = fm ? fm.frontmatter : content;
|
|
1021
|
-
const parsed = parseYaml(source);
|
|
1022
|
-
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
1023
|
-
throw new Error('`.tool` file must be a YAML/JSON object (in the `---` block when fenced)');
|
|
1024
|
-
}
|
|
1025
|
-
const obj = parsed;
|
|
1123
|
+
const obj = toolFileObject(content);
|
|
1026
1124
|
const type = normalizeType(obj.type);
|
|
1027
|
-
|
|
1028
|
-
// it must be lowercase snake_case (UTCP's namespace grammar). With no explicit
|
|
1029
|
-
// id, fall back to `name` then the filename and sanitize (legacy behaviour —
|
|
1030
|
-
// keeps existing tools' namespaces).
|
|
1031
|
-
const explicitId = typeof obj.id === 'string' ? obj.id.trim() : '';
|
|
1032
|
-
let name;
|
|
1033
|
-
if (explicitId) {
|
|
1034
|
-
if (!isValidId(explicitId)) {
|
|
1035
|
-
// The rejected id is NOT quoted back — see `describeManualFault`: this
|
|
1036
|
-
// message becomes an `invalid[].reason` on an agent transcript, a browser
|
|
1037
|
-
// and a log, and `id` is a field an author can paste anything into,
|
|
1038
|
-
// including the token they meant for a header. The field name plus the
|
|
1039
|
-
// rule is what the author needs; the value is in front of them.
|
|
1040
|
-
throw new Error('tool `id` must be lowercase snake_case (letters, digits, underscores)');
|
|
1041
|
-
}
|
|
1042
|
-
name = explicitId;
|
|
1043
|
-
}
|
|
1044
|
-
else {
|
|
1045
|
-
name = manualName(resolveDeclaredId(obj, provisionalSlug));
|
|
1046
|
-
}
|
|
1125
|
+
const name = toolManualName(obj, provisionalSlug);
|
|
1047
1126
|
// A `.tool` may not reproduce a built-in manual's UTCP namespace — that would
|
|
1048
1127
|
// let it read the loopback creds seeded under that namespace on the agent's
|
|
1049
1128
|
// code-mode client (internal token, connector creds, KB bearer).
|