@bevel-software/platform-core-backend 0.15.1 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/THIRD-PARTY-NOTICES.md +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 +199 -75
- package/dist/core/create-core-server.js.map +1 -1
- package/dist/core/create-core-services.d.ts +49 -2
- package/dist/core/create-core-services.d.ts.map +1 -1
- package/dist/core/create-core-services.js +212 -86
- 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/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 +346 -0
- package/dist/modules/database/core-schema.d.ts.map +1 -1
- package/dist/modules/database/core-schema.js +119 -0
- package/dist/modules/database/core-schema.js.map +1 -1
- package/dist/modules/database/migrate.d.ts.map +1 -1
- package/dist/modules/database/migrate.js +26 -6
- package/dist/modules/database/migrate.js.map +1 -1
- package/dist/modules/declared-variables/declared-variables.routes.d.ts.map +1 -1
- package/dist/modules/declared-variables/declared-variables.routes.js +4 -2
- package/dist/modules/declared-variables/declared-variables.routes.js.map +1 -1
- package/dist/modules/diff/diff.routes.d.ts.map +1 -1
- package/dist/modules/diff/diff.routes.js +2 -4
- package/dist/modules/diff/diff.routes.js.map +1 -1
- package/dist/modules/diff/diff.service.d.ts +4 -1
- package/dist/modules/diff/diff.service.d.ts.map +1 -1
- package/dist/modules/diff/diff.service.js +79 -81
- package/dist/modules/diff/diff.service.js.map +1 -1
- package/dist/modules/kb-fs/bevel-ignore.d.ts +35 -0
- package/dist/modules/kb-fs/bevel-ignore.d.ts.map +1 -0
- package/dist/modules/kb-fs/bevel-ignore.js +71 -0
- package/dist/modules/kb-fs/bevel-ignore.js.map +1 -0
- package/dist/modules/kb-fs/file-change-notifier.d.ts.map +1 -1
- package/dist/modules/kb-fs/file-change-notifier.js +3 -1
- package/dist/modules/kb-fs/file-change-notifier.js.map +1 -1
- package/dist/modules/kb-fs/git-guarded-filesystem.d.ts +37 -0
- package/dist/modules/kb-fs/git-guarded-filesystem.d.ts.map +1 -0
- package/dist/modules/kb-fs/git-guarded-filesystem.js +104 -0
- package/dist/modules/kb-fs/git-guarded-filesystem.js.map +1 -0
- package/dist/modules/kb-fs/locking-filesystem.d.ts +113 -18
- package/dist/modules/kb-fs/locking-filesystem.d.ts.map +1 -1
- package/dist/modules/kb-fs/locking-filesystem.js +353 -76
- package/dist/modules/kb-fs/locking-filesystem.js.map +1 -1
- package/dist/modules/kb-fs/node-fs.d.ts +23 -0
- package/dist/modules/kb-fs/node-fs.d.ts.map +1 -0
- package/dist/modules/kb-fs/node-fs.js +158 -0
- package/dist/modules/kb-fs/node-fs.js.map +1 -0
- package/dist/modules/kb-fs/read-only-filesystem.d.ts +10 -9
- package/dist/modules/kb-fs/read-only-filesystem.d.ts.map +1 -1
- package/dist/modules/kb-fs/read-only-filesystem.js +18 -9
- package/dist/modules/kb-fs/read-only-filesystem.js.map +1 -1
- package/dist/modules/kb-fs/repo-path.d.ts +100 -3
- package/dist/modules/kb-fs/repo-path.d.ts.map +1 -1
- package/dist/modules/kb-fs/repo-path.js +195 -3
- package/dist/modules/kb-fs/repo-path.js.map +1 -1
- package/dist/modules/kb-sync/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 +9 -5
- package/dist/modules/mcp/mcp-auth.middleware.d.ts.map +1 -1
- package/dist/modules/mcp/mcp-auth.middleware.js +24 -16
- package/dist/modules/mcp/mcp-auth.middleware.js.map +1 -1
- package/dist/modules/mcp/mcp.routes.d.ts +4 -4
- package/dist/modules/mcp/mcp.routes.d.ts.map +1 -1
- package/dist/modules/mcp/mcp.routes.js +83 -179
- package/dist/modules/mcp/mcp.routes.js.map +1 -1
- package/dist/modules/mcp/mcp.service.d.ts +218 -61
- package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
- package/dist/modules/mcp/mcp.service.js +713 -159
- package/dist/modules/mcp/mcp.service.js.map +1 -1
- package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts.map +1 -1
- package/dist/modules/mcp/oauth/bevel-oauth-provider.js +4 -2
- 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 +153 -7
- package/dist/modules/settings/deployment-settings.service.d.ts.map +1 -1
- package/dist/modules/settings/deployment-settings.service.js +348 -51
- 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 +51 -3
- 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 +16 -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 +61 -18
- package/dist/modules/tool-auth/external-api-key.service.js.map +1 -1
- package/dist/modules/tool-auth/internal-token.service.d.ts +5 -2
- package/dist/modules/tool-auth/internal-token.service.d.ts.map +1 -1
- package/dist/modules/tool-auth/internal-token.service.js +5 -2
- package/dist/modules/tool-auth/internal-token.service.js.map +1 -1
- package/dist/modules/tool-auth/key-or-session.middleware.d.ts +23 -0
- package/dist/modules/tool-auth/key-or-session.middleware.d.ts.map +1 -0
- package/dist/modules/tool-auth/key-or-session.middleware.js +39 -0
- package/dist/modules/tool-auth/key-or-session.middleware.js.map +1 -0
- package/dist/modules/tool-auth/tool-auth.middleware.d.ts +7 -1
- package/dist/modules/tool-auth/tool-auth.middleware.d.ts.map +1 -1
- package/dist/modules/tool-auth/tool-auth.middleware.js +8 -5
- package/dist/modules/tool-auth/tool-auth.middleware.js.map +1 -1
- package/dist/modules/tool-helpers/tool-context.d.ts +14 -0
- package/dist/modules/tool-helpers/tool-context.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool-context.js +28 -6
- package/dist/modules/tool-helpers/tool-context.js.map +1 -1
- package/dist/modules/tool-helpers/tool-handler.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool-handler.js +22 -5
- package/dist/modules/tool-helpers/tool-handler.js.map +1 -1
- package/dist/modules/tool-helpers/tool.contract.d.ts +6 -1
- package/dist/modules/tool-helpers/tool.contract.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool.contract.js +7 -1
- package/dist/modules/tool-helpers/tool.contract.js.map +1 -1
- package/dist/modules/tool-manuals/index.d.ts +2 -1
- package/dist/modules/tool-manuals/index.d.ts.map +1 -1
- package/dist/modules/tool-manuals/index.js +1 -0
- package/dist/modules/tool-manuals/index.js.map +1 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.d.ts.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 +290 -12
- package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.service.js +924 -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 +1590 -146
- package/dist/modules/workspace/workspace.tools.js.map +1 -1
- package/dist/modules/workspace/write-denial.d.ts +76 -0
- package/dist/modules/workspace/write-denial.d.ts.map +1 -0
- package/dist/modules/workspace/write-denial.js +138 -0
- package/dist/modules/workspace/write-denial.js.map +1 -0
- package/dist/shared/canonical-file-identity.d.ts +64 -0
- package/dist/shared/canonical-file-identity.d.ts.map +1 -0
- package/dist/shared/canonical-file-identity.js +92 -0
- package/dist/shared/canonical-file-identity.js.map +1 -0
- package/dist/shared/domain-errors.d.ts +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 +17 -0
- package/dist/shared/git-internals.d.ts.map +1 -0
- package/dist/shared/git-internals.js +123 -0
- package/dist/shared/git-internals.js.map +1 -0
- package/dist/shared/git.contract.d.ts +157 -0
- package/dist/shared/git.contract.d.ts.map +1 -0
- package/dist/shared/git.contract.js +103 -0
- package/dist/shared/git.contract.js.map +1 -0
- package/dist/shared/http-errors.d.ts +33 -0
- package/dist/shared/http-errors.d.ts.map +1 -0
- package/dist/shared/http-errors.js +35 -0
- package/dist/shared/http-errors.js.map +1 -0
- package/dist/shared/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/meta/0006_snapshot.json +1723 -0
- package/migrations/meta/0007_snapshot.json +1729 -0
- package/migrations/meta/0008_snapshot.json +1753 -0
- package/migrations/meta/0009_snapshot.json +1759 -0
- package/migrations/meta/0010_snapshot.json +1872 -0
- package/migrations/meta/0011_snapshot.json +1884 -0
- package/migrations/meta/_journal.json +42 -0
- package/package.json +6 -5
- 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 +258 -79
- package/src/core/create-core-services.ts +302 -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/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 +123 -0
- package/src/modules/database/migrate.ts +27 -6
- package/src/modules/declared-variables/declared-variables.routes.ts +6 -3
- package/src/modules/diff/__tests__/diff.service.seed-atomicity.test.ts +3 -0
- package/src/modules/diff/__tests__/diff.service.test.ts +3 -0
- package/src/modules/diff/diff.routes.ts +2 -4
- package/src/modules/diff/diff.service.ts +75 -79
- package/src/modules/kb-fs/__tests__/locking-filesystem.test.ts +472 -9
- package/src/modules/kb-fs/__tests__/node-fs.test.ts +409 -0
- package/src/modules/kb-fs/__tests__/repo-path.test.ts +210 -1
- package/src/modules/{workspace → kb-fs}/bevel-ignore.ts +22 -15
- package/src/modules/kb-fs/file-change-notifier.ts +4 -1
- package/src/modules/kb-fs/git-guarded-filesystem.ts +123 -0
- package/src/modules/kb-fs/locking-filesystem.ts +399 -109
- package/src/modules/kb-fs/node-fs.ts +165 -0
- package/src/modules/kb-fs/read-only-filesystem.ts +18 -9
- package/src/modules/kb-fs/repo-path.ts +213 -3
- package/src/modules/kb-sync/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__/downstream-pool.test.ts +278 -0
- package/src/modules/mcp/__tests__/downstream-token-refresh.test.ts +178 -0
- package/src/modules/mcp/__tests__/fake-downstream-mcp-server.ts +156 -0
- package/src/modules/mcp/__tests__/first-call-probe.cli-args.test.ts +178 -0
- package/src/modules/mcp/__tests__/first-call-probe.test.ts +414 -0
- package/src/modules/mcp/__tests__/manual-failure-memo.test.ts +98 -6
- package/src/modules/mcp/__tests__/mcp-auth.middleware.test.ts +8 -5
- package/src/modules/mcp/__tests__/mcp-routes-harness.ts +1 -3
- package/src/modules/mcp/__tests__/mcp.e2e.test.ts +1055 -59
- package/src/modules/mcp/__tests__/mcp.routes.stateless.test.ts +182 -0
- package/src/modules/mcp/__tests__/mcp.service.test.ts +274 -6
- package/src/modules/mcp/__tests__/surface-log-throttle.test.ts +169 -0
- package/src/modules/mcp/downstream-pool.ts +256 -0
- package/src/modules/mcp/downstream-token-refresh.ts +170 -0
- package/src/modules/mcp/first-call-probe.cli-args.ts +159 -0
- package/src/modules/mcp/first-call-probe.cli.ts +60 -0
- package/src/modules/mcp/first-call-probe.ts +418 -0
- package/src/modules/mcp/manual-failure-memo.ts +81 -23
- package/src/modules/mcp/mcp-auth.middleware.ts +25 -16
- package/src/modules/mcp/mcp.routes.ts +376 -482
- package/src/modules/mcp/mcp.service.ts +846 -176
- package/src/modules/mcp/oauth/bevel-oauth-provider.ts +5 -2
- 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 +188 -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 +403 -57
- 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 +124 -0
- package/src/modules/tool-auth/connection-key-rejection.ts +25 -0
- package/src/modules/tool-auth/connection-keys-admin.routes.ts +76 -0
- package/src/modules/tool-auth/external-api-key.interface.ts +56 -3
- package/src/modules/tool-auth/external-api-key.service.ts +73 -25
- package/src/modules/tool-auth/internal-token.service.ts +5 -2
- package/src/modules/tool-auth/key-or-session.middleware.ts +45 -0
- package/src/modules/tool-auth/tool-auth.middleware.ts +16 -7
- package/src/modules/tool-helpers/__tests__/agent-roles-write.test.ts +228 -0
- package/src/modules/tool-helpers/__tests__/phase4-tools.test.ts +33 -4
- package/src/modules/tool-helpers/tool-context.ts +46 -7
- package/src/modules/tool-helpers/tool-handler.ts +23 -5
- package/src/modules/tool-helpers/tool.contract.ts +5 -0
- package/src/modules/tool-manuals/__tests__/mcp-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 +792 -0
- package/src/modules/workspace/__tests__/workspace-paths-inside-the-repo.test.ts +464 -0
- package/src/modules/workspace/__tests__/workspace.routes.branch-errors.test.ts +139 -0
- package/src/modules/workspace/__tests__/workspace.routes.create-grant.test.ts +189 -37
- package/src/modules/workspace/__tests__/workspace.routes.delete.test.ts +51 -11
- package/src/modules/workspace/__tests__/workspace.routes.download-implies-read.test.ts +161 -0
- package/src/modules/workspace/__tests__/workspace.routes.download.test.ts +109 -10
- package/src/modules/workspace/__tests__/workspace.routes.file-writes.test.ts +624 -0
- package/src/modules/workspace/__tests__/workspace.routes.folders.test.ts +409 -0
- package/src/modules/workspace/__tests__/workspace.routes.move-platform-files.test.ts +327 -0
- package/src/modules/workspace/__tests__/workspace.routes.read-gate.test.ts +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 +991 -303
- package/src/modules/workspace/workspace.tools.ts +1787 -180
- package/src/modules/workspace/write-denial.ts +189 -0
- package/src/shared/__tests__/canonical-file-identity.test.ts +154 -0
- package/src/shared/__tests__/email-identity.test.ts +35 -0
- package/src/shared/__tests__/filename.test.ts +0 -0
- package/src/shared/__tests__/frontmatter-id.test.ts +5 -0
- package/src/shared/__tests__/git-failure.test.ts +198 -0
- package/src/shared/__tests__/git-internals.test.ts +115 -0
- package/src/shared/__tests__/http-errors.test.ts +42 -0
- package/src/shared/__tests__/logging.test.ts +185 -0
- package/src/shared/__tests__/path-containment.test.ts +60 -0
- package/src/shared/__tests__/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 +124 -0
- package/src/shared/git.contract.ts +170 -0
- package/src/shared/http-errors.ts +36 -0
- package/src/shared/logger.contract.ts +141 -0
- package/src/shared/logging.ts +96 -0
- package/src/shared/path-containment.ts +34 -0
- package/src/shared/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/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
|
@@ -23,7 +23,10 @@
|
|
|
23
23
|
* The agent must delete entries individually via `deleteFile`.
|
|
24
24
|
* - `mkdir` followed by a `.gitkeep` write is the canonical way to land
|
|
25
25
|
* "create empty folder" as a one-file change — the locking write of
|
|
26
|
-
* `.gitkeep` carries the commit.
|
|
26
|
+
* `.gitkeep` carries the commit. The same placeholder keeps a folder
|
|
27
|
+
* whose last file was deleted or moved out: `delete_file` / `move_file`
|
|
28
|
+
* write it through `writeFile` here (see `keepFolderOf` in the tools),
|
|
29
|
+
* because a folder exists until it is deleted explicitly.
|
|
27
30
|
*
|
|
28
31
|
* Path conventions: Mastra's `inputPath` is workspace-relative (e.g.
|
|
29
32
|
* `knowledge-base/Knowledge/Foo.md`) — the same shape the human
|
|
@@ -33,8 +36,11 @@
|
|
|
33
36
|
*/
|
|
34
37
|
|
|
35
38
|
import fs from 'node:fs/promises';
|
|
39
|
+
import path from 'node:path';
|
|
40
|
+
import { logger } from '../../shared/logging.js';
|
|
41
|
+
|
|
42
|
+
const log = logger('locking-fs');
|
|
36
43
|
import {
|
|
37
|
-
LocalFilesystem,
|
|
38
44
|
type LocalFilesystemOptions,
|
|
39
45
|
type CopyOptions,
|
|
40
46
|
type FileContent,
|
|
@@ -44,7 +50,10 @@ import {
|
|
|
44
50
|
import type { AuthUser, Change, IWorkflowService } from '@bevel-software/platform-shared';
|
|
45
51
|
import { PushNeedsAgentResolutionError } from '../../shared/domain-errors.js';
|
|
46
52
|
import type { FileChangeNotifier } from './file-change-notifier.js';
|
|
53
|
+
import { isAbsence } from '../../shared/fs.contract.js';
|
|
54
|
+
import { DestinationTakenError, lstatOrNull, renameNoReplace, takenError } from '../../shared/rename-no-replace.js';
|
|
47
55
|
import { assertInsideRepo } from './repo-path.js';
|
|
56
|
+
import { GitGuardedFilesystem } from './git-guarded-filesystem.js';
|
|
48
57
|
import type { CreationGrantPlan, ICreatorAccess } from '../access-model/creator.js';
|
|
49
58
|
|
|
50
59
|
/** How many times to retry a contended acquire before giving up. */
|
|
@@ -52,6 +61,26 @@ const ACQUIRE_RETRY_ATTEMPTS = 3;
|
|
|
52
61
|
/** Backoff between retries (ms). 3 attempts × 2s ≈ 6s ceiling. */
|
|
53
62
|
const ACQUIRE_RETRY_DELAY_MS = 2_000;
|
|
54
63
|
|
|
64
|
+
/**
|
|
65
|
+
* Whatever a lock cycle's `check` threw — an Error or any other value — carried
|
|
66
|
+
* out of `lockedCycle`: nothing was written, so every lock it unwinds releases
|
|
67
|
+
* untouched. `withLock` hands the caller the original `reason`.
|
|
68
|
+
*/
|
|
69
|
+
class CheckRefusal {
|
|
70
|
+
constructor(readonly reason: unknown) {}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* A pre-disk write validator: called with the (workspace-relative path, full
|
|
75
|
+
* candidate content) of a write; throw (or reject) to refuse it. `appliesTo`
|
|
76
|
+
* names the paths it guards — only a validator that declares it is also run
|
|
77
|
+
* for the ops whose candidate has to be read first (append, copy, move), so an
|
|
78
|
+
* unrelated copy never pays for reading its source.
|
|
79
|
+
*/
|
|
80
|
+
export type WriteValidator = ((path: string, content: FileContent) => void | Promise<void>) & {
|
|
81
|
+
appliesTo?: (path: string) => boolean;
|
|
82
|
+
};
|
|
83
|
+
|
|
55
84
|
/**
|
|
56
85
|
* Dependencies the wrapper needs to talk to the workflow lock service.
|
|
57
86
|
* Captured at construction time so every per-method call resolves to the
|
|
@@ -76,12 +105,16 @@ export interface LockingFilesystemContext {
|
|
|
76
105
|
/**
|
|
77
106
|
* Optional pre-disk write validator. Invoked with the (workspace-relative
|
|
78
107
|
* path, full content) of every WHOLE-FILE write BEFORE the bytes land. Throw
|
|
79
|
-
* to refuse the write — nothing hits disk
|
|
80
|
-
*
|
|
81
|
-
*
|
|
82
|
-
*
|
|
108
|
+
* to refuse the write — nothing hits disk. It runs before the lock (so an
|
|
109
|
+
* ordinary refusal takes none) and again once the lock is held, on exactly
|
|
110
|
+
* the bytes that land, so a validator reading the current file judges the
|
|
111
|
+
* state it replaces; a refusal there releases the lock untouched. Used to
|
|
112
|
+
* reject a `roles.yaml` edit that would lock out admins (and, for agents,
|
|
113
|
+
* one that creates a role); see `roles-yaml-guard.ts`. `appendFile`,
|
|
114
|
+
* `copyFile` and `moveFile` are validated too, with the resulting content,
|
|
115
|
+
* when the destination is a path the validator's `appliesTo` claims.
|
|
83
116
|
*/
|
|
84
|
-
validateWrite?:
|
|
117
|
+
validateWrite?: WriteValidator;
|
|
85
118
|
/**
|
|
86
119
|
* Post-commit hook for the BATCH `writeFiles` path (which commits via
|
|
87
120
|
* `commitChanges` and so skips `runPendingCommit`'s emit). Single-file ops
|
|
@@ -90,16 +123,17 @@ export interface LockingFilesystemContext {
|
|
|
90
123
|
fileChanges?: FileChangeNotifier;
|
|
91
124
|
/**
|
|
92
125
|
* Optional creator read-grant planner (see `modules/access/creator-access`).
|
|
93
|
-
* When present, a write/mkdir that
|
|
94
|
-
* read gets an automatic `read:`
|
|
95
|
-
*
|
|
96
|
-
*
|
|
97
|
-
*
|
|
126
|
+
* When present, a write/mkdir that starts a NEW FOLDER directly under one
|
|
127
|
+
* of the three roots the acting user can't read gets an automatic `read:`
|
|
128
|
+
* grant seeded into that folder's `access.md`, so the agent's creations
|
|
129
|
+
* don't vanish from the driving user's explorer under default-deny reads.
|
|
130
|
+
* Any other creation the user could not see is refused by the lock's read
|
|
131
|
+
* gate. Absent (tests, non-KB filesystems) → no grants.
|
|
98
132
|
*/
|
|
99
133
|
creatorAccess?: ICreatorAccess;
|
|
100
134
|
}
|
|
101
135
|
|
|
102
|
-
export class LockingFilesystem extends
|
|
136
|
+
export class LockingFilesystem extends GitGuardedFilesystem {
|
|
103
137
|
private readonly lockContext: LockingFilesystemContext;
|
|
104
138
|
|
|
105
139
|
constructor(
|
|
@@ -110,48 +144,142 @@ export class LockingFilesystem extends LocalFilesystem {
|
|
|
110
144
|
this.lockContext = lockContext;
|
|
111
145
|
}
|
|
112
146
|
|
|
147
|
+
/**
|
|
148
|
+
* `check` is the CALLER's under-lock judgement: it runs once the path's lock
|
|
149
|
+
* is held and before a byte lands — the same slot `validateWrite` uses,
|
|
150
|
+
* opened up so a caller whose verdict depends on what the path CURRENTLY
|
|
151
|
+
* holds (the write tools' `mode` gate: does this path exist?) reads a state
|
|
152
|
+
* nobody else can move. Judged before the lock instead, such a verdict is a
|
|
153
|
+
* guess: a human editor saving between the stat and the write would have its
|
|
154
|
+
* file replaced by a `create` that then reported `created`. Throwing refuses
|
|
155
|
+
* the write and releases the lock untouched; the caller gets what it threw.
|
|
156
|
+
*/
|
|
113
157
|
override async writeFile(
|
|
114
158
|
inputPath: string,
|
|
115
159
|
content: FileContent,
|
|
116
160
|
options?: WriteOptions,
|
|
161
|
+
check?: () => void | Promise<void>,
|
|
117
162
|
): Promise<void> {
|
|
163
|
+
await this.assertNotGitInternals(inputPath);
|
|
118
164
|
this.assertInsideRepo(inputPath);
|
|
119
165
|
// Pre-disk gate (e.g. reject a roles.yaml edit that would lock out admins).
|
|
120
|
-
// Runs OUTSIDE the lock so
|
|
121
|
-
|
|
166
|
+
// Runs OUTSIDE the lock first so an ordinary refusal never acquires one,
|
|
167
|
+
// then again under the lock on the bytes that land (see withLock's check).
|
|
168
|
+
const validate = this.lockContext.validateWrite;
|
|
169
|
+
await validate?.(inputPath, content);
|
|
122
170
|
// Creator read grant (see LockingFilesystemContext.creatorAccess): planned
|
|
123
|
-
// BEFORE the write so the
|
|
124
|
-
//
|
|
125
|
-
//
|
|
171
|
+
// BEFORE the write so the new-folder detection sees the pre-creation
|
|
172
|
+
// tree. The seed lands first in its own lock+commit cycle so the grant is
|
|
173
|
+
// on disk before the file it makes visible.
|
|
126
174
|
const plan = await this.planCreate(inputPath, 'file');
|
|
127
175
|
if (plan?.kind === 'seed-access-md') await this.seedAccessMd(plan);
|
|
128
|
-
const toWrite =
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
176
|
+
const toWrite = content;
|
|
177
|
+
return this.withLock(
|
|
178
|
+
inputPath,
|
|
179
|
+
() => super.writeFile(inputPath, toWrite, options),
|
|
180
|
+
(check || validate) &&
|
|
181
|
+
(async () => {
|
|
182
|
+
// The caller's verdict first: it decides whether this write happens
|
|
183
|
+
// at all, so the content validator only judges bytes that will land.
|
|
184
|
+
await check?.();
|
|
185
|
+
await validate?.(inputPath, toWrite);
|
|
186
|
+
}),
|
|
187
|
+
);
|
|
133
188
|
}
|
|
134
189
|
|
|
135
190
|
override async appendFile(inputPath: string, content: FileContent): Promise<void> {
|
|
191
|
+
await this.assertNotGitInternals(inputPath);
|
|
136
192
|
this.assertInsideRepo(inputPath);
|
|
137
|
-
|
|
193
|
+
const candidate = async () =>
|
|
194
|
+
Buffer.concat([asBuffer((await this.readIfExists(inputPath)) ?? ''), asBuffer(content)]);
|
|
195
|
+
await this.validateResultingWrite(inputPath, candidate);
|
|
196
|
+
// Under the lock the resulting file is judged again and, when a validator
|
|
197
|
+
// claims the path, written whole — so the bytes that land are the ones judged.
|
|
198
|
+
let checked: Buffer | null = null;
|
|
199
|
+
return this.withLock(
|
|
200
|
+
inputPath,
|
|
201
|
+
() => (checked === null ? super.appendFile(inputPath, content) : super.writeFile(inputPath, checked)),
|
|
202
|
+
async () => {
|
|
203
|
+
checked = await this.validateResultingWrite(inputPath, candidate);
|
|
204
|
+
},
|
|
205
|
+
);
|
|
138
206
|
}
|
|
139
207
|
|
|
140
208
|
override async deleteFile(inputPath: string, options?: RemoveOptions): Promise<void> {
|
|
209
|
+
await this.assertNotGitInternals(inputPath);
|
|
141
210
|
return this.withLock(inputPath, () => super.deleteFile(inputPath, options));
|
|
142
211
|
}
|
|
143
212
|
|
|
144
213
|
override async copyFile(src: string, dest: string, options?: CopyOptions): Promise<void> {
|
|
214
|
+
await this.assertNotGitInternals(src);
|
|
215
|
+
await this.assertNotGitInternals(dest);
|
|
145
216
|
this.assertInsideRepo(dest);
|
|
217
|
+
await this.validateResultingWrite(dest, () => this.readFile(src));
|
|
146
218
|
// Lock on `dest`. `src` is read-only from this op's perspective — copy
|
|
147
|
-
// creates a new file at dest without disturbing src on disk.
|
|
148
|
-
|
|
219
|
+
// creates a new file at dest without disturbing src on disk. Because `src`
|
|
220
|
+
// is not locked, a claimed destination gets the source bytes read and
|
|
221
|
+
// judged under the lock, and exactly those bytes are written.
|
|
222
|
+
//
|
|
223
|
+
// A copy lands bytes at a name of its own, so it never replaces what is
|
|
224
|
+
// already there — the rule a move follows. Unless the caller explicitly
|
|
225
|
+
// asks to overwrite, both landings below run exclusively: `copyFile` with
|
|
226
|
+
// `overwrite: false` uses `COPYFILE_EXCL` and `writeFile` the `wx` flag,
|
|
227
|
+
// each of which FAILS rather than replaces if the name was taken in the
|
|
228
|
+
// meantime. That is what makes the tool's own look at the destination a
|
|
229
|
+
// message rather than the whole guarantee.
|
|
230
|
+
const noReplace: CopyOptions = { ...options, overwrite: options?.overwrite === true };
|
|
231
|
+
let checked: FileContent | null = null;
|
|
232
|
+
return this.withLock(
|
|
233
|
+
dest,
|
|
234
|
+
() =>
|
|
235
|
+
this.asTakenRefusal(dest, () =>
|
|
236
|
+
checked === null
|
|
237
|
+
? super.copyFile(src, dest, noReplace)
|
|
238
|
+
: super.writeFile(dest, checked, { overwrite: noReplace.overwrite }),
|
|
239
|
+
),
|
|
240
|
+
async () => {
|
|
241
|
+
checked = await this.validateResultingWrite(dest, () => this.readFile(src));
|
|
242
|
+
},
|
|
243
|
+
);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Run `landing` and turn the filesystem's own "that name is taken" failure
|
|
248
|
+
* into the refusal every surface answers with — `A file named … already
|
|
249
|
+
* exists in ….` — so a copy that loses the race reads exactly like a copy
|
|
250
|
+
* that was refused by the look before it.
|
|
251
|
+
*/
|
|
252
|
+
private async asTakenRefusal(dest: string, landing: () => Promise<void>): Promise<void> {
|
|
253
|
+
try {
|
|
254
|
+
await landing();
|
|
255
|
+
} catch (err) {
|
|
256
|
+
// Mastra's `FileExistsError` by name (this file avoids importing its
|
|
257
|
+
// error classes, and the name is its stable surface), plus the raw codes
|
|
258
|
+
// the exclusive flags answer with when the name is taken by something
|
|
259
|
+
// other than a plain file.
|
|
260
|
+
const name = (err as { name?: string } | null)?.name;
|
|
261
|
+
const code = (err as NodeJS.ErrnoException | null)?.code;
|
|
262
|
+
const taken = name === 'FileExistsError' || code === 'EEXIST' || code === 'EISDIR';
|
|
263
|
+
const absolute = taken ? this.resolveAbsolutePath(dest) : undefined;
|
|
264
|
+
// Only when something really is there: a code alone must not turn an
|
|
265
|
+
// unrelated failure into "already exists". `lstat`, not an existence
|
|
266
|
+
// probe that follows links — a DANGLING link holds the name against an
|
|
267
|
+
// exclusive create while resolving to nothing, and it is an entry the
|
|
268
|
+
// user can see, so it gets the clash sentence like any other.
|
|
269
|
+
if (absolute !== undefined && (await lstatOrNull(absolute)) !== null) {
|
|
270
|
+
throw await takenError(absolute, dest);
|
|
271
|
+
}
|
|
272
|
+
throw err;
|
|
273
|
+
}
|
|
149
274
|
}
|
|
150
275
|
|
|
151
276
|
override async moveFile(src: string, dest: string, options?: CopyOptions): Promise<void> {
|
|
277
|
+
await this.assertNotGitInternals(src);
|
|
278
|
+
await this.assertNotGitInternals(dest);
|
|
152
279
|
// Only the destination is gated: moving a stray INTO the repository is how
|
|
153
280
|
// a file the old behaviour left beside the clone gets rescued.
|
|
154
281
|
this.assertInsideRepo(dest);
|
|
282
|
+
await this.validateResultingWrite(dest, () => this.readFile(src));
|
|
155
283
|
// A move mutates two paths: the source is deleted and the destination
|
|
156
284
|
// is created. Only locking `dest` would let a concurrent writer hold
|
|
157
285
|
// the source's lock and mutate it under us, and would also leave the
|
|
@@ -164,13 +292,64 @@ export class LockingFilesystem extends LocalFilesystem {
|
|
|
164
292
|
// the inner lock's release commits its path — each move lands as two
|
|
165
293
|
// single-file changes (one delete, one create). Git's rename
|
|
166
294
|
// detection on log/blame still groups them visually after the fact.
|
|
295
|
+
//
|
|
296
|
+
// The destination is judged again once BOTH locks are held (the inner
|
|
297
|
+
// lock's check): the source cannot change under its lock, so the bytes
|
|
298
|
+
// judged there are the bytes the move lands.
|
|
299
|
+
const check = async () => {
|
|
300
|
+
await this.validateResultingWrite(dest, () => this.readFile(src));
|
|
301
|
+
};
|
|
302
|
+
const move = () => this.moveNoReplace(src, dest, options);
|
|
167
303
|
if (src === dest) {
|
|
168
|
-
return this.withLock(dest,
|
|
304
|
+
return this.withLock(dest, move, check);
|
|
169
305
|
}
|
|
170
306
|
const [first, second] = src < dest ? [src, dest] : [dest, src];
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
);
|
|
307
|
+
// The inner cycle is the raw one, so its refusal reaches the outer lock
|
|
308
|
+
// still marked as a refusal and both release untouched.
|
|
309
|
+
return this.withLock(first, () => this.lockedCycle(second, move, check));
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* The move itself, refusing a destination that is taken instead of replacing
|
|
314
|
+
* it — `fs.rename`, which `LocalFilesystem.moveFile` calls, replaces an
|
|
315
|
+
* existing file on every platform, and that is how a `.docx` renamed onto an
|
|
316
|
+
* existing `.md` handed the markdown file the Word bytes.
|
|
317
|
+
*
|
|
318
|
+
* The caller above (`move_file`) has already looked at the destination and
|
|
319
|
+
* refused a taken one with the sentence naming what is in the way. This runs
|
|
320
|
+
* with both paths' locks held and is the backstop under that look: a
|
|
321
|
+
* destination created in between — by a writer this process does not
|
|
322
|
+
* serialize with, the sidebar's own `moveEntry` among them — is refused
|
|
323
|
+
* atomically by the filesystem rather than overwritten. See
|
|
324
|
+
* `shared/rename-no-replace.ts`.
|
|
325
|
+
*
|
|
326
|
+
* `overwrite: true` is still honoured, for a caller that means it; nothing
|
|
327
|
+
* in the app passes it today.
|
|
328
|
+
*/
|
|
329
|
+
private async moveNoReplace(src: string, dest: string, options?: CopyOptions): Promise<void> {
|
|
330
|
+
if (options?.overwrite === true) return super.moveFile(src, dest, options);
|
|
331
|
+
const srcAbsolute = this.resolveAbsolutePath(src);
|
|
332
|
+
const destAbsolute = this.resolveAbsolutePath(dest);
|
|
333
|
+
// A path this filesystem cannot resolve is not one to do raw `fs` calls
|
|
334
|
+
// on; the base class refuses it with the message it always has.
|
|
335
|
+
if (srcAbsolute === undefined || destAbsolute === undefined) {
|
|
336
|
+
return super.moveFile(src, dest, options);
|
|
337
|
+
}
|
|
338
|
+
// `LocalFilesystem.moveFile` makes the destination's parent, and callers
|
|
339
|
+
// rely on a move into a new folder working.
|
|
340
|
+
await fs.mkdir(path.dirname(destAbsolute), { recursive: true });
|
|
341
|
+
try {
|
|
342
|
+
return await renameNoReplace(srcAbsolute, destAbsolute, dest);
|
|
343
|
+
} catch (err) {
|
|
344
|
+
// Across a mount point inside the workspace nothing can be renamed at
|
|
345
|
+
// all; the base class's copy-then-remove is the only way through, and
|
|
346
|
+
// `overwrite: false` keeps it exclusive (`COPYFILE_EXCL`) so it cannot
|
|
347
|
+
// replace anything either.
|
|
348
|
+
if ((err as NodeJS.ErrnoException | null)?.code !== 'EXDEV') throw err;
|
|
349
|
+
return this.asTakenRefusal(dest, () =>
|
|
350
|
+
super.moveFile(src, dest, { ...options, overwrite: false }),
|
|
351
|
+
);
|
|
352
|
+
}
|
|
174
353
|
}
|
|
175
354
|
|
|
176
355
|
/**
|
|
@@ -193,41 +372,54 @@ export class LockingFilesystem extends LocalFilesystem {
|
|
|
193
372
|
* `writes[].path` is workspace-relative (like `writeFile`). We do the disk
|
|
194
373
|
* write here; `commitChanges` only stages + commits what's on disk (the git
|
|
195
374
|
* layer never writes content).
|
|
375
|
+
*
|
|
376
|
+
* `check` is the batch counterpart of `writeFile`'s: it runs once EVERY
|
|
377
|
+
* path's lock is held and before any byte lands, is handed this batch's
|
|
378
|
+
* writes in the order it was given them, and returns the subset that may
|
|
379
|
+
* still land (the same objects — the creator-grant transform has already
|
|
380
|
+
* been applied to their content). It is where a per-path verdict that
|
|
381
|
+
* depends on what a path currently holds belongs, because only here is that
|
|
382
|
+
* state one no other writer can move. A write it drops is never written: its
|
|
383
|
+
* path releases untouched, stays out of the commit's scope, and takes its
|
|
384
|
+
* creator-grant seed with it when no surviving write still wants one. A
|
|
385
|
+
* `check` that THROWS refuses the whole batch, untouched.
|
|
196
386
|
*/
|
|
197
387
|
async writeFiles(
|
|
198
388
|
writes: { path: string; content: FileContent }[],
|
|
199
389
|
summary: string,
|
|
200
390
|
deletes: string[] = [],
|
|
391
|
+
check?: (
|
|
392
|
+
writes: readonly { path: string; content: FileContent }[],
|
|
393
|
+
) => Promise<{ path: string; content: FileContent }[]>,
|
|
201
394
|
): Promise<Change | null> {
|
|
202
395
|
const { workflow, workspaceId, branch, user } = this.lockContext;
|
|
203
396
|
// Fail the whole batch before any plan, validator or lock: one stray path
|
|
204
397
|
// must not let its siblings land while it silently misses git.
|
|
398
|
+
for (const w of writes) await this.assertNotGitInternals(w.path);
|
|
399
|
+
for (const d of deletes) await this.assertNotGitInternals(d);
|
|
205
400
|
for (const w of writes) this.assertInsideRepo(w.path);
|
|
206
|
-
// Creator read grants for the batch:
|
|
207
|
-
//
|
|
208
|
-
//
|
|
209
|
-
//
|
|
210
|
-
//
|
|
211
|
-
//
|
|
212
|
-
// win.
|
|
401
|
+
// Creator read grants for the batch: fold any new-root-folder access.md
|
|
402
|
+
// seeds into the SAME atomic batch (deduped — several files landing in
|
|
403
|
+
// one new folder share one seed). Plans are computed against the
|
|
404
|
+
// pre-batch disk state, which is exactly right: nothing below has hit
|
|
405
|
+
// disk yet. A seed whose path the caller explicitly writes in this batch
|
|
406
|
+
// is skipped — the caller's bytes win.
|
|
213
407
|
const seeds = new Map<string, (current: string) => string>();
|
|
214
|
-
|
|
408
|
+
// Which of the caller's writes asked for each seed. A seed exists only to
|
|
409
|
+
// make the files below it visible to their creator, so one whose every
|
|
410
|
+
// origin `check` drops has nothing left to make visible and is dropped too.
|
|
411
|
+
const seedOrigins = new Map<string, string[]>();
|
|
215
412
|
for (const w of writes) {
|
|
216
413
|
const plan = await this.planCreate(w.path, 'file');
|
|
217
414
|
if (plan?.kind === 'seed-access-md' && !writes.some((x) => x.path === plan.wsRelPath)) {
|
|
218
415
|
seeds.set(plan.wsRelPath, plan.apply);
|
|
416
|
+
seedOrigins.set(plan.wsRelPath, [...(seedOrigins.get(plan.wsRelPath) ?? []), w.path]);
|
|
219
417
|
}
|
|
220
|
-
grantedWrites.push(
|
|
221
|
-
plan?.kind === 'frontmatter' && typeof w.content === 'string'
|
|
222
|
-
? { path: w.path, content: plan.apply(w.content) }
|
|
223
|
-
: w,
|
|
224
|
-
);
|
|
225
418
|
}
|
|
226
|
-
writes = grantedWrites;
|
|
227
419
|
// Pre-disk gate every file BEFORE acquiring any lock (fail-closed): a
|
|
228
420
|
// refusal must not leave a lock held or a partial batch on disk.
|
|
229
421
|
if (this.lockContext.validateWrite) {
|
|
230
|
-
for (const w of writes) this.lockContext.validateWrite(w.path, w.content);
|
|
422
|
+
for (const w of writes) await this.lockContext.validateWrite(w.path, w.content);
|
|
231
423
|
}
|
|
232
424
|
// Deterministic lock order (string sort) so two concurrent batch writes
|
|
233
425
|
// can't deadlock by acquiring the same paths in opposite orders — the same
|
|
@@ -277,10 +469,7 @@ export class LockingFilesystem extends LocalFilesystem {
|
|
|
277
469
|
await workflow.releaseLockUntouched(workspaceId, branch, p, user);
|
|
278
470
|
}
|
|
279
471
|
} catch (releaseErr) {
|
|
280
|
-
|
|
281
|
-
`[locking-fs] lock release failed for "${p}" during writeFiles:`,
|
|
282
|
-
releaseErr instanceof Error ? releaseErr.message : releaseErr,
|
|
283
|
-
);
|
|
472
|
+
log.warn(`lock release failed for "${p}" during writeFiles:`, { err: releaseErr });
|
|
284
473
|
}
|
|
285
474
|
}
|
|
286
475
|
};
|
|
@@ -310,19 +499,58 @@ export class LockingFilesystem extends LocalFilesystem {
|
|
|
310
499
|
acquired.push(p);
|
|
311
500
|
}
|
|
312
501
|
|
|
313
|
-
//
|
|
314
|
-
//
|
|
315
|
-
//
|
|
316
|
-
//
|
|
502
|
+
// Judge every file again now that its lock is held: a validator that reads
|
|
503
|
+
// the current file (the agent roles.yaml gate) must see the bytes this
|
|
504
|
+
// batch replaces, not the ones before the locks. Nothing is written yet,
|
|
505
|
+
// so a refusal leaves every locked path exactly as it was.
|
|
506
|
+
if (this.lockContext.validateWrite) {
|
|
507
|
+
try {
|
|
508
|
+
for (const w of writes) await this.lockContext.validateWrite(w.path, w.content);
|
|
509
|
+
} catch (err) {
|
|
510
|
+
await releaseAll(() => 'untouched');
|
|
511
|
+
throw err;
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
|
|
515
|
+
// The caller's own under-lock judgement (see the doc above): with every
|
|
516
|
+
// lock held, it decides which writes may still land. Nothing is on disk
|
|
517
|
+
// yet, so both a dropped write and an outright refusal leave every locked
|
|
518
|
+
// path exactly as it was.
|
|
519
|
+
if (check) {
|
|
520
|
+
try {
|
|
521
|
+
writes = await check(writes);
|
|
522
|
+
} catch (err) {
|
|
523
|
+
await releaseAll(() => 'untouched');
|
|
524
|
+
throw err;
|
|
525
|
+
}
|
|
526
|
+
for (const [seedPath, origins] of seedOrigins) {
|
|
527
|
+
if (!origins.some((o) => writes.some((w) => w.path === o))) seeds.delete(seedPath);
|
|
528
|
+
}
|
|
529
|
+
if (writes.length === 0 && deletes.length === 0) {
|
|
530
|
+
// Every write dropped and nothing to delete: no bytes, so no commit
|
|
531
|
+
// either. An unscoped one here would sweep in whatever another save
|
|
532
|
+
// left dirty on the paths we merely locked.
|
|
533
|
+
await releaseAll(() => 'untouched');
|
|
534
|
+
return null;
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
// Creator-grant seed locks: single attempt, acquired after the caller's
|
|
539
|
+
// paths (a single non-blocking attempt cannot deadlock against another
|
|
540
|
+
// batch). A contended access.md fails the batch the same way a contended
|
|
541
|
+
// caller path does, with nothing written: the seed exists to keep a new
|
|
542
|
+
// root folder visible to the person creating it, and a batch that landed
|
|
543
|
+
// without it would leave that folder invisible to them.
|
|
317
544
|
for (const p of [...seeds.keys()].sort()) {
|
|
318
545
|
if (paths.includes(p)) continue; // already locked as a caller path
|
|
319
546
|
const result = await workflow.acquireLock(workspaceId, branch, p, user);
|
|
320
547
|
if (result.acquired) {
|
|
321
548
|
acquired.push(p);
|
|
322
549
|
} else {
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
`
|
|
550
|
+
await releaseAll(() => 'untouched');
|
|
551
|
+
throw new Error(
|
|
552
|
+
`Skipped editing "${p}" — locked by ${result.lock.holderName ?? 'another user'}. ` +
|
|
553
|
+
`Continuing with other edits; try this one again later.`,
|
|
326
554
|
);
|
|
327
555
|
}
|
|
328
556
|
}
|
|
@@ -333,7 +561,10 @@ export class LockingFilesystem extends LocalFilesystem {
|
|
|
333
561
|
// we know whether the seed write happens, and scoping the commit to a
|
|
334
562
|
// merely-locked path would sweep in another save's still-queued dirty
|
|
335
563
|
// bytes on that path under this batch's author/summary.
|
|
336
|
-
|
|
564
|
+
// Normally every locked caller path; after a `check` drop, only the
|
|
565
|
+
// survivors — a path this batch does not write must stay out of the
|
|
566
|
+
// commit's scope, or the commit sweeps in another save's queued bytes.
|
|
567
|
+
const touched = [...new Set([...writes.map((w) => w.path), ...deletes])].sort();
|
|
337
568
|
// Seeds whose bytes LANDED, with the pre-image read under their lock:
|
|
338
569
|
// if the batch's commit then fails, these must be rolled back to that
|
|
339
570
|
// pre-image (not to HEAD — the pre-image may be a prior save's queued
|
|
@@ -371,10 +602,7 @@ export class LockingFilesystem extends LocalFilesystem {
|
|
|
371
602
|
next = apply(current);
|
|
372
603
|
} catch (err) {
|
|
373
604
|
// Plan failed before any bytes moved — the path is untouched.
|
|
374
|
-
|
|
375
|
-
`[locking-fs] creator access.md seed failed for "${p}":`,
|
|
376
|
-
err instanceof Error ? err.message : err,
|
|
377
|
-
);
|
|
605
|
+
log.warn(`creator access.md seed failed for "${p}":`, { err });
|
|
378
606
|
continue;
|
|
379
607
|
}
|
|
380
608
|
if (next === current) continue;
|
|
@@ -394,10 +622,7 @@ export class LockingFilesystem extends LocalFilesystem {
|
|
|
394
622
|
// that double-failure case a prior save's still-queued dirty bytes
|
|
395
623
|
// on this path are lost to the discard — accepted, because the
|
|
396
624
|
// alternative is committing known-corrupt bytes under their name.
|
|
397
|
-
|
|
398
|
-
`[locking-fs] creator access.md seed failed for "${p}":`,
|
|
399
|
-
err instanceof Error ? err.message : err,
|
|
400
|
-
);
|
|
625
|
+
log.warn(`creator access.md seed failed for "${p}":`, { err });
|
|
401
626
|
let restored = false;
|
|
402
627
|
try {
|
|
403
628
|
if (existedBefore) {
|
|
@@ -413,9 +638,7 @@ export class LockingFilesystem extends LocalFilesystem {
|
|
|
413
638
|
}
|
|
414
639
|
if (!restored) {
|
|
415
640
|
failedSeedDiscards.add(p);
|
|
416
|
-
|
|
417
|
-
`[locking-fs] could not restore pre-seed bytes for "${p}" — releasing with discard`,
|
|
418
|
-
);
|
|
641
|
+
log.warn(`could not restore pre-seed bytes for "${p}" — releasing with discard`);
|
|
419
642
|
}
|
|
420
643
|
}
|
|
421
644
|
}
|
|
@@ -462,9 +685,7 @@ export class LockingFilesystem extends LocalFilesystem {
|
|
|
462
685
|
}
|
|
463
686
|
} catch {
|
|
464
687
|
failedSeedDiscards.add(p);
|
|
465
|
-
|
|
466
|
-
`[locking-fs] could not roll back seed bytes for "${p}" after a failed batch — releasing with discard`,
|
|
467
|
-
);
|
|
688
|
+
log.warn(`could not roll back seed bytes for "${p}" after a failed batch — releasing with discard`);
|
|
468
689
|
}
|
|
469
690
|
}
|
|
470
691
|
// The batch's own dirtied paths (and any failed-restore seed) release
|
|
@@ -499,6 +720,7 @@ export class LockingFilesystem extends LocalFilesystem {
|
|
|
499
720
|
}
|
|
500
721
|
|
|
501
722
|
override async mkdir(inputPath: string, options?: { recursive?: boolean }): Promise<void> {
|
|
723
|
+
await this.assertNotGitInternals(inputPath);
|
|
502
724
|
this.assertInsideRepo(inputPath);
|
|
503
725
|
// Creator read grant: planned BEFORE the dir exists (the plan's
|
|
504
726
|
// new-directory detection needs the pre-creation tree), seeded right
|
|
@@ -540,8 +762,7 @@ export class LockingFilesystem extends LocalFilesystem {
|
|
|
540
762
|
// Recursive directory removal would commit N file deletions in one
|
|
541
763
|
// change — violates the one-change-per-file invariant. Force the
|
|
542
764
|
// caller to delete files one at a time; each `deleteFile` lands as
|
|
543
|
-
// its own change.
|
|
544
|
-
// last file (git doesn't track empty folders).
|
|
765
|
+
// its own change.
|
|
545
766
|
throw new Error(
|
|
546
767
|
'Recursive directory removal is not supported through the lock-aware filesystem. ' +
|
|
547
768
|
'Delete files individually so each removal lands as its own change.',
|
|
@@ -557,39 +778,63 @@ export class LockingFilesystem extends LocalFilesystem {
|
|
|
557
778
|
assertInsideRepo(inputPath, this.lockContext.kbDirName);
|
|
558
779
|
}
|
|
559
780
|
|
|
781
|
+
/**
|
|
782
|
+
* Validate an op whose resulting bytes at `dest` are not in hand (append,
|
|
783
|
+
* copy, move): `candidate` is read only when the validator claims `dest`.
|
|
784
|
+
* Runs before the lock, like `writeFile`'s gate, and again under it. Returns
|
|
785
|
+
* the bytes judged, or null when no validator claims `dest`.
|
|
786
|
+
*/
|
|
787
|
+
private async validateResultingWrite<C extends FileContent>(
|
|
788
|
+
dest: string,
|
|
789
|
+
candidate: () => Promise<C>,
|
|
790
|
+
): Promise<C | null> {
|
|
791
|
+
const validate = this.lockContext.validateWrite;
|
|
792
|
+
if (!validate?.appliesTo?.(dest)) return null;
|
|
793
|
+
const bytes = await candidate();
|
|
794
|
+
await validate(dest, bytes);
|
|
795
|
+
return bytes;
|
|
796
|
+
}
|
|
797
|
+
|
|
798
|
+
/** The bytes at `inputPath`, or null when nothing is there. */
|
|
799
|
+
private async readIfExists(inputPath: string): Promise<Buffer | null> {
|
|
800
|
+
const absolute = this.resolveAbsolutePath(inputPath);
|
|
801
|
+
if (!absolute) return null;
|
|
802
|
+
try {
|
|
803
|
+
return await fs.readFile(absolute);
|
|
804
|
+
} catch (err) {
|
|
805
|
+
if (isAbsence(err)) return null;
|
|
806
|
+
throw err;
|
|
807
|
+
}
|
|
808
|
+
}
|
|
809
|
+
|
|
560
810
|
/**
|
|
561
811
|
* Land a `seed-access-md` creation-grant plan: under the access.md's own
|
|
562
812
|
* lock (single acquire+release cycle → one commit), re-read the CURRENT
|
|
563
813
|
* bytes and splice the grant into them — never a blind overwrite, so a
|
|
564
814
|
* concurrent creator's just-landed grant on the same new directory
|
|
565
|
-
* survives.
|
|
566
|
-
*
|
|
567
|
-
*
|
|
815
|
+
* survives. A contended lock, read, write, or release failure here FAILS
|
|
816
|
+
* the creation that triggered the seed: the seed is planned only for a new
|
|
817
|
+
* folder at a root the acting user cannot read, and without the grant the
|
|
818
|
+
* folder would come into existence invisible to them — the very thing the
|
|
819
|
+
* read gate exists to prevent.
|
|
568
820
|
*/
|
|
569
821
|
private async seedAccessMd(
|
|
570
822
|
plan: Extract<CreationGrantPlan, { kind: 'seed-access-md' }>,
|
|
571
823
|
): Promise<void> {
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
// Not there yet — the normal case for a brand-new directory.
|
|
581
|
-
}
|
|
824
|
+
await this.withLock(plan.wsRelPath, async () => {
|
|
825
|
+
let current = '';
|
|
826
|
+
const absolute = this.resolveAbsolutePath(plan.wsRelPath);
|
|
827
|
+
if (absolute) {
|
|
828
|
+
try {
|
|
829
|
+
current = await fs.readFile(absolute, 'utf-8');
|
|
830
|
+
} catch {
|
|
831
|
+
// Not there yet — the normal case for a brand-new directory.
|
|
582
832
|
}
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
console.warn(
|
|
589
|
-
`[locking-fs] creator access.md seed failed for "${plan.wsRelPath}":`,
|
|
590
|
-
err instanceof Error ? err.message : err,
|
|
591
|
-
);
|
|
592
|
-
}
|
|
833
|
+
}
|
|
834
|
+
const next = plan.apply(current);
|
|
835
|
+
if (next !== current) await super.writeFile(plan.wsRelPath, next);
|
|
836
|
+
});
|
|
837
|
+
this.lockContext.creatorAccess?.noteAccessFileWritten(this.lockContext.workspaceId);
|
|
593
838
|
}
|
|
594
839
|
|
|
595
840
|
/**
|
|
@@ -607,10 +852,7 @@ export class LockingFilesystem extends LocalFilesystem {
|
|
|
607
852
|
try {
|
|
608
853
|
return await creatorAccess.planForCreate(workspaceId, user, inputPath, kind);
|
|
609
854
|
} catch (err) {
|
|
610
|
-
|
|
611
|
-
`[locking-fs] creator read-grant planning failed for "${inputPath}":`,
|
|
612
|
-
err instanceof Error ? err.message : err,
|
|
613
|
-
);
|
|
855
|
+
log.warn(`creator read-grant planning failed for "${inputPath}":`, { err });
|
|
614
856
|
return null;
|
|
615
857
|
}
|
|
616
858
|
}
|
|
@@ -621,8 +863,36 @@ export class LockingFilesystem extends LocalFilesystem {
|
|
|
621
863
|
* times before surfacing a structured failure — long enough to ride
|
|
622
864
|
* out a human typing a quick edit, short enough that the agent doesn't
|
|
623
865
|
* stall a whole turn waiting for someone to step away from a file.
|
|
866
|
+
*
|
|
867
|
+
* `check` runs once the lock is held and before `op`: a validator that
|
|
868
|
+
* depends on what is on disk judges the state the op will actually replace.
|
|
869
|
+
* A check refusal releases the lock UNTOUCHED — nothing was written, and the
|
|
870
|
+
* no-commit release would reset the path to HEAD, destroying a prior save's
|
|
871
|
+
* still-queued bytes — and so does every enclosing lock cycle it unwinds
|
|
872
|
+
* through. The caller receives exactly what `check` threw.
|
|
624
873
|
*/
|
|
625
|
-
private async withLock<T>(
|
|
874
|
+
private async withLock<T>(
|
|
875
|
+
inputPath: string,
|
|
876
|
+
op: () => Promise<T>,
|
|
877
|
+
check?: () => Promise<void>,
|
|
878
|
+
): Promise<T> {
|
|
879
|
+
try {
|
|
880
|
+
return await this.lockedCycle(inputPath, op, check);
|
|
881
|
+
} catch (err) {
|
|
882
|
+
throw err instanceof CheckRefusal ? err.reason : err;
|
|
883
|
+
}
|
|
884
|
+
}
|
|
885
|
+
|
|
886
|
+
/**
|
|
887
|
+
* `withLock` without the unwrap: a `check` refusal leaves as a
|
|
888
|
+
* {@link CheckRefusal}, so a cycle nested inside another (a move's second
|
|
889
|
+
* lock) tells the enclosing one to release untouched too.
|
|
890
|
+
*/
|
|
891
|
+
private async lockedCycle<T>(
|
|
892
|
+
inputPath: string,
|
|
893
|
+
op: () => Promise<T>,
|
|
894
|
+
check?: () => Promise<void>,
|
|
895
|
+
): Promise<T> {
|
|
626
896
|
const { workflow, workspaceId, branch, user } = this.lockContext;
|
|
627
897
|
|
|
628
898
|
let lastHolderName: string | null = null;
|
|
@@ -647,21 +917,37 @@ export class LockingFilesystem extends LocalFilesystem {
|
|
|
647
917
|
|
|
648
918
|
let result: T;
|
|
649
919
|
try {
|
|
920
|
+
if (check) {
|
|
921
|
+
try {
|
|
922
|
+
await check();
|
|
923
|
+
} catch (reason) {
|
|
924
|
+
throw new CheckRefusal(reason);
|
|
925
|
+
}
|
|
926
|
+
}
|
|
650
927
|
result = await op();
|
|
651
928
|
} catch (err) {
|
|
652
929
|
// Op failed — drop the lock without committing, so a partial write
|
|
653
930
|
// before the throw doesn't accidentally land as a committed change
|
|
654
931
|
// (the normal `releaseLock` would `commitFile` whatever's on disk
|
|
655
|
-
// for `inputPath`, including the partial state).
|
|
656
|
-
//
|
|
657
|
-
//
|
|
932
|
+
// for `inputPath`, including the partial state). A check refusal wrote
|
|
933
|
+
// nothing, so it releases untouched instead — and so does a move or
|
|
934
|
+
// copy refused because the destination is taken: its no-clobber call
|
|
935
|
+
// (`link`, `mkdir`, `open` with `O_EXCL`) fails without creating
|
|
936
|
+
// anything. That one matters beyond tidiness. The discard resets the
|
|
937
|
+
// PATH rather than this call's changes, so on the destination of a lost
|
|
938
|
+
// race — where the winner's move has landed and its commit is still
|
|
939
|
+
// queued — discarding would throw the winner's file away on the way to
|
|
940
|
+
// reporting the loser's refusal. Best-effort: a failure to release here
|
|
941
|
+
// surfaces in logs but doesn't override the original op error the
|
|
942
|
+
// caller actually cares about.
|
|
658
943
|
try {
|
|
659
|
-
|
|
944
|
+
if (err instanceof CheckRefusal || err instanceof DestinationTakenError) {
|
|
945
|
+
await workflow.releaseLockUntouched(workspaceId, branch, inputPath, user);
|
|
946
|
+
} else {
|
|
947
|
+
await workflow.releaseLockNoCommit(workspaceId, branch, inputPath, user);
|
|
948
|
+
}
|
|
660
949
|
} catch (releaseErr) {
|
|
661
|
-
|
|
662
|
-
`[locking-fs] releaseLockNoCommit failed for "${inputPath}" after op error:`,
|
|
663
|
-
releaseErr instanceof Error ? releaseErr.message : releaseErr,
|
|
664
|
-
);
|
|
950
|
+
log.warn(`lock release failed for "${inputPath}" after op error:`, { err: releaseErr });
|
|
665
951
|
}
|
|
666
952
|
throw err;
|
|
667
953
|
}
|
|
@@ -676,6 +962,10 @@ export class LockingFilesystem extends LocalFilesystem {
|
|
|
676
962
|
}
|
|
677
963
|
}
|
|
678
964
|
|
|
965
|
+
function asBuffer(content: FileContent): Buffer {
|
|
966
|
+
return typeof content === 'string' ? Buffer.from(content, 'utf-8') : Buffer.from(content);
|
|
967
|
+
}
|
|
968
|
+
|
|
679
969
|
function sleep(ms: number): Promise<void> {
|
|
680
970
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
681
971
|
}
|