@bevel-software/platform-core-backend 0.21.0 → 0.23.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/dist/core/core-ports.d.ts +11 -1
- package/dist/core/core-ports.d.ts.map +1 -1
- package/dist/core/core-ports.js.map +1 -1
- package/dist/core/create-core-server.d.ts +3 -3
- package/dist/core/create-core-server.d.ts.map +1 -1
- package/dist/core/create-core-server.js +62 -13
- package/dist/core/create-core-server.js.map +1 -1
- package/dist/core/create-core-services.d.ts +22 -3
- package/dist/core/create-core-services.d.ts.map +1 -1
- package/dist/core/create-core-services.js +158 -23
- package/dist/core/create-core-services.js.map +1 -1
- package/dist/core/lifecycle.d.ts +34 -1
- package/dist/core/lifecycle.d.ts.map +1 -1
- package/dist/core/lifecycle.js +89 -13
- package/dist/core/lifecycle.js.map +1 -1
- package/dist/core-config.d.ts +0 -12
- package/dist/core-config.d.ts.map +1 -1
- package/dist/core-config.js +11 -13
- package/dist/core-config.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/modules/access/access-control.interface.d.ts +42 -12
- package/dist/modules/access/access-control.interface.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.d.ts +67 -10
- package/dist/modules/access/access-control.service.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.js +214 -35
- package/dist/modules/access/access-control.service.js.map +1 -1
- package/dist/modules/access/access-requests.contract.d.ts +75 -0
- package/dist/modules/access/access-requests.contract.d.ts.map +1 -0
- package/dist/modules/access/access-requests.contract.js +20 -0
- package/dist/modules/access/access-requests.contract.js.map +1 -0
- package/dist/modules/access/access-requests.routes.d.ts +35 -0
- package/dist/modules/access/access-requests.routes.d.ts.map +1 -0
- package/dist/modules/access/access-requests.routes.js +237 -0
- package/dist/modules/access/access-requests.routes.js.map +1 -0
- package/dist/modules/access/access-requests.service.d.ts +123 -0
- package/dist/modules/access/access-requests.service.d.ts.map +1 -0
- package/dist/modules/access/access-requests.service.js +337 -0
- package/dist/modules/access/access-requests.service.js.map +1 -0
- package/dist/modules/access/access.routes.d.ts.map +1 -1
- package/dist/modules/access/access.routes.js +13 -15
- package/dist/modules/access/access.routes.js.map +1 -1
- package/dist/modules/access-model/access-grammar.d.ts +12 -0
- package/dist/modules/access-model/access-grammar.d.ts.map +1 -1
- package/dist/modules/access-model/access-grammar.js +24 -0
- package/dist/modules/access-model/access-grammar.js.map +1 -1
- package/dist/modules/auth/account-admission.d.ts +58 -7
- package/dist/modules/auth/account-admission.d.ts.map +1 -1
- package/dist/modules/auth/account-admission.js +44 -1
- package/dist/modules/auth/account-admission.js.map +1 -1
- package/dist/modules/auth/account.routes.d.ts +1 -1
- package/dist/modules/auth/account.routes.d.ts.map +1 -1
- package/dist/modules/auth/account.routes.js +61 -5
- package/dist/modules/auth/account.routes.js.map +1 -1
- package/dist/modules/auth/auth.middleware.d.ts +1 -1
- package/dist/modules/auth/auth.middleware.d.ts.map +1 -1
- package/dist/modules/auth/auth.middleware.js +18 -7
- package/dist/modules/auth/auth.middleware.js.map +1 -1
- package/dist/modules/auth/auth.routes.d.ts.map +1 -1
- package/dist/modules/auth/auth.routes.js +8 -0
- package/dist/modules/auth/auth.routes.js.map +1 -1
- package/dist/modules/auth/auth.service.d.ts +96 -3
- package/dist/modules/auth/auth.service.d.ts.map +1 -1
- package/dist/modules/auth/auth.service.js +187 -9
- package/dist/modules/auth/auth.service.js.map +1 -1
- package/dist/modules/auth/oidc-auth-provider.d.ts.map +1 -1
- package/dist/modules/auth/oidc-auth-provider.js +7 -2
- package/dist/modules/auth/oidc-auth-provider.js.map +1 -1
- package/dist/modules/database/core-schema.d.ts +41 -24
- package/dist/modules/database/core-schema.d.ts.map +1 -1
- package/dist/modules/database/core-schema.js +35 -27
- package/dist/modules/database/core-schema.js.map +1 -1
- package/dist/modules/github-app/github-app.client.d.ts +101 -0
- package/dist/modules/github-app/github-app.client.d.ts.map +1 -0
- package/dist/modules/github-app/github-app.client.js +222 -0
- package/dist/modules/github-app/github-app.client.js.map +1 -0
- package/dist/modules/github-app/github-app.connection.d.ts +102 -0
- package/dist/modules/github-app/github-app.connection.d.ts.map +1 -0
- package/dist/modules/github-app/github-app.connection.js +185 -0
- package/dist/modules/github-app/github-app.connection.js.map +1 -0
- package/dist/modules/github-app/github-app.routes.d.ts +59 -0
- package/dist/modules/github-app/github-app.routes.d.ts.map +1 -0
- package/dist/modules/github-app/github-app.routes.js +323 -0
- package/dist/modules/github-app/github-app.routes.js.map +1 -0
- package/dist/modules/github-app/index.d.ts +4 -0
- package/dist/modules/github-app/index.d.ts.map +1 -0
- package/dist/modules/github-app/index.js +4 -0
- package/dist/modules/github-app/index.js.map +1 -0
- package/dist/modules/kb-fs/branch-name.d.ts.map +1 -1
- package/dist/modules/kb-fs/branch-name.js +12 -2
- package/dist/modules/kb-fs/branch-name.js.map +1 -1
- package/dist/modules/kb-fs/remote-url.d.ts +22 -0
- package/dist/modules/kb-fs/remote-url.d.ts.map +1 -0
- package/dist/modules/kb-fs/remote-url.js +35 -0
- package/dist/modules/kb-fs/remote-url.js.map +1 -0
- package/dist/modules/kb-fs/repo-path.d.ts +11 -16
- package/dist/modules/kb-fs/repo-path.d.ts.map +1 -1
- package/dist/modules/kb-fs/repo-path.js +79 -0
- package/dist/modules/kb-fs/repo-path.js.map +1 -1
- package/dist/modules/kb-sync/kb-sync.routes.d.ts +2 -2
- package/dist/modules/kb-sync/kb-sync.routes.d.ts.map +1 -1
- package/dist/modules/kb-sync/kb-sync.routes.js +14 -3
- package/dist/modules/kb-sync/kb-sync.routes.js.map +1 -1
- package/dist/modules/kb-sync/sync-auth.d.ts +3 -1
- package/dist/modules/kb-sync/sync-auth.d.ts.map +1 -1
- package/dist/modules/kb-sync/sync-auth.js +1 -1
- package/dist/modules/kb-sync/sync-auth.js.map +1 -1
- package/dist/modules/mcp/mcp-auth.middleware.d.ts.map +1 -1
- package/dist/modules/mcp/mcp-auth.middleware.js +21 -6
- package/dist/modules/mcp/mcp-auth.middleware.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 +3 -2
- package/dist/modules/mcp/oauth/bevel-oauth-provider.js.map +1 -1
- package/dist/modules/plugins/join-proposals.d.ts +17 -5
- package/dist/modules/plugins/join-proposals.d.ts.map +1 -1
- package/dist/modules/plugins/join-proposals.js +76 -22
- package/dist/modules/plugins/join-proposals.js.map +1 -1
- package/dist/modules/plugins/join-requests.service.d.ts +111 -18
- package/dist/modules/plugins/join-requests.service.d.ts.map +1 -1
- package/dist/modules/plugins/join-requests.service.js +173 -29
- package/dist/modules/plugins/join-requests.service.js.map +1 -1
- package/dist/modules/plugins/plugins.routes.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.routes.js +3 -2
- package/dist/modules/plugins/plugins.routes.js.map +1 -1
- package/dist/modules/settings/deployment-settings.service.d.ts +22 -1
- package/dist/modules/settings/deployment-settings.service.d.ts.map +1 -1
- package/dist/modules/settings/deployment-settings.service.js +101 -7
- package/dist/modules/settings/deployment-settings.service.js.map +1 -1
- package/dist/modules/settings/managed-repository.d.ts +43 -0
- package/dist/modules/settings/managed-repository.d.ts.map +1 -0
- package/dist/modules/settings/managed-repository.js +60 -0
- package/dist/modules/settings/managed-repository.js.map +1 -0
- package/dist/modules/settings/repository-source.d.ts +128 -0
- package/dist/modules/settings/repository-source.d.ts.map +1 -0
- package/dist/modules/settings/repository-source.js +150 -0
- package/dist/modules/settings/repository-source.js.map +1 -0
- package/dist/modules/settings/setup.routes.d.ts +78 -4
- package/dist/modules/settings/setup.routes.d.ts.map +1 -1
- package/dist/modules/settings/setup.routes.js +379 -17
- package/dist/modules/settings/setup.routes.js.map +1 -1
- package/dist/modules/skills/skill-access-requests.routes.d.ts +6 -8
- package/dist/modules/skills/skill-access-requests.routes.d.ts.map +1 -1
- package/dist/modules/skills/skill-access-requests.routes.js +24 -63
- package/dist/modules/skills/skill-access-requests.routes.js.map +1 -1
- package/dist/modules/skills/skills.contract.d.ts +90 -18
- package/dist/modules/skills/skills.contract.d.ts.map +1 -1
- package/dist/modules/skills/skills.contract.js +4 -1
- package/dist/modules/skills/skills.contract.js.map +1 -1
- package/dist/modules/skills/skills.service.d.ts +98 -9
- package/dist/modules/skills/skills.service.d.ts.map +1 -1
- package/dist/modules/skills/skills.service.js +239 -37
- package/dist/modules/skills/skills.service.js.map +1 -1
- package/dist/modules/skills/skills.tools.d.ts +7 -0
- package/dist/modules/skills/skills.tools.d.ts.map +1 -1
- package/dist/modules/skills/skills.tools.js +71 -7
- package/dist/modules/skills/skills.tools.js.map +1 -1
- package/dist/modules/tool-auth/external-api-key.service.d.ts.map +1 -1
- package/dist/modules/tool-auth/external-api-key.service.js +4 -2
- package/dist/modules/tool-auth/external-api-key.service.js.map +1 -1
- package/dist/modules/tool-auth/internal-token.service.d.ts +3 -3
- package/dist/modules/tool-auth/tool-auth.middleware.d.ts +16 -7
- package/dist/modules/tool-auth/tool-auth.middleware.d.ts.map +1 -1
- package/dist/modules/tool-auth/tool-auth.middleware.js +34 -12
- package/dist/modules/tool-auth/tool-auth.middleware.js.map +1 -1
- package/dist/modules/tool-helpers/tool-context.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool-context.js +15 -0
- package/dist/modules/tool-helpers/tool-context.js.map +1 -1
- package/dist/modules/tool-helpers/tool-handler.d.ts +2 -1
- package/dist/modules/tool-helpers/tool-handler.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool-handler.js +25 -4
- package/dist/modules/tool-helpers/tool-handler.js.map +1 -1
- package/dist/modules/tool-helpers/tool.contract.d.ts +3 -2
- package/dist/modules/tool-helpers/tool.contract.d.ts.map +1 -1
- package/dist/modules/tool-helpers/tool.contract.js.map +1 -1
- package/dist/modules/tool-helpers/validate-token.js +1 -1
- package/dist/modules/tool-helpers/validate-token.js.map +1 -1
- package/dist/modules/workflow/agent-tools/change-request-summary.d.ts +98 -0
- package/dist/modules/workflow/agent-tools/change-request-summary.d.ts.map +1 -0
- package/dist/modules/workflow/agent-tools/change-request-summary.js +81 -0
- package/dist/modules/workflow/agent-tools/change-request-summary.js.map +1 -0
- package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +1 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.js +113 -37
- package/dist/modules/workflow/agent-tools/workflow.tools.js.map +1 -1
- package/dist/modules/workflow/file-lock.service.d.ts +24 -0
- package/dist/modules/workflow/file-lock.service.d.ts.map +1 -1
- package/dist/modules/workflow/file-lock.service.js +30 -0
- package/dist/modules/workflow/file-lock.service.js.map +1 -1
- package/dist/modules/workflow/git/git.service.d.ts +72 -1
- package/dist/modules/workflow/git/git.service.d.ts.map +1 -1
- package/dist/modules/workflow/git/git.service.js +170 -6
- package/dist/modules/workflow/git/git.service.js.map +1 -1
- package/dist/modules/workflow/git/node-git-runner.d.ts.map +1 -1
- package/dist/modules/workflow/git/node-git-runner.js +5 -0
- package/dist/modules/workflow/git/node-git-runner.js.map +1 -1
- package/dist/modules/workflow/git/pull-request.service.d.ts +45 -0
- package/dist/modules/workflow/git/pull-request.service.d.ts.map +1 -1
- package/dist/modules/workflow/git/pull-request.service.js +99 -0
- package/dist/modules/workflow/git/pull-request.service.js.map +1 -1
- package/dist/modules/workflow/pending-commits.service.d.ts +38 -0
- package/dist/modules/workflow/pending-commits.service.d.ts.map +1 -1
- package/dist/modules/workflow/pending-commits.service.js +55 -0
- package/dist/modules/workflow/pending-commits.service.js.map +1 -1
- package/dist/modules/workflow/workflow-hooks.d.ts +54 -32
- package/dist/modules/workflow/workflow-hooks.d.ts.map +1 -1
- package/dist/modules/workflow/workflow-hooks.js +16 -1
- package/dist/modules/workflow/workflow-hooks.js.map +1 -1
- package/dist/modules/workflow/workflow.routes.d.ts.map +1 -1
- package/dist/modules/workflow/workflow.routes.js +3 -1
- package/dist/modules/workflow/workflow.routes.js.map +1 -1
- package/dist/modules/workflow/workflow.service.d.ts +94 -13
- package/dist/modules/workflow/workflow.service.d.ts.map +1 -1
- package/dist/modules/workflow/workflow.service.js +258 -51
- package/dist/modules/workflow/workflow.service.js.map +1 -1
- package/dist/modules/workspace/agent-access.gate.d.ts +94 -0
- package/dist/modules/workspace/agent-access.gate.d.ts.map +1 -0
- package/dist/modules/workspace/agent-access.gate.js +123 -0
- package/dist/modules/workspace/agent-access.gate.js.map +1 -0
- package/dist/modules/workspace/routine-write-policy.d.ts +5 -6
- package/dist/modules/workspace/routine-write-policy.d.ts.map +1 -1
- package/dist/modules/workspace/routine-write-policy.js +5 -6
- package/dist/modules/workspace/routine-write-policy.js.map +1 -1
- package/dist/modules/workspace/session-sink.d.ts +5 -5
- package/dist/modules/workspace/set-aside-clone.d.ts +46 -0
- package/dist/modules/workspace/set-aside-clone.d.ts.map +1 -0
- package/dist/modules/workspace/set-aside-clone.js +92 -0
- package/dist/modules/workspace/set-aside-clone.js.map +1 -0
- package/dist/modules/workspace/startup/kb-startup-runner.d.ts +117 -1
- package/dist/modules/workspace/startup/kb-startup-runner.d.ts.map +1 -1
- package/dist/modules/workspace/startup/kb-startup-runner.js +190 -1
- package/dist/modules/workspace/startup/kb-startup-runner.js.map +1 -1
- package/dist/modules/workspace/workspace.routes.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.routes.js +92 -3
- package/dist/modules/workspace/workspace.routes.js.map +1 -1
- package/dist/modules/workspace/workspace.service.d.ts +115 -5
- package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.service.js +272 -26
- package/dist/modules/workspace/workspace.service.js.map +1 -1
- package/dist/modules/workspace/workspace.tools.d.ts +2 -2
- package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.tools.js +337 -117
- package/dist/modules/workspace/workspace.tools.js.map +1 -1
- package/dist/modules/write-access/write-access.d.ts +60 -0
- package/dist/modules/write-access/write-access.d.ts.map +1 -0
- package/dist/modules/write-access/write-access.js +129 -0
- package/dist/modules/write-access/write-access.js.map +1 -0
- package/dist/shared/domain-errors.d.ts +64 -0
- package/dist/shared/domain-errors.d.ts.map +1 -1
- package/dist/shared/domain-errors.js +83 -0
- package/dist/shared/domain-errors.js.map +1 -1
- package/dist/shared/git.contract.d.ts +30 -0
- package/dist/shared/git.contract.d.ts.map +1 -1
- package/dist/shared/git.contract.js +26 -0
- package/dist/shared/git.contract.js.map +1 -1
- package/dist/tenancy/static-tenant-source.d.ts +0 -1
- package/dist/tenancy/static-tenant-source.d.ts.map +1 -1
- package/dist/tenancy/static-tenant-source.js +0 -2
- package/dist/tenancy/static-tenant-source.js.map +1 -1
- package/migrations/0014_change_request_closed_reason.sql +1 -0
- package/migrations/0015_account_deactivation.sql +3 -0
- package/migrations/meta/0014_snapshot.json +2265 -0
- package/migrations/meta/0015_snapshot.json +2271 -0
- package/migrations/meta/_journal.json +14 -0
- package/package.json +3 -3
- package/src/__tests__/kb-layout-config.test.ts +0 -2
- package/src/__tests__/retired-settings.test.ts +96 -0
- package/src/core/__tests__/gated-boot.test.ts +132 -0
- package/src/core/__tests__/lifecycle.test.ts +170 -1
- package/src/core/__tests__/set-aside-root-is-one-place.test.ts +63 -0
- package/src/core/core-ports.ts +11 -1
- package/src/core/create-core-server.ts +69 -15
- package/src/core/create-core-services.ts +190 -27
- package/src/core/lifecycle.ts +98 -13
- package/src/core-config.ts +13 -14
- package/src/index.ts +12 -1
- package/src/modules/access/__tests__/access-control.preview-relocation.test.ts +385 -0
- package/src/modules/access/__tests__/access-control.prospective.test.ts +94 -18
- package/src/modules/access/__tests__/access-requests.recut.test.ts +134 -0
- package/src/modules/access/__tests__/access-requests.routes.test.ts +610 -0
- package/src/modules/access/__tests__/access.routes.prospective.test.ts +6 -7
- package/src/modules/access/access-control.interface.ts +43 -12
- package/src/modules/access/access-control.service.ts +234 -36
- package/src/modules/access/access-requests.contract.ts +93 -0
- package/src/modules/access/access-requests.routes.ts +286 -0
- package/src/modules/access/access-requests.service.ts +420 -0
- package/src/modules/access/access.routes.ts +13 -15
- package/src/modules/access-model/access-grammar.ts +22 -0
- package/src/modules/agent-instructions/__tests__/agent-instructions.route.test.ts +3 -1
- package/src/modules/auth/__tests__/account-deactivation.test.ts +252 -0
- package/src/modules/auth/__tests__/account.routes.test.ts +81 -3
- package/src/modules/auth/__tests__/auth.middleware.test.ts +45 -22
- package/src/modules/auth/__tests__/auth.service.test.ts +39 -1
- package/src/modules/auth/account-admission.ts +78 -9
- package/src/modules/auth/account.routes.ts +63 -7
- package/src/modules/auth/auth.middleware.ts +19 -8
- package/src/modules/auth/auth.routes.ts +8 -0
- package/src/modules/auth/auth.service.ts +207 -7
- package/src/modules/auth/oidc-auth-provider.ts +7 -2
- package/src/modules/database/core-schema.ts +35 -27
- package/src/modules/github-app/__tests__/github-app.test.ts +848 -0
- package/src/modules/github-app/github-app.client.ts +268 -0
- package/src/modules/github-app/github-app.connection.ts +204 -0
- package/src/modules/github-app/github-app.routes.ts +359 -0
- package/src/modules/github-app/index.ts +19 -0
- package/src/modules/kb-fs/__tests__/branch-name.test.ts +10 -0
- package/src/modules/kb-fs/__tests__/remote-url.test.ts +38 -0
- package/src/modules/kb-fs/__tests__/repo-path.test.ts +123 -0
- package/src/modules/kb-fs/branch-name.ts +14 -1
- package/src/modules/kb-fs/remote-url.ts +35 -0
- package/src/modules/kb-fs/repo-path.ts +85 -0
- package/src/modules/kb-sync/__tests__/kb-sync.routes.test.ts +26 -1
- package/src/modules/kb-sync/kb-sync.routes.ts +14 -4
- package/src/modules/kb-sync/sync-auth.ts +2 -2
- package/src/modules/mcp/__tests__/mcp-auth.middleware.test.ts +60 -3
- package/src/modules/mcp/__tests__/mcp.service.test.ts +68 -6
- package/src/modules/mcp/mcp-auth.middleware.ts +20 -6
- package/src/modules/mcp/oauth/bevel-oauth-provider.ts +3 -1
- package/src/modules/plugins/__tests__/join-proposals.test.ts +100 -19
- package/src/modules/plugins/__tests__/join-requests.service.test.ts +27 -11
- package/src/modules/plugins/__tests__/join-requests.settlement.test.ts +371 -0
- package/src/modules/plugins/__tests__/plugins.routes.test.ts +1 -1
- package/src/modules/plugins/__tests__/plugins.tools.test.ts +2 -1
- package/src/modules/plugins/join-proposals.ts +87 -19
- package/src/modules/plugins/join-requests.service.ts +199 -39
- package/src/modules/plugins/plugins.routes.ts +3 -2
- package/src/modules/settings/__tests__/deployment-settings.service.test.ts +16 -0
- package/src/modules/settings/__tests__/repository-source.test.ts +191 -0
- package/src/modules/settings/__tests__/setup.routes.git-mode.test.ts +386 -0
- package/src/modules/settings/__tests__/setup.routes.github-app.test.ts +299 -0
- package/src/modules/settings/__tests__/setup.routes.managed-phase.test.ts +236 -0
- package/src/modules/settings/__tests__/setup.routes.repository-change.test.ts +390 -0
- package/src/modules/settings/__tests__/setup.routes.test.ts +3 -0
- package/src/modules/settings/deployment-settings.service.ts +117 -6
- package/src/modules/settings/managed-repository.ts +68 -0
- package/src/modules/settings/repository-source.ts +197 -0
- package/src/modules/settings/setup.routes.ts +463 -15
- package/src/modules/skills/__tests__/allowed-tools-warn.tools.test.ts +2 -1
- package/src/modules/skills/__tests__/branch-skills.tools.test.ts +218 -0
- package/src/modules/skills/__tests__/skill-access-requests.routes.test.ts +5 -1
- package/src/modules/skills/__tests__/skills.service.test.ts +229 -5
- package/src/modules/skills/skill-access-requests.routes.ts +25 -75
- package/src/modules/skills/skills.contract.ts +91 -18
- package/src/modules/skills/skills.service.ts +278 -41
- package/src/modules/skills/skills.tools.ts +80 -8
- package/src/modules/tool-auth/__tests__/manual-auth.middleware.test.ts +14 -1
- package/src/modules/tool-auth/external-api-key.service.ts +4 -2
- package/src/modules/tool-auth/internal-token.service.ts +3 -3
- package/src/modules/tool-auth/tool-auth.middleware.ts +34 -11
- package/src/modules/tool-helpers/__tests__/agent-roles-write.test.ts +5 -3
- package/src/modules/tool-helpers/__tests__/phase4-tools.test.ts +3 -3
- package/src/modules/tool-helpers/__tests__/validate-token.test.ts +11 -1
- package/src/modules/tool-helpers/tool-context.ts +15 -0
- package/src/modules/tool-helpers/tool-handler.ts +24 -4
- package/src/modules/tool-helpers/tool.contract.ts +3 -2
- package/src/modules/tool-helpers/validate-token.ts +1 -1
- package/src/modules/workflow/__tests__/apply-failure.test.ts +9 -1
- package/src/modules/workflow/__tests__/pending-commits.repository-replaced.test.ts +111 -0
- package/src/modules/workflow/__tests__/workflow.routes.history-read-gate.test.ts +25 -0
- package/src/modules/workflow/__tests__/workflow.service.facade.test.ts +159 -8
- package/src/modules/workflow/__tests__/workflow.service.repository-replaced.test.ts +249 -0
- package/src/modules/workflow/__tests__/workflow.service.update-from-target.test.ts +146 -40
- package/src/modules/workflow/agent-tools/__tests__/workflow.tools.test.ts +405 -7
- package/src/modules/workflow/agent-tools/change-request-summary.ts +182 -0
- package/src/modules/workflow/agent-tools/workflow.tools.ts +135 -38
- package/src/modules/workflow/file-lock.service.ts +31 -0
- package/src/modules/workflow/git/__tests__/git.service.fileBytesAtCommit.test.ts +260 -0
- package/src/modules/workflow/git/__tests__/git.service.pull.test.ts +121 -0
- package/src/modules/workflow/git/__tests__/pull-request.service.getPrDetail.test.ts +145 -2
- package/src/modules/workflow/git/__tests__/pull-request.service.viewer-can-delete.test.ts +166 -0
- package/src/modules/workflow/git/git.service.ts +193 -4
- package/src/modules/workflow/git/node-git-runner.ts +6 -0
- package/src/modules/workflow/git/pull-request.service.ts +119 -0
- package/src/modules/workflow/pending-commits.service.ts +59 -1
- package/src/modules/workflow/workflow-hooks.ts +64 -26
- package/src/modules/workflow/workflow.routes.ts +3 -1
- package/src/modules/workflow/workflow.service.ts +290 -55
- package/src/modules/workspace/__tests__/agent-access.gate.test.ts +208 -0
- package/src/modules/workspace/__tests__/escape-sequences.routes.test.ts +384 -0
- package/src/modules/workspace/__tests__/file-stat-access.test.ts +2 -1
- package/src/modules/workspace/__tests__/git-internals.security.test.ts +2 -1
- package/src/modules/workspace/__tests__/set-aside-clone.test.ts +52 -0
- package/src/modules/workspace/__tests__/workspace.routes.at-ref.test.ts +305 -0
- package/src/modules/workspace/__tests__/workspace.routes.download.test.ts +2 -0
- package/src/modules/workspace/__tests__/workspace.service.forget-clone-races.test.ts +147 -0
- package/src/modules/workspace/__tests__/workspace.service.replaced-repository.test.ts +326 -0
- package/src/modules/workspace/__tests__/workspace.service.test.ts +20 -9
- package/src/modules/workspace/__tests__/workspace.service.unknown-branch.test.ts +43 -0
- package/src/modules/workspace/__tests__/workspace.tools.agents-file.test.ts +2 -3
- package/src/modules/workspace/__tests__/workspace.tools.branch-errors.test.ts +235 -10
- package/src/modules/workspace/__tests__/workspace.tools.test.ts +720 -17
- package/src/modules/workspace/agent-access.gate.ts +164 -0
- package/src/modules/workspace/routine-write-policy.ts +5 -6
- package/src/modules/workspace/session-sink.ts +5 -5
- package/src/modules/workspace/set-aside-clone.ts +96 -0
- package/src/modules/workspace/startup/__tests__/kb-startup-runner.test.ts +297 -0
- package/src/modules/workspace/startup/kb-startup-runner.ts +242 -2
- package/src/modules/workspace/workspace.routes.ts +95 -3
- package/src/modules/workspace/workspace.service.ts +273 -25
- package/src/modules/workspace/workspace.tools.ts +373 -119
- package/src/modules/write-access/__tests__/write-access.test.ts +248 -0
- package/src/modules/write-access/write-access.ts +153 -0
- package/src/shared/domain-errors.ts +89 -0
- package/src/shared/git.contract.ts +37 -0
- package/src/tenancy/__tests__/static-tenant-source.test.ts +0 -1
- package/src/tenancy/static-tenant-source.ts +0 -3
- package/dist/modules/workflow/session-ontology.policy.d.ts +0 -52
- package/dist/modules/workflow/session-ontology.policy.d.ts.map +0 -1
- package/dist/modules/workflow/session-ontology.policy.js +0 -62
- package/dist/modules/workflow/session-ontology.policy.js.map +0 -1
- package/dist/modules/workflow/session-ontology.service.d.ts +0 -105
- package/dist/modules/workflow/session-ontology.service.d.ts.map +0 -1
- package/dist/modules/workflow/session-ontology.service.js +0 -147
- package/dist/modules/workflow/session-ontology.service.js.map +0 -1
- package/dist/modules/workspace/session-ontology.gate.d.ts +0 -114
- package/dist/modules/workspace/session-ontology.gate.d.ts.map +0 -1
- package/dist/modules/workspace/session-ontology.gate.js +0 -161
- package/dist/modules/workspace/session-ontology.gate.js.map +0 -1
- package/dist/shared/kb-layout.d.ts +0 -39
- package/dist/shared/kb-layout.d.ts.map +0 -1
- package/dist/shared/kb-layout.js +0 -103
- package/dist/shared/kb-layout.js.map +0 -1
- package/dist/shared/kb-layout.test.d.ts +0 -2
- package/dist/shared/kb-layout.test.d.ts.map +0 -1
- package/dist/shared/kb-layout.test.js +0 -75
- package/dist/shared/kb-layout.test.js.map +0 -1
- package/src/modules/workflow/__tests__/session-ontology.policy.test.ts +0 -62
- package/src/modules/workflow/__tests__/session-ontology.service.test.ts +0 -201
- package/src/modules/workflow/session-ontology.policy.ts +0 -70
- package/src/modules/workflow/session-ontology.service.ts +0 -183
- package/src/modules/workspace/__tests__/session-ontology.gate.test.ts +0 -239
- package/src/modules/workspace/session-ontology.gate.ts +0 -191
- package/src/shared/kb-layout.test.ts +0 -98
- package/src/shared/kb-layout.ts +0 -102
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace.service.d.ts","sourceRoot":"","sources":["../../../src/modules/workspace/workspace.service.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,QAAQ,EAAE,iBAAiB,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAEjH,OAAO,EAML,KAAK,iBAAiB,EACvB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAa,KAAK,WAAW,EAAwB,MAAM,6BAA6B,CAAC;AAMhG,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,4BAA4B,CAAC;AAa5D,OAAO,EAGL,mBAAmB,EAEpB,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"workspace.service.d.ts","sourceRoot":"","sources":["../../../src/modules/workspace/workspace.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,6 +15,9 @@ import { GitInternalsError, PathNotFoundError, PathTraversalError, UnreadableArc
|
|
|
15
15
|
import { workspaceIdForBranch, branchForWorkspaceId } from '../../shared/workspace-id.js';
|
|
16
16
|
import { BranchNotFoundError, RemoteBranchGoneError, WorkflowDomainError, isMissingRemoteBranchFailure, } from '../../shared/domain-errors.js';
|
|
17
17
|
import { assertValidBranchName } from '../kb-fs/branch-name.js';
|
|
18
|
+
import { normalizeRepositoryAddress, sameRepository } from '../kb-fs/remote-url.js';
|
|
19
|
+
import { redactSecret, urlQuerySecrets } from '../../shared/redact-secret.js';
|
|
20
|
+
import { setAsideClone, setAsideRootFor, setAsideStamp } from './set-aside-clone.js';
|
|
18
21
|
import { cloneCredentialArgs, cloneCredentialConfigArgs, cloneTrackingConfigArgs, SAFE_IMPLICIT_FETCH_ARGS, } from '../kb-fs/clone-config.js';
|
|
19
22
|
// Zip-bomb guardrails. The upload cap is 50 MB compressed; even a generous
|
|
20
23
|
// 100× expansion ratio still fits inside these limits, so a well-behaved
|
|
@@ -142,6 +145,8 @@ export class WorkspaceService {
|
|
|
142
145
|
kb;
|
|
143
146
|
disk;
|
|
144
147
|
gitRunner;
|
|
148
|
+
setAsideRoot;
|
|
149
|
+
aroundSetAside;
|
|
145
150
|
/** Maps branch → absolute directory path. Lazily populated. */
|
|
146
151
|
branchDirs = new Map();
|
|
147
152
|
/**
|
|
@@ -213,13 +218,41 @@ export class WorkspaceService {
|
|
|
213
218
|
* runner on its default deadline and no token, for a directly
|
|
214
219
|
* constructed service.
|
|
215
220
|
*/
|
|
216
|
-
gitRunner = new NodeGitRunner()
|
|
221
|
+
gitRunner = new NodeGitRunner(),
|
|
222
|
+
/**
|
|
223
|
+
* Where a working copy of a repository that is no longer the configured
|
|
224
|
+
* one is kept. THE SAME VALUE THE KB STARTUP PHASE IS GIVEN — what the two
|
|
225
|
+
* of them move must end up in one place, and omitting it here falls back to
|
|
226
|
+
* a directory that does not survive a deployment's next recreate.
|
|
227
|
+
*
|
|
228
|
+
* Why, in one place: `setAsideRootFor` in `set-aside-clone.ts`.
|
|
229
|
+
*/
|
|
230
|
+
setAsideRoot,
|
|
231
|
+
/**
|
|
232
|
+
* What surrounds the setting aside of ONE working copy when a branch is
|
|
233
|
+
* opened and its clone turns out to be of another repository: given the
|
|
234
|
+
* workspace id and the move, it runs the move. The composition root
|
|
235
|
+
* passes what the startup phase does around its own set-asides: the
|
|
236
|
+
* commit worker held still, the copy's queued commits held back for a
|
|
237
|
+
* person, the locks on its branch dropped. If it throws, the copy stays
|
|
238
|
+
* where it was and the branch is refused with that reason. Absent, the
|
|
239
|
+
* move runs as it is.
|
|
240
|
+
*/
|
|
241
|
+
aroundSetAside = (_workspaceId, move) => move()) {
|
|
217
242
|
this.workspacesRoot = workspacesRoot;
|
|
218
243
|
this.kb = kb;
|
|
219
244
|
this.disk = disk;
|
|
220
245
|
this.gitRunner = gitRunner;
|
|
246
|
+
this.setAsideRoot = setAsideRoot;
|
|
247
|
+
this.aroundSetAside = aroundSetAside;
|
|
221
248
|
this.kbRepoUrl = typeof kbRepoUrl === 'function' ? kbRepoUrl : () => kbRepoUrl;
|
|
222
249
|
}
|
|
250
|
+
/**
|
|
251
|
+
* The set-asides in flight, one per branch. Two callers opening the same
|
|
252
|
+
* branch both find the clone of another repository; the second waits for
|
|
253
|
+
* the first's move instead of trying to move a directory that has gone.
|
|
254
|
+
*/
|
|
255
|
+
inFlightSetAsides = new Map();
|
|
223
256
|
get kbDirName() {
|
|
224
257
|
return this.kb.kbDirName;
|
|
225
258
|
}
|
|
@@ -526,22 +559,96 @@ export class WorkspaceService {
|
|
|
526
559
|
}
|
|
527
560
|
// Check disk — the clone may have been bootstrapped by a previous
|
|
528
561
|
// process and survived a restart.
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
562
|
+
const onDisk = await fs.access(path.join(repoDir, '.git')).then(() => true, () => false);
|
|
563
|
+
// A clone fetches and pushes through the address stored in its OWN
|
|
564
|
+
// `remote.origin.url`, which nothing rewrites when the configured
|
|
565
|
+
// repository changes. Adopting one of the repository that was replaced is
|
|
566
|
+
// how every later fetch answers "repository not found" — so it is set
|
|
567
|
+
// aside here and cloned fresh below, the same rule, and the same
|
|
568
|
+
// destination, as the KB startup phase applies to the whole workspaces
|
|
569
|
+
// root.
|
|
570
|
+
//
|
|
571
|
+
// SET ASIDE, never deleted. The phase sweeps only AFTER it has reached the
|
|
572
|
+
// configured remote, so that a typo in the address cannot cost anyone
|
|
573
|
+
// their work. This path has reached nothing: it is a branch being opened,
|
|
574
|
+
// and it runs in exactly the states where the address is stored but
|
|
575
|
+
// unproven — a gated boot, a break-glass start, a save that changed the
|
|
576
|
+
// address before the phase got to it. Deleting on a string difference
|
|
577
|
+
// there would throw away commits that exist nowhere else because somebody
|
|
578
|
+
// mistyped a host name.
|
|
579
|
+
//
|
|
580
|
+
// OUTSIDE the adoption `try` below, deliberately: a clone that cannot be
|
|
581
|
+
// moved must fail this call with that reason. Swallowed into "bootstrap
|
|
582
|
+
// below", it would be found again by the clone step, which sees a
|
|
583
|
+
// directory with a `.git` in it, calls that already-cloned, and hands back
|
|
584
|
+
// the very working copy this refused to adopt.
|
|
585
|
+
// Counted before the disk is looked at: the startup phase may take this
|
|
586
|
+
// very copy away while the checks below are awaited (`forgetClone`), and a
|
|
587
|
+
// copy that went must not be registered as the branch's.
|
|
588
|
+
const discardsAtAdoption = this.discardsOf(id);
|
|
589
|
+
const setAsideInFlight = this.inFlightSetAsides.get(branch);
|
|
590
|
+
if (setAsideInFlight) {
|
|
591
|
+
// Someone else is moving it. Wait, then clone below; a move that failed
|
|
592
|
+
// refuses this caller with the same reason.
|
|
593
|
+
await setAsideInFlight;
|
|
594
|
+
}
|
|
595
|
+
else if (onDisk && (await this.isCloneOfAnotherRepository(repoDir))) {
|
|
596
|
+
// Asked again: another caller may have started the move while the
|
|
597
|
+
// address was being read.
|
|
598
|
+
const startedMeanwhile = this.inFlightSetAsides.get(branch);
|
|
599
|
+
if (startedMeanwhile) {
|
|
600
|
+
await startedMeanwhile;
|
|
601
|
+
}
|
|
602
|
+
else {
|
|
603
|
+
const kept = path.join(setAsideRootFor(this.workspacesRoot, this.setAsideRoot), setAsideStamp(), id);
|
|
604
|
+
// What surrounds the move may wait, and the startup phase may set
|
|
605
|
+
// this very copy aside meanwhile. Then there is nothing left to move:
|
|
606
|
+
// the phase did it, and said so.
|
|
607
|
+
let moved = false;
|
|
608
|
+
const moving = this.aroundSetAside(id, async () => {
|
|
609
|
+
if (this.discardsOf(id) !== discardsAtAdoption)
|
|
610
|
+
return;
|
|
611
|
+
await setAsideClone(repoDir, kept);
|
|
612
|
+
moved = true;
|
|
613
|
+
}).finally(() => {
|
|
614
|
+
this.inFlightSetAsides.delete(branch);
|
|
615
|
+
});
|
|
616
|
+
this.inFlightSetAsides.set(branch, moving);
|
|
617
|
+
await moving;
|
|
618
|
+
if (moved) {
|
|
619
|
+
log.warn(`the "${branch}" working copy was a clone of another repository. Set aside at ${kept}; nothing was ` +
|
|
620
|
+
'deleted, and it is being cloned fresh from the configured one. Work that was never pushed is in ' +
|
|
621
|
+
'that folder: `git log` there shows it.');
|
|
622
|
+
}
|
|
623
|
+
}
|
|
539
624
|
}
|
|
540
|
-
|
|
541
|
-
|
|
625
|
+
else if (onDisk) {
|
|
626
|
+
try {
|
|
627
|
+
// Migration for clones already on disk: re-stamp the tracking config
|
|
628
|
+
// the first time this process opens them, so a clone whose config
|
|
629
|
+
// drifted (duplicate fetch refspec / merge ref) is repaired before
|
|
630
|
+
// anything pulls it. Once per branch per process — the cached paths
|
|
631
|
+
// above return before reaching here.
|
|
632
|
+
await this.normalizeCloneConfig(repoDir, branch);
|
|
633
|
+
// Taken away meanwhile: nothing to adopt, clone below.
|
|
634
|
+
if (this.discardsOf(id) !== discardsAtAdoption)
|
|
635
|
+
throw new Error('the working copy was set aside');
|
|
636
|
+
this.registerBranchDir(branch, workspaceDir);
|
|
637
|
+
return this.buildWorkspaceInfo(branch, workspaceDir);
|
|
638
|
+
}
|
|
639
|
+
catch {
|
|
640
|
+
// No longer worth adopting — bootstrap below.
|
|
641
|
+
}
|
|
542
642
|
}
|
|
543
643
|
// Single-flight bootstrap. Concurrent callers for the same branch
|
|
544
644
|
// share the first one's promise instead of stacking clones.
|
|
645
|
+
//
|
|
646
|
+
// Recorded before any of it: a clone takes seconds, and the save that
|
|
647
|
+
// replaces the repository can land in the middle of one. Whatever this
|
|
648
|
+
// bootstrap produces is about the repository configured NOW, so if the
|
|
649
|
+
// working copy is taken away while it runs (`forgetClone`) the result must
|
|
650
|
+
// not be published — see `adoptBootstrapped`.
|
|
651
|
+
const discardsAtBootstrap = this.discardsOf(workspaceIdForBranch(branch));
|
|
545
652
|
let resolveBootstrap;
|
|
546
653
|
let rejectBootstrap;
|
|
547
654
|
const bootstrap = new Promise((res, rej) => {
|
|
@@ -552,20 +659,36 @@ export class WorkspaceService {
|
|
|
552
659
|
const existingBootstrap = this.inFlightBootstraps.get(branch);
|
|
553
660
|
if (existingBootstrap) {
|
|
554
661
|
await existingBootstrap;
|
|
555
|
-
this.
|
|
662
|
+
this.adoptBootstrapped(branch, workspaceDir, discardsAtBootstrap);
|
|
556
663
|
return this.buildWorkspaceInfo(branch, workspaceDir);
|
|
557
664
|
}
|
|
558
665
|
this.inFlightBootstraps.set(branch, bootstrap);
|
|
666
|
+
// `mkdir --recursive` answers with the first path it CREATED, or undefined
|
|
667
|
+
// when the directory was already there. That is the only honest signal for
|
|
668
|
+
// what the rollback below may remove: a directory this attempt made is ours
|
|
669
|
+
// to take back, one that predates us belongs to whatever put it there.
|
|
670
|
+
let createdWorkspaceDir;
|
|
559
671
|
try {
|
|
560
672
|
// A clone with `-b <branch>` against a never-seeded remote fails
|
|
561
673
|
// naturally; seeding the remote is the KB startup phase's job, at boot.
|
|
562
|
-
await fs.mkdir(workspaceDir, { recursive: true });
|
|
674
|
+
createdWorkspaceDir = await fs.mkdir(workspaceDir, { recursive: true });
|
|
563
675
|
await this.cloneProcessMapForBranch(workspaceDir, branch);
|
|
564
|
-
this.
|
|
676
|
+
this.adoptBootstrapped(branch, workspaceDir, discardsAtBootstrap);
|
|
565
677
|
resolveBootstrap();
|
|
566
678
|
}
|
|
567
679
|
catch (err) {
|
|
568
680
|
this.branchDirs.delete(branch);
|
|
681
|
+
// A bootstrap that failed leaves NOTHING behind. The clone rolls its own
|
|
682
|
+
// target back, but the workspace directory around it would survive as an
|
|
683
|
+
// empty shell named after the branch — and a directory named after a
|
|
684
|
+
// branch is read as the platform having known that branch: by
|
|
685
|
+
// `hasHeardOfBranch`, which would turn the next attempt's honest 404 into
|
|
686
|
+
// "no longer exists on the remote" (410), and by anyone reading the
|
|
687
|
+
// workspaces root. Best-effort: a rollback that cannot delete must not
|
|
688
|
+
// replace the real failure (the clone's) with its own.
|
|
689
|
+
if (createdWorkspaceDir !== undefined) {
|
|
690
|
+
await fs.rm(workspaceDir, { recursive: true, force: true }).catch(() => { });
|
|
691
|
+
}
|
|
569
692
|
rejectBootstrap(err);
|
|
570
693
|
throw err;
|
|
571
694
|
}
|
|
@@ -595,6 +718,30 @@ export class WorkspaceService {
|
|
|
595
718
|
kbDirName: this.kbDirName,
|
|
596
719
|
};
|
|
597
720
|
}
|
|
721
|
+
/**
|
|
722
|
+
* Publish a finished bootstrap's working copy to the branch→directory cache
|
|
723
|
+
* — unless the copy was taken out from under it while it ran.
|
|
724
|
+
*
|
|
725
|
+
* The save that replaces the knowledge-base repository sets every working
|
|
726
|
+
* copy aside and clears this cache (`forgetClone`), and a clone takes
|
|
727
|
+
* seconds: a bootstrap already in flight when that happens finishes
|
|
728
|
+
* afterwards, and a plain `registerBranchDir` would put the path back. The
|
|
729
|
+
* directory is gone (set aside), so every reader from then on gets an
|
|
730
|
+
* ENOENT off the fast path and nothing ever re-clones it — a cache entry
|
|
731
|
+
* is exactly what stops that.
|
|
732
|
+
*
|
|
733
|
+
* Refused rather than retried here: the address this bootstrap cloned from
|
|
734
|
+
* is not the one configured now, so there is nothing to salvage. The caller
|
|
735
|
+
* is told, and opening the branch again clones it from the new address.
|
|
736
|
+
*/
|
|
737
|
+
adoptBootstrapped(branch, workspaceDir, discardsAtStart) {
|
|
738
|
+
if (this.discardsOf(workspaceIdForBranch(branch)) !== discardsAtStart) {
|
|
739
|
+
this.branchDirs.delete(branch);
|
|
740
|
+
throw new Error(`The knowledge-base repository was replaced while the "${branch}" working copy was being created, so ` +
|
|
741
|
+
'that copy was set aside instead of being used. Open it again to get one of the new repository.');
|
|
742
|
+
}
|
|
743
|
+
this.registerBranchDir(branch, workspaceDir);
|
|
744
|
+
}
|
|
598
745
|
/**
|
|
599
746
|
* Await the in-flight bootstrap for a branch (if any). On reject —
|
|
600
747
|
* meaning the clone rolled back — drop the branch→dir mapping so the
|
|
@@ -620,6 +767,94 @@ export class WorkspaceService {
|
|
|
620
767
|
isBootstrapInFlight(branch) {
|
|
621
768
|
return this.inFlightBootstraps.has(branch);
|
|
622
769
|
}
|
|
770
|
+
/**
|
|
771
|
+
* Whether the clone at `repoDir` belongs to a repository OTHER than the
|
|
772
|
+
* configured one.
|
|
773
|
+
*
|
|
774
|
+
* Errs towards NO — "could not tell" must never delete someone's work:
|
|
775
|
+
* an address that cannot be read (no `origin`, a git that would not run)
|
|
776
|
+
* leaves the clone alone, and only two addresses that are read and differ
|
|
777
|
+
* in more than their spelling count as different repositories (see
|
|
778
|
+
* `kb-fs/remote-url.ts`). An UNCONFIGURED address answers no as well: a
|
|
779
|
+
* process that does not know where the repository is has no business
|
|
780
|
+
* declaring a clone stale.
|
|
781
|
+
*/
|
|
782
|
+
async isCloneOfAnotherRepository(repoDir) {
|
|
783
|
+
const configured = this.kbRepoUrl().trim();
|
|
784
|
+
if (configured === '')
|
|
785
|
+
return false;
|
|
786
|
+
let origin;
|
|
787
|
+
try {
|
|
788
|
+
const { stdout } = await this.gitRunner.run(repoDir, ['config', '--get', 'remote.origin.url']);
|
|
789
|
+
origin = stdout.trim();
|
|
790
|
+
}
|
|
791
|
+
catch {
|
|
792
|
+
return false;
|
|
793
|
+
}
|
|
794
|
+
if (origin === '' || sameRepository(origin, configured))
|
|
795
|
+
return false;
|
|
796
|
+
// Normalizing strips the userinfo but KEEPS the query string, and the
|
|
797
|
+
// knowledge-base address is one that may carry its credential there (a
|
|
798
|
+
// signed URL — see `urlQuerySecrets`). So the address is scrubbed on the
|
|
799
|
+
// way into the log, exactly as the startup phase scrubs its own.
|
|
800
|
+
log.warn(`the "${path.basename(path.dirname(repoDir))}" working copy is a clone of another repository ` +
|
|
801
|
+
`(${redactSecret(normalizeRepositoryAddress(origin), urlQuerySecrets(origin))}).`);
|
|
802
|
+
return true;
|
|
803
|
+
}
|
|
804
|
+
/**
|
|
805
|
+
* How many times each working copy has been taken out from under this
|
|
806
|
+
* process — see {@link forgetClone}. Deleting from the caches is not enough
|
|
807
|
+
* on a RUNNING server: work already in flight against the copy that went
|
|
808
|
+
* away finishes afterwards and writes its result back into those very
|
|
809
|
+
* caches. So every such reader records the count it started with and checks
|
|
810
|
+
* it before publishing: a count that moved means what it learned is about a
|
|
811
|
+
* working copy that no longer exists, and is dropped.
|
|
812
|
+
*
|
|
813
|
+
* Keyed by workspace id, which is what the phase announces and what both
|
|
814
|
+
* readers can derive (`workspaceIdForBranch`).
|
|
815
|
+
*/
|
|
816
|
+
discardCount = new Map();
|
|
817
|
+
/**
|
|
818
|
+
* Both readers and `forgetClone` go through this, so a caller's spelling of
|
|
819
|
+
* a workspace id can never make them disagree about which working copy is
|
|
820
|
+
* meant: the id is taken back to its branch and spelled afresh, which is the
|
|
821
|
+
* one form the phase announces.
|
|
822
|
+
*/
|
|
823
|
+
discardKey(workspaceId) {
|
|
824
|
+
return workspaceIdForBranch(branchForWorkspaceId(workspaceId));
|
|
825
|
+
}
|
|
826
|
+
discardsOf(workspaceId) {
|
|
827
|
+
return this.discardCount.get(this.discardKey(workspaceId)) ?? 0;
|
|
828
|
+
}
|
|
829
|
+
/**
|
|
830
|
+
* Forget everything this process remembers about a working copy that was
|
|
831
|
+
* taken away underneath it — the KB startup phase setting aside a clone of a
|
|
832
|
+
* repository that was replaced.
|
|
833
|
+
*
|
|
834
|
+
* At boot there is nothing to forget; this is for the save that changes the
|
|
835
|
+
* address on a RUNNING server, where `branchDirs` would otherwise keep
|
|
836
|
+
* answering with the path of a directory that is gone and no later caller
|
|
837
|
+
* would ever re-clone it. The branch NAME is deliberately left in
|
|
838
|
+
* `branchesEverHeardOf` — the branch was real, and that record outlives
|
|
839
|
+
* its clone.
|
|
840
|
+
*/
|
|
841
|
+
forgetClone(workspaceId) {
|
|
842
|
+
const branch = branchForWorkspaceId(workspaceId);
|
|
843
|
+
const workspaceDir = path.join(this.workspacesRoot, workspaceId);
|
|
844
|
+
const repoDir = path.join(workspaceDir, this.kbDirName);
|
|
845
|
+
this.discardCount.set(this.discardKey(workspaceId), this.discardsOf(workspaceId) + 1);
|
|
846
|
+
this.branchDirs.delete(branch);
|
|
847
|
+
this.lastFetchAt.delete(repoDir);
|
|
848
|
+
this.lastFetchOk.delete(repoDir);
|
|
849
|
+
// Dropped as well as un-stamped: the promise still running belongs to the
|
|
850
|
+
// working copy that went away, so a caller that joined it would be told a
|
|
851
|
+
// fetch of a directory that is gone refreshed the one that replaced it.
|
|
852
|
+
// The count above is what stops that promise re-stamping the TTL when it
|
|
853
|
+
// finally settles.
|
|
854
|
+
this.inFlightFetches.delete(repoDir);
|
|
855
|
+
// Keyed by branch, not by directory — see `stampCredentialHelper`.
|
|
856
|
+
this.stampedCredentialFingerprint.delete(branch);
|
|
857
|
+
}
|
|
623
858
|
/**
|
|
624
859
|
* Bring an adopted clone's config back to what a fresh clone would carry.
|
|
625
860
|
*
|
|
@@ -1138,14 +1373,25 @@ export class WorkspaceService {
|
|
|
1138
1373
|
// This driver runs outside the git layer's per-workspace mutex, so it may
|
|
1139
1374
|
// only run the safe implicit-fetch shape — see `SAFE_IMPLICIT_FETCH_ARGS`
|
|
1140
1375
|
// in `kb-fs/clone-config.ts` for the full rationale.
|
|
1376
|
+
// What this fetch is ABOUT: the working copy in that directory as it is
|
|
1377
|
+
// now. Should the repository be replaced while the fetch runs, the copy is
|
|
1378
|
+
// set aside and a fresh one is cloned to the SAME path — so stamping the
|
|
1379
|
+
// result afterwards would hand the new clone a freshness it never earned
|
|
1380
|
+
// (or a failure that was the old one's), and the next reader would skip
|
|
1381
|
+
// refreshing it for the whole TTL.
|
|
1382
|
+
const discardsAtFetch = this.discardsOf(workspaceId);
|
|
1383
|
+
const stillTheSameClone = () => this.discardsOf(workspaceId) === discardsAtFetch;
|
|
1141
1384
|
const promise = this.gitRunner
|
|
1142
1385
|
.run(repoDir, [...SAFE_IMPLICIT_FETCH_ARGS])
|
|
1143
1386
|
.then(() => {
|
|
1387
|
+
if (!stillTheSameClone())
|
|
1388
|
+
return;
|
|
1144
1389
|
this.lastFetchAt.set(repoDir, Date.now());
|
|
1145
1390
|
this.lastFetchOk.set(repoDir, true);
|
|
1146
1391
|
})
|
|
1147
1392
|
.catch((err) => {
|
|
1148
|
-
|
|
1393
|
+
if (stillTheSameClone())
|
|
1394
|
+
this.lastFetchOk.set(repoDir, false);
|
|
1149
1395
|
log.warn('git fetch origin failed:', { detail: redactError(err, this.gitRunner.credentials.token()) });
|
|
1150
1396
|
})
|
|
1151
1397
|
.finally(() => {
|
|
@@ -1528,10 +1774,10 @@ export class WorkspaceService {
|
|
|
1528
1774
|
*/
|
|
1529
1775
|
async unzipFile(workspaceId, zipWsPath, destDirWsPath,
|
|
1530
1776
|
/**
|
|
1531
|
-
* Per-extracted-path write guard
|
|
1532
|
-
*
|
|
1533
|
-
*
|
|
1534
|
-
*
|
|
1777
|
+
* Per-extracted-path write guard. Called with each entry's
|
|
1778
|
+
* workspace-relative target before it is written; if it throws, the entry
|
|
1779
|
+
* is skipped (with the thrown message as the reason) rather than aborting
|
|
1780
|
+
* the whole extraction. Omitted by non-agent / human callers.
|
|
1535
1781
|
*/
|
|
1536
1782
|
guardWrite) {
|
|
1537
1783
|
const { workspaceDir, relativePath: zipRelativePath, absolutePath: zipAbsolute } = await this.resolveInsideRepo(workspaceId, zipWsPath);
|
|
@@ -1640,10 +1886,10 @@ export class WorkspaceService {
|
|
|
1640
1886
|
const relForReport = path
|
|
1641
1887
|
.relative(workspaceDir, targetAbsolute)
|
|
1642
1888
|
.replace(/\\/g, '/');
|
|
1643
|
-
//
|
|
1644
|
-
//
|
|
1645
|
-
//
|
|
1646
|
-
//
|
|
1889
|
+
// An entry the write guard refuses is skipped, not extracted, so an
|
|
1890
|
+
// archive can't be a way around whatever the guard enforces. Runs before
|
|
1891
|
+
// any filesystem side effect — including directory creation — so a
|
|
1892
|
+
// refused entry leaves nothing behind on disk.
|
|
1647
1893
|
const allowEntry = async () => {
|
|
1648
1894
|
if (!guardWrite)
|
|
1649
1895
|
return true;
|
|
@@ -1652,7 +1898,7 @@ export class WorkspaceService {
|
|
|
1652
1898
|
return true;
|
|
1653
1899
|
}
|
|
1654
1900
|
catch (err) {
|
|
1655
|
-
skipped.push({ path: rawName, reason: err instanceof Error ? err.message : '
|
|
1901
|
+
skipped.push({ path: rawName, reason: err instanceof Error ? err.message : 'Refused before it was written' });
|
|
1656
1902
|
return false;
|
|
1657
1903
|
}
|
|
1658
1904
|
};
|