@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
|
@@ -5,7 +5,10 @@ import { createShutdown, stopCore, withStartupTask, type LeasedWorker } from '..
|
|
|
5
5
|
import { holdCommitWorkerLease, holdable } from '../lifecycle.js';
|
|
6
6
|
import { BevelSecretsVariableLoader, registerBevelSecretsVariableLoader } from '../../modules/secrets-vault/secrets-variable-loader.js';
|
|
7
7
|
import type { AdvisoryLease } from '../../modules/database/advisory-lock.js';
|
|
8
|
-
import {
|
|
8
|
+
import { realpath } from 'node:fs/promises';
|
|
9
|
+
import { tmpdir } from 'node:os';
|
|
10
|
+
import { RipgrepPatternMatcher } from '../../modules/workspace/index.js';
|
|
11
|
+
import { slowRipgrep } from '../../__tests__/slow-ripgrep.js';
|
|
9
12
|
|
|
10
13
|
/** A lease the suite scripts: what each `tryAcquire` answers, and a way to lose it. */
|
|
11
14
|
function fakeLease(answers: boolean[]) {
|
|
@@ -510,6 +513,24 @@ describe('stopCore', () => {
|
|
|
510
513
|
expect(drained).toBeLessThan(g.order.indexOf('db.end'));
|
|
511
514
|
});
|
|
512
515
|
|
|
516
|
+
it('stops the workspaces\' tmp sweep with the graph: the timer cleared, the sweep in flight awaited before the pool goes', async () => {
|
|
517
|
+
const g = graph();
|
|
518
|
+
const tmpSweeper = {
|
|
519
|
+
stopSweeping() {
|
|
520
|
+
g.order.push('tmpSweeper.stopSweeping');
|
|
521
|
+
},
|
|
522
|
+
async drainSweep() {
|
|
523
|
+
g.order.push('tmpSweeper.drainSweep');
|
|
524
|
+
},
|
|
525
|
+
};
|
|
526
|
+
await stopCore({ ...g.core, tmpSweeper } as never);
|
|
527
|
+
const stopped = g.order.indexOf('tmpSweeper.stopSweeping');
|
|
528
|
+
const drained = g.order.indexOf('tmpSweeper.drainSweep');
|
|
529
|
+
expect(stopped).toBeGreaterThanOrEqual(0);
|
|
530
|
+
expect(stopped).toBeLessThan(drained);
|
|
531
|
+
expect(drained).toBeLessThan(g.order.indexOf('db.end'));
|
|
532
|
+
});
|
|
533
|
+
|
|
513
534
|
it('forgets the graph\'s secrets scope, so a descriptor that outlives it resolves nothing', async () => {
|
|
514
535
|
const g = graph();
|
|
515
536
|
registerBevelSecretsVariableLoader(
|
|
@@ -538,19 +559,31 @@ describe('stopCore', () => {
|
|
|
538
559
|
]);
|
|
539
560
|
});
|
|
540
561
|
|
|
541
|
-
it('ends the grep matcher\'s
|
|
562
|
+
it('ends the grep matcher\'s running searches, so an evicted graph leaves no ripgrep running behind it', async () => {
|
|
542
563
|
const g = graph();
|
|
543
|
-
const
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
564
|
+
const slow = await slowRipgrep();
|
|
565
|
+
const patternMatcher = new RipgrepPatternMatcher();
|
|
566
|
+
try {
|
|
567
|
+
// A tree search that would hold its ripgrep for the whole 5 s budget when the graph is stopped.
|
|
568
|
+
const search = await patternMatcher.search('needle', { ignoreCase: false });
|
|
569
|
+
// A scope's cwd is canonical: where the temp folder is a link (macOS),
|
|
570
|
+
// the raw spelling would read as a root that has moved, and walk nothing.
|
|
571
|
+
const cwd = await realpath(tmpdir());
|
|
572
|
+
const running = (async () => {
|
|
573
|
+
for await (const file of search.files({ cwd, root: '.' }, { only: ['hit.md'], maxLinesPerFile: 1 })) void file;
|
|
574
|
+
})();
|
|
575
|
+
while ((await slow.alive()).length === 0) await new Promise((r) => setTimeout(r, 20));
|
|
576
|
+
const started = Date.now();
|
|
577
|
+
await stopCore({ ...g.core, patternMatcher } as never);
|
|
578
|
+
await expect(running).rejects.toMatchObject({ status: 503, details: { code: 'search_busy' } });
|
|
579
|
+
expect(Date.now() - started).toBeLessThan(1_000);
|
|
580
|
+
expect(await slow.alive()).toEqual([]);
|
|
581
|
+
// Closed for good: nothing after the stop starts a search.
|
|
582
|
+
await expect(patternMatcher.search('b', { ignoreCase: false })).rejects.toMatchObject({ status: 503 });
|
|
583
|
+
expect(g.order.at(-1)).toBe('db.end');
|
|
584
|
+
} finally {
|
|
585
|
+
await slow.remove();
|
|
586
|
+
}
|
|
554
587
|
});
|
|
555
588
|
|
|
556
589
|
it('does not wait past the budget for a worker that never stops, and still ends the pool', async () => {
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
import type { Server as HttpServer } from 'node:http';
|
|
2
|
+
import { mkdtemp, rm, mkdir, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { tmpdir } from 'node:os';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import express from 'express';
|
|
6
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
7
|
+
import { DEFAULT_BRANCH } from '@bevel-software/platform-shared';
|
|
8
|
+
import { createSecretsVaultRoutes } from '../../modules/secrets-vault/index.js';
|
|
9
|
+
import { KbPluginSource } from '../../modules/plugins/index.js';
|
|
10
|
+
import type { WorkspaceService } from '../../modules/workspace/index.js';
|
|
11
|
+
import type { IAccessControl } from '../../modules/access/index.js';
|
|
12
|
+
// The two concrete services this suite wires, it wires the way the composition
|
|
13
|
+
// root does (`create-core-services.ts`): their modules publish them as types
|
|
14
|
+
// only, and the composition root is the one place that constructs them from
|
|
15
|
+
// their files. This suite stands in for that root — the routes of one module
|
|
16
|
+
// over the real parser of another — which is why it lives beside it.
|
|
17
|
+
import { ToolManualService } from '../../modules/tool-manuals/tool-manuals.service.js';
|
|
18
|
+
import { realDisk } from '../../__tests__/real-disk.js';
|
|
19
|
+
import { workspaceIdForBranch } from '../../shared/workspace-id.js';
|
|
20
|
+
import { testKbContext } from '../../__tests__/kb-context.js';
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* The sign-in start against REAL tool files: the routes are wired to the real
|
|
24
|
+
* `ToolManualService` over a workspace on disk, so what the start answers is
|
|
25
|
+
* what the parser makes of the file, not what a stub says it makes of it.
|
|
26
|
+
*
|
|
27
|
+
* The case this exists for (Local Testing, 2026-10-27): a declaration edited to
|
|
28
|
+
* `tokenUrl: http://127.0.0.1/token` is refused by the parser before the vault
|
|
29
|
+
* ever validates it — and the start answered "Tool or variable not found"
|
|
30
|
+
* instead of the validation's message.
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
const KB_DIR = 'knowledge-base';
|
|
34
|
+
const wsId = workspaceIdForBranch(DEFAULT_BRANCH);
|
|
35
|
+
const USER = 'owner@x.com';
|
|
36
|
+
const AUTHORIZE = 'https://auth.crm.example/authorize';
|
|
37
|
+
const TOKEN = 'https://auth.crm.example/token';
|
|
38
|
+
|
|
39
|
+
let root: string;
|
|
40
|
+
let httpServer: HttpServer | undefined;
|
|
41
|
+
|
|
42
|
+
beforeEach(async () => {
|
|
43
|
+
root = await mkdtemp(join(tmpdir(), 'signin-live-'));
|
|
44
|
+
await mkdir(join(root, wsId, KB_DIR, 'Plugins', 'GTM'), { recursive: true });
|
|
45
|
+
});
|
|
46
|
+
afterEach(async () => {
|
|
47
|
+
await new Promise<void>((r) => (httpServer ? httpServer.close(() => r()) : r()));
|
|
48
|
+
httpServer = undefined;
|
|
49
|
+
await rm(root, { recursive: true, force: true });
|
|
50
|
+
vi.restoreAllMocks();
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
const toolPath = () => join(root, wsId, KB_DIR, 'Plugins', 'crm.tool');
|
|
54
|
+
const writeTool = (oauth: Record<string, unknown>) =>
|
|
55
|
+
writeFile(
|
|
56
|
+
toolPath(),
|
|
57
|
+
JSON.stringify({
|
|
58
|
+
name: 'crm',
|
|
59
|
+
type: 'http',
|
|
60
|
+
url: 'https://api.crm.example/openapi.json',
|
|
61
|
+
variables: [{ name: 'SIGNIN', scope: 'user', oauth }],
|
|
62
|
+
}),
|
|
63
|
+
);
|
|
64
|
+
const writePlugin = (oauth: Record<string, unknown>) =>
|
|
65
|
+
Promise.all([
|
|
66
|
+
writeFile(
|
|
67
|
+
join(root, wsId, KB_DIR, 'Plugins', 'GTM', 'mcp.json'),
|
|
68
|
+
JSON.stringify({ mcpServers: { hubspot: { type: 'streamable-http', url: 'https://mcp.hubspot.example/mcp' } } }),
|
|
69
|
+
),
|
|
70
|
+
writeFile(
|
|
71
|
+
join(root, wsId, KB_DIR, 'Plugins', 'GTM', 'plugin.json'),
|
|
72
|
+
JSON.stringify({
|
|
73
|
+
name: 'gtm',
|
|
74
|
+
extensions: {
|
|
75
|
+
'software.bevel.hexis': {
|
|
76
|
+
mcpServers: {
|
|
77
|
+
hubspot: {
|
|
78
|
+
headers: { Authorization: 'Bearer ${HUBSPOT_TOKEN}' },
|
|
79
|
+
variables: [{ name: 'HUBSPOT_TOKEN', scope: 'user', oauth }],
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
}),
|
|
85
|
+
),
|
|
86
|
+
]);
|
|
87
|
+
|
|
88
|
+
async function serve() {
|
|
89
|
+
const disk = realDisk();
|
|
90
|
+
const kb = testKbContext({ kbDirName: KB_DIR });
|
|
91
|
+
const accessControl = {
|
|
92
|
+
canRead: async () => true,
|
|
93
|
+
canWrite: async () => true,
|
|
94
|
+
canReadBatch: async (_w: string, _e: string, paths: string[]) => new Map(paths.map((p) => [p, true])),
|
|
95
|
+
} as unknown as IAccessControl;
|
|
96
|
+
const workspaceService = {
|
|
97
|
+
getOrCreateForBranch: async () => ({ id: wsId }),
|
|
98
|
+
getWorkspacePath: async (id: string) => join(root, id),
|
|
99
|
+
} as unknown as WorkspaceService;
|
|
100
|
+
const toolManualService = new ToolManualService(workspaceService, accessControl, kb, disk, new KbPluginSource(disk, kb));
|
|
101
|
+
toolManualService.setMcpAuthDiscovery({ statusFor: async () => ({ status: 'open' as const }) });
|
|
102
|
+
const beginToolOAuthByKey = vi.fn(async () => ({ id: 'row-1', url: `${AUTHORIZE}?client_id=x` }));
|
|
103
|
+
const deps = {
|
|
104
|
+
secretsVault: { beginToolOAuthByKey },
|
|
105
|
+
toolManualService,
|
|
106
|
+
accessControl,
|
|
107
|
+
connectionProbe: {},
|
|
108
|
+
kb: { defaultWorkspaceId: () => wsId },
|
|
109
|
+
stateSecret: 'state-secret',
|
|
110
|
+
publicBackendUrl: 'http://localhost:3000',
|
|
111
|
+
publicFrontendUrl: 'http://localhost:5173',
|
|
112
|
+
} as unknown as Parameters<typeof createSecretsVaultRoutes>[0];
|
|
113
|
+
const app = express();
|
|
114
|
+
app.use(express.json());
|
|
115
|
+
app.use((req, _res, next) => {
|
|
116
|
+
req.userId = 'user-1';
|
|
117
|
+
req.userEmail = USER;
|
|
118
|
+
next();
|
|
119
|
+
});
|
|
120
|
+
app.use('/api', createSecretsVaultRoutes(deps));
|
|
121
|
+
httpServer = await new Promise<HttpServer>((resolve) => {
|
|
122
|
+
const s = app.listen(0, () => resolve(s));
|
|
123
|
+
});
|
|
124
|
+
const base = `http://127.0.0.1:${(httpServer.address() as { port: number }).port}/api/secrets/tools`;
|
|
125
|
+
const start = (slug: string, varName: string) => fetch(`${base}/${slug}/vars/${varName}/oauth/start`, { method: 'POST' });
|
|
126
|
+
return { toolManualService, beginToolOAuthByKey, start };
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
describe('POST …/oauth/start — through a real tool file', () => {
|
|
130
|
+
it('a client id edited in the .tool after the catalog was scanned is the one handed to the vault', async () => {
|
|
131
|
+
await writeTool({ clientId: 'client-A', authorizationUrl: AUTHORIZE, tokenUrl: TOKEN });
|
|
132
|
+
const s = await serve();
|
|
133
|
+
await s.toolManualService.listAccessible(USER); // the catalog caches client A
|
|
134
|
+
await writeTool({ clientId: 'client-B', authorizationUrl: AUTHORIZE, tokenUrl: TOKEN });
|
|
135
|
+
|
|
136
|
+
expect((await s.start('crm', 'SIGNIN')).status).toBe(200);
|
|
137
|
+
expect(s.beginToolOAuthByKey.mock.calls[0][0]).toMatchObject({
|
|
138
|
+
key: 'crm_SIGNIN',
|
|
139
|
+
provider: { clientId: 'client-B', authorizationUrl: AUTHORIZE, tokenUrl: TOKEN, pkce: true },
|
|
140
|
+
});
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
it.each([
|
|
144
|
+
['an http:// token endpoint', 'http://127.0.0.1/token', '`variables[0].oauth.tokenUrl` must use https'],
|
|
145
|
+
['a private token endpoint', 'https://10.0.0.5/token', '`variables[0].oauth.tokenUrl` host is not allowed'],
|
|
146
|
+
])('a .tool naming %s is refused with the validation message, sending nothing', async (_n, tokenUrl, message) => {
|
|
147
|
+
await writeTool({ clientId: 'client-A', authorizationUrl: AUTHORIZE, tokenUrl: TOKEN });
|
|
148
|
+
vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
149
|
+
const s = await serve();
|
|
150
|
+
await s.toolManualService.listAccessible(USER); // the catalog still holds the valid version
|
|
151
|
+
await writeTool({ clientId: 'client-A', authorizationUrl: AUTHORIZE, tokenUrl });
|
|
152
|
+
const fetchSpy = vi.spyOn(globalThis, 'fetch');
|
|
153
|
+
|
|
154
|
+
const res = await s.start('crm', 'SIGNIN');
|
|
155
|
+
expect(res.status).toBe(422);
|
|
156
|
+
expect(((await res.json()) as { error: string }).error).toBe(message);
|
|
157
|
+
expect(s.beginToolOAuthByKey).not.toHaveBeenCalled();
|
|
158
|
+
// The one fetch is the test's own call to the route: nothing went to a provider.
|
|
159
|
+
expect(fetchSpy).toHaveBeenCalledTimes(1);
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
it('a plugin.json sign-in naming an http:// token endpoint is refused with the validation message, sending nothing', async () => {
|
|
163
|
+
await writePlugin({ clientId: 'owner-app', authorizationUrl: AUTHORIZE, tokenUrl: 'http://127.0.0.1/token' });
|
|
164
|
+
vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
165
|
+
const s = await serve();
|
|
166
|
+
const fetchSpy = vi.spyOn(globalThis, 'fetch');
|
|
167
|
+
|
|
168
|
+
const res = await s.start('hubspot', 'HUBSPOT_TOKEN');
|
|
169
|
+
expect(res.status).toBe(422);
|
|
170
|
+
expect(((await res.json()) as { error: string }).error).toContain('`variables[0].oauth.tokenUrl` must use https');
|
|
171
|
+
expect(s.beginToolOAuthByKey).not.toHaveBeenCalled();
|
|
172
|
+
expect(fetchSpy).toHaveBeenCalledTimes(1);
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
it('a slug no file declares is still not found', async () => {
|
|
176
|
+
const s = await serve();
|
|
177
|
+
expect((await s.start('nothing', 'SIGNIN')).status).toBe(404);
|
|
178
|
+
});
|
|
179
|
+
});
|
|
@@ -4,6 +4,7 @@ import { logger } from '../shared/logging.js';
|
|
|
4
4
|
import type { ISkillService, SkillSummary } from '../modules/skills/skills.contract.js';
|
|
5
5
|
import type { IToolManualService } from '../modules/tool-manuals/tool-manuals.contract.js';
|
|
6
6
|
import '../modules/tool-auth/tool-auth.middleware.js'; // Express Request augmentation (req.toolAuth)
|
|
7
|
+
import { resolveConnectionScope, type IAgentScopeResolver } from '../modules/agent-scope/index.js';
|
|
7
8
|
|
|
8
9
|
const log = logger('catalog-revision');
|
|
9
10
|
|
|
@@ -65,6 +66,14 @@ export function catalogRevision(
|
|
|
65
66
|
* server already running keeps serving the view it read at startup.
|
|
66
67
|
*/
|
|
67
68
|
views: readonly { uri: string; text: string }[] = [],
|
|
69
|
+
/**
|
|
70
|
+
* The connection's agent configuration — its path and the digest of its bytes, or
|
|
71
|
+
* why it cannot be used (`ConnectionScope.fingerprint`) — so an edit of
|
|
72
|
+
* the file is a new revision even when it changes nothing listed (a new
|
|
73
|
+
* skill entry that names nothing yet still moves it). Absent for
|
|
74
|
+
* Everything, whose revision is exactly what it was before agents existed.
|
|
75
|
+
*/
|
|
76
|
+
agent: string | null = null,
|
|
68
77
|
): string {
|
|
69
78
|
const lines = [
|
|
70
79
|
...[...manuals].sort(),
|
|
@@ -72,6 +81,7 @@ export function catalogRevision(
|
|
|
72
81
|
...skills.map(skillFingerprint).sort(),
|
|
73
82
|
'\u0001',
|
|
74
83
|
...views.map((v) => `${v.uri}\u0000${createHash('sha256').update(v.text).digest('hex')}`).sort(),
|
|
84
|
+
...(agent !== null ? ['\u0001', agent] : []),
|
|
75
85
|
];
|
|
76
86
|
return createHash('sha256').update(lines.join('\n')).digest('hex').slice(0, 32);
|
|
77
87
|
}
|
|
@@ -90,6 +100,8 @@ export function createCatalogRevisionRoutes(deps: {
|
|
|
90
100
|
toolManuals: Pick<IToolManualService, 'catalogFingerprints'>;
|
|
91
101
|
skills: Pick<ISkillService, 'listSkills'>;
|
|
92
102
|
manualAuth: RequestHandler;
|
|
103
|
+
/** Resolves the scope of a connection made as an agent configuration (`modules/agent-scope`). */
|
|
104
|
+
agentScope?: Pick<IAgentScopeResolver, 'resolve'>;
|
|
93
105
|
/** Connection-key/internal-token user id → email, for the per-caller ACL. */
|
|
94
106
|
resolveUserEmail: (userId: string) => Promise<string | undefined>;
|
|
95
107
|
/** The MCP App views served; absent on a deployment that serves none. */
|
|
@@ -104,16 +116,26 @@ export function createCatalogRevisionRoutes(deps: {
|
|
|
104
116
|
// No resolvable caller is an EMPTY catalog, not a failure: that is what
|
|
105
117
|
// both list surfaces answer such a caller, so the fingerprint agrees
|
|
106
118
|
// with them rather than inventing a third verdict.
|
|
119
|
+
// A connection made as an agent configuration is fingerprinted over what IT
|
|
120
|
+
// loads, plus the file itself; Everything asks exactly what it always did.
|
|
121
|
+
const scope = await resolveConnectionScope(deps.agentScope, email, req.toolAuth?.agentPath);
|
|
122
|
+
const connectors = scope.connectorFilter();
|
|
123
|
+
const within = scope.skillFilter();
|
|
107
124
|
const [manuals, skills] = email
|
|
108
|
-
? await Promise.all([
|
|
125
|
+
? await Promise.all([
|
|
126
|
+
connectors ? deps.toolManuals.catalogFingerprints(email, connectors) : deps.toolManuals.catalogFingerprints(email),
|
|
127
|
+
within ? deps.skills.listSkills(email, { within }) : deps.skills.listSkills(email),
|
|
128
|
+
])
|
|
109
129
|
: [[], []];
|
|
110
130
|
// A manifest that cannot be read counts as no views, which is also what
|
|
111
131
|
// the MCP endpoint serves in that state.
|
|
112
132
|
const views = deps.mcpApps ? ((await deps.mcpApps.manifest().catch(() => null))?.resources ?? []) : [];
|
|
133
|
+
const connection = scope.toWire();
|
|
113
134
|
res.json({
|
|
114
|
-
revision: catalogRevision(manuals, skills, views),
|
|
135
|
+
revision: catalogRevision(manuals, skills, views, scope.fingerprint()),
|
|
115
136
|
tools: manuals.length,
|
|
116
137
|
skills: skills.length,
|
|
138
|
+
...(connection ? { connection } : {}),
|
|
117
139
|
});
|
|
118
140
|
} catch (err) {
|
|
119
141
|
log.error('catalog-revision failed:', { err });
|
package/src/core/core-ports.ts
CHANGED
|
@@ -10,7 +10,34 @@ import type { IAccountAdmission } from '../modules/auth/account-admission.js';
|
|
|
10
10
|
import type { IWriteAccess } from '../modules/write-access/write-access.js';
|
|
11
11
|
import type { OnServerStart } from '../modules/workspace/startup/on-server-start.js';
|
|
12
12
|
import type { AgentGuideHook } from '../modules/agent-guide/agent-guide.js';
|
|
13
|
+
import type { IAgentScopeResolver } from '../modules/agent-scope/index.js';
|
|
13
14
|
import type { EmbedNodeIdResolver } from '../modules/embed/embed.interface.js';
|
|
15
|
+
import type { IWorkspaceService } from '@bevel-software/platform-shared';
|
|
16
|
+
import type { IAccessControl } from '../modules/access/index.js';
|
|
17
|
+
import type { KbContext } from '../shared/kb-context.js';
|
|
18
|
+
import type { ITreeWalker } from '../shared/fs.contract.js';
|
|
19
|
+
import type { IPluginLinkIndex } from '../modules/plugins/index.js';
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* The core services a distribution's agent-scope resolver reads through,
|
|
23
|
+
* handed to `CorePorts.agentScope` when core makes it: the clones of the
|
|
24
|
+
* branches, the person's read gate, the branch model and knowledge-base
|
|
25
|
+
* layout, the disk walk that finds its configurations, and the plugin link
|
|
26
|
+
* index that says which plugins a `plugins:`-style entry stands for.
|
|
27
|
+
*
|
|
28
|
+
* Each is the service's CONTRACT, not its class: a resolver written against
|
|
29
|
+
* these runs on any implementation of them — core's own services in a
|
|
30
|
+
* deployment, a stand-in in a distribution's tests — and a resolver that
|
|
31
|
+
* needs more than a contract offers asks for the contract to grow, not for
|
|
32
|
+
* the class.
|
|
33
|
+
*/
|
|
34
|
+
export interface AgentScopeCollaborators {
|
|
35
|
+
workspaceService: IWorkspaceService;
|
|
36
|
+
accessControl: IAccessControl;
|
|
37
|
+
kb: KbContext;
|
|
38
|
+
disk: ITreeWalker;
|
|
39
|
+
pluginLinkIndex: IPluginLinkIndex;
|
|
40
|
+
}
|
|
14
41
|
|
|
15
42
|
/**
|
|
16
43
|
* Every seam the enterprise overlay can fill in the CORE composition
|
|
@@ -112,6 +139,21 @@ export interface CorePorts {
|
|
|
112
139
|
* `modules/agent-guide`.
|
|
113
140
|
*/
|
|
114
141
|
agentGuide?: AgentGuideHook;
|
|
142
|
+
/**
|
|
143
|
+
* THIS distribution's agent configurations: what "Connect as" offers beside
|
|
144
|
+
* Everything, and what a connection made as one of them loads (see
|
|
145
|
+
* `modules/agent-scope`). Core owns the mechanism and no configuration —
|
|
146
|
+
* the file kind, where it lives and what its definition says are the
|
|
147
|
+
* distribution's, as the file kinds registered for access verbs are. A
|
|
148
|
+
* factory, since a resolver reads through core services that exist only
|
|
149
|
+
* once core is built: called ONCE, during construction, with those
|
|
150
|
+
* services (`AgentScopeCollaborators`), and its answer is the one resolver
|
|
151
|
+
* every surface consults from then on — the tool contexts, which capture it
|
|
152
|
+
* at construction, as much as the routes the server mounts later. Core
|
|
153
|
+
* default: `noAgentConfigurations()` — nothing is offered, and a connection
|
|
154
|
+
* recorded as some path loads nothing, never Everything.
|
|
155
|
+
*/
|
|
156
|
+
agentScope?: (core: AgentScopeCollaborators) => IAgentScopeResolver;
|
|
115
157
|
/**
|
|
116
158
|
* Mirror this composition's branch model and knowledge-base layout onto the
|
|
117
159
|
* shared package's PROCESS-WIDE live bindings (`DEFAULT_BRANCH`,
|
|
@@ -3,6 +3,7 @@ import cors from 'cors';
|
|
|
3
3
|
import path from 'node:path';
|
|
4
4
|
import type { Router, RequestHandler } from 'express';
|
|
5
5
|
import { createAuthRoutes } from '../modules/auth/auth.routes.js';
|
|
6
|
+
import { authCookieSecure } from '../modules/auth/auth.middleware.js';
|
|
6
7
|
import { createWorkspaceRoutes } from '../modules/workspace/workspace.routes.js';
|
|
7
8
|
import {
|
|
8
9
|
createAgentUploadRoutes,
|
|
@@ -364,6 +365,9 @@ export async function createCoreServer(
|
|
|
364
365
|
core.authMiddleware,
|
|
365
366
|
core.authProviders,
|
|
366
367
|
core.config.loginPasswordEnabled,
|
|
368
|
+
// The cookie's Secure flag follows the scheme the deployment is reached
|
|
369
|
+
// on, as the SSO providers' does: one rule for every sign-in path.
|
|
370
|
+
{ cookieSecure: authCookieSecure(core.config.publicBackendUrl) },
|
|
367
371
|
),
|
|
368
372
|
);
|
|
369
373
|
|
|
@@ -383,6 +387,7 @@ export async function createCoreServer(
|
|
|
383
387
|
core.internalTokenService,
|
|
384
388
|
core.mcpOAuthProvider,
|
|
385
389
|
core.mcpResourceMetadataUrl,
|
|
390
|
+
core.agentScopeService,
|
|
386
391
|
));
|
|
387
392
|
|
|
388
393
|
// Remote sync — `POST /api/sync`, called by a git host's webhook or a
|
|
@@ -423,6 +428,7 @@ export async function createCoreServer(
|
|
|
423
428
|
toolManualService: core.toolManualService,
|
|
424
429
|
accessControl: core.accessControl,
|
|
425
430
|
connectionProbe: core.connectionProbeService,
|
|
431
|
+
agents: core.agentScopeService,
|
|
426
432
|
stateSecret: core.config.jwtSecret,
|
|
427
433
|
publicBackendUrl: core.config.publicBackendUrl,
|
|
428
434
|
publicFrontendUrl: core.config.publicFrontendUrl,
|
|
@@ -481,7 +487,7 @@ export async function createCoreServer(
|
|
|
481
487
|
// because they are the only ones that gate their whole payload on the
|
|
482
488
|
// caller's read access, so they take the access service and nothing else.
|
|
483
489
|
registerChangeRequestReadTools(core.toolRegistry, toolsRouter, ta, th, core.accessControl, core.kb);
|
|
484
|
-
const workspaceTools = registerWorkspaceTools(core.toolRegistry, toolsRouter, ta, th, core.spillStore, core.docExtractService, core.accessControl, core.kb, agentAccessGate, core.routineWritePolicy, core.sessionSink, allowedToolsChecker, core.changeGate, core.agentUploadStore, core.
|
|
490
|
+
const workspaceTools = registerWorkspaceTools(core.toolRegistry, toolsRouter, ta, th, core.spillStore, core.docExtractService, core.accessControl, core.kb, agentAccessGate, core.routineWritePolicy, core.sessionSink, allowedToolsChecker, core.changeGate, core.agentUploadStore, core.agentGuideStart, core.agentDownloadStore, core.starterPackService, core.disk, core.patternMatcher);
|
|
485
491
|
// `open_page` — the knowledge-base page shown inside a chat. Registered
|
|
486
492
|
// here, on the same router as the file tools, because it answers with
|
|
487
493
|
// `read_file`'s own read: the read hook, the access gate and the
|
|
@@ -552,6 +558,7 @@ export async function createCoreServer(
|
|
|
552
558
|
core.manualAuthMiddleware,
|
|
553
559
|
async (userId) => (await core.authService.getUserById(userId))?.email,
|
|
554
560
|
readOnlyHints,
|
|
561
|
+
core.agentScopeService,
|
|
555
562
|
));
|
|
556
563
|
toolsRouter.use(createToolHintsAgentRoutes(readOnlyHints, core.manualAuthMiddleware));
|
|
557
564
|
// The aggregated manual list (KB + the caller's accessible `.tool`s) + inline
|
|
@@ -568,6 +575,7 @@ export async function createCoreServer(
|
|
|
568
575
|
disk: core.disk,
|
|
569
576
|
pluginIndex: core.pluginIndexService,
|
|
570
577
|
},
|
|
578
|
+
core.agentScopeService,
|
|
571
579
|
));
|
|
572
580
|
// What every connected agent is told at session start, as the hosted proxy
|
|
573
581
|
// composes it: read by the local `hexis-mcp` bridge at startup and by the
|
|
@@ -582,6 +590,7 @@ export async function createCoreServer(
|
|
|
582
590
|
skills: core.skillService,
|
|
583
591
|
manualAuth: core.manualAuthMiddleware,
|
|
584
592
|
resolveUserEmail: async (userId) => (await core.authService.getUserById(userId))?.email,
|
|
593
|
+
agentScope: core.agentScopeService,
|
|
585
594
|
// The views move the revision too: a release that changes a view and no
|
|
586
595
|
// manual would otherwise leave a running local server on the old one.
|
|
587
596
|
mcpApps: core.mcpAppService,
|
|
@@ -596,6 +605,7 @@ export async function createCoreServer(
|
|
|
596
605
|
core.secretsVaultService,
|
|
597
606
|
core.manualAuthMiddleware,
|
|
598
607
|
async (userId) => (await core.authService.getUserById(userId))?.email,
|
|
608
|
+
core.agentScopeService,
|
|
599
609
|
));
|
|
600
610
|
app.use('/api', toolsRouter);
|
|
601
611
|
|
|
@@ -638,6 +648,7 @@ export async function createCoreServer(
|
|
|
638
648
|
createPluginCreationRoutes(
|
|
639
649
|
core.pluginProvisionService,
|
|
640
650
|
async (req) => (req.userId ? ((await core.authService.getUserById(req.userId)) ?? null) : null),
|
|
651
|
+
core.agentScopeService,
|
|
641
652
|
),
|
|
642
653
|
);
|
|
643
654
|
|
|
@@ -705,6 +716,7 @@ export async function createCoreServer(
|
|
|
705
716
|
core.eventBus,
|
|
706
717
|
core.db,
|
|
707
718
|
core.kb,
|
|
719
|
+
core.disk,
|
|
708
720
|
[core.config.adminEmail],
|
|
709
721
|
));
|
|
710
722
|
// Asking for Can edit or Owner on an item from its Manage access dialog, and
|
|
@@ -904,6 +916,7 @@ export async function createCoreServer(
|
|
|
904
916
|
clientNameFor: (st) => core.githubFacade.clientNameFor(st),
|
|
905
917
|
completeConsent: (userId, st) => core.githubFacade.completeConsent(userId, st),
|
|
906
918
|
},
|
|
919
|
+
agents: core.agentScopeService,
|
|
907
920
|
}));
|
|
908
921
|
|
|
909
922
|
// What an Owner pastes into Claude's admin settings to register this
|