@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
|
@@ -9,11 +9,12 @@ import { AccessControlService } from '../access-control.service.js';
|
|
|
9
9
|
import { holderPrincipals } from '../access-view.js';
|
|
10
10
|
|
|
11
11
|
/**
|
|
12
|
-
* `prospectiveHolders`: who can open and edit a file where it
|
|
13
|
-
* could once a move puts it somewhere else. Driven over a real
|
|
14
|
-
* through the public resolver, because the whole point is that
|
|
15
|
-
* side must be the SAME resolution as a real one — the
|
|
16
|
-
*
|
|
12
|
+
* `prospectiveHolders`: who can open and edit a file or folder where it
|
|
13
|
+
* sits, and who could once a move puts it somewhere else. Driven over a real
|
|
14
|
+
* on-disk tree through the public resolver, because the whole point is that
|
|
15
|
+
* the "after" side must be the SAME resolution as a real one — the
|
|
16
|
+
* destination's folder chain with whatever travels laid over it, a file's own
|
|
17
|
+
* frontmatter or a folder's `access.md` files — for a path that does not
|
|
17
18
|
* exist yet and therefore cannot be asked for in the ordinary way.
|
|
18
19
|
*/
|
|
19
20
|
|
|
@@ -136,25 +137,100 @@ describe('AccessControlService.prospectiveHolders', () => {
|
|
|
136
137
|
expect(holderPrincipals(before.read)).toContainEqual({ kind: 'group', name: 'Engineering' });
|
|
137
138
|
});
|
|
138
139
|
|
|
139
|
-
|
|
140
|
+
/**
|
|
141
|
+
* A folder carries its own `access.md`, and that file MOVES WITH IT. The
|
|
142
|
+
* resolver used to refuse the question rather than answer it as if the
|
|
143
|
+
* folder were a file — the right refusal for the wrong reason, since the
|
|
144
|
+
* answer it could not give is the one a folder move actually needs.
|
|
145
|
+
*/
|
|
146
|
+
it('answers a folder source with the rules it carries, at the path they land on', async () => {
|
|
140
147
|
const svc = await makeService(TREE);
|
|
141
148
|
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
149
|
+
const { before, after } = await svc.prospectiveHolders(
|
|
150
|
+
workspaceId,
|
|
151
|
+
'Knowledge/Legal',
|
|
152
|
+
'Knowledge/Sales/Legal',
|
|
153
|
+
);
|
|
154
|
+
|
|
155
|
+
// `Knowledge/Legal/access.md` travels, so Engineering keeps both verbs at
|
|
156
|
+
// the new path — the rules the folder brings, not the ones it is landing
|
|
157
|
+
// among. Read as a FILE the answer would have been Product's, from
|
|
158
|
+
// `Knowledge/Sales/access.md` alone.
|
|
159
|
+
expect(names(before.read)).toContain('Engineering');
|
|
160
|
+
expect(names(before.write)).toContain('Engineering');
|
|
161
|
+
expect(names(after.read)).toContain('Engineering');
|
|
162
|
+
expect(names(after.write)).toContain('Engineering');
|
|
163
|
+
});
|
|
164
|
+
|
|
165
|
+
it('leaves the old parent behind and picks the new one up', async () => {
|
|
166
|
+
const svc = await makeService({
|
|
167
|
+
...TREE,
|
|
168
|
+
// Engineering's write on Team comes from Legal above it, not from Team.
|
|
169
|
+
'Knowledge/Legal/Team/access.md': rules('read:\n - Product\n'),
|
|
170
|
+
'Knowledge/Legal/Team/plan.md': '# Plan\n',
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
const { before, after } = await svc.prospectiveHolders(
|
|
174
|
+
workspaceId,
|
|
175
|
+
'Knowledge/Legal/Team',
|
|
176
|
+
'Knowledge/Sales/Team',
|
|
177
|
+
);
|
|
178
|
+
|
|
179
|
+
expect(names(before.write)).toContain('Engineering');
|
|
180
|
+
// Sales grants nobody write, and Team's own file grants only read — so
|
|
181
|
+
// the write Team held by inheritance does not come along.
|
|
182
|
+
expect(names(after.write)).not.toContain('Engineering');
|
|
183
|
+
expect(names(after.read)).toContain('Product');
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
it('a rename of a folder that grants its own access changes nothing', async () => {
|
|
187
|
+
const svc = await makeService(TREE);
|
|
188
|
+
|
|
189
|
+
const { before, after } = await svc.prospectiveHolders(
|
|
190
|
+
workspaceId,
|
|
191
|
+
'Knowledge/Legal',
|
|
192
|
+
'Knowledge/Revenue',
|
|
193
|
+
);
|
|
194
|
+
|
|
195
|
+
expect(names(after.read)).toEqual(names(before.read));
|
|
196
|
+
expect(names(after.write)).toEqual(names(before.write));
|
|
197
|
+
});
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* A SYMLINK is neither of the two shapes the preview knows. `move_file`
|
|
201
|
+
* refuses a symlink source outright (`assertNoSymlinkOnPath`), so a link to
|
|
202
|
+
* a directory must not be described as a folder taking its `access.md`
|
|
203
|
+
* files along — that would promise the target's rules at a path nothing is
|
|
204
|
+
* ever going to arrive at. Nothing is read through the link either.
|
|
205
|
+
*/
|
|
206
|
+
it('a symlink to a folder is not previewed as the folder it points at', async () => {
|
|
207
|
+
const svc = await makeService(TREE);
|
|
208
|
+
const repo = path.join(root, workspaceId, KB_DIR);
|
|
209
|
+
await fs.symlink(path.join(repo, 'Knowledge/Legal'), path.join(repo, 'Knowledge/Sales/alias'));
|
|
210
|
+
|
|
211
|
+
const { after } = await svc.prospectiveHolders(
|
|
212
|
+
workspaceId,
|
|
213
|
+
'Knowledge/Sales/alias',
|
|
214
|
+
'Knowledge/alias',
|
|
215
|
+
);
|
|
216
|
+
|
|
217
|
+
// Legal's own rules stayed behind the link: `Knowledge/` has no
|
|
218
|
+
// `access.md`, so nobody holds anything at the destination.
|
|
219
|
+
expect(names(after.read)).not.toContain('Engineering');
|
|
220
|
+
expect(names(after.write)).not.toContain('Engineering');
|
|
148
221
|
});
|
|
149
222
|
|
|
150
223
|
it('a probe that fails for any reason but absence throws, never a silent "file"', async () => {
|
|
151
224
|
const svc = await makeService(TREE);
|
|
152
|
-
// A disk fault (EACCES here) must never read as "not a directory":
|
|
153
|
-
//
|
|
154
|
-
//
|
|
155
|
-
//
|
|
156
|
-
|
|
157
|
-
|
|
225
|
+
// A disk fault (EACCES here) must never read as "not a directory": the
|
|
226
|
+
// probe is what chooses between the two resolutions, so a folder read as
|
|
227
|
+
// a file would be answered with frontmatter it does not have and without
|
|
228
|
+
// the `access.md` files it carries — the wrong principals, named with
|
|
229
|
+
// the same confidence as the right ones. Spied rather than staged with
|
|
230
|
+
// mode bits, so the property holds as root and on Windows too. `lstat`,
|
|
231
|
+
// because that is the probe: a symlink is classified by what it IS.
|
|
232
|
+
const real = fs.lstat;
|
|
233
|
+
const spy = vi.spyOn(fs, 'lstat').mockImplementation(((p: string) =>
|
|
158
234
|
String(p).endsWith('contract.md')
|
|
159
235
|
? Promise.reject(Object.assign(new Error('EACCES: permission denied'), { code: 'EACCES' }))
|
|
160
236
|
: (real as (p: string) => Promise<unknown>).call(fs, p)) as never);
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
2
|
+
import { execFile } from 'node:child_process';
|
|
3
|
+
import { promisify } from 'node:util';
|
|
4
|
+
import fs from 'node:fs/promises';
|
|
5
|
+
import path from 'node:path';
|
|
6
|
+
import os from 'node:os';
|
|
7
|
+
|
|
8
|
+
import { spliceGrant } from '../../access-model/access-splice.js';
|
|
9
|
+
import { pendingProposals } from '../../plugins/join-proposals.js';
|
|
10
|
+
|
|
11
|
+
const execFileAsync = promisify(execFile);
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* WHY A REQUEST BRANCH IS CUT AGAIN FROM LIVE, proved against real git.
|
|
15
|
+
*
|
|
16
|
+
* Opening a change request merges the target branch INTO its source branch.
|
|
17
|
+
* A request branch survives being declined — that is what lets the dialog say
|
|
18
|
+
* "your last request wasn't accepted" — so the next request finds a branch
|
|
19
|
+
* whose base may be old. Writing the new proposal onto it and opening the
|
|
20
|
+
* request then asks git to merge live into a branch that edited the same
|
|
21
|
+
* rules file from a different starting point, and git does what git does.
|
|
22
|
+
*
|
|
23
|
+
* The person asking is told to "resolve on reader2/join-artest3-04i7dr4", a
|
|
24
|
+
* branch they cannot reach, and every retry says the same thing. There is no
|
|
25
|
+
* route out of it for them, which is what made this worth a fix rather than a
|
|
26
|
+
* better error message.
|
|
27
|
+
*
|
|
28
|
+
* Everything below is plain git on a scratch repo: no app, no doubles. The
|
|
29
|
+
* first case is the bug, kept so the fix cannot quietly stop being necessary;
|
|
30
|
+
* the second is the fix.
|
|
31
|
+
*/
|
|
32
|
+
describe('a request branch whose base has moved', () => {
|
|
33
|
+
let root: string;
|
|
34
|
+
let repo: string;
|
|
35
|
+
|
|
36
|
+
const RULES = 'Research/access.md';
|
|
37
|
+
const LIVE = 'live';
|
|
38
|
+
const REQUEST = 'reader2/join-research-abc1234-def5678';
|
|
39
|
+
const RITA = { kind: 'user' as const, email: 'rita@x.io', displayName: 'Rita' };
|
|
40
|
+
const RAVI = { kind: 'user' as const, email: 'ravi@x.io', displayName: 'Ravi' };
|
|
41
|
+
|
|
42
|
+
const git = (...args: string[]) => execFileAsync('git', ['-C', repo, ...args]);
|
|
43
|
+
|
|
44
|
+
const readRules = async () => fs.readFile(path.join(repo, RULES), 'utf-8');
|
|
45
|
+
const writeRules = async (text: string) => {
|
|
46
|
+
await fs.mkdir(path.dirname(path.join(repo, RULES)), { recursive: true });
|
|
47
|
+
await fs.writeFile(path.join(repo, RULES), text);
|
|
48
|
+
};
|
|
49
|
+
const commit = async (message: string) => {
|
|
50
|
+
await git('add', '-A');
|
|
51
|
+
await git('commit', '-q', '-m', message);
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
/** What opening a change request does: merge live INTO the request branch. */
|
|
55
|
+
async function mergeLiveIntoRequest(): Promise<{ ok: boolean; conflicted: string[] }> {
|
|
56
|
+
try {
|
|
57
|
+
await git('merge', '--no-edit', LIVE);
|
|
58
|
+
return { ok: true, conflicted: [] };
|
|
59
|
+
} catch {
|
|
60
|
+
const { stdout } = await execFileAsync('git', [
|
|
61
|
+
'-C',
|
|
62
|
+
repo,
|
|
63
|
+
'diff',
|
|
64
|
+
'--name-only',
|
|
65
|
+
'--diff-filter=U',
|
|
66
|
+
]);
|
|
67
|
+
await git('merge', '--abort');
|
|
68
|
+
return { ok: false, conflicted: stdout.split('\n').filter(Boolean) };
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
beforeEach(async () => {
|
|
73
|
+
root = await fs.mkdtemp(path.join(os.tmpdir(), 'bevel-recut-'));
|
|
74
|
+
repo = path.join(root, 'kb');
|
|
75
|
+
await fs.mkdir(repo, { recursive: true });
|
|
76
|
+
await git('init', '-q', '-b', LIVE);
|
|
77
|
+
await git('config', 'user.email', 'test@bevel.software');
|
|
78
|
+
await git('config', 'user.name', 'Test');
|
|
79
|
+
await writeRules('---\n---\nowner:\n - Ed <ed@x.io>\n');
|
|
80
|
+
await commit('the rules as they were');
|
|
81
|
+
|
|
82
|
+
// Ravi asked for Owner, and it was declined. The branch stays behind.
|
|
83
|
+
await git('checkout', '-q', '-b', REQUEST);
|
|
84
|
+
await writeRules(spliceGrant(await readRules(), 'owner', RAVI, { target: 'folder' }).text);
|
|
85
|
+
await commit('Request owner access to Research');
|
|
86
|
+
await git('checkout', '-q', LIVE);
|
|
87
|
+
|
|
88
|
+
// Then an editor grants somebody else Can edit here — an ordinary click in
|
|
89
|
+
// the dialog, and the only thing this scenario needs to go wrong.
|
|
90
|
+
await writeRules(spliceGrant(await readRules(), 'write', RITA, { target: 'folder' }).text);
|
|
91
|
+
await commit('Ed grants Rita Can edit');
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
afterEach(async () => {
|
|
95
|
+
await fs.rm(root, { recursive: true, force: true });
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
it('CONFLICTS when the stale branch is written to and the request opened on it', async () => {
|
|
99
|
+
// What this did before: splice onto live's text, write it to the branch as
|
|
100
|
+
// it stands, open the request. The content is right; the history is not.
|
|
101
|
+
await git('checkout', '-q', REQUEST);
|
|
102
|
+
const live = await execFileAsync('git', ['-C', repo, 'show', `${LIVE}:${RULES}`]);
|
|
103
|
+
await writeRules(spliceGrant(live.stdout, 'write', RAVI, { target: 'folder' }).text);
|
|
104
|
+
await commit('Request can edit access to Research');
|
|
105
|
+
|
|
106
|
+
const merged = await mergeLiveIntoRequest();
|
|
107
|
+
expect(merged.ok).toBe(false);
|
|
108
|
+
expect(merged.conflicted).toEqual([RULES]);
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
it('is CLEAN once the branch is cut again from live first', async () => {
|
|
112
|
+
// The fix: the answered request's branch is deleted and recut from live,
|
|
113
|
+
// so live's tip is the merge base and there is nothing to reconcile.
|
|
114
|
+
await git('branch', '-q', '-D', REQUEST);
|
|
115
|
+
await git('checkout', '-q', '-b', REQUEST, LIVE);
|
|
116
|
+
await writeRules(spliceGrant(await readRules(), 'write', RAVI, { target: 'folder' }).text);
|
|
117
|
+
await commit('Request can edit access to Research');
|
|
118
|
+
|
|
119
|
+
const merged = await mergeLiveIntoRequest();
|
|
120
|
+
expect(merged.ok).toBe(true);
|
|
121
|
+
|
|
122
|
+
// And the branch proposes exactly one thing — asked of the function the
|
|
123
|
+
// app itself asks, rather than of the diff's line-by-line shape (a splice
|
|
124
|
+
// may rewrite a whole block without proposing anything more). Rita's
|
|
125
|
+
// grant is already on live, so it is nothing new; the declined Owner
|
|
126
|
+
// proposal went with the branch that carried it.
|
|
127
|
+
const branchText = (await execFileAsync('git', ['-C', repo, 'show', `${REQUEST}:${RULES}`]))
|
|
128
|
+
.stdout;
|
|
129
|
+
const liveText = (await execFileAsync('git', ['-C', repo, 'show', `${LIVE}:${RULES}`])).stdout;
|
|
130
|
+
expect(pendingProposals(branchText, liveText, RULES)).toEqual([
|
|
131
|
+
expect.objectContaining({ verb: 'write', id: `user:${RAVI.email}` }),
|
|
132
|
+
]);
|
|
133
|
+
});
|
|
134
|
+
});
|