@bevel-software/platform-core-backend 0.22.0 → 0.24.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 +46 -13
- package/dist/core/create-core-server.js.map +1 -1
- package/dist/core/create-core-services.d.ts +12 -2
- package/dist/core/create-core-services.d.ts.map +1 -1
- package/dist/core/create-core-services.js +137 -24
- package/dist/core/create-core-services.js.map +1 -1
- package/dist/core/lifecycle.d.ts +46 -1
- package/dist/core/lifecycle.d.ts.map +1 -1
- package/dist/core/lifecycle.js +99 -13
- package/dist/core/lifecycle.js.map +1 -1
- package/dist/core-config.d.ts +16 -12
- package/dist/core-config.d.ts.map +1 -1
- package/dist/core-config.js +28 -13
- package/dist/core-config.js.map +1 -1
- package/dist/index.d.ts +6 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -3
- 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.routes.d.ts.map +1 -1
- package/dist/modules/access/access.routes.js +17 -16
- package/dist/modules/access/access.routes.js.map +1 -1
- package/dist/modules/access/directory-sync-bot.d.ts.map +1 -1
- package/dist/modules/access/directory-sync-bot.js +7 -3
- package/dist/modules/access/directory-sync-bot.js.map +1 -1
- package/dist/modules/agent-instructions/agent-instructions.routes.d.ts +8 -1
- package/dist/modules/agent-instructions/agent-instructions.routes.d.ts.map +1 -1
- package/dist/modules/agent-instructions/agent-instructions.routes.js +8 -2
- package/dist/modules/agent-instructions/agent-instructions.routes.js.map +1 -1
- package/dist/modules/agent-instructions/compose.d.ts +38 -6
- package/dist/modules/agent-instructions/compose.d.ts.map +1 -1
- package/dist/modules/agent-instructions/compose.js +39 -6
- package/dist/modules/agent-instructions/compose.js.map +1 -1
- package/dist/modules/agent-instructions/index.d.ts +2 -1
- package/dist/modules/agent-instructions/index.d.ts.map +1 -1
- package/dist/modules/agent-instructions/index.js +2 -1
- package/dist/modules/agent-instructions/index.js.map +1 -1
- package/dist/modules/agent-instructions/shared-file-rules.d.ts +115 -0
- package/dist/modules/agent-instructions/shared-file-rules.d.ts.map +1 -0
- package/dist/modules/agent-instructions/shared-file-rules.js +272 -0
- package/dist/modules/agent-instructions/shared-file-rules.js.map +1 -0
- package/dist/modules/audit/agent-audit.service.d.ts.map +1 -1
- package/dist/modules/audit/agent-audit.service.js +4 -2
- package/dist/modules/audit/agent-audit.service.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-erasure.service.d.ts.map +1 -1
- package/dist/modules/auth/account-erasure.service.js +57 -16
- package/dist/modules/auth/account-erasure.service.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 +70 -2
- package/dist/modules/auth/auth.service.d.ts.map +1 -1
- package/dist/modules/auth/auth.service.js +197 -18
- 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/code-mode/code-mode.tool.d.ts +20 -2
- package/dist/modules/code-mode/code-mode.tool.d.ts.map +1 -1
- package/dist/modules/code-mode/code-mode.tool.js +66 -35
- package/dist/modules/code-mode/code-mode.tool.js.map +1 -1
- package/dist/modules/database/connection.d.ts +16 -0
- package/dist/modules/database/connection.d.ts.map +1 -1
- package/dist/modules/database/connection.js +117 -0
- package/dist/modules/database/connection.js.map +1 -1
- package/dist/modules/database/core-schema.d.ts +337 -120
- package/dist/modules/database/core-schema.d.ts.map +1 -1
- package/dist/modules/database/core-schema.js +116 -58
- package/dist/modules/database/core-schema.js.map +1 -1
- package/dist/modules/database/migrate.d.ts +8 -0
- package/dist/modules/database/migrate.d.ts.map +1 -1
- package/dist/modules/database/migrate.js +271 -1
- package/dist/modules/database/migrate.js.map +1 -1
- 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/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/mcp.service.d.ts +8 -0
- package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
- package/dist/modules/mcp/mcp.service.js +38 -8
- 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 +3 -2
- package/dist/modules/mcp/oauth/bevel-oauth-provider.js.map +1 -1
- package/dist/modules/plugins/join-request-records.store.d.ts.map +1 -1
- package/dist/modules/plugins/join-request-records.store.js +7 -4
- package/dist/modules/plugins/join-request-records.store.js.map +1 -1
- package/dist/modules/settings/deployment-settings.service.d.ts.map +1 -1
- package/dist/modules/settings/deployment-settings.service.js +8 -3
- package/dist/modules/settings/deployment-settings.service.js.map +1 -1
- package/dist/modules/settings/setup.routes.d.ts +52 -1
- package/dist/modules/settings/setup.routes.d.ts.map +1 -1
- package/dist/modules/settings/setup.routes.js +207 -19
- package/dist/modules/settings/setup.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 +12 -4
- 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-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/tool-manuals/tool-manuals.tools.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.js +42 -31
- package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -1
- package/dist/modules/tool-registry/description-length.d.ts +80 -0
- package/dist/modules/tool-registry/description-length.d.ts.map +1 -0
- package/dist/modules/tool-registry/description-length.js +108 -0
- package/dist/modules/tool-registry/description-length.js.map +1 -0
- 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 +75 -35
- 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 +94 -0
- package/dist/modules/workflow/git/git.service.d.ts.map +1 -1
- package/dist/modules/workflow/git/git.service.js +193 -3
- package/dist/modules/workflow/git/git.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 +60 -1
- package/dist/modules/workflow/pending-commits.service.js.map +1 -1
- package/dist/modules/workflow/recovery-bot.d.ts.map +1 -1
- package/dist/modules/workflow/recovery-bot.js +7 -3
- package/dist/modules/workflow/recovery-bot.js.map +1 -1
- package/dist/modules/workflow/review-workflow/review-workflow.service.d.ts.map +1 -1
- package/dist/modules/workflow/review-workflow/review-workflow.service.js +12 -3
- package/dist/modules/workflow/review-workflow/review-workflow.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.service.d.ts +60 -6
- package/dist/modules/workflow/workflow.service.d.ts.map +1 -1
- package/dist/modules/workflow/workflow.service.js +115 -5
- 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/agent-upload.routes.d.ts +77 -0
- package/dist/modules/workspace/agent-upload.routes.d.ts.map +1 -0
- package/dist/modules/workspace/agent-upload.routes.js +210 -0
- package/dist/modules/workspace/agent-upload.routes.js.map +1 -0
- package/dist/modules/workspace/agent-upload.store.d.ts +284 -0
- package/dist/modules/workspace/agent-upload.store.d.ts.map +1 -0
- package/dist/modules/workspace/agent-upload.store.js +553 -0
- package/dist/modules/workspace/agent-upload.store.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 +59 -9
- package/dist/modules/workspace/startup/kb-startup-runner.d.ts.map +1 -1
- package/dist/modules/workspace/startup/kb-startup-runner.js +65 -24
- package/dist/modules/workspace/startup/kb-startup-runner.js.map +1 -1
- package/dist/modules/workspace/startup/steps/seed-tree.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/seed-tree.js +3 -3
- package/dist/modules/workspace/startup/steps/seed-tree.js.map +1 -1
- package/dist/modules/workspace/startup/steps/template-source.d.ts +40 -0
- package/dist/modules/workspace/startup/steps/template-source.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/template-source.js +46 -4
- package/dist/modules/workspace/startup/steps/template-source.js.map +1 -1
- package/dist/modules/workspace/upload-limits.d.ts +13 -0
- package/dist/modules/workspace/upload-limits.d.ts.map +1 -0
- package/dist/modules/workspace/upload-limits.js +13 -0
- package/dist/modules/workspace/upload-limits.js.map +1 -0
- package/dist/modules/workspace/workspace.routes.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.routes.js +93 -4
- package/dist/modules/workspace/workspace.routes.js.map +1 -1
- package/dist/modules/workspace/workspace.service.d.ts +128 -5
- package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.service.js +316 -58
- package/dist/modules/workspace/workspace.service.js.map +1 -1
- package/dist/modules/workspace/workspace.tools.d.ts +13 -11
- package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.tools.js +791 -198
- package/dist/modules/workspace/workspace.tools.js.map +1 -1
- package/dist/modules/workspace/write-denial.d.ts +0 -6
- package/dist/modules/workspace/write-denial.d.ts.map +1 -1
- package/dist/modules/workspace/write-denial.js +0 -6
- package/dist/modules/workspace/write-denial.js.map +1 -1
- package/dist/modules/workspace/zip-entry-rules.d.ts +114 -0
- package/dist/modules/workspace/zip-entry-rules.d.ts.map +1 -0
- package/dist/modules/workspace/zip-entry-rules.js +154 -0
- package/dist/modules/workspace/zip-entry-rules.js.map +1 -0
- 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/column-crypto.d.ts +194 -0
- package/dist/shared/column-crypto.d.ts.map +1 -0
- package/dist/shared/column-crypto.js +144 -0
- package/dist/shared/column-crypto.js.map +1 -0
- package/dist/shared/domain-errors.d.ts +25 -0
- package/dist/shared/domain-errors.d.ts.map +1 -1
- package/dist/shared/domain-errors.js +28 -0
- package/dist/shared/domain-errors.js.map +1 -1
- package/dist/shared/git.contract.d.ts +20 -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/shared/token-crypto.d.ts.map +1 -1
- package/dist/shared/token-crypto.js +25 -1
- package/dist/shared/token-crypto.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 +1 -2
- package/dist/tenancy/static-tenant-source.js.map +1 -1
- package/dist/tenancy/tenant-secrets.d.ts +5 -1
- package/dist/tenancy/tenant-secrets.d.ts.map +1 -1
- package/dist/tenancy/tenant-secrets.js +4 -0
- package/dist/tenancy/tenant-secrets.js.map +1 -1
- package/kb-template/AGENTS.md +2 -0
- package/migrations/0014_change_request_closed_reason.sql +1 -0
- package/migrations/0015_account_deactivation.sql +3 -0
- package/migrations/0016_pii_encryption.sql +20 -0
- package/migrations/meta/0014_snapshot.json +2265 -0
- package/migrations/meta/0015_snapshot.json +2271 -0
- package/migrations/meta/0016_snapshot.json +2327 -0
- package/migrations/meta/_journal.json +21 -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 +241 -5
- 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 +52 -16
- package/src/core/create-core-services.ts +156 -24
- package/src/core/lifecycle.ts +117 -13
- package/src/core-config.ts +31 -14
- package/src/index.ts +30 -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.routes.prospective.test.ts +6 -7
- package/src/modules/access/__tests__/users-db-double.ts +21 -12
- 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.routes.ts +17 -16
- package/src/modules/access/directory-sync-bot.ts +7 -3
- package/src/modules/agent-instructions/__tests__/agent-instructions.route.test.ts +11 -5
- package/src/modules/agent-instructions/__tests__/compose.test.ts +19 -10
- package/src/modules/agent-instructions/__tests__/shared-file-rules.test.ts +238 -0
- package/src/modules/agent-instructions/agent-instructions.routes.ts +12 -2
- package/src/modules/agent-instructions/compose.ts +50 -7
- package/src/modules/agent-instructions/index.ts +12 -0
- package/src/modules/agent-instructions/shared-file-rules.ts +314 -0
- package/src/modules/audit/agent-audit.service.ts +4 -2
- package/src/modules/auth/__tests__/account-deactivation.test.ts +253 -0
- package/src/modules/auth/__tests__/account-erasure.approval-gate.test.ts +6 -2
- package/src/modules/auth/__tests__/account.routes.test.ts +87 -6
- package/src/modules/auth/__tests__/auth.middleware.test.ts +45 -22
- package/src/modules/auth/__tests__/auth.service.test.ts +4 -2
- package/src/modules/auth/account-admission.ts +78 -9
- package/src/modules/auth/account-erasure.service.ts +69 -18
- 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 +206 -23
- package/src/modules/auth/oidc-auth-provider.ts +7 -2
- package/src/modules/code-mode/__tests__/chain-runtime.e2e.test.ts +335 -0
- package/src/modules/code-mode/__tests__/code-mode.tool.test.ts +46 -2
- package/src/modules/code-mode/code-mode.tool.ts +80 -34
- package/src/modules/database/__tests__/connection.test.ts +12 -0
- package/src/modules/database/__tests__/pii-backfill.pg.test.ts +561 -0
- package/src/modules/database/connection.ts +117 -0
- package/src/modules/database/core-schema.ts +116 -58
- package/src/modules/database/migrate.ts +353 -1
- package/src/modules/kb-fs/__tests__/branch-name.test.ts +10 -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/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.e2e.test.ts +4 -3
- package/src/modules/mcp/__tests__/mcp.service.test.ts +115 -13
- package/src/modules/mcp/mcp-auth.middleware.ts +20 -6
- package/src/modules/mcp/mcp.service.ts +46 -7
- package/src/modules/mcp/oauth/bevel-oauth-provider.ts +3 -1
- package/src/modules/plugins/__tests__/plugins.tools.test.ts +2 -1
- package/src/modules/plugins/join-request-records.store.ts +7 -4
- package/src/modules/settings/__tests__/deployment-settings.service.test.ts +16 -0
- package/src/modules/settings/__tests__/setup.routes.git-mode.test.ts +91 -58
- package/src/modules/settings/__tests__/setup.routes.github-app.test.ts +25 -8
- package/src/modules/settings/__tests__/setup.routes.managed-phase.test.ts +14 -11
- 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 +8 -3
- package/src/modules/settings/setup.routes.ts +263 -19
- 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__/skills.service.test.ts +229 -5
- 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 +12 -4
- 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-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/tool-manuals/tool-manuals.tools.ts +44 -31
- package/src/modules/tool-registry/__tests__/tool-description-length.test.ts +378 -0
- package/src/modules/tool-registry/description-length.ts +111 -0
- 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.repository-replaced.test.ts +249 -0
- package/src/modules/workflow/agent-tools/__tests__/workflow.tools.test.ts +264 -6
- package/src/modules/workflow/agent-tools/change-request-summary.ts +182 -0
- package/src/modules/workflow/agent-tools/workflow.tools.ts +86 -35
- 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.prFetchFailure.test.ts +170 -0
- package/src/modules/workflow/git/git.service.ts +215 -1
- package/src/modules/workflow/pending-commits.service.ts +64 -2
- package/src/modules/workflow/recovery-bot.ts +7 -3
- package/src/modules/workflow/review-workflow/__tests__/carry-approvals-forward.test.ts +4 -0
- package/src/modules/workflow/review-workflow/__tests__/erase-approver.test.ts +25 -3
- package/src/modules/workflow/review-workflow/review-workflow.service.ts +12 -3
- package/src/modules/workflow/workflow-hooks.ts +64 -26
- package/src/modules/workflow/workflow.service.ts +125 -5
- package/src/modules/workspace/__tests__/agent-access.gate.test.ts +208 -0
- package/src/modules/workspace/__tests__/agent-uploads.test.ts +1604 -0
- package/src/modules/workspace/__tests__/escape-sequences.routes.test.ts +394 -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.any-workspace-credentials.test.ts +156 -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 +402 -0
- package/src/modules/workspace/__tests__/workspace.service.test.ts +77 -9
- package/src/modules/workspace/__tests__/workspace.tools.agents-file.test.ts +41 -39
- package/src/modules/workspace/__tests__/workspace.tools.branch-errors.test.ts +2 -3
- package/src/modules/workspace/__tests__/workspace.tools.test.ts +766 -56
- package/src/modules/workspace/agent-access.gate.ts +164 -0
- package/src/modules/workspace/agent-upload.routes.ts +214 -0
- package/src/modules/workspace/agent-upload.store.ts +668 -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 +86 -0
- package/src/modules/workspace/startup/kb-startup-runner.ts +115 -34
- package/src/modules/workspace/startup/steps/__tests__/steps.test.ts +9 -9
- package/src/modules/workspace/startup/steps/seed-tree.ts +3 -6
- package/src/modules/workspace/startup/steps/template-source.ts +53 -5
- package/src/modules/workspace/upload-limits.ts +12 -0
- package/src/modules/workspace/workspace.routes.ts +96 -5
- package/src/modules/workspace/workspace.service.ts +319 -61
- package/src/modules/workspace/workspace.tools.ts +894 -214
- package/src/modules/workspace/write-denial.ts +0 -8
- package/src/modules/workspace/zip-entry-rules.ts +173 -0
- 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/__tests__/column-crypto.test.ts +217 -0
- package/src/shared/column-crypto.ts +218 -0
- package/src/shared/domain-errors.ts +31 -0
- package/src/shared/git.contract.ts +27 -0
- package/src/shared/token-crypto.ts +28 -1
- package/src/tenancy/__tests__/static-tenant-source.test.ts +4 -1
- package/src/tenancy/static-tenant-source.ts +1 -3
- package/src/tenancy/tenant-secrets.ts +5 -1
- 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
package/src/core/lifecycle.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { Server } from 'node:http';
|
|
2
2
|
import { closeDb, type Database } from '../modules/database/connection.js';
|
|
3
3
|
import type { AdvisoryLease } from '../modules/database/advisory-lock.js';
|
|
4
|
-
import {
|
|
4
|
+
import { bootMaySurvive, type KbStartupRunner } from '../modules/workspace/startup/kb-startup-runner.js';
|
|
5
5
|
import { noteBesideCheckout } from '../modules/workspace/startup/beside-checkout.js';
|
|
6
6
|
import { unregisterBevelSecretsVariableLoader } from '../modules/secrets-vault/secrets-variable-loader.js';
|
|
7
7
|
import type { WorkflowService } from '../modules/workflow/workflow.service.js';
|
|
@@ -164,7 +164,13 @@ export function holdCommitWorkerLease(
|
|
|
164
164
|
running = false;
|
|
165
165
|
wake?.();
|
|
166
166
|
await loop;
|
|
167
|
+
// The worker is asked to stop whether or not this process is running
|
|
168
|
+
// it: a worker that can be held still (`holdable`) may be in the
|
|
169
|
+
// middle of a hold that uses the database, and its stop is what
|
|
170
|
+
// waits for that. Stopping a worker that is not running is nothing.
|
|
171
|
+
const idle = !workerRunning && !stopping;
|
|
167
172
|
await stopWorker();
|
|
173
|
+
if (idle) await worker.stop().catch((err: unknown) => log(`commit worker stop failed: ${String(err)}`));
|
|
168
174
|
await lease.release();
|
|
169
175
|
})();
|
|
170
176
|
return stopped;
|
|
@@ -202,6 +208,80 @@ export function withStartupTask(
|
|
|
202
208
|
};
|
|
203
209
|
}
|
|
204
210
|
|
|
211
|
+
/** A worker the lease loop drives, which something else may hold still for a while. */
|
|
212
|
+
export interface HoldableWorker extends LeasedWorker {
|
|
213
|
+
/**
|
|
214
|
+
* Run `work` with the worker stopped, and start it again afterwards if the
|
|
215
|
+
* lease loop still wants it running. A hold waits for the commit in flight
|
|
216
|
+
* to finish, as a stop does. Holds may overlap; the worker starts again
|
|
217
|
+
* when the last one ends, whether `work` resolved or threw.
|
|
218
|
+
*/
|
|
219
|
+
whileHeld<T>(work: () => Promise<T>): Promise<T>;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* A worker that can be HELD STILL without the lease loop knowing.
|
|
224
|
+
*
|
|
225
|
+
* The lease loop decides whether this process is the one draining the commit
|
|
226
|
+
* queue; it starts the worker when the lease is taken and stops it when the
|
|
227
|
+
* lease is lost. Moving the deployment to another repository needs a second,
|
|
228
|
+
* independent reason for the worker not to run: while working copies are
|
|
229
|
+
* being set aside and cloned again, a queued commit must not be written into
|
|
230
|
+
* a directory that is being renamed away, nor into the fresh clone of a
|
|
231
|
+
* repository it was never meant for. Stopping the loop itself would release
|
|
232
|
+
* the lease, and another process would take the queue over mid-move.
|
|
233
|
+
*
|
|
234
|
+
* So the two reasons are kept apart. `wanted` is the lease loop's word,
|
|
235
|
+
* `holds` counts the moves in flight, and the worker runs exactly when it is
|
|
236
|
+
* wanted and nothing holds it.
|
|
237
|
+
*
|
|
238
|
+
* A stop waits for the holds in flight as well as for the worker. Shutdown
|
|
239
|
+
* awaits this stop (bounded by its own budget) before it ends the database
|
|
240
|
+
* pool, and a move still setting copies aside and cloning needs that pool:
|
|
241
|
+
* it is either finished, or known to have been cut.
|
|
242
|
+
*/
|
|
243
|
+
export function holdable(worker: LeasedWorker): HoldableWorker {
|
|
244
|
+
let wanted = false;
|
|
245
|
+
const inFlight = new Set<Promise<unknown>>();
|
|
246
|
+
/**
|
|
247
|
+
* ONE stop at a time, shared by everyone who asks. A worker's own stop is
|
|
248
|
+
* idempotent by answering a second caller at once, while the first is
|
|
249
|
+
* still waiting for the commit in flight; a second hold given that answer
|
|
250
|
+
* would set a working copy aside under that commit.
|
|
251
|
+
*/
|
|
252
|
+
let stopping: Promise<void> | null = null;
|
|
253
|
+
const stopWorker = (): Promise<void> => {
|
|
254
|
+
stopping ??= worker.stop().finally(() => {
|
|
255
|
+
stopping = null;
|
|
256
|
+
});
|
|
257
|
+
return stopping;
|
|
258
|
+
};
|
|
259
|
+
return {
|
|
260
|
+
start() {
|
|
261
|
+
wanted = true;
|
|
262
|
+
if (inFlight.size === 0) worker.start();
|
|
263
|
+
},
|
|
264
|
+
async stop() {
|
|
265
|
+
wanted = false;
|
|
266
|
+
await stopWorker();
|
|
267
|
+
await Promise.allSettled([...inFlight]);
|
|
268
|
+
},
|
|
269
|
+
whileHeld<T>(work: () => Promise<T>): Promise<T> {
|
|
270
|
+
const held = (async () => {
|
|
271
|
+
await stopWorker();
|
|
272
|
+
return work();
|
|
273
|
+
})();
|
|
274
|
+
inFlight.add(held);
|
|
275
|
+
const ended = (): void => {
|
|
276
|
+
inFlight.delete(held);
|
|
277
|
+
if (inFlight.size === 0 && wanted) worker.start();
|
|
278
|
+
};
|
|
279
|
+
held.then(ended, ended);
|
|
280
|
+
return held;
|
|
281
|
+
},
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
|
|
205
285
|
/**
|
|
206
286
|
* What one knowledge base's graph needs of itself to be STARTED: the boot
|
|
207
287
|
* side effects that used to run inside `createCoreServer`, named so a host
|
|
@@ -228,7 +308,8 @@ export interface BootableCore {
|
|
|
228
308
|
* jobs. `createCoreServer` runs this for a single-tenant deployment; a host
|
|
229
309
|
* serving several knowledge bases runs it when a tenant is activated.
|
|
230
310
|
*
|
|
231
|
-
* Throws to stop the boot on every failure but
|
|
311
|
+
* Throws to stop the boot on every failure but the ones the host answered
|
|
312
|
+
* about the repository or the credentials (see `bootMaySurvive`) — the
|
|
232
313
|
* container's restart policy is the retry — see `kb-startup-runner.ts`.
|
|
233
314
|
*/
|
|
234
315
|
export async function startCore<C extends BootableCore>(
|
|
@@ -267,18 +348,22 @@ export async function startCore<C extends BootableCore>(
|
|
|
267
348
|
try {
|
|
268
349
|
await core.kbStartupRunner.runAll();
|
|
269
350
|
} catch (err) {
|
|
270
|
-
// The
|
|
271
|
-
//
|
|
272
|
-
//
|
|
273
|
-
//
|
|
274
|
-
//
|
|
351
|
+
// The failures a boot survives: the host ANSWERED about the repository or
|
|
352
|
+
// the credentials, or could not be reached at all. None of them says
|
|
353
|
+
// anything about the knowledge base — what we would write is not known to
|
|
354
|
+
// be wrong — and every one of them is fixed somewhere else: the host comes
|
|
355
|
+
// back, the repository is created, the token is granted access, a rotated
|
|
356
|
+
// token is typed into the setup screen. Refusing to boot took away the
|
|
357
|
+
// login and setup screens the fix is entered on, and on 2026-09-28 a
|
|
358
|
+
// repository that had been replaced crash-looped a deployment for exactly
|
|
359
|
+
// that reason. The deployment comes up GATED instead: the setup routes
|
|
275
360
|
// read the runner's standing failure and keep the app shut, the setup
|
|
276
|
-
// screen shows why, saving it retries, and the runner keeps trying on
|
|
277
|
-
//
|
|
278
|
-
//
|
|
279
|
-
if (!(err
|
|
280
|
-
startupLog.error('booting UNMAINTAINED and gated — the knowledge
|
|
281
|
-
detail: err.message,
|
|
361
|
+
// screen shows why, saving it retries, and the runner keeps trying on its
|
|
362
|
+
// own. Every other failure still stops the boot, because it means the
|
|
363
|
+
// template or a step would write something wrong. See `bootMaySurvive`.
|
|
364
|
+
if (!bootMaySurvive(err)) throw err;
|
|
365
|
+
startupLog.error('booting UNMAINTAINED and gated — the knowledge base could not be initialized:', {
|
|
366
|
+
detail: err instanceof Error ? err.message : String(err),
|
|
282
367
|
});
|
|
283
368
|
// Kept on the graph so that stopping the graph stops the asking: a
|
|
284
369
|
// retry that outlived its graph would clone into a workspaces folder
|
|
@@ -343,6 +428,15 @@ export interface CoreStopDeps {
|
|
|
343
428
|
* to it. Optional: a caller that has not built them yet passes nothing.
|
|
344
429
|
*/
|
|
345
430
|
backgroundJobs?: { stopSweeping(): void; drain(): Promise<void> };
|
|
431
|
+
/**
|
|
432
|
+
* The agent upload store, whose own sweep deletes staged bytes nobody
|
|
433
|
+
* applied. Stopped with this graph because the next graph for the same
|
|
434
|
+
* tenant stages into the SAME directory with an empty record map: a sweep
|
|
435
|
+
* left running from a store that is gone would read the replacement's files
|
|
436
|
+
* as orphans and delete them under an apply that is about to read them.
|
|
437
|
+
* Optional: a caller that has not built one passes nothing.
|
|
438
|
+
*/
|
|
439
|
+
agentUploadStore?: { stopSweeping(): void; drainSweep(): Promise<void> };
|
|
346
440
|
/** The startup phase's retry, if the boot left one asking — see {@link BootableCore.startupRetry}. */
|
|
347
441
|
startupRetry?: { stop(): void } | null;
|
|
348
442
|
/** The database — its pool is ended last, once nothing above can still need it. */
|
|
@@ -426,6 +520,10 @@ async function releaseCore(deps: CoreStopDeps, remaining: () => number, log: (m:
|
|
|
426
520
|
// earliest point the interval is dead weight. Synchronous and unfailing
|
|
427
521
|
// — it just clears an interval — so it needs no budget of its own.
|
|
428
522
|
deps.backgroundJobs?.stopSweeping();
|
|
523
|
+
// And the upload store's sweep, for the same reason and in the same breath:
|
|
524
|
+
// synchronous, and it only clears an interval and tells a sweep already
|
|
525
|
+
// running to stop deleting.
|
|
526
|
+
deps.agentUploadStore?.stopSweeping();
|
|
429
527
|
// A startup phase still asking for an unreachable remote stops asking:
|
|
430
528
|
// synchronous, and nothing after it must be able to clone into a
|
|
431
529
|
// workspaces folder that is about to belong to nobody.
|
|
@@ -439,6 +537,12 @@ async function releaseCore(deps: CoreStopDeps, remaining: () => number, log: (m:
|
|
|
439
537
|
if (deps.backgroundJobs) {
|
|
440
538
|
await bounded(deps.backgroundJobs.drain(), remaining(), 'finishing the background jobs', log);
|
|
441
539
|
}
|
|
540
|
+
// The sweep in flight when the interval was cleared: awaited so the next
|
|
541
|
+
// graph for this tenant cannot start staging bytes while a store it has
|
|
542
|
+
// never heard of is still walking the same directory.
|
|
543
|
+
if (deps.agentUploadStore) {
|
|
544
|
+
await bounded(deps.agentUploadStore.drainSweep(), remaining(), 'finishing the upload sweep', log);
|
|
545
|
+
}
|
|
442
546
|
await bounded(deps.commitWorker.stop(), remaining(), 'stopping the commit worker', log);
|
|
443
547
|
if (deps.secretsScope !== undefined) unregisterBevelSecretsVariableLoader(deps.secretsScope);
|
|
444
548
|
await bounded(closeDb(deps.db), remaining(), 'ending the database pool', log);
|
package/src/core-config.ts
CHANGED
|
@@ -6,6 +6,8 @@ import { assertKeyDecodesTo32Bytes } from './shared/token-crypto.js';
|
|
|
6
6
|
import { DEFAULT_GIT_TIMEOUT_MS } from './modules/workflow/git/node-git-runner.js';
|
|
7
7
|
import { DEFAULT_DB_SCHEMA, assertSchemaName } from './modules/database/connection.js';
|
|
8
8
|
import { logger } from './shared/logging.js';
|
|
9
|
+
import { hasControlCharacter } from './modules/kb-fs/repo-path.js';
|
|
10
|
+
import { sanitizedPath } from './shared/printable.js';
|
|
9
11
|
|
|
10
12
|
const log = logger('config');
|
|
11
13
|
|
|
@@ -86,6 +88,7 @@ export interface TenantConfig {
|
|
|
86
88
|
readonly workspacesRoot: string;
|
|
87
89
|
readonly backupsRoot: string;
|
|
88
90
|
readonly spillRoot: string;
|
|
91
|
+
readonly agentUploadsRoot: string;
|
|
89
92
|
readonly docExtractCacheRoot: string;
|
|
90
93
|
readonly jwtSecret: string;
|
|
91
94
|
readonly adminEmail: string;
|
|
@@ -100,7 +103,6 @@ export interface TenantConfig {
|
|
|
100
103
|
readonly gitUsername: string;
|
|
101
104
|
readonly gitToken: string;
|
|
102
105
|
readonly kbTemplateDir: string;
|
|
103
|
-
readonly ontologySessionBlock: boolean;
|
|
104
106
|
readonly updateCheckEnabled: boolean;
|
|
105
107
|
readonly loginPasswordEnabled: boolean;
|
|
106
108
|
readonly allowedEmailDomains: string[];
|
|
@@ -183,6 +185,21 @@ export class CoreConfig implements TenantConfig, ProcessConfig {
|
|
|
183
185
|
* never committed, best-effort GC'd on write.
|
|
184
186
|
*/
|
|
185
187
|
readonly spillRoot: string;
|
|
188
|
+
/**
|
|
189
|
+
* Sibling-to-`workspacesRoot` location for the bytes an agent uploads with
|
|
190
|
+
* `request_file_upload`, held until `apply_file_upload` lands them (or their
|
|
191
|
+
* token expires, whichever comes first). BESIDE the workspaces, never inside
|
|
192
|
+
* one, and that placement is the point: an upload is content the server has
|
|
193
|
+
* accepted but not yet judged, so no file tool may name it — every workspace
|
|
194
|
+
* path resolves against a branch's checkout, and there is no spelling of one
|
|
195
|
+
* that reaches in here. Ephemeral and never committed.
|
|
196
|
+
*
|
|
197
|
+
* `AGENT_UPLOADS_ROOT` overrides it, and the placement is CHECKED at boot
|
|
198
|
+
* (`assertUploadsRootOutsideWorkspaces`): a value inside `workspacesRoot` —
|
|
199
|
+
* or one that resolves there through a link — refuses to start rather than
|
|
200
|
+
* quietly staging unjudged bytes where the file tools read.
|
|
201
|
+
*/
|
|
202
|
+
readonly agentUploadsRoot: string;
|
|
186
203
|
/**
|
|
187
204
|
* Sibling-to-`workspacesRoot` location for the document-extraction cache —
|
|
188
205
|
* text extracted from office documents/PDFs (`read_file`/`grep`), keyed by
|
|
@@ -259,17 +276,6 @@ export class CoreConfig implements TenantConfig, ProcessConfig {
|
|
|
259
276
|
* existing one. Override with `KB_TEMPLATE_DIR`.
|
|
260
277
|
*/
|
|
261
278
|
readonly kbTemplateDir: string;
|
|
262
|
-
/**
|
|
263
|
-
* Ontology-session boundary kill-switch. When true (default), an agent run
|
|
264
|
-
* that has read across more than one ontology can no longer write. A no-op on
|
|
265
|
-
* a single-ontology KB. Set `ONTOLOGY_SESSION_BLOCK=false` to disable.
|
|
266
|
-
*
|
|
267
|
-
* Stays on CORE config (not `AppConfig`) even though the write BLOCK itself
|
|
268
|
-
* is an enterprise-registered hook: the flag also switches off the core-owned
|
|
269
|
-
* touch TRACKING (the gate skips entirely when false — see
|
|
270
|
-
* `session-ontology.gate.ts`), so it must exist wherever the tracking runs.
|
|
271
|
-
*/
|
|
272
|
-
readonly ontologySessionBlock: boolean;
|
|
273
279
|
/**
|
|
274
280
|
* In-app update check. When true (default), `GET /api/update-check` lazily
|
|
275
281
|
* asks api.github.com for the newest Hexis release — only when an admin's
|
|
@@ -390,6 +396,8 @@ export class CoreConfig implements TenantConfig, ProcessConfig {
|
|
|
390
396
|
this.workspacesRoot = process.env.WORKSPACES_ROOT || path.resolve(process.cwd(), 'workspaces');
|
|
391
397
|
this.backupsRoot = process.env.BACKUPS_ROOT || path.resolve(this.workspacesRoot, '..', 'backups');
|
|
392
398
|
this.spillRoot = process.env.SPILL_ROOT || path.resolve(this.workspacesRoot, '..', 'tool-chain-spills');
|
|
399
|
+
this.agentUploadsRoot =
|
|
400
|
+
process.env.AGENT_UPLOADS_ROOT || path.resolve(this.workspacesRoot, '..', 'agent-uploads');
|
|
393
401
|
this.docExtractCacheRoot =
|
|
394
402
|
process.env.DOC_EXTRACT_CACHE_ROOT || path.resolve(this.workspacesRoot, '..', 'doc-extract-cache');
|
|
395
403
|
// Required, and checked BEFORE the auth routes it signs for are ever
|
|
@@ -469,8 +477,6 @@ export class CoreConfig implements TenantConfig, ProcessConfig {
|
|
|
469
477
|
// Default: the `kb-template/` folder shipped inside this package (works
|
|
470
478
|
// both from src/ and compiled dist/ — see assets.ts).
|
|
471
479
|
this.kbTemplateDir = process.env.KB_TEMPLATE_DIR || defaultKbTemplateDir();
|
|
472
|
-
this.ontologySessionBlock =
|
|
473
|
-
(process.env.ONTOLOGY_SESSION_BLOCK ?? 'true').trim().toLowerCase() !== 'false';
|
|
474
480
|
this.updateCheckEnabled =
|
|
475
481
|
(process.env.UPDATE_CHECK ?? 'true').trim().toLowerCase() !== 'false';
|
|
476
482
|
this.allowedEmailDomains = (process.env.ALLOWED_EMAIL_DOMAINS || '')
|
|
@@ -621,5 +627,16 @@ export class CoreConfig implements TenantConfig, ProcessConfig {
|
|
|
621
627
|
) {
|
|
622
628
|
throw new Error(`KB_DIR_NAME must be a single path segment: ${this.kbDirName}`);
|
|
623
629
|
}
|
|
630
|
+
// A control character, a line break above all: this name is PREFIXED onto
|
|
631
|
+
// every workspace-relative path, and a line break in a path is a separator
|
|
632
|
+
// in git's line-oriented stdin protocols (`cat-file --batch` reads one
|
|
633
|
+
// `<ref>:<path>` per line). A name carrying one would make the normaliser
|
|
634
|
+
// emit the very path it refuses from a caller — so the deployment fails to
|
|
635
|
+
// boot rather than resolving paths nothing downstream can safely read.
|
|
636
|
+
if (hasControlCharacter(this.kbDirName)) {
|
|
637
|
+
throw new Error(
|
|
638
|
+
`KB_DIR_NAME must not contain a control character: "${sanitizedPath(this.kbDirName)}"`,
|
|
639
|
+
);
|
|
640
|
+
}
|
|
624
641
|
}
|
|
625
642
|
}
|
package/src/index.ts
CHANGED
|
@@ -52,18 +52,36 @@ export { coreMigrationsDir, defaultKbTemplateDir } from './assets.js';
|
|
|
52
52
|
export {
|
|
53
53
|
runCoreMigrations,
|
|
54
54
|
runEnterpriseMigrations,
|
|
55
|
+
runPiiEncryptionBackfill,
|
|
55
56
|
} from './modules/database/migrate.js';
|
|
56
57
|
export {
|
|
57
58
|
getDb,
|
|
58
59
|
createDb,
|
|
59
60
|
closeDb,
|
|
60
61
|
dbSchemaOf,
|
|
62
|
+
piiKeysOf,
|
|
61
63
|
assertSchemaName,
|
|
62
64
|
DEFAULT_DB_SCHEMA,
|
|
63
65
|
type Database,
|
|
64
66
|
type DbOptions,
|
|
65
67
|
} from './modules/database/connection.js';
|
|
66
68
|
|
|
69
|
+
// PII column encryption (see shared/column-crypto.ts). The key belongs to the
|
|
70
|
+
// database handle (`createDb(url, { piiKey })`), so an overlay seals its own
|
|
71
|
+
// schema's columns by declaring them `encryptedText` / `blindIndexText` and
|
|
72
|
+
// running on the handle the composition root built. `derivePiiKeys` and
|
|
73
|
+
// `piiKeysOf` are for code that handles the stored form itself: SQL written
|
|
74
|
+
// by hand, or a process that reads a knowledge base's tables without a handle
|
|
75
|
+
// of this package's.
|
|
76
|
+
export {
|
|
77
|
+
encryptedText,
|
|
78
|
+
blindIndexText,
|
|
79
|
+
derivePiiKeys,
|
|
80
|
+
isEncryptedBlob,
|
|
81
|
+
PII_CIPHERTEXT_PREFIX,
|
|
82
|
+
type PiiKeys,
|
|
83
|
+
} from './shared/column-crypto.js';
|
|
84
|
+
|
|
67
85
|
// Build identity surfaced by GET /api/health.
|
|
68
86
|
export { GIT_SHA, resolveGitSha } from './version.js';
|
|
69
87
|
|
|
@@ -101,8 +119,18 @@ export type {
|
|
|
101
119
|
export type { ILlmUsageMeter } from './modules/tool-auth/llm-usage-meter.js';
|
|
102
120
|
export type { AuthProviderPlugin } from './modules/auth/auth.routes.js';
|
|
103
121
|
export type { IErasureParticipant } from './modules/auth/account-erasure.service.js';
|
|
122
|
+
export {
|
|
123
|
+
alwaysWritable,
|
|
124
|
+
READ_ONLY_CODE,
|
|
125
|
+
type IWriteAccess,
|
|
126
|
+
type WriteAccessVerdict,
|
|
127
|
+
} from './modules/write-access/write-access.js';
|
|
104
128
|
export {
|
|
105
129
|
AccountAdmissionRefusedError,
|
|
130
|
+
AccountDeactivatedError,
|
|
131
|
+
AccountChangeRefusedError,
|
|
132
|
+
AuthBackendError,
|
|
133
|
+
ACCOUNT_DEACTIVATED_MESSAGE,
|
|
106
134
|
admitEveryone,
|
|
107
135
|
type AccountAdmissionVerdict,
|
|
108
136
|
type AccountProvisionReason,
|
|
@@ -112,6 +140,7 @@ export {
|
|
|
112
140
|
WorkflowHooks,
|
|
113
141
|
type CommitValidationHook,
|
|
114
142
|
type CommitValidationContext,
|
|
143
|
+
type AgentOperationContext,
|
|
144
|
+
type AgentReadHook,
|
|
115
145
|
type PreWriteHook,
|
|
116
|
-
type PreWriteContext,
|
|
117
146
|
} from './modules/workflow/workflow-hooks.js';
|