@bevel-software/platform-core-backend 0.20.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 +23 -105
- package/dist/core/create-core-server.js.map +1 -1
- package/dist/core/create-core-services.d.ts +30 -5
- package/dist/core/create-core-services.d.ts.map +1 -1
- package/dist/core/create-core-services.js +136 -81
- 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/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/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/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/mcp/mcp.service.d.ts +7 -0
- package/dist/modules/mcp/mcp.service.d.ts.map +1 -1
- package/dist/modules/mcp/mcp.service.js +4 -4
- package/dist/modules/mcp/mcp.service.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 +12 -8
- package/dist/modules/settings/deployment-settings.service.d.ts.map +1 -1
- package/dist/modules/settings/deployment-settings.service.js +20 -22
- 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-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 +18 -12
- package/dist/modules/workspace/workspace.service.d.ts.map +1 -1
- package/dist/modules/workspace/workspace.service.js +32 -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 +20 -18
- 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.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 +6 -6
- package/package.json +3 -3
- 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 +27 -106
- package/src/core/create-core-services.ts +180 -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/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/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/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/marketplace/__tests__/marketplace-repo.head.test.ts +2 -1
- package/src/modules/mcp/mcp.service.ts +11 -4
- 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 +24 -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 +21 -20
- 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-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 +10 -9
- 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 +30 -27
- package/src/modules/workspace/workspace.tools.ts +21 -20
- package/src/modules/workspace/write-denial.ts +7 -5
- package/src/shared/__tests__/kb-layout.plugin.test.ts +19 -16
- 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
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { type BranchModel, type BranchModelValue, type KbLayout } from '@bevel-software/platform-shared';
|
|
2
|
+
/**
|
|
3
|
+
* What ONE knowledge base is called, on disk and in git: the checkout folder
|
|
4
|
+
* inside each workspace, the branch model (default + protected branches) and
|
|
5
|
+
* the layout (the three renameable roots and the guide's file name).
|
|
6
|
+
*
|
|
7
|
+
* Every service that needs one of these is handed the knowledge base's
|
|
8
|
+
* context at construction and reads it there — never a process-wide value.
|
|
9
|
+
* The shared package's live bindings (`DEFAULT_BRANCH`, `PLUGINS_DIR`, …) are
|
|
10
|
+
* the BROWSER'S copy of the same facts and are forbidden in this package by
|
|
11
|
+
* an ESLint rule: a server hosting several knowledge bases in one process has
|
|
12
|
+
* no single value to put there, and a service that read one would be reading
|
|
13
|
+
* whichever knowledge base configured it last.
|
|
14
|
+
*
|
|
15
|
+
* LIVE, PER INSTANCE. The values are read through getters, not captured, for
|
|
16
|
+
* the same reason the live bindings were: a fresh deployment has no branch
|
|
17
|
+
* model until its setup screen is answered, and the save that completes setup
|
|
18
|
+
* applies one to the running graph — through {@link applyBranchModel} and
|
|
19
|
+
* {@link applyLayout} — so the knowledge-base startup phase that runs in that
|
|
20
|
+
* same request already sees it. Read `defaultBranch` inside a method body;
|
|
21
|
+
* a value copied into a field at construction would be the empty string on
|
|
22
|
+
* exactly those deployments.
|
|
23
|
+
*/
|
|
24
|
+
export declare class KbContext {
|
|
25
|
+
/** The checkout folder inside each workspace directory (`knowledge-base` by default). */
|
|
26
|
+
readonly kbDirName: string;
|
|
27
|
+
private model;
|
|
28
|
+
private layoutValue;
|
|
29
|
+
private readonly layoutListeners;
|
|
30
|
+
private readonly branchModelListeners;
|
|
31
|
+
constructor(
|
|
32
|
+
/** The checkout folder inside each workspace directory (`knowledge-base` by default). */
|
|
33
|
+
kbDirName: string, branchModel: BranchModelValue, layout: KbLayout);
|
|
34
|
+
/**
|
|
35
|
+
* The model as a deployment's settings describe it, or the unconfigured one
|
|
36
|
+
* when they describe none yet. UNCONFIGURED IS ALLOWED, and that is the
|
|
37
|
+
* point: a fresh deployment has no branch model, and refusing to build
|
|
38
|
+
* services would take away the setup screen where one gets entered. What
|
|
39
|
+
* reads the model before then is the setup path itself, which does not need
|
|
40
|
+
* it; the setup gate keeps the rest of the app shut until it is set.
|
|
41
|
+
*/
|
|
42
|
+
static branchModelOrUnconfigured(model: BranchModel): BranchModelValue;
|
|
43
|
+
get branchModel(): BranchModelValue;
|
|
44
|
+
/** The branch users land on and the default propose target; `''` until configured. */
|
|
45
|
+
get defaultBranch(): string;
|
|
46
|
+
get protectedBranches(): ReadonlySet<string>;
|
|
47
|
+
isProtectedBranch(name: string | null | undefined): boolean;
|
|
48
|
+
isBranchModelConfigured(): boolean;
|
|
49
|
+
/** The workspace id of the default branch's clone — the released catalog's home. */
|
|
50
|
+
defaultWorkspaceId(): string;
|
|
51
|
+
/** The layout in effect: the three roots and the guide's file name, every name trimmed. */
|
|
52
|
+
get layout(): Required<KbLayout>;
|
|
53
|
+
/**
|
|
54
|
+
* Apply a branch model to the running graph — the setup-completing save.
|
|
55
|
+
* Validated like every model, so a bad pair is refused rather than applied
|
|
56
|
+
* half-way. Listeners run after the value is in place.
|
|
57
|
+
*/
|
|
58
|
+
applyBranchModel(model: BranchModel): void;
|
|
59
|
+
/**
|
|
60
|
+
* Apply a layout to the running graph — the setup-completing save, so the
|
|
61
|
+
* knowledge-base phase that runs in the same request scaffolds the names the
|
|
62
|
+
* admin just chose. Throws on an invalid one. Listeners run after the value
|
|
63
|
+
* is in place, and only when the layout was accepted.
|
|
64
|
+
*/
|
|
65
|
+
applyLayout(layout: KbLayout): void;
|
|
66
|
+
/**
|
|
67
|
+
* Be told when {@link applyLayout} runs — for the few things that cannot
|
|
68
|
+
* read the layout at the moment they are used: a value BUILT ONCE and handed
|
|
69
|
+
* to something that keeps it, such as the tool catalog's descriptions, which
|
|
70
|
+
* are validated into frozen defs at registration and then served from a map.
|
|
71
|
+
*/
|
|
72
|
+
onLayoutApplied(listener: () => void): void;
|
|
73
|
+
/** Be told when {@link applyBranchModel} runs. */
|
|
74
|
+
onBranchModelApplied(listener: () => void): void;
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=kb-context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kb-context.d.ts","sourceRoot":"","sources":["../../src/shared/kb-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,WAAW,EAChB,KAAK,gBAAgB,EACrB,KAAK,QAAQ,EACd,MAAM,iCAAiC,CAAC;AAGzC;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,SAAS;IAOlB,yFAAyF;IACzF,QAAQ,CAAC,SAAS,EAAE,MAAM;IAP5B,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAyB;IACzD,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAyB;;IAG5D,yFAAyF;IAChF,SAAS,EAAE,MAAM,EAC1B,WAAW,EAAE,gBAAgB,EAC7B,MAAM,EAAE,QAAQ;IAMlB;;;;;;;OAOG;IACH,MAAM,CAAC,yBAAyB,CAAC,KAAK,EAAE,WAAW,GAAG,gBAAgB;IAItE,IAAI,WAAW,IAAI,gBAAgB,CAElC;IAED,sFAAsF;IACtF,IAAI,aAAa,IAAI,MAAM,CAE1B;IAED,IAAI,iBAAiB,IAAI,WAAW,CAAC,MAAM,CAAC,CAE3C;IAED,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO;IAI3D,uBAAuB,IAAI,OAAO;IAIlC,oFAAoF;IACpF,kBAAkB,IAAI,MAAM;IAI5B,2FAA2F;IAC3F,IAAI,MAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC,CAE/B;IAED;;;;OAIG;IACH,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI;IAK1C;;;;;OAKG;IACH,WAAW,CAAC,MAAM,EAAE,QAAQ,GAAG,IAAI;IAKnC;;;;;OAKG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;IAI3C,kDAAkD;IAClD,oBAAoB,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,IAAI;CAGjD"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { UNCONFIGURED_BRANCH_MODEL, isBranchModelConfigured, isProtectedBranch, resolveBranchModel, resolveKbLayout, validateBranchModel, } from '@bevel-software/platform-shared';
|
|
2
|
+
import { workspaceIdForBranch } from './workspace-id.js';
|
|
3
|
+
/**
|
|
4
|
+
* What ONE knowledge base is called, on disk and in git: the checkout folder
|
|
5
|
+
* inside each workspace, the branch model (default + protected branches) and
|
|
6
|
+
* the layout (the three renameable roots and the guide's file name).
|
|
7
|
+
*
|
|
8
|
+
* Every service that needs one of these is handed the knowledge base's
|
|
9
|
+
* context at construction and reads it there — never a process-wide value.
|
|
10
|
+
* The shared package's live bindings (`DEFAULT_BRANCH`, `PLUGINS_DIR`, …) are
|
|
11
|
+
* the BROWSER'S copy of the same facts and are forbidden in this package by
|
|
12
|
+
* an ESLint rule: a server hosting several knowledge bases in one process has
|
|
13
|
+
* no single value to put there, and a service that read one would be reading
|
|
14
|
+
* whichever knowledge base configured it last.
|
|
15
|
+
*
|
|
16
|
+
* LIVE, PER INSTANCE. The values are read through getters, not captured, for
|
|
17
|
+
* the same reason the live bindings were: a fresh deployment has no branch
|
|
18
|
+
* model until its setup screen is answered, and the save that completes setup
|
|
19
|
+
* applies one to the running graph — through {@link applyBranchModel} and
|
|
20
|
+
* {@link applyLayout} — so the knowledge-base startup phase that runs in that
|
|
21
|
+
* same request already sees it. Read `defaultBranch` inside a method body;
|
|
22
|
+
* a value copied into a field at construction would be the empty string on
|
|
23
|
+
* exactly those deployments.
|
|
24
|
+
*/
|
|
25
|
+
export class KbContext {
|
|
26
|
+
kbDirName;
|
|
27
|
+
model;
|
|
28
|
+
layoutValue;
|
|
29
|
+
layoutListeners = new Set();
|
|
30
|
+
branchModelListeners = new Set();
|
|
31
|
+
constructor(
|
|
32
|
+
/** The checkout folder inside each workspace directory (`knowledge-base` by default). */
|
|
33
|
+
kbDirName, branchModel, layout) {
|
|
34
|
+
this.kbDirName = kbDirName;
|
|
35
|
+
this.model = branchModel;
|
|
36
|
+
this.layoutValue = resolveKbLayout(layout);
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* The model as a deployment's settings describe it, or the unconfigured one
|
|
40
|
+
* when they describe none yet. UNCONFIGURED IS ALLOWED, and that is the
|
|
41
|
+
* point: a fresh deployment has no branch model, and refusing to build
|
|
42
|
+
* services would take away the setup screen where one gets entered. What
|
|
43
|
+
* reads the model before then is the setup path itself, which does not need
|
|
44
|
+
* it; the setup gate keeps the rest of the app shut until it is set.
|
|
45
|
+
*/
|
|
46
|
+
static branchModelOrUnconfigured(model) {
|
|
47
|
+
return validateBranchModel(model) ? UNCONFIGURED_BRANCH_MODEL : resolveBranchModel(model);
|
|
48
|
+
}
|
|
49
|
+
get branchModel() {
|
|
50
|
+
return this.model;
|
|
51
|
+
}
|
|
52
|
+
/** The branch users land on and the default propose target; `''` until configured. */
|
|
53
|
+
get defaultBranch() {
|
|
54
|
+
return this.model.defaultBranch;
|
|
55
|
+
}
|
|
56
|
+
get protectedBranches() {
|
|
57
|
+
return this.model.protectedBranches;
|
|
58
|
+
}
|
|
59
|
+
isProtectedBranch(name) {
|
|
60
|
+
return isProtectedBranch(this.model, name);
|
|
61
|
+
}
|
|
62
|
+
isBranchModelConfigured() {
|
|
63
|
+
return isBranchModelConfigured(this.model);
|
|
64
|
+
}
|
|
65
|
+
/** The workspace id of the default branch's clone — the released catalog's home. */
|
|
66
|
+
defaultWorkspaceId() {
|
|
67
|
+
return workspaceIdForBranch(this.model.defaultBranch);
|
|
68
|
+
}
|
|
69
|
+
/** The layout in effect: the three roots and the guide's file name, every name trimmed. */
|
|
70
|
+
get layout() {
|
|
71
|
+
return this.layoutValue;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Apply a branch model to the running graph — the setup-completing save.
|
|
75
|
+
* Validated like every model, so a bad pair is refused rather than applied
|
|
76
|
+
* half-way. Listeners run after the value is in place.
|
|
77
|
+
*/
|
|
78
|
+
applyBranchModel(model) {
|
|
79
|
+
this.model = resolveBranchModel(model);
|
|
80
|
+
for (const listener of this.branchModelListeners)
|
|
81
|
+
listener();
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Apply a layout to the running graph — the setup-completing save, so the
|
|
85
|
+
* knowledge-base phase that runs in the same request scaffolds the names the
|
|
86
|
+
* admin just chose. Throws on an invalid one. Listeners run after the value
|
|
87
|
+
* is in place, and only when the layout was accepted.
|
|
88
|
+
*/
|
|
89
|
+
applyLayout(layout) {
|
|
90
|
+
this.layoutValue = resolveKbLayout(layout);
|
|
91
|
+
for (const listener of this.layoutListeners)
|
|
92
|
+
listener();
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Be told when {@link applyLayout} runs — for the few things that cannot
|
|
96
|
+
* read the layout at the moment they are used: a value BUILT ONCE and handed
|
|
97
|
+
* to something that keeps it, such as the tool catalog's descriptions, which
|
|
98
|
+
* are validated into frozen defs at registration and then served from a map.
|
|
99
|
+
*/
|
|
100
|
+
onLayoutApplied(listener) {
|
|
101
|
+
this.layoutListeners.add(listener);
|
|
102
|
+
}
|
|
103
|
+
/** Be told when {@link applyBranchModel} runs. */
|
|
104
|
+
onBranchModelApplied(listener) {
|
|
105
|
+
this.branchModelListeners.add(listener);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=kb-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kb-context.js","sourceRoot":"","sources":["../../src/shared/kb-context.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,yBAAyB,EACzB,uBAAuB,EACvB,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,mBAAmB,GAIpB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAEzD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,OAAO,SAAS;IAQT;IAPH,KAAK,CAAmB;IACxB,WAAW,CAAqB;IACvB,eAAe,GAAG,IAAI,GAAG,EAAc,CAAC;IACxC,oBAAoB,GAAG,IAAI,GAAG,EAAc,CAAC;IAE9D;IACE,yFAAyF;IAChF,SAAiB,EAC1B,WAA6B,EAC7B,MAAgB;QAFP,cAAS,GAAT,SAAS,CAAQ;QAI1B,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC;QACzB,IAAI,CAAC,WAAW,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC;IAED;;;;;;;OAOG;IACH,MAAM,CAAC,yBAAyB,CAAC,KAAkB;QACjD,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC5F,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,sFAAsF;IACtF,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC;IAClC,CAAC;IAED,IAAI,iBAAiB;QACnB,OAAO,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC;IACtC,CAAC;IAED,iBAAiB,CAAC,IAA+B;QAC/C,OAAO,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED,uBAAuB;QACrB,OAAO,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC;IAED,oFAAoF;IACpF,kBAAkB;QAChB,OAAO,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IACxD,CAAC;IAED,2FAA2F;IAC3F,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED;;;;OAIG;IACH,gBAAgB,CAAC,KAAkB;QACjC,IAAI,CAAC,KAAK,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;QACvC,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,oBAAoB;YAAE,QAAQ,EAAE,CAAC;IAC/D,CAAC;IAED;;;;;OAKG;IACH,WAAW,CAAC,MAAgB;QAC1B,IAAI,CAAC,WAAW,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;QAC3C,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,eAAe;YAAE,QAAQ,EAAE,CAAC;IAC1D,CAAC;IAED;;;;;OAKG;IACH,eAAe,CAAC,QAAoB;QAClC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IAED,kDAAkD;IAClD,oBAAoB,CAAC,QAAoB;QACvC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC1C,CAAC;CACF"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type Ontology } from '@bevel-software/platform-shared';
|
|
1
|
+
import { type KbLayout, type Ontology } from '@bevel-software/platform-shared';
|
|
2
2
|
/**
|
|
3
3
|
* Resolve the named ontology a KB path belongs to, or `null` (neutral) when it
|
|
4
4
|
* belongs to none.
|
|
@@ -32,7 +32,8 @@ import { type Ontology } from '@bevel-software/platform-shared';
|
|
|
32
32
|
* `Knowledge-notes.md` are never treated as markers; space-safe; pure (no IO).
|
|
33
33
|
*
|
|
34
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
|
|
35
36
|
* @param kbDirName optional on-disk clone folder prefix to strip first
|
|
36
37
|
*/
|
|
37
|
-
export declare function ontologyOf(path: string, kbDirName?: string): Ontology;
|
|
38
|
+
export declare function ontologyOf(path: string, layout: KbLayout, kbDirName?: string): Ontology;
|
|
38
39
|
//# sourceMappingURL=kb-layout.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kb-layout.d.ts","sourceRoot":"","sources":["../../src/shared/kb-layout.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
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
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ONTOLOGY_MARKERS } from '@bevel-software/platform-shared';
|
|
2
2
|
/**
|
|
3
3
|
* Resolve which named ontology a KB path belongs to — the backend-side
|
|
4
4
|
* implementation of the layout contract whose constants/types live in
|
|
@@ -80,13 +80,14 @@ function toSegments(path, kbDirName) {
|
|
|
80
80
|
* `Knowledge-notes.md` are never treated as markers; space-safe; pure (no IO).
|
|
81
81
|
*
|
|
82
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
|
|
83
84
|
* @param kbDirName optional on-disk clone folder prefix to strip first
|
|
84
85
|
*/
|
|
85
|
-
export function ontologyOf(path, kbDirName) {
|
|
86
|
+
export function ontologyOf(path, layout, kbDirName) {
|
|
86
87
|
const segs = toSegments(path, kbDirName);
|
|
87
88
|
// Must live under the dedicated KnowledgeBase/ container, with at least one
|
|
88
89
|
// ontology-name segment and a marker after it (so length >= 3).
|
|
89
|
-
if (segs.length < 3 || segs[0] !==
|
|
90
|
+
if (segs.length < 3 || segs[0] !== layout.knowledgeBaseDir)
|
|
90
91
|
return null;
|
|
91
92
|
// The ontology id is the prefix before the first marker segment. Require at
|
|
92
93
|
// least one name segment between `KnowledgeBase/` and the marker, so a marker
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kb-layout.js","sourceRoot":"","sources":["../../src/shared/kb-layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
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,24 +1,32 @@
|
|
|
1
1
|
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { DEFAULT_KB_LAYOUT } from '@bevel-software/platform-shared';
|
|
2
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);
|
|
3
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
|
+
});
|
|
4
12
|
it('resolves a named ontology under Knowledge', () => {
|
|
5
|
-
expect(
|
|
13
|
+
expect(ont('KnowledgeBase/Product/Knowledge/Foo.md')).toBe('KnowledgeBase/Product');
|
|
6
14
|
});
|
|
7
15
|
it('resolves a named ontology under NodeTypes', () => {
|
|
8
|
-
expect(
|
|
16
|
+
expect(ont('KnowledgeBase/Product/NodeTypes/Process.md')).toBe('KnowledgeBase/Product');
|
|
9
17
|
});
|
|
10
18
|
it('is space-safe in the ontology name', () => {
|
|
11
|
-
expect(
|
|
19
|
+
expect(ont('KnowledgeBase/IT Architecture/NodeTypes/ServiceCommitment.md')).toBe('KnowledgeBase/IT Architecture');
|
|
12
20
|
});
|
|
13
21
|
it('treats a nested ontology directory as the full prefix before the marker', () => {
|
|
14
|
-
expect(
|
|
22
|
+
expect(ont('KnowledgeBase/Plugin/Sub/Knowledge/x.md')).toBe('KnowledgeBase/Plugin/Sub');
|
|
15
23
|
});
|
|
16
24
|
it('returns null when the marker sits directly under KnowledgeBase/', () => {
|
|
17
|
-
expect(
|
|
18
|
-
expect(
|
|
25
|
+
expect(ont('KnowledgeBase/Knowledge/Foo.md')).toBeNull();
|
|
26
|
+
expect(ont('KnowledgeBase/NodeTypes/T.md')).toBeNull();
|
|
19
27
|
});
|
|
20
28
|
it('returns null for root-level Knowledge (not under KnowledgeBase/)', () => {
|
|
21
|
-
expect(
|
|
29
|
+
expect(ont('Knowledge/Foo.md')).toBeNull();
|
|
22
30
|
});
|
|
23
31
|
it('returns null for Data/ ontologies (deliberate session-ontology exemption)', () => {
|
|
24
32
|
// `Data/<X>` IS parsed into the graph (parser `ONTOLOGY_ROOTS`), but is
|
|
@@ -26,42 +34,42 @@ describe('ontologyOf', () => {
|
|
|
26
34
|
// Data paths as neutral — pipeline agents read knowledge and write data
|
|
27
35
|
// in one session (owner decision 2026-07-27). See the `ontologyOf`
|
|
28
36
|
// docstring; this is not drift.
|
|
29
|
-
expect(
|
|
30
|
-
expect(
|
|
37
|
+
expect(ont('Data/Ops/Knowledge/x.md')).toBeNull();
|
|
38
|
+
expect(ont('Data/Ops/NodeTypes/Ticket.md')).toBeNull();
|
|
31
39
|
// KnowledgeBase paths still classify as before.
|
|
32
|
-
expect(
|
|
40
|
+
expect(ont('KnowledgeBase/Ops/Knowledge/x.md')).toBe('KnowledgeBase/Ops');
|
|
33
41
|
});
|
|
34
42
|
it('returns null for Plugins and root config (neutral)', () => {
|
|
35
|
-
expect(
|
|
36
|
-
expect(
|
|
37
|
-
expect(
|
|
43
|
+
expect(ont('Plugins/some-skill/SKILL.md')).toBeNull();
|
|
44
|
+
expect(ont('access.md')).toBeNull();
|
|
45
|
+
expect(ont('roles.yaml')).toBeNull();
|
|
38
46
|
});
|
|
39
47
|
it('returns null for an ontology path with no marker segment', () => {
|
|
40
|
-
expect(
|
|
48
|
+
expect(ont('KnowledgeBase/Product/Uploads/diagram.png')).toBeNull();
|
|
41
49
|
});
|
|
42
50
|
it('does not match substring lookalikes (segment equality)', () => {
|
|
43
|
-
expect(
|
|
44
|
-
expect(
|
|
51
|
+
expect(ont('KnowledgeBase/Product/Knowledge-notes.md')).toBeNull();
|
|
52
|
+
expect(ont('KnowledgeBase/Product/KnowledgeBase/x.md')).toBeNull();
|
|
45
53
|
});
|
|
46
54
|
it('strips a kbDirName prefix (normalized and un-normalized)', () => {
|
|
47
|
-
expect(
|
|
48
|
-
expect(
|
|
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');
|
|
49
57
|
});
|
|
50
58
|
it('normalizes backslashes and leading/trailing slashes', () => {
|
|
51
|
-
expect(
|
|
52
|
-
expect(
|
|
59
|
+
expect(ont('/KnowledgeBase/Product/Knowledge/Foo.md/')).toBe('KnowledgeBase/Product');
|
|
60
|
+
expect(ont('KnowledgeBase\\Product\\Knowledge\\Foo.md')).toBe('KnowledgeBase/Product');
|
|
53
61
|
});
|
|
54
62
|
it('canonicalizes inner . and .. segments to the same ontology', () => {
|
|
55
|
-
expect(
|
|
56
|
-
expect(
|
|
57
|
-
expect(
|
|
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');
|
|
58
66
|
// `..` also collapses inside the stripped kbDirName prefix.
|
|
59
|
-
expect(
|
|
67
|
+
expect(ont('knowledge-base/x/../KnowledgeBase/GTM/NodeTypes/T.md', 'knowledge-base')).toBe('KnowledgeBase/GTM');
|
|
60
68
|
});
|
|
61
69
|
it('returns null for empty or root paths', () => {
|
|
62
|
-
expect(
|
|
63
|
-
expect(
|
|
64
|
-
expect(
|
|
70
|
+
expect(ont('')).toBeNull();
|
|
71
|
+
expect(ont('KnowledgeBase')).toBeNull();
|
|
72
|
+
expect(ont('KnowledgeBase/Product')).toBeNull();
|
|
65
73
|
});
|
|
66
74
|
});
|
|
67
75
|
//# sourceMappingURL=kb-layout.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kb-layout.test.js","sourceRoot":"","sources":["../../src/shared/kb-layout.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"kb-layout.test.js","sourceRoot":"","sources":["../../src/shared/kb-layout.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { ChangeRequest, IWorkflowService } from '@bevel-software/platform-shared';
|
|
2
2
|
import type { WorkspaceService } from '../modules/workspace/workspace.service.js';
|
|
3
|
+
import type { KbContext } from './kb-context.js';
|
|
3
4
|
import type { IAccessControl } from '../modules/access/access-control.interface.js';
|
|
4
5
|
/**
|
|
5
6
|
* The mechanics every "proposed, not released" surface shares.
|
|
@@ -27,6 +28,8 @@ export interface ProposalSources {
|
|
|
27
28
|
workspaceService: Pick<WorkspaceService, 'ensureRemotesFetched' | 'readFileAtRef'>;
|
|
28
29
|
accessControl: Pick<IAccessControl, 'canWriteBatch'>;
|
|
29
30
|
workflow: Pick<IWorkflowService, 'listChangeRequests'>;
|
|
31
|
+
/** Which branch is the released one, and its clone. */
|
|
32
|
+
kb: Pick<KbContext, 'defaultBranch' | 'defaultWorkspaceId'>;
|
|
30
33
|
}
|
|
31
34
|
/** One file an open change request proposes, already read at that request's branch. */
|
|
32
35
|
export interface ProposedFile {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pending-proposals.d.ts","sourceRoot":"","sources":["../../src/shared/pending-proposals.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"pending-proposals.d.ts","sourceRoot":"","sources":["../../src/shared/pending-proposals.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACvF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2CAA2C,CAAC;AAClF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+CAA+C,CAAC;AAOpF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,WAAW,eAAe;IAC9B,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE,sBAAsB,GAAG,eAAe,CAAC,CAAC;IACnF,aAAa,EAAE,IAAI,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;IACrD,QAAQ,EAAE,IAAI,CAAC,gBAAgB,EAAE,oBAAoB,CAAC,CAAC;IACvD,uDAAuD;IACvD,EAAE,EAAE,IAAI,CAAC,SAAS,EAAE,eAAe,GAAG,oBAAoB,CAAC,CAAC;CAC7D;AAED,uFAAuF;AACvF,MAAM,WAAW,YAAY;IAC3B,qDAAqD;IACrD,EAAE,EAAE,aAAa,CAAC;IAClB,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,eAAe,EACxB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,GACxC,OAAO,CAAC,YAAY,EAAE,CAAC,CA2DzB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,MAAM,CAC1B,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE,eAAe,CAAC,EACzD,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAcxB"}
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import { DEFAULT_BRANCH } from '@bevel-software/platform-shared';
|
|
2
|
-
import { workspaceIdForBranch } from './workspace-id.js';
|
|
3
1
|
import { canonicalEmail, hashEmail } from './email-identity.js';
|
|
4
2
|
import { printable } from './printable.js';
|
|
5
3
|
import { logger } from './logging.js';
|
|
@@ -30,7 +28,8 @@ export async function visibleProposedFiles(sources, userEmail, matches) {
|
|
|
30
28
|
// access tree that decides who may review — so a request targeting some
|
|
31
29
|
// other branch is not a proposal these surfaces can speak about: merging it
|
|
32
30
|
// puts nothing in the catalog, and the card would never resolve.
|
|
33
|
-
|
|
31
|
+
const defaultBranch = sources.kb.defaultBranch;
|
|
32
|
+
crs = (await sources.workflow.listChangeRequests()).filter((c) => c.state === 'open' && c.base === defaultBranch);
|
|
34
33
|
}
|
|
35
34
|
catch {
|
|
36
35
|
return [];
|
|
@@ -40,7 +39,7 @@ export async function visibleProposedFiles(sources, userEmail, matches) {
|
|
|
40
39
|
const candidates = crs.flatMap((cr) => cr.touchedNodePaths.filter(matches).map((path) => ({ cr, path })));
|
|
41
40
|
if (candidates.length === 0)
|
|
42
41
|
return [];
|
|
43
|
-
const wsId =
|
|
42
|
+
const wsId = sources.kb.defaultWorkspaceId();
|
|
44
43
|
const authorHash = hashEmail(email);
|
|
45
44
|
// One access load for every candidate, resolved on the DEFAULT branch — see
|
|
46
45
|
// the note on {@link ProposalSources}.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pending-proposals.js","sourceRoot":"","sources":["../../src/shared/pending-proposals.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pending-proposals.js","sourceRoot":"","sources":["../../src/shared/pending-proposals.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,GAAG,GAAG,MAAM,CAAC,mBAAmB,CAAC,CAAC;AA4CxC;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,OAAwB,EACxB,SAAiB,EACjB,OAAyC;IAEzC,MAAM,KAAK,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;IACxC,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IAEtB,IAAI,GAAoB,CAAC;IACzB,IAAI,CAAC;QACH,0EAA0E;QAC1E,2EAA2E;QAC3E,wEAAwE;QACxE,4EAA4E;QAC5E,iEAAiE;QACjE,MAAM,aAAa,GAAG,OAAO,CAAC,EAAE,CAAC,aAAa,CAAC;QAC/C,GAAG,GAAG,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,kBAAkB,EAAE,CAAC,CAAC,MAAM,CACxD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa,CACtD,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEhC,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CACpC,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAClE,CAAC;IACF,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEvC,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,CAAC,kBAAkB,EAAE,CAAC;IAC7C,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC;IAEpC,4EAA4E;IAC5E,uCAAuC;IACvC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,aAAa;SACzC,aAAa,CACZ,IAAI,EACJ,KAAK,EACL,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAC9B;SACA,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,GAAG,EAAmB,CAAC,CAAC;IAE3C,mEAAmE;IACnE,2EAA2E;IAC3E,6EAA6E;IAC7E,sDAAsD;IACtD,MAAM,OAAO,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAEjF,MAAM,GAAG,GAAmB,EAAE,CAAC;IAC/B,KAAK,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,UAAU,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC,QAAQ,IAAI,EAAE,CAAC,QAAQ,KAAK,UAAU,CAAC;QAC7D,sEAAsE;QACtE,4EAA4E;QAC5E,sCAAsC;QACtC,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI;YAAE,SAAS;QAEvD,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAC9E,4EAA4E;QAC5E,uEAAuE;QACvE,IAAI,OAAO,KAAK,IAAI;YAAE,SAAS;QAC/B,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,gBAAyD,EACzD,IAAY,EACZ,MAAc,EACd,WAAmB;IAEnB,IAAI,CAAC;QACH,OAAO,MAAM,gBAAgB,CAAC,aAAa,CAAC,IAAI,EAAE,UAAU,MAAM,EAAE,EAAE,WAAW,CAAC,CAAC;IACrF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,4EAA4E;QAC5E,2EAA2E;QAC3E,0EAA0E;QAC1E,uEAAuE;QACvE,GAAG,CAAC,IAAI,CACN,kBAAkB,SAAS,CAAC,WAAW,CAAC,cAAc,SAAS,CAAC,MAAM,CAAC,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI;YAC/F,sCAAsC,SAAS,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CACtG,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -6,11 +6,11 @@
|
|
|
6
6
|
* presigned remote keeps its credential.
|
|
7
7
|
*
|
|
8
8
|
* "The token in effect" is every place one can come from: each environment
|
|
9
|
-
* spelling `CoreConfig` accepts (
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
9
|
+
* spelling `CoreConfig` accepts (the operator's, process-wide), plus whatever
|
|
10
|
+
* the caller knows about — the knowledge base's own token as its git runner
|
|
11
|
+
* carries it, a token a request brought along, or a remote's query values
|
|
12
|
+
* ({@link urlQuerySecrets}). Longest first, so a secret that contains another
|
|
13
|
+
* is not half-scrubbed.
|
|
14
14
|
*
|
|
15
15
|
* Shared, not a module's own: the KB startup phase and the setup routes both
|
|
16
16
|
* log git's words, and one scrub is the only way they cannot disagree about
|
|
@@ -6,11 +6,11 @@
|
|
|
6
6
|
* presigned remote keeps its credential.
|
|
7
7
|
*
|
|
8
8
|
* "The token in effect" is every place one can come from: each environment
|
|
9
|
-
* spelling `CoreConfig` accepts (
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
9
|
+
* spelling `CoreConfig` accepts (the operator's, process-wide), plus whatever
|
|
10
|
+
* the caller knows about — the knowledge base's own token as its git runner
|
|
11
|
+
* carries it, a token a request brought along, or a remote's query values
|
|
12
|
+
* ({@link urlQuerySecrets}). Longest first, so a secret that contains another
|
|
13
|
+
* is not half-scrubbed.
|
|
14
14
|
*
|
|
15
15
|
* Shared, not a module's own: the KB startup phase and the setup routes both
|
|
16
16
|
* log git's words, and one scrub is the only way they cannot disagree about
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Serving several knowledge bases from one process — see
|
|
3
|
+
* `docs/multi-tenant.md` and `openspec/changes/multi-tenant-runtime`.
|
|
4
|
+
*
|
|
5
|
+
* The contract (`TenantSource`) and the mechanism (runtime, host) are core's;
|
|
6
|
+
* where tenants come from is the caller's. Core ships a file-based source.
|
|
7
|
+
*/
|
|
8
|
+
export { assertTenantSlug, normalizeHost, TENANT_SLUG_PATTERN, type TenantDescriptor, type TenantSource, } from './tenant-source.contract.js';
|
|
9
|
+
export { deriveTenantSecrets, type TenantSecrets } from './tenant-secrets.js';
|
|
10
|
+
export { StaticTenantSource, tenantConfigFrom, tenantHostEnv, type TenantHostEnv, type TenantHostSettings, type TenantRecord, type TenantsFile, } from './static-tenant-source.js';
|
|
11
|
+
export { TenantRuntime, type TenantGraph, type TenantRuntimeDeps, type TenantState } from './tenant-runtime.js';
|
|
12
|
+
export { createTenantHost, isLoopbackAddress, loopbackTenantBaseUrl, selectTenant, LOOPBACK_TENANT_PREFIX, type TenantHost, type TenantHostOptions, type TenantSelector, } from './tenant-host.js';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tenancy/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,mBAAmB,EACnB,KAAK,gBAAgB,EACrB,KAAK,YAAY,GAClB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,mBAAmB,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,EACb,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,YAAY,EACjB,KAAK,WAAW,GACjB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,KAAK,WAAW,EAAE,KAAK,iBAAiB,EAAE,KAAK,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAChH,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,EACrB,YAAY,EACZ,sBAAsB,EACtB,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,KAAK,cAAc,GACpB,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Serving several knowledge bases from one process — see
|
|
3
|
+
* `docs/multi-tenant.md` and `openspec/changes/multi-tenant-runtime`.
|
|
4
|
+
*
|
|
5
|
+
* The contract (`TenantSource`) and the mechanism (runtime, host) are core's;
|
|
6
|
+
* where tenants come from is the caller's. Core ships a file-based source.
|
|
7
|
+
*/
|
|
8
|
+
export { assertTenantSlug, normalizeHost, TENANT_SLUG_PATTERN, } from './tenant-source.contract.js';
|
|
9
|
+
export { deriveTenantSecrets } from './tenant-secrets.js';
|
|
10
|
+
export { StaticTenantSource, tenantConfigFrom, tenantHostEnv, } from './static-tenant-source.js';
|
|
11
|
+
export { TenantRuntime } from './tenant-runtime.js';
|
|
12
|
+
export { createTenantHost, isLoopbackAddress, loopbackTenantBaseUrl, selectTenant, LOOPBACK_TENANT_PREFIX, } from './tenant-host.js';
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tenancy/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,mBAAmB,GAGpB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,mBAAmB,EAAsB,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,aAAa,GAKd,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,aAAa,EAA8D,MAAM,qBAAqB,CAAC;AAChH,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,EACrB,YAAY,EACZ,sBAAsB,GAIvB,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { type TenantConfig } from '../core-config.js';
|
|
2
|
+
import { type TenantDescriptor, type TenantSource } from './tenant-source.contract.js';
|
|
3
|
+
/**
|
|
4
|
+
* What every tenant of one process shares: the process's own facts, the one
|
|
5
|
+
* database, the roots its folders hang off, and the master key its secrets
|
|
6
|
+
* derive from. A tenant's own record ({@link TenantRecord}) adds what differs.
|
|
7
|
+
*/
|
|
8
|
+
export interface TenantHostSettings {
|
|
9
|
+
readonly databaseUrl: string;
|
|
10
|
+
readonly port: number;
|
|
11
|
+
readonly nodeEnv: string;
|
|
12
|
+
readonly trustProxy: string;
|
|
13
|
+
/** Each tenant's workspaces live under `<workspacesRoot>/<slug>`; its backups, spills and caches beside them. */
|
|
14
|
+
readonly workspacesRoot: string;
|
|
15
|
+
readonly kbTemplateDir: string;
|
|
16
|
+
readonly gitTimeoutMs: number;
|
|
17
|
+
readonly ontologySessionBlock: boolean;
|
|
18
|
+
readonly updateCheckEnabled: boolean;
|
|
19
|
+
/** See `tenant-secrets.ts`. */
|
|
20
|
+
readonly masterKey: string;
|
|
21
|
+
}
|
|
22
|
+
/** One entry of the tenants file. Everything optional has the single-tenant default. */
|
|
23
|
+
export interface TenantRecord {
|
|
24
|
+
slug: string;
|
|
25
|
+
/** Host names (a port is tolerated and ignored) that reach this tenant. At least one. */
|
|
26
|
+
hosts: string[];
|
|
27
|
+
adminEmail: string;
|
|
28
|
+
/** The bootstrap password; omitted, password login is off for this tenant. */
|
|
29
|
+
adminPassword?: string;
|
|
30
|
+
/** Force password login on or off; default: on exactly when `adminPassword` is set. */
|
|
31
|
+
loginPassword?: boolean;
|
|
32
|
+
kbRepoUrl?: string;
|
|
33
|
+
gitToken?: string;
|
|
34
|
+
gitUsername?: string;
|
|
35
|
+
kbDirName?: string;
|
|
36
|
+
/** The branch model; absent, the tenant's admin enters it on the setup screen. */
|
|
37
|
+
defaultBranch?: string;
|
|
38
|
+
protectedBranches?: string | string[];
|
|
39
|
+
/** The bearer a git host's webhook presents to `POST /api/sync`. */
|
|
40
|
+
kbSyncSecret?: string;
|
|
41
|
+
/** Default `t_<slug>` with hyphens as underscores. */
|
|
42
|
+
dbSchema?: string;
|
|
43
|
+
/** The credential-prefix brand; default: the slug without hyphens. */
|
|
44
|
+
tenantId?: string;
|
|
45
|
+
/** Default `https://<first host>`. */
|
|
46
|
+
publicBackendUrl?: string;
|
|
47
|
+
/** Default: the backend URL (the backend serves the SPA). */
|
|
48
|
+
publicFrontendUrl?: string;
|
|
49
|
+
allowedEmailDomains?: string[];
|
|
50
|
+
oidc?: {
|
|
51
|
+
issuerUrl: string;
|
|
52
|
+
clientId: string;
|
|
53
|
+
clientSecret: string;
|
|
54
|
+
scopes?: string;
|
|
55
|
+
providerLabel?: string;
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/** The file's shape: a list of records. */
|
|
59
|
+
export interface TenantsFile {
|
|
60
|
+
tenants: TenantRecord[];
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* A tenant's {@link TenantConfig} from its record and the host's settings:
|
|
64
|
+
* the same values `CoreConfig` reads from the environment, resolved the same
|
|
65
|
+
* way, with the folders and the schema named after the slug so two tenants
|
|
66
|
+
* can never share a path or a table.
|
|
67
|
+
*/
|
|
68
|
+
export declare function tenantConfigFrom(record: TenantRecord, settings: TenantHostSettings): TenantConfig;
|
|
69
|
+
/**
|
|
70
|
+
* The reference {@link TenantSource}: every tenant known up front, from a
|
|
71
|
+
* JSON file (`TENANTS_FILE`). Enough for development, tests and a small
|
|
72
|
+
* self-hosted fleet; the cloud app brings its own source over its registry.
|
|
73
|
+
*/
|
|
74
|
+
export declare class StaticTenantSource implements TenantSource {
|
|
75
|
+
private readonly bySlug;
|
|
76
|
+
private readonly byHost;
|
|
77
|
+
constructor(records: readonly TenantRecord[], settings: TenantHostSettings);
|
|
78
|
+
static fromFile(file: string, settings: TenantHostSettings): Promise<StaticTenantSource>;
|
|
79
|
+
get slugs(): readonly string[];
|
|
80
|
+
resolveByHost(host: string): Promise<TenantDescriptor | null>;
|
|
81
|
+
describe(slug: string): Promise<TenantDescriptor | null>;
|
|
82
|
+
}
|
|
83
|
+
/** The process facts a tenant host reads from its environment — see `docs/multi-tenant.md`. */
|
|
84
|
+
export interface TenantHostEnv extends TenantHostSettings {
|
|
85
|
+
/** The tenants file, when the process runs as a host at all. */
|
|
86
|
+
readonly tenantsFile: string | null;
|
|
87
|
+
/** Minutes without a request after which a tenant's graph is stopped. */
|
|
88
|
+
readonly idleMinutes: number;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* The host's settings from the environment: the same variables a
|
|
92
|
+
* single-tenant deployment reads for these facts (`DATABASE_URL` and the
|
|
93
|
+
* `POSTGRES_*` parts, `PORT`, `TRUST_PROXY`, `WORKSPACES_ROOT`,
|
|
94
|
+
* `KB_TEMPLATE_DIR`, `GIT_TIMEOUT_MS`, …), plus the three that only a host
|
|
95
|
+
* has: `TENANTS_FILE`, `TENANT_MASTER_KEY` and `TENANT_IDLE_MINUTES`.
|
|
96
|
+
*/
|
|
97
|
+
export declare function tenantHostEnv(env?: NodeJS.ProcessEnv): TenantHostEnv;
|
|
98
|
+
//# sourceMappingURL=static-tenant-source.d.ts.map
|