@bevel-software/platform-core-backend 0.15.1 → 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/THIRD-PARTY-NOTICES.md +4 -4
- package/dist/core/catalog-cache-invalidation.d.ts +16 -0
- package/dist/core/catalog-cache-invalidation.d.ts.map +1 -1
- package/dist/core/catalog-cache-invalidation.js +6 -1
- package/dist/core/catalog-cache-invalidation.js.map +1 -1
- package/dist/core/catalog-revision.d.ts +39 -0
- package/dist/core/catalog-revision.d.ts.map +1 -0
- package/dist/core/catalog-revision.js +94 -0
- package/dist/core/catalog-revision.js.map +1 -0
- package/dist/core/create-core-server.d.ts +7 -0
- package/dist/core/create-core-server.d.ts.map +1 -1
- package/dist/core/create-core-server.js +221 -75
- package/dist/core/create-core-server.js.map +1 -1
- package/dist/core/create-core-services.d.ts +52 -2
- package/dist/core/create-core-services.d.ts.map +1 -1
- package/dist/core/create-core-services.js +222 -87
- package/dist/core/create-core-services.js.map +1 -1
- package/dist/core/lifecycle.d.ts +138 -0
- package/dist/core/lifecycle.d.ts.map +1 -0
- package/dist/core/lifecycle.js +218 -0
- package/dist/core/lifecycle.js.map +1 -0
- package/dist/core/public-config.d.ts +82 -0
- package/dist/core/public-config.d.ts.map +1 -0
- package/dist/core/public-config.js +78 -0
- package/dist/core/public-config.js.map +1 -0
- package/dist/core/readiness.d.ts +86 -0
- package/dist/core/readiness.d.ts.map +1 -0
- package/dist/core/readiness.js +56 -0
- package/dist/core/readiness.js.map +1 -0
- package/dist/core-config.d.ts +30 -0
- package/dist/core-config.d.ts.map +1 -1
- package/dist/core-config.js +64 -2
- package/dist/core-config.js.map +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/modules/access/access-control.interface.d.ts +215 -11
- package/dist/modules/access/access-control.interface.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.d.ts +57 -11
- package/dist/modules/access/access-control.service.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.js +616 -155
- package/dist/modules/access/access-control.service.js.map +1 -1
- package/dist/modules/access/access-mutation.service.d.ts +71 -5
- package/dist/modules/access/access-mutation.service.d.ts.map +1 -1
- package/dist/modules/access/access-mutation.service.js +161 -13
- package/dist/modules/access/access-mutation.service.js.map +1 -1
- package/dist/modules/access/access-view.d.ts +147 -0
- package/dist/modules/access/access-view.d.ts.map +1 -0
- package/dist/modules/access/access-view.js +211 -0
- package/dist/modules/access/access-view.js.map +1 -0
- package/dist/modules/access/access.routes.d.ts.map +1 -1
- package/dist/modules/access/access.routes.js +255 -79
- package/dist/modules/access/access.routes.js.map +1 -1
- package/dist/modules/access/admin-locked-commit.d.ts +2 -3
- package/dist/modules/access/admin-locked-commit.d.ts.map +1 -1
- package/dist/modules/access/admin-locked-commit.js +9 -8
- package/dist/modules/access/admin-locked-commit.js.map +1 -1
- package/dist/modules/access/admin-route-helpers.d.ts.map +1 -1
- package/dist/modules/access/admin-route-helpers.js +4 -4
- package/dist/modules/access/admin-route-helpers.js.map +1 -1
- package/dist/modules/access/change-read-gate.d.ts +53 -0
- package/dist/modules/access/change-read-gate.d.ts.map +1 -0
- package/dist/modules/access/change-read-gate.js +134 -0
- package/dist/modules/access/change-read-gate.js.map +1 -0
- package/dist/modules/access/creator-access.d.ts +33 -39
- package/dist/modules/access/creator-access.d.ts.map +1 -1
- package/dist/modules/access/creator-access.js +92 -119
- package/dist/modules/access/creator-access.js.map +1 -1
- package/dist/modules/access/directory-sync-bot.d.ts.map +1 -1
- package/dist/modules/access/directory-sync-bot.js +3 -1
- package/dist/modules/access/directory-sync-bot.js.map +1 -1
- package/dist/modules/access/groups-admin.service.d.ts +3 -3
- package/dist/modules/access/groups-admin.service.js +2 -2
- package/dist/modules/access/reference-scan.d.ts +1 -1
- package/dist/modules/access/reference-scan.d.ts.map +1 -1
- package/dist/modules/access/reference-scan.js +5 -4
- package/dist/modules/access/reference-scan.js.map +1 -1
- package/dist/modules/access/roles-admin.service.d.ts +72 -13
- package/dist/modules/access/roles-admin.service.d.ts.map +1 -1
- package/dist/modules/access/roles-admin.service.js +71 -13
- package/dist/modules/access/roles-admin.service.js.map +1 -1
- package/dist/modules/access/synced-groups-committer.d.ts.map +1 -1
- package/dist/modules/access/synced-groups-committer.js +8 -6
- package/dist/modules/access/synced-groups-committer.js.map +1 -1
- package/dist/modules/access/synced-groups-writer.d.ts.map +1 -1
- package/dist/modules/access/synced-groups-writer.js +3 -8
- package/dist/modules/access/synced-groups-writer.js.map +1 -1
- package/dist/modules/access/user-access-removal.service.d.ts +209 -0
- package/dist/modules/access/user-access-removal.service.d.ts.map +1 -0
- package/dist/modules/access/user-access-removal.service.js +662 -0
- package/dist/modules/access/user-access-removal.service.js.map +1 -0
- package/dist/modules/access-model/access-errors.d.ts +32 -1
- package/dist/modules/access-model/access-errors.d.ts.map +1 -1
- package/dist/modules/access-model/access-errors.js +38 -11
- package/dist/modules/access-model/access-errors.js.map +1 -1
- package/dist/modules/access-model/access-grammar.d.ts +49 -24
- package/dist/modules/access-model/access-grammar.d.ts.map +1 -1
- package/dist/modules/access-model/access-grammar.js +68 -48
- package/dist/modules/access-model/access-grammar.js.map +1 -1
- package/dist/modules/access-model/access-splice.d.ts.map +1 -1
- package/dist/modules/access-model/access-splice.js +18 -18
- package/dist/modules/access-model/access-splice.js.map +1 -1
- package/dist/modules/access-model/access-template.d.ts +22 -0
- package/dist/modules/access-model/access-template.d.ts.map +1 -0
- package/dist/modules/access-model/access-template.js +42 -0
- package/dist/modules/access-model/access-template.js.map +1 -0
- package/dist/modules/access-model/change-gate.d.ts +65 -0
- package/dist/modules/access-model/change-gate.d.ts.map +1 -0
- package/dist/modules/access-model/change-gate.js +25 -0
- package/dist/modules/access-model/change-gate.js.map +1 -0
- package/dist/modules/access-model/creator.d.ts +13 -16
- package/dist/modules/access-model/creator.d.ts.map +1 -1
- package/dist/modules/access-model/creator.js.map +1 -1
- package/dist/modules/access-model/frontmatter-lines.d.ts +27 -0
- package/dist/modules/access-model/frontmatter-lines.d.ts.map +1 -0
- package/dist/modules/access-model/frontmatter-lines.js +74 -0
- package/dist/modules/access-model/frontmatter-lines.js.map +1 -0
- package/dist/modules/access-model/plugin-principals.d.ts +5 -3
- package/dist/modules/access-model/plugin-principals.d.ts.map +1 -1
- package/dist/modules/access-model/plugin-principals.js +11 -17
- package/dist/modules/access-model/plugin-principals.js.map +1 -1
- package/dist/modules/access-model/roles-yaml-guard.d.ts +73 -2
- package/dist/modules/access-model/roles-yaml-guard.d.ts.map +1 -1
- package/dist/modules/access-model/roles-yaml-guard.js +153 -3
- package/dist/modules/access-model/roles-yaml-guard.js.map +1 -1
- package/dist/modules/admin/admin-access.service.d.ts.map +1 -1
- package/dist/modules/admin/admin-access.service.js +5 -2
- package/dist/modules/admin/admin-access.service.js.map +1 -1
- package/dist/modules/agent-instructions/agent-instructions.routes.d.ts +21 -0
- package/dist/modules/agent-instructions/agent-instructions.routes.d.ts.map +1 -0
- package/dist/modules/agent-instructions/agent-instructions.routes.js +38 -0
- package/dist/modules/agent-instructions/agent-instructions.routes.js.map +1 -0
- package/dist/modules/agent-instructions/compose.d.ts +71 -0
- package/dist/modules/agent-instructions/compose.d.ts.map +1 -0
- package/dist/modules/agent-instructions/compose.js +234 -0
- package/dist/modules/agent-instructions/compose.js.map +1 -0
- package/dist/modules/agent-instructions/index.d.ts +4 -0
- package/dist/modules/agent-instructions/index.d.ts.map +1 -0
- package/dist/modules/agent-instructions/index.js +4 -0
- package/dist/modules/agent-instructions/index.js.map +1 -0
- package/dist/modules/agent-instructions/read-preamble.d.ts +37 -0
- package/dist/modules/agent-instructions/read-preamble.d.ts.map +1 -0
- package/dist/modules/agent-instructions/read-preamble.js +81 -0
- package/dist/modules/agent-instructions/read-preamble.js.map +1 -0
- package/dist/modules/audit/agent-audit.service.d.ts +54 -0
- package/dist/modules/audit/agent-audit.service.d.ts.map +1 -0
- package/dist/modules/audit/agent-audit.service.js +290 -0
- package/dist/modules/audit/agent-audit.service.js.map +1 -0
- package/dist/modules/audit/agent-rest-audit.middleware.d.ts +40 -0
- package/dist/modules/audit/agent-rest-audit.middleware.d.ts.map +1 -0
- package/dist/modules/audit/agent-rest-audit.middleware.js +75 -0
- package/dist/modules/audit/agent-rest-audit.middleware.js.map +1 -0
- package/dist/modules/audit/audit.contract.d.ts +145 -0
- package/dist/modules/audit/audit.contract.d.ts.map +1 -0
- package/dist/modules/audit/audit.contract.js +35 -0
- package/dist/modules/audit/audit.contract.js.map +1 -0
- package/dist/modules/audit/audit.routes.d.ts +21 -0
- package/dist/modules/audit/audit.routes.d.ts.map +1 -0
- package/dist/modules/audit/audit.routes.js +157 -0
- package/dist/modules/audit/audit.routes.js.map +1 -0
- package/dist/modules/audit/event-classifier.d.ts +52 -0
- package/dist/modules/audit/event-classifier.d.ts.map +1 -0
- package/dist/modules/audit/event-classifier.js +123 -0
- package/dist/modules/audit/event-classifier.js.map +1 -0
- package/dist/modules/audit/index.d.ts +7 -0
- package/dist/modules/audit/index.d.ts.map +1 -0
- package/dist/modules/audit/index.js +7 -0
- package/dist/modules/audit/index.js.map +1 -0
- package/dist/modules/audit/request-audit.d.ts +57 -0
- package/dist/modules/audit/request-audit.d.ts.map +1 -0
- package/dist/modules/audit/request-audit.js +117 -0
- package/dist/modules/audit/request-audit.js.map +1 -0
- package/dist/modules/auth/account-erasure.service.d.ts +30 -4
- package/dist/modules/auth/account-erasure.service.d.ts.map +1 -1
- package/dist/modules/auth/account-erasure.service.js +96 -10
- package/dist/modules/auth/account-erasure.service.js.map +1 -1
- package/dist/modules/auth/account.routes.d.ts +6 -3
- package/dist/modules/auth/account.routes.d.ts.map +1 -1
- package/dist/modules/auth/account.routes.js +109 -10
- package/dist/modules/auth/account.routes.js.map +1 -1
- package/dist/modules/auth/auth.routes.d.ts +10 -3
- package/dist/modules/auth/auth.routes.d.ts.map +1 -1
- package/dist/modules/auth/auth.routes.js +9 -4
- package/dist/modules/auth/auth.routes.js.map +1 -1
- package/dist/modules/auth/auth.service.d.ts +89 -5
- package/dist/modules/auth/auth.service.d.ts.map +1 -1
- package/dist/modules/auth/auth.service.js +160 -25
- package/dist/modules/auth/auth.service.js.map +1 -1
- package/dist/modules/auth/oidc-auth-provider.d.ts +46 -3
- package/dist/modules/auth/oidc-auth-provider.d.ts.map +1 -1
- package/dist/modules/auth/oidc-auth-provider.js +99 -21
- package/dist/modules/auth/oidc-auth-provider.js.map +1 -1
- package/dist/modules/code-mode/code-mode.tool.d.ts.map +1 -1
- package/dist/modules/code-mode/code-mode.tool.js +14 -2
- package/dist/modules/code-mode/code-mode.tool.js.map +1 -1
- package/dist/modules/connection-probe/connection-probe.service.d.ts.map +1 -1
- package/dist/modules/connection-probe/connection-probe.service.js +56 -7
- package/dist/modules/connection-probe/connection-probe.service.js.map +1 -1
- package/dist/modules/database/advisory-lock.d.ts +103 -0
- package/dist/modules/database/advisory-lock.d.ts.map +1 -0
- package/dist/modules/database/advisory-lock.js +320 -0
- package/dist/modules/database/advisory-lock.js.map +1 -0
- package/dist/modules/database/connection.d.ts.map +1 -1
- package/dist/modules/database/connection.js +9 -1
- package/dist/modules/database/connection.js.map +1 -1
- package/dist/modules/database/core-schema.d.ts +859 -99
- package/dist/modules/database/core-schema.d.ts.map +1 -1
- package/dist/modules/database/core-schema.js +218 -0
- package/dist/modules/database/core-schema.js.map +1 -1
- package/dist/modules/database/migrate.d.ts.map +1 -1
- package/dist/modules/database/migrate.js +26 -6
- package/dist/modules/database/migrate.js.map +1 -1
- package/dist/modules/declared-variables/declared-variables.routes.d.ts.map +1 -1
- package/dist/modules/declared-variables/declared-variables.routes.js +4 -2
- package/dist/modules/declared-variables/declared-variables.routes.js.map +1 -1
- package/dist/modules/diff/diff.routes.d.ts.map +1 -1
- package/dist/modules/diff/diff.routes.js +2 -4
- package/dist/modules/diff/diff.routes.js.map +1 -1
- package/dist/modules/diff/diff.service.d.ts +4 -1
- package/dist/modules/diff/diff.service.d.ts.map +1 -1
- package/dist/modules/diff/diff.service.js +84 -81
- package/dist/modules/diff/diff.service.js.map +1 -1
- package/dist/modules/{workspace → kb-fs}/bevel-ignore.d.ts +14 -9
- package/dist/modules/kb-fs/bevel-ignore.d.ts.map +1 -0
- package/dist/modules/{workspace → kb-fs}/bevel-ignore.js +24 -14
- package/dist/modules/kb-fs/bevel-ignore.js.map +1 -0
- package/dist/modules/kb-fs/file-change-notifier.d.ts.map +1 -1
- package/dist/modules/kb-fs/file-change-notifier.js +3 -1
- package/dist/modules/kb-fs/file-change-notifier.js.map +1 -1
- package/dist/modules/kb-fs/git-guarded-filesystem.d.ts +45 -0
- package/dist/modules/kb-fs/git-guarded-filesystem.d.ts.map +1 -0
- package/dist/modules/kb-fs/git-guarded-filesystem.js +117 -0
- package/dist/modules/kb-fs/git-guarded-filesystem.js.map +1 -0
- package/dist/modules/kb-fs/locking-filesystem.d.ts +113 -18
- package/dist/modules/kb-fs/locking-filesystem.d.ts.map +1 -1
- package/dist/modules/kb-fs/locking-filesystem.js +353 -76
- package/dist/modules/kb-fs/locking-filesystem.js.map +1 -1
- package/dist/modules/kb-fs/node-fs.d.ts +23 -0
- package/dist/modules/kb-fs/node-fs.d.ts.map +1 -0
- package/dist/modules/kb-fs/node-fs.js +158 -0
- package/dist/modules/kb-fs/node-fs.js.map +1 -0
- package/dist/modules/kb-fs/read-only-filesystem.d.ts +10 -9
- package/dist/modules/kb-fs/read-only-filesystem.d.ts.map +1 -1
- package/dist/modules/kb-fs/read-only-filesystem.js +18 -9
- package/dist/modules/kb-fs/read-only-filesystem.js.map +1 -1
- package/dist/modules/kb-fs/repo-path.d.ts +100 -3
- package/dist/modules/kb-fs/repo-path.d.ts.map +1 -1
- package/dist/modules/kb-fs/repo-path.js +195 -3
- package/dist/modules/kb-fs/repo-path.js.map +1 -1
- package/dist/modules/kb-sync/kb-sync.routes.d.ts.map +1 -1
- package/dist/modules/kb-sync/kb-sync.routes.js +4 -2
- package/dist/modules/kb-sync/kb-sync.routes.js.map +1 -1
- package/dist/modules/kb-sync/kb-sync.service.d.ts.map +1 -1
- package/dist/modules/kb-sync/kb-sync.service.js +7 -5
- package/dist/modules/kb-sync/kb-sync.service.js.map +1 -1
- package/dist/modules/marketplace/git-http.routes.d.ts.map +1 -1
- package/dist/modules/marketplace/git-http.routes.js +6 -4
- package/dist/modules/marketplace/git-http.routes.js.map +1 -1
- package/dist/modules/marketplace/github-facade/github-facade-admin.routes.d.ts +12 -2
- package/dist/modules/marketplace/github-facade/github-facade-admin.routes.d.ts.map +1 -1
- package/dist/modules/marketplace/github-facade/github-facade-admin.routes.js +32 -3
- package/dist/modules/marketplace/github-facade/github-facade-admin.routes.js.map +1 -1
- package/dist/modules/marketplace/github-facade/github-facade-credentials.service.d.ts +27 -0
- package/dist/modules/marketplace/github-facade/github-facade-credentials.service.d.ts.map +1 -1
- package/dist/modules/marketplace/github-facade/github-facade-credentials.service.js +45 -0
- package/dist/modules/marketplace/github-facade/github-facade-credentials.service.js.map +1 -1
- package/dist/modules/marketplace/github-facade/github-facade.routes.d.ts.map +1 -1
- package/dist/modules/marketplace/github-facade/github-facade.routes.js +30 -6
- package/dist/modules/marketplace/github-facade/github-facade.routes.js.map +1 -1
- package/dist/modules/marketplace/github-facade/github-facade.service.d.ts +21 -9
- package/dist/modules/marketplace/github-facade/github-facade.service.d.ts.map +1 -1
- package/dist/modules/marketplace/github-facade/github-facade.service.js +60 -19
- package/dist/modules/marketplace/github-facade/github-facade.service.js.map +1 -1
- package/dist/modules/marketplace/github-facade/index.d.ts +1 -1
- package/dist/modules/marketplace/github-facade/index.d.ts.map +1 -1
- package/dist/modules/marketplace/github-facade/index.js +1 -1
- package/dist/modules/marketplace/github-facade/index.js.map +1 -1
- package/dist/modules/marketplace/marketplace-repo.service.d.ts +14 -1
- package/dist/modules/marketplace/marketplace-repo.service.d.ts.map +1 -1
- package/dist/modules/marketplace/marketplace-repo.service.js +26 -8
- package/dist/modules/marketplace/marketplace-repo.service.js.map +1 -1
- package/dist/modules/mcp/downstream-pool.d.ts +107 -0
- package/dist/modules/mcp/downstream-pool.d.ts.map +1 -0
- package/dist/modules/mcp/downstream-pool.js +221 -0
- package/dist/modules/mcp/downstream-pool.js.map +1 -0
- package/dist/modules/mcp/downstream-token-refresh.d.ts +77 -0
- package/dist/modules/mcp/downstream-token-refresh.d.ts.map +1 -0
- package/dist/modules/mcp/downstream-token-refresh.js +166 -0
- package/dist/modules/mcp/downstream-token-refresh.js.map +1 -0
- package/dist/modules/mcp/first-call-probe.cli-args.d.ts +78 -0
- package/dist/modules/mcp/first-call-probe.cli-args.d.ts.map +1 -0
- package/dist/modules/mcp/first-call-probe.cli-args.js +151 -0
- package/dist/modules/mcp/first-call-probe.cli-args.js.map +1 -0
- package/dist/modules/mcp/first-call-probe.cli.d.ts +2 -0
- package/dist/modules/mcp/first-call-probe.cli.d.ts.map +1 -0
- package/dist/modules/mcp/first-call-probe.cli.js +62 -0
- package/dist/modules/mcp/first-call-probe.cli.js.map +1 -0
- package/dist/modules/mcp/first-call-probe.d.ts +165 -0
- package/dist/modules/mcp/first-call-probe.d.ts.map +1 -0
- package/dist/modules/mcp/first-call-probe.js +298 -0
- package/dist/modules/mcp/first-call-probe.js.map +1 -0
- package/dist/modules/mcp/manual-failure-memo.d.ts +42 -17
- package/dist/modules/mcp/manual-failure-memo.d.ts.map +1 -1
- package/dist/modules/mcp/manual-failure-memo.js +79 -23
- package/dist/modules/mcp/manual-failure-memo.js.map +1 -1
- package/dist/modules/mcp/mcp-auth.middleware.d.ts +10 -5
- package/dist/modules/mcp/mcp-auth.middleware.d.ts.map +1 -1
- package/dist/modules/mcp/mcp-auth.middleware.js +56 -16
- package/dist/modules/mcp/mcp-auth.middleware.js.map +1 -1
- package/dist/modules/mcp/mcp.routes.d.ts +4 -4
- package/dist/modules/mcp/mcp.routes.d.ts.map +1 -1
- package/dist/modules/mcp/mcp.routes.js +91 -180
- package/dist/modules/mcp/mcp.routes.js.map +1 -1
- package/dist/modules/mcp/mcp.service.d.ts +226 -61
- package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
- package/dist/modules/mcp/mcp.service.js +758 -161
- package/dist/modules/mcp/mcp.service.js.map +1 -1
- package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts +59 -0
- package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts.map +1 -1
- package/dist/modules/mcp/oauth/bevel-oauth-provider.js +184 -10
- package/dist/modules/mcp/oauth/bevel-oauth-provider.js.map +1 -1
- package/dist/modules/mcp/oauth/oauth-consent.routes.d.ts.map +1 -1
- package/dist/modules/mcp/oauth/oauth-consent.routes.js +3 -1
- package/dist/modules/mcp/oauth/oauth-consent.routes.js.map +1 -1
- package/dist/modules/mcp/surface-log-throttle.d.ts +59 -0
- package/dist/modules/mcp/surface-log-throttle.d.ts.map +1 -0
- package/dist/modules/mcp/surface-log-throttle.js +94 -0
- package/dist/modules/mcp/surface-log-throttle.js.map +1 -0
- package/dist/modules/plugins/compile/compile-marketplace.d.ts +13 -6
- package/dist/modules/plugins/compile/compile-marketplace.d.ts.map +1 -1
- package/dist/modules/plugins/compile/compile-marketplace.js +119 -36
- package/dist/modules/plugins/compile/compile-marketplace.js.map +1 -1
- package/dist/modules/plugins/compile/marketplace-compiler.service.d.ts +8 -1
- package/dist/modules/plugins/compile/marketplace-compiler.service.d.ts.map +1 -1
- package/dist/modules/plugins/compile/marketplace-compiler.service.js +9 -6
- package/dist/modules/plugins/compile/marketplace-compiler.service.js.map +1 -1
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.d.ts.map +1 -1
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.js +32 -9
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.js.map +1 -1
- package/dist/modules/plugins/discovery/bundle-dialect/registry.d.ts +26 -6
- package/dist/modules/plugins/discovery/bundle-dialect/registry.d.ts.map +1 -1
- package/dist/modules/plugins/discovery/bundle-dialect/registry.js +71 -14
- package/dist/modules/plugins/discovery/bundle-dialect/registry.js.map +1 -1
- package/dist/modules/plugins/discovery/kb-plugin-source.d.ts +4 -2
- package/dist/modules/plugins/discovery/kb-plugin-source.d.ts.map +1 -1
- package/dist/modules/plugins/discovery/kb-plugin-source.js +9 -6
- package/dist/modules/plugins/discovery/kb-plugin-source.js.map +1 -1
- package/dist/modules/plugins/discovery/native.source.d.ts +2 -1
- package/dist/modules/plugins/discovery/native.source.d.ts.map +1 -1
- package/dist/modules/plugins/discovery/native.source.js +22 -4
- package/dist/modules/plugins/discovery/native.source.js.map +1 -1
- package/dist/modules/plugins/discovery/plugin-source.d.ts +17 -3
- package/dist/modules/plugins/discovery/plugin-source.d.ts.map +1 -1
- package/dist/modules/plugins/index.d.ts +6 -3
- package/dist/modules/plugins/index.d.ts.map +1 -1
- package/dist/modules/plugins/index.js +6 -3
- package/dist/modules/plugins/index.js.map +1 -1
- package/dist/modules/plugins/join-request-jobs.service.d.ts +250 -0
- package/dist/modules/plugins/join-request-jobs.service.d.ts.map +1 -0
- package/dist/modules/plugins/join-request-jobs.service.js +602 -0
- package/dist/modules/plugins/join-request-jobs.service.js.map +1 -0
- package/dist/modules/plugins/join-request-records.store.d.ts +161 -0
- package/dist/modules/plugins/join-request-records.store.d.ts.map +1 -0
- package/dist/modules/plugins/join-request-records.store.js +179 -0
- package/dist/modules/plugins/join-request-records.store.js.map +1 -0
- package/dist/modules/plugins/join-requests.service.d.ts.map +1 -1
- package/dist/modules/plugins/join-requests.service.js +4 -2
- package/dist/modules/plugins/join-requests.service.js.map +1 -1
- package/dist/modules/plugins/plugin-links.d.ts +4 -1
- package/dist/modules/plugins/plugin-links.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-links.js +6 -3
- package/dist/modules/plugins/plugin-links.js.map +1 -1
- package/dist/modules/plugins/plugin-links.service.d.ts +2 -5
- package/dist/modules/plugins/plugin-links.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-links.service.js +4 -13
- package/dist/modules/plugins/plugin-links.service.js.map +1 -1
- package/dist/modules/plugins/plugin-provision.service.d.ts +91 -19
- package/dist/modules/plugins/plugin-provision.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-provision.service.js +183 -38
- package/dist/modules/plugins/plugin-provision.service.js.map +1 -1
- package/dist/modules/plugins/plugin-rename.service.d.ts +3 -1
- package/dist/modules/plugins/plugin-rename.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-rename.service.js +20 -11
- package/dist/modules/plugins/plugin-rename.service.js.map +1 -1
- package/dist/modules/plugins/plugins.contract.d.ts +52 -4
- package/dist/modules/plugins/plugins.contract.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.routes.d.ts +38 -5
- package/dist/modules/plugins/plugins.routes.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.routes.js +190 -116
- package/dist/modules/plugins/plugins.routes.js.map +1 -1
- package/dist/modules/plugins/plugins.service.d.ts +38 -6
- package/dist/modules/plugins/plugins.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.service.js +86 -17
- package/dist/modules/plugins/plugins.service.js.map +1 -1
- package/dist/modules/plugins/plugins.tools.d.ts +25 -0
- package/dist/modules/plugins/plugins.tools.d.ts.map +1 -0
- package/dist/modules/plugins/plugins.tools.js +82 -0
- package/dist/modules/plugins/plugins.tools.js.map +1 -0
- package/dist/modules/plugins/teams.routes.d.ts +42 -0
- package/dist/modules/plugins/teams.routes.d.ts.map +1 -0
- package/dist/modules/plugins/teams.routes.js +79 -0
- package/dist/modules/plugins/teams.routes.js.map +1 -0
- package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts +40 -1
- package/dist/modules/secrets-vault/db-secrets-vault.service.d.ts.map +1 -1
- package/dist/modules/secrets-vault/db-secrets-vault.service.js +202 -37
- package/dist/modules/secrets-vault/db-secrets-vault.service.js.map +1 -1
- package/dist/modules/secrets-vault/index.d.ts +1 -1
- package/dist/modules/secrets-vault/index.d.ts.map +1 -1
- package/dist/modules/secrets-vault/index.js.map +1 -1
- package/dist/modules/secrets-vault/mcp-oauth-discovery.service.d.ts.map +1 -1
- package/dist/modules/secrets-vault/mcp-oauth-discovery.service.js +5 -3
- package/dist/modules/secrets-vault/mcp-oauth-discovery.service.js.map +1 -1
- package/dist/modules/secrets-vault/secrets-variable-loader.d.ts.map +1 -1
- package/dist/modules/secrets-vault/secrets-variable-loader.js +3 -1
- package/dist/modules/secrets-vault/secrets-variable-loader.js.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.contract.d.ts +78 -0
- package/dist/modules/secrets-vault/secrets-vault.contract.d.ts.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.contract.js +40 -0
- package/dist/modules/secrets-vault/secrets-vault.contract.js.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.routes.d.ts.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.routes.js +106 -52
- package/dist/modules/secrets-vault/secrets-vault.routes.js.map +1 -1
- package/dist/modules/settings/connection-check.d.ts +118 -0
- package/dist/modules/settings/connection-check.d.ts.map +1 -0
- package/dist/modules/settings/connection-check.js +287 -0
- package/dist/modules/settings/connection-check.js.map +1 -0
- package/dist/modules/settings/deployment-settings.service.d.ts +162 -8
- package/dist/modules/settings/deployment-settings.service.d.ts.map +1 -1
- package/dist/modules/settings/deployment-settings.service.js +375 -52
- package/dist/modules/settings/deployment-settings.service.js.map +1 -1
- package/dist/modules/settings/git-root-folders.d.ts +54 -0
- package/dist/modules/settings/git-root-folders.d.ts.map +1 -0
- package/dist/modules/settings/git-root-folders.js +130 -0
- package/dist/modules/settings/git-root-folders.js.map +1 -0
- package/dist/modules/settings/oidc-check.d.ts +85 -0
- package/dist/modules/settings/oidc-check.d.ts.map +1 -0
- package/dist/modules/settings/oidc-check.js +172 -0
- package/dist/modules/settings/oidc-check.js.map +1 -0
- package/dist/modules/settings/setup.routes.d.ts +31 -1
- package/dist/modules/settings/setup.routes.d.ts.map +1 -1
- package/dist/modules/settings/setup.routes.js +400 -108
- package/dist/modules/settings/setup.routes.js.map +1 -1
- package/dist/modules/skills/allowed-tools-check.d.ts +132 -0
- package/dist/modules/skills/allowed-tools-check.d.ts.map +1 -0
- package/dist/modules/skills/allowed-tools-check.js +260 -0
- package/dist/modules/skills/allowed-tools-check.js.map +1 -0
- package/dist/modules/skills/index.d.ts +3 -1
- package/dist/modules/skills/index.d.ts.map +1 -1
- package/dist/modules/skills/index.js +1 -0
- package/dist/modules/skills/index.js.map +1 -1
- package/dist/modules/skills/pending-skills.service.d.ts +6 -11
- package/dist/modules/skills/pending-skills.service.d.ts.map +1 -1
- package/dist/modules/skills/pending-skills.service.js +18 -70
- package/dist/modules/skills/pending-skills.service.js.map +1 -1
- package/dist/modules/skills/skill-access-requests.routes.d.ts.map +1 -1
- package/dist/modules/skills/skill-access-requests.routes.js +9 -6
- package/dist/modules/skills/skill-access-requests.routes.js.map +1 -1
- package/dist/modules/skills/skills.contract.d.ts +44 -10
- package/dist/modules/skills/skills.contract.d.ts.map +1 -1
- package/dist/modules/skills/skills.routes.d.ts +8 -1
- package/dist/modules/skills/skills.routes.d.ts.map +1 -1
- package/dist/modules/skills/skills.routes.js +16 -2
- package/dist/modules/skills/skills.routes.js.map +1 -1
- package/dist/modules/skills/skills.service.d.ts +31 -7
- package/dist/modules/skills/skills.service.d.ts.map +1 -1
- package/dist/modules/skills/skills.service.js +191 -81
- package/dist/modules/skills/skills.service.js.map +1 -1
- package/dist/modules/skills/skills.tools.d.ts +4 -1
- package/dist/modules/skills/skills.tools.d.ts.map +1 -1
- package/dist/modules/skills/skills.tools.js +41 -6
- package/dist/modules/skills/skills.tools.js.map +1 -1
- package/dist/modules/tool-auth/connection-key-rejection.d.ts +18 -0
- package/dist/modules/tool-auth/connection-key-rejection.d.ts.map +1 -0
- package/dist/modules/tool-auth/connection-key-rejection.js +20 -0
- package/dist/modules/tool-auth/connection-key-rejection.js.map +1 -0
- package/dist/modules/tool-auth/connection-keys-admin.routes.d.ts +14 -0
- package/dist/modules/tool-auth/connection-keys-admin.routes.d.ts.map +1 -0
- package/dist/modules/tool-auth/connection-keys-admin.routes.js +67 -0
- package/dist/modules/tool-auth/connection-keys-admin.routes.js.map +1 -0
- package/dist/modules/tool-auth/external-api-key.interface.d.ts +72 -8
- package/dist/modules/tool-auth/external-api-key.interface.d.ts.map +1 -1
- package/dist/modules/tool-auth/external-api-key.interface.js.map +1 -1
- package/dist/modules/tool-auth/external-api-key.service.d.ts +17 -6
- package/dist/modules/tool-auth/external-api-key.service.d.ts.map +1 -1
- package/dist/modules/tool-auth/external-api-key.service.js +83 -27
- package/dist/modules/tool-auth/external-api-key.service.js.map +1 -1
- package/dist/modules/tool-auth/internal-token.service.d.ts +15 -2
- package/dist/modules/tool-auth/internal-token.service.d.ts.map +1 -1
- package/dist/modules/tool-auth/internal-token.service.js +6 -2
- package/dist/modules/tool-auth/internal-token.service.js.map +1 -1
- package/dist/modules/tool-auth/key-or-session.middleware.d.ts +23 -0
- package/dist/modules/tool-auth/key-or-session.middleware.d.ts.map +1 -0
- package/dist/modules/tool-auth/key-or-session.middleware.js +39 -0
- package/dist/modules/tool-auth/key-or-session.middleware.js.map +1 -0
- package/dist/modules/tool-auth/tool-auth.middleware.d.ts +15 -1
- package/dist/modules/tool-auth/tool-auth.middleware.d.ts.map +1 -1
- package/dist/modules/tool-auth/tool-auth.middleware.js +17 -6
- package/dist/modules/tool-auth/tool-auth.middleware.js.map +1 -1
- package/dist/modules/tool-helpers/tool-context.d.ts +14 -0
- package/dist/modules/tool-helpers/tool-context.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool-context.js +28 -6
- package/dist/modules/tool-helpers/tool-context.js.map +1 -1
- package/dist/modules/tool-helpers/tool-handler.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool-handler.js +22 -5
- package/dist/modules/tool-helpers/tool-handler.js.map +1 -1
- package/dist/modules/tool-helpers/tool.contract.d.ts +6 -1
- package/dist/modules/tool-helpers/tool.contract.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool.contract.js +7 -1
- package/dist/modules/tool-helpers/tool.contract.js.map +1 -1
- package/dist/modules/tool-manuals/index.d.ts +2 -1
- package/dist/modules/tool-manuals/index.d.ts.map +1 -1
- package/dist/modules/tool-manuals/index.js +1 -0
- package/dist/modules/tool-manuals/index.js.map +1 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.d.ts.map +1 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.js +8 -6
- package/dist/modules/tool-manuals/mcp-json-discovery.js.map +1 -1
- package/dist/modules/tool-manuals/mcp-server-edit.service.d.ts +10 -2
- package/dist/modules/tool-manuals/mcp-server-edit.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/mcp-server-edit.service.js +12 -15
- package/dist/modules/tool-manuals/mcp-server-edit.service.js.map +1 -1
- package/dist/modules/tool-manuals/pending-tools.service.d.ts +50 -0
- package/dist/modules/tool-manuals/pending-tools.service.d.ts.map +1 -0
- package/dist/modules/tool-manuals/pending-tools.service.js +149 -0
- package/dist/modules/tool-manuals/pending-tools.service.js.map +1 -0
- package/dist/modules/tool-manuals/tool-delete.service.d.ts +135 -0
- package/dist/modules/tool-manuals/tool-delete.service.d.ts.map +1 -0
- package/dist/modules/tool-manuals/tool-delete.service.js +303 -0
- package/dist/modules/tool-manuals/tool-delete.service.js.map +1 -0
- package/dist/modules/tool-manuals/tool-manuals.contract.d.ts +161 -0
- package/dist/modules/tool-manuals/tool-manuals.contract.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.contract.js +9 -0
- package/dist/modules/tool-manuals/tool-manuals.contract.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.routes.d.ts +19 -2
- package/dist/modules/tool-manuals/tool-manuals.routes.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.routes.js +127 -57
- package/dist/modules/tool-manuals/tool-manuals.routes.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts +119 -5
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.js +404 -74
- package/dist/modules/tool-manuals/tool-manuals.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.js +78 -6
- package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +1 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.js +88 -54
- package/dist/modules/workflow/agent-tools/workflow.tools.js.map +1 -1
- package/dist/modules/workflow/event-bus.d.ts +10 -4
- package/dist/modules/workflow/event-bus.d.ts.map +1 -1
- package/dist/modules/workflow/event-bus.js +14 -11
- package/dist/modules/workflow/event-bus.js.map +1 -1
- package/dist/modules/workflow/events.routes.d.ts +17 -2
- package/dist/modules/workflow/events.routes.d.ts.map +1 -1
- package/dist/modules/workflow/events.routes.js +31 -12
- package/dist/modules/workflow/events.routes.js.map +1 -1
- package/dist/modules/workflow/file-lock.service.d.ts +22 -4
- package/dist/modules/workflow/file-lock.service.d.ts.map +1 -1
- package/dist/modules/workflow/file-lock.service.js +27 -4
- package/dist/modules/workflow/file-lock.service.js.map +1 -1
- package/dist/modules/workflow/git/change-request-link.d.ts +20 -0
- package/dist/modules/workflow/git/change-request-link.d.ts.map +1 -0
- package/dist/modules/workflow/git/change-request-link.js +34 -0
- package/dist/modules/workflow/git/change-request-link.js.map +1 -0
- package/dist/modules/workflow/git/git-version.d.ts.map +1 -1
- package/dist/modules/workflow/git/git-version.js +3 -1
- package/dist/modules/workflow/git/git-version.js.map +1 -1
- package/dist/modules/workflow/git/git.service.d.ts +263 -4
- package/dist/modules/workflow/git/git.service.d.ts.map +1 -1
- package/dist/modules/workflow/git/git.service.js +528 -118
- package/dist/modules/workflow/git/git.service.js.map +1 -1
- package/dist/modules/workflow/git/node-git-runner.d.ts +36 -0
- package/dist/modules/workflow/git/node-git-runner.d.ts.map +1 -0
- package/dist/modules/workflow/git/node-git-runner.js +273 -0
- package/dist/modules/workflow/git/node-git-runner.js.map +1 -0
- package/dist/modules/workflow/git/pull-request.service.d.ts +51 -2
- package/dist/modules/workflow/git/pull-request.service.d.ts.map +1 -1
- package/dist/modules/workflow/git/pull-request.service.js +157 -25
- package/dist/modules/workflow/git/pull-request.service.js.map +1 -1
- package/dist/modules/workflow/pending-commits.service.d.ts +11 -0
- package/dist/modules/workflow/pending-commits.service.d.ts.map +1 -1
- package/dist/modules/workflow/pending-commits.service.js +24 -4
- package/dist/modules/workflow/pending-commits.service.js.map +1 -1
- package/dist/modules/workflow/pending-commits.worker.d.ts +15 -8
- package/dist/modules/workflow/pending-commits.worker.d.ts.map +1 -1
- package/dist/modules/workflow/pending-commits.worker.js +107 -58
- package/dist/modules/workflow/pending-commits.worker.js.map +1 -1
- package/dist/modules/workflow/recovery-bot.d.ts.map +1 -1
- package/dist/modules/workflow/recovery-bot.js +3 -1
- package/dist/modules/workflow/recovery-bot.js.map +1 -1
- package/dist/modules/workflow/review-workflow/approval-lock.d.ts +60 -0
- package/dist/modules/workflow/review-workflow/approval-lock.d.ts.map +1 -0
- package/dist/modules/workflow/review-workflow/approval-lock.js +116 -0
- package/dist/modules/workflow/review-workflow/approval-lock.js.map +1 -0
- package/dist/modules/workflow/review-workflow/review-workflow.interface.d.ts +54 -7
- package/dist/modules/workflow/review-workflow/review-workflow.interface.d.ts.map +1 -1
- package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts +64 -0
- package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts.map +1 -1
- package/dist/modules/workflow/review-workflow/review-workflow.service.js +269 -90
- package/dist/modules/workflow/review-workflow/review-workflow.service.js.map +1 -1
- package/dist/modules/workflow/sanitize-error.d.ts +5 -2
- package/dist/modules/workflow/sanitize-error.d.ts.map +1 -1
- package/dist/modules/workflow/sanitize-error.js +8 -4
- package/dist/modules/workflow/sanitize-error.js.map +1 -1
- package/dist/modules/workflow/workflow.routes.d.ts +2 -0
- package/dist/modules/workflow/workflow.routes.d.ts.map +1 -1
- package/dist/modules/workflow/workflow.routes.js +259 -29
- package/dist/modules/workflow/workflow.routes.js.map +1 -1
- package/dist/modules/workflow/workflow.service.d.ts +166 -14
- package/dist/modules/workflow/workflow.service.d.ts.map +1 -1
- package/dist/modules/workflow/workflow.service.js +906 -106
- package/dist/modules/workflow/workflow.service.js.map +1 -1
- package/dist/modules/workspace/empty-dirs.d.ts +15 -0
- package/dist/modules/workspace/empty-dirs.d.ts.map +1 -0
- package/dist/modules/workspace/empty-dirs.js +90 -0
- package/dist/modules/workspace/empty-dirs.js.map +1 -0
- package/dist/modules/workspace/file-readers/content-mode.d.ts +50 -0
- package/dist/modules/workspace/file-readers/content-mode.d.ts.map +1 -0
- package/dist/modules/workspace/file-readers/content-mode.js +55 -0
- package/dist/modules/workspace/file-readers/content-mode.js.map +1 -0
- package/dist/modules/workspace/file-readers/doc-extract.service.d.ts +4 -1
- package/dist/modules/workspace/file-readers/doc-extract.service.d.ts.map +1 -1
- package/dist/modules/workspace/file-readers/doc-extract.service.js +4 -1
- package/dist/modules/workspace/file-readers/doc-extract.service.js.map +1 -1
- package/dist/modules/workspace/file-readers/doc-extract.types.d.ts +5 -2
- package/dist/modules/workspace/file-readers/doc-extract.types.d.ts.map +1 -1
- package/dist/modules/workspace/file-readers/doc-extract.types.js +7 -4
- package/dist/modules/workspace/file-readers/doc-extract.types.js.map +1 -1
- package/dist/modules/workspace/file-readers/document-reader.d.ts +2 -0
- package/dist/modules/workspace/file-readers/document-reader.d.ts.map +1 -1
- package/dist/modules/workspace/file-readers/document-reader.js +5 -0
- package/dist/modules/workspace/file-readers/document-reader.js.map +1 -1
- package/dist/modules/workspace/file-readers/extract-docx.d.ts +6 -0
- package/dist/modules/workspace/file-readers/extract-docx.d.ts.map +1 -1
- package/dist/modules/workspace/file-readers/extract-docx.js +6 -0
- package/dist/modules/workspace/file-readers/extract-docx.js.map +1 -1
- package/dist/modules/workspace/file-readers/file-reader.d.ts +24 -5
- package/dist/modules/workspace/file-readers/file-reader.d.ts.map +1 -1
- package/dist/modules/workspace/file-readers/file-reader.js +11 -6
- package/dist/modules/workspace/file-readers/file-reader.js.map +1 -1
- package/dist/modules/workspace/file-readers/file-reader.registry.d.ts.map +1 -1
- package/dist/modules/workspace/file-readers/file-reader.registry.js +6 -1
- package/dist/modules/workspace/file-readers/file-reader.registry.js.map +1 -1
- package/dist/modules/workspace/file-readers/image-reader.d.ts +7 -5
- package/dist/modules/workspace/file-readers/image-reader.d.ts.map +1 -1
- package/dist/modules/workspace/file-readers/image-reader.js +9 -5
- package/dist/modules/workspace/file-readers/image-reader.js.map +1 -1
- package/dist/modules/workspace/file-readers/ooxml-text.d.ts +3 -0
- package/dist/modules/workspace/file-readers/ooxml-text.d.ts.map +1 -1
- package/dist/modules/workspace/file-readers/ooxml-text.js +39 -2
- package/dist/modules/workspace/file-readers/ooxml-text.js.map +1 -1
- package/dist/modules/workspace/file-readers/text-reader.d.ts +29 -1
- package/dist/modules/workspace/file-readers/text-reader.d.ts.map +1 -1
- package/dist/modules/workspace/file-readers/text-reader.js +57 -3
- package/dist/modules/workspace/file-readers/text-reader.js.map +1 -1
- package/dist/modules/workspace/git-internals.middleware.d.ts +28 -0
- package/dist/modules/workspace/git-internals.middleware.d.ts.map +1 -0
- package/dist/modules/workspace/git-internals.middleware.js +93 -0
- package/dist/modules/workspace/git-internals.middleware.js.map +1 -0
- package/dist/modules/workspace/not-found.d.ts +80 -0
- package/dist/modules/workspace/not-found.d.ts.map +1 -0
- package/dist/modules/workspace/not-found.js +112 -0
- package/dist/modules/workspace/not-found.js.map +1 -0
- package/dist/modules/workspace/session-ontology.gate.d.ts +1 -1
- package/dist/modules/workspace/session-ontology.gate.d.ts.map +1 -1
- package/dist/modules/workspace/session-ontology.gate.js +1 -1
- package/dist/modules/workspace/session-ontology.gate.js.map +1 -1
- package/dist/modules/workspace/startup/beside-checkout.d.ts +42 -0
- package/dist/modules/workspace/startup/beside-checkout.d.ts.map +1 -0
- package/dist/modules/workspace/startup/beside-checkout.js +110 -0
- package/dist/modules/workspace/startup/beside-checkout.js.map +1 -0
- package/dist/modules/workspace/startup/kb-git.d.ts +7 -12
- package/dist/modules/workspace/startup/kb-git.d.ts.map +1 -1
- package/dist/modules/workspace/startup/kb-git.js +34 -35
- package/dist/modules/workspace/startup/kb-git.js.map +1 -1
- package/dist/modules/workspace/startup/kb-startup-runner.d.ts +95 -0
- package/dist/modules/workspace/startup/kb-startup-runner.d.ts.map +1 -1
- package/dist/modules/workspace/startup/kb-startup-runner.js +257 -55
- package/dist/modules/workspace/startup/kb-startup-runner.js.map +1 -1
- package/dist/modules/workspace/startup/steps/groups-to-plugins.step.d.ts +45 -0
- package/dist/modules/workspace/startup/steps/groups-to-plugins.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/groups-to-plugins.step.js +417 -385
- package/dist/modules/workspace/startup/steps/groups-to-plugins.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/personal-spaces.step.d.ts +48 -0
- package/dist/modules/workspace/startup/steps/personal-spaces.step.d.ts.map +1 -0
- package/dist/modules/workspace/startup/steps/personal-spaces.step.js +183 -0
- package/dist/modules/workspace/startup/steps/personal-spaces.step.js.map +1 -0
- package/dist/modules/workspace/startup/steps/plugin-display-names.step.d.ts +51 -0
- package/dist/modules/workspace/startup/steps/plugin-display-names.step.d.ts.map +1 -0
- package/dist/modules/workspace/startup/steps/plugin-display-names.step.js +158 -0
- package/dist/modules/workspace/startup/steps/plugin-display-names.step.js.map +1 -0
- package/dist/modules/workspace/startup/steps/plugin-layout.d.ts +64 -0
- package/dist/modules/workspace/startup/steps/plugin-layout.d.ts.map +1 -0
- package/dist/modules/workspace/startup/steps/plugin-layout.js +97 -0
- package/dist/modules/workspace/startup/steps/plugin-layout.js.map +1 -0
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.d.ts +7 -1
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.js +45 -81
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/roles-yaml.step.d.ts +3 -1
- package/dist/modules/workspace/startup/steps/roles-yaml.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/roles-yaml.step.js +4 -12
- package/dist/modules/workspace/startup/steps/roles-yaml.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/seed-tree.d.ts +6 -1
- package/dist/modules/workspace/startup/steps/seed-tree.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/seed-tree.js +154 -78
- package/dist/modules/workspace/startup/steps/seed-tree.js.map +1 -1
- package/dist/modules/workspace/startup/steps/template-files.step.d.ts +96 -24
- package/dist/modules/workspace/startup/steps/template-files.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/template-files.step.js +446 -138
- package/dist/modules/workspace/startup/steps/template-files.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/template-source.d.ts +94 -0
- package/dist/modules/workspace/startup/steps/template-source.d.ts.map +1 -0
- package/dist/modules/workspace/startup/steps/template-source.js +160 -0
- package/dist/modules/workspace/startup/steps/template-source.js.map +1 -0
- package/dist/modules/workspace/workspace.routes.d.ts +14 -2
- package/dist/modules/workspace/workspace.routes.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.routes.js +649 -238
- package/dist/modules/workspace/workspace.routes.js.map +1 -1
- package/dist/modules/workspace/workspace.service.d.ts +298 -12
- package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.service.js +933 -269
- package/dist/modules/workspace/workspace.service.js.map +1 -1
- package/dist/modules/workspace/workspace.tools.d.ts +42 -1
- package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.tools.js +1626 -146
- package/dist/modules/workspace/workspace.tools.js.map +1 -1
- package/dist/modules/workspace/write-denial.d.ts +76 -0
- package/dist/modules/workspace/write-denial.d.ts.map +1 -0
- package/dist/modules/workspace/write-denial.js +138 -0
- package/dist/modules/workspace/write-denial.js.map +1 -0
- package/dist/shared/canonical-file-identity.d.ts +64 -0
- package/dist/shared/canonical-file-identity.d.ts.map +1 -0
- package/dist/shared/canonical-file-identity.js +92 -0
- package/dist/shared/canonical-file-identity.js.map +1 -0
- package/dist/shared/domain-errors.d.ts +108 -0
- package/dist/shared/domain-errors.d.ts.map +1 -1
- package/dist/shared/domain-errors.js +137 -0
- package/dist/shared/domain-errors.js.map +1 -1
- package/dist/shared/email-identity.d.ts +32 -0
- package/dist/shared/email-identity.d.ts.map +1 -0
- package/dist/shared/email-identity.js +37 -0
- package/dist/shared/email-identity.js.map +1 -0
- package/dist/shared/fs.contract.d.ts +206 -0
- package/dist/shared/fs.contract.d.ts.map +1 -0
- package/dist/shared/fs.contract.js +79 -0
- package/dist/shared/fs.contract.js.map +1 -0
- package/dist/shared/git-failure.d.ts +80 -0
- package/dist/shared/git-failure.d.ts.map +1 -0
- package/dist/shared/git-failure.js +139 -0
- package/dist/shared/git-failure.js.map +1 -0
- package/dist/shared/git-internals.d.ts +23 -0
- package/dist/shared/git-internals.d.ts.map +1 -0
- package/dist/shared/git-internals.js +181 -0
- package/dist/shared/git-internals.js.map +1 -0
- package/dist/shared/git.contract.d.ts +157 -0
- package/dist/shared/git.contract.d.ts.map +1 -0
- package/dist/shared/git.contract.js +103 -0
- package/dist/shared/git.contract.js.map +1 -0
- package/dist/shared/http-errors.d.ts +33 -0
- package/dist/shared/http-errors.d.ts.map +1 -0
- package/dist/shared/http-errors.js +35 -0
- package/dist/shared/http-errors.js.map +1 -0
- package/dist/shared/logger.contract.d.ts +63 -0
- package/dist/shared/logger.contract.d.ts.map +1 -0
- package/dist/shared/logger.contract.js +126 -0
- package/dist/shared/logger.contract.js.map +1 -0
- package/dist/shared/logging.d.ts +31 -0
- package/dist/shared/logging.d.ts.map +1 -0
- package/dist/shared/logging.js +92 -0
- package/dist/shared/logging.js.map +1 -0
- package/dist/shared/path-containment.d.ts +21 -0
- package/dist/shared/path-containment.d.ts.map +1 -0
- package/dist/shared/path-containment.js +34 -0
- package/dist/shared/path-containment.js.map +1 -0
- package/dist/shared/pending-proposals.d.ts +71 -0
- package/dist/shared/pending-proposals.d.ts.map +1 -0
- package/dist/shared/pending-proposals.js +98 -0
- package/dist/shared/pending-proposals.js.map +1 -0
- package/dist/shared/printable.d.ts +22 -0
- package/dist/shared/printable.d.ts.map +1 -0
- package/dist/shared/printable.js +65 -0
- package/dist/shared/printable.js.map +1 -0
- package/dist/shared/redact-secret.d.ts +30 -0
- package/dist/shared/redact-secret.d.ts.map +1 -0
- package/dist/shared/redact-secret.js +114 -0
- package/dist/shared/redact-secret.js.map +1 -0
- package/dist/shared/rename-no-replace.d.ts +119 -0
- package/dist/shared/rename-no-replace.d.ts.map +1 -0
- package/dist/shared/rename-no-replace.js +323 -0
- package/dist/shared/rename-no-replace.js.map +1 -0
- package/dist/shared/ssrf.d.ts.map +1 -1
- package/dist/shared/ssrf.js +49 -18
- package/dist/shared/ssrf.js.map +1 -1
- package/dist/version.d.ts +10 -6
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +10 -6
- package/dist/version.js.map +1 -1
- package/kb-template/.bevelignore +4 -3
- package/kb-template/AGENTS.md +281 -36
- package/kb-template/KnowledgeBase/How to get started.md +1 -1
- package/kb-template/access.md +5 -3
- package/kb-template/mcp-description.md +27 -0
- package/migrations/0006_api_tokens_revoked_by.sql +1 -0
- package/migrations/0007_github_facade_registered.sql +1 -0
- package/migrations/0008_change_request_apply_failure.sql +4 -0
- package/migrations/0009_change_request_apply_failure_kind.sql +13 -0
- package/migrations/0010_plugin_join_requests.sql +15 -0
- package/migrations/0011_plugin_join_request_claim.sql +11 -0
- package/migrations/0012_agent_audit.sql +41 -0
- package/migrations/0013_agent_identity_and_key_soft_delete.sql +29 -0
- package/migrations/meta/0006_snapshot.json +1723 -0
- package/migrations/meta/0007_snapshot.json +1729 -0
- package/migrations/meta/0008_snapshot.json +1753 -0
- package/migrations/meta/0009_snapshot.json +1759 -0
- package/migrations/meta/0010_snapshot.json +1872 -0
- package/migrations/meta/0011_snapshot.json +1884 -0
- package/migrations/meta/0012_snapshot.json +2247 -0
- package/migrations/meta/0013_snapshot.json +2259 -0
- package/migrations/meta/_journal.json +56 -0
- package/package.json +7 -6
- package/src/__tests__/core-config.domain.test.ts +67 -2
- package/src/__tests__/kb-layout-config.test.ts +186 -1
- package/src/__tests__/open-change-gate.ts +15 -0
- package/src/core/__tests__/catalog-cache-invalidation.test.ts +83 -3
- package/src/core/__tests__/catalog-revision.test.ts +190 -0
- package/src/core/__tests__/lifecycle.test.ts +369 -0
- package/src/core/__tests__/public-config.test.ts +30 -0
- package/src/core/__tests__/readiness.test.ts +109 -0
- package/src/core/catalog-cache-invalidation.ts +20 -1
- package/src/core/catalog-revision.ts +110 -0
- package/src/core/create-core-server.ts +286 -79
- package/src/core/create-core-services.ts +315 -81
- package/src/core/lifecycle.ts +312 -0
- package/src/core/public-config.ts +86 -0
- package/src/core/readiness.ts +123 -0
- package/src/core-config.ts +70 -4
- package/src/index.ts +15 -0
- package/src/modules/access/__tests__/access-control.admin-root-floor.test.ts +362 -0
- package/src/modules/access/__tests__/access-control.atref-batch.test.ts +2 -1
- package/src/modules/access/__tests__/access-control.atref-cache.test.ts +46 -22
- package/src/modules/access/__tests__/access-control.deny-dependents.test.ts +215 -0
- package/src/modules/access/__tests__/access-control.download-read.test.ts +268 -0
- package/src/modules/access/__tests__/access-control.everyone-read.test.ts +145 -0
- package/src/modules/access/__tests__/access-control.group-read.test.ts +163 -0
- package/src/modules/access/__tests__/access-control.invalidate-race.test.ts +2 -0
- package/src/modules/access/__tests__/access-control.platform-restore.test.ts +152 -0
- package/src/modules/access/__tests__/access-control.prospective.test.ts +189 -0
- package/src/modules/access/__tests__/access-control.read-batch.test.ts +2 -1
- package/src/modules/access/__tests__/access-control.service.test.ts +123 -78
- package/src/modules/access/__tests__/access-groups.test.ts +47 -14
- package/src/modules/access/__tests__/access-md-format.test.ts +2 -1
- package/src/modules/access/__tests__/access-mutation.service.test.ts +52 -4
- package/src/modules/access/__tests__/access-own-read-grant.test.ts +2 -0
- package/src/modules/access/__tests__/access-personal-plugin.test.ts +153 -0
- package/src/modules/access/__tests__/access-plugin-principals.test.ts +18 -1
- package/src/modules/access/__tests__/access-restrict-here.test.ts +450 -0
- package/src/modules/access/__tests__/access.routes.batch.test.ts +139 -0
- package/src/modules/access/__tests__/access.routes.folder-governs.test.ts +394 -0
- package/src/modules/access/__tests__/access.routes.group-grant.test.ts +6 -2
- package/src/modules/access/__tests__/access.routes.overrides.test.ts +3 -2
- package/src/modules/access/__tests__/access.routes.proposal-branch.test.ts +234 -0
- package/src/modules/access/__tests__/access.routes.prospective.test.ts +216 -0
- package/src/modules/access/__tests__/access.routes.revoke.test.ts +7 -2
- package/src/modules/access/__tests__/access.routes.unknown-email.test.ts +360 -0
- package/src/modules/access/__tests__/change-read-gate.test.ts +272 -0
- package/src/modules/access/__tests__/creator-access.test.ts +81 -83
- package/src/modules/access/__tests__/grant-sources.test.ts +3 -2
- package/src/modules/access/__tests__/groups-admin.service.test.ts +6 -5
- package/src/modules/access/__tests__/roles-admin.security.test.ts +196 -0
- package/src/modules/access/__tests__/roles-admin.service.test.ts +127 -2
- package/src/modules/access/__tests__/roles-capabilities.test.ts +5 -4
- package/src/modules/access/__tests__/roles.routes.test.ts +5 -2
- package/src/modules/access/__tests__/user-access-removal.service.test.ts +402 -0
- package/src/modules/access/__tests__/users-db-double.ts +63 -0
- package/src/modules/access/access-control.interface.ts +251 -11
- package/src/modules/access/access-control.service.ts +719 -164
- package/src/modules/access/access-mutation.service.ts +182 -13
- package/src/modules/access/access-view.ts +316 -0
- package/src/modules/access/access.routes.ts +293 -95
- package/src/modules/access/admin-locked-commit.ts +12 -14
- package/src/modules/access/admin-route-helpers.ts +4 -4
- package/src/modules/access/change-read-gate.ts +148 -0
- package/src/modules/access/creator-access.ts +89 -124
- package/src/modules/access/directory-sync-bot.ts +4 -1
- package/src/modules/access/groups-admin.service.ts +3 -3
- package/src/modules/access/reference-scan.ts +5 -5
- package/src/modules/access/roles-admin.service.ts +94 -15
- package/src/modules/access/synced-groups-committer.ts +10 -15
- package/src/modules/access/synced-groups-writer.ts +3 -12
- package/src/modules/access/user-access-removal.service.ts +711 -0
- package/src/modules/access-model/__tests__/access-splice.test.ts +63 -1
- package/src/modules/access-model/__tests__/frontmatter-fences.test.ts +71 -0
- package/src/modules/access-model/__tests__/roles-yaml-guard.test.ts +131 -0
- package/src/modules/access-model/access-errors.ts +56 -15
- package/src/modules/access-model/access-grammar.ts +85 -48
- package/src/modules/access-model/access-splice.ts +18 -18
- package/src/modules/access-model/access-template.ts +44 -0
- package/src/modules/access-model/change-gate.ts +80 -0
- package/src/modules/access-model/creator.ts +18 -21
- package/src/modules/access-model/frontmatter-lines.ts +98 -0
- package/src/modules/access-model/plugin-principals.ts +12 -19
- package/src/modules/access-model/roles-yaml-guard.ts +182 -4
- package/src/modules/admin/admin-access.service.ts +6 -2
- package/src/modules/agent-instructions/__tests__/agent-instructions.route.test.ts +100 -0
- package/src/modules/agent-instructions/__tests__/compose.test.ts +256 -0
- package/src/modules/agent-instructions/__tests__/read-preamble.test.ts +135 -0
- package/src/modules/agent-instructions/agent-instructions.routes.ts +41 -0
- package/src/modules/agent-instructions/compose.ts +271 -0
- package/src/modules/agent-instructions/index.ts +14 -0
- package/src/modules/agent-instructions/read-preamble.ts +88 -0
- package/src/modules/audit/__tests__/agent-audit.service.test.ts +370 -0
- package/src/modules/audit/__tests__/agent-rest-audit.middleware.test.ts +113 -0
- package/src/modules/audit/__tests__/audit.routes.test.ts +201 -0
- package/src/modules/audit/__tests__/event-classifier.test.ts +121 -0
- package/src/modules/audit/agent-audit.service.ts +316 -0
- package/src/modules/audit/agent-rest-audit.middleware.ts +83 -0
- package/src/modules/audit/audit.contract.ts +164 -0
- package/src/modules/audit/audit.routes.ts +168 -0
- package/src/modules/audit/event-classifier.ts +155 -0
- package/src/modules/audit/index.ts +14 -0
- package/src/modules/audit/request-audit.ts +141 -0
- package/src/modules/auth/__tests__/account-erasure.approval-gate.test.ts +209 -0
- package/src/modules/auth/__tests__/account.routes.test.ts +178 -2
- package/src/modules/auth/__tests__/auth.middleware.test.ts +78 -0
- package/src/modules/auth/__tests__/auth.service.test.ts +338 -5
- package/src/modules/auth/__tests__/oidc-auth-provider.test.ts +352 -12
- package/src/modules/auth/__tests__/onboarding-done.route.test.ts +3 -1
- package/src/modules/auth/account-erasure.service.ts +117 -10
- package/src/modules/auth/account.routes.ts +115 -14
- package/src/modules/auth/auth.routes.ts +20 -7
- package/src/modules/auth/auth.service.ts +187 -28
- package/src/modules/auth/oidc-auth-provider.ts +120 -22
- package/src/modules/code-mode/__tests__/code-mode.tool.test.ts +109 -1
- package/src/modules/code-mode/code-mode.tool.ts +13 -2
- package/src/modules/connection-probe/__tests__/connection-probe.service.test.ts +78 -0
- package/src/modules/connection-probe/connection-probe.service.ts +59 -7
- package/src/modules/database/__tests__/advisory-lease.test.ts +152 -0
- package/src/modules/database/__tests__/advisory-lock.test.ts +147 -0
- package/src/modules/database/advisory-lock.ts +346 -0
- package/src/modules/database/connection.ts +9 -1
- package/src/modules/database/core-schema.ts +227 -0
- package/src/modules/database/migrate.ts +27 -6
- package/src/modules/declared-variables/declared-variables.routes.ts +6 -3
- package/src/modules/diff/__tests__/diff.service.seed-atomicity.test.ts +3 -0
- package/src/modules/diff/__tests__/diff.service.test.ts +3 -0
- package/src/modules/diff/diff.routes.ts +2 -4
- package/src/modules/diff/diff.service.ts +80 -79
- package/src/modules/kb-fs/__tests__/locking-filesystem.test.ts +472 -9
- package/src/modules/kb-fs/__tests__/node-fs.test.ts +409 -0
- package/src/modules/kb-fs/__tests__/repo-path.test.ts +210 -1
- package/src/modules/{workspace → kb-fs}/bevel-ignore.ts +22 -15
- package/src/modules/kb-fs/file-change-notifier.ts +4 -1
- package/src/modules/kb-fs/git-guarded-filesystem.ts +136 -0
- package/src/modules/kb-fs/locking-filesystem.ts +399 -109
- package/src/modules/kb-fs/node-fs.ts +165 -0
- package/src/modules/kb-fs/read-only-filesystem.ts +18 -9
- package/src/modules/kb-fs/repo-path.ts +213 -3
- package/src/modules/kb-sync/kb-sync.routes.ts +5 -2
- package/src/modules/kb-sync/kb-sync.service.ts +8 -5
- package/src/modules/marketplace/__tests__/github-facade.test.ts +134 -2
- package/src/modules/marketplace/__tests__/marketplace-git.test.ts +2 -1
- package/src/modules/marketplace/__tests__/marketplace-repo.head.test.ts +47 -0
- package/src/modules/marketplace/git-http.routes.ts +7 -4
- package/src/modules/marketplace/github-facade/github-facade-admin.routes.ts +35 -3
- package/src/modules/marketplace/github-facade/github-facade-credentials.service.ts +55 -0
- package/src/modules/marketplace/github-facade/github-facade.routes.ts +32 -6
- package/src/modules/marketplace/github-facade/github-facade.service.ts +80 -19
- package/src/modules/marketplace/github-facade/index.ts +1 -0
- package/src/modules/marketplace/marketplace-repo.service.ts +23 -8
- package/src/modules/mcp/__tests__/bevel-oauth-provider.test.ts +183 -13
- package/src/modules/mcp/__tests__/downstream-pool.test.ts +278 -0
- package/src/modules/mcp/__tests__/downstream-token-refresh.test.ts +178 -0
- package/src/modules/mcp/__tests__/fake-downstream-mcp-server.ts +156 -0
- package/src/modules/mcp/__tests__/first-call-probe.cli-args.test.ts +178 -0
- package/src/modules/mcp/__tests__/first-call-probe.test.ts +414 -0
- package/src/modules/mcp/__tests__/manual-failure-memo.test.ts +98 -6
- package/src/modules/mcp/__tests__/mcp-auth.middleware.test.ts +68 -7
- package/src/modules/mcp/__tests__/mcp-routes-harness.ts +1 -3
- package/src/modules/mcp/__tests__/mcp.e2e.test.ts +1055 -59
- package/src/modules/mcp/__tests__/mcp.routes.local-token.test.ts +24 -4
- package/src/modules/mcp/__tests__/mcp.routes.stateless.test.ts +182 -0
- package/src/modules/mcp/__tests__/mcp.service.test.ts +391 -6
- package/src/modules/mcp/__tests__/surface-log-throttle.test.ts +169 -0
- package/src/modules/mcp/downstream-pool.ts +256 -0
- package/src/modules/mcp/downstream-token-refresh.ts +170 -0
- package/src/modules/mcp/first-call-probe.cli-args.ts +159 -0
- package/src/modules/mcp/first-call-probe.cli.ts +60 -0
- package/src/modules/mcp/first-call-probe.ts +418 -0
- package/src/modules/mcp/manual-failure-memo.ts +81 -23
- package/src/modules/mcp/mcp-auth.middleware.ts +56 -16
- package/src/modules/mcp/mcp.routes.ts +386 -482
- package/src/modules/mcp/mcp.service.ts +905 -177
- package/src/modules/mcp/oauth/bevel-oauth-provider.ts +189 -8
- package/src/modules/mcp/oauth/oauth-consent.routes.ts +4 -4
- package/src/modules/mcp/surface-log-throttle.ts +120 -0
- package/src/modules/plugins/__tests__/bundle-dialect.e2e.test.ts +10 -7
- package/src/modules/plugins/__tests__/bundle-dialect.test.ts +165 -0
- package/src/modules/plugins/__tests__/compile-marketplace.test.ts +139 -10
- package/src/modules/plugins/__tests__/fake-join-request-store.ts +189 -0
- package/src/modules/plugins/__tests__/join-request-jobs.service.test.ts +608 -0
- package/src/modules/plugins/__tests__/plugin-creation-display-name.test.ts +241 -0
- package/src/modules/plugins/__tests__/plugin-index.service.test.ts +148 -7
- package/src/modules/plugins/__tests__/plugin-links.service.test.ts +10 -13
- package/src/modules/plugins/__tests__/plugin-names.test.ts +77 -0
- package/src/modules/plugins/__tests__/plugin-provision.service.test.ts +129 -19
- package/src/modules/plugins/__tests__/plugin-rename.service.test.ts +91 -29
- package/src/modules/plugins/__tests__/plugins.routes.test.ts +370 -19
- package/src/modules/plugins/__tests__/plugins.tools.test.ts +131 -0
- package/src/modules/plugins/__tests__/teams.routes.test.ts +248 -0
- package/src/modules/plugins/compile/compile-marketplace.ts +143 -46
- package/src/modules/plugins/compile/marketplace-compiler.service.ts +8 -7
- package/src/modules/plugins/discovery/__tests__/kb-plugin-source.test.ts +56 -20
- package/src/modules/plugins/discovery/bundle-dialect/bundle.source.ts +30 -9
- package/src/modules/plugins/discovery/bundle-dialect/registry.ts +93 -18
- package/src/modules/plugins/discovery/kb-plugin-source.ts +10 -7
- package/src/modules/plugins/discovery/native.source.ts +21 -3
- package/src/modules/plugins/discovery/plugin-source.ts +17 -3
- package/src/modules/plugins/index.ts +16 -3
- package/src/modules/plugins/join-request-jobs.service.ts +675 -0
- package/src/modules/plugins/join-request-records.store.ts +353 -0
- package/src/modules/plugins/join-requests.service.ts +7 -4
- package/src/modules/plugins/plugin-links.service.ts +4 -17
- package/src/modules/plugins/plugin-links.ts +6 -3
- package/src/modules/plugins/plugin-provision.service.ts +209 -37
- package/src/modules/plugins/plugin-rename.service.ts +21 -9
- package/src/modules/plugins/plugins.contract.ts +52 -4
- package/src/modules/plugins/plugins.routes.ts +204 -124
- package/src/modules/plugins/plugins.service.ts +92 -18
- package/src/modules/plugins/plugins.tools.ts +88 -0
- package/src/modules/plugins/teams.routes.ts +129 -0
- package/src/modules/secrets-vault/__tests__/connect-pending.route.test.ts +359 -15
- package/src/modules/secrets-vault/__tests__/db-secrets-vault.oauth.test.ts +248 -0
- package/src/modules/secrets-vault/__tests__/namespace-secrets.test.ts +202 -0
- package/src/modules/secrets-vault/db-secrets-vault.service.ts +217 -35
- package/src/modules/secrets-vault/index.ts +1 -0
- package/src/modules/secrets-vault/mcp-oauth-discovery.service.ts +6 -3
- package/src/modules/secrets-vault/secrets-variable-loader.ts +4 -4
- package/src/modules/secrets-vault/secrets-vault.contract.ts +93 -0
- package/src/modules/secrets-vault/secrets-vault.routes.ts +99 -38
- package/src/modules/settings/__tests__/connection-check.test.ts +233 -0
- package/src/modules/settings/__tests__/deployment-settings.service.test.ts +223 -6
- package/src/modules/settings/__tests__/git-root-folders.test.ts +247 -0
- package/src/modules/settings/__tests__/oidc-check.test.ts +185 -0
- package/src/modules/settings/__tests__/setup.routes.boot-failure.test.ts +119 -0
- package/src/modules/settings/__tests__/setup.routes.layout-phase.test.ts +170 -0
- package/src/modules/settings/__tests__/setup.routes.oidc.test.ts +555 -0
- package/src/modules/settings/__tests__/setup.routes.test.ts +667 -16
- package/src/modules/settings/connection-check.ts +351 -0
- package/src/modules/settings/deployment-settings.service.ts +444 -59
- package/src/modules/settings/git-root-folders.ts +171 -0
- package/src/modules/settings/oidc-check.ts +229 -0
- package/src/modules/settings/setup.routes.ts +456 -110
- package/src/modules/skills/__tests__/allowed-tools-check.test.ts +224 -0
- package/src/modules/skills/__tests__/allowed-tools-warn.tools.test.ts +210 -0
- package/src/modules/skills/__tests__/pending-skills.service.test.ts +3 -3
- package/src/modules/skills/__tests__/skills.routes.warnings.test.ts +91 -0
- package/src/modules/skills/__tests__/skills.service.test.ts +223 -2
- package/src/modules/skills/allowed-tools-check.ts +352 -0
- package/src/modules/skills/index.ts +4 -0
- package/src/modules/skills/pending-skills.service.ts +21 -82
- package/src/modules/skills/skill-access-requests.routes.ts +10 -6
- package/src/modules/skills/skills.contract.ts +43 -11
- package/src/modules/skills/skills.routes.ts +16 -1
- package/src/modules/skills/skills.service.ts +214 -84
- package/src/modules/skills/skills.tools.ts +43 -5
- package/src/modules/tool-auth/__tests__/connection-key-rejection.test.ts +192 -0
- package/src/modules/tool-auth/__tests__/connection-keys-admin.routes.test.ts +116 -0
- package/src/modules/tool-auth/__tests__/external-api-key.service.test.ts +153 -8
- package/src/modules/tool-auth/__tests__/internal-token.service.test.ts +6 -0
- package/src/modules/tool-auth/connection-key-rejection.ts +25 -0
- package/src/modules/tool-auth/connection-keys-admin.routes.ts +76 -0
- package/src/modules/tool-auth/external-api-key.interface.ts +78 -8
- package/src/modules/tool-auth/external-api-key.service.ts +98 -33
- package/src/modules/tool-auth/internal-token.service.ts +16 -2
- package/src/modules/tool-auth/key-or-session.middleware.ts +45 -0
- package/src/modules/tool-auth/tool-auth.middleware.ts +33 -8
- package/src/modules/tool-helpers/__tests__/agent-roles-write.test.ts +228 -0
- package/src/modules/tool-helpers/__tests__/phase4-tools.test.ts +33 -4
- package/src/modules/tool-helpers/tool-context.ts +46 -7
- package/src/modules/tool-helpers/tool-handler.ts +23 -5
- package/src/modules/tool-helpers/tool.contract.ts +5 -0
- package/src/modules/tool-manuals/__tests__/mcp-server-edit.service.test.ts +2 -1
- package/src/modules/tool-manuals/__tests__/pending-tools.service.test.ts +411 -0
- package/src/modules/tool-manuals/__tests__/tool-delete.route.test.ts +133 -0
- package/src/modules/tool-manuals/__tests__/tool-delete.service.test.ts +469 -0
- package/src/modules/tool-manuals/__tests__/tool-manuals.archive.route.test.ts +21 -2
- package/src/modules/tool-manuals/__tests__/tool-manuals.cli.test.ts +9 -4
- package/src/modules/tool-manuals/__tests__/tool-manuals.detail.route.test.ts +6 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.invalid.routes.test.ts +254 -0
- package/src/modules/tool-manuals/__tests__/tool-manuals.invalid.test.ts +577 -0
- package/src/modules/tool-manuals/__tests__/tool-manuals.mcp-oauth.test.ts +6 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.pending.route.test.ts +102 -0
- package/src/modules/tool-manuals/__tests__/tool-manuals.restart.test.ts +285 -0
- package/src/modules/tool-manuals/__tests__/tool-manuals.service.test.ts +178 -2
- package/src/modules/tool-manuals/__tests__/tool-manuals.tools.test.ts +114 -2
- package/src/modules/tool-manuals/index.ts +3 -0
- package/src/modules/tool-manuals/mcp-json-discovery.ts +13 -10
- package/src/modules/tool-manuals/mcp-server-edit.service.ts +11 -14
- package/src/modules/tool-manuals/pending-tools.service.ts +179 -0
- package/src/modules/tool-manuals/tool-delete.service.ts +401 -0
- package/src/modules/tool-manuals/tool-manuals.contract.ts +165 -0
- package/src/modules/tool-manuals/tool-manuals.routes.ts +138 -54
- package/src/modules/tool-manuals/tool-manuals.service.ts +432 -87
- package/src/modules/tool-manuals/tool-manuals.tools.ts +81 -6
- package/src/modules/workflow/__tests__/apply-failure.test.ts +1038 -0
- package/src/modules/workflow/__tests__/event-bus.test.ts +61 -9
- package/src/modules/workflow/__tests__/fake-file-lock-db.ts +199 -0
- package/src/modules/workflow/__tests__/file-lock.service.path-identity.test.ts +237 -0
- package/src/modules/workflow/__tests__/format-affected-owners.test.ts +18 -0
- package/src/modules/workflow/__tests__/merge-announces-tree.test.ts +220 -0
- package/src/modules/workflow/__tests__/pending-commits.worker.concurrency.test.ts +187 -0
- package/src/modules/workflow/__tests__/preserve-roles-yaml.test.ts +2 -0
- package/src/modules/workflow/__tests__/sanitize-error.test.ts +10 -0
- package/src/modules/workflow/__tests__/workflow.routes.folder-proposals.test.ts +128 -0
- package/src/modules/workflow/__tests__/workflow.routes.fork-point-file.test.ts +149 -0
- package/src/modules/workflow/__tests__/workflow.routes.lock-path.test.ts +305 -0
- package/src/modules/workflow/__tests__/workflow.service.branch-in-use.test.ts +2 -0
- package/src/modules/workflow/__tests__/workflow.service.commitFileWhileLocked.test.ts +2 -0
- package/src/modules/workflow/__tests__/workflow.service.deleted-branch-sweep.test.ts +2 -0
- package/src/modules/workflow/__tests__/workflow.service.facade.test.ts +294 -25
- package/src/modules/workflow/__tests__/workflow.service.folder-proposals.test.ts +564 -0
- package/src/modules/workflow/__tests__/workflow.service.platform-restore.test.ts +135 -0
- package/src/modules/workflow/__tests__/workflow.service.read-gate.test.ts +172 -0
- package/src/modules/workflow/__tests__/workflow.service.releaseLock.test.ts +14 -0
- package/src/modules/workflow/__tests__/workflow.service.sync.test.ts +5 -0
- package/src/modules/workflow/__tests__/workflow.service.update-from-target.test.ts +281 -0
- package/src/modules/workflow/agent-tools/__tests__/workflow.tools.test.ts +158 -7
- package/src/modules/workflow/agent-tools/workflow.tools.ts +93 -64
- package/src/modules/workflow/event-bus.ts +26 -28
- package/src/modules/workflow/events.routes.ts +56 -21
- package/src/modules/workflow/file-lock.service.ts +27 -4
- package/src/modules/workflow/git/__tests__/change-request-link.test.ts +43 -0
- package/src/modules/workflow/git/__tests__/git.service.accessGating.test.ts +1 -0
- package/src/modules/workflow/git/__tests__/git.service.changedFilesForPr.test.ts +238 -1
- package/src/modules/workflow/git/__tests__/git.service.forkPoint.test.ts +245 -0
- package/src/modules/workflow/git/__tests__/git.service.list-branches.test.ts +35 -0
- package/src/modules/workflow/git/__tests__/git.service.mergeChangeRequest.test.ts +149 -0
- package/src/modules/workflow/git/__tests__/git.service.revertPathsAndPush.test.ts +177 -0
- package/src/modules/workflow/git/__tests__/node-git-runner.test.ts +114 -0
- package/src/modules/workflow/git/__tests__/pull-request.service.getPrDetail.test.ts +69 -2
- package/src/modules/workflow/git/__tests__/pull-request.service.list-fetch.test.ts +121 -0
- package/src/modules/workflow/git/__tests__/pull-request.service.placeholder.test.ts +79 -0
- package/src/modules/workflow/git/__tests__/pull-request.service.test.ts +1 -1
- package/src/modules/workflow/git/__tests__/pull-request.service.viewer-can-cancel.test.ts +1 -1
- package/src/modules/workflow/git/__tests__/pull-request.service.viewer-can-update.test.ts +111 -0
- package/src/modules/workflow/git/change-request-link.ts +35 -0
- package/src/modules/workflow/git/git-version.ts +5 -2
- package/src/modules/workflow/git/git.service.ts +684 -144
- package/src/modules/workflow/git/node-git-runner.ts +315 -0
- package/src/modules/workflow/git/pull-request.service.ts +179 -27
- package/src/modules/workflow/pending-commits.service.ts +26 -7
- package/src/modules/workflow/pending-commits.worker.ts +114 -69
- package/src/modules/workflow/recovery-bot.ts +4 -1
- package/src/modules/workflow/review-workflow/__tests__/approval-states.test.ts +180 -1
- package/src/modules/workflow/review-workflow/__tests__/cancel-pr.test.ts +1 -1
- package/src/modules/workflow/review-workflow/__tests__/carry-approvals-forward.test.ts +520 -0
- package/src/modules/workflow/review-workflow/__tests__/erase-approver.test.ts +84 -0
- package/src/modules/workflow/review-workflow/__tests__/merge-gate.test.ts +89 -77
- package/src/modules/workflow/review-workflow/approval-lock.ts +122 -0
- package/src/modules/workflow/review-workflow/review-workflow.interface.ts +59 -7
- package/src/modules/workflow/review-workflow/review-workflow.service.ts +309 -105
- package/src/modules/workflow/sanitize-error.ts +9 -4
- package/src/modules/workflow/workflow.routes.ts +273 -29
- package/src/modules/workflow/workflow.service.ts +1087 -171
- package/src/modules/workspace/__tests__/empty-dirs.test.ts +44 -0
- package/src/modules/workspace/__tests__/file-stat-access.test.ts +301 -0
- package/src/modules/workspace/__tests__/git-internals.security.test.ts +883 -0
- package/src/modules/workspace/__tests__/workspace-paths-inside-the-repo.test.ts +464 -0
- package/src/modules/workspace/__tests__/workspace.routes.branch-errors.test.ts +139 -0
- package/src/modules/workspace/__tests__/workspace.routes.create-grant.test.ts +189 -37
- package/src/modules/workspace/__tests__/workspace.routes.delete.test.ts +51 -11
- package/src/modules/workspace/__tests__/workspace.routes.download-implies-read.test.ts +161 -0
- package/src/modules/workspace/__tests__/workspace.routes.download.test.ts +109 -10
- package/src/modules/workspace/__tests__/workspace.routes.file-writes.test.ts +624 -0
- package/src/modules/workspace/__tests__/workspace.routes.folders.test.ts +409 -0
- package/src/modules/workspace/__tests__/workspace.routes.move-platform-files.test.ts +327 -0
- package/src/modules/workspace/__tests__/workspace.routes.read-gate.test.ts +25 -6
- package/src/modules/workspace/__tests__/workspace.service.ensure-remotes-fetched.test.ts +109 -0
- package/src/modules/workspace/__tests__/workspace.service.list-cloned.test.ts +6 -5
- package/src/modules/workspace/__tests__/workspace.service.move-never-overwrites.test.ts +218 -0
- package/src/modules/workspace/__tests__/workspace.service.read-filter.test.ts +56 -1
- package/src/modules/workspace/__tests__/workspace.service.test.ts +811 -42
- package/src/modules/workspace/__tests__/workspace.service.unknown-branch.test.ts +197 -0
- package/src/modules/workspace/__tests__/workspace.tools.agents-file.test.ts +128 -0
- package/src/modules/workspace/__tests__/workspace.tools.branch-errors.test.ts +212 -0
- package/src/modules/workspace/__tests__/workspace.tools.test.ts +2632 -110
- package/src/modules/workspace/__tests__/write-denial.test.ts +75 -0
- package/src/modules/workspace/empty-dirs.ts +79 -0
- package/src/modules/workspace/file-readers/README.md +32 -0
- package/src/modules/workspace/file-readers/__tests__/doc-extract.test.ts +59 -2
- package/src/modules/workspace/file-readers/__tests__/file-reader.registry.test.ts +133 -4
- package/src/modules/workspace/file-readers/__tests__/fixtures/soft-break.docx +0 -0
- package/src/modules/workspace/file-readers/__tests__/fixtures/tab.docx +0 -0
- package/src/modules/workspace/file-readers/content-mode.ts +87 -0
- package/src/modules/workspace/file-readers/doc-extract.service.ts +4 -1
- package/src/modules/workspace/file-readers/doc-extract.types.ts +8 -4
- package/src/modules/workspace/file-readers/document-reader.ts +6 -0
- package/src/modules/workspace/file-readers/extract-docx.ts +6 -0
- package/src/modules/workspace/file-readers/file-reader.registry.ts +9 -1
- package/src/modules/workspace/file-readers/file-reader.ts +27 -6
- package/src/modules/workspace/file-readers/image-reader.ts +10 -5
- package/src/modules/workspace/file-readers/ooxml-text.ts +38 -2
- package/src/modules/workspace/file-readers/text-reader.ts +61 -4
- package/src/modules/workspace/git-internals.middleware.ts +86 -0
- package/src/modules/workspace/not-found.ts +119 -0
- package/src/modules/workspace/session-ontology.gate.ts +1 -1
- package/src/modules/workspace/startup/__tests__/beside-checkout.test.ts +181 -0
- package/src/modules/workspace/startup/__tests__/kb-startup-runner.degraded.test.ts +361 -0
- package/src/modules/workspace/startup/__tests__/kb-startup-runner.test.ts +53 -16
- package/src/modules/workspace/startup/beside-checkout.ts +112 -0
- package/src/modules/workspace/startup/kb-git.ts +43 -36
- package/src/modules/workspace/startup/kb-startup-runner.ts +303 -63
- package/src/modules/workspace/startup/steps/__tests__/steps.test.ts +1215 -73
- package/src/modules/workspace/startup/steps/groups-to-plugins.step.ts +460 -417
- package/src/modules/workspace/startup/steps/personal-spaces.step.ts +191 -0
- package/src/modules/workspace/startup/steps/plugin-display-names.step.ts +169 -0
- package/src/modules/workspace/startup/steps/plugin-layout.ts +110 -0
- package/src/modules/workspace/startup/steps/plugin-manifests.step.ts +46 -85
- package/src/modules/workspace/startup/steps/roles-yaml.step.ts +6 -12
- package/src/modules/workspace/startup/steps/seed-tree.ts +159 -78
- package/src/modules/workspace/startup/steps/template-files.step.ts +492 -141
- package/src/modules/workspace/startup/steps/template-source.ts +168 -0
- package/src/modules/workspace/workspace.routes.ts +687 -257
- package/src/modules/workspace/workspace.service.ts +1000 -303
- package/src/modules/workspace/workspace.tools.ts +1823 -180
- package/src/modules/workspace/write-denial.ts +189 -0
- package/src/shared/__tests__/canonical-file-identity.test.ts +154 -0
- package/src/shared/__tests__/email-identity.test.ts +35 -0
- package/src/shared/__tests__/filename.test.ts +0 -0
- package/src/shared/__tests__/frontmatter-id.test.ts +5 -0
- package/src/shared/__tests__/git-failure.test.ts +198 -0
- package/src/shared/__tests__/git-internals.test.ts +156 -0
- package/src/shared/__tests__/http-errors.test.ts +42 -0
- package/src/shared/__tests__/logging.test.ts +185 -0
- package/src/shared/__tests__/path-containment.test.ts +60 -0
- package/src/shared/__tests__/pending-proposals.readAt.test.ts +102 -0
- package/src/shared/__tests__/printable.test.ts +64 -0
- package/src/shared/__tests__/redact-secret.test.ts +122 -0
- package/src/shared/__tests__/rename-no-replace.test.ts +466 -0
- package/src/shared/__tests__/ssrf.test.ts +20 -0
- package/src/shared/canonical-file-identity.ts +92 -0
- package/src/shared/domain-errors.ts +149 -0
- package/src/shared/email-identity.ts +38 -0
- package/src/shared/fs.contract.ts +225 -0
- package/src/shared/git-failure.ts +196 -0
- package/src/shared/git-internals.ts +179 -0
- package/src/shared/git.contract.ts +170 -0
- package/src/shared/http-errors.ts +36 -0
- package/src/shared/logger.contract.ts +141 -0
- package/src/shared/logging.ts +96 -0
- package/src/shared/path-containment.ts +34 -0
- package/src/shared/pending-proposals.ts +161 -0
- package/src/shared/printable.ts +68 -0
- package/src/shared/redact-secret.ts +118 -0
- package/src/shared/rename-no-replace.ts +386 -0
- package/src/shared/ssrf.ts +44 -16
- package/src/version.ts +10 -6
- package/dist/modules/access/access-errors.d.ts +0 -34
- package/dist/modules/access/access-errors.d.ts.map +0 -1
- package/dist/modules/access/access-errors.js +0 -40
- package/dist/modules/access/access-errors.js.map +0 -1
- package/dist/modules/access/access-splice.d.ts +0 -140
- package/dist/modules/access/access-splice.d.ts.map +0 -1
- package/dist/modules/access/access-splice.js +0 -389
- package/dist/modules/access/access-splice.js.map +0 -1
- package/dist/modules/access/group-files.d.ts +0 -83
- package/dist/modules/access/group-files.d.ts.map +0 -1
- package/dist/modules/access/group-files.js +0 -167
- package/dist/modules/access/group-files.js.map +0 -1
- package/dist/modules/access/kb-read-filter.d.ts +0 -41
- package/dist/modules/access/kb-read-filter.d.ts.map +0 -1
- package/dist/modules/access/kb-read-filter.js +0 -60
- package/dist/modules/access/kb-read-filter.js.map +0 -1
- package/dist/modules/access/render-roles-yaml.d.ts +0 -22
- package/dist/modules/access/render-roles-yaml.d.ts.map +0 -1
- package/dist/modules/access/render-roles-yaml.js +0 -56
- package/dist/modules/access/render-roles-yaml.js.map +0 -1
- package/dist/modules/access/roles-yaml-guard.d.ts +0 -56
- package/dist/modules/access/roles-yaml-guard.d.ts.map +0 -1
- package/dist/modules/access/roles-yaml-guard.js +0 -79
- package/dist/modules/access/roles-yaml-guard.js.map +0 -1
- package/dist/modules/diff/diff-paths.d.ts +0 -2
- package/dist/modules/diff/diff-paths.d.ts.map +0 -1
- package/dist/modules/diff/diff-paths.js +0 -9
- package/dist/modules/diff/diff-paths.js.map +0 -1
- package/dist/modules/groups/group-provision.service.d.ts +0 -130
- package/dist/modules/groups/group-provision.service.d.ts.map +0 -1
- package/dist/modules/groups/group-provision.service.js +0 -288
- package/dist/modules/groups/group-provision.service.js.map +0 -1
- package/dist/modules/groups/groups.contract.d.ts +0 -106
- package/dist/modules/groups/groups.contract.d.ts.map +0 -1
- package/dist/modules/groups/groups.contract.js +0 -36
- package/dist/modules/groups/groups.contract.js.map +0 -1
- package/dist/modules/groups/groups.routes.d.ts +0 -42
- package/dist/modules/groups/groups.routes.d.ts.map +0 -1
- package/dist/modules/groups/groups.routes.js +0 -379
- package/dist/modules/groups/groups.routes.js.map +0 -1
- package/dist/modules/groups/groups.service.d.ts +0 -60
- package/dist/modules/groups/groups.service.d.ts.map +0 -1
- package/dist/modules/groups/groups.service.js +0 -172
- package/dist/modules/groups/groups.service.js.map +0 -1
- package/dist/modules/groups/index.d.ts +0 -7
- package/dist/modules/groups/index.d.ts.map +0 -1
- package/dist/modules/groups/index.js +0 -6
- package/dist/modules/groups/index.js.map +0 -1
- package/dist/modules/groups/join-proposals.d.ts +0 -53
- package/dist/modules/groups/join-proposals.d.ts.map +0 -1
- package/dist/modules/groups/join-proposals.js +0 -67
- package/dist/modules/groups/join-proposals.js.map +0 -1
- package/dist/modules/groups/join-requests.service.d.ts +0 -81
- package/dist/modules/groups/join-requests.service.d.ts.map +0 -1
- package/dist/modules/groups/join-requests.service.js +0 -135
- package/dist/modules/groups/join-requests.service.js.map +0 -1
- package/dist/modules/mcp/mcp-session-store.d.ts +0 -74
- package/dist/modules/mcp/mcp-session-store.d.ts.map +0 -1
- package/dist/modules/mcp/mcp-session-store.js +0 -131
- package/dist/modules/mcp/mcp-session-store.js.map +0 -1
- package/dist/modules/workflow/file-change-notifier.d.ts +0 -38
- package/dist/modules/workflow/file-change-notifier.d.ts.map +0 -1
- package/dist/modules/workflow/file-change-notifier.js +0 -22
- package/dist/modules/workflow/file-change-notifier.js.map +0 -1
- package/dist/modules/workflow/git/branch-name.d.ts +0 -10
- package/dist/modules/workflow/git/branch-name.d.ts.map +0 -1
- package/dist/modules/workflow/git/branch-name.js +0 -76
- package/dist/modules/workflow/git/branch-name.js.map +0 -1
- package/dist/modules/workflow/git/clone-config.d.ts +0 -61
- package/dist/modules/workflow/git/clone-config.d.ts.map +0 -1
- package/dist/modules/workflow/git/clone-config.js +0 -69
- package/dist/modules/workflow/git/clone-config.js.map +0 -1
- package/dist/modules/workflow/git/mutex.d.ts +0 -11
- package/dist/modules/workflow/git/mutex.d.ts.map +0 -1
- package/dist/modules/workflow/git/mutex.js +0 -23
- package/dist/modules/workflow/git/mutex.js.map +0 -1
- package/dist/modules/workflow/locking-filesystem.d.ts +0 -137
- package/dist/modules/workflow/locking-filesystem.d.ts.map +0 -1
- package/dist/modules/workflow/locking-filesystem.js +0 -553
- package/dist/modules/workflow/locking-filesystem.js.map +0 -1
- package/dist/modules/workflow/read-only-filesystem.d.ts +0 -24
- package/dist/modules/workflow/read-only-filesystem.d.ts.map +0 -1
- package/dist/modules/workflow/read-only-filesystem.js +0 -39
- package/dist/modules/workflow/read-only-filesystem.js.map +0 -1
- package/dist/modules/workflow/workflow.errors.d.ts +0 -197
- package/dist/modules/workflow/workflow.errors.d.ts.map +0 -1
- package/dist/modules/workflow/workflow.errors.js +0 -298
- package/dist/modules/workflow/workflow.errors.js.map +0 -1
- package/dist/modules/workspace/bevel-ignore.d.ts.map +0 -1
- package/dist/modules/workspace/bevel-ignore.js.map +0 -1
- package/dist/modules/workspace/kb-seed.interface.d.ts +0 -36
- package/dist/modules/workspace/kb-seed.interface.d.ts.map +0 -1
- package/dist/modules/workspace/kb-seed.interface.js +0 -2
- package/dist/modules/workspace/kb-seed.interface.js.map +0 -1
- package/dist/modules/workspace/kb-seed.service.d.ts +0 -125
- package/dist/modules/workspace/kb-seed.service.d.ts.map +0 -1
- package/dist/modules/workspace/kb-seed.service.js +0 -535
- package/dist/modules/workspace/kb-seed.service.js.map +0 -1
- package/dist/modules/workspace/plugins-migration.d.ts +0 -50
- package/dist/modules/workspace/plugins-migration.d.ts.map +0 -1
- package/dist/modules/workspace/plugins-migration.js +0 -379
- package/dist/modules/workspace/plugins-migration.js.map +0 -1
- package/dist/shared/fs-errors.d.ts +0 -8
- package/dist/shared/fs-errors.d.ts.map +0 -1
- package/dist/shared/fs-errors.js +0 -11
- package/dist/shared/fs-errors.js.map +0 -1
- package/dist/shared/fs-walk.d.ts +0 -23
- package/dist/shared/fs-walk.d.ts.map +0 -1
- package/dist/shared/fs-walk.js +0 -42
- package/dist/shared/fs-walk.js.map +0 -1
- package/dist/shared/hash-email.d.ts +0 -11
- package/dist/shared/hash-email.d.ts.map +0 -1
- package/dist/shared/hash-email.js +0 -14
- package/dist/shared/hash-email.js.map +0 -1
- package/dist/shared/kb-walk.d.ts +0 -52
- package/dist/shared/kb-walk.d.ts.map +0 -1
- package/dist/shared/kb-walk.js +0 -76
- package/dist/shared/kb-walk.js.map +0 -1
- package/src/modules/diff/diff-paths.ts +0 -9
- package/src/modules/mcp/__tests__/mcp-session-store.test.ts +0 -151
- package/src/modules/mcp/__tests__/mcp.routes.session.test.ts +0 -226
- package/src/modules/mcp/mcp-session-store.ts +0 -162
- package/src/shared/__tests__/fs-walk.test.ts +0 -63
- package/src/shared/__tests__/kb-walk.test.ts +0 -107
- package/src/shared/fs-errors.ts +0 -10
- package/src/shared/fs-walk.ts +0 -45
- package/src/shared/hash-email.ts +0 -14
- package/src/shared/kb-walk.ts +0 -95
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
import fs from 'node:fs/promises';
|
|
2
2
|
import path from 'node:path';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { logger } from '../../../shared/logging.js';
|
|
4
|
+
import { isFolderPlaceholder } from '@bevel-software/platform-shared';
|
|
5
5
|
import { AccessDeniedError } from '../../access-model/access-errors.js';
|
|
6
6
|
import { WorkspaceMutex } from '../../kb-fs/mutex.js';
|
|
7
|
+
import { isAbsence } from '../../../shared/fs.contract.js';
|
|
7
8
|
import { assertInsideRepo } from '../../kb-fs/repo-path.js';
|
|
8
9
|
import { cloneTrackingConfigArgs, SAFE_IMPLICIT_FETCH_ARGS } from '../../kb-fs/clone-config.js';
|
|
9
10
|
import { assertValidBranchName, assertValidRelativePath, isBranchAuthoredBy, isOwnSuggestionsBranch, isProtectedBranch, PROTECTED_BRANCHES, } from '../../kb-fs/branch-name.js';
|
|
10
|
-
import { BranchAuthorshipError, WorkflowValidationError, ProtectedBranchError, PullRebaseConflictError, RemoteBranchGoneError, isMissingRemoteBranchFailure, } from '../../../shared/domain-errors.js';
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
11
|
+
import { BranchAuthorshipError, WorkflowDomainError, WorkflowValidationError, ProtectedBranchError, PullRebaseConflictError, RemoteBranchGoneError, isMissingRemoteBranchFailure, } from '../../../shared/domain-errors.js';
|
|
12
|
+
import { GitRunError, isGitTimeout, redactGitToken, } from '../../../shared/git.contract.js';
|
|
13
|
+
import { NodeGitRunner } from './node-git-runner.js';
|
|
14
|
+
import { printable } from '../../../shared/printable.js';
|
|
15
|
+
import { sanitizeError } from '../sanitize-error.js';
|
|
16
|
+
const log = logger('git');
|
|
17
|
+
const crLog = logger('cr');
|
|
16
18
|
/**
|
|
17
19
|
* Fallback committer identity. Every workflow commit overrides the author via
|
|
18
20
|
* `--author=…` so the real human shows up in `git log`; this is just the
|
|
@@ -196,16 +198,15 @@ async function synthesizeUntrackedSideDiff(cwd, relativePath, direction) {
|
|
|
196
198
|
: synthesizeDeletedFileDiff(relativePath, text);
|
|
197
199
|
}
|
|
198
200
|
catch (err) {
|
|
199
|
-
if (err
|
|
201
|
+
if (isAbsence(err))
|
|
200
202
|
return '';
|
|
201
203
|
throw err;
|
|
202
204
|
}
|
|
203
205
|
}
|
|
204
206
|
/**
|
|
205
|
-
* `stat` for the stray check: false only when nothing can be there
|
|
206
|
-
*
|
|
207
|
-
*
|
|
208
|
-
* committed.
|
|
207
|
+
* `stat` for the stray check: false only when nothing can be there — the
|
|
208
|
+
* disk's own definition of absence. Permission and I/O failures propagate:
|
|
209
|
+
* treating them as "absent" would let an unreadable stray pass as committed.
|
|
209
210
|
*/
|
|
210
211
|
async function existsForCommitCheck(absolutePath) {
|
|
211
212
|
try {
|
|
@@ -213,8 +214,7 @@ async function existsForCommitCheck(absolutePath) {
|
|
|
213
214
|
return true;
|
|
214
215
|
}
|
|
215
216
|
catch (err) {
|
|
216
|
-
|
|
217
|
-
if (code === 'ENOENT' || code === 'ENOTDIR')
|
|
217
|
+
if (isAbsence(err))
|
|
218
218
|
return false;
|
|
219
219
|
throw err;
|
|
220
220
|
}
|
|
@@ -225,6 +225,7 @@ export class GitService {
|
|
|
225
225
|
kbDirName;
|
|
226
226
|
mutex;
|
|
227
227
|
accessControl;
|
|
228
|
+
gitRunner;
|
|
228
229
|
// Per-workspace fetch state, kept OUTSIDE the workspace mutex on purpose.
|
|
229
230
|
// `git fetch` only writes `refs/remotes/origin/*` and packs new objects —
|
|
230
231
|
// it doesn't touch HEAD, the index, or the working tree, so it's safe to
|
|
@@ -249,12 +250,21 @@ export class GitService {
|
|
|
249
250
|
* replaced). No hooks registered = no commit-time validation, which is
|
|
250
251
|
* safe because validation is advisory and never blocks a commit.
|
|
251
252
|
*/
|
|
252
|
-
hooks, kbDirName, mutex = new WorkspaceMutex(), accessControl = null
|
|
253
|
+
hooks, kbDirName, mutex = new WorkspaceMutex(), accessControl = null,
|
|
254
|
+
/**
|
|
255
|
+
* How git is actually run — see `shared/git.contract.ts`. The composition
|
|
256
|
+
* root passes the one runner, carrying the deployment's configured
|
|
257
|
+
* deadline; the default here is the same runner on its default deadline,
|
|
258
|
+
* so a directly constructed service (every suite in this module) still has
|
|
259
|
+
* one rather than none.
|
|
260
|
+
*/
|
|
261
|
+
gitRunner = new NodeGitRunner()) {
|
|
253
262
|
this.workspaceService = workspaceService;
|
|
254
263
|
this.hooks = hooks;
|
|
255
264
|
this.kbDirName = kbDirName;
|
|
256
265
|
this.mutex = mutex;
|
|
257
266
|
this.accessControl = accessControl;
|
|
267
|
+
this.gitRunner = gitRunner;
|
|
258
268
|
}
|
|
259
269
|
/**
|
|
260
270
|
* "Does the pending-commits queue hold rows for this workspace?" — used by
|
|
@@ -268,6 +278,17 @@ export class GitService {
|
|
|
268
278
|
setPendingCommitsProbe(probe) {
|
|
269
279
|
this.pendingCommitsProbe = probe;
|
|
270
280
|
}
|
|
281
|
+
/**
|
|
282
|
+
* Late-bound by the composition root: notified with the branch names every
|
|
283
|
+
* `listBranches` returns. A listing is the one moment the platform sees
|
|
284
|
+
* origin's set of branches, and the workspace layer needs that memory to
|
|
285
|
+
* tell a branch that was deleted from a name that never existed — see
|
|
286
|
+
* `WorkspaceService.noteBranchesListed`.
|
|
287
|
+
*/
|
|
288
|
+
onBranchesListed = null;
|
|
289
|
+
setBranchesListedListener(listener) {
|
|
290
|
+
this.onBranchesListed = listener;
|
|
291
|
+
}
|
|
271
292
|
/**
|
|
272
293
|
* Mark a workspace as freshly fetched. Called by `WorkspaceService` right
|
|
273
294
|
* after a branch's clone is created — `git clone` already downloaded every
|
|
@@ -282,6 +303,21 @@ export class GitService {
|
|
|
282
303
|
// refuses a list that is in fact provably fresh.
|
|
283
304
|
this.lastImplicitFetchOk.set(workspaceId, true);
|
|
284
305
|
}
|
|
306
|
+
/**
|
|
307
|
+
* The most recent attempt any workspace made to reach the remote, and
|
|
308
|
+
* whether it succeeded — for the readiness answer. Null before the first
|
|
309
|
+
* attempt of this process's life. Read off the per-workspace fetch record
|
|
310
|
+
* above rather than kept separately, so it cannot disagree with it.
|
|
311
|
+
*/
|
|
312
|
+
lastRemoteContact() {
|
|
313
|
+
let latest = null;
|
|
314
|
+
for (const [workspaceId, at] of this.lastImplicitFetchAt) {
|
|
315
|
+
if (latest === null || at > latest.at) {
|
|
316
|
+
latest = { at, ok: this.lastImplicitFetchOk.get(workspaceId) ?? false };
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
return latest;
|
|
320
|
+
}
|
|
285
321
|
/**
|
|
286
322
|
* Run the registered ADVISORY commit-validation hooks at a commit site.
|
|
287
323
|
* Preserves the semantics of the injected validator this replaced: a
|
|
@@ -295,12 +331,12 @@ export class GitService {
|
|
|
295
331
|
try {
|
|
296
332
|
const report = await hook(ctx);
|
|
297
333
|
if (report && report.mustFix.length > 0) {
|
|
298
|
-
|
|
334
|
+
log.warn(formatWarning(report));
|
|
299
335
|
}
|
|
300
336
|
}
|
|
301
337
|
catch (validatorErr) {
|
|
302
338
|
// Validator failure is non-fatal — advisory only.
|
|
303
|
-
|
|
339
|
+
log.warn('validator crashed (advisory only, ignoring):', { err: validatorErr });
|
|
304
340
|
}
|
|
305
341
|
}
|
|
306
342
|
}
|
|
@@ -453,6 +489,18 @@ export class GitService {
|
|
|
453
489
|
};
|
|
454
490
|
}
|
|
455
491
|
}));
|
|
492
|
+
// Every name this listing showed — origin's refs and the local heads
|
|
493
|
+
// alike, since a branch checked out here is one the platform has
|
|
494
|
+
// plainly heard of. A listener that misbehaves must not turn a good
|
|
495
|
+
// listing into a failed one.
|
|
496
|
+
try {
|
|
497
|
+
this.onBranchesListed?.(infos.map((info) => info.name));
|
|
498
|
+
}
|
|
499
|
+
catch (err) {
|
|
500
|
+
log.error(`branches-listed listener failed for workspace ${workspaceId}:`, {
|
|
501
|
+
detail: err instanceof Error ? err.message : String(err),
|
|
502
|
+
});
|
|
503
|
+
}
|
|
456
504
|
return infos;
|
|
457
505
|
});
|
|
458
506
|
}
|
|
@@ -502,7 +550,7 @@ export class GitService {
|
|
|
502
550
|
}
|
|
503
551
|
catch (err) {
|
|
504
552
|
const msg = err instanceof Error ? err.message : String(err);
|
|
505
|
-
|
|
553
|
+
log.warn(`implicit fetch failed for workspace ${workspaceId}: ${msg}`);
|
|
506
554
|
// Stamp the TTL on failure too so a hard-down origin doesn't make
|
|
507
555
|
// every subsequent listBranches retry the (still-failing) fetch and
|
|
508
556
|
// pile up 10s timeouts. Stale local refs are better than spinning.
|
|
@@ -823,14 +871,14 @@ export class GitService {
|
|
|
823
871
|
}
|
|
824
872
|
if (trackedAtHead) {
|
|
825
873
|
await this.git(cwd, ['checkout', 'HEAD', '--', repoRelativePath]).catch((err) => {
|
|
826
|
-
|
|
874
|
+
log.warn(`discardPath checkout failed for "${repoRelativePath}":`, { err });
|
|
827
875
|
});
|
|
828
876
|
}
|
|
829
877
|
else {
|
|
830
878
|
// Untracked new file — remove from working tree.
|
|
831
879
|
const fileAbs = path.join(cwd, repoRelativePath);
|
|
832
880
|
await fs.rm(fileAbs, { force: true }).catch((err) => {
|
|
833
|
-
|
|
881
|
+
log.warn(`discardPath rm failed for "${repoRelativePath}":`, { err });
|
|
834
882
|
});
|
|
835
883
|
}
|
|
836
884
|
});
|
|
@@ -839,8 +887,11 @@ export class GitService {
|
|
|
839
887
|
assertValidRelativePath(relativePath);
|
|
840
888
|
assertValidAuthor(user);
|
|
841
889
|
const repoRelativePath = this.stripRepoPrefix(relativePath);
|
|
842
|
-
return this.mutex.run(workspaceId, async () =>
|
|
843
|
-
|
|
890
|
+
return this.mutex.run(workspaceId, async () => this.commitFileUnlocked(workspaceId, await this.repoDir(workspaceId), user, relativePath, repoRelativePath, summary, skipValidator));
|
|
891
|
+
}
|
|
892
|
+
/** `commitFile`'s body, for a caller that already holds the workspace's reservation. */
|
|
893
|
+
async commitFileUnlocked(workspaceId, cwd, user, relativePath, repoRelativePath, summary, skipValidator) {
|
|
894
|
+
{
|
|
844
895
|
const branch = await this.currentBranch(cwd);
|
|
845
896
|
// Path-scoped status — is this specific file dirty? `--porcelain` on
|
|
846
897
|
// a single path returns empty when there's nothing to commit.
|
|
@@ -900,7 +951,7 @@ export class GitService {
|
|
|
900
951
|
subject: subj ?? subject,
|
|
901
952
|
committedAt: committedAt?.trim() ?? new Date().toISOString(),
|
|
902
953
|
};
|
|
903
|
-
}
|
|
954
|
+
}
|
|
904
955
|
}
|
|
905
956
|
/**
|
|
906
957
|
* Atomic multi-file commit — commits the caller's batch as ONE commit
|
|
@@ -1049,8 +1100,11 @@ export class GitService {
|
|
|
1049
1100
|
});
|
|
1050
1101
|
}
|
|
1051
1102
|
async push(workspaceId, user, opts) {
|
|
1052
|
-
return this.mutex.run(workspaceId, async () =>
|
|
1053
|
-
|
|
1103
|
+
return this.mutex.run(workspaceId, async () => this.pushUnlocked(workspaceId, await this.repoDir(workspaceId), user, opts));
|
|
1104
|
+
}
|
|
1105
|
+
/** `push`'s body, for a caller that already holds the workspace's reservation. */
|
|
1106
|
+
async pushUnlocked(workspaceId, cwd, user, opts) {
|
|
1107
|
+
{
|
|
1054
1108
|
const branch = await this.currentBranch(cwd);
|
|
1055
1109
|
// Access gate fires only when pushing to a protected branch. Pushing
|
|
1056
1110
|
// a feature/draft branch to its same-named remote can't change
|
|
@@ -1072,7 +1126,7 @@ export class GitService {
|
|
|
1072
1126
|
await this.assertCanWriteAtRef(workspaceId, `origin/${branch}`, user.email, touched);
|
|
1073
1127
|
}
|
|
1074
1128
|
await this.git(cwd, ['push', '-u', 'origin', branch]);
|
|
1075
|
-
}
|
|
1129
|
+
}
|
|
1076
1130
|
}
|
|
1077
1131
|
// `forcePush` method removed. The workflow layer no longer auto-force-pushes
|
|
1078
1132
|
// as a recovery — when the cooperative `pull --rebase` + retry can't
|
|
@@ -1188,7 +1242,7 @@ export class GitService {
|
|
|
1188
1242
|
*
|
|
1189
1243
|
* Returns the merge commit SHA, or the conflicting paths.
|
|
1190
1244
|
*/
|
|
1191
|
-
async mergeChangeRequest(baseWorkspaceId, sourceBranch, targetBranch, commit, user) {
|
|
1245
|
+
async mergeChangeRequest(baseWorkspaceId, sourceBranch, targetBranch, commit, user, opts = {}) {
|
|
1192
1246
|
assertValidBranchName(sourceBranch);
|
|
1193
1247
|
assertValidBranchName(targetBranch);
|
|
1194
1248
|
assertValidAuthor(user);
|
|
@@ -1201,6 +1255,13 @@ export class GitService {
|
|
|
1201
1255
|
// unknown" on a clone that lacks it).
|
|
1202
1256
|
await this.git(cwd, ['config', 'user.name', BOT_NAME]);
|
|
1203
1257
|
await this.git(cwd, ['config', 'user.email', BOT_EMAIL]);
|
|
1258
|
+
if (opts.requireCleanTarget) {
|
|
1259
|
+
const { stdout: dirty } = await this.git(cwd, ['status', '--porcelain=v1', '-z']);
|
|
1260
|
+
const unpushed = await this.hasUnpushedCommitsAt(cwd);
|
|
1261
|
+
if (parsePorcelainZ(dirty).length > 0 || unpushed) {
|
|
1262
|
+
throw new WorkflowDomainError(`"${targetBranch}" has edits that are not shared yet. Try the merge again once they are saved.`, 409, { kind: 'merge-target-busy', targetBranch });
|
|
1263
|
+
}
|
|
1264
|
+
}
|
|
1204
1265
|
for (let attempt = 1; attempt <= MAX_ATTEMPTS; attempt += 1) {
|
|
1205
1266
|
// Explicit destination refspecs, because the two `origin/<branch>`
|
|
1206
1267
|
// reads below MUST see the tips this fetch just retrieved. A bare
|
|
@@ -1227,6 +1288,14 @@ export class GitService {
|
|
|
1227
1288
|
// discards a prior attempt's state, never real work.
|
|
1228
1289
|
await this.git(cwd, ['checkout', targetBranch]);
|
|
1229
1290
|
await this.git(cwd, ['reset', '--hard', `origin/${targetBranch}`]);
|
|
1291
|
+
if (opts.authorize) {
|
|
1292
|
+
// The tip this attempt merges into, and the paths it writes against
|
|
1293
|
+
// that tip. Re-read every attempt: a retry happens BECAUSE the
|
|
1294
|
+
// target moved, which can move its roles and its file set too.
|
|
1295
|
+
const { stdout: targetSha } = await this.git(cwd, ['rev-parse', `origin/${targetBranch}`]);
|
|
1296
|
+
const changedPaths = await this.prChangedPathsAt(cwd, `origin/${targetBranch}`, `origin/${sourceBranch}`, { forAccessCheck: true });
|
|
1297
|
+
await opts.authorize({ sha: targetSha.trim(), changedPaths });
|
|
1298
|
+
}
|
|
1230
1299
|
// `--no-commit --no-ff` so we author the merge commit as the human and
|
|
1231
1300
|
// never fast-forward past the merge record.
|
|
1232
1301
|
try {
|
|
@@ -1239,7 +1308,7 @@ export class GitService {
|
|
|
1239
1308
|
return { kind: 'conflicts', paths };
|
|
1240
1309
|
// Not a conflict — surface the underlying git error so the real cause
|
|
1241
1310
|
// (e.g. missing identity, unrelated histories) is diagnosable.
|
|
1242
|
-
throw new Error(`git merge failed without detectable conflicts: ${
|
|
1311
|
+
throw new Error(`git merge failed without detectable conflicts: ${redactGitToken(err instanceof Error ? err.message : String(err))}`);
|
|
1243
1312
|
}
|
|
1244
1313
|
// Nothing staged ⇒ base already contains source (empty CR). The base tip
|
|
1245
1314
|
// is the "merged" state; report it without an empty commit.
|
|
@@ -1409,7 +1478,10 @@ export class GitService {
|
|
|
1409
1478
|
const { stdout } = await this.git(cwd, ['rev-parse', '--verify', '--quiet', rev]);
|
|
1410
1479
|
return stdout.trim() || null;
|
|
1411
1480
|
}
|
|
1412
|
-
catch {
|
|
1481
|
+
catch (err) {
|
|
1482
|
+
// Null is "no such rev"; a deadline is not that answer (see GitRunError).
|
|
1483
|
+
if (isGitTimeout(err))
|
|
1484
|
+
throw err;
|
|
1413
1485
|
return null;
|
|
1414
1486
|
}
|
|
1415
1487
|
}
|
|
@@ -1626,18 +1698,97 @@ export class GitService {
|
|
|
1626
1698
|
* only ever see settled states.
|
|
1627
1699
|
*/
|
|
1628
1700
|
async hasUnpushedCommits(workspaceId) {
|
|
1629
|
-
return this.mutex.run(workspaceId, async () =>
|
|
1630
|
-
|
|
1631
|
-
|
|
1701
|
+
return this.mutex.run(workspaceId, async () => this.hasUnpushedCommitsAt(await this.repoDir(workspaceId)));
|
|
1702
|
+
}
|
|
1703
|
+
/**
|
|
1704
|
+
* `hasUnpushedCommits` without the workspace reservation — for a caller that
|
|
1705
|
+
* already holds one (`mergeChangeRequest`, which has to ask inside the same
|
|
1706
|
+
* reservation as the reset that would discard the answer). Fails closed: a
|
|
1707
|
+
* question that cannot be answered counts as "yes, unpushed".
|
|
1708
|
+
*/
|
|
1709
|
+
async hasUnpushedCommitsAt(cwd) {
|
|
1710
|
+
const branch = await this.currentBranch(cwd);
|
|
1711
|
+
try {
|
|
1712
|
+
const { stdout } = await this.git(cwd, [
|
|
1713
|
+
'rev-list', '--count', `refs/remotes/origin/${branch}..HEAD`,
|
|
1714
|
+
]);
|
|
1715
|
+
return Number(stdout.trim()) > 0;
|
|
1716
|
+
}
|
|
1717
|
+
catch {
|
|
1718
|
+
return true;
|
|
1719
|
+
}
|
|
1720
|
+
}
|
|
1721
|
+
/**
|
|
1722
|
+
* Revert paths in several workspaces and publish the result as ONE git
|
|
1723
|
+
* operation. Every workspace involved is reserved together (`runAll`), and
|
|
1724
|
+
* reading each HEAD, restoring and committing every path, pushing each
|
|
1725
|
+
* branch and — when a step fails — undoing, all happen inside that single
|
|
1726
|
+
* reservation: no other git operation on those workspaces can land between
|
|
1727
|
+
* the HEAD an undo returns to and the commits it undoes.
|
|
1728
|
+
*
|
|
1729
|
+
* - Each workspace's HEAD is read first; one that can't be read throws
|
|
1730
|
+
* before anything changes.
|
|
1731
|
+
* - Every path in every workspace is restored from its `ref` and committed
|
|
1732
|
+
* (`subject`) before anything is pushed. A failed restore or commit
|
|
1733
|
+
* undoes all of them and rethrows: nothing is pushed.
|
|
1734
|
+
* - Branches are then pushed in order. A failed push undoes that workspace
|
|
1735
|
+
* and every later one and is reported in `failed`; the earlier pushes
|
|
1736
|
+
* stand, since a remote can't be un-pushed.
|
|
1737
|
+
*
|
|
1738
|
+
* An undo never rewrites history: each touched path is restored from the
|
|
1739
|
+
* HEAD recorded at the start and committed (`undoSubject`), so unpushed work
|
|
1740
|
+
* the checkout already had stays exactly as it was. Each path is undone on
|
|
1741
|
+
* its own, so one that fails doesn't leave the rest reverted.
|
|
1742
|
+
*/
|
|
1743
|
+
async revertPathsAndPush(user, plans) {
|
|
1744
|
+
assertValidAuthor(user);
|
|
1745
|
+
for (const plan of plans)
|
|
1746
|
+
for (const entry of plan.paths)
|
|
1747
|
+
assertValidRelativePath(entry.path);
|
|
1748
|
+
return this.mutex.runAll(plans.map((plan) => plan.workspaceId), async () => {
|
|
1749
|
+
const steps = [];
|
|
1750
|
+
for (const plan of plans) {
|
|
1751
|
+
const cwd = await this.repoDir(plan.workspaceId);
|
|
1752
|
+
const { stdout } = await this.git(cwd, ['rev-parse', '--verify', 'HEAD^{commit}']);
|
|
1753
|
+
steps.push({ workspaceId: plan.workspaceId, cwd, head: stdout.trim(), paths: plan.paths });
|
|
1754
|
+
}
|
|
1755
|
+
const undo = async (unpushed) => {
|
|
1756
|
+
for (const step of unpushed) {
|
|
1757
|
+
for (const entry of step.paths) {
|
|
1758
|
+
try {
|
|
1759
|
+
await this.restorePathUnlocked(step.cwd, step.head, entry.path);
|
|
1760
|
+
await this.commitFileUnlocked(step.workspaceId, step.cwd, user, entry.path, entry.path, entry.undoSubject, true);
|
|
1761
|
+
}
|
|
1762
|
+
catch (err) {
|
|
1763
|
+
log.warn(`undo of ${printable(entry.path)} failed in workspace ${printable(step.workspaceId)}: ${printable(sanitizeError(err))}`);
|
|
1764
|
+
}
|
|
1765
|
+
}
|
|
1766
|
+
}
|
|
1767
|
+
};
|
|
1632
1768
|
try {
|
|
1633
|
-
const
|
|
1634
|
-
|
|
1635
|
-
|
|
1636
|
-
|
|
1769
|
+
for (const step of steps) {
|
|
1770
|
+
for (const entry of step.paths) {
|
|
1771
|
+
await this.restorePathUnlocked(step.cwd, entry.ref, entry.path);
|
|
1772
|
+
await this.commitFileUnlocked(step.workspaceId, step.cwd, user, entry.path, entry.path, entry.subject, true);
|
|
1773
|
+
}
|
|
1774
|
+
}
|
|
1637
1775
|
}
|
|
1638
|
-
catch {
|
|
1639
|
-
|
|
1776
|
+
catch (err) {
|
|
1777
|
+
await undo(steps);
|
|
1778
|
+
throw err;
|
|
1779
|
+
}
|
|
1780
|
+
const pushed = [];
|
|
1781
|
+
for (const [i, step] of steps.entries()) {
|
|
1782
|
+
try {
|
|
1783
|
+
await this.pushUnlocked(step.workspaceId, step.cwd, user);
|
|
1784
|
+
}
|
|
1785
|
+
catch (error) {
|
|
1786
|
+
await undo(steps.slice(i));
|
|
1787
|
+
return { pushed, failed: { workspaceId: step.workspaceId, error } };
|
|
1788
|
+
}
|
|
1789
|
+
pushed.push(step.workspaceId);
|
|
1640
1790
|
}
|
|
1791
|
+
return { pushed, failed: null };
|
|
1641
1792
|
});
|
|
1642
1793
|
}
|
|
1643
1794
|
/**
|
|
@@ -1987,8 +2138,8 @@ export class GitService {
|
|
|
1987
2138
|
const cwd = await this.repoDir(workspaceId);
|
|
1988
2139
|
await this.fetchPrRefs(cwd, baseBranch, headBranch);
|
|
1989
2140
|
return this.mutex.run(workspaceId, async () => {
|
|
1990
|
-
const baseRef = await this.
|
|
1991
|
-
const headRef = await this.
|
|
2141
|
+
const baseRef = await this.resolvePublishedBranchRef(cwd, baseBranch);
|
|
2142
|
+
const headRef = await this.resolvePublishedBranchRef(cwd, headBranch);
|
|
1992
2143
|
const [{ stdout: baseSha }, { stdout: headSha }] = await Promise.all([
|
|
1993
2144
|
this.git(cwd, ['rev-parse', baseRef]),
|
|
1994
2145
|
this.git(cwd, ['rev-parse', headRef]),
|
|
@@ -2032,8 +2183,8 @@ export class GitService {
|
|
|
2032
2183
|
if (!opts.at)
|
|
2033
2184
|
await this.fetchPrRefs(cwd, baseBranch, headBranch);
|
|
2034
2185
|
return this.mutex.run(workspaceId, async () => {
|
|
2035
|
-
const baseRef = opts.at ? opts.at.baseSha : await this.
|
|
2036
|
-
const headRef = opts.at ? opts.at.headSha : await this.
|
|
2186
|
+
const baseRef = opts.at ? opts.at.baseSha : await this.resolvePublishedBranchRef(cwd, baseBranch);
|
|
2187
|
+
const headRef = opts.at ? opts.at.headSha : await this.resolvePublishedBranchRef(cwd, headBranch);
|
|
2037
2188
|
const range = `${baseRef}...${headRef}`; // three-dot = changes on head since merge-base
|
|
2038
2189
|
const [{ stdout: nameStatusOut }, { stdout: numstatOut }] = await Promise.all([
|
|
2039
2190
|
this.git(cwd, ['diff', '-M', '-z', '--name-status', range]),
|
|
@@ -2048,8 +2199,17 @@ export class GitService {
|
|
|
2048
2199
|
// land. Filter it from the review surface entirely; the neutralisation
|
|
2049
2200
|
// reads the raw refs itself and is unaffected. Both lists are filtered
|
|
2050
2201
|
// IN STEP so the index-zip below stays aligned.
|
|
2051
|
-
|
|
2052
|
-
|
|
2202
|
+
// The empty-folder placeholder is filtered the same way: it is never
|
|
2203
|
+
// content, so it is not a file to review or approve. It still merges
|
|
2204
|
+
// with the rest, and `changedPathsForPr` keeps it, so a request that
|
|
2205
|
+
// only creates a folder is not mistaken for an empty one and closed.
|
|
2206
|
+
// An empty file deleted as its folder gets the (equally empty)
|
|
2207
|
+
// placeholder reads to `-M` as a RENAME onto it; the real side of such
|
|
2208
|
+
// a pair is first made the plain removal (or addition) it is, so
|
|
2209
|
+
// dropping the placeholder never drops the file with it.
|
|
2210
|
+
statuses = statuses.map(withoutPlaceholderRename);
|
|
2211
|
+
if (statuses.some((s) => s.path === 'roles.yaml' || isFolderPlaceholder(s.path))) {
|
|
2212
|
+
const keep = statuses.map((s) => s.path !== 'roles.yaml' && !isFolderPlaceholder(s.path));
|
|
2053
2213
|
statuses = statuses.filter((_, i) => keep[i]);
|
|
2054
2214
|
if (counts.length === keep.length)
|
|
2055
2215
|
counts = counts.filter((_, i) => keep[i]);
|
|
@@ -2061,7 +2221,7 @@ export class GitService {
|
|
|
2061
2221
|
// +/- to a file.
|
|
2062
2222
|
const aligned = counts.length === statuses.length;
|
|
2063
2223
|
if (!aligned) {
|
|
2064
|
-
|
|
2224
|
+
crLog.warn(`diff name-status/numstat length mismatch (${statuses.length} vs ${counts.length}) ` +
|
|
2065
2225
|
`for ${range} — reporting file list without +/- counts`);
|
|
2066
2226
|
}
|
|
2067
2227
|
const files = statuses.map((s, i) => {
|
|
@@ -2095,29 +2255,77 @@ export class GitService {
|
|
|
2095
2255
|
* Just the repo-relative paths changed by a change request (three-dot), no
|
|
2096
2256
|
* patches — the cheap version used to build CR-list summaries and owner
|
|
2097
2257
|
* routing. `changedFilesForPr` is the full version with statuses + diffs.
|
|
2258
|
+
*
|
|
2259
|
+
* `fetch: false` skips the per-request ref fetch, for a caller that has
|
|
2260
|
+
* ALREADY refreshed the clone's remote-tracking refs — which is the whole
|
|
2261
|
+
* clone in one round trip, against one per request here. A CR list is
|
|
2262
|
+
* exactly that caller: at five open requests the per-request fetch was
|
|
2263
|
+
* measured at ~0.55s each, and the list is re-read on every proposal and
|
|
2264
|
+
* every 60s poll. Only pass it when a fetch of the clone really has just
|
|
2265
|
+
* happened; the refs are otherwise as old as the last one, and the diff
|
|
2266
|
+
* would describe a stale head.
|
|
2267
|
+
*
|
|
2268
|
+
* It is a skip, not a promise never to fetch: a branch this clone has
|
|
2269
|
+
* never heard of is fetched anyway. That case is not a stale diff, it is
|
|
2270
|
+
* NO diff — an empty touched-path set, which is a change request missing
|
|
2271
|
+
* from its own author's tree. Two local `rev-parse`s are worth not being
|
|
2272
|
+
* that.
|
|
2098
2273
|
*/
|
|
2099
|
-
async changedPathsForPr(workspaceId, baseBranch, headBranch) {
|
|
2274
|
+
async changedPathsForPr(workspaceId, baseBranch, headBranch, opts = {}) {
|
|
2100
2275
|
assertValidBranchName(baseBranch);
|
|
2101
2276
|
assertValidBranchName(headBranch);
|
|
2102
2277
|
// Fetch outside the mutex (network round-trip) so origin latency can't hold
|
|
2103
2278
|
// the workspace lock; the lock guards only the local diff below.
|
|
2104
2279
|
const cwd = await this.repoDir(workspaceId);
|
|
2105
|
-
|
|
2280
|
+
// The skip decision and the diff are ONE reading of the refs, not two.
|
|
2281
|
+
// Both are resolved here, to COMMITS, and the commits are what the diff
|
|
2282
|
+
// below runs on — the same pinning `changedFilesForPr`'s `at` does. A
|
|
2283
|
+
// concurrent `fetch --prune origin` (`ensureRemotesFetched` and
|
|
2284
|
+
// `fetchPrRefs` both run outside this mutex, deliberately) can drop a
|
|
2285
|
+
// remote-tracking ref between the two, and re-resolving inside the mutex
|
|
2286
|
+
// would then throw `WorkflowValidationError` — which `touchedPathsFor`
|
|
2287
|
+
// swallows into an empty touched-path set, i.e. exactly the change
|
|
2288
|
+
// request missing from its own author's tree that the skip is guarded
|
|
2289
|
+
// against. The commits stay readable whatever happens to the ref names.
|
|
2290
|
+
const pinned = opts.fetch === false ? await this.publishedPrCommits(cwd, baseBranch, headBranch) : null;
|
|
2291
|
+
if (!pinned) {
|
|
2292
|
+
await this.fetchPrRefs(cwd, baseBranch, headBranch);
|
|
2293
|
+
}
|
|
2106
2294
|
return this.mutex.run(workspaceId, async () => {
|
|
2107
|
-
const baseRef = await this.
|
|
2108
|
-
const headRef = await this.
|
|
2109
|
-
|
|
2110
|
-
|
|
2111
|
-
|
|
2112
|
-
|
|
2113
|
-
|
|
2114
|
-
|
|
2115
|
-
|
|
2295
|
+
const baseRef = pinned ? pinned.base : await this.resolvePublishedBranchRef(cwd, baseBranch);
|
|
2296
|
+
const headRef = pinned ? pinned.head : await this.resolvePublishedBranchRef(cwd, headBranch);
|
|
2297
|
+
return this.prChangedPathsAt(cwd, baseRef, headRef, opts);
|
|
2298
|
+
});
|
|
2299
|
+
}
|
|
2300
|
+
/**
|
|
2301
|
+
* The shaping behind `changedPathsForPr`, without its workspace
|
|
2302
|
+
* reservation: the caller must already hold one. `mergeChangeRequest` reads
|
|
2303
|
+
* the same set inside its OWN reservation, where re-entering this one would
|
|
2304
|
+
* deadlock — and where the refs are the ones the merge is actually built on.
|
|
2305
|
+
*/
|
|
2306
|
+
async prChangedPathsAt(cwd, baseRef, headRef, opts = {}) {
|
|
2307
|
+
const { stdout } = await this.git(cwd, [
|
|
2308
|
+
'diff', '-M', '-z', '--name-status', `${baseRef}...${headRef}`,
|
|
2309
|
+
]);
|
|
2310
|
+
// Deduped: both sides of a rename can collide with another entry's path.
|
|
2311
|
+
return [
|
|
2312
|
+
...new Set(parseNameStatusZ(stdout)
|
|
2313
|
+
// A rename onto or off the placeholder is a real file removed or
|
|
2314
|
+
// added (see `withoutPlaceholderRename`): both of its paths are
|
|
2315
|
+
// touched, or filtering the placeholder would lose the file.
|
|
2316
|
+
//
|
|
2317
|
+
// Authorizing the change needs both sides of EVERY rename, not just
|
|
2318
|
+
// the placeholder's: git reports a rename under its new name alone,
|
|
2319
|
+
// and the old name is a path the change deletes.
|
|
2320
|
+
.flatMap((s) => s.previousPath &&
|
|
2321
|
+
(opts.forAccessCheck || isFolderPlaceholder(s.path) || isFolderPlaceholder(s.previousPath))
|
|
2322
|
+
? [s.previousPath, s.path]
|
|
2323
|
+
: [s.path])
|
|
2116
2324
|
// Same rule as `changedFilesForPr`: a roles.yaml change never
|
|
2117
2325
|
// survives a merge, so it is not a touched path for routing or
|
|
2118
2326
|
// summaries either.
|
|
2119
|
-
.filter((p) => p !== 'roles.yaml'))
|
|
2120
|
-
|
|
2327
|
+
.filter((p) => opts.forAccessCheck || p !== 'roles.yaml')),
|
|
2328
|
+
];
|
|
2121
2329
|
}
|
|
2122
2330
|
/**
|
|
2123
2331
|
* The merge-base commit of a change request's two branches (their origin
|
|
@@ -2131,8 +2339,8 @@ export class GitService {
|
|
|
2131
2339
|
const cwd = await this.repoDir(workspaceId);
|
|
2132
2340
|
await this.fetchPrRefs(cwd, baseBranch, headBranch);
|
|
2133
2341
|
return this.mutex.run(workspaceId, async () => {
|
|
2134
|
-
const baseRef = await this.
|
|
2135
|
-
const headRef = await this.
|
|
2342
|
+
const baseRef = await this.resolvePublishedBranchRef(cwd, baseBranch);
|
|
2343
|
+
const headRef = await this.resolvePublishedBranchRef(cwd, headBranch);
|
|
2136
2344
|
try {
|
|
2137
2345
|
const { stdout } = await this.git(cwd, ['merge-base', baseRef, headRef]);
|
|
2138
2346
|
return stdout.trim() || null;
|
|
@@ -2146,6 +2354,128 @@ export class GitService {
|
|
|
2146
2354
|
}
|
|
2147
2355
|
});
|
|
2148
2356
|
}
|
|
2357
|
+
/**
|
|
2358
|
+
* Where a change request forked from its target, and whether the target has
|
|
2359
|
+
* moved on since — for the two commits a detail read has ALREADY resolved
|
|
2360
|
+
* (no fetch, no ref resolution, same contract as `changedFilesForPr`'s `at`).
|
|
2361
|
+
*
|
|
2362
|
+
* `mergeBaseSha` is the "before" every file in the request is read against,
|
|
2363
|
+
* so an edit made on the target after the proposal never shows as something
|
|
2364
|
+
* the proposal deletes. `behind` is true when the target holds commits the
|
|
2365
|
+
* proposal does not (`head..base` is non-empty) — the proposal needs
|
|
2366
|
+
* updating before its diff and its eventual merge describe the same text.
|
|
2367
|
+
* No shared history: `mergeBaseSha: null`, and `behind` stays honest (the
|
|
2368
|
+
* target certainly has commits the proposal lacks).
|
|
2369
|
+
*/
|
|
2370
|
+
async forkPointForPr(workspaceId, at) {
|
|
2371
|
+
for (const sha of [at.baseSha, at.headSha]) {
|
|
2372
|
+
if (!/^[0-9a-f]{40,64}$/.test(sha)) {
|
|
2373
|
+
throw new WorkflowValidationError(`invalid commit sha: ${sha}`);
|
|
2374
|
+
}
|
|
2375
|
+
}
|
|
2376
|
+
const cwd = await this.repoDir(workspaceId);
|
|
2377
|
+
return this.mutex.run(workspaceId, async () => {
|
|
2378
|
+
let mergeBaseSha = null;
|
|
2379
|
+
try {
|
|
2380
|
+
const { stdout } = await this.git(cwd, ['merge-base', at.baseSha, at.headSha]);
|
|
2381
|
+
mergeBaseSha = stdout.trim() || null;
|
|
2382
|
+
}
|
|
2383
|
+
catch (err) {
|
|
2384
|
+
// Exit 1 is git's "no common ancestor"; anything else is infra.
|
|
2385
|
+
if (err.exitCode !== 1)
|
|
2386
|
+
throw err;
|
|
2387
|
+
}
|
|
2388
|
+
const { stdout: count } = await this.git(cwd, [
|
|
2389
|
+
'rev-list', '--count', `${at.headSha}..${at.baseSha}`,
|
|
2390
|
+
]);
|
|
2391
|
+
return { mergeBaseSha, behind: Number.parseInt(count.trim(), 10) > 0 };
|
|
2392
|
+
});
|
|
2393
|
+
}
|
|
2394
|
+
/**
|
|
2395
|
+
* Every repo-relative path whose content differs between two commits on a
|
|
2396
|
+
* change request's own branch — what an update from the target actually
|
|
2397
|
+
* CHANGED about the proposal.
|
|
2398
|
+
*
|
|
2399
|
+
* Two-dot, because that is the question: not "what does this request
|
|
2400
|
+
* propose" (three-dot, against the target) but "what did the merge move
|
|
2401
|
+
* under the reviewers who already approved". `--no-renames` is what makes
|
|
2402
|
+
* the answer the conservative one: git detects renames BY DEFAULT
|
|
2403
|
+
* (`diff.renames` has been on since 2.9) and then reports only the new
|
|
2404
|
+
* path, which would leave an approval on the path a merge renamed AWAY
|
|
2405
|
+
* reading as untouched. Switched off, a rename reports as the old path
|
|
2406
|
+
* removed and the new one added, so an approval on either side is correctly
|
|
2407
|
+
* read as touched — a path that appears here loses its approval, and only a
|
|
2408
|
+
* path that does not appear keeps it.
|
|
2409
|
+
*/
|
|
2410
|
+
async pathsChangedBetween(workspaceId, fromSha, toSha) {
|
|
2411
|
+
for (const sha of [fromSha, toSha]) {
|
|
2412
|
+
if (!/^[0-9a-f]{40,64}$/.test(sha)) {
|
|
2413
|
+
throw new WorkflowValidationError(`invalid commit sha: ${sha}`);
|
|
2414
|
+
}
|
|
2415
|
+
}
|
|
2416
|
+
const cwd = await this.repoDir(workspaceId);
|
|
2417
|
+
return this.mutex.run(workspaceId, async () => {
|
|
2418
|
+
const { stdout } = await this.git(cwd, [
|
|
2419
|
+
'diff', '--no-renames', '-z', '--name-only', fromSha, toSha,
|
|
2420
|
+
]);
|
|
2421
|
+
// `-z` terminates each name with NUL, so the trailing field is empty —
|
|
2422
|
+
// and a tracked name may legally carry leading or trailing spaces, so
|
|
2423
|
+
// nothing is trimmed here.
|
|
2424
|
+
return [...new Set(stdout.split('\0').filter((name) => name !== ''))];
|
|
2425
|
+
});
|
|
2426
|
+
}
|
|
2427
|
+
/**
|
|
2428
|
+
* One file as it stood at a change request's fork point — the "before" side
|
|
2429
|
+
* of the request dialog's diff. `sha` must be a commit on the target
|
|
2430
|
+
* branch's published history (`origin/<baseBranch>`); anything else is
|
|
2431
|
+
* refused, so this can never become a read of an arbitrary commit. `null`
|
|
2432
|
+
* means the path did not exist at the fork point (the request adds it).
|
|
2433
|
+
*/
|
|
2434
|
+
async readFileAtForkPoint(workspaceId, baseBranch, sha, relativePath) {
|
|
2435
|
+
assertValidBranchName(baseBranch);
|
|
2436
|
+
assertValidRelativePath(relativePath);
|
|
2437
|
+
if (!/^[0-9a-f]{40,64}$/.test(sha)) {
|
|
2438
|
+
throw new WorkflowValidationError(`invalid commit sha: ${sha}`);
|
|
2439
|
+
}
|
|
2440
|
+
const repoRelativePath = this.stripRepoPrefix(relativePath);
|
|
2441
|
+
return this.mutex.run(workspaceId, async () => {
|
|
2442
|
+
const cwd = await this.repoDir(workspaceId);
|
|
2443
|
+
const baseRef = await this.resolvePublishedBranchRef(cwd, baseBranch);
|
|
2444
|
+
try {
|
|
2445
|
+
await this.git(cwd, ['merge-base', '--is-ancestor', sha, baseRef]);
|
|
2446
|
+
}
|
|
2447
|
+
catch (err) {
|
|
2448
|
+
if (err.exitCode === 1) {
|
|
2449
|
+
throw new WorkflowDomainError(`That commit is not part of "${baseBranch}" — it is not this request's fork point.`, 404);
|
|
2450
|
+
}
|
|
2451
|
+
throw err;
|
|
2452
|
+
}
|
|
2453
|
+
await this.assertNotTreeAtRef(cwd, sha, repoRelativePath, relativePath);
|
|
2454
|
+
return this.readFileAtRef(workspaceId, sha, repoRelativePath);
|
|
2455
|
+
});
|
|
2456
|
+
}
|
|
2457
|
+
/**
|
|
2458
|
+
* Whether `repoRelativePath` exists (as a file or tree) at `ref`. ONLY
|
|
2459
|
+
* git's own "that path is not at this ref" answer is false; an unresolvable
|
|
2460
|
+
* ref, a timeout, a locked or corrupt repository PROPAGATE — a revert that
|
|
2461
|
+
* read one of those as "absent" would decide wrongly what to restore.
|
|
2462
|
+
*/
|
|
2463
|
+
async pathExistsAtRef(workspaceId, ref, repoRelativePath) {
|
|
2464
|
+
assertValidRelativePath(repoRelativePath);
|
|
2465
|
+
return this.mutex.run(workspaceId, async () => {
|
|
2466
|
+
const cwd = await this.repoDir(workspaceId);
|
|
2467
|
+
try {
|
|
2468
|
+
await this.git(cwd, ['cat-file', '-e', `${ref}:${repoRelativePath}`]);
|
|
2469
|
+
return true;
|
|
2470
|
+
}
|
|
2471
|
+
catch (err) {
|
|
2472
|
+
const stderr = err.stderr ?? (err instanceof Error ? err.message : String(err));
|
|
2473
|
+
if (/does not exist in|exists on disk, but not in/.test(stderr))
|
|
2474
|
+
return false;
|
|
2475
|
+
throw err;
|
|
2476
|
+
}
|
|
2477
|
+
});
|
|
2478
|
+
}
|
|
2149
2479
|
/**
|
|
2150
2480
|
* Restore one path in the working tree (and index) to its content at `ref`;
|
|
2151
2481
|
* a path ABSENT at `ref` is deleted — the revert of an added file is its
|
|
@@ -2155,8 +2485,11 @@ export class GitService {
|
|
|
2155
2485
|
*/
|
|
2156
2486
|
async restorePathFromRef(workspaceId, ref, repoRelativePath) {
|
|
2157
2487
|
assertValidRelativePath(repoRelativePath);
|
|
2158
|
-
return this.mutex.run(workspaceId, async () =>
|
|
2159
|
-
|
|
2488
|
+
return this.mutex.run(workspaceId, async () => this.restorePathUnlocked(await this.repoDir(workspaceId), ref, repoRelativePath));
|
|
2489
|
+
}
|
|
2490
|
+
/** `restorePathFromRef`'s body, for a caller that already holds the workspace's reservation. */
|
|
2491
|
+
async restorePathUnlocked(cwd, ref, repoRelativePath) {
|
|
2492
|
+
{
|
|
2160
2493
|
let existsAtRef = true;
|
|
2161
2494
|
try {
|
|
2162
2495
|
await this.git(cwd, ['cat-file', '-e', `${ref}:${repoRelativePath}`]);
|
|
@@ -2180,7 +2513,7 @@ export class GitService {
|
|
|
2180
2513
|
// missing from disk is exactly what `git add` records as deleted.
|
|
2181
2514
|
await fs.rm(path.join(cwd, repoRelativePath), { force: true });
|
|
2182
2515
|
}
|
|
2183
|
-
}
|
|
2516
|
+
}
|
|
2184
2517
|
}
|
|
2185
2518
|
/** Fetch the two branches a CR spans so origin refs reflect the latest push. */
|
|
2186
2519
|
async fetchPrRefs(cwd, baseBranch, headBranch) {
|
|
@@ -2242,6 +2575,63 @@ export class GitService {
|
|
|
2242
2575
|
? relativePath.slice(this.kbDirName.length + 1)
|
|
2243
2576
|
: relativePath;
|
|
2244
2577
|
}
|
|
2578
|
+
/**
|
|
2579
|
+
* The COMMITS both of a change request's branches point at in this clone
|
|
2580
|
+
* already, or null when either is unknown to it — the question behind
|
|
2581
|
+
* `changedPathsForPr`'s `fetch: false`, answered with the resolution itself
|
|
2582
|
+
* so the caller diffs precisely what it decided on. Only git's own "no such
|
|
2583
|
+
* ref" answers null; every other failure is the caller's to see, and
|
|
2584
|
+
* treating it as "not here" would spend a network fetch on a clone that is
|
|
2585
|
+
* broken for some other reason.
|
|
2586
|
+
*/
|
|
2587
|
+
async publishedPrCommits(cwd, baseBranch, headBranch) {
|
|
2588
|
+
const shas = [];
|
|
2589
|
+
for (const branch of [baseBranch, headBranch]) {
|
|
2590
|
+
try {
|
|
2591
|
+
shas.push((await this.resolvePublishedBranch(cwd, branch)).sha);
|
|
2592
|
+
}
|
|
2593
|
+
catch (err) {
|
|
2594
|
+
if (err instanceof WorkflowValidationError)
|
|
2595
|
+
return null;
|
|
2596
|
+
throw err;
|
|
2597
|
+
}
|
|
2598
|
+
}
|
|
2599
|
+
return { base: shas[0], head: shas[1] };
|
|
2600
|
+
}
|
|
2601
|
+
/**
|
|
2602
|
+
* `resolveBranchRef` with the preference reversed: the PUBLISHED ref
|
|
2603
|
+
* (`origin/<branch>`, just fetched by `fetchPrRefs`) before the local head.
|
|
2604
|
+
* A change request is a pair of published branches, and a clone's local
|
|
2605
|
+
* copy of the OTHER branch is whatever it was when the clone last touched
|
|
2606
|
+
* it — in a proposal's own workspace the local target is typically the
|
|
2607
|
+
* target as of the fork. Reading that made every request look up to date
|
|
2608
|
+
* and diffed it against a stale target. A local-only branch still resolves.
|
|
2609
|
+
*/
|
|
2610
|
+
async resolvePublishedBranchRef(cwd, branch) {
|
|
2611
|
+
return (await this.resolvePublishedBranch(cwd, branch)).ref;
|
|
2612
|
+
}
|
|
2613
|
+
/**
|
|
2614
|
+
* {@link resolvePublishedBranchRef} with the commit it resolved to — the
|
|
2615
|
+
* `rev-parse` that verifies the ref already prints it, so pinning a diff to
|
|
2616
|
+
* the commit costs nothing over naming the ref.
|
|
2617
|
+
*/
|
|
2618
|
+
async resolvePublishedBranch(cwd, branch) {
|
|
2619
|
+
for (const ref of [`refs/remotes/origin/${branch}`, `refs/heads/${branch}`]) {
|
|
2620
|
+
try {
|
|
2621
|
+
const { stdout } = await this.git(cwd, ['rev-parse', '--verify', '--quiet', ref]);
|
|
2622
|
+
return { ref, sha: stdout.trim() };
|
|
2623
|
+
}
|
|
2624
|
+
catch (err) {
|
|
2625
|
+
// Only git's own "no such ref" (exit 1 under --quiet) moves on to the
|
|
2626
|
+
// next candidate. A deadline or any other failure is not that answer:
|
|
2627
|
+
// skipping past it would pick the stale local copy, or call a real
|
|
2628
|
+
// branch unknown.
|
|
2629
|
+
if (!(err instanceof GitRunError) || err.timedOut || err.exitCode !== 1)
|
|
2630
|
+
throw err;
|
|
2631
|
+
}
|
|
2632
|
+
}
|
|
2633
|
+
throw new WorkflowValidationError(`unknown branch: ${branch}`);
|
|
2634
|
+
}
|
|
2245
2635
|
/**
|
|
2246
2636
|
* Resolve a branch name to a concrete ref the local clone knows about.
|
|
2247
2637
|
* Tries the local head first, falls back to the matching remote-tracking
|
|
@@ -2291,12 +2681,12 @@ export class GitService {
|
|
|
2291
2681
|
}
|
|
2292
2682
|
const dirtyList = porcelain.stdout.trim().replace(/\s+/g, ' ');
|
|
2293
2683
|
if (queueExplainsIt) {
|
|
2294
|
-
|
|
2684
|
+
log.info(`workspace=${workspaceId} branch=${branch} working tree is dirty while ` +
|
|
2295
2685
|
`pending commits drain (expected — the background worker is catching up). ` +
|
|
2296
2686
|
`Files: ${dirtyList}`);
|
|
2297
2687
|
}
|
|
2298
2688
|
else {
|
|
2299
|
-
|
|
2689
|
+
log.warn(`workspace=${workspaceId} branch=${branch} has a non-clean working ` +
|
|
2300
2690
|
`tree under save=share with NO queued pending commits — this should never ` +
|
|
2301
2691
|
`happen and likely indicates a missed lock-release commit. Files: ${dirtyList}`);
|
|
2302
2692
|
}
|
|
@@ -2419,6 +2809,34 @@ export class GitService {
|
|
|
2419
2809
|
throw err;
|
|
2420
2810
|
}
|
|
2421
2811
|
}
|
|
2812
|
+
/**
|
|
2813
|
+
* The commits on `ref` that touched `repoRelativePath`, newest first, at
|
|
2814
|
+
* most `limit` of them. What a skill's `version` is looked up through: each
|
|
2815
|
+
* commit is a copy of the file that may have declared a version. Renames are
|
|
2816
|
+
* not followed — a moved skill's earlier history is the old path's.
|
|
2817
|
+
*/
|
|
2818
|
+
async pathHistory(workspaceId, ref, repoRelativePath, limit) {
|
|
2819
|
+
const cwd = await this.repoDir(workspaceId);
|
|
2820
|
+
const { stdout } = await this.git(cwd, [
|
|
2821
|
+
'rev-list',
|
|
2822
|
+
`--max-count=${Math.max(1, Math.trunc(limit))}`,
|
|
2823
|
+
ref,
|
|
2824
|
+
'--',
|
|
2825
|
+
repoRelativePath,
|
|
2826
|
+
]);
|
|
2827
|
+
return stdout.split('\n').map((line) => line.trim()).filter((line) => line.length > 0);
|
|
2828
|
+
}
|
|
2829
|
+
/**
|
|
2830
|
+
* Every file under `folder` at `ref`, repo-root-relative and in tree order.
|
|
2831
|
+
* A folder that does not exist at that ref lists nothing. NUL-delimited, so
|
|
2832
|
+
* a non-ASCII name comes back as itself rather than C-quoted, and one with
|
|
2833
|
+
* a leading or trailing space keeps it.
|
|
2834
|
+
*/
|
|
2835
|
+
async listFilesAtRef(workspaceId, ref, folder) {
|
|
2836
|
+
const cwd = await this.repoDir(workspaceId);
|
|
2837
|
+
const { stdout } = await this.git(cwd, ['ls-tree', '-r', '-z', '--name-only', ref, '--', folder]);
|
|
2838
|
+
return stdout.split('\0').filter((line) => line.length > 0);
|
|
2839
|
+
}
|
|
2422
2840
|
/**
|
|
2423
2841
|
* A clean `git status` for a path has two honest readings (already
|
|
2424
2842
|
* committed; a queued re-apply of something that landed) and one dishonest
|
|
@@ -2460,58 +2878,32 @@ export class GitService {
|
|
|
2460
2878
|
]);
|
|
2461
2879
|
return stdout.trim().length > 0;
|
|
2462
2880
|
}
|
|
2463
|
-
|
|
2464
|
-
|
|
2465
|
-
|
|
2466
|
-
|
|
2467
|
-
|
|
2468
|
-
|
|
2469
|
-
|
|
2470
|
-
|
|
2471
|
-
|
|
2472
|
-
|
|
2473
|
-
|
|
2474
|
-
|
|
2475
|
-
|
|
2476
|
-
|
|
2477
|
-
|
|
2478
|
-
|
|
2479
|
-
|
|
2480
|
-
|
|
2481
|
-
|
|
2482
|
-
|
|
2483
|
-
|
|
2484
|
-
|
|
2485
|
-
|
|
2486
|
-
|
|
2487
|
-
|
|
2488
|
-
|
|
2489
|
-
pending.child.stdin.on('error', () => undefined);
|
|
2490
|
-
pending.child.stdin.write(opts.input);
|
|
2491
|
-
pending.child.stdin.end();
|
|
2492
|
-
}
|
|
2493
|
-
const { stdout, stderr } = await pending;
|
|
2494
|
-
return { stdout: stdout.toString(), stderr: stderr.toString() };
|
|
2495
|
-
}
|
|
2496
|
-
catch (err) {
|
|
2497
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
2498
|
-
// Skip past any leading `-c key=val` pairs so the error names the actual
|
|
2499
|
-
// git subcommand that failed (e.g. "git fetch failed:" not "git -c failed:").
|
|
2500
|
-
let i = 0;
|
|
2501
|
-
while (i < args.length && args[i] === '-c')
|
|
2502
|
-
i += 2;
|
|
2503
|
-
const subcommand = args[i] ?? args[0];
|
|
2504
|
-
const wrapped = new Error(`git ${subcommand} failed: ${redact(msg)}`);
|
|
2505
|
-
// Preserve the underlying exit code / stderr so callers can distinguish
|
|
2506
|
-
// expected non-zero exits (e.g. merge-base exit 1 = no common ancestor)
|
|
2507
|
-
// from infra failures (ENOENT, exit 128) without parsing message strings.
|
|
2508
|
-
const original = err;
|
|
2509
|
-
if (typeof original.code === 'number')
|
|
2510
|
-
wrapped.exitCode = original.code;
|
|
2511
|
-
if (typeof original.stderr === 'string')
|
|
2512
|
-
wrapped.stderr = redact(original.stderr);
|
|
2513
|
-
throw wrapped;
|
|
2514
|
-
}
|
|
2881
|
+
/**
|
|
2882
|
+
* Every git invocation this service makes goes through here, and from here
|
|
2883
|
+
* through the injected runner — which is what puts a deadline on it. The
|
|
2884
|
+
* environment, the buffer ceiling, the stdin handling and the error shape all
|
|
2885
|
+
* live in `NodeGitRunner` now; see `shared/git.contract.ts` for why.
|
|
2886
|
+
*
|
|
2887
|
+
* Errors arrive as `GitRunError`, which still carries `exitCode` and
|
|
2888
|
+
* `stderr`, so the callers that read those to tell an expected non-zero exit
|
|
2889
|
+
* from a real failure are unaffected.
|
|
2890
|
+
*/
|
|
2891
|
+
git(cwd, args, opts) {
|
|
2892
|
+
return this.gitRunner.run(cwd, args, {
|
|
2893
|
+
...opts,
|
|
2894
|
+
// `GIT_LITERAL_PATHSPECS=1` makes git treat every pathspec literally
|
|
2895
|
+
// instead of interpreting `[`, `]`, `*`, `?`, `!`, or `:(magic)` as glob
|
|
2896
|
+
// / magic syntax. KB files routinely arrive with bracketed prefixes like
|
|
2897
|
+
// `[Approved] foo.docx` or `[Updated 2025] bar.md`; the upload pipeline
|
|
2898
|
+
// (`writeFileBinary` + `releaseLock` + `commitFile`) passes the relative
|
|
2899
|
+
// path straight through to `git add` / `git checkout -- <path>`, which
|
|
2900
|
+
// would otherwise glob and either match the wrong file or no file at all.
|
|
2901
|
+
//
|
|
2902
|
+
// THIS service's setting, not the runner's: the startup runner spells its
|
|
2903
|
+
// literal paths as `:(literal)<path>`, which this variable would turn into
|
|
2904
|
+
// a search for a file literally named that.
|
|
2905
|
+
env: { GIT_LITERAL_PATHSPECS: '1', ...opts?.env },
|
|
2906
|
+
});
|
|
2515
2907
|
}
|
|
2516
2908
|
}
|
|
2517
2909
|
/** Map a git status letter (`git diff --name-status`) to the DTO's `PrFileStatus`. */
|
|
@@ -2559,6 +2951,24 @@ export function parseNameStatusZ(out) {
|
|
|
2559
2951
|
}
|
|
2560
2952
|
return entries;
|
|
2561
2953
|
}
|
|
2954
|
+
/**
|
|
2955
|
+
* Undo a rename git detected between a real file and the empty-folder
|
|
2956
|
+
* placeholder. Deleting a folder's last file writes the placeholder, and
|
|
2957
|
+
* when that file was empty too, `-M` pairs the two as a 100% rename. The
|
|
2958
|
+
* pair is really a removal (or, the other way round, an addition) plus the
|
|
2959
|
+
* placeholder, which is never reviewed — so the entry becomes the real side
|
|
2960
|
+
* alone, and the caller's placeholder filter has nothing of it to drop.
|
|
2961
|
+
*/
|
|
2962
|
+
export function withoutPlaceholderRename(entry) {
|
|
2963
|
+
const { previousPath } = entry;
|
|
2964
|
+
if (!previousPath || entry.status !== 'renamed')
|
|
2965
|
+
return entry;
|
|
2966
|
+
const toPlaceholder = isFolderPlaceholder(entry.path);
|
|
2967
|
+
const fromPlaceholder = isFolderPlaceholder(previousPath);
|
|
2968
|
+
if (toPlaceholder === fromPlaceholder)
|
|
2969
|
+
return entry;
|
|
2970
|
+
return toPlaceholder ? { status: 'removed', path: previousPath } : { status: 'added', path: entry.path };
|
|
2971
|
+
}
|
|
2562
2972
|
/**
|
|
2563
2973
|
* Parse `git diff -M -z --numstat` output, in the SAME file order as
|
|
2564
2974
|
* `--name-status` (both driven by `-M` over the same range). Each record is
|