@bevel-software/platform-core-backend 0.19.0 → 0.21.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/catalog-cache-invalidation.d.ts +7 -2
- package/dist/core/catalog-cache-invalidation.d.ts.map +1 -1
- package/dist/core/catalog-cache-invalidation.js +8 -9
- package/dist/core/catalog-cache-invalidation.js.map +1 -1
- package/dist/core/core-ports.d.ts +19 -0
- 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 +2 -0
- package/dist/core/create-core-server.d.ts.map +1 -1
- package/dist/core/create-core-server.js +45 -105
- package/dist/core/create-core-server.js.map +1 -1
- package/dist/core/create-core-services.d.ts +33 -5
- package/dist/core/create-core-services.d.ts.map +1 -1
- package/dist/core/create-core-services.js +146 -82
- package/dist/core/create-core-services.js.map +1 -1
- package/dist/core/lifecycle.d.ts +74 -28
- package/dist/core/lifecycle.d.ts.map +1 -1
- package/dist/core/lifecycle.js +157 -20
- package/dist/core/lifecycle.js.map +1 -1
- package/dist/core/public-config.d.ts +5 -1
- package/dist/core/public-config.d.ts.map +1 -1
- package/dist/core/public-config.js +7 -5
- package/dist/core/public-config.js.map +1 -1
- package/dist/core-config.d.ts +95 -1
- package/dist/core-config.d.ts.map +1 -1
- package/dist/core-config.js +24 -8
- package/dist/core-config.js.map +1 -1
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -3
- package/dist/index.js.map +1 -1
- package/dist/modules/access/access-control.service.d.ts +18 -1
- package/dist/modules/access/access-control.service.d.ts.map +1 -1
- package/dist/modules/access/access-control.service.js +19 -8
- package/dist/modules/access/access-control.service.js.map +1 -1
- package/dist/modules/access/access.routes.d.ts +2 -1
- package/dist/modules/access/access.routes.d.ts.map +1 -1
- package/dist/modules/access/access.routes.js +10 -10
- package/dist/modules/access/access.routes.js.map +1 -1
- package/dist/modules/access/change-read-gate.d.ts +6 -3
- package/dist/modules/access/change-read-gate.d.ts.map +1 -1
- package/dist/modules/access/change-read-gate.js +9 -6
- package/dist/modules/access/change-read-gate.js.map +1 -1
- package/dist/modules/access/creator-access.d.ts +4 -2
- package/dist/modules/access/creator-access.d.ts.map +1 -1
- package/dist/modules/access/creator-access.js +7 -4
- package/dist/modules/access/creator-access.js.map +1 -1
- package/dist/modules/agent-instructions/read-preamble.d.ts +2 -1
- package/dist/modules/agent-instructions/read-preamble.d.ts.map +1 -1
- package/dist/modules/agent-instructions/read-preamble.js +6 -9
- package/dist/modules/agent-instructions/read-preamble.js.map +1 -1
- package/dist/modules/audit/agent-audit.service.d.ts +54 -0
- package/dist/modules/audit/agent-audit.service.d.ts.map +1 -0
- package/dist/modules/audit/agent-audit.service.js +290 -0
- package/dist/modules/audit/agent-audit.service.js.map +1 -0
- package/dist/modules/audit/agent-rest-audit.middleware.d.ts +40 -0
- package/dist/modules/audit/agent-rest-audit.middleware.d.ts.map +1 -0
- package/dist/modules/audit/agent-rest-audit.middleware.js +75 -0
- package/dist/modules/audit/agent-rest-audit.middleware.js.map +1 -0
- package/dist/modules/audit/audit.contract.d.ts +145 -0
- package/dist/modules/audit/audit.contract.d.ts.map +1 -0
- package/dist/modules/audit/audit.contract.js +35 -0
- package/dist/modules/audit/audit.contract.js.map +1 -0
- package/dist/modules/audit/audit.routes.d.ts +21 -0
- package/dist/modules/audit/audit.routes.d.ts.map +1 -0
- package/dist/modules/audit/audit.routes.js +157 -0
- package/dist/modules/audit/audit.routes.js.map +1 -0
- package/dist/modules/audit/event-classifier.d.ts +52 -0
- package/dist/modules/audit/event-classifier.d.ts.map +1 -0
- package/dist/modules/audit/event-classifier.js +123 -0
- package/dist/modules/audit/event-classifier.js.map +1 -0
- package/dist/modules/audit/index.d.ts +7 -0
- package/dist/modules/audit/index.d.ts.map +1 -0
- package/dist/modules/audit/index.js +7 -0
- package/dist/modules/audit/index.js.map +1 -0
- package/dist/modules/audit/request-audit.d.ts +57 -0
- package/dist/modules/audit/request-audit.d.ts.map +1 -0
- package/dist/modules/audit/request-audit.js +117 -0
- package/dist/modules/audit/request-audit.js.map +1 -0
- package/dist/modules/auth/account-admission.d.ts +40 -0
- package/dist/modules/auth/account-admission.d.ts.map +1 -0
- package/dist/modules/auth/account-admission.js +17 -0
- package/dist/modules/auth/account-admission.js.map +1 -0
- package/dist/modules/auth/account.routes.d.ts.map +1 -1
- package/dist/modules/auth/account.routes.js +4 -1
- package/dist/modules/auth/account.routes.js.map +1 -1
- package/dist/modules/auth/auth.service.d.ts +19 -1
- package/dist/modules/auth/auth.service.d.ts.map +1 -1
- package/dist/modules/auth/auth.service.js +33 -1
- 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 +9 -0
- package/dist/modules/auth/oidc-auth-provider.js.map +1 -1
- package/dist/modules/connection-probe/connection-probe.service.d.ts +13 -1
- package/dist/modules/connection-probe/connection-probe.service.d.ts.map +1 -1
- package/dist/modules/connection-probe/connection-probe.service.js +10 -2
- package/dist/modules/connection-probe/connection-probe.service.js.map +1 -1
- package/dist/modules/database/advisory-lock.d.ts +17 -0
- package/dist/modules/database/advisory-lock.d.ts.map +1 -1
- package/dist/modules/database/advisory-lock.js +24 -3
- package/dist/modules/database/advisory-lock.js.map +1 -1
- package/dist/modules/database/connection.d.ts +67 -2
- package/dist/modules/database/connection.d.ts.map +1 -1
- package/dist/modules/database/connection.js +118 -12
- package/dist/modules/database/connection.js.map +1 -1
- package/dist/modules/database/core-schema.d.ts +414 -0
- package/dist/modules/database/core-schema.d.ts.map +1 -1
- package/dist/modules/database/core-schema.js +99 -0
- package/dist/modules/database/core-schema.js.map +1 -1
- package/dist/modules/database/migrate.d.ts +1 -1
- package/dist/modules/database/migrate.d.ts.map +1 -1
- package/dist/modules/database/migrate.js +27 -3
- package/dist/modules/database/migrate.js.map +1 -1
- package/dist/modules/diff/diff.service.d.ts.map +1 -1
- package/dist/modules/diff/diff.service.js +6 -1
- package/dist/modules/diff/diff.service.js.map +1 -1
- package/dist/modules/kb-fs/branch-name.d.ts +0 -1
- package/dist/modules/kb-fs/branch-name.d.ts.map +1 -1
- package/dist/modules/kb-fs/branch-name.js +3 -3
- package/dist/modules/kb-fs/branch-name.js.map +1 -1
- package/dist/modules/kb-fs/clone-config.d.ts +9 -8
- package/dist/modules/kb-fs/clone-config.d.ts.map +1 -1
- package/dist/modules/kb-fs/clone-config.js +14 -12
- package/dist/modules/kb-fs/clone-config.js.map +1 -1
- package/dist/modules/kb-fs/git-guarded-filesystem.d.ts +9 -1
- package/dist/modules/kb-fs/git-guarded-filesystem.d.ts.map +1 -1
- package/dist/modules/kb-fs/git-guarded-filesystem.js +16 -3
- package/dist/modules/kb-fs/git-guarded-filesystem.js.map +1 -1
- package/dist/modules/mcp/mcp-auth.middleware.d.ts +1 -0
- package/dist/modules/mcp/mcp-auth.middleware.d.ts.map +1 -1
- package/dist/modules/mcp/mcp-auth.middleware.js +32 -0
- package/dist/modules/mcp/mcp-auth.middleware.js.map +1 -1
- package/dist/modules/mcp/mcp.routes.d.ts.map +1 -1
- package/dist/modules/mcp/mcp.routes.js +8 -1
- package/dist/modules/mcp/mcp.routes.js.map +1 -1
- package/dist/modules/mcp/mcp.service.d.ts +16 -1
- package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
- package/dist/modules/mcp/mcp.service.js +52 -9
- package/dist/modules/mcp/mcp.service.js.map +1 -1
- package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts +59 -0
- package/dist/modules/mcp/oauth/bevel-oauth-provider.d.ts.map +1 -1
- package/dist/modules/mcp/oauth/bevel-oauth-provider.js +180 -8
- package/dist/modules/mcp/oauth/bevel-oauth-provider.js.map +1 -1
- package/dist/modules/plugins/compile/marketplace-compiler.service.d.ts +4 -4
- package/dist/modules/plugins/compile/marketplace-compiler.service.d.ts.map +1 -1
- package/dist/modules/plugins/compile/marketplace-compiler.service.js +7 -10
- package/dist/modules/plugins/compile/marketplace-compiler.service.js.map +1 -1
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.d.ts +4 -1
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.d.ts.map +1 -1
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.js +5 -3
- package/dist/modules/plugins/discovery/bundle-dialect/bundle.source.js.map +1 -1
- package/dist/modules/plugins/discovery/kb-plugin-source.d.ts +6 -1
- package/dist/modules/plugins/discovery/kb-plugin-source.d.ts.map +1 -1
- package/dist/modules/plugins/discovery/kb-plugin-source.js +14 -9
- package/dist/modules/plugins/discovery/kb-plugin-source.js.map +1 -1
- package/dist/modules/plugins/discovery/native.source.d.ts +4 -1
- package/dist/modules/plugins/discovery/native.source.d.ts.map +1 -1
- package/dist/modules/plugins/discovery/native.source.js +4 -2
- package/dist/modules/plugins/discovery/native.source.js.map +1 -1
- package/dist/modules/plugins/index.d.ts +1 -1
- package/dist/modules/plugins/index.d.ts.map +1 -1
- package/dist/modules/plugins/index.js +1 -1
- package/dist/modules/plugins/index.js.map +1 -1
- package/dist/modules/plugins/join-request-jobs.service.d.ts +3 -1
- package/dist/modules/plugins/join-request-jobs.service.d.ts.map +1 -1
- package/dist/modules/plugins/join-request-jobs.service.js +6 -6
- package/dist/modules/plugins/join-request-jobs.service.js.map +1 -1
- package/dist/modules/plugins/join-requests.service.d.ts +3 -1
- package/dist/modules/plugins/join-requests.service.d.ts.map +1 -1
- package/dist/modules/plugins/join-requests.service.js +9 -8
- package/dist/modules/plugins/join-requests.service.js.map +1 -1
- package/dist/modules/plugins/plugin-links.d.ts +65 -10
- package/dist/modules/plugins/plugin-links.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-links.js +136 -31
- package/dist/modules/plugins/plugin-links.js.map +1 -1
- package/dist/modules/plugins/plugin-links.service.d.ts +107 -5
- package/dist/modules/plugins/plugin-links.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-links.service.js +151 -21
- package/dist/modules/plugins/plugin-links.service.js.map +1 -1
- package/dist/modules/plugins/plugin-provision.service.d.ts +10 -3
- package/dist/modules/plugins/plugin-provision.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-provision.service.js +33 -26
- package/dist/modules/plugins/plugin-provision.service.js.map +1 -1
- package/dist/modules/plugins/plugin-rename.service.d.ts +4 -2
- package/dist/modules/plugins/plugin-rename.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugin-rename.service.js +10 -12
- package/dist/modules/plugins/plugin-rename.service.js.map +1 -1
- package/dist/modules/plugins/plugins.routes.d.ts +3 -0
- package/dist/modules/plugins/plugins.routes.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.routes.js +45 -15
- package/dist/modules/plugins/plugins.routes.js.map +1 -1
- package/dist/modules/plugins/plugins.service.d.ts +4 -4
- package/dist/modules/plugins/plugins.service.d.ts.map +1 -1
- package/dist/modules/plugins/plugins.service.js +7 -10
- package/dist/modules/plugins/plugins.service.js.map +1 -1
- package/dist/modules/plugins/teams.routes.d.ts +4 -1
- package/dist/modules/plugins/teams.routes.d.ts.map +1 -1
- package/dist/modules/plugins/teams.routes.js +11 -9
- package/dist/modules/plugins/teams.routes.js.map +1 -1
- package/dist/modules/secrets-vault/index.d.ts +1 -1
- package/dist/modules/secrets-vault/index.d.ts.map +1 -1
- package/dist/modules/secrets-vault/index.js +1 -1
- package/dist/modules/secrets-vault/index.js.map +1 -1
- package/dist/modules/secrets-vault/secrets-variable-loader.d.ts +29 -11
- package/dist/modules/secrets-vault/secrets-variable-loader.d.ts.map +1 -1
- package/dist/modules/secrets-vault/secrets-variable-loader.js +46 -21
- package/dist/modules/secrets-vault/secrets-variable-loader.js.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.routes.d.ts +3 -0
- package/dist/modules/secrets-vault/secrets-vault.routes.d.ts.map +1 -1
- package/dist/modules/secrets-vault/secrets-vault.routes.js +4 -6
- package/dist/modules/secrets-vault/secrets-vault.routes.js.map +1 -1
- package/dist/modules/settings/deployment-settings.service.d.ts +22 -10
- package/dist/modules/settings/deployment-settings.service.d.ts.map +1 -1
- package/dist/modules/settings/deployment-settings.service.js +52 -28
- package/dist/modules/settings/deployment-settings.service.js.map +1 -1
- package/dist/modules/settings/setup.routes.d.ts +9 -2
- package/dist/modules/settings/setup.routes.d.ts.map +1 -1
- package/dist/modules/settings/setup.routes.js +20 -14
- package/dist/modules/settings/setup.routes.js.map +1 -1
- package/dist/modules/skills/allowed-tools-check.d.ts +4 -3
- package/dist/modules/skills/allowed-tools-check.d.ts.map +1 -1
- package/dist/modules/skills/allowed-tools-check.js +8 -8
- package/dist/modules/skills/allowed-tools-check.js.map +1 -1
- package/dist/modules/skills/pending-skills.service.d.ts +3 -1
- package/dist/modules/skills/pending-skills.service.d.ts.map +1 -1
- package/dist/modules/skills/pending-skills.service.js +9 -6
- package/dist/modules/skills/pending-skills.service.js.map +1 -1
- package/dist/modules/skills/skill-access-requests.routes.d.ts +2 -1
- package/dist/modules/skills/skill-access-requests.routes.d.ts.map +1 -1
- package/dist/modules/skills/skill-access-requests.routes.js +6 -6
- package/dist/modules/skills/skill-access-requests.routes.js.map +1 -1
- package/dist/modules/skills/skills.routes.d.ts +4 -1
- package/dist/modules/skills/skills.routes.d.ts.map +1 -1
- package/dist/modules/skills/skills.routes.js +4 -4
- package/dist/modules/skills/skills.routes.js.map +1 -1
- package/dist/modules/skills/skills.service.d.ts +4 -2
- package/dist/modules/skills/skills.service.d.ts.map +1 -1
- package/dist/modules/skills/skills.service.js +13 -11
- package/dist/modules/skills/skills.service.js.map +1 -1
- package/dist/modules/tool-auth/external-api-key.interface.d.ts +21 -5
- package/dist/modules/tool-auth/external-api-key.interface.d.ts.map +1 -1
- package/dist/modules/tool-auth/external-api-key.interface.js.map +1 -1
- package/dist/modules/tool-auth/external-api-key.service.d.ts +1 -0
- package/dist/modules/tool-auth/external-api-key.service.d.ts.map +1 -1
- package/dist/modules/tool-auth/external-api-key.service.js +22 -9
- package/dist/modules/tool-auth/external-api-key.service.js.map +1 -1
- package/dist/modules/tool-auth/internal-token.service.d.ts +10 -0
- package/dist/modules/tool-auth/internal-token.service.d.ts.map +1 -1
- package/dist/modules/tool-auth/internal-token.service.js +1 -0
- package/dist/modules/tool-auth/internal-token.service.js.map +1 -1
- package/dist/modules/tool-auth/tool-auth.middleware.d.ts +8 -0
- package/dist/modules/tool-auth/tool-auth.middleware.d.ts.map +1 -1
- package/dist/modules/tool-auth/tool-auth.middleware.js +9 -1
- package/dist/modules/tool-auth/tool-auth.middleware.js.map +1 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.d.ts +2 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.d.ts.map +1 -1
- package/dist/modules/tool-manuals/mcp-json-discovery.js +6 -5
- package/dist/modules/tool-manuals/mcp-json-discovery.js.map +1 -1
- package/dist/modules/tool-manuals/mcp-server-edit.service.d.ts +4 -2
- package/dist/modules/tool-manuals/mcp-server-edit.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/mcp-server-edit.service.js +12 -10
- package/dist/modules/tool-manuals/mcp-server-edit.service.js.map +1 -1
- package/dist/modules/tool-manuals/pending-tools.service.d.ts +3 -1
- package/dist/modules/tool-manuals/pending-tools.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/pending-tools.service.js +19 -16
- package/dist/modules/tool-manuals/pending-tools.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-delete.service.d.ts +4 -2
- package/dist/modules/tool-manuals/tool-delete.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-delete.service.js +14 -12
- package/dist/modules/tool-manuals/tool-delete.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.routes.d.ts +3 -1
- package/dist/modules/tool-manuals/tool-manuals.routes.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.routes.js +7 -7
- package/dist/modules/tool-manuals/tool-manuals.routes.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts +4 -2
- package/dist/modules/tool-manuals/tool-manuals.service.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.service.js +15 -12
- package/dist/modules/tool-manuals/tool-manuals.service.js.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts +3 -0
- package/dist/modules/tool-manuals/tool-manuals.tools.d.ts.map +1 -1
- package/dist/modules/tool-manuals/tool-manuals.tools.js +4 -6
- package/dist/modules/tool-manuals/tool-manuals.tools.js.map +1 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.d.ts +3 -2
- package/dist/modules/workflow/agent-tools/workflow.tools.d.ts.map +1 -1
- package/dist/modules/workflow/agent-tools/workflow.tools.js +9 -9
- package/dist/modules/workflow/agent-tools/workflow.tools.js.map +1 -1
- package/dist/modules/workflow/git/git.service.d.ts +11 -5
- package/dist/modules/workflow/git/git.service.d.ts.map +1 -1
- package/dist/modules/workflow/git/git.service.js +23 -14
- package/dist/modules/workflow/git/git.service.js.map +1 -1
- package/dist/modules/workflow/git/node-git-runner.d.ts +26 -2
- package/dist/modules/workflow/git/node-git-runner.d.ts.map +1 -1
- package/dist/modules/workflow/git/node-git-runner.js +35 -5
- package/dist/modules/workflow/git/node-git-runner.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 +9 -4
- package/dist/modules/workflow/review-workflow/review-workflow.service.js.map +1 -1
- package/dist/modules/workflow/session-ontology.service.d.ts +6 -1
- package/dist/modules/workflow/session-ontology.service.d.ts.map +1 -1
- package/dist/modules/workflow/session-ontology.service.js +6 -2
- package/dist/modules/workflow/session-ontology.service.js.map +1 -1
- package/dist/modules/workflow/workflow.service.d.ts +8 -3
- package/dist/modules/workflow/workflow.service.d.ts.map +1 -1
- package/dist/modules/workflow/workflow.service.js +33 -23
- package/dist/modules/workflow/workflow.service.js.map +1 -1
- package/dist/modules/workspace/session-ontology.gate.d.ts +3 -1
- package/dist/modules/workspace/session-ontology.gate.d.ts.map +1 -1
- package/dist/modules/workspace/session-ontology.gate.js +3 -3
- package/dist/modules/workspace/session-ontology.gate.js.map +1 -1
- package/dist/modules/workspace/startup/kb-git.d.ts +4 -3
- package/dist/modules/workspace/startup/kb-git.d.ts.map +1 -1
- package/dist/modules/workspace/startup/kb-git.js +15 -13
- package/dist/modules/workspace/startup/kb-git.js.map +1 -1
- package/dist/modules/workspace/startup/kb-startup-runner.d.ts +5 -8
- package/dist/modules/workspace/startup/kb-startup-runner.d.ts.map +1 -1
- package/dist/modules/workspace/startup/kb-startup-runner.js +35 -38
- package/dist/modules/workspace/startup/kb-startup-runner.js.map +1 -1
- package/dist/modules/workspace/startup/steps/groups-to-plugins.step.d.ts +7 -1
- package/dist/modules/workspace/startup/steps/groups-to-plugins.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/groups-to-plugins.step.js +23 -16
- package/dist/modules/workspace/startup/steps/groups-to-plugins.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/personal-spaces.step.d.ts +7 -1
- package/dist/modules/workspace/startup/steps/personal-spaces.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/personal-spaces.step.js +12 -5
- package/dist/modules/workspace/startup/steps/personal-spaces.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/plugin-display-names.step.d.ts +7 -1
- package/dist/modules/workspace/startup/steps/plugin-display-names.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/plugin-display-names.step.js +12 -5
- package/dist/modules/workspace/startup/steps/plugin-display-names.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.d.ts +7 -1
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.js +12 -5
- package/dist/modules/workspace/startup/steps/plugin-manifests.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/seed-tree.d.ts +4 -1
- package/dist/modules/workspace/startup/steps/seed-tree.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/seed-tree.js +14 -11
- package/dist/modules/workspace/startup/steps/seed-tree.js.map +1 -1
- package/dist/modules/workspace/startup/steps/template-files.step.d.ts +17 -3
- package/dist/modules/workspace/startup/steps/template-files.step.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/template-files.step.js +36 -30
- package/dist/modules/workspace/startup/steps/template-files.step.js.map +1 -1
- package/dist/modules/workspace/startup/steps/template-source.d.ts +6 -1
- package/dist/modules/workspace/startup/steps/template-source.d.ts.map +1 -1
- package/dist/modules/workspace/startup/steps/template-source.js +10 -6
- package/dist/modules/workspace/startup/steps/template-source.js.map +1 -1
- package/dist/modules/workspace/workspace.routes.d.ts +2 -1
- package/dist/modules/workspace/workspace.routes.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.routes.js +8 -7
- package/dist/modules/workspace/workspace.routes.js.map +1 -1
- package/dist/modules/workspace/workspace.service.d.ts +26 -12
- package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.service.js +41 -28
- package/dist/modules/workspace/workspace.service.js.map +1 -1
- package/dist/modules/workspace/workspace.tools.d.ts +2 -1
- package/dist/modules/workspace/workspace.tools.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.tools.js +69 -31
- package/dist/modules/workspace/workspace.tools.js.map +1 -1
- package/dist/modules/workspace/write-denial.d.ts +3 -2
- package/dist/modules/workspace/write-denial.d.ts.map +1 -1
- package/dist/modules/workspace/write-denial.js +6 -5
- package/dist/modules/workspace/write-denial.js.map +1 -1
- package/dist/shared/git-internals.d.ts +7 -1
- package/dist/shared/git-internals.d.ts.map +1 -1
- package/dist/shared/git-internals.js +67 -9
- package/dist/shared/git-internals.js.map +1 -1
- package/dist/shared/git.contract.d.ts +52 -7
- package/dist/shared/git.contract.d.ts.map +1 -1
- package/dist/shared/git.contract.js +30 -8
- package/dist/shared/git.contract.js.map +1 -1
- package/dist/shared/kb-context.d.ts +76 -0
- package/dist/shared/kb-context.d.ts.map +1 -0
- package/dist/shared/kb-context.js +108 -0
- package/dist/shared/kb-context.js.map +1 -0
- package/dist/shared/kb-layout.d.ts +3 -2
- package/dist/shared/kb-layout.d.ts.map +1 -1
- package/dist/shared/kb-layout.js +4 -3
- package/dist/shared/kb-layout.js.map +1 -1
- package/dist/shared/kb-layout.test.js +35 -27
- package/dist/shared/kb-layout.test.js.map +1 -1
- package/dist/shared/pending-proposals.d.ts +4 -1
- package/dist/shared/pending-proposals.d.ts.map +1 -1
- package/dist/shared/pending-proposals.js +3 -4
- package/dist/shared/pending-proposals.js.map +1 -1
- package/dist/shared/redact-secret.d.ts +5 -5
- package/dist/shared/redact-secret.js +5 -5
- package/dist/tenancy/index.d.ts +13 -0
- package/dist/tenancy/index.d.ts.map +1 -0
- package/dist/tenancy/index.js +13 -0
- package/dist/tenancy/index.js.map +1 -0
- package/dist/tenancy/static-tenant-source.d.ts +98 -0
- package/dist/tenancy/static-tenant-source.d.ts.map +1 -0
- package/dist/tenancy/static-tenant-source.js +220 -0
- package/dist/tenancy/static-tenant-source.js.map +1 -0
- package/dist/tenancy/tenant-host.d.ts +80 -0
- package/dist/tenancy/tenant-host.d.ts.map +1 -0
- package/dist/tenancy/tenant-host.js +217 -0
- package/dist/tenancy/tenant-host.js.map +1 -0
- package/dist/tenancy/tenant-runtime.d.ts +91 -0
- package/dist/tenancy/tenant-runtime.d.ts.map +1 -0
- package/dist/tenancy/tenant-runtime.js +174 -0
- package/dist/tenancy/tenant-runtime.js.map +1 -0
- package/dist/tenancy/tenant-secrets.d.ts +24 -0
- package/dist/tenancy/tenant-secrets.d.ts.map +1 -0
- package/dist/tenancy/tenant-secrets.js +30 -0
- package/dist/tenancy/tenant-secrets.js.map +1 -0
- package/dist/tenancy/tenant-source.contract.d.ts +45 -0
- package/dist/tenancy/tenant-source.contract.d.ts.map +1 -0
- package/dist/tenancy/tenant-source.contract.js +21 -0
- package/dist/tenancy/tenant-source.contract.js.map +1 -0
- package/migrations/0000_core_init.sql +14 -14
- package/migrations/0003_deployment_settings.sql +1 -1
- package/migrations/0005_github_facade.sql +1 -1
- package/migrations/0012_agent_audit.sql +41 -0
- package/migrations/0013_agent_identity_and_key_soft_delete.sql +29 -0
- package/migrations/meta/0012_snapshot.json +2247 -0
- package/migrations/meta/0013_snapshot.json +2259 -0
- package/migrations/meta/_journal.json +14 -0
- package/package.json +4 -4
- package/src/__tests__/branch-model.test.ts +7 -6
- package/src/__tests__/kb-context.ts +30 -0
- package/src/__tests__/kb-layout-config.test.ts +35 -30
- package/src/core/__tests__/catalog-cache-invalidation.test.ts +2 -1
- package/src/core/__tests__/lifecycle.test.ts +78 -1
- package/src/core/__tests__/public-config.test.ts +5 -1
- package/src/core/catalog-cache-invalidation.ts +16 -11
- package/src/core/core-ports.ts +19 -0
- package/src/core/create-core-server.ts +55 -106
- package/src/core/create-core-services.ts +193 -95
- package/src/core/lifecycle.ts +214 -29
- package/src/core/public-config.ts +8 -5
- package/src/core-config.ts +107 -8
- package/src/index.ts +25 -2
- package/src/modules/access/__tests__/access-control.admin-root-floor.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.batch.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.folder-governs.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.group-grant.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.overrides.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.proposal-branch.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.prospective.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.revoke.test.ts +2 -1
- package/src/modules/access/__tests__/access.routes.unknown-email.test.ts +2 -1
- package/src/modules/access/__tests__/change-read-gate.test.ts +13 -11
- package/src/modules/access/__tests__/creator-access.test.ts +3 -2
- package/src/modules/access/__tests__/roles.routes.test.ts +2 -1
- package/src/modules/access/access-control.service.ts +20 -6
- package/src/modules/access/access.routes.ts +10 -13
- package/src/modules/access/change-read-gate.ts +10 -4
- package/src/modules/access/creator-access.ts +7 -2
- package/src/modules/agent-instructions/__tests__/read-preamble.test.ts +13 -12
- package/src/modules/agent-instructions/read-preamble.ts +10 -12
- package/src/modules/audit/__tests__/agent-audit.service.test.ts +370 -0
- package/src/modules/audit/__tests__/agent-rest-audit.middleware.test.ts +113 -0
- package/src/modules/audit/__tests__/audit.routes.test.ts +201 -0
- package/src/modules/audit/__tests__/event-classifier.test.ts +121 -0
- package/src/modules/audit/agent-audit.service.ts +316 -0
- package/src/modules/audit/agent-rest-audit.middleware.ts +83 -0
- package/src/modules/audit/audit.contract.ts +164 -0
- package/src/modules/audit/audit.routes.ts +168 -0
- package/src/modules/audit/event-classifier.ts +155 -0
- package/src/modules/audit/index.ts +14 -0
- package/src/modules/audit/request-audit.ts +141 -0
- package/src/modules/auth/__tests__/account.routes.test.ts +15 -0
- package/src/modules/auth/__tests__/auth.service.test.ts +60 -0
- package/src/modules/auth/account-admission.ts +44 -0
- package/src/modules/auth/account.routes.ts +4 -1
- package/src/modules/auth/auth.service.ts +33 -1
- package/src/modules/auth/oidc-auth-provider.ts +9 -0
- package/src/modules/connection-probe/connection-probe.service.ts +7 -1
- package/src/modules/database/__tests__/advisory-lock.test.ts +23 -1
- package/src/modules/database/__tests__/connection.test.ts +98 -0
- package/src/modules/database/__tests__/migrations-unqualified.test.ts +32 -0
- package/src/modules/database/advisory-lock.ts +28 -4
- package/src/modules/database/connection.ts +143 -13
- package/src/modules/database/core-schema.ts +104 -0
- package/src/modules/database/migrate.ts +48 -14
- package/src/modules/diff/__tests__/diff.service.seed-atomicity.test.ts +2 -1
- package/src/modules/diff/__tests__/diff.service.test.ts +2 -1
- package/src/modules/diff/diff.service.ts +6 -1
- package/src/modules/kb-fs/__tests__/branch-name.test.ts +6 -6
- package/src/modules/kb-fs/__tests__/clone-config.test.ts +24 -20
- package/src/modules/kb-fs/branch-name.ts +3 -3
- package/src/modules/kb-fs/clone-config.ts +15 -12
- package/src/modules/kb-fs/git-guarded-filesystem.ts +16 -3
- package/src/modules/marketplace/__tests__/marketplace-repo.head.test.ts +2 -1
- package/src/modules/mcp/__tests__/bevel-oauth-provider.test.ts +183 -13
- package/src/modules/mcp/__tests__/mcp-auth.middleware.test.ts +60 -2
- package/src/modules/mcp/__tests__/mcp.routes.local-token.test.ts +24 -4
- package/src/modules/mcp/__tests__/mcp.routes.stateless.test.ts +1 -1
- package/src/modules/mcp/__tests__/mcp.service.test.ts +120 -3
- package/src/modules/mcp/mcp-auth.middleware.ts +31 -0
- package/src/modules/mcp/mcp.routes.ts +11 -1
- package/src/modules/mcp/mcp.service.ts +73 -8
- package/src/modules/mcp/oauth/bevel-oauth-provider.ts +184 -6
- package/src/modules/plugins/__tests__/bundle-dialect.e2e.test.ts +12 -11
- package/src/modules/plugins/__tests__/bundle-dialect.test.ts +2 -1
- package/src/modules/plugins/__tests__/compile-marketplace.test.ts +6 -4
- package/src/modules/plugins/__tests__/join-request-jobs.service.test.ts +2 -1
- package/src/modules/plugins/__tests__/join-requests.service.test.ts +2 -1
- package/src/modules/plugins/__tests__/plugin-creation-display-name.test.ts +4 -3
- package/src/modules/plugins/__tests__/plugin-index.service.test.ts +6 -4
- package/src/modules/plugins/__tests__/plugin-links.service.test.ts +220 -5
- package/src/modules/plugins/__tests__/plugin-provision.service.test.ts +3 -1
- package/src/modules/plugins/__tests__/plugin-rename.service.test.ts +7 -6
- package/src/modules/plugins/__tests__/plugins.routes.test.ts +11 -2
- package/src/modules/plugins/__tests__/teams.routes.test.ts +2 -1
- package/src/modules/plugins/compile/marketplace-compiler.service.ts +7 -9
- package/src/modules/plugins/discovery/__tests__/kb-plugin-source.test.ts +20 -16
- package/src/modules/plugins/discovery/bundle-dialect/bundle.source.ts +9 -2
- package/src/modules/plugins/discovery/kb-plugin-source.ts +15 -8
- package/src/modules/plugins/discovery/native.source.ts +4 -1
- package/src/modules/plugins/index.ts +1 -1
- package/src/modules/plugins/join-request-jobs.service.ts +8 -7
- package/src/modules/plugins/join-requests.service.ts +7 -7
- package/src/modules/plugins/plugin-links.service.ts +192 -19
- package/src/modules/plugins/plugin-links.ts +147 -27
- package/src/modules/plugins/plugin-provision.service.ts +54 -27
- package/src/modules/plugins/plugin-rename.service.ts +10 -10
- package/src/modules/plugins/plugins.routes.ts +45 -15
- package/src/modules/plugins/plugins.service.ts +7 -11
- package/src/modules/plugins/teams.routes.ts +16 -8
- package/src/modules/secrets-vault/__tests__/connect-pending.route.test.ts +7 -0
- package/src/modules/secrets-vault/__tests__/secrets-variable-loader.test.ts +40 -0
- package/src/modules/secrets-vault/__tests__/tool-owner-gate.route.test.ts +2 -0
- package/src/modules/secrets-vault/index.ts +2 -0
- package/src/modules/secrets-vault/secrets-variable-loader.ts +51 -21
- package/src/modules/secrets-vault/secrets-vault.routes.ts +7 -6
- package/src/modules/settings/__tests__/deployment-settings.service.test.ts +59 -11
- package/src/modules/settings/__tests__/git-root-folders.test.ts +2 -1
- package/src/modules/settings/__tests__/setup.routes.boot-failure.test.ts +2 -1
- package/src/modules/settings/__tests__/setup.routes.layout-phase.test.ts +7 -4
- package/src/modules/settings/__tests__/setup.routes.oidc.test.ts +2 -0
- package/src/modules/settings/__tests__/setup.routes.sync-status.test.ts +2 -0
- package/src/modules/settings/__tests__/setup.routes.test.ts +33 -52
- package/src/modules/settings/deployment-settings.service.ts +68 -28
- package/src/modules/settings/setup.routes.ts +26 -16
- package/src/modules/skills/__tests__/allowed-tools-check.test.ts +11 -10
- package/src/modules/skills/__tests__/allowed-tools-warn.tools.test.ts +4 -3
- package/src/modules/skills/__tests__/pending-skills.service.test.ts +3 -1
- package/src/modules/skills/__tests__/skill-access-requests.routes.test.ts +2 -1
- package/src/modules/skills/__tests__/skills.routes.warnings.test.ts +2 -1
- package/src/modules/skills/__tests__/skills.service.test.ts +3 -2
- package/src/modules/skills/allowed-tools-check.ts +7 -6
- package/src/modules/skills/pending-skills.service.ts +9 -8
- package/src/modules/skills/skill-access-requests.routes.ts +7 -7
- package/src/modules/skills/skills.routes.ts +4 -3
- package/src/modules/skills/skills.service.ts +13 -9
- package/src/modules/tool-auth/__tests__/external-api-key.service.test.ts +29 -8
- package/src/modules/tool-auth/__tests__/internal-token.service.test.ts +6 -0
- package/src/modules/tool-auth/external-api-key.interface.ts +22 -5
- package/src/modules/tool-auth/external-api-key.service.ts +25 -8
- package/src/modules/tool-auth/internal-token.service.ts +11 -0
- package/src/modules/tool-auth/tool-auth.middleware.ts +17 -1
- package/src/modules/tool-helpers/__tests__/agent-roles-write.test.ts +3 -2
- package/src/modules/tool-helpers/__tests__/phase4-tools.test.ts +3 -2
- package/src/modules/tool-manuals/__tests__/mcp-json-discovery.test.ts +17 -12
- package/src/modules/tool-manuals/__tests__/mcp-server-edit.service.test.ts +2 -1
- package/src/modules/tool-manuals/__tests__/pending-tools.service.test.ts +4 -1
- package/src/modules/tool-manuals/__tests__/tool-delete.service.test.ts +2 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.archive.route.test.ts +2 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.cli.test.ts +5 -4
- package/src/modules/tool-manuals/__tests__/tool-manuals.detail.route.test.ts +2 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.invalid.routes.test.ts +4 -2
- package/src/modules/tool-manuals/__tests__/tool-manuals.invalid.test.ts +13 -5
- package/src/modules/tool-manuals/__tests__/tool-manuals.mcp-oauth.test.ts +2 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.restart.test.ts +9 -1
- package/src/modules/tool-manuals/__tests__/tool-manuals.service.test.ts +3 -2
- package/src/modules/tool-manuals/__tests__/tool-manuals.tools.test.ts +2 -0
- package/src/modules/tool-manuals/mcp-json-discovery.ts +6 -4
- package/src/modules/tool-manuals/mcp-server-edit.service.ts +13 -11
- package/src/modules/tool-manuals/pending-tools.service.ts +19 -16
- package/src/modules/tool-manuals/tool-delete.service.ts +13 -10
- package/src/modules/tool-manuals/tool-manuals.routes.ts +10 -8
- package/src/modules/tool-manuals/tool-manuals.service.ts +15 -13
- package/src/modules/tool-manuals/tool-manuals.tools.ts +7 -6
- package/src/modules/workflow/__tests__/apply-failure.test.ts +2 -1
- package/src/modules/workflow/__tests__/merge-announces-tree.test.ts +14 -26
- package/src/modules/workflow/__tests__/preserve-roles-yaml.test.ts +2 -1
- package/src/modules/workflow/__tests__/session-ontology.service.test.ts +3 -2
- package/src/modules/workflow/__tests__/workflow.routes.lock-path.test.ts +2 -1
- package/src/modules/workflow/__tests__/workflow.service.branch-in-use.test.ts +3 -10
- package/src/modules/workflow/__tests__/workflow.service.commitFileWhileLocked.test.ts +2 -1
- package/src/modules/workflow/__tests__/workflow.service.deleted-branch-sweep.test.ts +3 -10
- package/src/modules/workflow/__tests__/workflow.service.facade.test.ts +28 -27
- package/src/modules/workflow/__tests__/workflow.service.folder-proposals.test.ts +2 -1
- package/src/modules/workflow/__tests__/workflow.service.platform-restore.test.ts +2 -1
- package/src/modules/workflow/__tests__/workflow.service.read-gate.test.ts +3 -2
- package/src/modules/workflow/__tests__/workflow.service.releaseLock.test.ts +2 -1
- package/src/modules/workflow/__tests__/workflow.service.sync.test.ts +5 -4
- package/src/modules/workflow/__tests__/workflow.service.update-from-target.test.ts +2 -1
- package/src/modules/workflow/agent-tools/__tests__/workflow.tools.test.ts +2 -1
- package/src/modules/workflow/agent-tools/workflow.tools.ts +11 -9
- package/src/modules/workflow/git/__tests__/git.service.accessGating.test.ts +5 -4
- package/src/modules/workflow/git/__tests__/git.service.changedFilesForPr.test.ts +12 -11
- package/src/modules/workflow/git/__tests__/git.service.commitChanges.test.ts +9 -8
- package/src/modules/workflow/git/__tests__/git.service.commitFile.strayPath.test.ts +8 -7
- package/src/modules/workflow/git/__tests__/git.service.commitFile.test.ts +6 -5
- package/src/modules/workflow/git/__tests__/git.service.createBranch.test.ts +3 -2
- package/src/modules/workflow/git/__tests__/git.service.deleteBranch.test.ts +3 -2
- package/src/modules/workflow/git/__tests__/git.service.diffFileAtCommit.test.ts +7 -6
- package/src/modules/workflow/git/__tests__/git.service.diffFileBetweenBranches.test.ts +16 -15
- package/src/modules/workflow/git/__tests__/git.service.fileContentsAtCommit.test.ts +3 -2
- package/src/modules/workflow/git/__tests__/git.service.forkPoint.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.history-guards.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.list-branches.test.ts +10 -9
- package/src/modules/workflow/git/__tests__/git.service.listTrackedFiles.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.logForFile.test.ts +6 -5
- package/src/modules/workflow/git/__tests__/git.service.mergeChangeRequest.test.ts +9 -8
- package/src/modules/workflow/git/__tests__/git.service.pendingChanges.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.postMergePull.test.ts +4 -3
- package/src/modules/workflow/git/__tests__/git.service.pull.test.ts +9 -8
- package/src/modules/workflow/git/__tests__/git.service.readFileAtRef.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.revertPathsAndPush.test.ts +2 -1
- package/src/modules/workflow/git/__tests__/git.service.status.test.ts +4 -3
- package/src/modules/workflow/git/__tests__/git.service.syncFromRemote.test.ts +8 -7
- package/src/modules/workflow/git/__tests__/node-git-runner.test.ts +41 -3
- package/src/modules/workflow/git/git.service.ts +24 -13
- package/src/modules/workflow/git/node-git-runner.ts +37 -4
- package/src/modules/workflow/review-workflow/review-workflow.service.ts +9 -6
- package/src/modules/workflow/session-ontology.service.ts +7 -2
- package/src/modules/workflow/workflow.service.ts +31 -24
- package/src/modules/workspace/__tests__/file-stat-access.test.ts +3 -2
- package/src/modules/workspace/__tests__/git-internals.security.test.ts +144 -52
- package/src/modules/workspace/__tests__/session-ontology.gate.test.ts +4 -2
- package/src/modules/workspace/__tests__/workspace-paths-inside-the-repo.test.ts +3 -2
- package/src/modules/workspace/__tests__/workspace.routes.branch-errors.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.create-grant.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.delete.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.download-implies-read.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.download.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.file-writes.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.folders.test.ts +5 -4
- package/src/modules/workspace/__tests__/workspace.routes.move-platform-files.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.routes.read-gate.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.service.ensure-remotes-fetched.test.ts +2 -2
- package/src/modules/workspace/__tests__/workspace.service.list-cloned.test.ts +6 -5
- package/src/modules/workspace/__tests__/workspace.service.move-never-overwrites.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.service.read-filter.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.service.test.ts +84 -50
- package/src/modules/workspace/__tests__/workspace.service.unknown-branch.test.ts +2 -1
- package/src/modules/workspace/__tests__/workspace.tools.agents-file.test.ts +10 -7
- package/src/modules/workspace/__tests__/workspace.tools.branch-errors.test.ts +4 -3
- package/src/modules/workspace/__tests__/workspace.tools.test.ts +9 -8
- package/src/modules/workspace/__tests__/write-denial.test.ts +5 -4
- package/src/modules/workspace/session-ontology.gate.ts +6 -4
- package/src/modules/workspace/startup/__tests__/kb-startup-runner.degraded.test.ts +6 -2
- package/src/modules/workspace/startup/__tests__/kb-startup-runner.test.ts +29 -21
- package/src/modules/workspace/startup/kb-git.ts +15 -22
- package/src/modules/workspace/startup/kb-startup-runner.ts +40 -46
- package/src/modules/workspace/startup/steps/__tests__/steps.test.ts +104 -98
- package/src/modules/workspace/startup/steps/groups-to-plugins.step.ts +24 -16
- package/src/modules/workspace/startup/steps/personal-spaces.step.ts +14 -5
- package/src/modules/workspace/startup/steps/plugin-display-names.step.ts +13 -5
- package/src/modules/workspace/startup/steps/plugin-manifests.step.ts +14 -5
- package/src/modules/workspace/startup/steps/seed-tree.ts +11 -9
- package/src/modules/workspace/startup/steps/template-files.step.ts +43 -34
- package/src/modules/workspace/startup/steps/template-source.ts +8 -5
- package/src/modules/workspace/workspace.routes.ts +8 -7
- package/src/modules/workspace/workspace.service.ts +39 -27
- package/src/modules/workspace/workspace.tools.ts +68 -31
- package/src/modules/workspace/write-denial.ts +7 -5
- package/src/shared/__tests__/git-internals.test.ts +41 -0
- package/src/shared/__tests__/kb-layout.plugin.test.ts +19 -16
- package/src/shared/git-internals.ts +61 -6
- package/src/shared/git.contract.ts +70 -8
- package/src/shared/kb-context.ts +130 -0
- package/src/shared/kb-layout.test.ts +37 -27
- package/src/shared/kb-layout.ts +4 -3
- package/src/shared/pending-proposals.ts +7 -4
- package/src/shared/redact-secret.ts +5 -5
- package/src/tenancy/__tests__/static-tenant-source.test.ts +177 -0
- package/src/tenancy/__tests__/tenant-host.test.ts +372 -0
- package/src/tenancy/__tests__/tenant-runtime.test.ts +221 -0
- package/src/tenancy/__tests__/tenant-secrets.test.ts +35 -0
- package/src/tenancy/index.ts +35 -0
- package/src/tenancy/static-tenant-source.ts +296 -0
- package/src/tenancy/tenant-host.ts +261 -0
- package/src/tenancy/tenant-runtime.ts +208 -0
- package/src/tenancy/tenant-secrets.ts +41 -0
- package/src/tenancy/tenant-source.contract.ts +59 -0
- package/dist/modules/access/access-errors.d.ts +0 -34
- package/dist/modules/access/access-errors.d.ts.map +0 -1
- package/dist/modules/access/access-errors.js +0 -40
- package/dist/modules/access/access-errors.js.map +0 -1
- package/dist/modules/access/access-splice.d.ts +0 -140
- package/dist/modules/access/access-splice.d.ts.map +0 -1
- package/dist/modules/access/access-splice.js +0 -389
- package/dist/modules/access/access-splice.js.map +0 -1
- package/dist/modules/access/group-files.d.ts +0 -83
- package/dist/modules/access/group-files.d.ts.map +0 -1
- package/dist/modules/access/group-files.js +0 -167
- package/dist/modules/access/group-files.js.map +0 -1
- package/dist/modules/access/kb-read-filter.d.ts +0 -41
- package/dist/modules/access/kb-read-filter.d.ts.map +0 -1
- package/dist/modules/access/kb-read-filter.js +0 -60
- package/dist/modules/access/kb-read-filter.js.map +0 -1
- package/dist/modules/access/render-roles-yaml.d.ts +0 -22
- package/dist/modules/access/render-roles-yaml.d.ts.map +0 -1
- package/dist/modules/access/render-roles-yaml.js +0 -56
- package/dist/modules/access/render-roles-yaml.js.map +0 -1
- package/dist/modules/access/roles-yaml-guard.d.ts +0 -56
- package/dist/modules/access/roles-yaml-guard.d.ts.map +0 -1
- package/dist/modules/access/roles-yaml-guard.js +0 -79
- package/dist/modules/access/roles-yaml-guard.js.map +0 -1
- package/dist/modules/diff/diff-paths.d.ts +0 -2
- package/dist/modules/diff/diff-paths.d.ts.map +0 -1
- package/dist/modules/diff/diff-paths.js +0 -9
- package/dist/modules/diff/diff-paths.js.map +0 -1
- package/dist/modules/groups/group-provision.service.d.ts +0 -130
- package/dist/modules/groups/group-provision.service.d.ts.map +0 -1
- package/dist/modules/groups/group-provision.service.js +0 -288
- package/dist/modules/groups/group-provision.service.js.map +0 -1
- package/dist/modules/groups/groups.contract.d.ts +0 -106
- package/dist/modules/groups/groups.contract.d.ts.map +0 -1
- package/dist/modules/groups/groups.contract.js +0 -36
- package/dist/modules/groups/groups.contract.js.map +0 -1
- package/dist/modules/groups/groups.routes.d.ts +0 -42
- package/dist/modules/groups/groups.routes.d.ts.map +0 -1
- package/dist/modules/groups/groups.routes.js +0 -379
- package/dist/modules/groups/groups.routes.js.map +0 -1
- package/dist/modules/groups/groups.service.d.ts +0 -60
- package/dist/modules/groups/groups.service.d.ts.map +0 -1
- package/dist/modules/groups/groups.service.js +0 -172
- package/dist/modules/groups/groups.service.js.map +0 -1
- package/dist/modules/groups/index.d.ts +0 -7
- package/dist/modules/groups/index.d.ts.map +0 -1
- package/dist/modules/groups/index.js +0 -6
- package/dist/modules/groups/index.js.map +0 -1
- package/dist/modules/groups/join-proposals.d.ts +0 -53
- package/dist/modules/groups/join-proposals.d.ts.map +0 -1
- package/dist/modules/groups/join-proposals.js +0 -67
- package/dist/modules/groups/join-proposals.js.map +0 -1
- package/dist/modules/groups/join-requests.service.d.ts +0 -81
- package/dist/modules/groups/join-requests.service.d.ts.map +0 -1
- package/dist/modules/groups/join-requests.service.js +0 -135
- package/dist/modules/groups/join-requests.service.js.map +0 -1
- package/dist/modules/mcp/mcp-session-store.d.ts +0 -74
- package/dist/modules/mcp/mcp-session-store.d.ts.map +0 -1
- package/dist/modules/mcp/mcp-session-store.js +0 -131
- package/dist/modules/mcp/mcp-session-store.js.map +0 -1
- package/dist/modules/workflow/file-change-notifier.d.ts +0 -38
- package/dist/modules/workflow/file-change-notifier.d.ts.map +0 -1
- package/dist/modules/workflow/file-change-notifier.js +0 -22
- package/dist/modules/workflow/file-change-notifier.js.map +0 -1
- package/dist/modules/workflow/git/branch-name.d.ts +0 -10
- package/dist/modules/workflow/git/branch-name.d.ts.map +0 -1
- package/dist/modules/workflow/git/branch-name.js +0 -76
- package/dist/modules/workflow/git/branch-name.js.map +0 -1
- package/dist/modules/workflow/git/clone-config.d.ts +0 -61
- package/dist/modules/workflow/git/clone-config.d.ts.map +0 -1
- package/dist/modules/workflow/git/clone-config.js +0 -69
- package/dist/modules/workflow/git/clone-config.js.map +0 -1
- package/dist/modules/workflow/git/mutex.d.ts +0 -11
- package/dist/modules/workflow/git/mutex.d.ts.map +0 -1
- package/dist/modules/workflow/git/mutex.js +0 -23
- package/dist/modules/workflow/git/mutex.js.map +0 -1
- package/dist/modules/workflow/locking-filesystem.d.ts +0 -137
- package/dist/modules/workflow/locking-filesystem.d.ts.map +0 -1
- package/dist/modules/workflow/locking-filesystem.js +0 -553
- package/dist/modules/workflow/locking-filesystem.js.map +0 -1
- package/dist/modules/workflow/read-only-filesystem.d.ts +0 -24
- package/dist/modules/workflow/read-only-filesystem.d.ts.map +0 -1
- package/dist/modules/workflow/read-only-filesystem.js +0 -39
- package/dist/modules/workflow/read-only-filesystem.js.map +0 -1
- package/dist/modules/workflow/workflow.errors.d.ts +0 -197
- package/dist/modules/workflow/workflow.errors.d.ts.map +0 -1
- package/dist/modules/workflow/workflow.errors.js +0 -298
- package/dist/modules/workflow/workflow.errors.js.map +0 -1
- package/dist/modules/workspace/bevel-ignore.d.ts +0 -30
- package/dist/modules/workspace/bevel-ignore.d.ts.map +0 -1
- package/dist/modules/workspace/bevel-ignore.js +0 -61
- package/dist/modules/workspace/bevel-ignore.js.map +0 -1
- package/dist/modules/workspace/kb-seed.interface.d.ts +0 -36
- package/dist/modules/workspace/kb-seed.interface.d.ts.map +0 -1
- package/dist/modules/workspace/kb-seed.interface.js +0 -2
- package/dist/modules/workspace/kb-seed.interface.js.map +0 -1
- package/dist/modules/workspace/kb-seed.service.d.ts +0 -125
- package/dist/modules/workspace/kb-seed.service.d.ts.map +0 -1
- package/dist/modules/workspace/kb-seed.service.js +0 -535
- package/dist/modules/workspace/kb-seed.service.js.map +0 -1
- package/dist/modules/workspace/plugins-migration.d.ts +0 -50
- package/dist/modules/workspace/plugins-migration.d.ts.map +0 -1
- package/dist/modules/workspace/plugins-migration.js +0 -379
- package/dist/modules/workspace/plugins-migration.js.map +0 -1
- package/dist/shared/fs-errors.d.ts +0 -8
- package/dist/shared/fs-errors.d.ts.map +0 -1
- package/dist/shared/fs-errors.js +0 -11
- package/dist/shared/fs-errors.js.map +0 -1
- package/dist/shared/fs-walk.d.ts +0 -23
- package/dist/shared/fs-walk.d.ts.map +0 -1
- package/dist/shared/fs-walk.js +0 -42
- package/dist/shared/fs-walk.js.map +0 -1
- package/dist/shared/hash-email.d.ts +0 -11
- package/dist/shared/hash-email.d.ts.map +0 -1
- package/dist/shared/hash-email.js +0 -14
- package/dist/shared/hash-email.js.map +0 -1
- package/dist/shared/kb-walk.d.ts +0 -52
- package/dist/shared/kb-walk.d.ts.map +0 -1
- package/dist/shared/kb-walk.js +0 -76
- package/dist/shared/kb-walk.js.map +0 -1
|
@@ -10,6 +10,7 @@ import type { WorkflowService } from '../../workflow/workflow.service.js';
|
|
|
10
10
|
import type { WorkflowEventBus } from '../../workflow/event-bus.js';
|
|
11
11
|
import { createAccessRoutes } from '../access.routes.js';
|
|
12
12
|
import { usersDbDouble } from './users-db-double.js';
|
|
13
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
13
14
|
|
|
14
15
|
/**
|
|
15
16
|
* HTTP-level contract tests for the revoke route's CLASSIFICATION + MODE logic —
|
|
@@ -133,7 +134,7 @@ async function makeHarness(opts: {
|
|
|
133
134
|
(req as unknown as { userId: string }).userId = USER.id;
|
|
134
135
|
next();
|
|
135
136
|
});
|
|
136
|
-
app.use('/api', createAccessRoutes(accessControl, workspaceService, authService, workflowService, eventBus, db, KB));
|
|
137
|
+
app.use('/api', createAccessRoutes(accessControl, workspaceService, authService, workflowService, eventBus, db, testKbContext({ kbDirName: KB })));
|
|
137
138
|
|
|
138
139
|
const server = await new Promise<Server>((resolve) => {
|
|
139
140
|
const s = app.listen(0, () => resolve(s));
|
|
@@ -11,6 +11,7 @@ import type { WorkflowEventBus } from '../../workflow/event-bus.js';
|
|
|
11
11
|
import { createAccessRoutes } from '../access.routes.js';
|
|
12
12
|
import type { Database } from '../../database/connection.js';
|
|
13
13
|
import { usersDbDouble } from './users-db-double.js';
|
|
14
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
14
15
|
|
|
15
16
|
/**
|
|
16
17
|
* A grant to an email with NO ACCOUNT says so, and stays allowed.
|
|
@@ -107,7 +108,7 @@ async function makeHarness(opts: {
|
|
|
107
108
|
workflowService,
|
|
108
109
|
{ emit: vi.fn() } as unknown as WorkflowEventBus,
|
|
109
110
|
opts.db ?? usersDbDouble(opts.accounts ?? []),
|
|
110
|
-
KB,
|
|
111
|
+
testKbContext({ kbDirName: KB }),
|
|
111
112
|
),
|
|
112
113
|
);
|
|
113
114
|
|
|
@@ -8,6 +8,8 @@ import { AccessControlService } from '../access-control.service.js';
|
|
|
8
8
|
import { ChangeReadGate, isNewTopLevelFolderPath } from '../change-read-gate.js';
|
|
9
9
|
import { AccessDeniedError } from '../../access-model/access-errors.js';
|
|
10
10
|
import { SYNCED_GROUPS_YAML } from '../../access-model/group-files.js';
|
|
11
|
+
import { DEFAULT_KB_LAYOUT } from '@bevel-software/platform-shared';
|
|
12
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
11
13
|
|
|
12
14
|
const KB = 'knowledge-base';
|
|
13
15
|
const WS = 'ws-gate';
|
|
@@ -56,7 +58,7 @@ describe('ChangeReadGate', () => {
|
|
|
56
58
|
await write(repo, 'roles.yaml', ROLES_YAML);
|
|
57
59
|
const ws = stubWorkspaceService(workspaceDir);
|
|
58
60
|
access = new AccessControlService(ws, KB, new NodeFs());
|
|
59
|
-
gate = new ChangeReadGate(ws, access, KB, new NodeFs());
|
|
61
|
+
gate = new ChangeReadGate(ws, access, testKbContext({ kbDirName: KB }), new NodeFs());
|
|
60
62
|
});
|
|
61
63
|
|
|
62
64
|
afterEach(async () => {
|
|
@@ -255,18 +257,18 @@ describe('isNewTopLevelFolderPath', () => {
|
|
|
255
257
|
const exists = async (p: string) => onDisk.has(p);
|
|
256
258
|
|
|
257
259
|
it('is true for a path inside a folder directly under a creatable root that is not on disk', async () => {
|
|
258
|
-
expect(await isNewTopLevelFolderPath('KnowledgeBase/New/a.md', 'file', exists)).toBe(true);
|
|
259
|
-
expect(await isNewTopLevelFolderPath('Skills/fresh/SKILL.md', 'file', exists)).toBe(true);
|
|
260
|
-
expect(await isNewTopLevelFolderPath('Plugins/team/deep/er/x', 'file', exists)).toBe(true);
|
|
261
|
-
expect(await isNewTopLevelFolderPath('KnowledgeBase/New', 'dir', exists)).toBe(true);
|
|
260
|
+
expect(await isNewTopLevelFolderPath('KnowledgeBase/New/a.md', 'file', exists, DEFAULT_KB_LAYOUT)).toBe(true);
|
|
261
|
+
expect(await isNewTopLevelFolderPath('Skills/fresh/SKILL.md', 'file', exists, DEFAULT_KB_LAYOUT)).toBe(true);
|
|
262
|
+
expect(await isNewTopLevelFolderPath('Plugins/team/deep/er/x', 'file', exists, DEFAULT_KB_LAYOUT)).toBe(true);
|
|
263
|
+
expect(await isNewTopLevelFolderPath('KnowledgeBase/New', 'dir', exists, DEFAULT_KB_LAYOUT)).toBe(true);
|
|
262
264
|
});
|
|
263
265
|
|
|
264
266
|
it('is false when the top-level folder exists, for a loose file at the root, and outside the three roots', async () => {
|
|
265
|
-
expect(await isNewTopLevelFolderPath('KnowledgeBase/Existing/a.md', 'file', exists)).toBe(false);
|
|
266
|
-
expect(await isNewTopLevelFolderPath('Skills/known', 'dir', exists)).toBe(false);
|
|
267
|
-
expect(await isNewTopLevelFolderPath('KnowledgeBase/loose.md', 'file', exists)).toBe(false);
|
|
268
|
-
expect(await isNewTopLevelFolderPath('KnowledgeBase', 'dir', exists)).toBe(false);
|
|
269
|
-
expect(await isNewTopLevelFolderPath('Data/New/a.md', 'file', exists)).toBe(false);
|
|
270
|
-
expect(await isNewTopLevelFolderPath('roles.yaml', 'file', exists)).toBe(false);
|
|
267
|
+
expect(await isNewTopLevelFolderPath('KnowledgeBase/Existing/a.md', 'file', exists, DEFAULT_KB_LAYOUT)).toBe(false);
|
|
268
|
+
expect(await isNewTopLevelFolderPath('Skills/known', 'dir', exists, DEFAULT_KB_LAYOUT)).toBe(false);
|
|
269
|
+
expect(await isNewTopLevelFolderPath('KnowledgeBase/loose.md', 'file', exists, DEFAULT_KB_LAYOUT)).toBe(false);
|
|
270
|
+
expect(await isNewTopLevelFolderPath('KnowledgeBase', 'dir', exists, DEFAULT_KB_LAYOUT)).toBe(false);
|
|
271
|
+
expect(await isNewTopLevelFolderPath('Data/New/a.md', 'file', exists, DEFAULT_KB_LAYOUT)).toBe(false);
|
|
272
|
+
expect(await isNewTopLevelFolderPath('roles.yaml', 'file', exists, DEFAULT_KB_LAYOUT)).toBe(false);
|
|
271
273
|
});
|
|
272
274
|
});
|
|
@@ -7,6 +7,7 @@ import os from 'node:os';
|
|
|
7
7
|
import type { WorkspaceService } from '../../workspace/workspace.service.js';
|
|
8
8
|
import { AccessControlService } from '../access-control.service.js';
|
|
9
9
|
import { CreatorAccessService } from '../creator-access.js';
|
|
10
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
10
11
|
|
|
11
12
|
const KB = 'knowledge-base';
|
|
12
13
|
const WS = 'ws-creator';
|
|
@@ -61,7 +62,7 @@ describe('CreatorAccessService.planForCreate', () => {
|
|
|
61
62
|
await fs.mkdir(path.join(repo, 'Plugins'), { recursive: true });
|
|
62
63
|
await write(repo, 'roles.yaml', ROLES_YAML);
|
|
63
64
|
const ws = stubWorkspaceService(workspaceDir);
|
|
64
|
-
svc = new CreatorAccessService(ws, new AccessControlService(ws, KB, new NodeFs()), KB, new NodeFs());
|
|
65
|
+
svc = new CreatorAccessService(ws, new AccessControlService(ws, KB, new NodeFs()), testKbContext({ kbDirName: KB }), new NodeFs());
|
|
65
66
|
});
|
|
66
67
|
|
|
67
68
|
afterEach(async () => {
|
|
@@ -175,7 +176,7 @@ describe('CreatorAccessService.planForCreate', () => {
|
|
|
175
176
|
},
|
|
176
177
|
});
|
|
177
178
|
const ws = stubWorkspaceService(path.join(root, WS));
|
|
178
|
-
const withFailingDisk = new CreatorAccessService(ws, new AccessControlService(ws, KB, real), KB, failing);
|
|
179
|
+
const withFailingDisk = new CreatorAccessService(ws, new AccessControlService(ws, KB, real), testKbContext({ kbDirName: KB }), failing);
|
|
179
180
|
expect(await withFailingDisk.planForCreate(WS, ALICE, `${KB}/KnowledgeBase/Projects`, 'dir')).toBeNull();
|
|
180
181
|
expect(await withFailingDisk.planForCreate(WS, ALICE, `${KB}/KnowledgeBase/Projects/a.md`, 'file')).toBeNull();
|
|
181
182
|
// The same creation on a disk that answers is planned, so it was the
|
|
@@ -15,6 +15,7 @@ import type { WorkflowEventBus } from '../../workflow/event-bus.js';
|
|
|
15
15
|
import type { FileTreeEntry } from '@bevel-software/platform-shared';
|
|
16
16
|
import { createAccessRoutes } from '../access.routes.js';
|
|
17
17
|
import { usersDbDouble } from './users-db-double.js';
|
|
18
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
18
19
|
|
|
19
20
|
/**
|
|
20
21
|
* HTTP-level contract tests for the /api/access/roles routes: the admin gate
|
|
@@ -137,7 +138,7 @@ async function makeHarness(opts: { isAdmin?: boolean } = {}): Promise<{ server:
|
|
|
137
138
|
(req as unknown as { userId: string }).userId = ADMIN.id;
|
|
138
139
|
next();
|
|
139
140
|
});
|
|
140
|
-
app.use('/api', createAccessRoutes(accessControl, workspaceService, authService, workflowService, eventBus, db, KB));
|
|
141
|
+
app.use('/api', createAccessRoutes(accessControl, workspaceService, authService, workflowService, eventBus, db, testKbContext({ kbDirName: KB })));
|
|
141
142
|
|
|
142
143
|
const server = await new Promise<Server>((resolve) => {
|
|
143
144
|
const s = app.listen(0, () => resolve(s));
|
|
@@ -22,10 +22,14 @@ import type {
|
|
|
22
22
|
ProspectiveHolders,
|
|
23
23
|
ResolvedPrincipal,
|
|
24
24
|
} from './access-control.interface.js';
|
|
25
|
-
import {
|
|
25
|
+
import {
|
|
26
|
+
DEFAULT_KB_LAYOUT,
|
|
27
|
+
PLUGIN_MANIFEST_FILE,
|
|
28
|
+
isPersonalPluginDir,
|
|
26
29
|
pluginIdentityOf,
|
|
27
30
|
platformRestoreDestination,
|
|
28
31
|
} from '@bevel-software/platform-shared';
|
|
32
|
+
import type { KbContext } from '../../shared/kb-context.js';
|
|
29
33
|
import { AccessConfigError, AccessUnreadableError } from '../access-model/access-errors.js';
|
|
30
34
|
import { WorkflowDomainError } from '../../shared/domain-errors.js';
|
|
31
35
|
import { synthesizePluginPrincipals } from '../access-model/plugin-principals.js';
|
|
@@ -291,13 +295,14 @@ interface AccessScope {
|
|
|
291
295
|
*/
|
|
292
296
|
function accessFileListener(
|
|
293
297
|
repoDir: string,
|
|
298
|
+
pluginsDir: string,
|
|
294
299
|
out: Map<string, AccessFile>,
|
|
295
300
|
pluginDirs: Map<string, string>,
|
|
296
301
|
): WalkListener {
|
|
297
302
|
return {
|
|
298
303
|
async onFile(dir, name) {
|
|
299
304
|
const rel = dir ? `${dir}/${name}` : name;
|
|
300
|
-
if (name === PLUGIN_MANIFEST_FILE && dir.startsWith(`${
|
|
305
|
+
if (name === PLUGIN_MANIFEST_FILE && dir.startsWith(`${pluginsDir}/`)) {
|
|
301
306
|
const text = await fs.readFile(path.join(repoDir, rel), 'utf-8').catch(() => null);
|
|
302
307
|
pluginDirs.set(dir, pluginIdentityOf(parseManifestText(text), path.posix.basename(dir)));
|
|
303
308
|
return;
|
|
@@ -1301,6 +1306,14 @@ export class AccessControlService implements IAccessControl {
|
|
|
1301
1306
|
* many fixtures construct this service directly.
|
|
1302
1307
|
*/
|
|
1303
1308
|
private readonly gitRunner: IGitRunner = new NodeGitRunner(),
|
|
1309
|
+
/**
|
|
1310
|
+
* The knowledge base's layout — which folder is the plugins root, what the
|
|
1311
|
+
* platform files are called. Read per use, never captured: the roots are
|
|
1312
|
+
* renameable from the setup screen. Defaulted for the same reason as
|
|
1313
|
+
* `deploymentOwners`: the fixtures that construct this service directly
|
|
1314
|
+
* run on the default layout.
|
|
1315
|
+
*/
|
|
1316
|
+
private readonly kb: Pick<KbContext, 'layout'> = { layout: DEFAULT_KB_LAYOUT },
|
|
1304
1317
|
) {
|
|
1305
1318
|
this.deploymentOwners = new Set(
|
|
1306
1319
|
deploymentOwners.filter(Boolean).map((e) => canonicalEmail(e)),
|
|
@@ -1806,7 +1819,7 @@ export class AccessControlService implements IAccessControl {
|
|
|
1806
1819
|
principal.kind === 'plugin' &&
|
|
1807
1820
|
principal.pluginName &&
|
|
1808
1821
|
principal.pluginDir &&
|
|
1809
|
-
!isPersonalPluginDir(principal.pluginDir)
|
|
1822
|
+
!isPersonalPluginDir(principal.pluginDir, this.kb.layout)
|
|
1810
1823
|
) {
|
|
1811
1824
|
plugins.set(principal.pluginName, principal.pluginDir);
|
|
1812
1825
|
}
|
|
@@ -1982,7 +1995,7 @@ export class AccessControlService implements IAccessControl {
|
|
|
1982
1995
|
userEmail: string,
|
|
1983
1996
|
destinationRelativePath: string,
|
|
1984
1997
|
): Promise<boolean> {
|
|
1985
|
-
const target = platformRestoreDestination(destinationRelativePath);
|
|
1998
|
+
const target = platformRestoreDestination(destinationRelativePath, this.kb.layout);
|
|
1986
1999
|
if (target === null) return false;
|
|
1987
2000
|
const email = canonicalEmail(userEmail);
|
|
1988
2001
|
|
|
@@ -2143,7 +2156,7 @@ export class AccessControlService implements IAccessControl {
|
|
|
2143
2156
|
// / `roles.yaml` because `hasPermissionResolved` admin-rescues those
|
|
2144
2157
|
// paths, so the bad config remains fixable from inside the app.
|
|
2145
2158
|
const pluginDirs = new Map<string, string>();
|
|
2146
|
-
await this.disk.walkKb(repoDir, [accessFileListener(repoDir, accessFiles, pluginDirs)]);
|
|
2159
|
+
await this.disk.walkKb(repoDir, [accessFileListener(repoDir, this.kb.layout.pluginsDir, accessFiles, pluginDirs)]);
|
|
2147
2160
|
|
|
2148
2161
|
// Plugin principals (`plugin/<Name>/<verb>`), derived from each plugin
|
|
2149
2162
|
// folder's own access.md — a plugin being a folder with a manifest, at
|
|
@@ -2320,11 +2333,12 @@ export class AccessControlService implements IAccessControl {
|
|
|
2320
2333
|
const { stdout } = await this.gitRunner.run(repoDir, ['ls-tree', '-r', '--name-only', ref]);
|
|
2321
2334
|
const out: string[] = [];
|
|
2322
2335
|
const pluginDirs: string[] = [];
|
|
2336
|
+
const { pluginsDir } = this.kb.layout;
|
|
2323
2337
|
for (const line of stdout.split('\n')) {
|
|
2324
2338
|
const p = line.trim();
|
|
2325
2339
|
if (!p) continue;
|
|
2326
2340
|
if (p === 'access.md' || p.endsWith('/access.md')) out.push(p);
|
|
2327
|
-
else if (p.startsWith(`${
|
|
2341
|
+
else if (p.startsWith(`${pluginsDir}/`) && p.endsWith(`/${PLUGIN_MANIFEST_FILE}`)) {
|
|
2328
2342
|
pluginDirs.push(p.slice(0, -(PLUGIN_MANIFEST_FILE.length + 1)));
|
|
2329
2343
|
}
|
|
2330
2344
|
}
|
|
@@ -9,8 +9,6 @@ const grantLog = logger('access.grant');
|
|
|
9
9
|
const revokeLog = logger('access.revoke');
|
|
10
10
|
import type { AuthUser } from '@bevel-software/platform-shared';
|
|
11
11
|
import {
|
|
12
|
-
isProtectedBranch,
|
|
13
|
-
DEFAULT_BRANCH,
|
|
14
12
|
pluginManifestName,
|
|
15
13
|
FOLDER_GOVERNS_ACCESS_KIND,
|
|
16
14
|
} from '@bevel-software/platform-shared';
|
|
@@ -20,7 +18,8 @@ import type {
|
|
|
20
18
|
GrantSources,
|
|
21
19
|
} from './access-control.interface.js';
|
|
22
20
|
import type { WorkspaceService } from '../workspace/workspace.service.js';
|
|
23
|
-
import {
|
|
21
|
+
import type { KbContext } from '../../shared/kb-context.js';
|
|
22
|
+
import { branchForWorkspaceId } from '../../shared/workspace-id.js';
|
|
24
23
|
import type { AuthService } from '../auth/auth.service.js';
|
|
25
24
|
import type { WorkflowService } from '../workflow/workflow.service.js';
|
|
26
25
|
import type { WorkflowEventBus } from '../workflow/event-bus.js';
|
|
@@ -89,18 +88,19 @@ export function createAccessRoutes(
|
|
|
89
88
|
workflowService: WorkflowService,
|
|
90
89
|
eventBus: WorkflowEventBus,
|
|
91
90
|
db: Database,
|
|
92
|
-
|
|
91
|
+
kb: KbContext,
|
|
93
92
|
/** This deployment's configured admins — the break-glass recovery roster. */
|
|
94
93
|
recoveryAdmins: readonly string[] = [],
|
|
95
94
|
): express.Router {
|
|
96
95
|
const router = express.Router({ mergeParams: true });
|
|
96
|
+
const { kbDirName } = kb;
|
|
97
97
|
const mutation = new AccessMutationService(workspaceService, accessControl, kbDirName);
|
|
98
98
|
const rolesAdmin = new RolesAdminService(
|
|
99
99
|
workspaceService,
|
|
100
100
|
workflowService,
|
|
101
101
|
accessControl,
|
|
102
102
|
kbDirName,
|
|
103
|
-
() =>
|
|
103
|
+
() => kb.defaultBranch,
|
|
104
104
|
eventBus,
|
|
105
105
|
recoveryAdmins,
|
|
106
106
|
);
|
|
@@ -118,10 +118,8 @@ export function createAccessRoutes(
|
|
|
118
118
|
groups: string[];
|
|
119
119
|
plugins: { name: string; folder: string }[];
|
|
120
120
|
}> => {
|
|
121
|
-
await workspaceService.getOrCreateForBranch(
|
|
122
|
-
const { roles, groups, plugins } = await accessControl.kbPrincipals(
|
|
123
|
-
workspaceIdForBranch(DEFAULT_BRANCH),
|
|
124
|
-
);
|
|
121
|
+
await workspaceService.getOrCreateForBranch(kb.defaultBranch);
|
|
122
|
+
const { roles, groups, plugins } = await accessControl.kbPrincipals(kb.defaultWorkspaceId());
|
|
125
123
|
// `plugins` is defensive: an older resolver double may omit it.
|
|
126
124
|
return { roles, groups, plugins: plugins ?? [] };
|
|
127
125
|
};
|
|
@@ -139,7 +137,7 @@ export function createAccessRoutes(
|
|
|
139
137
|
): Promise<{ name: string; folder: string }[]> => {
|
|
140
138
|
if (plugins.length === 0) return [];
|
|
141
139
|
const verdicts = await accessControl.canReadBatch(
|
|
142
|
-
|
|
140
|
+
kb.defaultWorkspaceId(),
|
|
143
141
|
email,
|
|
144
142
|
plugins.map((p) => `${p.folder}/access.md`),
|
|
145
143
|
);
|
|
@@ -711,7 +709,6 @@ export function createAccessRoutes(
|
|
|
711
709
|
// resolves to false and is rejected above. Nothing extra needed here — but
|
|
712
710
|
// keep the branch check explicit so the intent is legible.
|
|
713
711
|
void branch;
|
|
714
|
-
void isProtectedBranch;
|
|
715
712
|
}
|
|
716
713
|
|
|
717
714
|
/**
|
|
@@ -1211,8 +1208,8 @@ export function createAccessRoutes(
|
|
|
1211
1208
|
|
|
1212
1209
|
/** Fail-fast admin gate for the roles routes. Throws AccessDeniedError. */
|
|
1213
1210
|
async function assertRolesAdmin(userEmail: string): Promise<void> {
|
|
1214
|
-
await workspaceService.getOrCreateForBranch(
|
|
1215
|
-
await assertCanMutate(
|
|
1211
|
+
await workspaceService.getOrCreateForBranch(kb.defaultBranch);
|
|
1212
|
+
await assertCanMutate(kb.defaultWorkspaceId(), kb.defaultBranch, userEmail, 'roles.yaml');
|
|
1216
1213
|
}
|
|
1217
1214
|
|
|
1218
1215
|
router.get('/access/roles', async (req, res) => {
|
|
@@ -15,8 +15,9 @@
|
|
|
15
15
|
*/
|
|
16
16
|
|
|
17
17
|
import path from 'node:path';
|
|
18
|
-
import { creatableRootDirNames } from '@bevel-software/platform-shared';
|
|
18
|
+
import { creatableRootDirNames, type KbLayout } from '@bevel-software/platform-shared';
|
|
19
19
|
import type { IFsProbe } from '../../shared/fs.contract.js';
|
|
20
|
+
import type { KbContext } from '../../shared/kb-context.js';
|
|
20
21
|
import type { WorkspaceService } from '../workspace/workspace.service.js';
|
|
21
22
|
import type { IAccessControl } from './access-control.interface.js';
|
|
22
23
|
import { AccessConfigError, AccessDeniedError } from '../access-model/access-errors.js';
|
|
@@ -39,10 +40,11 @@ export async function isNewTopLevelFolderPath(
|
|
|
39
40
|
kbRel: string,
|
|
40
41
|
kind: ChangeTargetKind,
|
|
41
42
|
exists: (kbRel: string) => Promise<boolean>,
|
|
43
|
+
layout: KbLayout,
|
|
42
44
|
): Promise<boolean> {
|
|
43
45
|
const segments = kbRel.split('/');
|
|
44
46
|
const root = segments[0];
|
|
45
|
-
if (root === undefined || !creatableRootDirNames().has(root)) return false;
|
|
47
|
+
if (root === undefined || !creatableRootDirNames(layout).has(root)) return false;
|
|
46
48
|
if (segments.length < (kind === 'dir' ? 2 : 3)) return false;
|
|
47
49
|
return !(await exists(`${root}/${segments[1]}`));
|
|
48
50
|
}
|
|
@@ -51,10 +53,14 @@ export class ChangeReadGate implements IChangeReadGate {
|
|
|
51
53
|
constructor(
|
|
52
54
|
private readonly workspaceService: Pick<WorkspaceService, 'getWorkspacePath'>,
|
|
53
55
|
private readonly accessControl: Pick<IAccessControl, 'canRead' | 'holdsAdminRootWrite'>,
|
|
54
|
-
private readonly
|
|
56
|
+
private readonly kb: KbContext,
|
|
55
57
|
private readonly disk: IFsProbe,
|
|
56
58
|
) {}
|
|
57
59
|
|
|
60
|
+
private get kbDirName(): string {
|
|
61
|
+
return this.kb.kbDirName;
|
|
62
|
+
}
|
|
63
|
+
|
|
58
64
|
async judge(
|
|
59
65
|
workspaceId: string,
|
|
60
66
|
userEmail: string,
|
|
@@ -88,7 +94,7 @@ export class ChangeReadGate implements IChangeReadGate {
|
|
|
88
94
|
return { allowed: true, via: 'admin-rescue' };
|
|
89
95
|
}
|
|
90
96
|
}
|
|
91
|
-
if (await isNewTopLevelFolderPath(rel, kind, exists)) {
|
|
97
|
+
if (await isNewTopLevelFolderPath(rel, kind, exists, this.kb.layout)) {
|
|
92
98
|
return { allowed: true, via: 'new-top-level-folder' };
|
|
93
99
|
}
|
|
94
100
|
if (await this.accessControl.canRead(workspaceId, userEmail, rel)) {
|
|
@@ -33,6 +33,7 @@ import { printable } from '../../shared/printable.js';
|
|
|
33
33
|
const log = logger('creator-access');
|
|
34
34
|
|
|
35
35
|
import type { IFsProbe } from '../../shared/fs.contract.js';
|
|
36
|
+
import type { KbContext } from '../../shared/kb-context.js';
|
|
36
37
|
import type { WorkspaceService } from '../workspace/workspace.service.js';
|
|
37
38
|
import type { IAccessControl } from './access-control.interface.js';
|
|
38
39
|
import { spliceGrant, type Principal } from '../access-model/access-splice.js';
|
|
@@ -49,10 +50,14 @@ export class CreatorAccessService implements ICreatorAccess {
|
|
|
49
50
|
constructor(
|
|
50
51
|
private readonly workspaceService: WorkspaceService,
|
|
51
52
|
private readonly accessControl: IAccessControl,
|
|
52
|
-
private readonly
|
|
53
|
+
private readonly kb: KbContext,
|
|
53
54
|
private readonly disk: IFsProbe,
|
|
54
55
|
) {}
|
|
55
56
|
|
|
57
|
+
private get kbDirName(): string {
|
|
58
|
+
return this.kb.kbDirName;
|
|
59
|
+
}
|
|
60
|
+
|
|
56
61
|
/**
|
|
57
62
|
* Whether something is at `abs`. Links are NOT followed: a link, dangling
|
|
58
63
|
* or not, is something there — never a "new" folder to seed a grant under,
|
|
@@ -106,7 +111,7 @@ export class CreatorAccessService implements ICreatorAccess {
|
|
|
106
111
|
const segments = rel.split('/');
|
|
107
112
|
if (kind === 'file') segments.pop();
|
|
108
113
|
const root = segments[0];
|
|
109
|
-
if (root === undefined || segments.length < 2 || !creatableRootDirNames().has(root)) return null;
|
|
114
|
+
if (root === undefined || segments.length < 2 || !creatableRootDirNames(this.kb.layout).has(root)) return null;
|
|
110
115
|
const top = `${root}/${segments[1]}`;
|
|
111
116
|
try {
|
|
112
117
|
if (await this.exists(path.join(repoDir, top))) return null;
|
|
@@ -6,6 +6,7 @@ import { DEFAULT_BRANCH } from '@bevel-software/platform-shared';
|
|
|
6
6
|
import { workspaceIdForBranch } from '../../../shared/workspace-id.js';
|
|
7
7
|
import { readAgentPreamble, type PreambleWorkspace } from '../read-preamble.js';
|
|
8
8
|
import { NodeFs } from '../../kb-fs/node-fs.js';
|
|
9
|
+
import { testKbContext } from '../../../__tests__/kb-context.js';
|
|
9
10
|
|
|
10
11
|
/** The one disk, as production wires it. */
|
|
11
12
|
const disk = new NodeFs();
|
|
@@ -42,7 +43,7 @@ describe('readAgentPreamble', () => {
|
|
|
42
43
|
it('reads the default branch copy at <kbDirName>/mcp-description.md, creating the workspace first', async () => {
|
|
43
44
|
await fs.writeFile(path.join(wsDir, KB, 'mcp-description.md'), 'Acme.\n', 'utf8');
|
|
44
45
|
const ws = workspace();
|
|
45
|
-
expect(await readAgentPreamble(ws, KB, disk)).toBe('Acme.\n');
|
|
46
|
+
expect(await readAgentPreamble(ws, testKbContext({ kbDirName: KB }), disk)).toBe('Acme.\n');
|
|
46
47
|
expect(ws.getOrCreateForBranch).toHaveBeenCalledWith(DEFAULT_BRANCH);
|
|
47
48
|
expect(ws.getWorkspacePath).toHaveBeenCalledWith(workspaceIdForBranch(DEFAULT_BRANCH));
|
|
48
49
|
});
|
|
@@ -50,19 +51,19 @@ describe('readAgentPreamble', () => {
|
|
|
50
51
|
it("spells the path with the deployment's own KB dir name", async () => {
|
|
51
52
|
await fs.mkdir(path.join(wsDir, 'kb'), { recursive: true });
|
|
52
53
|
await fs.writeFile(path.join(wsDir, 'kb', 'mcp-description.md'), 'Renamed root.', 'utf8');
|
|
53
|
-
expect(await readAgentPreamble(workspace(), 'kb', disk)).toBe('Renamed root.');
|
|
54
|
-
expect(await readAgentPreamble(workspace(), KB, disk)).toBeNull(); // the default-named root has none
|
|
54
|
+
expect(await readAgentPreamble(workspace(), testKbContext({ kbDirName: 'kb' }), disk)).toBe('Renamed root.');
|
|
55
|
+
expect(await readAgentPreamble(workspace(), testKbContext({ kbDirName: KB }), disk)).toBeNull(); // the default-named root has none
|
|
55
56
|
});
|
|
56
57
|
|
|
57
58
|
it('a file that is not there is an absence, not a fault', async () => {
|
|
58
|
-
expect(await readAgentPreamble(workspace(), KB, disk)).toBeNull();
|
|
59
|
+
expect(await readAgentPreamble(workspace(), testKbContext({ kbDirName: KB }), disk)).toBeNull();
|
|
59
60
|
});
|
|
60
61
|
|
|
61
62
|
it('refuses a symlink: the secret it points at is never read, and it is not an absence either', async () => {
|
|
62
63
|
const secret = path.join(root, 'secret.txt');
|
|
63
64
|
await fs.writeFile(secret, 'DATABASE_URL=postgres://…', 'utf8');
|
|
64
65
|
await fs.symlink(secret, path.join(wsDir, KB, 'mcp-description.md'));
|
|
65
|
-
await expect(readAgentPreamble(workspace(), KB, disk)).rejects.toThrow(/symlink, not a regular file/);
|
|
66
|
+
await expect(readAgentPreamble(workspace(), testKbContext({ kbDirName: KB }), disk)).rejects.toThrow(/symlink, not a regular file/);
|
|
66
67
|
});
|
|
67
68
|
|
|
68
69
|
it('refuses a repository folder reached through a link — the whole path must be its own, not only the file', async () => {
|
|
@@ -72,7 +73,7 @@ describe('readAgentPreamble', () => {
|
|
|
72
73
|
await fs.writeFile(path.join(elsewhere, 'mcp-description.md'), 'Not the repository.', 'utf8');
|
|
73
74
|
await fs.rm(path.join(wsDir, KB), { recursive: true });
|
|
74
75
|
await fs.symlink(elsewhere, path.join(wsDir, KB), process.platform === 'win32' ? 'junction' : 'dir');
|
|
75
|
-
await expect(readAgentPreamble(workspace(), KB, disk)).rejects.toThrow(/through a symlink/);
|
|
76
|
+
await expect(readAgentPreamble(workspace(), testKbContext({ kbDirName: KB }), disk)).rejects.toThrow(/through a symlink/);
|
|
76
77
|
});
|
|
77
78
|
|
|
78
79
|
it('reads through a link ABOVE the workspace — a mounted volume is the operator\'s, not the repository\'s', async () => {
|
|
@@ -81,12 +82,12 @@ describe('readAgentPreamble', () => {
|
|
|
81
82
|
await fs.symlink(wsDir, mount, process.platform === 'win32' ? 'junction' : 'dir');
|
|
82
83
|
const ws = workspace();
|
|
83
84
|
ws.getWorkspacePath.mockImplementation(async () => mount);
|
|
84
|
-
expect(await readAgentPreamble(ws, KB, disk)).toBe('Acme.\n');
|
|
85
|
+
expect(await readAgentPreamble(ws, testKbContext({ kbDirName: KB }), disk)).toBe('Acme.\n');
|
|
85
86
|
});
|
|
86
87
|
|
|
87
88
|
it('refuses a directory squatting the name', async () => {
|
|
88
89
|
await fs.mkdir(path.join(wsDir, KB, 'mcp-description.md'));
|
|
89
|
-
await expect(readAgentPreamble(workspace(), KB, disk)).rejects.toThrow(/directory, not a regular file/);
|
|
90
|
+
await expect(readAgentPreamble(workspace(), testKbContext({ kbDirName: KB }), disk)).rejects.toThrow(/directory, not a regular file/);
|
|
90
91
|
});
|
|
91
92
|
|
|
92
93
|
it('a KB directory that is a regular file is an ABSENT preamble, the shared rule for "nothing can be there"', async () => {
|
|
@@ -96,7 +97,7 @@ describe('readAgentPreamble', () => {
|
|
|
96
97
|
// squatted this way is the startup phase's to refuse, loudly, once.
|
|
97
98
|
await fs.rm(path.join(wsDir, KB), { recursive: true });
|
|
98
99
|
await fs.writeFile(path.join(wsDir, KB), 'not a directory', 'utf8');
|
|
99
|
-
expect(await readAgentPreamble(workspace(), KB, disk)).toBeNull();
|
|
100
|
+
expect(await readAgentPreamble(workspace(), testKbContext({ kbDirName: KB }), disk)).toBeNull();
|
|
100
101
|
});
|
|
101
102
|
|
|
102
103
|
it('an lstat that fails for any reason but absence throws, never an empty preamble', async () => {
|
|
@@ -110,7 +111,7 @@ describe('readAgentPreamble', () => {
|
|
|
110
111
|
? Promise.reject(Object.assign(new Error('EACCES: permission denied'), { code: 'EACCES' }))
|
|
111
112
|
: (real as (p: string) => Promise<unknown>).call(fs, p)) as never);
|
|
112
113
|
try {
|
|
113
|
-
await expect(readAgentPreamble(workspace(), KB, disk)).rejects.toMatchObject({ code: 'EACCES' });
|
|
114
|
+
await expect(readAgentPreamble(workspace(), testKbContext({ kbDirName: KB }), disk)).rejects.toMatchObject({ code: 'EACCES' });
|
|
114
115
|
} finally {
|
|
115
116
|
spy.mockRestore();
|
|
116
117
|
}
|
|
@@ -121,7 +122,7 @@ describe('readAgentPreamble', () => {
|
|
|
121
122
|
const file = path.join(wsDir, KB, 'mcp-description.md');
|
|
122
123
|
await fs.writeFile(file, 'Acme.', 'utf8');
|
|
123
124
|
await fs.chmod(file, 0o000); // the lstat still passes; the open is what fails
|
|
124
|
-
await expect(readAgentPreamble(workspace(), KB, disk)).rejects.toMatchObject({ code: 'EACCES' });
|
|
125
|
+
await expect(readAgentPreamble(workspace(), testKbContext({ kbDirName: KB }), disk)).rejects.toMatchObject({ code: 'EACCES' });
|
|
125
126
|
});
|
|
126
127
|
|
|
127
128
|
it('a workspace that cannot be located throws too', async () => {
|
|
@@ -130,6 +131,6 @@ describe('readAgentPreamble', () => {
|
|
|
130
131
|
ws.getWorkspacePath.mockImplementation(async () => {
|
|
131
132
|
throw eio;
|
|
132
133
|
});
|
|
133
|
-
await expect(readAgentPreamble(ws, KB, disk)).rejects.toBe(eio);
|
|
134
|
+
await expect(readAgentPreamble(ws, testKbContext({ kbDirName: KB }), disk)).rejects.toBe(eio);
|
|
134
135
|
});
|
|
135
136
|
});
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import fs from 'node:fs/promises';
|
|
2
2
|
import path from 'node:path';
|
|
3
|
-
import {
|
|
4
|
-
import { workspaceIdForBranch } from '../../shared/workspace-id.js';
|
|
3
|
+
import type { KbContext } from '../../shared/kb-context.js';
|
|
5
4
|
import { isAbsence, type IFsProbe } from '../../shared/fs.contract.js';
|
|
6
5
|
import type { WorkspaceService } from '../workspace/workspace.service.js';
|
|
7
6
|
import { PREAMBLE_FILE } from './compose.js';
|
|
@@ -43,11 +42,17 @@ export type PreambleWorkspace = Pick<WorkspaceService, 'getOrCreateForBranch' |
|
|
|
43
42
|
*/
|
|
44
43
|
export async function readAgentPreamble(
|
|
45
44
|
workspace: PreambleWorkspace,
|
|
46
|
-
|
|
45
|
+
kb: Pick<KbContext, 'kbDirName' | 'defaultBranch' | 'defaultWorkspaceId'>,
|
|
47
46
|
disk: IFsProbe,
|
|
48
47
|
): Promise<string | null> {
|
|
49
|
-
|
|
50
|
-
const
|
|
48
|
+
const { kbDirName, defaultBranch } = kb;
|
|
49
|
+
const notRegular = (kind: string): Error =>
|
|
50
|
+
new Error(
|
|
51
|
+
`${PREAMBLE_FILE} on branch "${defaultBranch}" is a ${kind}, not a regular file at its own place; ` +
|
|
52
|
+
'refusing to read it. Replace it with a plain markdown file in the repository folder.',
|
|
53
|
+
);
|
|
54
|
+
await workspace.getOrCreateForBranch(defaultBranch);
|
|
55
|
+
const wsDir = await workspace.getWorkspacePath(kb.defaultWorkspaceId());
|
|
51
56
|
const abs = path.join(wsDir, kbDirName, PREAMBLE_FILE);
|
|
52
57
|
|
|
53
58
|
const found = await disk.lstatOrNull(abs);
|
|
@@ -79,10 +84,3 @@ export async function readAgentPreamble(
|
|
|
79
84
|
await handle.close();
|
|
80
85
|
}
|
|
81
86
|
}
|
|
82
|
-
|
|
83
|
-
function notRegular(kind: string): Error {
|
|
84
|
-
return new Error(
|
|
85
|
-
`${PREAMBLE_FILE} on branch "${DEFAULT_BRANCH}" is a ${kind}, not a regular file at its own place; ` +
|
|
86
|
-
'refusing to read it. Replace it with a plain markdown file in the repository folder.',
|
|
87
|
-
);
|
|
88
|
-
}
|