@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
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
import { describe, test, expect, beforeEach, afterEach, vi } from 'vitest';
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
// The real disk, and the service wired over it, come from the composition-root
|
|
3
|
+
// fixtures, as production wires them: this suite constructs no implementation
|
|
4
|
+
// from its file, its own module's included.
|
|
5
|
+
import { realDisk } from '../../../__tests__/real-disk.js';
|
|
6
|
+
import { realToolManualService, type McpAuthDiscoveryPort } from '../../../__tests__/tool-manuals.js';
|
|
4
7
|
|
|
5
8
|
/** The one disk, as production wires it: the service and its discovery read the same one. */
|
|
6
|
-
const disk =
|
|
9
|
+
const disk = realDisk();
|
|
7
10
|
import { mkdtemp, rm, mkdir, writeFile } from 'node:fs/promises';
|
|
8
11
|
import { tmpdir } from 'node:os';
|
|
9
12
|
import { join } from 'node:path';
|
|
10
13
|
import { DEFAULT_BRANCH } from '@bevel-software/platform-shared';
|
|
11
|
-
import { ToolManualService, type McpAuthDiscoveryPort } from '../tool-manuals.service.js';
|
|
12
14
|
import { workspaceIdForBranch } from '../../../shared/workspace-id.js';
|
|
13
|
-
import type { WorkspaceService } from '../../workspace/
|
|
14
|
-
import type { IAccessControl } from '../../access/
|
|
15
|
+
import type { WorkspaceService } from '../../workspace/index.js';
|
|
16
|
+
import type { IAccessControl } from '../../access/index.js';
|
|
15
17
|
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
16
18
|
|
|
17
19
|
const KB_DIR = 'knowledge-base';
|
|
@@ -63,9 +65,10 @@ describe('ToolManualService — MCP OAuth auto-discovery decoration', () => {
|
|
|
63
65
|
});
|
|
64
66
|
|
|
65
67
|
function svcWith(discovery: McpAuthDiscoveryPort) {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
68
|
+
return realToolManualService(
|
|
69
|
+
{ workspaceService, accessControl: allowAll, kb: testKbContext({ kbDirName: KB_DIR }), disk },
|
|
70
|
+
discovery,
|
|
71
|
+
);
|
|
69
72
|
}
|
|
70
73
|
|
|
71
74
|
test('a bare mcp tool whose server demands OAuth gains the synthetic sign-in var + header', async () => {
|
|
@@ -94,8 +97,10 @@ describe('ToolManualService — MCP OAuth auto-discovery decoration', () => {
|
|
|
94
97
|
|
|
95
98
|
// The served call template carries the header the variable loader will fill.
|
|
96
99
|
const templates = await svc.toManualCallTemplates('user@example.com');
|
|
97
|
-
const notionTemplate = templates.find((t) => t.name === 'notion') as
|
|
98
|
-
|
|
100
|
+
const notionTemplate = templates.find((t) => t.name === 'notion') as
|
|
101
|
+
| { config: { mcpServers: Record<string, { headers: Record<string, string> }> } }
|
|
102
|
+
| undefined;
|
|
103
|
+
expect(notionTemplate?.config.mcpServers.notion?.headers).toEqual({
|
|
99
104
|
Authorization: 'Bearer ${MCP_OAUTH}',
|
|
100
105
|
});
|
|
101
106
|
});
|
|
@@ -298,4 +303,185 @@ describe('ToolManualService — MCP OAuth auto-discovery decoration', () => {
|
|
|
298
303
|
// The declaration is carried verbatim, opt-out included.
|
|
299
304
|
expect(hubspot.variables?.[0].oauth).toMatchObject({ clientId: 'owner-app', pkce: false });
|
|
300
305
|
});
|
|
306
|
+
|
|
307
|
+
describe('liveDeclaration — what a sign-in start reads', () => {
|
|
308
|
+
const HUBSPOT_ENDPOINTS = {
|
|
309
|
+
authorizationUrl: 'https://auth.hubspot.example/authorize',
|
|
310
|
+
tokenUrl: 'https://auth.hubspot.example/token',
|
|
311
|
+
};
|
|
312
|
+
|
|
313
|
+
test('reads the file as it is now, not the catalog the last scan cached', async () => {
|
|
314
|
+
await writeDeclaredServer({ clientId: 'client-A', ...HUBSPOT_ENDPOINTS });
|
|
315
|
+
const svc = svcWith({ statusFor: vi.fn(async () => ({ status: 'open' as const })) });
|
|
316
|
+
// The catalog is scanned and cached under client A…
|
|
317
|
+
const cached = (await svc.listAccessible('user@example.com')).find((m) => m.name === 'hubspot')!;
|
|
318
|
+
expect(cached.variables?.[0].oauth?.clientId).toBe('client-A');
|
|
319
|
+
|
|
320
|
+
// …the file is edited, and nothing invalidates the catalog.
|
|
321
|
+
await writeDeclaredServer({ clientId: 'client-B', ...HUBSPOT_ENDPOINTS, scopes: ['crm.read'] });
|
|
322
|
+
const stale = (await svc.listAccessible('user@example.com')).find((m) => m.name === 'hubspot')!;
|
|
323
|
+
expect(stale.variables?.[0].oauth?.clientId).toBe('client-A');
|
|
324
|
+
|
|
325
|
+
const live = await svc.liveDeclaration('user@example.com', 'hubspot', 'HUBSPOT_TOKEN');
|
|
326
|
+
expect(live?.manual.name).toBe('hubspot');
|
|
327
|
+
expect(live?.variable?.oauth).toEqual({ clientId: 'client-B', ...HUBSPOT_ENDPOINTS, scopes: ['crm.read'] });
|
|
328
|
+
});
|
|
329
|
+
|
|
330
|
+
test('a .tool file is read afresh the same way', async () => {
|
|
331
|
+
const toolsDir = join(root, wsId, KB_DIR, 'Plugins');
|
|
332
|
+
const write = (clientId: string) =>
|
|
333
|
+
writeFile(
|
|
334
|
+
join(toolsDir, 'crm.tool'),
|
|
335
|
+
JSON.stringify({
|
|
336
|
+
name: 'crm',
|
|
337
|
+
type: 'http',
|
|
338
|
+
url: 'https://api.crm.example/openapi.json',
|
|
339
|
+
variables: [{ name: 'SIGNIN', scope: 'user', oauth: { clientId, ...HUBSPOT_ENDPOINTS } }],
|
|
340
|
+
}),
|
|
341
|
+
);
|
|
342
|
+
await write('client-A');
|
|
343
|
+
const svc = svcWith({ statusFor: vi.fn(async () => ({ status: 'open' as const })) });
|
|
344
|
+
await svc.listAccessible('user@example.com');
|
|
345
|
+
await write('client-B');
|
|
346
|
+
const live = await svc.liveDeclaration('user@example.com', 'crm', 'SIGNIN');
|
|
347
|
+
expect(live?.variable?.oauth?.clientId).toBe('client-B');
|
|
348
|
+
});
|
|
349
|
+
|
|
350
|
+
test('completes a client-id-only declaration from the server metadata, or carries the discovery reason', async () => {
|
|
351
|
+
await writeDeclaredServer({ clientId: 'owner-app' });
|
|
352
|
+
const statusFor = vi.fn(async () => ({ status: 'open' as const }));
|
|
353
|
+
const providerForDeclaredClient = vi.fn(async () => ({
|
|
354
|
+
status: 'oauth' as const,
|
|
355
|
+
provider: { ...HUBSPOT_ENDPOINTS, clientId: 'owner-app', pkce: true, resource: 'https://mcp.hubspot.example/mcp' },
|
|
356
|
+
}));
|
|
357
|
+
const live = await svcWith({ statusFor, providerForDeclaredClient }).liveDeclaration(
|
|
358
|
+
'user@example.com',
|
|
359
|
+
'hubspot',
|
|
360
|
+
'HUBSPOT_TOKEN',
|
|
361
|
+
);
|
|
362
|
+
expect(live?.variable?.oauth).toEqual({
|
|
363
|
+
clientId: 'owner-app',
|
|
364
|
+
...HUBSPOT_ENDPOINTS,
|
|
365
|
+
resource: 'https://mcp.hubspot.example/mcp',
|
|
366
|
+
});
|
|
367
|
+
// Never a zero-config probe or registration for a declared sign-in.
|
|
368
|
+
expect(statusFor).not.toHaveBeenCalled();
|
|
369
|
+
|
|
370
|
+
const warn = vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
371
|
+
const stuck = await svcWith({
|
|
372
|
+
statusFor,
|
|
373
|
+
providerForDeclaredClient: async () => ({ status: 'unsupported' as const, reason: 'no authorization-server metadata' }),
|
|
374
|
+
}).liveDeclaration('user@example.com', 'hubspot', 'HUBSPOT_TOKEN');
|
|
375
|
+
expect(stuck?.variable?.oauth).toEqual({ clientId: 'owner-app' });
|
|
376
|
+
expect(stuck?.manual.setup).toEqual({ kind: 'oauth-manual', reason: 'no authorization-server metadata' });
|
|
377
|
+
warn.mockRestore();
|
|
378
|
+
});
|
|
379
|
+
|
|
380
|
+
test('a .tool whose sign-in endpoint fails validation answers the parser’s reason, even while the catalog holds the valid version', async () => {
|
|
381
|
+
const toolsDir = join(root, wsId, KB_DIR, 'Plugins');
|
|
382
|
+
const write = (tokenUrl: string) =>
|
|
383
|
+
writeFile(
|
|
384
|
+
join(toolsDir, 'crm.tool'),
|
|
385
|
+
JSON.stringify({
|
|
386
|
+
name: 'crm',
|
|
387
|
+
type: 'http',
|
|
388
|
+
url: 'https://api.crm.example/openapi.json',
|
|
389
|
+
variables: [{ name: 'SIGNIN', scope: 'user', oauth: { clientId: 'c', authorizationUrl: HUBSPOT_ENDPOINTS.authorizationUrl, tokenUrl } }],
|
|
390
|
+
}),
|
|
391
|
+
);
|
|
392
|
+
await write(HUBSPOT_ENDPOINTS.tokenUrl);
|
|
393
|
+
const warn = vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
394
|
+
const svc = svcWith({ statusFor: vi.fn(async () => ({ status: 'open' as const })) });
|
|
395
|
+
expect((await svc.listAccessible('user@example.com')).some((m) => m.name === 'crm')).toBe(true);
|
|
396
|
+
|
|
397
|
+
await write('http://127.0.0.1/token');
|
|
398
|
+
await expect(svc.liveDeclaration('user@example.com', 'crm', 'SIGNIN')).resolves.toEqual({
|
|
399
|
+
refused: '`variables[0].oauth.tokenUrl` must use https',
|
|
400
|
+
});
|
|
401
|
+
await write('https://10.0.0.5/token');
|
|
402
|
+
await expect(svc.liveDeclaration('user@example.com', 'crm', 'SIGNIN')).resolves.toEqual({
|
|
403
|
+
refused: '`variables[0].oauth.tokenUrl` host is not allowed',
|
|
404
|
+
});
|
|
405
|
+
warn.mockRestore();
|
|
406
|
+
});
|
|
407
|
+
|
|
408
|
+
test('a plugin.json sign-in whose endpoint fails validation answers the reason too, not only a log line', async () => {
|
|
409
|
+
await writeDeclaredServer({ clientId: 'owner-app', ...HUBSPOT_ENDPOINTS, tokenUrl: 'http://127.0.0.1/token' });
|
|
410
|
+
const warn = vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
411
|
+
const svc = svcWith({ statusFor: vi.fn(async () => ({ status: 'open' as const })) });
|
|
412
|
+
const live = await svc.liveDeclaration('user@example.com', 'hubspot', 'HUBSPOT_TOKEN');
|
|
413
|
+
expect(live?.refused).toContain('`variables[0].oauth.tokenUrl` must use https');
|
|
414
|
+
// Located by position, never by the name the entry declared (the .tool parser's rule).
|
|
415
|
+
expect(live?.refused).not.toContain('HUBSPOT_TOKEN');
|
|
416
|
+
// The catalog's public listing is unchanged by this: the server is still left out.
|
|
417
|
+
const catalog = await svc.listAccessibleCatalog('user@example.com');
|
|
418
|
+
expect(catalog.tools.some((m) => m.name === 'hubspot')).toBe(false);
|
|
419
|
+
warn.mockRestore();
|
|
420
|
+
});
|
|
421
|
+
|
|
422
|
+
test('a refusal is read-gated like the manual it would have been', async () => {
|
|
423
|
+
await writeDeclaredServer({ clientId: 'owner-app', ...HUBSPOT_ENDPOINTS, tokenUrl: 'http://127.0.0.1/token' });
|
|
424
|
+
const warn = vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
425
|
+
const denyAll = {
|
|
426
|
+
canRead: async () => false,
|
|
427
|
+
canReadBatch: async (_w: string, _e: string, paths: string[]) => new Map(paths.map((p) => [p, false])),
|
|
428
|
+
} as unknown as IAccessControl;
|
|
429
|
+
const locked = realToolManualService({
|
|
430
|
+
workspaceService,
|
|
431
|
+
accessControl: denyAll,
|
|
432
|
+
kb: testKbContext({ kbDirName: KB_DIR }),
|
|
433
|
+
disk,
|
|
434
|
+
});
|
|
435
|
+
await expect(locked.liveDeclaration('user@example.com', 'hubspot', 'HUBSPOT_TOKEN')).resolves.toBeNull();
|
|
436
|
+
warn.mockRestore();
|
|
437
|
+
});
|
|
438
|
+
|
|
439
|
+
test('a workspace that cannot be opened is an error for a sign-in start, where the catalog answers empty', async () => {
|
|
440
|
+
await writeDeclaredServer({ clientId: 'owner-app', ...HUBSPOT_ENDPOINTS });
|
|
441
|
+
const down = {
|
|
442
|
+
getOrCreateForBranch: async () => {
|
|
443
|
+
throw new Error('workspace unavailable');
|
|
444
|
+
},
|
|
445
|
+
} as unknown as WorkspaceService;
|
|
446
|
+
const allowAll = {
|
|
447
|
+
canRead: async () => true,
|
|
448
|
+
canReadBatch: async (_w: string, _e: string, paths: string[]) => new Map(paths.map((p) => [p, true])),
|
|
449
|
+
} as unknown as IAccessControl;
|
|
450
|
+
const svc = realToolManualService({
|
|
451
|
+
workspaceService: down,
|
|
452
|
+
accessControl: allowAll,
|
|
453
|
+
kb: testKbContext({ kbDirName: KB_DIR }),
|
|
454
|
+
disk,
|
|
455
|
+
});
|
|
456
|
+
// The catalog degrades to "nothing released" and tries again next scan…
|
|
457
|
+
await expect(svc.listAccessible('user@example.com')).resolves.toEqual([]);
|
|
458
|
+
// …but a sign-in start must not read that as "no sign-in declared".
|
|
459
|
+
await expect(svc.liveDeclaration('user@example.com', 'hubspot', 'HUBSPOT_TOKEN')).rejects.toThrow(
|
|
460
|
+
'workspace unavailable',
|
|
461
|
+
);
|
|
462
|
+
});
|
|
463
|
+
|
|
464
|
+
test('answers no variable when the file declares none of that name, and null for an unreadable manual', async () => {
|
|
465
|
+
await writeDeclaredServer({ clientId: 'owner-app', ...HUBSPOT_ENDPOINTS });
|
|
466
|
+
const statusFor = vi.fn(async () => ({ status: 'oauth' as const, provider: OAUTH_PROVIDER }));
|
|
467
|
+
const svc = svcWith({ statusFor });
|
|
468
|
+
// The zero-config variable is synthesised by the catalog, not declared in any file.
|
|
469
|
+
const bare = await svc.liveDeclaration('user@example.com', 'notion', 'MCP_OAUTH');
|
|
470
|
+
expect(bare?.manual.name).toBe('notion');
|
|
471
|
+
expect(bare?.variable).toBeUndefined();
|
|
472
|
+
expect(statusFor).not.toHaveBeenCalled();
|
|
473
|
+
|
|
474
|
+
const denyAll = {
|
|
475
|
+
canRead: async () => false,
|
|
476
|
+
canReadBatch: async (_w: string, _e: string, paths: string[]) => new Map(paths.map((p) => [p, false])),
|
|
477
|
+
} as unknown as IAccessControl;
|
|
478
|
+
const locked = realToolManualService({
|
|
479
|
+
workspaceService,
|
|
480
|
+
accessControl: denyAll,
|
|
481
|
+
kb: testKbContext({ kbDirName: KB_DIR }),
|
|
482
|
+
disk,
|
|
483
|
+
});
|
|
484
|
+
await expect(locked.liveDeclaration('user@example.com', 'hubspot', 'HUBSPOT_TOKEN')).resolves.toBeNull();
|
|
485
|
+
});
|
|
486
|
+
});
|
|
301
487
|
});
|
|
@@ -183,6 +183,15 @@ describe('ToolManualService', () => {
|
|
|
183
183
|
expect(manual).toBeNull();
|
|
184
184
|
});
|
|
185
185
|
|
|
186
|
+
test("does not resolve a readable inline manual outside a connection's connectors", async () => {
|
|
187
|
+
// The narrowing applies after the read gate, on the manual's own path.
|
|
188
|
+
const paths: string[] = [];
|
|
189
|
+
const within = (p: string) => (paths.push(p), false);
|
|
190
|
+
expect(await svc().resolveInlineManual('user@x.eu', 'weather', { within })).toBeNull();
|
|
191
|
+
expect(paths).toEqual([expect.stringMatching(/weather\.tool$/)]);
|
|
192
|
+
expect(await svc().resolveInlineManual('user@x.eu', 'weather', { within: () => true })).not.toBeNull();
|
|
193
|
+
});
|
|
194
|
+
|
|
186
195
|
test('resolves an inline tool that calls Google as a service account, and surfaces the key variable', async () => {
|
|
187
196
|
// The auth block is what makes the call; the key it names has to reach the
|
|
188
197
|
// secrets UI as a shared variable or nobody can store it.
|
|
@@ -486,6 +495,30 @@ describe('ToolManualService', () => {
|
|
|
486
495
|
});
|
|
487
496
|
});
|
|
488
497
|
|
|
498
|
+
/**
|
|
499
|
+
* A connection made as an `.agent` file narrows the catalog (`within`) —
|
|
500
|
+
* AFTER the read gate, on every read an agent surface makes, so it can take
|
|
501
|
+
* a manual away and never give one.
|
|
502
|
+
*/
|
|
503
|
+
describe('narrowed to a connection’s connectors', () => {
|
|
504
|
+
const onlyBilling = (p: string) => p === 'Plugins/billing.tool';
|
|
505
|
+
const everything = () => true;
|
|
506
|
+
|
|
507
|
+
test('every agent-facing read answers only what is both readable and within', async () => {
|
|
508
|
+
const s = svc();
|
|
509
|
+
expect((await s.toManualCallTemplates('user@x.eu', { within: onlyBilling })).map((t) => t.name)).toEqual(['billing']);
|
|
510
|
+
expect((await s.listAccessibleCatalog('user@x.eu', onlyBilling)).tools.map((t) => t.name)).toEqual(['billing']);
|
|
511
|
+
expect(await s.catalogFingerprints('user@x.eu', onlyBilling)).toHaveLength(1);
|
|
512
|
+
expect(await s.listLocalOnly('user@x.eu', () => false)).toEqual([]);
|
|
513
|
+
});
|
|
514
|
+
|
|
515
|
+
test('an entry naming a manual the person may not read loads nothing for it', async () => {
|
|
516
|
+
const s = svc(denyBilling);
|
|
517
|
+
expect(await s.toManualCallTemplates('user@x.eu', { within: onlyBilling })).toEqual([]);
|
|
518
|
+
expect((await s.toManualCallTemplates('user@x.eu', { within: everything })).map((t) => t.name)).toEqual(['weather']);
|
|
519
|
+
});
|
|
520
|
+
});
|
|
521
|
+
|
|
489
522
|
test('skips a `.tool` with a malformed `variables` entry (never silently mis-scoped)', async () => {
|
|
490
523
|
root = await mkdtemp(join(tmpdir(), 'toolsvbad-'));
|
|
491
524
|
const tools = join(root, wsId, KB_DIR, 'Plugins');
|
|
@@ -920,6 +953,15 @@ describe('ToolManualService.listDeclaredOnlyOnBranch', () => {
|
|
|
920
953
|
]);
|
|
921
954
|
});
|
|
922
955
|
|
|
956
|
+
test("narrowed to a connection's connectors, after the read gate", async () => {
|
|
957
|
+
await writeMcpJson(draftWs, 'Ops', ['pager']);
|
|
958
|
+
expect(await svc().listDeclaredOnlyOnBranch('user@example.com', DRAFT, (p) => p.startsWith('Plugins/Ops/'))).toEqual([
|
|
959
|
+
{ name: 'pager', path: 'Plugins/Ops/mcp.json', type: 'mcp' },
|
|
960
|
+
]);
|
|
961
|
+
// Naming an unreadable declaration does not let it through.
|
|
962
|
+
expect(await svc().listDeclaredOnlyOnBranch('user@example.com', DRAFT, (p) => p.startsWith('Plugins/Secret Plugin/'))).toEqual([]);
|
|
963
|
+
});
|
|
964
|
+
|
|
923
965
|
test('is empty for the default branch itself and for a branch without a workspace', async () => {
|
|
924
966
|
expect(await svc().listDeclaredOnlyOnBranch('user@example.com', DEFAULT_BRANCH)).toEqual([]);
|
|
925
967
|
expect(await svc().listDeclaredOnlyOnBranch('user@example.com', 'user/gone')).toEqual([]);
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import type { Server as HttpServer } from 'node:http';
|
|
2
2
|
import express from 'express';
|
|
3
3
|
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
4
|
-
import { ToolRegistry } from '../../tool-registry/
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
4
|
+
import { ToolRegistry } from '../../tool-registry/index.js';
|
|
5
|
+
import {
|
|
6
|
+
InternalTokenService,
|
|
7
|
+
createToolAuthMiddleware,
|
|
8
|
+
createToolContextResolver,
|
|
9
|
+
createToolHandlerFactory,
|
|
10
|
+
} from '../../../__tests__/tool-wiring.js';
|
|
9
11
|
import { registerToolManualsTools } from '../tool-manuals.tools.js';
|
|
10
12
|
import type { IToolManualService } from '../tool-manuals.contract.js';
|
|
11
13
|
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
@@ -273,7 +275,7 @@ describe('list_tool_setup — a declaration that lives on a draft says so', () =
|
|
|
273
275
|
note?: string;
|
|
274
276
|
};
|
|
275
277
|
// Resolved for the caller, on the branch they named.
|
|
276
|
-
expect(toolManualService.listDeclaredOnlyOnBranch).toHaveBeenCalledWith(ALICE.email, 'alice/add-crm');
|
|
278
|
+
expect(toolManualService.listDeclaredOnlyOnBranch).toHaveBeenCalledWith(ALICE.email, 'alice/add-crm', undefined);
|
|
277
279
|
// The released catalog is unchanged — the draft's server is not in it...
|
|
278
280
|
expect(body.tools.map((t) => t.slug)).not.toContain('crm');
|
|
279
281
|
// ...and the agent is told where it is and what makes it live.
|
|
@@ -294,7 +296,7 @@ describe('list_tool_setup — a declaration that lives on a draft says so', () =
|
|
|
294
296
|
const res = await callSetup(base, agentToken);
|
|
295
297
|
expect(res.status).toBe(200);
|
|
296
298
|
const body = (await res.json()) as { onBranchOnly: { name: string; branch: string }[]; note?: string };
|
|
297
|
-
expect(toolManualService.listDeclaredOnlyOnBranch).toHaveBeenCalledWith(ALICE.email, 'alice/add-crm');
|
|
299
|
+
expect(toolManualService.listDeclaredOnlyOnBranch).toHaveBeenCalledWith(ALICE.email, 'alice/add-crm', undefined);
|
|
298
300
|
expect(body.onBranchOnly).toEqual([
|
|
299
301
|
{ name: 'crm', path: 'Plugins/Sales/mcp.json', type: 'mcp', branch: 'alice/add-crm' },
|
|
300
302
|
]);
|
|
@@ -311,7 +313,7 @@ describe('list_tool_setup — a declaration that lives on a draft says so', () =
|
|
|
311
313
|
onBranchOnly: { name: string }[];
|
|
312
314
|
};
|
|
313
315
|
expect(toolManualService.listDeclaredOnlyOnBranch).toHaveBeenCalledTimes(1);
|
|
314
|
-
expect(toolManualService.listDeclaredOnlyOnBranch).toHaveBeenCalledWith(ALICE.email, 'alice/add-crm');
|
|
316
|
+
expect(toolManualService.listDeclaredOnlyOnBranch).toHaveBeenCalledWith(ALICE.email, 'alice/add-crm', undefined);
|
|
315
317
|
expect(body.onBranchOnly.map((p) => p.name)).toEqual(['crm']);
|
|
316
318
|
});
|
|
317
319
|
|
|
@@ -337,3 +339,92 @@ describe('list_tool_setup — a declaration that lives on a draft says so', () =
|
|
|
337
339
|
expect(toolManualService.listDeclaredOnlyOnBranch).not.toHaveBeenCalled();
|
|
338
340
|
});
|
|
339
341
|
});
|
|
342
|
+
|
|
343
|
+
describe('list_tool_setup — a tool that needs the caller’s own value says so', () => {
|
|
344
|
+
const TICKETS = {
|
|
345
|
+
slug: 'ticketdesk',
|
|
346
|
+
name: 'ticketdesk',
|
|
347
|
+
path: 'Plugins/Support/ticketdesk.tool',
|
|
348
|
+
type: 'http' as const,
|
|
349
|
+
variables: [{ name: 'TICKETDESK_TOKEN', scope: 'user' as const, label: null }],
|
|
350
|
+
};
|
|
351
|
+
|
|
352
|
+
it('tells a caller without their own value where to set it, and to reconnect', async () => {
|
|
353
|
+
const base = await start();
|
|
354
|
+
vi.mocked(toolManualService.listAccessibleCatalog).mockResolvedValueOnce({ tools: [TICKETS], invalid: [] } as never);
|
|
355
|
+
// Bob has configured nothing (see `statusFor`).
|
|
356
|
+
const body = (await (await callSetup(base, 'bevel_bob')).json()) as { note?: string };
|
|
357
|
+
expect(body.note).toContain('`ticketdesk` needs your own value or sign-in');
|
|
358
|
+
expect(body.note).toContain('Connect page, never in the chat');
|
|
359
|
+
expect(body.note).toContain('reconnect your assistant');
|
|
360
|
+
});
|
|
361
|
+
|
|
362
|
+
it('says nothing to a caller who has set theirs', async () => {
|
|
363
|
+
const base = await start();
|
|
364
|
+
vi.mocked(toolManualService.listAccessibleCatalog).mockResolvedValueOnce({ tools: [TICKETS], invalid: [] } as never);
|
|
365
|
+
const body = (await (await callSetup(base, 'bevel_alice')).json()) as { note?: string };
|
|
366
|
+
expect(body.note).toBeUndefined();
|
|
367
|
+
});
|
|
368
|
+
|
|
369
|
+
const SIGN_IN = {
|
|
370
|
+
...TICKETS,
|
|
371
|
+
variables: [{ name: 'TICKETDESK_OAUTH', scope: 'user' as const, label: null, oauth: { scopes: ['tickets'] } }],
|
|
372
|
+
};
|
|
373
|
+
|
|
374
|
+
/** The owner's side of a sign-in: a provider row of the OAuth kind. */
|
|
375
|
+
const ownerSignedUp = { adminConfigured: true, adminKind: 'oauth' as const };
|
|
376
|
+
|
|
377
|
+
it('tells a caller to sign in once the owner has set the sign-in up', async () => {
|
|
378
|
+
const base = await start();
|
|
379
|
+
vi.mocked(toolManualService.listAccessibleCatalog).mockResolvedValueOnce({ tools: [SIGN_IN], invalid: [] } as never);
|
|
380
|
+
statusFor.mockImplementationOnce(async (_userId: string, keys: string[]) =>
|
|
381
|
+
keys.map((key) => ({ key, ...ownerSignedUp, userConfigured: false })),
|
|
382
|
+
);
|
|
383
|
+
const body = (await (await callSetup(base, 'bevel_bob')).json()) as { note?: string };
|
|
384
|
+
expect(body.note).toContain('`ticketdesk` needs your own value or sign-in');
|
|
385
|
+
});
|
|
386
|
+
|
|
387
|
+
it('names a tool the proxy hides for a stale credential: the wrong kind, or a sign-in short of a scope', async () => {
|
|
388
|
+
const base = await start();
|
|
389
|
+
// A row left from when the variable was a plain key.
|
|
390
|
+
vi.mocked(toolManualService.listAccessibleCatalog).mockResolvedValueOnce({ tools: [SIGN_IN], invalid: [] } as never);
|
|
391
|
+
statusFor.mockImplementationOnce(async (_userId: string, keys: string[]) =>
|
|
392
|
+
keys.map((key) => ({ key, ...ownerSignedUp, userConfigured: true, userKind: 'static' as const })),
|
|
393
|
+
);
|
|
394
|
+
expect(((await (await callSetup(base, 'bevel_bob')).json()) as { note?: string }).note).toContain('`ticketdesk` needs your own value or sign-in');
|
|
395
|
+
// Signed in, but before the tool asked for `tickets`.
|
|
396
|
+
vi.mocked(toolManualService.listAccessibleCatalog).mockResolvedValueOnce({ tools: [SIGN_IN], invalid: [] } as never);
|
|
397
|
+
statusFor.mockImplementationOnce(async (_userId: string, keys: string[]) =>
|
|
398
|
+
keys.map((key) => ({ key, ...ownerSignedUp, userConfigured: true, userKind: 'oauth' as const, userAuthorized: true, grantedScopes: 'profile' })),
|
|
399
|
+
);
|
|
400
|
+
expect(((await (await callSetup(base, 'bevel_bob')).json()) as { note?: string }).note).toContain('`ticketdesk` needs your own value or sign-in');
|
|
401
|
+
// Signed in with the scope: nothing to say.
|
|
402
|
+
vi.mocked(toolManualService.listAccessibleCatalog).mockResolvedValueOnce({ tools: [SIGN_IN], invalid: [] } as never);
|
|
403
|
+
statusFor.mockImplementationOnce(async (_userId: string, keys: string[]) =>
|
|
404
|
+
keys.map((key) => ({ key, ...ownerSignedUp, userConfigured: true, userKind: 'oauth' as const, userAuthorized: true, grantedScopes: 'tickets' })),
|
|
405
|
+
);
|
|
406
|
+
expect(((await (await callSetup(base, 'bevel_bob')).json()) as { note?: string }).note).toBeUndefined();
|
|
407
|
+
});
|
|
408
|
+
|
|
409
|
+
it('does not send a caller to sign in before the owner has set the sign-in up', async () => {
|
|
410
|
+
const base = await start();
|
|
411
|
+
vi.mocked(toolManualService.listAccessibleCatalog).mockResolvedValueOnce({ tools: [SIGN_IN], invalid: [] } as never);
|
|
412
|
+
statusFor.mockImplementationOnce(async (_userId: string, keys: string[]) =>
|
|
413
|
+
keys.map((key) => ({ key, adminConfigured: false, userConfigured: false })),
|
|
414
|
+
);
|
|
415
|
+
const body = (await (await callSetup(base, 'bevel_bob')).json()) as { note?: string };
|
|
416
|
+
expect(body.note).toBeUndefined();
|
|
417
|
+
});
|
|
418
|
+
|
|
419
|
+
it('does not send a caller to sign in on a shared key left from when the variable was static', async () => {
|
|
420
|
+
const base = await start();
|
|
421
|
+
// The owner turned a plain key into a sign-in; the old shared row is still
|
|
422
|
+
// there, so `adminConfigured` is true, but it is no provider to sign in to.
|
|
423
|
+
vi.mocked(toolManualService.listAccessibleCatalog).mockResolvedValueOnce({ tools: [SIGN_IN], invalid: [] } as never);
|
|
424
|
+
statusFor.mockImplementationOnce(async (_userId: string, keys: string[]) =>
|
|
425
|
+
keys.map((key) => ({ key, adminConfigured: true, adminKind: 'static' as const, userConfigured: false })),
|
|
426
|
+
);
|
|
427
|
+
const body = (await (await callSetup(base, 'bevel_bob')).json()) as { note?: string };
|
|
428
|
+
expect(body.note).toBeUndefined();
|
|
429
|
+
});
|
|
430
|
+
});
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
// The services are types here: the composition root constructs them from
|
|
2
|
+
// their files, so a module that imports this entry for a helper or a type
|
|
3
|
+
// does not load the implementations.
|
|
4
|
+
export type { ToolManualService } from './tool-manuals.service.js';
|
|
5
|
+
export type { PendingToolsService } from './pending-tools.service.js';
|
|
3
6
|
export { registerToolManualsTools } from './tool-manuals.tools.js';
|
|
4
7
|
export {
|
|
5
8
|
createToolManualsAgentRoutes,
|
|
@@ -7,6 +10,7 @@ export {
|
|
|
7
10
|
} from './tool-manuals.routes.js';
|
|
8
11
|
export {
|
|
9
12
|
EXTERNAL_KB_MANUAL_NAME,
|
|
13
|
+
type ConnectorScope,
|
|
10
14
|
type IPendingToolService,
|
|
11
15
|
type IToolManualService,
|
|
12
16
|
type PendingTool,
|