@bevel-software/platform-core-backend 0.14.0 → 0.19.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 +8 -8
- package/dist/core/catalog-cache-invalidation.d.ts +45 -0
- package/dist/core/catalog-cache-invalidation.d.ts.map +1 -0
- package/dist/core/catalog-cache-invalidation.js +76 -0
- package/dist/core/catalog-cache-invalidation.js.map +1 -0
- 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 +279 -64
- package/dist/core/create-core-server.js.map +1 -1
- package/dist/core/create-core-services.d.ts +66 -2
- package/dist/core/create-core-services.d.ts.map +1 -1
- package/dist/core/create-core-services.js +290 -111
- 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 +231 -15
- package/dist/modules/access/access-control.interface.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.d.ts +83 -12
- package/dist/modules/access/access-control.service.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.js +815 -212
- 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 +312 -84
- 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 +100 -25
- package/dist/modules/access-model/access-grammar.d.ts.map +1 -1
- package/dist/modules/access-model/access-grammar.js +162 -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/group-files.d.ts.map +1 -1
- package/dist/modules/access-model/group-files.js +4 -1
- package/dist/modules/access-model/group-files.js.map +1 -1
- package/dist/modules/access-model/plugin-principals.d.ts +51 -0
- package/dist/modules/access-model/plugin-principals.d.ts.map +1 -0
- package/dist/modules/access-model/plugin-principals.js +119 -0
- package/dist/modules/access-model/plugin-principals.js.map +1 -0
- 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/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 +672 -0
- package/dist/modules/database/core-schema.d.ts.map +1 -1
- package/dist/modules/database/core-schema.js +171 -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 +79 -81
- package/dist/modules/diff/diff.service.js.map +1 -1
- package/dist/modules/kb-fs/bevel-ignore.d.ts +35 -0
- package/dist/modules/kb-fs/bevel-ignore.d.ts.map +1 -0
- package/dist/modules/kb-fs/bevel-ignore.js +71 -0
- 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 +37 -0
- package/dist/modules/kb-fs/git-guarded-filesystem.d.ts.map +1 -0
- package/dist/modules/kb-fs/git-guarded-filesystem.js +104 -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/index.d.ts +6 -0
- package/dist/modules/kb-sync/index.d.ts.map +1 -0
- package/dist/modules/kb-sync/index.js +5 -0
- package/dist/modules/kb-sync/index.js.map +1 -0
- package/dist/modules/kb-sync/kb-sync.interface.d.ts +77 -0
- package/dist/modules/kb-sync/kb-sync.interface.d.ts.map +1 -0
- package/dist/modules/kb-sync/kb-sync.interface.js +2 -0
- package/dist/modules/kb-sync/kb-sync.interface.js.map +1 -0
- package/dist/modules/kb-sync/kb-sync.routes.d.ts +70 -0
- package/dist/modules/kb-sync/kb-sync.routes.d.ts.map +1 -0
- package/dist/modules/kb-sync/kb-sync.routes.js +137 -0
- package/dist/modules/kb-sync/kb-sync.routes.js.map +1 -0
- package/dist/modules/kb-sync/kb-sync.service.d.ts +45 -0
- package/dist/modules/kb-sync/kb-sync.service.d.ts.map +1 -0
- package/dist/modules/kb-sync/kb-sync.service.js +185 -0
- package/dist/modules/kb-sync/kb-sync.service.js.map +1 -0
- package/dist/modules/kb-sync/sync-auth.d.ts +59 -0
- package/dist/modules/kb-sync/sync-auth.d.ts.map +1 -0
- package/dist/modules/kb-sync/sync-auth.js +62 -0
- package/dist/modules/kb-sync/sync-auth.js.map +1 -0
- package/dist/modules/kb-sync/sync-payload.d.ts +32 -0
- package/dist/modules/kb-sync/sync-payload.d.ts.map +1 -0
- package/dist/modules/kb-sync/sync-payload.js +105 -0
- package/dist/modules/kb-sync/sync-payload.js.map +1 -0
- package/dist/modules/marketplace/git-http.routes.d.ts +42 -0
- package/dist/modules/marketplace/git-http.routes.d.ts.map +1 -0
- package/dist/modules/marketplace/git-http.routes.js +192 -0
- package/dist/modules/marketplace/git-http.routes.js.map +1 -0
- package/dist/modules/marketplace/github-facade/github-facade-admin.routes.d.ts +33 -0
- package/dist/modules/marketplace/github-facade/github-facade-admin.routes.d.ts.map +1 -0
- package/dist/modules/marketplace/github-facade/github-facade-admin.routes.js +88 -0
- package/dist/modules/marketplace/github-facade/github-facade-admin.routes.js.map +1 -0
- package/dist/modules/marketplace/github-facade/github-facade-codes.store.d.ts +59 -0
- package/dist/modules/marketplace/github-facade/github-facade-codes.store.d.ts.map +1 -0
- package/dist/modules/marketplace/github-facade/github-facade-codes.store.js +96 -0
- package/dist/modules/marketplace/github-facade/github-facade-codes.store.js.map +1 -0
- package/dist/modules/marketplace/github-facade/github-facade-credentials.service.d.ts +126 -0
- package/dist/modules/marketplace/github-facade/github-facade-credentials.service.d.ts.map +1 -0
- package/dist/modules/marketplace/github-facade/github-facade-credentials.service.js +192 -0
- package/dist/modules/marketplace/github-facade/github-facade-credentials.service.js.map +1 -0
- package/dist/modules/marketplace/github-facade/github-facade.routes.d.ts +47 -0
- package/dist/modules/marketplace/github-facade/github-facade.routes.d.ts.map +1 -0
- package/dist/modules/marketplace/github-facade/github-facade.routes.js +252 -0
- package/dist/modules/marketplace/github-facade/github-facade.routes.js.map +1 -0
- package/dist/modules/marketplace/github-facade/github-facade.service.d.ts +121 -0
- package/dist/modules/marketplace/github-facade/github-facade.service.d.ts.map +1 -0
- package/dist/modules/marketplace/github-facade/github-facade.service.js +213 -0
- package/dist/modules/marketplace/github-facade/github-facade.service.js.map +1 -0
- package/dist/modules/marketplace/github-facade/index.d.ts +6 -0
- package/dist/modules/marketplace/github-facade/index.d.ts.map +1 -0
- package/dist/modules/marketplace/github-facade/index.js +6 -0
- package/dist/modules/marketplace/github-facade/index.js.map +1 -0
- package/dist/modules/marketplace/index.d.ts +4 -0
- package/dist/modules/marketplace/index.d.ts.map +1 -0
- package/dist/modules/marketplace/index.js +4 -0
- package/dist/modules/marketplace/index.js.map +1 -0
- package/dist/modules/marketplace/marketplace-repo.service.d.ts +135 -0
- package/dist/modules/marketplace/marketplace-repo.service.d.ts.map +1 -0
- package/dist/modules/marketplace/marketplace-repo.service.js +318 -0
- package/dist/modules/marketplace/marketplace-repo.service.js.map +1 -0
- 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 +9 -5
- package/dist/modules/mcp/mcp-auth.middleware.d.ts.map +1 -1
- package/dist/modules/mcp/mcp-auth.middleware.js +24 -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 +83 -179
- package/dist/modules/mcp/mcp.routes.js.map +1 -1
- package/dist/modules/mcp/mcp.service.d.ts +218 -61
- package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
- package/dist/modules/mcp/mcp.service.js +713 -159
- package/dist/modules/mcp/mcp.service.js.map +1 -1
- package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts.map +1 -1
- package/dist/modules/mcp/oauth/bevel-oauth-provider.js +8 -2
- package/dist/modules/mcp/oauth/bevel-oauth-provider.js.map +1 -1
- package/dist/modules/mcp/oauth/oauth-consent.routes.d.ts +14 -8
- package/dist/modules/mcp/oauth/oauth-consent.routes.d.ts.map +1 -1
- package/dist/modules/mcp/oauth/oauth-consent.routes.js +16 -2
- package/dist/modules/mcp/oauth/oauth-consent.routes.js.map +1 -1
- package/dist/modules/mcp/oauth/oauth-state.d.ts +13 -2
- package/dist/modules/mcp/oauth/oauth-state.d.ts.map +1 -1
- package/dist/modules/mcp/oauth/oauth-state.js +3 -1
- package/dist/modules/mcp/oauth/oauth-state.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 +104 -0
- package/dist/modules/plugins/compile/compile-marketplace.d.ts.map +1 -0
- package/dist/modules/plugins/compile/compile-marketplace.js +323 -0
- package/dist/modules/plugins/compile/compile-marketplace.js.map +1 -0
- package/dist/modules/plugins/compile/marketplace-compiler.service.d.ts +73 -0
- package/dist/modules/plugins/compile/marketplace-compiler.service.d.ts.map +1 -0
- package/dist/modules/plugins/compile/marketplace-compiler.service.js +135 -0
- package/dist/modules/plugins/compile/marketplace-compiler.service.js.map +1 -0
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.d.ts +37 -0
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.d.ts.map +1 -0
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.js +158 -0
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.js.map +1 -0
- package/dist/modules/plugins/discovery/bundle-dialect/registry.d.ts +65 -0
- package/dist/modules/plugins/discovery/bundle-dialect/registry.d.ts.map +1 -0
- package/dist/modules/plugins/discovery/bundle-dialect/registry.js +204 -0
- package/dist/modules/plugins/discovery/bundle-dialect/registry.js.map +1 -0
- package/dist/modules/plugins/discovery/kb-plugin-source.d.ts +39 -0
- package/dist/modules/plugins/discovery/kb-plugin-source.d.ts.map +1 -0
- package/dist/modules/plugins/discovery/kb-plugin-source.js +110 -0
- package/dist/modules/plugins/discovery/kb-plugin-source.js.map +1 -0
- package/dist/modules/plugins/discovery/native.source.d.ts +16 -0
- package/dist/modules/plugins/discovery/native.source.d.ts.map +1 -0
- package/dist/modules/plugins/discovery/native.source.js +120 -0
- package/dist/modules/plugins/discovery/native.source.js.map +1 -0
- package/dist/modules/plugins/discovery/plugin-source.d.ts +110 -0
- package/dist/modules/plugins/discovery/plugin-source.d.ts.map +1 -0
- package/dist/modules/plugins/discovery/plugin-source.js +2 -0
- package/dist/modules/plugins/discovery/plugin-source.js.map +1 -0
- package/dist/modules/plugins/index.d.ts +15 -3
- package/dist/modules/plugins/index.d.ts.map +1 -1
- package/dist/modules/plugins/index.js +13 -2
- 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 +69 -0
- package/dist/modules/plugins/plugin-links.d.ts.map +1 -0
- package/dist/modules/plugins/plugin-links.js +163 -0
- package/dist/modules/plugins/plugin-links.js.map +1 -0
- package/dist/modules/plugins/plugin-links.service.d.ts +111 -0
- package/dist/modules/plugins/plugin-links.service.d.ts.map +1 -0
- package/dist/modules/plugins/plugin-links.service.js +295 -0
- package/dist/modules/plugins/plugin-links.service.js.map +1 -0
- package/dist/modules/plugins/plugin-provision.service.d.ts +129 -21
- package/dist/modules/plugins/plugin-provision.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-provision.service.js +320 -75
- package/dist/modules/plugins/plugin-provision.service.js.map +1 -1
- package/dist/modules/plugins/plugin-rename.service.d.ts +71 -0
- package/dist/modules/plugins/plugin-rename.service.d.ts.map +1 -0
- package/dist/modules/plugins/plugin-rename.service.js +254 -0
- package/dist/modules/plugins/plugin-rename.service.js.map +1 -0
- package/dist/modules/plugins/plugins.contract.d.ts +78 -4
- package/dist/modules/plugins/plugins.contract.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.routes.d.ts +44 -5
- package/dist/modules/plugins/plugins.routes.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.routes.js +297 -115
- package/dist/modules/plugins/plugins.routes.js.map +1 -1
- package/dist/modules/plugins/plugins.service.d.ts +82 -3
- package/dist/modules/plugins/plugins.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.service.js +178 -48
- 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 +157 -2
- package/dist/modules/settings/deployment-settings.service.d.ts.map +1 -1
- package/dist/modules/settings/deployment-settings.service.js +412 -35
- 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 +57 -1
- package/dist/modules/settings/setup.routes.d.ts.map +1 -1
- package/dist/modules/settings/setup.routes.js +408 -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 +4 -1
- package/dist/modules/skills/index.d.ts.map +1 -1
- package/dist/modules/skills/index.js +2 -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 +24 -71
- package/dist/modules/skills/pending-skills.service.js.map +1 -1
- package/dist/modules/skills/skill-access-requests.routes.d.ts +38 -0
- package/dist/modules/skills/skill-access-requests.routes.d.ts.map +1 -0
- package/dist/modules/skills/skill-access-requests.routes.js +171 -0
- package/dist/modules/skills/skill-access-requests.routes.js.map +1 -0
- package/dist/modules/skills/skills.contract.d.ts +67 -2
- package/dist/modules/skills/skills.contract.d.ts.map +1 -1
- package/dist/modules/skills/skills.routes.d.ts +35 -3
- package/dist/modules/skills/skills.routes.d.ts.map +1 -1
- package/dist/modules/skills/skills.routes.js +57 -4
- package/dist/modules/skills/skills.routes.js.map +1 -1
- package/dist/modules/skills/skills.service.d.ts +31 -3
- package/dist/modules/skills/skills.service.d.ts.map +1 -1
- package/dist/modules/skills/skills.service.js +236 -65
- 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 +66 -1
- package/dist/modules/tool-auth/external-api-key.interface.d.ts.map +1 -1
- package/dist/modules/tool-auth/external-api-key.interface.js +2 -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 +23 -4
- package/dist/modules/tool-auth/external-api-key.service.d.ts.map +1 -1
- package/dist/modules/tool-auth/external-api-key.service.js +79 -19
- package/dist/modules/tool-auth/external-api-key.service.js.map +1 -1
- package/dist/modules/tool-auth/internal-token.service.d.ts +5 -2
- package/dist/modules/tool-auth/internal-token.service.d.ts.map +1 -1
- package/dist/modules/tool-auth/internal-token.service.js +5 -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 +7 -1
- package/dist/modules/tool-auth/tool-auth.middleware.d.ts.map +1 -1
- package/dist/modules/tool-auth/tool-auth.middleware.js +8 -5
- 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 +36 -0
- package/dist/modules/tool-manuals/mcp-json-discovery.d.ts.map +1 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.js +136 -96
- 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 +121 -2
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.js +415 -92
- 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 +303 -6
- package/dist/modules/workflow/git/git.service.d.ts.map +1 -1
- package/dist/modules/workflow/git/git.service.js +753 -170
- 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 +57 -2
- package/dist/modules/workflow/git/pull-request.service.d.ts.map +1 -1
- package/dist/modules/workflow/git/pull-request.service.js +165 -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 +217 -14
- package/dist/modules/workflow/workflow.service.d.ts.map +1 -1
- package/dist/modules/workflow/workflow.service.js +1142 -109
- 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 +41 -0
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.d.ts.map +1 -0
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.js +85 -0
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.js.map +1 -0
- 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 +174 -54
- 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 +521 -126
- 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 +657 -246
- package/dist/modules/workspace/workspace.routes.js.map +1 -1
- package/dist/modules/workspace/workspace.service.d.ts +323 -12
- package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.service.js +1006 -257
- 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 +1590 -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 +128 -0
- package/dist/shared/domain-errors.d.ts.map +1 -1
- package/dist/shared/domain-errors.js +166 -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-errors.d.ts +8 -0
- package/dist/shared/fs-errors.d.ts.map +1 -0
- package/dist/shared/fs-errors.js +11 -0
- package/dist/shared/fs-errors.js.map +1 -0
- package/dist/shared/fs-walk.d.ts +20 -6
- package/dist/shared/fs-walk.d.ts.map +1 -1
- package/dist/shared/fs-walk.js +35 -27
- package/dist/shared/fs-walk.js.map +1 -1
- 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 +17 -0
- package/dist/shared/git-internals.d.ts.map +1 -0
- package/dist/shared/git-internals.js +123 -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/kb-walk.d.ts +52 -0
- package/dist/shared/kb-walk.d.ts.map +1 -0
- package/dist/shared/kb-walk.js +76 -0
- package/dist/shared/kb-walk.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/path-order.d.ts +18 -0
- package/dist/shared/path-order.d.ts.map +1 -0
- package/dist/shared/path-order.js +35 -0
- package/dist/shared/path-order.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/shared/ttl-cache.d.ts +28 -1
- package/dist/shared/ttl-cache.d.ts.map +1 -1
- package/dist/shared/ttl-cache.js +33 -1
- package/dist/shared/ttl-cache.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 +364 -54
- package/kb-template/KnowledgeBase/How to get started.md +1 -1
- package/kb-template/Skills/.gitkeep +0 -0
- package/kb-template/access.md +5 -3
- package/kb-template/mcp-description.md +27 -0
- package/migrations/0005_github_facade.sql +25 -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/meta/0005_snapshot.json +1717 -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/_journal.json +49 -0
- package/package.json +8 -7
- package/src/__tests__/core-config.domain.test.ts +67 -2
- package/src/__tests__/kb-layout-config.test.ts +295 -0
- package/src/__tests__/open-change-gate.ts +15 -0
- package/src/core/__tests__/catalog-cache-invalidation.test.ts +226 -0
- 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 +111 -0
- package/src/core/catalog-revision.ts +110 -0
- package/src/core/create-core-server.ts +358 -63
- package/src/core/create-core-services.ts +449 -107
- 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 +88 -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 +142 -81
- 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 +385 -0
- 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 +14 -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 +269 -18
- package/src/modules/access/access-control.service.ts +943 -226
- 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 +385 -105
- 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-grammar.test.ts +18 -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__/plugin-token-canonical.test.ts +40 -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 +198 -49
- 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/group-files.ts +4 -0
- package/src/modules/access-model/plugin-principals.ts +130 -0
- 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/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 +177 -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 +75 -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 +123 -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/__tests__/kb-sync.routes.test.ts +297 -0
- package/src/modules/kb-sync/__tests__/kb-sync.service.test.ts +295 -0
- package/src/modules/kb-sync/__tests__/sync-auth.test.ts +118 -0
- package/src/modules/kb-sync/__tests__/sync-payload.test.ts +148 -0
- package/src/modules/kb-sync/index.ts +19 -0
- package/src/modules/kb-sync/kb-sync.interface.ts +79 -0
- package/src/modules/kb-sync/kb-sync.routes.ts +200 -0
- package/src/modules/kb-sync/kb-sync.service.ts +204 -0
- package/src/modules/kb-sync/sync-auth.ts +118 -0
- package/src/modules/kb-sync/sync-payload.ts +143 -0
- package/src/modules/marketplace/__tests__/github-facade.test.ts +575 -0
- package/src/modules/marketplace/__tests__/marketplace-git.test.ts +180 -0
- package/src/modules/marketplace/__tests__/marketplace-repo.head.test.ts +47 -0
- package/src/modules/marketplace/git-http.routes.ts +196 -0
- package/src/modules/marketplace/github-facade/github-facade-admin.routes.ts +110 -0
- package/src/modules/marketplace/github-facade/github-facade-codes.store.ts +145 -0
- package/src/modules/marketplace/github-facade/github-facade-credentials.service.ts +263 -0
- package/src/modules/marketplace/github-facade/github-facade.routes.ts +294 -0
- package/src/modules/marketplace/github-facade/github-facade.service.ts +282 -0
- package/src/modules/marketplace/github-facade/index.ts +26 -0
- package/src/modules/marketplace/index.ts +3 -0
- package/src/modules/marketplace/marketplace-repo.service.ts +352 -0
- 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 +8 -5
- 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.stateless.test.ts +182 -0
- package/src/modules/mcp/__tests__/mcp.service.test.ts +274 -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 +25 -16
- package/src/modules/mcp/mcp.routes.ts +376 -482
- package/src/modules/mcp/mcp.service.ts +846 -176
- package/src/modules/mcp/oauth/bevel-oauth-provider.ts +8 -2
- package/src/modules/mcp/oauth/oauth-consent.routes.ts +28 -6
- package/src/modules/mcp/oauth/oauth-state.ts +15 -3
- package/src/modules/mcp/surface-log-throttle.ts +120 -0
- package/src/modules/plugins/__tests__/bundle-dialect.e2e.test.ts +166 -0
- package/src/modules/plugins/__tests__/bundle-dialect.test.ts +165 -0
- package/src/modules/plugins/__tests__/compile-marketplace.test.ts +423 -0
- 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 +201 -16
- package/src/modules/plugins/__tests__/plugin-links.service.test.ts +284 -0
- package/src/modules/plugins/__tests__/plugin-names.test.ts +77 -0
- package/src/modules/plugins/__tests__/plugin-provision.service.test.ts +330 -20
- package/src/modules/plugins/__tests__/plugin-rename.service.test.ts +456 -0
- package/src/modules/plugins/__tests__/plugins.routes.test.ts +441 -43
- 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 +500 -0
- package/src/modules/plugins/compile/marketplace-compiler.service.ts +151 -0
- package/src/modules/plugins/discovery/__tests__/kb-plugin-source.test.ts +365 -0
- package/src/modules/plugins/discovery/bundle-dialect/bundle.source.ts +161 -0
- package/src/modules/plugins/discovery/bundle-dialect/registry.ts +250 -0
- package/src/modules/plugins/discovery/kb-plugin-source.ts +117 -0
- package/src/modules/plugins/discovery/native.source.ts +140 -0
- package/src/modules/plugins/discovery/plugin-source.ts +113 -0
- package/src/modules/plugins/index.ts +25 -2
- 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 +350 -0
- package/src/modules/plugins/plugin-links.ts +187 -0
- package/src/modules/plugins/plugin-provision.service.ts +356 -78
- package/src/modules/plugins/plugin-rename.service.ts +310 -0
- package/src/modules/plugins/plugins.contract.ts +79 -4
- package/src/modules/plugins/plugins.routes.ts +320 -123
- package/src/modules/plugins/plugins.service.ts +184 -57
- 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 +240 -1
- 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.sync-status.test.ts +77 -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 +478 -39
- 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 +480 -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__/skill-access-requests.routes.test.ts +128 -0
- package/src/modules/skills/__tests__/skills.routes.warnings.test.ts +91 -0
- package/src/modules/skills/__tests__/skills.service.test.ts +308 -2
- package/src/modules/skills/allowed-tools-check.ts +352 -0
- package/src/modules/skills/index.ts +5 -0
- package/src/modules/skills/pending-skills.service.ts +26 -85
- package/src/modules/skills/skill-access-requests.routes.ts +203 -0
- package/src/modules/skills/skills.contract.ts +67 -3
- package/src/modules/skills/skills.routes.ts +75 -4
- package/src/modules/skills/skills.service.ts +258 -66
- 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 +124 -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 +73 -1
- package/src/modules/tool-auth/external-api-key.service.ts +95 -29
- package/src/modules/tool-auth/internal-token.service.ts +5 -2
- package/src/modules/tool-auth/key-or-session.middleware.ts +45 -0
- package/src/modules/tool-auth/tool-auth.middleware.ts +16 -7
- 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-json-discovery.test.ts +24 -1
- 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 +11 -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 +164 -95
- 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 +440 -104
- 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 +3 -1
- 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 +3 -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 +296 -27
- 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 +133 -2
- package/src/modules/workflow/__tests__/workflow.service.sync.test.ts +442 -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.postMergePull.test.ts +3 -3
- package/src/modules/workflow/git/__tests__/git.service.pull.test.ts +47 -4
- package/src/modules/workflow/git/__tests__/git.service.revertPathsAndPush.test.ts +177 -0
- package/src/modules/workflow/git/__tests__/git.service.syncFromRemote.test.ts +253 -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 +922 -199
- package/src/modules/workflow/git/node-git-runner.ts +315 -0
- package/src/modules/workflow/git/pull-request.service.ts +188 -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 +1341 -174
- 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 +792 -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 +31 -13
- 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 +94 -0
- package/src/modules/workspace/__tests__/workspace.service.missing-branch.test.ts +28 -0
- 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 +98 -13
- 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 +1405 -48
- 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 +90 -0
- package/src/modules/workspace/startup/steps/roles-yaml.step.ts +6 -12
- package/src/modules/workspace/startup/steps/seed-tree.ts +177 -54
- package/src/modules/workspace/startup/steps/template-files.step.ts +581 -126
- package/src/modules/workspace/startup/steps/template-source.ts +168 -0
- package/src/modules/workspace/workspace.routes.ts +691 -269
- package/src/modules/workspace/workspace.service.ts +1071 -292
- package/src/modules/workspace/workspace.tools.ts +1787 -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 +115 -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__/path-order.test.ts +24 -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/__tests__/ttl-cache.test.ts +55 -0
- package/src/shared/canonical-file-identity.ts +92 -0
- package/src/shared/domain-errors.ts +178 -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 +124 -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/path-order.ts +33 -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/shared/ttl-cache.ts +33 -1
- package/src/version.ts +10 -6
- 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 -42
- package/src/shared/fs-walk.ts +0 -30
- package/src/shared/hash-email.ts +0 -14
|
@@ -1,6 +1,19 @@
|
|
|
1
1
|
import express from 'express';
|
|
2
|
+
import { inArray } from 'drizzle-orm';
|
|
3
|
+
import { logger } from '../../shared/logging.js';
|
|
4
|
+
import { printable } from '../../shared/printable.js';
|
|
5
|
+
|
|
6
|
+
// The audit lines this file writes have always carried their own tags —
|
|
7
|
+
// `access.grant`, `access.revoke` and their sub-cases — so each keeps it.
|
|
8
|
+
const grantLog = logger('access.grant');
|
|
9
|
+
const revokeLog = logger('access.revoke');
|
|
2
10
|
import type { AuthUser } from '@bevel-software/platform-shared';
|
|
3
|
-
import {
|
|
11
|
+
import {
|
|
12
|
+
isProtectedBranch,
|
|
13
|
+
DEFAULT_BRANCH,
|
|
14
|
+
pluginManifestName,
|
|
15
|
+
FOLDER_GOVERNS_ACCESS_KIND,
|
|
16
|
+
} from '@bevel-software/platform-shared';
|
|
4
17
|
import type {
|
|
5
18
|
IAccessControl,
|
|
6
19
|
GrantPrincipal,
|
|
@@ -17,15 +30,23 @@ import {
|
|
|
17
30
|
AccessMutationService,
|
|
18
31
|
AccessMutationError,
|
|
19
32
|
accessMdPathForFolder,
|
|
33
|
+
assertFileCarriesAccessRules,
|
|
34
|
+
fileCarriesAccessRules,
|
|
35
|
+
governingFolderOf,
|
|
20
36
|
type TargetKind,
|
|
21
37
|
} from './access-mutation.service.js';
|
|
22
38
|
import {
|
|
23
39
|
canonicalRoleName,
|
|
24
40
|
EVERYONE_CANONICAL,
|
|
41
|
+
PLUGIN_TOKEN_PREFIX,
|
|
42
|
+
PLUGIN_TOKEN_VERBS,
|
|
25
43
|
ROLE_TOKEN_PREFIX,
|
|
44
|
+
type PluginTokenVerb,
|
|
26
45
|
type Verb,
|
|
27
46
|
} from '../access-model/access-grammar.js';
|
|
28
47
|
import { listAccessDeclarationsUnder } from './access-declarations.js';
|
|
48
|
+
import { emailsInView, holderPrincipals, labelAccountHolders, resolveAccessView } from './access-view.js';
|
|
49
|
+
import type { AccessView, LabelledAccessView } from './access-view.js';
|
|
29
50
|
import { toHttpError as sharedToHttpError, requireNonEmptyString as sharedRequireNonEmptyString } from './admin-route-helpers.js';
|
|
30
51
|
import { RolesAdminService } from './roles-admin.service.js';
|
|
31
52
|
import type { Principal } from '../access-model/access-splice.js';
|
|
@@ -48,6 +69,19 @@ function requireNonEmptyString(value: unknown, field: string): string {
|
|
|
48
69
|
return sharedRequireNonEmptyString(value, field);
|
|
49
70
|
}
|
|
50
71
|
|
|
72
|
+
/**
|
|
73
|
+
* Is this the "the folder governs this file" refusal? It is the one mutation
|
|
74
|
+
* failure that is guaranteed to have written nothing — it is thrown as the
|
|
75
|
+
* file is read — so the lock it holds must be released without discarding the
|
|
76
|
+
* path (see `withEditLock`).
|
|
77
|
+
*/
|
|
78
|
+
function isFolderGovernsRefusal(err: unknown): boolean {
|
|
79
|
+
return (
|
|
80
|
+
err instanceof AccessMutationError &&
|
|
81
|
+
err.payload?.kind === FOLDER_GOVERNS_ACCESS_KIND
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
|
|
51
85
|
export function createAccessRoutes(
|
|
52
86
|
accessControl: IAccessControl,
|
|
53
87
|
workspaceService: WorkspaceService,
|
|
@@ -79,20 +113,51 @@ export function createAccessRoutes(
|
|
|
79
113
|
// accepts — the same principals the admin screens manage, regardless of
|
|
80
114
|
// which branch the caller is viewing. People stay branch-local (the
|
|
81
115
|
// caller's own workspace).
|
|
82
|
-
const defaultBranchPrincipals = async (): Promise<{
|
|
116
|
+
const defaultBranchPrincipals = async (): Promise<{
|
|
117
|
+
roles: string[];
|
|
118
|
+
groups: string[];
|
|
119
|
+
plugins: { name: string; folder: string }[];
|
|
120
|
+
}> => {
|
|
83
121
|
await workspaceService.getOrCreateForBranch(DEFAULT_BRANCH);
|
|
84
|
-
const { roles, groups } = await accessControl.kbPrincipals(
|
|
85
|
-
|
|
122
|
+
const { roles, groups, plugins } = await accessControl.kbPrincipals(
|
|
123
|
+
workspaceIdForBranch(DEFAULT_BRANCH),
|
|
124
|
+
);
|
|
125
|
+
// `plugins` is defensive: an older resolver double may omit it.
|
|
126
|
+
return { roles, groups, plugins: plugins ?? [] };
|
|
86
127
|
};
|
|
87
128
|
|
|
88
129
|
/**
|
|
89
|
-
*
|
|
90
|
-
*
|
|
91
|
-
*
|
|
92
|
-
*
|
|
93
|
-
*
|
|
130
|
+
* The plugins `email` may DISCOVER — read the folder's access.md, the same
|
|
131
|
+
* verdict the plugin index lists on. Both the suggest list and the grant
|
|
132
|
+
* route go through this, so a plugin hidden from the picker cannot be
|
|
133
|
+
* named in a grant either, and an undiscoverable one answers exactly like
|
|
134
|
+
* one that does not exist.
|
|
94
135
|
*/
|
|
95
|
-
|
|
136
|
+
const discoverablePlugins = async (
|
|
137
|
+
email: string,
|
|
138
|
+
plugins: { name: string; folder: string }[],
|
|
139
|
+
): Promise<{ name: string; folder: string }[]> => {
|
|
140
|
+
if (plugins.length === 0) return [];
|
|
141
|
+
const verdicts = await accessControl.canReadBatch(
|
|
142
|
+
workspaceIdForBranch(DEFAULT_BRANCH),
|
|
143
|
+
email,
|
|
144
|
+
plugins.map((p) => `${p.folder}/access.md`),
|
|
145
|
+
);
|
|
146
|
+
return plugins.filter((p) => verdicts.get(`${p.folder}/access.md`) === true);
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* What the mutation routes accept as a principal. `group` and `plugin`
|
|
151
|
+
* exist only at this boundary: in the access.md entry grammar a group grant
|
|
152
|
+
* is a bare-name token (bare names resolve GROUP-FIRST, then fall back to
|
|
153
|
+
* the role) and a plugin grant is the `plugin/<Name>/<verb>` token, so both
|
|
154
|
+
* are spliced as role-shaped principals — the separate kinds buy validation
|
|
155
|
+
* against the right namespace and honest 404s.
|
|
156
|
+
*/
|
|
157
|
+
type RoutePrincipal =
|
|
158
|
+
| Principal
|
|
159
|
+
| { kind: 'group'; group: string }
|
|
160
|
+
| { kind: 'plugin'; plugin: string; verb: PluginTokenVerb };
|
|
96
161
|
|
|
97
162
|
/**
|
|
98
163
|
* The role-shaped principal the splice layer actually writes/matches.
|
|
@@ -104,6 +169,9 @@ export function createAccessRoutes(
|
|
|
104
169
|
*/
|
|
105
170
|
const asSplicePrincipal = (p: RoutePrincipal): Principal => {
|
|
106
171
|
if (p.kind === 'group') return { kind: 'role', role: p.group };
|
|
172
|
+
// Written with the folder's own casing; `parseAccessEntry` canonicalises
|
|
173
|
+
// the name half to the manifest slug on the way back in.
|
|
174
|
+
if (p.kind === 'plugin') return { kind: 'role', role: `${PLUGIN_TOKEN_PREFIX}${p.plugin.trim()}/${p.verb}` };
|
|
107
175
|
if (p.kind === 'role') {
|
|
108
176
|
const canonical = canonicalRoleName(p.role);
|
|
109
177
|
const bare = canonical.startsWith(ROLE_TOKEN_PREFIX)
|
|
@@ -184,26 +252,50 @@ export function createAccessRoutes(
|
|
|
184
252
|
) {
|
|
185
253
|
throw new AccessMutationError('path must stay inside the KB repo');
|
|
186
254
|
}
|
|
255
|
+
// One spelling per target, as the file verbs and the edit lock require: a
|
|
256
|
+
// `./README.md` would reach the resolver as a different chain from
|
|
257
|
+
// `README.md` (and a `./A/x.md` would skip `A/access.md`).
|
|
258
|
+
if (repoRelTarget.split('/').some((segment) => segment === '.')) {
|
|
259
|
+
throw new AccessMutationError("path must not contain '.' segments");
|
|
260
|
+
}
|
|
187
261
|
}
|
|
188
262
|
|
|
189
263
|
/**
|
|
190
264
|
* GET /api/workspace/:id/access?path=<relativePath>&kind=<folder|file>
|
|
191
265
|
* Returns the resolved access view for the current user at a single path,
|
|
192
266
|
* including a per-principal `sources` map (where each principal's access comes
|
|
193
|
-
* from) so the dialog can show inherited-vs-direct
|
|
194
|
-
* (
|
|
195
|
-
*
|
|
267
|
+
* from) so the dialog can show inherited-vs-direct, the matching `denials` map
|
|
268
|
+
* (per verb, the entries that DENY it — same direct/ancestor split, closest
|
|
269
|
+
* first, stopping at a grant that beats them) and `deniedHere` — every
|
|
270
|
+
* principal a deny ON THIS TARGET names, however many verbs it took. Note what
|
|
271
|
+
* that is NOT: a partial restriction (edit denied, read still inherited) puts
|
|
272
|
+
* the principal in `deniedHere` while they stay in the eligible lists for the
|
|
273
|
+
* verbs they keep; only a principal denied every verb holds nothing and drops
|
|
274
|
+
* out of those lists. A deny naming a role nobody knows appears in neither
|
|
275
|
+
* field — the resolver ignores such a line, so it restricts nothing.
|
|
276
|
+
*
|
|
277
|
+
* Together those two let the dialog decide its sections by LOCAL ENTRY, grant
|
|
278
|
+
* or denial, rather than by local grant alone: without them a person
|
|
279
|
+
* restricted here reads as merely inherited and drops into the collapsed
|
|
280
|
+
* parent section, looking removed.
|
|
281
|
+
*
|
|
282
|
+
* `kind` defaults to `file` (the resolver treats a folder vs a file's own scope
|
|
283
|
+
* differently only for the direct/ancestor split; the eligible/verdict fields
|
|
284
|
+
* are identical).
|
|
196
285
|
*/
|
|
197
286
|
router.get('/workspace/:id/access', async (req, res) => {
|
|
198
287
|
const user = await requireUser(req, res);
|
|
199
288
|
if (!user) return;
|
|
200
289
|
|
|
201
290
|
const rawPath = req.query.path;
|
|
202
|
-
|
|
291
|
+
const kind: TargetKind = req.query.kind === 'folder' ? 'folder' : 'file';
|
|
292
|
+
// The dialog addresses the repository root as the empty repo-relative path,
|
|
293
|
+
// so an empty `path` is the root FOLDER — refusing it left the root
|
|
294
|
+
// dialog unable to re-read its view after a change.
|
|
295
|
+
if (typeof rawPath !== 'string' || (!rawPath && kind !== 'folder')) {
|
|
203
296
|
res.status(400).json({ error: 'path query parameter is required' });
|
|
204
297
|
return;
|
|
205
298
|
}
|
|
206
|
-
const kind: TargetKind = req.query.kind === 'folder' ? 'folder' : 'file';
|
|
207
299
|
|
|
208
300
|
try {
|
|
209
301
|
// Same sanitize/validate the POST routes apply: strip any kbDir prefix and
|
|
@@ -277,15 +369,84 @@ export function createAccessRoutes(
|
|
|
277
369
|
}
|
|
278
370
|
});
|
|
279
371
|
|
|
372
|
+
/**
|
|
373
|
+
* GET /api/workspace/:id/access/prospective?from=<file>&toDir=<folder>
|
|
374
|
+
*
|
|
375
|
+
* Who can open and who can edit one file where it is, and where a move
|
|
376
|
+
* would put it — `{ before, after }`, each `{ read, write }` lists of
|
|
377
|
+
* principals named as their grants name them. `toDir` is the destination
|
|
378
|
+
* FOLDER (`''` is the repo root); the file keeps its name, so the route
|
|
379
|
+
* derives the destination path itself rather than trusting a second one.
|
|
380
|
+
*
|
|
381
|
+
* The destination path does not exist yet, which is why this cannot be two
|
|
382
|
+
* calls to `GET /access`: the resolver is asked for a hypothetical, with
|
|
383
|
+
* the file's own frontmatter (read where the file actually is) layered over
|
|
384
|
+
* the destination's folder chain. Nothing is written and nothing is moved.
|
|
385
|
+
*
|
|
386
|
+
* Gated like the sibling `overrides` route rather than the permissive
|
|
387
|
+
* `GET /access`: the caller must resolve read on the file being moved. The
|
|
388
|
+
* lists name people, and someone who cannot see the file has no business
|
|
389
|
+
* learning who can.
|
|
390
|
+
*
|
|
391
|
+
* `from` must be a FILE. A folder carries its own `access.md` and governs
|
|
392
|
+
* everything under it, which is a different question; the resolver refuses
|
|
393
|
+
* one with a 400 rather than answering it as if it were a file.
|
|
394
|
+
*/
|
|
395
|
+
router.get('/workspace/:id/access/prospective', async (req, res) => {
|
|
396
|
+
const user = await requireUser(req, res);
|
|
397
|
+
if (!user) return;
|
|
398
|
+
|
|
399
|
+
const rawFrom = req.query.from;
|
|
400
|
+
// An empty `toDir` is the repo ROOT, a real destination — only a missing
|
|
401
|
+
// one is a bad request.
|
|
402
|
+
const rawToDir = req.query.toDir;
|
|
403
|
+
if (typeof rawFrom !== 'string' || !rawFrom) {
|
|
404
|
+
res.status(400).json({ error: 'from query parameter is required' });
|
|
405
|
+
return;
|
|
406
|
+
}
|
|
407
|
+
if (typeof rawToDir !== 'string') {
|
|
408
|
+
res.status(400).json({ error: 'toDir query parameter is required' });
|
|
409
|
+
return;
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
try {
|
|
413
|
+
const from = toRepoRelative(rawFrom);
|
|
414
|
+
assertRepoRelativeTarget(from, 'file');
|
|
415
|
+
const toDir = toRepoRelative(rawToDir);
|
|
416
|
+
assertRepoRelativeTarget(toDir, 'folder');
|
|
417
|
+
|
|
418
|
+
if (!(await accessControl.canRead(req.params.id, user.email, from))) {
|
|
419
|
+
res.status(403).json({ error: 'You do not have access to this file.' });
|
|
420
|
+
return;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
const name = from.slice(from.lastIndexOf('/') + 1);
|
|
424
|
+
const to = toDir ? `${toDir}/${name}` : name;
|
|
425
|
+
const { before, after } = await accessControl.prospectiveHolders(req.params.id, from, to);
|
|
426
|
+
res.json({
|
|
427
|
+
before: { read: holderPrincipals(before.read), write: holderPrincipals(before.write) },
|
|
428
|
+
after: { read: holderPrincipals(after.read), write: holderPrincipals(after.write) },
|
|
429
|
+
});
|
|
430
|
+
} catch (err) {
|
|
431
|
+
const { status, body } = toHttpError(err);
|
|
432
|
+
res.status(status).json(body);
|
|
433
|
+
}
|
|
434
|
+
});
|
|
435
|
+
|
|
280
436
|
/**
|
|
281
437
|
* POST /api/workspace/:id/access/batch
|
|
282
|
-
* Body: `{ paths: string[]
|
|
438
|
+
* Body: `{ paths: string[], verb?: 'write' | 'owner' }`. Returns
|
|
439
|
+
* `{ results: { [path]: boolean } }`.
|
|
440
|
+
*
|
|
441
|
+
* `verb` defaults to `write`, the question every existing caller asks.
|
|
442
|
+
* `owner` answers from the `owner:` lists alone — no admin rescue, and a
|
|
443
|
+
* writer is not an owner — which is what an Owner pill has to mean.
|
|
283
444
|
*/
|
|
284
445
|
router.post('/workspace/:id/access/batch', async (req, res) => {
|
|
285
446
|
const user = await requireUser(req, res);
|
|
286
447
|
if (!user) return;
|
|
287
448
|
|
|
288
|
-
const paths =
|
|
449
|
+
const { paths, verb = 'write' } = req.body as { paths?: unknown; verb?: unknown };
|
|
289
450
|
if (!Array.isArray(paths) || paths.some((p) => typeof p !== 'string')) {
|
|
290
451
|
res.status(400).json({ error: 'paths must be an array of strings' });
|
|
291
452
|
return;
|
|
@@ -294,9 +455,15 @@ export function createAccessRoutes(
|
|
|
294
455
|
res.status(400).json({ error: 'paths cannot exceed 500 entries per request' });
|
|
295
456
|
return;
|
|
296
457
|
}
|
|
458
|
+
if (verb !== 'write' && verb !== 'owner') {
|
|
459
|
+
res.status(400).json({ error: 'verb must be "write" or "owner"' });
|
|
460
|
+
return;
|
|
461
|
+
}
|
|
297
462
|
|
|
298
463
|
try {
|
|
299
|
-
const
|
|
464
|
+
const batch = verb === 'owner' ? accessControl.canOwnerBatch : accessControl.canWriteBatch;
|
|
465
|
+
const result = await batch.call(
|
|
466
|
+
accessControl,
|
|
300
467
|
req.params.id,
|
|
301
468
|
user.email,
|
|
302
469
|
paths as string[],
|
|
@@ -320,7 +487,9 @@ export function createAccessRoutes(
|
|
|
320
487
|
* always show; PEOPLE are withheld until `q` is ≥ 2 chars, so an empty query
|
|
321
488
|
* can't dump the whole directory (email-harvesting guard). People are the
|
|
322
489
|
* union of the KB-canonical set (roles.yaml + access.md grants) and the
|
|
323
|
-
* `users` table (logged-in users). Results are capped.
|
|
490
|
+
* `users` table (logged-in users). Results are capped. Each person carries
|
|
491
|
+
* `hasAccount` — false for someone named only in the KB, who has never
|
|
492
|
+
* signed in — so the dialog can label them; it withholds nobody.
|
|
324
493
|
*
|
|
325
494
|
* A name shared by a group and a role is offered as BOTH — nothing is
|
|
326
495
|
* withheld: grant precedence resolves the collision (bare token = the
|
|
@@ -332,14 +501,18 @@ export function createAccessRoutes(
|
|
|
332
501
|
|
|
333
502
|
const q = (typeof req.query.q === 'string' ? req.query.q : '').trim().toLowerCase();
|
|
334
503
|
const CAP = 15;
|
|
504
|
+
// The harvesting guard, named once: it decides both that people are not
|
|
505
|
+
// returned and that this answer says nothing about accounts. The two must
|
|
506
|
+
// never disagree — a withheld list is not evidence that nobody has one.
|
|
507
|
+
const peopleWithheld = q.length < 2;
|
|
335
508
|
try {
|
|
336
509
|
// Independent lookups batched in ONE Promise.all: the default-branch
|
|
337
510
|
// principals (cached model), the branch-local KB people (cached model),
|
|
338
511
|
// and the users table (only consulted once the query is long enough).
|
|
339
|
-
const [{ roles, groups }, { people: kbPeople }, userRows] = await Promise.all([
|
|
512
|
+
const [{ roles, groups, plugins }, { people: kbPeople }, userRows] = await Promise.all([
|
|
340
513
|
defaultBranchPrincipals(),
|
|
341
514
|
accessControl.kbPrincipals(req.params.id),
|
|
342
|
-
|
|
515
|
+
peopleWithheld ? Promise.resolve([]) : db.select().from(users),
|
|
343
516
|
]);
|
|
344
517
|
|
|
345
518
|
const matchedRoles = roles
|
|
@@ -350,8 +523,21 @@ export function createAccessRoutes(
|
|
|
350
523
|
.filter((g) => !q || g.toLowerCase().includes(q))
|
|
351
524
|
.slice(0, CAP);
|
|
352
525
|
|
|
353
|
-
|
|
354
|
-
|
|
526
|
+
// Plugins the caller can DISCOVER (read the folder's access.md — the
|
|
527
|
+
// same verdict the plugin index lists on), so the picker never names a
|
|
528
|
+
// plugin its enumeration would hide. Their `plugin/<Name>/<verb>`
|
|
529
|
+
// tokens are built client-side; the name is what a person searches for.
|
|
530
|
+
const matchedPlugins = (
|
|
531
|
+
await discoverablePlugins(
|
|
532
|
+
user.email,
|
|
533
|
+
plugins.filter((p) => !q || p.name.toLowerCase().includes(q)),
|
|
534
|
+
)
|
|
535
|
+
)
|
|
536
|
+
.map((p) => p.name)
|
|
537
|
+
.slice(0, CAP);
|
|
538
|
+
|
|
539
|
+
let people: { name: string; email: string; hasAccount: boolean }[] = [];
|
|
540
|
+
if (!peopleWithheld) {
|
|
355
541
|
// Union the KB-canonical people with the login-only users table.
|
|
356
542
|
const byEmail = new Map<string, { name: string; email: string }>();
|
|
357
543
|
for (const p of kbPeople) byEmail.set(p.email.toLowerCase(), p);
|
|
@@ -365,16 +551,45 @@ export function createAccessRoutes(
|
|
|
365
551
|
byEmail.set(key, { name: u.name || u.email, email: u.email });
|
|
366
552
|
}
|
|
367
553
|
}
|
|
554
|
+
// A suggestion says whether that person has an ACCOUNT, the same fact
|
|
555
|
+
// the access view reports: `users` is exactly the set that has signed
|
|
556
|
+
// in, so a KB-canonical person named only in access rules — someone
|
|
557
|
+
// granted ahead of their first sign-in — comes back `false` and the
|
|
558
|
+
// dialog labels the chip it makes of them.
|
|
559
|
+
const accountEmails = new Set(userRows.map((u) => u.email.trim().toLowerCase()));
|
|
368
560
|
people = [...byEmail.values()]
|
|
369
561
|
.filter((p) => p.email.toLowerCase().includes(q) || p.name.toLowerCase().includes(q))
|
|
370
|
-
.
|
|
562
|
+
// The address actually TYPED is never hidden by the cap. A chip made
|
|
563
|
+
// from a free-typed email labels itself by ABSENCE from this list, so
|
|
564
|
+
// an exact match dropped at the 15th match would say "hasn't signed
|
|
565
|
+
// in yet" about somebody who has. Exact email first, then the rest in
|
|
566
|
+
// the order they were unioned (sort is stable), then cap.
|
|
567
|
+
.sort((a, b) => Number(b.email.toLowerCase() === q) - Number(a.email.toLowerCase() === q))
|
|
568
|
+
.slice(0, CAP)
|
|
569
|
+
.map((p) => ({ ...p, hasAccount: accountEmails.has(p.email.trim().toLowerCase()) }));
|
|
371
570
|
}
|
|
372
571
|
|
|
373
572
|
res.json({
|
|
374
573
|
roles: matchedRoles,
|
|
375
574
|
groups: matchedGroups,
|
|
575
|
+
// Plugin FOLDER names; each stands for three grantable principals
|
|
576
|
+
// (`plugin/<Name>/read|write|owner`). Not `plugins` — that key is the
|
|
577
|
+
// deprecated alias of `roles` below.
|
|
578
|
+
pluginPrincipals: matchedPlugins,
|
|
376
579
|
people,
|
|
377
|
-
peopleWithheld
|
|
580
|
+
peopleWithheld,
|
|
581
|
+
// THIS ANSWER rules on accounts — not "this build can": every person
|
|
582
|
+
// above carries `hasAccount`, and an email absent from `people` is
|
|
583
|
+
// absent because no account exists for it. The dialog labels a
|
|
584
|
+
// free-typed chip only on this evidence.
|
|
585
|
+
//
|
|
586
|
+
// It is therefore false whenever people were WITHHELD: under two
|
|
587
|
+
// characters the harvesting guard returns nobody, and an empty list
|
|
588
|
+
// there means "not asked", which is not the same fact at all. An
|
|
589
|
+
// older server (no such field) and a failed lookup (no response) are
|
|
590
|
+
// the other two ways to say nothing — all three leave the address
|
|
591
|
+
// unjudged rather than labelled on a guess.
|
|
592
|
+
accountsKnown: !peopleWithheld,
|
|
378
593
|
// DEPRECATED alias of `roles` — the shipped share dialog still reads
|
|
379
594
|
// `plugins`. Kept populated for ONE release; remove in 0.2.0 together
|
|
380
595
|
// with the dialog's rename to `roles`.
|
|
@@ -428,8 +643,19 @@ export function createAccessRoutes(
|
|
|
428
643
|
throw new AccessMutationError('group principal needs a group name');
|
|
429
644
|
}
|
|
430
645
|
principal = { kind: 'group', group: principalRaw.group };
|
|
646
|
+
} else if (principalRaw.kind === 'plugin') {
|
|
647
|
+
if (typeof principalRaw.plugin !== 'string' || !principalRaw.plugin.trim()) {
|
|
648
|
+
throw new AccessMutationError('plugin principal needs a plugin name');
|
|
649
|
+
}
|
|
650
|
+
const verb = principalRaw.verb;
|
|
651
|
+
if (typeof verb !== 'string' || !(PLUGIN_TOKEN_VERBS as readonly string[]).includes(verb)) {
|
|
652
|
+
throw new AccessMutationError(
|
|
653
|
+
`plugin principal needs a verb: one of ${PLUGIN_TOKEN_VERBS.join(', ')}`,
|
|
654
|
+
);
|
|
655
|
+
}
|
|
656
|
+
principal = { kind: 'plugin', plugin: principalRaw.plugin, verb: verb as PluginTokenVerb };
|
|
431
657
|
} else {
|
|
432
|
-
throw new AccessMutationError("principal.kind must be 'user', 'group', or 'role'");
|
|
658
|
+
throw new AccessMutationError("principal.kind must be 'user', 'group', 'plugin', or 'role'");
|
|
433
659
|
}
|
|
434
660
|
const targetKind = kind as TargetKind;
|
|
435
661
|
const repoRelTarget = toRepoRelative(rawPath);
|
|
@@ -441,11 +667,16 @@ export function createAccessRoutes(
|
|
|
441
667
|
* The access.md / node path the write lands on, and the path the write-gate
|
|
442
668
|
* keys on. For a folder both are the folder's access.md; for a file they are
|
|
443
669
|
* the node file itself.
|
|
670
|
+
*
|
|
671
|
+
* A file that cannot carry frontmatter has no path of its own to edit: this
|
|
672
|
+
* throws `folder-governs-access` (422) before any gate, lock or read, so the
|
|
673
|
+
* grant, default revoke and deny-here all refuse it identically.
|
|
444
674
|
*/
|
|
445
675
|
function gateAndEditPaths(kind: TargetKind, repoRelTarget: string): {
|
|
446
676
|
gatePath: string;
|
|
447
677
|
editPath: string;
|
|
448
678
|
} {
|
|
679
|
+
assertFileCarriesAccessRules(kind, repoRelTarget);
|
|
449
680
|
const editPath = kind === 'folder' ? accessMdPathForFolder(repoRelTarget) : repoRelTarget;
|
|
450
681
|
return { gatePath: editPath, editPath };
|
|
451
682
|
}
|
|
@@ -483,6 +714,28 @@ export function createAccessRoutes(
|
|
|
483
714
|
void isProtectedBranch;
|
|
484
715
|
}
|
|
485
716
|
|
|
717
|
+
/**
|
|
718
|
+
* Which of `emails` have an ACCOUNT — a row in `users`, which exists only
|
|
719
|
+
* once that person has signed in at least once. Emails are stored canonical
|
|
720
|
+
* (the auth service lowercases every address it writes), so the canonical
|
|
721
|
+
* forms match the unique index directly and the lookup stays one indexed
|
|
722
|
+
* query scoped to the addresses asked about.
|
|
723
|
+
*
|
|
724
|
+
* Purely informational. No grant is refused, delayed or rewritten because
|
|
725
|
+
* an email is missing here — pre-provisioning under single sign-on means
|
|
726
|
+
* granting to an address whose account does not exist yet, and that is a
|
|
727
|
+
* supported thing to do.
|
|
728
|
+
*/
|
|
729
|
+
async function accountsAmong(emails: string[]): Promise<Set<string>> {
|
|
730
|
+
// `inArray` refuses an empty list, and there is nothing to ask anyway.
|
|
731
|
+
if (emails.length === 0) return new Set();
|
|
732
|
+
const rows = await db
|
|
733
|
+
.select({ email: users.email })
|
|
734
|
+
.from(users)
|
|
735
|
+
.where(inArray(users.email, emails));
|
|
736
|
+
return new Set(rows.map((r) => r.email.trim().toLowerCase()));
|
|
737
|
+
}
|
|
738
|
+
|
|
486
739
|
/** The full resolved-access view returned after a successful mutation. */
|
|
487
740
|
async function resolvedView(
|
|
488
741
|
workspaceId: string,
|
|
@@ -490,69 +743,47 @@ export function createAccessRoutes(
|
|
|
490
743
|
userEmail: string,
|
|
491
744
|
kind: TargetKind,
|
|
492
745
|
) {
|
|
493
|
-
const
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
//
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
// the all-roles fallback).
|
|
520
|
-
const collectives = new Map<string, { name: string; kind: 'role' | 'group' }>();
|
|
521
|
-
for (const list of [eligible, readers, owners, downloaders]) {
|
|
522
|
-
const kinded =
|
|
523
|
-
list.principals ?? list.roles.map((name) => ({ name, kind: 'role' as const }));
|
|
524
|
-
for (const p of kinded) {
|
|
525
|
-
const key = `${p.kind === 'group' ? 'g' : 'r'}:${p.name.toLowerCase()}`;
|
|
526
|
-
if (!collectives.has(key)) collectives.set(key, p);
|
|
527
|
-
}
|
|
528
|
-
}
|
|
529
|
-
const userSet = new Map<string, { name: string; email: string }>();
|
|
530
|
-
for (const u of [...eligible.users, ...readers.users, ...owners.users, ...downloaders.users]) {
|
|
531
|
-
if (!userSet.has(u.email.toLowerCase())) userSet.set(u.email.toLowerCase(), u);
|
|
746
|
+
const resolved = await resolveAccessView(accessControl, workspaceId, repoRelTarget, userEmail, kind);
|
|
747
|
+
|
|
748
|
+
// Every person the view names says whether they have signed in yet, so the
|
|
749
|
+
// dialog can label a grant made ahead of a first sign-in (`hasAccount:
|
|
750
|
+
// false`) without changing what the grant does. The flag is read from the
|
|
751
|
+
// users table each time the view is built, so it flips to true on its own
|
|
752
|
+
// the first time that person signs in.
|
|
753
|
+
//
|
|
754
|
+
// BEST-EFFORT, deliberately: this view is built AFTER the mutation has
|
|
755
|
+
// committed, so a users lookup that fails must not turn a grant that was
|
|
756
|
+
// written into a 500 the caller reads as "it did not save". On failure the
|
|
757
|
+
// flag is simply ABSENT — which the dialog reads as "the server did not
|
|
758
|
+
// say", not as "no account", so nobody is labelled on a guess.
|
|
759
|
+
let view: AccessView | LabelledAccessView = resolved;
|
|
760
|
+
try {
|
|
761
|
+
view = labelAccountHolders(resolved, await accountsAmong(emailsInView(resolved)));
|
|
762
|
+
} catch (err) {
|
|
763
|
+
// Every piece of this line is caller-controlled — the workspace id and
|
|
764
|
+
// path come off the request, and the driver's message can carry back
|
|
765
|
+
// text from the query. `printable` quotes each as one token, the same
|
|
766
|
+
// rule the rest of the backend's logs follow.
|
|
767
|
+
logger('access.view.accounts').warn(
|
|
768
|
+
`users lookup failed for ws=${printable(workspaceId)} path=${printable(repoRelTarget)}; hasAccount omitted: ${printable(
|
|
769
|
+
err instanceof Error ? err.message : String(err),
|
|
770
|
+
)}`,
|
|
771
|
+
);
|
|
532
772
|
}
|
|
533
|
-
const sources: Record<string, Awaited<ReturnType<IAccessControl['grantSources']>>> = {};
|
|
534
|
-
await Promise.all([
|
|
535
|
-
...[...collectives.entries()].map(async ([key, p]) => {
|
|
536
|
-
const token =
|
|
537
|
-
p.kind === 'role' && canonicalRoleName(p.name) !== EVERYONE_CANONICAL
|
|
538
|
-
? `${ROLE_TOKEN_PREFIX}${p.name}`
|
|
539
|
-
: p.name;
|
|
540
|
-
sources[key] = await accessControl.grantSources(workspaceId, kind, repoRelTarget, {
|
|
541
|
-
kind: 'role',
|
|
542
|
-
role: token,
|
|
543
|
-
});
|
|
544
|
-
}),
|
|
545
|
-
...[...userSet.values()].map(async (u) => {
|
|
546
|
-
sources[`u:${u.email.toLowerCase()}`] = await accessControl.grantSources(
|
|
547
|
-
workspaceId,
|
|
548
|
-
kind,
|
|
549
|
-
repoRelTarget,
|
|
550
|
-
{ kind: 'user', email: u.email },
|
|
551
|
-
);
|
|
552
|
-
}),
|
|
553
|
-
]);
|
|
554
773
|
|
|
555
|
-
|
|
774
|
+
// A file that cannot carry frontmatter has no rules of its own: name the
|
|
775
|
+
// folder whose rules govern it (repo-relative, `''` for the root), which
|
|
776
|
+
// is where the mutation routes point too.
|
|
777
|
+
// Content counts as much as the name: bytes that are not text (a binary
|
|
778
|
+
// saved as `.md`) are refused by the mutations too, so the view must say
|
|
779
|
+
// so — otherwise the dialog offers a field whose every write answers 422.
|
|
780
|
+
const governedByFolder =
|
|
781
|
+
kind === 'file' &&
|
|
782
|
+
(!fileCarriesAccessRules(repoRelTarget) || !(await mutation.targetHoldsText(workspaceId, repoRelTarget)))
|
|
783
|
+
? governingFolderOf(repoRelTarget)
|
|
784
|
+
: undefined;
|
|
785
|
+
|
|
786
|
+
return { ...view, ...(governedByFolder !== undefined && { governedByFolder }) };
|
|
556
787
|
}
|
|
557
788
|
|
|
558
789
|
/**
|
|
@@ -560,6 +791,14 @@ export function createAccessRoutes(
|
|
|
560
791
|
* under the lock) → release (enqueues the commit + push out of band). Mirrors
|
|
561
792
|
* the human-save `withLock` so protected-branch enforcement + commit-as-user
|
|
562
793
|
* are inherited. On op failure, release WITHOUT committing partial bytes.
|
|
794
|
+
*
|
|
795
|
+
* The whole sequence takes the path's TURN first, exactly as `PUT /file`
|
|
796
|
+
* does (turn outside, lock inside — the same order, so the two can never
|
|
797
|
+
* wait on each other). The mutation re-reads the file under the lock and
|
|
798
|
+
* refuses binary content; without the turn an upload landing between that
|
|
799
|
+
* read and the write would be overwritten by frontmatter, or would arrive
|
|
800
|
+
* just after the read and turn a refusal into a discard of the upload. The
|
|
801
|
+
* write inside takes the same turn re-entrantly.
|
|
563
802
|
*/
|
|
564
803
|
async function withEditLock(
|
|
565
804
|
workspaceId: string,
|
|
@@ -569,6 +808,20 @@ export function createAccessRoutes(
|
|
|
569
808
|
op: () => Promise<void>,
|
|
570
809
|
): Promise<void> {
|
|
571
810
|
const wsEditPath = `${kbDirName}/${editPath}`;
|
|
811
|
+
return workspaceService.withPathTurn(workspaceId, wsEditPath, () =>
|
|
812
|
+
lockAndRun(workspaceId, branch, wsEditPath, editPath, user, op),
|
|
813
|
+
);
|
|
814
|
+
}
|
|
815
|
+
|
|
816
|
+
/** The acquire → op → release half of {@link withEditLock}, inside the turn. */
|
|
817
|
+
async function lockAndRun(
|
|
818
|
+
workspaceId: string,
|
|
819
|
+
branch: string,
|
|
820
|
+
wsEditPath: string,
|
|
821
|
+
editPath: string,
|
|
822
|
+
user: AuthUser,
|
|
823
|
+
op: () => Promise<void>,
|
|
824
|
+
): Promise<void> {
|
|
572
825
|
const existing = await workflowService.getLock(workspaceId, branch, wsEditPath);
|
|
573
826
|
if (existing && existing.holderUserId === user.id) {
|
|
574
827
|
// Caller already holds the lock (mid-edit) — write without touching it.
|
|
@@ -598,7 +851,16 @@ export function createAccessRoutes(
|
|
|
598
851
|
await op();
|
|
599
852
|
} catch (err) {
|
|
600
853
|
try {
|
|
601
|
-
|
|
854
|
+
// A refusal wrote NOTHING, so the release must leave the disk alone:
|
|
855
|
+
// `releaseLockNoCommit` discards the path's working-tree changes, and
|
|
856
|
+
// right after an upload whose commit is still queued that deletes the
|
|
857
|
+
// upload. Every other failure may have left partial bytes, so it keeps
|
|
858
|
+
// the discarding release.
|
|
859
|
+
if (isFolderGovernsRefusal(err)) {
|
|
860
|
+
await workflowService.releaseLockUntouched(workspaceId, branch, wsEditPath, user);
|
|
861
|
+
} else {
|
|
862
|
+
await workflowService.releaseLockNoCommit(workspaceId, branch, wsEditPath, user);
|
|
863
|
+
}
|
|
602
864
|
} catch {
|
|
603
865
|
/* best-effort */
|
|
604
866
|
}
|
|
@@ -673,6 +935,22 @@ export function createAccessRoutes(
|
|
|
673
935
|
{ kind: 'unknown-group', group: principal.group },
|
|
674
936
|
);
|
|
675
937
|
}
|
|
938
|
+
} else if (principal.kind === 'plugin') {
|
|
939
|
+
// A plugin grant must name a plugin the caller can DISCOVER on the
|
|
940
|
+
// default branch — the same set the suggest list offers, so a plugin
|
|
941
|
+
// hidden from the picker is refused here with the same words as one
|
|
942
|
+
// that does not exist. Matched on the manifest slug, the identity the
|
|
943
|
+
// token canonicalises to.
|
|
944
|
+
const { plugins } = await defaultBranchPrincipals();
|
|
945
|
+
const slug = pluginManifestName(principal.plugin);
|
|
946
|
+
const visible = await discoverablePlugins(user.email, plugins);
|
|
947
|
+
if (!visible.some((p) => pluginManifestName(p.name) === slug)) {
|
|
948
|
+
throw new AccessMutationError(
|
|
949
|
+
`No plugin named "${principal.plugin}". Pick an existing plugin.`,
|
|
950
|
+
404,
|
|
951
|
+
{ kind: 'unknown-plugin', plugin: principal.plugin },
|
|
952
|
+
);
|
|
953
|
+
}
|
|
676
954
|
}
|
|
677
955
|
// Splice shape: group → bare token (group-first precedence); role →
|
|
678
956
|
// explicit `role/<Name>` token (see asSplicePrincipal).
|
|
@@ -683,6 +961,8 @@ export function createAccessRoutes(
|
|
|
683
961
|
await workspaceService.getOrCreateForBranch(branch);
|
|
684
962
|
// Fail-closed gate (BEFORE acquiring the lock).
|
|
685
963
|
await assertCanMutate(workspaceId, branch, user.email, gatePath);
|
|
964
|
+
// Binary content refuses BEFORE the lock (see assertTargetHoldsText).
|
|
965
|
+
await mutation.assertTargetHoldsText(workspaceId, kind, repoRelTarget);
|
|
686
966
|
|
|
687
967
|
const editPath = gatePath; // grant edits the same path it gates on
|
|
688
968
|
await withEditLock(workspaceId, branch, editPath, user, async () => {
|
|
@@ -693,17 +973,15 @@ export function createAccessRoutes(
|
|
|
693
973
|
// re-resolve reads the just-written bytes (the async commit's own
|
|
694
974
|
// invalidate is too late for this synchronous response).
|
|
695
975
|
accessControl.invalidate(workspaceId);
|
|
696
|
-
|
|
697
|
-
`
|
|
976
|
+
grantLog.info(
|
|
977
|
+
`ws=${workspaceId} branch=${branch} byUserId=${user.id} ` +
|
|
698
978
|
`verb=${verb} kind=${kind} target=${repoRelTarget} ` +
|
|
699
979
|
`principalKind=${principal.kind} -> ok`,
|
|
700
980
|
);
|
|
701
981
|
res.json(await resolvedView(workspaceId, repoRelTarget, user.email, kind));
|
|
702
982
|
} catch (err) {
|
|
703
983
|
if (err instanceof AccessDeniedError) {
|
|
704
|
-
|
|
705
|
-
`[access.grant.denied] ws=${workspaceId} byUserId=${user.id} -> 403`,
|
|
706
|
-
);
|
|
984
|
+
logger('access.grant.denied').warn(`ws=${workspaceId} byUserId=${user.id} -> 403`);
|
|
707
985
|
}
|
|
708
986
|
const { status, body } = toHttpError(err);
|
|
709
987
|
res.status(status).json(body);
|
|
@@ -814,8 +1092,8 @@ export function createAccessRoutes(
|
|
|
814
1092
|
});
|
|
815
1093
|
|
|
816
1094
|
accessControl.invalidate(workspaceId);
|
|
817
|
-
|
|
818
|
-
`
|
|
1095
|
+
logger('access.revoke.remove-from-parent').info(
|
|
1096
|
+
`ws=${workspaceId} branch=${branch} ` +
|
|
819
1097
|
`byUserId=${user.id} ancestor=${ancestorDir} target=${repoRelTarget} verb=${verb ?? 'all'} -> ok`,
|
|
820
1098
|
);
|
|
821
1099
|
res.json(await resolvedView(workspaceId, repoRelTarget, user.email, kind));
|
|
@@ -826,13 +1104,14 @@ export function createAccessRoutes(
|
|
|
826
1104
|
if (mode === 'deny-here') {
|
|
827
1105
|
const { gatePath } = gateAndEditPaths(kind, repoRelTarget);
|
|
828
1106
|
await assertCanMutate(workspaceId, branch, user.email, gatePath);
|
|
1107
|
+
await mutation.assertTargetHoldsText(workspaceId, kind, repoRelTarget);
|
|
829
1108
|
await withEditLock(workspaceId, branch, gatePath, user, async () => {
|
|
830
1109
|
// Scope the deny to the same verb the user acted on (if any).
|
|
831
1110
|
await mutation.denyHere(workspaceId, kind, repoRelTarget, principal, verb, revokeOpts);
|
|
832
1111
|
});
|
|
833
1112
|
accessControl.invalidate(workspaceId);
|
|
834
|
-
|
|
835
|
-
`
|
|
1113
|
+
logger('access.revoke.deny-here').info(
|
|
1114
|
+
`ws=${workspaceId} branch=${branch} ` +
|
|
836
1115
|
`byUserId=${user.id} target=${repoRelTarget} verb=${verb ?? 'all'} -> ok`,
|
|
837
1116
|
);
|
|
838
1117
|
res.json(await resolvedView(workspaceId, repoRelTarget, user.email, kind));
|
|
@@ -842,6 +1121,7 @@ export function createAccessRoutes(
|
|
|
842
1121
|
// ---- default: revoke on the target, classified -----------------------
|
|
843
1122
|
const { gatePath } = gateAndEditPaths(kind, repoRelTarget);
|
|
844
1123
|
await assertCanMutate(workspaceId, branch, user.email, gatePath);
|
|
1124
|
+
await mutation.assertTargetHoldsText(workspaceId, kind, repoRelTarget);
|
|
845
1125
|
|
|
846
1126
|
const editPath = gatePath;
|
|
847
1127
|
let changed = false;
|
|
@@ -875,8 +1155,8 @@ export function createAccessRoutes(
|
|
|
875
1155
|
const sourcesToCheck: GrantSources = verb ? { [verb]: sources[verb] } : sources;
|
|
876
1156
|
const inherited = collectInheritedSources(sourcesToCheck);
|
|
877
1157
|
if (inherited.length > 0) {
|
|
878
|
-
|
|
879
|
-
`
|
|
1158
|
+
logger('access.revoke.inherited').info(
|
|
1159
|
+
`ws=${workspaceId} branch=${branch} byUserId=${user.id} ` +
|
|
880
1160
|
`target=${repoRelTarget} ancestors=${inherited.join(',')}`,
|
|
881
1161
|
);
|
|
882
1162
|
res.status(409).json({
|
|
@@ -896,15 +1176,15 @@ export function createAccessRoutes(
|
|
|
896
1176
|
// shows an `ancestor` source). The dialog reads that to chain into
|
|
897
1177
|
// "Remove from parent?" with no extra response field needed (the old
|
|
898
1178
|
// `stillInherited` shortcut is subsumed by the richer per-verb sources).
|
|
899
|
-
|
|
900
|
-
`
|
|
1179
|
+
revokeLog.info(
|
|
1180
|
+
`ws=${workspaceId} branch=${branch} byUserId=${user.id} ` +
|
|
901
1181
|
`kind=${kind} target=${repoRelTarget} principalKind=${principal.kind} changed=${changed} -> ok`,
|
|
902
1182
|
);
|
|
903
1183
|
res.json(await resolvedView(workspaceId, repoRelTarget, user.email, kind));
|
|
904
1184
|
} catch (err) {
|
|
905
1185
|
if (err instanceof AccessDeniedError || err instanceof AccessMutationError) {
|
|
906
|
-
|
|
907
|
-
`
|
|
1186
|
+
logger('access.revoke.denied').warn(
|
|
1187
|
+
`ws=${workspaceId} byUserId=${user.id} -> ${
|
|
908
1188
|
err instanceof WorkflowDomainError ? err.status : 500
|
|
909
1189
|
}`,
|
|
910
1190
|
);
|
|
@@ -915,7 +1195,7 @@ export function createAccessRoutes(
|
|
|
915
1195
|
});
|
|
916
1196
|
|
|
917
1197
|
// -------------------------------------------------------------------------
|
|
918
|
-
//
|
|
1198
|
+
// App roles (admin) — MEMBERSHIP editing on the DEFAULT-branch
|
|
919
1199
|
// roles.yaml. Roles are app-defined capabilities: there is deliberately NO
|
|
920
1200
|
// create/rename/delete route — the admin surface cannot mint, rebrand, or
|
|
921
1201
|
// retire a role (legacy people-set roles migrate out via convert-to-group).
|
|
@@ -1045,7 +1325,7 @@ export function createAccessRoutes(
|
|
|
1045
1325
|
if (!user) return;
|
|
1046
1326
|
try {
|
|
1047
1327
|
const roles = await rolesAdmin.recover(user);
|
|
1048
|
-
|
|
1328
|
+
logger('access.roles.recover').warn(`roles.yaml recovered byUserId=${user.id}`);
|
|
1049
1329
|
res.json({ roles });
|
|
1050
1330
|
} catch (err) {
|
|
1051
1331
|
const { status, body } = toHttpError(err);
|