@bevel-software/platform-core-backend 0.15.1 → 0.20.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/THIRD-PARTY-NOTICES.md +4 -4
- package/dist/core/catalog-cache-invalidation.d.ts +16 -0
- package/dist/core/catalog-cache-invalidation.d.ts.map +1 -1
- package/dist/core/catalog-cache-invalidation.js +6 -1
- package/dist/core/catalog-cache-invalidation.js.map +1 -1
- package/dist/core/catalog-revision.d.ts +39 -0
- package/dist/core/catalog-revision.d.ts.map +1 -0
- package/dist/core/catalog-revision.js +94 -0
- package/dist/core/catalog-revision.js.map +1 -0
- package/dist/core/create-core-server.d.ts +7 -0
- package/dist/core/create-core-server.d.ts.map +1 -1
- package/dist/core/create-core-server.js +221 -75
- package/dist/core/create-core-server.js.map +1 -1
- package/dist/core/create-core-services.d.ts +52 -2
- package/dist/core/create-core-services.d.ts.map +1 -1
- package/dist/core/create-core-services.js +222 -87
- package/dist/core/create-core-services.js.map +1 -1
- package/dist/core/lifecycle.d.ts +138 -0
- package/dist/core/lifecycle.d.ts.map +1 -0
- package/dist/core/lifecycle.js +218 -0
- package/dist/core/lifecycle.js.map +1 -0
- package/dist/core/public-config.d.ts +82 -0
- package/dist/core/public-config.d.ts.map +1 -0
- package/dist/core/public-config.js +78 -0
- package/dist/core/public-config.js.map +1 -0
- package/dist/core/readiness.d.ts +86 -0
- package/dist/core/readiness.d.ts.map +1 -0
- package/dist/core/readiness.js +56 -0
- package/dist/core/readiness.js.map +1 -0
- package/dist/core-config.d.ts +30 -0
- package/dist/core-config.d.ts.map +1 -1
- package/dist/core-config.js +64 -2
- package/dist/core-config.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/modules/access/access-control.interface.d.ts +215 -11
- package/dist/modules/access/access-control.interface.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.d.ts +57 -11
- package/dist/modules/access/access-control.service.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.js +616 -155
- package/dist/modules/access/access-control.service.js.map +1 -1
- package/dist/modules/access/access-mutation.service.d.ts +71 -5
- package/dist/modules/access/access-mutation.service.d.ts.map +1 -1
- package/dist/modules/access/access-mutation.service.js +161 -13
- package/dist/modules/access/access-mutation.service.js.map +1 -1
- package/dist/modules/access/access-view.d.ts +147 -0
- package/dist/modules/access/access-view.d.ts.map +1 -0
- package/dist/modules/access/access-view.js +211 -0
- package/dist/modules/access/access-view.js.map +1 -0
- package/dist/modules/access/access.routes.d.ts.map +1 -1
- package/dist/modules/access/access.routes.js +255 -79
- package/dist/modules/access/access.routes.js.map +1 -1
- package/dist/modules/access/admin-locked-commit.d.ts +2 -3
- package/dist/modules/access/admin-locked-commit.d.ts.map +1 -1
- package/dist/modules/access/admin-locked-commit.js +9 -8
- package/dist/modules/access/admin-locked-commit.js.map +1 -1
- package/dist/modules/access/admin-route-helpers.d.ts.map +1 -1
- package/dist/modules/access/admin-route-helpers.js +4 -4
- package/dist/modules/access/admin-route-helpers.js.map +1 -1
- package/dist/modules/access/change-read-gate.d.ts +53 -0
- package/dist/modules/access/change-read-gate.d.ts.map +1 -0
- package/dist/modules/access/change-read-gate.js +134 -0
- package/dist/modules/access/change-read-gate.js.map +1 -0
- package/dist/modules/access/creator-access.d.ts +33 -39
- package/dist/modules/access/creator-access.d.ts.map +1 -1
- package/dist/modules/access/creator-access.js +92 -119
- package/dist/modules/access/creator-access.js.map +1 -1
- package/dist/modules/access/directory-sync-bot.d.ts.map +1 -1
- package/dist/modules/access/directory-sync-bot.js +3 -1
- package/dist/modules/access/directory-sync-bot.js.map +1 -1
- package/dist/modules/access/groups-admin.service.d.ts +3 -3
- package/dist/modules/access/groups-admin.service.js +2 -2
- package/dist/modules/access/reference-scan.d.ts +1 -1
- package/dist/modules/access/reference-scan.d.ts.map +1 -1
- package/dist/modules/access/reference-scan.js +5 -4
- package/dist/modules/access/reference-scan.js.map +1 -1
- package/dist/modules/access/roles-admin.service.d.ts +72 -13
- package/dist/modules/access/roles-admin.service.d.ts.map +1 -1
- package/dist/modules/access/roles-admin.service.js +71 -13
- package/dist/modules/access/roles-admin.service.js.map +1 -1
- package/dist/modules/access/synced-groups-committer.d.ts.map +1 -1
- package/dist/modules/access/synced-groups-committer.js +8 -6
- package/dist/modules/access/synced-groups-committer.js.map +1 -1
- package/dist/modules/access/synced-groups-writer.d.ts.map +1 -1
- package/dist/modules/access/synced-groups-writer.js +3 -8
- package/dist/modules/access/synced-groups-writer.js.map +1 -1
- package/dist/modules/access/user-access-removal.service.d.ts +209 -0
- package/dist/modules/access/user-access-removal.service.d.ts.map +1 -0
- package/dist/modules/access/user-access-removal.service.js +662 -0
- package/dist/modules/access/user-access-removal.service.js.map +1 -0
- package/dist/modules/access-model/access-errors.d.ts +32 -1
- package/dist/modules/access-model/access-errors.d.ts.map +1 -1
- package/dist/modules/access-model/access-errors.js +38 -11
- package/dist/modules/access-model/access-errors.js.map +1 -1
- package/dist/modules/access-model/access-grammar.d.ts +49 -24
- package/dist/modules/access-model/access-grammar.d.ts.map +1 -1
- package/dist/modules/access-model/access-grammar.js +68 -48
- package/dist/modules/access-model/access-grammar.js.map +1 -1
- package/dist/modules/access-model/access-splice.d.ts.map +1 -1
- package/dist/modules/access-model/access-splice.js +18 -18
- package/dist/modules/access-model/access-splice.js.map +1 -1
- package/dist/modules/access-model/access-template.d.ts +22 -0
- package/dist/modules/access-model/access-template.d.ts.map +1 -0
- package/dist/modules/access-model/access-template.js +42 -0
- package/dist/modules/access-model/access-template.js.map +1 -0
- package/dist/modules/access-model/change-gate.d.ts +65 -0
- package/dist/modules/access-model/change-gate.d.ts.map +1 -0
- package/dist/modules/access-model/change-gate.js +25 -0
- package/dist/modules/access-model/change-gate.js.map +1 -0
- package/dist/modules/access-model/creator.d.ts +13 -16
- package/dist/modules/access-model/creator.d.ts.map +1 -1
- package/dist/modules/access-model/creator.js.map +1 -1
- package/dist/modules/access-model/frontmatter-lines.d.ts +27 -0
- package/dist/modules/access-model/frontmatter-lines.d.ts.map +1 -0
- package/dist/modules/access-model/frontmatter-lines.js +74 -0
- package/dist/modules/access-model/frontmatter-lines.js.map +1 -0
- package/dist/modules/access-model/plugin-principals.d.ts +5 -3
- package/dist/modules/access-model/plugin-principals.d.ts.map +1 -1
- package/dist/modules/access-model/plugin-principals.js +11 -17
- package/dist/modules/access-model/plugin-principals.js.map +1 -1
- package/dist/modules/access-model/roles-yaml-guard.d.ts +73 -2
- package/dist/modules/access-model/roles-yaml-guard.d.ts.map +1 -1
- package/dist/modules/access-model/roles-yaml-guard.js +153 -3
- package/dist/modules/access-model/roles-yaml-guard.js.map +1 -1
- package/dist/modules/admin/admin-access.service.d.ts.map +1 -1
- package/dist/modules/admin/admin-access.service.js +5 -2
- package/dist/modules/admin/admin-access.service.js.map +1 -1
- package/dist/modules/agent-instructions/agent-instructions.routes.d.ts +21 -0
- package/dist/modules/agent-instructions/agent-instructions.routes.d.ts.map +1 -0
- package/dist/modules/agent-instructions/agent-instructions.routes.js +38 -0
- package/dist/modules/agent-instructions/agent-instructions.routes.js.map +1 -0
- package/dist/modules/agent-instructions/compose.d.ts +71 -0
- package/dist/modules/agent-instructions/compose.d.ts.map +1 -0
- package/dist/modules/agent-instructions/compose.js +234 -0
- package/dist/modules/agent-instructions/compose.js.map +1 -0
- package/dist/modules/agent-instructions/index.d.ts +4 -0
- package/dist/modules/agent-instructions/index.d.ts.map +1 -0
- package/dist/modules/agent-instructions/index.js +4 -0
- package/dist/modules/agent-instructions/index.js.map +1 -0
- package/dist/modules/agent-instructions/read-preamble.d.ts +37 -0
- package/dist/modules/agent-instructions/read-preamble.d.ts.map +1 -0
- package/dist/modules/agent-instructions/read-preamble.js +81 -0
- package/dist/modules/agent-instructions/read-preamble.js.map +1 -0
- package/dist/modules/audit/agent-audit.service.d.ts +54 -0
- package/dist/modules/audit/agent-audit.service.d.ts.map +1 -0
- package/dist/modules/audit/agent-audit.service.js +290 -0
- package/dist/modules/audit/agent-audit.service.js.map +1 -0
- package/dist/modules/audit/agent-rest-audit.middleware.d.ts +40 -0
- package/dist/modules/audit/agent-rest-audit.middleware.d.ts.map +1 -0
- package/dist/modules/audit/agent-rest-audit.middleware.js +75 -0
- package/dist/modules/audit/agent-rest-audit.middleware.js.map +1 -0
- package/dist/modules/audit/audit.contract.d.ts +145 -0
- package/dist/modules/audit/audit.contract.d.ts.map +1 -0
- package/dist/modules/audit/audit.contract.js +35 -0
- package/dist/modules/audit/audit.contract.js.map +1 -0
- package/dist/modules/audit/audit.routes.d.ts +21 -0
- package/dist/modules/audit/audit.routes.d.ts.map +1 -0
- package/dist/modules/audit/audit.routes.js +157 -0
- package/dist/modules/audit/audit.routes.js.map +1 -0
- package/dist/modules/audit/event-classifier.d.ts +52 -0
- package/dist/modules/audit/event-classifier.d.ts.map +1 -0
- package/dist/modules/audit/event-classifier.js +123 -0
- package/dist/modules/audit/event-classifier.js.map +1 -0
- package/dist/modules/audit/index.d.ts +7 -0
- package/dist/modules/audit/index.d.ts.map +1 -0
- package/dist/modules/audit/index.js +7 -0
- package/dist/modules/audit/index.js.map +1 -0
- package/dist/modules/audit/request-audit.d.ts +57 -0
- package/dist/modules/audit/request-audit.d.ts.map +1 -0
- package/dist/modules/audit/request-audit.js +117 -0
- package/dist/modules/audit/request-audit.js.map +1 -0
- package/dist/modules/auth/account-erasure.service.d.ts +30 -4
- package/dist/modules/auth/account-erasure.service.d.ts.map +1 -1
- package/dist/modules/auth/account-erasure.service.js +96 -10
- package/dist/modules/auth/account-erasure.service.js.map +1 -1
- package/dist/modules/auth/account.routes.d.ts +6 -3
- package/dist/modules/auth/account.routes.d.ts.map +1 -1
- package/dist/modules/auth/account.routes.js +109 -10
- package/dist/modules/auth/account.routes.js.map +1 -1
- package/dist/modules/auth/auth.routes.d.ts +10 -3
- package/dist/modules/auth/auth.routes.d.ts.map +1 -1
- package/dist/modules/auth/auth.routes.js +9 -4
- package/dist/modules/auth/auth.routes.js.map +1 -1
- package/dist/modules/auth/auth.service.d.ts +89 -5
- package/dist/modules/auth/auth.service.d.ts.map +1 -1
- package/dist/modules/auth/auth.service.js +160 -25
- package/dist/modules/auth/auth.service.js.map +1 -1
- package/dist/modules/auth/oidc-auth-provider.d.ts +46 -3
- package/dist/modules/auth/oidc-auth-provider.d.ts.map +1 -1
- package/dist/modules/auth/oidc-auth-provider.js +99 -21
- package/dist/modules/auth/oidc-auth-provider.js.map +1 -1
- package/dist/modules/code-mode/code-mode.tool.d.ts.map +1 -1
- package/dist/modules/code-mode/code-mode.tool.js +14 -2
- package/dist/modules/code-mode/code-mode.tool.js.map +1 -1
- package/dist/modules/connection-probe/connection-probe.service.d.ts.map +1 -1
- package/dist/modules/connection-probe/connection-probe.service.js +56 -7
- package/dist/modules/connection-probe/connection-probe.service.js.map +1 -1
- package/dist/modules/database/advisory-lock.d.ts +103 -0
- package/dist/modules/database/advisory-lock.d.ts.map +1 -0
- package/dist/modules/database/advisory-lock.js +320 -0
- package/dist/modules/database/advisory-lock.js.map +1 -0
- package/dist/modules/database/connection.d.ts.map +1 -1
- package/dist/modules/database/connection.js +9 -1
- package/dist/modules/database/connection.js.map +1 -1
- package/dist/modules/database/core-schema.d.ts +859 -99
- package/dist/modules/database/core-schema.d.ts.map +1 -1
- package/dist/modules/database/core-schema.js +218 -0
- package/dist/modules/database/core-schema.js.map +1 -1
- package/dist/modules/database/migrate.d.ts.map +1 -1
- package/dist/modules/database/migrate.js +26 -6
- package/dist/modules/database/migrate.js.map +1 -1
- package/dist/modules/declared-variables/declared-variables.routes.d.ts.map +1 -1
- package/dist/modules/declared-variables/declared-variables.routes.js +4 -2
- package/dist/modules/declared-variables/declared-variables.routes.js.map +1 -1
- package/dist/modules/diff/diff.routes.d.ts.map +1 -1
- package/dist/modules/diff/diff.routes.js +2 -4
- package/dist/modules/diff/diff.routes.js.map +1 -1
- package/dist/modules/diff/diff.service.d.ts +4 -1
- package/dist/modules/diff/diff.service.d.ts.map +1 -1
- package/dist/modules/diff/diff.service.js +84 -81
- package/dist/modules/diff/diff.service.js.map +1 -1
- package/dist/modules/{workspace → kb-fs}/bevel-ignore.d.ts +14 -9
- package/dist/modules/kb-fs/bevel-ignore.d.ts.map +1 -0
- package/dist/modules/{workspace → kb-fs}/bevel-ignore.js +24 -14
- package/dist/modules/kb-fs/bevel-ignore.js.map +1 -0
- package/dist/modules/kb-fs/file-change-notifier.d.ts.map +1 -1
- package/dist/modules/kb-fs/file-change-notifier.js +3 -1
- package/dist/modules/kb-fs/file-change-notifier.js.map +1 -1
- package/dist/modules/kb-fs/git-guarded-filesystem.d.ts +45 -0
- package/dist/modules/kb-fs/git-guarded-filesystem.d.ts.map +1 -0
- package/dist/modules/kb-fs/git-guarded-filesystem.js +117 -0
- package/dist/modules/kb-fs/git-guarded-filesystem.js.map +1 -0
- package/dist/modules/kb-fs/locking-filesystem.d.ts +113 -18
- package/dist/modules/kb-fs/locking-filesystem.d.ts.map +1 -1
- package/dist/modules/kb-fs/locking-filesystem.js +353 -76
- package/dist/modules/kb-fs/locking-filesystem.js.map +1 -1
- package/dist/modules/kb-fs/node-fs.d.ts +23 -0
- package/dist/modules/kb-fs/node-fs.d.ts.map +1 -0
- package/dist/modules/kb-fs/node-fs.js +158 -0
- package/dist/modules/kb-fs/node-fs.js.map +1 -0
- package/dist/modules/kb-fs/read-only-filesystem.d.ts +10 -9
- package/dist/modules/kb-fs/read-only-filesystem.d.ts.map +1 -1
- package/dist/modules/kb-fs/read-only-filesystem.js +18 -9
- package/dist/modules/kb-fs/read-only-filesystem.js.map +1 -1
- package/dist/modules/kb-fs/repo-path.d.ts +100 -3
- package/dist/modules/kb-fs/repo-path.d.ts.map +1 -1
- package/dist/modules/kb-fs/repo-path.js +195 -3
- package/dist/modules/kb-fs/repo-path.js.map +1 -1
- package/dist/modules/kb-sync/kb-sync.routes.d.ts.map +1 -1
- package/dist/modules/kb-sync/kb-sync.routes.js +4 -2
- package/dist/modules/kb-sync/kb-sync.routes.js.map +1 -1
- package/dist/modules/kb-sync/kb-sync.service.d.ts.map +1 -1
- package/dist/modules/kb-sync/kb-sync.service.js +7 -5
- package/dist/modules/kb-sync/kb-sync.service.js.map +1 -1
- package/dist/modules/marketplace/git-http.routes.d.ts.map +1 -1
- package/dist/modules/marketplace/git-http.routes.js +6 -4
- package/dist/modules/marketplace/git-http.routes.js.map +1 -1
- package/dist/modules/marketplace/github-facade/github-facade-admin.routes.d.ts +12 -2
- package/dist/modules/marketplace/github-facade/github-facade-admin.routes.d.ts.map +1 -1
- package/dist/modules/marketplace/github-facade/github-facade-admin.routes.js +32 -3
- package/dist/modules/marketplace/github-facade/github-facade-admin.routes.js.map +1 -1
- package/dist/modules/marketplace/github-facade/github-facade-credentials.service.d.ts +27 -0
- package/dist/modules/marketplace/github-facade/github-facade-credentials.service.d.ts.map +1 -1
- package/dist/modules/marketplace/github-facade/github-facade-credentials.service.js +45 -0
- package/dist/modules/marketplace/github-facade/github-facade-credentials.service.js.map +1 -1
- package/dist/modules/marketplace/github-facade/github-facade.routes.d.ts.map +1 -1
- package/dist/modules/marketplace/github-facade/github-facade.routes.js +30 -6
- package/dist/modules/marketplace/github-facade/github-facade.routes.js.map +1 -1
- package/dist/modules/marketplace/github-facade/github-facade.service.d.ts +21 -9
- package/dist/modules/marketplace/github-facade/github-facade.service.d.ts.map +1 -1
- package/dist/modules/marketplace/github-facade/github-facade.service.js +60 -19
- package/dist/modules/marketplace/github-facade/github-facade.service.js.map +1 -1
- package/dist/modules/marketplace/github-facade/index.d.ts +1 -1
- package/dist/modules/marketplace/github-facade/index.d.ts.map +1 -1
- package/dist/modules/marketplace/github-facade/index.js +1 -1
- package/dist/modules/marketplace/github-facade/index.js.map +1 -1
- package/dist/modules/marketplace/marketplace-repo.service.d.ts +14 -1
- package/dist/modules/marketplace/marketplace-repo.service.d.ts.map +1 -1
- package/dist/modules/marketplace/marketplace-repo.service.js +26 -8
- package/dist/modules/marketplace/marketplace-repo.service.js.map +1 -1
- package/dist/modules/mcp/downstream-pool.d.ts +107 -0
- package/dist/modules/mcp/downstream-pool.d.ts.map +1 -0
- package/dist/modules/mcp/downstream-pool.js +221 -0
- package/dist/modules/mcp/downstream-pool.js.map +1 -0
- package/dist/modules/mcp/downstream-token-refresh.d.ts +77 -0
- package/dist/modules/mcp/downstream-token-refresh.d.ts.map +1 -0
- package/dist/modules/mcp/downstream-token-refresh.js +166 -0
- package/dist/modules/mcp/downstream-token-refresh.js.map +1 -0
- package/dist/modules/mcp/first-call-probe.cli-args.d.ts +78 -0
- package/dist/modules/mcp/first-call-probe.cli-args.d.ts.map +1 -0
- package/dist/modules/mcp/first-call-probe.cli-args.js +151 -0
- package/dist/modules/mcp/first-call-probe.cli-args.js.map +1 -0
- package/dist/modules/mcp/first-call-probe.cli.d.ts +2 -0
- package/dist/modules/mcp/first-call-probe.cli.d.ts.map +1 -0
- package/dist/modules/mcp/first-call-probe.cli.js +62 -0
- package/dist/modules/mcp/first-call-probe.cli.js.map +1 -0
- package/dist/modules/mcp/first-call-probe.d.ts +165 -0
- package/dist/modules/mcp/first-call-probe.d.ts.map +1 -0
- package/dist/modules/mcp/first-call-probe.js +298 -0
- package/dist/modules/mcp/first-call-probe.js.map +1 -0
- package/dist/modules/mcp/manual-failure-memo.d.ts +42 -17
- package/dist/modules/mcp/manual-failure-memo.d.ts.map +1 -1
- package/dist/modules/mcp/manual-failure-memo.js +79 -23
- package/dist/modules/mcp/manual-failure-memo.js.map +1 -1
- package/dist/modules/mcp/mcp-auth.middleware.d.ts +10 -5
- package/dist/modules/mcp/mcp-auth.middleware.d.ts.map +1 -1
- package/dist/modules/mcp/mcp-auth.middleware.js +56 -16
- package/dist/modules/mcp/mcp-auth.middleware.js.map +1 -1
- package/dist/modules/mcp/mcp.routes.d.ts +4 -4
- package/dist/modules/mcp/mcp.routes.d.ts.map +1 -1
- package/dist/modules/mcp/mcp.routes.js +91 -180
- package/dist/modules/mcp/mcp.routes.js.map +1 -1
- package/dist/modules/mcp/mcp.service.d.ts +226 -61
- package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
- package/dist/modules/mcp/mcp.service.js +758 -161
- package/dist/modules/mcp/mcp.service.js.map +1 -1
- package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts +59 -0
- package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts.map +1 -1
- package/dist/modules/mcp/oauth/bevel-oauth-provider.js +184 -10
- package/dist/modules/mcp/oauth/bevel-oauth-provider.js.map +1 -1
- package/dist/modules/mcp/oauth/oauth-consent.routes.d.ts.map +1 -1
- package/dist/modules/mcp/oauth/oauth-consent.routes.js +3 -1
- package/dist/modules/mcp/oauth/oauth-consent.routes.js.map +1 -1
- package/dist/modules/mcp/surface-log-throttle.d.ts +59 -0
- package/dist/modules/mcp/surface-log-throttle.d.ts.map +1 -0
- package/dist/modules/mcp/surface-log-throttle.js +94 -0
- package/dist/modules/mcp/surface-log-throttle.js.map +1 -0
- package/dist/modules/plugins/compile/compile-marketplace.d.ts +13 -6
- package/dist/modules/plugins/compile/compile-marketplace.d.ts.map +1 -1
- package/dist/modules/plugins/compile/compile-marketplace.js +119 -36
- package/dist/modules/plugins/compile/compile-marketplace.js.map +1 -1
- package/dist/modules/plugins/compile/marketplace-compiler.service.d.ts +8 -1
- package/dist/modules/plugins/compile/marketplace-compiler.service.d.ts.map +1 -1
- package/dist/modules/plugins/compile/marketplace-compiler.service.js +9 -6
- package/dist/modules/plugins/compile/marketplace-compiler.service.js.map +1 -1
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.d.ts.map +1 -1
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.js +32 -9
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.js.map +1 -1
- package/dist/modules/plugins/discovery/bundle-dialect/registry.d.ts +26 -6
- package/dist/modules/plugins/discovery/bundle-dialect/registry.d.ts.map +1 -1
- package/dist/modules/plugins/discovery/bundle-dialect/registry.js +71 -14
- package/dist/modules/plugins/discovery/bundle-dialect/registry.js.map +1 -1
- package/dist/modules/plugins/discovery/kb-plugin-source.d.ts +4 -2
- package/dist/modules/plugins/discovery/kb-plugin-source.d.ts.map +1 -1
- package/dist/modules/plugins/discovery/kb-plugin-source.js +9 -6
- package/dist/modules/plugins/discovery/kb-plugin-source.js.map +1 -1
- package/dist/modules/plugins/discovery/native.source.d.ts +2 -1
- package/dist/modules/plugins/discovery/native.source.d.ts.map +1 -1
- package/dist/modules/plugins/discovery/native.source.js +22 -4
- package/dist/modules/plugins/discovery/native.source.js.map +1 -1
- package/dist/modules/plugins/discovery/plugin-source.d.ts +17 -3
- package/dist/modules/plugins/discovery/plugin-source.d.ts.map +1 -1
- package/dist/modules/plugins/index.d.ts +6 -3
- package/dist/modules/plugins/index.d.ts.map +1 -1
- package/dist/modules/plugins/index.js +6 -3
- package/dist/modules/plugins/index.js.map +1 -1
- package/dist/modules/plugins/join-request-jobs.service.d.ts +250 -0
- package/dist/modules/plugins/join-request-jobs.service.d.ts.map +1 -0
- package/dist/modules/plugins/join-request-jobs.service.js +602 -0
- package/dist/modules/plugins/join-request-jobs.service.js.map +1 -0
- package/dist/modules/plugins/join-request-records.store.d.ts +161 -0
- package/dist/modules/plugins/join-request-records.store.d.ts.map +1 -0
- package/dist/modules/plugins/join-request-records.store.js +179 -0
- package/dist/modules/plugins/join-request-records.store.js.map +1 -0
- package/dist/modules/plugins/join-requests.service.d.ts.map +1 -1
- package/dist/modules/plugins/join-requests.service.js +4 -2
- package/dist/modules/plugins/join-requests.service.js.map +1 -1
- package/dist/modules/plugins/plugin-links.d.ts +4 -1
- package/dist/modules/plugins/plugin-links.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-links.js +6 -3
- package/dist/modules/plugins/plugin-links.js.map +1 -1
- package/dist/modules/plugins/plugin-links.service.d.ts +2 -5
- package/dist/modules/plugins/plugin-links.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-links.service.js +4 -13
- package/dist/modules/plugins/plugin-links.service.js.map +1 -1
- package/dist/modules/plugins/plugin-provision.service.d.ts +91 -19
- package/dist/modules/plugins/plugin-provision.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-provision.service.js +183 -38
- package/dist/modules/plugins/plugin-provision.service.js.map +1 -1
- package/dist/modules/plugins/plugin-rename.service.d.ts +3 -1
- package/dist/modules/plugins/plugin-rename.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-rename.service.js +20 -11
- package/dist/modules/plugins/plugin-rename.service.js.map +1 -1
- package/dist/modules/plugins/plugins.contract.d.ts +52 -4
- package/dist/modules/plugins/plugins.contract.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.routes.d.ts +38 -5
- package/dist/modules/plugins/plugins.routes.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.routes.js +190 -116
- package/dist/modules/plugins/plugins.routes.js.map +1 -1
- package/dist/modules/plugins/plugins.service.d.ts +38 -6
- package/dist/modules/plugins/plugins.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.service.js +86 -17
- package/dist/modules/plugins/plugins.service.js.map +1 -1
- package/dist/modules/plugins/plugins.tools.d.ts +25 -0
- package/dist/modules/plugins/plugins.tools.d.ts.map +1 -0
- package/dist/modules/plugins/plugins.tools.js +82 -0
- package/dist/modules/plugins/plugins.tools.js.map +1 -0
- package/dist/modules/plugins/teams.routes.d.ts +42 -0
- package/dist/modules/plugins/teams.routes.d.ts.map +1 -0
- package/dist/modules/plugins/teams.routes.js +79 -0
- package/dist/modules/plugins/teams.routes.js.map +1 -0
- package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts +40 -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 +202 -37
- 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.map +1 -1
- package/dist/modules/secrets-vault/mcp-oauth-discovery.service.d.ts.map +1 -1
- package/dist/modules/secrets-vault/mcp-oauth-discovery.service.js +5 -3
- package/dist/modules/secrets-vault/mcp-oauth-discovery.service.js.map +1 -1
- package/dist/modules/secrets-vault/secrets-variable-loader.d.ts.map +1 -1
- package/dist/modules/secrets-vault/secrets-variable-loader.js +3 -1
- package/dist/modules/secrets-vault/secrets-variable-loader.js.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.contract.d.ts +78 -0
- package/dist/modules/secrets-vault/secrets-vault.contract.d.ts.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.contract.js +40 -0
- package/dist/modules/secrets-vault/secrets-vault.contract.js.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.routes.d.ts.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.routes.js +106 -52
- package/dist/modules/secrets-vault/secrets-vault.routes.js.map +1 -1
- package/dist/modules/settings/connection-check.d.ts +118 -0
- package/dist/modules/settings/connection-check.d.ts.map +1 -0
- package/dist/modules/settings/connection-check.js +287 -0
- package/dist/modules/settings/connection-check.js.map +1 -0
- package/dist/modules/settings/deployment-settings.service.d.ts +162 -8
- package/dist/modules/settings/deployment-settings.service.d.ts.map +1 -1
- package/dist/modules/settings/deployment-settings.service.js +375 -52
- package/dist/modules/settings/deployment-settings.service.js.map +1 -1
- package/dist/modules/settings/git-root-folders.d.ts +54 -0
- package/dist/modules/settings/git-root-folders.d.ts.map +1 -0
- package/dist/modules/settings/git-root-folders.js +130 -0
- package/dist/modules/settings/git-root-folders.js.map +1 -0
- package/dist/modules/settings/oidc-check.d.ts +85 -0
- package/dist/modules/settings/oidc-check.d.ts.map +1 -0
- package/dist/modules/settings/oidc-check.js +172 -0
- package/dist/modules/settings/oidc-check.js.map +1 -0
- package/dist/modules/settings/setup.routes.d.ts +31 -1
- package/dist/modules/settings/setup.routes.d.ts.map +1 -1
- package/dist/modules/settings/setup.routes.js +400 -108
- package/dist/modules/settings/setup.routes.js.map +1 -1
- package/dist/modules/skills/allowed-tools-check.d.ts +132 -0
- package/dist/modules/skills/allowed-tools-check.d.ts.map +1 -0
- package/dist/modules/skills/allowed-tools-check.js +260 -0
- package/dist/modules/skills/allowed-tools-check.js.map +1 -0
- package/dist/modules/skills/index.d.ts +3 -1
- package/dist/modules/skills/index.d.ts.map +1 -1
- package/dist/modules/skills/index.js +1 -0
- package/dist/modules/skills/index.js.map +1 -1
- package/dist/modules/skills/pending-skills.service.d.ts +6 -11
- package/dist/modules/skills/pending-skills.service.d.ts.map +1 -1
- package/dist/modules/skills/pending-skills.service.js +18 -70
- package/dist/modules/skills/pending-skills.service.js.map +1 -1
- package/dist/modules/skills/skill-access-requests.routes.d.ts.map +1 -1
- package/dist/modules/skills/skill-access-requests.routes.js +9 -6
- package/dist/modules/skills/skill-access-requests.routes.js.map +1 -1
- package/dist/modules/skills/skills.contract.d.ts +44 -10
- package/dist/modules/skills/skills.contract.d.ts.map +1 -1
- package/dist/modules/skills/skills.routes.d.ts +8 -1
- package/dist/modules/skills/skills.routes.d.ts.map +1 -1
- package/dist/modules/skills/skills.routes.js +16 -2
- package/dist/modules/skills/skills.routes.js.map +1 -1
- package/dist/modules/skills/skills.service.d.ts +31 -7
- package/dist/modules/skills/skills.service.d.ts.map +1 -1
- package/dist/modules/skills/skills.service.js +191 -81
- package/dist/modules/skills/skills.service.js.map +1 -1
- package/dist/modules/skills/skills.tools.d.ts +4 -1
- package/dist/modules/skills/skills.tools.d.ts.map +1 -1
- package/dist/modules/skills/skills.tools.js +41 -6
- package/dist/modules/skills/skills.tools.js.map +1 -1
- package/dist/modules/tool-auth/connection-key-rejection.d.ts +18 -0
- package/dist/modules/tool-auth/connection-key-rejection.d.ts.map +1 -0
- package/dist/modules/tool-auth/connection-key-rejection.js +20 -0
- package/dist/modules/tool-auth/connection-key-rejection.js.map +1 -0
- package/dist/modules/tool-auth/connection-keys-admin.routes.d.ts +14 -0
- package/dist/modules/tool-auth/connection-keys-admin.routes.d.ts.map +1 -0
- package/dist/modules/tool-auth/connection-keys-admin.routes.js +67 -0
- package/dist/modules/tool-auth/connection-keys-admin.routes.js.map +1 -0
- package/dist/modules/tool-auth/external-api-key.interface.d.ts +72 -8
- 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 +17 -6
- package/dist/modules/tool-auth/external-api-key.service.d.ts.map +1 -1
- package/dist/modules/tool-auth/external-api-key.service.js +83 -27
- package/dist/modules/tool-auth/external-api-key.service.js.map +1 -1
- package/dist/modules/tool-auth/internal-token.service.d.ts +15 -2
- package/dist/modules/tool-auth/internal-token.service.d.ts.map +1 -1
- package/dist/modules/tool-auth/internal-token.service.js +6 -2
- package/dist/modules/tool-auth/internal-token.service.js.map +1 -1
- package/dist/modules/tool-auth/key-or-session.middleware.d.ts +23 -0
- package/dist/modules/tool-auth/key-or-session.middleware.d.ts.map +1 -0
- package/dist/modules/tool-auth/key-or-session.middleware.js +39 -0
- package/dist/modules/tool-auth/key-or-session.middleware.js.map +1 -0
- package/dist/modules/tool-auth/tool-auth.middleware.d.ts +15 -1
- package/dist/modules/tool-auth/tool-auth.middleware.d.ts.map +1 -1
- package/dist/modules/tool-auth/tool-auth.middleware.js +17 -6
- package/dist/modules/tool-auth/tool-auth.middleware.js.map +1 -1
- package/dist/modules/tool-helpers/tool-context.d.ts +14 -0
- package/dist/modules/tool-helpers/tool-context.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool-context.js +28 -6
- package/dist/modules/tool-helpers/tool-context.js.map +1 -1
- package/dist/modules/tool-helpers/tool-handler.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool-handler.js +22 -5
- package/dist/modules/tool-helpers/tool-handler.js.map +1 -1
- package/dist/modules/tool-helpers/tool.contract.d.ts +6 -1
- package/dist/modules/tool-helpers/tool.contract.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool.contract.js +7 -1
- package/dist/modules/tool-helpers/tool.contract.js.map +1 -1
- package/dist/modules/tool-manuals/index.d.ts +2 -1
- package/dist/modules/tool-manuals/index.d.ts.map +1 -1
- package/dist/modules/tool-manuals/index.js +1 -0
- package/dist/modules/tool-manuals/index.js.map +1 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.d.ts.map +1 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.js +8 -6
- package/dist/modules/tool-manuals/mcp-json-discovery.js.map +1 -1
- package/dist/modules/tool-manuals/mcp-server-edit.service.d.ts +10 -2
- package/dist/modules/tool-manuals/mcp-server-edit.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/mcp-server-edit.service.js +12 -15
- package/dist/modules/tool-manuals/mcp-server-edit.service.js.map +1 -1
- package/dist/modules/tool-manuals/pending-tools.service.d.ts +50 -0
- package/dist/modules/tool-manuals/pending-tools.service.d.ts.map +1 -0
- package/dist/modules/tool-manuals/pending-tools.service.js +149 -0
- package/dist/modules/tool-manuals/pending-tools.service.js.map +1 -0
- package/dist/modules/tool-manuals/tool-delete.service.d.ts +135 -0
- package/dist/modules/tool-manuals/tool-delete.service.d.ts.map +1 -0
- package/dist/modules/tool-manuals/tool-delete.service.js +303 -0
- package/dist/modules/tool-manuals/tool-delete.service.js.map +1 -0
- package/dist/modules/tool-manuals/tool-manuals.contract.d.ts +161 -0
- package/dist/modules/tool-manuals/tool-manuals.contract.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.contract.js +9 -0
- package/dist/modules/tool-manuals/tool-manuals.contract.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.routes.d.ts +19 -2
- package/dist/modules/tool-manuals/tool-manuals.routes.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.routes.js +127 -57
- package/dist/modules/tool-manuals/tool-manuals.routes.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts +119 -5
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.js +404 -74
- package/dist/modules/tool-manuals/tool-manuals.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.js +78 -6
- package/dist/modules/tool-manuals/tool-manuals.tools.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 +88 -54
- package/dist/modules/workflow/agent-tools/workflow.tools.js.map +1 -1
- package/dist/modules/workflow/event-bus.d.ts +10 -4
- package/dist/modules/workflow/event-bus.d.ts.map +1 -1
- package/dist/modules/workflow/event-bus.js +14 -11
- package/dist/modules/workflow/event-bus.js.map +1 -1
- package/dist/modules/workflow/events.routes.d.ts +17 -2
- package/dist/modules/workflow/events.routes.d.ts.map +1 -1
- package/dist/modules/workflow/events.routes.js +31 -12
- package/dist/modules/workflow/events.routes.js.map +1 -1
- package/dist/modules/workflow/file-lock.service.d.ts +22 -4
- package/dist/modules/workflow/file-lock.service.d.ts.map +1 -1
- package/dist/modules/workflow/file-lock.service.js +27 -4
- package/dist/modules/workflow/file-lock.service.js.map +1 -1
- package/dist/modules/workflow/git/change-request-link.d.ts +20 -0
- package/dist/modules/workflow/git/change-request-link.d.ts.map +1 -0
- package/dist/modules/workflow/git/change-request-link.js +34 -0
- package/dist/modules/workflow/git/change-request-link.js.map +1 -0
- package/dist/modules/workflow/git/git-version.d.ts.map +1 -1
- package/dist/modules/workflow/git/git-version.js +3 -1
- package/dist/modules/workflow/git/git-version.js.map +1 -1
- package/dist/modules/workflow/git/git.service.d.ts +263 -4
- package/dist/modules/workflow/git/git.service.d.ts.map +1 -1
- package/dist/modules/workflow/git/git.service.js +528 -118
- package/dist/modules/workflow/git/git.service.js.map +1 -1
- package/dist/modules/workflow/git/node-git-runner.d.ts +36 -0
- package/dist/modules/workflow/git/node-git-runner.d.ts.map +1 -0
- package/dist/modules/workflow/git/node-git-runner.js +273 -0
- package/dist/modules/workflow/git/node-git-runner.js.map +1 -0
- package/dist/modules/workflow/git/pull-request.service.d.ts +51 -2
- package/dist/modules/workflow/git/pull-request.service.d.ts.map +1 -1
- package/dist/modules/workflow/git/pull-request.service.js +157 -25
- package/dist/modules/workflow/git/pull-request.service.js.map +1 -1
- package/dist/modules/workflow/pending-commits.service.d.ts +11 -0
- package/dist/modules/workflow/pending-commits.service.d.ts.map +1 -1
- package/dist/modules/workflow/pending-commits.service.js +24 -4
- package/dist/modules/workflow/pending-commits.service.js.map +1 -1
- package/dist/modules/workflow/pending-commits.worker.d.ts +15 -8
- package/dist/modules/workflow/pending-commits.worker.d.ts.map +1 -1
- package/dist/modules/workflow/pending-commits.worker.js +107 -58
- package/dist/modules/workflow/pending-commits.worker.js.map +1 -1
- package/dist/modules/workflow/recovery-bot.d.ts.map +1 -1
- package/dist/modules/workflow/recovery-bot.js +3 -1
- package/dist/modules/workflow/recovery-bot.js.map +1 -1
- package/dist/modules/workflow/review-workflow/approval-lock.d.ts +60 -0
- package/dist/modules/workflow/review-workflow/approval-lock.d.ts.map +1 -0
- package/dist/modules/workflow/review-workflow/approval-lock.js +116 -0
- package/dist/modules/workflow/review-workflow/approval-lock.js.map +1 -0
- package/dist/modules/workflow/review-workflow/review-workflow.interface.d.ts +54 -7
- package/dist/modules/workflow/review-workflow/review-workflow.interface.d.ts.map +1 -1
- package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts +64 -0
- package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts.map +1 -1
- package/dist/modules/workflow/review-workflow/review-workflow.service.js +269 -90
- package/dist/modules/workflow/review-workflow/review-workflow.service.js.map +1 -1
- package/dist/modules/workflow/sanitize-error.d.ts +5 -2
- package/dist/modules/workflow/sanitize-error.d.ts.map +1 -1
- package/dist/modules/workflow/sanitize-error.js +8 -4
- package/dist/modules/workflow/sanitize-error.js.map +1 -1
- package/dist/modules/workflow/workflow.routes.d.ts +2 -0
- package/dist/modules/workflow/workflow.routes.d.ts.map +1 -1
- package/dist/modules/workflow/workflow.routes.js +259 -29
- package/dist/modules/workflow/workflow.routes.js.map +1 -1
- package/dist/modules/workflow/workflow.service.d.ts +166 -14
- package/dist/modules/workflow/workflow.service.d.ts.map +1 -1
- package/dist/modules/workflow/workflow.service.js +906 -106
- package/dist/modules/workflow/workflow.service.js.map +1 -1
- package/dist/modules/workspace/empty-dirs.d.ts +15 -0
- package/dist/modules/workspace/empty-dirs.d.ts.map +1 -0
- package/dist/modules/workspace/empty-dirs.js +90 -0
- package/dist/modules/workspace/empty-dirs.js.map +1 -0
- package/dist/modules/workspace/file-readers/content-mode.d.ts +50 -0
- package/dist/modules/workspace/file-readers/content-mode.d.ts.map +1 -0
- package/dist/modules/workspace/file-readers/content-mode.js +55 -0
- package/dist/modules/workspace/file-readers/content-mode.js.map +1 -0
- package/dist/modules/workspace/file-readers/doc-extract.service.d.ts +4 -1
- package/dist/modules/workspace/file-readers/doc-extract.service.d.ts.map +1 -1
- package/dist/modules/workspace/file-readers/doc-extract.service.js +4 -1
- package/dist/modules/workspace/file-readers/doc-extract.service.js.map +1 -1
- package/dist/modules/workspace/file-readers/doc-extract.types.d.ts +5 -2
- package/dist/modules/workspace/file-readers/doc-extract.types.d.ts.map +1 -1
- package/dist/modules/workspace/file-readers/doc-extract.types.js +7 -4
- package/dist/modules/workspace/file-readers/doc-extract.types.js.map +1 -1
- package/dist/modules/workspace/file-readers/document-reader.d.ts +2 -0
- package/dist/modules/workspace/file-readers/document-reader.d.ts.map +1 -1
- package/dist/modules/workspace/file-readers/document-reader.js +5 -0
- package/dist/modules/workspace/file-readers/document-reader.js.map +1 -1
- package/dist/modules/workspace/file-readers/extract-docx.d.ts +6 -0
- package/dist/modules/workspace/file-readers/extract-docx.d.ts.map +1 -1
- package/dist/modules/workspace/file-readers/extract-docx.js +6 -0
- package/dist/modules/workspace/file-readers/extract-docx.js.map +1 -1
- package/dist/modules/workspace/file-readers/file-reader.d.ts +24 -5
- package/dist/modules/workspace/file-readers/file-reader.d.ts.map +1 -1
- package/dist/modules/workspace/file-readers/file-reader.js +11 -6
- package/dist/modules/workspace/file-readers/file-reader.js.map +1 -1
- package/dist/modules/workspace/file-readers/file-reader.registry.d.ts.map +1 -1
- package/dist/modules/workspace/file-readers/file-reader.registry.js +6 -1
- package/dist/modules/workspace/file-readers/file-reader.registry.js.map +1 -1
- package/dist/modules/workspace/file-readers/image-reader.d.ts +7 -5
- package/dist/modules/workspace/file-readers/image-reader.d.ts.map +1 -1
- package/dist/modules/workspace/file-readers/image-reader.js +9 -5
- package/dist/modules/workspace/file-readers/image-reader.js.map +1 -1
- package/dist/modules/workspace/file-readers/ooxml-text.d.ts +3 -0
- package/dist/modules/workspace/file-readers/ooxml-text.d.ts.map +1 -1
- package/dist/modules/workspace/file-readers/ooxml-text.js +39 -2
- package/dist/modules/workspace/file-readers/ooxml-text.js.map +1 -1
- package/dist/modules/workspace/file-readers/text-reader.d.ts +29 -1
- package/dist/modules/workspace/file-readers/text-reader.d.ts.map +1 -1
- package/dist/modules/workspace/file-readers/text-reader.js +57 -3
- package/dist/modules/workspace/file-readers/text-reader.js.map +1 -1
- package/dist/modules/workspace/git-internals.middleware.d.ts +28 -0
- package/dist/modules/workspace/git-internals.middleware.d.ts.map +1 -0
- package/dist/modules/workspace/git-internals.middleware.js +93 -0
- package/dist/modules/workspace/git-internals.middleware.js.map +1 -0
- package/dist/modules/workspace/not-found.d.ts +80 -0
- package/dist/modules/workspace/not-found.d.ts.map +1 -0
- package/dist/modules/workspace/not-found.js +112 -0
- package/dist/modules/workspace/not-found.js.map +1 -0
- package/dist/modules/workspace/session-ontology.gate.d.ts +1 -1
- package/dist/modules/workspace/session-ontology.gate.d.ts.map +1 -1
- package/dist/modules/workspace/session-ontology.gate.js +1 -1
- package/dist/modules/workspace/session-ontology.gate.js.map +1 -1
- package/dist/modules/workspace/startup/beside-checkout.d.ts +42 -0
- package/dist/modules/workspace/startup/beside-checkout.d.ts.map +1 -0
- package/dist/modules/workspace/startup/beside-checkout.js +110 -0
- package/dist/modules/workspace/startup/beside-checkout.js.map +1 -0
- package/dist/modules/workspace/startup/kb-git.d.ts +7 -12
- package/dist/modules/workspace/startup/kb-git.d.ts.map +1 -1
- package/dist/modules/workspace/startup/kb-git.js +34 -35
- package/dist/modules/workspace/startup/kb-git.js.map +1 -1
- package/dist/modules/workspace/startup/kb-startup-runner.d.ts +95 -0
- package/dist/modules/workspace/startup/kb-startup-runner.d.ts.map +1 -1
- package/dist/modules/workspace/startup/kb-startup-runner.js +257 -55
- package/dist/modules/workspace/startup/kb-startup-runner.js.map +1 -1
- package/dist/modules/workspace/startup/steps/groups-to-plugins.step.d.ts +45 -0
- package/dist/modules/workspace/startup/steps/groups-to-plugins.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/groups-to-plugins.step.js +417 -385
- package/dist/modules/workspace/startup/steps/groups-to-plugins.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/personal-spaces.step.d.ts +48 -0
- package/dist/modules/workspace/startup/steps/personal-spaces.step.d.ts.map +1 -0
- package/dist/modules/workspace/startup/steps/personal-spaces.step.js +183 -0
- package/dist/modules/workspace/startup/steps/personal-spaces.step.js.map +1 -0
- package/dist/modules/workspace/startup/steps/plugin-display-names.step.d.ts +51 -0
- package/dist/modules/workspace/startup/steps/plugin-display-names.step.d.ts.map +1 -0
- package/dist/modules/workspace/startup/steps/plugin-display-names.step.js +158 -0
- package/dist/modules/workspace/startup/steps/plugin-display-names.step.js.map +1 -0
- package/dist/modules/workspace/startup/steps/plugin-layout.d.ts +64 -0
- package/dist/modules/workspace/startup/steps/plugin-layout.d.ts.map +1 -0
- package/dist/modules/workspace/startup/steps/plugin-layout.js +97 -0
- package/dist/modules/workspace/startup/steps/plugin-layout.js.map +1 -0
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.d.ts +7 -1
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.js +45 -81
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/roles-yaml.step.d.ts +3 -1
- package/dist/modules/workspace/startup/steps/roles-yaml.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/roles-yaml.step.js +4 -12
- package/dist/modules/workspace/startup/steps/roles-yaml.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/seed-tree.d.ts +6 -1
- package/dist/modules/workspace/startup/steps/seed-tree.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/seed-tree.js +154 -78
- package/dist/modules/workspace/startup/steps/seed-tree.js.map +1 -1
- package/dist/modules/workspace/startup/steps/template-files.step.d.ts +96 -24
- package/dist/modules/workspace/startup/steps/template-files.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/template-files.step.js +446 -138
- package/dist/modules/workspace/startup/steps/template-files.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/template-source.d.ts +94 -0
- package/dist/modules/workspace/startup/steps/template-source.d.ts.map +1 -0
- package/dist/modules/workspace/startup/steps/template-source.js +160 -0
- package/dist/modules/workspace/startup/steps/template-source.js.map +1 -0
- package/dist/modules/workspace/workspace.routes.d.ts +14 -2
- package/dist/modules/workspace/workspace.routes.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.routes.js +649 -238
- package/dist/modules/workspace/workspace.routes.js.map +1 -1
- package/dist/modules/workspace/workspace.service.d.ts +298 -12
- package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.service.js +933 -269
- package/dist/modules/workspace/workspace.service.js.map +1 -1
- package/dist/modules/workspace/workspace.tools.d.ts +42 -1
- package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.tools.js +1626 -146
- package/dist/modules/workspace/workspace.tools.js.map +1 -1
- package/dist/modules/workspace/write-denial.d.ts +76 -0
- package/dist/modules/workspace/write-denial.d.ts.map +1 -0
- package/dist/modules/workspace/write-denial.js +138 -0
- package/dist/modules/workspace/write-denial.js.map +1 -0
- package/dist/shared/canonical-file-identity.d.ts +64 -0
- package/dist/shared/canonical-file-identity.d.ts.map +1 -0
- package/dist/shared/canonical-file-identity.js +92 -0
- package/dist/shared/canonical-file-identity.js.map +1 -0
- package/dist/shared/domain-errors.d.ts +108 -0
- package/dist/shared/domain-errors.d.ts.map +1 -1
- package/dist/shared/domain-errors.js +137 -0
- package/dist/shared/domain-errors.js.map +1 -1
- package/dist/shared/email-identity.d.ts +32 -0
- package/dist/shared/email-identity.d.ts.map +1 -0
- package/dist/shared/email-identity.js +37 -0
- package/dist/shared/email-identity.js.map +1 -0
- package/dist/shared/fs.contract.d.ts +206 -0
- package/dist/shared/fs.contract.d.ts.map +1 -0
- package/dist/shared/fs.contract.js +79 -0
- package/dist/shared/fs.contract.js.map +1 -0
- package/dist/shared/git-failure.d.ts +80 -0
- package/dist/shared/git-failure.d.ts.map +1 -0
- package/dist/shared/git-failure.js +139 -0
- package/dist/shared/git-failure.js.map +1 -0
- package/dist/shared/git-internals.d.ts +23 -0
- package/dist/shared/git-internals.d.ts.map +1 -0
- package/dist/shared/git-internals.js +181 -0
- package/dist/shared/git-internals.js.map +1 -0
- package/dist/shared/git.contract.d.ts +157 -0
- package/dist/shared/git.contract.d.ts.map +1 -0
- package/dist/shared/git.contract.js +103 -0
- package/dist/shared/git.contract.js.map +1 -0
- package/dist/shared/http-errors.d.ts +33 -0
- package/dist/shared/http-errors.d.ts.map +1 -0
- package/dist/shared/http-errors.js +35 -0
- package/dist/shared/http-errors.js.map +1 -0
- package/dist/shared/logger.contract.d.ts +63 -0
- package/dist/shared/logger.contract.d.ts.map +1 -0
- package/dist/shared/logger.contract.js +126 -0
- package/dist/shared/logger.contract.js.map +1 -0
- package/dist/shared/logging.d.ts +31 -0
- package/dist/shared/logging.d.ts.map +1 -0
- package/dist/shared/logging.js +92 -0
- package/dist/shared/logging.js.map +1 -0
- package/dist/shared/path-containment.d.ts +21 -0
- package/dist/shared/path-containment.d.ts.map +1 -0
- package/dist/shared/path-containment.js +34 -0
- package/dist/shared/path-containment.js.map +1 -0
- package/dist/shared/pending-proposals.d.ts +71 -0
- package/dist/shared/pending-proposals.d.ts.map +1 -0
- package/dist/shared/pending-proposals.js +98 -0
- package/dist/shared/pending-proposals.js.map +1 -0
- package/dist/shared/printable.d.ts +22 -0
- package/dist/shared/printable.d.ts.map +1 -0
- package/dist/shared/printable.js +65 -0
- package/dist/shared/printable.js.map +1 -0
- package/dist/shared/redact-secret.d.ts +30 -0
- package/dist/shared/redact-secret.d.ts.map +1 -0
- package/dist/shared/redact-secret.js +114 -0
- package/dist/shared/redact-secret.js.map +1 -0
- package/dist/shared/rename-no-replace.d.ts +119 -0
- package/dist/shared/rename-no-replace.d.ts.map +1 -0
- package/dist/shared/rename-no-replace.js +323 -0
- package/dist/shared/rename-no-replace.js.map +1 -0
- package/dist/shared/ssrf.d.ts.map +1 -1
- package/dist/shared/ssrf.js +49 -18
- package/dist/shared/ssrf.js.map +1 -1
- package/dist/version.d.ts +10 -6
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +10 -6
- package/dist/version.js.map +1 -1
- package/kb-template/.bevelignore +4 -3
- package/kb-template/AGENTS.md +281 -36
- package/kb-template/KnowledgeBase/How to get started.md +1 -1
- package/kb-template/access.md +5 -3
- package/kb-template/mcp-description.md +27 -0
- package/migrations/0006_api_tokens_revoked_by.sql +1 -0
- package/migrations/0007_github_facade_registered.sql +1 -0
- package/migrations/0008_change_request_apply_failure.sql +4 -0
- package/migrations/0009_change_request_apply_failure_kind.sql +13 -0
- package/migrations/0010_plugin_join_requests.sql +15 -0
- package/migrations/0011_plugin_join_request_claim.sql +11 -0
- package/migrations/0012_agent_audit.sql +41 -0
- package/migrations/0013_agent_identity_and_key_soft_delete.sql +29 -0
- package/migrations/meta/0006_snapshot.json +1723 -0
- package/migrations/meta/0007_snapshot.json +1729 -0
- package/migrations/meta/0008_snapshot.json +1753 -0
- package/migrations/meta/0009_snapshot.json +1759 -0
- package/migrations/meta/0010_snapshot.json +1872 -0
- package/migrations/meta/0011_snapshot.json +1884 -0
- package/migrations/meta/0012_snapshot.json +2247 -0
- package/migrations/meta/0013_snapshot.json +2259 -0
- package/migrations/meta/_journal.json +56 -0
- package/package.json +7 -6
- package/src/__tests__/core-config.domain.test.ts +67 -2
- package/src/__tests__/kb-layout-config.test.ts +186 -1
- package/src/__tests__/open-change-gate.ts +15 -0
- package/src/core/__tests__/catalog-cache-invalidation.test.ts +83 -3
- package/src/core/__tests__/catalog-revision.test.ts +190 -0
- package/src/core/__tests__/lifecycle.test.ts +369 -0
- package/src/core/__tests__/public-config.test.ts +30 -0
- package/src/core/__tests__/readiness.test.ts +109 -0
- package/src/core/catalog-cache-invalidation.ts +20 -1
- package/src/core/catalog-revision.ts +110 -0
- package/src/core/create-core-server.ts +286 -79
- package/src/core/create-core-services.ts +315 -81
- package/src/core/lifecycle.ts +312 -0
- package/src/core/public-config.ts +86 -0
- package/src/core/readiness.ts +123 -0
- package/src/core-config.ts +70 -4
- package/src/index.ts +15 -0
- package/src/modules/access/__tests__/access-control.admin-root-floor.test.ts +362 -0
- package/src/modules/access/__tests__/access-control.atref-batch.test.ts +2 -1
- package/src/modules/access/__tests__/access-control.atref-cache.test.ts +46 -22
- package/src/modules/access/__tests__/access-control.deny-dependents.test.ts +215 -0
- package/src/modules/access/__tests__/access-control.download-read.test.ts +268 -0
- package/src/modules/access/__tests__/access-control.everyone-read.test.ts +145 -0
- package/src/modules/access/__tests__/access-control.group-read.test.ts +163 -0
- package/src/modules/access/__tests__/access-control.invalidate-race.test.ts +2 -0
- package/src/modules/access/__tests__/access-control.platform-restore.test.ts +152 -0
- package/src/modules/access/__tests__/access-control.prospective.test.ts +189 -0
- package/src/modules/access/__tests__/access-control.read-batch.test.ts +2 -1
- package/src/modules/access/__tests__/access-control.service.test.ts +123 -78
- package/src/modules/access/__tests__/access-groups.test.ts +47 -14
- package/src/modules/access/__tests__/access-md-format.test.ts +2 -1
- package/src/modules/access/__tests__/access-mutation.service.test.ts +52 -4
- package/src/modules/access/__tests__/access-own-read-grant.test.ts +2 -0
- package/src/modules/access/__tests__/access-personal-plugin.test.ts +153 -0
- package/src/modules/access/__tests__/access-plugin-principals.test.ts +18 -1
- package/src/modules/access/__tests__/access-restrict-here.test.ts +450 -0
- package/src/modules/access/__tests__/access.routes.batch.test.ts +139 -0
- package/src/modules/access/__tests__/access.routes.folder-governs.test.ts +394 -0
- package/src/modules/access/__tests__/access.routes.group-grant.test.ts +6 -2
- package/src/modules/access/__tests__/access.routes.overrides.test.ts +3 -2
- package/src/modules/access/__tests__/access.routes.proposal-branch.test.ts +234 -0
- package/src/modules/access/__tests__/access.routes.prospective.test.ts +216 -0
- package/src/modules/access/__tests__/access.routes.revoke.test.ts +7 -2
- package/src/modules/access/__tests__/access.routes.unknown-email.test.ts +360 -0
- package/src/modules/access/__tests__/change-read-gate.test.ts +272 -0
- package/src/modules/access/__tests__/creator-access.test.ts +81 -83
- package/src/modules/access/__tests__/grant-sources.test.ts +3 -2
- package/src/modules/access/__tests__/groups-admin.service.test.ts +6 -5
- package/src/modules/access/__tests__/roles-admin.security.test.ts +196 -0
- package/src/modules/access/__tests__/roles-admin.service.test.ts +127 -2
- package/src/modules/access/__tests__/roles-capabilities.test.ts +5 -4
- package/src/modules/access/__tests__/roles.routes.test.ts +5 -2
- package/src/modules/access/__tests__/user-access-removal.service.test.ts +402 -0
- package/src/modules/access/__tests__/users-db-double.ts +63 -0
- package/src/modules/access/access-control.interface.ts +251 -11
- package/src/modules/access/access-control.service.ts +719 -164
- package/src/modules/access/access-mutation.service.ts +182 -13
- package/src/modules/access/access-view.ts +316 -0
- package/src/modules/access/access.routes.ts +293 -95
- package/src/modules/access/admin-locked-commit.ts +12 -14
- package/src/modules/access/admin-route-helpers.ts +4 -4
- package/src/modules/access/change-read-gate.ts +148 -0
- package/src/modules/access/creator-access.ts +89 -124
- package/src/modules/access/directory-sync-bot.ts +4 -1
- package/src/modules/access/groups-admin.service.ts +3 -3
- package/src/modules/access/reference-scan.ts +5 -5
- package/src/modules/access/roles-admin.service.ts +94 -15
- package/src/modules/access/synced-groups-committer.ts +10 -15
- package/src/modules/access/synced-groups-writer.ts +3 -12
- package/src/modules/access/user-access-removal.service.ts +711 -0
- package/src/modules/access-model/__tests__/access-splice.test.ts +63 -1
- package/src/modules/access-model/__tests__/frontmatter-fences.test.ts +71 -0
- package/src/modules/access-model/__tests__/roles-yaml-guard.test.ts +131 -0
- package/src/modules/access-model/access-errors.ts +56 -15
- package/src/modules/access-model/access-grammar.ts +85 -48
- package/src/modules/access-model/access-splice.ts +18 -18
- package/src/modules/access-model/access-template.ts +44 -0
- package/src/modules/access-model/change-gate.ts +80 -0
- package/src/modules/access-model/creator.ts +18 -21
- package/src/modules/access-model/frontmatter-lines.ts +98 -0
- package/src/modules/access-model/plugin-principals.ts +12 -19
- package/src/modules/access-model/roles-yaml-guard.ts +182 -4
- package/src/modules/admin/admin-access.service.ts +6 -2
- package/src/modules/agent-instructions/__tests__/agent-instructions.route.test.ts +100 -0
- package/src/modules/agent-instructions/__tests__/compose.test.ts +256 -0
- package/src/modules/agent-instructions/__tests__/read-preamble.test.ts +135 -0
- package/src/modules/agent-instructions/agent-instructions.routes.ts +41 -0
- package/src/modules/agent-instructions/compose.ts +271 -0
- package/src/modules/agent-instructions/index.ts +14 -0
- package/src/modules/agent-instructions/read-preamble.ts +88 -0
- package/src/modules/audit/__tests__/agent-audit.service.test.ts +370 -0
- package/src/modules/audit/__tests__/agent-rest-audit.middleware.test.ts +113 -0
- package/src/modules/audit/__tests__/audit.routes.test.ts +201 -0
- package/src/modules/audit/__tests__/event-classifier.test.ts +121 -0
- package/src/modules/audit/agent-audit.service.ts +316 -0
- package/src/modules/audit/agent-rest-audit.middleware.ts +83 -0
- package/src/modules/audit/audit.contract.ts +164 -0
- package/src/modules/audit/audit.routes.ts +168 -0
- package/src/modules/audit/event-classifier.ts +155 -0
- package/src/modules/audit/index.ts +14 -0
- package/src/modules/audit/request-audit.ts +141 -0
- package/src/modules/auth/__tests__/account-erasure.approval-gate.test.ts +209 -0
- package/src/modules/auth/__tests__/account.routes.test.ts +178 -2
- package/src/modules/auth/__tests__/auth.middleware.test.ts +78 -0
- package/src/modules/auth/__tests__/auth.service.test.ts +338 -5
- package/src/modules/auth/__tests__/oidc-auth-provider.test.ts +352 -12
- package/src/modules/auth/__tests__/onboarding-done.route.test.ts +3 -1
- package/src/modules/auth/account-erasure.service.ts +117 -10
- package/src/modules/auth/account.routes.ts +115 -14
- package/src/modules/auth/auth.routes.ts +20 -7
- package/src/modules/auth/auth.service.ts +187 -28
- package/src/modules/auth/oidc-auth-provider.ts +120 -22
- package/src/modules/code-mode/__tests__/code-mode.tool.test.ts +109 -1
- package/src/modules/code-mode/code-mode.tool.ts +13 -2
- package/src/modules/connection-probe/__tests__/connection-probe.service.test.ts +78 -0
- package/src/modules/connection-probe/connection-probe.service.ts +59 -7
- package/src/modules/database/__tests__/advisory-lease.test.ts +152 -0
- package/src/modules/database/__tests__/advisory-lock.test.ts +147 -0
- package/src/modules/database/advisory-lock.ts +346 -0
- package/src/modules/database/connection.ts +9 -1
- package/src/modules/database/core-schema.ts +227 -0
- package/src/modules/database/migrate.ts +27 -6
- package/src/modules/declared-variables/declared-variables.routes.ts +6 -3
- package/src/modules/diff/__tests__/diff.service.seed-atomicity.test.ts +3 -0
- package/src/modules/diff/__tests__/diff.service.test.ts +3 -0
- package/src/modules/diff/diff.routes.ts +2 -4
- package/src/modules/diff/diff.service.ts +80 -79
- package/src/modules/kb-fs/__tests__/locking-filesystem.test.ts +472 -9
- package/src/modules/kb-fs/__tests__/node-fs.test.ts +409 -0
- package/src/modules/kb-fs/__tests__/repo-path.test.ts +210 -1
- package/src/modules/{workspace → kb-fs}/bevel-ignore.ts +22 -15
- package/src/modules/kb-fs/file-change-notifier.ts +4 -1
- package/src/modules/kb-fs/git-guarded-filesystem.ts +136 -0
- package/src/modules/kb-fs/locking-filesystem.ts +399 -109
- package/src/modules/kb-fs/node-fs.ts +165 -0
- package/src/modules/kb-fs/read-only-filesystem.ts +18 -9
- package/src/modules/kb-fs/repo-path.ts +213 -3
- package/src/modules/kb-sync/kb-sync.routes.ts +5 -2
- package/src/modules/kb-sync/kb-sync.service.ts +8 -5
- package/src/modules/marketplace/__tests__/github-facade.test.ts +134 -2
- package/src/modules/marketplace/__tests__/marketplace-git.test.ts +2 -1
- package/src/modules/marketplace/__tests__/marketplace-repo.head.test.ts +47 -0
- package/src/modules/marketplace/git-http.routes.ts +7 -4
- package/src/modules/marketplace/github-facade/github-facade-admin.routes.ts +35 -3
- package/src/modules/marketplace/github-facade/github-facade-credentials.service.ts +55 -0
- package/src/modules/marketplace/github-facade/github-facade.routes.ts +32 -6
- package/src/modules/marketplace/github-facade/github-facade.service.ts +80 -19
- package/src/modules/marketplace/github-facade/index.ts +1 -0
- package/src/modules/marketplace/marketplace-repo.service.ts +23 -8
- package/src/modules/mcp/__tests__/bevel-oauth-provider.test.ts +183 -13
- package/src/modules/mcp/__tests__/downstream-pool.test.ts +278 -0
- package/src/modules/mcp/__tests__/downstream-token-refresh.test.ts +178 -0
- package/src/modules/mcp/__tests__/fake-downstream-mcp-server.ts +156 -0
- package/src/modules/mcp/__tests__/first-call-probe.cli-args.test.ts +178 -0
- package/src/modules/mcp/__tests__/first-call-probe.test.ts +414 -0
- package/src/modules/mcp/__tests__/manual-failure-memo.test.ts +98 -6
- package/src/modules/mcp/__tests__/mcp-auth.middleware.test.ts +68 -7
- package/src/modules/mcp/__tests__/mcp-routes-harness.ts +1 -3
- package/src/modules/mcp/__tests__/mcp.e2e.test.ts +1055 -59
- package/src/modules/mcp/__tests__/mcp.routes.local-token.test.ts +24 -4
- package/src/modules/mcp/__tests__/mcp.routes.stateless.test.ts +182 -0
- package/src/modules/mcp/__tests__/mcp.service.test.ts +391 -6
- package/src/modules/mcp/__tests__/surface-log-throttle.test.ts +169 -0
- package/src/modules/mcp/downstream-pool.ts +256 -0
- package/src/modules/mcp/downstream-token-refresh.ts +170 -0
- package/src/modules/mcp/first-call-probe.cli-args.ts +159 -0
- package/src/modules/mcp/first-call-probe.cli.ts +60 -0
- package/src/modules/mcp/first-call-probe.ts +418 -0
- package/src/modules/mcp/manual-failure-memo.ts +81 -23
- package/src/modules/mcp/mcp-auth.middleware.ts +56 -16
- package/src/modules/mcp/mcp.routes.ts +386 -482
- package/src/modules/mcp/mcp.service.ts +905 -177
- package/src/modules/mcp/oauth/bevel-oauth-provider.ts +189 -8
- package/src/modules/mcp/oauth/oauth-consent.routes.ts +4 -4
- package/src/modules/mcp/surface-log-throttle.ts +120 -0
- package/src/modules/plugins/__tests__/bundle-dialect.e2e.test.ts +10 -7
- package/src/modules/plugins/__tests__/bundle-dialect.test.ts +165 -0
- package/src/modules/plugins/__tests__/compile-marketplace.test.ts +139 -10
- package/src/modules/plugins/__tests__/fake-join-request-store.ts +189 -0
- package/src/modules/plugins/__tests__/join-request-jobs.service.test.ts +608 -0
- package/src/modules/plugins/__tests__/plugin-creation-display-name.test.ts +241 -0
- package/src/modules/plugins/__tests__/plugin-index.service.test.ts +148 -7
- package/src/modules/plugins/__tests__/plugin-links.service.test.ts +10 -13
- package/src/modules/plugins/__tests__/plugin-names.test.ts +77 -0
- package/src/modules/plugins/__tests__/plugin-provision.service.test.ts +129 -19
- package/src/modules/plugins/__tests__/plugin-rename.service.test.ts +91 -29
- package/src/modules/plugins/__tests__/plugins.routes.test.ts +370 -19
- package/src/modules/plugins/__tests__/plugins.tools.test.ts +131 -0
- package/src/modules/plugins/__tests__/teams.routes.test.ts +248 -0
- package/src/modules/plugins/compile/compile-marketplace.ts +143 -46
- package/src/modules/plugins/compile/marketplace-compiler.service.ts +8 -7
- package/src/modules/plugins/discovery/__tests__/kb-plugin-source.test.ts +56 -20
- package/src/modules/plugins/discovery/bundle-dialect/bundle.source.ts +30 -9
- package/src/modules/plugins/discovery/bundle-dialect/registry.ts +93 -18
- package/src/modules/plugins/discovery/kb-plugin-source.ts +10 -7
- package/src/modules/plugins/discovery/native.source.ts +21 -3
- package/src/modules/plugins/discovery/plugin-source.ts +17 -3
- package/src/modules/plugins/index.ts +16 -3
- package/src/modules/plugins/join-request-jobs.service.ts +675 -0
- package/src/modules/plugins/join-request-records.store.ts +353 -0
- package/src/modules/plugins/join-requests.service.ts +7 -4
- package/src/modules/plugins/plugin-links.service.ts +4 -17
- package/src/modules/plugins/plugin-links.ts +6 -3
- package/src/modules/plugins/plugin-provision.service.ts +209 -37
- package/src/modules/plugins/plugin-rename.service.ts +21 -9
- package/src/modules/plugins/plugins.contract.ts +52 -4
- package/src/modules/plugins/plugins.routes.ts +204 -124
- package/src/modules/plugins/plugins.service.ts +92 -18
- package/src/modules/plugins/plugins.tools.ts +88 -0
- package/src/modules/plugins/teams.routes.ts +129 -0
- package/src/modules/secrets-vault/__tests__/connect-pending.route.test.ts +359 -15
- package/src/modules/secrets-vault/__tests__/db-secrets-vault.oauth.test.ts +248 -0
- package/src/modules/secrets-vault/__tests__/namespace-secrets.test.ts +202 -0
- package/src/modules/secrets-vault/db-secrets-vault.service.ts +217 -35
- package/src/modules/secrets-vault/index.ts +1 -0
- package/src/modules/secrets-vault/mcp-oauth-discovery.service.ts +6 -3
- package/src/modules/secrets-vault/secrets-variable-loader.ts +4 -4
- package/src/modules/secrets-vault/secrets-vault.contract.ts +93 -0
- package/src/modules/secrets-vault/secrets-vault.routes.ts +99 -38
- package/src/modules/settings/__tests__/connection-check.test.ts +233 -0
- package/src/modules/settings/__tests__/deployment-settings.service.test.ts +223 -6
- package/src/modules/settings/__tests__/git-root-folders.test.ts +247 -0
- package/src/modules/settings/__tests__/oidc-check.test.ts +185 -0
- package/src/modules/settings/__tests__/setup.routes.boot-failure.test.ts +119 -0
- package/src/modules/settings/__tests__/setup.routes.layout-phase.test.ts +170 -0
- package/src/modules/settings/__tests__/setup.routes.oidc.test.ts +555 -0
- package/src/modules/settings/__tests__/setup.routes.test.ts +667 -16
- package/src/modules/settings/connection-check.ts +351 -0
- package/src/modules/settings/deployment-settings.service.ts +444 -59
- package/src/modules/settings/git-root-folders.ts +171 -0
- package/src/modules/settings/oidc-check.ts +229 -0
- package/src/modules/settings/setup.routes.ts +456 -110
- package/src/modules/skills/__tests__/allowed-tools-check.test.ts +224 -0
- package/src/modules/skills/__tests__/allowed-tools-warn.tools.test.ts +210 -0
- package/src/modules/skills/__tests__/pending-skills.service.test.ts +3 -3
- package/src/modules/skills/__tests__/skills.routes.warnings.test.ts +91 -0
- package/src/modules/skills/__tests__/skills.service.test.ts +223 -2
- package/src/modules/skills/allowed-tools-check.ts +352 -0
- package/src/modules/skills/index.ts +4 -0
- package/src/modules/skills/pending-skills.service.ts +21 -82
- package/src/modules/skills/skill-access-requests.routes.ts +10 -6
- package/src/modules/skills/skills.contract.ts +43 -11
- package/src/modules/skills/skills.routes.ts +16 -1
- package/src/modules/skills/skills.service.ts +214 -84
- package/src/modules/skills/skills.tools.ts +43 -5
- package/src/modules/tool-auth/__tests__/connection-key-rejection.test.ts +192 -0
- package/src/modules/tool-auth/__tests__/connection-keys-admin.routes.test.ts +116 -0
- package/src/modules/tool-auth/__tests__/external-api-key.service.test.ts +153 -8
- package/src/modules/tool-auth/__tests__/internal-token.service.test.ts +6 -0
- package/src/modules/tool-auth/connection-key-rejection.ts +25 -0
- package/src/modules/tool-auth/connection-keys-admin.routes.ts +76 -0
- package/src/modules/tool-auth/external-api-key.interface.ts +78 -8
- package/src/modules/tool-auth/external-api-key.service.ts +98 -33
- package/src/modules/tool-auth/internal-token.service.ts +16 -2
- package/src/modules/tool-auth/key-or-session.middleware.ts +45 -0
- package/src/modules/tool-auth/tool-auth.middleware.ts +33 -8
- package/src/modules/tool-helpers/__tests__/agent-roles-write.test.ts +228 -0
- package/src/modules/tool-helpers/__tests__/phase4-tools.test.ts +33 -4
- package/src/modules/tool-helpers/tool-context.ts +46 -7
- package/src/modules/tool-helpers/tool-handler.ts +23 -5
- package/src/modules/tool-helpers/tool.contract.ts +5 -0
- package/src/modules/tool-manuals/__tests__/mcp-server-edit.service.test.ts +2 -1
- package/src/modules/tool-manuals/__tests__/pending-tools.service.test.ts +411 -0
- package/src/modules/tool-manuals/__tests__/tool-delete.route.test.ts +133 -0
- package/src/modules/tool-manuals/__tests__/tool-delete.service.test.ts +469 -0
- package/src/modules/tool-manuals/__tests__/tool-manuals.archive.route.test.ts +21 -2
- package/src/modules/tool-manuals/__tests__/tool-manuals.cli.test.ts +9 -4
- package/src/modules/tool-manuals/__tests__/tool-manuals.detail.route.test.ts +6 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.invalid.routes.test.ts +254 -0
- package/src/modules/tool-manuals/__tests__/tool-manuals.invalid.test.ts +577 -0
- package/src/modules/tool-manuals/__tests__/tool-manuals.mcp-oauth.test.ts +6 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.pending.route.test.ts +102 -0
- package/src/modules/tool-manuals/__tests__/tool-manuals.restart.test.ts +285 -0
- package/src/modules/tool-manuals/__tests__/tool-manuals.service.test.ts +178 -2
- package/src/modules/tool-manuals/__tests__/tool-manuals.tools.test.ts +114 -2
- package/src/modules/tool-manuals/index.ts +3 -0
- package/src/modules/tool-manuals/mcp-json-discovery.ts +13 -10
- package/src/modules/tool-manuals/mcp-server-edit.service.ts +11 -14
- package/src/modules/tool-manuals/pending-tools.service.ts +179 -0
- package/src/modules/tool-manuals/tool-delete.service.ts +401 -0
- package/src/modules/tool-manuals/tool-manuals.contract.ts +165 -0
- package/src/modules/tool-manuals/tool-manuals.routes.ts +138 -54
- package/src/modules/tool-manuals/tool-manuals.service.ts +432 -87
- package/src/modules/tool-manuals/tool-manuals.tools.ts +81 -6
- package/src/modules/workflow/__tests__/apply-failure.test.ts +1038 -0
- package/src/modules/workflow/__tests__/event-bus.test.ts +61 -9
- package/src/modules/workflow/__tests__/fake-file-lock-db.ts +199 -0
- package/src/modules/workflow/__tests__/file-lock.service.path-identity.test.ts +237 -0
- package/src/modules/workflow/__tests__/format-affected-owners.test.ts +18 -0
- package/src/modules/workflow/__tests__/merge-announces-tree.test.ts +220 -0
- package/src/modules/workflow/__tests__/pending-commits.worker.concurrency.test.ts +187 -0
- package/src/modules/workflow/__tests__/preserve-roles-yaml.test.ts +2 -0
- package/src/modules/workflow/__tests__/sanitize-error.test.ts +10 -0
- package/src/modules/workflow/__tests__/workflow.routes.folder-proposals.test.ts +128 -0
- package/src/modules/workflow/__tests__/workflow.routes.fork-point-file.test.ts +149 -0
- package/src/modules/workflow/__tests__/workflow.routes.lock-path.test.ts +305 -0
- package/src/modules/workflow/__tests__/workflow.service.branch-in-use.test.ts +2 -0
- package/src/modules/workflow/__tests__/workflow.service.commitFileWhileLocked.test.ts +2 -0
- package/src/modules/workflow/__tests__/workflow.service.deleted-branch-sweep.test.ts +2 -0
- package/src/modules/workflow/__tests__/workflow.service.facade.test.ts +294 -25
- package/src/modules/workflow/__tests__/workflow.service.folder-proposals.test.ts +564 -0
- package/src/modules/workflow/__tests__/workflow.service.platform-restore.test.ts +135 -0
- package/src/modules/workflow/__tests__/workflow.service.read-gate.test.ts +172 -0
- package/src/modules/workflow/__tests__/workflow.service.releaseLock.test.ts +14 -0
- package/src/modules/workflow/__tests__/workflow.service.sync.test.ts +5 -0
- package/src/modules/workflow/__tests__/workflow.service.update-from-target.test.ts +281 -0
- package/src/modules/workflow/agent-tools/__tests__/workflow.tools.test.ts +158 -7
- package/src/modules/workflow/agent-tools/workflow.tools.ts +93 -64
- package/src/modules/workflow/event-bus.ts +26 -28
- package/src/modules/workflow/events.routes.ts +56 -21
- package/src/modules/workflow/file-lock.service.ts +27 -4
- package/src/modules/workflow/git/__tests__/change-request-link.test.ts +43 -0
- package/src/modules/workflow/git/__tests__/git.service.accessGating.test.ts +1 -0
- package/src/modules/workflow/git/__tests__/git.service.changedFilesForPr.test.ts +238 -1
- package/src/modules/workflow/git/__tests__/git.service.forkPoint.test.ts +245 -0
- package/src/modules/workflow/git/__tests__/git.service.list-branches.test.ts +35 -0
- package/src/modules/workflow/git/__tests__/git.service.mergeChangeRequest.test.ts +149 -0
- package/src/modules/workflow/git/__tests__/git.service.revertPathsAndPush.test.ts +177 -0
- package/src/modules/workflow/git/__tests__/node-git-runner.test.ts +114 -0
- package/src/modules/workflow/git/__tests__/pull-request.service.getPrDetail.test.ts +69 -2
- package/src/modules/workflow/git/__tests__/pull-request.service.list-fetch.test.ts +121 -0
- package/src/modules/workflow/git/__tests__/pull-request.service.placeholder.test.ts +79 -0
- package/src/modules/workflow/git/__tests__/pull-request.service.test.ts +1 -1
- package/src/modules/workflow/git/__tests__/pull-request.service.viewer-can-cancel.test.ts +1 -1
- package/src/modules/workflow/git/__tests__/pull-request.service.viewer-can-update.test.ts +111 -0
- package/src/modules/workflow/git/change-request-link.ts +35 -0
- package/src/modules/workflow/git/git-version.ts +5 -2
- package/src/modules/workflow/git/git.service.ts +684 -144
- package/src/modules/workflow/git/node-git-runner.ts +315 -0
- package/src/modules/workflow/git/pull-request.service.ts +179 -27
- package/src/modules/workflow/pending-commits.service.ts +26 -7
- package/src/modules/workflow/pending-commits.worker.ts +114 -69
- package/src/modules/workflow/recovery-bot.ts +4 -1
- package/src/modules/workflow/review-workflow/__tests__/approval-states.test.ts +180 -1
- package/src/modules/workflow/review-workflow/__tests__/cancel-pr.test.ts +1 -1
- package/src/modules/workflow/review-workflow/__tests__/carry-approvals-forward.test.ts +520 -0
- package/src/modules/workflow/review-workflow/__tests__/erase-approver.test.ts +84 -0
- package/src/modules/workflow/review-workflow/__tests__/merge-gate.test.ts +89 -77
- package/src/modules/workflow/review-workflow/approval-lock.ts +122 -0
- package/src/modules/workflow/review-workflow/review-workflow.interface.ts +59 -7
- package/src/modules/workflow/review-workflow/review-workflow.service.ts +309 -105
- package/src/modules/workflow/sanitize-error.ts +9 -4
- package/src/modules/workflow/workflow.routes.ts +273 -29
- package/src/modules/workflow/workflow.service.ts +1087 -171
- package/src/modules/workspace/__tests__/empty-dirs.test.ts +44 -0
- package/src/modules/workspace/__tests__/file-stat-access.test.ts +301 -0
- package/src/modules/workspace/__tests__/git-internals.security.test.ts +883 -0
- package/src/modules/workspace/__tests__/workspace-paths-inside-the-repo.test.ts +464 -0
- package/src/modules/workspace/__tests__/workspace.routes.branch-errors.test.ts +139 -0
- package/src/modules/workspace/__tests__/workspace.routes.create-grant.test.ts +189 -37
- package/src/modules/workspace/__tests__/workspace.routes.delete.test.ts +51 -11
- package/src/modules/workspace/__tests__/workspace.routes.download-implies-read.test.ts +161 -0
- package/src/modules/workspace/__tests__/workspace.routes.download.test.ts +109 -10
- package/src/modules/workspace/__tests__/workspace.routes.file-writes.test.ts +624 -0
- package/src/modules/workspace/__tests__/workspace.routes.folders.test.ts +409 -0
- package/src/modules/workspace/__tests__/workspace.routes.move-platform-files.test.ts +327 -0
- package/src/modules/workspace/__tests__/workspace.routes.read-gate.test.ts +25 -6
- package/src/modules/workspace/__tests__/workspace.service.ensure-remotes-fetched.test.ts +109 -0
- package/src/modules/workspace/__tests__/workspace.service.list-cloned.test.ts +6 -5
- package/src/modules/workspace/__tests__/workspace.service.move-never-overwrites.test.ts +218 -0
- package/src/modules/workspace/__tests__/workspace.service.read-filter.test.ts +56 -1
- package/src/modules/workspace/__tests__/workspace.service.test.ts +811 -42
- package/src/modules/workspace/__tests__/workspace.service.unknown-branch.test.ts +197 -0
- package/src/modules/workspace/__tests__/workspace.tools.agents-file.test.ts +128 -0
- package/src/modules/workspace/__tests__/workspace.tools.branch-errors.test.ts +212 -0
- package/src/modules/workspace/__tests__/workspace.tools.test.ts +2632 -110
- package/src/modules/workspace/__tests__/write-denial.test.ts +75 -0
- package/src/modules/workspace/empty-dirs.ts +79 -0
- package/src/modules/workspace/file-readers/README.md +32 -0
- package/src/modules/workspace/file-readers/__tests__/doc-extract.test.ts +59 -2
- package/src/modules/workspace/file-readers/__tests__/file-reader.registry.test.ts +133 -4
- package/src/modules/workspace/file-readers/__tests__/fixtures/soft-break.docx +0 -0
- package/src/modules/workspace/file-readers/__tests__/fixtures/tab.docx +0 -0
- package/src/modules/workspace/file-readers/content-mode.ts +87 -0
- package/src/modules/workspace/file-readers/doc-extract.service.ts +4 -1
- package/src/modules/workspace/file-readers/doc-extract.types.ts +8 -4
- package/src/modules/workspace/file-readers/document-reader.ts +6 -0
- package/src/modules/workspace/file-readers/extract-docx.ts +6 -0
- package/src/modules/workspace/file-readers/file-reader.registry.ts +9 -1
- package/src/modules/workspace/file-readers/file-reader.ts +27 -6
- package/src/modules/workspace/file-readers/image-reader.ts +10 -5
- package/src/modules/workspace/file-readers/ooxml-text.ts +38 -2
- package/src/modules/workspace/file-readers/text-reader.ts +61 -4
- package/src/modules/workspace/git-internals.middleware.ts +86 -0
- package/src/modules/workspace/not-found.ts +119 -0
- package/src/modules/workspace/session-ontology.gate.ts +1 -1
- package/src/modules/workspace/startup/__tests__/beside-checkout.test.ts +181 -0
- package/src/modules/workspace/startup/__tests__/kb-startup-runner.degraded.test.ts +361 -0
- package/src/modules/workspace/startup/__tests__/kb-startup-runner.test.ts +53 -16
- package/src/modules/workspace/startup/beside-checkout.ts +112 -0
- package/src/modules/workspace/startup/kb-git.ts +43 -36
- package/src/modules/workspace/startup/kb-startup-runner.ts +303 -63
- package/src/modules/workspace/startup/steps/__tests__/steps.test.ts +1215 -73
- package/src/modules/workspace/startup/steps/groups-to-plugins.step.ts +460 -417
- package/src/modules/workspace/startup/steps/personal-spaces.step.ts +191 -0
- package/src/modules/workspace/startup/steps/plugin-display-names.step.ts +169 -0
- package/src/modules/workspace/startup/steps/plugin-layout.ts +110 -0
- package/src/modules/workspace/startup/steps/plugin-manifests.step.ts +46 -85
- package/src/modules/workspace/startup/steps/roles-yaml.step.ts +6 -12
- package/src/modules/workspace/startup/steps/seed-tree.ts +159 -78
- package/src/modules/workspace/startup/steps/template-files.step.ts +492 -141
- package/src/modules/workspace/startup/steps/template-source.ts +168 -0
- package/src/modules/workspace/workspace.routes.ts +687 -257
- package/src/modules/workspace/workspace.service.ts +1000 -303
- package/src/modules/workspace/workspace.tools.ts +1823 -180
- package/src/modules/workspace/write-denial.ts +189 -0
- package/src/shared/__tests__/canonical-file-identity.test.ts +154 -0
- package/src/shared/__tests__/email-identity.test.ts +35 -0
- package/src/shared/__tests__/filename.test.ts +0 -0
- package/src/shared/__tests__/frontmatter-id.test.ts +5 -0
- package/src/shared/__tests__/git-failure.test.ts +198 -0
- package/src/shared/__tests__/git-internals.test.ts +156 -0
- package/src/shared/__tests__/http-errors.test.ts +42 -0
- package/src/shared/__tests__/logging.test.ts +185 -0
- package/src/shared/__tests__/path-containment.test.ts +60 -0
- package/src/shared/__tests__/pending-proposals.readAt.test.ts +102 -0
- package/src/shared/__tests__/printable.test.ts +64 -0
- package/src/shared/__tests__/redact-secret.test.ts +122 -0
- package/src/shared/__tests__/rename-no-replace.test.ts +466 -0
- package/src/shared/__tests__/ssrf.test.ts +20 -0
- package/src/shared/canonical-file-identity.ts +92 -0
- package/src/shared/domain-errors.ts +149 -0
- package/src/shared/email-identity.ts +38 -0
- package/src/shared/fs.contract.ts +225 -0
- package/src/shared/git-failure.ts +196 -0
- package/src/shared/git-internals.ts +179 -0
- package/src/shared/git.contract.ts +170 -0
- package/src/shared/http-errors.ts +36 -0
- package/src/shared/logger.contract.ts +141 -0
- package/src/shared/logging.ts +96 -0
- package/src/shared/path-containment.ts +34 -0
- package/src/shared/pending-proposals.ts +161 -0
- package/src/shared/printable.ts +68 -0
- package/src/shared/redact-secret.ts +118 -0
- package/src/shared/rename-no-replace.ts +386 -0
- package/src/shared/ssrf.ts +44 -16
- package/src/version.ts +10 -6
- package/dist/modules/access/access-errors.d.ts +0 -34
- package/dist/modules/access/access-errors.d.ts.map +0 -1
- package/dist/modules/access/access-errors.js +0 -40
- package/dist/modules/access/access-errors.js.map +0 -1
- package/dist/modules/access/access-splice.d.ts +0 -140
- package/dist/modules/access/access-splice.d.ts.map +0 -1
- package/dist/modules/access/access-splice.js +0 -389
- package/dist/modules/access/access-splice.js.map +0 -1
- package/dist/modules/access/group-files.d.ts +0 -83
- package/dist/modules/access/group-files.d.ts.map +0 -1
- package/dist/modules/access/group-files.js +0 -167
- package/dist/modules/access/group-files.js.map +0 -1
- package/dist/modules/access/kb-read-filter.d.ts +0 -41
- package/dist/modules/access/kb-read-filter.d.ts.map +0 -1
- package/dist/modules/access/kb-read-filter.js +0 -60
- package/dist/modules/access/kb-read-filter.js.map +0 -1
- package/dist/modules/access/render-roles-yaml.d.ts +0 -22
- package/dist/modules/access/render-roles-yaml.d.ts.map +0 -1
- package/dist/modules/access/render-roles-yaml.js +0 -56
- package/dist/modules/access/render-roles-yaml.js.map +0 -1
- package/dist/modules/access/roles-yaml-guard.d.ts +0 -56
- package/dist/modules/access/roles-yaml-guard.d.ts.map +0 -1
- package/dist/modules/access/roles-yaml-guard.js +0 -79
- package/dist/modules/access/roles-yaml-guard.js.map +0 -1
- package/dist/modules/diff/diff-paths.d.ts +0 -2
- package/dist/modules/diff/diff-paths.d.ts.map +0 -1
- package/dist/modules/diff/diff-paths.js +0 -9
- package/dist/modules/diff/diff-paths.js.map +0 -1
- package/dist/modules/groups/group-provision.service.d.ts +0 -130
- package/dist/modules/groups/group-provision.service.d.ts.map +0 -1
- package/dist/modules/groups/group-provision.service.js +0 -288
- package/dist/modules/groups/group-provision.service.js.map +0 -1
- package/dist/modules/groups/groups.contract.d.ts +0 -106
- package/dist/modules/groups/groups.contract.d.ts.map +0 -1
- package/dist/modules/groups/groups.contract.js +0 -36
- package/dist/modules/groups/groups.contract.js.map +0 -1
- package/dist/modules/groups/groups.routes.d.ts +0 -42
- package/dist/modules/groups/groups.routes.d.ts.map +0 -1
- package/dist/modules/groups/groups.routes.js +0 -379
- package/dist/modules/groups/groups.routes.js.map +0 -1
- package/dist/modules/groups/groups.service.d.ts +0 -60
- package/dist/modules/groups/groups.service.d.ts.map +0 -1
- package/dist/modules/groups/groups.service.js +0 -172
- package/dist/modules/groups/groups.service.js.map +0 -1
- package/dist/modules/groups/index.d.ts +0 -7
- package/dist/modules/groups/index.d.ts.map +0 -1
- package/dist/modules/groups/index.js +0 -6
- package/dist/modules/groups/index.js.map +0 -1
- package/dist/modules/groups/join-proposals.d.ts +0 -53
- package/dist/modules/groups/join-proposals.d.ts.map +0 -1
- package/dist/modules/groups/join-proposals.js +0 -67
- package/dist/modules/groups/join-proposals.js.map +0 -1
- package/dist/modules/groups/join-requests.service.d.ts +0 -81
- package/dist/modules/groups/join-requests.service.d.ts.map +0 -1
- package/dist/modules/groups/join-requests.service.js +0 -135
- package/dist/modules/groups/join-requests.service.js.map +0 -1
- package/dist/modules/mcp/mcp-session-store.d.ts +0 -74
- package/dist/modules/mcp/mcp-session-store.d.ts.map +0 -1
- package/dist/modules/mcp/mcp-session-store.js +0 -131
- package/dist/modules/mcp/mcp-session-store.js.map +0 -1
- package/dist/modules/workflow/file-change-notifier.d.ts +0 -38
- package/dist/modules/workflow/file-change-notifier.d.ts.map +0 -1
- package/dist/modules/workflow/file-change-notifier.js +0 -22
- package/dist/modules/workflow/file-change-notifier.js.map +0 -1
- package/dist/modules/workflow/git/branch-name.d.ts +0 -10
- package/dist/modules/workflow/git/branch-name.d.ts.map +0 -1
- package/dist/modules/workflow/git/branch-name.js +0 -76
- package/dist/modules/workflow/git/branch-name.js.map +0 -1
- package/dist/modules/workflow/git/clone-config.d.ts +0 -61
- package/dist/modules/workflow/git/clone-config.d.ts.map +0 -1
- package/dist/modules/workflow/git/clone-config.js +0 -69
- package/dist/modules/workflow/git/clone-config.js.map +0 -1
- package/dist/modules/workflow/git/mutex.d.ts +0 -11
- package/dist/modules/workflow/git/mutex.d.ts.map +0 -1
- package/dist/modules/workflow/git/mutex.js +0 -23
- package/dist/modules/workflow/git/mutex.js.map +0 -1
- package/dist/modules/workflow/locking-filesystem.d.ts +0 -137
- package/dist/modules/workflow/locking-filesystem.d.ts.map +0 -1
- package/dist/modules/workflow/locking-filesystem.js +0 -553
- package/dist/modules/workflow/locking-filesystem.js.map +0 -1
- package/dist/modules/workflow/read-only-filesystem.d.ts +0 -24
- package/dist/modules/workflow/read-only-filesystem.d.ts.map +0 -1
- package/dist/modules/workflow/read-only-filesystem.js +0 -39
- package/dist/modules/workflow/read-only-filesystem.js.map +0 -1
- package/dist/modules/workflow/workflow.errors.d.ts +0 -197
- package/dist/modules/workflow/workflow.errors.d.ts.map +0 -1
- package/dist/modules/workflow/workflow.errors.js +0 -298
- package/dist/modules/workflow/workflow.errors.js.map +0 -1
- package/dist/modules/workspace/bevel-ignore.d.ts.map +0 -1
- package/dist/modules/workspace/bevel-ignore.js.map +0 -1
- package/dist/modules/workspace/kb-seed.interface.d.ts +0 -36
- package/dist/modules/workspace/kb-seed.interface.d.ts.map +0 -1
- package/dist/modules/workspace/kb-seed.interface.js +0 -2
- package/dist/modules/workspace/kb-seed.interface.js.map +0 -1
- package/dist/modules/workspace/kb-seed.service.d.ts +0 -125
- package/dist/modules/workspace/kb-seed.service.d.ts.map +0 -1
- package/dist/modules/workspace/kb-seed.service.js +0 -535
- package/dist/modules/workspace/kb-seed.service.js.map +0 -1
- package/dist/modules/workspace/plugins-migration.d.ts +0 -50
- package/dist/modules/workspace/plugins-migration.d.ts.map +0 -1
- package/dist/modules/workspace/plugins-migration.js +0 -379
- package/dist/modules/workspace/plugins-migration.js.map +0 -1
- package/dist/shared/fs-errors.d.ts +0 -8
- package/dist/shared/fs-errors.d.ts.map +0 -1
- package/dist/shared/fs-errors.js +0 -11
- package/dist/shared/fs-errors.js.map +0 -1
- package/dist/shared/fs-walk.d.ts +0 -23
- package/dist/shared/fs-walk.d.ts.map +0 -1
- package/dist/shared/fs-walk.js +0 -42
- package/dist/shared/fs-walk.js.map +0 -1
- package/dist/shared/hash-email.d.ts +0 -11
- package/dist/shared/hash-email.d.ts.map +0 -1
- package/dist/shared/hash-email.js +0 -14
- package/dist/shared/hash-email.js.map +0 -1
- package/dist/shared/kb-walk.d.ts +0 -52
- package/dist/shared/kb-walk.d.ts.map +0 -1
- package/dist/shared/kb-walk.js +0 -76
- package/dist/shared/kb-walk.js.map +0 -1
- package/src/modules/diff/diff-paths.ts +0 -9
- package/src/modules/mcp/__tests__/mcp-session-store.test.ts +0 -151
- package/src/modules/mcp/__tests__/mcp.routes.session.test.ts +0 -226
- package/src/modules/mcp/mcp-session-store.ts +0 -162
- package/src/shared/__tests__/fs-walk.test.ts +0 -63
- package/src/shared/__tests__/kb-walk.test.ts +0 -107
- package/src/shared/fs-errors.ts +0 -10
- package/src/shared/fs-walk.ts +0 -45
- package/src/shared/hash-email.ts +0 -14
- package/src/shared/kb-walk.ts +0 -95
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import path from 'node:path';
|
|
2
|
+
import { createHash } from 'node:crypto';
|
|
3
|
+
import { logger } from '../../shared/logging.js';
|
|
4
|
+
const log = logger('tool-manuals');
|
|
2
5
|
import fs from 'node:fs/promises';
|
|
3
6
|
import { parse as parseYaml } from 'yaml';
|
|
4
7
|
import '@utcp/http'; // side effect: register the 'http' call-template type (http + inline sub-manuals)
|
|
@@ -9,22 +12,16 @@ import { containsCliCallTemplate } from './utcp-cli-parse-only.js';
|
|
|
9
12
|
import { UtcpManualSerializer, CallTemplateSerializer, DefaultVariableSubstitutor, } from '@utcp/sdk';
|
|
10
13
|
import { DEFAULT_BRANCH, PLUGINS_DIR, } from '@bevel-software/platform-shared';
|
|
11
14
|
import { descriptorsFromMcpJson } from './mcp-json-discovery.js';
|
|
12
|
-
import { KbPluginSource } from '../plugins/discovery/kb-plugin-source.js';
|
|
13
15
|
import { workspaceIdForBranch } from '../../shared/workspace-id.js';
|
|
14
16
|
import { assertSafeFetchUrl } from '../../shared/ssrf.js';
|
|
17
|
+
import { redactSecret } from '../../shared/redact-secret.js';
|
|
18
|
+
import { printable } from '../../shared/printable.js';
|
|
15
19
|
import { RESERVED_VARIABLE_NAMES, findReservedVariableRef } from '../../shared/variable-refs.js';
|
|
16
20
|
import { extractFrontmatter, resolveDeclaredId, isValidId, dedupeById } from '../../shared/frontmatter-id.js';
|
|
17
|
-
import { walkFiles } from '../../shared/fs-walk.js';
|
|
18
21
|
import { TtlCache } from '../../shared/ttl-cache.js';
|
|
19
22
|
import { utcpNamespacePrefix, utcpNamespacedKey, MCP_OAUTH_VAR, INTERNAL_MANUAL_NAME, } from '../../shared/utcp-namespace.js';
|
|
20
|
-
import { EXTERNAL_KB_MANUAL_NAME, } from './tool-manuals.contract.js';
|
|
23
|
+
import { EXTERNAL_KB_MANUAL_NAME, MAX_CAPABILITIES, } from './tool-manuals.contract.js';
|
|
21
24
|
const CACHE_TTL_MS = 60_000;
|
|
22
|
-
/**
|
|
23
|
-
* How many embedded tools a manual may advertise on the tool page. A `.tool` is
|
|
24
|
-
* author-written, so its `tools` array is unbounded input; the page renders one
|
|
25
|
-
* bullet per entry, and a thousand of them is a broken page, not a useful one.
|
|
26
|
-
*/
|
|
27
|
-
const MAX_CAPABILITIES = 100;
|
|
28
25
|
/**
|
|
29
26
|
* UTCP namespaces a user `.tool` may NOT claim: they belong to built-in manuals
|
|
30
27
|
* whose loopback creds are pre-seeded on the agent's code-mode client (the
|
|
@@ -47,15 +44,93 @@ const RESERVED_TOOL_NAMESPACES = [INTERNAL_MANUAL_NAME, EXTERNAL_KB_MANUAL_NAME]
|
|
|
47
44
|
* reference grammar live in `shared/variable-refs.ts` — one definition for
|
|
48
45
|
* every boundary that classifies references.
|
|
49
46
|
*/
|
|
50
|
-
/**
|
|
51
|
-
|
|
47
|
+
/**
|
|
48
|
+
* Throw if any string in the `.tool` document references a reserved variable.
|
|
49
|
+
*
|
|
50
|
+
* `ref` is named because it is OURS — one of `RESERVED_VARIABLE_NAMES`, matched
|
|
51
|
+
* from a fixed list rather than copied out of the file. That is the line every
|
|
52
|
+
* refusal here holds: see {@link describeManualFault}.
|
|
53
|
+
*/
|
|
54
|
+
function assertNoReservedVariableRefs(doc) {
|
|
52
55
|
const ref = findReservedVariableRef(doc);
|
|
53
56
|
if (ref !== null) {
|
|
54
|
-
throw new Error(
|
|
57
|
+
throw new Error(`this \`.tool\` references the reserved variable "${ref}" — ` +
|
|
55
58
|
'API_URL and CONNECTION_KEY (bare or namespaced, e.g. `<namespace>_CONNECTION_KEY`) ' +
|
|
56
59
|
'are seeded by the platform for its own manuals and may not appear anywhere in a `.tool`.');
|
|
57
60
|
}
|
|
58
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* How much of a validation message may reach a listing. Long enough for every
|
|
64
|
+
* sentence the normalizer writes; short enough that a message which interpolated
|
|
65
|
+
* a chunk of the file (`unknown \`.tool\` type: <whatever was written there>`)
|
|
66
|
+
* cannot smuggle a pasted credential out one character at a time.
|
|
67
|
+
*/
|
|
68
|
+
const MAX_REASON_LENGTH = 300;
|
|
69
|
+
/**
|
|
70
|
+
* Why one `.tool` was refused, in a form safe to hand an agent, a browser and a
|
|
71
|
+
* log — the `reason` of an {@link InvalidToolManual}.
|
|
72
|
+
*
|
|
73
|
+
* This is the LAST of two defences, not the only one. The first is upstream and
|
|
74
|
+
* structural, and it is the one that carries the guarantee:
|
|
75
|
+
*
|
|
76
|
+
* A REASON REPEATS NOTHING THE FILE SAID.
|
|
77
|
+
*
|
|
78
|
+
* Every refusal this module writes locates the fault — a field name we chose
|
|
79
|
+
* (`` `id` ``, `` `healthCheck.url` ``), an ordinal (`` `variables[2].scope` ``,
|
|
80
|
+
* `` `headers` entry 3 of 4 ``) — and states the rule. It never interpolates
|
|
81
|
+
* what was written there, and that includes text which passed a check: a name
|
|
82
|
+
* matching `[A-Za-z0-9_]+` is a legal identifier, not a string we may repeat,
|
|
83
|
+
* and a token spelled with underscores matches it. The only author-derived
|
|
84
|
+
* strings named anywhere are ones matched against a FIXED list of ours (a
|
|
85
|
+
* reserved variable, a reserved namespace), where saying which one was hit
|
|
86
|
+
* teaches nothing the platform did not already publish.
|
|
87
|
+
*
|
|
88
|
+
* It has to be that way round — no scrub can recognise an arbitrary
|
|
89
|
+
* author-chosen string as a credential, so a message that interpolates one
|
|
90
|
+
* cannot be made safe after the fact. What remains for this function is the
|
|
91
|
+
* text the process does NOT author: the YAML parser's, which quotes the file at
|
|
92
|
+
* its fault.
|
|
93
|
+
*
|
|
94
|
+
* Two things happen here, and both are about NOT echoing the file back.
|
|
95
|
+
*
|
|
96
|
+
* 1. A `YAMLParseError`'s `message` ends with a SOURCE SNIPPET: the offending
|
|
97
|
+
* lines, verbatim, under a caret. A `.tool` is content an author may have
|
|
98
|
+
* pasted a literal token into (`Authorization: Bearer <a real key>`), and
|
|
99
|
+
* the line that fails to parse is as likely to be that one as any other.
|
|
100
|
+
* So only the message's first line survives — the parser's own prose — and
|
|
101
|
+
* the location is re-stated from `linePos`, which is numbers, not text.
|
|
102
|
+
* 2. Everything is then run through `redactSecret` and capped. The normalizer's
|
|
103
|
+
* own messages quote a url on an SSRF refusal, and a url can carry
|
|
104
|
+
* `user:pass@host` or a presigned query; that is precisely what the shared
|
|
105
|
+
* scrub takes out, and reusing it is what keeps one definition of "this must
|
|
106
|
+
* not reach a log" for the whole backend.
|
|
107
|
+
*
|
|
108
|
+
* What remains of the parser's prose still interpolates the odd token (`Missing
|
|
109
|
+
* , between flow map items`, `Unexpected , in flow collection`) — a structural
|
|
110
|
+
* character or a token type, never a value line. That is the point of the cut:
|
|
111
|
+
* the fault is described, the file is not quoted.
|
|
112
|
+
*/
|
|
113
|
+
export function describeManualFault(err) {
|
|
114
|
+
const raw = err instanceof Error ? err.message : String(err);
|
|
115
|
+
// `linePos` is the `yaml` package's own location, on the error object — the
|
|
116
|
+
// authority for WHERE, so the snippet never has to be read to find out.
|
|
117
|
+
const pos = err?.linePos?.[0];
|
|
118
|
+
// The prose, snippet dropped. `yaml` appends ` at line N, column M:` to it as
|
|
119
|
+
// the snippet's header; drop that too, since the location is restated below
|
|
120
|
+
// in a form that does not depend on the parser's phrasing.
|
|
121
|
+
const prose = raw.split('\n')[0].replace(/ at line \d+, column \d+:?$/, '').trim();
|
|
122
|
+
const located = pos ? `${prose} (line ${pos.line}, column ${pos.col})` : prose;
|
|
123
|
+
const scrubbed = redactSecret(located);
|
|
124
|
+
return scrubbed.length > MAX_REASON_LENGTH ? `${scrubbed.slice(0, MAX_REASON_LENGTH - 1)}…` : scrubbed;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* The empty answer — a workspace that isn't there yet, or a caller who may read
|
|
128
|
+
* nothing. A FUNCTION, not a shared constant: the arrays in a scan result are
|
|
129
|
+
* handed to decoration passes and to the cache, and a single frozen-by-
|
|
130
|
+
* convention instance is one push away from every empty scan in the process
|
|
131
|
+
* inheriting another's contents.
|
|
132
|
+
*/
|
|
133
|
+
const emptyScan = () => ({ manuals: [], invalid: [] });
|
|
59
134
|
const manualSerializer = new UtcpManualSerializer();
|
|
60
135
|
const callTemplateSerializer = new CallTemplateSerializer();
|
|
61
136
|
// `findRequiredVariables` is a pure walk — one shared instance is fine.
|
|
@@ -71,15 +146,39 @@ export class ToolManualService {
|
|
|
71
146
|
workspaceService;
|
|
72
147
|
accessControl;
|
|
73
148
|
kbDirName;
|
|
149
|
+
disk;
|
|
74
150
|
source;
|
|
75
151
|
cache;
|
|
76
152
|
mcpAuthDiscovery;
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
153
|
+
/**
|
|
154
|
+
* The refused set as it was last written to the log, so the warnings are
|
|
155
|
+
* logged ONCE PER CHANGE rather than once per scan. A broken `.tool` sits
|
|
156
|
+
* there until someone fixes it, and the catalog is re-scanned every minute on
|
|
157
|
+
* every surface — repeating the same three lines forever buries the scan that
|
|
158
|
+
* actually changed something. `null` until the first scan, so the first state
|
|
159
|
+
* is always reported.
|
|
160
|
+
*/
|
|
161
|
+
loggedInvalid = null;
|
|
162
|
+
/**
|
|
163
|
+
* The scan currently running, shared by everyone who asks while it runs.
|
|
164
|
+
*
|
|
165
|
+
* The TTL cache only holds a value once the scan RETURNS, so without this
|
|
166
|
+
* every caller arriving during the walk starts its own — and a listing that
|
|
167
|
+
* wants both halves of the catalog is exactly such a pair, as is a page that
|
|
168
|
+
* fires two requests. Sharing the promise makes one cold listing one disk
|
|
169
|
+
* walk, one MCP-discovery pass, and ONE snapshot for every reader of it.
|
|
170
|
+
* Cleared by `invalidate()` as well as on settle, so a caller arriving after
|
|
171
|
+
* a merge never inherits a scan that started on the tree it replaced — the
|
|
172
|
+
* same rule `TtlCache`'s generation token enforces for the cached value.
|
|
173
|
+
*/
|
|
174
|
+
inFlightScan = null;
|
|
175
|
+
constructor(workspaceService, accessControl, kbDirName, disk,
|
|
176
|
+
/** Where plugins (and their MCP servers) come from — the one discovery every catalog shares. */
|
|
177
|
+
source, now = Date.now) {
|
|
80
178
|
this.workspaceService = workspaceService;
|
|
81
179
|
this.accessControl = accessControl;
|
|
82
180
|
this.kbDirName = kbDirName;
|
|
181
|
+
this.disk = disk;
|
|
83
182
|
this.source = source;
|
|
84
183
|
this.cache = new TtlCache(CACHE_TTL_MS, now);
|
|
85
184
|
}
|
|
@@ -94,12 +193,20 @@ export class ToolManualService {
|
|
|
94
193
|
}
|
|
95
194
|
invalidate() {
|
|
96
195
|
this.cache.invalidate();
|
|
196
|
+
this.inFlightScan = null;
|
|
97
197
|
}
|
|
98
198
|
async listAccessible(userEmail) {
|
|
99
199
|
return (await this.accessibleManuals(userEmail)).map(toSummary);
|
|
100
200
|
}
|
|
201
|
+
async listAccessibleCatalog(userEmail) {
|
|
202
|
+
const { manuals, invalid } = await this.accessibleScan(userEmail);
|
|
203
|
+
return { tools: manuals.map(toSummary), invalid };
|
|
204
|
+
}
|
|
101
205
|
async listAllSummaries() {
|
|
102
|
-
return (await this.scan()).map(toSummary);
|
|
206
|
+
return (await this.scan()).manuals.map(toSummary);
|
|
207
|
+
}
|
|
208
|
+
async catalogFingerprints(userEmail) {
|
|
209
|
+
return (await this.accessibleManuals(userEmail)).map(manualFingerprint);
|
|
103
210
|
}
|
|
104
211
|
async getDetail(userEmail, slug) {
|
|
105
212
|
// Resolved through `accessibleManuals` rather than `scan()` + a canRead call
|
|
@@ -119,13 +226,44 @@ export class ToolManualService {
|
|
|
119
226
|
const manuals = await this.accessibleManuals(userEmail);
|
|
120
227
|
return manuals.filter((m) => m.remote === false).map((m) => ({ slug: m.slug, name: m.name, path: m.path }));
|
|
121
228
|
}
|
|
229
|
+
async listDeclaredOnlyOnBranch(userEmail, branch) {
|
|
230
|
+
if (!branch || branch === DEFAULT_BRANCH)
|
|
231
|
+
return [];
|
|
232
|
+
// Only a draft this process already holds a clone of — the one the caller
|
|
233
|
+
// wrote the declaration on. `scanDisk` would otherwise BOOTSTRAP any branch
|
|
234
|
+
// name a caller sends, before the read gate below has had a say: a clone
|
|
235
|
+
// and a fetch per guessed, private or nonexistent branch. A declaration on
|
|
236
|
+
// a branch nobody has checked out here is nothing this answer can report.
|
|
237
|
+
if (!(await this.workspaceService.hasBootstrappedWorkspace(workspaceIdForBranch(branch))))
|
|
238
|
+
return [];
|
|
239
|
+
// Names and paths only — `scanDisk` never probes a server, so asking about
|
|
240
|
+
// a draft costs no network and registers no OAuth client for a declaration
|
|
241
|
+
// that may never be merged.
|
|
242
|
+
const onBranch = (await this.scanDisk(branch)).manuals;
|
|
243
|
+
if (onBranch.length === 0)
|
|
244
|
+
return [];
|
|
245
|
+
// Compared by NAMESPACE, the catalog's own identity (see the dedupe in
|
|
246
|
+
// `scanDisk`): a draft entry whose namespace the default branch already
|
|
247
|
+
// serves is an edit of a live tool, not a tool missing from the catalog.
|
|
248
|
+
const released = new Set((await this.scan()).manuals.map((m) => utcpNamespacePrefix(m.name)));
|
|
249
|
+
const pending = onBranch.filter((m) => !released.has(utcpNamespacePrefix(m.name)));
|
|
250
|
+
if (pending.length === 0)
|
|
251
|
+
return [];
|
|
252
|
+
// Read-gated on the BRANCH's workspace, where the declaration lives — the
|
|
253
|
+
// same default-deny rule as the catalog, so this can't reveal a draft file
|
|
254
|
+
// the caller could not open with `read_file`.
|
|
255
|
+
const allowed = await this.accessControl.canReadBatch(workspaceIdForBranch(branch), userEmail, pending.map((m) => m.path));
|
|
256
|
+
return pending
|
|
257
|
+
.filter((m) => allowed.get(m.path) === true)
|
|
258
|
+
.map((m) => ({ name: m.name, path: m.path, type: m.type }));
|
|
259
|
+
}
|
|
122
260
|
async userScopedKeysForManual(manualName) {
|
|
123
261
|
// The per-user (`user`-scoped) variables a manual declares, keyed the SAME
|
|
124
262
|
// way the vault stores them — the UTCP-namespaced key (underscores in the
|
|
125
263
|
// manual name doubled), so a readiness check reads the exact rows `resolve`
|
|
126
264
|
// would. `oauth` lets the pre-check treat a not-yet-authorized sign-in as
|
|
127
265
|
// still-missing.
|
|
128
|
-
const manual = (await this.scan()).find((m) => m.name === manualName);
|
|
266
|
+
const manual = (await this.scan()).manuals.find((m) => m.name === manualName);
|
|
129
267
|
return (manual?.variables ?? [])
|
|
130
268
|
.filter((v) => v.scope === 'user')
|
|
131
269
|
.map((v) => ({
|
|
@@ -145,7 +283,7 @@ export class ToolManualService {
|
|
|
145
283
|
// the LONGEST prefix so a manual `a` can't shadow `a_b` when both exist. (A
|
|
146
284
|
// plain first-underscore split would mis-parse a snake_case manual name.)
|
|
147
285
|
let best = null;
|
|
148
|
-
for (const m of await this.scan()) {
|
|
286
|
+
for (const m of (await this.scan()).manuals) {
|
|
149
287
|
const prefix = utcpNamespacePrefix(m.name);
|
|
150
288
|
if (effectiveKey.startsWith(prefix) && (!best || prefix.length > best.len)) {
|
|
151
289
|
best = { manual: m, varName: effectiveKey.slice(prefix.length), len: prefix.length };
|
|
@@ -185,7 +323,7 @@ export class ToolManualService {
|
|
|
185
323
|
callTemplate = callTemplateSerializer.validateDict(this.buildCallTemplateDict(m));
|
|
186
324
|
}
|
|
187
325
|
catch (err) {
|
|
188
|
-
|
|
326
|
+
log.warn(`no valid call template for "${m.path}": ${err instanceof Error ? err.message : String(err)}`);
|
|
189
327
|
}
|
|
190
328
|
}
|
|
191
329
|
return { name: m.name, type: m.type, remote: m.remote, healthCheck: m.healthCheck, callTemplate };
|
|
@@ -204,13 +342,13 @@ export class ToolManualService {
|
|
|
204
342
|
catch (err) {
|
|
205
343
|
// A `.tool` that produces an invalid call-template is dropped here — at
|
|
206
344
|
// the producing boundary — so the served list is always valid.
|
|
207
|
-
|
|
345
|
+
log.warn(`skipping "${m.path}": ${err instanceof Error ? err.message : String(err)}`);
|
|
208
346
|
}
|
|
209
347
|
}
|
|
210
348
|
return out;
|
|
211
349
|
}
|
|
212
350
|
async resolveInlineManual(userEmail, slug) {
|
|
213
|
-
const found = (await this.scan()).find((m) => m.slug === slug);
|
|
351
|
+
const found = (await this.scan()).manuals.find((m) => m.slug === slug);
|
|
214
352
|
if (!found || found.type !== 'inline')
|
|
215
353
|
return null;
|
|
216
354
|
const wsId = workspaceIdForBranch(DEFAULT_BRANCH);
|
|
@@ -328,30 +466,87 @@ export class ToolManualService {
|
|
|
328
466
|
};
|
|
329
467
|
}
|
|
330
468
|
async accessibleManuals(userEmail) {
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
469
|
+
return (await this.accessibleScan(userEmail)).manuals;
|
|
470
|
+
}
|
|
471
|
+
/**
|
|
472
|
+
* The scan cut to what this caller may read — manuals AND refusals, through
|
|
473
|
+
* ONE `canReadBatch`. Both halves are paths in the same workspace judged by
|
|
474
|
+
* the same rule, and splitting them into two calls would pay a second
|
|
475
|
+
* round-trip to ask the same question.
|
|
476
|
+
*/
|
|
477
|
+
async accessibleScan(userEmail) {
|
|
478
|
+
const { manuals, invalid } = await this.scan();
|
|
479
|
+
if (manuals.length === 0 && invalid.length === 0)
|
|
480
|
+
return emptyScan();
|
|
334
481
|
const wsId = workspaceIdForBranch(DEFAULT_BRANCH);
|
|
335
|
-
const allowed = await this.accessControl.canReadBatch(wsId, userEmail,
|
|
336
|
-
|
|
482
|
+
const allowed = await this.accessControl.canReadBatch(wsId, userEmail, [
|
|
483
|
+
...new Set([...manuals.map((m) => m.path), ...invalid.map((i) => i.path)]),
|
|
484
|
+
]);
|
|
485
|
+
// Fail closed: keep an entry only on an explicit `true` verdict (a missing
|
|
337
486
|
// entry is treated as denied, matching the KB's default-deny read model).
|
|
338
|
-
|
|
487
|
+
// A REFUSED file is gated the same way a listed one is: its path is a fact
|
|
488
|
+
// about the knowledge base, and "there is a broken tool at this path" is
|
|
489
|
+
// not something to tell someone who may not read that path.
|
|
490
|
+
return {
|
|
491
|
+
manuals: manuals.filter((m) => allowed.get(m.path) === true),
|
|
492
|
+
invalid: invalid.filter((i) => allowed.get(i.path) === true),
|
|
493
|
+
};
|
|
339
494
|
}
|
|
340
495
|
async scan() {
|
|
341
496
|
const cached = this.cache.get();
|
|
342
497
|
if (cached)
|
|
343
498
|
return cached;
|
|
499
|
+
// See `inFlightScan`: the cache is populated only when the walk finishes,
|
|
500
|
+
// so between the miss above and that moment, callers share this promise
|
|
501
|
+
// instead of each starting a walk of their own.
|
|
502
|
+
if (this.inFlightScan)
|
|
503
|
+
return this.inFlightScan;
|
|
504
|
+
const started = this.runScan().finally(() => {
|
|
505
|
+
// Only if it is still OURS: an `invalidate()` during the scan already
|
|
506
|
+
// cleared the field (and may have installed a newer scan), and this
|
|
507
|
+
// settle must not undo that.
|
|
508
|
+
if (this.inFlightScan === started)
|
|
509
|
+
this.inFlightScan = null;
|
|
510
|
+
});
|
|
511
|
+
this.inFlightScan = started;
|
|
512
|
+
return started;
|
|
513
|
+
}
|
|
514
|
+
async runScan() {
|
|
344
515
|
// See `TtlCache.begin`: taken before the read so an `invalidate()` that
|
|
345
516
|
// lands mid-scan discards this result instead of being overwritten by it.
|
|
346
517
|
const token = this.cache.begin();
|
|
347
|
-
const manuals = await this.scanDisk();
|
|
518
|
+
const { manuals, invalid } = await this.scanDisk();
|
|
348
519
|
await this.decorateMcpOAuth(manuals);
|
|
349
520
|
// AFTER the oauth decoration, so an injected `${MCP_OAUTH}` header ref is
|
|
350
521
|
// already declared and isn't re-surfaced as a bare admin key.
|
|
351
522
|
for (const m of manuals)
|
|
352
523
|
this.surfaceReferencedVariables(m);
|
|
353
|
-
|
|
354
|
-
|
|
524
|
+
const result = { manuals, invalid };
|
|
525
|
+
this.cache.set(result, token);
|
|
526
|
+
return result;
|
|
527
|
+
}
|
|
528
|
+
/**
|
|
529
|
+
* Say what the scan refused — once per CHANGE, not once per scan. Every
|
|
530
|
+
* surface re-scans on its own TTL, so a file that stays broken would
|
|
531
|
+
* otherwise repeat these lines in the log forever and drown the scan where
|
|
532
|
+
* something actually moved. A fixed file is worth a line too: the set going
|
|
533
|
+
* empty is the recovery, said out loud.
|
|
534
|
+
*/
|
|
535
|
+
logInvalidOnChange(invalid) {
|
|
536
|
+
const signature = JSON.stringify(invalid);
|
|
537
|
+
if (signature === this.loggedInvalid)
|
|
538
|
+
return;
|
|
539
|
+
const first = this.loggedInvalid === null;
|
|
540
|
+
this.loggedInvalid = signature;
|
|
541
|
+
// Both halves are author-written — a KB filename and a parser's words about
|
|
542
|
+
// a KB file — so both go through `printable`: a newline in either would
|
|
543
|
+
// otherwise forge a second log line, and an escape sequence would paint the
|
|
544
|
+
// operator's terminal.
|
|
545
|
+
// (`printable` quotes what it escapes, so the path keeps its quotes here.)
|
|
546
|
+
for (const i of invalid)
|
|
547
|
+
log.warn(`skipping ${printable(i.path)}: ${printable(i.reason)}`);
|
|
548
|
+
if (invalid.length === 0 && !first)
|
|
549
|
+
log.info('every `.tool` in the catalog parses again.');
|
|
355
550
|
}
|
|
356
551
|
/**
|
|
357
552
|
* Auto-surface every `${VAR}` a manual actually references, for ANY tool
|
|
@@ -489,7 +684,7 @@ export class ToolManualService {
|
|
|
489
684
|
}
|
|
490
685
|
catch (err) {
|
|
491
686
|
// Discovery must never break the catalog — the tool just stays bare.
|
|
492
|
-
|
|
687
|
+
log.warn(`mcp auth discovery failed for "${m.path}": ${err instanceof Error ? err.message : String(err)}`);
|
|
493
688
|
}
|
|
494
689
|
}),
|
|
495
690
|
]);
|
|
@@ -540,23 +735,36 @@ export class ToolManualService {
|
|
|
540
735
|
catch (err) {
|
|
541
736
|
// Never break the catalog — the sign-in just isn't ready yet.
|
|
542
737
|
const msg = err instanceof Error ? err.message : String(err);
|
|
543
|
-
|
|
738
|
+
log.warn(`sign-in endpoint discovery failed for "${m.path}": ${msg}`);
|
|
544
739
|
m.setup = { kind: 'oauth-manual', reason: `sign-in endpoint discovery failed: ${msg}` };
|
|
545
740
|
}
|
|
546
741
|
}
|
|
547
|
-
|
|
742
|
+
/**
|
|
743
|
+
* Parse every declaration on `branch`'s workspace — the default branch for
|
|
744
|
+
* the catalog, a draft for `listDeclaredOnlyOnBranch`. Pure disk: no
|
|
745
|
+
* discovery, no access filter; callers add what their surface needs.
|
|
746
|
+
*
|
|
747
|
+
* ONE FILE'S FAULT IS ONE FILE'S FAULT. Every per-manual step below is
|
|
748
|
+
* contained — read, parse, validate, and the namespace dedup — so the answer
|
|
749
|
+
* is always "here is every manual that parses, and here is what the rest got
|
|
750
|
+
* wrong". There is no path through this loop on which a single bad `.tool`
|
|
751
|
+
* costs the catalog a manual that is fine, and nothing is remembered between
|
|
752
|
+
* calls: a refusal lives only in the scan it came from, so a fixed file is a
|
|
753
|
+
* valid manual on the very next scan.
|
|
754
|
+
*/
|
|
755
|
+
async scanDisk(branch = DEFAULT_BRANCH) {
|
|
548
756
|
let wsId;
|
|
549
757
|
try {
|
|
550
|
-
wsId = (await this.workspaceService.getOrCreateForBranch(
|
|
758
|
+
wsId = (await this.workspaceService.getOrCreateForBranch(branch)).id;
|
|
551
759
|
}
|
|
552
760
|
catch {
|
|
553
|
-
return
|
|
761
|
+
return emptyScan();
|
|
554
762
|
}
|
|
555
763
|
const kbRoot = path.join(await this.workspaceService.getWorkspacePath(wsId), this.kbDirName);
|
|
556
764
|
// A `.tool` sits under `Plugins/`, beside the skills that use it.
|
|
557
765
|
const files = [];
|
|
558
766
|
const root = path.join(kbRoot, PLUGINS_DIR);
|
|
559
|
-
for (const rel of await walkFiles(root, (n) => n.toLowerCase().endsWith('.tool'))) {
|
|
767
|
+
for (const rel of await this.disk.walkFiles(root, (n) => n.toLowerCase().endsWith('.tool'))) {
|
|
560
768
|
files.push({ abs: path.join(root, rel), rel: `${PLUGINS_DIR}/${rel}` });
|
|
561
769
|
}
|
|
562
770
|
// MCP servers come from each plugin's mcp.json — the AUTHORITATIVE source
|
|
@@ -571,27 +779,58 @@ export class ToolManualService {
|
|
|
571
779
|
for (const plugin of discovered.plugins) {
|
|
572
780
|
if (plugin.mcpJsonText === null)
|
|
573
781
|
continue; // no servers is the common case, not an error
|
|
574
|
-
|
|
782
|
+
// One stamp for every server the file declares: the two texts together
|
|
783
|
+
// are the whole source of these descriptors, so any edit to either
|
|
784
|
+
// (a URL, a header, an added or dropped server, a `local: true` flip)
|
|
785
|
+
// moves every server's digest — which is correct, if slightly generous.
|
|
786
|
+
const from = sourceDigest(plugin.mcpJsonText + '\u0000' + (plugin.manifestText ?? ''));
|
|
787
|
+
for (const d of descriptorsFromMcpJson(plugin.relFolder, plugin.mcpJsonText, plugin.manifestText)) {
|
|
788
|
+
d.sourceRevision = from;
|
|
789
|
+
parsed.push(d);
|
|
790
|
+
}
|
|
575
791
|
}
|
|
792
|
+
const invalid = [];
|
|
576
793
|
for (const f of files) {
|
|
577
794
|
let content;
|
|
578
795
|
try {
|
|
579
796
|
content = await fs.readFile(f.abs, 'utf-8');
|
|
580
797
|
}
|
|
581
|
-
catch {
|
|
798
|
+
catch (err) {
|
|
799
|
+
// Not a malformed manual — a file the walk saw and the read could not
|
|
800
|
+
// open (deleted under us, a permission fault). Reported like one anyway:
|
|
801
|
+
// to the person looking for their tool, "it isn't here" needs a reason
|
|
802
|
+
// whichever step lost it.
|
|
803
|
+
//
|
|
804
|
+
// The CODE, not the message: an fs error quotes the absolute path it
|
|
805
|
+
// tried, which is this server's disk layout rather than anything about
|
|
806
|
+
// the knowledge base, and this string is handed to agents and browsers.
|
|
807
|
+
const code = err?.code;
|
|
808
|
+
invalid.push({
|
|
809
|
+
path: f.rel,
|
|
810
|
+
reason: `the file could not be read${code ? ` (${code})` : ''} — it may have just been moved or deleted.`,
|
|
811
|
+
});
|
|
582
812
|
continue;
|
|
583
813
|
}
|
|
584
814
|
let descriptor;
|
|
585
815
|
try {
|
|
586
816
|
descriptor = normalizeToolManual(baseName(f.rel), f.rel, content);
|
|
587
817
|
}
|
|
588
|
-
catch {
|
|
589
|
-
// A malformed `.tool` is skipped rather than breaking the catalog
|
|
818
|
+
catch (err) {
|
|
819
|
+
// A malformed `.tool` is skipped rather than breaking the catalog —
|
|
820
|
+
// and NAMED, rather than vanishing. Skipping in silence is the same
|
|
821
|
+
// outage from where the author stands: the tool is gone from every
|
|
822
|
+
// listing, with nothing anywhere saying which file or why.
|
|
823
|
+
invalid.push({ path: f.rel, reason: describeManualFault(err) });
|
|
590
824
|
continue;
|
|
591
825
|
}
|
|
592
826
|
// The route slug IS the id (unique after dedup below, snake_case → URL-safe),
|
|
593
827
|
// so the URL a user sees matches the tool's declared identity.
|
|
594
828
|
descriptor.slug = descriptor.name;
|
|
829
|
+
// Stamped from the BYTES, here, before `decorateMcpOAuth` and
|
|
830
|
+
// `surfaceReferencedVariables` mutate the descriptor: those two derive
|
|
831
|
+
// from the network and from the file respectively, and a digest taken
|
|
832
|
+
// afterwards would move whenever an OAuth probe happened to fail.
|
|
833
|
+
descriptor.sourceRevision = sourceDigest(content);
|
|
595
834
|
parsed.push(descriptor);
|
|
596
835
|
}
|
|
597
836
|
// The manual name (= its id) is the UTCP variable namespace secrets bind to, so
|
|
@@ -607,12 +846,65 @@ export class ToolManualService {
|
|
|
607
846
|
// cannot contain a hyphen, but an mcp.json server name can, so the pair is
|
|
608
847
|
// reachable — and the consequence is that two manuals share one set of
|
|
609
848
|
// vault keys, with either able to resolve the other's secrets.
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
849
|
+
const manuals = dedupeById(parsed, (m) => utcpNamespacePrefix(m.name), (m) =>
|
|
850
|
+
// A collision drops a manual from every surface just as surely as a parse
|
|
851
|
+
// error does, so it is reported the same way rather than only reaching a
|
|
852
|
+
// log that nobody browsing the catalog can see.
|
|
853
|
+
invalid.push({
|
|
854
|
+
path: m.path,
|
|
855
|
+
// Neither the manual's name nor the namespace it resolved to is
|
|
856
|
+
// repeated: both are the author's text put through a transform, and a
|
|
857
|
+
// reason carries none of it (see `describeManualFault`). `path` says
|
|
858
|
+
// which file, and the rule says what to look for in it.
|
|
859
|
+
reason: 'this manual resolves to a secret-variable namespace another manual already uses. ' +
|
|
860
|
+
'Names differing only in `-` vs `_` share one namespace — rename one of them.',
|
|
861
|
+
}));
|
|
862
|
+
// Sorted so the refused set is a stable VALUE: the change-detecting log
|
|
863
|
+
// below compares one scan against the last, and two orderings of the same
|
|
864
|
+
// three faults are not a change worth repeating.
|
|
865
|
+
invalid.sort((a, b) => a.path.localeCompare(b.path));
|
|
866
|
+
// Only the CATALOG's scan talks. `listDeclaredOnlyOnBranch` re-scans a
|
|
867
|
+
// draft workspace, and a draft's half-written `.tool` is not news about the
|
|
868
|
+
// served catalog — it would also flap the log every time an agent saves.
|
|
869
|
+
if (branch === DEFAULT_BRANCH)
|
|
870
|
+
this.logInvalidOnChange(invalid);
|
|
871
|
+
return { manuals, invalid };
|
|
613
872
|
}
|
|
614
873
|
}
|
|
615
874
|
// --- helpers ------------------------------------------------------------------
|
|
875
|
+
/**
|
|
876
|
+
* A short digest of the text a descriptor was parsed from. Truncated because
|
|
877
|
+
* this is only ever compared for equality, and 128 bits of it is far past what
|
|
878
|
+
* a per-workspace catalog could collide in.
|
|
879
|
+
*/
|
|
880
|
+
function sourceDigest(text) {
|
|
881
|
+
return createHash('sha256').update(text).digest('hex').slice(0, 32);
|
|
882
|
+
}
|
|
883
|
+
/**
|
|
884
|
+
* One manual's line in the catalog fingerprint: what makes it the tool it is,
|
|
885
|
+
* plus the digest of the file it came from.
|
|
886
|
+
*
|
|
887
|
+
* The named fields rather than the whole descriptor, deliberately: `setup` and
|
|
888
|
+
* `variables` carry OAuth auto-discovery results, which are re-probed on every
|
|
889
|
+
* scan and can differ between two scans of an unchanged file — hashing them
|
|
890
|
+
* would report a catalog change that no commit made. `sourceRevision` is what
|
|
891
|
+
* covers everything else the file says, so nothing is lost by leaving the
|
|
892
|
+
* decorated fields out.
|
|
893
|
+
*/
|
|
894
|
+
function manualFingerprint(m) {
|
|
895
|
+
return [
|
|
896
|
+
m.slug,
|
|
897
|
+
m.name,
|
|
898
|
+
m.path,
|
|
899
|
+
m.type,
|
|
900
|
+
m.remote === false ? 'local' : 'remote',
|
|
901
|
+
m.description ?? '',
|
|
902
|
+
m.sourceRevision ?? '',
|
|
903
|
+
// NUL-joined, like the skill lines this sits beside: no field can contain
|
|
904
|
+
// one, so two different manuals can never render the same line by having
|
|
905
|
+
// a separator inside one of their own fields.
|
|
906
|
+
].join('\u0000');
|
|
907
|
+
}
|
|
616
908
|
/**
|
|
617
909
|
* The one descriptor → summary projection, shared by every list surface
|
|
618
910
|
* (`listAccessible`, `listAllSummaries`, and the summary half of `getDetail`).
|
|
@@ -656,7 +948,15 @@ function capabilitiesOf(m) {
|
|
|
656
948
|
}
|
|
657
949
|
return out;
|
|
658
950
|
}
|
|
659
|
-
|
|
951
|
+
/**
|
|
952
|
+
* A `.tool` file's PROVISIONAL slug — its filename without the extension, which
|
|
953
|
+
* is what `normalizeToolManual` falls back to when the frontmatter names
|
|
954
|
+
* nothing. It is not the served id: `scanDisk` overwrites `slug` with the
|
|
955
|
+
* resolved manual `name` just below. Exported for the pending-tool surface,
|
|
956
|
+
* which parses a `.tool` read at a change request's branch and must feed the
|
|
957
|
+
* parser the same provisional value — and then resolve the slug the same way.
|
|
958
|
+
*/
|
|
959
|
+
export function baseName(rel) {
|
|
660
960
|
const base = rel.slice(rel.lastIndexOf('/') + 1);
|
|
661
961
|
return base.replace(/\.tool$/i, '');
|
|
662
962
|
}
|
|
@@ -712,7 +1012,12 @@ export function normalizeToolManual(provisionalSlug, repoPath, content) {
|
|
|
712
1012
|
let name;
|
|
713
1013
|
if (explicitId) {
|
|
714
1014
|
if (!isValidId(explicitId)) {
|
|
715
|
-
|
|
1015
|
+
// The rejected id is NOT quoted back — see `describeManualFault`: this
|
|
1016
|
+
// message becomes an `invalid[].reason` on an agent transcript, a browser
|
|
1017
|
+
// and a log, and `id` is a field an author can paste anything into,
|
|
1018
|
+
// including the token they meant for a header. The field name plus the
|
|
1019
|
+
// rule is what the author needs; the value is in front of them.
|
|
1020
|
+
throw new Error('tool `id` must be lowercase snake_case (letters, digits, underscores)');
|
|
716
1021
|
}
|
|
717
1022
|
name = explicitId;
|
|
718
1023
|
}
|
|
@@ -723,12 +1028,13 @@ export function normalizeToolManual(provisionalSlug, repoPath, content) {
|
|
|
723
1028
|
// let it read the loopback creds seeded under that namespace on the agent's
|
|
724
1029
|
// code-mode client (internal token, connector creds, KB bearer).
|
|
725
1030
|
if (RESERVED_TOOL_NAMESPACES.includes(name.toLowerCase())) {
|
|
726
|
-
throw new Error(
|
|
727
|
-
"(a `.tool` sharing a built-in namespace could read
|
|
1031
|
+
throw new Error('the tool namespace this file resolves to is reserved for a built-in manual — ' +
|
|
1032
|
+
"choose a different `id`/`name` (a `.tool` sharing a built-in namespace could read " +
|
|
1033
|
+
"that manual's seeded credentials).");
|
|
728
1034
|
}
|
|
729
1035
|
// Any `.tool` content — url, headers, inline tool templates, notes — may not
|
|
730
1036
|
// reference the platform-seeded variables.
|
|
731
|
-
assertNoReservedVariableRefs(obj
|
|
1037
|
+
assertNoReservedVariableRefs(obj);
|
|
732
1038
|
// The non-stdio constituent of the union, by name: `.tool` parsing can
|
|
733
1039
|
// never produce a spawn spec, and the stdio side pins `remote: false`,
|
|
734
1040
|
// which this builder must stay free to set from the file's own `remote:`.
|
|
@@ -759,7 +1065,7 @@ export function normalizeToolManual(provisionalSlug, repoPath, content) {
|
|
|
759
1065
|
// catalog disagreeing with the file about what the platform will do.
|
|
760
1066
|
if (containsCliCallTemplate(obj)) {
|
|
761
1067
|
if (obj.remote === true) {
|
|
762
|
-
throw new Error(
|
|
1068
|
+
throw new Error('this `.tool` declares `remote: true` but contains a `cli` call template — ' +
|
|
763
1069
|
'shell tools execute only in a local runtime (drop `remote: true`, or the `cli` template).');
|
|
764
1070
|
}
|
|
765
1071
|
descriptor.remote = false;
|
|
@@ -795,7 +1101,7 @@ export function normalizeToolManual(provisionalSlug, repoPath, content) {
|
|
|
795
1101
|
// Local-only (`remote: false`) `.tool`s are never fetched server-side, so
|
|
796
1102
|
// are exempt.
|
|
797
1103
|
if (descriptor.remote !== false) {
|
|
798
|
-
assertSafeManualFetchUrl(url,
|
|
1104
|
+
assertSafeManualFetchUrl(url, '`url`');
|
|
799
1105
|
}
|
|
800
1106
|
if (obj.headers && typeof obj.headers === 'object' && !Array.isArray(obj.headers)) {
|
|
801
1107
|
descriptor.headers = obj.headers;
|
|
@@ -819,7 +1125,7 @@ export function normalizeToolManual(provisionalSlug, repoPath, content) {
|
|
|
819
1125
|
const declaredHeaders = type !== 'inline' && obj.headers && typeof obj.headers === 'object' && !Array.isArray(obj.headers)
|
|
820
1126
|
? obj.headers
|
|
821
1127
|
: undefined;
|
|
822
|
-
const healthCheck = normalizeHealthCheck(obj.healthCheck,
|
|
1128
|
+
const healthCheck = normalizeHealthCheck(obj.healthCheck, descriptor.remote, declaredHeaders);
|
|
823
1129
|
if (healthCheck)
|
|
824
1130
|
descriptor.healthCheck = healthCheck;
|
|
825
1131
|
return descriptor;
|
|
@@ -881,7 +1187,7 @@ function assertSafeManualFetchUrl(url, label) {
|
|
|
881
1187
|
* unattended on every save and re-check, so `POST` is refused outright instead
|
|
882
1188
|
* of being quietly downgraded.
|
|
883
1189
|
*/
|
|
884
|
-
function normalizeHealthCheck(raw,
|
|
1190
|
+
function normalizeHealthCheck(raw, remote, manualHeaders) {
|
|
885
1191
|
if (raw === undefined || raw === null)
|
|
886
1192
|
return undefined;
|
|
887
1193
|
if (typeof raw !== 'object' || Array.isArray(raw))
|
|
@@ -891,7 +1197,7 @@ function normalizeHealthCheck(raw, manualName, remote, manualHeaders) {
|
|
|
891
1197
|
if (!url)
|
|
892
1198
|
throw new Error('`healthCheck` must have a `url`');
|
|
893
1199
|
if (remote !== false) {
|
|
894
|
-
assertSafeManualFetchUrl(url,
|
|
1200
|
+
assertSafeManualFetchUrl(url, '`healthCheck.url`');
|
|
895
1201
|
}
|
|
896
1202
|
const check = { url };
|
|
897
1203
|
if (e.method !== undefined) {
|
|
@@ -925,9 +1231,16 @@ function normalizeHealthCheck(raw, manualName, remote, manualHeaders) {
|
|
|
925
1231
|
* what it is: a mistake in the `.tool` file.
|
|
926
1232
|
*/
|
|
927
1233
|
function assertStringHeaders(headers, label) {
|
|
928
|
-
|
|
1234
|
+
// Located by POSITION, not by its key. A header name is text the author
|
|
1235
|
+
// wrote, and a refusal reason carries none of that — see
|
|
1236
|
+
// {@link describeManualFault}. The `.tool` has a handful of headers and the
|
|
1237
|
+
// reader is looking at the file, so an ordinal finds the line as surely as
|
|
1238
|
+
// the name would.
|
|
1239
|
+
const entries = Object.entries(headers);
|
|
1240
|
+
for (const [i, [, v]] of entries.entries()) {
|
|
929
1241
|
if (typeof v !== 'string') {
|
|
930
|
-
throw new Error(`\`${label}
|
|
1242
|
+
throw new Error(`\`${label}\` entry ${i + 1} of ${entries.length} must have a string value ` +
|
|
1243
|
+
'(quote it if it looks like a number)');
|
|
931
1244
|
}
|
|
932
1245
|
}
|
|
933
1246
|
return headers;
|
|
@@ -944,32 +1257,40 @@ function normalizeVariables(raw) {
|
|
|
944
1257
|
if (!Array.isArray(raw))
|
|
945
1258
|
throw new Error('`variables` must be an array');
|
|
946
1259
|
const seen = new Set();
|
|
947
|
-
return raw.map((entry) => {
|
|
1260
|
+
return raw.map((entry, i) => {
|
|
948
1261
|
if (!entry || typeof entry !== 'object' || Array.isArray(entry)) {
|
|
949
|
-
throw new Error(
|
|
1262
|
+
throw new Error(`\`variables[${i}]\` must be an object`);
|
|
950
1263
|
}
|
|
951
1264
|
const e = entry;
|
|
952
1265
|
const name = typeof e.name === 'string' ? e.name.trim() : '';
|
|
1266
|
+
// EVERY refusal in this block is located by `variables[i]`, never by the
|
|
1267
|
+
// name the entry declared — passing `[A-Za-z0-9_]+` makes a string a legal
|
|
1268
|
+
// identifier, not a string this process may repeat. A token spelled with
|
|
1269
|
+
// underscores passes that test, and the field an author mis-pastes a token
|
|
1270
|
+
// into is not one we get to choose. See {@link describeManualFault}.
|
|
1271
|
+
const at = `\`variables[${i}]`;
|
|
953
1272
|
if (!/^[A-Za-z0-9_]+$/.test(name)) {
|
|
954
|
-
throw new Error(
|
|
1273
|
+
throw new Error(`${at}.name\` must match [A-Za-z0-9_]+`);
|
|
955
1274
|
}
|
|
956
1275
|
if (RESERVED_VARIABLE_NAMES.includes(name)) {
|
|
957
|
-
|
|
1276
|
+
// `name` is one of OURS here — matched against a fixed list — so saying
|
|
1277
|
+
// which reserved name was taken repeats nothing the file taught us.
|
|
1278
|
+
throw new Error(`${at}.name\` is "${name}", which is reserved for platform seeding and may not be declared by a \`.tool\``);
|
|
958
1279
|
}
|
|
959
1280
|
if (seen.has(name))
|
|
960
|
-
throw new Error(
|
|
1281
|
+
throw new Error(`${at}.name\` duplicates an earlier entry's`);
|
|
961
1282
|
seen.add(name);
|
|
962
1283
|
const rawScope = typeof e.scope === 'string' ? e.scope.toLowerCase().trim() : '';
|
|
963
1284
|
if (rawScope && rawScope !== 'admin' && rawScope !== 'user') {
|
|
964
|
-
throw new Error(
|
|
1285
|
+
throw new Error(`${at}.scope\` is invalid (expected admin|user)`);
|
|
965
1286
|
}
|
|
966
1287
|
const scope = rawScope === 'user' ? 'user' : 'admin';
|
|
967
1288
|
const label = typeof e.label === 'string' && e.label.trim() ? e.label.trim() : undefined;
|
|
968
|
-
const oauth = normalizeVariableOAuth(
|
|
1289
|
+
const oauth = normalizeVariableOAuth(at, e.oauth);
|
|
969
1290
|
// OAuth is inherently per-caller — each user signs in for their own token. An
|
|
970
1291
|
// admin-shared OAuth token would leak one user's token to all callers.
|
|
971
1292
|
if (oauth && scope !== 'user') {
|
|
972
|
-
throw new Error(
|
|
1293
|
+
throw new Error(`${at}\` has \`oauth\`, so its \`scope\` must be \`user\``);
|
|
973
1294
|
}
|
|
974
1295
|
return {
|
|
975
1296
|
name,
|
|
@@ -995,28 +1316,34 @@ function isProbeableMcpServer(m) {
|
|
|
995
1316
|
* `.tool` author can't aim a sign-in/token exchange at an internal host. Both
|
|
996
1317
|
* URLs are REQUIRED here: a `.tool` (http/inline) has no server whose OAuth
|
|
997
1318
|
* metadata could fill them in — that convenience belongs to mcp.json servers.
|
|
1319
|
+
*
|
|
1320
|
+
* `at` is the entry's position — `` `variables[2] `` with its opening backtick,
|
|
1321
|
+
* each message closing it after the field — rather than the variable's name.
|
|
1322
|
+
* Same rule as everywhere else a refusal is written: the reason locates the
|
|
1323
|
+
* fault in the file without repeating anything the file said. See
|
|
1324
|
+
* {@link describeManualFault}.
|
|
998
1325
|
*/
|
|
999
|
-
function normalizeVariableOAuth(
|
|
1326
|
+
function normalizeVariableOAuth(at, raw) {
|
|
1000
1327
|
if (raw === undefined || raw === null)
|
|
1001
1328
|
return undefined;
|
|
1002
1329
|
if (typeof raw !== 'object' || Array.isArray(raw)) {
|
|
1003
|
-
throw new Error(
|
|
1330
|
+
throw new Error(`${at}.oauth\` must be an object`);
|
|
1004
1331
|
}
|
|
1005
1332
|
const o = raw;
|
|
1006
1333
|
// Confidential OAuth material is provisioned only through the protected
|
|
1007
1334
|
// client-secret route; reject it here so a plaintext `.tool` can't smuggle one in.
|
|
1008
1335
|
for (const forbidden of ['clientSecret', 'client_secret', 'secret']) {
|
|
1009
1336
|
if (o[forbidden] !== undefined) {
|
|
1010
|
-
throw new Error(
|
|
1337
|
+
throw new Error(`${at}.oauth.${forbidden}\` must be set through the protected client-secret route`);
|
|
1011
1338
|
}
|
|
1012
1339
|
}
|
|
1013
1340
|
const safeUrl = (v, field) => {
|
|
1014
1341
|
const s = typeof v === 'string' ? v.trim() : '';
|
|
1015
1342
|
try {
|
|
1016
|
-
assertSafeFetchUrl(s, { requireHttps: true, label: `${
|
|
1343
|
+
assertSafeFetchUrl(s, { requireHttps: true, label: `${at}.oauth.${field}\`` });
|
|
1017
1344
|
}
|
|
1018
1345
|
catch (err) {
|
|
1019
|
-
throw new Error(err instanceof Error ? err.message :
|
|
1346
|
+
throw new Error(err instanceof Error ? err.message : `${at}.oauth.${field}\` is invalid`);
|
|
1020
1347
|
}
|
|
1021
1348
|
return s;
|
|
1022
1349
|
};
|
|
@@ -1024,28 +1351,28 @@ function normalizeVariableOAuth(name, raw) {
|
|
|
1024
1351
|
const tokenUrl = safeUrl(o.tokenUrl, 'tokenUrl');
|
|
1025
1352
|
const clientId = typeof o.clientId === 'string' && o.clientId.trim() ? o.clientId.trim() : '';
|
|
1026
1353
|
if (!clientId)
|
|
1027
|
-
throw new Error(
|
|
1354
|
+
throw new Error(`${at}.oauth.clientId\` is required`);
|
|
1028
1355
|
let scopes;
|
|
1029
1356
|
if (o.scopes !== undefined) {
|
|
1030
1357
|
if (!Array.isArray(o.scopes) || !o.scopes.every((s) => typeof s === 'string')) {
|
|
1031
|
-
throw new Error(
|
|
1358
|
+
throw new Error(`${at}.oauth.scopes\` must be string[]`);
|
|
1032
1359
|
}
|
|
1033
1360
|
scopes = o.scopes;
|
|
1034
1361
|
}
|
|
1035
1362
|
let authParams;
|
|
1036
1363
|
if (o.authParams !== undefined) {
|
|
1037
1364
|
if (typeof o.authParams !== 'object' || Array.isArray(o.authParams)) {
|
|
1038
|
-
throw new Error(
|
|
1365
|
+
throw new Error(`${at}.oauth.authParams\` must be an object of string values`);
|
|
1039
1366
|
}
|
|
1040
1367
|
const entries = Object.entries(o.authParams);
|
|
1041
1368
|
if (!entries.every(([, v]) => typeof v === 'string')) {
|
|
1042
|
-
throw new Error(
|
|
1369
|
+
throw new Error(`${at}.oauth.authParams\` values must be strings`);
|
|
1043
1370
|
}
|
|
1044
1371
|
authParams = Object.fromEntries(entries);
|
|
1045
1372
|
}
|
|
1046
1373
|
// PKCE is on unless the file says `false`; only the opt-out is ever stored.
|
|
1047
1374
|
if (o.pkce !== undefined && typeof o.pkce !== 'boolean') {
|
|
1048
|
-
throw new Error(
|
|
1375
|
+
throw new Error(`${at}.oauth.pkce\` must be a boolean`);
|
|
1049
1376
|
}
|
|
1050
1377
|
// Never fetched (it rides as a request param), but it names the remote
|
|
1051
1378
|
// server — same https/SSRF bar as the endpoints.
|
|
@@ -1079,6 +1406,9 @@ function normalizeType(raw) {
|
|
|
1079
1406
|
return 'mcp';
|
|
1080
1407
|
if (t === 'inline' || t === 'text' || t === '')
|
|
1081
1408
|
return 'inline';
|
|
1082
|
-
|
|
1409
|
+
// The written value is not echoed (see the `id` refusal above): the accepted
|
|
1410
|
+
// set says more than the rejected value does, and a `type:` line is one
|
|
1411
|
+
// mis-paste away from holding a credential like any other.
|
|
1412
|
+
throw new Error('unknown `.tool` `type` (expected `http`, `mcp`, `inline`, or absent)');
|
|
1083
1413
|
}
|
|
1084
1414
|
//# sourceMappingURL=tool-manuals.service.js.map
|