@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
|
@@ -1,161 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Ontology-session boundary — the per-call gate used by the agent tool handlers.
|
|
3
|
-
*
|
|
4
|
-
* One decision fn, called by every gated file/graph handler:
|
|
5
|
-
* READS (isWrite=false) record the touched ontology and always allow.
|
|
6
|
-
* WRITES (isWrite=true) run the registered BLOCKING `preWrite` hooks
|
|
7
|
-
* (`WorkflowHooks`), then record. The core registers
|
|
8
|
-
* no hook, so core alone only TRACKS; the enterprise
|
|
9
|
-
* overlay registers the ontology block (see
|
|
10
|
-
* `modules/kb/ontology-block.hook.ts`), restoring
|
|
11
|
-
* "allowed only while the session is confined to a
|
|
12
|
-
* single ontology; once it has touched ≥2, all
|
|
13
|
-
* writes are blocked".
|
|
14
|
-
*
|
|
15
|
-
* Skips entirely when: the flag is off, the path is neutral (`ontologyOf` →
|
|
16
|
-
* null), the caller is not an agent, or the caller is the recovery bot. Fails
|
|
17
|
-
* CLOSED for an agent named-path operation that carries no `sessionId`.
|
|
18
|
-
*
|
|
19
|
-
* Lives beside `assertCanRead` in the workspace tools — it does NOT touch
|
|
20
|
-
* `acquireLock` (that gate is protected-branch-only; this boundary applies on
|
|
21
|
-
* all branches and to reads). See `docs/rp4-ontology-boundary-plan-v2.md`.
|
|
22
|
-
*/
|
|
23
|
-
import { ontologyOf } from '../../shared/kb-layout.js';
|
|
24
|
-
import { ToolError } from '../tool-helpers/tool.contract.js';
|
|
25
|
-
/**
|
|
26
|
-
* The `sessionId` input the ontology-session boundary reads: the agent run /
|
|
27
|
-
* conversation id. The in-process agent supplies its thread id automatically
|
|
28
|
-
* (via its per-run internal token); an external agent has no ambient run id,
|
|
29
|
-
* so it must first mint one with the `start_session` tool and then pass it
|
|
30
|
-
* EXPLICITLY on every gated call — the MCP proxy is a pure passthrough and
|
|
31
|
-
* never injects args.
|
|
32
|
-
*/
|
|
33
|
-
export const SESSION_ID_INPUT = {
|
|
34
|
-
type: 'string',
|
|
35
|
-
description: 'The KnowledgeBase session id that scopes this run to one ontology. External agents (direct MCP calls and `call_tool_chain` alike): call the `start_session` tool ONCE at the very start of your work to obtain it, then pass that id here on EVERY gated call. The in-process agent runtime supplies this automatically (do not set it yourself).',
|
|
36
|
-
};
|
|
37
|
-
/**
|
|
38
|
-
* Boundary warning appended to ontology-gated tool descriptions so the agent
|
|
39
|
-
* knows the restriction before it calls one. Action-then-why phrasing per
|
|
40
|
-
* docs/glossary.md.
|
|
41
|
-
*/
|
|
42
|
-
export const ONTOLOGY_BOUNDARY_NOTE = ' Stay within one KnowledgeBase ontology per conversation: once this run has read or written files in two different ontologies, every later content write (write_file/edit_file/mkdir/unzip, and both endpoints of move_file/copy_file) is blocked with a 403 and no override. Reads, delete_file and delete_folder never block — but each one records the ontology it touched and can poison a later content write, so do broad cross-ontology exploration only when you do not intend to write. Note move_file/copy_file are blocked outright when source and destination are different ontologies, since they would carry content across.';
|
|
43
|
-
/** Thrown when a write is refused because the session has crossed ontologies. */
|
|
44
|
-
export class OntologyWriteBlockedError extends ToolError {
|
|
45
|
-
constructor(touched, attempted, reason) {
|
|
46
|
-
const msg = reason === 'multi-ontology'
|
|
47
|
-
? `This conversation has already read across multiple ontologies (${touched.join(', ')}), so writing is no longer allowed. Start a new conversation to write to "${attempted}".`
|
|
48
|
-
: `This conversation is working in ${touched.join(', ')}, so it can't write to a different ontology ("${attempted}"). Start a new conversation to work in "${attempted}".`;
|
|
49
|
-
super(msg, 403);
|
|
50
|
-
this.name = 'OntologyWriteBlockedError';
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
/** Thrown when an agent op on a named ontology carries no session id (fail closed). */
|
|
54
|
-
export class MissingSessionError extends ToolError {
|
|
55
|
-
constructor() {
|
|
56
|
-
super('This operation needs a KnowledgeBase session id and none was provided. Call the `start_session` tool once at the start of your work to obtain a sessionId, then pass it explicitly as `sessionId` on every gated call (direct MCP calls and `call_tool_chain` alike).', 403);
|
|
57
|
-
this.name = 'MissingSessionError';
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
/** Only internal/external agent callers are gated; `session` (browser JWT) and humans are not. */
|
|
61
|
-
function isAgentSource(ctx) {
|
|
62
|
-
return ctx.source === 'internal' || ctx.source === 'external';
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Shared gate preamble for the two per-path operations below. Returns `'skip'`
|
|
66
|
-
* when the boundary doesn't apply to this call (flag off, neutral path,
|
|
67
|
-
* non-agent caller, or recovery bot), otherwise the session id to evaluate
|
|
68
|
-
* against — throwing `MissingSessionError` (fail closed) when an agent op on a
|
|
69
|
-
* named ontology carries none.
|
|
70
|
-
*/
|
|
71
|
-
function resolveGatedSession(gate, ctx, wsPath) {
|
|
72
|
-
if (!gate.enabled)
|
|
73
|
-
return 'skip';
|
|
74
|
-
// Neutral paths never pin/record/block — skip before any identity work.
|
|
75
|
-
if (ontologyOf(wsPath, gate.kb.layout, gate.kb.kbDirName) === null)
|
|
76
|
-
return 'skip';
|
|
77
|
-
// Humans (UI routes) and browser-JWT callers never hit these tools; only
|
|
78
|
-
// agent tool calls are gated.
|
|
79
|
-
if (!isAgentSource(ctx))
|
|
80
|
-
return 'skip';
|
|
81
|
-
// The recovery/merge bot legitimately spans ontologies — exempt by identity.
|
|
82
|
-
if (ctx.user.email.toLowerCase() === gate.recoveryBotEmail)
|
|
83
|
-
return 'skip';
|
|
84
|
-
// Fail closed: an agent operation on a named ontology must carry a session id.
|
|
85
|
-
if (!ctx.sessionId)
|
|
86
|
-
throw new MissingSessionError();
|
|
87
|
-
return ctx.sessionId;
|
|
88
|
-
}
|
|
89
|
-
/**
|
|
90
|
-
* Record a read of `wsPath`'s ontology into the session's touched set. Reads are
|
|
91
|
-
* always allowed — recording is the only effect — but each one widens the
|
|
92
|
-
* touched set and so can poison a later write (see {@link assertOntologyWriteAllowed}).
|
|
93
|
-
* Fails closed (`MissingSessionError`) for an agent read of a named ontology
|
|
94
|
-
* with no session id.
|
|
95
|
-
*/
|
|
96
|
-
export async function recordOntologyRead(gate, ctx, wsPath) {
|
|
97
|
-
const sessionId = resolveGatedSession(gate, ctx, wsPath);
|
|
98
|
-
if (sessionId === 'skip')
|
|
99
|
-
return;
|
|
100
|
-
// checkOperation(isWrite=false) records the touch and always allows.
|
|
101
|
-
await gate.service.checkOperation(sessionId, wsPath, false, gate.kb.kbDirName);
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* Assert a write to `wsPath` is allowed, then record it. A write that would
|
|
105
|
-
* carry information into a second ontology is the thing the boundary blocks:
|
|
106
|
-
* permitted only while the session stays confined to the target ontology, and
|
|
107
|
-
* refused with `OntologyWriteBlockedError` once it has touched ≥2. Note `delete`
|
|
108
|
-
* is NOT a write here — removing a node propagates no cross-ontology
|
|
109
|
-
* information, so it goes through {@link recordOntologyRead}.
|
|
110
|
-
*
|
|
111
|
-
* The BLOCKING decision itself lives behind the `preWrite` hooks: the
|
|
112
|
-
* enterprise-registered ontology block evaluates-and-records atomically via
|
|
113
|
-
* `checkOperation(isWrite=true)` and throws to refuse (identical behavior to
|
|
114
|
-
* the previous in-gate decision). Core registers no hook, so with none the
|
|
115
|
-
* write is allowed and only the touch is recorded (tracking stays core). The
|
|
116
|
-
* follow-up read-record after the hooks is idempotent — a no-op when a hook
|
|
117
|
-
* already recorded the allowed write.
|
|
118
|
-
*/
|
|
119
|
-
export async function assertOntologyWriteAllowed(gate, ctx, wsPath) {
|
|
120
|
-
const sessionId = resolveGatedSession(gate, ctx, wsPath);
|
|
121
|
-
if (sessionId === 'skip')
|
|
122
|
-
return;
|
|
123
|
-
await gate.hooks.runPreWrite({ kind: 'file-write', sessionId, wsPath });
|
|
124
|
-
// Tracking stays core: record the (now-allowed) write's ontology touch.
|
|
125
|
-
// A blocked write never reaches this line, so it records nothing — same as
|
|
126
|
-
// before the hook split.
|
|
127
|
-
await gate.service.checkOperation(sessionId, wsPath, false, gate.kb.kbDirName);
|
|
128
|
-
}
|
|
129
|
-
/**
|
|
130
|
-
* Session-level write-eligibility gate for write-capable tools that have no
|
|
131
|
-
* single resolvable target path to check per-call — currently `execute_command`
|
|
132
|
-
* (arbitrary shell). Such a tool cannot be path-confined, so we enforce the
|
|
133
|
-
* boundary at the coarser session level: once the run has crossed into ≥2
|
|
134
|
-
* ontologies (the point at which EVERY path-checked write is already refused),
|
|
135
|
-
* we refuse the tool outright, so shell can't become a write path around the
|
|
136
|
-
* boundary. A fresh or single-ontology session is still allowed; a residual gap
|
|
137
|
-
* remains (a single-ontology session could shell-write a *different* ontology),
|
|
138
|
-
* accepted because arbitrary shell cannot be path-confined and blocking all
|
|
139
|
-
* shell after one KB read would gut its read-style diagnostic use (git/grep/ls).
|
|
140
|
-
*
|
|
141
|
-
* Skips when: the flag is off, the caller is not an agent, the caller is the
|
|
142
|
-
* recovery bot, or there is no session id — there is no named path here to fail
|
|
143
|
-
* closed on, and with no session there is no touched set to evaluate.
|
|
144
|
-
*
|
|
145
|
-
* Like {@link assertOntologyWriteAllowed}, the refusal itself is the
|
|
146
|
-
* enterprise-registered `preWrite` hook's (it evaluates the touched set and
|
|
147
|
-
* throws); core registers none, so shell is never refused in a core-only
|
|
148
|
-
* deployment.
|
|
149
|
-
*/
|
|
150
|
-
export async function assertShellAllowedWithinOntology(gate, ctx) {
|
|
151
|
-
if (!gate.enabled)
|
|
152
|
-
return;
|
|
153
|
-
if (!isAgentSource(ctx))
|
|
154
|
-
return;
|
|
155
|
-
if (ctx.user.email.toLowerCase() === gate.recoveryBotEmail)
|
|
156
|
-
return;
|
|
157
|
-
if (!ctx.sessionId)
|
|
158
|
-
return;
|
|
159
|
-
await gate.hooks.runPreWrite({ kind: 'shell', sessionId: ctx.sessionId });
|
|
160
|
-
}
|
|
161
|
-
//# sourceMappingURL=session-ontology.gate.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session-ontology.gate.js","sourceRoot":"","sources":["../../../src/modules/workspace/session-ontology.gate.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import { type KbLayout, type Ontology } from '@bevel-software/platform-shared';
|
|
2
|
-
/**
|
|
3
|
-
* Resolve the named ontology a KB path belongs to, or `null` (neutral) when it
|
|
4
|
-
* belongs to none.
|
|
5
|
-
*
|
|
6
|
-
* Classification is deliberately NARROWER than the kb-graph parser: the parser
|
|
7
|
-
* discovers ontologies under every `ONTOLOGY_ROOTS` entry (`KnowledgeBase/`
|
|
8
|
-
* AND `Data/`), but this function classifies ONLY `KnowledgeBase/` paths.
|
|
9
|
-
* `Data/` ontologies are parsed into the graph yet are intentionally NOT
|
|
10
|
-
* classified here, so the session-ontology gate treats `Data/` paths as
|
|
11
|
-
* neutral — pipeline agents read knowledge and write data records in one
|
|
12
|
-
* session (owner decision 2026-07-27; the cross-ontology boundary mechanism
|
|
13
|
-
* itself may be redesigned). This divergence is on purpose, not drift.
|
|
14
|
-
*
|
|
15
|
-
* Within `KnowledgeBase/`, the shape matches the parser (`parser.ts`
|
|
16
|
-
* `walkForOntologies`): an ontology is the directory that holds both a
|
|
17
|
-
* `Knowledge/` and a `NodeTypes/` subfolder. That directory can sit at ANY
|
|
18
|
-
* depth under `KnowledgeBase/`, so the ontology id is the path PREFIX up to
|
|
19
|
-
* (but excluding) the first `Knowledge/` or `NodeTypes/` marker segment — as
|
|
20
|
-
* long as that prefix is inside `KnowledgeBase/` and is not `KnowledgeBase/`
|
|
21
|
-
* itself.
|
|
22
|
-
*
|
|
23
|
-
* KnowledgeBase/Product/Knowledge/Foo.md → "KnowledgeBase/Product"
|
|
24
|
-
* KnowledgeBase/IT Architecture/NodeTypes/T.md → "KnowledgeBase/IT Architecture"
|
|
25
|
-
* KnowledgeBase/Group/Sub/Knowledge/x.md → "KnowledgeBase/Group/Sub"
|
|
26
|
-
* KnowledgeBase/Knowledge/Foo.md → null (marker directly under KB root)
|
|
27
|
-
* Knowledge/Foo.md, Skills/x.md, access.md → null (not under KnowledgeBase/)
|
|
28
|
-
* Data/Ops/Knowledge/x.md → null (Data/ is exempt — see above)
|
|
29
|
-
* KnowledgeBase/Product/Uploads/x.png → null (no marker segment)
|
|
30
|
-
*
|
|
31
|
-
* Uses exact segment equality (never substring), so `KnowledgeBase/` and
|
|
32
|
-
* `Knowledge-notes.md` are never treated as markers; space-safe; pure (no IO).
|
|
33
|
-
*
|
|
34
|
-
* @param path repo-root-relative POSIX path (may carry a `kbDirName` prefix)
|
|
35
|
-
* @param layout the knowledge base's layout — names its `KnowledgeBase/` root
|
|
36
|
-
* @param kbDirName optional on-disk clone folder prefix to strip first
|
|
37
|
-
*/
|
|
38
|
-
export declare function ontologyOf(path: string, layout: KbLayout, kbDirName?: string): Ontology;
|
|
39
|
-
//# sourceMappingURL=kb-layout.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"kb-layout.d.ts","sourceRoot":"","sources":["../../src/shared/kb-layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,KAAK,QAAQ,EAAE,KAAK,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAkDjG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,QAAQ,CAevF"}
|
package/dist/shared/kb-layout.js
DELETED
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
import { ONTOLOGY_MARKERS } from '@bevel-software/platform-shared';
|
|
2
|
-
/**
|
|
3
|
-
* Resolve which named ontology a KB path belongs to — the backend-side
|
|
4
|
-
* implementation of the layout contract whose constants/types live in
|
|
5
|
-
* `@bevel-software/platform-shared` (`kb-layout.ts`). It is backend-only and consumed by
|
|
6
|
-
* more than one domain module (the `workspace` read gate and the `workflow`
|
|
7
|
-
* session-ontology service), so it lives in `backend/src/shared` rather than in
|
|
8
|
-
* any single module — importable by both modules without crossing a module's
|
|
9
|
-
* internal boundary. Note it does NOT mirror the kb-graph parser one-to-one:
|
|
10
|
-
* see the `ontologyOf` docstring for the deliberate `Data/` exemption.
|
|
11
|
-
*
|
|
12
|
-
* Pure string handling — no IO, no DB.
|
|
13
|
-
*/
|
|
14
|
-
/**
|
|
15
|
-
* Split a path into repo-root-relative POSIX segments, dropping `./`,
|
|
16
|
-
* leading/trailing slashes, and an optional `kbDirName` prefix (the on-disk
|
|
17
|
-
* clone folder, e.g. `knowledge-base/`). Pure string handling — no IO.
|
|
18
|
-
*/
|
|
19
|
-
function toSegments(path, kbDirName) {
|
|
20
|
-
// Collapse to canonical segments: backslashes → `/`, drop empty and `.`
|
|
21
|
-
// segments, resolve `..` against the accumulated prefix. Canonicalizing the
|
|
22
|
-
// inner segments (not just the ends) means equivalent paths like
|
|
23
|
-
// `KnowledgeBase/Product/../Product/Knowledge/x.md` and
|
|
24
|
-
// `KnowledgeBase/Product/Knowledge/x.md` resolve to the same ontology.
|
|
25
|
-
const collapse = (s) => {
|
|
26
|
-
const out = [];
|
|
27
|
-
for (const seg of s.replace(/\\/g, '/').split('/')) {
|
|
28
|
-
if (seg === '' || seg === '.')
|
|
29
|
-
continue;
|
|
30
|
-
if (seg === '..') {
|
|
31
|
-
// Pop a real segment; a leading `..` (nothing to pop) is kept so it can
|
|
32
|
-
// never alias into a sibling ontology.
|
|
33
|
-
if (out.length > 0 && out[out.length - 1] !== '..')
|
|
34
|
-
out.pop();
|
|
35
|
-
else
|
|
36
|
-
out.push('..');
|
|
37
|
-
continue;
|
|
38
|
-
}
|
|
39
|
-
out.push(seg);
|
|
40
|
-
}
|
|
41
|
-
return out;
|
|
42
|
-
};
|
|
43
|
-
let segs = collapse(path);
|
|
44
|
-
const prefixSegs = kbDirName ? collapse(kbDirName) : [];
|
|
45
|
-
if (prefixSegs.length > 0 && prefixSegs.every((s, i) => segs[i] === s)) {
|
|
46
|
-
segs = segs.slice(prefixSegs.length);
|
|
47
|
-
}
|
|
48
|
-
return segs;
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Resolve the named ontology a KB path belongs to, or `null` (neutral) when it
|
|
52
|
-
* belongs to none.
|
|
53
|
-
*
|
|
54
|
-
* Classification is deliberately NARROWER than the kb-graph parser: the parser
|
|
55
|
-
* discovers ontologies under every `ONTOLOGY_ROOTS` entry (`KnowledgeBase/`
|
|
56
|
-
* AND `Data/`), but this function classifies ONLY `KnowledgeBase/` paths.
|
|
57
|
-
* `Data/` ontologies are parsed into the graph yet are intentionally NOT
|
|
58
|
-
* classified here, so the session-ontology gate treats `Data/` paths as
|
|
59
|
-
* neutral — pipeline agents read knowledge and write data records in one
|
|
60
|
-
* session (owner decision 2026-07-27; the cross-ontology boundary mechanism
|
|
61
|
-
* itself may be redesigned). This divergence is on purpose, not drift.
|
|
62
|
-
*
|
|
63
|
-
* Within `KnowledgeBase/`, the shape matches the parser (`parser.ts`
|
|
64
|
-
* `walkForOntologies`): an ontology is the directory that holds both a
|
|
65
|
-
* `Knowledge/` and a `NodeTypes/` subfolder. That directory can sit at ANY
|
|
66
|
-
* depth under `KnowledgeBase/`, so the ontology id is the path PREFIX up to
|
|
67
|
-
* (but excluding) the first `Knowledge/` or `NodeTypes/` marker segment — as
|
|
68
|
-
* long as that prefix is inside `KnowledgeBase/` and is not `KnowledgeBase/`
|
|
69
|
-
* itself.
|
|
70
|
-
*
|
|
71
|
-
* KnowledgeBase/Product/Knowledge/Foo.md → "KnowledgeBase/Product"
|
|
72
|
-
* KnowledgeBase/IT Architecture/NodeTypes/T.md → "KnowledgeBase/IT Architecture"
|
|
73
|
-
* KnowledgeBase/Group/Sub/Knowledge/x.md → "KnowledgeBase/Group/Sub"
|
|
74
|
-
* KnowledgeBase/Knowledge/Foo.md → null (marker directly under KB root)
|
|
75
|
-
* Knowledge/Foo.md, Skills/x.md, access.md → null (not under KnowledgeBase/)
|
|
76
|
-
* Data/Ops/Knowledge/x.md → null (Data/ is exempt — see above)
|
|
77
|
-
* KnowledgeBase/Product/Uploads/x.png → null (no marker segment)
|
|
78
|
-
*
|
|
79
|
-
* Uses exact segment equality (never substring), so `KnowledgeBase/` and
|
|
80
|
-
* `Knowledge-notes.md` are never treated as markers; space-safe; pure (no IO).
|
|
81
|
-
*
|
|
82
|
-
* @param path repo-root-relative POSIX path (may carry a `kbDirName` prefix)
|
|
83
|
-
* @param layout the knowledge base's layout — names its `KnowledgeBase/` root
|
|
84
|
-
* @param kbDirName optional on-disk clone folder prefix to strip first
|
|
85
|
-
*/
|
|
86
|
-
export function ontologyOf(path, layout, kbDirName) {
|
|
87
|
-
const segs = toSegments(path, kbDirName);
|
|
88
|
-
// Must live under the dedicated KnowledgeBase/ container, with at least one
|
|
89
|
-
// ontology-name segment and a marker after it (so length >= 3).
|
|
90
|
-
if (segs.length < 3 || segs[0] !== layout.knowledgeBaseDir)
|
|
91
|
-
return null;
|
|
92
|
-
// The ontology id is the prefix before the first marker segment. Require at
|
|
93
|
-
// least one name segment between `KnowledgeBase/` and the marker, so a marker
|
|
94
|
-
// sitting directly under `KnowledgeBase/` (`KnowledgeBase/Knowledge/...`) is
|
|
95
|
-
// neutral, matching the parser (it only discovers ontologies one level down).
|
|
96
|
-
for (let i = 1; i < segs.length; i++) {
|
|
97
|
-
if (ONTOLOGY_MARKERS.has(segs[i])) {
|
|
98
|
-
return i >= 2 ? segs.slice(0, i).join('/') : null;
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
return null;
|
|
102
|
-
}
|
|
103
|
-
//# sourceMappingURL=kb-layout.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"kb-layout.js","sourceRoot":"","sources":["../../src/shared/kb-layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAgC,MAAM,iCAAiC,CAAC;AAEjG;;;;;;;;;;;GAWG;AAEH;;;;GAIG;AACH,SAAS,UAAU,CAAC,IAAY,EAAE,SAAkB;IAClD,wEAAwE;IACxE,4EAA4E;IAC5E,iEAAiE;IACjE,wDAAwD;IACxD,uEAAuE;IACvE,MAAM,QAAQ,GAAG,CAAC,CAAS,EAAY,EAAE;QACvC,MAAM,GAAG,GAAa,EAAE,CAAC;QACzB,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACnD,IAAI,GAAG,KAAK,EAAE,IAAI,GAAG,KAAK,GAAG;gBAAE,SAAS;YACxC,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;gBACjB,wEAAwE;gBACxE,uCAAuC;gBACvC,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,IAAI;oBAAE,GAAG,CAAC,GAAG,EAAE,CAAC;;oBACzD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACpB,SAAS;YACX,CAAC;YACD,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChB,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC,CAAC;IAEF,IAAI,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,UAAU,GAAG,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACxD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QACvE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,MAAgB,EAAE,SAAkB;IAC3E,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACzC,4EAA4E;IAC5E,gEAAgE;IAChE,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,gBAAgB;QAAE,OAAO,IAAI,CAAC;IACxE,4EAA4E;IAC5E,8EAA8E;IAC9E,6EAA6E;IAC7E,8EAA8E;IAC9E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAClC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACpD,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"kb-layout.test.d.ts","sourceRoot":"","sources":["../../src/shared/kb-layout.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { DEFAULT_KB_LAYOUT } from '@bevel-software/platform-shared';
|
|
3
|
-
import { ontologyOf } from './kb-layout.js';
|
|
4
|
-
/** `ontologyOf` under the default layout, which is what these cases are written against. */
|
|
5
|
-
const ont = (path, kbDirName) => ontologyOf(path, DEFAULT_KB_LAYOUT, kbDirName);
|
|
6
|
-
describe('ontologyOf', () => {
|
|
7
|
-
it('classifies under the knowledge-base root the layout names, not the default one', () => {
|
|
8
|
-
const layout = { ...DEFAULT_KB_LAYOUT, knowledgeBaseDir: 'docs' };
|
|
9
|
-
expect(ontologyOf('docs/Product/Knowledge/Foo.md', layout)).toBe('docs/Product');
|
|
10
|
-
expect(ontologyOf('KnowledgeBase/Product/Knowledge/Foo.md', layout)).toBeNull();
|
|
11
|
-
});
|
|
12
|
-
it('resolves a named ontology under Knowledge', () => {
|
|
13
|
-
expect(ont('KnowledgeBase/Product/Knowledge/Foo.md')).toBe('KnowledgeBase/Product');
|
|
14
|
-
});
|
|
15
|
-
it('resolves a named ontology under NodeTypes', () => {
|
|
16
|
-
expect(ont('KnowledgeBase/Product/NodeTypes/Process.md')).toBe('KnowledgeBase/Product');
|
|
17
|
-
});
|
|
18
|
-
it('is space-safe in the ontology name', () => {
|
|
19
|
-
expect(ont('KnowledgeBase/IT Architecture/NodeTypes/ServiceCommitment.md')).toBe('KnowledgeBase/IT Architecture');
|
|
20
|
-
});
|
|
21
|
-
it('treats a nested ontology directory as the full prefix before the marker', () => {
|
|
22
|
-
expect(ont('KnowledgeBase/Plugin/Sub/Knowledge/x.md')).toBe('KnowledgeBase/Plugin/Sub');
|
|
23
|
-
});
|
|
24
|
-
it('returns null when the marker sits directly under KnowledgeBase/', () => {
|
|
25
|
-
expect(ont('KnowledgeBase/Knowledge/Foo.md')).toBeNull();
|
|
26
|
-
expect(ont('KnowledgeBase/NodeTypes/T.md')).toBeNull();
|
|
27
|
-
});
|
|
28
|
-
it('returns null for root-level Knowledge (not under KnowledgeBase/)', () => {
|
|
29
|
-
expect(ont('Knowledge/Foo.md')).toBeNull();
|
|
30
|
-
});
|
|
31
|
-
it('returns null for Data/ ontologies (deliberate session-ontology exemption)', () => {
|
|
32
|
-
// `Data/<X>` IS parsed into the graph (parser `ONTOLOGY_ROOTS`), but is
|
|
33
|
-
// intentionally NOT classified here so the session-ontology gate treats
|
|
34
|
-
// Data paths as neutral — pipeline agents read knowledge and write data
|
|
35
|
-
// in one session (owner decision 2026-07-27). See the `ontologyOf`
|
|
36
|
-
// docstring; this is not drift.
|
|
37
|
-
expect(ont('Data/Ops/Knowledge/x.md')).toBeNull();
|
|
38
|
-
expect(ont('Data/Ops/NodeTypes/Ticket.md')).toBeNull();
|
|
39
|
-
// KnowledgeBase paths still classify as before.
|
|
40
|
-
expect(ont('KnowledgeBase/Ops/Knowledge/x.md')).toBe('KnowledgeBase/Ops');
|
|
41
|
-
});
|
|
42
|
-
it('returns null for Plugins and root config (neutral)', () => {
|
|
43
|
-
expect(ont('Plugins/some-skill/SKILL.md')).toBeNull();
|
|
44
|
-
expect(ont('access.md')).toBeNull();
|
|
45
|
-
expect(ont('roles.yaml')).toBeNull();
|
|
46
|
-
});
|
|
47
|
-
it('returns null for an ontology path with no marker segment', () => {
|
|
48
|
-
expect(ont('KnowledgeBase/Product/Uploads/diagram.png')).toBeNull();
|
|
49
|
-
});
|
|
50
|
-
it('does not match substring lookalikes (segment equality)', () => {
|
|
51
|
-
expect(ont('KnowledgeBase/Product/Knowledge-notes.md')).toBeNull();
|
|
52
|
-
expect(ont('KnowledgeBase/Product/KnowledgeBase/x.md')).toBeNull();
|
|
53
|
-
});
|
|
54
|
-
it('strips a kbDirName prefix (normalized and un-normalized)', () => {
|
|
55
|
-
expect(ont('knowledge-base/KnowledgeBase/Product/Knowledge/Foo.md', 'knowledge-base')).toBe('KnowledgeBase/Product');
|
|
56
|
-
expect(ont('./knowledge-base/KnowledgeBase/GTM/NodeTypes/T.md', 'knowledge-base/')).toBe('KnowledgeBase/GTM');
|
|
57
|
-
});
|
|
58
|
-
it('normalizes backslashes and leading/trailing slashes', () => {
|
|
59
|
-
expect(ont('/KnowledgeBase/Product/Knowledge/Foo.md/')).toBe('KnowledgeBase/Product');
|
|
60
|
-
expect(ont('KnowledgeBase\\Product\\Knowledge\\Foo.md')).toBe('KnowledgeBase/Product');
|
|
61
|
-
});
|
|
62
|
-
it('canonicalizes inner . and .. segments to the same ontology', () => {
|
|
63
|
-
expect(ont('KnowledgeBase/Product/./Knowledge/Foo.md')).toBe('KnowledgeBase/Product');
|
|
64
|
-
expect(ont('KnowledgeBase/Product/Sub/../Knowledge/Foo.md')).toBe('KnowledgeBase/Product');
|
|
65
|
-
expect(ont('KnowledgeBase/Platform/../Product/Knowledge/Foo.md')).toBe('KnowledgeBase/Product');
|
|
66
|
-
// `..` also collapses inside the stripped kbDirName prefix.
|
|
67
|
-
expect(ont('knowledge-base/x/../KnowledgeBase/GTM/NodeTypes/T.md', 'knowledge-base')).toBe('KnowledgeBase/GTM');
|
|
68
|
-
});
|
|
69
|
-
it('returns null for empty or root paths', () => {
|
|
70
|
-
expect(ont('')).toBeNull();
|
|
71
|
-
expect(ont('KnowledgeBase')).toBeNull();
|
|
72
|
-
expect(ont('KnowledgeBase/Product')).toBeNull();
|
|
73
|
-
});
|
|
74
|
-
});
|
|
75
|
-
//# sourceMappingURL=kb-layout.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"kb-layout.test.js","sourceRoot":"","sources":["../../src/shared/kb-layout.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { recordTouch, decideWrite } from '../session-ontology.policy.js';
|
|
3
|
-
|
|
4
|
-
const PRODUCT = 'KnowledgeBase/Product';
|
|
5
|
-
const PLATFORM = 'KnowledgeBase/Platform';
|
|
6
|
-
const GTM = 'KnowledgeBase/GTM';
|
|
7
|
-
|
|
8
|
-
describe('recordTouch', () => {
|
|
9
|
-
it('adds a named ontology to the set', () => {
|
|
10
|
-
expect([...recordTouch(new Set(), PRODUCT)]).toEqual([PRODUCT]);
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
it('adds nothing for a neutral touch', () => {
|
|
14
|
-
expect([...recordTouch(new Set([PRODUCT]), null)]).toEqual([PRODUCT]);
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
it('accumulates across ontologies', () => {
|
|
18
|
-
const a = recordTouch(new Set(), PRODUCT);
|
|
19
|
-
const b = recordTouch(a, PLATFORM);
|
|
20
|
-
expect(new Set(b)).toEqual(new Set([PRODUCT, PLATFORM]));
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
it('does not mutate the input set', () => {
|
|
24
|
-
const input = new Set([PRODUCT]);
|
|
25
|
-
recordTouch(input, PLATFORM);
|
|
26
|
-
expect([...input]).toEqual([PRODUCT]);
|
|
27
|
-
});
|
|
28
|
-
});
|
|
29
|
-
|
|
30
|
-
describe('decideWrite', () => {
|
|
31
|
-
it('allows a write to a neutral path regardless of touched set', () => {
|
|
32
|
-
expect(decideWrite(new Set([PRODUCT, PLATFORM]), null)).toEqual({ allow: true });
|
|
33
|
-
});
|
|
34
|
-
|
|
35
|
-
it('allows a write when the session has touched nothing yet', () => {
|
|
36
|
-
expect(decideWrite(new Set(), PRODUCT)).toEqual({ allow: true });
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
it('allows a write to the single ontology the session is confined to', () => {
|
|
40
|
-
expect(decideWrite(new Set([PRODUCT]), PRODUCT)).toEqual({ allow: true });
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
it('blocks a write to a different ontology when confined to one (different-ontology)', () => {
|
|
44
|
-
expect(decideWrite(new Set([PRODUCT]), PLATFORM)).toEqual({
|
|
45
|
-
allow: false,
|
|
46
|
-
reason: 'different-ontology',
|
|
47
|
-
touched: [PRODUCT],
|
|
48
|
-
attempted: PLATFORM,
|
|
49
|
-
});
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
it('blocks ALL writes once the session has touched two ontologies (multi-ontology)', () => {
|
|
53
|
-
// Reading across ontologies poisons writes — even a write back into Product.
|
|
54
|
-
expect(decideWrite(new Set([PRODUCT, PLATFORM]), PRODUCT)).toEqual({
|
|
55
|
-
allow: false,
|
|
56
|
-
reason: 'multi-ontology',
|
|
57
|
-
touched: [PLATFORM, PRODUCT],
|
|
58
|
-
attempted: PRODUCT,
|
|
59
|
-
});
|
|
60
|
-
expect(decideWrite(new Set([PRODUCT, PLATFORM]), GTM).allow).toBe(false);
|
|
61
|
-
});
|
|
62
|
-
});
|